作者
QQ群:852283276
微信:arm80x86
微信公众号:青儿创客基地
B站:主页 https://space.bilibili.com/208826118
SRIO
SRIO1/2和PCIe2/3共用Serdes,所以不能同时使用,SRIO的寄存器位于CCSR偏移0xC0000,
T2080的SRIO使用需要RMAN,位于CCSR偏移0x1E0000,
SRIO有8个Outbound ATMU和1个默认的Outbound ATMU,4个Inbound ATMU和1个默认的Inbound ATMU,默认的ATMU不支持Seg,Subseg,可以看到,SRA的代码,9个Outbound ATMU,5个Inbound ATMU,
//from sra
//build_t2080rdb-64b\tmp\work\t2080rdb_64b-fsl-linux\usdpaa\git-r4\git\src\srio\srio_driver.h
#define SRIO_PORT_MAX_NUM 2 /* SRIO port max number */
#define SRIO_OB_WIN_NUM 9 /* SRIO outbound window number */
#define SRIO_IB_WIN_NUM 5 /* SRIO inbound window number */
#define SRIO_MAX_SEG_NUM 4
#define SRIO_MAX_SUBSEG_NUM 8
/* ATMU window registers */
struct rio_atmu_win {
struct rio_atmu_row outbw[SRIO_OB_WIN_NUM];
uint32_t res0[16];
struct rio_atmu_riw inbw[SRIO_IB_WIN_NUM];
};
u-boot
u-boot下SRIO相关代码,
//arch\powerpc\include\asm\fsl_law.h line57
LAW_TRGT_IF_RIO_1 = 0x08,
LAW_TRGT_IF_RIO_2 = 0x09,
//arch\powerpc\cpu\mpc8xxx\law.c line334
case 0x8: /* boot from SRIO1 */
set_next_law(CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR_PHYS,
LAW_SIZE_1M,
LAW_TRGT_IF_RIO_1);
set_next_law(CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR_PHYS,
LAW_SIZE_1M,
LAW_TRGT_IF_RIO_1);
break;
...
//arch\powerpc\cpu\mpc8xxx\srio.c line229
void srio_init(void)
{...}
Linux
SDK中没有T2080的例子,但是T2080 RapidIO类似于P3041DS/P4080DS/P5020DS/T4240QDS/B4860QDS开发板的RapidIO,代码是通用的。对于目前使用RMAN的处理器,SDK的SRIO驱动以用户态的形式提供在 USDPAA中,执行bitbake usdpaa/usdpaa-apps -c patch -f
可以得到usdpaa的源代码,路径为tmp/work/t2080rdb_64b-fsl-linux/usdpaa/git-r4/git
,可参考SDK的FRA程序来使用RMAN,FRA只示例了Data-streaming(RIO_TYPE9)
,Mailbox(RIO_TYPE11)
,Doorbell(RIO_TYPE10)
,Maintenance(RIO_TYPE8)
。SRA使用更简单,不需要操作RMAN,但是不支持Mailbox和Doorbell,示例了SWRITE
,NWRITE
,NWRITE_R
,NREAD
。内核下打开驱动支持,所以想支持所有的SRIO应用,FRA/SRA都得搞。
--- Userspace I/O drivers
<*> Freescale DMA support
<*> Freescale Serial RapidIO support
<*> Freescale RapidIO Message Unit support
设备树需要使用usdpaa的设备树,添加RMAN的设备树,否则fra无法加载,单独使用SRIO时,并不需要网口,所以得修改程序,网络部分并不使用usdpaa。
rman@1e0000 {
compatible = "fsl,rman";
#address-cells = <0x1>;
#size-cells = <0x1>;
ranges = <0x0 0x1e0000 0x20000>;
reg = <0x1e0000 0x20000>;
interrupts = <0x10 0x2 0x1 0xb>;
fsl,qman-channels-id = <0x880 0x881>;
inbound-block@0 {
compatible = "fsl,rman-inbound-block";
reg = <0x0 0x800>;
};
global-cfg@b00 {
compatible = "fsl,rman-global-cfg";
reg = <0xb00 0x500>;
};
inbound-block@1000 {
compatible = "fsl,rman-inbound-block";
reg = <0x1000 0x800>;
};
inbound-block@2000 {
compatible = "fsl,rman-inbound-block";
reg = <0x2000 0x800>;
};
inbound-block@3000 {
compatible = "fsl,rman-inbound-block";
reg = <0x3000 0x800>;
};
};