lovemyspring / uio_reg

A simple tool to access MMIO register of a PCIe device which is using UIO module.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

This is simple tool to access a PCIe device's MMIO register.

Why I wrote this tool?
I was a FPGA engineer working on a SmartNIC project, we need debug it in user space with UIO/igb_uio. Though DPDK have a test application named "testpmd", it is too big and complex to use for a FPGA engineer. So I wrote an applicaton without DPDK library to debug my SmartNIC, e.g. read queue index, module state and packet statistics register.
Now I find it also can be used for normal FPGA Add-In card test and debug. I plan to add a kernel module to instead igb_uio which comes from DPDK (of course, will refer to igb_uio and uio_reg still can be used with igb_uio).


HOWTO

Step 1 COMPILE SOURCE CODE
dong@W530:~/work/uio_reg/src/uio_reg$ make
gcc -g -Wall -c uio_reg.c
gcc -g -Wall uio_reg.o -o uio_reg
dong@W530:~/work/uio_reg/src/uio_reg$ ls
Makefile  uio_reg  uio_reg.c  uio_reg.o

Step 2 RUN
The PCIe device is 82579 NIC. We can verify the application by access ethernet address register (RAL and RAH).
dong@W530:~/work/dpdk/tags/dpdk-17.08$ lspci | grep -i eth
00:19.0 Ethernet controller: Intel Corporation 82579LM Gigabit Network Connection (rev 04)
dong@W530:~/work/uio_reg/src$ sudo ./uio_reg -s 0000:00:19.0 -b 0 -r 0x5400 4
READ, offset [0x00005400], count [4], BAR number [0], BDF [0000:00:19.0].
    OFFSET                     VALUE
0x00005400                0x540E973C
0x00005404                0x8000CC5C
0x00005408                0x00000000
0x0000540C                0x00000000
dong@W530:~/work/uio_reg/src$ sudo ./uio_reg -s 0000:00:19.0 -b 0 -w 0x5408 0x12345678
WRITE, offset [0x00005408], value [0x12345678], BAR number [0], BDF [0000:00:19.0].
dong@W530:~/work/uio_reg/src$ sudo ./uio_reg -s 00:19.0 -b 0 -r 0x5400 4
READ, offset [0x00005400], count [4], BAR number [0], BDF [00:19.0].
    OFFSET                     VALUE
0x00005400                0x540E973C
0x00005404                0x8000CC5C
0x00005408                0x12345678
0x0000540C                0x00000000
dong@W530:~/work/uio_reg/src$ sudo ./uio_reg -s 00:19.0 -b 0 -w 0x540C 0xaaaabbbb
\WRITE, offset [0x0000540C], value [0xAAAABBBB], BAR number [0], BDF [00:19.0].
dong@W530:~/work/uio_reg/src$ sudo ./uio_reg -s 00:19.0 -b 0 -r 0x5400 4
READ, offset [0x00005400], count [4], BAR number [0], BDF [00:19.0].
    OFFSET                     VALUE
0x00005400                0x540E973C
0x00005404                0x8000CC5C
0x00005408                0x12345678
0x0000540C                0x0000BBBB

[VERIFY]We load the native driver to 82579, then read the ethernet address:
dong@W530:~/work/uio_reg$ ifconfig enp0s25
enp0s25   Link encap:Ethernet  HWaddr 3c:97:0e:54:5c:cc  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:20 Memory:f3a00000-f3a20000

The ethernet address which read by uio_reg is right.

About

A simple tool to access MMIO register of a PCIe device which is using UIO module.


Languages

Language:C 89.2%Language:Makefile 10.8%