From patchwork Wed Jun 25 09:28:47 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marc Zyngier X-Patchwork-Id: 32463 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-pa0-f70.google.com (mail-pa0-f70.google.com [209.85.220.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id D495E20DCC for ; Wed, 25 Jun 2014 09:29:13 +0000 (UTC) Received: by mail-pa0-f70.google.com with SMTP id lj1sf6255040pab.9 for ; Wed, 25 Jun 2014 02:29:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=qkIOb0VrDLvw7O65YGECgheZO1yWaAkhtzMcTHgZ3cc=; b=jplYsLPRM7bV5j8MC4oXztbS2zN1GKybEHCZUr2AsjVu/4KyIsHk0hx3aclwLNC2Jk FrrFgtjynGkFmvI6J7QyaKslKpKNr81iQ3XsY038FTE+FDuU4sHeBLE6zvBP+TqdrXqa mG2QRVJSfa9hlmhzkLb7u7HhMV3cOCTpmXJdfIwfGA+0S6jS2pVKtKBi3IggWf+Y/zBK 9LnbH/nlAgB0xx1UzZcwYdbTC615Eh2/4YxidN0UDfnHdxGjFwJlrghpCEh2CatAbb8W ZFMb+/nuadoYTiUI1J8CykZUgej1DAjZEBHUuOmbsejhbPaKirfvBYkJBO+NiO3ZfH5x sONw== X-Gm-Message-State: ALoCoQn2Uq3AQufzaklFDQSSxr+cGBU1Iqiut4o4gGB9wjn0xTeWmsAfhdVT5Y2HzDXsTIRNruER X-Received: by 10.68.209.130 with SMTP id mm2mr3698975pbc.3.1403688553152; Wed, 25 Jun 2014 02:29:13 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.108.245 with SMTP id j108ls663138qgf.51.gmail; Wed, 25 Jun 2014 02:29:13 -0700 (PDT) X-Received: by 10.220.81.194 with SMTP id y2mr5814573vck.29.1403688553045; Wed, 25 Jun 2014 02:29:13 -0700 (PDT) Received: from mail-vc0-f171.google.com (mail-vc0-f171.google.com [209.85.220.171]) by mx.google.com with ESMTPS id cl2si1883024vcb.98.2014.06.25.02.29.12 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 25 Jun 2014 02:29:12 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.171 as permitted sender) client-ip=209.85.220.171; Received: by mail-vc0-f171.google.com with SMTP id id10so1595403vcb.2 for ; Wed, 25 Jun 2014 02:29:12 -0700 (PDT) X-Received: by 10.52.92.82 with SMTP id ck18mr4946512vdb.6.1403688552904; Wed, 25 Jun 2014 02:29:12 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.37.5 with SMTP id tc5csp274362vcb; Wed, 25 Jun 2014 02:29:12 -0700 (PDT) X-Received: by 10.68.162.34 with SMTP id xx2mr9800507pbb.120.1403688552144; Wed, 25 Jun 2014 02:29:12 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id tx10si4304573pac.112.2014.06.25.02.29.11; Wed, 25 Jun 2014 02:29:11 -0700 (PDT) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755609AbaFYJ3F (ORCPT + 27 others); Wed, 25 Jun 2014 05:29:05 -0400 Received: from fw-tnat.austin.arm.com ([217.140.110.23]:51390 "EHLO collaborate-mta1.arm.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755469AbaFYJ3A (ORCPT ); Wed, 25 Jun 2014 05:29:00 -0400 Received: from e102391-lin.cambridge.arm.com (e102391-lin.cambridge.arm.com [10.1.209.143]) by collaborate-mta1.arm.com (Postfix) with ESMTP id 4F2EC13FB2F; Wed, 25 Jun 2014 04:28:59 -0500 (CDT) From: Marc Zyngier To: kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Will Deacon , Catalin Marinas , Thomas Gleixner , eric.auger@linaro.org, Christoffer Dall Subject: [RFC PATCH 6/9] irqchip: GICv3: add support for forwarded interrupts Date: Wed, 25 Jun 2014 10:28:47 +0100 Message-Id: <1403688530-23273-7-git-send-email-marc.zyngier@arm.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1403688530-23273-1-git-send-email-marc.zyngier@arm.com> References: <1403688530-23273-1-git-send-email-marc.zyngier@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: marc.zyngier@arm.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.171 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Now that we've switched to EOImode == 1, prevent a forwarded interrupt from being deactivated after its priority has been dropped. Also add support for the interrupt state to be saved/restored. Signed-off-by: Marc Zyngier --- drivers/irqchip/irq-gic-v3-its.c | 3 ++- drivers/irqchip/irq-gic-v3.c | 29 ++++++++++++++++++++++++++++- include/linux/irqchip/arm-gic-v3.h | 2 ++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 922f228..7c354ff 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -616,7 +616,8 @@ static void its_unmask_irq(struct irq_data *d) static void its_eoi_irq(struct irq_data *d) { gic_write_eoir(d->hwirq); - gic_write_dir(d->hwirq); + if (!irqd_irq_forwarded(d)) + gic_write_dir(d->hwirq); } static int its_set_affinity(struct irq_data *d, const struct cpumask *mask_val, diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index 26a08ce..1f080d6 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -235,10 +235,35 @@ static void gic_unmask_irq(struct irq_data *d) gic_poke_irq(d, GICD_ISENABLER); } +static void gic_irq_set_fwd_state(struct irq_data *d, u32 val, u32 mask) +{ + if (mask & IRQ_FWD_STATE_PENDING) + gic_poke_irq(d, (val & IRQ_FWD_STATE_PENDING) ? GICD_ISPENDR : GICD_ICPENDR); + if (mask & IRQ_FWD_STATE_ACTIVE) + gic_poke_irq(d, (val & IRQ_FWD_STATE_ACTIVE) ? GICD_ISACTIVER : GICD_ICACTIVER); + if (mask & IRQ_FWD_STATE_MASKED) + gic_poke_irq(d, (val & IRQ_FWD_STATE_MASKED) ? GICD_ICENABLER : GICD_ISENABLER); +} + +static u32 gic_irq_get_fwd_state(struct irq_data *d, u32 mask) +{ + u32 val = 0; + + if ((mask & IRQ_FWD_STATE_PENDING) && gic_peek_irq(d, GICD_ISPENDR)) + val |= IRQ_FWD_STATE_PENDING; + if ((mask & IRQ_FWD_STATE_ACTIVE) && gic_peek_irq(d, GICD_ISACTIVER)) + val |= IRQ_FWD_STATE_ACTIVE; + if ((mask & IRQ_FWD_STATE_MASKED) && !gic_peek_irq(d, GICD_ISENABLER)) + val |= IRQ_FWD_STATE_MASKED; + + return val; +} + static void gic_eoi_irq(struct irq_data *d) { gic_write_eoir(gic_irq(d)); - gic_write_dir(gic_irq(d)); + if (!irqd_irq_forwarded(d)) + gic_write_dir(gic_irq(d)); } static int gic_set_type(struct irq_data *d, unsigned int type) @@ -598,6 +623,8 @@ static struct irq_chip gic_chip = { .irq_eoi = gic_eoi_irq, .irq_set_type = gic_set_type, .irq_set_affinity = gic_set_affinity, + .irq_get_fwd_state = gic_irq_get_fwd_state, + .irq_set_fwd_state = gic_irq_set_fwd_state, }; static struct irq_chip *its_chip; diff --git a/include/linux/irqchip/arm-gic-v3.h b/include/linux/irqchip/arm-gic-v3.h index a0bff2f..0e74c19 100644 --- a/include/linux/irqchip/arm-gic-v3.h +++ b/include/linux/irqchip/arm-gic-v3.h @@ -90,6 +90,8 @@ #define GICR_SYNCR 0x00C0 #define GICR_MOVLPIR 0x0100 #define GICR_MOVALLR 0x0110 +#define GICR_ISACTIVER GICD_ISACTIVER +#define GICR_ICACTIVER GICD_ICACTIVER #define GICR_IDREGS GICD_IDREGS #define GICR_PIDR2 GICD_PIDR2