From patchwork Wed Apr 5 10:31:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amit Pundir X-Patchwork-Id: 96810 Delivered-To: patch@linaro.org Received: by 10.140.89.233 with SMTP id v96csp195939qgd; Wed, 5 Apr 2017 03:33:14 -0700 (PDT) X-Received: by 10.99.105.133 with SMTP id e127mr28306505pgc.104.1491388394451; Wed, 05 Apr 2017 03:33:14 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s128si20242483pgc.85.2017.04.05.03.33.14; Wed, 05 Apr 2017 03:33:14 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org; spf=pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=stable-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933086AbdDEKcn (ORCPT + 6 others); Wed, 5 Apr 2017 06:32:43 -0400 Received: from mail-pg0-f47.google.com ([74.125.83.47]:36244 "EHLO mail-pg0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933418AbdDEKch (ORCPT ); Wed, 5 Apr 2017 06:32:37 -0400 Received: by mail-pg0-f47.google.com with SMTP id g2so5931313pge.3 for ; Wed, 05 Apr 2017 03:32:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bty6R6DYul67AKn+issoCh5QE2qoeZmvASm1stWPxWQ=; b=IlucN2tJ++NcoAmMqkvt+ocDo43CMOIflHagfy6jBB2R9b/3500R96a3iz1/O+LKWd oaLIYB4Dc/kYQ13gUu9sQc5YcqR8WcyH/9nOhUsAo1x7XvAL8Zlh0W1kZicjD974e5F9 sAUVlIQz3+oZ7/S0YIx7PBIu84JWaUm2wbuaE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bty6R6DYul67AKn+issoCh5QE2qoeZmvASm1stWPxWQ=; b=cRulxABIeycPYQKEPtIUcLm2VfMOrAUEJEbOyG4+JrRgvxbMupLuSC44H7p88PlPxq HbqfG63wjXkZzFeZWRq47NMJQH/qLBiC0TmjyB5yajc7MkrCschNpVRKgWHTVVtcJi8O 5c9x9PO1NR5DiE3OpInvYwMhCs7uVy4kL9KbAe/1SjIPVZ+2QVdUmrfxqSFzUbW/9yq2 VtJMFZXmMDEhPQ0EYoyu6V4hue8QwuwruTZHprkaBMhKL+1PO+XVpmJ/qG2Be7Jt0615 ewBwjdjKwkLChVc744ERmuWF+2oxL8TRV+HZQXX/WkM0xqGN5W7bdI9hJ/l+7wdVfZkm hkpQ== X-Gm-Message-State: AFeK/H3lS0vsGUNgng+xuU7Rg20cTCFt5cngVxVUwr16h1YcONcXfRicmC0Otsh9Bd4+aK9R X-Received: by 10.98.86.152 with SMTP id h24mr29138152pfj.184.1491388356830; Wed, 05 Apr 2017 03:32:36 -0700 (PDT) Received: from localhost.localdomain ([106.51.240.246]) by smtp.gmail.com with ESMTPSA id a62sm36732075pgc.60.2017.04.05.03.32.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 05 Apr 2017 03:32:36 -0700 (PDT) From: Amit Pundir To: stable@vger.kernel.org Cc: gregkh@linuxfoundation.org, Felix Fietkau , linux-mips@linux-mips.org, James Hogan Subject: [PATCH v2 for-4.9 04/32] MIPS: Lantiq: Fix cascaded IRQ setup Date: Wed, 5 Apr 2017 16:01:56 +0530 Message-Id: <1491388344-13521-5-git-send-email-amit.pundir@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1491388344-13521-1-git-send-email-amit.pundir@linaro.org> References: <1491388344-13521-1-git-send-email-amit.pundir@linaro.org> Sender: stable-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org From: Felix Fietkau With the IRQ stack changes integrated, the XRX200 devices started emitting a constant stream of kernel messages like this: [ 565.415310] Spurious IRQ: CAUSE=0x1100c300 This is caused by IP0 getting handled by plat_irq_dispatch() rather than its vectored interrupt handler, which is fixed by commit de856416e714 ("MIPS: IRQ Stack: Fix erroneous jal to plat_irq_dispatch"). Fix plat_irq_dispatch() to handle non-vectored IPI interrupts correctly by setting up IP2-6 as proper chained IRQ handlers and calling do_IRQ for all MIPS CPU interrupts. Signed-off-by: Felix Fietkau Acked-by: John Crispin Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/15077/ [james.hogan@imgtec.com: tweaked commit message] Signed-off-by: James Hogan (cherry picked from commit 6c356eda225e3ee134ed4176b9ae3a76f793f4dd) Signed-off-by: Amit Pundir --- arch/mips/lantiq/irq.c | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) -- 2.7.4 diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c index 8ac0e59..0ddf369 100644 --- a/arch/mips/lantiq/irq.c +++ b/arch/mips/lantiq/irq.c @@ -269,6 +269,11 @@ static void ltq_hw5_irqdispatch(void) DEFINE_HWx_IRQDISPATCH(5) #endif +static void ltq_hw_irq_handler(struct irq_desc *desc) +{ + ltq_hw_irqdispatch(irq_desc_get_irq(desc) - 2); +} + #ifdef CONFIG_MIPS_MT_SMP void __init arch_init_ipiirq(int irq, struct irqaction *action) { @@ -313,23 +318,19 @@ static struct irqaction irq_call = { asmlinkage void plat_irq_dispatch(void) { unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM; - unsigned int i; - - if ((MIPS_CPU_TIMER_IRQ == 7) && (pending & CAUSEF_IP7)) { - do_IRQ(MIPS_CPU_TIMER_IRQ); - goto out; - } else { - for (i = 0; i < MAX_IM; i++) { - if (pending & (CAUSEF_IP2 << i)) { - ltq_hw_irqdispatch(i); - goto out; - } - } + int irq; + + if (!pending) { + spurious_interrupt(); + return; } - pr_alert("Spurious IRQ: CAUSE=0x%08x\n", read_c0_status()); -out: - return; + pending >>= CAUSEB_IP; + while (pending) { + irq = fls(pending) - 1; + do_IRQ(MIPS_CPU_IRQ_BASE + irq); + pending &= ~BIT(irq); + } } static int icu_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) @@ -354,11 +355,6 @@ static const struct irq_domain_ops irq_domain_ops = { .map = icu_map, }; -static struct irqaction cascade = { - .handler = no_action, - .name = "cascade", -}; - int __init icu_of_init(struct device_node *node, struct device_node *parent) { struct device_node *eiu_node; @@ -390,7 +386,7 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent) mips_cpu_irq_init(); for (i = 0; i < MAX_IM; i++) - setup_irq(i + 2, &cascade); + irq_set_chained_handler(i + 2, ltq_hw_irq_handler); if (cpu_has_vint) { pr_info("Setting up vectored interrupts\n");