Lines Matching full:test
2 * Host side test driver to test endpoint functionality
38 #define DRV_MODULE_NAME "pci-endpoint-test"
126 static inline u32 pci_endpoint_test_readl(struct pci_endpoint_test *test, in pci_endpoint_test_readl() argument
129 return readl(test->base + offset); in pci_endpoint_test_readl()
132 static inline void pci_endpoint_test_writel(struct pci_endpoint_test *test, in pci_endpoint_test_writel() argument
135 writel(value, test->base + offset); in pci_endpoint_test_writel()
138 static inline u32 pci_endpoint_test_bar_readl(struct pci_endpoint_test *test, in pci_endpoint_test_bar_readl() argument
141 return readl(test->bar[bar] + offset); in pci_endpoint_test_bar_readl()
144 static inline void pci_endpoint_test_bar_writel(struct pci_endpoint_test *test, in pci_endpoint_test_bar_writel() argument
147 writel(value, test->bar[bar] + offset); in pci_endpoint_test_bar_writel()
152 struct pci_endpoint_test *test = dev_id; in pci_endpoint_test_irqhandler() local
155 reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS); in pci_endpoint_test_irqhandler()
157 test->last_irq = irq; in pci_endpoint_test_irqhandler()
158 complete(&test->irq_raised); in pci_endpoint_test_irqhandler()
161 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_STATUS, in pci_endpoint_test_irqhandler()
167 static void pci_endpoint_test_free_irq_vectors(struct pci_endpoint_test *test) in pci_endpoint_test_free_irq_vectors() argument
169 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_free_irq_vectors()
172 test->irq_type = IRQ_TYPE_UNDEFINED; in pci_endpoint_test_free_irq_vectors()
175 static bool pci_endpoint_test_alloc_irq_vectors(struct pci_endpoint_test *test, in pci_endpoint_test_alloc_irq_vectors() argument
179 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_alloc_irq_vectors()
208 test->irq_type = type; in pci_endpoint_test_alloc_irq_vectors()
209 test->num_irqs = irq; in pci_endpoint_test_alloc_irq_vectors()
214 static void pci_endpoint_test_release_irq(struct pci_endpoint_test *test) in pci_endpoint_test_release_irq() argument
217 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_release_irq()
220 for (i = 0; i < test->num_irqs; i++) in pci_endpoint_test_release_irq()
221 devm_free_irq(dev, pci_irq_vector(pdev, i), test); in pci_endpoint_test_release_irq()
223 test->num_irqs = 0; in pci_endpoint_test_release_irq()
226 static bool pci_endpoint_test_request_irq(struct pci_endpoint_test *test) in pci_endpoint_test_request_irq() argument
230 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_request_irq()
233 for (i = 0; i < test->num_irqs; i++) { in pci_endpoint_test_request_irq()
236 IRQF_SHARED, DRV_MODULE_NAME, test); in pci_endpoint_test_request_irq()
264 static bool pci_endpoint_test_bar(struct pci_endpoint_test *test, in pci_endpoint_test_bar() argument
270 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_bar()
272 if (!test->bar[barno]) in pci_endpoint_test_bar()
277 if (barno == test->test_reg_bar) in pci_endpoint_test_bar()
281 pci_endpoint_test_bar_writel(test, barno, j, 0xA0A0A0A0); in pci_endpoint_test_bar()
284 val = pci_endpoint_test_bar_readl(test, barno, j); in pci_endpoint_test_bar()
292 static bool pci_endpoint_test_legacy_irq(struct pci_endpoint_test *test) in pci_endpoint_test_legacy_irq() argument
296 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, in pci_endpoint_test_legacy_irq()
298 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 0); in pci_endpoint_test_legacy_irq()
299 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_legacy_irq()
301 val = wait_for_completion_timeout(&test->irq_raised, in pci_endpoint_test_legacy_irq()
309 static bool pci_endpoint_test_msi_irq(struct pci_endpoint_test *test, in pci_endpoint_test_msi_irq() argument
313 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_msi_irq()
315 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, in pci_endpoint_test_msi_irq()
318 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, msi_num); in pci_endpoint_test_msi_irq()
319 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_msi_irq()
322 val = wait_for_completion_timeout(&test->irq_raised, in pci_endpoint_test_msi_irq()
327 if (pci_irq_vector(pdev, msi_num - 1) == test->last_irq) in pci_endpoint_test_msi_irq()
333 static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size) in pci_endpoint_test_copy() argument
340 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_copy()
347 size_t alignment = test->alignment; in pci_endpoint_test_copy()
348 int irq_type = test->irq_type; in pci_endpoint_test_copy()
377 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR, in pci_endpoint_test_copy()
380 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR, in pci_endpoint_test_copy()
403 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR, in pci_endpoint_test_copy()
405 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR, in pci_endpoint_test_copy()
408 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, in pci_endpoint_test_copy()
411 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); in pci_endpoint_test_copy()
412 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); in pci_endpoint_test_copy()
413 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_copy()
416 wait_for_completion(&test->irq_raised); in pci_endpoint_test_copy()
433 static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size) in pci_endpoint_test_write() argument
439 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_write()
444 size_t alignment = test->alignment; in pci_endpoint_test_write()
445 int irq_type = test->irq_type; in pci_endpoint_test_write()
476 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_CHECKSUM, in pci_endpoint_test_write()
479 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR, in pci_endpoint_test_write()
481 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR, in pci_endpoint_test_write()
484 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size); in pci_endpoint_test_write()
486 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); in pci_endpoint_test_write()
487 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); in pci_endpoint_test_write()
488 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_write()
491 wait_for_completion(&test->irq_raised); in pci_endpoint_test_write()
493 reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS); in pci_endpoint_test_write()
503 static bool pci_endpoint_test_read(struct pci_endpoint_test *test, size_t size) in pci_endpoint_test_read() argument
508 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_read()
513 size_t alignment = test->alignment; in pci_endpoint_test_read()
514 int irq_type = test->irq_type; in pci_endpoint_test_read()
542 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR, in pci_endpoint_test_read()
544 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR, in pci_endpoint_test_read()
547 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size); in pci_endpoint_test_read()
549 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); in pci_endpoint_test_read()
550 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); in pci_endpoint_test_read()
551 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_read()
554 wait_for_completion(&test->irq_raised); in pci_endpoint_test_read()
557 if (crc32 == pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM)) in pci_endpoint_test_read()
565 static bool pci_endpoint_test_set_irq(struct pci_endpoint_test *test, in pci_endpoint_test_set_irq() argument
568 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_set_irq()
576 if (test->irq_type == req_irq_type) in pci_endpoint_test_set_irq()
579 pci_endpoint_test_release_irq(test); in pci_endpoint_test_set_irq()
580 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_set_irq()
582 if (!pci_endpoint_test_alloc_irq_vectors(test, req_irq_type)) in pci_endpoint_test_set_irq()
585 if (!pci_endpoint_test_request_irq(test)) in pci_endpoint_test_set_irq()
591 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_set_irq()
600 struct pci_endpoint_test *test = to_endpoint_test(file->private_data); in pci_endpoint_test_ioctl() local
601 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_ioctl()
603 mutex_lock(&test->mutex); in pci_endpoint_test_ioctl()
611 ret = pci_endpoint_test_bar(test, bar); in pci_endpoint_test_ioctl()
614 ret = pci_endpoint_test_legacy_irq(test); in pci_endpoint_test_ioctl()
618 ret = pci_endpoint_test_msi_irq(test, arg, cmd == PCITEST_MSIX); in pci_endpoint_test_ioctl()
621 ret = pci_endpoint_test_write(test, arg); in pci_endpoint_test_ioctl()
624 ret = pci_endpoint_test_read(test, arg); in pci_endpoint_test_ioctl()
627 ret = pci_endpoint_test_copy(test, arg); in pci_endpoint_test_ioctl()
630 ret = pci_endpoint_test_set_irq(test, arg); in pci_endpoint_test_ioctl()
638 mutex_unlock(&test->mutex); in pci_endpoint_test_ioctl()
656 struct pci_endpoint_test *test; in pci_endpoint_test_probe() local
664 test = devm_kzalloc(dev, sizeof(*test), GFP_KERNEL); in pci_endpoint_test_probe()
665 if (!test) in pci_endpoint_test_probe()
668 test->test_reg_bar = 0; in pci_endpoint_test_probe()
669 test->alignment = 0; in pci_endpoint_test_probe()
670 test->pdev = pdev; in pci_endpoint_test_probe()
671 test->irq_type = IRQ_TYPE_UNDEFINED; in pci_endpoint_test_probe()
679 test->test_reg_bar = test_reg_bar; in pci_endpoint_test_probe()
680 test->alignment = data->alignment; in pci_endpoint_test_probe()
684 init_completion(&test->irq_raised); in pci_endpoint_test_probe()
685 mutex_init(&test->mutex); in pci_endpoint_test_probe()
701 if (!pci_endpoint_test_alloc_irq_vectors(test, irq_type)) in pci_endpoint_test_probe()
704 if (!pci_endpoint_test_request_irq(test)) in pci_endpoint_test_probe()
714 test->bar[bar] = base; in pci_endpoint_test_probe()
718 test->base = test->bar[test_reg_bar]; in pci_endpoint_test_probe()
719 if (!test->base) { in pci_endpoint_test_probe()
721 dev_err(dev, "Cannot perform PCI test without BAR%d\n", in pci_endpoint_test_probe()
726 pci_set_drvdata(pdev, test); in pci_endpoint_test_probe()
736 misc_device = &test->miscdev; in pci_endpoint_test_probe()
761 if (test->bar[bar]) in pci_endpoint_test_probe()
762 pci_iounmap(pdev, test->bar[bar]); in pci_endpoint_test_probe()
764 pci_endpoint_test_release_irq(test); in pci_endpoint_test_probe()
767 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_probe()
780 struct pci_endpoint_test *test = pci_get_drvdata(pdev); in pci_endpoint_test_remove() local
781 struct miscdevice *misc_device = &test->miscdev; in pci_endpoint_test_remove()
788 misc_deregister(&test->miscdev); in pci_endpoint_test_remove()
792 if (test->bar[bar]) in pci_endpoint_test_remove()
793 pci_iounmap(pdev, test->bar[bar]); in pci_endpoint_test_remove()
796 pci_endpoint_test_release_irq(test); in pci_endpoint_test_remove()
797 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_remove()
829 MODULE_DESCRIPTION("PCI ENDPOINT TEST HOST DRIVER");