From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stefano Stabellini Subject: Re: [PATCH v4 15/21] arm/gic: Add ACPI support for GIC preinit Date: Tue, 2 Feb 2016 17:36:53 +0000 Message-ID: References: <1453540813-15764-1-git-send-email-zhaoshenglong@huawei.com> <1453540813-15764-16-git-send-email-zhaoshenglong@huawei.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1453540813-15764-16-git-send-email-zhaoshenglong@huawei.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Shannon Zhao Cc: ian.campbell@citrix.com, stefano.stabellini@eu.citrix.com, peter.huangpeng@huawei.com, xen-devel@lists.xen.org, julien.grall@citrix.com, stefano.stabellini@citrix.com, shannon.zhao@linaro.org List-Id: xen-devel@lists.xenproject.org On Sat, 23 Jan 2016, Shannon Zhao wrote: > From: Shannon Zhao > > Since ACPI 6.0 defines that GIC Distributor Structure contains the GIC > version filed, it could get GIC version from that. Then call acpi device > initializing function to preinit GIC device. > > Signed-off-by: Shannon Zhao > --- > V4: use ACPI_MADT_GIC_VERSION_V* instead of GICv* > --- > xen/arch/arm/gic.c | 37 +++++++++++++++++++++++++++++++++---- > 1 file changed, 33 insertions(+), 4 deletions(-) > > diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c > index 43e6fa2..840075f 100644 > --- a/xen/arch/arm/gic.c > +++ b/xen/arch/arm/gic.c > @@ -27,6 +27,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -34,6 +35,7 @@ > #include > #include > #include > +#include > > static void gic_restore_pending_irqs(struct vcpu *v); > > @@ -228,10 +230,7 @@ int gic_irq_xlate(const u32 *intspec, unsigned int intsize, > return 0; > } > > -/* Find the interrupt controller and set up the callback to translate > - * device tree IRQ. > - */ > -void __init gic_preinit(void) > +static void __init gic_dt_preinit(void) > { > int rc; > struct dt_device_node *node; > @@ -261,6 +260,36 @@ void __init gic_preinit(void) > dt_device_set_used_by(node, DOMID_XEN); > } > > +#ifdef CONFIG_ACPI > +static void __init gic_acpi_preinit(void) > +{ > + struct acpi_subtable_header *header; > + struct acpi_madt_generic_distributor *dist; > + > + header = acpi_table_get_entry_madt(ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR, 0); > + if ( !header ) > + panic("No valid GICD entries exists"); > + > + dist = container_of(header, struct acpi_madt_generic_distributor, header); > + > + if ( acpi_device_init(DEVICE_GIC, NULL, dist->version) ) > + panic("Unable to find compatible GIC in the ACPI table"); > +} > +#else > +static void __init gic_acpi_preinit(void) {} > +#endif Again if acpi_disabled were an #define constant, this #else would not be needed. Provided that you remove it, you can add my Reviewed-by. > +/* Find the interrupt controller and set up the callback to translate > + * device tree or ACPI IRQ. > + */ > +void __init gic_preinit(void) > +{ > + if ( acpi_disabled ) > + gic_dt_preinit(); > + else > + gic_acpi_preinit(); > +} > + > /* Set up the GIC */ > void __init gic_init(void) > {