PCIe
概述
产品版本
芯片名称 | 内核版本 |
---|---|
RK1808 | 4.4,4.19 |
RK3528 | 4.19,5.10,6.1 |
RK3562 | 5.10,6.1 |
RK3566/RK3568 | 4.19,5.10,6.1 |
RK3576 | 6.1 |
RK3588 | 5.4,5.10,6.1 |
说明:RK3399使用不同的PCIe控制器IP,不在本文档覆盖范围,请参考《Rockchip_RK3399_Developer_Guide_PCIe_CN》。
读者对象
本文档(本指南)主要适用于以下工程师:
- 技术支持工程师
- 软件开发工程师
1. 芯片资源介绍
1.1 RK1808
资源 | 模式 | 支持lane | 支持DMA | 支持MMU | 支持ASPM | 备注 |
---|---|---|---|---|---|---|
PCIe Gen2 | RC | x2 lane | 否 | 否 | L0s/L1 | 内部时钟 |
1.2 RK3528
资源 | 模式 | 支持lane拆分 | 支持DMA | 支持MMU | 支持ASPM | 备注 |
---|---|---|---|---|---|---|
PCIe Gen2 x1 | RC | 否 | 否 | 否 | ALL | 内部时钟 |
1.3 RK3562
资源 | 模式 | 支持lane拆分 | 支持DMA | 支持MMU | 支持ASPM | 备注 |
---|---|---|---|---|---|---|
PCIe Gen2 x1 | RC | 否 | 否 | 否 | ALL | 内部时钟 |
1.4 RK3566
资源 | 模式 | 支持lane拆分 | 支持DMA | 支持MMU | 支持ASPM | 备注 |
---|---|---|---|---|---|---|
PCIe Gen2 x1 | RC | 否 | 否 | 否 | L0s/L1 | 内部时钟 |
1.5 RK3568
1.5.1 控制器
资源 | 模式 | lane拆分 | 支持DMA | 支持MMU | 支持ASPM | 备注 |
---|---|---|---|---|---|---|
PCIe Gen2 | RC | 1 lane only | 否 | 否 | L0s/L1 | 内部时钟 |
PCIe Gen3 | RC/EP | 1 lane RC + 1 lane RC | 2个读Channel + 2个写Channel | 否 | ALL | 支持pcie30phy |
PCIe Gen3 | RC | 1 lane | 否 | 否 | ALL | 支持pcie30phy |
1.5.2 PHY
资源 | dts节点 | 参考时钟 | 拆分 | 是否combo |
---|---|---|---|---|
pcie30phy | phy@fe8c0000 | 外部 | 2Lane:默认 | PCIe专用 |
combphy2_psq | phy@fe840000 | 内部/外部 | 1Lane + 1Lane:rockchip,bifurcation | combo |
说明:pcie30phy 2Lane默认配置为PCIe Gen3 x 2 lane,拆分后“PCIe Gen3 x 2 lane”和“PCIe Gen3 x 1 lane”控制器各1Lane。
1.6 RK3576
资源 | 模式 | 支持lane拆分 | 支持DMA | 支持MMU | 支持ASPM | 备注 |
---|---|---|---|---|---|---|
PCIe Gen2 x1 | RC | 否 | 否 | 是 | ALL | 内部时钟 |
1.7 RK3588
说明: RK3588共有5个PCIe控制器,硬件IP一致,配置不同。其中一个4Lane DM模式可支持作为EP使用,另外2Lane和3个1Lane控制器仅能作为RC使用。 RK3588有两种PCIe PHY,一种为pcie3.0PHY,含2个Port共4个Lane;另一种是pcie2.0 PHY,每 个为2.0 1Lane,与SATA和USB combo使用。 pcie3.0 PHY的4Lane可根据需求拆分使用,拆分后需合理配置对应的控制器,所有配置在DTS中完成,无需修改驱动。
使用限制:
- pcie30phy拆分后,pcie30x4控制器,工作于2Lane模式时只能固定配合pcie30phy的port0,工作 于1Lane模式时,只能固定配合pcie30phy的port0lane0;
- pcie30phy拆分后,pcie30x2控制器,工作于2Lane模式时只能固定配合pcie30phy的port1,工作 于1Lane模式时,只能固定配合pcie30phy的port1lane0;
- pcie30phy拆分为4个1Lane,pcie3phy的port0lane1只能固定配合pcie2x1l0控制器,pcie3phy的 port1lane1只能固定配合pcie2x1l1控制器;
- pcie30x4控制器工作于EP模式,可以使用4Lane模式,或者2Lane模式使用pcie30phy的port0, pcie30phy的port1中2lane可以作为RC配合其他控制器使用。默认使用common clock作为 reference clock时,无法实现pcie30phy port0的lane0工作于EP模式,lane1工作于RC模式配合其 他控制器使用,因为Port0的两个lane是共用一个输入的reference clock,RC和EP同时使用clock可 能会有冲突。
- RK3588 pcie30phy 如果只使用其中一个port,另一个port也需要供电,refclk等其他信号可接地。
1.7.1 控制器
资源 | 模式 | dts节点 | 可用phy | 内部DMA | 支持ASPM | 支持MMU |
---|---|---|---|---|---|---|
PCIe Gen3 x4 | RC/EP | pcie3x4: pcie@fe150000 | pcie30phy | 2个读Channel + 2个写Channel | ALL | 是 |
PCIe Gen3 x2 | RC | pcie3x2: pcie@fe160000 | pcie30phy | 否 | ALL | 是 |
PCIe Gen3 x1 | RC | pcie2x1l0: pcie@fe170000 | pcie30phy, combphy1_ps | 否 | ALL | 是 |
PCIe Gen3 x1 | RC | pcie2x1l1: pcie@fe180000 | pcie30phy, combphy2_psu | 否 | ALL | 是 |
PCIe Gen3 x1 | RC | pcie2x1l2: pcie@fe190000 | combphy0_ps | 否 | ALL | 是 |
1.7.2 PHY
资源 | dts节点 | 参考时钟 | 拆分 | 是否combo |
---|---|---|---|---|
pcie30phy | phy@fee80000 | 外部 | 4Lane:PHY_MODE_PCIE_AGGREGATION 2Lane+2Lane:PHY_MODE_PCIE_NANBNB 2Lane+1Lane+1Lane:PHY_MODE_PCIE_NANBBI 1Lane4:PHY_MODE_PCIE_NABIBI | PCIe专用 |
combphy0_ps | phy@fee00000 | 内部/外部 | - | 与SATA combo |
combphy1_ps | phy@fee10000 | 内部/外部 | - | 与SATA combo |
combphy2_psu | phy@fee20000 | 内部/外部 | - | 与SATA/USB3 combo |
1.8 RK3588S
说明:RK3588S的PCIe较为简单,有2个1Lane控制器和2个可用于pcie 2.0的1Lane comboPHY,是一一对应关系。
1.8.1 控制器
资源 | 模式 | dts节点 | 可用phy | 内部DMA | 支持ASPM | 支持MMU |
---|---|---|---|---|---|---|
PCIe Gen3 x1 | RC | pcie2x1l1: pcie@fe180000 | combphy2_psu | 否 | ALL | 是 |
PCIe Gen3 x1 | RC | pcie2x1l2: pcie@fe190000 | combphy0_ps | 否 | ALL | 是 |
1.8.2 PHY
资源 | dts节点 | 参考时钟 | 拆分 | 是否combo |
---|---|---|---|---|
combphy0_ps | phy@fee00000 | 内部/外部 | - | 与SATA combo |
combphy2_psu | phy@fee20000 | 内部/外部 | - | 与SATA/USB3 combo |
2. DTS 配置
2.1 配置要点
pcie的配置大部分是固定的,需要在板级dts配置的变量并不多,参考以下要点进行配置即可:
- 控制器/PHY使能:根据原理图选择使能正确的控制器和PHY,注意控制器的index和phy的index不一定是顺序匹配的。
- 控制器:部分控制器(如RK3588的pcie2x1l0和pcie2x1l1)有多个phy可选,需按方案设计正确配置“phys”。
- 控制器:作为RC通常需要配置"reset-gpios",对应原理图PCIE的"PERSTn"信号。
- 控制器:作为RC可 能需要配置"vpcie3v3-supply",对应PCIE的"PWREN"gpio信号控制的fixed regulator。
- 控制器:作为EP使用时,需要修改"compatible"为EP模式对应字串。
- PHY:pcie30phy共4个lane,可拆分使用,需根据方案正确配置"rockchip,pcie30-phymode"模式。
2.2 RK1808 DTS配置
RK1808的dts配置,所有的实现模式都在SDK的evb代码中有范例可以参考,可以依照下面表中的模式选 择匹配的内容拷贝到产品板级dts中使用。
资源 | 模式 | 参考配置 | 控制器节点 | PHY节点 | 备注 |
---|---|---|---|---|---|
PCIe Gen2 x2 lane | RC | rk1808-evb.dtsi | pcie0 | combphy | 需要关闭usbdrd_dwc3和usbdrd3 |
PCIe Gen2 x2 lane | EP | rk1808-evb.dtsi的pcie0节点 | |||
添加compatible = "rockchip,rk1808-pcie-ep","snps,dw-pcie"; | pcie0 | combphy | 需要关闭usbdrd_dwc3和usbdrd3 |
2.3 RK3528 DTS配置
RK3528的dts配置,所有的实现模式都在SDK的evb代码中有范例可以参考,可以依照下面表中的模式选 择匹配的内容拷贝到产品板级dts中使用
资源 | 模式 | 参考配置 | 控制器节点 | PHY节点 |
---|---|---|---|---|
PCIe Gen2 x1 lane | RC | rk3528-evb2-ddr3-v10.dtsi | pcie2x1 | combphy_pu |
2.4 RK356X DTS配置
RK356x的dts配置,所有的实现模式都在SDK的evb代码中有范例可以参考,可以依照下面表中的模式选 择匹配的内容拷贝到产品板级dts中使用
2.4.1 RK3562 dts
资源 | 模式 | 参考配置 | 控制器节点 | PHY节点 |
---|---|---|---|---|
PCIe Gen2 x1 lane | RC | rk3562-evb1-lp4x-v10.dtsi | pcie2x1 | combphy_pu |
2.4.2 RK3566 dts
资源 | 模式 | 参考配置 | 控制器节点 | PHY节点 |
---|---|---|---|---|
PCIe Gen2 x1 lane | RC | rk3566-evb1-ddr4-v10.dtsi | pcie2x1 | combphy2_psq |
2.4.3 RK3568 dts
资源 | 模式 | 参考配置 | 控制器节点 | PHY节点 |
---|---|---|---|---|
PCIe Gen2 x1 lane | RC | rk3568-evb2-lp4x-v10.dtsi | pcie2x1 | combphy2_psq |
PCIe Gen3 x2 lane | RC | rk3568-evb1-ddr4-v10.dtsi | pcie3x2 | pcie30phy |
PCIe Gen3 拆分1 lane | RC | rk3568-evb6-ddr3-v10.dtsi | pcie3x2 | pcie30phy pcie3x1 |
PCIe Gen3 x2 lane | EP | rk3568-iotest-ddr3-v10.dts | pcie3x2 | pcie30phy |
2.4.4 RK3576 dts
资源 | 模式 | 参考配置 | 控制器节点 | PHY节点 |
---|---|---|---|---|
PCIe Gen2 x1 lane | RC | rk3576-test1.dtsi | pcie0 | combphy0_ps |
PCIe Gen2 x1 lane | RC | rk3576-test1.dtsi | pcie1 | combphy1_psu |
2.5 RK3588 DTS配置
RK3588的控制器和PHY较多,无法在SDK的evb代码中进行穷举所有组合,按配置要点进行配置即可, 这里给出几个典型范例供参考。
2.5.1 示例1 pcie3.0 4Lane RC + 2个pcie 2.0(comboPHY) (RK3588 evb1)
/ {
vcc3v3_pcie30: vcc3v3-pcie30 {
compatible = "regulator-fixed";
regulator-name = "vcc3v3_pcie30";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
enable-active-high;
gpios = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>;
startup-delay-us = <5000>;
vin-supply = <&vcc12v_dcin>;
};
};
&combphy1_ps {
status = "okay";
};
&combphy2_psu {
status = "okay";
};
&pcie2x1l0 {
phys = <&combphy1_ps PHY_TYPE_PCIE>;
reset-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;
status = "okay";
};
&pcie2x1l1 {
phys = <&combphy2_psu PHY_TYPE_PCIE>;
reset-gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&rtl8111_isolate>;
status = "okay";
};
&pcie30phy {
rockchip,pcie30-phymode = <PHY_MODE_PCIE_AGGREGATION>;
status = "okay";
};
&pcie3x4 {
reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
2.5.2 示例2 pcie3.0phy拆分2个2Lane RC, 3个PCIe 2.0 1Lane(comboPHY)
/ {
vcc3v3_pcie30: vcc3v3-pcie30 {
compatible = "regulator-fixed";
regulator-name = "vcc3v3_pcie30";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
enable-active-high;
gpios = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>;
startup-delay-us = <5000>;
vin-supply = <&vcc12v_dcin>;
};
};
&combphy0_ps {
status = "okay";
};
&combphy1_ps {
status = "okay";
};
&combphy2_psu {
status = "okay";
};
&pcie2x1l0 {
phys = <&combphy1_ps PHY_TYPE_PCIE>;
reset-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie2x1l1 {
phys = <&combphy2_psu PHY_TYPE_PCIE>;
reset-gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie2x1l2 {
reset-gpios = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie30phy {
rockchip,pcie30-phymode = <PHY_MODE_PCIE_NANBNB>;
status = "okay";
};
&pcie3x2 {
reset-gpios = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie3x4 {
num-lanes = <2>;
reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
2.5.3 示例3 pcie3.0phy拆分为4个1Lane, 1个使用PCIe 2.0 1 Lane(comboPHY)
须知
pcie2x1l0/pcie2x1l1
硬件上接入pcie3.0phy
对应TX/RX
信号,dts关闭combphy1_ps/combphy2_psu
节点。
参考代码
/ {
vcc3v3_pcie30: vcc3v3-pcie30 {
compatible = "regulator-fixed";
regulator-name = "vcc3v3_pcie30";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
enable-active-high;
gpios = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>;
startup-delay-us = <5000>;
vin-supply = <&vcc12v_dcin>;
};
};
&combphy0_ps {
status = "okay";
};
&pcie2x1l0 {
phys = <&pcie30phy>;
reset-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie2x1l1 {
phys = <&pcie30phy>;
reset-gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie2x1l2 {
reset-gpios = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie30phy {
rockchip,pcie30-phymode = <PHY_MODE_PCIE_NABIBI>;
status = "okay";
};
&pcie3x2 {
num-lanes = <1>;
reset-gpios = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie3x4 {
num-lanes = <1>;
reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
2.6 DTS property说明
2.6.1 控制器dts常用配置
-
compatible
- 可选配置项:设置PCIe接口使用的是RC模式还是EP模式。
- RK3568作为RC功能时:
compatible = "rockchip,rk3568-pcie", "snps,dw-pcie";
- RK3568作为EP功能时:
compatible = "rockchip,rk3568-pcie-ep", "snps,dw-pcie";
- RK1808、RK3588:将
rk3568
字段分别替换为rk1808
和rk3588
。
- RK3568作为RC功能时:
- 可选配置项:设置PCIe接口使用的是RC模式还是EP模式。
-
reset-gpios
- 必须配置项:设置PCIe接口的
PERST#
复位信号。- 示例:
reset-gpios = <&gpio3 13 GPIO_ACTIVE_HIGH>;
- 注意:如果将多个lane的PCIe接口拆分,每个节点需配置不同的
PERST#
信号线。
- 示例:
- 必须配置项:设置PCIe接口的
-
num-lanes
- 可选配置项:设置PCIe设备所使用的lane数量。
- 示例:
num-lanes = <4>;
- 默认配置在芯片级的dtsi中,建议按实际硬件配置。
- 示例:
- 可选配置项:设置PCIe设备所使用的lane数量。
-
max-link-speed
- 可选配置项:设置PCIe的带宽版本。
- 1表示Gen1,2表示Gen2,3表示Gen3。
- 示例:
max-link-speed = <2>;
- 原则上不需要每个板子配置,仅作为测试或降级手段。
- 可选配置项:设置PCIe的带宽版本。
-
status
- 必须配置项:在PCIe控制器节点和对应的phy节点中同时使能。
- 示例:
status = "okay";
- 示例:
- 必须配置项:在PCIe控制器节点和对应的phy节点中同时使能。
-
vpcie3v3-supply
- 可选配置项:用于配置 PCIe 外设的 3V3 供电(原则上我司的硬件参考原理图上将PCIe插槽的12V电源和 3V3电源合并控制,所以配置3v3的电源之后,12V电源一并控制)。如果板级针对 PCIe 外设的 3V3 需要 控制使能,则如范例所示定义一组对应的 regulator,regulator 的配置请参考 Documentation/devicetree/bindings/regulator/。 另需要特别注意,如果是PCIe3.0的控制器,一般需要外接100M晶振芯片,那么该晶振芯片的供电原则 上硬件设计与PCIe外设的3V3共用。所以配置了该项之后,除了确认外设3V3供电之外,还需要确认外置 晶振芯片的时钟是否输出正常。一般而言,外置晶振芯片需要一个稳定周期来输出时钟。因此请严格参 考时钟芯片的手册中规定的最小数值,并在留有测试余量的基础上,在电源节点中指定startup-delay-us 属性的数值。另外针对关闭电源后放电较慢的硬件设计,在电源节点中指定 off-on-delay-us 属性的数 值,保证上下电操作充分。以rk3568为例,详细范例可参考rk3568-evb1-ddr4-v10.dtsi文件中的 vcc3v3_pcie节点。
-
phys
- 可选配置项:用于配置控制器使用的phy的phandle引用,部分控制器可以路由到多个phy(如RK3588的
pcie2x1l0和pcie2x1l1),需要注意的是不同的phy引用方式可能有差异,comboPHY需要同时指定phy的
工作模式,具体如下:
- 示例:
phys = <&pcie30phy>;
phys = <&combphy1_ps PHY_TYPE_PCIE>;
- 示例:
- 可选配置项:用于配置控制器使用的phy的phandle引用,部分控制器可以路由到多个phy(如RK3588的
pcie2x1l0和pcie2x1l1),需要注意的是不同的phy引用方式可能有差异,comboPHY需要同时指定phy的
工作模式,具体如下:
-
rockchip,bifurcation
- 可选配置项:此为RK3568芯片特有配置。可以将pcie3x2的2个lane 拆成两个1个lane的控制器来使用。 具体的配置方法就是dts中pcie3x1和pcie3x2控制器节点和pcie30phy都使能,并且pcie3x2和pcie3x1节 点中都添加rockchip,bifurcation属性。可参考rk3568-evb6-ddr3-v10.dtsi。否则默认情况下,pcie3x1 控制器无法使用。
此时lane0是由pcie3x2控制器使用,lane1是由pcie3x1控制器使用,硬件布板上严格按照我司原理图。 另注意,此模式下两个1-lane的控制器必须同时工作在RC模式下。
另外需要特别注意,PCIe 3.0拆分成2个单lane后接两个不同外设,由于晶振及其电源是同一路控制。此 时请不要将vpcie3v3-supply配置给其中某一个控制器,否则会造成获取了3v3电压操作权限的这路控制 器干扰另一控制器所接的外设的正常初始化。此时应该将vpcie3v3-supply所对应的regulator配置成 regulator-boot-on和regulator-always-on
-
prsnt-gpios = <&gpio4 15 GPIO_ACTIVE_LOW>;
- 可选配置项:用于驱动识别是否存在外设以及相关外围电路,若检测到有效电平则跳过设备检测流程 。 根据PCIe电气化特性协议文档,此gpio为低电平时候表示有设备接入。若板子设计与此相反,可修改为 GPIO_ACTIVE_HIGH来标识高电平为有设备接入。该信号用于同套软件支持相同板型带PCIe3的产品和 不带PCIe3的产品,避免pcie控制器初始化时发生rcu stall的系统异常;
rockchip,perst-inactive-ms = <500>;
- 可选配置项:可选配置项:用于配置设备#PERST复位信号的复位时间,单位为毫秒。根据PCIe Express Card Electromechanical Spec要求,下游设备电源稳定到释放#PERST最小需求为100ms,不配置此项则RK 驱动默认配置了200ms。若仍不满足外设工作要求,可以酌情调整,以实测为准。
rockchip,s2r-perst-inactive-ms = <1>;
- 可选配置项:用于配置休眠唤醒时设备#PERST复位信号的复位时间,单位为毫秒。若不配置,它的数值 等同于 rockchip,perst-inactive-ms 的配置。如果外设在休眠期间不断电,以Wi-Fi为例,则休眠过程 中#PERST一直处于复位状态,因此唤醒过程中可以缩短#PERST复位信号的时间,甚至可以配置成0。
rockchip,wait-for-link-ms = <1>;
- 可选配置项:可选配置项:用于配置设备#PERST复位信号释放后的等待时间,单位为毫秒。此配置用于部分需要较长 时间进行内部初始化的外设,防止因其内部初始化较久而使得系统等待链接超时的情况发生。目前常见 的需要此配置的是FPGA和部分AI算力卡。
- supports-clkreq
- 可选配置项:仅在 RC mode 下有效,请确认已配置 CLKREQ# pinctrl iomux 为 function io 后,如果存 在此属性,则指定存在从root port到下游设备的CLKREQ#信号路由,并且主机网桥驱动程序可以根据 CLKREQ#信号的存在进行编程,例如,如果没有CLKREQ#信号,则将root port设置为不支持PM L1 Substates。
- rockchip,lpbk-master
- 特殊调试配置:此配置是针对loopback信号测试,使用PCIe控制器构造模拟loopback master环境,让 待测试对端设备进入slave模型,非模拟验证实验室的RX环路需求请勿配置。另注意,Gen3控制器可能 需要配置compliance模式,才可以loopback slave模式。如果阅读者不理解什么是loopback测试,说明 这不是你要找的配置,请勿针对此配置提问。
- rockchip,compliance-mode
- 特殊调试配置:此配置是针对compliance信号测试,使PCIe控制器强制进入compliance测试模式或者
当使用SMA夹具进入测试模式后不断电。这是一个包含两个配置的数组,数组的第一个配置表示测试模
式,第二个配置表示在前述配置下的preset数值。如果使用SMA夹具测试,建议配置
rockchip,compliance-mode=<0 0>;
;如果测试焊接设备,需要固定配置模式和preset数值,rockchip,compliance-mode=<mode preset>;
。mode根据需要配置成1、2或者3,分别代表 2.5GT、5.0GT和8GT信号。仅在5GT和8GT模式下,preset的有效数值为0到10,分别代表P0到P10不同 的协议预加重等配置,可参考附录中“关于PCIe TX加重预设值对照表”的部分。
- rockchip,keep-power-in-suspend
- 可选配置项:仅在 RC mode 下有效,用于实现在休眠状态下不关闭外设的电源和对其进行复位。允许外
设在系统休眠后脱机工作。此模式生效还需要pcie节点引用
vpcie3v3-supply
。
2.6.2 comboPHY dts配置
- 以下配置不适用于RK1808的combphy节点。
combphy
节点数字表示Mux关系,后缀表示复用关系,p
、s
、u
、q
分别表示PCIe、SATA、USB、QSGMII。
- rockchip,ext-refclk
-
特殊调试配置:首先请注意此配置仅仅针对combophy。默认combphy使用SoC内部时钟方案,以 RK356X为例,可参阅rk3568.dtsi节点,默认使用24MHz时钟源。除了24MHz时钟源,还支持25M和 100M,仅需要调整
assigned-clock-rates = <24000000>
数值为所需频率即可。内部时钟源方案成本最 优,所以作为SDK默认方案,但combphy仍然预留了外部晶振芯片的时钟源输入选择。如果确实需要使 用外部时钟晶振芯片提供时钟的方案,请在板级dts的PCIe控制器用的combphy节点中加入 rockchip,ext-refclk,且需要注意在节点中加入assigned-clock-rates = <时钟频率>
来指定外部时钟芯片 输入的频率,仍然只支持24M,25M,100M三档。- rockchip,enable-ssc
- 特殊调试配置:首先请注意此配置仅仅针对PCIe所使用的combphy结点。默认情况下,combophy输出 时钟不开启展频。如果用户需要规避一些EMI问题,可尝试在对应的combphy节点加入此配置项,开启 SSC。
2.6.3 pcie30phy dts配置
- rockchip,pcie30-phymode
- 可选配置项:该配置为pcie30phy的组合使用模式,需要合理配置,默认为4Lane共用。详细的可选内容
参考
include/dt-bindings/phy/phy-snps-pcie3.h
:
- 可选配置项:该配置为pcie30phy的组合使用模式,需要合理配置,默认为4Lane共用。详细的可选内容
参考
/*
* pcie30_phy_mode[2:0]
* bit2: aggregation
* bit1: bifurcation for port 1
* bit0: bifurcation for port 0
*/
#define PHY_MODE_PCIE_AGGREGATION 4 /* PCIe3x4 */
#define PHY_MODE_PCIE_NANBNB 0 /* P1:PCIe3x2 + P0:PCIe3x2 */
#define PHY_MODE_PCIE_NANBBI 1 /* P1:PCIe3x2 + P0:PCIe3x1*2 */
#define PHY_MODE_PCIE_NABINB 2 /* P1:PCIe3x1*2 + P0:PCIe3x2 */
#define PHY_MODE_PCIE_NABIBI 3 /* P1:PCIe3x1*2 + P0:PCIe3x1*2 */
2.7 根据原理图填写DTS
2.7.1 低速IO说明
PCIe模块的芯片信号连接,除了数据线和参考时钟差分对,可能还有以下这些低速IO:
低速IO名 RC模式 EP模式 说明 PERSTn GPIO输出 接nPOR 必选,配置dts "reset-gpios"
项WAKE GPIO(PMU域) GPIO输出 可选,function驱动注册对应GPIO中断及唤醒源,非PCIe控制器驱动处理 PWREN GPIO输出 无 可选,配置dts "vpcie3v3-supply"
项CLKREQ FUNCTION FUNCTION 可选,支持L1SS时使用,配置dts "supports-clkreq"
项PRSNT GPIO输入 无 可选,配置dts "prsnt-gpios"
项- 其中只有
CLKREQ
使用PCIe的function功能,该信号仅L1SS功能需要使用,否则可以不接,使用时必须添加dts对应属性。 - 其他信号都是使用GPIO功能,请勿在pinctrl里面配置为pcie function,具体用法请参考dts对应配置说明。
PERST
信号是协议要求的必选信号,其他信号根据实际项目需求进行配置。
2.7.2 dts配置方法
原理图是基于IO信号的视角来描述硬件,IO信号是跟PHY的index强相关的,而RK3588的controller和PHY的index可能不一致,因此在查看原理图时需要特别注意这一点。
根据硬件原理图来填写dts的建议步骤:
- 确认PCIe设备分配:
- 跟硬件工程师确认使用了几个PCIe设备,芯片的多个PCIe接口是如何分配的。
- 查找PHY输出:
- 在原理图中分别查找某个设备使用的PCIe数据线对应到哪个PHY的输出。
- 确定控制器和PHY:
- 确定当前设备使用的分别是哪个控制器和PHY,在dts中使能。
- 检查控制器的
phy
属性:- 确定当前PCIe接口使用的控制器dts
"phy"
属性及模式是否选择正确,例如pcie2x1ln
控制器需要选择comboPHY
且指定为PHY_TYPE_PCIE
。
- 确定当前PCIe接口使用的控制器dts
- 禁用其他控制器:
- 如果
comboPHY
可能被SATA
、USB
、RGMII
等多个控制器共用,请确认对应的其他控制器在dts中被disable。
- 如果
- 配置PHY模式:
- 确定当前PHY是否有多种工作模式,配置是否正确,例如
pcie30phy
的不同拆分组合需要正确配置对应模式。
- 确定当前PHY是否有多种工作模式,配置是否正确,例如
- 配置
PERSTn
信号:- 确定当前PCIe接口使用的
PERSTn
信号是哪个GPIO,正确配置到控制器dts节点。
- 确定当前PCIe接口使用的
- 配置
PWREN
信号:- 确定当前PCIe接口使用的
PWREN
信号是哪个GPIO控制的,正确配置到控制器dts节点(也可以放到on board外设的dts中)。
- 确定当前PCIe接口使用的
- 配置其他外设硬件:
- 配置其他外设工作所需的硬件。
下图是RK3588 pcie30phy及其可能使用的controller,红色方框为controller,粉色方框为PHY信号,绿 色方框为外设信号;实际使用哪个控制器可以通过外设信号连接来确认,也可以跟硬件工程师核对理解 是否正确。下图是来自RK3588 evb1, 设备接的是一个pcie3.0 x4的slot,所以controller用的是 PCIe30X4(dts命名pcie3x4),其他几个controller都未跟这个PHY配合使用。
下图是RK3588 comboPHY及其可能使用的controller,红色方框为controller,粉色方框为PHY信号, 绿色方框为外设信号;实际使用哪个控制器可以通过外设信号连接来确认,也可以跟硬件工程师核对理 解是否正确。此图中Mux0的PHY(combphy0_ps)工作于SATA模式,未工作于PCIe;Mux1的 PHY(combphy1_ps)配合PCIe30x1_0(dts命名为pcie2x1l0)可能工作于PCIe模式,需要由最终实际接的 设备来确定;Mux2的PHY(combphy2_psu)配合PCIe30x1_1(dts命名为pcie2x1l1)工作于pcie模式用于 连接一个PCIe网卡。
下图为RK3588 evb1的pcie3.0接口供电,可以通过PCIE30X4_PWREN_H这个信号来定位对应的RK3588 GPIO,然后填到pcie3x4控制器dts中。
2.8 Wi-Fi模块设备树编写范例
由于Wi-Fi模块一般接入PCIe2.0口,其使用的
combphy
复用关系复杂,且其电源使用方式、休眠模式、复位需求与其他设备有明显的不同,此处给出一个设备树编写范例,请酌情参考。- 查看原理图,弄清楚Wi-Fi模块所使用的combphy。combphy节点数字表示Mux关系,后缀表示复
用关系,p、s、u、q分别表示PCIe、SATA、USB、 QSGMII。以此图为例,Wi-FI是接到了PCIe与
SATA复用的
PCIE20/SATA30 Mux0
上,因此配置的应该是combphy0_ps节点。
- 搜索dts文件,确保复用此combphy功能的其他控制器节点关闭,防止信号干扰。
- 将wifi_reg_on信号从wireless_wlan节点挪到PCIe 3.3v电源控制节点中。
- 如果Wi-Fi需要实现L1.x功耗模式,请参考”RC mode PM L1 Substates 支持“章节。
- 如果Wi-Fi需要实现无线唤醒功能,需要确保 wifi_reg_on管脚在休眠时保持高电平, wifi_host_wake管脚连接到不断电的PMU IO上用于产生中断唤醒主控,具体硬件接发和软件修改 详述请参考我司SDK发布文档中的《Rockchip_Developer_Guide_Linux_WIFI_BT_CN.pdf》相关章 节。
- rockchip,enable-ssc
-
+ vcc3v3_pcie20_wifi: vcc3v3-pcie20-wifi {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc3v3_pcie20_wifi";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ enable-active-high;
+ /*
+ * wifi_reg_on 是在vbat、vddio稳定后才使能,在reset-gpios前拉高,所以
+ * 放到PCIe的电源节点中才满足模块时序,引用wifi_poweren_gpio。
+ */
+ pinctrl-0 = <&wifi_poweren_gpio>;
+ startup-delay-us = <5000>;
+ vin-supply = <&vcc12v_dcin>;
+ };
wireless_wlan: wireless-wlan {
compatible = "wlan-platdata";
wifi_chip_type = "ap6275p";
pinctrl-names = "default";
pinctrl-0 = <&wifi_host_wake_irq>;
WIFI,host_wake_irq = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
+ /* 注意:这里也需要配置wifi_reg_on管脚,给WiFi驱动来控制 */
+ WIFI,poweren_gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;
status = "okay";
};
+
+&sata0 {
+ status = "disabled" /* sata0与pcie2x1l2复用了combphy0_ps, 需确保禁用 */
+}
+
+&combphy0_ps {
+ status = "okay"; /* 确保phy开启 */
+};
+
+&pcie2x1l2 {
+ reset-gpios = <&gpio3 RK_PD1 GPIO_ACTIVE_HIGH>;
+ rockchip,skip-scan-in-resume;
+ rockchip,perst-inactive-ms = <500>; /* 参考Wi-Fi模组手册,查询所需#PERST复位时间
*/
+ vpcie3v3-supply = <&vcc3v3_pcie20_wifi>;
+ status = "okay";
+};
&pinctrl {
wireless-wlan {
wifi_poweren_gpio: wifi-poweren-gpio {
+ //PCIE REG ON: 务必配置成上拉
+ rockchip,pins = <0 RK_PC7 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
};
3. menuconfig 配置
- 需要确保如下配置打开,方可正确的使用 PCIe 相关功能
CONFIG_PCI=y
CONFIG_PCI_DOMAINS=y
CONFIG_PCI_DOMAINS_GENERIC=y
CONFIG_PCI_SYSCALL=y
CONFIG_PCI_BUS_ADDR_T_64BIT=y
CONFIG_PCI_MSI=y
CONFIG_PCI_MSI_IRQ_DOMAIN=y
CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y
CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y
CONFIG_PCIE_DW=y
CONFIG_PCIE_DW_HOST=y
CONFIG_PCIE_DW_ROCKCHIP=y
CONFIG_PCIEPORTBUS=y
CONFIG_PCIE_PME=y
CONFIG_GENERIC_MSI_IRQ=y
CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
CONFIG_IRQ_DOMAIN=y
CONFIG_IRQ_DOMAIN_HIERARCHY=y
- 使能 NVMe 设备(建立在 PCIe 接口的 SSD),PCIe转接AHCI设备(SATA),PCIe转接USB设备(XHCI) 均已在默认config中打开,烦请确认。其他转接设备例如以太网卡,WiFi等请自行确认相关config配置。
CONFIG_BLK_DEV_NVME=y
CONFIG_SATA_PMP=y
CONFIG_SATA_AHCI=y
CONFIG_SATA_AHCI_PLATFORM=y
CONFIG_ATA_SFF=y
CONFIG_ATA=y
CONFIG_USB_XHCI_PCI=y
CONFIG_USB_XHCI_HCD=y
特别说明,默认内核仅支持 drivers/ata/ahci.c
中列表内的PCIe转接SATA设备,超出部分请找原厂或者代理商支持。
4. 标准EP功能件开发
RK部分芯片的PCIe控制器支持EP模式,可以将芯片开发为标准PCIe EP产品,针对EP功能的实现,请参考文档《Rockchip_Developer_Guide_PCIE_EP_Stardard_Card_CN》。
5. RC mode PM L1 Substates 支持
当确认所用 RK 主控及所接的外设都支持 PCIe PM L1 Substates,可以通过开启 PM L1 Substates 功能支持对功耗进一步优化。
进一步强调,如果目标外设中有不支持 PM L1 Substates 的设备,尤其是主板设计为 slot 外接非固定器件,请勿开启 PM L1 Substates 功能,否则部分设备将无法正常工作。