Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3453600imu; Fri, 30 Nov 2018 00:04:47 -0800 (PST) X-Google-Smtp-Source: AFSGD/VcB6HfZuDlH+steNCqdf9R+9p5m/PLCp11RrYDvZphRHkicDdDBrncahaXcacbMQaVcPny X-Received: by 2002:a63:295:: with SMTP id 143mr3897242pgc.362.1543565087908; Fri, 30 Nov 2018 00:04:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543565087; cv=none; d=google.com; s=arc-20160816; b=qipL9ed67S4KCi1Mi53B2m+S6Z641HzOmZ+gtvkPvuAOE0+eNjXjZxf/GOniie51eY 77x2VFxGn+GOPNYA98i//TwIvxu00GKdiWHltbphio8gJWkkt3LLtG8jyBTy37Gi6Sm5 60/Id5XiiaK8xRFGkjs6TViujIpa2bAUB3lKDsjRCLbWsE5ayr3jJR0jrn8u1QByewgt BO2oBxTcuhydgMTzets5cbOSL/aZDpirQ0tR/q9heg55uocO0iZAy35If/eG+7rXGq9y iQvSqCODhC9rx9twZVGgJ8M3e4pCOTy5cyIux2AGOTIS/TgDfwySbgFqD9CCUshbC/M0 91mw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=kkVGy4h7Z995lrFmqX6qHIt4h7IAkxhYZu3D8v9Oubs=; b=x3WxZ7vSihcQuknqQsiQ5tWSkXI/41SUyiqAkySrJ81sOuRpeHX+krIH8swazqLsN9 Yu54h2m3uU/GISrmU3R7W/iCh/WwgKQRBee4M0Vm+lS9TL/Fcdup+oHI8n/n6GJDXvdt LekDioivIM+CEdHst6Uw42TkUnIcnFvUDnTaerJ2qd76R96JtEHg9lUStuqoa8lwKlaj 3ViHRIPihk/yjPqOUMn7ivKB2vbKFPisiMk9XECXNI18i+7XzEK4sjQzR3WfKSpwj7mR sJyczuyqWi3jcOdyv+/tgVqFpCeKNfBHGU/raNFnFT+nmBTSEGw+Y7me7H3XJJSIDZIM XJ2Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@brainfault-org.20150623.gappssmtp.com header.s=20150623 header.b=JKT1gLgU; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u5si4055002pgr.316.2018.11.30.00.04.32; Fri, 30 Nov 2018 00:04:47 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-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=@brainfault-org.20150623.gappssmtp.com header.s=20150623 header.b=JKT1gLgU; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727157AbeK3TKx (ORCPT + 99 others); Fri, 30 Nov 2018 14:10:53 -0500 Received: from mail-pg1-f194.google.com ([209.85.215.194]:45338 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726971AbeK3TKx (ORCPT ); Fri, 30 Nov 2018 14:10:53 -0500 Received: by mail-pg1-f194.google.com with SMTP id y4so2140400pgc.12 for ; Fri, 30 Nov 2018 00:02:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brainfault-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=kkVGy4h7Z995lrFmqX6qHIt4h7IAkxhYZu3D8v9Oubs=; b=JKT1gLgUoLVHpe9nJxzu6L/bLqyFy9HwvwF4/VMPXxC+Cq8HGxblegWVPmLLauuWmW 0kZ3dr5XBp6AgrKZujchCgccSWQOFKdIjDTk5P/jvBtxCPEQbDzKH77TQeYRClI/4vnM Zwd0mpi4Z/APgXDB/nuM7Czu4jAEXJDqsD8jxC8aEunGP5MNvlgK5oFv8QXBlxbVdsm2 /9bYqt/FhuQ+WfiK8tTyn2yTasNGTqZwOAGbU3DCaSJ3j68hfo9KeJoftRFzig7OcGFA hZvlXw8moFu25WAQO+qAtYFrGW9AQnbwxg9V6m8spXgGd7R3D01ZxZuoYCss0mG2O5Fr EFKg== 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=kkVGy4h7Z995lrFmqX6qHIt4h7IAkxhYZu3D8v9Oubs=; b=pPfhoj/t7d7M3FTAkKJ1nrCcrZY0mHKDljf4RRkjJ9Akjan4p+omWTvlMBc9AIVzrG 7Jizp5PZz0nbMCjwaZjPP0kZBvzd6Bi65k5tz6ZBNazidRt1AVcmUv3ZF9/84xk75N4x GpAJxQ/QfNCbuts1BTMFR/H6F+8yJSu7XkYxPK384T4ePNU6R4W5VOjsbo4jihAhkmCn nWdFwswWLyFY32iL0oew3VE0oEDZLXJEWB6QecZdrVdKf36cMDVBiHfpnmL9daXMreT6 NyK8kH9YxDKt0SRMhmVPoUIH4GiliWUwlPvttP43IhiVJrXUxP1qGSNNtZHk0oRIQP/N CbEA== X-Gm-Message-State: AA+aEWbRx6HE1H83ZMIjqykOozxWcgkbxKHeyR7cFlkHm6OzmxrpPCwT mUL1wBNTVVZ3fjktvH06/JK4CA== X-Received: by 2002:a63:5664:: with SMTP id g36mr3957567pgm.313.1543564945683; Fri, 30 Nov 2018 00:02:25 -0800 (PST) Received: from anup-ubuntu64.qualcomm.com ([49.207.52.208]) by smtp.googlemail.com with ESMTPSA id q187sm19218333pfq.128.2018.11.30.00.02.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 30 Nov 2018 00:02:24 -0800 (PST) From: Anup Patel To: Palmer Dabbelt , Albert Ou , Daniel Lezcano , Thomas Gleixner , Jason Cooper , Marc Zyngier Cc: Atish Patra , Christoph Hellwig , linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Anup Patel Subject: [PATCH v3 2/6] irqchip: sifive-plic: Add struct plic_hw for global PLIC HW details Date: Fri, 30 Nov 2018 13:32:03 +0530 Message-Id: <20181130080207.20505-3-anup@brainfault.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181130080207.20505-1-anup@brainfault.org> References: <20181130080207.20505-1-anup@brainfault.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds Add struct plic_hw to represent global PLIC HW details. Currently, these details are only used in plic_init() but in-future these will be useful in implementing PM suspend and resume callbacks. Further, these global details are good debug info about HW so let's not throw them away after use in plic_init(). Signed-off-by: Anup Patel --- drivers/irqchip/irq-sifive-plic.c | 59 +++++++++++++++++-------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c index c23a293a2aae..48bee877e0f1 100644 --- a/drivers/irqchip/irq-sifive-plic.c +++ b/drivers/irqchip/irq-sifive-plic.c @@ -55,8 +55,6 @@ #define CONTEXT_THRESHOLD 0x00 #define CONTEXT_CLAIM 0x04 -static void __iomem *plic_regs; - struct plic_handler { bool present; void __iomem *hart_base; @@ -67,8 +65,19 @@ struct plic_handler { raw_spinlock_t enable_lock; void __iomem *enable_base; }; + static DEFINE_PER_CPU(struct plic_handler, plic_handlers); +struct plic_hw { + u32 nr_irqs; + u32 nr_handlers; + u32 nr_mapped; + void __iomem *regs; + struct irq_domain *irqdomain; +}; + +static struct plic_hw plic; + static inline void plic_toggle(struct plic_handler *handler, int hwirq, int enable) { @@ -87,7 +96,7 @@ static inline void plic_irq_toggle(struct irq_data *d, int enable) { int cpu; - writel(enable, plic_regs + PRIORITY_BASE + d->hwirq * PRIORITY_PER_ID); + writel(enable, plic.regs + PRIORITY_BASE + d->hwirq * PRIORITY_PER_ID); for_each_cpu(cpu, irq_data_get_affinity_mask(d)) { struct plic_handler *handler = per_cpu_ptr(&plic_handlers, cpu); @@ -130,8 +139,6 @@ static const struct irq_domain_ops plic_irqdomain_ops = { .xlate = irq_domain_xlate_onecell, }; -static struct irq_domain *plic_irqdomain; - /* * Handling an interrupt is a two-step process: first you claim the interrupt * by reading the claim register, then you complete the interrupt by writing @@ -148,7 +155,7 @@ static void plic_handle_irq(struct pt_regs *regs) csr_clear(sie, SIE_SEIE); while ((hwirq = readl(claim))) { - int irq = irq_find_mapping(plic_irqdomain, hwirq); + int irq = irq_find_mapping(plic.irqdomain, hwirq); if (unlikely(irq <= 0)) pr_warn_ratelimited("can't find mapping for hwirq %lu\n", @@ -177,36 +184,35 @@ static int plic_find_hart_id(struct device_node *node) static int __init plic_init(struct device_node *node, struct device_node *parent) { - int error = 0, nr_handlers, nr_mapped = 0, i; - u32 nr_irqs; + int error = 0, i; - if (plic_regs) { + if (plic.regs) { pr_warn("PLIC already present.\n"); return -ENXIO; } - plic_regs = of_iomap(node, 0); - if (WARN_ON(!plic_regs)) + plic.regs = of_iomap(node, 0); + if (WARN_ON(!plic.regs)) return -EIO; error = -EINVAL; - of_property_read_u32(node, "riscv,ndev", &nr_irqs); - if (WARN_ON(!nr_irqs)) + of_property_read_u32(node, "riscv,ndev", &plic.nr_irqs); + if (WARN_ON(!plic.nr_irqs)) goto out_iounmap; - nr_handlers = of_irq_count(node); - if (WARN_ON(!nr_handlers)) + plic.nr_handlers = of_irq_count(node); + if (WARN_ON(!plic.nr_handlers)) goto out_iounmap; - if (WARN_ON(nr_handlers < num_possible_cpus())) + if (WARN_ON(plic.nr_handlers < num_possible_cpus())) goto out_iounmap; error = -ENOMEM; - plic_irqdomain = irq_domain_add_linear(node, nr_irqs + 1, - &plic_irqdomain_ops, NULL); - if (WARN_ON(!plic_irqdomain)) + plic.irqdomain = irq_domain_add_linear(node, plic.nr_irqs + 1, + &plic_irqdomain_ops, NULL); + if (WARN_ON(!plic.irqdomain)) goto out_iounmap; - for (i = 0; i < nr_handlers; i++) { + for (i = 0; i < plic.nr_handlers; i++) { struct of_phandle_args parent; struct plic_handler *handler; irq_hw_number_t hwirq; @@ -231,25 +237,26 @@ static int __init plic_init(struct device_node *node, handler = per_cpu_ptr(&plic_handlers, cpu); handler->present = true; handler->hart_base = - plic_regs + CONTEXT_BASE + i * CONTEXT_PER_HART; + plic.regs + CONTEXT_BASE + i * CONTEXT_PER_HART; raw_spin_lock_init(&handler->enable_lock); handler->enable_base = - plic_regs + ENABLE_BASE + i * ENABLE_PER_HART; + plic.regs + ENABLE_BASE + i * ENABLE_PER_HART; /* priority must be > threshold to trigger an interrupt */ writel(0, handler->hart_base + CONTEXT_THRESHOLD); - for (hwirq = 1; hwirq <= nr_irqs; hwirq++) + for (hwirq = 1; hwirq <= plic.nr_irqs; hwirq++) plic_toggle(handler, hwirq, 0); - nr_mapped++; + + plic.nr_mapped++; } pr_info("mapped %d interrupts to %d (out of %d) handlers.\n", - nr_irqs, nr_mapped, nr_handlers); + plic.nr_irqs, plic.nr_mapped, plic.nr_handlers); set_handle_irq(plic_handle_irq); return 0; out_iounmap: - iounmap(plic_regs); + iounmap(plic.regs); return error; } -- 2.17.1