Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * KUnit tests
   4 *
   5 * Copyright (C) 2020, Intel Corporation
   6 * Author: Mika Westerberg <mika.westerberg@linux.intel.com>
   7 */
   8
   9#include <kunit/test.h>
  10#include <linux/idr.h>
  11
  12#include "tb.h"
  13#include "tunnel.h"
  14
  15static int __ida_init(struct kunit_resource *res, void *context)
  16{
  17	struct ida *ida = context;
  18
  19	ida_init(ida);
  20	res->data = ida;
  21	return 0;
  22}
  23
  24static void __ida_destroy(struct kunit_resource *res)
  25{
  26	struct ida *ida = res->data;
  27
  28	ida_destroy(ida);
  29}
  30
  31static void kunit_ida_init(struct kunit *test, struct ida *ida)
  32{
  33	kunit_alloc_resource(test, __ida_init, __ida_destroy, GFP_KERNEL, ida);
  34}
  35
  36static struct tb_switch *alloc_switch(struct kunit *test, u64 route,
  37				      u8 upstream_port, u8 max_port_number)
  38{
  39	struct tb_switch *sw;
  40	size_t size;
  41	int i;
  42
  43	sw = kunit_kzalloc(test, sizeof(*sw), GFP_KERNEL);
  44	if (!sw)
  45		return NULL;
  46
  47	sw->config.upstream_port_number = upstream_port;
  48	sw->config.depth = tb_route_length(route);
  49	sw->config.route_hi = upper_32_bits(route);
  50	sw->config.route_lo = lower_32_bits(route);
  51	sw->config.enabled = 0;
  52	sw->config.max_port_number = max_port_number;
  53
  54	size = (sw->config.max_port_number + 1) * sizeof(*sw->ports);
  55	sw->ports = kunit_kzalloc(test, size, GFP_KERNEL);
  56	if (!sw->ports)
  57		return NULL;
  58
  59	for (i = 0; i <= sw->config.max_port_number; i++) {
  60		sw->ports[i].sw = sw;
  61		sw->ports[i].port = i;
  62		sw->ports[i].config.port_number = i;
  63		if (i) {
  64			kunit_ida_init(test, &sw->ports[i].in_hopids);
  65			kunit_ida_init(test, &sw->ports[i].out_hopids);
  66		}
  67	}
  68
  69	return sw;
  70}
  71
  72static struct tb_switch *alloc_host(struct kunit *test)
  73{
  74	struct tb_switch *sw;
  75
  76	sw = alloc_switch(test, 0, 7, 13);
  77	if (!sw)
  78		return NULL;
  79
  80	sw->config.vendor_id = 0x8086;
  81	sw->config.device_id = 0x9a1b;
  82
  83	sw->ports[0].config.type = TB_TYPE_PORT;
  84	sw->ports[0].config.max_in_hop_id = 7;
  85	sw->ports[0].config.max_out_hop_id = 7;
  86
  87	sw->ports[1].config.type = TB_TYPE_PORT;
  88	sw->ports[1].config.max_in_hop_id = 19;
  89	sw->ports[1].config.max_out_hop_id = 19;
  90	sw->ports[1].dual_link_port = &sw->ports[2];
  91
  92	sw->ports[2].config.type = TB_TYPE_PORT;
  93	sw->ports[2].config.max_in_hop_id = 19;
  94	sw->ports[2].config.max_out_hop_id = 19;
  95	sw->ports[2].dual_link_port = &sw->ports[1];
  96	sw->ports[2].link_nr = 1;
  97
  98	sw->ports[3].config.type = TB_TYPE_PORT;
  99	sw->ports[3].config.max_in_hop_id = 19;
 100	sw->ports[3].config.max_out_hop_id = 19;
 101	sw->ports[3].dual_link_port = &sw->ports[4];
 102
 103	sw->ports[4].config.type = TB_TYPE_PORT;
 104	sw->ports[4].config.max_in_hop_id = 19;
 105	sw->ports[4].config.max_out_hop_id = 19;
 106	sw->ports[4].dual_link_port = &sw->ports[3];
 107	sw->ports[4].link_nr = 1;
 108
 109	sw->ports[5].config.type = TB_TYPE_DP_HDMI_IN;
 110	sw->ports[5].config.max_in_hop_id = 9;
 111	sw->ports[5].config.max_out_hop_id = 9;
 112	sw->ports[5].cap_adap = -1;
 113
 114	sw->ports[6].config.type = TB_TYPE_DP_HDMI_IN;
 115	sw->ports[6].config.max_in_hop_id = 9;
 116	sw->ports[6].config.max_out_hop_id = 9;
 117	sw->ports[6].cap_adap = -1;
 118
 119	sw->ports[7].config.type = TB_TYPE_NHI;
 120	sw->ports[7].config.max_in_hop_id = 11;
 121	sw->ports[7].config.max_out_hop_id = 11;
 122
 123	sw->ports[8].config.type = TB_TYPE_PCIE_DOWN;
 124	sw->ports[8].config.max_in_hop_id = 8;
 125	sw->ports[8].config.max_out_hop_id = 8;
 126
 127	sw->ports[9].config.type = TB_TYPE_PCIE_DOWN;
 128	sw->ports[9].config.max_in_hop_id = 8;
 129	sw->ports[9].config.max_out_hop_id = 8;
 130
 131	sw->ports[10].disabled = true;
 132	sw->ports[11].disabled = true;
 133
 134	sw->ports[12].config.type = TB_TYPE_USB3_DOWN;
 135	sw->ports[12].config.max_in_hop_id = 8;
 136	sw->ports[12].config.max_out_hop_id = 8;
 137
 138	sw->ports[13].config.type = TB_TYPE_USB3_DOWN;
 139	sw->ports[13].config.max_in_hop_id = 8;
 140	sw->ports[13].config.max_out_hop_id = 8;
 141
 142	return sw;
 143}
 144
 145static struct tb_switch *alloc_dev_default(struct kunit *test,
 146					   struct tb_switch *parent,
 147					   u64 route, bool bonded)
 148{
 149	struct tb_port *port, *upstream_port;
 150	struct tb_switch *sw;
 151
 152	sw = alloc_switch(test, route, 1, 19);
 153	if (!sw)
 154		return NULL;
 155
 156	sw->config.vendor_id = 0x8086;
 157	sw->config.device_id = 0x15ef;
 158
 159	sw->ports[0].config.type = TB_TYPE_PORT;
 160	sw->ports[0].config.max_in_hop_id = 8;
 161	sw->ports[0].config.max_out_hop_id = 8;
 162
 163	sw->ports[1].config.type = TB_TYPE_PORT;
 164	sw->ports[1].config.max_in_hop_id = 19;
 165	sw->ports[1].config.max_out_hop_id = 19;
 166	sw->ports[1].dual_link_port = &sw->ports[2];
 167
 168	sw->ports[2].config.type = TB_TYPE_PORT;
 169	sw->ports[2].config.max_in_hop_id = 19;
 170	sw->ports[2].config.max_out_hop_id = 19;
 171	sw->ports[2].dual_link_port = &sw->ports[1];
 172	sw->ports[2].link_nr = 1;
 173
 174	sw->ports[3].config.type = TB_TYPE_PORT;
 175	sw->ports[3].config.max_in_hop_id = 19;
 176	sw->ports[3].config.max_out_hop_id = 19;
 177	sw->ports[3].dual_link_port = &sw->ports[4];
 178
 179	sw->ports[4].config.type = TB_TYPE_PORT;
 180	sw->ports[4].config.max_in_hop_id = 19;
 181	sw->ports[4].config.max_out_hop_id = 19;
 182	sw->ports[4].dual_link_port = &sw->ports[3];
 183	sw->ports[4].link_nr = 1;
 184
 185	sw->ports[5].config.type = TB_TYPE_PORT;
 186	sw->ports[5].config.max_in_hop_id = 19;
 187	sw->ports[5].config.max_out_hop_id = 19;
 188	sw->ports[5].dual_link_port = &sw->ports[6];
 189
 190	sw->ports[6].config.type = TB_TYPE_PORT;
 191	sw->ports[6].config.max_in_hop_id = 19;
 192	sw->ports[6].config.max_out_hop_id = 19;
 193	sw->ports[6].dual_link_port = &sw->ports[5];
 194	sw->ports[6].link_nr = 1;
 195
 196	sw->ports[7].config.type = TB_TYPE_PORT;
 197	sw->ports[7].config.max_in_hop_id = 19;
 198	sw->ports[7].config.max_out_hop_id = 19;
 199	sw->ports[7].dual_link_port = &sw->ports[8];
 200
 201	sw->ports[8].config.type = TB_TYPE_PORT;
 202	sw->ports[8].config.max_in_hop_id = 19;
 203	sw->ports[8].config.max_out_hop_id = 19;
 204	sw->ports[8].dual_link_port = &sw->ports[7];
 205	sw->ports[8].link_nr = 1;
 206
 207	sw->ports[9].config.type = TB_TYPE_PCIE_UP;
 208	sw->ports[9].config.max_in_hop_id = 8;
 209	sw->ports[9].config.max_out_hop_id = 8;
 210
 211	sw->ports[10].config.type = TB_TYPE_PCIE_DOWN;
 212	sw->ports[10].config.max_in_hop_id = 8;
 213	sw->ports[10].config.max_out_hop_id = 8;
 214
 215	sw->ports[11].config.type = TB_TYPE_PCIE_DOWN;
 216	sw->ports[11].config.max_in_hop_id = 8;
 217	sw->ports[11].config.max_out_hop_id = 8;
 218
 219	sw->ports[12].config.type = TB_TYPE_PCIE_DOWN;
 220	sw->ports[12].config.max_in_hop_id = 8;
 221	sw->ports[12].config.max_out_hop_id = 8;
 222
 223	sw->ports[13].config.type = TB_TYPE_DP_HDMI_OUT;
 224	sw->ports[13].config.max_in_hop_id = 9;
 225	sw->ports[13].config.max_out_hop_id = 9;
 226	sw->ports[13].cap_adap = -1;
 227
 228	sw->ports[14].config.type = TB_TYPE_DP_HDMI_OUT;
 229	sw->ports[14].config.max_in_hop_id = 9;
 230	sw->ports[14].config.max_out_hop_id = 9;
 231	sw->ports[14].cap_adap = -1;
 232
 233	sw->ports[15].disabled = true;
 234
 235	sw->ports[16].config.type = TB_TYPE_USB3_UP;
 236	sw->ports[16].config.max_in_hop_id = 8;
 237	sw->ports[16].config.max_out_hop_id = 8;
 238
 239	sw->ports[17].config.type = TB_TYPE_USB3_DOWN;
 240	sw->ports[17].config.max_in_hop_id = 8;
 241	sw->ports[17].config.max_out_hop_id = 8;
 242
 243	sw->ports[18].config.type = TB_TYPE_USB3_DOWN;
 244	sw->ports[18].config.max_in_hop_id = 8;
 245	sw->ports[18].config.max_out_hop_id = 8;
 246
 247	sw->ports[19].config.type = TB_TYPE_USB3_DOWN;
 248	sw->ports[19].config.max_in_hop_id = 8;
 249	sw->ports[19].config.max_out_hop_id = 8;
 250
 251	if (!parent)
 252		return sw;
 253
 254	/* Link them */
 255	upstream_port = tb_upstream_port(sw);
 256	port = tb_port_at(route, parent);
 257	port->remote = upstream_port;
 258	upstream_port->remote = port;
 259	if (port->dual_link_port && upstream_port->dual_link_port) {
 260		port->dual_link_port->remote = upstream_port->dual_link_port;
 261		upstream_port->dual_link_port->remote = port->dual_link_port;
 262	}
 263
 264	if (bonded) {
 265		/* Bonding is used */
 266		port->bonded = true;
 267		port->dual_link_port->bonded = true;
 268		upstream_port->bonded = true;
 269		upstream_port->dual_link_port->bonded = true;
 270	}
 271
 272	return sw;
 273}
 274
 275static struct tb_switch *alloc_dev_with_dpin(struct kunit *test,
 276					     struct tb_switch *parent,
 277					     u64 route, bool bonded)
 278{
 279	struct tb_switch *sw;
 280
 281	sw = alloc_dev_default(test, parent, route, bonded);
 282	if (!sw)
 283		return NULL;
 284
 285	sw->ports[13].config.type = TB_TYPE_DP_HDMI_IN;
 286	sw->ports[13].config.max_in_hop_id = 9;
 287	sw->ports[13].config.max_out_hop_id = 9;
 288
 289	sw->ports[14].config.type = TB_TYPE_DP_HDMI_IN;
 290	sw->ports[14].config.max_in_hop_id = 9;
 291	sw->ports[14].config.max_out_hop_id = 9;
 292
 293	return sw;
 294}
 295
 296static void tb_test_path_basic(struct kunit *test)
 297{
 298	struct tb_port *src_port, *dst_port, *p;
 299	struct tb_switch *host;
 300
 301	host = alloc_host(test);
 302
 303	src_port = &host->ports[5];
 304	dst_port = src_port;
 305
 306	p = tb_next_port_on_path(src_port, dst_port, NULL);
 307	KUNIT_EXPECT_PTR_EQ(test, p, dst_port);
 308
 309	p = tb_next_port_on_path(src_port, dst_port, p);
 310	KUNIT_EXPECT_TRUE(test, !p);
 311}
 312
 313static void tb_test_path_not_connected_walk(struct kunit *test)
 314{
 315	struct tb_port *src_port, *dst_port, *p;
 316	struct tb_switch *host, *dev;
 317
 318	host = alloc_host(test);
 319	/* No connection between host and dev */
 320	dev = alloc_dev_default(test, NULL, 3, true);
 321
 322	src_port = &host->ports[12];
 323	dst_port = &dev->ports[16];
 324
 325	p = tb_next_port_on_path(src_port, dst_port, NULL);
 326	KUNIT_EXPECT_PTR_EQ(test, p, src_port);
 327
 328	p = tb_next_port_on_path(src_port, dst_port, p);
 329	KUNIT_EXPECT_PTR_EQ(test, p, &host->ports[3]);
 330
 331	p = tb_next_port_on_path(src_port, dst_port, p);
 332	KUNIT_EXPECT_TRUE(test, !p);
 333
 334	/* Other direction */
 335
 336	p = tb_next_port_on_path(dst_port, src_port, NULL);
 337	KUNIT_EXPECT_PTR_EQ(test, p, dst_port);
 338
 339	p = tb_next_port_on_path(dst_port, src_port, p);
 340	KUNIT_EXPECT_PTR_EQ(test, p, &dev->ports[1]);
 341
 342	p = tb_next_port_on_path(dst_port, src_port, p);
 343	KUNIT_EXPECT_TRUE(test, !p);
 344}
 345
 346struct port_expectation {
 347	u64 route;
 348	u8 port;
 349	enum tb_port_type type;
 350};
 351
 352static void tb_test_path_single_hop_walk(struct kunit *test)
 353{
 354	/*
 355	 * Walks from Host PCIe downstream port to Device #1 PCIe
 356	 * upstream port.
 357	 *
 358	 *   [Host]
 359	 *   1 |
 360	 *   1 |
 361	 *  [Device]
 362	 */
 363	static const struct port_expectation test_data[] = {
 364		{ .route = 0x0, .port = 8, .type = TB_TYPE_PCIE_DOWN },
 365		{ .route = 0x0, .port = 1, .type = TB_TYPE_PORT },
 366		{ .route = 0x1, .port = 1, .type = TB_TYPE_PORT },
 367		{ .route = 0x1, .port = 9, .type = TB_TYPE_PCIE_UP },
 368	};
 369	struct tb_port *src_port, *dst_port, *p;
 370	struct tb_switch *host, *dev;
 371	int i;
 372
 373	host = alloc_host(test);
 374	dev = alloc_dev_default(test, host, 1, true);
 375
 376	src_port = &host->ports[8];
 377	dst_port = &dev->ports[9];
 378
 379	/* Walk both directions */
 380
 381	i = 0;
 382	tb_for_each_port_on_path(src_port, dst_port, p) {
 383		KUNIT_EXPECT_TRUE(test, i < ARRAY_SIZE(test_data));
 384		KUNIT_EXPECT_EQ(test, tb_route(p->sw), test_data[i].route);
 385		KUNIT_EXPECT_EQ(test, p->port, test_data[i].port);
 386		KUNIT_EXPECT_EQ(test, (enum tb_port_type)p->config.type,
 387				test_data[i].type);
 388		i++;
 389	}
 390
 391	KUNIT_EXPECT_EQ(test, i, (int)ARRAY_SIZE(test_data));
 392
 393	i = ARRAY_SIZE(test_data) - 1;
 394	tb_for_each_port_on_path(dst_port, src_port, p) {
 395		KUNIT_EXPECT_TRUE(test, i < ARRAY_SIZE(test_data));
 396		KUNIT_EXPECT_EQ(test, tb_route(p->sw), test_data[i].route);
 397		KUNIT_EXPECT_EQ(test, p->port, test_data[i].port);
 398		KUNIT_EXPECT_EQ(test, (enum tb_port_type)p->config.type,
 399				test_data[i].type);
 400		i--;
 401	}
 402
 403	KUNIT_EXPECT_EQ(test, i, -1);
 404}
 405
 406static void tb_test_path_daisy_chain_walk(struct kunit *test)
 407{
 408	/*
 409	 * Walks from Host DP IN to Device #2 DP OUT.
 410	 *
 411	 *           [Host]
 412	 *            1 |
 413	 *            1 |
 414	 *         [Device #1]
 415	 *       3 /
 416	 *      1 /
 417	 * [Device #2]
 418	 */
 419	static const struct port_expectation test_data[] = {
 420		{ .route = 0x0, .port = 5, .type = TB_TYPE_DP_HDMI_IN },
 421		{ .route = 0x0, .port = 1, .type = TB_TYPE_PORT },
 422		{ .route = 0x1, .port = 1, .type = TB_TYPE_PORT },
 423		{ .route = 0x1, .port = 3, .type = TB_TYPE_PORT },
 424		{ .route = 0x301, .port = 1, .type = TB_TYPE_PORT },
 425		{ .route = 0x301, .port = 13, .type = TB_TYPE_DP_HDMI_OUT },
 426	};
 427	struct tb_port *src_port, *dst_port, *p;
 428	struct tb_switch *host, *dev1, *dev2;
 429	int i;
 430
 431	host = alloc_host(test);
 432	dev1 = alloc_dev_default(test, host, 0x1, true);
 433	dev2 = alloc_dev_default(test, dev1, 0x301, true);
 434
 435	src_port = &host->ports[5];
 436	dst_port = &dev2->ports[13];
 437
 438	/* Walk both directions */
 439
 440	i = 0;
 441	tb_for_each_port_on_path(src_port, dst_port, p) {
 442		KUNIT_EXPECT_TRUE(test, i < ARRAY_SIZE(test_data));
 443		KUNIT_EXPECT_EQ(test, tb_route(p->sw), test_data[i].route);
 444		KUNIT_EXPECT_EQ(test, p->port, test_data[i].port);
 445		KUNIT_EXPECT_EQ(test, (enum tb_port_type)p->config.type,
 446				test_data[i].type);
 447		i++;
 448	}
 449
 450	KUNIT_EXPECT_EQ(test, i, (int)ARRAY_SIZE(test_data));
 451
 452	i = ARRAY_SIZE(test_data) - 1;
 453	tb_for_each_port_on_path(dst_port, src_port, p) {
 454		KUNIT_EXPECT_TRUE(test, i < ARRAY_SIZE(test_data));
 455		KUNIT_EXPECT_EQ(test, tb_route(p->sw), test_data[i].route);
 456		KUNIT_EXPECT_EQ(test, p->port, test_data[i].port);
 457		KUNIT_EXPECT_EQ(test, (enum tb_port_type)p->config.type,
 458				test_data[i].type);
 459		i--;
 460	}
 461
 462	KUNIT_EXPECT_EQ(test, i, -1);
 463}
 464
 465static void tb_test_path_simple_tree_walk(struct kunit *test)
 466{
 467	/*
 468	 * Walks from Host DP IN to Device #3 DP OUT.
 469	 *
 470	 *           [Host]
 471	 *            1 |
 472	 *            1 |
 473	 *         [Device #1]
 474	 *       3 /   | 5  \ 7
 475	 *      1 /    |     \ 1
 476	 * [Device #2] |    [Device #4]
 477	 *             | 1
 478	 *         [Device #3]
 479	 */
 480	static const struct port_expectation test_data[] = {
 481		{ .route = 0x0, .port = 5, .type = TB_TYPE_DP_HDMI_IN },
 482		{ .route = 0x0, .port = 1, .type = TB_TYPE_PORT },
 483		{ .route = 0x1, .port = 1, .type = TB_TYPE_PORT },
 484		{ .route = 0x1, .port = 5, .type = TB_TYPE_PORT },
 485		{ .route = 0x501, .port = 1, .type = TB_TYPE_PORT },
 486		{ .route = 0x501, .port = 13, .type = TB_TYPE_DP_HDMI_OUT },
 487	};
 488	struct tb_port *src_port, *dst_port, *p;
 489	struct tb_switch *host, *dev1, *dev3;
 490	int i;
 491
 492	host = alloc_host(test);
 493	dev1 = alloc_dev_default(test, host, 0x1, true);
 494	alloc_dev_default(test, dev1, 0x301, true);
 495	dev3 = alloc_dev_default(test, dev1, 0x501, true);
 496	alloc_dev_default(test, dev1, 0x701, true);
 497
 498	src_port = &host->ports[5];
 499	dst_port = &dev3->ports[13];
 500
 501	/* Walk both directions */
 502
 503	i = 0;
 504	tb_for_each_port_on_path(src_port, dst_port, p) {
 505		KUNIT_EXPECT_TRUE(test, i < ARRAY_SIZE(test_data));
 506		KUNIT_EXPECT_EQ(test, tb_route(p->sw), test_data[i].route);
 507		KUNIT_EXPECT_EQ(test, p->port, test_data[i].port);
 508		KUNIT_EXPECT_EQ(test, (enum tb_port_type)p->config.type,
 509				test_data[i].type);
 510		i++;
 511	}
 512
 513	KUNIT_EXPECT_EQ(test, i, (int)ARRAY_SIZE(test_data));
 514
 515	i = ARRAY_SIZE(test_data) - 1;
 516	tb_for_each_port_on_path(dst_port, src_port, p) {
 517		KUNIT_EXPECT_TRUE(test, i < ARRAY_SIZE(test_data));
 518		KUNIT_EXPECT_EQ(test, tb_route(p->sw), test_data[i].route);
 519		KUNIT_EXPECT_EQ(test, p->port, test_data[i].port);
 520		KUNIT_EXPECT_EQ(test, (enum tb_port_type)p->config.type,
 521				test_data[i].type);
 522		i--;
 523	}
 524
 525	KUNIT_EXPECT_EQ(test, i, -1);
 526}
 527
 528static void tb_test_path_complex_tree_walk(struct kunit *test)
 529{
 530	/*
 531	 * Walks from Device #3 DP IN to Device #9 DP OUT.
 532	 *
 533	 *           [Host]
 534	 *            1 |
 535	 *            1 |
 536	 *         [Device #1]
 537	 *       3 /   | 5  \ 7
 538	 *      1 /    |     \ 1
 539	 * [Device #2] |    [Device #5]
 540	 *    5 |      | 1         \ 7
 541	 *    1 |  [Device #4]      \ 1
 542	 * [Device #3]             [Device #6]
 543	 *                       3 /
 544	 *                      1 /
 545	 *                    [Device #7]
 546	 *                  3 /      | 5
 547	 *                 1 /       |
 548	 *               [Device #8] | 1
 549	 *                       [Device #9]
 550	 */
 551	static const struct port_expectation test_data[] = {
 552		{ .route = 0x50301, .port = 13, .type = TB_TYPE_DP_HDMI_IN },
 553		{ .route = 0x50301, .port = 1, .type = TB_TYPE_PORT },
 554		{ .route = 0x301, .port = 5, .type = TB_TYPE_PORT },
 555		{ .route = 0x301, .port = 1, .type = TB_TYPE_PORT },
 556		{ .route = 0x1, .port = 3, .type = TB_TYPE_PORT },
 557		{ .route = 0x1, .port = 7, .type = TB_TYPE_PORT },
 558		{ .route = 0x701, .port = 1, .type = TB_TYPE_PORT },
 559		{ .route = 0x701, .port = 7, .type = TB_TYPE_PORT },
 560		{ .route = 0x70701, .port = 1, .type = TB_TYPE_PORT },
 561		{ .route = 0x70701, .port = 3, .type = TB_TYPE_PORT },
 562		{ .route = 0x3070701, .port = 1, .type = TB_TYPE_PORT },
 563		{ .route = 0x3070701, .port = 5, .type = TB_TYPE_PORT },
 564		{ .route = 0x503070701, .port = 1, .type = TB_TYPE_PORT },
 565		{ .route = 0x503070701, .port = 14, .type = TB_TYPE_DP_HDMI_OUT },
 566	};
 567	struct tb_switch *host, *dev1, *dev2, *dev3, *dev5, *dev6, *dev7, *dev9;
 568	struct tb_port *src_port, *dst_port, *p;
 569	int i;
 570
 571	host = alloc_host(test);
 572	dev1 = alloc_dev_default(test, host, 0x1, true);
 573	dev2 = alloc_dev_default(test, dev1, 0x301, true);
 574	dev3 = alloc_dev_with_dpin(test, dev2, 0x50301, true);
 575	alloc_dev_default(test, dev1, 0x501, true);
 576	dev5 = alloc_dev_default(test, dev1, 0x701, true);
 577	dev6 = alloc_dev_default(test, dev5, 0x70701, true);
 578	dev7 = alloc_dev_default(test, dev6, 0x3070701, true);
 579	alloc_dev_default(test, dev7, 0x303070701, true);
 580	dev9 = alloc_dev_default(test, dev7, 0x503070701, true);
 581
 582	src_port = &dev3->ports[13];
 583	dst_port = &dev9->ports[14];
 584
 585	/* Walk both directions */
 586
 587	i = 0;
 588	tb_for_each_port_on_path(src_port, dst_port, p) {
 589		KUNIT_EXPECT_TRUE(test, i < ARRAY_SIZE(test_data));
 590		KUNIT_EXPECT_EQ(test, tb_route(p->sw), test_data[i].route);
 591		KUNIT_EXPECT_EQ(test, p->port, test_data[i].port);
 592		KUNIT_EXPECT_EQ(test, (enum tb_port_type)p->config.type,
 593				test_data[i].type);
 594		i++;
 595	}
 596
 597	KUNIT_EXPECT_EQ(test, i, (int)ARRAY_SIZE(test_data));
 598
 599	i = ARRAY_SIZE(test_data) - 1;
 600	tb_for_each_port_on_path(dst_port, src_port, p) {
 601		KUNIT_EXPECT_TRUE(test, i < ARRAY_SIZE(test_data));
 602		KUNIT_EXPECT_EQ(test, tb_route(p->sw), test_data[i].route);
 603		KUNIT_EXPECT_EQ(test, p->port, test_data[i].port);
 604		KUNIT_EXPECT_EQ(test, (enum tb_port_type)p->config.type,
 605				test_data[i].type);
 606		i--;
 607	}
 608
 609	KUNIT_EXPECT_EQ(test, i, -1);
 610}
 611
 612static void tb_test_path_max_length_walk(struct kunit *test)
 613{
 614	struct tb_switch *host, *dev1, *dev2, *dev3, *dev4, *dev5, *dev6;
 615	struct tb_switch *dev7, *dev8, *dev9, *dev10, *dev11, *dev12;
 616	struct tb_port *src_port, *dst_port, *p;
 617	int i;
 618
 619	/*
 620	 * Walks from Device #6 DP IN to Device #12 DP OUT.
 621	 *
 622	 *          [Host]
 623	 *         1 /  \ 3
 624	 *        1 /    \ 1
 625	 * [Device #1]   [Device #7]
 626	 *     3 |           | 3
 627	 *     1 |           | 1
 628	 * [Device #2]   [Device #8]
 629	 *     3 |           | 3
 630	 *     1 |           | 1
 631	 * [Device #3]   [Device #9]
 632	 *     3 |           | 3
 633	 *     1 |           | 1
 634	 * [Device #4]   [Device #10]
 635	 *     3 |           | 3
 636	 *     1 |           | 1
 637	 * [Device #5]   [Device #11]
 638	 *     3 |           | 3
 639	 *     1 |           | 1
 640	 * [Device #6]   [Device #12]
 641	 */
 642	static const struct port_expectation test_data[] = {
 643		{ .route = 0x30303030301, .port = 13, .type = TB_TYPE_DP_HDMI_IN },
 644		{ .route = 0x30303030301, .port = 1, .type = TB_TYPE_PORT },
 645		{ .route = 0x303030301, .port = 3, .type = TB_TYPE_PORT },
 646		{ .route = 0x303030301, .port = 1, .type = TB_TYPE_PORT },
 647		{ .route = 0x3030301, .port = 3, .type = TB_TYPE_PORT },
 648		{ .route = 0x3030301, .port = 1, .type = TB_TYPE_PORT },
 649		{ .route = 0x30301, .port = 3, .type = TB_TYPE_PORT },
 650		{ .route = 0x30301, .port = 1, .type = TB_TYPE_PORT },
 651		{ .route = 0x301, .port = 3, .type = TB_TYPE_PORT },
 652		{ .route = 0x301, .port = 1, .type = TB_TYPE_PORT },
 653		{ .route = 0x1, .port = 3, .type = TB_TYPE_PORT },
 654		{ .route = 0x1, .port = 1, .type = TB_TYPE_PORT },
 655		{ .route = 0x0, .port = 1, .type = TB_TYPE_PORT },
 656		{ .route = 0x0, .port = 3, .type = TB_TYPE_PORT },
 657		{ .route = 0x3, .port = 1, .type = TB_TYPE_PORT },
 658		{ .route = 0x3, .port = 3, .type = TB_TYPE_PORT },
 659		{ .route = 0x303, .port = 1, .type = TB_TYPE_PORT },
 660		{ .route = 0x303, .port = 3, .type = TB_TYPE_PORT },
 661		{ .route = 0x30303, .port = 1, .type = TB_TYPE_PORT },
 662		{ .route = 0x30303, .port = 3, .type = TB_TYPE_PORT },
 663		{ .route = 0x3030303, .port = 1, .type = TB_TYPE_PORT },
 664		{ .route = 0x3030303, .port = 3, .type = TB_TYPE_PORT },
 665		{ .route = 0x303030303, .port = 1, .type = TB_TYPE_PORT },
 666		{ .route = 0x303030303, .port = 3, .type = TB_TYPE_PORT },
 667		{ .route = 0x30303030303, .port = 1, .type = TB_TYPE_PORT },
 668		{ .route = 0x30303030303, .port = 13, .type = TB_TYPE_DP_HDMI_OUT },
 669	};
 670
 671	host = alloc_host(test);
 672	dev1 = alloc_dev_default(test, host, 0x1, true);
 673	dev2 = alloc_dev_default(test, dev1, 0x301, true);
 674	dev3 = alloc_dev_default(test, dev2, 0x30301, true);
 675	dev4 = alloc_dev_default(test, dev3, 0x3030301, true);
 676	dev5 = alloc_dev_default(test, dev4, 0x303030301, true);
 677	dev6 = alloc_dev_with_dpin(test, dev5, 0x30303030301, true);
 678	dev7 = alloc_dev_default(test, host, 0x3, true);
 679	dev8 = alloc_dev_default(test, dev7, 0x303, true);
 680	dev9 = alloc_dev_default(test, dev8, 0x30303, true);
 681	dev10 = alloc_dev_default(test, dev9, 0x3030303, true);
 682	dev11 = alloc_dev_default(test, dev10, 0x303030303, true);
 683	dev12 = alloc_dev_default(test, dev11, 0x30303030303, true);
 684
 685	src_port = &dev6->ports[13];
 686	dst_port = &dev12->ports[13];
 687
 688	/* Walk both directions */
 689
 690	i = 0;
 691	tb_for_each_port_on_path(src_port, dst_port, p) {
 692		KUNIT_EXPECT_TRUE(test, i < ARRAY_SIZE(test_data));
 693		KUNIT_EXPECT_EQ(test, tb_route(p->sw), test_data[i].route);
 694		KUNIT_EXPECT_EQ(test, p->port, test_data[i].port);
 695		KUNIT_EXPECT_EQ(test, (enum tb_port_type)p->config.type,
 696				test_data[i].type);
 697		i++;
 698	}
 699
 700	KUNIT_EXPECT_EQ(test, i, (int)ARRAY_SIZE(test_data));
 701
 702	i = ARRAY_SIZE(test_data) - 1;
 703	tb_for_each_port_on_path(dst_port, src_port, p) {
 704		KUNIT_EXPECT_TRUE(test, i < ARRAY_SIZE(test_data));
 705		KUNIT_EXPECT_EQ(test, tb_route(p->sw), test_data[i].route);
 706		KUNIT_EXPECT_EQ(test, p->port, test_data[i].port);
 707		KUNIT_EXPECT_EQ(test, (enum tb_port_type)p->config.type,
 708				test_data[i].type);
 709		i--;
 710	}
 711
 712	KUNIT_EXPECT_EQ(test, i, -1);
 713}
 714
 715static void tb_test_path_not_connected(struct kunit *test)
 716{
 717	struct tb_switch *host, *dev1, *dev2;
 718	struct tb_port *down, *up;
 719	struct tb_path *path;
 720
 721	host = alloc_host(test);
 722	dev1 = alloc_dev_default(test, host, 0x3, false);
 723	/* Not connected to anything */
 724	dev2 = alloc_dev_default(test, NULL, 0x303, false);
 725
 726	down = &dev1->ports[10];
 727	up = &dev2->ports[9];
 728
 729	path = tb_path_alloc(NULL, down, 8, up, 8, 0, "PCIe Down");
 730	KUNIT_ASSERT_TRUE(test, path == NULL);
 731	path = tb_path_alloc(NULL, down, 8, up, 8, 1, "PCIe Down");
 732	KUNIT_ASSERT_TRUE(test, path == NULL);
 733}
 734
 735struct hop_expectation {
 736	u64 route;
 737	u8 in_port;
 738	enum tb_port_type in_type;
 739	u8 out_port;
 740	enum tb_port_type out_type;
 741};
 742
 743static void tb_test_path_not_bonded_lane0(struct kunit *test)
 744{
 745	/*
 746	 * PCIe path from host to device using lane 0.
 747	 *
 748	 *   [Host]
 749	 *   3 |: 4
 750	 *   1 |: 2
 751	 *  [Device]
 752	 */
 753	static const struct hop_expectation test_data[] = {
 754		{
 755			.route = 0x0,
 756			.in_port = 9,
 757			.in_type = TB_TYPE_PCIE_DOWN,
 758			.out_port = 3,
 759			.out_type = TB_TYPE_PORT,
 760		},
 761		{
 762			.route = 0x3,
 763			.in_port = 1,
 764			.in_type = TB_TYPE_PORT,
 765			.out_port = 9,
 766			.out_type = TB_TYPE_PCIE_UP,
 767		},
 768	};
 769	struct tb_switch *host, *dev;
 770	struct tb_port *down, *up;
 771	struct tb_path *path;
 772	int i;
 773
 774	host = alloc_host(test);
 775	dev = alloc_dev_default(test, host, 0x3, false);
 776
 777	down = &host->ports[9];
 778	up = &dev->ports[9];
 779
 780	path = tb_path_alloc(NULL, down, 8, up, 8, 0, "PCIe Down");
 781	KUNIT_ASSERT_TRUE(test, path != NULL);
 782	KUNIT_ASSERT_EQ(test, path->path_length, (int)ARRAY_SIZE(test_data));
 783	for (i = 0; i < ARRAY_SIZE(test_data); i++) {
 784		const struct tb_port *in_port, *out_port;
 785
 786		in_port = path->hops[i].in_port;
 787		out_port = path->hops[i].out_port;
 788
 789		KUNIT_EXPECT_EQ(test, tb_route(in_port->sw), test_data[i].route);
 790		KUNIT_EXPECT_EQ(test, in_port->port, test_data[i].in_port);
 791		KUNIT_EXPECT_EQ(test, (enum tb_port_type)in_port->config.type,
 792				test_data[i].in_type);
 793		KUNIT_EXPECT_EQ(test, tb_route(out_port->sw), test_data[i].route);
 794		KUNIT_EXPECT_EQ(test, out_port->port, test_data[i].out_port);
 795		KUNIT_EXPECT_EQ(test, (enum tb_port_type)out_port->config.type,
 796				test_data[i].out_type);
 797	}
 798	tb_path_free(path);
 799}
 800
 801static void tb_test_path_not_bonded_lane1(struct kunit *test)
 802{
 803	/*
 804	 * DP Video path from host to device using lane 1. Paths like
 805	 * these are only used with Thunderbolt 1 devices where lane
 806	 * bonding is not possible. USB4 specifically does not allow
 807	 * paths like this (you either use lane 0 where lane 1 is
 808	 * disabled or both lanes are bonded).
 809	 *
 810	 *   [Host]
 811	 *   1 :| 2
 812	 *   1 :| 2
 813	 *  [Device]
 814	 */
 815	static const struct hop_expectation test_data[] = {
 816		{
 817			.route = 0x0,
 818			.in_port = 5,
 819			.in_type = TB_TYPE_DP_HDMI_IN,
 820			.out_port = 2,
 821			.out_type = TB_TYPE_PORT,
 822		},
 823		{
 824			.route = 0x1,
 825			.in_port = 2,
 826			.in_type = TB_TYPE_PORT,
 827			.out_port = 13,
 828			.out_type = TB_TYPE_DP_HDMI_OUT,
 829		},
 830	};
 831	struct tb_switch *host, *dev;
 832	struct tb_port *in, *out;
 833	struct tb_path *path;
 834	int i;
 835
 836	host = alloc_host(test);
 837	dev = alloc_dev_default(test, host, 0x1, false);
 838
 839	in = &host->ports[5];
 840	out = &dev->ports[13];
 841
 842	path = tb_path_alloc(NULL, in, 9, out, 9, 1, "Video");
 843	KUNIT_ASSERT_TRUE(test, path != NULL);
 844	KUNIT_ASSERT_EQ(test, path->path_length, (int)ARRAY_SIZE(test_data));
 845	for (i = 0; i < ARRAY_SIZE(test_data); i++) {
 846		const struct tb_port *in_port, *out_port;
 847
 848		in_port = path->hops[i].in_port;
 849		out_port = path->hops[i].out_port;
 850
 851		KUNIT_EXPECT_EQ(test, tb_route(in_port->sw), test_data[i].route);
 852		KUNIT_EXPECT_EQ(test, in_port->port, test_data[i].in_port);
 853		KUNIT_EXPECT_EQ(test, (enum tb_port_type)in_port->config.type,
 854				test_data[i].in_type);
 855		KUNIT_EXPECT_EQ(test, tb_route(out_port->sw), test_data[i].route);
 856		KUNIT_EXPECT_EQ(test, out_port->port, test_data[i].out_port);
 857		KUNIT_EXPECT_EQ(test, (enum tb_port_type)out_port->config.type,
 858				test_data[i].out_type);
 859	}
 860	tb_path_free(path);
 861}
 862
 863static void tb_test_path_not_bonded_lane1_chain(struct kunit *test)
 864{
 865	/*
 866	 * DP Video path from host to device 3 using lane 1.
 867	 *
 868	 *    [Host]
 869	 *    1 :| 2
 870	 *    1 :| 2
 871	 *  [Device #1]
 872	 *    7 :| 8
 873	 *    1 :| 2
 874	 *  [Device #2]
 875	 *    5 :| 6
 876	 *    1 :| 2
 877	 *  [Device #3]
 878	 */
 879	static const struct hop_expectation test_data[] = {
 880		{
 881			.route = 0x0,
 882			.in_port = 5,
 883			.in_type = TB_TYPE_DP_HDMI_IN,
 884			.out_port = 2,
 885			.out_type = TB_TYPE_PORT,
 886		},
 887		{
 888			.route = 0x1,
 889			.in_port = 2,
 890			.in_type = TB_TYPE_PORT,
 891			.out_port = 8,
 892			.out_type = TB_TYPE_PORT,
 893		},
 894		{
 895			.route = 0x701,
 896			.in_port = 2,
 897			.in_type = TB_TYPE_PORT,
 898			.out_port = 6,
 899			.out_type = TB_TYPE_PORT,
 900		},
 901		{
 902			.route = 0x50701,
 903			.in_port = 2,
 904			.in_type = TB_TYPE_PORT,
 905			.out_port = 13,
 906			.out_type = TB_TYPE_DP_HDMI_OUT,
 907		},
 908	};
 909	struct tb_switch *host, *dev1, *dev2, *dev3;
 910	struct tb_port *in, *out;
 911	struct tb_path *path;
 912	int i;
 913
 914	host = alloc_host(test);
 915	dev1 = alloc_dev_default(test, host, 0x1, false);
 916	dev2 = alloc_dev_default(test, dev1, 0x701, false);
 917	dev3 = alloc_dev_default(test, dev2, 0x50701, false);
 918
 919	in = &host->ports[5];
 920	out = &dev3->ports[13];
 921
 922	path = tb_path_alloc(NULL, in, 9, out, 9, 1, "Video");
 923	KUNIT_ASSERT_TRUE(test, path != NULL);
 924	KUNIT_ASSERT_EQ(test, path->path_length, (int)ARRAY_SIZE(test_data));
 925	for (i = 0; i < ARRAY_SIZE(test_data); i++) {
 926		const struct tb_port *in_port, *out_port;
 927
 928		in_port = path->hops[i].in_port;
 929		out_port = path->hops[i].out_port;
 930
 931		KUNIT_EXPECT_EQ(test, tb_route(in_port->sw), test_data[i].route);
 932		KUNIT_EXPECT_EQ(test, in_port->port, test_data[i].in_port);
 933		KUNIT_EXPECT_EQ(test, (enum tb_port_type)in_port->config.type,
 934				test_data[i].in_type);
 935		KUNIT_EXPECT_EQ(test, tb_route(out_port->sw), test_data[i].route);
 936		KUNIT_EXPECT_EQ(test, out_port->port, test_data[i].out_port);
 937		KUNIT_EXPECT_EQ(test, (enum tb_port_type)out_port->config.type,
 938				test_data[i].out_type);
 939	}
 940	tb_path_free(path);
 941}
 942
 943static void tb_test_path_not_bonded_lane1_chain_reverse(struct kunit *test)
 944{
 945	/*
 946	 * DP Video path from device 3 to host using lane 1.
 947	 *
 948	 *    [Host]
 949	 *    1 :| 2
 950	 *    1 :| 2
 951	 *  [Device #1]
 952	 *    7 :| 8
 953	 *    1 :| 2
 954	 *  [Device #2]
 955	 *    5 :| 6
 956	 *    1 :| 2
 957	 *  [Device #3]
 958	 */
 959	static const struct hop_expectation test_data[] = {
 960		{
 961			.route = 0x50701,
 962			.in_port = 13,
 963			.in_type = TB_TYPE_DP_HDMI_IN,
 964			.out_port = 2,
 965			.out_type = TB_TYPE_PORT,
 966		},
 967		{
 968			.route = 0x701,
 969			.in_port = 6,
 970			.in_type = TB_TYPE_PORT,
 971			.out_port = 2,
 972			.out_type = TB_TYPE_PORT,
 973		},
 974		{
 975			.route = 0x1,
 976			.in_port = 8,
 977			.in_type = TB_TYPE_PORT,
 978			.out_port = 2,
 979			.out_type = TB_TYPE_PORT,
 980		},
 981		{
 982			.route = 0x0,
 983			.in_port = 2,
 984			.in_type = TB_TYPE_PORT,
 985			.out_port = 5,
 986			.out_type = TB_TYPE_DP_HDMI_IN,
 987		},
 988	};
 989	struct tb_switch *host, *dev1, *dev2, *dev3;
 990	struct tb_port *in, *out;
 991	struct tb_path *path;
 992	int i;
 993
 994	host = alloc_host(test);
 995	dev1 = alloc_dev_default(test, host, 0x1, false);
 996	dev2 = alloc_dev_default(test, dev1, 0x701, false);
 997	dev3 = alloc_dev_with_dpin(test, dev2, 0x50701, false);
 998
 999	in = &dev3->ports[13];
1000	out = &host->ports[5];
1001
1002	path = tb_path_alloc(NULL, in, 9, out, 9, 1, "Video");
1003	KUNIT_ASSERT_TRUE(test, path != NULL);
1004	KUNIT_ASSERT_EQ(test, path->path_length, (int)ARRAY_SIZE(test_data));
1005	for (i = 0; i < ARRAY_SIZE(test_data); i++) {
1006		const struct tb_port *in_port, *out_port;
1007
1008		in_port = path->hops[i].in_port;
1009		out_port = path->hops[i].out_port;
1010
1011		KUNIT_EXPECT_EQ(test, tb_route(in_port->sw), test_data[i].route);
1012		KUNIT_EXPECT_EQ(test, in_port->port, test_data[i].in_port);
1013		KUNIT_EXPECT_EQ(test, (enum tb_port_type)in_port->config.type,
1014				test_data[i].in_type);
1015		KUNIT_EXPECT_EQ(test, tb_route(out_port->sw), test_data[i].route);
1016		KUNIT_EXPECT_EQ(test, out_port->port, test_data[i].out_port);
1017		KUNIT_EXPECT_EQ(test, (enum tb_port_type)out_port->config.type,
1018				test_data[i].out_type);
1019	}
1020	tb_path_free(path);
1021}
1022
1023static void tb_test_path_mixed_chain(struct kunit *test)
1024{
1025	/*
1026	 * DP Video path from host to device 4 where first and last link
1027	 * is bonded.
1028	 *
1029	 *    [Host]
1030	 *    1 |
1031	 *    1 |
1032	 *  [Device #1]
1033	 *    7 :| 8
1034	 *    1 :| 2
1035	 *  [Device #2]
1036	 *    5 :| 6
1037	 *    1 :| 2
1038	 *  [Device #3]
1039	 *    3 |
1040	 *    1 |
1041	 *  [Device #4]
1042	 */
1043	static const struct hop_expectation test_data[] = {
1044		{
1045			.route = 0x0,
1046			.in_port = 5,
1047			.in_type = TB_TYPE_DP_HDMI_IN,
1048			.out_port = 1,
1049			.out_type = TB_TYPE_PORT,
1050		},
1051		{
1052			.route = 0x1,
1053			.in_port = 1,
1054			.in_type = TB_TYPE_PORT,
1055			.out_port = 8,
1056			.out_type = TB_TYPE_PORT,
1057		},
1058		{
1059			.route = 0x701,
1060			.in_port = 2,
1061			.in_type = TB_TYPE_PORT,
1062			.out_port = 6,
1063			.out_type = TB_TYPE_PORT,
1064		},
1065		{
1066			.route = 0x50701,
1067			.in_port = 2,
1068			.in_type = TB_TYPE_PORT,
1069			.out_port = 3,
1070			.out_type = TB_TYPE_PORT,
1071		},
1072		{
1073			.route = 0x3050701,
1074			.in_port = 1,
1075			.in_type = TB_TYPE_PORT,
1076			.out_port = 13,
1077			.out_type = TB_TYPE_DP_HDMI_OUT,
1078		},
1079	};
1080	struct tb_switch *host, *dev1, *dev2, *dev3, *dev4;
1081	struct tb_port *in, *out;
1082	struct tb_path *path;
1083	int i;
1084
1085	host = alloc_host(test);
1086	dev1 = alloc_dev_default(test, host, 0x1, true);
1087	dev2 = alloc_dev_default(test, dev1, 0x701, false);
1088	dev3 = alloc_dev_default(test, dev2, 0x50701, false);
1089	dev4 = alloc_dev_default(test, dev3, 0x3050701, true);
1090
1091	in = &host->ports[5];
1092	out = &dev4->ports[13];
1093
1094	path = tb_path_alloc(NULL, in, 9, out, 9, 1, "Video");
1095	KUNIT_ASSERT_TRUE(test, path != NULL);
1096	KUNIT_ASSERT_EQ(test, path->path_length, (int)ARRAY_SIZE(test_data));
1097	for (i = 0; i < ARRAY_SIZE(test_data); i++) {
1098		const struct tb_port *in_port, *out_port;
1099
1100		in_port = path->hops[i].in_port;
1101		out_port = path->hops[i].out_port;
1102
1103		KUNIT_EXPECT_EQ(test, tb_route(in_port->sw), test_data[i].route);
1104		KUNIT_EXPECT_EQ(test, in_port->port, test_data[i].in_port);
1105		KUNIT_EXPECT_EQ(test, (enum tb_port_type)in_port->config.type,
1106				test_data[i].in_type);
1107		KUNIT_EXPECT_EQ(test, tb_route(out_port->sw), test_data[i].route);
1108		KUNIT_EXPECT_EQ(test, out_port->port, test_data[i].out_port);
1109		KUNIT_EXPECT_EQ(test, (enum tb_port_type)out_port->config.type,
1110				test_data[i].out_type);
1111	}
1112	tb_path_free(path);
1113}
1114
1115static void tb_test_path_mixed_chain_reverse(struct kunit *test)
1116{
1117	/*
1118	 * DP Video path from device 4 to host where first and last link
1119	 * is bonded.
1120	 *
1121	 *    [Host]
1122	 *    1 |
1123	 *    1 |
1124	 *  [Device #1]
1125	 *    7 :| 8
1126	 *    1 :| 2
1127	 *  [Device #2]
1128	 *    5 :| 6
1129	 *    1 :| 2
1130	 *  [Device #3]
1131	 *    3 |
1132	 *    1 |
1133	 *  [Device #4]
1134	 */
1135	static const struct hop_expectation test_data[] = {
1136		{
1137			.route = 0x3050701,
1138			.in_port = 13,
1139			.in_type = TB_TYPE_DP_HDMI_OUT,
1140			.out_port = 1,
1141			.out_type = TB_TYPE_PORT,
1142		},
1143		{
1144			.route = 0x50701,
1145			.in_port = 3,
1146			.in_type = TB_TYPE_PORT,
1147			.out_port = 2,
1148			.out_type = TB_TYPE_PORT,
1149		},
1150		{
1151			.route = 0x701,
1152			.in_port = 6,
1153			.in_type = TB_TYPE_PORT,
1154			.out_port = 2,
1155			.out_type = TB_TYPE_PORT,
1156		},
1157		{
1158			.route = 0x1,
1159			.in_port = 8,
1160			.in_type = TB_TYPE_PORT,
1161			.out_port = 1,
1162			.out_type = TB_TYPE_PORT,
1163		},
1164		{
1165			.route = 0x0,
1166			.in_port = 1,
1167			.in_type = TB_TYPE_PORT,
1168			.out_port = 5,
1169			.out_type = TB_TYPE_DP_HDMI_IN,
1170		},
1171	};
1172	struct tb_switch *host, *dev1, *dev2, *dev3, *dev4;
1173	struct tb_port *in, *out;
1174	struct tb_path *path;
1175	int i;
1176
1177	host = alloc_host(test);
1178	dev1 = alloc_dev_default(test, host, 0x1, true);
1179	dev2 = alloc_dev_default(test, dev1, 0x701, false);
1180	dev3 = alloc_dev_default(test, dev2, 0x50701, false);
1181	dev4 = alloc_dev_default(test, dev3, 0x3050701, true);
1182
1183	in = &dev4->ports[13];
1184	out = &host->ports[5];
1185
1186	path = tb_path_alloc(NULL, in, 9, out, 9, 1, "Video");
1187	KUNIT_ASSERT_TRUE(test, path != NULL);
1188	KUNIT_ASSERT_EQ(test, path->path_length, (int)ARRAY_SIZE(test_data));
1189	for (i = 0; i < ARRAY_SIZE(test_data); i++) {
1190		const struct tb_port *in_port, *out_port;
1191
1192		in_port = path->hops[i].in_port;
1193		out_port = path->hops[i].out_port;
1194
1195		KUNIT_EXPECT_EQ(test, tb_route(in_port->sw), test_data[i].route);
1196		KUNIT_EXPECT_EQ(test, in_port->port, test_data[i].in_port);
1197		KUNIT_EXPECT_EQ(test, (enum tb_port_type)in_port->config.type,
1198				test_data[i].in_type);
1199		KUNIT_EXPECT_EQ(test, tb_route(out_port->sw), test_data[i].route);
1200		KUNIT_EXPECT_EQ(test, out_port->port, test_data[i].out_port);
1201		KUNIT_EXPECT_EQ(test, (enum tb_port_type)out_port->config.type,
1202				test_data[i].out_type);
1203	}
1204	tb_path_free(path);
1205}
1206
1207static void tb_test_tunnel_pcie(struct kunit *test)
1208{
1209	struct tb_switch *host, *dev1, *dev2;
1210	struct tb_tunnel *tunnel1, *tunnel2;
1211	struct tb_port *down, *up;
1212
1213	/*
1214	 * Create PCIe tunnel between host and two devices.
1215	 *
1216	 *   [Host]
1217	 *    1 |
1218	 *    1 |
1219	 *  [Device #1]
1220	 *    5 |
1221	 *    1 |
1222	 *  [Device #2]
1223	 */
1224	host = alloc_host(test);
1225	dev1 = alloc_dev_default(test, host, 0x1, true);
1226	dev2 = alloc_dev_default(test, dev1, 0x501, true);
1227
1228	down = &host->ports[8];
1229	up = &dev1->ports[9];
1230	tunnel1 = tb_tunnel_alloc_pci(NULL, up, down);
1231	KUNIT_ASSERT_TRUE(test, tunnel1 != NULL);
1232	KUNIT_EXPECT_EQ(test, tunnel1->type, (enum tb_tunnel_type)TB_TUNNEL_PCI);
1233	KUNIT_EXPECT_PTR_EQ(test, tunnel1->src_port, down);
1234	KUNIT_EXPECT_PTR_EQ(test, tunnel1->dst_port, up);
1235	KUNIT_ASSERT_EQ(test, tunnel1->npaths, (size_t)2);
1236	KUNIT_ASSERT_EQ(test, tunnel1->paths[0]->path_length, 2);
1237	KUNIT_EXPECT_PTR_EQ(test, tunnel1->paths[0]->hops[0].in_port, down);
1238	KUNIT_EXPECT_PTR_EQ(test, tunnel1->paths[0]->hops[1].out_port, up);
1239	KUNIT_ASSERT_EQ(test, tunnel1->paths[1]->path_length, 2);
1240	KUNIT_EXPECT_PTR_EQ(test, tunnel1->paths[1]->hops[0].in_port, up);
1241	KUNIT_EXPECT_PTR_EQ(test, tunnel1->paths[1]->hops[1].out_port, down);
1242
1243	down = &dev1->ports[10];
1244	up = &dev2->ports[9];
1245	tunnel2 = tb_tunnel_alloc_pci(NULL, up, down);
1246	KUNIT_ASSERT_TRUE(test, tunnel2 != NULL);
1247	KUNIT_EXPECT_EQ(test, tunnel2->type, (enum tb_tunnel_type)TB_TUNNEL_PCI);
1248	KUNIT_EXPECT_PTR_EQ(test, tunnel2->src_port, down);
1249	KUNIT_EXPECT_PTR_EQ(test, tunnel2->dst_port, up);
1250	KUNIT_ASSERT_EQ(test, tunnel2->npaths, (size_t)2);
1251	KUNIT_ASSERT_EQ(test, tunnel2->paths[0]->path_length, 2);
1252	KUNIT_EXPECT_PTR_EQ(test, tunnel2->paths[0]->hops[0].in_port, down);
1253	KUNIT_EXPECT_PTR_EQ(test, tunnel2->paths[0]->hops[1].out_port, up);
1254	KUNIT_ASSERT_EQ(test, tunnel2->paths[1]->path_length, 2);
1255	KUNIT_EXPECT_PTR_EQ(test, tunnel2->paths[1]->hops[0].in_port, up);
1256	KUNIT_EXPECT_PTR_EQ(test, tunnel2->paths[1]->hops[1].out_port, down);
1257
1258	tb_tunnel_free(tunnel2);
1259	tb_tunnel_free(tunnel1);
1260}
1261
1262static void tb_test_tunnel_dp(struct kunit *test)
1263{
1264	struct tb_switch *host, *dev;
1265	struct tb_port *in, *out;
1266	struct tb_tunnel *tunnel;
1267
1268	/*
1269	 * Create DP tunnel between Host and Device
1270	 *
1271	 *   [Host]
1272	 *   1 |
1273	 *   1 |
1274	 *  [Device]
1275	 */
1276	host = alloc_host(test);
1277	dev = alloc_dev_default(test, host, 0x3, true);
1278
1279	in = &host->ports[5];
1280	out = &dev->ports[13];
1281
1282	tunnel = tb_tunnel_alloc_dp(NULL, in, out, 0, 0);
1283	KUNIT_ASSERT_TRUE(test, tunnel != NULL);
1284	KUNIT_EXPECT_EQ(test, tunnel->type, (enum tb_tunnel_type)TB_TUNNEL_DP);
1285	KUNIT_EXPECT_PTR_EQ(test, tunnel->src_port, in);
1286	KUNIT_EXPECT_PTR_EQ(test, tunnel->dst_port, out);
1287	KUNIT_ASSERT_EQ(test, tunnel->npaths, (size_t)3);
1288	KUNIT_ASSERT_EQ(test, tunnel->paths[0]->path_length, 2);
1289	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[0]->hops[0].in_port, in);
1290	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[0]->hops[1].out_port, out);
1291	KUNIT_ASSERT_EQ(test, tunnel->paths[1]->path_length, 2);
1292	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[1]->hops[0].in_port, in);
1293	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[1]->hops[1].out_port, out);
1294	KUNIT_ASSERT_EQ(test, tunnel->paths[2]->path_length, 2);
1295	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[2]->hops[0].in_port, out);
1296	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[2]->hops[1].out_port, in);
1297	tb_tunnel_free(tunnel);
1298}
1299
1300static void tb_test_tunnel_dp_chain(struct kunit *test)
1301{
1302	struct tb_switch *host, *dev1, *dev4;
1303	struct tb_port *in, *out;
1304	struct tb_tunnel *tunnel;
1305
1306	/*
1307	 * Create DP tunnel from Host DP IN to Device #4 DP OUT.
1308	 *
1309	 *           [Host]
1310	 *            1 |
1311	 *            1 |
1312	 *         [Device #1]
1313	 *       3 /   | 5  \ 7
1314	 *      1 /    |     \ 1
1315	 * [Device #2] |    [Device #4]
1316	 *             | 1
1317	 *         [Device #3]
1318	 */
1319	host = alloc_host(test);
1320	dev1 = alloc_dev_default(test, host, 0x1, true);
1321	alloc_dev_default(test, dev1, 0x301, true);
1322	alloc_dev_default(test, dev1, 0x501, true);
1323	dev4 = alloc_dev_default(test, dev1, 0x701, true);
1324
1325	in = &host->ports[5];
1326	out = &dev4->ports[14];
1327
1328	tunnel = tb_tunnel_alloc_dp(NULL, in, out, 0, 0);
1329	KUNIT_ASSERT_TRUE(test, tunnel != NULL);
1330	KUNIT_EXPECT_EQ(test, tunnel->type, (enum tb_tunnel_type)TB_TUNNEL_DP);
1331	KUNIT_EXPECT_PTR_EQ(test, tunnel->src_port, in);
1332	KUNIT_EXPECT_PTR_EQ(test, tunnel->dst_port, out);
1333	KUNIT_ASSERT_EQ(test, tunnel->npaths, (size_t)3);
1334	KUNIT_ASSERT_EQ(test, tunnel->paths[0]->path_length, 3);
1335	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[0]->hops[0].in_port, in);
1336	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[0]->hops[2].out_port, out);
1337	KUNIT_ASSERT_EQ(test, tunnel->paths[1]->path_length, 3);
1338	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[1]->hops[0].in_port, in);
1339	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[1]->hops[2].out_port, out);
1340	KUNIT_ASSERT_EQ(test, tunnel->paths[2]->path_length, 3);
1341	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[2]->hops[0].in_port, out);
1342	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[2]->hops[2].out_port, in);
1343	tb_tunnel_free(tunnel);
1344}
1345
1346static void tb_test_tunnel_dp_tree(struct kunit *test)
1347{
1348	struct tb_switch *host, *dev1, *dev2, *dev3, *dev5;
1349	struct tb_port *in, *out;
1350	struct tb_tunnel *tunnel;
1351
1352	/*
1353	 * Create DP tunnel from Device #2 DP IN to Device #5 DP OUT.
1354	 *
1355	 *          [Host]
1356	 *           3 |
1357	 *           1 |
1358	 *         [Device #1]
1359	 *       3 /   | 5  \ 7
1360	 *      1 /    |     \ 1
1361	 * [Device #2] |    [Device #4]
1362	 *             | 1
1363	 *         [Device #3]
1364	 *             | 5
1365	 *             | 1
1366	 *         [Device #5]
1367	 */
1368	host = alloc_host(test);
1369	dev1 = alloc_dev_default(test, host, 0x3, true);
1370	dev2 = alloc_dev_with_dpin(test, dev1, 0x303, true);
1371	dev3 = alloc_dev_default(test, dev1, 0x503, true);
1372	alloc_dev_default(test, dev1, 0x703, true);
1373	dev5 = alloc_dev_default(test, dev3, 0x50503, true);
1374
1375	in = &dev2->ports[13];
1376	out = &dev5->ports[13];
1377
1378	tunnel = tb_tunnel_alloc_dp(NULL, in, out, 0, 0);
1379	KUNIT_ASSERT_TRUE(test, tunnel != NULL);
1380	KUNIT_EXPECT_EQ(test, tunnel->type, (enum tb_tunnel_type)TB_TUNNEL_DP);
1381	KUNIT_EXPECT_PTR_EQ(test, tunnel->src_port, in);
1382	KUNIT_EXPECT_PTR_EQ(test, tunnel->dst_port, out);
1383	KUNIT_ASSERT_EQ(test, tunnel->npaths, (size_t)3);
1384	KUNIT_ASSERT_EQ(test, tunnel->paths[0]->path_length, 4);
1385	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[0]->hops[0].in_port, in);
1386	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[0]->hops[3].out_port, out);
1387	KUNIT_ASSERT_EQ(test, tunnel->paths[1]->path_length, 4);
1388	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[1]->hops[0].in_port, in);
1389	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[1]->hops[3].out_port, out);
1390	KUNIT_ASSERT_EQ(test, tunnel->paths[2]->path_length, 4);
1391	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[2]->hops[0].in_port, out);
1392	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[2]->hops[3].out_port, in);
1393	tb_tunnel_free(tunnel);
1394}
1395
1396static void tb_test_tunnel_dp_max_length(struct kunit *test)
1397{
1398	struct tb_switch *host, *dev1, *dev2, *dev3, *dev4, *dev5, *dev6;
1399	struct tb_switch *dev7, *dev8, *dev9, *dev10, *dev11, *dev12;
1400	struct tb_port *in, *out;
1401	struct tb_tunnel *tunnel;
1402
1403	/*
1404	 * Creates DP tunnel from Device #6 to Device #12.
1405	 *
1406	 *          [Host]
1407	 *         1 /  \ 3
1408	 *        1 /    \ 1
1409	 * [Device #1]   [Device #7]
1410	 *     3 |           | 3
1411	 *     1 |           | 1
1412	 * [Device #2]   [Device #8]
1413	 *     3 |           | 3
1414	 *     1 |           | 1
1415	 * [Device #3]   [Device #9]
1416	 *     3 |           | 3
1417	 *     1 |           | 1
1418	 * [Device #4]   [Device #10]
1419	 *     3 |           | 3
1420	 *     1 |           | 1
1421	 * [Device #5]   [Device #11]
1422	 *     3 |           | 3
1423	 *     1 |           | 1
1424	 * [Device #6]   [Device #12]
1425	 */
1426	host = alloc_host(test);
1427	dev1 = alloc_dev_default(test, host, 0x1, true);
1428	dev2 = alloc_dev_default(test, dev1, 0x301, true);
1429	dev3 = alloc_dev_default(test, dev2, 0x30301, true);
1430	dev4 = alloc_dev_default(test, dev3, 0x3030301, true);
1431	dev5 = alloc_dev_default(test, dev4, 0x303030301, true);
1432	dev6 = alloc_dev_with_dpin(test, dev5, 0x30303030301, true);
1433	dev7 = alloc_dev_default(test, host, 0x3, true);
1434	dev8 = alloc_dev_default(test, dev7, 0x303, true);
1435	dev9 = alloc_dev_default(test, dev8, 0x30303, true);
1436	dev10 = alloc_dev_default(test, dev9, 0x3030303, true);
1437	dev11 = alloc_dev_default(test, dev10, 0x303030303, true);
1438	dev12 = alloc_dev_default(test, dev11, 0x30303030303, true);
1439
1440	in = &dev6->ports[13];
1441	out = &dev12->ports[13];
1442
1443	tunnel = tb_tunnel_alloc_dp(NULL, in, out, 0, 0);
1444	KUNIT_ASSERT_TRUE(test, tunnel != NULL);
1445	KUNIT_EXPECT_EQ(test, tunnel->type, (enum tb_tunnel_type)TB_TUNNEL_DP);
1446	KUNIT_EXPECT_PTR_EQ(test, tunnel->src_port, in);
1447	KUNIT_EXPECT_PTR_EQ(test, tunnel->dst_port, out);
1448	KUNIT_ASSERT_EQ(test, tunnel->npaths, (size_t)3);
1449	KUNIT_ASSERT_EQ(test, tunnel->paths[0]->path_length, 13);
1450	/* First hop */
1451	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[0]->hops[0].in_port, in);
1452	/* Middle */
1453	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[0]->hops[6].in_port,
1454			    &host->ports[1]);
1455	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[0]->hops[6].out_port,
1456			    &host->ports[3]);
1457	/* Last */
1458	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[0]->hops[12].out_port, out);
1459	KUNIT_ASSERT_EQ(test, tunnel->paths[1]->path_length, 13);
1460	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[1]->hops[0].in_port, in);
1461	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[1]->hops[6].in_port,
1462			    &host->ports[1]);
1463	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[1]->hops[6].out_port,
1464			    &host->ports[3]);
1465	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[1]->hops[12].out_port, out);
1466	KUNIT_ASSERT_EQ(test, tunnel->paths[2]->path_length, 13);
1467	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[2]->hops[0].in_port, out);
1468	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[2]->hops[6].in_port,
1469			    &host->ports[3]);
1470	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[2]->hops[6].out_port,
1471			    &host->ports[1]);
1472	KUNIT_EXPECT_PTR_EQ(test, tunnel->paths[2]->hops[12].out_port, in);
1473	tb_tunnel_free(tunnel);
1474}
1475
1476static void tb_test_tunnel_usb3(struct kunit *test)
1477{
1478	struct tb_switch *host, *dev1, *dev2;
1479	struct tb_tunnel *tunnel1, *tunnel2;
1480	struct tb_port *down, *up;
1481
1482	/*
1483	 * Create USB3 tunnel between host and two devices.
1484	 *
1485	 *   [Host]
1486	 *    1 |
1487	 *    1 |
1488	 *  [Device #1]
1489	 *          \ 7
1490	 *           \ 1
1491	 *         [Device #2]
1492	 */
1493	host = alloc_host(test);
1494	dev1 = alloc_dev_default(test, host, 0x1, true);
1495	dev2 = alloc_dev_default(test, dev1, 0x701, true);
1496
1497	down = &host->ports[12];
1498	up = &dev1->ports[16];
1499	tunnel1 = tb_tunnel_alloc_usb3(NULL, up, down, 0, 0);
1500	KUNIT_ASSERT_TRUE(test, tunnel1 != NULL);
1501	KUNIT_EXPECT_EQ(test, tunnel1->type, (enum tb_tunnel_type)TB_TUNNEL_USB3);
1502	KUNIT_EXPECT_PTR_EQ(test, tunnel1->src_port, down);
1503	KUNIT_EXPECT_PTR_EQ(test, tunnel1->dst_port, up);
1504	KUNIT_ASSERT_EQ(test, tunnel1->npaths, (size_t)2);
1505	KUNIT_ASSERT_EQ(test, tunnel1->paths[0]->path_length, 2);
1506	KUNIT_EXPECT_PTR_EQ(test, tunnel1->paths[0]->hops[0].in_port, down);
1507	KUNIT_EXPECT_PTR_EQ(test, tunnel1->paths[0]->hops[1].out_port, up);
1508	KUNIT_ASSERT_EQ(test, tunnel1->paths[1]->path_length, 2);
1509	KUNIT_EXPECT_PTR_EQ(test, tunnel1->paths[1]->hops[0].in_port, up);
1510	KUNIT_EXPECT_PTR_EQ(test, tunnel1->paths[1]->hops[1].out_port, down);
1511
1512	down = &dev1->ports[17];
1513	up = &dev2->ports[16];
1514	tunnel2 = tb_tunnel_alloc_usb3(NULL, up, down, 0, 0);
1515	KUNIT_ASSERT_TRUE(test, tunnel2 != NULL);
1516	KUNIT_EXPECT_EQ(test, tunnel2->type, (enum tb_tunnel_type)TB_TUNNEL_USB3);
1517	KUNIT_EXPECT_PTR_EQ(test, tunnel2->src_port, down);
1518	KUNIT_EXPECT_PTR_EQ(test, tunnel2->dst_port, up);
1519	KUNIT_ASSERT_EQ(test, tunnel2->npaths, (size_t)2);
1520	KUNIT_ASSERT_EQ(test, tunnel2->paths[0]->path_length, 2);
1521	KUNIT_EXPECT_PTR_EQ(test, tunnel2->paths[0]->hops[0].in_port, down);
1522	KUNIT_EXPECT_PTR_EQ(test, tunnel2->paths[0]->hops[1].out_port, up);
1523	KUNIT_ASSERT_EQ(test, tunnel2->paths[1]->path_length, 2);
1524	KUNIT_EXPECT_PTR_EQ(test, tunnel2->paths[1]->hops[0].in_port, up);
1525	KUNIT_EXPECT_PTR_EQ(test, tunnel2->paths[1]->hops[1].out_port, down);
1526
1527	tb_tunnel_free(tunnel2);
1528	tb_tunnel_free(tunnel1);
1529}
1530
1531static void tb_test_tunnel_port_on_path(struct kunit *test)
1532{
1533	struct tb_switch *host, *dev1, *dev2, *dev3, *dev4, *dev5;
1534	struct tb_port *in, *out, *port;
1535	struct tb_tunnel *dp_tunnel;
1536
1537	/*
1538	 *          [Host]
1539	 *           3 |
1540	 *           1 |
1541	 *         [Device #1]
1542	 *       3 /   | 5  \ 7
1543	 *      1 /    |     \ 1
1544	 * [Device #2] |    [Device #4]
1545	 *             | 1
1546	 *         [Device #3]
1547	 *             | 5
1548	 *             | 1
1549	 *         [Device #5]
1550	 */
1551	host = alloc_host(test);
1552	dev1 = alloc_dev_default(test, host, 0x3, true);
1553	dev2 = alloc_dev_with_dpin(test, dev1, 0x303, true);
1554	dev3 = alloc_dev_default(test, dev1, 0x503, true);
1555	dev4 = alloc_dev_default(test, dev1, 0x703, true);
1556	dev5 = alloc_dev_default(test, dev3, 0x50503, true);
1557
1558	in = &dev2->ports[13];
1559	out = &dev5->ports[13];
1560
1561	dp_tunnel = tb_tunnel_alloc_dp(NULL, in, out, 0, 0);
1562	KUNIT_ASSERT_TRUE(test, dp_tunnel != NULL);
1563
1564	KUNIT_EXPECT_TRUE(test, tb_tunnel_port_on_path(dp_tunnel, in));
1565	KUNIT_EXPECT_TRUE(test, tb_tunnel_port_on_path(dp_tunnel, out));
1566
1567	port = &host->ports[8];
1568	KUNIT_EXPECT_FALSE(test, tb_tunnel_port_on_path(dp_tunnel, port));
1569
1570	port = &host->ports[3];
1571	KUNIT_EXPECT_FALSE(test, tb_tunnel_port_on_path(dp_tunnel, port));
1572
1573	port = &dev1->ports[1];
1574	KUNIT_EXPECT_FALSE(test, tb_tunnel_port_on_path(dp_tunnel, port));
1575
1576	port = &dev1->ports[3];
1577	KUNIT_EXPECT_TRUE(test, tb_tunnel_port_on_path(dp_tunnel, port));
1578
1579	port = &dev1->ports[5];
1580	KUNIT_EXPECT_TRUE(test, tb_tunnel_port_on_path(dp_tunnel, port));
1581
1582	port = &dev1->ports[7];
1583	KUNIT_EXPECT_FALSE(test, tb_tunnel_port_on_path(dp_tunnel, port));
1584
1585	port = &dev3->ports[1];
1586	KUNIT_EXPECT_TRUE(test, tb_tunnel_port_on_path(dp_tunnel, port));
1587
1588	port = &dev5->ports[1];
1589	KUNIT_EXPECT_TRUE(test, tb_tunnel_port_on_path(dp_tunnel, port));
1590
1591	port = &dev4->ports[1];
1592	KUNIT_EXPECT_FALSE(test, tb_tunnel_port_on_path(dp_tunnel, port));
1593
1594	tb_tunnel_free(dp_tunnel);
1595}
1596
1597static struct kunit_case tb_test_cases[] = {
1598	KUNIT_CASE(tb_test_path_basic),
1599	KUNIT_CASE(tb_test_path_not_connected_walk),
1600	KUNIT_CASE(tb_test_path_single_hop_walk),
1601	KUNIT_CASE(tb_test_path_daisy_chain_walk),
1602	KUNIT_CASE(tb_test_path_simple_tree_walk),
1603	KUNIT_CASE(tb_test_path_complex_tree_walk),
1604	KUNIT_CASE(tb_test_path_max_length_walk),
1605	KUNIT_CASE(tb_test_path_not_connected),
1606	KUNIT_CASE(tb_test_path_not_bonded_lane0),
1607	KUNIT_CASE(tb_test_path_not_bonded_lane1),
1608	KUNIT_CASE(tb_test_path_not_bonded_lane1_chain),
1609	KUNIT_CASE(tb_test_path_not_bonded_lane1_chain_reverse),
1610	KUNIT_CASE(tb_test_path_mixed_chain),
1611	KUNIT_CASE(tb_test_path_mixed_chain_reverse),
1612	KUNIT_CASE(tb_test_tunnel_pcie),
1613	KUNIT_CASE(tb_test_tunnel_dp),
1614	KUNIT_CASE(tb_test_tunnel_dp_chain),
1615	KUNIT_CASE(tb_test_tunnel_dp_tree),
1616	KUNIT_CASE(tb_test_tunnel_dp_max_length),
1617	KUNIT_CASE(tb_test_tunnel_port_on_path),
1618	KUNIT_CASE(tb_test_tunnel_usb3),
1619	{ }
1620};
1621
1622static struct kunit_suite tb_test_suite = {
1623	.name = "thunderbolt",
1624	.test_cases = tb_test_cases,
1625};
1626kunit_test_suite(tb_test_suite);