When booting from UEFI the ACPI regions are removed from memory map. So to maintain compatability do the same when the ACPI region is passed from the FDT.
Signed-off-by: Graeme Gregory graeme.gregory@linaro.org --- arch/arm/include/asm/acpi.h | 2 ++ arch/arm/kernel/setup.c | 3 +++ arch/arm64/include/asm/acpi.h | 2 ++ arch/arm64/kernel/setup.c | 3 +++ drivers/acpi/osl.c | 2 +- drivers/acpi/plat/arm/boot.c | 23 +++++++++++++++++++++++ 6 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/arch/arm/include/asm/acpi.h b/arch/arm/include/asm/acpi.h index e5ac1b8..ca7efaa 100644 --- a/arch/arm/include/asm/acpi.h +++ b/arch/arm/include/asm/acpi.h @@ -112,6 +112,8 @@ struct acpi_arm_root { }; extern struct acpi_arm_root acpi_arm_rsdp_info;
+void arm_acpi_reserve_memory(void); + /* Low-level suspend routine. */ extern int acpi_suspend_lowlevel(void);
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index a440211..ac1bd1f 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -894,6 +894,9 @@ void __init setup_arch(char **cmdline_p) #ifdef CONFIG_EFI efi_memblock_arm_reserve_range(); #endif +#ifdef CONFIG_ACPI + arm_acpi_reserve_memory(); +#endif
paging_init(mdesc); request_standard_resources(mdesc); diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h index 3d37c0e..a19b73f 100644 --- a/arch/arm64/include/asm/acpi.h +++ b/arch/arm64/include/asm/acpi.h @@ -90,6 +90,8 @@ struct acpi_arm_root { }; extern struct acpi_arm_root acpi_arm_rsdp_info;
+void arm_acpi_reserve_memory(void); + /* Low-level suspend routine. */ extern int acpi_suspend_lowlevel(void);
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 627c6d6..fda34a3 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -272,6 +272,9 @@ void __init setup_arch(char **cmdline_p)
arm64_memblock_init();
+#ifdef CONFIG_ACPI + arm_acpi_reserve_memory(); +#endif paging_init(); request_standard_resources();
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index ebe34b3..18d62c1 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -386,7 +386,7 @@ acpi_map_lookup_virt(void __iomem *virt, acpi_size size) return NULL; }
-#ifndef CONFIG_IA64 +#if !defined(CONFIG_IA64) && !defined(CONFIG_ARM64) && !defined(CONFIG_ARM) #define should_use_kmap(pfn) page_is_ram(pfn) #else /* ioremap will take care of cache attributes */ diff --git a/drivers/acpi/plat/arm/boot.c b/drivers/acpi/plat/arm/boot.c index 5ca62dc..130e35a 100644 --- a/drivers/acpi/plat/arm/boot.c +++ b/drivers/acpi/plat/arm/boot.c @@ -754,6 +754,29 @@ int __init acpi_boot_init(void) return 0; }
+/* + * make sure that the address passed for ACPI tables which is normall in + * system ram is removed from the kernel memory map + */ +void __init arm_acpi_reserve_memory() +{ + unsigned long section_offset; + unsigned long num_sections; + phys_addr_t addr = acpi_arm_rsdp_info.phys_address; + int size = acpi_arm_rsdp_info.size; + + /* if ACPI tables were not passed in FDT then escape here */ + if (!addr || !size) + return; + + section_offset = addr - (addr & SECTION_MASK); + num_sections = size / SECTION_SIZE; + if (size % SECTION_SIZE) + num_sections++; + + memblock_remove(addr - section_offset, num_sections * SECTION_SIZE); +} + static int __init parse_acpi(char *arg) { if (!arg)
On 09/20/2013 11:33 AM, Graeme Gregory wrote:
When booting from UEFI the ACPI regions are removed from memory map. So to maintain compatability do the same when the ACPI region is passed from the FDT.
Signed-off-by: Graeme Gregory graeme.gregory@linaro.org
arch/arm/include/asm/acpi.h | 2 ++ arch/arm/kernel/setup.c | 3 +++ arch/arm64/include/asm/acpi.h | 2 ++ arch/arm64/kernel/setup.c | 3 +++ drivers/acpi/osl.c | 2 +- drivers/acpi/plat/arm/boot.c | 23 +++++++++++++++++++++++ 6 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/arch/arm/include/asm/acpi.h b/arch/arm/include/asm/acpi.h index e5ac1b8..ca7efaa 100644 --- a/arch/arm/include/asm/acpi.h +++ b/arch/arm/include/asm/acpi.h @@ -112,6 +112,8 @@ struct acpi_arm_root { }; extern struct acpi_arm_root acpi_arm_rsdp_info;
+void arm_acpi_reserve_memory(void);
- /* Low-level suspend routine. */ extern int acpi_suspend_lowlevel(void);
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index a440211..ac1bd1f 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -894,6 +894,9 @@ void __init setup_arch(char **cmdline_p) #ifdef CONFIG_EFI efi_memblock_arm_reserve_range(); #endif +#ifdef CONFIG_ACPI
- arm_acpi_reserve_memory();
+#endif
paging_init(mdesc); request_standard_resources(mdesc); diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h index 3d37c0e..a19b73f 100644 --- a/arch/arm64/include/asm/acpi.h +++ b/arch/arm64/include/asm/acpi.h @@ -90,6 +90,8 @@ struct acpi_arm_root { }; extern struct acpi_arm_root acpi_arm_rsdp_info;
+void arm_acpi_reserve_memory(void);
- /* Low-level suspend routine. */ extern int acpi_suspend_lowlevel(void);
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 627c6d6..fda34a3 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -272,6 +272,9 @@ void __init setup_arch(char **cmdline_p)
arm64_memblock_init();
+#ifdef CONFIG_ACPI
- arm_acpi_reserve_memory();
+#endif paging_init(); request_standard_resources();
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index ebe34b3..18d62c1 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -386,7 +386,7 @@ acpi_map_lookup_virt(void __iomem *virt, acpi_size size) return NULL; }
-#ifndef CONFIG_IA64 +#if !defined(CONFIG_IA64) && !defined(CONFIG_ARM64) && !defined(CONFIG_ARM) #define should_use_kmap(pfn) page_is_ram(pfn) #else /* ioremap will take care of cache attributes */ diff --git a/drivers/acpi/plat/arm/boot.c b/drivers/acpi/plat/arm/boot.c index 5ca62dc..130e35a 100644 --- a/drivers/acpi/plat/arm/boot.c +++ b/drivers/acpi/plat/arm/boot.c @@ -754,6 +754,29 @@ int __init acpi_boot_init(void) return 0; }
+/*
- make sure that the address passed for ACPI tables which is normall in
- system ram is removed from the kernel memory map
- */
+void __init arm_acpi_reserve_memory() +{
unsigned long section_offset;
unsigned long num_sections;
- phys_addr_t addr = acpi_arm_rsdp_info.phys_address;
- int size = acpi_arm_rsdp_info.size;
- /* if ACPI tables were not passed in FDT then escape here */
- if (!addr || !size)
return;
section_offset = addr - (addr & SECTION_MASK);
num_sections = size / SECTION_SIZE;
if (size % SECTION_SIZE)
num_sections++;
memblock_remove(addr - section_offset, num_sections * SECTION_SIZE);
+}
- static int __init parse_acpi(char *arg) { if (!arg)
I think this is the one you mentioned needed some spacing cleanup..?
Acked-by: Al Stone al.stone@linaro.org