|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 05/35] ARM64 / ACPI: Parse FADT table to get PSCI flags
On Wed, 4 Feb 2015, parth.dixit@xxxxxxxxxx wrote:
> From: Naresh Bhat <naresh.bhat@xxxxxxxxxx>
>
> There are two flags: PSCI_COMPLIANT and PSCI_USE_HVC. When set,
> the former signals to the OS that the hardware is PSCI compliant.
> The latter selects the appropriate conduit for PSCI calls by
> toggling between Hypervisor Calls (HVC) and Secure Monitor Calls
> (SMC).
>
> FADT table contains such information, parse FADT to get the flags
> for furture usage. At the same time, only ACPI 5.1 or higher verison
> supports PSCI, and FADT Major.Minor version was introduced in ACPI
> 5.1, so we will check the version and only parse FADT table with
> version >= 5.1.
>
> If firmware provides ACPI tables with ACPI version less than 5.1,
> OS will be messed up with those information, so disable ACPI if we
> get an FADT table with version less that 5.1.
>
> Signed-off-by: Hanjun Guo <hanjun.guo@xxxxxxxxxx>
> Signed-off-by: Naresh Bhat <naresh.bhat@xxxxxxxxxx>
> ---
> xen/arch/arm/arm64/acpi/arm-core.c | 54
> +++++++++++++++++++++++++++++++++++---
> xen/arch/arm/setup.c | 1 +
> xen/include/asm-arm/acpi.h | 2 ++
> 3 files changed, 54 insertions(+), 3 deletions(-)
>
> diff --git a/xen/arch/arm/arm64/acpi/arm-core.c
> b/xen/arch/arm/arm64/acpi/arm-core.c
> index 50a83d6..2b7e2ef 100644
> --- a/xen/arch/arm/arm64/acpi/arm-core.c
> +++ b/xen/arch/arm/arm64/acpi/arm-core.c
> @@ -25,6 +25,7 @@
> #if defined(CONFIG_ARM_64) && defined(CONFIG_ACPI)
> #include <xen/init.h>
> #include <xen/acpi.h>
> +#include <xen/errno.h>
>
> #include <asm/acpi.h>
>
> @@ -42,6 +43,12 @@ EXPORT_SYMBOL(acpi_disabled);
> int acpi_pci_disabled; /* skip ACPI PCI scan and IRQ initialization
> */
> EXPORT_SYMBOL(acpi_pci_disabled);
>
> +/* 1 to indicate PSCI is implemented */
> +int acpi_psci_present;
> +
> +/* 1 to indicate HVC must be used instead of SMC as the PSCI conduit */
> +int acpi_psci_use_hvc;
Can they be static?
Also it might be better to define an enum with values: PSCI_ABSENT, PSCI_HVC,
PSCI_SMC.
> enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PLATFORM;
>
> struct acpi_arm_root acpi_arm_rsdp_info; /* info about RSDP from FDT */
> @@ -58,7 +65,7 @@ EXPORT_SYMBOL_GPL(acpi_gsi_to_irq);
> * failure: return =< 0
> */
> //int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int
> polarity)
> -unsigned int acpi_register_gsi (u32 gsi, int edge_level, int active_high_low)
> +unsigned int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low)
> {
> return -1;
> }
> @@ -69,6 +76,33 @@ void acpi_unregister_gsi(u32 gsi)
> }
> EXPORT_SYMBOL_GPL(acpi_unregister_gsi);
>
> +static int __init acpi_parse_fadt(struct acpi_table_header *table)
> +{
> + struct acpi_table_fadt *fadt = (struct acpi_table_fadt *)table;
> +
> + /*
> + * Revision in table header is the FADT Major version,
> + * and there is a minor version of FADT which was introduced
> + * by ACPI 5.1, we only deal with ACPI 5.1 or higher version
> + * to get arm boot flags, or we will disable ACPI.
> + */
> + if ( table->revision < 5 || fadt->minor_version < 1 ) {
> + printk("FADT version is %d.%d, no PSCI support, should be 5.1
> or higher\n",
> + table->revision, fadt->minor_version);
> + acpi_psci_present = 0;
> + disable_acpi();
> + return -EINVAL;
> + }
> +
> + if ( acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_COMPLIANT )
> + acpi_psci_present = 1;
> +
> + if ( acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_USE_HVC )
> + acpi_psci_use_hvc = 1;
> +
> + return 0;
> +}
> +
> /*
> * acpi_boot_table_init() called from setup_arch(), always.
> * 1. find RSDP and get its address, and then find XSDT
> @@ -81,12 +115,12 @@ int __init acpi_boot_table_init(void)
> {
> int error;
> /* If acpi_disabled, bail out */
> - if (acpi_disabled)
> + if ( acpi_disabled )
> return 1;
>
> /* Initialize the ACPI boot-time table parser. */
> error = acpi_table_init();
> - if (error)
> + if ( error )
> {
> disable_acpi();
> return error;
> @@ -94,4 +128,18 @@ int __init acpi_boot_table_init(void)
>
> return 0;
> }
> +
> +int __init acpi_boot_init(void)
> +{
> + int err = 0;
> + /* If acpi_disabled, bail out */
> + if (acpi_disabled)
> + return -ENODEV;
> +
> + err = acpi_table_parse(ACPI_SIG_FADT, acpi_parse_fadt);
> + if ( err )
> + printk("Can't find FADT\n");
> +
> + return err;
> +}
> #endif
> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> index 7ae126b..3531d47 100644
> --- a/xen/arch/arm/setup.c
> +++ b/xen/arch/arm/setup.c
> @@ -749,6 +749,7 @@ void __init start_xen(unsigned long boot_phys_offset,
>
> #if defined(CONFIG_ACPI) && defined(CONFIG_ARM_64)
> acpi_boot_table_init();
> + acpi_boot_init();
> #endif
>
> dt_unflatten_host_device_tree();
> diff --git a/xen/include/asm-arm/acpi.h b/xen/include/asm-arm/acpi.h
> index f6284b5..03051ef 100644
> --- a/xen/include/asm-arm/acpi.h
> +++ b/xen/include/asm-arm/acpi.h
> @@ -60,6 +60,8 @@ extern int acpi_disabled;
> extern int acpi_noirq;
> extern int acpi_pci_disabled;
> extern int acpi_strict;
> +extern int acpi_psci_present;
> +extern int acpi_psci_use_hvc;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |