Lines Matching defs: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,
134 return readl(test->base + offset);
137 static inline void pci_endpoint_test_writel(struct pci_endpoint_test *test,
140 writel(value, test->base + offset);
143 static inline u32 pci_endpoint_test_bar_readl(struct pci_endpoint_test *test,
146 return readl(test->bar[bar] + offset);
149 static inline void pci_endpoint_test_bar_writel(struct pci_endpoint_test *test,
152 writel(value, test->bar[bar] + offset);
157 struct pci_endpoint_test *test = dev_id;
160 reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS);
162 test->last_irq = irq;
163 complete(&test->irq_raised);
169 static void pci_endpoint_test_free_irq_vectors(struct pci_endpoint_test *test)
171 struct pci_dev *pdev = test->pdev;
174 test->irq_type = IRQ_TYPE_UNDEFINED;
177 static bool pci_endpoint_test_alloc_irq_vectors(struct pci_endpoint_test *test,
181 struct pci_dev *pdev = test->pdev;
210 test->irq_type = type;
211 test->num_irqs = irq;
216 static void pci_endpoint_test_release_irq(struct pci_endpoint_test *test)
219 struct pci_dev *pdev = test->pdev;
222 for (i = 0; i < test->num_irqs; i++)
223 devm_free_irq(dev, pci_irq_vector(pdev, i), test);
225 test->num_irqs = 0;
228 static bool pci_endpoint_test_request_irq(struct pci_endpoint_test *test)
232 struct pci_dev *pdev = test->pdev;
235 for (i = 0; i < test->num_irqs; i++) {
238 IRQF_SHARED, test->name, test);
266 static bool pci_endpoint_test_bar(struct pci_endpoint_test *test,
272 struct pci_dev *pdev = test->pdev;
274 if (!test->bar[barno])
279 if (barno == test->test_reg_bar)
283 pci_endpoint_test_bar_writel(test, barno, j, 0xA0A0A0A0);
286 val = pci_endpoint_test_bar_readl(test, barno, j);
294 static bool pci_endpoint_test_legacy_irq(struct pci_endpoint_test *test)
298 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE,
300 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 0);
301 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
303 val = wait_for_completion_timeout(&test->irq_raised,
311 static bool pci_endpoint_test_msi_irq(struct pci_endpoint_test *test,
315 struct pci_dev *pdev = test->pdev;
317 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE,
319 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, msi_num);
320 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
323 val = wait_for_completion_timeout(&test->irq_raised,
328 return pci_irq_vector(pdev, msi_num - 1) == test->last_irq;
347 static bool pci_endpoint_test_copy(struct pci_endpoint_test *test,
359 struct pci_dev *pdev = test->pdev;
366 size_t alignment = test->alignment;
367 int irq_type = test->irq_type;
418 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR,
421 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR,
450 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR,
452 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR,
455 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE,
458 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags);
459 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type);
460 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1);
461 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
464 wait_for_completion(&test->irq_raised);
487 static bool pci_endpoint_test_write(struct pci_endpoint_test *test,
497 struct pci_dev *pdev = test->pdev;
502 size_t alignment = test->alignment;
503 int irq_type = test->irq_type;
556 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_CHECKSUM,
559 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR,
561 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR,
564 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size);
566 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags);
567 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type);
568 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1);
569 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
572 wait_for_completion(&test->irq_raised);
574 reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS);
588 static bool pci_endpoint_test_read(struct pci_endpoint_test *test,
598 struct pci_dev *pdev = test->pdev;
603 size_t alignment = test->alignment;
604 int irq_type = test->irq_type;
653 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR,
655 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR,
658 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size);
660 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags);
661 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type);
662 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1);
663 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
666 wait_for_completion(&test->irq_raised);
672 if (crc32 == pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM))
681 static bool pci_endpoint_test_clear_irq(struct pci_endpoint_test *test)
683 pci_endpoint_test_release_irq(test);
684 pci_endpoint_test_free_irq_vectors(test);
688 static bool pci_endpoint_test_set_irq(struct pci_endpoint_test *test,
691 struct pci_dev *pdev = test->pdev;
699 if (test->irq_type == req_irq_type)
702 pci_endpoint_test_release_irq(test);
703 pci_endpoint_test_free_irq_vectors(test);
705 if (!pci_endpoint_test_alloc_irq_vectors(test, req_irq_type))
708 if (!pci_endpoint_test_request_irq(test))
714 pci_endpoint_test_free_irq_vectors(test);
723 struct pci_endpoint_test *test = to_endpoint_test(file->private_data);
724 struct pci_dev *pdev = test->pdev;
726 mutex_lock(&test->mutex);
728 reinit_completion(&test->irq_raised);
729 test->last_irq = -ENODATA;
738 ret = pci_endpoint_test_bar(test, bar);
741 ret = pci_endpoint_test_legacy_irq(test);
745 ret = pci_endpoint_test_msi_irq(test, arg, cmd == PCITEST_MSIX);
748 ret = pci_endpoint_test_write(test, arg);
751 ret = pci_endpoint_test_read(test, arg);
754 ret = pci_endpoint_test_copy(test, arg);
757 ret = pci_endpoint_test_set_irq(test, arg);
763 ret = pci_endpoint_test_clear_irq(test);
768 mutex_unlock(&test->mutex);
786 struct pci_endpoint_test *test;
794 test = devm_kzalloc(dev, sizeof(*test), GFP_KERNEL);
795 if (!test)
798 test->test_reg_bar = 0;
799 test->alignment = 0;
800 test->pdev = pdev;
801 test->irq_type = IRQ_TYPE_UNDEFINED;
809 test->test_reg_bar = test_reg_bar;
810 test->alignment = data->alignment;
814 init_completion(&test->irq_raised);
815 mutex_init(&test->mutex);
837 if (!pci_endpoint_test_alloc_irq_vectors(test, irq_type)) {
849 test->bar[bar] = base;
853 test->base = test->bar[test_reg_bar];
854 if (!test->base) {
856 dev_err(dev, "Cannot perform PCI test without BAR%d\n",
861 pci_set_drvdata(pdev, test);
871 test->name = kstrdup(name, GFP_KERNEL);
872 if (!test->name) {
877 if (!pci_endpoint_test_request_irq(test)) {
882 misc_device = &test->miscdev;
904 pci_endpoint_test_release_irq(test);
907 kfree(test->name);
914 if (test->bar[bar])
915 pci_iounmap(pdev, test->bar[bar]);
919 pci_endpoint_test_free_irq_vectors(test);
932 struct pci_endpoint_test *test = pci_get_drvdata(pdev);
933 struct miscdevice *misc_device = &test->miscdev;
940 pci_endpoint_test_release_irq(test);
941 pci_endpoint_test_free_irq_vectors(test);
943 misc_deregister(&test->miscdev);
945 kfree(test->name);
948 if (test->bar[bar])
949 pci_iounmap(pdev, test->bar[bar]);