xref: /linux/tools/testing/selftests/pci_endpoint/pci_endpoint_test.c (revision 647d69605c70368d54fc012fce8a43e8e5955b04)
1*392188bbSManivannan Sadhasivam // SPDX-License-Identifier: GPL-2.0
2*392188bbSManivannan Sadhasivam /*
3*392188bbSManivannan Sadhasivam  * Kselftest for PCI Endpoint Subsystem
4*392188bbSManivannan Sadhasivam  *
5*392188bbSManivannan Sadhasivam  * Copyright (c) 2022 Samsung Electronics Co., Ltd.
6*392188bbSManivannan Sadhasivam  *             https://www.samsung.com
7*392188bbSManivannan Sadhasivam  * Author: Aman Gupta <aman1.gupta@samsung.com>
8*392188bbSManivannan Sadhasivam  *
9*392188bbSManivannan Sadhasivam  * Copyright (c) 2024, Linaro Ltd.
10*392188bbSManivannan Sadhasivam  * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
11*392188bbSManivannan Sadhasivam  */
12*392188bbSManivannan Sadhasivam 
13*392188bbSManivannan Sadhasivam #include <errno.h>
14*392188bbSManivannan Sadhasivam #include <fcntl.h>
15*392188bbSManivannan Sadhasivam #include <stdbool.h>
16*392188bbSManivannan Sadhasivam #include <stdio.h>
17*392188bbSManivannan Sadhasivam #include <stdlib.h>
18*392188bbSManivannan Sadhasivam #include <sys/ioctl.h>
19*392188bbSManivannan Sadhasivam #include <unistd.h>
20*392188bbSManivannan Sadhasivam 
21*392188bbSManivannan Sadhasivam #include "../../../../include/uapi/linux/pcitest.h"
22*392188bbSManivannan Sadhasivam 
23*392188bbSManivannan Sadhasivam #include "../kselftest_harness.h"
24*392188bbSManivannan Sadhasivam 
25*392188bbSManivannan Sadhasivam #define pci_ep_ioctl(cmd, arg)			\
26*392188bbSManivannan Sadhasivam ({						\
27*392188bbSManivannan Sadhasivam 	ret = ioctl(self->fd, cmd, arg);	\
28*392188bbSManivannan Sadhasivam 	ret = ret < 0 ? -errno : 0;		\
29*392188bbSManivannan Sadhasivam })
30*392188bbSManivannan Sadhasivam 
31*392188bbSManivannan Sadhasivam static const char *test_device = "/dev/pci-endpoint-test.0";
32*392188bbSManivannan Sadhasivam static const unsigned long test_size[5] = { 1, 1024, 1025, 1024000, 1024001 };
33*392188bbSManivannan Sadhasivam 
34*392188bbSManivannan Sadhasivam FIXTURE(pci_ep_bar)
35*392188bbSManivannan Sadhasivam {
36*392188bbSManivannan Sadhasivam 	int fd;
37*392188bbSManivannan Sadhasivam };
38*392188bbSManivannan Sadhasivam 
39*392188bbSManivannan Sadhasivam FIXTURE_SETUP(pci_ep_bar)
40*392188bbSManivannan Sadhasivam {
41*392188bbSManivannan Sadhasivam 	self->fd = open(test_device, O_RDWR);
42*392188bbSManivannan Sadhasivam 
43*392188bbSManivannan Sadhasivam 	ASSERT_NE(-1, self->fd) TH_LOG("Can't open PCI Endpoint Test device");
44*392188bbSManivannan Sadhasivam }
45*392188bbSManivannan Sadhasivam 
46*392188bbSManivannan Sadhasivam FIXTURE_TEARDOWN(pci_ep_bar)
47*392188bbSManivannan Sadhasivam {
48*392188bbSManivannan Sadhasivam 	close(self->fd);
49*392188bbSManivannan Sadhasivam }
50*392188bbSManivannan Sadhasivam 
51*392188bbSManivannan Sadhasivam FIXTURE_VARIANT(pci_ep_bar)
52*392188bbSManivannan Sadhasivam {
53*392188bbSManivannan Sadhasivam 	int barno;
54*392188bbSManivannan Sadhasivam };
55*392188bbSManivannan Sadhasivam 
56*392188bbSManivannan Sadhasivam FIXTURE_VARIANT_ADD(pci_ep_bar, BAR0) { .barno = 0 };
57*392188bbSManivannan Sadhasivam FIXTURE_VARIANT_ADD(pci_ep_bar, BAR1) { .barno = 1 };
58*392188bbSManivannan Sadhasivam FIXTURE_VARIANT_ADD(pci_ep_bar, BAR2) { .barno = 2 };
59*392188bbSManivannan Sadhasivam FIXTURE_VARIANT_ADD(pci_ep_bar, BAR3) { .barno = 3 };
60*392188bbSManivannan Sadhasivam FIXTURE_VARIANT_ADD(pci_ep_bar, BAR4) { .barno = 4 };
61*392188bbSManivannan Sadhasivam FIXTURE_VARIANT_ADD(pci_ep_bar, BAR5) { .barno = 5 };
62*392188bbSManivannan Sadhasivam 
63*392188bbSManivannan Sadhasivam TEST_F(pci_ep_bar, BAR_TEST)
64*392188bbSManivannan Sadhasivam {
65*392188bbSManivannan Sadhasivam 	int ret;
66*392188bbSManivannan Sadhasivam 
67*392188bbSManivannan Sadhasivam 	pci_ep_ioctl(PCITEST_BAR, variant->barno);
68*392188bbSManivannan Sadhasivam 	EXPECT_FALSE(ret) TH_LOG("Test failed for BAR%d", variant->barno);
69*392188bbSManivannan Sadhasivam }
70*392188bbSManivannan Sadhasivam 
71*392188bbSManivannan Sadhasivam FIXTURE(pci_ep_basic)
72*392188bbSManivannan Sadhasivam {
73*392188bbSManivannan Sadhasivam 	int fd;
74*392188bbSManivannan Sadhasivam };
75*392188bbSManivannan Sadhasivam 
76*392188bbSManivannan Sadhasivam FIXTURE_SETUP(pci_ep_basic)
77*392188bbSManivannan Sadhasivam {
78*392188bbSManivannan Sadhasivam 	self->fd = open(test_device, O_RDWR);
79*392188bbSManivannan Sadhasivam 
80*392188bbSManivannan Sadhasivam 	ASSERT_NE(-1, self->fd) TH_LOG("Can't open PCI Endpoint Test device");
81*392188bbSManivannan Sadhasivam }
82*392188bbSManivannan Sadhasivam 
83*392188bbSManivannan Sadhasivam FIXTURE_TEARDOWN(pci_ep_basic)
84*392188bbSManivannan Sadhasivam {
85*392188bbSManivannan Sadhasivam 	close(self->fd);
86*392188bbSManivannan Sadhasivam }
87*392188bbSManivannan Sadhasivam 
88*392188bbSManivannan Sadhasivam TEST_F(pci_ep_basic, CONSECUTIVE_BAR_TEST)
89*392188bbSManivannan Sadhasivam {
90*392188bbSManivannan Sadhasivam 	int ret;
91*392188bbSManivannan Sadhasivam 
92*392188bbSManivannan Sadhasivam 	pci_ep_ioctl(PCITEST_BARS, 0);
93*392188bbSManivannan Sadhasivam 	EXPECT_FALSE(ret) TH_LOG("Consecutive BAR test failed");
94*392188bbSManivannan Sadhasivam }
95*392188bbSManivannan Sadhasivam 
96*392188bbSManivannan Sadhasivam TEST_F(pci_ep_basic, LEGACY_IRQ_TEST)
97*392188bbSManivannan Sadhasivam {
98*392188bbSManivannan Sadhasivam 	int ret;
99*392188bbSManivannan Sadhasivam 
100*392188bbSManivannan Sadhasivam 	pci_ep_ioctl(PCITEST_SET_IRQTYPE, 0);
101*392188bbSManivannan Sadhasivam 	ASSERT_EQ(0, ret) TH_LOG("Can't set Legacy IRQ type");
102*392188bbSManivannan Sadhasivam 
103*392188bbSManivannan Sadhasivam 	pci_ep_ioctl(PCITEST_LEGACY_IRQ, 0);
104*392188bbSManivannan Sadhasivam 	EXPECT_FALSE(ret) TH_LOG("Test failed for Legacy IRQ");
105*392188bbSManivannan Sadhasivam }
106*392188bbSManivannan Sadhasivam 
107*392188bbSManivannan Sadhasivam TEST_F(pci_ep_basic, MSI_TEST)
108*392188bbSManivannan Sadhasivam {
109*392188bbSManivannan Sadhasivam 	int ret, i;
110*392188bbSManivannan Sadhasivam 
111*392188bbSManivannan Sadhasivam 	pci_ep_ioctl(PCITEST_SET_IRQTYPE, 1);
112*392188bbSManivannan Sadhasivam 	ASSERT_EQ(0, ret) TH_LOG("Can't set MSI IRQ type");
113*392188bbSManivannan Sadhasivam 
114*392188bbSManivannan Sadhasivam 	for (i = 1; i <= 32; i++) {
115*392188bbSManivannan Sadhasivam 		pci_ep_ioctl(PCITEST_MSI, i);
116*392188bbSManivannan Sadhasivam 		EXPECT_FALSE(ret) TH_LOG("Test failed for MSI%d", i);
117*392188bbSManivannan Sadhasivam 	}
118*392188bbSManivannan Sadhasivam }
119*392188bbSManivannan Sadhasivam 
120*392188bbSManivannan Sadhasivam TEST_F(pci_ep_basic, MSIX_TEST)
121*392188bbSManivannan Sadhasivam {
122*392188bbSManivannan Sadhasivam 	int ret, i;
123*392188bbSManivannan Sadhasivam 
124*392188bbSManivannan Sadhasivam 	pci_ep_ioctl(PCITEST_SET_IRQTYPE, 2);
125*392188bbSManivannan Sadhasivam 	ASSERT_EQ(0, ret) TH_LOG("Can't set MSI-X IRQ type");
126*392188bbSManivannan Sadhasivam 
127*392188bbSManivannan Sadhasivam 	for (i = 1; i <= 2048; i++) {
128*392188bbSManivannan Sadhasivam 		pci_ep_ioctl(PCITEST_MSIX, i);
129*392188bbSManivannan Sadhasivam 		EXPECT_FALSE(ret) TH_LOG("Test failed for MSI-X%d", i);
130*392188bbSManivannan Sadhasivam 	}
131*392188bbSManivannan Sadhasivam }
132*392188bbSManivannan Sadhasivam 
133*392188bbSManivannan Sadhasivam FIXTURE(pci_ep_data_transfer)
134*392188bbSManivannan Sadhasivam {
135*392188bbSManivannan Sadhasivam 	int fd;
136*392188bbSManivannan Sadhasivam };
137*392188bbSManivannan Sadhasivam 
138*392188bbSManivannan Sadhasivam FIXTURE_SETUP(pci_ep_data_transfer)
139*392188bbSManivannan Sadhasivam {
140*392188bbSManivannan Sadhasivam 	self->fd = open(test_device, O_RDWR);
141*392188bbSManivannan Sadhasivam 
142*392188bbSManivannan Sadhasivam 	ASSERT_NE(-1, self->fd) TH_LOG("Can't open PCI Endpoint Test device");
143*392188bbSManivannan Sadhasivam }
144*392188bbSManivannan Sadhasivam 
145*392188bbSManivannan Sadhasivam FIXTURE_TEARDOWN(pci_ep_data_transfer)
146*392188bbSManivannan Sadhasivam {
147*392188bbSManivannan Sadhasivam 	close(self->fd);
148*392188bbSManivannan Sadhasivam }
149*392188bbSManivannan Sadhasivam 
150*392188bbSManivannan Sadhasivam FIXTURE_VARIANT(pci_ep_data_transfer)
151*392188bbSManivannan Sadhasivam {
152*392188bbSManivannan Sadhasivam 	bool use_dma;
153*392188bbSManivannan Sadhasivam };
154*392188bbSManivannan Sadhasivam 
155*392188bbSManivannan Sadhasivam FIXTURE_VARIANT_ADD(pci_ep_data_transfer, memcpy)
156*392188bbSManivannan Sadhasivam {
157*392188bbSManivannan Sadhasivam 	.use_dma = false,
158*392188bbSManivannan Sadhasivam };
159*392188bbSManivannan Sadhasivam 
160*392188bbSManivannan Sadhasivam FIXTURE_VARIANT_ADD(pci_ep_data_transfer, dma)
161*392188bbSManivannan Sadhasivam {
162*392188bbSManivannan Sadhasivam 	.use_dma = true,
163*392188bbSManivannan Sadhasivam };
164*392188bbSManivannan Sadhasivam 
165*392188bbSManivannan Sadhasivam TEST_F(pci_ep_data_transfer, READ_TEST)
166*392188bbSManivannan Sadhasivam {
167*392188bbSManivannan Sadhasivam 	struct pci_endpoint_test_xfer_param param = {};
168*392188bbSManivannan Sadhasivam 	int ret, i;
169*392188bbSManivannan Sadhasivam 
170*392188bbSManivannan Sadhasivam 	if (variant->use_dma)
171*392188bbSManivannan Sadhasivam 		param.flags = PCITEST_FLAGS_USE_DMA;
172*392188bbSManivannan Sadhasivam 
173*392188bbSManivannan Sadhasivam 	pci_ep_ioctl(PCITEST_SET_IRQTYPE, 1);
174*392188bbSManivannan Sadhasivam 	ASSERT_EQ(0, ret) TH_LOG("Can't set MSI IRQ type");
175*392188bbSManivannan Sadhasivam 
176*392188bbSManivannan Sadhasivam 	for (i = 0; i < ARRAY_SIZE(test_size); i++) {
177*392188bbSManivannan Sadhasivam 		param.size = test_size[i];
178*392188bbSManivannan Sadhasivam 		pci_ep_ioctl(PCITEST_READ, &param);
179*392188bbSManivannan Sadhasivam 		EXPECT_FALSE(ret) TH_LOG("Test failed for size (%ld)",
180*392188bbSManivannan Sadhasivam 					 test_size[i]);
181*392188bbSManivannan Sadhasivam 	}
182*392188bbSManivannan Sadhasivam }
183*392188bbSManivannan Sadhasivam 
184*392188bbSManivannan Sadhasivam TEST_F(pci_ep_data_transfer, WRITE_TEST)
185*392188bbSManivannan Sadhasivam {
186*392188bbSManivannan Sadhasivam 	struct pci_endpoint_test_xfer_param param = {};
187*392188bbSManivannan Sadhasivam 	int ret, i;
188*392188bbSManivannan Sadhasivam 
189*392188bbSManivannan Sadhasivam 	if (variant->use_dma)
190*392188bbSManivannan Sadhasivam 		param.flags = PCITEST_FLAGS_USE_DMA;
191*392188bbSManivannan Sadhasivam 
192*392188bbSManivannan Sadhasivam 	pci_ep_ioctl(PCITEST_SET_IRQTYPE, 1);
193*392188bbSManivannan Sadhasivam 	ASSERT_EQ(0, ret) TH_LOG("Can't set MSI IRQ type");
194*392188bbSManivannan Sadhasivam 
195*392188bbSManivannan Sadhasivam 	for (i = 0; i < ARRAY_SIZE(test_size); i++) {
196*392188bbSManivannan Sadhasivam 		param.size = test_size[i];
197*392188bbSManivannan Sadhasivam 		pci_ep_ioctl(PCITEST_WRITE, &param);
198*392188bbSManivannan Sadhasivam 		EXPECT_FALSE(ret) TH_LOG("Test failed for size (%ld)",
199*392188bbSManivannan Sadhasivam 					 test_size[i]);
200*392188bbSManivannan Sadhasivam 	}
201*392188bbSManivannan Sadhasivam }
202*392188bbSManivannan Sadhasivam 
203*392188bbSManivannan Sadhasivam TEST_F(pci_ep_data_transfer, COPY_TEST)
204*392188bbSManivannan Sadhasivam {
205*392188bbSManivannan Sadhasivam 	struct pci_endpoint_test_xfer_param param = {};
206*392188bbSManivannan Sadhasivam 	int ret, i;
207*392188bbSManivannan Sadhasivam 
208*392188bbSManivannan Sadhasivam 	if (variant->use_dma)
209*392188bbSManivannan Sadhasivam 		param.flags = PCITEST_FLAGS_USE_DMA;
210*392188bbSManivannan Sadhasivam 
211*392188bbSManivannan Sadhasivam 	pci_ep_ioctl(PCITEST_SET_IRQTYPE, 1);
212*392188bbSManivannan Sadhasivam 	ASSERT_EQ(0, ret) TH_LOG("Can't set MSI IRQ type");
213*392188bbSManivannan Sadhasivam 
214*392188bbSManivannan Sadhasivam 	for (i = 0; i < ARRAY_SIZE(test_size); i++) {
215*392188bbSManivannan Sadhasivam 		param.size = test_size[i];
216*392188bbSManivannan Sadhasivam 		pci_ep_ioctl(PCITEST_COPY, &param);
217*392188bbSManivannan Sadhasivam 		EXPECT_FALSE(ret) TH_LOG("Test failed for size (%ld)",
218*392188bbSManivannan Sadhasivam 					 test_size[i]);
219*392188bbSManivannan Sadhasivam 	}
220*392188bbSManivannan Sadhasivam }
221*392188bbSManivannan Sadhasivam TEST_HARNESS_MAIN
222