xref: /dpdk/doc/guides/nics/build_and_test.rst (revision 89f0711f9ddfb5822da9d34f384b92f72a61c4dc)
1..  SPDX-License-Identifier: BSD-3-Clause
2    Copyright(c) 2017 Cavium, Inc
3
4.. _pmd_build_and_test:
5
6Compiling and testing a PMD for a NIC
7=====================================
8
9This section demonstrates how to compile and run a Poll Mode Driver (PMD) for
10the available Network Interface Cards in DPDK using TestPMD.
11
12TestPMD is one of the reference applications distributed with the DPDK. Its main
13purpose is to forward packets between Ethernet ports on a network interface and
14as such is the best way to test a PMD.
15
16Refer to the :ref:`testpmd application user guide <testpmd_ug>` for detailed
17information on how to build and run testpmd.
18
19Driver Compilation
20------------------
21
22To compile a PMD for a platform, run make with appropriate target as shown below.
23Use "make" command in Linux and "gmake" in FreeBSD. This will also build testpmd.
24
25To check available targets:
26
27.. code-block:: console
28
29   cd <DPDK-source-directory>
30   make showconfigs
31
32Example output:
33
34.. code-block:: console
35
36   arm-armv7a-linuxapp-gcc
37   arm64-armv8a-linuxapp-gcc
38   arm64-dpaa2-linuxapp-gcc
39   arm64-thunderx-linuxapp-gcc
40   arm64-xgene1-linuxapp-gcc
41   i686-native-linuxapp-gcc
42   i686-native-linuxapp-icc
43   ppc_64-power8-linuxapp-gcc
44   x86_64-native-bsdapp-clang
45   x86_64-native-bsdapp-gcc
46   x86_64-native-linuxapp-clang
47   x86_64-native-linuxapp-gcc
48   x86_64-native-linuxapp-icc
49   x86_x32-native-linuxapp-gcc
50
51To compile a PMD for Linux x86_64 gcc target, run the following "make" command:
52
53.. code-block:: console
54
55   make install T=x86_64-native-linuxapp-gcc
56
57Use ARM (ThunderX, DPAA, X-Gene) or PowerPC target for respective platform.
58
59For more information, refer to the :ref:`Getting Started Guide for Linux <linux_gsg>`
60or :ref:`Getting Started Guide for FreeBSD <freebsd_gsg>` depending on your platform.
61
62Running testpmd in Linux
63------------------------
64
65This section demonstrates how to setup and run ``testpmd`` in Linux.
66
67#. Mount huge pages:
68
69   .. code-block:: console
70
71      mkdir /mnt/huge
72      mount -t hugetlbfs nodev /mnt/huge
73
74#. Request huge pages:
75
76   Hugepage memory should be reserved as per application requirement. Check
77   hugepage size configured in the system and calculate the number of pages
78   required.
79
80   To reserve 1024 pages of 2MB:
81
82   .. code-block:: console
83
84      echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
85
86   .. note::
87
88      Check ``/proc/meminfo`` to find system hugepage size:
89
90      .. code-block:: console
91
92         grep "Hugepagesize:" /proc/meminfo
93
94      Example output:
95
96      .. code-block:: console
97
98         Hugepagesize:       2048 kB
99
100#. Load ``igb_uio`` or ``vfio-pci`` driver:
101
102   .. code-block:: console
103
104      modprobe uio
105      insmod ./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
106
107   or
108
109   .. code-block:: console
110
111      modprobe vfio-pci
112
113#. Setup VFIO permissions for regular users before binding to ``vfio-pci``:
114
115   .. code-block:: console
116
117      sudo chmod a+x /dev/vfio
118
119      sudo chmod 0666 /dev/vfio/*
120
121#. Bind the adapters to ``igb_uio`` or ``vfio-pci`` loaded in the previous step:
122
123   .. code-block:: console
124
125      ./usertools/dpdk-devbind.py --bind igb_uio DEVICE1 DEVICE2 ...
126
127   Or setup VFIO permissions for regular users and then bind to ``vfio-pci``:
128
129   .. code-block:: console
130
131      ./usertools/dpdk-devbind.py --bind vfio-pci DEVICE1 DEVICE2 ...
132
133   .. note::
134
135      DEVICE1, DEVICE2 are specified via PCI "domain:bus:slot.func" syntax or
136      "bus:slot.func" syntax.
137
138#. Start ``testpmd`` with basic parameters:
139
140   .. code-block:: console
141
142      ./x86_64-native-linuxapp-gcc/app/testpmd -l 0-3 -n 4 -- -i
143
144   Successful execution will show initialization messages from EAL, PMD and
145   testpmd application. A prompt will be displayed at the end for user commands
146   as interactive mode (``-i``) is on.
147
148   .. code-block:: console
149
150      testpmd>
151
152   Refer to the :ref:`testpmd runtime functions <testpmd_runtime>` for a list
153   of available commands.
154