aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2015-05-07 15:19:39 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2015-05-07 15:19:39 -0400
commitb9a5e5e18fbf223502c0b2264c15024e393da928 (patch)
tree0986033a34d66189490eb17821ec6f52f4e0dd83 /drivers/acpi
parent5ebe6afaf0057ac3eaeb98defd5456894b446d22 (diff)
ACPI / init: Fix the ordering of acpi_reserve_resources()
Since acpi_reserve_resources() is defined as a device_initcall(), there's no guarantee that it will be executed in the right order with respect to the rest of the ACPI initialization code. On some systems this leads to breakage if, for example, the address range that should be reserved for the ACPI fixed registers is given to the PCI host bridge instead if the race is won by the wrong code path. Fix this by turning acpi_reserve_resources() into a void function and calling it directly from within the ACPI initialization sequence. Reported-and-tested-by: George McCollister <george.mccollister@gmail.com> Link: http://marc.info/?t=143092384600002&r=1&w=2 Cc: All applicable <stable@vger.kernel.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi')
-rw-r--r--drivers/acpi/osl.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 39748bb3a543..7ccba395c9dd 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -182,7 +182,7 @@ static void __init acpi_request_region (struct acpi_generic_address *gas,
182 request_mem_region(addr, length, desc); 182 request_mem_region(addr, length, desc);
183} 183}
184 184
185static int __init acpi_reserve_resources(void) 185static void __init acpi_reserve_resources(void)
186{ 186{
187 acpi_request_region(&acpi_gbl_FADT.xpm1a_event_block, acpi_gbl_FADT.pm1_event_length, 187 acpi_request_region(&acpi_gbl_FADT.xpm1a_event_block, acpi_gbl_FADT.pm1_event_length,
188 "ACPI PM1a_EVT_BLK"); 188 "ACPI PM1a_EVT_BLK");
@@ -211,10 +211,7 @@ static int __init acpi_reserve_resources(void)
211 if (!(acpi_gbl_FADT.gpe1_block_length & 0x1)) 211 if (!(acpi_gbl_FADT.gpe1_block_length & 0x1))
212 acpi_request_region(&acpi_gbl_FADT.xgpe1_block, 212 acpi_request_region(&acpi_gbl_FADT.xgpe1_block,
213 acpi_gbl_FADT.gpe1_block_length, "ACPI GPE1_BLK"); 213 acpi_gbl_FADT.gpe1_block_length, "ACPI GPE1_BLK");
214
215 return 0;
216} 214}
217device_initcall(acpi_reserve_resources);
218 215
219void acpi_os_printf(const char *fmt, ...) 216void acpi_os_printf(const char *fmt, ...)
220{ 217{
@@ -1845,6 +1842,7 @@ acpi_status __init acpi_os_initialize(void)
1845 1842
1846acpi_status __init acpi_os_initialize1(void) 1843acpi_status __init acpi_os_initialize1(void)
1847{ 1844{
1845 acpi_reserve_resources();
1848 kacpid_wq = alloc_workqueue("kacpid", 0, 1); 1846 kacpid_wq = alloc_workqueue("kacpid", 0, 1);
1849 kacpi_notify_wq = alloc_workqueue("kacpi_notify", 0, 1); 1847 kacpi_notify_wq = alloc_workqueue("kacpi_notify", 0, 1);
1850 kacpi_hotplug_wq = alloc_ordered_workqueue("kacpi_hotplug", 0); 1848 kacpi_hotplug_wq = alloc_ordered_workqueue("kacpi_hotplug", 0);