xref: /linux/drivers/firewire/packet-serdes-test.c (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
175527d8dSTakashi Sakamoto // SPDX-License-Identifier: GPL-2.0-or-later
275527d8dSTakashi Sakamoto //
375527d8dSTakashi Sakamoto // packet-serdes-test.c - An application of Kunit to check serialization/deserialization of packets
475527d8dSTakashi Sakamoto //			  defined by IEEE 1394.
575527d8dSTakashi Sakamoto //
675527d8dSTakashi Sakamoto // Copyright (c) 2024 Takashi Sakamoto
775527d8dSTakashi Sakamoto 
875527d8dSTakashi Sakamoto #include <kunit/test.h>
975527d8dSTakashi Sakamoto 
1075527d8dSTakashi Sakamoto #include <linux/firewire-constants.h>
1175527d8dSTakashi Sakamoto 
1275527d8dSTakashi Sakamoto #include "packet-header-definitions.h"
13baf9d20bSTakashi Sakamoto #include "phy-packet-definitions.h"
1475527d8dSTakashi Sakamoto 
serialize_async_header_common(u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int dst_id,unsigned int tlabel,unsigned int retry,unsigned int tcode,unsigned int priority,unsigned int src_id)1575527d8dSTakashi Sakamoto static void serialize_async_header_common(u32 header[ASYNC_HEADER_QUADLET_COUNT],
1675527d8dSTakashi Sakamoto 					  unsigned int dst_id, unsigned int tlabel,
1775527d8dSTakashi Sakamoto 					  unsigned int retry, unsigned int tcode,
1875527d8dSTakashi Sakamoto 					  unsigned int priority, unsigned int src_id)
1975527d8dSTakashi Sakamoto {
2075527d8dSTakashi Sakamoto 	async_header_set_destination(header, dst_id);
2175527d8dSTakashi Sakamoto 	async_header_set_tlabel(header, tlabel);
2275527d8dSTakashi Sakamoto 	async_header_set_retry(header, retry);
2375527d8dSTakashi Sakamoto 	async_header_set_tcode(header, tcode);
2475527d8dSTakashi Sakamoto 	async_header_set_priority(header, priority);
2575527d8dSTakashi Sakamoto 	async_header_set_source(header, src_id);
2675527d8dSTakashi Sakamoto }
2775527d8dSTakashi Sakamoto 
serialize_async_header_request(u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int dst_id,unsigned int tlabel,unsigned int retry,unsigned int tcode,unsigned int priority,unsigned int src_id,u64 offset)2875527d8dSTakashi Sakamoto static void serialize_async_header_request(u32 header[ASYNC_HEADER_QUADLET_COUNT],
2975527d8dSTakashi Sakamoto 					   unsigned int dst_id, unsigned int tlabel,
3075527d8dSTakashi Sakamoto 					   unsigned int retry, unsigned int tcode,
3175527d8dSTakashi Sakamoto 					   unsigned int priority, unsigned int src_id, u64 offset)
3275527d8dSTakashi Sakamoto {
3375527d8dSTakashi Sakamoto 	serialize_async_header_common(header, dst_id, tlabel, retry, tcode, priority, src_id);
3475527d8dSTakashi Sakamoto 	async_header_set_offset(header, offset);
3575527d8dSTakashi Sakamoto }
3675527d8dSTakashi Sakamoto 
serialize_async_header_quadlet_request(u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int dst_id,unsigned int tlabel,unsigned int retry,unsigned int tcode,unsigned int priority,unsigned int src_id,u64 offset)3775527d8dSTakashi Sakamoto static void serialize_async_header_quadlet_request(u32 header[ASYNC_HEADER_QUADLET_COUNT],
3875527d8dSTakashi Sakamoto 						   unsigned int dst_id, unsigned int tlabel,
3975527d8dSTakashi Sakamoto 						   unsigned int retry, unsigned int tcode,
4075527d8dSTakashi Sakamoto 						   unsigned int priority, unsigned int src_id,
4175527d8dSTakashi Sakamoto 						   u64 offset)
4275527d8dSTakashi Sakamoto {
4375527d8dSTakashi Sakamoto 	serialize_async_header_request(header, dst_id, tlabel, retry, tcode, priority, src_id,
4475527d8dSTakashi Sakamoto 				       offset);
4575527d8dSTakashi Sakamoto }
4675527d8dSTakashi Sakamoto 
serialize_async_header_block_request(u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int dst_id,unsigned int tlabel,unsigned int retry,unsigned int tcode,unsigned int priority,unsigned int src_id,u64 offset,unsigned int data_length,unsigned int extended_tcode)4775527d8dSTakashi Sakamoto static void serialize_async_header_block_request(u32 header[ASYNC_HEADER_QUADLET_COUNT],
4875527d8dSTakashi Sakamoto 						 unsigned int dst_id, unsigned int tlabel,
4975527d8dSTakashi Sakamoto 						 unsigned int retry, unsigned int tcode,
5075527d8dSTakashi Sakamoto 						 unsigned int priority, unsigned int src_id,
5175527d8dSTakashi Sakamoto 						 u64 offset, unsigned int data_length,
5275527d8dSTakashi Sakamoto 						 unsigned int extended_tcode)
5375527d8dSTakashi Sakamoto {
5475527d8dSTakashi Sakamoto 	serialize_async_header_request(header, dst_id, tlabel, retry, tcode, priority, src_id,
5575527d8dSTakashi Sakamoto 				       offset);
5675527d8dSTakashi Sakamoto 	async_header_set_data_length(header, data_length);
5775527d8dSTakashi Sakamoto 	async_header_set_extended_tcode(header, extended_tcode);
5875527d8dSTakashi Sakamoto }
5975527d8dSTakashi Sakamoto 
serialize_async_header_response(u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int dst_id,unsigned int tlabel,unsigned int retry,unsigned int tcode,unsigned int priority,unsigned int src_id,unsigned int rcode)6075527d8dSTakashi Sakamoto static void serialize_async_header_response(u32 header[ASYNC_HEADER_QUADLET_COUNT],
6175527d8dSTakashi Sakamoto 					    unsigned int dst_id, unsigned int tlabel,
6275527d8dSTakashi Sakamoto 					    unsigned int retry, unsigned int tcode,
6375527d8dSTakashi Sakamoto 					    unsigned int priority, unsigned int src_id,
6475527d8dSTakashi Sakamoto 					    unsigned int rcode)
6575527d8dSTakashi Sakamoto {
6675527d8dSTakashi Sakamoto 	serialize_async_header_common(header, dst_id, tlabel, retry, tcode, priority, src_id);
6775527d8dSTakashi Sakamoto 	async_header_set_rcode(header, rcode);
6875527d8dSTakashi Sakamoto }
6975527d8dSTakashi Sakamoto 
serialize_async_header_quadlet_response(u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int dst_id,unsigned int tlabel,unsigned int retry,unsigned int tcode,unsigned int priority,unsigned int src_id,unsigned int rcode)7075527d8dSTakashi Sakamoto static void serialize_async_header_quadlet_response(u32 header[ASYNC_HEADER_QUADLET_COUNT],
7175527d8dSTakashi Sakamoto 						    unsigned int dst_id, unsigned int tlabel,
7275527d8dSTakashi Sakamoto 						    unsigned int retry, unsigned int tcode,
7375527d8dSTakashi Sakamoto 						    unsigned int priority, unsigned int src_id,
7475527d8dSTakashi Sakamoto 						    unsigned int rcode)
7575527d8dSTakashi Sakamoto {
7675527d8dSTakashi Sakamoto 	serialize_async_header_response(header, dst_id, tlabel, retry, tcode, priority, src_id,
7775527d8dSTakashi Sakamoto 					rcode);
7875527d8dSTakashi Sakamoto }
7975527d8dSTakashi Sakamoto 
serialize_async_header_block_response(u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int dst_id,unsigned int tlabel,unsigned int retry,unsigned int tcode,unsigned int priority,unsigned int src_id,unsigned int rcode,unsigned int data_length,unsigned int extended_tcode)8075527d8dSTakashi Sakamoto static void serialize_async_header_block_response(u32 header[ASYNC_HEADER_QUADLET_COUNT],
8175527d8dSTakashi Sakamoto 						  unsigned int dst_id, unsigned int tlabel,
8275527d8dSTakashi Sakamoto 						  unsigned int retry, unsigned int tcode,
8375527d8dSTakashi Sakamoto 						  unsigned int priority, unsigned int src_id,
8475527d8dSTakashi Sakamoto 						  unsigned int rcode, unsigned int data_length,
8575527d8dSTakashi Sakamoto 						  unsigned int extended_tcode)
8675527d8dSTakashi Sakamoto {
8775527d8dSTakashi Sakamoto 	serialize_async_header_response(header, dst_id, tlabel, retry, tcode, priority, src_id,
8875527d8dSTakashi Sakamoto 					rcode);
8975527d8dSTakashi Sakamoto 	async_header_set_data_length(header, data_length);
9075527d8dSTakashi Sakamoto 	async_header_set_extended_tcode(header, extended_tcode);
9175527d8dSTakashi Sakamoto }
9275527d8dSTakashi Sakamoto 
deserialize_async_header_common(const u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int * dst_id,unsigned int * tlabel,unsigned int * retry,unsigned int * tcode,unsigned int * priority,unsigned int * src_id)9375527d8dSTakashi Sakamoto static void deserialize_async_header_common(const u32 header[ASYNC_HEADER_QUADLET_COUNT],
9475527d8dSTakashi Sakamoto 					    unsigned int *dst_id, unsigned int *tlabel,
9575527d8dSTakashi Sakamoto 					    unsigned int *retry, unsigned int *tcode,
9675527d8dSTakashi Sakamoto 					    unsigned int *priority, unsigned int *src_id)
9775527d8dSTakashi Sakamoto {
9875527d8dSTakashi Sakamoto 	*dst_id = async_header_get_destination(header);
9975527d8dSTakashi Sakamoto 	*tlabel = async_header_get_tlabel(header);
10075527d8dSTakashi Sakamoto 	*retry = async_header_get_retry(header);
10175527d8dSTakashi Sakamoto 	*tcode = async_header_get_tcode(header);
10275527d8dSTakashi Sakamoto 	*priority = async_header_get_priority(header);
10375527d8dSTakashi Sakamoto 	*src_id = async_header_get_source(header);
10475527d8dSTakashi Sakamoto }
10575527d8dSTakashi Sakamoto 
deserialize_async_header_request(const u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int * dst_id,unsigned int * tlabel,unsigned int * retry,unsigned int * tcode,unsigned int * priority,unsigned int * src_id,u64 * offset)10675527d8dSTakashi Sakamoto static void deserialize_async_header_request(const u32 header[ASYNC_HEADER_QUADLET_COUNT],
10775527d8dSTakashi Sakamoto 					     unsigned int *dst_id, unsigned int *tlabel,
10875527d8dSTakashi Sakamoto 					     unsigned int *retry, unsigned int *tcode,
10975527d8dSTakashi Sakamoto 					     unsigned int *priority, unsigned int *src_id,
11075527d8dSTakashi Sakamoto 					     u64 *offset)
11175527d8dSTakashi Sakamoto {
11275527d8dSTakashi Sakamoto 	deserialize_async_header_common(header, dst_id, tlabel, retry, tcode, priority, src_id);
11375527d8dSTakashi Sakamoto 	*offset = async_header_get_offset(header);
11475527d8dSTakashi Sakamoto }
11575527d8dSTakashi Sakamoto 
deserialize_async_header_quadlet_request(const u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int * dst_id,unsigned int * tlabel,unsigned int * retry,unsigned int * tcode,unsigned int * priority,unsigned int * src_id,u64 * offset)11675527d8dSTakashi Sakamoto static void deserialize_async_header_quadlet_request(const u32 header[ASYNC_HEADER_QUADLET_COUNT],
11775527d8dSTakashi Sakamoto 						     unsigned int *dst_id, unsigned int *tlabel,
11875527d8dSTakashi Sakamoto 						     unsigned int *retry, unsigned int *tcode,
11975527d8dSTakashi Sakamoto 						     unsigned int *priority, unsigned int *src_id,
12075527d8dSTakashi Sakamoto 						     u64 *offset)
12175527d8dSTakashi Sakamoto {
12275527d8dSTakashi Sakamoto 	deserialize_async_header_request(header, dst_id, tlabel, retry, tcode, priority, src_id,
12375527d8dSTakashi Sakamoto 					 offset);
12475527d8dSTakashi Sakamoto }
12575527d8dSTakashi Sakamoto 
deserialize_async_header_block_request(const u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int * dst_id,unsigned int * tlabel,unsigned int * retry,unsigned int * tcode,unsigned int * priority,unsigned int * src_id,u64 * offset,unsigned int * data_length,unsigned int * extended_tcode)12675527d8dSTakashi Sakamoto static void deserialize_async_header_block_request(const u32 header[ASYNC_HEADER_QUADLET_COUNT],
12775527d8dSTakashi Sakamoto 						   unsigned int *dst_id, unsigned int *tlabel,
12875527d8dSTakashi Sakamoto 						   unsigned int *retry, unsigned int *tcode,
12975527d8dSTakashi Sakamoto 						   unsigned int *priority, unsigned int *src_id,
13075527d8dSTakashi Sakamoto 						   u64 *offset,
13175527d8dSTakashi Sakamoto 						   unsigned int *data_length,
13275527d8dSTakashi Sakamoto 						   unsigned int *extended_tcode)
13375527d8dSTakashi Sakamoto {
13475527d8dSTakashi Sakamoto 	deserialize_async_header_request(header, dst_id, tlabel, retry, tcode, priority, src_id,
13575527d8dSTakashi Sakamoto 					 offset);
13675527d8dSTakashi Sakamoto 	*data_length = async_header_get_data_length(header);
13775527d8dSTakashi Sakamoto 	*extended_tcode = async_header_get_extended_tcode(header);
13875527d8dSTakashi Sakamoto }
13975527d8dSTakashi Sakamoto 
deserialize_async_header_response(const u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int * dst_id,unsigned int * tlabel,unsigned int * retry,unsigned int * tcode,unsigned int * priority,unsigned int * src_id,unsigned int * rcode)14075527d8dSTakashi Sakamoto static void deserialize_async_header_response(const u32 header[ASYNC_HEADER_QUADLET_COUNT],
14175527d8dSTakashi Sakamoto 					      unsigned int *dst_id, unsigned int *tlabel,
14275527d8dSTakashi Sakamoto 					      unsigned int *retry, unsigned int *tcode,
14375527d8dSTakashi Sakamoto 					      unsigned int *priority, unsigned int *src_id,
14475527d8dSTakashi Sakamoto 					      unsigned int *rcode)
14575527d8dSTakashi Sakamoto {
14675527d8dSTakashi Sakamoto 	deserialize_async_header_common(header, dst_id, tlabel, retry, tcode, priority, src_id);
14775527d8dSTakashi Sakamoto 	*rcode = async_header_get_rcode(header);
14875527d8dSTakashi Sakamoto }
14975527d8dSTakashi Sakamoto 
deserialize_async_header_quadlet_response(const u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int * dst_id,unsigned int * tlabel,unsigned int * retry,unsigned int * tcode,unsigned int * priority,unsigned int * src_id,unsigned int * rcode)15075527d8dSTakashi Sakamoto static void deserialize_async_header_quadlet_response(const u32 header[ASYNC_HEADER_QUADLET_COUNT],
15175527d8dSTakashi Sakamoto 						      unsigned int *dst_id, unsigned int *tlabel,
15275527d8dSTakashi Sakamoto 						      unsigned int *retry, unsigned int *tcode,
15375527d8dSTakashi Sakamoto 						      unsigned int *priority, unsigned int *src_id,
15475527d8dSTakashi Sakamoto 						      unsigned int *rcode)
15575527d8dSTakashi Sakamoto {
15675527d8dSTakashi Sakamoto 	deserialize_async_header_response(header, dst_id, tlabel, retry, tcode, priority, src_id, rcode);
15775527d8dSTakashi Sakamoto }
15875527d8dSTakashi Sakamoto 
deserialize_async_header_block_response(const u32 header[ASYNC_HEADER_QUADLET_COUNT],unsigned int * dst_id,unsigned int * tlabel,unsigned int * retry,unsigned int * tcode,unsigned int * priority,unsigned int * src_id,unsigned int * rcode,unsigned int * data_length,unsigned int * extended_tcode)15975527d8dSTakashi Sakamoto static void deserialize_async_header_block_response(const u32 header[ASYNC_HEADER_QUADLET_COUNT],
16075527d8dSTakashi Sakamoto 						    unsigned int *dst_id, unsigned int *tlabel,
16175527d8dSTakashi Sakamoto 						    unsigned int *retry, unsigned int *tcode,
16275527d8dSTakashi Sakamoto 						    unsigned int *priority, unsigned int *src_id,
16375527d8dSTakashi Sakamoto 						    unsigned int *rcode, unsigned int *data_length,
16475527d8dSTakashi Sakamoto 						    unsigned int *extended_tcode)
16575527d8dSTakashi Sakamoto {
16675527d8dSTakashi Sakamoto 	deserialize_async_header_response(header, dst_id, tlabel, retry, tcode, priority, src_id, rcode);
16775527d8dSTakashi Sakamoto 	*data_length = async_header_get_data_length(header);
16875527d8dSTakashi Sakamoto 	*extended_tcode = async_header_get_extended_tcode(header);
16975527d8dSTakashi Sakamoto }
17075527d8dSTakashi Sakamoto 
serialize_isoc_header(u32 * header,unsigned int data_length,unsigned int tag,unsigned int channel,unsigned int tcode,unsigned int sy)1716503df36STakashi Sakamoto static void serialize_isoc_header(u32 *header, unsigned int data_length, unsigned int tag,
1726503df36STakashi Sakamoto 				  unsigned int channel, unsigned int tcode, unsigned int sy)
1736503df36STakashi Sakamoto {
1746503df36STakashi Sakamoto 	isoc_header_set_data_length(header, data_length);
1756503df36STakashi Sakamoto 	isoc_header_set_tag(header, tag);
1766503df36STakashi Sakamoto 	isoc_header_set_channel(header, channel);
1776503df36STakashi Sakamoto 	isoc_header_set_tcode(header, tcode);
1786503df36STakashi Sakamoto 	isoc_header_set_sy(header, sy);
1796503df36STakashi Sakamoto }
1806503df36STakashi Sakamoto 
deserialize_isoc_header(u32 header,unsigned int * data_length,unsigned int * tag,unsigned int * channel,unsigned int * tcode,unsigned int * sy)1816503df36STakashi Sakamoto static void deserialize_isoc_header(u32 header, unsigned int *data_length, unsigned int *tag,
1826503df36STakashi Sakamoto 				    unsigned int *channel, unsigned int *tcode, unsigned int *sy)
1836503df36STakashi Sakamoto {
1846503df36STakashi Sakamoto 	*data_length = isoc_header_get_data_length(header);
1856503df36STakashi Sakamoto 	*tag = isoc_header_get_tag(header);
1866503df36STakashi Sakamoto 	*channel = isoc_header_get_channel(header);
1876503df36STakashi Sakamoto 	*tcode = isoc_header_get_tcode(header);
1886503df36STakashi Sakamoto 	*sy = isoc_header_get_sy(header);
1896503df36STakashi Sakamoto }
1906503df36STakashi Sakamoto 
serialize_phy_packet_self_id_zero(u32 * quadlet,unsigned int packet_identifier,unsigned int phy_id,bool extended,bool link_is_active,unsigned int gap_count,unsigned int scode,bool is_contender,unsigned int power_class,bool is_initiated_reset,bool has_more_packets)191baf9d20bSTakashi Sakamoto static void serialize_phy_packet_self_id_zero(u32 *quadlet, unsigned int packet_identifier,
192baf9d20bSTakashi Sakamoto 					      unsigned int phy_id, bool extended,
193baf9d20bSTakashi Sakamoto 					      bool link_is_active, unsigned int gap_count,
194baf9d20bSTakashi Sakamoto 					      unsigned int scode, bool is_contender,
195baf9d20bSTakashi Sakamoto 					      unsigned int power_class, bool is_initiated_reset,
196baf9d20bSTakashi Sakamoto 					      bool has_more_packets)
197baf9d20bSTakashi Sakamoto {
198baf9d20bSTakashi Sakamoto 	phy_packet_set_packet_identifier(quadlet, packet_identifier);
199baf9d20bSTakashi Sakamoto 	phy_packet_self_id_set_phy_id(quadlet, phy_id);
200baf9d20bSTakashi Sakamoto 	phy_packet_self_id_set_extended(quadlet, extended);
201baf9d20bSTakashi Sakamoto 	phy_packet_self_id_zero_set_link_active(quadlet, link_is_active);
202baf9d20bSTakashi Sakamoto 	phy_packet_self_id_zero_set_gap_count(quadlet, gap_count);
203baf9d20bSTakashi Sakamoto 	phy_packet_self_id_zero_set_scode(quadlet, scode);
204baf9d20bSTakashi Sakamoto 	phy_packet_self_id_zero_set_contender(quadlet, is_contender);
205baf9d20bSTakashi Sakamoto 	phy_packet_self_id_zero_set_power_class(quadlet, power_class);
206baf9d20bSTakashi Sakamoto 	phy_packet_self_id_zero_set_initiated_reset(quadlet, is_initiated_reset);
207baf9d20bSTakashi Sakamoto 	phy_packet_self_id_set_more_packets(quadlet, has_more_packets);
208baf9d20bSTakashi Sakamoto }
209baf9d20bSTakashi Sakamoto 
deserialize_phy_packet_self_id_zero(u32 quadlet,unsigned int * packet_identifier,unsigned int * phy_id,bool * extended,bool * link_is_active,unsigned int * gap_count,unsigned int * scode,bool * is_contender,unsigned int * power_class,bool * is_initiated_reset,bool * has_more_packets)210baf9d20bSTakashi Sakamoto static void deserialize_phy_packet_self_id_zero(u32 quadlet, unsigned int *packet_identifier,
211baf9d20bSTakashi Sakamoto 						unsigned int *phy_id, bool *extended,
212baf9d20bSTakashi Sakamoto 						bool *link_is_active, unsigned int *gap_count,
213baf9d20bSTakashi Sakamoto 						unsigned int *scode, bool *is_contender,
214baf9d20bSTakashi Sakamoto 						unsigned int *power_class,
215baf9d20bSTakashi Sakamoto 						bool *is_initiated_reset, bool *has_more_packets)
216baf9d20bSTakashi Sakamoto {
217baf9d20bSTakashi Sakamoto 	*packet_identifier = phy_packet_get_packet_identifier(quadlet);
218baf9d20bSTakashi Sakamoto 	*phy_id = phy_packet_self_id_get_phy_id(quadlet);
219baf9d20bSTakashi Sakamoto 	*extended = phy_packet_self_id_get_extended(quadlet);
220baf9d20bSTakashi Sakamoto 	*link_is_active = phy_packet_self_id_zero_get_link_active(quadlet);
221baf9d20bSTakashi Sakamoto 	*gap_count = phy_packet_self_id_zero_get_gap_count(quadlet);
222baf9d20bSTakashi Sakamoto 	*scode = phy_packet_self_id_zero_get_scode(quadlet);
223baf9d20bSTakashi Sakamoto 	*is_contender = phy_packet_self_id_zero_get_contender(quadlet);
224baf9d20bSTakashi Sakamoto 	*power_class = phy_packet_self_id_zero_get_power_class(quadlet);
225baf9d20bSTakashi Sakamoto 	*is_initiated_reset = phy_packet_self_id_zero_get_initiated_reset(quadlet);
226baf9d20bSTakashi Sakamoto 	*has_more_packets = phy_packet_self_id_get_more_packets(quadlet);
227baf9d20bSTakashi Sakamoto }
228baf9d20bSTakashi Sakamoto 
serialize_phy_packet_self_id_extended(u32 * quadlet,unsigned int packet_identifier,unsigned int phy_id,bool extended,unsigned int sequence,bool has_more_packets)229baf9d20bSTakashi Sakamoto static void serialize_phy_packet_self_id_extended(u32 *quadlet, unsigned int packet_identifier,
230baf9d20bSTakashi Sakamoto 						  unsigned int phy_id, bool extended,
231baf9d20bSTakashi Sakamoto 						  unsigned int sequence, bool has_more_packets)
232baf9d20bSTakashi Sakamoto {
233baf9d20bSTakashi Sakamoto 	phy_packet_set_packet_identifier(quadlet, packet_identifier);
234baf9d20bSTakashi Sakamoto 	phy_packet_self_id_set_phy_id(quadlet, phy_id);
235baf9d20bSTakashi Sakamoto 	phy_packet_self_id_set_extended(quadlet, extended);
236baf9d20bSTakashi Sakamoto 	phy_packet_self_id_extended_set_sequence(quadlet, sequence);
237baf9d20bSTakashi Sakamoto 	phy_packet_self_id_set_more_packets(quadlet, has_more_packets);
238baf9d20bSTakashi Sakamoto }
239baf9d20bSTakashi Sakamoto 
deserialize_phy_packet_self_id_extended(u32 quadlet,unsigned int * packet_identifier,unsigned int * phy_id,bool * extended,unsigned int * sequence,bool * has_more_packets)240baf9d20bSTakashi Sakamoto static void deserialize_phy_packet_self_id_extended(u32 quadlet, unsigned int *packet_identifier,
241baf9d20bSTakashi Sakamoto 						    unsigned int *phy_id, bool *extended,
242baf9d20bSTakashi Sakamoto 						    unsigned int *sequence, bool *has_more_packets)
243baf9d20bSTakashi Sakamoto {
244baf9d20bSTakashi Sakamoto 	*packet_identifier = phy_packet_get_packet_identifier(quadlet);
245baf9d20bSTakashi Sakamoto 	*phy_id = phy_packet_self_id_get_phy_id(quadlet);
246baf9d20bSTakashi Sakamoto 	*extended = phy_packet_self_id_get_extended(quadlet);
247baf9d20bSTakashi Sakamoto 	*sequence = phy_packet_self_id_extended_get_sequence(quadlet);
248baf9d20bSTakashi Sakamoto 	*has_more_packets = phy_packet_self_id_get_more_packets(quadlet);
249baf9d20bSTakashi Sakamoto }
250baf9d20bSTakashi Sakamoto 
serialize_phy_packet_phy_config(u32 * quadlet,unsigned int packet_identifier,unsigned int root_id,bool has_force_root_node,bool has_gap_count_optimization,unsigned int gap_count)251*75d47101STakashi Sakamoto static void serialize_phy_packet_phy_config(u32 *quadlet, unsigned int packet_identifier,
252*75d47101STakashi Sakamoto 					    unsigned int root_id, bool has_force_root_node,
253*75d47101STakashi Sakamoto 					    bool has_gap_count_optimization, unsigned int gap_count)
254*75d47101STakashi Sakamoto {
255*75d47101STakashi Sakamoto 	phy_packet_set_packet_identifier(quadlet, packet_identifier);
256*75d47101STakashi Sakamoto 	phy_packet_phy_config_set_root_id(quadlet, root_id);
257*75d47101STakashi Sakamoto 	phy_packet_phy_config_set_force_root_node(quadlet, has_force_root_node);
258*75d47101STakashi Sakamoto 	phy_packet_phy_config_set_gap_count_optimization(quadlet, has_gap_count_optimization);
259*75d47101STakashi Sakamoto 	phy_packet_phy_config_set_gap_count(quadlet, gap_count);
260*75d47101STakashi Sakamoto }
261*75d47101STakashi Sakamoto 
deserialize_phy_packet_phy_config(u32 quadlet,unsigned int * packet_identifier,unsigned int * root_id,bool * has_force_root_node,bool * has_gap_count_optimization,unsigned int * gap_count)262*75d47101STakashi Sakamoto static void deserialize_phy_packet_phy_config(u32 quadlet, unsigned int *packet_identifier,
263*75d47101STakashi Sakamoto 					      unsigned int *root_id, bool *has_force_root_node,
264*75d47101STakashi Sakamoto 					      bool *has_gap_count_optimization,
265*75d47101STakashi Sakamoto 					      unsigned int *gap_count)
266*75d47101STakashi Sakamoto {
267*75d47101STakashi Sakamoto 	*packet_identifier = phy_packet_get_packet_identifier(quadlet);
268*75d47101STakashi Sakamoto 	*root_id = phy_packet_phy_config_get_root_id(quadlet);
269*75d47101STakashi Sakamoto 	*has_force_root_node = phy_packet_phy_config_get_force_root_node(quadlet);
270*75d47101STakashi Sakamoto 	*has_gap_count_optimization = phy_packet_phy_config_get_gap_count_optimization(quadlet);
271*75d47101STakashi Sakamoto 	*gap_count = phy_packet_phy_config_get_gap_count(quadlet);
272*75d47101STakashi Sakamoto }
273*75d47101STakashi Sakamoto 
test_async_header_write_quadlet_request(struct kunit * test)27475527d8dSTakashi Sakamoto static void test_async_header_write_quadlet_request(struct kunit *test)
27575527d8dSTakashi Sakamoto {
27675527d8dSTakashi Sakamoto 	static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {
27775527d8dSTakashi Sakamoto 		0xffc05100,
27875527d8dSTakashi Sakamoto 		0xffc1ffff,
27975527d8dSTakashi Sakamoto 		0xf0000234,
28075527d8dSTakashi Sakamoto 		0x1f0000c0,
28175527d8dSTakashi Sakamoto 	};
28275527d8dSTakashi Sakamoto 	u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};
28375527d8dSTakashi Sakamoto 
28475527d8dSTakashi Sakamoto 	unsigned int dst_id;
28575527d8dSTakashi Sakamoto 	unsigned int tlabel;
28675527d8dSTakashi Sakamoto 	unsigned int retry;
28775527d8dSTakashi Sakamoto 	unsigned int tcode;
28875527d8dSTakashi Sakamoto 	unsigned int priority;
28975527d8dSTakashi Sakamoto 	unsigned int src_id;
29075527d8dSTakashi Sakamoto 	u64 offset;
29175527d8dSTakashi Sakamoto 	u32 quadlet_data;
29275527d8dSTakashi Sakamoto 
29375527d8dSTakashi Sakamoto 	deserialize_async_header_quadlet_request(expected, &dst_id, &tlabel, &retry, &tcode,
29475527d8dSTakashi Sakamoto 						 &priority, &src_id, &offset);
29575527d8dSTakashi Sakamoto 	quadlet_data = async_header_get_quadlet_data(expected);
29675527d8dSTakashi Sakamoto 
29775527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);
29875527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x14, tlabel);
29975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x01, retry);
30075527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, TCODE_WRITE_QUADLET_REQUEST, tcode);
30175527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x00, priority);
30275527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc1, src_id);
30375527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xfffff0000234, offset);
30475527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x1f0000c0, quadlet_data);
30575527d8dSTakashi Sakamoto 
30675527d8dSTakashi Sakamoto 	serialize_async_header_quadlet_request(header, dst_id, tlabel, retry, tcode, priority,
30775527d8dSTakashi Sakamoto 					       src_id, offset);
30875527d8dSTakashi Sakamoto 	async_header_set_quadlet_data(header, quadlet_data);
30975527d8dSTakashi Sakamoto 
31075527d8dSTakashi Sakamoto 	KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));
31175527d8dSTakashi Sakamoto }
31275527d8dSTakashi Sakamoto 
test_async_header_write_block_request(struct kunit * test)31375527d8dSTakashi Sakamoto static void test_async_header_write_block_request(struct kunit *test)
31475527d8dSTakashi Sakamoto {
31575527d8dSTakashi Sakamoto 	static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {
31675527d8dSTakashi Sakamoto 		0xffc06510,
31775527d8dSTakashi Sakamoto 		0xffc1ecc0,
31875527d8dSTakashi Sakamoto 		0x00000000,
31975527d8dSTakashi Sakamoto 		0x00180000,
32075527d8dSTakashi Sakamoto 	};
32175527d8dSTakashi Sakamoto 	u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};
32275527d8dSTakashi Sakamoto 
32375527d8dSTakashi Sakamoto 	unsigned int dst_id;
32475527d8dSTakashi Sakamoto 	unsigned int tlabel;
32575527d8dSTakashi Sakamoto 	unsigned int retry;
32675527d8dSTakashi Sakamoto 	unsigned int tcode;
32775527d8dSTakashi Sakamoto 	unsigned int priority;
32875527d8dSTakashi Sakamoto 	unsigned int src_id;
32975527d8dSTakashi Sakamoto 	u64 offset;
33075527d8dSTakashi Sakamoto 	unsigned int data_length;
33175527d8dSTakashi Sakamoto 	unsigned int extended_tcode;
33275527d8dSTakashi Sakamoto 
33375527d8dSTakashi Sakamoto 	deserialize_async_header_block_request(expected, &dst_id, &tlabel, &retry, &tcode,
33475527d8dSTakashi Sakamoto 					       &priority, &src_id, &offset, &data_length,
33575527d8dSTakashi Sakamoto 					       &extended_tcode);
33675527d8dSTakashi Sakamoto 
33775527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);
33875527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x19, tlabel);
33975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x01, retry);
34075527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, TCODE_WRITE_BLOCK_REQUEST, tcode);
34175527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x00, priority);
34275527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc1, src_id);
34375527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xecc000000000, offset);
34475527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0018, data_length);
34575527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0000, extended_tcode);
34675527d8dSTakashi Sakamoto 
34775527d8dSTakashi Sakamoto 	serialize_async_header_block_request(header, dst_id, tlabel, retry, tcode, priority, src_id,
34875527d8dSTakashi Sakamoto 					     offset, data_length, extended_tcode);
34975527d8dSTakashi Sakamoto 
35075527d8dSTakashi Sakamoto 	KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));
35175527d8dSTakashi Sakamoto }
35275527d8dSTakashi Sakamoto 
test_async_header_write_response(struct kunit * test)35375527d8dSTakashi Sakamoto static void test_async_header_write_response(struct kunit *test)
35475527d8dSTakashi Sakamoto {
35575527d8dSTakashi Sakamoto 	static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {
35675527d8dSTakashi Sakamoto 		0xffc15120,
35775527d8dSTakashi Sakamoto 		0xffc00000,
35875527d8dSTakashi Sakamoto 		0x00000000,
35975527d8dSTakashi Sakamoto 		0x00000000,
36075527d8dSTakashi Sakamoto 	};
36175527d8dSTakashi Sakamoto 	u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};
36275527d8dSTakashi Sakamoto 
36375527d8dSTakashi Sakamoto 	unsigned int dst_id;
36475527d8dSTakashi Sakamoto 	unsigned int tlabel;
36575527d8dSTakashi Sakamoto 	unsigned int retry;
36675527d8dSTakashi Sakamoto 	unsigned int tcode;
36775527d8dSTakashi Sakamoto 	unsigned int priority;
36875527d8dSTakashi Sakamoto 	unsigned int src_id;
36975527d8dSTakashi Sakamoto 	unsigned int rcode;
37075527d8dSTakashi Sakamoto 
37175527d8dSTakashi Sakamoto 	deserialize_async_header_quadlet_response(expected, &dst_id, &tlabel, &retry, &tcode,
37275527d8dSTakashi Sakamoto 						  &priority, &src_id, &rcode);
37375527d8dSTakashi Sakamoto 
37475527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc1, dst_id);
37575527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x14, tlabel);
37675527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x01, retry);
37775527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, TCODE_WRITE_RESPONSE, tcode);
37875527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x00, priority);
37975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc0, src_id);
38075527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, RCODE_COMPLETE, rcode);
38175527d8dSTakashi Sakamoto 
38275527d8dSTakashi Sakamoto 	serialize_async_header_quadlet_response(header, dst_id, tlabel, retry, tcode, priority,
38375527d8dSTakashi Sakamoto 						src_id, rcode);
38475527d8dSTakashi Sakamoto 
38575527d8dSTakashi Sakamoto 	KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected) - sizeof(expected[0]));
38675527d8dSTakashi Sakamoto }
38775527d8dSTakashi Sakamoto 
test_async_header_read_quadlet_request(struct kunit * test)38875527d8dSTakashi Sakamoto static void test_async_header_read_quadlet_request(struct kunit *test)
38975527d8dSTakashi Sakamoto {
39075527d8dSTakashi Sakamoto 	static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {
39175527d8dSTakashi Sakamoto 		0xffc0f140,
39275527d8dSTakashi Sakamoto 		0xffc1ffff,
39375527d8dSTakashi Sakamoto 		0xf0000984,
39475527d8dSTakashi Sakamoto 		0x00000000,
39575527d8dSTakashi Sakamoto 	};
39675527d8dSTakashi Sakamoto 	u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};
39775527d8dSTakashi Sakamoto 
39875527d8dSTakashi Sakamoto 	unsigned int dst_id;
39975527d8dSTakashi Sakamoto 	unsigned int tlabel;
40075527d8dSTakashi Sakamoto 	unsigned int retry;
40175527d8dSTakashi Sakamoto 	unsigned int tcode;
40275527d8dSTakashi Sakamoto 	unsigned int priority;
40375527d8dSTakashi Sakamoto 	unsigned int src_id;
40475527d8dSTakashi Sakamoto 	u64 offset;
40575527d8dSTakashi Sakamoto 
40675527d8dSTakashi Sakamoto 	deserialize_async_header_quadlet_request(expected, &dst_id, &tlabel, &retry, &tcode,
40775527d8dSTakashi Sakamoto 						 &priority, &src_id, &offset);
40875527d8dSTakashi Sakamoto 
40975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);
41075527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x3c, tlabel);
41175527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x01, retry);
41275527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, TCODE_READ_QUADLET_REQUEST, tcode);
41375527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x00, priority);
41475527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc1, src_id);
41575527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xfffff0000984, offset);
41675527d8dSTakashi Sakamoto 
41775527d8dSTakashi Sakamoto 	serialize_async_header_quadlet_request(header, dst_id, tlabel, retry, tcode, priority,
41875527d8dSTakashi Sakamoto 					       src_id, offset);
41975527d8dSTakashi Sakamoto 
42075527d8dSTakashi Sakamoto 	KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));
42175527d8dSTakashi Sakamoto }
42275527d8dSTakashi Sakamoto 
test_async_header_read_quadlet_response(struct kunit * test)42375527d8dSTakashi Sakamoto static void test_async_header_read_quadlet_response(struct kunit *test)
42475527d8dSTakashi Sakamoto {
42575527d8dSTakashi Sakamoto 	static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {
42675527d8dSTakashi Sakamoto 		0xffc1f160,
42775527d8dSTakashi Sakamoto 		0xffc00000,
42875527d8dSTakashi Sakamoto 		0x00000000,
42975527d8dSTakashi Sakamoto 		0x00000180,
43075527d8dSTakashi Sakamoto 	};
43175527d8dSTakashi Sakamoto 	u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};
43275527d8dSTakashi Sakamoto 
43375527d8dSTakashi Sakamoto 	unsigned int dst_id;
43475527d8dSTakashi Sakamoto 	unsigned int tlabel;
43575527d8dSTakashi Sakamoto 	unsigned int retry;
43675527d8dSTakashi Sakamoto 	unsigned int tcode;
43775527d8dSTakashi Sakamoto 	unsigned int priority;
43875527d8dSTakashi Sakamoto 	unsigned int src_id;
43975527d8dSTakashi Sakamoto 	unsigned int rcode;
44075527d8dSTakashi Sakamoto 	u32 quadlet_data;
44175527d8dSTakashi Sakamoto 
44275527d8dSTakashi Sakamoto 	deserialize_async_header_quadlet_response(expected, &dst_id, &tlabel, &retry, &tcode,
44375527d8dSTakashi Sakamoto 						  &priority, &src_id, &rcode);
44475527d8dSTakashi Sakamoto 	quadlet_data = async_header_get_quadlet_data(expected);
44575527d8dSTakashi Sakamoto 
44675527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc1, dst_id);
44775527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x3c, tlabel);
44875527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x01, retry);
44975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, TCODE_READ_QUADLET_RESPONSE, tcode);
45075527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x00, priority);
45175527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc0, src_id);
45275527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, RCODE_COMPLETE, rcode);
45375527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x00000180, quadlet_data);
45475527d8dSTakashi Sakamoto 
45575527d8dSTakashi Sakamoto 	serialize_async_header_quadlet_response(header, dst_id, tlabel, retry, tcode, priority,
45675527d8dSTakashi Sakamoto 						src_id, rcode);
45775527d8dSTakashi Sakamoto 	async_header_set_quadlet_data(header, quadlet_data);
45875527d8dSTakashi Sakamoto 
45975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));
46075527d8dSTakashi Sakamoto }
46175527d8dSTakashi Sakamoto 
test_async_header_read_block_request(struct kunit * test)46275527d8dSTakashi Sakamoto static void test_async_header_read_block_request(struct kunit *test)
46375527d8dSTakashi Sakamoto {
46475527d8dSTakashi Sakamoto 	static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {
46575527d8dSTakashi Sakamoto 		0xffc0e150,
46675527d8dSTakashi Sakamoto 		0xffc1ffff,
46775527d8dSTakashi Sakamoto 		0xf0000400,
46875527d8dSTakashi Sakamoto 		0x00200000,
46975527d8dSTakashi Sakamoto 	};
47075527d8dSTakashi Sakamoto 	u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};
47175527d8dSTakashi Sakamoto 
47275527d8dSTakashi Sakamoto 	unsigned int dst_id;
47375527d8dSTakashi Sakamoto 	unsigned int tlabel;
47475527d8dSTakashi Sakamoto 	unsigned int retry;
47575527d8dSTakashi Sakamoto 	unsigned int tcode;
47675527d8dSTakashi Sakamoto 	unsigned int priority;
47775527d8dSTakashi Sakamoto 	unsigned int src_id;
47875527d8dSTakashi Sakamoto 	u64 offset;
47975527d8dSTakashi Sakamoto 	unsigned int data_length;
48075527d8dSTakashi Sakamoto 	unsigned int extended_tcode;
48175527d8dSTakashi Sakamoto 
48275527d8dSTakashi Sakamoto 	deserialize_async_header_block_request(expected, &dst_id, &tlabel, &retry, &tcode,
48375527d8dSTakashi Sakamoto 					       &priority, &src_id, &offset, &data_length,
48475527d8dSTakashi Sakamoto 					       &extended_tcode);
48575527d8dSTakashi Sakamoto 
48675527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);
48775527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x38, tlabel);
48875527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x01, retry);
48975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, TCODE_READ_BLOCK_REQUEST, tcode);
49075527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x00, priority);
49175527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc1, src_id);
49275527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xfffff0000400, offset);
49375527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0020, data_length);
49475527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0000, extended_tcode);
49575527d8dSTakashi Sakamoto 
49675527d8dSTakashi Sakamoto 	serialize_async_header_block_request(header, dst_id, tlabel, retry, tcode, priority, src_id,
49775527d8dSTakashi Sakamoto 					     offset, data_length, extended_tcode);
49875527d8dSTakashi Sakamoto 
49975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));
50075527d8dSTakashi Sakamoto }
50175527d8dSTakashi Sakamoto 
test_async_header_read_block_response(struct kunit * test)50275527d8dSTakashi Sakamoto static void test_async_header_read_block_response(struct kunit *test)
50375527d8dSTakashi Sakamoto {
50475527d8dSTakashi Sakamoto 	static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {
50575527d8dSTakashi Sakamoto 		0xffc1e170,
50675527d8dSTakashi Sakamoto 		0xffc00000,
50775527d8dSTakashi Sakamoto 		0x00000000,
50875527d8dSTakashi Sakamoto 		0x00200000,
50975527d8dSTakashi Sakamoto 	};
51075527d8dSTakashi Sakamoto 	u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};
51175527d8dSTakashi Sakamoto 
51275527d8dSTakashi Sakamoto 	unsigned int dst_id;
51375527d8dSTakashi Sakamoto 	unsigned int tlabel;
51475527d8dSTakashi Sakamoto 	unsigned int retry;
51575527d8dSTakashi Sakamoto 	unsigned int tcode;
51675527d8dSTakashi Sakamoto 	unsigned int priority;
51775527d8dSTakashi Sakamoto 	unsigned int src_id;
51875527d8dSTakashi Sakamoto 	unsigned int rcode;
51975527d8dSTakashi Sakamoto 	unsigned int data_length;
52075527d8dSTakashi Sakamoto 	unsigned int extended_tcode;
52175527d8dSTakashi Sakamoto 
52275527d8dSTakashi Sakamoto 	deserialize_async_header_block_response(expected, &dst_id, &tlabel, &retry, &tcode,
52375527d8dSTakashi Sakamoto 						&priority, &src_id, &rcode, &data_length,
52475527d8dSTakashi Sakamoto 						&extended_tcode);
52575527d8dSTakashi Sakamoto 
52675527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc1, dst_id);
52775527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x38, tlabel);
52875527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x01, retry);
52975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, TCODE_READ_BLOCK_RESPONSE, tcode);
53075527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x00, priority);
53175527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc0, src_id);
53275527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, RCODE_COMPLETE, rcode);
53375527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0020, data_length);
53475527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0000, extended_tcode);
53575527d8dSTakashi Sakamoto 
53675527d8dSTakashi Sakamoto 	serialize_async_header_block_response(header, dst_id, tlabel, retry, tcode, priority,
53775527d8dSTakashi Sakamoto 					      src_id, rcode, data_length, extended_tcode);
53875527d8dSTakashi Sakamoto 
53975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));
54075527d8dSTakashi Sakamoto }
54175527d8dSTakashi Sakamoto 
test_async_header_lock_request(struct kunit * test)54275527d8dSTakashi Sakamoto static void test_async_header_lock_request(struct kunit *test)
54375527d8dSTakashi Sakamoto {
54475527d8dSTakashi Sakamoto 	static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {
54575527d8dSTakashi Sakamoto 		0xffc02d90,
54675527d8dSTakashi Sakamoto 		0xffc1ffff,
54775527d8dSTakashi Sakamoto 		0xf0000984,
54875527d8dSTakashi Sakamoto 		0x00080002,
54975527d8dSTakashi Sakamoto 	};
55075527d8dSTakashi Sakamoto 	u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};
55175527d8dSTakashi Sakamoto 
55275527d8dSTakashi Sakamoto 	unsigned int dst_id;
55375527d8dSTakashi Sakamoto 	unsigned int tlabel;
55475527d8dSTakashi Sakamoto 	unsigned int retry;
55575527d8dSTakashi Sakamoto 	unsigned int tcode;
55675527d8dSTakashi Sakamoto 	unsigned int priority;
55775527d8dSTakashi Sakamoto 	unsigned int src_id;
55875527d8dSTakashi Sakamoto 	u64 offset;
55975527d8dSTakashi Sakamoto 	unsigned int data_length;
56075527d8dSTakashi Sakamoto 	unsigned int extended_tcode;
56175527d8dSTakashi Sakamoto 
56275527d8dSTakashi Sakamoto 	deserialize_async_header_block_request(expected, &dst_id, &tlabel, &retry, &tcode,
56375527d8dSTakashi Sakamoto 					       &priority, &src_id, &offset, &data_length,
56475527d8dSTakashi Sakamoto 					       &extended_tcode);
56575527d8dSTakashi Sakamoto 
56675527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);
56775527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0b, tlabel);
56875527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x01, retry);
56975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, TCODE_LOCK_REQUEST, tcode);
57075527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x00, priority);
57175527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc1, src_id);
57275527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xfffff0000984, offset);
57375527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0008, data_length);
57475527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, EXTCODE_COMPARE_SWAP, extended_tcode);
57575527d8dSTakashi Sakamoto 
57675527d8dSTakashi Sakamoto 	serialize_async_header_block_request(header, dst_id, tlabel, retry, tcode, priority, src_id,
57775527d8dSTakashi Sakamoto 					     offset, data_length, extended_tcode);
57875527d8dSTakashi Sakamoto 
57975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));
58075527d8dSTakashi Sakamoto }
58175527d8dSTakashi Sakamoto 
test_async_header_lock_response(struct kunit * test)58275527d8dSTakashi Sakamoto static void test_async_header_lock_response(struct kunit *test)
58375527d8dSTakashi Sakamoto {
58475527d8dSTakashi Sakamoto 	static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {
58575527d8dSTakashi Sakamoto 		0xffc12db0,
58675527d8dSTakashi Sakamoto 		0xffc00000,
58775527d8dSTakashi Sakamoto 		0x00000000,
58875527d8dSTakashi Sakamoto 		0x00040002,
58975527d8dSTakashi Sakamoto 	};
59075527d8dSTakashi Sakamoto 	u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};
59175527d8dSTakashi Sakamoto 
59275527d8dSTakashi Sakamoto 	unsigned int dst_id;
59375527d8dSTakashi Sakamoto 	unsigned int tlabel;
59475527d8dSTakashi Sakamoto 	unsigned int retry;
59575527d8dSTakashi Sakamoto 	unsigned int tcode;
59675527d8dSTakashi Sakamoto 	unsigned int priority;
59775527d8dSTakashi Sakamoto 	unsigned int src_id;
59875527d8dSTakashi Sakamoto 	unsigned int rcode;
59975527d8dSTakashi Sakamoto 	unsigned int data_length;
60075527d8dSTakashi Sakamoto 	unsigned int extended_tcode;
60175527d8dSTakashi Sakamoto 
60275527d8dSTakashi Sakamoto 	deserialize_async_header_block_response(expected, &dst_id, &tlabel, &retry, &tcode,
60375527d8dSTakashi Sakamoto 						&priority, &src_id, &rcode, &data_length,
60475527d8dSTakashi Sakamoto 						&extended_tcode);
60575527d8dSTakashi Sakamoto 
60675527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc1, dst_id);
60775527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0b, tlabel);
60875527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x01, retry);
60975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, TCODE_LOCK_RESPONSE, tcode);
61075527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x00, priority);
61175527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xffc0, src_id);
61275527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, RCODE_COMPLETE, rcode);
61375527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0004, data_length);
61475527d8dSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, EXTCODE_COMPARE_SWAP, extended_tcode);
61575527d8dSTakashi Sakamoto 
61675527d8dSTakashi Sakamoto 	serialize_async_header_block_response(header, dst_id, tlabel, retry, tcode, priority,
61775527d8dSTakashi Sakamoto 					      src_id, rcode, data_length, extended_tcode);
61875527d8dSTakashi Sakamoto 
61975527d8dSTakashi Sakamoto 	KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));
62075527d8dSTakashi Sakamoto }
62175527d8dSTakashi Sakamoto 
test_isoc_header(struct kunit * test)6226503df36STakashi Sakamoto static void test_isoc_header(struct kunit *test)
6236503df36STakashi Sakamoto {
6246503df36STakashi Sakamoto 	const u32 expected = 0x00d08dec;
6256503df36STakashi Sakamoto 	u32 header = 0;
6266503df36STakashi Sakamoto 
6276503df36STakashi Sakamoto 	unsigned int data_length;
6286503df36STakashi Sakamoto 	unsigned int tag;
6296503df36STakashi Sakamoto 	unsigned int channel;
6306503df36STakashi Sakamoto 	unsigned int tcode;
6316503df36STakashi Sakamoto 	unsigned int sy;
6326503df36STakashi Sakamoto 
6336503df36STakashi Sakamoto 	deserialize_isoc_header(expected, &data_length, &tag, &channel, &tcode, &sy);
6346503df36STakashi Sakamoto 
6356503df36STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0xd0, data_length);
6366503df36STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x02, tag);
6376503df36STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0d, channel);
6386503df36STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0e, tcode);
6396503df36STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0c, sy);
6406503df36STakashi Sakamoto 
6416503df36STakashi Sakamoto 	serialize_isoc_header(&header, data_length, tag, channel, tcode, sy);
6426503df36STakashi Sakamoto 
6436503df36STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, header, expected);
6446503df36STakashi Sakamoto }
64575527d8dSTakashi Sakamoto 
test_phy_packet_self_id_zero_case0(struct kunit * test)646baf9d20bSTakashi Sakamoto static void test_phy_packet_self_id_zero_case0(struct kunit *test)
647baf9d20bSTakashi Sakamoto {
648baf9d20bSTakashi Sakamoto 	// TSB41AB1/2 with 1 port.
649baf9d20bSTakashi Sakamoto 	const u32 expected[] = {0x80458c80};
650baf9d20bSTakashi Sakamoto 	u32 quadlets[] = {0};
651baf9d20bSTakashi Sakamoto 
652baf9d20bSTakashi Sakamoto 	unsigned int packet_identifier;
653baf9d20bSTakashi Sakamoto 	unsigned int phy_id;
654baf9d20bSTakashi Sakamoto 	bool extended;
655baf9d20bSTakashi Sakamoto 	bool link_is_active;
656baf9d20bSTakashi Sakamoto 	unsigned int gap_count;
657baf9d20bSTakashi Sakamoto 	unsigned int scode;
658baf9d20bSTakashi Sakamoto 	bool is_contender;
659baf9d20bSTakashi Sakamoto 	unsigned int power_class;
660baf9d20bSTakashi Sakamoto 	enum phy_packet_self_id_port_status port_status[3];
661baf9d20bSTakashi Sakamoto 	bool is_initiated_reset;
662baf9d20bSTakashi Sakamoto 	bool has_more_packets;
663baf9d20bSTakashi Sakamoto 	unsigned int port_index;
664baf9d20bSTakashi Sakamoto 
665baf9d20bSTakashi Sakamoto 	deserialize_phy_packet_self_id_zero(expected[0], &packet_identifier, &phy_id, &extended,
666baf9d20bSTakashi Sakamoto 					    &link_is_active, &gap_count, &scode, &is_contender,
667baf9d20bSTakashi Sakamoto 					    &power_class, &is_initiated_reset, &has_more_packets);
668baf9d20bSTakashi Sakamoto 
669baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier);
670baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0, phy_id);
671baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_FALSE(test, extended);
672baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_TRUE(test, link_is_active);
673baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x05, gap_count);
674baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, SCODE_400, scode);
675baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_TRUE(test, is_contender);
676baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x4, power_class);
677baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_FALSE(test, is_initiated_reset);
678baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_FALSE(test, has_more_packets);
679baf9d20bSTakashi Sakamoto 
680baf9d20bSTakashi Sakamoto 	serialize_phy_packet_self_id_zero(quadlets, packet_identifier, phy_id, extended,
681baf9d20bSTakashi Sakamoto 					  link_is_active, gap_count, scode, is_contender,
682baf9d20bSTakashi Sakamoto 					  power_class, is_initiated_reset, has_more_packets);
683baf9d20bSTakashi Sakamoto 
684baf9d20bSTakashi Sakamoto 	for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {
685baf9d20bSTakashi Sakamoto 		port_status[port_index] =
686baf9d20bSTakashi Sakamoto 			self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index);
687baf9d20bSTakashi Sakamoto 	}
688baf9d20bSTakashi Sakamoto 
689baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[0]);
690baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[1]);
691baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[2]);
692baf9d20bSTakashi Sakamoto 
693baf9d20bSTakashi Sakamoto 	for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {
694baf9d20bSTakashi Sakamoto 		self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index,
695baf9d20bSTakashi Sakamoto 						 port_status[port_index]);
696baf9d20bSTakashi Sakamoto 	}
697baf9d20bSTakashi Sakamoto 
698baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected));
699baf9d20bSTakashi Sakamoto }
700baf9d20bSTakashi Sakamoto 
test_phy_packet_self_id_zero_case1(struct kunit * test)701baf9d20bSTakashi Sakamoto static void test_phy_packet_self_id_zero_case1(struct kunit *test)
702baf9d20bSTakashi Sakamoto {
703baf9d20bSTakashi Sakamoto 	// XIO2213 and TSB81BA3E with 3 ports.
704baf9d20bSTakashi Sakamoto 	const u32 expected[] = {0x817fcc5e};
705baf9d20bSTakashi Sakamoto 	u32 quadlets[] = {0};
706baf9d20bSTakashi Sakamoto 
707baf9d20bSTakashi Sakamoto 	unsigned int packet_identifier;
708baf9d20bSTakashi Sakamoto 	unsigned int phy_id;
709baf9d20bSTakashi Sakamoto 	bool extended;
710baf9d20bSTakashi Sakamoto 	bool link_is_active;
711baf9d20bSTakashi Sakamoto 	unsigned int gap_count;
712baf9d20bSTakashi Sakamoto 	unsigned int scode;
713baf9d20bSTakashi Sakamoto 	bool is_contender;
714baf9d20bSTakashi Sakamoto 	unsigned int power_class;
715baf9d20bSTakashi Sakamoto 	enum phy_packet_self_id_port_status port_status[3];
716baf9d20bSTakashi Sakamoto 	bool is_initiated_reset;
717baf9d20bSTakashi Sakamoto 	bool has_more_packets;
718baf9d20bSTakashi Sakamoto 	unsigned int port_index;
719baf9d20bSTakashi Sakamoto 
720baf9d20bSTakashi Sakamoto 	deserialize_phy_packet_self_id_zero(expected[0], &packet_identifier, &phy_id, &extended,
721baf9d20bSTakashi Sakamoto 					    &link_is_active, &gap_count, &scode, &is_contender,
722baf9d20bSTakashi Sakamoto 					    &power_class, &is_initiated_reset, &has_more_packets);
723baf9d20bSTakashi Sakamoto 
724baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier);
725baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 1, phy_id);
726baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_FALSE(test, extended);
727baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_TRUE(test, link_is_active);
728baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x3f, gap_count);
729baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, SCODE_800, scode);
730baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_TRUE(test, is_contender);
731baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x4, power_class);
732baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_TRUE(test, is_initiated_reset);
733baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_FALSE(test, has_more_packets);
734baf9d20bSTakashi Sakamoto 
735baf9d20bSTakashi Sakamoto 	serialize_phy_packet_self_id_zero(quadlets, packet_identifier, phy_id, extended,
736baf9d20bSTakashi Sakamoto 					  link_is_active, gap_count, scode, is_contender,
737baf9d20bSTakashi Sakamoto 					  power_class, is_initiated_reset, has_more_packets);
738baf9d20bSTakashi Sakamoto 
739baf9d20bSTakashi Sakamoto 	for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {
740baf9d20bSTakashi Sakamoto 		port_status[port_index] =
741baf9d20bSTakashi Sakamoto 			self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index);
742baf9d20bSTakashi Sakamoto 	}
743baf9d20bSTakashi Sakamoto 
744baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[0]);
745baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[1]);
746baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[2]);
747baf9d20bSTakashi Sakamoto 
748baf9d20bSTakashi Sakamoto 	for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {
749baf9d20bSTakashi Sakamoto 		self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index,
750baf9d20bSTakashi Sakamoto 						 port_status[port_index]);
751baf9d20bSTakashi Sakamoto 	}
752baf9d20bSTakashi Sakamoto 
753baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected));
754baf9d20bSTakashi Sakamoto }
755baf9d20bSTakashi Sakamoto 
test_phy_packet_self_id_zero_and_one(struct kunit * test)756baf9d20bSTakashi Sakamoto static void test_phy_packet_self_id_zero_and_one(struct kunit *test)
757baf9d20bSTakashi Sakamoto {
758baf9d20bSTakashi Sakamoto 	// TSB41LV06A with 6 ports.
759baf9d20bSTakashi Sakamoto 	const u32 expected[] = {
760baf9d20bSTakashi Sakamoto 		0x803f8459,
761baf9d20bSTakashi Sakamoto 		0x80815000,
762baf9d20bSTakashi Sakamoto 	};
763baf9d20bSTakashi Sakamoto 	u32 quadlets[] = {0, 0};
764baf9d20bSTakashi Sakamoto 
765baf9d20bSTakashi Sakamoto 	unsigned int packet_identifier;
766baf9d20bSTakashi Sakamoto 	unsigned int phy_id;
767baf9d20bSTakashi Sakamoto 	bool extended;
768baf9d20bSTakashi Sakamoto 	bool link_is_active;
769baf9d20bSTakashi Sakamoto 	unsigned int gap_count;
770baf9d20bSTakashi Sakamoto 	unsigned int scode;
771baf9d20bSTakashi Sakamoto 	bool is_contender;
772baf9d20bSTakashi Sakamoto 	unsigned int power_class;
773baf9d20bSTakashi Sakamoto 	enum phy_packet_self_id_port_status port_status[11];
774baf9d20bSTakashi Sakamoto 	bool is_initiated_reset;
775baf9d20bSTakashi Sakamoto 	bool has_more_packets;
776baf9d20bSTakashi Sakamoto 
777baf9d20bSTakashi Sakamoto 	unsigned int sequence;
778baf9d20bSTakashi Sakamoto 	unsigned int port_index;
779baf9d20bSTakashi Sakamoto 
780baf9d20bSTakashi Sakamoto 	deserialize_phy_packet_self_id_zero(expected[0], &packet_identifier, &phy_id, &extended,
781baf9d20bSTakashi Sakamoto 					    &link_is_active, &gap_count, &scode, &is_contender,
782baf9d20bSTakashi Sakamoto 					    &power_class, &is_initiated_reset, &has_more_packets);
783baf9d20bSTakashi Sakamoto 
784baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier);
785baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0, phy_id);
786baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_FALSE(test, extended);
787baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_FALSE(test, link_is_active);
788baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x3f, gap_count);
789baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, SCODE_400, scode);
790baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_FALSE(test, is_contender);
791baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x4, power_class);
792baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_FALSE(test, is_initiated_reset);
793baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_TRUE(test, has_more_packets);
794baf9d20bSTakashi Sakamoto 
795baf9d20bSTakashi Sakamoto 	serialize_phy_packet_self_id_zero(quadlets, packet_identifier, phy_id, extended,
796baf9d20bSTakashi Sakamoto 					  link_is_active, gap_count, scode, is_contender,
797baf9d20bSTakashi Sakamoto 					  power_class, is_initiated_reset, has_more_packets);
798baf9d20bSTakashi Sakamoto 
799baf9d20bSTakashi Sakamoto 	deserialize_phy_packet_self_id_extended(expected[1], &packet_identifier, &phy_id, &extended,
800baf9d20bSTakashi Sakamoto 						&sequence, &has_more_packets);
801baf9d20bSTakashi Sakamoto 
802baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier);
803baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0, phy_id);
804baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_TRUE(test, extended);
805baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0, sequence);
806baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_FALSE(test, has_more_packets);
807baf9d20bSTakashi Sakamoto 
808baf9d20bSTakashi Sakamoto 	serialize_phy_packet_self_id_extended(&quadlets[1], packet_identifier, phy_id, extended,
809baf9d20bSTakashi Sakamoto 					      sequence, has_more_packets);
810baf9d20bSTakashi Sakamoto 
811baf9d20bSTakashi Sakamoto 
812baf9d20bSTakashi Sakamoto 	for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {
813baf9d20bSTakashi Sakamoto 		port_status[port_index] =
814baf9d20bSTakashi Sakamoto 			self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index);
815baf9d20bSTakashi Sakamoto 	}
816baf9d20bSTakashi Sakamoto 
817baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[0]);
818baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[1]);
819baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[2]);
820baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[3]);
821baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[4]);
822baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[5]);
823baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[6]);
824baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[7]);
825baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[8]);
826baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[9]);
827baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[10]);
828baf9d20bSTakashi Sakamoto 
829baf9d20bSTakashi Sakamoto 	for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {
830baf9d20bSTakashi Sakamoto 		self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index,
831baf9d20bSTakashi Sakamoto 						 port_status[port_index]);
832baf9d20bSTakashi Sakamoto 	}
833baf9d20bSTakashi Sakamoto 
834baf9d20bSTakashi Sakamoto 	KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected));
835baf9d20bSTakashi Sakamoto }
836baf9d20bSTakashi Sakamoto 
test_phy_packet_phy_config_force_root_node(struct kunit * test)837*75d47101STakashi Sakamoto static void test_phy_packet_phy_config_force_root_node(struct kunit *test)
838*75d47101STakashi Sakamoto {
839*75d47101STakashi Sakamoto 	const u32 expected = 0x02800000;
840*75d47101STakashi Sakamoto 	u32 quadlet = 0;
841*75d47101STakashi Sakamoto 
842*75d47101STakashi Sakamoto 	unsigned int packet_identifier;
843*75d47101STakashi Sakamoto 	unsigned int root_id;
844*75d47101STakashi Sakamoto 	bool has_force_root_node;
845*75d47101STakashi Sakamoto 	bool has_gap_count_optimization;
846*75d47101STakashi Sakamoto 	unsigned int gap_count;
847*75d47101STakashi Sakamoto 
848*75d47101STakashi Sakamoto 	deserialize_phy_packet_phy_config(expected, &packet_identifier, &root_id,
849*75d47101STakashi Sakamoto 					  &has_force_root_node, &has_gap_count_optimization,
850*75d47101STakashi Sakamoto 					  &gap_count);
851*75d47101STakashi Sakamoto 
852*75d47101STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_PHY_CONFIG, packet_identifier);
853*75d47101STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x02, root_id);
854*75d47101STakashi Sakamoto 	KUNIT_EXPECT_TRUE(test, has_force_root_node);
855*75d47101STakashi Sakamoto 	KUNIT_EXPECT_FALSE(test, has_gap_count_optimization);
856*75d47101STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0, gap_count);
857*75d47101STakashi Sakamoto 
858*75d47101STakashi Sakamoto 	serialize_phy_packet_phy_config(&quadlet, packet_identifier, root_id, has_force_root_node,
859*75d47101STakashi Sakamoto 					has_gap_count_optimization, gap_count);
860*75d47101STakashi Sakamoto 
861*75d47101STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, quadlet, expected);
862*75d47101STakashi Sakamoto }
863*75d47101STakashi Sakamoto 
test_phy_packet_phy_config_gap_count_optimization(struct kunit * test)864*75d47101STakashi Sakamoto static void test_phy_packet_phy_config_gap_count_optimization(struct kunit *test)
865*75d47101STakashi Sakamoto {
866*75d47101STakashi Sakamoto 	const u32 expected = 0x034f0000;
867*75d47101STakashi Sakamoto 	u32 quadlet = 0;
868*75d47101STakashi Sakamoto 
869*75d47101STakashi Sakamoto 	unsigned int packet_identifier;
870*75d47101STakashi Sakamoto 	unsigned int root_id;
871*75d47101STakashi Sakamoto 	bool has_force_root_node;
872*75d47101STakashi Sakamoto 	bool has_gap_count_optimization;
873*75d47101STakashi Sakamoto 	unsigned int gap_count;
874*75d47101STakashi Sakamoto 
875*75d47101STakashi Sakamoto 	deserialize_phy_packet_phy_config(expected, &packet_identifier, &root_id,
876*75d47101STakashi Sakamoto 					  &has_force_root_node, &has_gap_count_optimization,
877*75d47101STakashi Sakamoto 					  &gap_count);
878*75d47101STakashi Sakamoto 
879*75d47101STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_PHY_CONFIG, packet_identifier);
880*75d47101STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x03, root_id);
881*75d47101STakashi Sakamoto 	KUNIT_EXPECT_FALSE(test, has_force_root_node);
882*75d47101STakashi Sakamoto 	KUNIT_EXPECT_TRUE(test, has_gap_count_optimization);
883*75d47101STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, 0x0f, gap_count);
884*75d47101STakashi Sakamoto 
885*75d47101STakashi Sakamoto 	serialize_phy_packet_phy_config(&quadlet, packet_identifier, root_id, has_force_root_node,
886*75d47101STakashi Sakamoto 					has_gap_count_optimization, gap_count);
887*75d47101STakashi Sakamoto 
888*75d47101STakashi Sakamoto 	KUNIT_EXPECT_EQ(test, quadlet, expected);
889*75d47101STakashi Sakamoto }
890*75d47101STakashi Sakamoto 
89175527d8dSTakashi Sakamoto static struct kunit_case packet_serdes_test_cases[] = {
89275527d8dSTakashi Sakamoto 	KUNIT_CASE(test_async_header_write_quadlet_request),
89375527d8dSTakashi Sakamoto 	KUNIT_CASE(test_async_header_write_block_request),
89475527d8dSTakashi Sakamoto 	KUNIT_CASE(test_async_header_write_response),
89575527d8dSTakashi Sakamoto 	KUNIT_CASE(test_async_header_read_quadlet_request),
89675527d8dSTakashi Sakamoto 	KUNIT_CASE(test_async_header_read_quadlet_response),
89775527d8dSTakashi Sakamoto 	KUNIT_CASE(test_async_header_read_block_request),
89875527d8dSTakashi Sakamoto 	KUNIT_CASE(test_async_header_read_block_response),
89975527d8dSTakashi Sakamoto 	KUNIT_CASE(test_async_header_lock_request),
90075527d8dSTakashi Sakamoto 	KUNIT_CASE(test_async_header_lock_response),
9016503df36STakashi Sakamoto 	KUNIT_CASE(test_isoc_header),
902baf9d20bSTakashi Sakamoto 	KUNIT_CASE(test_phy_packet_self_id_zero_case0),
903baf9d20bSTakashi Sakamoto 	KUNIT_CASE(test_phy_packet_self_id_zero_case1),
904baf9d20bSTakashi Sakamoto 	KUNIT_CASE(test_phy_packet_self_id_zero_and_one),
905*75d47101STakashi Sakamoto 	KUNIT_CASE(test_phy_packet_phy_config_force_root_node),
906*75d47101STakashi Sakamoto 	KUNIT_CASE(test_phy_packet_phy_config_gap_count_optimization),
90775527d8dSTakashi Sakamoto 	{}
90875527d8dSTakashi Sakamoto };
90975527d8dSTakashi Sakamoto 
91075527d8dSTakashi Sakamoto static struct kunit_suite packet_serdes_test_suite = {
91175527d8dSTakashi Sakamoto 	.name = "firewire-packet-serdes",
91275527d8dSTakashi Sakamoto 	.test_cases = packet_serdes_test_cases,
91375527d8dSTakashi Sakamoto };
91475527d8dSTakashi Sakamoto kunit_test_suite(packet_serdes_test_suite);
91575527d8dSTakashi Sakamoto 
916f94b7770SJeff Johnson MODULE_DESCRIPTION("FireWire packet serialization/deserialization unit test suite");
91775527d8dSTakashi Sakamoto MODULE_LICENSE("GPL");
918