Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp185445iog; Tue, 14 Jun 2022 23:25:39 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vGurtpSpsrBwWpd2sZtuk0lrCjb36ZB0/3/aihAJCpnQtNZBsNuXypK/zZSh7SyEYnMklk X-Received: by 2002:a17:903:32cb:b0:164:818:d40f with SMTP id i11-20020a17090332cb00b001640818d40fmr7751306plr.126.1655274338892; Tue, 14 Jun 2022 23:25:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655274338; cv=none; d=google.com; s=arc-20160816; b=lVk6yddyiU6+QTzINHQhQxWvtDMQ0iyAuXq8c9PTBOnnm4QoAqT09SXKAD/nfXJ7pS c6NuM0L981MuDzlSL68l2vKK13vmzKT5ziwEKAbPj0nVvZl/PeEpR3jkKkRWUR51FZKb OeZ2TtRgdmdISQ28YSl6aIhb1s/ZyGzb/Ob3eIzxzQcPsoon5yXsWHdzNBkl3ElFlbJI XfqO4f5dgj/T4F+O2JAtcCxaLI+GFbcsyBswb3JksKXPPUaDD395/j9stKoxfbABJWNm cQ9a4+EyZgfl7SXFbUJAbnDL9H4X+98dd5pAZkd7LyhhUmlmoNDnP6OtCP31Dm2my3sO tZxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=hjrPu4cuM6b8qARvNuDvp2JILdzPmhB3WQcX0etBR9A=; b=IqRZ9wSTWPgZEFXyG25S4K6cYp46FI0Fbhbg0b8tuSELUPuRsWOnvyLT34nb/292i/ 9Ud7DWCnjQFbpZZd0HIrDCqDnySSZ3l/XSvkYjkIFU5ckudo/olZ3GQT+i+EnR5oqsiU IFrclzblXQEix624URyJoiJadvLEwoLtU+DycpU8rE52xVLdtw69T9uziQ3sbZhmlGLr W3zVVl3zzGFz53xvANJil0M5pk47pTcYcl3hpBhVxg6a430BWq59jLiGHDKEng93gUpj QTqZcsHu2viJfOAFwRFFv6Y9+ukXKRPjhhjqcy/R7X1IAdhZQckpcFzOQyRDnlMWkcYo /HIg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id b7-20020a170902d50700b00163bad6ec7bsi17708652plg.613.2022.06.14.23.25.25; Tue, 14 Jun 2022 23:25:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346203AbiFOGHs (ORCPT + 99 others); Wed, 15 Jun 2022 02:07:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54300 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235866AbiFOGHr (ORCPT ); Wed, 15 Jun 2022 02:07:47 -0400 Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 85CC320F53 for ; Tue, 14 Jun 2022 23:07:45 -0700 (PDT) Received: from localhost.localdomain.localdomain (unknown [10.2.5.46]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Dx398id6li2SVDAA--.6137S2; Wed, 15 Jun 2022 14:07:31 +0800 (CST) From: Jianmin Lv To: Thomas Gleixner , Marc Zyngier Cc: linux-kernel@vger.kernel.org, Hanjun Guo , Lorenzo Pieralisi , Jiaxun Yang , Huacai Chen Subject: [PATCH V12 00/10] irqchip: Add LoongArch-related irqchip drivers Date: Wed, 15 Jun 2022 14:07:20 +0800 Message-Id: <1655273250-23495-1-git-send-email-lvjianmin@loongson.cn> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain; charset=y Content-Transfer-Encoding: 8bit X-CM-TRANSID: AQAAf9Dx398id6li2SVDAA--.6137S2 X-Coremail-Antispam: 1UD129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UjIYCTnIWjp_UUUYA7k0a2IF6F4UM7kC6x804xWl1xkIjI8I 6I8E6xAIw20EY4v20xvaj40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l8cAvFVAK0II2c7xJM2 8CjxkF64kEwVA0rcxSw2x7M28EF7xvwVC0I7IYx2IY67AKxVW7JVWDJwA2z4x0Y4vE2Ix0 cI8IcVCY1x0267AKxVWxJVW8Jr1l84ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwV C2z280aVCY1x0267AKxVW0oVCq3wAS0I0E0xvYzxvE52x082IY62kv0487M2AExVAIFx02 aVAFz4v204v7Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUJVWUGw Av7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0Y48IcxkI7VAKI48J M4kE6I8I3I0E14AKx2xKxVC2ax8xMxkIecxEwVCm-wCF04k20xvY0x0EwIxGrwCF04k20x vE74AGY7Cv6cx26ryrJr1UJwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v2 6r1j6r18MI8I3I0E7480Y4vE14v26r1j6r18MI8E67AF67kF1VAFwI0_JF0_Jw1lIxkGc2 Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_ Jr0_Gr1lIxAIcVCF04k26cxKx2IYs7xG6rW3Jr0E3s1lIxAIcVC2z280aVAFwI0_Jr0_Gr 1lIxAIcVC2z280aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7IU8rcTPUU UUU== X-CM-SenderInfo: 5oymxthqpl0qxorr0wxvrqhubq/ X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org LoongArch is a new RISC ISA, which is a bit like MIPS or RISC-V. LoongArch includes a reduced 32-bit version (LA32R), a standard 32-bit version (LA32S) and a 64-bit version (LA64). LoongArch use ACPI as its boot protocol LoongArch-specific interrupt controllers (similar to APIC) are already added in the ACPI Specification 6.5(which may be published in early June this year and the board is reviewing the draft). Currently, LoongArch based processors (e.g. Loongson-3A5000) can only work together with LS7A chipsets. The irq chips in LoongArch computers include CPUINTC (CPU Core Interrupt Controller), LIOINTC (Legacy I/O Interrupt Controller), EIOINTC (Extended I/O Interrupt Controller), HTVECINTC (Hyper-Transport Vector Interrupt Controller), PCH-PIC (Main Interrupt Controller in LS7A chipset), PCH-LPC (LPC Interrupt Controller in LS7A chipset) and PCH-MSI (MSI Interrupt Controller). CPUINTC is a per-core controller (in CPU), LIOINTC/EIOINTC/HTVECINTC are per-package controllers (in CPU), while PCH-PIC/PCH-LPC/PCH-MSI are all controllers out of CPU (i.e., in chipsets). These controllers (in other words, irqchips) are linked in a hierarchy, and there are two models of hierarchy (legacy model and extended model). Legacy IRQ model: In this model, the IPI (Inter-Processor Interrupt) and CPU Local Timer interrupt go to CPUINTC directly, CPU UARTS interrupts go to LIOINTC, while all other devices interrupts go to PCH-PIC/PCH-LPC/PCH-MSI and gathered by HTVECINTC, and then go to LIOINTC, and then CPUINTC. +---------------------------------------------+ | | | +-----+ +---------+ +-------+ | | | IPI | --> | CPUINTC | <-- | Timer | | | +-----+ +---------+ +-------+ | | ^ | | | | | +---------+ +-------+ | | | LIOINTC | <-- | UARTs | | | +---------+ +-------+ | | ^ | | | | | +-----------+ | | | HTVECINTC | | | +-----------+ | | ^ ^ | | | | | | +---------+ +---------+ | | | PCH-PIC | | PCH-MSI | | | +---------+ +---------+ | | ^ ^ ^ | | | | | | | +---------+ +---------+ +---------+ | | | PCH-LPC | | Devices | | Devices | | | +---------+ +---------+ +---------+ | | ^ | | | | | +---------+ | | | Devices | | | +---------+ | | | | | +---------------------------------------------+ Extended IRQ model: In this model, the IPI (Inter-Processor Interrupt) and CPU Local Timer interrupt go to CPUINTC directly, CPU UARTS interrupts go to LIOINTC, while all other devices interrupts go to PCH-PIC/PCH-LPC/PCH-MSI and gathered by EIOINTC, and then go to to CPUINTC directly. +--------------------------------------------------------+ | | | +-----+ +---------+ +-------+ | | | IPI | --> | CPUINTC | <-- | Timer | | | +-----+ +---------+ +-------+ | | ^ ^ | | | | | | +---------+ +---------+ +-------+ | | | EIOINTC | | LIOINTC | <-- | UARTs | | | +---------+ +---------+ +-------+ | | ^ ^ | | | | | | +---------+ +---------+ | | | PCH-PIC | | PCH-MSI | | | +---------+ +---------+ | | ^ ^ ^ | | | | | | | +---------+ +---------+ +---------+ | | | PCH-LPC | | Devices | | Devices | | | +---------+ +---------+ +---------+ | | ^ | | | | | +---------+ | | | Devices | | | +---------+ | | | | | +--------------------------------------------------------+ The hierarchy model is constructed by parsing irq contronler structures in MADT. Some controllers((e.g. LIOINTC, HTVECINTC, EIOINTC and PCH-LPC) are hardcodingly connected to their parents, so their irqdomins are separately routed to their parents in a fixed way. Some controllers (e.g. PCH-PIC and PCH-MSI) could be routed to different parents for different CPU. The firmware will config EIOINTC for the newer CPU and config HTVECINTC for old CPU in MADT. By this way, PCH-PIC and PCH-MSI irqdomain can only be routed one parent irqdomin: HTVECINTC or EIOINTC. Example of irqchip topology in a system with two chipsets: +------------------------------------------------------------+ | | | +------------------+ | | | CPUINTC | | | +------------------+ | | ^ ^ | | | | | | +----------+ +----------+ | | | EIOINTC 0| | EIOINTC 1| | | +----------+ +----------+ | | ^ ^ ^ ^ | | | | | | | | +----------+ +----------+ +----------+ +----------+ | | | PCH-PIC 0| | PCH-MSI 0| | PCH-PIC 1| | PCH-MSI 1| | | +----------+ +----------+ +----------+ +----------+ | | | | | +------------------------------------------------------------+ For systems with two chipsets, there are tow group(consists of EIOINTC, PCH-PIC and PCH-MSI) irqdomains, and each group has same node id. So we defined a structure to mantain the relation of node and it's parent irqdomain. struct acpi_vector_group { int node; struct irq_domain *parent; }; The initialization and use of acpi_vector_group array are following: 1 Entry of struct acpi_vector_group array initialization: By parsing MCFG, the node id(from bit44-47 of Base Address)of each pci segment is extracted. And from MADT, we have the node id of each EIOINTC. entrys[pci segment].node = node id of pci segment entrys[pci segment].parent = EIOINTC irqdomain(node id of EIOINTC == node id of pci segment) 2 Get parent irqdomain for PCH-PIC: From MADT, we have the node id of each PCH-PIC(from bit44-47 of Base Address). if (node of entry i == node of PCH-PIC) return entrys[i].parent; entrys[pci segment].node = node id of pci segment entrys[pci segment].parent = EIOINTC irqdomain(node id of EIOINTC == node id of pci segment) 3 Get parent irqdomain for PCH-MSI of pci segment: return entrys[pci segment].parent; 4 How to select a correct irqdomain to map irq for a device? For devices using legacy irq behind PCH-PIC, GSI is used to select correct PCH-PIC irqdomain. For devices using msi irq behind PCH-MSI, the pci segmen of the device is used to select correct PCH-MSI irqdomain. V1 -> V2: 1, Remove queued patches; 2, Move common logic of DT/ACPI probing to common functions; 3, Split .suspend()/.resume() functions to separate patches. V2 -> V3: 1, Fix a bug for loongson-pch-pic probe; 2, Some minor improvements for LPC controller. V3 -> V4: 1, Rework the CPU interrupt controller driver; 2, Some minor improvements for other controllers. V4 -> V5: 1, Add a description of LoonArch's IRQ model; 2, Support multiple EIOINTCs in one system; 3, Some minor improvements for other controllers. V5 -> V6: 1, Attach a fwnode to CPUINTC irq domain; 2, Use raw spinlock instead of generic spinlock; 3, Improve the method of restoring EIOINTC state; 4, Update documentation, comments and commit messages. V6 -> V7: 1, Fix build warnings reported by kernel test robot. V7 -> V8: 1, Add arguments sanity checking for irqchip init functions; 2, Support Loongson-3C5000 (One NUMA Node includes 4 EIOINTC Node). V8 -> V9: 1, Rebase on 5.17-rc5; 2, Update cover letter; 3, Some small improvements. V9 -> V10: 1, Rebase on 5.17-rc6; 2, Fix build warnings reported by kernel test robot. V10 -> V11: 1, Rebase on 5.18-rc4; 2, Fix irq affinity setting for EIOINTC; 3, Fix hwirq allocation failure for EIOINTC. V11 -> RFC: 1, Refactored the way to build irqchip hierarchy topology. RFC -> RFC V2: 1, Move all IO-interrupt related code to driver/irqchip from arch directory. 2. Add description for an example of two chipsets system. RFC V2 -> RFC V3: 1, Add support for multiple GSI domains 2, Use ACPI_GENERIC_GSI for GSI handling 3, Drop suspend-resume stuff 4, Export fwnode handles instead of irq domain handles RFC V3 -> V12: 1, Address patch attributions of the patch series Huacai Chen (7): irqchip: Add LoongArch CPU interrupt controller support irqchip/loongson-pch-pic: Add ACPI init support irqchip/loongson-pch-msi: Add ACPI init support irqchip/loongson-htvec: Add ACPI init support irqchip/loongson-liointc: Add ACPI init support irqchip: Add Loongson Extended I/O interrupt controller support irqchip: Add Loongson PCH LPC controller support Jianmin Lv (2): genirq/generic_chip: export irq_unmap_generic_chip irqchip: create library file for LoongArch irqchip driver Marc Zyngier (1): APCI: irq: Add support for multiple GSI domains drivers/acpi/bus.c | 3 + drivers/acpi/irq.c | 40 ++-- drivers/irqchip/Kconfig | 28 +++ drivers/irqchip/Makefile | 3 + drivers/irqchip/irq-gic-v3.c | 18 +- drivers/irqchip/irq-gic.c | 18 +- drivers/irqchip/irq-loongarch-cpu.c | 134 +++++++++++ drivers/irqchip/irq-loongarch-pic-common.c | 122 ++++++++++ drivers/irqchip/irq-loongarch-pic-common.h | 39 ++++ drivers/irqchip/irq-loongson-eiointc.c | 347 +++++++++++++++++++++++++++++ drivers/irqchip/irq-loongson-htvec.c | 119 +++++++--- drivers/irqchip/irq-loongson-liointc.c | 225 ++++++++++++------- drivers/irqchip/irq-loongson-pch-lpc.c | 202 +++++++++++++++++ drivers/irqchip/irq-loongson-pch-msi.c | 138 ++++++++---- drivers/irqchip/irq-loongson-pch-pic.c | 171 +++++++++++--- include/linux/acpi.h | 3 +- include/linux/cpuhotplug.h | 1 + include/linux/irq.h | 1 + kernel/irq/generic-chip.c | 2 +- 19 files changed, 1402 insertions(+), 212 deletions(-) create mode 100644 drivers/irqchip/irq-loongarch-cpu.c create mode 100644 drivers/irqchip/irq-loongarch-pic-common.c create mode 100644 drivers/irqchip/irq-loongarch-pic-common.h create mode 100644 drivers/irqchip/irq-loongson-eiointc.c create mode 100644 drivers/irqchip/irq-loongson-pch-lpc.c -- 1.8.3.1