xref: /openbmc/linux/tools/firewire/nosy-dump.h (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
29f6d3c4bSStefan Richter #ifndef __nosy_dump_h__
39f6d3c4bSStefan Richter #define __nosy_dump_h__
49f6d3c4bSStefan Richter 
59f6d3c4bSStefan Richter #define array_length(array) (sizeof(array) / sizeof(array[0]))
69f6d3c4bSStefan Richter 
79f6d3c4bSStefan Richter #define ACK_NO_ACK   0x0
89f6d3c4bSStefan Richter #define ACK_DONE(a)  ((a >> 2) == 0)
99f6d3c4bSStefan Richter #define ACK_BUSY(a)  ((a >> 2) == 1)
109f6d3c4bSStefan Richter #define ACK_ERROR(a) ((a >> 2) == 3)
119f6d3c4bSStefan Richter 
121bcc69fbSStefan Richter #include <stdint.h>
139f6d3c4bSStefan Richter 
141bcc69fbSStefan Richter struct phy_packet {
151bcc69fbSStefan Richter 	uint32_t timestamp;
169f6d3c4bSStefan Richter 	union {
179f6d3c4bSStefan Richter 		struct {
181bcc69fbSStefan Richter 			uint32_t zero:24;
191bcc69fbSStefan Richter 			uint32_t phy_id:6;
201bcc69fbSStefan Richter 			uint32_t identifier:2;
219f6d3c4bSStefan Richter 		} common, link_on;
221bcc69fbSStefan Richter 
239f6d3c4bSStefan Richter 		struct {
241bcc69fbSStefan Richter 			uint32_t zero:16;
251bcc69fbSStefan Richter 			uint32_t gap_count:6;
261bcc69fbSStefan Richter 			uint32_t set_gap_count:1;
271bcc69fbSStefan Richter 			uint32_t set_root:1;
281bcc69fbSStefan Richter 			uint32_t root_id:6;
291bcc69fbSStefan Richter 			uint32_t identifier:2;
309f6d3c4bSStefan Richter 		} phy_config;
311bcc69fbSStefan Richter 
329f6d3c4bSStefan Richter 		struct {
331bcc69fbSStefan Richter 			uint32_t more_packets:1;
341bcc69fbSStefan Richter 			uint32_t initiated_reset:1;
351bcc69fbSStefan Richter 			uint32_t port2:2;
361bcc69fbSStefan Richter 			uint32_t port1:2;
371bcc69fbSStefan Richter 			uint32_t port0:2;
381bcc69fbSStefan Richter 			uint32_t power_class:3;
391bcc69fbSStefan Richter 			uint32_t contender:1;
401bcc69fbSStefan Richter 			uint32_t phy_delay:2;
411bcc69fbSStefan Richter 			uint32_t phy_speed:2;
421bcc69fbSStefan Richter 			uint32_t gap_count:6;
431bcc69fbSStefan Richter 			uint32_t link_active:1;
441bcc69fbSStefan Richter 			uint32_t extended:1;
451bcc69fbSStefan Richter 			uint32_t phy_id:6;
461bcc69fbSStefan Richter 			uint32_t identifier:2;
479f6d3c4bSStefan Richter 		} self_id;
489f6d3c4bSStefan Richter 
499f6d3c4bSStefan Richter 		struct {
501bcc69fbSStefan Richter 			uint32_t more_packets:1;
511bcc69fbSStefan Richter 			uint32_t reserved1:1;
521bcc69fbSStefan Richter 			uint32_t porth:2;
531bcc69fbSStefan Richter 			uint32_t portg:2;
541bcc69fbSStefan Richter 			uint32_t portf:2;
551bcc69fbSStefan Richter 			uint32_t porte:2;
561bcc69fbSStefan Richter 			uint32_t portd:2;
571bcc69fbSStefan Richter 			uint32_t portc:2;
581bcc69fbSStefan Richter 			uint32_t portb:2;
591bcc69fbSStefan Richter 			uint32_t porta:2;
601bcc69fbSStefan Richter 			uint32_t reserved0:2;
611bcc69fbSStefan Richter 			uint32_t sequence:3;
621bcc69fbSStefan Richter 			uint32_t extended:1;
631bcc69fbSStefan Richter 			uint32_t phy_id:6;
641bcc69fbSStefan Richter 			uint32_t identifier:2;
659f6d3c4bSStefan Richter 		} ext_self_id;
669f6d3c4bSStefan Richter 	};
671bcc69fbSStefan Richter 	uint32_t inverted;
681bcc69fbSStefan Richter 	uint32_t ack;
699f6d3c4bSStefan Richter };
709f6d3c4bSStefan Richter 
7183ef7c75SStefan Richter #define TCODE_PHY_PACKET 0x10
7283ef7c75SStefan Richter 
739f6d3c4bSStefan Richter #define PHY_PACKET_CONFIGURATION 0x00
749f6d3c4bSStefan Richter #define PHY_PACKET_LINK_ON 0x01
759f6d3c4bSStefan Richter #define PHY_PACKET_SELF_ID 0x02
769f6d3c4bSStefan Richter 
779f6d3c4bSStefan Richter struct link_packet {
781bcc69fbSStefan Richter 	uint32_t timestamp;
799f6d3c4bSStefan Richter 	union {
809f6d3c4bSStefan Richter 		struct {
811bcc69fbSStefan Richter 			uint32_t priority:4;
821bcc69fbSStefan Richter 			uint32_t tcode:4;
831bcc69fbSStefan Richter 			uint32_t rt:2;
841bcc69fbSStefan Richter 			uint32_t tlabel:6;
851bcc69fbSStefan Richter 			uint32_t destination:16;
869f6d3c4bSStefan Richter 
871bcc69fbSStefan Richter 			uint32_t offset_high:16;
881bcc69fbSStefan Richter 			uint32_t source:16;
899f6d3c4bSStefan Richter 
901bcc69fbSStefan Richter 			uint32_t offset_low;
919f6d3c4bSStefan Richter 		} common;
929f6d3c4bSStefan Richter 
939f6d3c4bSStefan Richter 		struct {
941bcc69fbSStefan Richter 			uint32_t common[3];
951bcc69fbSStefan Richter 			uint32_t crc;
969f6d3c4bSStefan Richter 		} read_quadlet;
979f6d3c4bSStefan Richter 
989f6d3c4bSStefan Richter 		struct {
991bcc69fbSStefan Richter 			uint32_t common[3];
1001bcc69fbSStefan Richter 			uint32_t data;
1011bcc69fbSStefan Richter 			uint32_t crc;
1029f6d3c4bSStefan Richter 		} read_quadlet_response;
1039f6d3c4bSStefan Richter 
1049f6d3c4bSStefan Richter 		struct {
1051bcc69fbSStefan Richter 			uint32_t common[3];
1061bcc69fbSStefan Richter 			uint32_t extended_tcode:16;
1071bcc69fbSStefan Richter 			uint32_t data_length:16;
1081bcc69fbSStefan Richter 			uint32_t crc;
1099f6d3c4bSStefan Richter 		} read_block;
1109f6d3c4bSStefan Richter 
1119f6d3c4bSStefan Richter 		struct {
1121bcc69fbSStefan Richter 			uint32_t common[3];
1131bcc69fbSStefan Richter 			uint32_t extended_tcode:16;
1141bcc69fbSStefan Richter 			uint32_t data_length:16;
1151bcc69fbSStefan Richter 			uint32_t crc;
1161bcc69fbSStefan Richter 			uint32_t data[0];
1179f6d3c4bSStefan Richter 			/* crc and ack follows. */
1189f6d3c4bSStefan Richter 		} read_block_response;
1199f6d3c4bSStefan Richter 
1209f6d3c4bSStefan Richter 		struct {
1211bcc69fbSStefan Richter 			uint32_t common[3];
1221bcc69fbSStefan Richter 			uint32_t data;
1231bcc69fbSStefan Richter 			uint32_t crc;
1249f6d3c4bSStefan Richter 		} write_quadlet;
1259f6d3c4bSStefan Richter 
1269f6d3c4bSStefan Richter 		struct {
1271bcc69fbSStefan Richter 			uint32_t common[3];
1281bcc69fbSStefan Richter 			uint32_t extended_tcode:16;
1291bcc69fbSStefan Richter 			uint32_t data_length:16;
1301bcc69fbSStefan Richter 			uint32_t crc;
1311bcc69fbSStefan Richter 			uint32_t data[0];
1329f6d3c4bSStefan Richter 			/* crc and ack follows. */
1339f6d3c4bSStefan Richter 		} write_block;
1349f6d3c4bSStefan Richter 
1359f6d3c4bSStefan Richter 		struct {
1361bcc69fbSStefan Richter 			uint32_t common[3];
1371bcc69fbSStefan Richter 			uint32_t crc;
1389f6d3c4bSStefan Richter 		} write_response;
1399f6d3c4bSStefan Richter 
1409f6d3c4bSStefan Richter 		struct {
1411bcc69fbSStefan Richter 			uint32_t common[3];
1421bcc69fbSStefan Richter 			uint32_t data;
1431bcc69fbSStefan Richter 			uint32_t crc;
1449f6d3c4bSStefan Richter 		} cycle_start;
1459f6d3c4bSStefan Richter 
1469f6d3c4bSStefan Richter 		struct {
1471bcc69fbSStefan Richter 			uint32_t sy:4;
1481bcc69fbSStefan Richter 			uint32_t tcode:4;
1491bcc69fbSStefan Richter 			uint32_t channel:6;
1501bcc69fbSStefan Richter 			uint32_t tag:2;
1511bcc69fbSStefan Richter 			uint32_t data_length:16;
1529f6d3c4bSStefan Richter 
1531bcc69fbSStefan Richter 			uint32_t crc;
1549f6d3c4bSStefan Richter 		} iso_data;
1559f6d3c4bSStefan Richter 	};
1569f6d3c4bSStefan Richter };
1579f6d3c4bSStefan Richter 
1589f6d3c4bSStefan Richter struct subaction {
1591bcc69fbSStefan Richter 	uint32_t ack;
1609f6d3c4bSStefan Richter 	size_t length;
1619f6d3c4bSStefan Richter 	struct list link;
1629f6d3c4bSStefan Richter 	struct link_packet packet;
1639f6d3c4bSStefan Richter };
1649f6d3c4bSStefan Richter 
1659f6d3c4bSStefan Richter struct link_transaction {
1669f6d3c4bSStefan Richter 	int request_node, response_node, tlabel;
1679f6d3c4bSStefan Richter 	struct subaction *request, *response;
1689f6d3c4bSStefan Richter 	struct list request_list, response_list;
1699f6d3c4bSStefan Richter 	struct list link;
1709f6d3c4bSStefan Richter };
1719f6d3c4bSStefan Richter 
1729f6d3c4bSStefan Richter int decode_fcp(struct link_transaction *t);
1739f6d3c4bSStefan Richter 
1749f6d3c4bSStefan Richter #endif /* __nosy_dump_h__ */
175