[PATCH v10 18/21] ARM64 / ACPI: Select ACPI_REDUCED_HARDWARE_ONLY if ACPI is enabled on ARM64

Lorenzo Pieralisi lorenzo.pieralisi at arm.com
Tue Mar 17 05:50:05 PDT 2015


On Mon, Mar 16, 2015 at 11:33:29AM +0000, Hanjun Guo wrote:

[...]

> > Patch rewritten, here below, please have a look, test it and rework
> > bits as needed, I added comments where I thought they were needed but
> > please add to that if you feel it is worth it.
> >
> > It should be easy to split, let me know if you want an incremental
> > version.
> 
> This one is much better, pretty fine to me, thanks!
> 
> I assume that this patch is cleanup patch on top of ARM64 ACPI
> core patches, right?

Well, it is a clean-up patch on top of your series, I can split it
in the respective patches and send you the patches in your series
updated with this code.

Thanks,
Lorenzo

> 
> Thanks
> Hanjun
> 
> >
> > Thanks !
> > Lorenzo
> >
> > ---
> >   arch/arm64/kernel/acpi.c | 103 +++++++++++++++++++++++++++++++----------------
> >   1 file changed, 69 insertions(+), 34 deletions(-)
> >
> > diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c
> > index 5819ef7..e5ee4d4 100644
> > --- a/arch/arm64/kernel/acpi.c
> > +++ b/arch/arm64/kernel/acpi.c
> > @@ -291,43 +291,60 @@ void acpi_unregister_gsi(u32 gsi)
> >   }
> >   EXPORT_SYMBOL_GPL(acpi_unregister_gsi);
> >
> > -static int __init acpi_parse_fadt(struct acpi_table_header *table)
> > +/*
> > + * 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_fadt *fadt = (struct acpi_table_fadt *)table;
> > +	struct acpi_table_header *table;
> > +	struct acpi_table_fadt *fadt;
> > +	acpi_status status;
> > +	acpi_size tbl_size;
> > +	int ret = 0;
> > +
> > +	/*
> > +	 * FADT is required on arm64; retrieve it to check its presence
> > +	 * and carry out revision and ACPI HW reduced compliancy tests
> > +	 */
> > +	status = acpi_get_table_with_size(ACPI_SIG_FADT, 0, &table, &tbl_size);
> > +	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;
> >
> >   	/*
> >   	 * Revision in table header is the FADT Major revision, and there
> >   	 * is a minor revision of FADT which was introduced by ACPI 5.1,
> >   	 * we only deal with ACPI 5.1 or newer revision to get GIC and SMP
> > -	 * boot protocol configuration data, or we will disable ACPI.
> > +	 * boot protocol configuration data.
> >   	 */
> > -	if (table->revision > 5 ||
> > -	    (table->revision == 5 && fadt->minor_revision >= 1)) {
> > -		if (!acpi_gbl_reduced_hardware) {
> > -			pr_err("Not hardware reduced ACPI mode, will not be supported\n");
> > -			goto disable_acpi;
> > -		}
> > -
> > -		/*
> > -		 * ACPI 5.1 only has two explicit methods to boot up SMP,
> > -		 * PSCI and Parking protocol, but the Parking protocol is
> > -		 * only specified for ARMv7 now, so make PSCI as the only
> > -		 * way for the SMP boot protocol before some updates for
> > -		 * the Parking protocol spec.
> > -		 */
> > -		if (acpi_psci_present())
> > -			return 0;
> > -
> > -		pr_warn("No PSCI support, will not bring up secondary CPUs\n");
> > -		return -EOPNOTSUPP;
> > +	if (table->revision < 5 ||
> > +	   (table->revision == 5 && fadt->minor_revision < 1)) {
> > +		pr_err("Unsupported FADT revision %d.%d, should be 5.1+\n",
> > +		       table->revision, fadt->minor_revision);
> > +		ret = -EINVAL;
> > +		goto out;
> >   	}
> >
> > -	pr_warn("Unsupported FADT revision %d.%d, should be 5.1+, will disable ACPI\n",
> > -		table->revision, fadt->minor_revision);
> > +	if (!(fadt->flags & ACPI_FADT_HW_REDUCED)) {
> > +		pr_err("FADT not ACPI hardware reduced compliant\n");
> > +		ret = -EINVAL;
> > +	}
> >
> > -disable_acpi:
> > -	disable_acpi();
> > -	return -EINVAL;
> > +out:
> > +	/*
> > +	 * acpi_get_table_with_size() creates FADT table mapping that
> > +	 * should be released after parsing and before resuming boot
> > +	 */
> > +	early_acpi_os_unmap_memory((char *)table, tbl_size);
> > +	return ret;
> >   }
> >
> >   /*
> > @@ -335,12 +352,17 @@ disable_acpi:
> >    *	1. find RSDP and get its address, and then find XSDT
> >    *	2. extract all tables and checksums them all
> >    *	3. check ACPI FADT revision
> > + *	4. check ACPI FADT HW reduced flag
> >    *
> >    * We can parse ACPI boot-time tables such as MADT after
> >    * this function is called.
> > + *
> > + * ACPI is enabled on return if ACPI tables initialized and sanity checks
> > + * passed, disabled otherwise
> >    */
> >   void __init acpi_boot_table_init(void)
> >   {
> > +
> >   	/*
> >   	 * Enable ACPI instead of device tree unless
> >   	 * - ACPI has been disabled explicitly (acpi=off), or
> > @@ -351,19 +373,32 @@ void __init acpi_boot_table_init(void)
> >   	    (!param_acpi_force && of_scan_flat_dt(dt_scan_depth1_nodes, NULL)))
> >   		return;
> >
> > +	/*
> > +	 * ACPI is disabled at this point. Enable it in order to parse
> > +	 * the ACPI tables and carry out sanity checks
> > +	 */
> >   	enable_acpi();
> >
> >   	/* Initialize the ACPI boot-time table parser. */
> >   	if (acpi_table_init()) {
> > -		disable_acpi();
> > -		return;
> > +		pr_err("Failed to init ACPI tables\n");
> > +		goto init_failed;
> >   	}
> >
> > -	if (acpi_table_parse(ACPI_SIG_FADT, acpi_parse_fadt)) {
> > -		/* disable ACPI if no FADT is found */
> > -		disable_acpi();
> > -		pr_err("Can't find FADT\n");
> > -	}
> > +	/*
> > +	 * Check FADT presence and carry out FADT sanity checks
> > +	 */
> > +	if (acpi_fadt_sanity_check() < 0)
> > +		goto init_failed;
> > +
> > +	/*
> > +	 * ACPI tables initialized and FADT sanity checks passed, leave
> > +	 * ACPI enabled and carry on booting
> > +	 */
> > +	return;
> > +
> > +init_failed:
> > +	disable_acpi();
> >   }
> >
> >   void __init acpi_gic_init(void)
> >
> 



More information about the linux-arm-kernel mailing list