From: Sunil V L <sunilvl@ventanamicro.com>
To: Andrew Jones <ajones@ventanamicro.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Paul Walmsley <paul.walmsley@sifive.com>,
"Rafael J . Wysocki" <rafael@kernel.org>,
Len Brown <lenb@kernel.org>, Thomas Gleixner <tglx@linutronix.de>,
Marc Zyngier <maz@kernel.org>, Jonathan Corbet <corbet@lwn.net>,
linux-riscv@lists.infradead.org, linux-acpi@vger.kernel.org,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
Conor Dooley <conor.dooley@microchip.com>,
Anup Patel <apatel@ventanamicro.com>,
Atish Patra <atishp@rivosinc.com>,
"Rafael J . Wysocki" <rafael.j.wysocki@intel.com>
Subject: Re: [PATCH V2 18/21] RISC-V: Add ACPI initialization in setup_arch()
Date: Fri, 24 Feb 2023 18:06:22 +0530 [thread overview]
Message-ID: <Y/ivRjQbIna7M4R2@sunil-laptop> (raw)
In-Reply-To: <20230220200743.rev3djzbaa2jcmg6@orel>
On Mon, Feb 20, 2023 at 09:07:43PM +0100, Andrew Jones wrote:
> On Thu, Feb 16, 2023 at 11:50:40PM +0530, Sunil V L wrote:
> > Initialize the ACPI core for RISC-V during boot.
> >
> > ACPI tables and interpreter are initialized based on
> > the information passed from the firmware and the value of
> > the kernel parameter 'acpi'.
> >
> > Signed-off-by: Sunil V L <sunilvl@ventanamicro.com>
> > Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> > ---
> > arch/riscv/kernel/acpi.c | 113 ++++++++++++++++++++++++++++++++++++++
> > arch/riscv/kernel/setup.c | 25 ++++++---
> > 2 files changed, 130 insertions(+), 8 deletions(-)
> >
> > diff --git a/arch/riscv/kernel/acpi.c b/arch/riscv/kernel/acpi.c
> > index 13b26c87c136..35e7b24a30c8 100644
> > --- a/arch/riscv/kernel/acpi.c
> > +++ b/arch/riscv/kernel/acpi.c
> > @@ -16,6 +16,7 @@
> > #include <linux/acpi.h>
> > #include <linux/io.h>
> > #include <linux/pci.h>
> > +#include <linux/efi.h>
> >
> > int acpi_noirq = 1; /* skip ACPI IRQ initialization */
> > int acpi_disabled = 1;
> > @@ -26,6 +27,118 @@ EXPORT_SYMBOL(acpi_pci_disabled);
> >
> > static unsigned int intc_count;
> > static struct acpi_madt_rintc cpu_madt_rintc[NR_CPUS];
> > +static bool param_acpi_off __initdata;
> > +static bool param_acpi_on __initdata;
> > +static bool param_acpi_force __initdata;
> > +
> > +static int __init parse_acpi(char *arg)
> > +{
> > + if (!arg)
> > + return -EINVAL;
> > +
> > + /* "acpi=off" disables both ACPI table parsing and interpreter */
> > + if (strcmp(arg, "off") == 0)
> > + param_acpi_off = true;
> > + else if (strcmp(arg, "on") == 0) /* prefer ACPI over DT */
> > + param_acpi_on = true;
> > + else if (strcmp(arg, "force") == 0) /* force ACPI to be enabled */
> > + param_acpi_force = true;
> > + else
> > + return -EINVAL; /* Core will print when we return error */
> > +
> > + return 0;
> > +}
> > +early_param("acpi", parse_acpi);
> > +
> > +/*
> > + * acpi_fadt_sanity_check() - Check FADT presence and carry out sanity
> > + * checks on it
> > + *
> > + * Return 0 on success, <0 on failure
> > + */
> > +static int __init acpi_fadt_sanity_check(void)
> > +{
> > + struct acpi_table_header *table;
> > + struct acpi_table_fadt *fadt;
> > + acpi_status status;
> > + int ret = 0;
> > +
> > + /*
> > + * FADT is required on riscv; retrieve it to check its presence
> > + * and carry out revision and ACPI HW reduced compliancy tests
> > + */
> > + status = acpi_get_table(ACPI_SIG_FADT, 0, &table);
> > + if (ACPI_FAILURE(status)) {
> > + const char *msg = acpi_format_exception(status);
> > +
> > + pr_err("Failed to get FADT table, %s\n", msg);
> > + return -ENODEV;
> > + }
> > +
> > + fadt = (struct acpi_table_fadt *)table;
> > +
> > + if (!(fadt->flags & ACPI_FADT_HW_REDUCED)) {
>
> Do we also need to check for ACPI version 5.0+ when checking for HW
> reduced?
>
We need to add version check of FADT once spec is released. Will
update it at that time.
> > + pr_err("FADT not ACPI hardware reduced compliant\n");
> > + ret = -EINVAL;
> > + }
> > +
> > + /*
> > + * acpi_get_table() creates FADT table mapping that
> > + * should be released after parsing and before resuming boot
> > + */
> > + acpi_put_table(table);
> > + return ret;
> > +}
> > +
> > +/*
> > + * acpi_boot_table_init() called from setup_arch(), always.
> > + * 1. find RSDP and get its address, and then find XSDT
> > + * 2. extract all tables and checksums them all
> > + * 3. check ACPI FADT HW reduced flag
> > + *
> > + * We can parse ACPI boot-time tables such as MADT after
> > + * this function is called.
> > + *
> > + * On return ACPI is enabled if either:
> > + *
> > + * - ACPI tables are initialized and sanity checks passed
> > + * - acpi=force was passed in the command line and ACPI was not disabled
> > + * explicitly through acpi=off command line parameter
> > + *
> > + * ACPI is disabled on function return otherwise
> > + */
> > +void __init acpi_boot_table_init(void)
> > +{
> > + /*
> > + * Enable ACPI instead of device tree unless
> > + * - ACPI has been disabled explicitly (acpi=off), or
> > + * - firmware has not populated ACPI ptr in EFI system table
> > + * and ACPI has not been [force] enabled (acpi=on|force)
> > + */
> > + if (param_acpi_off ||
> > + (!param_acpi_on && !param_acpi_force &&
> > + efi.acpi20 == EFI_INVALID_TABLE_ADDR))
> > + return;
> > +
> > + /*
> > + * ACPI is disabled at this point. Enable it in order to parse
> > + * the ACPI tables and carry out sanity checks
> > + */
> > + enable_acpi();
> > +
> > + /*
> > + * If ACPI tables are initialized and FADT sanity checks passed,
> > + * leave ACPI enabled and carry on booting; otherwise disable ACPI
> > + * on initialization error.
> > + * If acpi=force was passed on the command line it forces ACPI
> > + * to be enabled even if its initialization failed.
> > + */
> > + if (acpi_table_init() || acpi_fadt_sanity_check()) {
> > + pr_err("Failed to init ACPI tables\n");
> > + if (!param_acpi_force)
> > + disable_acpi();
> > + }
> > +}
>
> A lot of the above code is common with arm64. It'd be nice to share that,
> but maybe refactoring can be done on top of this.
>
Okay.
> >
> > static int acpi_parse_madt_rintc(union acpi_subtable_headers *header, const unsigned long end)
> > {
> > diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c
> > index 4335f08ffaf2..c2ee7f4427a1 100644
> > --- a/arch/riscv/kernel/setup.c
> > +++ b/arch/riscv/kernel/setup.c
> > @@ -8,6 +8,7 @@
> > * Nick Kossifidis <mick@ics.forth.gr>
> > */
> >
> > +#include <linux/acpi.h>
> > #include <linux/init.h>
> > #include <linux/mm.h>
> > #include <linux/memblock.h>
> > @@ -276,14 +277,22 @@ void __init setup_arch(char **cmdline_p)
> >
> > efi_init();
> > paging_init();
> > -#if IS_ENABLED(CONFIG_BUILTIN_DTB)
> > - unflatten_and_copy_device_tree();
> > -#else
> > - if (early_init_dt_verify(__va(XIP_FIXUP(dtb_early_pa))))
> > - unflatten_device_tree();
> > - else
> > - pr_err("No DTB found in kernel mappings\n");
> > -#endif
> > +
> > + /* Parse the ACPI tables for possible boot-time configuration */
> > + acpi_boot_table_init();
> > + if (acpi_disabled) {
> > + if (IS_ENABLED(CONFIG_BUILTIN_DTB)) {
> > + unflatten_and_copy_device_tree();
> > + } else {
> > + if (early_init_dt_verify(__va(XIP_FIXUP(dtb_early_pa))))
> > + unflatten_device_tree();
> > + else
> > + pr_err("No DTB found in kernel mappings\n");
> > + }
> > + } else {
> > + early_init_dt_verify(__va(XIP_FIXUP(dtb_early_pa)));
> > + }
> > +
> > early_init_fdt_scan_reserved_mem();
> > misc_mem_init();
> >
> > --
> > 2.34.1
> >
>
> Otherwise,
>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Thanks,
Sunil
next prev parent reply other threads:[~2023-02-24 12:36 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-16 18:20 [PATCH V2 00/21] Add basic ACPI support for RISC-V Sunil V L
2023-02-16 18:20 ` [PATCH V2 01/21] riscv: move sbi_init() earlier before jump_label_init() Sunil V L
2023-02-16 18:20 ` [PATCH V2 02/21] ACPICA: MADT: Add RISC-V INTC interrupt controller Sunil V L
2023-02-16 18:20 ` [PATCH V2 03/21] ACPICA: Add structure definitions for RISC-V RHCT Sunil V L
2023-02-16 18:20 ` [PATCH V2 04/21] RISC-V: Add support to build the ACPI core Sunil V L
2023-02-20 15:44 ` Andrew Jones
2023-02-24 9:00 ` Sunil V L
2023-02-16 18:20 ` [PATCH V2 05/21] ACPI: Kconfig: Enable ACPI_PROCESSOR for RISC-V Sunil V L
2023-02-20 16:05 ` Andrew Jones
2023-02-24 8:45 ` Sunil V L
2023-02-16 18:20 ` [PATCH V2 06/21] ACPI: OSL: Make should_use_kmap() 0 " Sunil V L
2023-02-16 18:20 ` [PATCH V2 07/21] ACPI: processor_core: RISC-V: Enable mapping processor to the hartid Sunil V L
2023-02-20 16:10 ` Andrew Jones
2023-02-16 18:20 ` [PATCH V2 08/21] drivers/acpi: RISC-V: Add RHCT related code Sunil V L
2023-02-20 16:36 ` Andrew Jones
2023-02-24 12:03 ` Sunil V L
2023-02-16 18:20 ` [PATCH V2 09/21] RISC-V: smpboot: Create wrapper smp_setup() Sunil V L
2023-02-20 16:37 ` Andrew Jones
2023-02-16 18:20 ` [PATCH V2 10/21] RISC-V: smpboot: Add ACPI support in smp_setup() Sunil V L
2023-02-20 17:08 ` Andrew Jones
2023-02-24 16:50 ` Sunil V L
2023-02-24 17:06 ` Andrew Jones
2023-02-16 18:20 ` [PATCH V2 11/21] RISC-V: ACPI: Add a function to retrieve the hartid Sunil V L
2023-02-20 17:34 ` Andrew Jones
2023-02-16 18:20 ` [PATCH V2 12/21] RISC-V: cpufeature: Add ACPI support in riscv_fill_hwcap() Sunil V L
2023-02-20 17:45 ` Andrew Jones
2023-02-16 18:20 ` [PATCH V2 13/21] RISC-V: cpu: Enable cpuinfo for ACPI systems Sunil V L
2023-02-20 17:54 ` Andrew Jones
2023-02-24 12:27 ` Sunil V L
2023-02-16 18:20 ` [PATCH V2 14/21] irqchip/riscv-intc: Add ACPI support Sunil V L
2023-02-20 19:37 ` Andrew Jones
2023-02-24 12:29 ` Sunil V L
2023-02-16 18:20 ` [PATCH V2 15/21] clocksource/timer-riscv: Refactor riscv_timer_init_dt() Sunil V L
2023-02-20 19:47 ` Andrew Jones
2023-02-16 18:20 ` [PATCH V2 16/21] clocksource/timer-riscv: Add ACPI support Sunil V L
2023-02-20 19:51 ` Andrew Jones
2023-02-16 18:20 ` [PATCH V2 17/21] RISC-V: time.c: Add ACPI support for time_init() Sunil V L
2023-02-20 19:58 ` Andrew Jones
2023-02-24 12:33 ` Sunil V L
2023-02-16 18:20 ` [PATCH V2 18/21] RISC-V: Add ACPI initialization in setup_arch() Sunil V L
2023-02-20 20:07 ` Andrew Jones
2023-02-24 12:36 ` Sunil V L [this message]
2023-02-24 13:07 ` Andrew Jones
2023-02-24 14:44 ` Sunil V L
2023-02-16 18:20 ` [PATCH V2 19/21] RISC-V: Enable ACPI in defconfig Sunil V L
2023-02-20 20:09 ` Andrew Jones
2023-02-24 8:46 ` Sunil V L
2023-02-16 18:20 ` [PATCH V2 20/21] MAINTAINERS: Add entry for drivers/acpi/riscv Sunil V L
2023-02-20 20:14 ` Andrew Jones
2023-02-24 12:38 ` Sunil V L
2023-02-16 18:20 ` [PATCH V2 21/21] Documentation/kernel-parameters.txt: Add RISC-V for ACPI parameter Sunil V L
2023-02-20 20:15 ` Andrew Jones
2023-02-24 12:37 ` Sunil V L
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y/ivRjQbIna7M4R2@sunil-laptop \
--to=sunilvl@ventanamicro.com \
--cc=ajones@ventanamicro.com \
--cc=aou@eecs.berkeley.edu \
--cc=apatel@ventanamicro.com \
--cc=atishp@rivosinc.com \
--cc=conor.dooley@microchip.com \
--cc=corbet@lwn.net \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=maz@kernel.org \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=rafael.j.wysocki@intel.com \
--cc=rafael@kernel.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).