[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <2c4914fc-5ddd-b7e7-ef7b-90cac582122b@suse.com>
Date: Fri, 8 Dec 2017 09:26:55 +0100
From: Juergen Gross <jgross@...e.com>
To: Ingo Molnar <mingo@...nel.org>
Cc: linux-kernel@...r.kernel.org, xen-devel@...ts.xenproject.org,
x86@...nel.org, boris.ostrovsky@...cle.com, hpa@...or.com,
tglx@...utronix.de, mingo@...hat.com, corbet@....net,
rjw@...ysocki.net, lenb@...nel.org, linux-acpi@...r.kernel.org
Subject: Re: [PATCH v2 2/3] x86/acpi: take rsdp address for boot params if
available
On 08/12/17 08:05, Ingo Molnar wrote:
>
> * Juergen Gross <jgross@...e.com> 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@...e.com>
>> ---
>> 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
Powered by blists - more mailing lists