Lines Matching full:test
3 * Host side test driver to test endpoint functionality
28 #define DRV_MODULE_NAME "pci-endpoint-test"
127 static inline u32 pci_endpoint_test_readl(struct pci_endpoint_test *test, in pci_endpoint_test_readl() argument
130 return readl(test->base + offset); in pci_endpoint_test_readl()
133 static inline void pci_endpoint_test_writel(struct pci_endpoint_test *test, in pci_endpoint_test_writel() argument
136 writel(value, test->base + offset); in pci_endpoint_test_writel()
139 static inline u32 pci_endpoint_test_bar_readl(struct pci_endpoint_test *test, in pci_endpoint_test_bar_readl() argument
142 return readl(test->bar[bar] + offset); in pci_endpoint_test_bar_readl()
145 static inline void pci_endpoint_test_bar_writel(struct pci_endpoint_test *test, in pci_endpoint_test_bar_writel() argument
148 writel(value, test->bar[bar] + offset); in pci_endpoint_test_bar_writel()
153 struct pci_endpoint_test *test = dev_id; in pci_endpoint_test_irqhandler() local
156 reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS); in pci_endpoint_test_irqhandler()
158 test->last_irq = irq; in pci_endpoint_test_irqhandler()
159 complete(&test->irq_raised); in pci_endpoint_test_irqhandler()
162 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_STATUS, in pci_endpoint_test_irqhandler()
168 static void pci_endpoint_test_free_irq_vectors(struct pci_endpoint_test *test) in pci_endpoint_test_free_irq_vectors() argument
170 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_free_irq_vectors()
173 test->irq_type = IRQ_TYPE_UNDEFINED; in pci_endpoint_test_free_irq_vectors()
176 static bool pci_endpoint_test_alloc_irq_vectors(struct pci_endpoint_test *test, in pci_endpoint_test_alloc_irq_vectors() argument
180 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_alloc_irq_vectors()
209 test->irq_type = type; in pci_endpoint_test_alloc_irq_vectors()
210 test->num_irqs = irq; in pci_endpoint_test_alloc_irq_vectors()
215 static void pci_endpoint_test_release_irq(struct pci_endpoint_test *test) in pci_endpoint_test_release_irq() argument
218 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_release_irq()
221 for (i = 0; i < test->num_irqs; i++) in pci_endpoint_test_release_irq()
222 devm_free_irq(dev, pci_irq_vector(pdev, i), test); in pci_endpoint_test_release_irq()
224 test->num_irqs = 0; in pci_endpoint_test_release_irq()
227 static bool pci_endpoint_test_request_irq(struct pci_endpoint_test *test) in pci_endpoint_test_request_irq() argument
231 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_request_irq()
234 for (i = 0; i < test->num_irqs; i++) { in pci_endpoint_test_request_irq()
237 IRQF_SHARED, test->name, test); in pci_endpoint_test_request_irq()
265 static bool pci_endpoint_test_bar(struct pci_endpoint_test *test, in pci_endpoint_test_bar() argument
271 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_bar()
273 if (!test->bar[barno]) in pci_endpoint_test_bar()
278 if (barno == test->test_reg_bar) in pci_endpoint_test_bar()
282 pci_endpoint_test_bar_writel(test, barno, j, 0xA0A0A0A0); in pci_endpoint_test_bar()
285 val = pci_endpoint_test_bar_readl(test, barno, j); in pci_endpoint_test_bar()
293 static bool pci_endpoint_test_legacy_irq(struct pci_endpoint_test *test) in pci_endpoint_test_legacy_irq() argument
297 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, in pci_endpoint_test_legacy_irq()
299 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 0); in pci_endpoint_test_legacy_irq()
300 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_legacy_irq()
302 val = wait_for_completion_timeout(&test->irq_raised, in pci_endpoint_test_legacy_irq()
310 static bool pci_endpoint_test_msi_irq(struct pci_endpoint_test *test, in pci_endpoint_test_msi_irq() argument
314 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_msi_irq()
316 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, in pci_endpoint_test_msi_irq()
319 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, msi_num); in pci_endpoint_test_msi_irq()
320 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_msi_irq()
323 val = wait_for_completion_timeout(&test->irq_raised, in pci_endpoint_test_msi_irq()
328 if (pci_irq_vector(pdev, msi_num - 1) == test->last_irq) in pci_endpoint_test_msi_irq()
334 static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, in pci_endpoint_test_copy() argument
346 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_copy()
353 size_t alignment = test->alignment; in pci_endpoint_test_copy()
354 int irq_type = test->irq_type; in pci_endpoint_test_copy()
403 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR, in pci_endpoint_test_copy()
406 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR, in pci_endpoint_test_copy()
435 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR, in pci_endpoint_test_copy()
437 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR, in pci_endpoint_test_copy()
440 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, in pci_endpoint_test_copy()
443 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags); in pci_endpoint_test_copy()
444 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); in pci_endpoint_test_copy()
445 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); in pci_endpoint_test_copy()
446 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_copy()
449 wait_for_completion(&test->irq_raised); in pci_endpoint_test_copy()
472 static bool pci_endpoint_test_write(struct pci_endpoint_test *test, in pci_endpoint_test_write() argument
482 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_write()
487 size_t alignment = test->alignment; in pci_endpoint_test_write()
488 int irq_type = test->irq_type; in pci_endpoint_test_write()
539 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_CHECKSUM, in pci_endpoint_test_write()
542 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR, in pci_endpoint_test_write()
544 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR, in pci_endpoint_test_write()
547 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size); in pci_endpoint_test_write()
549 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags); in pci_endpoint_test_write()
550 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); in pci_endpoint_test_write()
551 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); in pci_endpoint_test_write()
552 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_write()
555 wait_for_completion(&test->irq_raised); in pci_endpoint_test_write()
557 reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS); in pci_endpoint_test_write()
571 static bool pci_endpoint_test_read(struct pci_endpoint_test *test, in pci_endpoint_test_read() argument
581 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_read()
586 size_t alignment = test->alignment; in pci_endpoint_test_read()
587 int irq_type = test->irq_type; in pci_endpoint_test_read()
634 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR, in pci_endpoint_test_read()
636 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR, in pci_endpoint_test_read()
639 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size); in pci_endpoint_test_read()
641 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags); in pci_endpoint_test_read()
642 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); in pci_endpoint_test_read()
643 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); in pci_endpoint_test_read()
644 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_read()
647 wait_for_completion(&test->irq_raised); in pci_endpoint_test_read()
653 if (crc32 == pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM)) in pci_endpoint_test_read()
662 static bool pci_endpoint_test_clear_irq(struct pci_endpoint_test *test) in pci_endpoint_test_clear_irq() argument
664 pci_endpoint_test_release_irq(test); in pci_endpoint_test_clear_irq()
665 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_clear_irq()
669 static bool pci_endpoint_test_set_irq(struct pci_endpoint_test *test, in pci_endpoint_test_set_irq() argument
672 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_set_irq()
680 if (test->irq_type == req_irq_type) in pci_endpoint_test_set_irq()
683 pci_endpoint_test_release_irq(test); in pci_endpoint_test_set_irq()
684 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_set_irq()
686 if (!pci_endpoint_test_alloc_irq_vectors(test, req_irq_type)) in pci_endpoint_test_set_irq()
689 if (!pci_endpoint_test_request_irq(test)) in pci_endpoint_test_set_irq()
695 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_set_irq()
704 struct pci_endpoint_test *test = to_endpoint_test(file->private_data); in pci_endpoint_test_ioctl() local
705 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_ioctl()
707 mutex_lock(&test->mutex); in pci_endpoint_test_ioctl()
715 ret = pci_endpoint_test_bar(test, bar); in pci_endpoint_test_ioctl()
718 ret = pci_endpoint_test_legacy_irq(test); in pci_endpoint_test_ioctl()
722 ret = pci_endpoint_test_msi_irq(test, arg, cmd == PCITEST_MSIX); in pci_endpoint_test_ioctl()
725 ret = pci_endpoint_test_write(test, arg); in pci_endpoint_test_ioctl()
728 ret = pci_endpoint_test_read(test, arg); in pci_endpoint_test_ioctl()
731 ret = pci_endpoint_test_copy(test, arg); in pci_endpoint_test_ioctl()
734 ret = pci_endpoint_test_set_irq(test, arg); in pci_endpoint_test_ioctl()
740 ret = pci_endpoint_test_clear_irq(test); in pci_endpoint_test_ioctl()
745 mutex_unlock(&test->mutex); in pci_endpoint_test_ioctl()
763 struct pci_endpoint_test *test; in pci_endpoint_test_probe() local
771 test = devm_kzalloc(dev, sizeof(*test), GFP_KERNEL); in pci_endpoint_test_probe()
772 if (!test) in pci_endpoint_test_probe()
775 test->test_reg_bar = 0; in pci_endpoint_test_probe()
776 test->alignment = 0; in pci_endpoint_test_probe()
777 test->pdev = pdev; in pci_endpoint_test_probe()
778 test->irq_type = IRQ_TYPE_UNDEFINED; in pci_endpoint_test_probe()
786 test->test_reg_bar = test_reg_bar; in pci_endpoint_test_probe()
787 test->alignment = data->alignment; in pci_endpoint_test_probe()
791 init_completion(&test->irq_raised); in pci_endpoint_test_probe()
792 mutex_init(&test->mutex); in pci_endpoint_test_probe()
814 if (!pci_endpoint_test_alloc_irq_vectors(test, irq_type)) in pci_endpoint_test_probe()
824 test->bar[bar] = base; in pci_endpoint_test_probe()
828 test->base = test->bar[test_reg_bar]; in pci_endpoint_test_probe()
829 if (!test->base) { in pci_endpoint_test_probe()
831 dev_err(dev, "Cannot perform PCI test without BAR%d\n", in pci_endpoint_test_probe()
836 pci_set_drvdata(pdev, test); in pci_endpoint_test_probe()
846 test->name = kstrdup(name, GFP_KERNEL); in pci_endpoint_test_probe()
847 if (!test->name) { in pci_endpoint_test_probe()
852 if (!pci_endpoint_test_request_irq(test)) in pci_endpoint_test_probe()
855 misc_device = &test->miscdev; in pci_endpoint_test_probe()
876 pci_endpoint_test_release_irq(test); in pci_endpoint_test_probe()
879 kfree(test->name); in pci_endpoint_test_probe()
886 if (test->bar[bar]) in pci_endpoint_test_probe()
887 pci_iounmap(pdev, test->bar[bar]); in pci_endpoint_test_probe()
891 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_probe()
904 struct pci_endpoint_test *test = pci_get_drvdata(pdev); in pci_endpoint_test_remove() local
905 struct miscdevice *misc_device = &test->miscdev; in pci_endpoint_test_remove()
912 misc_deregister(&test->miscdev); in pci_endpoint_test_remove()
914 kfree(test->name); in pci_endpoint_test_remove()
917 if (test->bar[bar]) in pci_endpoint_test_remove()
918 pci_iounmap(pdev, test->bar[bar]); in pci_endpoint_test_remove()
921 pci_endpoint_test_release_irq(test); in pci_endpoint_test_remove()
922 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_remove()
981 MODULE_DESCRIPTION("PCI ENDPOINT TEST HOST DRIVER");