From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 097BBCA5FA5 for ; Tue, 29 Sep 2026 08:38:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=fenowVgmeWe7vCojItj6QmIISw0iYmE3Il+0o45I9mM=; b=xU9+X+D4xgRXYU svvCaGwB2EPHmonUQZmfwkDPti2FXmvlSjmXak62LH1DM9pDFV75c4Zb+AdUVQC73DH6ii5g6tFED 026nUKns4/5kNqk2EWXs7+/LZnRCmxKUYW4xrE4VNQc3v3fTvNa29zVbmOFpHRLOKkVanXDuJU3Q9 vFe83VVtIo4FP71xg2kj2XKUSVRquQh45lHk3QfeN+/CdVu+g6/RaHOYRzzDuFRaOwgt8r80R17yy Ugs6D3Z/ip1Z0mH6rkZ76jHwmfQT498V2vlWxtngG0E4fa/QkK6E3JIqRuPdNWcC+8rULIG1dlYLP i59KHpoWNqX2tFqBX++w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1xBTM5-00000002oKJ-21Wr; Tue, 29 Sep 2026 08:38:29 +0000 Received: from mail-pj2-x11.google.com ([2607:f8b0:4864:39::11]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1xBTM0-00000002oG2-3pBA for linux-riscv@lists.infradead.org; Tue, 29 Sep 2026 08:38:26 +0000 Received: by mail-pj2-x11.google.com with SMTP id d9443c01a7336-2dd77300825so21030765ad.1 for ; Tue, 29 Sep 2026 01:38:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790671104; x=1791275904; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=9taEhUKeB1oizn7sfoRMW1tAn++l1MHVxmwejzHWtjA=; b=RgvnhXZy5xM9mF96IiqmzNbrY8NTupRctvcXATGwGgFAp3qNmiLRjEflyAj2dkIh5N toZ0RVXgdvjJQptrZ6+/u5kFvJoxeCSRgMXxFD6JrWMZ7tDl2BazXEJ9yplrpbbtmAD4 kwRaDk9kJE79o+/3phwWDcuI2tREJgQCVsvQ7jtuH0ELlBeA2Dbu3uR+laMm021COy1s hc8P32iv41nxAzKX1iA6fkPq4Le0iKIEJF3B9HuqEZrRxQGlyTuWh5kjcRTL/bMMjihq vqg6S1NdCQuPsESaR5uW+bOefeRz0RjlSdQciDJa46OYcWcoAOs70vPkCrZxeiQgFo1i G5GQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790671104; x=1791275904; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=9taEhUKeB1oizn7sfoRMW1tAn++l1MHVxmwejzHWtjA=; b=JZ2CrlT1EhVuPLOyob3IllZbhWGdvDCC2nysGYJ4+6wM4prpmGaStiLVbGC90w/hlH kEjZrx0PgcCPRIKJBzcDhd9YV/Vzv2x9RlozqA5tW96VTrQLWybjrmqW/zLxalHzuTRG 6TJrIFCpOc01V/LNtQTxIh49sxekGbYywEUJscXeVgeJQg2EXZt7JREmjZTbfnfkVyaa SKbtu9602f6P5mDdYUk7hhQ4ype1dKKyKdouCxJaWwkcT66FSOJVJqb+oy00OdUfFLtm bo2unx9+HN+AIniJP0i92Mo/el5NXapP+/vYZGsnw3K+U6JUBtYXTTs5fq8kQI2XTbFj IfsQ== X-Forwarded-Encrypted: i=1; AKwUvBwmy5K6ZlVKwS5DEdycbdyZ4boqrhekPdKhQ29gHaEPAS5T93lu9C8p3/Ue3a3gT1FZYkzLFJe5KW51Qw==@lists.infradead.org X-Gm-Message-State: AFuF++lE9k3aQO02kxd+mvo8rpGot4fZm/6798jKxJ+dXfrkBKDIIbMD HLC6C+BcmOwXaUAhL0dCaTckpAKOz77soGCYI50RVqqVVKFdrCAIrOpK X-Gm-Gg: AYBFou1hIWmcCHvLbUMI9WUtqKZkw2cF6ku0clqPaUH8okFPPpqx8QrLRo+m3XaG7DM IqwgIQt0r3i79BmFeIZb9XmbuRbyrZoyAbP3npks/YGIhqhixd82HjlyvpWJ6EoMcP7XJRkQJAV e+M70ushy+g63tPhQ3pxdWrkUlyexlLuM1ncYBFjbEJqHOeO0giFq2w9i2KSgs9mk4QVETPrT5n uJbDRb00H7BivvDtKxvWM4Fwm1cNQr3gxruKOaVY89qn/oRPicGSWi5rOQw3Lcvet11dAKcDlzg 9Efm0zYf9DwgNBEDt9U5l0o2sVFoI4z+7547YoIo25dX0culbnv/jO/nlyUIfBTmMNCsQgtGwzI 33ydV5iMd92MxUoSwuEPhs6bjzGXqe6PTmZE/qA62EaLf38++jYURfkVhkVgRwcbaVPwjUrTN0q LzEnK4jVITT/NUdvub+c8hnpHVeQ29sWlWTi5M73XNuQeyis2UOLdIy0+2y76hupFETyp0 X-Received: by 2002:a17:903:2312:b0:2dd:c170:2d4d with SMTP id d9443c01a7336-2df7da9eccemr117563315ad.24.1790671103914; Tue, 29 Sep 2026 01:38:23 -0700 (PDT) Received: from localhost ([2001:19f0:8000:3e6e:5400:6ff:fe38:3d01]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2df91475206sm51407475ad.82.2026.09.29.01.38.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Sep 2026 01:38:23 -0700 (PDT) From: Inochi Amaoto To: Jingoo Han , Manivannan Sadhasivam , Lorenzo Pieralisi , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Rob Herring , Bjorn Helgaas , Krzysztof Kozlowski , Conor Dooley , Yixun Lan , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Frank Li , Arnd Bergmann , Niklas Cassel , Christian Bruel , Senchuan Zhang , Vincent Guittot , Randolph Lin , Xincheng Zhang , Alex Elder , Siddharth Vadapalli , Andy Shevchenko , Marek Vasut , Inochi Amaoto , Vidya Sagar , Pengpeng Hou , Anirudh Srinivasan , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig=20=28The=20Capable=20Hub=29?= , Gustavo Pimentel Cc: linux-pci@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, Yixun Lan , Longbin Li Subject: [PATCH v7 6/6] PCI: spacemit-k1: Add Spacemit K3 PCIe host controller support Date: Tue, 29 Sep 2026 16:37:52 +0800 Message-ID: <20260929083755.458238-7-inochiama@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260929083755.458238-1-inochiama@gmail.com> References: <20260929083755.458238-1-inochiama@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260929_013824_962506_8F122331 X-CRM114-Status: GOOD ( 20.51 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org The PCIe controller on Spacemit K3 is almost a standard Synopsys DesignWare PCIe IP with extra link and reset control. Unlike the PCIe controller on K1, this controller supports external MSI interrupt controller and can use multiple PHYs at the same time. Add driver to support PCIe controller on Spacemit K3 PCIe. Signed-off-by: Inochi Amaoto --- drivers/pci/controller/dwc/Kconfig | 4 +- drivers/pci/controller/dwc/pcie-spacemit-k1.c | 139 ++++++++++++++++++ 2 files changed, 141 insertions(+), 2 deletions(-) diff --git a/drivers/pci/controller/dwc/Kconfig b/drivers/pci/controller/dwc/Kconfig index dcfbe7e229fd..f9c27165260e 100644 --- a/drivers/pci/controller/dwc/Kconfig +++ b/drivers/pci/controller/dwc/Kconfig @@ -443,7 +443,7 @@ config PCIE_SOPHGO_DW Sophgo SoCs. config PCIE_SPACEMIT_K1 - tristate "SpacemiT K1 PCIe controller (host mode)" + tristate "SpacemiT PCIe controller (host mode)" depends on ARCH_SPACEMIT || COMPILE_TEST depends on HAS_IOMEM select PCIE_DW_HOST @@ -451,7 +451,7 @@ config PCIE_SPACEMIT_K1 default ARCH_SPACEMIT help Enables support for the DesignWare based PCIe controller in - the SpacemiT K1 SoC operating in host mode. Three controllers + the SpacemiT SoC operating in host mode. Three controllers are available on the K1 SoC; the first of these shares a PHY with a USB 3.0 host controller (one or the other can be used). diff --git a/drivers/pci/controller/dwc/pcie-spacemit-k1.c b/drivers/pci/controller/dwc/pcie-spacemit-k1.c index ec59ccb710ec..61b430f2294a 100644 --- a/drivers/pci/controller/dwc/pcie-spacemit-k1.c +++ b/drivers/pci/controller/dwc/pcie-spacemit-k1.c @@ -28,8 +28,18 @@ #define SMLH_LINK_UP BIT(1) #define RDLH_LINK_UP BIT(12) +#define INTR_STATUS 0x0010 + #define INTR_ENABLE 0x0014 #define MSI_CTRL_INT BIT(11) +#define RDLH_LINK_UP_INT BIT(20) + +#define K3_PHY_AHB_IRQSTATUS_INTX 0x0008 + +#define K3_ADDR_INTR_STATUS1 0x0018 + +#define K3_CACHE_MSTR_AWCACHE_MODE GENMASK(14, 11) +#define K3_CACHE_MSTR_AWCACHE_BEHAVIOR 0xf /* Some controls require APMU regmap access */ #define SYSCON_APMU "spacemit,apmu" @@ -44,6 +54,9 @@ #define PCIE_CONTROL_LOGIC 0x0004 #define PCIE_SOFT_RESET BIT(0) +#define PCIE_PERSTN_OE BIT(24) +#define PCIE_PERSTN_OUT BIT(25) +#define PCIE_IGNORE_PERSTN BIT(31) struct k1_pcie; @@ -315,6 +328,123 @@ static int k1_pcie_parse_port(struct k1_pcie *k1) return ret; } +static int k3_pcie_init(struct dw_pcie_rp *pp) +{ + struct dw_pcie *pci = to_dw_pcie_from_pp(pp); + struct k1_pcie *k1 = to_k1_pcie(pci); + u32 reset_ctrl = k1->pmu_off + PCIE_CLK_RESET_CONTROL; + u32 val; + int ret; + + regmap_clear_bits(k1->pmu, reset_ctrl, LTSSM_EN); + + k1_pcie_toggle_soft_reset(k1); + + /* K3: Set IGNORE_PERSTN and drive PERSTN_OE high (assert reset) */ + regmap_update_bits(k1->pmu, k1->pmu_off + PCIE_CONTROL_LOGIC, + PCIE_IGNORE_PERSTN | PCIE_PERSTN_OE | PCIE_PERSTN_OUT, + PCIE_IGNORE_PERSTN | PCIE_PERSTN_OE); + + ret = k1_pcie_enable_resources(k1); + if (ret) + goto failed_resources; + + regmap_set_bits(k1->pmu, reset_ctrl, PCIE_AUX_PWR_DET); + regmap_clear_bits(k1->pmu, reset_ctrl, APP_HOLD_PHY_RST); + + ret = phy_bulk_init(k1->phy_count, k1->phys); + if (ret) + goto failed_phy_init; + + ret = phy_bulk_power_on(k1->phy_count, k1->phys); + if (ret) + goto failed_phy_power_on; + + msleep(PCIE_T_PVPERL_MS); + + regmap_set_bits(k1->pmu, k1->pmu_off + PCIE_CONTROL_LOGIC, + PCIE_PERSTN_OUT | PCIE_PERSTN_OE); + + val = dw_pcie_readl_dbi(pci, GEN3_EQ_CONTROL_OFF); + val = u32_replace_bits(val, BIT(7), + GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC); + dw_pcie_writel_dbi(pci, GEN3_EQ_CONTROL_OFF, val); + + k1_pcie_set_device_id(k1); + + /* Finally, as a workaround, disable ASPM L1 */ + k1_pcie_disable_aspm_l1(k1); + + return 0; + +failed_phy_power_on: + phy_bulk_exit(k1->phy_count, k1->phys); +failed_phy_init: + k1_pcie_disable_resources(k1); +failed_resources: + regmap_update_bits(k1->pmu, k1->pmu_off + PCIE_CONTROL_LOGIC, + PCIE_PERSTN_OUT | PCIE_PERSTN_OE, + PCIE_PERSTN_OE); + + return ret; +} + +static void k3_pcie_deinit(struct dw_pcie_rp *pp) +{ + struct dw_pcie *pci = to_dw_pcie_from_pp(pp); + struct k1_pcie *k1 = to_k1_pcie(pci); + + /* Assert fundamental reset (drive PERST# low) */ + regmap_update_bits(k1->pmu, k1->pmu_off + PCIE_CONTROL_LOGIC, + PCIE_PERSTN_OUT | PCIE_PERSTN_OE, + PCIE_PERSTN_OE); + + phy_bulk_power_off(k1->phy_count, k1->phys); + phy_bulk_exit(k1->phy_count, k1->phys); + + k1_pcie_disable_resources(k1); +} + +static int k3_pcie_msi_host_init(struct dw_pcie_rp *pp) +{ + struct dw_pcie *pci = to_dw_pcie_from_pp(pp); + u32 val; + + dw_pcie_dbi_ro_wr_en(pci); + + /* For IMSIC interrupt */ + val = dw_pcie_readl_dbi(pci, COHERENCY_CONTROL_3_OFF); + val = u32_replace_bits(val, K3_CACHE_MSTR_AWCACHE_BEHAVIOR, + K3_CACHE_MSTR_AWCACHE_MODE); + dw_pcie_writel_dbi(pci, COHERENCY_CONTROL_3_OFF, val); + + dw_pcie_dbi_ro_wr_dis(pci); + + return 0; +} + +static const struct dw_pcie_host_ops k3_pcie_host_ops = { + .init = k3_pcie_init, + .deinit = k3_pcie_deinit, + .msi_init = k3_pcie_msi_host_init, +}; + +static int k3_pcie_parse_port(struct k1_pcie *k1) +{ + u32 status0, status1, status2; + + /* Clear the status registers */ + status0 = readl_relaxed(k1->link + K3_PHY_AHB_IRQSTATUS_INTX); + status1 = readl_relaxed(k1->link + INTR_STATUS); + status2 = readl_relaxed(k1->link + K3_ADDR_INTR_STATUS1); + + writel_relaxed(status0, k1->link + K3_PHY_AHB_IRQSTATUS_INTX); + writel_relaxed(status1, k1->link + INTR_STATUS); + writel_relaxed(status2, k1->link + K3_ADDR_INTR_STATUS1); + + return k1_pcie_parse_port(k1); +} + static int k1_pcie_probe(struct platform_device *pdev) { const struct k1_pcie_device_data *data; @@ -392,8 +522,17 @@ static const struct k1_pcie_device_data k1_pcie_device_data = { .device_id = PCI_DEVICE_ID_SPACEMIT_K1, }; +static const struct k1_pcie_device_data k3_pcie_device_data = { + .host_ops = &k3_pcie_host_ops, + .ops = &k1_pcie_ops, + .parse_port = k3_pcie_parse_port, + .max_phy_count = 6, + .device_id = PCI_DEVICE_ID_SPACEMIT_K3, +}; + static const struct of_device_id k1_pcie_of_match_table[] = { { .compatible = "spacemit,k1-pcie", .data = &k1_pcie_device_data }, + { .compatible = "spacemit,k3-pcie", .data = &k3_pcie_device_data }, { } }; MODULE_DEVICE_TABLE(of, k1_pcie_of_match_table); -- 2.55.0 _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv