aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiang Liu <jiang.liu@huawei.com>2012-06-22 02:55:16 -0400
committerBjorn Helgaas <bhelgaas@google.com>2012-06-22 17:16:51 -0400
commitf4b57a3b4352f72e461e362cb25917e28bdba80f (patch)
tree645b4c86120578cae02e0e4065ba2b39d77bb539
parent9c95111b330d2ddf851444528a7608f267cbb50c (diff)
PCI/ACPI: provide MMCONFIG address for PCI host bridges
This patch provide MMCONFIG address for PCI host bridges, which will be used to support host bridge hotplug. It gets MMCONFIG address by evaluating _CBA method if available. Reviewed-by: Yinghai Lu <yinghai@kernel.org> Signed-off-by: Jiang Liu <liuj97@gmail.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-rw-r--r--drivers/acpi/pci_root.c2
-rw-r--r--drivers/pci/pci-acpi.c14
-rw-r--r--include/acpi/acnames.h1
-rw-r--r--include/acpi/acpi_bus.h1
-rw-r--r--include/linux/pci-acpi.h1
5 files changed, 19 insertions, 0 deletions
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
index 7aff6312ce7c..ec54014c321c 100644
--- a/drivers/acpi/pci_root.c
+++ b/drivers/acpi/pci_root.c
@@ -505,6 +505,8 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
505 strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS); 505 strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS);
506 device->driver_data = root; 506 device->driver_data = root;
507 507
508 root->mcfg_addr = acpi_pci_root_get_mcfg_addr(device->handle);
509
508 /* 510 /*
509 * All supported architectures that use ACPI have support for 511 * All supported architectures that use ACPI have support for
510 * PCI domains, so we indicate this in _OSC support capabilities. 512 * PCI domains, so we indicate this in _OSC support capabilities.
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c
index 61e2fefeedab..87f4c504eafb 100644
--- a/drivers/pci/pci-acpi.c
+++ b/drivers/pci/pci-acpi.c
@@ -162,6 +162,20 @@ acpi_status pci_acpi_remove_pm_notifier(struct acpi_device *dev)
162 return remove_pm_notifier(dev, pci_acpi_wake_dev); 162 return remove_pm_notifier(dev, pci_acpi_wake_dev);
163} 163}
164 164
165phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle)
166{
167 acpi_status status = AE_NOT_EXIST;
168 unsigned long long mcfg_addr;
169
170 if (handle)
171 status = acpi_evaluate_integer(handle, METHOD_NAME__CBA,
172 NULL, &mcfg_addr);
173 if (ACPI_FAILURE(status))
174 return 0;
175
176 return (phys_addr_t)mcfg_addr;
177}
178
165/* 179/*
166 * _SxD returns the D-state with the highest power 180 * _SxD returns the D-state with the highest power
167 * (lowest D-state number) supported in the S-state "x". 181 * (lowest D-state number) supported in the S-state "x".
diff --git a/include/acpi/acnames.h b/include/acpi/acnames.h
index 38f508816e4a..b177f97f53b6 100644
--- a/include/acpi/acnames.h
+++ b/include/acpi/acnames.h
@@ -62,6 +62,7 @@
62#define METHOD_NAME__AEI "_AEI" 62#define METHOD_NAME__AEI "_AEI"
63#define METHOD_NAME__PRW "_PRW" 63#define METHOD_NAME__PRW "_PRW"
64#define METHOD_NAME__SRS "_SRS" 64#define METHOD_NAME__SRS "_SRS"
65#define METHOD_NAME__CBA "_CBA"
65 66
66/* Method names - these methods must appear at the namespace root */ 67/* Method names - these methods must appear at the namespace root */
67 68
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 9e6e1c6eb60a..457974073994 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -401,6 +401,7 @@ struct acpi_pci_root {
401 401
402 u32 osc_support_set; /* _OSC state of support bits */ 402 u32 osc_support_set; /* _OSC state of support bits */
403 u32 osc_control_set; /* _OSC state of control bits */ 403 u32 osc_control_set; /* _OSC state of control bits */
404 phys_addr_t mcfg_addr;
404}; 405};
405 406
406/* helper */ 407/* helper */
diff --git a/include/linux/pci-acpi.h b/include/linux/pci-acpi.h
index 44623500f419..248fba2af98a 100644
--- a/include/linux/pci-acpi.h
+++ b/include/linux/pci-acpi.h
@@ -17,6 +17,7 @@ extern acpi_status pci_acpi_remove_bus_pm_notifier(struct acpi_device *dev);
17extern acpi_status pci_acpi_add_pm_notifier(struct acpi_device *dev, 17extern acpi_status pci_acpi_add_pm_notifier(struct acpi_device *dev,
18 struct pci_dev *pci_dev); 18 struct pci_dev *pci_dev);
19extern acpi_status pci_acpi_remove_pm_notifier(struct acpi_device *dev); 19extern acpi_status pci_acpi_remove_pm_notifier(struct acpi_device *dev);
20extern phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle);
20 21
21static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev) 22static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev)
22{ 23{