Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at master 289 lines 6.5 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Kselftest for PCI Endpoint Subsystem 4 * 5 * Copyright (c) 2022 Samsung Electronics Co., Ltd. 6 * https://www.samsung.com 7 * Author: Aman Gupta <aman1.gupta@samsung.com> 8 * 9 * Copyright (c) 2024, Linaro Ltd. 10 * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 11 */ 12 13#include <errno.h> 14#include <fcntl.h> 15#include <stdbool.h> 16#include <stdio.h> 17#include <stdlib.h> 18#include <sys/ioctl.h> 19#include <unistd.h> 20 21#include "../../../../include/uapi/linux/pcitest.h" 22 23#include "kselftest_harness.h" 24 25#define pci_ep_ioctl(cmd, arg) \ 26({ \ 27 ret = ioctl(self->fd, cmd, arg); \ 28 ret = ret < 0 ? -errno : ret; \ 29}) 30 31static const char *test_device = "/dev/pci-endpoint-test.0"; 32static const unsigned long test_size[5] = { 1, 1024, 1025, 1024000, 1024001 }; 33 34FIXTURE(pci_ep_bar) 35{ 36 int fd; 37}; 38 39FIXTURE_SETUP(pci_ep_bar) 40{ 41 self->fd = open(test_device, O_RDWR); 42 43 ASSERT_NE(-1, self->fd) TH_LOG("Can't open PCI Endpoint Test device"); 44} 45 46FIXTURE_TEARDOWN(pci_ep_bar) 47{ 48 close(self->fd); 49} 50 51FIXTURE_VARIANT(pci_ep_bar) 52{ 53 int barno; 54}; 55 56FIXTURE_VARIANT_ADD(pci_ep_bar, BAR0) { .barno = 0 }; 57FIXTURE_VARIANT_ADD(pci_ep_bar, BAR1) { .barno = 1 }; 58FIXTURE_VARIANT_ADD(pci_ep_bar, BAR2) { .barno = 2 }; 59FIXTURE_VARIANT_ADD(pci_ep_bar, BAR3) { .barno = 3 }; 60FIXTURE_VARIANT_ADD(pci_ep_bar, BAR4) { .barno = 4 }; 61FIXTURE_VARIANT_ADD(pci_ep_bar, BAR5) { .barno = 5 }; 62 63TEST_F(pci_ep_bar, BAR_TEST) 64{ 65 int ret; 66 67 pci_ep_ioctl(PCITEST_BAR, variant->barno); 68 if (ret == -ENODATA) 69 SKIP(return, "BAR is disabled"); 70 if (ret == -ENOBUFS) 71 SKIP(return, "BAR is reserved"); 72 EXPECT_FALSE(ret) TH_LOG("Test failed for BAR%d", variant->barno); 73} 74 75TEST_F(pci_ep_bar, BAR_SUBRANGE_TEST) 76{ 77 int ret; 78 79 pci_ep_ioctl(PCITEST_SET_IRQTYPE, PCITEST_IRQ_TYPE_AUTO); 80 ASSERT_EQ(0, ret) TH_LOG("Can't set AUTO IRQ type"); 81 82 pci_ep_ioctl(PCITEST_BAR_SUBRANGE, variant->barno); 83 if (ret == -ENODATA) 84 SKIP(return, "BAR is disabled"); 85 if (ret == -EBUSY) 86 SKIP(return, "BAR is test register space"); 87 if (ret == -EOPNOTSUPP) 88 SKIP(return, "Subrange map is not supported"); 89 if (ret == -ENOBUFS) 90 SKIP(return, "BAR is reserved"); 91 if (ret == -ENOSPC) 92 SKIP(return, "Not enough inbound windows"); 93 EXPECT_FALSE(ret) TH_LOG("Test failed for BAR%d", variant->barno); 94} 95 96FIXTURE(pci_ep_basic) 97{ 98 int fd; 99}; 100 101FIXTURE_SETUP(pci_ep_basic) 102{ 103 self->fd = open(test_device, O_RDWR); 104 105 ASSERT_NE(-1, self->fd) TH_LOG("Can't open PCI Endpoint Test device"); 106} 107 108FIXTURE_TEARDOWN(pci_ep_basic) 109{ 110 close(self->fd); 111} 112 113TEST_F(pci_ep_basic, CONSECUTIVE_BAR_TEST) 114{ 115 int ret; 116 117 pci_ep_ioctl(PCITEST_BARS, 0); 118 EXPECT_FALSE(ret) TH_LOG("Consecutive BAR test failed"); 119} 120 121TEST_F(pci_ep_basic, LEGACY_IRQ_TEST) 122{ 123 int ret; 124 125 pci_ep_ioctl(PCITEST_SET_IRQTYPE, PCITEST_IRQ_TYPE_INTX); 126 ASSERT_EQ(0, ret) TH_LOG("Can't set Legacy IRQ type"); 127 128 pci_ep_ioctl(PCITEST_GET_IRQTYPE, 0); 129 ASSERT_EQ(PCITEST_IRQ_TYPE_INTX, ret) TH_LOG("Can't get Legacy IRQ type"); 130 131 pci_ep_ioctl(PCITEST_LEGACY_IRQ, 0); 132 EXPECT_FALSE(ret) TH_LOG("Test failed for Legacy IRQ"); 133} 134 135TEST_F(pci_ep_basic, MSI_TEST) 136{ 137 int ret, i; 138 139 pci_ep_ioctl(PCITEST_SET_IRQTYPE, PCITEST_IRQ_TYPE_MSI); 140 ASSERT_EQ(0, ret) TH_LOG("Can't set MSI IRQ type"); 141 142 pci_ep_ioctl(PCITEST_GET_IRQTYPE, 0); 143 ASSERT_EQ(PCITEST_IRQ_TYPE_MSI, ret) TH_LOG("Can't get MSI IRQ type"); 144 145 for (i = 1; i <= 32; i++) { 146 pci_ep_ioctl(PCITEST_MSI, i); 147 if (ret == -EINVAL) 148 SKIP(return, "MSI%d is disabled", i); 149 EXPECT_FALSE(ret) TH_LOG("Test failed for MSI%d", i); 150 } 151} 152 153TEST_F(pci_ep_basic, MSIX_TEST) 154{ 155 int ret, i; 156 157 pci_ep_ioctl(PCITEST_SET_IRQTYPE, PCITEST_IRQ_TYPE_MSIX); 158 ASSERT_EQ(0, ret) TH_LOG("Can't set MSI-X IRQ type"); 159 160 pci_ep_ioctl(PCITEST_GET_IRQTYPE, 0); 161 ASSERT_EQ(PCITEST_IRQ_TYPE_MSIX, ret) TH_LOG("Can't get MSI-X IRQ type"); 162 163 for (i = 1; i <= 2048; i++) { 164 pci_ep_ioctl(PCITEST_MSIX, i); 165 if (ret == -EINVAL) 166 SKIP(return, "MSI-X%d is disabled", i); 167 EXPECT_FALSE(ret) TH_LOG("Test failed for MSI-X%d", i); 168 } 169} 170 171FIXTURE(pci_ep_data_transfer) 172{ 173 int fd; 174}; 175 176FIXTURE_SETUP(pci_ep_data_transfer) 177{ 178 self->fd = open(test_device, O_RDWR); 179 180 ASSERT_NE(-1, self->fd) TH_LOG("Can't open PCI Endpoint Test device"); 181} 182 183FIXTURE_TEARDOWN(pci_ep_data_transfer) 184{ 185 close(self->fd); 186} 187 188FIXTURE_VARIANT(pci_ep_data_transfer) 189{ 190 bool use_dma; 191}; 192 193FIXTURE_VARIANT_ADD(pci_ep_data_transfer, memcpy) 194{ 195 .use_dma = false, 196}; 197 198FIXTURE_VARIANT_ADD(pci_ep_data_transfer, dma) 199{ 200 .use_dma = true, 201}; 202 203TEST_F(pci_ep_data_transfer, READ_TEST) 204{ 205 struct pci_endpoint_test_xfer_param param = {}; 206 int ret, i; 207 208 if (variant->use_dma) 209 param.flags = PCITEST_FLAGS_USE_DMA; 210 211 pci_ep_ioctl(PCITEST_SET_IRQTYPE, PCITEST_IRQ_TYPE_AUTO); 212 ASSERT_EQ(0, ret) TH_LOG("Can't set AUTO IRQ type"); 213 214 for (i = 0; i < ARRAY_SIZE(test_size); i++) { 215 param.size = test_size[i]; 216 pci_ep_ioctl(PCITEST_READ, &param); 217 EXPECT_FALSE(ret) TH_LOG("Test failed for size (%ld)", 218 test_size[i]); 219 } 220} 221 222TEST_F(pci_ep_data_transfer, WRITE_TEST) 223{ 224 struct pci_endpoint_test_xfer_param param = {}; 225 int ret, i; 226 227 if (variant->use_dma) 228 param.flags = PCITEST_FLAGS_USE_DMA; 229 230 pci_ep_ioctl(PCITEST_SET_IRQTYPE, PCITEST_IRQ_TYPE_AUTO); 231 ASSERT_EQ(0, ret) TH_LOG("Can't set AUTO IRQ type"); 232 233 for (i = 0; i < ARRAY_SIZE(test_size); i++) { 234 param.size = test_size[i]; 235 pci_ep_ioctl(PCITEST_WRITE, &param); 236 EXPECT_FALSE(ret) TH_LOG("Test failed for size (%ld)", 237 test_size[i]); 238 } 239} 240 241TEST_F(pci_ep_data_transfer, COPY_TEST) 242{ 243 struct pci_endpoint_test_xfer_param param = {}; 244 int ret, i; 245 246 if (variant->use_dma) 247 param.flags = PCITEST_FLAGS_USE_DMA; 248 249 pci_ep_ioctl(PCITEST_SET_IRQTYPE, PCITEST_IRQ_TYPE_AUTO); 250 ASSERT_EQ(0, ret) TH_LOG("Can't set AUTO IRQ type"); 251 252 for (i = 0; i < ARRAY_SIZE(test_size); i++) { 253 param.size = test_size[i]; 254 pci_ep_ioctl(PCITEST_COPY, &param); 255 EXPECT_FALSE(ret) TH_LOG("Test failed for size (%ld)", 256 test_size[i]); 257 } 258} 259 260FIXTURE(pcie_ep_doorbell) 261{ 262 int fd; 263}; 264 265FIXTURE_SETUP(pcie_ep_doorbell) 266{ 267 self->fd = open(test_device, O_RDWR); 268 269 ASSERT_NE(-1, self->fd) TH_LOG("Can't open PCI Endpoint Test device"); 270}; 271 272FIXTURE_TEARDOWN(pcie_ep_doorbell) 273{ 274 close(self->fd); 275}; 276 277TEST_F(pcie_ep_doorbell, DOORBELL_TEST) 278{ 279 int ret; 280 281 pci_ep_ioctl(PCITEST_SET_IRQTYPE, PCITEST_IRQ_TYPE_AUTO); 282 ASSERT_EQ(0, ret) TH_LOG("Can't set AUTO IRQ type"); 283 284 pci_ep_ioctl(PCITEST_DOORBELL, 0); 285 if (ret == -EOPNOTSUPP) 286 SKIP(return, "Doorbell test is not supported"); 287 EXPECT_FALSE(ret) TH_LOG("Test failed for Doorbell\n"); 288} 289TEST_HARNESS_MAIN