Commit c7c99a09 authored by Gil Fine's avatar Gil Fine Committed by Mika Westerberg
Browse files

thunderbolt: Add KUnit test for devices with no DisplayPort adapters



Add a KUnit test to check that buffer allocation works also for devices
with no DP adapters.

Signed-off-by: default avatarGil Fine <gil.fine@intel.com>
Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
parent 93bf344f
Loading
Loading
Loading
Loading
+92 −0
Original line number Diff line number Diff line
@@ -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),