]> Git Repo - J-linux.git/blob - drivers/firewire/packet-serdes-test.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / drivers / firewire / packet-serdes-test.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 //
3 // packet-serdes-test.c - An application of Kunit to check serialization/deserialization of packets
4 //                        defined by IEEE 1394.
5 //
6 // Copyright (c) 2024 Takashi Sakamoto
7
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
15 static 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
28 static 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
37 static 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
47 static 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
60 static 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
70 static 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
80 static 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
93 static 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
106 static 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
116 static 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
126 static 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
140 static 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
150 static 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
159 static 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
171 static 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
181 static 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
191 static 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
210 static 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
229 static 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
240 static 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
251 static 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
262 static 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
274 static 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
313 static 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
353 static 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
388 static 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
423 static 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
462 static 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
502 static 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
542 static 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
582 static 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
622 static 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
646 static 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
701 static 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
756 static 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
837 static 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
864 static 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
891 static 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
910 static struct kunit_suite packet_serdes_test_suite = {
911         .name = "firewire-packet-serdes",
912         .test_cases = packet_serdes_test_cases,
913 };
914 kunit_test_suite(packet_serdes_test_suite);
915
916 MODULE_DESCRIPTION("FireWire packet serialization/deserialization unit test suite");
917 MODULE_LICENSE("GPL");
This page took 0.08653 seconds and 4 git commands to generate.