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