// SPDX-License-Identifier: GPL-2.0-only//// node-tree-test.c - An application of Kunit to test node tree.//// Copyright (c) 2026 Takashi Sakamoto//// This file can not be built independently since it is intentionally included in core-topology.c. #include <kunit/test.h>#include <kunit/test-bug.h>#include <kunit/device.h> struct private_data { struct fw_card *card; unsigned int release_count;}; static int node_tree_test_init(struct kunit *test){ struct private_data *data; data = kunit_kzalloc(test, sizeof(*data), GFP_KERNEL); KUNIT_ASSERT_NOT_NULL(test, data); data->card = kunit_kzalloc(test, sizeof(struct fw_card), GFP_KERNEL); KUNIT_ASSERT_NOT_NULL(test, data->card); data->card->device = kunit_device_register(test, "dummy-device"); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, data->card->device); test->priv = data; return 0;} static void node_tree_test_exit(struct kunit *test){ struct private_data *data = test->priv; kunit_device_unregister(test, data->card->device); kunit_kfree(test, data->card); kunit_kfree(test, data);} static void release_fw_node(struct fw_card *card, struct fw_node *node, struct fw_node *parent){ struct private_data *data = kunit_get_current_test()->priv; fw_node_put(node); ++data->release_count;} static void node_tree_test_two_nodes(struct kunit *test){ // root // ++============++ // || phy 1 || // || P0 P1 P2 || // ++===|==|==|==++ // | // +-----+ // | // ++===|==x==x==++ // || P0 P1 P2 || // || phy 0 || // ++============++ // static const u32 self_id_sequence[] = { 0x80000080, 0x8100005e, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x01; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); struct fw_node *parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 1); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 2);} static void node_tree_test_two_nodes_1394a(struct kunit *test){ // root // ++===============++ // || phy 0 || // || P0 P1 P2 P3 || // ++===|==|==|==|==++ // | // +--+ // | // ++===|==|==|==|==|==++ // || P0 P1 P2 P3 P4 || // || phy 1 || // ++==================++ // // NOTE: Just for Self-ID Packets Zero and One. static const u32 self_id_sequence[] = { 0x80000065, 0x80814000, 0x8100005d, 0x81810000, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x01; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 4); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); KUNIT_EXPECT_NULL(test, node->ports[3]); struct fw_node *parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 5); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent); KUNIT_EXPECT_NULL(test, node->ports[2]); KUNIT_EXPECT_NULL(test, node->ports[3]); KUNIT_EXPECT_NULL(test, node->ports[4]); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 2);} static void node_tree_test_three_nodes_case0(struct kunit *test){ // root // ++============++ // || phy 2 || // || P0 P1 P2 || // ++===|==|==|==++ // | | // +--+ +-----------------+ // | | // ++===|==|==x==++ ++===|==|==|==++ // || P0 P1 P2 || || P0 P1 P2 || // || phy 0 || || phy 1 || // ++============++ ++============++ // static const u32 self_id_sequence[] = { 0x80000060, 0x81000058, 0x820000dc, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x02; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NOT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); struct fw_node *parent = node; node = parent->ports[0]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 2); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent); node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_PTR_EQ(test, node->ports[2], parent); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 3);} static void node_tree_test_three_nodes_case1(struct kunit *test){ // root // ++============++ // || phy 2 || // || P0 P1 P2 || // ++===|==|==x==++ // | // | +-----------+ // | | | // ++===|==|==|==++ ++===|==x==x==++ // || P0 P1 P2 || || P0 P1 P2 || // || phy 1 || || phy 0 || // ++============++ ++============++ // static const u32 self_id_sequence[] = { 0x80000080, 0x8100006c, 0x82000070, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x02; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02); KUNIT_EXPECT_EQ(test, node->port_count, 2); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); struct fw_node *parent = node; node = parent->ports[1]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 1); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 3);} static void node_tree_test_four_nodes_case0(struct kunit *test){ // root // ++============++ // || phy 3 || // || P0 P1 P2 || // ++===|==|==|==++ // | // | +-----------+ +--------------+ // | | | | | // ++===|==|==|==++ ++===|==|==x==++ ++===|==x==x==++ // || P0 P1 P2 || || P0 P1 P2 || || P0 P1 P2 || // || phy 2 || || phy 1 || || phy 0 || // ++============++ ++============++ ++============++ // static const u32 self_id_sequence[] = { 0x80000080, 0x810000b0, 0x8200006c, 0x83000074, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x03; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x03); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); KUNIT_EXPECT_NULL(test, node->ports[2]); struct fw_node *parent = node; node = parent->ports[1]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 2); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); parent = node; node = parent->ports[1]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 1); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 4);} static void node_tree_test_four_nodes_case1(struct kunit *test){ // root // ++============++ // || phy 3 || // || P0 P1 P2 || // ++===|==|==x==++ // | // | +--------------------------------+ // | | +-----------+ | // ++===|==|==|==++ ++===|==x==x==++ ++===|==|==|==++ // || P0 P1 P2 || || P0 P1 P2 || || P0 P1 P2 || // || phy 2 || || phy 1 || || phy 0 || // ++============++ ++============++ ++============++ // static const u32 self_id_sequence[] = { 0x80000094, 0x81000080, 0x820000bc, 0x830000d0, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x03; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x03); KUNIT_EXPECT_EQ(test, node->port_count, 2); KUNIT_EXPECT_NOT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); struct fw_node *parent = node; node = parent->ports[0]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 1); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); node = parent->ports[1]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_NULL(test, node->ports[2]); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 4);} static void node_tree_test_four_nodes_case2(struct kunit *test){ // root // ++============++ // || phy 3 || // || P0 P1 P2 || // ++===|==|==|==++ // | | // | +-----------------------------+ // | +--------------+ | // ++===|==|==x==++ ++===|==|==|==++ ++===|==x==x==++ // || P0 P1 P2 || || P0 P1 P2 || || P0 P1 P2 || // || phy 1 || || phy 0 || || phy 2 || // ++============++ ++============++ ++============++ // static const u32 self_id_sequence[] = { 0x80000094, 0x810000b0, 0x82000080, 0x830000dc, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x03; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x03); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NOT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); struct fw_node *parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02); KUNIT_EXPECT_EQ(test, node->port_count, 1); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); node = parent->ports[0]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 2); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); parent = node; node = parent->ports[1]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_NULL(test, node->ports[2]); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 4);} static void node_tree_test_four_nodes_case3(struct kunit *test){ // root // ++============++ // || phy 3 || // || P0 P1 P2 || // ++===|==|==|==++ // | | +--------------------------------+ // | +--------------------+ | // | | | // ++===|==|==x==++ ++===|==|==|==++ ++===|==|==x==++ // || P0 P1 P2 || || P0 P1 P2 || || P0 P1 P2 || // || phy 0 || || phy 1 || || phy 2 || // ++============++ ++============++ ++============++ // static const u32 self_id_sequence[] = { 0x80000090, 0x81000058, 0x82000060, 0x830000fc, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x03; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x03); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NOT_NULL(test, node->ports[0]); KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); struct fw_node *parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02); KUNIT_EXPECT_EQ(test, node->port_count, 2); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent); node = parent->ports[1]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_PTR_EQ(test, node->ports[2], parent); node = parent->ports[0]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 2);Lines 1–500 of 607. Load more
// SPDX-License-Identifier: GPL-2.0-only // // node-tree-test.c - An application of Kunit to test node tree. // // Copyright (c) 2026 Takashi Sakamoto // // This file can not be built independently since it is intentionally included in core-topology.c. #include <kunit/test.h> #include <kunit/test-bug.h> #include <kunit/device.h> struct private_data { struct fw_card *card; unsigned int release_count; }; static int node_tree_test_init(struct kunit *test) { struct private_data *data; data = kunit_kzalloc(test, sizeof(*data), GFP_KERNEL); KUNIT_ASSERT_NOT_NULL(test, data); data->card = kunit_kzalloc(test, sizeof(struct fw_card), GFP_KERNEL); KUNIT_ASSERT_NOT_NULL(test, data->card); data->card->device = kunit_device_register(test, "dummy-device"); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, data->card->device); test->priv = data; return 0; } static void node_tree_test_exit(struct kunit *test) { struct private_data *data = test->priv; kunit_device_unregister(test, data->card->device); kunit_kfree(test, data->card); kunit_kfree(test, data); } static void release_fw_node(struct fw_card *card, struct fw_node *node, struct fw_node *parent) { struct private_data *data = kunit_get_current_test()->priv; fw_node_put(node); ++data->release_count; } static void node_tree_test_two_nodes(struct kunit *test) { // root // ++============++ // || phy 1 || // || P0 P1 P2 || // ++===|==|==|==++ // | // +-----+ // | // ++===|==x==x==++ // || P0 P1 P2 || // || phy 0 || // ++============++ // static const u32 self_id_sequence[] = { 0x80000080, 0x8100005e, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x01; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); struct fw_node *parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 1); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 2); } static void node_tree_test_two_nodes_1394a(struct kunit *test) { // root // ++===============++ // || phy 0 || // || P0 P1 P2 P3 || // ++===|==|==|==|==++ // | // +--+ // | // ++===|==|==|==|==|==++ // || P0 P1 P2 P3 P4 || // || phy 1 || // ++==================++ // // NOTE: Just for Self-ID Packets Zero and One. static const u32 self_id_sequence[] = { 0x80000065, 0x80814000, 0x8100005d, 0x81810000, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x01; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 4); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); KUNIT_EXPECT_NULL(test, node->ports[3]); struct fw_node *parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 5); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent); KUNIT_EXPECT_NULL(test, node->ports[2]); KUNIT_EXPECT_NULL(test, node->ports[3]); KUNIT_EXPECT_NULL(test, node->ports[4]); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 2); } static void node_tree_test_three_nodes_case0(struct kunit *test) { // root // ++============++ // || phy 2 || // || P0 P1 P2 || // ++===|==|==|==++ // | | // +--+ +-----------------+ // | | // ++===|==|==x==++ ++===|==|==|==++ // || P0 P1 P2 || || P0 P1 P2 || // || phy 0 || || phy 1 || // ++============++ ++============++ // static const u32 self_id_sequence[] = { 0x80000060, 0x81000058, 0x820000dc, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x02; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NOT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); struct fw_node *parent = node; node = parent->ports[0]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 2); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent); node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_PTR_EQ(test, node->ports[2], parent); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 3); } static void node_tree_test_three_nodes_case1(struct kunit *test) { // root // ++============++ // || phy 2 || // || P0 P1 P2 || // ++===|==|==x==++ // | // | +-----------+ // | | | // ++===|==|==|==++ ++===|==x==x==++ // || P0 P1 P2 || || P0 P1 P2 || // || phy 1 || || phy 0 || // ++============++ ++============++ // static const u32 self_id_sequence[] = { 0x80000080, 0x8100006c, 0x82000070, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x02; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02); KUNIT_EXPECT_EQ(test, node->port_count, 2); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); struct fw_node *parent = node; node = parent->ports[1]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 1); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 3); } static void node_tree_test_four_nodes_case0(struct kunit *test) { // root // ++============++ // || phy 3 || // || P0 P1 P2 || // ++===|==|==|==++ // | // | +-----------+ +--------------+ // | | | | | // ++===|==|==|==++ ++===|==|==x==++ ++===|==x==x==++ // || P0 P1 P2 || || P0 P1 P2 || || P0 P1 P2 || // || phy 2 || || phy 1 || || phy 0 || // ++============++ ++============++ ++============++ // static const u32 self_id_sequence[] = { 0x80000080, 0x810000b0, 0x8200006c, 0x83000074, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x03; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x03); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); KUNIT_EXPECT_NULL(test, node->ports[2]); struct fw_node *parent = node; node = parent->ports[1]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 2); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); parent = node; node = parent->ports[1]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 1); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 4); } static void node_tree_test_four_nodes_case1(struct kunit *test) { // root // ++============++ // || phy 3 || // || P0 P1 P2 || // ++===|==|==x==++ // | // | +--------------------------------+ // | | +-----------+ | // ++===|==|==|==++ ++===|==x==x==++ ++===|==|==|==++ // || P0 P1 P2 || || P0 P1 P2 || || P0 P1 P2 || // || phy 2 || || phy 1 || || phy 0 || // ++============++ ++============++ ++============++ // static const u32 self_id_sequence[] = { 0x80000094, 0x81000080, 0x820000bc, 0x830000d0, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x03; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x03); KUNIT_EXPECT_EQ(test, node->port_count, 2); KUNIT_EXPECT_NOT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); struct fw_node *parent = node; node = parent->ports[0]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 1); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); node = parent->ports[1]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_NULL(test, node->ports[2]); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 4); } static void node_tree_test_four_nodes_case2(struct kunit *test) { // root // ++============++ // || phy 3 || // || P0 P1 P2 || // ++===|==|==|==++ // | | // | +-----------------------------+ // | +--------------+ | // ++===|==|==x==++ ++===|==|==|==++ ++===|==x==x==++ // || P0 P1 P2 || || P0 P1 P2 || || P0 P1 P2 || // || phy 1 || || phy 0 || || phy 2 || // ++============++ ++============++ ++============++ // static const u32 self_id_sequence[] = { 0x80000094, 0x810000b0, 0x82000080, 0x830000dc, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x03; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x03); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NOT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); struct fw_node *parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02); KUNIT_EXPECT_EQ(test, node->port_count, 1); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); node = parent->ports[0]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 2); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); parent = node; node = parent->ports[1]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_NULL(test, node->ports[2]); ++card->color; for_each_fw_node(card, card->root_node, release_fw_node); KUNIT_EXPECT_EQ(test, data->release_count, 4); } static void node_tree_test_four_nodes_case3(struct kunit *test) { // root // ++============++ // || phy 3 || // || P0 P1 P2 || // ++===|==|==|==++ // | | +--------------------------------+ // | +--------------------+ | // | | | // ++===|==|==x==++ ++===|==|==|==++ ++===|==|==x==++ // || P0 P1 P2 || || P0 P1 P2 || || P0 P1 P2 || // || phy 0 || || phy 1 || || phy 2 || // ++============++ ++============++ ++============++ // static const u32 self_id_sequence[] = { 0x80000090, 0x81000058, 0x82000060, 0x830000fc, }; struct private_data *data = test->priv; struct fw_card *card = data->card; card->node_id = LOCAL_BUS | 0x03; card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123); KUNIT_EXPECT_NOT_NULL(test, card->local_node); KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); struct fw_node *node = card->root_node; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x03); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NOT_NULL(test, node->ports[0]); KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); struct fw_node *parent = node; node = parent->ports[2]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02); KUNIT_EXPECT_EQ(test, node->port_count, 2); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent); node = parent->ports[1]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01); KUNIT_EXPECT_EQ(test, node->port_count, 3); KUNIT_EXPECT_NULL(test, node->ports[0]); KUNIT_EXPECT_NULL(test, node->ports[1]); KUNIT_EXPECT_PTR_EQ(test, node->ports[2], parent); node = parent->ports[0]; KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00); KUNIT_EXPECT_EQ(test, node->port_count, 2);