[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 20/22] xen/arm: ITS: Map ITS translation space
Hi Vijay, On 27/07/2015 04:12, vijay.kilari@xxxxxxxxx wrote: From: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> ITS translation space contains GITS_TRANSLATOR register which is written by device to raise LPI. This space needs to mapped to every domain address space for all physical ITS available,so that device can access GITS_TRANSLATOR register using SMMU. Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- xen/arch/arm/vgic-v3-its.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c index e182cee..27523f4 100644 --- a/xen/arch/arm/vgic-v3-its.c +++ b/xen/arch/arm/vgic-v3-its.c @@ -1060,6 +1060,42 @@ static const struct mmio_handler_ops vgic_gits_mmio_handler = { .write_handler = vgic_v3_gits_mmio_write, }; +/* + * Map the 64K ITS translation space in guest. + * This is required purely for device smmu writes. +*/ + +static int vits_map_translation_space(struct domain *d) +{ + uint64_t addr, size; + int ret; + + if ( !is_hardware_domain(d) ) Well this code is surely wrong. If you happen to have a guest domain, you won't map anything and say you've done it. Given that vits_domain_init is only called for DOM0, you should drop this check. + return 0; + + ASSERT(is_domain_direct_mapped(d)); + + addr = d->arch.vgic.vits->gits_base + SZ_64K; + size = SZ_64K; + + /* Using 1:1 mapping to map translation space */ + /* TODO: Handle DomU mapping */ + ret = map_mmio_regions(d, + paddr_to_pfn(addr & PAGE_MASK), + DIV_ROUND_UP(size, PAGE_SIZE), + paddr_to_pfn(addr & PAGE_MASK)); + + if ( ret ) + { + dprintk(XENLOG_G_ERR, "vITS: Unable to map to dom%d access to" + " 0x%"PRIx64" - 0x%"PRIx64"\n", "Unable to map 0x...-0x... to dom%d" + d->domain_id, + addr & PAGE_MASK, PAGE_ALIGN(addr + size) - 1); + } + + return ret; +} + int vits_domain_init(struct domain *d) { struct vgic_its *vits; @@ -1120,7 +1156,7 @@ int vits_domain_init(struct domain *d) register_mmio_handler(d, &vgic_gits_mmio_handler, vits->gits_base, SZ_64K); - return 0; + return vits_map_translation_space(d); } void vits_domain_free(struct domain *d) 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 |