From mboxrd@z Thu Jan 1 00:00:00 1970 From: vijay.kilari@gmail.com Subject: [PATCH v6 19/31] xen/arm: ITS: Export ITS info to Virtual ITS Date: Mon, 31 Aug 2015 16:36:36 +0530 Message-ID: <1441019208-2764-20-git-send-email-vijay.kilari@gmail.com> References: <1441019208-2764-1-git-send-email-vijay.kilari@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1441019208-2764-1-git-send-email-vijay.kilari@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Ian.Campbell@citrix.com, julien.grall@citrix.com, stefano.stabellini@eu.citrix.com, stefano.stabellini@citrix.com, tim@xen.org, xen-devel@lists.xen.org Cc: Prasun.Kapoor@caviumnetworks.com, Vijaya Kumar K , manish.jaggi@caviumnetworks.com, vijay.kilari@gmail.com List-Id: xen-devel@lists.xenproject.org From: Vijaya Kumar K Export physical ITS information to virtual ITS driver Signed-off-by: Vijaya Kumar K --- v6: - Passed only one physical ITS info - Passed all the values as parameters - Initialize vITS only if physical ITS is available --- xen/arch/arm/gic-v3-its.c | 11 +++++++++++ xen/arch/arm/vgic-v3-its.c | 28 ++++++++++++++++++++++++++++ xen/include/asm-arm/gic-its.h | 7 +++++++ 3 files changed, 46 insertions(+) diff --git a/xen/arch/arm/gic-v3-its.c b/xen/arch/arm/gic-v3-its.c index 0865a93..77abbc6 100644 --- a/xen/arch/arm/gic-v3-its.c +++ b/xen/arch/arm/gic-v3-its.c @@ -94,6 +94,7 @@ static LIST_HEAD(its_nodes); static DEFINE_SPINLOCK(its_lock); static struct rdist_prop *gic_rdists; static struct rb_root rb_its_dev; +static struct gic_its_info its_data; static DEFINE_SPINLOCK(rb_its_dev_lock); #define gic_data_rdist() (this_cpu(rdist)) @@ -1312,6 +1313,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.dev_bits = GITS_TYPER_DEVBITS(typer); its->cmd_base = xzalloc_bytes(ITS_CMD_QUEUE_SZ); if ( !its->cmd_base ) @@ -1402,6 +1405,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 = @@ -1424,6 +1428,13 @@ 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); + if ( !its ) + return -ENOMEM; + + vits_setup_hw(its_data.dev_bits, its_data.eventid_bits, + its->phys_base, its->phys_size); + return 0; } diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c index cef6139..53f2a27 100644 --- a/xen/arch/arm/vgic-v3-its.c +++ b/xen/arch/arm/vgic-v3-its.c @@ -68,6 +68,26 @@ static inline uint16_t vits_get_max_collections(struct domain *d) return (d->max_vcpus + 1); } +static struct { + bool_t enabled; + uint32_t dev_bits; + uint32_t eventid_bits; + /* GITS physical base */ + paddr_t phys_base; + /* GITS physical size */ + unsigned long phys_size; +} vits_hw; + +void vits_setup_hw(uint32_t dev_bits, uint32_t eventid_bits, + paddr_t phys_base, unsigned long phys_size) +{ + vits_hw.enabled = 1; + vits_hw.dev_bits = dev_bits; + vits_hw.eventid_bits = eventid_bits; + vits_hw.phys_base = phys_base; + vits_hw.phys_size = phys_size; +} + int vits_access_guest_table(struct domain *d, paddr_t entry, void *addr, uint32_t size, bool_t set) { @@ -547,6 +567,14 @@ int vits_domain_init(struct domain *d) ASSERT(is_hardware_domain(d)); + if ( !vits_hw.enabled ) + { + printk(XENLOG_G_ERR + "%"PRIu16": VITS is not supported on this platform.\n", + d->domain_id); + return -ENODEV; + } + d->arch.vgic.nr_lpis = nr_lpis; d->arch.vgic.vits = xzalloc(struct vgic_its); diff --git a/xen/include/asm-arm/gic-its.h b/xen/include/asm-arm/gic-its.h index 4327ba2..7077477 100644 --- a/xen/include/asm-arm/gic-its.h +++ b/xen/include/asm-arm/gic-its.h @@ -320,6 +320,11 @@ struct vitt { uint32_t vlpi; }; +struct gic_its_info { + uint32_t eventid_bits; + uint32_t dev_bits; +}; + void irqdesc_set_lpi_event(struct irq_desc *desc, unsigned id); unsigned int irqdesc_get_lpi_event(struct irq_desc *desc); struct its_device *irqdesc_get_its_device(struct irq_desc *desc); @@ -337,6 +342,8 @@ int vits_get_vitt_entry(struct domain *d, uint32_t devid, uint32_t event, struct vitt *entry); int vits_get_vdevice_entry(struct domain *d, uint32_t devid, struct vdevice_table *entry); +void vits_setup_hw(uint32_t dev_bits, uint32_t eventid_bits, + paddr_t base, unsigned long size); #endif /* __ASM_ARM_GIC_ITS_H__ */ /* -- 1.7.9.5