918 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2//3// packet-serdes-test.c - An application of Kunit to check serialization/deserialization of packets4// defined by IEEE 1394.5//6// Copyright (c) 2024 Takashi Sakamoto7 8#include <kunit/test.h>9 10#include <linux/firewire-constants.h>11 12#include "packet-header-definitions.h"13#include "phy-packet-definitions.h"14 15static void serialize_async_header_common(u32 header[ASYNC_HEADER_QUADLET_COUNT],16 unsigned int dst_id, unsigned int tlabel,17 unsigned int retry, unsigned int tcode,18 unsigned int priority, unsigned int src_id)19{20 async_header_set_destination(header, dst_id);21 async_header_set_tlabel(header, tlabel);22 async_header_set_retry(header, retry);23 async_header_set_tcode(header, tcode);24 async_header_set_priority(header, priority);25 async_header_set_source(header, src_id);26}27 28static void serialize_async_header_request(u32 header[ASYNC_HEADER_QUADLET_COUNT],29 unsigned int dst_id, unsigned int tlabel,30 unsigned int retry, unsigned int tcode,31 unsigned int priority, unsigned int src_id, u64 offset)32{33 serialize_async_header_common(header, dst_id, tlabel, retry, tcode, priority, src_id);34 async_header_set_offset(header, offset);35}36 37static void serialize_async_header_quadlet_request(u32 header[ASYNC_HEADER_QUADLET_COUNT],38 unsigned int dst_id, unsigned int tlabel,39 unsigned int retry, unsigned int tcode,40 unsigned int priority, unsigned int src_id,41 u64 offset)42{43 serialize_async_header_request(header, dst_id, tlabel, retry, tcode, priority, src_id,44 offset);45}46 47static void serialize_async_header_block_request(u32 header[ASYNC_HEADER_QUADLET_COUNT],48 unsigned int dst_id, unsigned int tlabel,49 unsigned int retry, unsigned int tcode,50 unsigned int priority, unsigned int src_id,51 u64 offset, unsigned int data_length,52 unsigned int extended_tcode)53{54 serialize_async_header_request(header, dst_id, tlabel, retry, tcode, priority, src_id,55 offset);56 async_header_set_data_length(header, data_length);57 async_header_set_extended_tcode(header, extended_tcode);58}59 60static void serialize_async_header_response(u32 header[ASYNC_HEADER_QUADLET_COUNT],61 unsigned int dst_id, unsigned int tlabel,62 unsigned int retry, unsigned int tcode,63 unsigned int priority, unsigned int src_id,64 unsigned int rcode)65{66 serialize_async_header_common(header, dst_id, tlabel, retry, tcode, priority, src_id);67 async_header_set_rcode(header, rcode);68}69 70static void serialize_async_header_quadlet_response(u32 header[ASYNC_HEADER_QUADLET_COUNT],71 unsigned int dst_id, unsigned int tlabel,72 unsigned int retry, unsigned int tcode,73 unsigned int priority, unsigned int src_id,74 unsigned int rcode)75{76 serialize_async_header_response(header, dst_id, tlabel, retry, tcode, priority, src_id,77 rcode);78}79 80static void serialize_async_header_block_response(u32 header[ASYNC_HEADER_QUADLET_COUNT],81 unsigned int dst_id, unsigned int tlabel,82 unsigned int retry, unsigned int tcode,83 unsigned int priority, unsigned int src_id,84 unsigned int rcode, unsigned int data_length,85 unsigned int extended_tcode)86{87 serialize_async_header_response(header, dst_id, tlabel, retry, tcode, priority, src_id,88 rcode);89 async_header_set_data_length(header, data_length);90 async_header_set_extended_tcode(header, extended_tcode);91}92 93static void deserialize_async_header_common(const u32 header[ASYNC_HEADER_QUADLET_COUNT],94 unsigned int *dst_id, unsigned int *tlabel,95 unsigned int *retry, unsigned int *tcode,96 unsigned int *priority, unsigned int *src_id)97{98 *dst_id = async_header_get_destination(header);99 *tlabel = async_header_get_tlabel(header);100 *retry = async_header_get_retry(header);101 *tcode = async_header_get_tcode(header);102 *priority = async_header_get_priority(header);103 *src_id = async_header_get_source(header);104}105 106static void deserialize_async_header_request(const u32 header[ASYNC_HEADER_QUADLET_COUNT],107 unsigned int *dst_id, unsigned int *tlabel,108 unsigned int *retry, unsigned int *tcode,109 unsigned int *priority, unsigned int *src_id,110 u64 *offset)111{112 deserialize_async_header_common(header, dst_id, tlabel, retry, tcode, priority, src_id);113 *offset = async_header_get_offset(header);114}115 116static void deserialize_async_header_quadlet_request(const u32 header[ASYNC_HEADER_QUADLET_COUNT],117 unsigned int *dst_id, unsigned int *tlabel,118 unsigned int *retry, unsigned int *tcode,119 unsigned int *priority, unsigned int *src_id,120 u64 *offset)121{122 deserialize_async_header_request(header, dst_id, tlabel, retry, tcode, priority, src_id,123 offset);124}125 126static void deserialize_async_header_block_request(const u32 header[ASYNC_HEADER_QUADLET_COUNT],127 unsigned int *dst_id, unsigned int *tlabel,128 unsigned int *retry, unsigned int *tcode,129 unsigned int *priority, unsigned int *src_id,130 u64 *offset,131 unsigned int *data_length,132 unsigned int *extended_tcode)133{134 deserialize_async_header_request(header, dst_id, tlabel, retry, tcode, priority, src_id,135 offset);136 *data_length = async_header_get_data_length(header);137 *extended_tcode = async_header_get_extended_tcode(header);138}139 140static void deserialize_async_header_response(const u32 header[ASYNC_HEADER_QUADLET_COUNT],141 unsigned int *dst_id, unsigned int *tlabel,142 unsigned int *retry, unsigned int *tcode,143 unsigned int *priority, unsigned int *src_id,144 unsigned int *rcode)145{146 deserialize_async_header_common(header, dst_id, tlabel, retry, tcode, priority, src_id);147 *rcode = async_header_get_rcode(header);148}149 150static void deserialize_async_header_quadlet_response(const u32 header[ASYNC_HEADER_QUADLET_COUNT],151 unsigned int *dst_id, unsigned int *tlabel,152 unsigned int *retry, unsigned int *tcode,153 unsigned int *priority, unsigned int *src_id,154 unsigned int *rcode)155{156 deserialize_async_header_response(header, dst_id, tlabel, retry, tcode, priority, src_id, rcode);157}158 159static void deserialize_async_header_block_response(const u32 header[ASYNC_HEADER_QUADLET_COUNT],160 unsigned int *dst_id, unsigned int *tlabel,161 unsigned int *retry, unsigned int *tcode,162 unsigned int *priority, unsigned int *src_id,163 unsigned int *rcode, unsigned int *data_length,164 unsigned int *extended_tcode)165{166 deserialize_async_header_response(header, dst_id, tlabel, retry, tcode, priority, src_id, rcode);167 *data_length = async_header_get_data_length(header);168 *extended_tcode = async_header_get_extended_tcode(header);169}170 171static void serialize_isoc_header(u32 *header, unsigned int data_length, unsigned int tag,172 unsigned int channel, unsigned int tcode, unsigned int sy)173{174 isoc_header_set_data_length(header, data_length);175 isoc_header_set_tag(header, tag);176 isoc_header_set_channel(header, channel);177 isoc_header_set_tcode(header, tcode);178 isoc_header_set_sy(header, sy);179}180 181static void deserialize_isoc_header(u32 header, unsigned int *data_length, unsigned int *tag,182 unsigned int *channel, unsigned int *tcode, unsigned int *sy)183{184 *data_length = isoc_header_get_data_length(header);185 *tag = isoc_header_get_tag(header);186 *channel = isoc_header_get_channel(header);187 *tcode = isoc_header_get_tcode(header);188 *sy = isoc_header_get_sy(header);189}190 191static void serialize_phy_packet_self_id_zero(u32 *quadlet, unsigned int packet_identifier,192 unsigned int phy_id, bool extended,193 bool link_is_active, unsigned int gap_count,194 unsigned int scode, bool is_contender,195 unsigned int power_class, bool is_initiated_reset,196 bool has_more_packets)197{198 phy_packet_set_packet_identifier(quadlet, packet_identifier);199 phy_packet_self_id_set_phy_id(quadlet, phy_id);200 phy_packet_self_id_set_extended(quadlet, extended);201 phy_packet_self_id_zero_set_link_active(quadlet, link_is_active);202 phy_packet_self_id_zero_set_gap_count(quadlet, gap_count);203 phy_packet_self_id_zero_set_scode(quadlet, scode);204 phy_packet_self_id_zero_set_contender(quadlet, is_contender);205 phy_packet_self_id_zero_set_power_class(quadlet, power_class);206 phy_packet_self_id_zero_set_initiated_reset(quadlet, is_initiated_reset);207 phy_packet_self_id_set_more_packets(quadlet, has_more_packets);208}209 210static void deserialize_phy_packet_self_id_zero(u32 quadlet, unsigned int *packet_identifier,211 unsigned int *phy_id, bool *extended,212 bool *link_is_active, unsigned int *gap_count,213 unsigned int *scode, bool *is_contender,214 unsigned int *power_class,215 bool *is_initiated_reset, bool *has_more_packets)216{217 *packet_identifier = phy_packet_get_packet_identifier(quadlet);218 *phy_id = phy_packet_self_id_get_phy_id(quadlet);219 *extended = phy_packet_self_id_get_extended(quadlet);220 *link_is_active = phy_packet_self_id_zero_get_link_active(quadlet);221 *gap_count = phy_packet_self_id_zero_get_gap_count(quadlet);222 *scode = phy_packet_self_id_zero_get_scode(quadlet);223 *is_contender = phy_packet_self_id_zero_get_contender(quadlet);224 *power_class = phy_packet_self_id_zero_get_power_class(quadlet);225 *is_initiated_reset = phy_packet_self_id_zero_get_initiated_reset(quadlet);226 *has_more_packets = phy_packet_self_id_get_more_packets(quadlet);227}228 229static void serialize_phy_packet_self_id_extended(u32 *quadlet, unsigned int packet_identifier,230 unsigned int phy_id, bool extended,231 unsigned int sequence, bool has_more_packets)232{233 phy_packet_set_packet_identifier(quadlet, packet_identifier);234 phy_packet_self_id_set_phy_id(quadlet, phy_id);235 phy_packet_self_id_set_extended(quadlet, extended);236 phy_packet_self_id_extended_set_sequence(quadlet, sequence);237 phy_packet_self_id_set_more_packets(quadlet, has_more_packets);238}239 240static void deserialize_phy_packet_self_id_extended(u32 quadlet, unsigned int *packet_identifier,241 unsigned int *phy_id, bool *extended,242 unsigned int *sequence, bool *has_more_packets)243{244 *packet_identifier = phy_packet_get_packet_identifier(quadlet);245 *phy_id = phy_packet_self_id_get_phy_id(quadlet);246 *extended = phy_packet_self_id_get_extended(quadlet);247 *sequence = phy_packet_self_id_extended_get_sequence(quadlet);248 *has_more_packets = phy_packet_self_id_get_more_packets(quadlet);249}250 251static void serialize_phy_packet_phy_config(u32 *quadlet, unsigned int packet_identifier,252 unsigned int root_id, bool has_force_root_node,253 bool has_gap_count_optimization, unsigned int gap_count)254{255 phy_packet_set_packet_identifier(quadlet, packet_identifier);256 phy_packet_phy_config_set_root_id(quadlet, root_id);257 phy_packet_phy_config_set_force_root_node(quadlet, has_force_root_node);258 phy_packet_phy_config_set_gap_count_optimization(quadlet, has_gap_count_optimization);259 phy_packet_phy_config_set_gap_count(quadlet, gap_count);260}261 262static void deserialize_phy_packet_phy_config(u32 quadlet, unsigned int *packet_identifier,263 unsigned int *root_id, bool *has_force_root_node,264 bool *has_gap_count_optimization,265 unsigned int *gap_count)266{267 *packet_identifier = phy_packet_get_packet_identifier(quadlet);268 *root_id = phy_packet_phy_config_get_root_id(quadlet);269 *has_force_root_node = phy_packet_phy_config_get_force_root_node(quadlet);270 *has_gap_count_optimization = phy_packet_phy_config_get_gap_count_optimization(quadlet);271 *gap_count = phy_packet_phy_config_get_gap_count(quadlet);272}273 274static void test_async_header_write_quadlet_request(struct kunit *test)275{276 static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {277 0xffc05100,278 0xffc1ffff,279 0xf0000234,280 0x1f0000c0,281 };282 u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};283 284 unsigned int dst_id;285 unsigned int tlabel;286 unsigned int retry;287 unsigned int tcode;288 unsigned int priority;289 unsigned int src_id;290 u64 offset;291 u32 quadlet_data;292 293 deserialize_async_header_quadlet_request(expected, &dst_id, &tlabel, &retry, &tcode,294 &priority, &src_id, &offset);295 quadlet_data = async_header_get_quadlet_data(expected);296 297 KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);298 KUNIT_EXPECT_EQ(test, 0x14, tlabel);299 KUNIT_EXPECT_EQ(test, 0x01, retry);300 KUNIT_EXPECT_EQ(test, TCODE_WRITE_QUADLET_REQUEST, tcode);301 KUNIT_EXPECT_EQ(test, 0x00, priority);302 KUNIT_EXPECT_EQ(test, 0xffc1, src_id);303 KUNIT_EXPECT_EQ(test, 0xfffff0000234, offset);304 KUNIT_EXPECT_EQ(test, 0x1f0000c0, quadlet_data);305 306 serialize_async_header_quadlet_request(header, dst_id, tlabel, retry, tcode, priority,307 src_id, offset);308 async_header_set_quadlet_data(header, quadlet_data);309 310 KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));311}312 313static void test_async_header_write_block_request(struct kunit *test)314{315 static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {316 0xffc06510,317 0xffc1ecc0,318 0x00000000,319 0x00180000,320 };321 u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};322 323 unsigned int dst_id;324 unsigned int tlabel;325 unsigned int retry;326 unsigned int tcode;327 unsigned int priority;328 unsigned int src_id;329 u64 offset;330 unsigned int data_length;331 unsigned int extended_tcode;332 333 deserialize_async_header_block_request(expected, &dst_id, &tlabel, &retry, &tcode,334 &priority, &src_id, &offset, &data_length,335 &extended_tcode);336 337 KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);338 KUNIT_EXPECT_EQ(test, 0x19, tlabel);339 KUNIT_EXPECT_EQ(test, 0x01, retry);340 KUNIT_EXPECT_EQ(test, TCODE_WRITE_BLOCK_REQUEST, tcode);341 KUNIT_EXPECT_EQ(test, 0x00, priority);342 KUNIT_EXPECT_EQ(test, 0xffc1, src_id);343 KUNIT_EXPECT_EQ(test, 0xecc000000000, offset);344 KUNIT_EXPECT_EQ(test, 0x0018, data_length);345 KUNIT_EXPECT_EQ(test, 0x0000, extended_tcode);346 347 serialize_async_header_block_request(header, dst_id, tlabel, retry, tcode, priority, src_id,348 offset, data_length, extended_tcode);349 350 KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));351}352 353static void test_async_header_write_response(struct kunit *test)354{355 static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {356 0xffc15120,357 0xffc00000,358 0x00000000,359 0x00000000,360 };361 u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};362 363 unsigned int dst_id;364 unsigned int tlabel;365 unsigned int retry;366 unsigned int tcode;367 unsigned int priority;368 unsigned int src_id;369 unsigned int rcode;370 371 deserialize_async_header_quadlet_response(expected, &dst_id, &tlabel, &retry, &tcode,372 &priority, &src_id, &rcode);373 374 KUNIT_EXPECT_EQ(test, 0xffc1, dst_id);375 KUNIT_EXPECT_EQ(test, 0x14, tlabel);376 KUNIT_EXPECT_EQ(test, 0x01, retry);377 KUNIT_EXPECT_EQ(test, TCODE_WRITE_RESPONSE, tcode);378 KUNIT_EXPECT_EQ(test, 0x00, priority);379 KUNIT_EXPECT_EQ(test, 0xffc0, src_id);380 KUNIT_EXPECT_EQ(test, RCODE_COMPLETE, rcode);381 382 serialize_async_header_quadlet_response(header, dst_id, tlabel, retry, tcode, priority,383 src_id, rcode);384 385 KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected) - sizeof(expected[0]));386}387 388static void test_async_header_read_quadlet_request(struct kunit *test)389{390 static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {391 0xffc0f140,392 0xffc1ffff,393 0xf0000984,394 0x00000000,395 };396 u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};397 398 unsigned int dst_id;399 unsigned int tlabel;400 unsigned int retry;401 unsigned int tcode;402 unsigned int priority;403 unsigned int src_id;404 u64 offset;405 406 deserialize_async_header_quadlet_request(expected, &dst_id, &tlabel, &retry, &tcode,407 &priority, &src_id, &offset);408 409 KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);410 KUNIT_EXPECT_EQ(test, 0x3c, tlabel);411 KUNIT_EXPECT_EQ(test, 0x01, retry);412 KUNIT_EXPECT_EQ(test, TCODE_READ_QUADLET_REQUEST, tcode);413 KUNIT_EXPECT_EQ(test, 0x00, priority);414 KUNIT_EXPECT_EQ(test, 0xffc1, src_id);415 KUNIT_EXPECT_EQ(test, 0xfffff0000984, offset);416 417 serialize_async_header_quadlet_request(header, dst_id, tlabel, retry, tcode, priority,418 src_id, offset);419 420 KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));421}422 423static void test_async_header_read_quadlet_response(struct kunit *test)424{425 static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {426 0xffc1f160,427 0xffc00000,428 0x00000000,429 0x00000180,430 };431 u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};432 433 unsigned int dst_id;434 unsigned int tlabel;435 unsigned int retry;436 unsigned int tcode;437 unsigned int priority;438 unsigned int src_id;439 unsigned int rcode;440 u32 quadlet_data;441 442 deserialize_async_header_quadlet_response(expected, &dst_id, &tlabel, &retry, &tcode,443 &priority, &src_id, &rcode);444 quadlet_data = async_header_get_quadlet_data(expected);445 446 KUNIT_EXPECT_EQ(test, 0xffc1, dst_id);447 KUNIT_EXPECT_EQ(test, 0x3c, tlabel);448 KUNIT_EXPECT_EQ(test, 0x01, retry);449 KUNIT_EXPECT_EQ(test, TCODE_READ_QUADLET_RESPONSE, tcode);450 KUNIT_EXPECT_EQ(test, 0x00, priority);451 KUNIT_EXPECT_EQ(test, 0xffc0, src_id);452 KUNIT_EXPECT_EQ(test, RCODE_COMPLETE, rcode);453 KUNIT_EXPECT_EQ(test, 0x00000180, quadlet_data);454 455 serialize_async_header_quadlet_response(header, dst_id, tlabel, retry, tcode, priority,456 src_id, rcode);457 async_header_set_quadlet_data(header, quadlet_data);458 459 KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));460}461 462static void test_async_header_read_block_request(struct kunit *test)463{464 static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {465 0xffc0e150,466 0xffc1ffff,467 0xf0000400,468 0x00200000,469 };470 u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};471 472 unsigned int dst_id;473 unsigned int tlabel;474 unsigned int retry;475 unsigned int tcode;476 unsigned int priority;477 unsigned int src_id;478 u64 offset;479 unsigned int data_length;480 unsigned int extended_tcode;481 482 deserialize_async_header_block_request(expected, &dst_id, &tlabel, &retry, &tcode,483 &priority, &src_id, &offset, &data_length,484 &extended_tcode);485 486 KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);487 KUNIT_EXPECT_EQ(test, 0x38, tlabel);488 KUNIT_EXPECT_EQ(test, 0x01, retry);489 KUNIT_EXPECT_EQ(test, TCODE_READ_BLOCK_REQUEST, tcode);490 KUNIT_EXPECT_EQ(test, 0x00, priority);491 KUNIT_EXPECT_EQ(test, 0xffc1, src_id);492 KUNIT_EXPECT_EQ(test, 0xfffff0000400, offset);493 KUNIT_EXPECT_EQ(test, 0x0020, data_length);494 KUNIT_EXPECT_EQ(test, 0x0000, extended_tcode);495 496 serialize_async_header_block_request(header, dst_id, tlabel, retry, tcode, priority, src_id,497 offset, data_length, extended_tcode);498 499 KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));500}501 502static void test_async_header_read_block_response(struct kunit *test)503{504 static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {505 0xffc1e170,506 0xffc00000,507 0x00000000,508 0x00200000,509 };510 u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};511 512 unsigned int dst_id;513 unsigned int tlabel;514 unsigned int retry;515 unsigned int tcode;516 unsigned int priority;517 unsigned int src_id;518 unsigned int rcode;519 unsigned int data_length;520 unsigned int extended_tcode;521 522 deserialize_async_header_block_response(expected, &dst_id, &tlabel, &retry, &tcode,523 &priority, &src_id, &rcode, &data_length,524 &extended_tcode);525 526 KUNIT_EXPECT_EQ(test, 0xffc1, dst_id);527 KUNIT_EXPECT_EQ(test, 0x38, tlabel);528 KUNIT_EXPECT_EQ(test, 0x01, retry);529 KUNIT_EXPECT_EQ(test, TCODE_READ_BLOCK_RESPONSE, tcode);530 KUNIT_EXPECT_EQ(test, 0x00, priority);531 KUNIT_EXPECT_EQ(test, 0xffc0, src_id);532 KUNIT_EXPECT_EQ(test, RCODE_COMPLETE, rcode);533 KUNIT_EXPECT_EQ(test, 0x0020, data_length);534 KUNIT_EXPECT_EQ(test, 0x0000, extended_tcode);535 536 serialize_async_header_block_response(header, dst_id, tlabel, retry, tcode, priority,537 src_id, rcode, data_length, extended_tcode);538 539 KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));540}541 542static void test_async_header_lock_request(struct kunit *test)543{544 static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {545 0xffc02d90,546 0xffc1ffff,547 0xf0000984,548 0x00080002,549 };550 u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};551 552 unsigned int dst_id;553 unsigned int tlabel;554 unsigned int retry;555 unsigned int tcode;556 unsigned int priority;557 unsigned int src_id;558 u64 offset;559 unsigned int data_length;560 unsigned int extended_tcode;561 562 deserialize_async_header_block_request(expected, &dst_id, &tlabel, &retry, &tcode,563 &priority, &src_id, &offset, &data_length,564 &extended_tcode);565 566 KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);567 KUNIT_EXPECT_EQ(test, 0x0b, tlabel);568 KUNIT_EXPECT_EQ(test, 0x01, retry);569 KUNIT_EXPECT_EQ(test, TCODE_LOCK_REQUEST, tcode);570 KUNIT_EXPECT_EQ(test, 0x00, priority);571 KUNIT_EXPECT_EQ(test, 0xffc1, src_id);572 KUNIT_EXPECT_EQ(test, 0xfffff0000984, offset);573 KUNIT_EXPECT_EQ(test, 0x0008, data_length);574 KUNIT_EXPECT_EQ(test, EXTCODE_COMPARE_SWAP, extended_tcode);575 576 serialize_async_header_block_request(header, dst_id, tlabel, retry, tcode, priority, src_id,577 offset, data_length, extended_tcode);578 579 KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));580}581 582static void test_async_header_lock_response(struct kunit *test)583{584 static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {585 0xffc12db0,586 0xffc00000,587 0x00000000,588 0x00040002,589 };590 u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};591 592 unsigned int dst_id;593 unsigned int tlabel;594 unsigned int retry;595 unsigned int tcode;596 unsigned int priority;597 unsigned int src_id;598 unsigned int rcode;599 unsigned int data_length;600 unsigned int extended_tcode;601 602 deserialize_async_header_block_response(expected, &dst_id, &tlabel, &retry, &tcode,603 &priority, &src_id, &rcode, &data_length,604 &extended_tcode);605 606 KUNIT_EXPECT_EQ(test, 0xffc1, dst_id);607 KUNIT_EXPECT_EQ(test, 0x0b, tlabel);608 KUNIT_EXPECT_EQ(test, 0x01, retry);609 KUNIT_EXPECT_EQ(test, TCODE_LOCK_RESPONSE, tcode);610 KUNIT_EXPECT_EQ(test, 0x00, priority);611 KUNIT_EXPECT_EQ(test, 0xffc0, src_id);612 KUNIT_EXPECT_EQ(test, RCODE_COMPLETE, rcode);613 KUNIT_EXPECT_EQ(test, 0x0004, data_length);614 KUNIT_EXPECT_EQ(test, EXTCODE_COMPARE_SWAP, extended_tcode);615 616 serialize_async_header_block_response(header, dst_id, tlabel, retry, tcode, priority,617 src_id, rcode, data_length, extended_tcode);618 619 KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));620}621 622static void test_isoc_header(struct kunit *test)623{624 const u32 expected = 0x00d08dec;625 u32 header = 0;626 627 unsigned int data_length;628 unsigned int tag;629 unsigned int channel;630 unsigned int tcode;631 unsigned int sy;632 633 deserialize_isoc_header(expected, &data_length, &tag, &channel, &tcode, &sy);634 635 KUNIT_EXPECT_EQ(test, 0xd0, data_length);636 KUNIT_EXPECT_EQ(test, 0x02, tag);637 KUNIT_EXPECT_EQ(test, 0x0d, channel);638 KUNIT_EXPECT_EQ(test, 0x0e, tcode);639 KUNIT_EXPECT_EQ(test, 0x0c, sy);640 641 serialize_isoc_header(&header, data_length, tag, channel, tcode, sy);642 643 KUNIT_EXPECT_EQ(test, header, expected);644}645 646static void test_phy_packet_self_id_zero_case0(struct kunit *test)647{648 // TSB41AB1/2 with 1 port.649 const u32 expected[] = {0x80458c80};650 u32 quadlets[] = {0};651 652 unsigned int packet_identifier;653 unsigned int phy_id;654 bool extended;655 bool link_is_active;656 unsigned int gap_count;657 unsigned int scode;658 bool is_contender;659 unsigned int power_class;660 enum phy_packet_self_id_port_status port_status[3];661 bool is_initiated_reset;662 bool has_more_packets;663 unsigned int port_index;664 665 deserialize_phy_packet_self_id_zero(expected[0], &packet_identifier, &phy_id, &extended,666 &link_is_active, &gap_count, &scode, &is_contender,667 &power_class, &is_initiated_reset, &has_more_packets);668 669 KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier);670 KUNIT_EXPECT_EQ(test, 0, phy_id);671 KUNIT_EXPECT_FALSE(test, extended);672 KUNIT_EXPECT_TRUE(test, link_is_active);673 KUNIT_EXPECT_EQ(test, 0x05, gap_count);674 KUNIT_EXPECT_EQ(test, SCODE_400, scode);675 KUNIT_EXPECT_TRUE(test, is_contender);676 KUNIT_EXPECT_EQ(test, 0x4, power_class);677 KUNIT_EXPECT_FALSE(test, is_initiated_reset);678 KUNIT_EXPECT_FALSE(test, has_more_packets);679 680 serialize_phy_packet_self_id_zero(quadlets, packet_identifier, phy_id, extended,681 link_is_active, gap_count, scode, is_contender,682 power_class, is_initiated_reset, has_more_packets);683 684 for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {685 port_status[port_index] =686 self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index);687 }688 689 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[0]);690 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[1]);691 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[2]);692 693 for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {694 self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index,695 port_status[port_index]);696 }697 698 KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected));699}700 701static void test_phy_packet_self_id_zero_case1(struct kunit *test)702{703 // XIO2213 and TSB81BA3E with 3 ports.704 const u32 expected[] = {0x817fcc5e};705 u32 quadlets[] = {0};706 707 unsigned int packet_identifier;708 unsigned int phy_id;709 bool extended;710 bool link_is_active;711 unsigned int gap_count;712 unsigned int scode;713 bool is_contender;714 unsigned int power_class;715 enum phy_packet_self_id_port_status port_status[3];716 bool is_initiated_reset;717 bool has_more_packets;718 unsigned int port_index;719 720 deserialize_phy_packet_self_id_zero(expected[0], &packet_identifier, &phy_id, &extended,721 &link_is_active, &gap_count, &scode, &is_contender,722 &power_class, &is_initiated_reset, &has_more_packets);723 724 KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier);725 KUNIT_EXPECT_EQ(test, 1, phy_id);726 KUNIT_EXPECT_FALSE(test, extended);727 KUNIT_EXPECT_TRUE(test, link_is_active);728 KUNIT_EXPECT_EQ(test, 0x3f, gap_count);729 KUNIT_EXPECT_EQ(test, SCODE_800, scode);730 KUNIT_EXPECT_TRUE(test, is_contender);731 KUNIT_EXPECT_EQ(test, 0x4, power_class);732 KUNIT_EXPECT_TRUE(test, is_initiated_reset);733 KUNIT_EXPECT_FALSE(test, has_more_packets);734 735 serialize_phy_packet_self_id_zero(quadlets, packet_identifier, phy_id, extended,736 link_is_active, gap_count, scode, is_contender,737 power_class, is_initiated_reset, has_more_packets);738 739 for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {740 port_status[port_index] =741 self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index);742 }743 744 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[0]);745 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[1]);746 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[2]);747 748 for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {749 self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index,750 port_status[port_index]);751 }752 753 KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected));754}755 756static void test_phy_packet_self_id_zero_and_one(struct kunit *test)757{758 // TSB41LV06A with 6 ports.759 const u32 expected[] = {760 0x803f8459,761 0x80815000,762 };763 u32 quadlets[] = {0, 0};764 765 unsigned int packet_identifier;766 unsigned int phy_id;767 bool extended;768 bool link_is_active;769 unsigned int gap_count;770 unsigned int scode;771 bool is_contender;772 unsigned int power_class;773 enum phy_packet_self_id_port_status port_status[11];774 bool is_initiated_reset;775 bool has_more_packets;776 777 unsigned int sequence;778 unsigned int port_index;779 780 deserialize_phy_packet_self_id_zero(expected[0], &packet_identifier, &phy_id, &extended,781 &link_is_active, &gap_count, &scode, &is_contender,782 &power_class, &is_initiated_reset, &has_more_packets);783 784 KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier);785 KUNIT_EXPECT_EQ(test, 0, phy_id);786 KUNIT_EXPECT_FALSE(test, extended);787 KUNIT_EXPECT_FALSE(test, link_is_active);788 KUNIT_EXPECT_EQ(test, 0x3f, gap_count);789 KUNIT_EXPECT_EQ(test, SCODE_400, scode);790 KUNIT_EXPECT_FALSE(test, is_contender);791 KUNIT_EXPECT_EQ(test, 0x4, power_class);792 KUNIT_EXPECT_FALSE(test, is_initiated_reset);793 KUNIT_EXPECT_TRUE(test, has_more_packets);794 795 serialize_phy_packet_self_id_zero(quadlets, packet_identifier, phy_id, extended,796 link_is_active, gap_count, scode, is_contender,797 power_class, is_initiated_reset, has_more_packets);798 799 deserialize_phy_packet_self_id_extended(expected[1], &packet_identifier, &phy_id, &extended,800 &sequence, &has_more_packets);801 802 KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier);803 KUNIT_EXPECT_EQ(test, 0, phy_id);804 KUNIT_EXPECT_TRUE(test, extended);805 KUNIT_EXPECT_EQ(test, 0, sequence);806 KUNIT_EXPECT_FALSE(test, has_more_packets);807 808 serialize_phy_packet_self_id_extended(&quadlets[1], packet_identifier, phy_id, extended,809 sequence, has_more_packets);810 811 812 for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {813 port_status[port_index] =814 self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index);815 }816 817 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[0]);818 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[1]);819 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[2]);820 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[3]);821 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[4]);822 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[5]);823 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[6]);824 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[7]);825 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[8]);826 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[9]);827 KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[10]);828 829 for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {830 self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index,831 port_status[port_index]);832 }833 834 KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected));835}836 837static void test_phy_packet_phy_config_force_root_node(struct kunit *test)838{839 const u32 expected = 0x02800000;840 u32 quadlet = 0;841 842 unsigned int packet_identifier;843 unsigned int root_id;844 bool has_force_root_node;845 bool has_gap_count_optimization;846 unsigned int gap_count;847 848 deserialize_phy_packet_phy_config(expected, &packet_identifier, &root_id,849 &has_force_root_node, &has_gap_count_optimization,850 &gap_count);851 852 KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_PHY_CONFIG, packet_identifier);853 KUNIT_EXPECT_EQ(test, 0x02, root_id);854 KUNIT_EXPECT_TRUE(test, has_force_root_node);855 KUNIT_EXPECT_FALSE(test, has_gap_count_optimization);856 KUNIT_EXPECT_EQ(test, 0, gap_count);857 858 serialize_phy_packet_phy_config(&quadlet, packet_identifier, root_id, has_force_root_node,859 has_gap_count_optimization, gap_count);860 861 KUNIT_EXPECT_EQ(test, quadlet, expected);862}863 864static void test_phy_packet_phy_config_gap_count_optimization(struct kunit *test)865{866 const u32 expected = 0x034f0000;867 u32 quadlet = 0;868 869 unsigned int packet_identifier;870 unsigned int root_id;871 bool has_force_root_node;872 bool has_gap_count_optimization;873 unsigned int gap_count;874 875 deserialize_phy_packet_phy_config(expected, &packet_identifier, &root_id,876 &has_force_root_node, &has_gap_count_optimization,877 &gap_count);878 879 KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_PHY_CONFIG, packet_identifier);880 KUNIT_EXPECT_EQ(test, 0x03, root_id);881 KUNIT_EXPECT_FALSE(test, has_force_root_node);882 KUNIT_EXPECT_TRUE(test, has_gap_count_optimization);883 KUNIT_EXPECT_EQ(test, 0x0f, gap_count);884 885 serialize_phy_packet_phy_config(&quadlet, packet_identifier, root_id, has_force_root_node,886 has_gap_count_optimization, gap_count);887 888 KUNIT_EXPECT_EQ(test, quadlet, expected);889}890 891static struct kunit_case packet_serdes_test_cases[] = {892 KUNIT_CASE(test_async_header_write_quadlet_request),893 KUNIT_CASE(test_async_header_write_block_request),894 KUNIT_CASE(test_async_header_write_response),895 KUNIT_CASE(test_async_header_read_quadlet_request),896 KUNIT_CASE(test_async_header_read_quadlet_response),897 KUNIT_CASE(test_async_header_read_block_request),898 KUNIT_CASE(test_async_header_read_block_response),899 KUNIT_CASE(test_async_header_lock_request),900 KUNIT_CASE(test_async_header_lock_response),901 KUNIT_CASE(test_isoc_header),902 KUNIT_CASE(test_phy_packet_self_id_zero_case0),903 KUNIT_CASE(test_phy_packet_self_id_zero_case1),904 KUNIT_CASE(test_phy_packet_self_id_zero_and_one),905 KUNIT_CASE(test_phy_packet_phy_config_force_root_node),906 KUNIT_CASE(test_phy_packet_phy_config_gap_count_optimization),907 {}908};909 910static struct kunit_suite packet_serdes_test_suite = {911 .name = "firewire-packet-serdes",912 .test_cases = packet_serdes_test_cases,913};914kunit_test_suite(packet_serdes_test_suite);915 916MODULE_DESCRIPTION("FireWire packet serialization/deserialization unit test suite");917MODULE_LICENSE("GPL");918