[PATCH 2/2] misc: pci_endpoint_test: Add support for capabilities

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



If running pci_endpoint_test.c (host side) against a version of
pci-epf-test.c (EP side), we will not see any capabilities being set.

For now, only add the CAP_HAS_ALIGN_ADDR capability.

If the CAP_HAS_ALIGN_ADDR is set, that means that the EP side supports
reading/writing to an address without any alignment requirements.

Thus, if CAP_HAS_ALIGN_ADDR is set, make sure that we do not add any
specific padding to the buffers that we allocate (which was only made
in order to get the buffers to satisfy certain alignment requirements).

Signed-off-by: Niklas Cassel <cassel@xxxxxxxxxx>
---
 drivers/misc/pci_endpoint_test.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_test.c
index 3aaaf47fa4ee..ab2b322410fb 100644
--- a/drivers/misc/pci_endpoint_test.c
+++ b/drivers/misc/pci_endpoint_test.c
@@ -69,6 +69,9 @@
 #define PCI_ENDPOINT_TEST_FLAGS			0x2c
 #define FLAG_USE_DMA				BIT(0)
 
+#define PCI_ENDPOINT_TEST_CAPS			0x30
+#define CAP_HAS_ALIGN_ADDR			BIT(0)
+
 #define PCI_DEVICE_ID_TI_AM654			0xb00c
 #define PCI_DEVICE_ID_TI_J7200			0xb00f
 #define PCI_DEVICE_ID_TI_AM64			0xb010
@@ -805,6 +808,22 @@ static const struct file_operations pci_endpoint_test_fops = {
 	.unlocked_ioctl = pci_endpoint_test_ioctl,
 };
 
+static void pci_endpoint_test_get_capabilities(struct pci_endpoint_test *test)
+{
+	struct pci_dev *pdev = test->pdev;
+	struct device *dev = &pdev->dev;
+	u32 caps;
+	bool has_align_addr;
+
+	caps = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CAPS);
+
+	has_align_addr = caps & CAP_HAS_ALIGN_ADDR;
+	dev_dbg(dev, "CAP_HAS_ALIGN_ADDR: %d\n", has_align_addr);
+
+	if (has_align_addr)
+		test->alignment = 0;
+}
+
 static int pci_endpoint_test_probe(struct pci_dev *pdev,
 				   const struct pci_device_id *ent)
 {
@@ -906,6 +925,8 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
 		goto err_kfree_test_name;
 	}
 
+	pci_endpoint_test_get_capabilities(test);
+
 	misc_device = &test->miscdev;
 	misc_device->minor = MISC_DYNAMIC_MINOR;
 	misc_device->name = kstrdup(name, GFP_KERNEL);
-- 
2.47.0





[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux