The doorbell test relies on the endpoint being able to update inbound
translations at runtime so the host can reach the doorbell target
through a BAR mapping.

If the endpoint does not advertise CAP_DYNAMIC_INBOUND_MAPPING, return
-EOPNOTSUPP from PCITEST_DOORBELL.

This avoids confusing failures in user space and kselftests when the
required capability is not available.

Suggested-by: Niklas Cassel <[email protected]>
Signed-off-by: Koichiro Den <[email protected]>
---
 drivers/misc/pci_endpoint_test.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_test.c
index 74ab5b5b9011..93cd57d20881 100644
--- a/drivers/misc/pci_endpoint_test.c
+++ b/drivers/misc/pci_endpoint_test.c
@@ -84,6 +84,7 @@
 #define CAP_MSIX                               BIT(2)
 #define CAP_INTX                               BIT(3)
 #define CAP_SUBRANGE_MAPPING                   BIT(4)
+#define CAP_DYNAMIC_INBOUND_MAPPING            BIT(5)
 
 #define PCI_ENDPOINT_TEST_DB_BAR               0x34
 #define PCI_ENDPOINT_TEST_DB_OFFSET            0x38
@@ -1060,6 +1061,9 @@ static int pci_endpoint_test_doorbell(struct 
pci_endpoint_test *test)
        u32 addr;
        int left;
 
+       if (!(test->ep_caps & CAP_DYNAMIC_INBOUND_MAPPING))
+               return -EOPNOTSUPP;
+
        if (irq_type < PCITEST_IRQ_TYPE_INTX ||
            irq_type > PCITEST_IRQ_TYPE_MSIX) {
                dev_err(dev, "Invalid IRQ type\n");
-- 
2.51.0


Reply via email to