From nobody Fri Dec 19 07:20:07 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB24B35F8A5 for ; Tue, 16 Dec 2025 13:49:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765892980; cv=none; b=TWTfHlIv6dQiMOuH6avHf4NTnSPFgLZw831tyNO1rf1HZORFGstaA6A/5u4HGLP5eDMqmNupW7RLdP67kEFs53/W77NFRCQWz6o5H8aUxpK3sSAqbXrD+/CSTWclrSJlnyRMv7K1lRxFutiq6vKc90n0RXkcmBOz0DvuYlt6NrM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765892980; c=relaxed/simple; bh=Fyphgpm9oWKQhl4y6fHTvk81D6ocscTgp2cQazg94DE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FpKHvhejXbD3+pV3D8QCirS2yVbgK4BWRFj+QzUnoj1nn05FldqVbimmXzqUUwVyndl7ixaDnhmybUNLIr0GiY64RbPwugLpnF/H+TJsDcNzaZFNHVEY4KdtjBm5G6dj9Rohk6fQ/520jNod26JyNRFfnRUxLjKUdR09epb5sFk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=fvP6jVzV; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=RBwF6von; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="fvP6jVzV"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="RBwF6von" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BGAM5jw3829355 for ; Tue, 16 Dec 2025 13:49:37 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= x7/Mz5RzhnX1QZHAKW86jmwpiy8TOBH4L00hU7AiSmY=; b=fvP6jVzVKS61kc3x zKhw1sdeRl87LvJEyYqTH2j40jDeUX1Fn1e6WmLIqW0yTl2cFyehLsOQUf7wGxcz gxQb9KiXrlYYyykG27vnSmHKA5ncLlr3E5SaENFXobZ0UPvR/G7xrQ2z9PCVj4nM 5FiB52J7eTNCBhEqqC8Ws3O3VHHoE/aKrh5qPAVEOe1vxrC/zn6uL0TaxARbicGs gmHFNwLzh352/dsgal0UrM6KiBO4Hy4RZb7ONrCsMTZa9KN3d4AiKx8YaM52xmoN IhqEoAjuiiWYtx80MXinUbIQoWSmh8jTy3KPna2rdi0kC7Vkoan8v5FHN7ulYyBz dL2NGg== Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b35m2rsqg-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 16 Dec 2025 13:49:37 +0000 (GMT) Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2a0e9e0fd49so25475525ad.0 for ; Tue, 16 Dec 2025 05:49:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1765892977; x=1766497777; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=x7/Mz5RzhnX1QZHAKW86jmwpiy8TOBH4L00hU7AiSmY=; b=RBwF6vontysnVDsTmjEps7whm1SCTZGwOaU7PnlaNkVMtcTv9ElwfPkn/2MW18ixcJ 9514rs0ftG9beBb50HT7uQnM20bj6BsoYpSPE1OmYnGiFL1jZLZhllAuyIrX76+35cVl hjT8YXTamE8Fd59c9KSgQucKF/1xElSMdxmTd+WGDds8mgueC7v71q6ybyEsbSxlWHHa IXHDbpmfFMX9zKQ/HwGzYse+nQVMW2tArPEcdky85KOR+/Z5zqVWDLoXkeX8bGu6HPZn s3Gt5RE4MZna42+9u4IWnseVHsk6PcC1BUUyngLmGw2ZkKP/6o41YewwCapJeJrlTfwN 9suQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765892977; x=1766497777; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=x7/Mz5RzhnX1QZHAKW86jmwpiy8TOBH4L00hU7AiSmY=; b=qIQd1J4S5Z0iDR8OHc59Mck43YwP3Ro8BECg7HIeYt7epXRnVk9iJDzoTHACbF3qHc qVg7DEd0sKMjAv8gkQy5nl2ffFZYeoLQON42ObXZ6v1AcoirLZ1XV3b93rQCjG3qywfI 2s7zc6kGyUW4rPLRcbHTzHW95qNXRzSxOgn1u3tAz0E91u76tPKr9unrMUNh6RbkWEAc 8j8AkyulG+PRe1KfLLkrujekcd0zyqGNcEj7/T+XWM0PseX+xwYg1WGPeJYn8395a6gv 0fPbXS+rYZhY9LQ7/MyJnJz2NkyVQmO4P4zKS9YgSopgXeOQLbJwHgJdtIm2hbeEMb04 dEmQ== X-Forwarded-Encrypted: i=1; AJvYcCWjpVoAhRQ8jWxHFLUQVHYf0O0JeiPCqguja69f41bqv6JZGw2Jfs7/QD4i4OfB0m3FdjookvpG1nP2+sg=@vger.kernel.org X-Gm-Message-State: AOJu0YwX9pvQxVrsjxcppwD4sMl4/Yz4rQfEB0IV8f6GaO+JmgcSf4nO koYmTLREQ7OyVN67Kp88VRLQNBSoG5az+PFXNs6fvdNcYfgfPe3MEV35dLhBGtn6enjw8eEg9c2 9gmAJifyFVT9gKobQ4s6YVkFQ++vFKLjWxoblQUq2LtF7ik2Z6KFlRREb5uRl1ggOX4c= X-Gm-Gg: AY/fxX7M5kaz2e+mTauFmRgaoJ0n77jojcdVi7plvQ+7UvB1vuMBQhsWaYCtPBgLglb vTEtLA9ZX6HuZK77FLyy8Uve17AEZ4rxreDLdOPOvLLRocvJ+3Isp7/KVVFCjBuhW2bBIPQilbT /0AM2+0DYcRcg+NGz6wjYCSf6C+Wx00ElDoyVYMotUaNWN8mgaW7o60fBbQCWtWzhJwM04PrAHy 0MXqJV2JEEcjWCudcUf8XBDymc55y5iGDgExsq6197nn29OayBz/DYP7t6G2Jfzzf/HJTp4D0dX 4m93PSZSFyV6QU5gLN5BIsNxZhfyWqoJwCXv7dnv8YAUXPneyDXGxGhOi8emUq02tRsD3bVhgdp 05H7f3CtrMrYYPvl/yY6eyYQx9N3s1j1WOh4Ili4bBiY= X-Received: by 2002:a17:902:c406:b0:29e:e5e6:247c with SMTP id d9443c01a7336-29eeebce775mr189077185ad.14.1765892976687; Tue, 16 Dec 2025 05:49:36 -0800 (PST) X-Google-Smtp-Source: AGHT+IFEW7799xblQ1JSbsBt3Us6FRqj35KPvzFMwqhjAxwrznE4otMhZ8ln8p3JbJLk6NgptxWvLg== X-Received: by 2002:a17:902:c406:b0:29e:e5e6:247c with SMTP id d9443c01a7336-29eeebce775mr189076685ad.14.1765892976063; Tue, 16 Dec 2025 05:49:36 -0800 (PST) Received: from hu-msarkar-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a0993ab61dsm99697165ad.46.2025.12.16.05.49.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Dec 2025 05:49:35 -0800 (PST) From: Mrinmay Sarkar Date: Tue, 16 Dec 2025 19:19:18 +0530 Subject: [PATCH v2 2/2] PCI: qcom-ep: Add support for firmware-managed PCIe Endpoint Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251216-firmware_managed_ep-v2-2-7a731327307f@oss.qualcomm.com> References: <20251216-firmware_managed_ep-v2-0-7a731327307f@oss.qualcomm.com> In-Reply-To: <20251216-firmware_managed_ep-v2-0-7a731327307f@oss.qualcomm.com> To: Bjorn Helgaas , Lorenzo Pieralisi , =?utf-8?q?Krzysztof_Wilczy=C5=84ski?= , Manivannan Sadhasivam , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Philipp Zabel , Bjorn Andersson Cc: linux-arm-msm@vger.kernel.org, linux-pci@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Krishna Chaitanya Chundru , quic_vbadigan@quicinc.com, quic_shazhuss@quicinc.com, konrad.dybcio@oss.qualcomm.com, Mrinmay sarkar , Rama Krishna , Ayiluri Naga Rashmi , Nitesh Gupta X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1765892958; l=5973; i=mrinmay.sarkar@oss.qualcomm.com; s=20250423; h=from:subject:message-id; bh=Fyphgpm9oWKQhl4y6fHTvk81D6ocscTgp2cQazg94DE=; b=fweZq6YJt+ogIBNs7H7qTkSgUeTy8mr6rZyNWQXHIeGEFjT2/olTmy+VzGwVml7k9Q/sKz9QF qt0QBLPmRy0BAOtpmZci+X2K/eV/8QSIPsinZpAU5NG/9u6N7Izdbfp X-Developer-Key: i=mrinmay.sarkar@oss.qualcomm.com; a=ed25519; pk=5D8s0BEkJAotPyAnJ6/qmJBFhCjti/zUi2OMYoferv4= X-Authority-Analysis: v=2.4 cv=LpGfC3dc c=1 sm=1 tr=0 ts=69416371 cx=c_pps a=JL+w9abYAAE89/QcEU+0QA==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=2tdM-IJ1x2Ue4swjlzoA:9 a=QEXdDO2ut3YA:10 a=324X-CrmTo6CU4MGRt3R:22 X-Proofpoint-GUID: k3MjySYY1ACm-C_APCZUT0REBgTRYijo X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjE2MDExOCBTYWx0ZWRfXwUmaoH1IG44T LjF4XbMedhNyVmGXSSQCjBTbMoRCrSYuEkDeZfyAm1Um3fxfbE6WjKtTxQD9JY5buuhcdGre/TR mXcDL4e/GJR0uzn5kPzVrK/6cD7+8VCIe/E6HUqX1rg9l5Y4sFqcv4wwV5oH9So54fW0eD5qRZO eY11dqqMT8oXRoQClesludJmcmImx0NOnNa5kD9kDeb4Lwu5bIxbR5Zdo2D9mKiUvsvjPVE61lA etUG0FS1Yv+BT8iNWe7uwzREk2QKWfIu5XqqYWCefZPEpqwgcnfS/pLmDtjIK6+hw9iMX5j+Zkf W67gb0Q25MTv2CVjQcXHVEenCGsG2kRz2bVlfeuwZjViZ4ASBSSNVX7bKDfr0/yYIljbZR8DAEJ /aLVQwGN4O+v1ru7AX8fVDpGdHbvkA== X-Proofpoint-ORIG-GUID: k3MjySYY1ACm-C_APCZUT0REBgTRYijo X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-16_02,2025-12-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 adultscore=0 phishscore=0 malwarescore=0 priorityscore=1501 suspectscore=0 spamscore=0 bulkscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2512160118 Some Qualcomm platforms use firmware to manage PCIe resources such as clocks, resets, and PHY through the SCMI interface. In these cases, the Linux driver should not perform resource enable or disable operations directly. Additionally, runtime PM support has been enabled to ensure proper power state transitions. This commit introduces a `firmware_managed` flag in the Endpoint configuration structure. When set, the driver skips resource handling and uses generic runtime PM calls to let firmware do resource management. A new compatible string is added for SA8255P platforms where firmware manages resources. Signed-off-by: Mrinmay Sarkar --- drivers/pci/controller/dwc/pcie-qcom-ep.c | 82 +++++++++++++++++++++++----= ---- 1 file changed, 62 insertions(+), 20 deletions(-) diff --git a/drivers/pci/controller/dwc/pcie-qcom-ep.c b/drivers/pci/contro= ller/dwc/pcie-qcom-ep.c index f1bc0ac81a928b928ab3f8cc7bf82558fc430474..2de8b48511169a9c836828c2286= 0dba45f6c9db8 100644 --- a/drivers/pci/controller/dwc/pcie-qcom-ep.c +++ b/drivers/pci/controller/dwc/pcie-qcom-ep.c @@ -168,11 +168,13 @@ enum qcom_pcie_ep_link_status { * @hdma_support: HDMA support on this SoC * @override_no_snoop: Override NO_SNOOP attribute in TLP to enable cache = snooping * @disable_mhi_ram_parity_check: Disable MHI RAM data parity error check + * @firmware_managed: Set if the Endpoint controller is firmware managed */ struct qcom_pcie_ep_cfg { bool hdma_support; bool override_no_snoop; bool disable_mhi_ram_parity_check; + bool firmware_managed; }; =20 /** @@ -377,10 +379,17 @@ static int qcom_pcie_enable_resources(struct qcom_pci= e_ep *pcie_ep) =20 static void qcom_pcie_disable_resources(struct qcom_pcie_ep *pcie_ep) { - icc_set_bw(pcie_ep->icc_mem, 0, 0); - phy_power_off(pcie_ep->phy); - phy_exit(pcie_ep->phy); - clk_bulk_disable_unprepare(pcie_ep->num_clks, pcie_ep->clks); + struct device *dev =3D pcie_ep->pci.dev; + int ret; + + pm_runtime_put(dev); + + if (!(pcie_ep->cfg && pcie_ep->cfg->firmware_managed)) { + icc_set_bw(pcie_ep->icc_mem, 0, 0); + phy_power_off(pcie_ep->phy); + phy_exit(pcie_ep->phy); + clk_bulk_disable_unprepare(pcie_ep->num_clks, pcie_ep->clks); + } } =20 static int qcom_pcie_perst_deassert(struct dw_pcie *pci) @@ -390,12 +399,22 @@ static int qcom_pcie_perst_deassert(struct dw_pcie *p= ci) u32 val, offset; int ret; =20 - ret =3D qcom_pcie_enable_resources(pcie_ep); - if (ret) { - dev_err(dev, "Failed to enable resources: %d\n", ret); + ret =3D pm_runtime_resume_and_get(dev); + if (ret < 0) { + dev_err(dev, "Failed to enable endpoint device: %d\n", ret); return ret; } =20 + /* Enable resources if Endpoint controller is not firmware-managed */ + if (!(pcie_ep->cfg && pcie_ep->cfg->firmware_managed)) { + ret =3D qcom_pcie_enable_resources(pcie_ep); + if (ret) { + dev_err(dev, "Failed to enable resources: %d\n", ret); + pm_runtime_put(dev); + return ret; + } + } + /* Perform cleanup that requires refclk */ pci_epc_deinit_notify(pci->ep.epc); dw_pcie_ep_cleanup(&pci->ep); @@ -630,16 +649,6 @@ static int qcom_pcie_ep_get_resources(struct platform_= device *pdev, return ret; } =20 - pcie_ep->num_clks =3D devm_clk_bulk_get_all(dev, &pcie_ep->clks); - if (pcie_ep->num_clks < 0) { - dev_err(dev, "Failed to get clocks\n"); - return pcie_ep->num_clks; - } - - pcie_ep->core_reset =3D devm_reset_control_get_exclusive(dev, "core"); - if (IS_ERR(pcie_ep->core_reset)) - return PTR_ERR(pcie_ep->core_reset); - pcie_ep->reset =3D devm_gpiod_get(dev, "reset", GPIOD_IN); if (IS_ERR(pcie_ep->reset)) return PTR_ERR(pcie_ep->reset); @@ -652,9 +661,22 @@ static int qcom_pcie_ep_get_resources(struct platform_= device *pdev, if (IS_ERR(pcie_ep->phy)) ret =3D PTR_ERR(pcie_ep->phy); =20 - pcie_ep->icc_mem =3D devm_of_icc_get(dev, "pcie-mem"); - if (IS_ERR(pcie_ep->icc_mem)) - ret =3D PTR_ERR(pcie_ep->icc_mem); + /* Populate resources if Endpoint controller is not firmware-managed */ + if (!(pcie_ep->cfg && pcie_ep->cfg->firmware_managed)) { + pcie_ep->num_clks =3D devm_clk_bulk_get_all(dev, &pcie_ep->clks); + if (pcie_ep->num_clks < 0) { + dev_err(dev, "Failed to get clocks\n"); + return pcie_ep->num_clks; + } + + pcie_ep->core_reset =3D devm_reset_control_get_exclusive(dev, "core"); + if (IS_ERR(pcie_ep->core_reset)) + return PTR_ERR(pcie_ep->core_reset); + + pcie_ep->icc_mem =3D devm_of_icc_get(dev, "pcie-mem"); + if (IS_ERR(pcie_ep->icc_mem)) + ret =3D PTR_ERR(pcie_ep->icc_mem); + } =20 return ret; } @@ -874,6 +896,12 @@ static int qcom_pcie_ep_probe(struct platform_device *= pdev) =20 platform_set_drvdata(pdev, pcie_ep); =20 + pm_runtime_get_noresume(dev); + pm_runtime_set_active(dev); + ret =3D devm_pm_runtime_enable(dev); + if (ret) + return ret; + ret =3D qcom_pcie_ep_get_resources(pdev, pcie_ep); if (ret) return ret; @@ -894,6 +922,12 @@ static int qcom_pcie_ep_probe(struct platform_device *= pdev) goto err_disable_irqs; } =20 + ret =3D pm_runtime_put_sync(dev); + if (ret < 0) { + dev_err(dev, "Failed to disable endpoint device: %d\n", ret); + goto err_disable_irqs; + } + pcie_ep->debugfs =3D debugfs_create_dir(name, NULL); qcom_pcie_ep_init_debugfs(pcie_ep); =20 @@ -930,7 +964,15 @@ static const struct qcom_pcie_ep_cfg cfg_1_34_0 =3D { .disable_mhi_ram_parity_check =3D true, }; =20 +static const struct qcom_pcie_ep_cfg cfg_1_34_0_fw_managed =3D { + .hdma_support =3D true, + .override_no_snoop =3D true, + .disable_mhi_ram_parity_check =3D true, + .firmware_managed =3D true, +}; + static const struct of_device_id qcom_pcie_ep_match[] =3D { + { .compatible =3D "qcom,pcie-ep-sa8255p", .data =3D &cfg_1_34_0_fw_manage= d}, { .compatible =3D "qcom,sa8775p-pcie-ep", .data =3D &cfg_1_34_0}, { .compatible =3D "qcom,sdx55-pcie-ep", }, { .compatible =3D "qcom,sm8450-pcie-ep", }, --=20 2.25.1