[PATCH] PCI Hotplug: add common acpi functions to core
shpchprm_acpi.c and pciehprm_acpi.c are nearly identical. In addition, there are functions in both these files that are also in acpiphp_glue.c. This patch will remove duplicate functions from shpchp, pciehp, and acpiphp and move this functionality to pci_hotplug, as it is not hardware specific. Get rid of shpchprm* and pciehprm* files since they are no longer needed. shpchprm_nonacpi.c and pciehprm_nonacpi.c are identical, as well as shpchprm_legacy.c and can be replaced with a macro. This patch also changes acpiphp to use the common hpp code. Signed-off-by: Kristen Carlson Accardi <kristen.c.accardi@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
f5afe8064f
commit
783c49fc50
@@ -38,7 +38,10 @@
|
||||
|
||||
#include "../pci.h"
|
||||
#include "pciehp.h"
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/actypes.h>
|
||||
#include <linux/pci-acpi.h>
|
||||
#ifdef DEBUG
|
||||
#define DBG_K_TRACE_ENTRY ((unsigned int)0x00000001) /* On function entry */
|
||||
#define DBG_K_TRACE_EXIT ((unsigned int)0x00000002) /* On function exit */
|
||||
@@ -1236,6 +1239,75 @@ static struct hpc_ops pciehp_hpc_ops = {
|
||||
.check_lnk_status = hpc_check_lnk_status,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
int pciehp_acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev)
|
||||
{
|
||||
acpi_status status;
|
||||
acpi_handle chandle, handle = DEVICE_ACPI_HANDLE(&(dev->dev));
|
||||
struct pci_dev *pdev = dev;
|
||||
struct pci_bus *parent;
|
||||
u8 *path_name = NULL;
|
||||
|
||||
/*
|
||||
* Per PCI firmware specification, we should run the ACPI _OSC
|
||||
* method to get control of hotplug hardware before using it.
|
||||
* If an _OSC is missing, we look for an OSHP to do the same thing.
|
||||
* To handle different BIOS behavior, we look for _OSC and OSHP
|
||||
* within the scope of the hotplug controller and its parents, upto
|
||||
* the host bridge under which this controller exists.
|
||||
*/
|
||||
while (!handle) {
|
||||
/*
|
||||
* This hotplug controller was not listed in the ACPI name
|
||||
* space at all. Try to get acpi handle of parent pci bus.
|
||||
*/
|
||||
if (!pdev || !pdev->bus->parent)
|
||||
break;
|
||||
parent = pdev->bus->parent;
|
||||
dbg("Could not find %s in acpi namespace, trying parent\n",
|
||||
pci_name(pdev));
|
||||
if (!parent->self)
|
||||
/* Parent must be a host bridge */
|
||||
handle = acpi_get_pci_rootbridge_handle(
|
||||
pci_domain_nr(parent),
|
||||
parent->number);
|
||||
else
|
||||
handle = DEVICE_ACPI_HANDLE(
|
||||
&(parent->self->dev));
|
||||
pdev = parent->self;
|
||||
}
|
||||
|
||||
while (handle) {
|
||||
path_name = acpi_path_name(handle);
|
||||
dbg("Trying to get hotplug control for %s \n", path_name);
|
||||
status = pci_osc_control_set(handle,
|
||||
OSC_PCI_EXPRESS_NATIVE_HP_CONTROL);
|
||||
if (status == AE_NOT_FOUND)
|
||||
status = acpi_run_oshp(handle);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
dbg("Gained control for hotplug HW for pci %s (%s)\n",
|
||||
pci_name(dev), path_name);
|
||||
acpi_os_free(path_name);
|
||||
return 0;
|
||||
}
|
||||
if (acpi_root_bridge(handle))
|
||||
break;
|
||||
chandle = handle;
|
||||
status = acpi_get_parent(chandle, &handle);
|
||||
if (ACPI_FAILURE(status))
|
||||
break;
|
||||
}
|
||||
|
||||
err("Cannot get control of hotplug hardware for pci %s\n",
|
||||
pci_name(dev));
|
||||
if (path_name)
|
||||
acpi_os_free(path_name);
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
int pcie_init(struct controller * ctrl, struct pcie_device *dev)
|
||||
{
|
||||
struct php_ctlr_state_s *php_ctlr, *p;
|
||||
|
Reference in New Issue
Block a user