From patchwork Tue Jun 7 16:48:38 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 69558 Delivered-To: patch@linaro.org Received: by 10.140.106.246 with SMTP id e109csp2075536qgf; Tue, 7 Jun 2016 09:50:28 -0700 (PDT) X-Received: by 10.55.197.82 with SMTP id p79mr451366qki.138.1465318218444; Tue, 07 Jun 2016 09:50:18 -0700 (PDT) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id l61si15651410qtd.106.2016.06.07.09.50.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 07 Jun 2016 09:50:18 -0700 (PDT) Received-SPF: neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) smtp.mailfrom=xen-devel-bounces@lists.xen.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bAKBY-0000JR-5O; Tue, 07 Jun 2016 16:49:00 +0000 Received: from mail6.bemta6.messagelabs.com ([85.158.143.247]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bAKBW-0000Ig-VV for xen-devel@lists.xen.org; Tue, 07 Jun 2016 16:48:59 +0000 Received: from [85.158.143.35] by server-2.bemta-6.messagelabs.com id 89/89-06230-AFAF6575; Tue, 07 Jun 2016 16:48:58 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrKLMWRWlGSWpSXmKPExsVysyfVTffnr7B wg64XahZLPi5mcWD0OLr7N1MAYxRrZl5SfkUCa0bDoYOsBXsNKxpXZTUw7lDrYuTkEBLYyCix 6q55FyMXkH2aUWLStZ/MIAk2AU2JO58/MYHYIgLSEtc+X2YEKWIWmMcocWbhTnaQhLCApcTzY 92sIDaLgKrE+6bNLCA2r4CzRMPTD2BxCQE5iZPHJoPZnAIuEi+fv2SB2Ows8aBhF/MERu4FjA yrGNWLU4vKUot0jfSSijLTM0pyEzNzdA0NzPRyU4uLE9NTcxKTivWS83M3MQK9ywAEOxiX/XU 6xCjJwaQkyvv0W1i4EF9SfkplRmJxRnxRaU5q8SFGGQ4OJQneVz+BcoJFqempFWmZOcAwg0lL cPAoifBmvQNK8xYXJOYWZ6ZDpE4xKkqJ8+qAJARAEhmleXBtsNC+xCgrJczLCHSIEE9BalFuZ gmq/CtGcQ5GJWFeD5DtPJl5JXDTXwEtZgJazPIVbHFJIkJKqoFxrqWn98fa0pezM9h4TnhNa3 JfOruG9fOj9aEZ+61+lwueD/MV2bHjZN6kNmv21fn3z/24l2+TErW/b9FX5u/qQh/vC/GFH9M 80+2zLuv47y17XZ55Xt7ptKnKZ9d6lvhjl7VCtv9s/HI0dDvLv2dd+e+O8nxNWlpoHLQnOPbX F/2U1OeO1irJSizFGYmGWsxFxYkAxjjJpmgCAAA= X-Env-Sender: julien.grall@arm.com X-Msg-Ref: server-5.tower-21.messagelabs.com!1465318137!17819484!1 X-Originating-IP: [217.140.101.70] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 8.46; banners=-,-,- X-VirusChecked: Checked Received: (qmail 32352 invoked from network); 7 Jun 2016 16:48:57 -0000 Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by server-5.tower-21.messagelabs.com with SMTP; 7 Jun 2016 16:48:57 -0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 409F42F; Tue, 7 Jun 2016 09:49:31 -0700 (PDT) Received: from e108454-lin.cambridge.arm.com (e108454-lin.cambridge.arm.com [10.1.215.28]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 868F93F246; Tue, 7 Jun 2016 09:48:55 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xen.org Date: Tue, 7 Jun 2016 17:48:38 +0100 Message-Id: <1465318123-3090-4-git-send-email-julien.grall@arm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1465318123-3090-1-git-send-email-julien.grall@arm.com> References: <1465318123-3090-1-git-send-email-julien.grall@arm.com> Cc: sstabellini@kernel.org, wei.chen@arm.com, steve.capper@arm.com, Julien Grall , shannon.zhao@linaro.org, shankerd@codeaurora.org Subject: [Xen-devel] [RFC 3/8] xen/arm: gic: split set_irq_properties X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" The callback set_irq_properties will configure the GIC for a specific IRQ with the type and the priority. In a follow-up patch, Xen will configure the type and the priority at different stage of the routing. So split it in 2 separate callbacks. At the same time, move the ASSERT to check the validity of the type and if the desc->lock is locked in the common code (gic.c). This is because the constraint are the same between GICv2 and GICv3, however the driver of the latter did not contain any sanity check. Signed-off-by: Julien Grall --- xen/arch/arm/gic-v2.c | 19 +++++++++++++------ xen/arch/arm/gic-v3.c | 15 ++++++++++++--- xen/arch/arm/gic.c | 23 ++++++++++++++--------- xen/include/asm-arm/gic.h | 7 ++++--- 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c index 90b07b3..fa2c5a5 100644 --- a/xen/arch/arm/gic-v2.c +++ b/xen/arch/arm/gic-v2.c @@ -200,16 +200,12 @@ static unsigned int gicv2_read_irq(void) return (readl_gicc(GICC_IAR) & GICC_IA_IRQ); } -static void gicv2_set_irq_properties(struct irq_desc *desc, - unsigned int priority) +static void gicv2_set_irq_type(struct irq_desc *desc) { uint32_t cfg, actual, edgebit; unsigned int irq = desc->irq; unsigned int type = desc->arch.type; - ASSERT(type != IRQ_TYPE_INVALID); - ASSERT(spin_is_locked(&desc->lock)); - spin_lock(&gicv2.lock); /* Set edge / level */ cfg = readl_gicd(GICD_ICFGR + (irq / 16) * 4); @@ -234,6 +230,16 @@ static void gicv2_set_irq_properties(struct irq_desc *desc, IRQ_TYPE_LEVEL_HIGH; } + spin_unlock(&gicv2.lock); +} + +static void gicv2_set_irq_priority(struct irq_desc *desc, + unsigned int priority) +{ + unsigned int irq = desc->irq; + + spin_lock(&gicv2.lock); + /* Set priority */ writeb_gicd(priority, GICD_IPRIORITYR + irq); @@ -916,7 +922,8 @@ const static struct gic_hw_operations gicv2_ops = { .eoi_irq = gicv2_eoi_irq, .deactivate_irq = gicv2_dir_irq, .read_irq = gicv2_read_irq, - .set_irq_properties = gicv2_set_irq_properties, + .set_irq_type = gicv2_set_irq_type, + .set_irq_priority = gicv2_set_irq_priority, .send_SGI = gicv2_send_SGI, .disable_interface = gicv2_disable_interface, .update_lr = gicv2_update_lr, diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c index c936c8a..c25fe50 100644 --- a/xen/arch/arm/gic-v3.c +++ b/xen/arch/arm/gic-v3.c @@ -471,8 +471,7 @@ static inline uint64_t gicv3_mpidr_to_affinity(int cpu) MPIDR_AFFINITY_LEVEL(mpidr, 0)); } -static void gicv3_set_irq_properties(struct irq_desc *desc, - unsigned int priority) +static void gicv3_set_irq_type(struct irq_desc *desc) { uint32_t cfg, actual, edgebit; void __iomem *base; @@ -512,6 +511,15 @@ static void gicv3_set_irq_properties(struct irq_desc *desc, IRQ_TYPE_EDGE_RISING : IRQ_TYPE_LEVEL_HIGH; } + spin_unlock(&gicv3.lock); +} + +static void gicv3_set_irq_priority(struct irq_desc *desc, + unsigned int priority) +{ + unsigned int irq = desc->irq; + + spin_lock(&gicv3.lock); /* Set priority */ if ( irq < NR_GIC_LOCAL_IRQS ) @@ -1547,7 +1555,8 @@ static const struct gic_hw_operations gicv3_ops = { .eoi_irq = gicv3_eoi_irq, .deactivate_irq = gicv3_dir_irq, .read_irq = gicv3_read_irq, - .set_irq_properties = gicv3_set_irq_properties, + .set_irq_type = gicv3_set_irq_type, + .set_irq_priority = gicv3_set_irq_priority, .send_SGI = gicv3_send_sgi, .disable_interface = gicv3_disable_interface, .update_lr = gicv3_update_lr, diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index f25381f..0fd7e8c 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -96,14 +96,17 @@ void gic_restore_state(struct vcpu *v) gic_restore_pending_irqs(v); } -/* - * - desc.lock must be held - * - arch.type must be valid (i.e != IRQ_TYPE_INVALID) - */ -static void gic_set_irq_properties(struct irq_desc *desc, - unsigned int priority) +static void gic_set_irq_type(struct irq_desc *desc) +{ + ASSERT(spin_is_locked(&desc->lock)); + ASSERT(desc->arch.type != IRQ_TYPE_INVALID); + + gic_hw_ops->set_irq_type(desc); +} + +static void gic_set_irq_priority(struct irq_desc *desc, unsigned int priority) { - gic_hw_ops->set_irq_properties(desc, priority); + gic_hw_ops->set_irq_priority(desc, priority); } /* Program the GIC to route an interrupt to the host (i.e. Xen) @@ -121,7 +124,8 @@ void gic_route_irq_to_xen(struct irq_desc *desc, const cpumask_t *cpu_mask, desc->handler->set_affinity(desc, cpu_mask); - gic_set_irq_properties(desc, priority); + gic_set_irq_type(desc); + gic_set_irq_priority(desc, priority); } /* Program the GIC to route an interrupt to a guest @@ -153,7 +157,8 @@ int gic_route_irq_to_guest(struct domain *d, unsigned int virq, desc->handler = gic_hw_ops->gic_guest_irq_type; set_bit(_IRQ_GUEST, &desc->status); - gic_set_irq_properties(desc, priority); + gic_set_irq_type(desc); + gic_set_irq_priority(desc, priority); p->desc = desc; res = 0; diff --git a/xen/include/asm-arm/gic.h b/xen/include/asm-arm/gic.h index b931f98..ffba469 100644 --- a/xen/include/asm-arm/gic.h +++ b/xen/include/asm-arm/gic.h @@ -329,9 +329,10 @@ struct gic_hw_operations { void (*deactivate_irq)(struct irq_desc *irqd); /* Read IRQ id and Ack */ unsigned int (*read_irq)(void); - /* Set IRQ property */ - void (*set_irq_properties)(struct irq_desc *desc, - unsigned int priority); + /* Set IRQ type - type is taken from desc->arch.type */ + void (*set_irq_type)(struct irq_desc *desc); + /* Set IRQ priority */ + void (*set_irq_priority)(struct irq_desc *desc, unsigned int priority); /* Send SGI */ void (*send_SGI)(enum gic_sgi sgi, enum gic_sgi_mode irqmode, const cpumask_t *online_mask);