1.. SPDX-License-Identifier: GPL-2.0
2
3===================
4PCI Test User Guide
5===================
6
7:Author: Kishon Vijay Abraham I <[email protected]>
8
9This document is a guide to help users use pci-epf-test function driver
10and pci_endpoint_test host driver for testing PCI. The list of steps to
11be followed in the host side and EP side is given below.
12
13Endpoint Device
14===============
15
16Endpoint Controller Devices
17---------------------------
18
19To find the list of endpoint controller devices in the system::
20
21	# ls /sys/class/pci_epc/
22	  51000000.pcie_ep
23
24If PCI_ENDPOINT_CONFIGFS is enabled::
25
26	# ls /sys/kernel/config/pci_ep/controllers
27	  51000000.pcie_ep
28
29
30Endpoint Function Drivers
31-------------------------
32
33To find the list of endpoint function drivers in the system::
34
35	# ls /sys/bus/pci-epf/drivers
36	  pci_epf_test
37
38If PCI_ENDPOINT_CONFIGFS is enabled::
39
40	# ls /sys/kernel/config/pci_ep/functions
41	  pci_epf_test
42
43
44Creating pci-epf-test Device
45----------------------------
46
47PCI endpoint function device can be created using the configfs. To create
48pci-epf-test device, the following commands can be used::
49
50	# mount -t configfs none /sys/kernel/config
51	# cd /sys/kernel/config/pci_ep/
52	# mkdir functions/pci_epf_test/func1
53
54The "mkdir func1" above creates the pci-epf-test function device that will
55be probed by pci_epf_test driver.
56
57The PCI endpoint framework populates the directory with the following
58configurable fields::
59
60	# ls functions/pci_epf_test/func1
61	  baseclass_code	interrupt_pin	progif_code	subsys_id
62	  cache_line_size	msi_interrupts	revid		subsys_vendorid
63	  deviceid          	msix_interrupts	subclass_code	vendorid
64
65The PCI endpoint function driver populates these entries with default values
66when the device is bound to the driver. The pci-epf-test driver populates
67vendorid with 0xffff and interrupt_pin with 0x0001::
68
69	# cat functions/pci_epf_test/func1/vendorid
70	  0xffff
71	# cat functions/pci_epf_test/func1/interrupt_pin
72	  0x0001
73
74
75Configuring pci-epf-test Device
76-------------------------------
77
78The user can configure the pci-epf-test device using configfs entry. In order
79to change the vendorid and the number of MSI interrupts used by the function
80device, the following commands can be used::
81
82	# echo 0x104c > functions/pci_epf_test/func1/vendorid
83	# echo 0xb500 > functions/pci_epf_test/func1/deviceid
84	# echo 32 > functions/pci_epf_test/func1/msi_interrupts
85	# echo 2048 > functions/pci_epf_test/func1/msix_interrupts
86
87
88Binding pci-epf-test Device to EP Controller
89--------------------------------------------
90
91In order for the endpoint function device to be useful, it has to be bound to
92a PCI endpoint controller driver. Use the configfs to bind the function
93device to one of the controller driver present in the system::
94
95	# ln -s functions/pci_epf_test/func1 controllers/51000000.pcie_ep/
96
97Once the above step is completed, the PCI endpoint is ready to establish a link
98with the host.
99
100
101Start the Link
102--------------
103
104In order for the endpoint device to establish a link with the host, the _start_
105field should be populated with '1'::
106
107	# echo 1 > controllers/51000000.pcie_ep/start
108
109
110RootComplex Device
111==================
112
113lspci Output
114------------
115
116Note that the devices listed here correspond to the value populated in 1.4
117above::
118
119	00:00.0 PCI bridge: Texas Instruments Device 8888 (rev 01)
120	01:00.0 Unassigned class [ff00]: Texas Instruments Device b500
121
122
123Using Endpoint Test function Device
124-----------------------------------
125
126Kselftest added in tools/testing/selftests/pci_endpoint can be used to run all
127the default PCI endpoint tests. To build the Kselftest for PCI endpoint
128subsystem, the following commands should be used::
129
130	# cd <kernel-dir>
131	# make -C tools/testing/selftests/pci_endpoint
132
133or if you desire to compile and install in your system::
134
135	# cd <kernel-dir>
136	# make -C tools/testing/selftests/pci_endpoint INSTALL_PATH=/usr/bin install
137
138The test will be located in <rootfs>/usr/bin/
139
140Kselftest Output
141~~~~~~~~~~~~~~~~
142::
143
144	# pci_endpoint_test
145	TAP version 13
146	1..16
147	# Starting 16 tests from 9 test cases.
148	#  RUN           pci_ep_bar.BAR0.BAR_TEST ...
149	#            OK  pci_ep_bar.BAR0.BAR_TEST
150	ok 1 pci_ep_bar.BAR0.BAR_TEST
151	#  RUN           pci_ep_bar.BAR1.BAR_TEST ...
152	#            OK  pci_ep_bar.BAR1.BAR_TEST
153	ok 2 pci_ep_bar.BAR1.BAR_TEST
154	#  RUN           pci_ep_bar.BAR2.BAR_TEST ...
155	#            OK  pci_ep_bar.BAR2.BAR_TEST
156	ok 3 pci_ep_bar.BAR2.BAR_TEST
157	#  RUN           pci_ep_bar.BAR3.BAR_TEST ...
158	#            OK  pci_ep_bar.BAR3.BAR_TEST
159	ok 4 pci_ep_bar.BAR3.BAR_TEST
160	#  RUN           pci_ep_bar.BAR4.BAR_TEST ...
161	#            OK  pci_ep_bar.BAR4.BAR_TEST
162	ok 5 pci_ep_bar.BAR4.BAR_TEST
163	#  RUN           pci_ep_bar.BAR5.BAR_TEST ...
164	#            OK  pci_ep_bar.BAR5.BAR_TEST
165	ok 6 pci_ep_bar.BAR5.BAR_TEST
166	#  RUN           pci_ep_basic.CONSECUTIVE_BAR_TEST ...
167	#            OK  pci_ep_basic.CONSECUTIVE_BAR_TEST
168	ok 7 pci_ep_basic.CONSECUTIVE_BAR_TEST
169	#  RUN           pci_ep_basic.LEGACY_IRQ_TEST ...
170	#            OK  pci_ep_basic.LEGACY_IRQ_TEST
171	ok 8 pci_ep_basic.LEGACY_IRQ_TEST
172	#  RUN           pci_ep_basic.MSI_TEST ...
173	#            OK  pci_ep_basic.MSI_TEST
174	ok 9 pci_ep_basic.MSI_TEST
175	#  RUN           pci_ep_basic.MSIX_TEST ...
176	#            OK  pci_ep_basic.MSIX_TEST
177	ok 10 pci_ep_basic.MSIX_TEST
178	#  RUN           pci_ep_data_transfer.memcpy.READ_TEST ...
179	#            OK  pci_ep_data_transfer.memcpy.READ_TEST
180	ok 11 pci_ep_data_transfer.memcpy.READ_TEST
181	#  RUN           pci_ep_data_transfer.memcpy.WRITE_TEST ...
182	#            OK  pci_ep_data_transfer.memcpy.WRITE_TEST
183	ok 12 pci_ep_data_transfer.memcpy.WRITE_TEST
184	#  RUN           pci_ep_data_transfer.memcpy.COPY_TEST ...
185	#            OK  pci_ep_data_transfer.memcpy.COPY_TEST
186	ok 13 pci_ep_data_transfer.memcpy.COPY_TEST
187	#  RUN           pci_ep_data_transfer.dma.READ_TEST ...
188	#            OK  pci_ep_data_transfer.dma.READ_TEST
189	ok 14 pci_ep_data_transfer.dma.READ_TEST
190	#  RUN           pci_ep_data_transfer.dma.WRITE_TEST ...
191	#            OK  pci_ep_data_transfer.dma.WRITE_TEST
192	ok 15 pci_ep_data_transfer.dma.WRITE_TEST
193	#  RUN           pci_ep_data_transfer.dma.COPY_TEST ...
194	#            OK  pci_ep_data_transfer.dma.COPY_TEST
195	ok 16 pci_ep_data_transfer.dma.COPY_TEST
196	# PASSED: 16 / 16 tests passed.
197	# Totals: pass:16 fail:0 xfail:0 xpass:0 skip:0 error:0
198
199
200Testcase 16 (pci_ep_data_transfer.dma.COPY_TEST) will fail for most of the DMA
201capable endpoint controllers due to the absence of the MEMCPY over DMA. For such
202controllers, it is advisable to skip this testcase using this
203command::
204
205	# pci_endpoint_test -f pci_ep_bar -f pci_ep_basic -v memcpy -T COPY_TEST -v dma
206