Received: by 2002:a05:6358:111d:b0:dc:6189:e246 with SMTP id f29csp3733407rwi; Wed, 2 Nov 2022 02:25:51 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6HeVGz4KZ7bkKR8D8ZSFdXv4EkbZ1RiNKPX82uKngPT773R+CYgok+cp6m20dvmdbxj2la X-Received: by 2002:a17:907:720b:b0:78e:c0e:a434 with SMTP id dr11-20020a170907720b00b0078e0c0ea434mr23080207ejc.741.1667381150800; Wed, 02 Nov 2022 02:25:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1667381150; cv=none; d=google.com; s=arc-20160816; b=qnLHM/l1ift1I27Lp1N5NCuqyC9EsMt4QF+YSlo2yN4suDk7x0pVclufqHZUVHycRe ejxyTjyjvobHjJGN/6F5O5uM0sUJBrvy8hoMB1i1K9gctN59NR9/la/rT3dXtZgdM/xV aSBDm5QFkSpERXgjlaCkbRJCywPq5xMZJcQbOFa08dacLQeCy5q3tvQpcJKM94bPt2v1 WCYZ0hB6tsJDUvNJOZ5gJOvpNfnM72ZcbKlxXNw4Bn4SKhOirJoFlg6iMhdUrWCnUl1t 1c8A5tNFaBr7HqgvxX4Upj4FLZzgHrBR/Jc0/CbbdYi4a7o3V6MF76Z0Hd/Mib25eEq/ MscQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=tHRRKW2v04A+7a/LKUBlFKs1fXFnJ3gJdHF398JjwHc=; b=NrcdNE71cLl3ewu05g/hDagE1yb1prvxsevDWN6FDdl+GjqH4pFkFbR96pXW20A+iC IS8NabAG1KjQzXqHAEi5Mw9tyxRakSCileWwlhKU3492cZMfzxLbw9m49DdIvCUTYfzw hkDwu7XpCrnjMGIh4cV6QNCEWAzN/S1BuwEk8kM1zy7chKcQd2i5EOjrYCUecBg1q1kk yg9npkMeANr4jVEWNkzePqdNlaaPjEj4Ar3Oo5U1bOyAgi5fcZp3WLtVaZkX7D+Lya0p LLlcA6OHe3j2Nk7ibXYP1QBXB24c3g5mciZIH5rOLZLO6+U22GStsJl3lWqOEWKZMAPB DaIw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=SRg6Pw5m; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d9-20020a50cd49000000b00452dfa2bb27si15376160edj.134.2022.11.02.02.25.26; Wed, 02 Nov 2022 02:25:50 -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; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=SRg6Pw5m; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230456AbiKBJJx (ORCPT + 97 others); Wed, 2 Nov 2022 05:09:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39562 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230400AbiKBJJA (ORCPT ); Wed, 2 Nov 2022 05:09:00 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8144827FE8; Wed, 2 Nov 2022 02:08:58 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 2CC4AB8216C; Wed, 2 Nov 2022 09:08:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CD2C4C43140; Wed, 2 Nov 2022 09:08:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1667380135; bh=K0quaz+Wfm7vLUHKdy0xGgalRWdTdZS5W06aFhvSiKw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SRg6Pw5mWkRR1qbrh14cI4Q1E4F1kwqcD2A8jdseXcDVTOUL7JX69X+kKpEWXA/tF dIDwk/SlfzHt1LBYTArtqAQRUFiqy0SBCLA6jVw+1ftDvDzCv5KTp0ATbn6c8x34A5 khhxI9f7ZGYfsaB9kPWn0w0LT2xNMgtLwiaijVTPhW0VjLaVs7XF9B0cIRRtkzDQeJ BwQwUEvJ4TDGDVsAGvvLAh45G9Do0yC9+lftpmsMWGbq3Ge3I22fGRcz0Murv81HPH CA1HalWm4/iTmG3HN2QLdjDtNfa4SeVVH0StfAQoN75P9zuDkIWM5HygjAoUeZRCU9 HP/yTi4L84eqQ== Received: from johan by xi.lan with local (Exim 4.94.2) (envelope-from ) id 1oq9jj-0006B7-OF; Wed, 02 Nov 2022 10:08:39 +0100 From: Johan Hovold To: Lorenzo Pieralisi , stanimir.k.varbanov@gmail.com Cc: Andy Gross , Bjorn Andersson , Konrad Dybcio , Bjorn Helgaas , Rob Herring , Krzysztof Kozlowski , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Brian Masney , Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org, linux-pci@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold , Georgi Djakov Subject: [PATCH v3 2/2] PCI: qcom: Add basic interconnect support Date: Wed, 2 Nov 2022 10:07:05 +0100 Message-Id: <20221102090705.23634-3-johan+linaro@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221102090705.23634-1-johan+linaro@kernel.org> References: <20221102090705.23634-1-johan+linaro@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-8.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS 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 On Qualcomm platforms like SC8280XP and SA8540P, interconnect bandwidth must be requested before enabling interconnect clocks. Add basic support for managing an optional "pcie-mem" interconnect path by setting a low constraint before enabling clocks and updating it after the link is up. Note that it is not possible for a controller driver to set anything but a maximum peak bandwidth as expected average bandwidth will vary with use case and actual use (and power policy?). This very much remains an unresolved problem with the interconnect framework. Also note that no constraint is set for the SC8280XP/SA8540P "cpu-pcie" path for now as it is not clear what an appropriate constraint would be (and the system does not crash when left unspecified). Fixes: 70574511f3fc ("PCI: qcom: Add support for SC8280XP") Reviewed-by: Brian Masney Acked-by: Georgi Djakov Signed-off-by: Johan Hovold --- drivers/pci/controller/dwc/pcie-qcom.c | 76 ++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c index 7db94a22238d..91b113d0c02a 100644 --- a/drivers/pci/controller/dwc/pcie-qcom.c +++ b/drivers/pci/controller/dwc/pcie-qcom.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -224,6 +225,7 @@ struct qcom_pcie { union qcom_pcie_resources res; struct phy *phy; struct gpio_desc *reset; + struct icc_path *icc_mem; const struct qcom_pcie_cfg *cfg; }; @@ -1644,6 +1646,74 @@ static const struct dw_pcie_ops dw_pcie_ops = { .start_link = qcom_pcie_start_link, }; +static int qcom_pcie_icc_init(struct qcom_pcie *pcie) +{ + struct dw_pcie *pci = pcie->pci; + int ret; + + pcie->icc_mem = devm_of_icc_get(pci->dev, "pcie-mem"); + if (IS_ERR(pcie->icc_mem)) + return PTR_ERR(pcie->icc_mem); + + /* + * Some Qualcomm platforms require interconnect bandwidth constraints + * to be set before enabling interconnect clocks. + * + * Set an initial peak bandwidth corresponding to single-lane Gen 1 + * for the pcie-mem path. + */ + ret = icc_set_bw(pcie->icc_mem, 0, MBps_to_icc(250)); + if (ret) { + dev_err(pci->dev, "failed to set interconnect bandwidth: %d\n", + ret); + return ret; + } + + return 0; +} + +static void qcom_pcie_icc_update(struct qcom_pcie *pcie) +{ + struct dw_pcie *pci = pcie->pci; + u32 offset, status, bw; + int speed, width; + int ret; + + if (!pcie->icc_mem) + return; + + offset = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP); + status = readw(pci->dbi_base + offset + PCI_EXP_LNKSTA); + + /* Only update constraints if link is up. */ + if (!(status & PCI_EXP_LNKSTA_DLLLA)) + return; + + speed = FIELD_GET(PCI_EXP_LNKSTA_CLS, status); + width = FIELD_GET(PCI_EXP_LNKSTA_NLW, status); + + switch (speed) { + case 1: + bw = MBps_to_icc(250); + break; + case 2: + bw = MBps_to_icc(500); + break; + default: + WARN_ON_ONCE(1); + fallthrough; + case 3: + bw = MBps_to_icc(985); + break; + } + + ret = icc_set_bw(pcie->icc_mem, 0, width * bw); + if (ret) { + dev_err(pci->dev, "failed to set interconnect bandwidth: %d\n", + ret); + } +} + static int qcom_pcie_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -1704,6 +1774,10 @@ static int qcom_pcie_probe(struct platform_device *pdev) goto err_pm_runtime_put; } + ret = qcom_pcie_icc_init(pcie); + if (ret) + goto err_pm_runtime_put; + ret = pcie->cfg->ops->get_resources(pcie); if (ret) goto err_pm_runtime_put; @@ -1722,6 +1796,8 @@ static int qcom_pcie_probe(struct platform_device *pdev) goto err_phy_exit; } + qcom_pcie_icc_update(pcie); + return 0; err_phy_exit: -- 2.37.3