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 功能,否则部分设备将无法正常工作。
PM L1 Substates 支持的硬件电路设计
RC CLKREQ#、EP CLKREQ# 双端互联
可选优化: 外部参考时钟方案,可以考虑 CLKREQ# 接入 CLOCK_GEN OE,如 CLOCK_GEN OE 为高有效,则应添加反相器
系统默认设置
关闭系统对 PM L1 Substates 支持:
- dts 未添加
supports-clkreq;
属性 - 内核宏配置
CONFIG_PCIEASPM_POWER_SUPERSAVE=n
系统开启 PM L1 Substates 支持
- 确认 RC/EP 都支持 PM L1 Substates,其中RC的支持情况可查阅“芯片资源介绍”章节之ASPM一栏。
- 硬件配置 CLKREQ# 信号:确认符合 “PM L1 Substates 支持的硬件电路设计”
- 软件配置 CLKREQ# 信号:设置 CLKREQ# iomux 为 function io
- 软件配置控制器节点添加
supports-clkreq;
属性,详细参考 "dts 可配置项 11" 说明 - 开启 PM L1 Substates 支持:
- 方法1:内核宏配置
CONFIG_PCIEASPM_POWER_SUPERSAVE=y
- 方法2:部分外设如 WIFI,支持驱动中使能 PM L1 Substates
- 方法1:内核宏配置
说明:
- 如果不严格符合以上条件却要尝试通过开启内核宏配置,PCIe link 可能会进入异常状态,无法唤醒
- 请确认内核源码为较新代码,包含支持 L1SS 补丁:commit e18dfa93 PCI: rockchip: dw: Support PM L1 clock removing
6. 基于GPIO方式的拔插检测机制
6.1 硬件要求
- PCIe slot的PRSNT#_1需要与主控的任意GPIO相连,作为检测脚
- PCIe设备的电源需要软件可控制上下电
6.2 软件要求
- 至少包含以下提交,如无请联系业务获取补丁:
commit 4de1a0c19e0f9804ba22e7f5e544fea317913957
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date: Tue Mar 12 16:38:46 2024 +0800
PCI: rockchip: dw: Add gpio based hotplug
Change-Id: I49c57755d11cc43bbf7cf9eb23542f5e1e11aaa3
commit 86f3010d7f523c9f5a2e88d9f8f1871ed89da098
Author: Vidya Sagar <vidyas@nvidia.com>
Date: Sat Oct 1 00:57:45 2022 +0530
FROMLIST: PCI/hotplug: Add GPIO PCIe hotplug driver
Change-Id: Iafa798ee4d98f195f5d33d80120da0c569132548
- 内核需确认打开如下配置:
CONFIG_HOTPLUG_PCI=y
CONFIG_HOTPLUG_PCI_GPIO=y
- DTS配置参考如下
&pcie0 {
reset-gpios = <&gpio4 RK_PC7 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie0>;
hotplug-gpios = <&gpio4 RK_PC4 IRQ_TYPE_EDGE_BOTH>;
pinctrl-names = "default";
pinctrl-0 = <&hot_plug0>;
status = "okay";
};
&pinctrl {
pcie {
hot_plug0: hot-plug0 {
rockchip,pins = <4 RK_PC4 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
};
6.3 使用限制
- PCIe设备带电拔插极易损坏设备和主控,在设备拔出后的卸载流程和断电流程需要一点时间,所以禁止快速热拔插。需要等到如下移除log后,再重新插入:
[ 35.680289][ T134] pcieport 0000:00:00.0: Hot-UnPlug Event
[ 35.680361][ T134] pcieport 0000:00:00.0: Power Status = 1
[ 35.827183][ T134] rk-pcie 2a200000.pcie: rk_pcie_slot_disable
[ 35.827303][ T134] pcieport 0000:00:00.0: Hot-UnPlug Event
[ 35.827323][ T134] pcieport 0000:00:00.0: Power Status = 0
[ 35.827334][ T134] pcieport 0000:00:00.0: Device is already removed
-
为保证数据的完整性和系统的稳定性,需要确保系统停止访问待拔出设备。
-
无法支持switch下游设备的单独拔插。如有此需求,首先需要确认switch支持下游设备打单独热拔插,然后参考常见应用问题中“如何对下游单个设备进行重扫描或者在线更换设备?”部分进行rescan处理,亦可达到同等效果。
-
不支持在休眠待机状态下,检测插入或者移除设备。
7. 内核 DMATEST
在进行开发前请确认目标PCIe控制器是否支持DMA传输,详细参考“芯片资源介绍”章节。
RK PCIe DMA提供基于内核module_para机制的测试机制,框架类似Linux dmatest,可以基于该框架进一步完成内核下的PCIe DMA应用。
内核版本要求
至少包含以下提交,如无请联系业务获取补丁:
commit a7c40cb119703e566d9d5befb8c1a7b0533dd7b7
Author: Jon Lin <jon.lin@rock-chips.com>
Date: Tue Jan 17 17:46:48 2023 +0800
PCI: rockchip: dw-dmatest: Suppport rc dma
1.Set rc dma as default
2.Changet to ep dma by sending command:
echo 0 > ./sys/module/pcie_dw_dmatest/parameters/is_rc
Change-Id: I9b16c328c08f220772e487c7c796b8898d74ae10
Signed-off-by: Jon Lin <jon.lin@rock-chips.com>
测试宏配置
CONFIG_PCIE_DW_DMATEST=y
CONFIG_ROCKCHIP_PCIE_DMA_OBJ=n
搭建环境
PCIe 互联模型:
- 客户自行搭建RK RC - FPGA EP环境
- RK本地测试搭建为RK RC(RK dmatest 配置)-RK EP(RK 芯片互联配置)
注意:
- MPS 配置为 256B
- RC EP都需要reserved memory,建议在0x3c000000预留64MB测试用内存(测试默认配置的地址)
- 建议关闭其他无关的 PCIe 控制器
测试
详细参考:pcie-dw-misc-dmatest.c
源码
static int size = 0x20;
module_param(size, int, 0644);
MODULE_PARM_DESC(size, "each packet size in bytes");
static unsigned int cycles_count = 1;
module_param(cycles_count, uint, 0644);
MODULE_PARM_DESC(cycles_count, "how many erase cycles to do (default 1)");
static bool irq;
module_param(irq, bool, 0644);
MODULE_PARM_DESC(irq, "Using irq? (default: false)");
static unsigned int chn_en = 1;
module_param(chn_en, uint, 0644);
MODULE_PARM_DESC(chn_en, "Each bits for one dma channel, up to 2 channels, (default enable chanel 0)");
static unsigned int rw_test = 3;
module_param(rw_test, uint, 0644);
MODULE_PARM_DESC(rw_test, "Read/Write test, 1-read 2-write 3-both(default 3)");
static unsigned int bus_addr = 0x3c000000;
module_param(bus_addr, uint, 0644);
MODULE_PARM_DESC(bus_addr, "Dmatest chn0 bus_addr(remote), chn1 add offset 0x100000, (default 0x3c000000)");
static unsigned int local_addr = 0x3c000000;
module_param(local_addr, uint, 0644);
MODULE_PARM_DESC(local_addr, "Dmatest chn0 local_addr(local), chn1 add offset 0x100000, (default 0x3c000000)");
static unsigned int test_dev;
module_param(test_dev, uint, 0644);
MODULE_PARM_DESC(test_dev, "Choose dma_obj device,(default 0)");
static bool is_rc = true;
module_param_named(is_rc, is_rc, bool, 0644);
MODULE_PARM_DESC(is_rc, "Test port is rc(default true)");
实例参考1:RC设备,channel 0,写数据,数据粒度1MB,循环次数1000,local 地址0x3c000000,remote地址0x3c000000:
echo 0 > ./sys/module/pcie_dw_dmatest/parameters/test_dev
echo 1 > ./sys/module/pcie_dw_dmatest/parameters/is_rc
echo 1 > ./sys/module/pcie_dw_dmatest/parameters/chn_en
echo 1 > ./sys/module/pcie_dw_dmatest/parameters/rw_test
echo 0x100000 > ./sys/module/pcie_dw_dmatest/parameters/size
echo 1000 > ./sys/module/pcie_dw_dmatest/parameters/cycles_count
echo 0x3c000000 > ./sys/module/pcie_dw_dmatest/parameters/local_addr
echo 0x3c000000 > ./sys/module/pcie_dw_dmatest/parameters/bus_addr
echo run > ./sys/module/pcie_dw_dmatest/parameters/dmatest
实例参考2:EP设备,channel 0/1(双线程同时运行),读写数据,数据粒度8KB,循环次数10000,local 地址 0x3c000000,remote 地址 0x3c000000:
echo 0 > ./sys/module/pcie_dw_dmatest/parameters/test_dev
echo 0 > ./sys/module/pcie_dw_dmatest/parameters/is_rc
echo 3 > ./sys/module/pcie_dw_dmatest/parameters/chn_en
echo 3 > ./sys/module/pcie_dw_dmatest/parameters/rw_test
echo 0x2000 > ./sys/module/pcie_dw_dmatest/parameters/size
echo 10000 > ./sys/module/pcie_dw_dmatest/parameters/cycles_count
echo 0x3c000000 > ./sys/module/pcie_dw_dmatest/parameters/local_addr
echo 0x3c000000 > ./sys/module/pcie_dw_dmatest/parameters/bus_addr
echo run > ./sys/module/pcie_dw_dmatest/parameters/dmatest
8. 内核 稳定性统计信息
PCIe 设备长期工作状态下出现异常,其运行状态不符合预期,可以尝试获取debugfs节点中的信息以便提供给我们进行分析。若需要启用此功能,先确保包含此提交(pcie: rockchip: dw: Add debugfs support),否则可以在附录章节所示redmine系统中获取0001-pcie-rockchip-dw-Add-debugfs-support.patch
。
使用方法
- 明确出问题的设备所处的控制器地址节点,可从开机枚举log中查阅或者直接从dtsi中查看。
- 以fe16000.pcie 为例, 进入
/sys/kernel/debug/fe160000.pcie
目录 echo disable > err_event
关闭所有的事件统计功能echo clear > err_event
清除所有的事件统计计数echo enable > err_event
开启所有的事件统计功能- 开始设备老化,复现您的异常case, 复现后请执行
cat dumpfifo
和cat err_event
。 - 将导出的信息与本文档附录中的Debugfs导出信息解析表进行对比,可以大致明确出现的问题。
9. 内核 错误注入测试支持
PCIe链路如果需要测试RC端funtion驱动、业务模型/EP端 firmware/双端硬件IP对错误的容错率,可以开启错误注入测试,模拟双方交互过程中可能出现的错误类型,评估双端软件、IP的稳定性。
使用方法
(1) 需要包含以下提交
commit fe835d5fd3329ba629f8c4290c818ef4b8f9895d
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date: Wed Sep 4 17:04:37 2024 +0800
PCI: rockchip: dw: Add fault injection support
Change-Id: Ib214cc1be565bf16bafb6a847215572f35c43753
(2) 需要开启本文档中”内核 稳定性统计信息“章节所述功能,并进入对应控制器的目录
(3) echo "einj_number enable_or_disable error_type error_number" >
fault_injection
|-------------------|--------------------------------------------------------
--|
| 数值 | 含义
|
|-------------------|--------------------------------------------------------
--|
|einj_number: |错误注入的组号,仅支持0到6,其他数值无效
|
|-------------------|--------------------------------------------------------
--|
|enable_or_disable: |开启错误注入还是关闭错误注入,0表示关闭,1表示开启,其他数值无效
|
|-------------------|--------------------------------------------------------
--|
|error_type: |错误注入类型选择,根据附录所述选择einj_number所示组号所对应的错误
类型|
|-------------------|--------------------------------------------------------
--|
|error_number: |错误注入数量,仅支持0到255,其他数值无效
|
|-------------------|--------------------------------------------------------
--|
例如echo "2 1 2 128" > fault_injection ,代表开启einj2,注入128个NAK DLLP包
(4) 启动PCIe链路传输,例如NVMe: dd if=/dev/nvme0n1 of=/dev/null bs=1M count=5000
(5) 查看错误是否发生:cat err_event
Rx Recovery Request: 0x1f
...
Tx Nak DLLP: 0x80
(6) 分析双端软硬件,查看是否发生预期外的软硬件异常