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);
166 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_STATUS,
172 static void pci_endpoint_test_free_irq_vectors(struct pci_endpoint_test *test)
174 struct pci_dev *pdev = test->pdev;
177 test->irq_type = IRQ_TYPE_UNDEFINED;
180 static bool pci_endpoint_test_alloc_irq_vectors(struct pci_endpoint_test *test,
184 struct pci_dev *pdev = test->pdev;
213 test->irq_type = type;
214 test->num_irqs = irq;
219 static void pci_endpoint_test_release_irq(struct pci_endpoint_test *test)
222 struct pci_dev *pdev = test->pdev;
225 for (i = 0; i < test->num_irqs; i++)
226 devm_free_irq(dev, pci_irq_vector(pdev, i), test);
228 test->num_irqs = 0;
231 static bool pci_endpoint_test_request_irq(struct pci_endpoint_test *test)
235 struct pci_dev *pdev = test->pdev;
238 for (i = 0; i < test->num_irqs; i++) {
241 IRQF_SHARED, test->name, test);
269 static bool pci_endpoint_test_bar(struct pci_endpoint_test *test,
275 struct pci_dev *pdev = test->pdev;
277 if (!test->bar[barno])
282 if (barno == test->test_reg_bar)
286 pci_endpoint_test_bar_writel(test, barno, j, 0xA0A0A0A0);
289 val = pci_endpoint_test_bar_readl(test, barno, j);
297 static bool pci_endpoint_test_legacy_irq(struct pci_endpoint_test *test)
301 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE,
303 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 0);
304 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
306 val = wait_for_completion_timeout(&test->irq_raised,
314 static bool pci_endpoint_test_msi_irq(struct pci_endpoint_test *test,
318 struct pci_dev *pdev = test->pdev;
320 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE,
323 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, msi_num);
324 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
327 val = wait_for_completion_timeout(&test->irq_raised,
332 if (pci_irq_vector(pdev, msi_num - 1) == test->last_irq)
354 static bool pci_endpoint_test_copy(struct pci_endpoint_test *test,
366 struct pci_dev *pdev = test->pdev;
373 size_t alignment = test->alignment;
374 int irq_type = test->irq_type;
425 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR,
428 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR,
457 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR,
459 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR,
462 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE,
465 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags);
466 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type);
467 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1);
468 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
471 wait_for_completion(&test->irq_raised);
494 static bool pci_endpoint_test_write(struct pci_endpoint_test *test,
504 struct pci_dev *pdev = test->pdev;
509 size_t alignment = test->alignment;
510 int irq_type = test->irq_type;
563 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_CHECKSUM,
566 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR,
568 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR,
571 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size);
573 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags);
574 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type);
575 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1);
576 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
579 wait_for_completion(&test->irq_raised);
581 reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS);
595 static bool pci_endpoint_test_read(struct pci_endpoint_test *test,
605 struct pci_dev *pdev = test->pdev;
610 size_t alignment = test->alignment;
611 int irq_type = test->irq_type;
660 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR,
662 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR,
665 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size);
667 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags);
668 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type);
669 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1);
670 pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
673 wait_for_completion(&test->irq_raised);
679 if (crc32 == pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM))
688 static bool pci_endpoint_test_clear_irq(struct pci_endpoint_test *test)
690 pci_endpoint_test_release_irq(test);
691 pci_endpoint_test_free_irq_vectors(test);
695 static bool pci_endpoint_test_set_irq(struct pci_endpoint_test *test,
698 struct pci_dev *pdev = test->pdev;
706 if (test->irq_type == req_irq_type)
709 pci_endpoint_test_release_irq(test);
710 pci_endpoint_test_free_irq_vectors(test);
712 if (!pci_endpoint_test_alloc_irq_vectors(test, req_irq_type))
715 if (!pci_endpoint_test_request_irq(test))
721 pci_endpoint_test_free_irq_vectors(test);
730 struct pci_endpoint_test *test = to_endpoint_test(file->private_data);
731 struct pci_dev *pdev = test->pdev;
733 mutex_lock(&test->mutex);
735 reinit_completion(&test->irq_raised);
736 test->last_irq = -ENODATA;
745 ret = pci_endpoint_test_bar(test, bar);
748 ret = pci_endpoint_test_legacy_irq(test);
752 ret = pci_endpoint_test_msi_irq(test, arg, cmd == PCITEST_MSIX);
755 ret = pci_endpoint_test_write(test, arg);
758 ret = pci_endpoint_test_read(test, arg);
761 ret = pci_endpoint_test_copy(test, arg);
764 ret = pci_endpoint_test_set_irq(test, arg);
770 ret = pci_endpoint_test_clear_irq(test);
775 mutex_unlock(&test->mutex);
793 struct pci_endpoint_test *test;
801 test = devm_kzalloc(dev, sizeof(*test), GFP_KERNEL);
802 if (!test)
805 test->test_reg_bar = 0;
806 test->alignment = 0;
807 test->pdev = pdev;
808 test->irq_type = IRQ_TYPE_UNDEFINED;
816 test->test_reg_bar = test_reg_bar;
817 test->alignment = data->alignment;
821 init_completion(&test->irq_raised);
822 mutex_init(&test->mutex);
844 if (!pci_endpoint_test_alloc_irq_vectors(test, irq_type)) {
856 test->bar[bar] = base;
860 test->base = test->bar[test_reg_bar];
861 if (!test->base) {
863 dev_err(dev, "Cannot perform PCI test without BAR%d\n",
868 pci_set_drvdata(pdev, test);
878 test->name = kstrdup(name, GFP_KERNEL);
879 if (!test->name) {
884 if (!pci_endpoint_test_request_irq(test)) {
889 misc_device = &test->miscdev;
910 pci_endpoint_test_release_irq(test);
913 kfree(test->name);
920 if (test->bar[bar])
921 pci_iounmap(pdev, test->bar[bar]);
925 pci_endpoint_test_free_irq_vectors(test);
938 struct pci_endpoint_test *test = pci_get_drvdata(pdev);
939 struct miscdevice *misc_device = &test->miscdev;
946 pci_endpoint_test_release_irq(test);
947 pci_endpoint_test_free_irq_vectors(test);
949 misc_deregister(&test->miscdev);
951 kfree(test->name);
954 if (test->bar[bar])
955 pci_iounmap(pdev, test->bar[bar]);