18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __nosy_dump_h__
38c2ecf20Sopenharmony_ci#define __nosy_dump_h__
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#define array_length(array) (sizeof(array) / sizeof(array[0]))
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#define ACK_NO_ACK   0x0
88c2ecf20Sopenharmony_ci#define ACK_DONE(a)  ((a >> 2) == 0)
98c2ecf20Sopenharmony_ci#define ACK_BUSY(a)  ((a >> 2) == 1)
108c2ecf20Sopenharmony_ci#define ACK_ERROR(a) ((a >> 2) == 3)
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <stdint.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_cistruct phy_packet {
158c2ecf20Sopenharmony_ci	uint32_t timestamp;
168c2ecf20Sopenharmony_ci	union {
178c2ecf20Sopenharmony_ci		struct {
188c2ecf20Sopenharmony_ci			uint32_t zero:24;
198c2ecf20Sopenharmony_ci			uint32_t phy_id:6;
208c2ecf20Sopenharmony_ci			uint32_t identifier:2;
218c2ecf20Sopenharmony_ci		} common, link_on;
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci		struct {
248c2ecf20Sopenharmony_ci			uint32_t zero:16;
258c2ecf20Sopenharmony_ci			uint32_t gap_count:6;
268c2ecf20Sopenharmony_ci			uint32_t set_gap_count:1;
278c2ecf20Sopenharmony_ci			uint32_t set_root:1;
288c2ecf20Sopenharmony_ci			uint32_t root_id:6;
298c2ecf20Sopenharmony_ci			uint32_t identifier:2;
308c2ecf20Sopenharmony_ci		} phy_config;
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci		struct {
338c2ecf20Sopenharmony_ci			uint32_t more_packets:1;
348c2ecf20Sopenharmony_ci			uint32_t initiated_reset:1;
358c2ecf20Sopenharmony_ci			uint32_t port2:2;
368c2ecf20Sopenharmony_ci			uint32_t port1:2;
378c2ecf20Sopenharmony_ci			uint32_t port0:2;
388c2ecf20Sopenharmony_ci			uint32_t power_class:3;
398c2ecf20Sopenharmony_ci			uint32_t contender:1;
408c2ecf20Sopenharmony_ci			uint32_t phy_delay:2;
418c2ecf20Sopenharmony_ci			uint32_t phy_speed:2;
428c2ecf20Sopenharmony_ci			uint32_t gap_count:6;
438c2ecf20Sopenharmony_ci			uint32_t link_active:1;
448c2ecf20Sopenharmony_ci			uint32_t extended:1;
458c2ecf20Sopenharmony_ci			uint32_t phy_id:6;
468c2ecf20Sopenharmony_ci			uint32_t identifier:2;
478c2ecf20Sopenharmony_ci		} self_id;
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci		struct {
508c2ecf20Sopenharmony_ci			uint32_t more_packets:1;
518c2ecf20Sopenharmony_ci			uint32_t reserved1:1;
528c2ecf20Sopenharmony_ci			uint32_t porth:2;
538c2ecf20Sopenharmony_ci			uint32_t portg:2;
548c2ecf20Sopenharmony_ci			uint32_t portf:2;
558c2ecf20Sopenharmony_ci			uint32_t porte:2;
568c2ecf20Sopenharmony_ci			uint32_t portd:2;
578c2ecf20Sopenharmony_ci			uint32_t portc:2;
588c2ecf20Sopenharmony_ci			uint32_t portb:2;
598c2ecf20Sopenharmony_ci			uint32_t porta:2;
608c2ecf20Sopenharmony_ci			uint32_t reserved0:2;
618c2ecf20Sopenharmony_ci			uint32_t sequence:3;
628c2ecf20Sopenharmony_ci			uint32_t extended:1;
638c2ecf20Sopenharmony_ci			uint32_t phy_id:6;
648c2ecf20Sopenharmony_ci			uint32_t identifier:2;
658c2ecf20Sopenharmony_ci		} ext_self_id;
668c2ecf20Sopenharmony_ci	};
678c2ecf20Sopenharmony_ci	uint32_t inverted;
688c2ecf20Sopenharmony_ci	uint32_t ack;
698c2ecf20Sopenharmony_ci};
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci#define TCODE_PHY_PACKET 0x10
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci#define PHY_PACKET_CONFIGURATION 0x00
748c2ecf20Sopenharmony_ci#define PHY_PACKET_LINK_ON 0x01
758c2ecf20Sopenharmony_ci#define PHY_PACKET_SELF_ID 0x02
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_cistruct link_packet {
788c2ecf20Sopenharmony_ci	uint32_t timestamp;
798c2ecf20Sopenharmony_ci	union {
808c2ecf20Sopenharmony_ci		struct {
818c2ecf20Sopenharmony_ci			uint32_t priority:4;
828c2ecf20Sopenharmony_ci			uint32_t tcode:4;
838c2ecf20Sopenharmony_ci			uint32_t rt:2;
848c2ecf20Sopenharmony_ci			uint32_t tlabel:6;
858c2ecf20Sopenharmony_ci			uint32_t destination:16;
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci			uint32_t offset_high:16;
888c2ecf20Sopenharmony_ci			uint32_t source:16;
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci			uint32_t offset_low;
918c2ecf20Sopenharmony_ci		} common;
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci		struct {
948c2ecf20Sopenharmony_ci			uint32_t common[3];
958c2ecf20Sopenharmony_ci			uint32_t crc;
968c2ecf20Sopenharmony_ci		} read_quadlet;
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci		struct {
998c2ecf20Sopenharmony_ci			uint32_t common[3];
1008c2ecf20Sopenharmony_ci			uint32_t data;
1018c2ecf20Sopenharmony_ci			uint32_t crc;
1028c2ecf20Sopenharmony_ci		} read_quadlet_response;
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci		struct {
1058c2ecf20Sopenharmony_ci			uint32_t common[3];
1068c2ecf20Sopenharmony_ci			uint32_t extended_tcode:16;
1078c2ecf20Sopenharmony_ci			uint32_t data_length:16;
1088c2ecf20Sopenharmony_ci			uint32_t crc;
1098c2ecf20Sopenharmony_ci		} read_block;
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci		struct {
1128c2ecf20Sopenharmony_ci			uint32_t common[3];
1138c2ecf20Sopenharmony_ci			uint32_t extended_tcode:16;
1148c2ecf20Sopenharmony_ci			uint32_t data_length:16;
1158c2ecf20Sopenharmony_ci			uint32_t crc;
1168c2ecf20Sopenharmony_ci			uint32_t data[0];
1178c2ecf20Sopenharmony_ci			/* crc and ack follows. */
1188c2ecf20Sopenharmony_ci		} read_block_response;
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci		struct {
1218c2ecf20Sopenharmony_ci			uint32_t common[3];
1228c2ecf20Sopenharmony_ci			uint32_t data;
1238c2ecf20Sopenharmony_ci			uint32_t crc;
1248c2ecf20Sopenharmony_ci		} write_quadlet;
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ci		struct {
1278c2ecf20Sopenharmony_ci			uint32_t common[3];
1288c2ecf20Sopenharmony_ci			uint32_t extended_tcode:16;
1298c2ecf20Sopenharmony_ci			uint32_t data_length:16;
1308c2ecf20Sopenharmony_ci			uint32_t crc;
1318c2ecf20Sopenharmony_ci			uint32_t data[0];
1328c2ecf20Sopenharmony_ci			/* crc and ack follows. */
1338c2ecf20Sopenharmony_ci		} write_block;
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci		struct {
1368c2ecf20Sopenharmony_ci			uint32_t common[3];
1378c2ecf20Sopenharmony_ci			uint32_t crc;
1388c2ecf20Sopenharmony_ci		} write_response;
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci		struct {
1418c2ecf20Sopenharmony_ci			uint32_t common[3];
1428c2ecf20Sopenharmony_ci			uint32_t data;
1438c2ecf20Sopenharmony_ci			uint32_t crc;
1448c2ecf20Sopenharmony_ci		} cycle_start;
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci		struct {
1478c2ecf20Sopenharmony_ci			uint32_t sy:4;
1488c2ecf20Sopenharmony_ci			uint32_t tcode:4;
1498c2ecf20Sopenharmony_ci			uint32_t channel:6;
1508c2ecf20Sopenharmony_ci			uint32_t tag:2;
1518c2ecf20Sopenharmony_ci			uint32_t data_length:16;
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci			uint32_t crc;
1548c2ecf20Sopenharmony_ci		} iso_data;
1558c2ecf20Sopenharmony_ci	};
1568c2ecf20Sopenharmony_ci};
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_cistruct subaction {
1598c2ecf20Sopenharmony_ci	uint32_t ack;
1608c2ecf20Sopenharmony_ci	size_t length;
1618c2ecf20Sopenharmony_ci	struct list link;
1628c2ecf20Sopenharmony_ci	struct link_packet packet;
1638c2ecf20Sopenharmony_ci};
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_cistruct link_transaction {
1668c2ecf20Sopenharmony_ci	int request_node, response_node, tlabel;
1678c2ecf20Sopenharmony_ci	struct subaction *request, *response;
1688c2ecf20Sopenharmony_ci	struct list request_list, response_list;
1698c2ecf20Sopenharmony_ci	struct list link;
1708c2ecf20Sopenharmony_ci};
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ciint decode_fcp(struct link_transaction *t);
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_ci#endif /* __nosy_dump_h__ */
175