Commit 2f59a647 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki Committed by Jiri Slaby

ACPI / init: Fix the ordering of acpi_reserve_resources()

commit b9a5e5e1 upstream.

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: default avatarGeorge McCollister <george.mccollister@gmail.com>
Link: http://marc.info/?t=143092384600002&r=1&w=2Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
parent 98ef5398
...@@ -177,7 +177,7 @@ static void __init acpi_request_region (struct acpi_generic_address *gas, ...@@ -177,7 +177,7 @@ static void __init acpi_request_region (struct acpi_generic_address *gas,
request_mem_region(addr, length, desc); request_mem_region(addr, length, desc);
} }
static int __init acpi_reserve_resources(void) static void __init acpi_reserve_resources(void)
{ {
acpi_request_region(&acpi_gbl_FADT.xpm1a_event_block, acpi_gbl_FADT.pm1_event_length, acpi_request_region(&acpi_gbl_FADT.xpm1a_event_block, acpi_gbl_FADT.pm1_event_length,
"ACPI PM1a_EVT_BLK"); "ACPI PM1a_EVT_BLK");
...@@ -206,10 +206,7 @@ static int __init acpi_reserve_resources(void) ...@@ -206,10 +206,7 @@ static int __init acpi_reserve_resources(void)
if (!(acpi_gbl_FADT.gpe1_block_length & 0x1)) if (!(acpi_gbl_FADT.gpe1_block_length & 0x1))
acpi_request_region(&acpi_gbl_FADT.xgpe1_block, acpi_request_region(&acpi_gbl_FADT.xgpe1_block,
acpi_gbl_FADT.gpe1_block_length, "ACPI GPE1_BLK"); acpi_gbl_FADT.gpe1_block_length, "ACPI GPE1_BLK");
return 0;
} }
device_initcall(acpi_reserve_resources);
void acpi_os_printf(const char *fmt, ...) void acpi_os_printf(const char *fmt, ...)
{ {
...@@ -1764,6 +1761,7 @@ acpi_status __init acpi_os_initialize(void) ...@@ -1764,6 +1761,7 @@ acpi_status __init acpi_os_initialize(void)
acpi_status __init acpi_os_initialize1(void) acpi_status __init acpi_os_initialize1(void)
{ {
acpi_reserve_resources();
kacpid_wq = alloc_workqueue("kacpid", 0, 1); kacpid_wq = alloc_workqueue("kacpid", 0, 1);
kacpi_notify_wq = alloc_workqueue("kacpi_notify", 0, 1); kacpi_notify_wq = alloc_workqueue("kacpi_notify", 0, 1);
kacpi_hotplug_wq = alloc_workqueue("kacpi_hotplug", 0, 1); kacpi_hotplug_wq = alloc_workqueue("kacpi_hotplug", 0, 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment