[PATCH v9 0/6] Add QMP PCIe Multi-PHY support
Qiang Yu <[email protected]>
| Newsgroups | org.kernel.vger.linux-devicetree,org.infradead.lists.linux-phy,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Hi all, Some QMP PCIe PHY hardware blocks can be configured through a link-mode register into different link topologies, such as a single wide link, or multiple independent narrower links (e.g. x8 or x4+x4 mode on the Glymur PCIe3 PHY). Earlier revisions tried to extend the existing single-instance phy-qcom-qmp-pcie.c driver to cover this hardware. That added a large amount of conditional, multi-PHY logic to a driver whose data model assumes one PHY per node. This series adds a dedicated PHY provider driver, phy-qcom-qmp-pcie-multiphy.c: A single PHY provider node describes the shared hardware block. A new "qcom,link-mode" property points at the TCSR syscon register that reports the active topology; the driver reads it once at probe. #phy-cells = <1> lets consumers pass a logical PHY index to obtain their sub-PHY. Match data is indexed by link mode, and each link mode has its own array of per-PHY config tables, so one shared provider exposes a different set of logical PHYs depending on the active mode. The driver inherits the PHY settings and link mode already programmed by firmware, so only the no-CSR reset is used, and no PHY setting tables or related structures are defined. Each sub-PHY owns its register regions and power domain, so in a bifurcated mode the links are brought up, and powered independently. The driver is implemented and validated on Glymur, and is intended to be extensible to other multi-mode QMP PCIe PHYs. Thanks, Qiang Signed-off-by: Qiang Yu <[email protected]> --- Changes in v9: - Drop the redundant default PHY_QCOM_QMP and fix minor style nits in the driver (Vinod). - Add reviewed-by tag. - Link to v8: https://lore.kernel.org/all/[email protected]/ Changes in v8: - driver: drop the always-true fixed_rate check, the impossible num_pipe_outputs < 0 fallback, and the unused pipe_clk_fixed field; collapse qmp_pcie_read_link_mode() to return regmap_read() directly. - glymur.dtsi: use GIC_SPI instead of a literal 0 in pcie3a interrupt-map. - Pick up Konrad's Reviewed-by on patches 2-5. - Link to v7: https://lore.kernel.org/all/[email protected]/ Changes in v7: - Pick up Mani's Reviewed-by (driver), Ack (binding) and Krzysztof's Reviewed-by (binding). - binding: fix commit message to reference the actual filename. - driver: rename Kconfig title to "Multi PHY" and driver to qcom-qmp-pcie-multiphy; PHY_INIT_COMPLETE_TIMEOUT -> _US; - Print errno in error messages; reverse-xmas-tree probe locals; handle NULL power-domain with IS_ERR_OR_NULL()/-ENODATA. - glymur.dtsi: reword subject to adding PCIe3 PHY and PCIe3a controller nodes; node -> pcie@1c10000; drop num-lanes; add pciclass to pcie3a_port0; fix 32-bit MEM range identity mapping. - Link to v6: https://lore.kernel.org/all/[email protected]/ Changes in v6: - Remove dependency description since it was merged - Rename the binding to qcom,glymur-qmp-gen5x8-pcie-phy.yaml - Drop redundant minItems on reg, clocks, power-domains, and resets - Rename phy_a/phy_b reset-names and power-domain-names entries to port_a/port_b (port_a_nocsr/port_b_nocsr for the no-CSR resets) match reg-names. - Add a description for #phy-cells explaining the sub-PHY index meaning. - Drop the unused "pcie3_phy:" label from the binding example. - Drop the year from the driver's copyright header. - Fix a pm_runtime refcount imbalance on the qmp_pcie_pd_power_on() error path by switching to pm_runtime_resume_and_get(). - Split the DTS patch into a SoC-level patch and a board-level patch. - Add two patches for Mahua, which only has PCIe3b wired up and no shared Gen5x8 PHY block. - Link to v5: https://lore.kernel.org/all/[email protected]/ Changes in v5: - Split the Glymur multi PHY binding out of the shared qcom,sc8280xp-qmp-pcie-phy.yaml into its own schema. - Reworked phy-qcom-qmp-pcie-multiphy.c into a standalone driver instead of extending phy-qcom-qmp-pcie.c with conditional multi-PHYlogic. - Dropped the "link mode value" cell from qcom,link-mode. - Removed the QMP_PHY_SELECTOR_0/1 dt-bindings macros. - Link to v4: https://lore.kernel.org/all/[email protected]/ Changes in v4: - Replaced the static bifurcation probe model with a link-mode architecture: the active topology (x8 or x4+x4) is selected via a new "qcom,link-mode" DT property and written to a TCSR register at power-on. This replaces v3 patches 4 and 5 with four new patches (driver refactor, secondary PHY clock/reset lists, link-mode probe infrastructure, and Glymur config). - Updated dt-bindings to describe "qcom,link-mode", #phy-cells = <1>, per-mode validation rules, and added a new header with QMP_PHY_SELECTOR_* and QMP_PCIE_GLYMUR_MODE_* macros. - Patches 2 and 3 (multiple power-domains, multiple nocsr resets) are unchanged from v3. - Link to v3: https://lore.kernel.org/r/20260412-glymur_gen5x8_phy_0413-v3-0-affcebc16b8b@oss.qualcomm.com Changes in v3: - Add description of each power-domain. - Add 64bit prefetchable memory range required by some EPs eg. AI100 ultra. - Move PCIe3a after PCIe3b and move PCIe3a PHY before PCIe3b PHY. - Link to v2: https://lore.kernel.org/all/20260323-glymur_gen5x8_phy_0323-v2-0-ce0fc07f0e52@oss.qualcomm.com/ Changes in v2: - Remove pd_list from qmp_pcie struct as it is not used in phy driver. - align clk-names on " - Link to v1: https://lore.kernel.org/all/[email protected]/ To: Vinod Koul <[email protected]> To: Neil Armstrong <[email protected]> To: Rob Herring <[email protected]> To: Krzysztof Kozlowski <[email protected]> To: Conor Dooley <[email protected]> To: Qiang Yu <[email protected]> To: Manivannan Sadhasivam <[email protected]> To: Philipp Zabel <[email protected]> To: Bjorn Andersson <[email protected]> To: Konrad Dybcio <[email protected]> Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] --- Qiang Yu (6): dt-bindings: phy: qcom: Add Glymur QMP PCIe multiple link-mode PHY phy: qcom: qmp-pcie: Add QMP PCIe Multi-PHY driver arm64: dts: qcom: glymur: Add PCIe3 PHY and PCIe3a controller nodes arm64: dts: qcom: glymur-crd: Add PHY supplies for pcie3_phy arm64: dts: qcom: mahua: Replace pcie3a/pcie3_phy with dedicated pcie3b_phy arm64: dts: qcom: mahua-crd: Add PHY supplies for pcie3b_phy .../phy/qcom,glymur-qmp-gen5x8-pcie-phy.yaml | 177 +++++ arch/arm64/boot/dts/qcom/glymur-crd.dts | 8 + arch/arm64/boot/dts/qcom/glymur.dtsi | 336 +++++++++- arch/arm64/boot/dts/qcom/mahua-crd.dts | 5 + arch/arm64/boot/dts/qcom/mahua.dtsi | 89 +++ drivers/phy/qualcomm/Kconfig | 10 + drivers/phy/qualcomm/Makefile | 1 + drivers/phy/qualcomm/phy-qcom-qmp-pcie-multiphy.c | 743 +++++++++++++++++++++ 8 files changed, 1367 insertions(+), 2 deletions(-) --- base-commit: ea2bff00da89d7767d677bb68470130ba96f4928 change-id: 20260807-glymur_linkmode_0807-727b512611a1 Best regards, -- Qiang Yu <[email protected]>