* MSM PCI express root complex ========= Main node ========= - compatible: Usage: required Value type: Definition: Should be "qcom,pci-msm" - reg: Usage: required Value type: Definition: Register ranges as listed in the reg-names property - reg-names: Usage: required Value type: Definition: Should contain: - "parf" MSM specific registers - "phy" PCIe PHY registers - "dbi" DesignWare PCIe registers - "elbi" External local bus interface registers - "iatu" Internal translation unit registers - "config" PCIe device configuration space - "io" PCIe device I/O registers - "bars" PCIe device base address registers - "tcsr" (opt) PCIe clock scheme register - "rumi" (opt) PCIe RUMI register - cell-index: Usage: required Value type: Definition: defines root complex ID. - linux,pci-domain: Usage: required Value type: Definition: As specified in pci.txt - #address-cells: Usage: required Value type: Definition: Should be 3. As specified in designware-pcie.txt - #size-cells: Usage: required Value type: Definition: Should be 2. As specified in designware-pcie.txt - ranges: Usage: required Value type: Definition: As specified in designware-pcie.txt - interrupt-parent: Usage: required Value type: Definition: Phandle of the interrupt controller that services interrupts for this device - interrupts: Usage: required Value type: Definition: PCIe root complex related interrupts - interrupt-names: Usage: required Value type: Definition: Should contain - "int_msi" - "int_a" - "int_b" - "int_c" - "int_d", - "int_global_int" - #interrupt-cells: Usage: required Value type: Definition: Should be 1. As specified in designware-pcie.txt - interrupt-map-mask: Usage: required Value type: Definition: As specified in designware-pcie.txt - interrupt-map: Usage: required Value type: Definition: As specified in designware-pcie.txt - msi-parent: Usage: required Value type: Definition: As specified in pci-msi.txt - -gpio: Usage: required Value type: Definition: List of phandle and GPIO specifier pairs. Should contain: - "perst-gpio" PCIe reset signal line - "wake-gpio" PCIe wake signal line - "qcom,ep-gpio" (opt) PCIe endpoint specific signal line - pinctrl-names: Usage: required Value type: Definition: Name of pin configuration groups. Should contain: - "default" - "sleep" (opt) - pinctrl-: Usage: required Value type: Definition: As specified in pinctrl-bindings.txt - -supply: Usage: required Value type: Definition: Phandle to PCIe core and PHY power supply. Should contain: - "gdsc-vdd-supply" PCIe power domain control - "vreg-1.8-supply" power supply for PCIe PHY - "vreg-0.9-supply" power supply for PCIe PHY - "vreg-cx-supply" power supply for PCIe core - "vreg-3.3-supply" (opt) power supply for PCIe endpoint - qcom,-voltage-level: Usage: required Value type: Definition: List of max/min voltage(uV) and optimal current(uA) tuple for power supply - qcom,bw-scale: Usage: optional Value type: Definition: List of CX voltage corner and rate change clock frequency pair for each PCIe GEN speed - qcom,msm-bus,: Usage: required Value type: Definition: As specified in msm_bus.txt - clocks: Usage: required Value type: Definition: List of phandle and clock specifier pairs as listed in clock-names property - clock-names: Usage: required Value type: Definition: List of clock names that corresponds with listed "clocks" - max-clock-frequency-hz: Usage: optional Value type: Definition: List of clock frequencies for each PCIe clock. Only need to specify the ones that needs to be changed - resets: Usage: required Value type: Definition: List of phandle and reset specifier pairs as listed in reset-names property - reset-names: Usage: required Value type: Definition: Should contain: - "pcie__core_reset" Core reset - "pcie__phy_reset" PHY reset Following resets are optional and required only if driver must perform link recovery post linkdown: - "pcie__link_down_reset" Core linkdown reset - "pcie__phy_nocsr_com_phy_reset" PHY no-csr reset - qcom,smmu-sid-base: Usage: optional Value: Definition: Base SID for PCIe - iommu-map: Usage: optional. Required if qcom,smmu-sid-base is defined Value type: Definition: As defined in pci-iommu.txt. Should contain: - - qcom,target-link-speed: Usage: optional Value type: Definition: Override maximum GEN speed. Options: - 0x1 GEN 1 - 0x2 GEN 2 - 0x3 GEN 3 - qcom,link-check-max-count Usage: optional Value type: Definition: Max number of retries for link training. Delay between each check is 5ms - qcom,boot-option: Usage: optional Value type: Definition: Controls PCIe bus driver boot sequence. Options: - BIT(0) PCIe bus driver will not start enumeration during its probe. Clients will control when PCIe bus driver should do enumeration - BIT(1) PCIe bus driver will not start enumeration if it receives a WAKE interrupt - qcom,drv-supported: Usage: optional Value type: Definition: Direct resource vote (DRV) is supported. APPS PCIe root complex driver can hand off PCIe resources to another subsystem. This will allow APPS to enter lower power modes while keeping PCIe core, PHY, and link funtional. In addition, the system can enter CX power collapse once the DRV subsystem removes its PCIe votes. - qcom,drv-l1ss-timeout-us: Usage: optional depends on qcom,drv-supported Value type: Definition: This timeout determines when DRV subsystem will put the link into l1ss sleep while idle in l1ss. If this is omitted, the default timeout is 100ms. - qcom,use-19p2mhz-aux-clk: Usage: optional Value type: Definition: Set PCIe AUX clock frequency to 19.2MHz - qcom,common-clk-en: Usage: optional Value type: Definition: Support common clock configuration - qcom,clk-power-manage-en: Usage: optional Value type: Definition: Support clock power management - qcom,n-fts: Usage: optional Value type: Definition: Number of fast training sequences sent when the link transitions from L0s to L0 - qcom,no-l0s-supported: Usage: optional Value type: Definition: L0s is not supported - qcom,no-l1-supported: Usage: optional Value type: Definition: L1 is not supported - qcom,no-l1ss-supported: Usage: optional Value type: Definition: L1 sub-state (L1ss) is not supported - qcom,no-aux-clk-sync: Usage: optional Value type: Definition: The AUX clock is not synchronous to the Core clock to support L1ss - qcom,l1-2-th-scale: Usage: optional Value type: Definition: Determines the multiplier for L1.2 LTR threshold value - 0 1ns - 1 32ns - 2 1us - 3 32us - 4 1ms - 5 32ms - qcom,l1-2-th-value: Usage: optional Value type: Definition: L1.2 LTR threshold value to be multipled with scale to define L1.2 latency tolerance reporting (LTR) - qcom,slv-addr-space-size: Usage: required Value type: Definition: Memory block size dedicated to PCIe root complex - qcom,wr-halt-size: Usage: optional Value type: Definition: Exponent (base 2) that determines the data size(bytes) that PCIe core will halt for each write - qcom,tlp-rd-size: Usage: optional Value type: Definition: Determines the maximum read request size(bytes). Options: - 0 128 - 1 256 - 2 512 - 3 1K - 4 2K - 5 4K - qcom,cpl-timeout: Usage: optional Value type: Definition: Determines the timeout range PCIe root complex will send out a completion packet if no ACK is seen for TLP. Options: - BIT(0) 50us to 10ms - BIT(1) 10ms to 250ms - BIT(2) 250ms to 4s - BIT(3) 4s to 64s - qcom,perst-delay-us-min: Usage: optional Value type: Definition: Minimum allowed time(us) to sleep after asserting or de-asserting PERST GPI. - qcom,perst-delay-us-max: Usage: optional Value type: Definition: Maximum allowed time(us) to sleep after asserting or de-asserting PERST GPIO - qcom,ep-latency: Usage: optional Value type: Definition: The latency(ms) between when PCIe PHY is up and PERST is de-asserted. This guarantees the 100MHz clock is available for the PCIe devices - qcom,switch-latency: Usage: optional Definition: The latency(ms) between when PCIe link is up and before any device over the switch is accessed - qcom,core-preset: Usage: optional Definition: Determines how aggressive the PCIe PHY equalization is for Gen3 cores. The following are recommended settings: - short channels: 0x55555555 (default) - long channels: 0x77777777 - qcom,pcie-phy-ver: Usage: required Value type: Definition: States the PCIe PHY version - qcom,phy-status-offset: Usage: required Value type: Definition: Offset from PCIe PHY base to check if PCIe PHY status - qcom,phy-status-bit: Usage: required Value type: Definition: BIT to check PCIe PHY status - qcom,phy-power-down-offset: Usage: required Value type: Definition: Offset from PCIe PHY base to control PHY power state - qcom,phy-sequence: Usage: required Value type: Definition: PCIe PHY initialization sequence - qcom,config-recovery: Usage: optional Value type : Definition: Enable to notify the client driver for recovery when config space is not accessible ============== Root port node ============== Root port are defined as subnodes of the PCIe controller node - reg: Usage: required Value type: Definition: First cell is devfn, which is determined by pci bus topology. Assign the other cells 0 since they are not used - qcom,iommu-cfg: Usage: optional Value type: Definition: Defines PCIe root port SMMU configuration. Options: - BIT(0) Indicates if SMMU is present - BIT(1) Set IOMMU attribute S1_BYPASS - BIT(2) Set IOMMU attribute FAST - BIT(3) Set IOMMU attribute ATOMIC - BIT(4) Set IOMMU attribute FORCE COHERENT - qcom,iommu-range: Usage: optional Value type: Array of Definition: Pair of values describing iova base and size to allocate ======= Example ======= pcie0: qcom,pcie@1c00000 { compatible = "qcom,pci-msm"; reg = <0x1c00000 0x4000>, <0x1c04000 0x1000>, <0x60000000 0xf1d>, <0x60000f20 0xa8>, <0x60001000 0x1000>, <0x60100000 0x100000>, <0x60200000 0x100000>, <0x60300000 0x3d00000>; reg-names = "parf", "phy", "dm_core", "elbi", "iatu", "conf", "io", "bars", "tcsr", "rumi"; cell-index = <0>; device_type = "pci"; linux,pci-domain = <0>; #address-cells = <3>; #size-cells = <2>; ranges = <0x01000000 0x0 0x60200000 0x60200000 0x0 0x100000>, <0x02000000 0x0 0x60300000 0x60300000 0x0 0x3d00000>; interrupt-parent = <&pcie0>; interrupts = <0 1 2 3 4 5>; interrupt-names = "int_msi", "int_a", "int_b", "int_c", "int_d", "int_global_int", #interrupt-cells = <1>; interrupt-map-mask = <0 0 0 0xffffffff>; interrupt-map = <0 0 0 0 &intc 0 141 0 0 0 0 1 &intc 0 149 0 0 0 0 2 &intc 0 150 0 0 0 0 3 &intc 0 151 0 0 0 0 4 &intc 0 152 0 0 0 0 5 &intc 0 140 0>; msi-parent = <&pcie0_msi>; perst-gpio = <&tlmm 35 0>; wake-gpio = <&tlmm 37 0>; qcom,ep-gpio = <&tlmm 94 0>; pinctrl-names = "default", "sleep"; pinctrl-0 = <&pcie0_clkreq_default &pcie0_perst_default &pcie0_wake_default>; pinctrl-1 = <&pcie0_clkreq_sleep &pcie0_perst_sleep &pcie0_wake_sleep>; gdsc-vdd-supply = <&pcie_0_gdsc>; vreg-1.8-supply = <&pm8150l_l3>; vreg-0.9-supply = <&pm8150_l5>; vreg-cx-supply = <&VDD_CX_LEVEL>; vreg-3.3-supply = <&pm8150_l1>; qcom,vreg-1.8-voltage-level = <1800000 1800000 1000>; qcom,vreg-0.9-voltage-level = <950000 950000 24000>; qcom,vreg-cx-voltage-level = ; qcom,bw-scale = ; /* Gen3 */ qcom,msm-bus,name = "pcie0"; qcom,msm-bus,num-cases = <2>; qcom,msm-bus,num-paths = <1>; qcom,msm-bus,vectors-KBps = <45 512 0 0>, <45 512 500 800>; clocks = <&clock_gcc GCC_PCIE_0_PIPE_CLK>, <&clock_rpmh RPMH_CXO_CLK>, <&clock_gcc GCC_PCIE_0_AUX_CLK>, <&clock_gcc GCC_PCIE_0_CFG_AHB_CLK>, <&clock_gcc GCC_PCIE_0_MSTR_AXI_CLK>, <&clock_gcc GCC_PCIE_0_SLV_AXI_CLK>, <&clock_gcc GCC_PCIE_0_CLKREF_CLK>, <&clock_gcc GCC_PCIE_0_SLV_Q2A_AXI_CLK>, <&clock_gcc GCC_AGGRE_NOC_PCIE_TBU_CLK>, <&clock_gcc GCC_PCIE0_PHY_REFGEN_CLK>, <&clock_gcc GCC_PCIE_PHY_AUX_CLK>; clock-names = "pcie_0_pipe_clk", "pcie_0_ref_clk_src", "pcie_0_aux_clk", "pcie_0_cfg_ahb_clk", "pcie_0_mstr_axi_clk", "pcie_0_slv_axi_clk", "pcie_0_ldo", "pcie_0_slv_q2a_axi_clk", "pcie_tbu_clk", "pcie_phy_refgen_clk", "pcie_phy_aux_clk"; max-clock-frequency-hz = <0>, <0>, <19200000>, <0>, <0>, <0>, <0>, <0>, <0>, <0>, <100000000>, <0>; resets = <&clock_gcc GCC_PCIE_0_BCR>, <&clock_gcc GCC_PCIE_0_PHY_BCR>; reset-names = "pcie_0_core_reset", "pcie_0_phy_reset"; qcom,smmu-sid-base = <0x1e00>; iommu-map = <0x0 &apps_smmu 0x1e00 0x1>, <0x100 &apps_smmu 0x1e01 0x1>; qcom,target-link-speed = <0x2>; qcom,link-check-max-count = <40> /* 200ms */ qcom,boot-option = <0x1>; qcom,drv-supported; qcom,use-19p2mhz-aux-clk; qcom,common-clk-en; qcom,clk-power-manage-en; qcom,n-fts = <0x50>; qcom,no-l0s-supported; qcom,no-l1-supported; qcom,no-l1ss-supported; qcom,no-aux-clk-sync; qcom,slv-addr-space-size = <0x1000000>; /* 16MB */ qcom,wr-halt-size = <0xa>; /* 1KB */ qcom,tlp-rd-size = <0x5>; /* 4KB */ qcom,cpl-timeout = <0x2>; /* 10ms to 250ms */ qcom,perst-delay-us-min = <10>; qcom,perst-delay-us-max = <15>; qcom,ep-latency = <20>; qcom,switch-latency = <25>; qcom,core-preset = <0x55555555> /* short channel */ qcom,pcie-phy-ver = <0x2101>; /* v2 version 1.01 */ qcom,phy-status-offset = <0x814>; qcom,phy-status-bit = <6>; qcom,phy-power-down-offset = <0x840>; qcom,phy-sequence = <0x0840 0x03 0x0 0x0094 0x08 0x0 0x0154 0x34 0x0 0x016c 0x08 0x0 0x0058 0x0f 0x0 0x00a4 0x42 0x0 0x0110 0x24 0x0 0x0800 0x00 0x0 0x0844 0x03 0x0>; pcie0_rp: pcie0_rp { reg = <0x0 0x0 0x0 0x0 0x0>; qcom,iommu-cfg = <0x3> /* SMMU PRESENT. SET S1 BYPASS */ qcom,iommu-range = <0x0 0x10000000 0x0 0x40000000>; };