Lines Matching full:test

3  * Host side test driver to test endpoint functionality
28 #define DRV_MODULE_NAME "pci-endpoint-test"
129 static inline u32 pci_endpoint_test_readl(struct pci_endpoint_test *test, in pci_endpoint_test_readl() argument
132 return readl(test->base + offset); in pci_endpoint_test_readl()
135 static inline void pci_endpoint_test_writel(struct pci_endpoint_test *test, in pci_endpoint_test_writel() argument
138 writel(value, test->base + offset); in pci_endpoint_test_writel()
141 static inline u32 pci_endpoint_test_bar_readl(struct pci_endpoint_test *test, in pci_endpoint_test_bar_readl() argument
144 return readl(test->bar[bar] + offset); in pci_endpoint_test_bar_readl()
147 static inline void pci_endpoint_test_bar_writel(struct pci_endpoint_test *test, in pci_endpoint_test_bar_writel() argument
150 writel(value, test->bar[bar] + offset); in pci_endpoint_test_bar_writel()
155 struct pci_endpoint_test *test = dev_id; in pci_endpoint_test_irqhandler() local
158 reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS); in pci_endpoint_test_irqhandler()
160 test->last_irq = irq; in pci_endpoint_test_irqhandler()
161 complete(&test->irq_raised); 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, test->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()
317 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, msi_num); in pci_endpoint_test_msi_irq()
318 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_msi_irq()
321 val = wait_for_completion_timeout(&test->irq_raised, in pci_endpoint_test_msi_irq()
326 return pci_irq_vector(pdev, msi_num - 1) == test->last_irq; in pci_endpoint_test_msi_irq()
345 static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, in pci_endpoint_test_copy() argument
357 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_copy()
364 size_t alignment = test->alignment; in pci_endpoint_test_copy()
365 int irq_type = test->irq_type; in pci_endpoint_test_copy()
416 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR, in pci_endpoint_test_copy()
419 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR, in pci_endpoint_test_copy()
448 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR, in pci_endpoint_test_copy()
450 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR, in pci_endpoint_test_copy()
453 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, in pci_endpoint_test_copy()
456 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags); in pci_endpoint_test_copy()
457 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); in pci_endpoint_test_copy()
458 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); in pci_endpoint_test_copy()
459 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_copy()
462 wait_for_completion(&test->irq_raised); in pci_endpoint_test_copy()
485 static bool pci_endpoint_test_write(struct pci_endpoint_test *test, in pci_endpoint_test_write() argument
495 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_write()
500 size_t alignment = test->alignment; in pci_endpoint_test_write()
501 int irq_type = test->irq_type; in pci_endpoint_test_write()
554 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_CHECKSUM, in pci_endpoint_test_write()
557 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR, in pci_endpoint_test_write()
559 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR, in pci_endpoint_test_write()
562 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size); in pci_endpoint_test_write()
564 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags); in pci_endpoint_test_write()
565 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); in pci_endpoint_test_write()
566 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); in pci_endpoint_test_write()
567 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_write()
570 wait_for_completion(&test->irq_raised); in pci_endpoint_test_write()
572 reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS); in pci_endpoint_test_write()
586 static bool pci_endpoint_test_read(struct pci_endpoint_test *test, in pci_endpoint_test_read() argument
596 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_read()
601 size_t alignment = test->alignment; in pci_endpoint_test_read()
602 int irq_type = test->irq_type; in pci_endpoint_test_read()
651 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR, in pci_endpoint_test_read()
653 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR, in pci_endpoint_test_read()
656 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size); in pci_endpoint_test_read()
658 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags); in pci_endpoint_test_read()
659 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type); in pci_endpoint_test_read()
660 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); in pci_endpoint_test_read()
661 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, in pci_endpoint_test_read()
664 wait_for_completion(&test->irq_raised); in pci_endpoint_test_read()
670 if (crc32 == pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM)) in pci_endpoint_test_read()
679 static bool pci_endpoint_test_clear_irq(struct pci_endpoint_test *test) in pci_endpoint_test_clear_irq() argument
681 pci_endpoint_test_release_irq(test); in pci_endpoint_test_clear_irq()
682 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_clear_irq()
686 static bool pci_endpoint_test_set_irq(struct pci_endpoint_test *test, in pci_endpoint_test_set_irq() argument
689 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_set_irq()
697 if (test->irq_type == req_irq_type) in pci_endpoint_test_set_irq()
700 pci_endpoint_test_release_irq(test); in pci_endpoint_test_set_irq()
701 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_set_irq()
703 if (!pci_endpoint_test_alloc_irq_vectors(test, req_irq_type)) in pci_endpoint_test_set_irq()
706 if (!pci_endpoint_test_request_irq(test)) in pci_endpoint_test_set_irq()
712 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_set_irq()
721 struct pci_endpoint_test *test = to_endpoint_test(file->private_data); in pci_endpoint_test_ioctl() local
722 struct pci_dev *pdev = test->pdev; in pci_endpoint_test_ioctl()
724 mutex_lock(&test->mutex); in pci_endpoint_test_ioctl()
726 reinit_completion(&test->irq_raised); in pci_endpoint_test_ioctl()
727 test->last_irq = -ENODATA; in pci_endpoint_test_ioctl()
736 ret = pci_endpoint_test_bar(test, bar); in pci_endpoint_test_ioctl()
739 ret = pci_endpoint_test_legacy_irq(test); in pci_endpoint_test_ioctl()
743 ret = pci_endpoint_test_msi_irq(test, arg, cmd == PCITEST_MSIX); in pci_endpoint_test_ioctl()
746 ret = pci_endpoint_test_write(test, arg); in pci_endpoint_test_ioctl()
749 ret = pci_endpoint_test_read(test, arg); in pci_endpoint_test_ioctl()
752 ret = pci_endpoint_test_copy(test, arg); in pci_endpoint_test_ioctl()
755 ret = pci_endpoint_test_set_irq(test, arg); in pci_endpoint_test_ioctl()
761 ret = pci_endpoint_test_clear_irq(test); in pci_endpoint_test_ioctl()
766 mutex_unlock(&test->mutex); in pci_endpoint_test_ioctl()
784 struct pci_endpoint_test *test; in pci_endpoint_test_probe() local
792 test = devm_kzalloc(dev, sizeof(*test), GFP_KERNEL); in pci_endpoint_test_probe()
793 if (!test) in pci_endpoint_test_probe()
796 test->test_reg_bar = 0; in pci_endpoint_test_probe()
797 test->alignment = 0; in pci_endpoint_test_probe()
798 test->pdev = pdev; in pci_endpoint_test_probe()
799 test->irq_type = IRQ_TYPE_UNDEFINED; in pci_endpoint_test_probe()
807 test->test_reg_bar = test_reg_bar; in pci_endpoint_test_probe()
808 test->alignment = data->alignment; in pci_endpoint_test_probe()
812 init_completion(&test->irq_raised); in pci_endpoint_test_probe()
813 mutex_init(&test->mutex); in pci_endpoint_test_probe()
835 if (!pci_endpoint_test_alloc_irq_vectors(test, irq_type)) { in pci_endpoint_test_probe()
847 test->bar[bar] = base; in pci_endpoint_test_probe()
851 test->base = test->bar[test_reg_bar]; in pci_endpoint_test_probe()
852 if (!test->base) { in pci_endpoint_test_probe()
854 dev_err(dev, "Cannot perform PCI test without BAR%d\n", in pci_endpoint_test_probe()
859 pci_set_drvdata(pdev, test); in pci_endpoint_test_probe()
869 test->name = kstrdup(name, GFP_KERNEL); in pci_endpoint_test_probe()
870 if (!test->name) { in pci_endpoint_test_probe()
875 if (!pci_endpoint_test_request_irq(test)) { in pci_endpoint_test_probe()
880 misc_device = &test->miscdev; in pci_endpoint_test_probe()
902 pci_endpoint_test_release_irq(test); in pci_endpoint_test_probe()
905 kfree(test->name); in pci_endpoint_test_probe()
912 if (test->bar[bar]) in pci_endpoint_test_probe()
913 pci_iounmap(pdev, test->bar[bar]); in pci_endpoint_test_probe()
917 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_probe()
930 struct pci_endpoint_test *test = pci_get_drvdata(pdev); in pci_endpoint_test_remove() local
931 struct miscdevice *misc_device = &test->miscdev; in pci_endpoint_test_remove()
938 pci_endpoint_test_release_irq(test); in pci_endpoint_test_remove()
939 pci_endpoint_test_free_irq_vectors(test); in pci_endpoint_test_remove()
941 misc_deregister(&test->miscdev); in pci_endpoint_test_remove()
943 kfree(test->name); in pci_endpoint_test_remove()
946 if (test->bar[bar]) in pci_endpoint_test_remove()
947 pci_iounmap(pdev, test->bar[bar]); in pci_endpoint_test_remove()
1015 MODULE_DESCRIPTION("PCI ENDPOINT TEST HOST DRIVER");