thunderbolt: Add KUnit test for devices with no DisplayPort adapters
authorGil Fine <gil.fine@intel.com>
Mon, 9 May 2022 20:49:04 +0000 (23:49 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 12 May 2022 06:22:36 +0000 (09:22 +0300)
Add a KUnit test to check that buffer allocation works also for devices
with no DP adapters.

Signed-off-by: Gil Fine <gil.fine@intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/test.c

index 66b6e66..99b30f2 100644 (file)
@@ -341,6 +341,47 @@ static struct tb_switch *alloc_dev_with_dpin(struct kunit *test,
        return sw;
 }
 
+static struct tb_switch *alloc_dev_without_dp(struct kunit *test,
+                                             struct tb_switch *parent,
+                                             u64 route, bool bonded)
+{
+       struct tb_switch *sw;
+       int i;
+
+       sw = alloc_dev_default(test, parent, route, bonded);
+       if (!sw)
+               return NULL;
+       /*
+        * Device with:
+        * 2x USB4 Adapters (adapters 1,2 and 3,4),
+        * 1x PCIe Upstream (adapter 9),
+        * 1x PCIe Downstream (adapter 10),
+        * 1x USB3 Upstream (adapter 16),
+        * 1x USB3 Downstream (adapter 17)
+        */
+       for (i = 5; i <= 8; i++)
+               sw->ports[i].disabled = true;
+
+       for (i = 11; i <= 14; i++)
+               sw->ports[i].disabled = true;
+
+       sw->ports[13].cap_adap = 0;
+       sw->ports[14].cap_adap = 0;
+
+       for (i = 18; i <= 19; i++)
+               sw->ports[i].disabled = true;
+
+       sw->generation = 4;
+       sw->credit_allocation = true;
+       sw->max_usb3_credits = 109;
+       sw->min_dp_aux_credits = 0;
+       sw->min_dp_main_credits = 0;
+       sw->max_pcie_credits = 30;
+       sw->max_dma_credits = 1;
+
+       return sw;
+}
+
 static struct tb_switch *alloc_dev_usb4(struct kunit *test,
                                        struct tb_switch *parent,
                                        u64 route, bool bonded)
@@ -1996,6 +2037,56 @@ static void tb_test_credit_alloc_pcie(struct kunit *test)
        tb_tunnel_free(tunnel);
 }
 
+static void tb_test_credit_alloc_without_dp(struct kunit *test)
+{
+       struct tb_switch *host, *dev;
+       struct tb_port *up, *down;
+       struct tb_tunnel *tunnel;
+       struct tb_path *path;
+
+       host = alloc_host_usb4(test);
+       dev = alloc_dev_without_dp(test, host, 0x1, true);
+
+       /*
+        * The device has no DP therefore baMinDPmain = baMinDPaux = 0
+        *
+        * Create PCIe path with buffers less than baMaxPCIe.
+        *
+        * For a device with buffers configurations:
+        * baMaxUSB3 = 109
+        * baMinDPaux = 0
+        * baMinDPmain = 0
+        * baMaxPCIe = 30
+        * baMaxHI = 1
+        * Remaining Buffers = Total - (CP + DP) = 120 - (2 + 0) = 118
+        * PCIe Credits = Max(6, Min(baMaxPCIe, Remaining Buffers - baMaxUSB3)
+        *              = Max(6, Min(30, 9) = 9
+        */
+       down = &host->ports[8];
+       up = &dev->ports[9];
+       tunnel = tb_tunnel_alloc_pci(NULL, up, down);
+       KUNIT_ASSERT_TRUE(test, tunnel != NULL);
+       KUNIT_ASSERT_EQ(test, tunnel->npaths, (size_t)2);
+
+       /* PCIe downstream path */
+       path = tunnel->paths[0];
+       KUNIT_ASSERT_EQ(test, path->path_length, 2);
+       KUNIT_EXPECT_EQ(test, path->hops[0].nfc_credits, 0U);
+       KUNIT_EXPECT_EQ(test, path->hops[0].initial_credits, 7U);
+       KUNIT_EXPECT_EQ(test, path->hops[1].nfc_credits, 0U);
+       KUNIT_EXPECT_EQ(test, path->hops[1].initial_credits, 9U);
+
+       /* PCIe upstream path */
+       path = tunnel->paths[1];
+       KUNIT_ASSERT_EQ(test, path->path_length, 2);
+       KUNIT_EXPECT_EQ(test, path->hops[0].nfc_credits, 0U);
+       KUNIT_EXPECT_EQ(test, path->hops[0].initial_credits, 7U);
+       KUNIT_EXPECT_EQ(test, path->hops[1].nfc_credits, 0U);
+       KUNIT_EXPECT_EQ(test, path->hops[1].initial_credits, 64U);
+
+       tb_tunnel_free(tunnel);
+}
+
 static void tb_test_credit_alloc_dp(struct kunit *test)
 {
        struct tb_switch *host, *dev;
@@ -2709,6 +2800,7 @@ static struct kunit_case tb_test_cases[] = {
        KUNIT_CASE(tb_test_credit_alloc_legacy_not_bonded),
        KUNIT_CASE(tb_test_credit_alloc_legacy_bonded),
        KUNIT_CASE(tb_test_credit_alloc_pcie),
+       KUNIT_CASE(tb_test_credit_alloc_without_dp),
        KUNIT_CASE(tb_test_credit_alloc_dp),
        KUNIT_CASE(tb_test_credit_alloc_usb3),
        KUNIT_CASE(tb_test_credit_alloc_dma),