xref: /OK3568_Linux_fs/external/dpdk/pcie/README.txt (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun下面以Intel的I350网卡为例:(对于其它厂家的PCIE网卡,需要按照下面第6点的说明,让厂家修改符合我们平台要求的驱动)
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun1. kernel defconfig打开如下配置:
4*4882a593Smuzhiyun+CONFIG_UIO=m
5*4882a593Smuzhiyun+CONFIG_HUGETLBFS=y
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun2. kernel代码修改如下:
8*4882a593Smuzhiyundiff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h
9*4882a593Smuzhiyunindex 77131e8fefcc1..0a70d70bed6df 100644
10*4882a593Smuzhiyun--- a/include/linux/uio_driver.h
11*4882a593Smuzhiyun+++ b/include/linux/uio_driver.h
12*4882a593Smuzhiyun@@ -45,7 +45,7 @@ struct uio_mem {
13*4882a593Smuzhiyun 	struct uio_map		*map;
14*4882a593Smuzhiyun };
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun-#define MAX_UIO_MAPS	5
17*4882a593Smuzhiyun+#define MAX_UIO_MAPS	13
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun struct uio_portio;
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun@@ -65,7 +65,7 @@ struct uio_port {
22*4882a593Smuzhiyun 	struct uio_portio	*portio;
23*4882a593Smuzhiyun };
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun-#define MAX_UIO_PORT_REGIONS	5
26*4882a593Smuzhiyun+#define MAX_UIO_PORT_REGIONS	13
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun struct uio_device {
29*4882a593Smuzhiyun 	struct module           *owner;
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun3.把补丁包的igb_uio驱动,用对应的内核编译出一个igb_uio.ko
32*4882a593Smuzhiyun+obj-m				+= igb_uio/
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun4.i350网卡使用drivers/net/e1000/驱动
35*4882a593Smuzhiyun用补丁包里面e1000/目录的两个文件 *对比* 开源代码进行修改合并
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun5. 附相关命令及工具:
38*4882a593Smuzhiyun#驱动(下面两个ko都从实际使用的内核编译)
39*4882a593Smuzhiyuninsmod uio.ko
40*4882a593Smuzhiyuninsmod igb_uio.ko
41*4882a593Smuzhiyun#开启性能模式(命令报错忽略)
42*4882a593Smuzhiyunecho performance | tee $(find /sys/ -name *governor) /dev/null || true
43*4882a593Smuzhiyun#开启hugepages
44*4882a593Smuzhiyunecho 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun#绑定网卡 (0000:01:00.X要改成实际的)
47*4882a593Smuzhiyundpdk/usertools/dpdk-devbind.py -b igb_uio 0000:01:00.0
48*4882a593Smuzhiyundpdk/usertools/dpdk-devbind.py -b igb_uio 0000:01:00.1
49*4882a593Smuzhiyundpdk/usertools/dpdk-devbind.py -b igb_uio 0000:01:00.2
50*4882a593Smuzhiyundpdk/usertools/dpdk-devbind.py -b igb_uio 0000:01:00.3
51*4882a593Smuzhiyun... ...
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun#测试工具(DPDK可以直接从官网下载编译)
54*4882a593Smuzhiyundpdk/build/app/dpdk-testpmd
55*4882a593Smuzhiyundpdk/examples/l3fwd/build/l3fwd
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun6. RK平台特殊说明
58*4882a593SmuzhiyunRK主控没有*硬件*支持网卡DMA访问内存一致性,所以开源DPDK代码网卡驱动使用的API:rte_eth_dma_zone_reserve/rte_mbuf_raw_alloc它是默认要求硬件访问内存一致性的;
59*4882a593Smuzhiyun比如发送数据的场景:CPU把数据写到内存,然后通知网卡DMA来搬运数据,其它平台硬件会自动刷新cache,使的网卡DMA能直接拿到最新数据,而RK平台需要手动取刷新;
60*4882a593SmuzhiyunDPDK内存主要有两种:
61*4882a593Smuzhiyun一个是给网卡BD描述符使用的内存,使用rte_eth_dma_zone_reserve来分配,由于它会被频繁使用,所以解决策略是在内核使用dma_alloc_coherent分配非cache的内存,然后映射给dpdk的网卡驱动使用;
62*4882a593Smuzhiyun二是网卡存放数据的内存,比如用rte_mbuf_raw_alloc分配,由于内存分配量比较大,所以直接使用arm标准的指令刷cache的命令来实现,比如写发送数据时,写完数据后主动刷新这块内存,让实际的内存写到DDR里面取,此时DMA就能拿到实际写入的数据;
63*4882a593Smuzhiyun!!!注意:如果要支持其它型号的网卡,请按照上述的要求让网卡厂商去修改他们的驱动即可。
64*4882a593Smuzhiyun
65