[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 1/2] xen/arm: GICv3: Parse ITS information from the firmware tables later on
On Wed, 24 Jan 2018, Julien Grall wrote: > There are Device Tree (e.g for the Foundation Model) out that describes the > ITS but LPIs is not supported by the platform. Booting with such DT will > result to an early Data Abort. The same DT is booting fine with a > baremetal Linux because ITS will be initialized only when LPIs is > supported. > > While this is a bug in the DT, I think Xen should be boot with the same > hardware level support (e.g ITS will not be used) as with a baremetal > Linux. > > The slight problem is Xen is relying on gicv3_its_host_has_its() to know > if ITS can be used. The list is populated by gicv3_its_{dt,acpi}_init(). > It would theoritical be possible to gate those with a check of ^ theoretically > GICD_TYPER.LPIS because we don't know yet whether the HW is an actual > GICv3/GICv4. > > Looking at the callers of gicv3_its_host_has_its(), they will only be > done after gicv3_its_init() is called. Therefore move the parsing of ITS > information from firmware tables later on. > > Note that gicv3_its_init() has been moved at the end of the file to > avoid forward declaration. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> > > --- > > I can move the code movement in a separate patch if necessary. It was > small enough that I thought it would not be worth. Yeah, that's OK, thanks for pointing it out Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > Changes in v2: > - Actually test compilation and boot of this patch... > --- > xen/arch/arm/gic-v3-its.c | 47 > +++++++++++++++++++++++++--------------- > xen/arch/arm/gic-v3.c | 5 ----- > xen/include/asm-arm/gic_v3_its.h | 12 ---------- > 3 files changed, 30 insertions(+), 34 deletions(-) > > diff --git a/xen/arch/arm/gic-v3-its.c b/xen/arch/arm/gic-v3-its.c > index e57ae05771..6127894d0b 100644 > --- a/xen/arch/arm/gic-v3-its.c > +++ b/xen/arch/arm/gic-v3-its.c > @@ -515,21 +515,6 @@ static int gicv3_its_init_single_its(struct host_its > *hw_its) > return 0; > } > > -int gicv3_its_init(void) > -{ > - struct host_its *hw_its; > - int ret; > - > - list_for_each_entry(hw_its, &host_its_list, entry) > - { > - ret = gicv3_its_init_single_its(hw_its); > - if ( ret ) > - return ret; > - } > - > - return 0; > -} > - > /* > * TODO: Investigate the interaction when a guest removes a device while > * some LPIs are still in flight. > @@ -1019,7 +1004,7 @@ static void add_to_host_its_list(paddr_t addr, paddr_t > size, > } > > /* Scan the DT for any ITS nodes and create a list of host ITSes out of it. > */ > -void gicv3_its_dt_init(const struct dt_device_node *node) > +static void gicv3_its_dt_init(const struct dt_device_node *node) > { > const struct dt_device_node *its = NULL; > > @@ -1056,7 +1041,7 @@ static int gicv3_its_acpi_probe(struct > acpi_subtable_header *header, > return 0; > } > > -void gicv3_its_acpi_init(void) > +static void gicv3_its_acpi_init(void) > { > /* Parse ITS information */ > acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_TRANSLATOR, > @@ -1081,8 +1066,36 @@ unsigned long gicv3_its_make_hwdom_madt(const struct > domain *d, void *base_ptr) > > return sizeof(struct acpi_madt_generic_translator) * > vgic_v3_its_count(d); > } > +#else /* !CONFIG_ACPI */ > + > +static void gicv3_its_acpi_init(void) > +{ > + ASSERT_UNREACHABLE(); > +} > + > #endif > > +int gicv3_its_init(void) > +{ > + struct host_its *hw_its; > + int ret; > + > + if ( acpi_disabled ) > + gicv3_its_dt_init(dt_interrupt_controller); > + else > + gicv3_its_acpi_init(); > + > + list_for_each_entry(hw_its, &host_its_list, entry) > + { > + ret = gicv3_its_init_single_its(hw_its); > + if ( ret ) > + return ret; > + } > + > + return 0; > +} > + > + > /* > * Local variables: > * mode: C > diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c > index a0d290b55c..9f9cf59f82 100644 > --- a/xen/arch/arm/gic-v3.c > +++ b/xen/arch/arm/gic-v3.c > @@ -1314,9 +1314,6 @@ static void __init gicv3_dt_init(void) > if ( !res ) > dt_device_get_address(node, 1 + gicv3.rdist_count + 2, > &vbase, &vsize); > - > - /* Check for ITS child nodes and build the host ITS list accordingly. */ > - gicv3_its_dt_init(node); > } > > static int gicv3_iomem_deny_access(const struct domain *d) > @@ -1608,8 +1605,6 @@ static void __init gicv3_acpi_init(void) > > gicv3.rdist_stride = 0; > > - gicv3_its_acpi_init(); > - > /* > * In ACPI, 0 is considered as the invalid address. However the rest > * of the initialization rely on the invalid address to be > diff --git a/xen/include/asm-arm/gic_v3_its.h > b/xen/include/asm-arm/gic_v3_its.h > index 40dffdc0fa..78a9bb14de 100644 > --- a/xen/include/asm-arm/gic_v3_its.h > +++ b/xen/include/asm-arm/gic_v3_its.h > @@ -133,11 +133,7 @@ struct host_its { > > extern struct list_head host_its_list; > > -/* Parse the host DT and pick up all host ITSes. */ > -void gicv3_its_dt_init(const struct dt_device_node *node); > - > #ifdef CONFIG_ACPI > -void gicv3_its_acpi_init(void); > unsigned long gicv3_its_make_hwdom_madt(const struct domain *d, > void *base_ptr); > #endif > @@ -202,15 +198,7 @@ void gicv3_lpi_update_host_entry(uint32_t host_lpi, int > domain_id, > > #else > > -static inline void gicv3_its_dt_init(const struct dt_device_node *node) > -{ > -} > - > #ifdef CONFIG_ACPI > -static inline void gicv3_its_acpi_init(void) > -{ > -} > - > static inline unsigned long gicv3_its_make_hwdom_madt(const struct domain *d, > void *base_ptr) > { > -- > 2.11.0 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |