Commit | Line | Data |
---|---|---|
6c2b374d ZY |
1 | /* |
2 | * Access ACPI _OSC method | |
3 | * | |
4 | * Copyright (C) 2006 Intel Corp. | |
5 | * Tom Long Nguyen (tom.l.nguyen@intel.com) | |
6 | * Zhang Yanmin (yanmin.zhang@intel.com) | |
7 | * | |
8 | */ | |
9 | ||
10 | #include <linux/module.h> | |
11 | #include <linux/pci.h> | |
12 | #include <linux/kernel.h> | |
13 | #include <linux/errno.h> | |
14 | #include <linux/pm.h> | |
15 | #include <linux/suspend.h> | |
16 | #include <linux/acpi.h> | |
17 | #include <linux/pci-acpi.h> | |
18 | #include <linux/delay.h> | |
19 | #include "aerdrv.h" | |
20 | ||
21 | /** | |
22 | * aer_osc_setup - run ACPI _OSC method | |
8d29bfb7 | 23 | * @pciedev: pcie_device which AER is being enabled on |
6c2b374d | 24 | * |
8d29bfb7 | 25 | * @return: Zero on success. Nonzero otherwise. |
6c2b374d | 26 | * |
45e829ea | 27 | * Invoked when PCIe bus loads AER service driver. To avoid conflict with |
6c2b374d ZY |
28 | * BIOS AER support requires BIOS to yield AER control to OS native driver. |
29 | **/ | |
8d29bfb7 | 30 | int aer_osc_setup(struct pcie_device *pciedev) |
6c2b374d | 31 | { |
8d29bfb7 ZY |
32 | acpi_status status = AE_NOT_FOUND; |
33 | struct pci_dev *pdev = pciedev->port; | |
a01e035e | 34 | acpi_handle handle = NULL; |
6c2b374d | 35 | |
4c44bac8 YL |
36 | if (acpi_pci_disabled) |
37 | return -1; | |
38 | ||
056c58e8 | 39 | handle = acpi_find_root_bridge_handle(pdev); |
8d29bfb7 | 40 | if (handle) { |
9f5404d8 | 41 | status = acpi_pci_osc_control_set(handle, |
8d29bfb7 ZY |
42 | OSC_PCI_EXPRESS_AER_CONTROL | |
43 | OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL); | |
44 | } | |
6c2b374d | 45 | |
6c2b374d | 46 | if (ACPI_FAILURE(status)) { |
531f254e BH |
47 | dev_printk(KERN_DEBUG, &pciedev->device, "AER service couldn't " |
48 | "init device: %s\n", | |
49 | (status == AE_SUPPORT || status == AE_NOT_FOUND) ? | |
50 | "no _OSC support" : "_OSC failed"); | |
8d29bfb7 | 51 | return -1; |
6c2b374d ZY |
52 | } |
53 | ||
8d29bfb7 | 54 | return 0; |
6c2b374d | 55 | } |