[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v7 18/28] xen/arm: ITS: Export ITS info to Virtual ITS
Hi Vijay, On 18/09/15 14:09, vijay.kilari@xxxxxxxxx wrote: > diff --git a/xen/arch/arm/gic-v3-its.c b/xen/arch/arm/gic-v3-its.c > index 0d5c61c..f3346d3 100644 > --- a/xen/arch/arm/gic-v3-its.c > +++ b/xen/arch/arm/gic-v3-its.c > @@ -37,6 +37,7 @@ > #include <asm/gic.h> > #include <asm/gic_v3_defs.h> > #include <asm/gic-its.h> > +#include <asm/vits.h> > #include <xen/log2.h> > > #define its_print(lvl, fmt, ...) \ > @@ -88,6 +89,11 @@ struct its_node { > struct dt_device_node *dt_node; > }; > > +static struct { > + uint8_t eventID_bits; > + uint8_t devID_bits; > +} its_data; > + > #define ITS_ITT_ALIGN SZ_256 > > static LIST_HEAD(its_nodes); > @@ -914,6 +920,8 @@ int its_assign_device(struct domain *d, u32 vdevid, u32 > pdevid) > > for ( i = 0; i < pdev->event_map.nr_lpis; i++ ) > { > + ASSERT(i < (1 << its_data.eventID_bits)); I'd like to understand why you choose to use an ASSERT here. ASSERT means that we expect this condition never happen, although the nr_lpis is calculated using the number of MSI handled by a device. Given that we don't control the number of MSI, a proper check in its_add_device seem better than this ASSERT. > + > plpi = its_get_plpi(pdev, i); > /* TODO: Route lpi */ > } > @@ -1366,6 +1374,8 @@ static int its_probe(struct dt_device_node *node) > its->phys_size = its_size; > typer = readl_relaxed(its_base + GITS_TYPER); > its->ite_size = ((typer >> 4) & 0xf) + 1; > + its_data.eventID_bits = GITS_TYPER_IDBITS(typer); > + its_data.devID_bits = GITS_TYPER_DEVBITS(typer); The 2 fields will be override every time a new ITS node will be initialized. What ensure that all the ITS have the same number of Event ID and Device ID? > > its->cmd_base = xzalloc_bytes(ITS_CMD_QUEUE_SZ); > if ( !its->cmd_base ) > @@ -1457,6 +1467,7 @@ int its_cpu_init(void) > > int __init its_init(struct rdist_prop *rdists) > { > + struct its_node *its; > struct dt_device_node *np = NULL; > > static const struct dt_device_match its_device_ids[] __initconst = > @@ -1479,6 +1490,16 @@ int __init its_init(struct rdist_prop *rdists) > its_alloc_lpi_tables(); > its_lpi_init(rdists->id_bits); > > + its = list_first_entry(&its_nodes, struct its_node, entry); > + /* > + * As per vITS design spec, Xen exposes only one virtual ITS per domain. > + * This simplifies vITS command model. i.e Simplifies processing global s/i.e Simplifies/I.e simplifies/ > + * ITS commands which does not have device ID on platform having more > + * than one physical ITS. > + */ > + vits_setup_hw(its_data.devID_bits, its_data.eventID_bits, > + its->phys_base, its->phys_size); > + > return 0; > } > Regards, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |