Lines Matching full:test

3  * Host side test driver to test endpoint functionality
28 #define DRV_MODULE_NAME "pci-endpoint-test"
131 static inline u32 pci_endpoint_test_readl(struct pci_endpoint_test *test, in pci_endpoint_test_readl() argument
134 return readl(test->base + offset); in pci_endpoint_test_readl()
137 static inline void pci_endpoint_test_writel(struct pci_endpoint_test *test, in pci_endpoint_test_writel() argument
140 writel(value, test->base + offset); in pci_endpoint_test_writel()
143 static inline u32 pci_endpoint_test_bar_readl(struct pci_endpoint_test *test, in pci_endpoint_test_bar_readl() argument
146 return readl(test->bar[bar] + offset); in pci_endpoint_test_bar_readl()
149 static inline void pci_endpoint_test_bar_writel(struct pci_endpoint_test *test, in pci_endpoint_test_bar_writel() argument
152 writel(value, test->bar[bar] + offset); in pci_endpoint_test_bar_writel()
157 struct pci_endpoint_test *test = dev_id; in pci_endpoint_test_irqhandler() local
160 reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS); in pci_endpoint_test_irqhandler()
162 test->last_irq = irq; in pci_endpoint_test_irqhandler()
163 complete(&test->irq_raised); in pci_endpoint_test_irqhandler()
169 static void pci_endpoint_test_free_irq_vectors(struct pci_endpoint_test *test) in pci_endpoint_test_free_irq_vectors() argument
171 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_free_irq_vectors()
174 test->irq_type = IRQ_TYPE_UNDEFINED; in pci_endpoint_test_free_irq_vectors()
177 static bool pci_endpoint_test_alloc_irq_vectors(struct pci_endpoint_test *test, in pci_endpoint_test_alloc_irq_vectors() argument
181 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_alloc_irq_vectors()
210 test->irq_type = type; in pci_endpoint_test_alloc_irq_vectors()
211 test->num_irqs = irq; in pci_endpoint_test_alloc_irq_vectors()
216 static void pci_endpoint_test_release_irq(struct pci_endpoint_test *test) in pci_endpoint_test_release_irq() argument
219 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_release_irq()
222 for (i = 0; i < test->num_irqs; i++) in pci_endpoint_test_release_irq()
223 devm_free_irq(dev, pci_irq_vector(pdev, i), test); in pci_endpoint_test_release_irq()
225 test->num_irqs = 0; in pci_endpoint_test_release_irq()
228 static bool pci_endpoint_test_request_irq(struct pci_endpoint_test *test) in pci_endpoint_test_request_irq() argument
232 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_request_irq()
235 for (i = 0; i < test->num_irqs; i++) { in pci_endpoint_test_request_irq()
238 IRQF_SHARED, test->name, test); in pci_endpoint_test_request_irq()
275 static bool pci_endpoint_test_bar(struct pci_endpoint_test *test, in pci_endpoint_test_bar() argument
281 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_bar()
283 if (!test->bar[barno]) in pci_endpoint_test_bar()
288 if (barno == test->test_reg_bar) in pci_endpoint_test_bar()
292 pci_endpoint_test_bar_writel(test, barno, j, in pci_endpoint_test_bar()
296 val = pci_endpoint_test_bar_readl(test, barno, j); in pci_endpoint_test_bar()
304 static bool pci_endpoint_test_intx_irq(struct pci_endpoint_test *test) in pci_endpoint_test_intx_irq() argument
308 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, in pci_endpoint_test_intx_irq()
310 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 0); in pci_endpoint_test_intx_irq()
311 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_intx_irq()
313 val = wait_for_completion_timeout(&test->irq_raised, in pci_endpoint_test_intx_irq()
321 static bool pci_endpoint_test_msi_irq(struct pci_endpoint_test *test, in pci_endpoint_test_msi_irq() argument
325 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_msi_irq()
327 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, in pci_endpoint_test_msi_irq()
329 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, msi_num); in pci_endpoint_test_msi_irq()
330 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_msi_irq()
333 val = wait_for_completion_timeout(&test->irq_raised, in pci_endpoint_test_msi_irq()
338 return pci_irq_vector(pdev, msi_num - 1) == test->last_irq; in pci_endpoint_test_msi_irq()
357 static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, in pci_endpoint_test_copy() argument
369 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_copy()
376 size_t alignment = test->alignment; in pci_endpoint_test_copy()
377 int irq_type = test->irq_type; in pci_endpoint_test_copy()
428 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR, in pci_endpoint_test_copy()
431 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR, in pci_endpoint_test_copy()
460 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR, in pci_endpoint_test_copy()
462 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR, in pci_endpoint_test_copy()
465 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, in pci_endpoint_test_copy()
468 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags); in pci_endpoint_test_copy()
469 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); in pci_endpoint_test_copy()
470 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); in pci_endpoint_test_copy()
471 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_copy()
474 wait_for_completion(&test->irq_raised); in pci_endpoint_test_copy()
497 static bool pci_endpoint_test_write(struct pci_endpoint_test *test, in pci_endpoint_test_write() argument
507 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_write()
512 size_t alignment = test->alignment; in pci_endpoint_test_write()
513 int irq_type = test->irq_type; in pci_endpoint_test_write()
566 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_CHECKSUM, in pci_endpoint_test_write()
569 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR, in pci_endpoint_test_write()
571 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR, in pci_endpoint_test_write()
574 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size); in pci_endpoint_test_write()
576 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags); in pci_endpoint_test_write()
577 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); in pci_endpoint_test_write()
578 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); in pci_endpoint_test_write()
579 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_write()
582 wait_for_completion(&test->irq_raised); in pci_endpoint_test_write()
584 reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS); in pci_endpoint_test_write()
598 static bool pci_endpoint_test_read(struct pci_endpoint_test *test, in pci_endpoint_test_read() argument
608 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_read()
613 size_t alignment = test->alignment; in pci_endpoint_test_read()
614 int irq_type = test->irq_type; in pci_endpoint_test_read()
663 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR, in pci_endpoint_test_read()
665 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR, in pci_endpoint_test_read()
668 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size); in pci_endpoint_test_read()
670 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags); in pci_endpoint_test_read()
671 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); in pci_endpoint_test_read()
672 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); in pci_endpoint_test_read()
673 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_read()
676 wait_for_completion(&test->irq_raised); in pci_endpoint_test_read()
682 if (crc32 == pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM)) in pci_endpoint_test_read()
691 static bool pci_endpoint_test_clear_irq(struct pci_endpoint_test *test) in pci_endpoint_test_clear_irq() argument
693 pci_endpoint_test_release_irq(test); in pci_endpoint_test_clear_irq()
694 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_clear_irq()
698 static bool pci_endpoint_test_set_irq(struct pci_endpoint_test *test, in pci_endpoint_test_set_irq() argument
701 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_set_irq()
709 if (test->irq_type == req_irq_type) in pci_endpoint_test_set_irq()
712 pci_endpoint_test_release_irq(test); in pci_endpoint_test_set_irq()
713 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_set_irq()
715 if (!pci_endpoint_test_alloc_irq_vectors(test, req_irq_type)) in pci_endpoint_test_set_irq()
718 if (!pci_endpoint_test_request_irq(test)) in pci_endpoint_test_set_irq()
724 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_set_irq()
733 struct pci_endpoint_test *test = to_endpoint_test(file->private_data); in pci_endpoint_test_ioctl() local
734 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_ioctl()
736 mutex_lock(&test->mutex); in pci_endpoint_test_ioctl()
738 reinit_completion(&test->irq_raised); in pci_endpoint_test_ioctl()
739 test->last_irq = -ENODATA; in pci_endpoint_test_ioctl()
748 ret = pci_endpoint_test_bar(test, bar); in pci_endpoint_test_ioctl()
751 ret = pci_endpoint_test_intx_irq(test); in pci_endpoint_test_ioctl()
755 ret = pci_endpoint_test_msi_irq(test, arg, cmd == PCITEST_MSIX); in pci_endpoint_test_ioctl()
758 ret = pci_endpoint_test_write(test, arg); in pci_endpoint_test_ioctl()
761 ret = pci_endpoint_test_read(test, arg); in pci_endpoint_test_ioctl()
764 ret = pci_endpoint_test_copy(test, arg); in pci_endpoint_test_ioctl()
767 ret = pci_endpoint_test_set_irq(test, arg); in pci_endpoint_test_ioctl()
773 ret = pci_endpoint_test_clear_irq(test); in pci_endpoint_test_ioctl()
778 mutex_unlock(&test->mutex); in pci_endpoint_test_ioctl()
796 struct pci_endpoint_test *test; in pci_endpoint_test_probe() local
804 test = devm_kzalloc(dev, sizeof(*test), GFP_KERNEL); in pci_endpoint_test_probe()
805 if (!test) in pci_endpoint_test_probe()
808 test->test_reg_bar = 0; in pci_endpoint_test_probe()
809 test->alignment = 0; in pci_endpoint_test_probe()
810 test->pdev = pdev; in pci_endpoint_test_probe()
811 test->irq_type = IRQ_TYPE_UNDEFINED; in pci_endpoint_test_probe()
819 test->test_reg_bar = test_reg_bar; in pci_endpoint_test_probe()
820 test->alignment = data->alignment; in pci_endpoint_test_probe()
824 init_completion(&test->irq_raised); in pci_endpoint_test_probe()
825 mutex_init(&test->mutex); in pci_endpoint_test_probe()
847 if (!pci_endpoint_test_alloc_irq_vectors(test, irq_type)) { in pci_endpoint_test_probe()
859 test->bar[bar] = base; in pci_endpoint_test_probe()
863 test->base = test->bar[test_reg_bar]; in pci_endpoint_test_probe()
864 if (!test->base) { in pci_endpoint_test_probe()
866 dev_err(dev, "Cannot perform PCI test without BAR%d\n", in pci_endpoint_test_probe()
871 pci_set_drvdata(pdev, test); in pci_endpoint_test_probe()
881 test->name = kstrdup(name, GFP_KERNEL); in pci_endpoint_test_probe()
882 if (!test->name) { in pci_endpoint_test_probe()
887 if (!pci_endpoint_test_request_irq(test)) { in pci_endpoint_test_probe()
892 misc_device = &test->miscdev; in pci_endpoint_test_probe()
914 pci_endpoint_test_release_irq(test); in pci_endpoint_test_probe()
917 kfree(test->name); in pci_endpoint_test_probe()
924 if (test->bar[bar]) in pci_endpoint_test_probe()
925 pci_iounmap(pdev, test->bar[bar]); in pci_endpoint_test_probe()
929 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_probe()
942 struct pci_endpoint_test *test = pci_get_drvdata(pdev); in pci_endpoint_test_remove() local
943 struct miscdevice *misc_device = &test->miscdev; in pci_endpoint_test_remove()
950 pci_endpoint_test_release_irq(test); in pci_endpoint_test_remove()
951 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_remove()
953 misc_deregister(&test->miscdev); in pci_endpoint_test_remove()
955 kfree(test->name); in pci_endpoint_test_remove()
958 if (test->bar[bar]) in pci_endpoint_test_remove()
959 pci_iounmap(pdev, test->bar[bar]); in pci_endpoint_test_remove()
1033 MODULE_DESCRIPTION("PCI ENDPOINT TEST HOST DRIVER");