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, ¶m); 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, ¶m); 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, ¶m); 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