Rockchip Developer Guide Linux4.4 PCIe

Rockchip-Developer-Guide-linux4.4-PCIe

Rockchip-Developer-Guide-linux4.4-PCIe

Rockchip-Developer-Guide-linux4.4-PCIe

Rockchip-Developer-Guide-linux4.4-PCIe

Rockchip-Developer-Guide-linux4.4-PCIe

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 7

DownloadRockchip-Developer-Guide-linux4.4-PCIe
Open PDF In BrowserView PDF
PCIe开发指南
发布版本:1.0
作者邮箱:shawn.lin@rock-chips.com
日期:2017.02
文件密级:公开资料

前言
概述
产品版本
芯片名称

内核版本

RK3399

4.4

读者对象
本文档(本指南)主要适用于以下工程师:
技术支持工程师
软件开发工程师

修订记录
日期

版本

作者

2017-11-15

V1.0

林涛

PCIe开发指南
前言
DTS配置
menuconfig配置
cmdline配置
常见应用问题
异常排查

修改说明

DTS配置
1. ep-gpios = <&gpio3 13 GPIO_ACTIVE_HIGH>;
此项是设置PCIe接口的PERST#复位信号;不论是插槽还是焊贴的设备,请在原理图上找到该引脚,并正确配置。
否则将无法完成链路建立。
2. num-lanes = <4>;
此配置设置PCIe设备所使用的lane数量,默认不需要调整,软件可以自己探测并关闭不需要的lane以节省功耗。
3. max-link-speed = <1>;
此配置设置PCIe的速度登记,1表示gen1,2表示gen2。RK3399限制不超过gen2。另,此配置默认是写在dtsi,
也就是说默认限制为gen1;原因是gen2的TX测试指标无法达到标准,所以不推荐客户开启gen2模式,以免引起不
必要的链路异常。
4. status = ;
此配置需要在pcie0和和pcie_phy节点同时使能。默认不使能的原因是如果没有外设,pcie在初始化时有一个较大
的检测延时,会额外增加不必要的开机时间。故,有需要PCIe的项目自行开启。
5. vpcie3v3-supply = <&vdd_pcie3v3>;
此配置是可选项,用于配置PCIe外设的3V3供电。如果板级针对PCIe外设的3V3需要控制使能,则如范例所示定义
一组对应的regulator,regulator的配置请参考Documentation/devicetree/bindings/regulator/。
6. vpcie1v8-supply = <&vdd_pcie1v8>;
请参考第五点。
7. vpcie0v9-supply = <&vdd_pcie1v8>;
请参考第五点。

menuconfig配置
1. 需要确保如下配置打开,方可正确的使用PCIe相关功能
1

CONFIG_PCI=y

2

CONFIG_PCI_DOMAINS=y

3

CONFIG_PCI_DOMAINS_GENERIC=y

4

CONFIG_PCI_SYSCALL=y

5

CONFIG_PCI_BUS_ADDR_T_64BIT=y

6

CONFIG_PCI_MSI=y

7

CONFIG_PCI_MSI_IRQ_DOMAIN=y

8

CONFIG_PHY_ROCKCHIP_PCIE=y

9

CONFIG_PCIE_ROCKCHIP=y

10

CONFIG_PCIEPORTBUS=y

11

CONFIG_PCIEASPM=y

12

CONFIG_PCIEASPM_POWERSAVE=y

13

CONFIG_PCIE_PME=y

14

CONFIG_GENERIC_MSI_IRQ=y

15

CONFIG_GENERIC_MSI_IRQ_DOMAIN=y

16

CONFIG_IRQ_DOMAIN=y

17

CONFIG_IRQ_DOMAIN_HIERARCHY=y

2. 使能NVMe设备(建立在PCIe接口的SSD)
1

CONFIG_BLK_DEV_NVME=y

3. 使能AHCI设备(PCIe转接成SATA的SSD)
1

CONFIG_SATA_PMP=y

2

CONFIG_SATA_AHCI=y

3

CONFIG_SATA_AHCI_PLATFORM=y

4

CONFIG_ATA_SFF=y

5

CONFIG_ATA=y

特别说明,默认4.4开源内核仅支持drivers/ata/ahci.c中列表内的设备,超出部分请找原厂或者代理商支持。

4. 使能PCIe接口的WIFI
请参考各wifi的vendor文档进行配置。

cmdline配置
详细的说明请参考内核中的文档Documentation/kernel-parameters.txt,这里仅仅列几个重要的进行说明。
1. nomsi
如果希望使用Legacy中断模式,请在parameter添加pci=nomsi即可
2. pcie_bus_safe
如果希望将所有PCIe层级中的设备的最大数据负载(MPS)调整到最大,请配置pci=pcie_bus_safe,可以提高
带宽。
3. pcie_aspm
如果希望关闭PCIe链路的动态功耗管理,进行测试,请配置pcie_aspm=off, 否则默认按照硬件协商自动配置。

常见应用问题
Q1: 客户走线的时候不好走,问不同lane之间能否交织?

A1: 可以交织,RC的lane[1-4]与EP/switch的lane[1-4]随意对应。软件不需要改动。

Q2: 同一个lane的差分信号能否交织?比如RC的lane1的RX+ 与EP/Switch的RX-对应,TX+与EP/Switch的TX-对
应。或者RX正负对应,TX正负对应等等情况,怎么处理?
A2: 可以任意接,软件上不需要再额外处理。PCIe的探测状态机已经考虑了这些所有情况。

Q3: RK3399只有一个RC,但是有四个lane, 能不能支持把这四个lane拆分,比如拆分成四个1-1-1-1或者拆分成两
个2-2或者其他组合
A3: RK3399不支持此类需求。如果客户希望接多个设备,请选用PCIe switch,目前我们调试过Pericom的
switch,应该是最便宜的一款。

Q4: RK3399支持SSD吗?
A4: 需要大家注意的是,SSD有两种,一种是NVMe, 物理信号层走的是PCIe总线。另外一种是mSATA,走SATA总
线。第二种如果需要支持请客户购买PCIe转SATA或者USB转SATA。

Q5: 既然支持NVMe,支持最大容量多少,能不能作为启动盘?
A5: 存储设备的容量大小与文件系统有关,驱动层面没有任何限制。另外,NVMe在RK3399支持从Uboot开始启
动,也就是意味需要额外加一个spi-nor用来保存miniloader, 因为maskrom没有NVMe和PCIe驱动。

Q6: RK3399的PCIe接入NVMe的情况下,带宽如何?怎么测试
A6: 测试采用fio程序进行,命令如下(客户需要有自己编译的fio,并且静态打包了libaio)
./fio -filename=/dev/block/nvme0n1 -direct=1 -iodepth 4 -thread=1 -rw=write -ioengine=libaio -bs=1M size=200G -numjobs=30 -runtime=60 -group_reporting -name=my
测试数据大致如下

Q7: RK3399支不支持独立显卡?
A7: 理论上支持,只要能提供ARM版本的驱动。实际支持不了。原因是我们可用于BAR的物理总线地址只有
32M,一般独立显卡都超过这个内存的要求。即使转接经过switch,也没有意义,因为switch本身有内存要求,转
接之后,对RC的PCIe总线地址范围要求反而更大。

Q8: PCIe设备需要的电源使用情况
A8: 一般来说提供四类电源,0.9V,3V3, 3V3_AUX, 12V。其中0.9V基本是给PCIe wifi设备使用。绝大部分设备都
需要3V3这路。3V3_AUX是辅助电源,要求在suspend情况下不断电,使得设备继续工作,比如wifi需要唤醒主
控,这路AUX电源就需要常开。 12V是一些大功率设备使用,比如switch, 显卡等。实际情况按照EP/switch厂家要
求进行配置。

Q9: PCIe设备在RK3399上如果动态开关ASPM的支持?
A9: 目前有如下几种方法
方法一是在内核的cmdline加上pcie_aspm=off
方法二是在控制台中配置link_state节点,但需注意前提config中配置了CONFIG_PCIEASPM_DEBUG=y
# cat /sys/bus/pci/devices/0000\:00\:00.0/power/link_state
7
# echo 0 > /sys/bus/pci/devices/0000\:00\:00.0/power/link_state
方法三是关闭config选项中的CONFIG_PCIEASPM
方法四是使用setpci命令:例如 setpci -s 0:0 0xd0.w=0xC00,此方法需要先了解对应设备的BDF信息
方法五在控制台输入echo performance > /sys/module/pcie_aspm/parameters/policy

Q10: 如何在RK399上查看PCIe设备的相关信息
A10: 请将lspci推送进机器,并且添加可执行权限后,执行lspci命令的相关信息

常见的操作是lspci -vvv 和lspci -t, 分别用于输出设备的属性和各类运行状态,以及输出PCIe拓扑的
树形结构。剩余的参数请执行lspci --help 后阅读帮助文档

Q11: 如何在用户态修改PCIe设备的某些寄存器信息
A11: 可以使用setpci工具进行修改,修改的前提你需要使用lspci获得所需修改设备的BDF,以及
需要了解协议中对应的寄存器偏移。命令请使用setpci --help查看对应帮助文档,此工具属于较为高级
的工具,一般不建议客户使用,除非客户足够了解PCIe协议。

异常排查
1. trainning 失败
1

rockchip‐pcie f8000000.pcie: PCIe link training gen1 timeout!

2

rockchip‐pcie: probe of f8000000.pcie failed with error ‐1

异常原因:trainning失败,外设没有处于工作状态。首先检测下ep-gpios这个是否配置对了。 其次,检测下外设
的供电是否有,是否足够。3.3V理论上够,但是我们经常发现有写设备需要 调整到3.8甚至4V才能工作。最后,即
使电压够,也需要排除功率是否够(外接电源进行测试)。

2. config配置死机
1

[ 0.459371] pci 0000:00:00.0: bridge configuration invalid ([bus 00‐00]), reconfiguring

2

[ 0.459585] pci 0000:01:00.0: reg 0x10: initial BAR value 0x00000000 invalid

3

[ 0.460043] pci 0000:01:00.1: reg 0x10: initial BAR value 0x00000000 invalid

4

[ 0.460503] pci 0000:01:00.2: reg 0x10: initial BAR value 0x00000000 invalid

5

[ 0.460535] pci 0000:01:00.2: reg 0x14: initial BAR value 0x00000000 invalid

6

[ 0.460904] Bad mode in Error handler detected, code 0xbf000002 ‐‐ SError

7

[ 0.460919] Internal error: Oops ‐ bad mode: 0 [#1] PREEMPT SMP

8

[ 0.466658] Modules linked in:

9

[ 0.466938] CPU: 5 PID: 1 Comm: swapper/0 Not tainted 4.4.55 #41

10

[ 0.467464] Hardware name: Rockchip RK3399 Excavator Board edp (Android) (DT)

11

[ 0.468089] task: ffffffc0f2160000 ti: ffffffc0f2168000 task.ti: ffffffc0f2168000

12

[ 0.468752] PC is at rockchip_pcie_rd_conf+0xb8/0x138

13

[ 0.469200] LR is at pci_bus_read_config_dword+0x78/0xbc

这种情况设备工作了,完成了枚举,但是通信过程中挂死。绝大部分情况是电源电压不够或者功率不足导致。

3. rk3399的 pcie phy的pll无法完成lock

1

[ 0.440803] rockchip‐pcie f8000000.pcie: no vpcie3v3 regulator found

2

[ 0.440831] rockchip‐pcie f8000000.pcie: no vpcie1v8 regulator found

3

[ 0.440854] rockchip‐pcie f8000000.pcie: no vpcie0v9 regulator found

4

[ 1.443759] pll lock timeout!

5

[ 1.443826] phy phy‐phy@e220.5: phy poweron failed ‐‐> ‐22

6

[ 1.443847] rockchip‐pcie f8000000.pcie: fail to power on phy, err ‐22

7

[ 1.443968] rockchip‐pcie: probe of f8000000.pcie failed with error ‐22

测量PCIE_AVDD_0V9 PCIE_AVDD_1V8电压正常的,供电是否够?这路需要LDO供电。

4. rk3399 pcie与usb3.0同时使用出错。
以下是NVMe使用过程中插入USB设备,系统异常的log
1

[ 2.801962] Unhandled fault: synchronous external abort (0x96000210) at 0xffffff800936401c

2

[ 2.801997] Internal error: : 96000210 [#1] PREEMPT SMP

3

[ 2.803157] Modules linked in:

4

[ 2.803437] CPU: 2 PID: 146 Comm: nvme Not tainted 4.4.16 #146

5

[ 2.803949] Hardware name: rockchip,rk3399‐firefly‐mini (DT)

6

[ 2.804445] task: ffffffc07187d400 ti: ffffffc071910000 task.ti: ffffffc071910000

7

[ 2.805108] PC is at nvme_kthread+0x84/0x1f8

8

[ 2.805484] LR is at nvme_kthread+0x60/0x1f8

结论就是PCIE_AVDD_0V9供电不够或者不稳,加电容或者加大电压试下。



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.4
Linearized                      : No
Creator                         : Typora
Producer                        : Typora
Create Date                     : 2018:01:30 18:18:59
Modify Date                     : 2018:01:30 18:18:59
Page Count                      : 7
Page Mode                       : UseOutlines
Warning                         : [Minor] Ignored duplicate Info dictionary
EXIF Metadata provided by EXIF.tools

Navigation menu