Re: [PATCH v2 2/3] x86/acpi: take rsdp address for boot params if available
From: Juergen Gross
Date: Fri Dec 08 2017 - 03:27:04 EST
On 08/12/17 08:05, Ingo Molnar wrote:
>
> * Juergen Gross <jgross@xxxxxxxx> wrote:
>
>> In case the rsdp address in struct boot_params is specified don't try
>> to find the table by searching, but take the address directly as set
>> by the boot loader.
>>
>> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
>> ---
>> drivers/acpi/osl.c | 8 ++++++++
>> 1 file changed, 8 insertions(+)
>>
>> diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
>> index 3bb46cb24a99..3b25e2ad7d75 100644
>> --- a/drivers/acpi/osl.c
>> +++ b/drivers/acpi/osl.c
>> @@ -45,6 +45,10 @@
>> #include <linux/uaccess.h>
>> #include <linux/io-64-nonatomic-lo-hi.h>
>>
>> +#ifdef CONFIG_X86
>> +#include <asm/setup.h>
>> +#endif
>> +
>> #include "internal.h"
>>
>> #define _COMPONENT ACPI_OS_SERVICES
>> @@ -195,6 +199,10 @@ acpi_physical_address __init acpi_os_get_root_pointer(void)
>> if (acpi_rsdp)
>> return acpi_rsdp;
>> #endif
>> +#ifdef CONFIG_X86
>> + if (boot_params.hdr.acpi_rsdp_addr)
>> + return boot_params.hdr.acpi_rsdp_addr;
>> +#endif
>
> Argh, that's typical short sighted hackery, layering violations and general
> eyesore combined into a single patch ...
>
> Those #ifdefs are a disgrace, plus why should generic ACPI code include platform
> details like boot_params.hdr/acpi_rsdp_addr? It's also not very extensible to
> non-x86 - so someone will have to redo this work for ARM64 as well in the future
> ...
>
> So how about doing it right:
>
> 1)
>
> Add a __weak acpi_arch_get_root_pointer() __weak function to drivers/acpi/osl.c:
>
>
> __weak acpi_physical_address acpi_arch_get_root_pointer(void)
> {
> return 0;
> }
>
> 2)
>
> use it in acpi_os_get_root_pointer():
>
> ...
> pa = acpi_arch_get_root_pointer();
> if (pa)
> return pa;
> ...
>
> 3)
>
> Override the default variant in x86's acpi.c via something like:
>
> acpi_physical_address acpi_arch_get_root_pointer(void)
> {
> return boot_params.hdr.acpi_rsdp_addr;
> }
>
> 4)
>
> Add this to arch/x86/include/asm/acpi.h:
>
> extern acpi_physical_address acpi_arch_get_root_pointer(void);
>
> 5)
>
> Add #include <asm/acpi.h> to drivers/acpi/osl.c.
>
>
> That looks much cleaner, has no layering violations and is infinitely more
> extensible, right?
Right.
Thanks for the very constructive comment.
Juergen