mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/arm: vgic-v3: Use a struct to describe contiguous rdist regions
Also update the different comment to make clear that we register one MMIO region per contiguous regions and not per re-distributor. Signed-off-by: Julien Grall <julien.grall@linaro.org> Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
1 parent
4636e9fb40
commit
196f4ef4e9
3 files changed
+23
-19
No files matched your search
+10
-10
@@ -909,10 +909,10 @@ static int gicv_v3_init(struct domain *d)
|
||||
|
||||
for ( i = 0; i < gicv3.rdist_count; i++ )
|
||||
{
|
||||
d->arch.vgic.rbase[i] = gicv3.rdist_regions[i].base;
|
||||
d->arch.vgic.rbase_size[i] = gicv3.rdist_regions[i].size;
|
||||
d->arch.vgic.rdist_regions[i].base = gicv3.rdist_regions[i].base;
|
||||
d->arch.vgic.rdist_regions[i].size = gicv3.rdist_regions[i].size;
|
||||
}
|
||||
d->arch.vgic.rdist_count = gicv3.rdist_count;
|
||||
d->arch.vgic.nr_regions = gicv3.rdist_count;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -922,13 +922,13 @@ static int gicv_v3_init(struct domain *d)
|
||||
/* XXX: Only one Re-distributor region mapped for the guest */
|
||||
BUILD_BUG_ON(GUEST_GICV3_RDIST_REGIONS != 1);
|
||||
|
||||
d->arch.vgic.rdist_count = GUEST_GICV3_RDIST_REGIONS;
|
||||
d->arch.vgic.nr_regions = GUEST_GICV3_RDIST_REGIONS;
|
||||
d->arch.vgic.rdist_stride = GUEST_GICV3_RDIST_STRIDE;
|
||||
|
||||
/* The first redistributor should contain enough space for all CPUs */
|
||||
BUILD_BUG_ON((GUEST_GICV3_GICR0_SIZE / GUEST_GICV3_RDIST_STRIDE) < MAX_VIRT_CPUS);
|
||||
d->arch.vgic.rbase[0] = GUEST_GICV3_GICR0_BASE;
|
||||
d->arch.vgic.rbase_size[0] = GUEST_GICV3_GICR0_SIZE;
|
||||
d->arch.vgic.rdist_regions[0].base = GUEST_GICV3_GICR0_BASE;
|
||||
d->arch.vgic.rdist_regions[0].size = GUEST_GICV3_GICR0_SIZE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1107,7 +1107,7 @@ static int gicv3_make_dt_node(const struct domain *d,
|
||||
* CPU interface and virtual cpu interfaces accessesed as System registers
|
||||
* So cells are created only for Distributor and rdist regions
|
||||
*/
|
||||
len = len * (d->arch.vgic.rdist_count + 1);
|
||||
len = len * (d->arch.vgic.nr_regions + 1);
|
||||
new_cells = xzalloc_bytes(len);
|
||||
if ( new_cells == NULL )
|
||||
return -FDT_ERR_XEN(ENOMEM);
|
||||
@@ -1116,9 +1116,9 @@ static int gicv3_make_dt_node(const struct domain *d,
|
||||
|
||||
dt_set_range(&tmp, node, d->arch.vgic.dbase, d->arch.vgic.dbase_size);
|
||||
|
||||
for ( i = 0; i < d->arch.vgic.rdist_count; i++ )
|
||||
dt_set_range(&tmp, node, d->arch.vgic.rbase[i],
|
||||
d->arch.vgic.rbase_size[i]);
|
||||
for ( i = 0; i < d->arch.vgic.nr_regions; i++ )
|
||||
dt_set_range(&tmp, node, d->arch.vgic.rdist_regions[i].base,
|
||||
d->arch.vgic.rdist_regions[i].size);
|
||||
|
||||
res = fdt_property(fdt, "reg", new_cells, len);
|
||||
xfree(new_cells);
|
||||
|
||||
@@ -1108,13 +1108,14 @@ static int vgic_v3_domain_init(struct domain *d)
|
||||
d->arch.vgic.dbase_size);
|
||||
|
||||
/*
|
||||
* Register mmio handler per redistributor region but not for
|
||||
* every sgi rdist region which is per core.
|
||||
* The redistributor region encompasses per core sgi region.
|
||||
* Register mmio handler per contiguous region occupied by the
|
||||
* redistributors. The handler will take care to choose which
|
||||
* redistributor is targeted.
|
||||
*/
|
||||
for ( i = 0; i < d->arch.vgic.rdist_count; i++ )
|
||||
for ( i = 0; i < d->arch.vgic.nr_regions; i++ )
|
||||
register_mmio_handler(d, &vgic_rdistr_mmio_handler,
|
||||
d->arch.vgic.rbase[i], d->arch.vgic.rbase_size[i]);
|
||||
d->arch.vgic.rdist_regions[i].base,
|
||||
d->arch.vgic.rdist_regions[i].size);
|
||||
|
||||
d->arch.vgic.ctlr = VGICD_CTLR_DEFAULT;
|
||||
|
||||
|
||||
@@ -102,10 +102,13 @@ struct arch_domain
|
||||
#ifdef CONFIG_ARM_64
|
||||
/* GIC V3 addressing */
|
||||
paddr_t dbase_size; /* Distributor base size */
|
||||
paddr_t rbase[MAX_RDIST_COUNT]; /* Re-Distributor base address */
|
||||
paddr_t rbase_size[MAX_RDIST_COUNT]; /* Re-Distributor size */
|
||||
uint32_t rdist_stride; /* Re-Distributor stride */
|
||||
int rdist_count; /* No. of Re-Distributors */
|
||||
/* List of contiguous occupied by the redistributors */
|
||||
struct vgic_rdist_region {
|
||||
paddr_t base; /* Base address */
|
||||
paddr_t size; /* Size */
|
||||
} rdist_regions[MAX_RDIST_COUNT];
|
||||
int nr_regions; /* Number of rdist regions */
|
||||
uint32_t rdist_stride; /* Re-Distributor stride */
|
||||
#endif
|
||||
} vgic;
|
||||
|
||||
|
||||