From: Julien Grall Date: Wed, 1 Jul 2015 11:01:04 +0000 (+0100) Subject: xen/arm: gic-v3: Fix the distributor region to 64kB X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~2966 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=02385fde22ab77b27e98a6afd13a98184bbb95a8;p=xen.git xen/arm: gic-v3: Fix the distributor region to 64kB On GICv3, the default size of the distributor region is 64kB (see 5.3 in PRD03-GENC-010745 24.0). This region can be extended to provide an implementation defined set of pages containing additional aliases for MSI. Although, the GICv3 driver only access to register within the default distributor region. Furthermore, our vGIC driver implementation doesn't support the extended distributor. Therefore there is no reason to expose it to DOM0. Finally drop the field dbase_size which is not useful anymore. Signed-off-by: Julien Grall Acked-by: Ian Campbell --- diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c index 9a94f6b467..d1af14711e 100644 --- a/xen/arch/arm/gic-v3.c +++ b/xen/arch/arm/gic-v3.c @@ -51,7 +51,6 @@ struct rdist_region { /* Global state */ static struct { paddr_t dbase; /* Address of distributor registers */ - paddr_t dbase_size; void __iomem *map_dbase; /* Mapped address of distributor registers */ struct rdist_region *rdist_regions; uint32_t rdist_stride; @@ -938,7 +937,6 @@ static int gicv_v3_init(struct domain *d) unsigned int first_cpu = 0; d->arch.vgic.dbase = gicv3.dbase; - d->arch.vgic.dbase_size = gicv3.dbase_size; d->arch.vgic.rdist_stride = gicv3.rdist_stride; /* @@ -966,7 +964,6 @@ static int gicv_v3_init(struct domain *d) else { d->arch.vgic.dbase = GUEST_GICV3_GICD_BASE; - d->arch.vgic.dbase_size = GUEST_GICV3_GICD_SIZE; /* XXX: Only one Re-distributor region mapped for the guest */ BUILD_BUG_ON(GUEST_GICV3_RDIST_REGIONS != 1); @@ -1153,7 +1150,7 @@ static int gicv3_make_hwdom_dt_node(const struct domain *d, tmp = new_cells; - dt_set_range(&tmp, node, d->arch.vgic.dbase, d->arch.vgic.dbase_size); + dt_set_range(&tmp, node, d->arch.vgic.dbase, SZ_64K); for ( i = 0; i < d->arch.vgic.nr_regions; i++ ) dt_set_range(&tmp, node, d->arch.vgic.rdist_regions[i].base, @@ -1209,15 +1206,15 @@ static int __init gicv3_init(void) return -ENODEV; } - res = dt_device_get_address(node, 0, &gicv3.dbase, &gicv3.dbase_size); + res = dt_device_get_address(node, 0, &gicv3.dbase, NULL); if ( res || !gicv3.dbase ) panic("GICv3: Cannot find a valid distributor address"); - if ( (gicv3.dbase & ~PAGE_MASK) || (gicv3.dbase_size & ~PAGE_MASK) ) + if ( (gicv3.dbase & ~PAGE_MASK) ) panic("GICv3: Found unaligned distributor address %"PRIpaddr"", gicv3.dbase); - gicv3.map_dbase = ioremap_nocache(gicv3.dbase, gicv3.dbase_size); + gicv3.map_dbase = ioremap_nocache(gicv3.dbase, SZ_64K); if ( !gicv3.map_dbase ) panic("GICv3: Failed to ioremap for GIC distributor\n"); @@ -1275,7 +1272,6 @@ static int __init gicv3_init(void) printk("GICv3 initialization:\n" " gic_dist_addr=%"PRIpaddr"\n" - " gic_dist_size=%"PRIpaddr"\n" " gic_dist_mapaddr=%p\n" " gic_rdist_regions=%d\n" " gic_rdist_stride=%x\n" @@ -1283,7 +1279,7 @@ static int __init gicv3_init(void) " gic_rdist_base_size=%"PRIpaddr"\n" " gic_rdist_base_mapaddr=%p\n" " gic_maintenance_irq=%u\n", - gicv3.dbase, gicv3.dbase_size, gicv3.map_dbase, gicv3.rdist_count, + gicv3.dbase, gicv3.map_dbase, gicv3.rdist_count, gicv3.rdist_stride, gicv3.rdist_regions[0].base, gicv3.rdist_regions[0].size, gicv3.rdist_regions[0].map_base, gicv3_info.maintenance_irq); diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c index 4af5a8478c..a68bebbb14 100644 --- a/xen/arch/arm/vgic-v3.c +++ b/xen/arch/arm/vgic-v3.c @@ -1127,7 +1127,7 @@ static int vgic_v3_domain_init(struct domain *d) } /* We rely on gicv init to get dbase and size */ register_mmio_handler(d, &vgic_distr_mmio_handler, d->arch.vgic.dbase, - d->arch.vgic.dbase_size); + SZ_64K); /* * Register mmio handler per contiguous region occupied by the diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index 96607d59de..ecfdc1019d 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -103,7 +103,6 @@ struct arch_domain paddr_t cbase; /* CPU base address */ #ifdef HAS_GICV3 /* GIC V3 addressing */ - paddr_t dbase_size; /* Distributor base size */ /* List of contiguous occupied by the redistributors */ struct vgic_rdist_region { paddr_t base; /* Base address */