186d36773SIgor Russkikh /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) */ 286d36773SIgor Russkikh /* Copyright (C) 2014-2017 aQuantia Corporation. */ 386d36773SIgor Russkikh 486d36773SIgor Russkikh /* File hw_atl_utils.h: Declaration of common functions for Atlantic hardware 586d36773SIgor Russkikh * abstraction layer. 686d36773SIgor Russkikh */ 786d36773SIgor Russkikh 886d36773SIgor Russkikh #ifndef HW_ATL_UTILS_H 986d36773SIgor Russkikh #define HW_ATL_UTILS_H 1086d36773SIgor Russkikh 11f73061d5SPavel Belous #define BIT(x) (1UL << (x)) 1286d36773SIgor Russkikh #define HW_ATL_FLUSH() { (void)aq_hw_read_reg(self, 0x10); } 1386d36773SIgor Russkikh 1486d36773SIgor Russkikh /* Hardware tx descriptor */ 15*e7750639SAndre Muezerie struct __rte_packed_begin hw_atl_txd_s { 1686d36773SIgor Russkikh u64 buf_addr; 1786d36773SIgor Russkikh 1886d36773SIgor Russkikh union { 19*e7750639SAndre Muezerie struct __rte_packed_begin { 2086d36773SIgor Russkikh u32 type:3; 2186d36773SIgor Russkikh u32:1; 2286d36773SIgor Russkikh u32 len:16; 2386d36773SIgor Russkikh u32 dd:1; 2486d36773SIgor Russkikh u32 eop:1; 2586d36773SIgor Russkikh u32 cmd:8; 2686d36773SIgor Russkikh u32:14; 2786d36773SIgor Russkikh u32 ct_idx:1; 2886d36773SIgor Russkikh u32 ct_en:1; 2986d36773SIgor Russkikh u32 pay_len:18; 30*e7750639SAndre Muezerie } __rte_packed_end; 3186d36773SIgor Russkikh u64 flags; 3286d36773SIgor Russkikh }; 33*e7750639SAndre Muezerie } __rte_packed_end; 3486d36773SIgor Russkikh 3586d36773SIgor Russkikh /* Hardware tx context descriptor */ 36*e7750639SAndre Muezerie union __rte_packed_begin hw_atl_txc_s { 3786d36773SIgor Russkikh struct { 3886d36773SIgor Russkikh u64 flags1; 3986d36773SIgor Russkikh u64 flags2; 4086d36773SIgor Russkikh }; 4186d36773SIgor Russkikh 42*e7750639SAndre Muezerie struct __rte_packed_begin { 4386d36773SIgor Russkikh u64:40; 4486d36773SIgor Russkikh u32 tun_len:8; 4586d36773SIgor Russkikh u32 out_len:16; 4686d36773SIgor Russkikh u32 type:3; 4786d36773SIgor Russkikh u32 idx:1; 4886d36773SIgor Russkikh u32 vlan_tag:16; 4986d36773SIgor Russkikh u32 cmd:4; 5086d36773SIgor Russkikh u32 l2_len:7; 5186d36773SIgor Russkikh u32 l3_len:9; 5286d36773SIgor Russkikh u32 l4_len:8; 5386d36773SIgor Russkikh u32 mss_len:16; 54*e7750639SAndre Muezerie } __rte_packed_end; 55*e7750639SAndre Muezerie } __rte_packed_end; 5686d36773SIgor Russkikh 5786d36773SIgor Russkikh enum aq_tx_desc_type { 5886d36773SIgor Russkikh tx_desc_type_desc = 1, 5986d36773SIgor Russkikh tx_desc_type_ctx = 2, 6086d36773SIgor Russkikh }; 6186d36773SIgor Russkikh 6286d36773SIgor Russkikh enum aq_tx_desc_cmd { 6386d36773SIgor Russkikh tx_desc_cmd_vlan = 1, 6486d36773SIgor Russkikh tx_desc_cmd_fcs = 2, 6586d36773SIgor Russkikh tx_desc_cmd_ipv4 = 4, 6686d36773SIgor Russkikh tx_desc_cmd_l4cs = 8, 6786d36773SIgor Russkikh tx_desc_cmd_lso = 0x10, 6886d36773SIgor Russkikh tx_desc_cmd_wb = 0x20, 6986d36773SIgor Russkikh }; 7086d36773SIgor Russkikh 7186d36773SIgor Russkikh 7286d36773SIgor Russkikh /* Hardware rx descriptor */ 73*e7750639SAndre Muezerie struct __rte_packed_begin hw_atl_rxd_s { 7486d36773SIgor Russkikh u64 buf_addr; 7586d36773SIgor Russkikh u64 hdr_addr; 76*e7750639SAndre Muezerie } __rte_packed_end; 7786d36773SIgor Russkikh 7886d36773SIgor Russkikh /* Hardware rx descriptor writeback */ 79*e7750639SAndre Muezerie struct __rte_packed_begin hw_atl_rxd_wb_s { 8086d36773SIgor Russkikh u32 rss_type:4; 8186d36773SIgor Russkikh u32 pkt_type:8; 8286d36773SIgor Russkikh u32 type:20; 8386d36773SIgor Russkikh u32 rss_hash; 8486d36773SIgor Russkikh u16 dd:1; 8586d36773SIgor Russkikh u16 eop:1; 8686d36773SIgor Russkikh u16 rx_stat:4; 8786d36773SIgor Russkikh u16 rx_estat:6; 8886d36773SIgor Russkikh u16 rsc_cnt:4; 8986d36773SIgor Russkikh u16 pkt_len; 9086d36773SIgor Russkikh u16 next_desc_ptr; 9186d36773SIgor Russkikh u16 vlan; 92*e7750639SAndre Muezerie } __rte_packed_end; 9386d36773SIgor Russkikh 94*e7750639SAndre Muezerie struct __rte_packed_begin hw_atl_stats_s { 9586d36773SIgor Russkikh u32 uprc; 9686d36773SIgor Russkikh u32 mprc; 9786d36773SIgor Russkikh u32 bprc; 9886d36773SIgor Russkikh u32 erpt; 9986d36773SIgor Russkikh u32 uptc; 10086d36773SIgor Russkikh u32 mptc; 10186d36773SIgor Russkikh u32 bptc; 10286d36773SIgor Russkikh u32 erpr; 10386d36773SIgor Russkikh u32 mbtc; 10486d36773SIgor Russkikh u32 bbtc; 10586d36773SIgor Russkikh u32 mbrc; 10686d36773SIgor Russkikh u32 bbrc; 10786d36773SIgor Russkikh u32 ubrc; 10886d36773SIgor Russkikh u32 ubtc; 10986d36773SIgor Russkikh u32 dpc; 110*e7750639SAndre Muezerie } __rte_packed_end; 11186d36773SIgor Russkikh 112*e7750639SAndre Muezerie union __rte_packed_begin ip_addr { 11386d36773SIgor Russkikh struct { 11486d36773SIgor Russkikh u8 addr[16]; 11586d36773SIgor Russkikh } v6; 11686d36773SIgor Russkikh struct { 11786d36773SIgor Russkikh u8 padding[12]; 11886d36773SIgor Russkikh u8 addr[4]; 11986d36773SIgor Russkikh } v4; 120*e7750639SAndre Muezerie } __rte_packed_end; 12186d36773SIgor Russkikh 122*e7750639SAndre Muezerie struct __rte_packed_begin hw_aq_atl_utils_fw_rpc { 12386d36773SIgor Russkikh u32 msg_id; 12486d36773SIgor Russkikh 12586d36773SIgor Russkikh union { 12686d36773SIgor Russkikh struct { 12786d36773SIgor Russkikh u32 pong; 12886d36773SIgor Russkikh } msg_ping; 12986d36773SIgor Russkikh 13086d36773SIgor Russkikh struct { 13186d36773SIgor Russkikh u8 mac_addr[6]; 13286d36773SIgor Russkikh u32 ip_addr_cnt; 13386d36773SIgor Russkikh 13486d36773SIgor Russkikh struct { 13586d36773SIgor Russkikh union ip_addr addr; 13686d36773SIgor Russkikh union ip_addr mask; 13786d36773SIgor Russkikh } ip[1]; 13886d36773SIgor Russkikh } msg_arp; 13986d36773SIgor Russkikh 14086d36773SIgor Russkikh struct { 14186d36773SIgor Russkikh u32 len; 14286d36773SIgor Russkikh u8 packet[1514U]; 14386d36773SIgor Russkikh } msg_inject; 14486d36773SIgor Russkikh 14586d36773SIgor Russkikh struct { 14686d36773SIgor Russkikh u32 priority; 14786d36773SIgor Russkikh u32 wol_packet_type; 14886d36773SIgor Russkikh u32 pattern_id; 14986d36773SIgor Russkikh u32 next_wol_pattern_offset; 15086d36773SIgor Russkikh union { 15186d36773SIgor Russkikh struct { 15286d36773SIgor Russkikh u32 flags; 15386d36773SIgor Russkikh u8 ipv4_source_address[4]; 15486d36773SIgor Russkikh u8 ipv4_dest_address[4]; 15586d36773SIgor Russkikh u16 tcp_source_port_number; 15686d36773SIgor Russkikh u16 tcp_dest_port_number; 15786d36773SIgor Russkikh } ipv4_tcp_syn_parameters; 15886d36773SIgor Russkikh 15986d36773SIgor Russkikh struct { 16086d36773SIgor Russkikh u32 flags; 16186d36773SIgor Russkikh u8 ipv6_source_address[16]; 16286d36773SIgor Russkikh u8 ipv6_dest_address[16]; 16386d36773SIgor Russkikh u16 tcp_source_port_number; 16486d36773SIgor Russkikh u16 tcp_dest_port_number; 16586d36773SIgor Russkikh } ipv6_tcp_syn_parameters; 16686d36773SIgor Russkikh 16786d36773SIgor Russkikh struct { 16886d36773SIgor Russkikh u32 flags; 16986d36773SIgor Russkikh } eapol_request_id_message_parameters; 17086d36773SIgor Russkikh 17186d36773SIgor Russkikh struct { 17286d36773SIgor Russkikh u32 flags; 17386d36773SIgor Russkikh u32 mask_offset; 17486d36773SIgor Russkikh u32 mask_size; 17586d36773SIgor Russkikh u32 pattern_offset; 17686d36773SIgor Russkikh u32 pattern_size; 17786d36773SIgor Russkikh } wol_bit_map_pattern; 17886d36773SIgor Russkikh struct { 17986d36773SIgor Russkikh u8 mac_addr[6]; 18086d36773SIgor Russkikh } wol_magic_packet_pattern; 18186d36773SIgor Russkikh 18286d36773SIgor Russkikh } wol_pattern; 18386d36773SIgor Russkikh } msg_wol; 18486d36773SIgor Russkikh 18586d36773SIgor Russkikh struct { 18686d36773SIgor Russkikh u16 tc_quanta[8]; 18786d36773SIgor Russkikh u16 tc_threshold[8]; 18886d36773SIgor Russkikh } msg_msm_pfc_quantas; 18986d36773SIgor Russkikh 19086d36773SIgor Russkikh struct { 19186d36773SIgor Russkikh union { 19286d36773SIgor Russkikh u32 pattern_mask; 19386d36773SIgor Russkikh struct { 19486d36773SIgor Russkikh u32 aq_pm_wol_reason_arp_v4_pkt : 1; 19586d36773SIgor Russkikh u32 aq_pm_wol_reason_ipv4_ping_pkt : 1; 19686d36773SIgor Russkikh u32 aq_pm_wol_reason_ipv6_ns_pkt : 1; 19786d36773SIgor Russkikh u32 aq_pm_wol_reason_ipv6_ping_pkt : 1; 19886d36773SIgor Russkikh u32 aq_pm_wol_reason_link_up : 1; 19986d36773SIgor Russkikh u32 aq_pm_wol_reason_link_down : 1; 20086d36773SIgor Russkikh u32 aq_pm_wol_reason_maximum : 1; 20186d36773SIgor Russkikh }; 20286d36773SIgor Russkikh }; 20386d36773SIgor Russkikh union { 20486d36773SIgor Russkikh u32 offload_mask; 20586d36773SIgor Russkikh }; 20686d36773SIgor Russkikh } msg_enable_wakeup; 20786d36773SIgor Russkikh 20886d36773SIgor Russkikh struct { 20986d36773SIgor Russkikh u32 priority; 21086d36773SIgor Russkikh u32 protocol_offload_type; 21186d36773SIgor Russkikh u32 protocol_offload_id; 21286d36773SIgor Russkikh u32 next_protocol_offload_offset; 21386d36773SIgor Russkikh 21486d36773SIgor Russkikh union { 21586d36773SIgor Russkikh struct { 21686d36773SIgor Russkikh u32 flags; 21786d36773SIgor Russkikh u8 remote_ipv4_addr[4]; 21886d36773SIgor Russkikh u8 host_ipv4_addr[4]; 21986d36773SIgor Russkikh u8 mac_addr[6]; 22086d36773SIgor Russkikh } ipv4_arp_params; 22186d36773SIgor Russkikh }; 22286d36773SIgor Russkikh } msg_offload; 22386d36773SIgor Russkikh 22486d36773SIgor Russkikh struct { 22586d36773SIgor Russkikh u32 id; 22686d36773SIgor Russkikh } msg_del_id; 22786d36773SIgor Russkikh 22886d36773SIgor Russkikh }; 229*e7750639SAndre Muezerie } __rte_packed_end; 23086d36773SIgor Russkikh 231*e7750639SAndre Muezerie struct __rte_packed_begin hw_aq_atl_utils_mbox_header { 23286d36773SIgor Russkikh u32 version; 23386d36773SIgor Russkikh u32 transaction_id; 23486d36773SIgor Russkikh u32 error; 235*e7750639SAndre Muezerie } __rte_packed_end; 23686d36773SIgor Russkikh 237*e7750639SAndre Muezerie struct __rte_packed_begin hw_aq_info { 23886d36773SIgor Russkikh u8 reserved[6]; 23986d36773SIgor Russkikh u16 phy_fault_code; 24086d36773SIgor Russkikh u16 phy_temperature; 24186d36773SIgor Russkikh u8 cable_len; 24286d36773SIgor Russkikh u8 reserved1; 24386d36773SIgor Russkikh u32 cable_diag_data[4]; 24486d36773SIgor Russkikh u8 reserved2[32]; 24586d36773SIgor Russkikh u32 caps_lo; 24686d36773SIgor Russkikh u32 caps_hi; 247*e7750639SAndre Muezerie } __rte_packed_end; 24886d36773SIgor Russkikh 249*e7750639SAndre Muezerie struct __rte_packed_begin hw_aq_atl_utils_mbox { 25086d36773SIgor Russkikh struct hw_aq_atl_utils_mbox_header header; 25186d36773SIgor Russkikh struct hw_atl_stats_s stats; 25286d36773SIgor Russkikh struct hw_aq_info info; 253*e7750639SAndre Muezerie } __rte_packed_end; 25486d36773SIgor Russkikh 25586d36773SIgor Russkikh /* fw2x */ 25686d36773SIgor Russkikh typedef u16 in_port_t; 25786d36773SIgor Russkikh typedef u32 ip4_addr_t; 25886d36773SIgor Russkikh typedef int int32_t; 25986d36773SIgor Russkikh typedef short int16_t; 26086d36773SIgor Russkikh typedef u32 fw_offset_t; 26186d36773SIgor Russkikh 262*e7750639SAndre Muezerie struct __rte_packed_begin ip6_addr { 26386d36773SIgor Russkikh u32 addr[4]; 264*e7750639SAndre Muezerie } __rte_packed_end; 26586d36773SIgor Russkikh 266*e7750639SAndre Muezerie struct __rte_packed_begin offload_ka_v4 { 26786d36773SIgor Russkikh u32 timeout; 26886d36773SIgor Russkikh in_port_t local_port; 26986d36773SIgor Russkikh in_port_t remote_port; 27086d36773SIgor Russkikh u8 remote_mac_addr[6]; 27186d36773SIgor Russkikh u16 win_size; 27286d36773SIgor Russkikh u32 seq_num; 27386d36773SIgor Russkikh u32 ack_num; 27486d36773SIgor Russkikh ip4_addr_t local_ip; 27586d36773SIgor Russkikh ip4_addr_t remote_ip; 276*e7750639SAndre Muezerie } __rte_packed_end; 27786d36773SIgor Russkikh 278*e7750639SAndre Muezerie struct __rte_packed_begin offload_ka_v6 { 27986d36773SIgor Russkikh u32 timeout; 28086d36773SIgor Russkikh in_port_t local_port; 28186d36773SIgor Russkikh in_port_t remote_port; 28286d36773SIgor Russkikh u8 remote_mac_addr[6]; 28386d36773SIgor Russkikh u16 win_size; 28486d36773SIgor Russkikh u32 seq_num; 28586d36773SIgor Russkikh u32 ack_num; 28686d36773SIgor Russkikh struct ip6_addr local_ip; 28786d36773SIgor Russkikh struct ip6_addr remote_ip; 288*e7750639SAndre Muezerie } __rte_packed_end; 28986d36773SIgor Russkikh 290*e7750639SAndre Muezerie struct __rte_packed_begin offload_ip_info { 29186d36773SIgor Russkikh u8 v4_local_addr_count; 29286d36773SIgor Russkikh u8 v4_addr_count; 29386d36773SIgor Russkikh u8 v6_local_addr_count; 29486d36773SIgor Russkikh u8 v6_addr_count; 29586d36773SIgor Russkikh fw_offset_t v4_addr; 29686d36773SIgor Russkikh fw_offset_t v4_prefix; 29786d36773SIgor Russkikh fw_offset_t v6_addr; 29886d36773SIgor Russkikh fw_offset_t v6_prefix; 299*e7750639SAndre Muezerie } __rte_packed_end; 30086d36773SIgor Russkikh 301*e7750639SAndre Muezerie struct __rte_packed_begin offload_port_info { 30286d36773SIgor Russkikh u16 udp_port_count; 30386d36773SIgor Russkikh u16 tcp_port_count; 30486d36773SIgor Russkikh fw_offset_t udp_port; 30586d36773SIgor Russkikh fw_offset_t tcp_port; 306*e7750639SAndre Muezerie } __rte_packed_end; 30786d36773SIgor Russkikh 308*e7750639SAndre Muezerie struct __rte_packed_begin offload_ka_info { 30986d36773SIgor Russkikh u16 v4_ka_count; 31086d36773SIgor Russkikh u16 v6_ka_count; 31186d36773SIgor Russkikh u32 retry_count; 31286d36773SIgor Russkikh u32 retry_interval; 31386d36773SIgor Russkikh fw_offset_t v4_ka; 31486d36773SIgor Russkikh fw_offset_t v6_ka; 315*e7750639SAndre Muezerie } __rte_packed_end; 31686d36773SIgor Russkikh 317*e7750639SAndre Muezerie struct __rte_packed_begin offload_rr_info { 31886d36773SIgor Russkikh u32 rr_count; 31986d36773SIgor Russkikh u32 rr_buf_len; 32086d36773SIgor Russkikh fw_offset_t rr_id_x; 32186d36773SIgor Russkikh fw_offset_t rr_buf; 322*e7750639SAndre Muezerie } __rte_packed_end; 32386d36773SIgor Russkikh 324*e7750639SAndre Muezerie struct __rte_packed_begin offload_info { 32586d36773SIgor Russkikh u32 version; // current version is 0x00000000 32686d36773SIgor Russkikh u32 len; // The whole structure length 32786d36773SIgor Russkikh // including the variable-size buf 32886d36773SIgor Russkikh u8 mac_addr[6]; // 8 bytes to keep alignment. Only 32986d36773SIgor Russkikh // first 6 meaningful. 33086d36773SIgor Russkikh 33186d36773SIgor Russkikh u8 reserved[2]; 33286d36773SIgor Russkikh 33386d36773SIgor Russkikh struct offload_ip_info ips; 33486d36773SIgor Russkikh struct offload_port_info ports; 33586d36773SIgor Russkikh struct offload_ka_info kas; 33686d36773SIgor Russkikh struct offload_rr_info rrs; 337013b4c52SBruce Richardson u8 buf[]; 338*e7750639SAndre Muezerie } __rte_packed_end; 33986d36773SIgor Russkikh 340*e7750639SAndre Muezerie struct __rte_packed_begin smbus_request { 34105d5b1d6SPavel Belous u32 msg_id; /* not used */ 34286d36773SIgor Russkikh u32 device_id; 34386d36773SIgor Russkikh u32 address; 34486d36773SIgor Russkikh u32 length; 345*e7750639SAndre Muezerie } __rte_packed_end; 34686d36773SIgor Russkikh 3470ec6573bSPavel Belous enum macsec_msg_type { 3480ec6573bSPavel Belous macsec_cfg_msg = 0, 3490ec6573bSPavel Belous macsec_add_rx_sc_msg, 3500ec6573bSPavel Belous macsec_add_tx_sc_msg, 3510ec6573bSPavel Belous macsec_add_rx_sa_msg, 3520ec6573bSPavel Belous macsec_add_tx_sa_msg, 3530ec6573bSPavel Belous macsec_get_stats_msg, 3540ec6573bSPavel Belous }; 3550ec6573bSPavel Belous 356*e7750639SAndre Muezerie struct __rte_packed_begin macsec_cfg { 3570ec6573bSPavel Belous uint32_t enabled; 3580ec6573bSPavel Belous uint32_t egress_threshold; 3590ec6573bSPavel Belous uint32_t ingress_threshold; 3600ec6573bSPavel Belous uint32_t interrupts_enabled; 361*e7750639SAndre Muezerie } __rte_packed_end; 3620ec6573bSPavel Belous 363*e7750639SAndre Muezerie struct __rte_packed_begin add_rx_sc { 3640ec6573bSPavel Belous uint32_t index; 3650ec6573bSPavel Belous uint32_t pi; /* Port identifier */ 3660ec6573bSPavel Belous uint32_t sci[2]; /* Secure Channel identifier */ 3670ec6573bSPavel Belous uint32_t sci_mask; /* 1: enable comparison of SCI, 0: don't care */ 3680ec6573bSPavel Belous uint32_t tci; 3690ec6573bSPavel Belous uint32_t tci_mask; 3700ec6573bSPavel Belous uint32_t mac_sa[2]; 3710ec6573bSPavel Belous uint32_t sa_mask; /* 0: ignore mac_sa */ 3720ec6573bSPavel Belous uint32_t mac_da[2]; 3730ec6573bSPavel Belous uint32_t da_mask; /* 0: ignore mac_da */ 3740ec6573bSPavel Belous uint32_t validate_frames; /* 0: strict, 1:check, 2:disabled */ 3750ec6573bSPavel Belous uint32_t replay_protect; /* 1: enabled, 0:disabled */ 3760ec6573bSPavel Belous uint32_t anti_replay_window; /* default 0 */ 3770ec6573bSPavel Belous /* 1: auto_rollover enabled (when SA next_pn is saturated */ 3780ec6573bSPavel Belous uint32_t an_rol; 379*e7750639SAndre Muezerie } __rte_packed_end; 3800ec6573bSPavel Belous 381*e7750639SAndre Muezerie struct __rte_packed_begin add_tx_sc { 3820ec6573bSPavel Belous uint32_t index; 3830ec6573bSPavel Belous uint32_t pi; /* Port identifier */ 3840ec6573bSPavel Belous uint32_t sci[2]; /* Secure Channel identifier */ 3850ec6573bSPavel Belous uint32_t sci_mask; /* 1: enable comparison of SCI, 0: don't care */ 3860ec6573bSPavel Belous uint32_t tci; /* TCI value, used if packet is not explicitly tagged */ 3870ec6573bSPavel Belous uint32_t tci_mask; 3880ec6573bSPavel Belous uint32_t mac_sa[2]; 3890ec6573bSPavel Belous uint32_t sa_mask; /* 0: ignore mac_sa */ 3900ec6573bSPavel Belous uint32_t mac_da[2]; 3910ec6573bSPavel Belous uint32_t da_mask; /* 0: ignore mac_da */ 3920ec6573bSPavel Belous uint32_t protect; 3930ec6573bSPavel Belous uint32_t curr_an; /* SA index which currently used */ 394*e7750639SAndre Muezerie } __rte_packed_end; 3950ec6573bSPavel Belous 396*e7750639SAndre Muezerie struct __rte_packed_begin add_rx_sa { 3970ec6573bSPavel Belous uint32_t index; 3980ec6573bSPavel Belous uint32_t next_pn; 3990ec6573bSPavel Belous uint32_t key[4]; /* 128 bit key */ 400*e7750639SAndre Muezerie } __rte_packed_end; 4010ec6573bSPavel Belous 402*e7750639SAndre Muezerie struct __rte_packed_begin add_tx_sa { 4030ec6573bSPavel Belous uint32_t index; 4040ec6573bSPavel Belous uint32_t next_pn; 4050ec6573bSPavel Belous uint32_t key[4]; /* 128 bit key */ 406*e7750639SAndre Muezerie } __rte_packed_end; 4070ec6573bSPavel Belous 408*e7750639SAndre Muezerie struct __rte_packed_begin get_stats { 4090ec6573bSPavel Belous uint32_t version_only; 4100ec6573bSPavel Belous uint32_t ingress_sa_index; 4110ec6573bSPavel Belous uint32_t egress_sa_index; 4120ec6573bSPavel Belous uint32_t egress_sc_index; 413*e7750639SAndre Muezerie } __rte_packed_end; 4140ec6573bSPavel Belous 415*e7750639SAndre Muezerie struct __rte_packed_begin macsec_stats { 4160ec6573bSPavel Belous uint32_t api_version; 4170ec6573bSPavel Belous /* Ingress Common Counters */ 4180ec6573bSPavel Belous uint64_t in_ctl_pkts; 4190ec6573bSPavel Belous uint64_t in_tagged_miss_pkts; 4200ec6573bSPavel Belous uint64_t in_untagged_miss_pkts; 4210ec6573bSPavel Belous uint64_t in_notag_pkts; 4220ec6573bSPavel Belous uint64_t in_untagged_pkts; 4230ec6573bSPavel Belous uint64_t in_bad_tag_pkts; 4240ec6573bSPavel Belous uint64_t in_no_sci_pkts; 4250ec6573bSPavel Belous uint64_t in_unknown_sci_pkts; 4260ec6573bSPavel Belous uint64_t in_ctrl_prt_pass_pkts; 4270ec6573bSPavel Belous uint64_t in_unctrl_prt_pass_pkts; 4280ec6573bSPavel Belous uint64_t in_ctrl_prt_fail_pkts; 4290ec6573bSPavel Belous uint64_t in_unctrl_prt_fail_pkts; 4300ec6573bSPavel Belous uint64_t in_too_long_pkts; 4310ec6573bSPavel Belous uint64_t in_igpoc_ctl_pkts; 4320ec6573bSPavel Belous uint64_t in_ecc_error_pkts; 4330ec6573bSPavel Belous uint64_t in_unctrl_hit_drop_redir; 4340ec6573bSPavel Belous 4350ec6573bSPavel Belous /* Egress Common Counters */ 4360ec6573bSPavel Belous uint64_t out_ctl_pkts; 4370ec6573bSPavel Belous uint64_t out_unknown_sa_pkts; 4380ec6573bSPavel Belous uint64_t out_untagged_pkts; 4390ec6573bSPavel Belous uint64_t out_too_long; 4400ec6573bSPavel Belous uint64_t out_ecc_error_pkts; 4410ec6573bSPavel Belous uint64_t out_unctrl_hit_drop_redir; 4420ec6573bSPavel Belous 4430ec6573bSPavel Belous /* Ingress SA Counters */ 4440ec6573bSPavel Belous uint64_t in_untagged_hit_pkts; 4450ec6573bSPavel Belous uint64_t in_ctrl_hit_drop_redir_pkts; 4460ec6573bSPavel Belous uint64_t in_not_using_sa; 4470ec6573bSPavel Belous uint64_t in_unused_sa; 4480ec6573bSPavel Belous uint64_t in_not_valid_pkts; 4490ec6573bSPavel Belous uint64_t in_invalid_pkts; 4500ec6573bSPavel Belous uint64_t in_ok_pkts; 4510ec6573bSPavel Belous uint64_t in_late_pkts; 4520ec6573bSPavel Belous uint64_t in_delayed_pkts; 4530ec6573bSPavel Belous uint64_t in_unchecked_pkts; 4540ec6573bSPavel Belous uint64_t in_validated_octets; 4550ec6573bSPavel Belous uint64_t in_decrypted_octets; 4560ec6573bSPavel Belous 4570ec6573bSPavel Belous /* Egress SA Counters */ 4580ec6573bSPavel Belous uint64_t out_sa_hit_drop_redirect; 4590ec6573bSPavel Belous uint64_t out_sa_protected2_pkts; 4600ec6573bSPavel Belous uint64_t out_sa_protected_pkts; 4610ec6573bSPavel Belous uint64_t out_sa_encrypted_pkts; 4620ec6573bSPavel Belous 4630ec6573bSPavel Belous /* Egress SC Counters */ 4640ec6573bSPavel Belous uint64_t out_sc_protected_pkts; 4650ec6573bSPavel Belous uint64_t out_sc_encrypted_pkts; 4660ec6573bSPavel Belous uint64_t out_sc_protected_octets; 4670ec6573bSPavel Belous uint64_t out_sc_encrypted_octets; 4680ec6573bSPavel Belous 4690ec6573bSPavel Belous /* SA Counters expiration info */ 4700ec6573bSPavel Belous uint32_t egress_threshold_expired; 4710ec6573bSPavel Belous uint32_t ingress_threshold_expired; 4720ec6573bSPavel Belous uint32_t egress_expired; 4730ec6573bSPavel Belous uint32_t ingress_expired; 474*e7750639SAndre Muezerie } __rte_packed_end; 4750ec6573bSPavel Belous 476*e7750639SAndre Muezerie struct __rte_packed_begin macsec_msg_fw_request { 4770ec6573bSPavel Belous uint32_t offset; /* not used */ 4780ec6573bSPavel Belous uint32_t msg_type; 4790ec6573bSPavel Belous 4800ec6573bSPavel Belous union { 4810ec6573bSPavel Belous struct macsec_cfg cfg; 4820ec6573bSPavel Belous struct add_rx_sc rxsc; 4830ec6573bSPavel Belous struct add_tx_sc txsc; 4840ec6573bSPavel Belous struct add_rx_sa rxsa; 4850ec6573bSPavel Belous struct add_tx_sa txsa; 4860ec6573bSPavel Belous struct get_stats stats; 4870ec6573bSPavel Belous }; 488*e7750639SAndre Muezerie } __rte_packed_end; 4890ec6573bSPavel Belous 490*e7750639SAndre Muezerie struct __rte_packed_begin macsec_msg_fw_response { 4910ec6573bSPavel Belous uint32_t result; 4920ec6573bSPavel Belous struct macsec_stats stats; 493*e7750639SAndre Muezerie } __rte_packed_end; 4940ec6573bSPavel Belous 49586d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_CHIP_MIPS 0x00000001U 49686d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_CHIP_TPO2 0x00000002U 49786d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_CHIP_RPF2 0x00000004U 49886d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_CHIP_MPI_AQ 0x00000010U 49986d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_CHIP_REVISION_A0 0x01000000U 50086d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_CHIP_REVISION_B0 0x02000000U 50186d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_CHIP_REVISION_B1 0x04000000U 50286d36773SIgor Russkikh 50386d36773SIgor Russkikh 50486d36773SIgor Russkikh #define IS_CHIP_FEATURE(_F_) (HAL_ATLANTIC_UTILS_CHIP_##_F_ & \ 50586d36773SIgor Russkikh self->chip_features) 50686d36773SIgor Russkikh 50786d36773SIgor Russkikh enum hal_atl_utils_fw_state_e { 50886d36773SIgor Russkikh MPI_DEINIT = 0, 50986d36773SIgor Russkikh MPI_RESET = 1, 51086d36773SIgor Russkikh MPI_INIT = 2, 51186d36773SIgor Russkikh MPI_POWER = 4, 51286d36773SIgor Russkikh }; 51386d36773SIgor Russkikh 51486d36773SIgor Russkikh #define HAL_ATLANTIC_RATE_10G BIT(0) 51586d36773SIgor Russkikh #define HAL_ATLANTIC_RATE_5G BIT(1) 51686d36773SIgor Russkikh #define HAL_ATLANTIC_RATE_5GSR BIT(2) 51786d36773SIgor Russkikh #define HAL_ATLANTIC_RATE_2GS BIT(3) 51886d36773SIgor Russkikh #define HAL_ATLANTIC_RATE_1G BIT(4) 51986d36773SIgor Russkikh #define HAL_ATLANTIC_RATE_100M BIT(5) 52086d36773SIgor Russkikh #define HAL_ATLANTIC_RATE_INVALID BIT(6) 52186d36773SIgor Russkikh 52286d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_FW_MSG_PING 1U 52386d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_FW_MSG_ARP 2U 52486d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_FW_MSG_INJECT 3U 52586d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_FW_MSG_WOL_ADD 4U 52686d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_FW_MSG_WOL_DEL 5U 52786d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_FW_MSG_ENABLE_WAKEUP 6U 52886d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_FW_MSG_MSM_PFC 7U 52986d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_FW_MSG_PROVISIONING 8U 53086d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_FW_MSG_OFFLOAD_ADD 9U 53186d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_FW_MSG_OFFLOAD_DEL 10U 53286d36773SIgor Russkikh #define HAL_ATLANTIC_UTILS_FW_MSG_CABLE_DIAG 13U // 0xd 53386d36773SIgor Russkikh 53486d36773SIgor Russkikh #define SMBUS_DEVICE_ID 0x50 53586d36773SIgor Russkikh 53686d36773SIgor Russkikh enum hw_atl_fw2x_caps_lo { 53786d36773SIgor Russkikh CAPS_LO_10BASET_HD = 0x00, 53886d36773SIgor Russkikh CAPS_LO_10BASET_FD, 53986d36773SIgor Russkikh CAPS_LO_100BASETX_HD, 54086d36773SIgor Russkikh CAPS_LO_100BASET4_HD, 54186d36773SIgor Russkikh CAPS_LO_100BASET2_HD, 54286d36773SIgor Russkikh CAPS_LO_100BASETX_FD, 54386d36773SIgor Russkikh CAPS_LO_100BASET2_FD, 54486d36773SIgor Russkikh CAPS_LO_1000BASET_HD, 54586d36773SIgor Russkikh CAPS_LO_1000BASET_FD, 54686d36773SIgor Russkikh CAPS_LO_2P5GBASET_FD, 54786d36773SIgor Russkikh CAPS_LO_5GBASET_FD, 54886d36773SIgor Russkikh CAPS_LO_10GBASET_FD, 549f73061d5SPavel Belous CAPS_LO_AUTONEG, 550f73061d5SPavel Belous CAPS_LO_SMBUS_READ, 551f73061d5SPavel Belous CAPS_LO_SMBUS_WRITE, 552f73061d5SPavel Belous CAPS_LO_MACSEC 55386d36773SIgor Russkikh }; 55486d36773SIgor Russkikh 55586d36773SIgor Russkikh enum hw_atl_fw2x_caps_hi { 55686d36773SIgor Russkikh CAPS_HI_RESERVED1 = 0x00, 55786d36773SIgor Russkikh CAPS_HI_10BASET_EEE, 55886d36773SIgor Russkikh CAPS_HI_RESERVED2, 55986d36773SIgor Russkikh CAPS_HI_PAUSE, 56086d36773SIgor Russkikh CAPS_HI_ASYMMETRIC_PAUSE, 56186d36773SIgor Russkikh CAPS_HI_100BASETX_EEE, 56286d36773SIgor Russkikh CAPS_HI_RESERVED3, 56386d36773SIgor Russkikh CAPS_HI_RESERVED4, 56486d36773SIgor Russkikh CAPS_HI_1000BASET_FD_EEE, 56586d36773SIgor Russkikh CAPS_HI_2P5GBASET_FD_EEE, 56686d36773SIgor Russkikh CAPS_HI_5GBASET_FD_EEE, 56786d36773SIgor Russkikh CAPS_HI_10GBASET_FD_EEE, 56886d36773SIgor Russkikh CAPS_HI_RESERVED5, 56986d36773SIgor Russkikh CAPS_HI_RESERVED6, 57086d36773SIgor Russkikh CAPS_HI_RESERVED7, 57186d36773SIgor Russkikh CAPS_HI_RESERVED8, 57286d36773SIgor Russkikh CAPS_HI_RESERVED9, 57386d36773SIgor Russkikh CAPS_HI_CABLE_DIAG, 57486d36773SIgor Russkikh CAPS_HI_TEMPERATURE, 57586d36773SIgor Russkikh CAPS_HI_DOWNSHIFT, 57686d36773SIgor Russkikh CAPS_HI_PTP_AVB_EN, 57786d36773SIgor Russkikh CAPS_HI_MEDIA_DETECT, 57886d36773SIgor Russkikh CAPS_HI_LINK_DROP, 57986d36773SIgor Russkikh CAPS_HI_SLEEP_PROXY, 58086d36773SIgor Russkikh CAPS_HI_WOL, 58186d36773SIgor Russkikh CAPS_HI_MAC_STOP, 58286d36773SIgor Russkikh CAPS_HI_EXT_LOOPBACK, 58386d36773SIgor Russkikh CAPS_HI_INT_LOOPBACK, 58486d36773SIgor Russkikh CAPS_HI_EFUSE_AGENT, 58586d36773SIgor Russkikh CAPS_HI_WOL_TIMER, 58686d36773SIgor Russkikh CAPS_HI_STATISTICS, 58786d36773SIgor Russkikh CAPS_HI_TRANSACTION_ID, 58886d36773SIgor Russkikh }; 58986d36773SIgor Russkikh 590f73061d5SPavel Belous enum hw_atl_fw2x_rate { 591f73061d5SPavel Belous FW2X_RATE_100M = BIT(CAPS_LO_100BASETX_FD), 592f73061d5SPavel Belous FW2X_RATE_1G = BIT(CAPS_LO_1000BASET_FD), 593f73061d5SPavel Belous FW2X_RATE_2G5 = BIT(CAPS_LO_2P5GBASET_FD), 594f73061d5SPavel Belous FW2X_RATE_5G = BIT(CAPS_LO_5GBASET_FD), 595f73061d5SPavel Belous FW2X_RATE_10G = BIT(CAPS_LO_10GBASET_FD), 596f73061d5SPavel Belous }; 597f73061d5SPavel Belous 59886d36773SIgor Russkikh struct aq_hw_s; 59986d36773SIgor Russkikh struct aq_fw_ops; 60086d36773SIgor Russkikh struct aq_hw_link_status_s; 60186d36773SIgor Russkikh 60286d36773SIgor Russkikh int hw_atl_utils_initfw(struct aq_hw_s *self, const struct aq_fw_ops **fw_ops); 60386d36773SIgor Russkikh 60486d36773SIgor Russkikh int hw_atl_utils_soft_reset(struct aq_hw_s *self); 60586d36773SIgor Russkikh 60686d36773SIgor Russkikh void hw_atl_utils_hw_chip_features_init(struct aq_hw_s *self, u32 *p); 60786d36773SIgor Russkikh 60886d36773SIgor Russkikh int hw_atl_utils_mpi_read_mbox(struct aq_hw_s *self, 60986d36773SIgor Russkikh struct hw_aq_atl_utils_mbox_header *pmbox); 61086d36773SIgor Russkikh 61186d36773SIgor Russkikh void hw_atl_utils_mpi_read_stats(struct aq_hw_s *self, 61286d36773SIgor Russkikh struct hw_aq_atl_utils_mbox *pmbox); 61386d36773SIgor Russkikh 61486d36773SIgor Russkikh void hw_atl_utils_mpi_set(struct aq_hw_s *self, 61586d36773SIgor Russkikh enum hal_atl_utils_fw_state_e state, 61686d36773SIgor Russkikh u32 speed); 61786d36773SIgor Russkikh 61886d36773SIgor Russkikh int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self); 61986d36773SIgor Russkikh 62086d36773SIgor Russkikh unsigned int hw_atl_utils_mbps_2_speed_index(unsigned int mbps); 62186d36773SIgor Russkikh 62286d36773SIgor Russkikh unsigned int hw_atl_utils_hw_get_reg_length(void); 62386d36773SIgor Russkikh 62486d36773SIgor Russkikh int hw_atl_utils_hw_get_regs(struct aq_hw_s *self, 62586d36773SIgor Russkikh u32 *regs_buff); 62686d36773SIgor Russkikh 62786d36773SIgor Russkikh int hw_atl_utils_hw_set_power(struct aq_hw_s *self, 62886d36773SIgor Russkikh unsigned int power_state); 62986d36773SIgor Russkikh 63086d36773SIgor Russkikh int hw_atl_utils_hw_deinit(struct aq_hw_s *self); 63186d36773SIgor Russkikh 63286d36773SIgor Russkikh int hw_atl_utils_get_fw_version(struct aq_hw_s *self, u32 *fw_version); 63386d36773SIgor Russkikh 63486d36773SIgor Russkikh int hw_atl_utils_update_stats(struct aq_hw_s *self); 63586d36773SIgor Russkikh 63686d36773SIgor Russkikh struct aq_stats_s *hw_atl_utils_get_hw_stats(struct aq_hw_s *self); 63786d36773SIgor Russkikh 63886d36773SIgor Russkikh int hw_atl_utils_fw_downld_dwords(struct aq_hw_s *self, u32 a, 63986d36773SIgor Russkikh u32 *p, u32 cnt); 64086d36773SIgor Russkikh 64186d36773SIgor Russkikh int hw_atl_utils_fw_upload_dwords(struct aq_hw_s *self, u32 a, u32 *p, 64286d36773SIgor Russkikh u32 cnt); 64386d36773SIgor Russkikh 64486d36773SIgor Russkikh int hw_atl_utils_fw_set_wol(struct aq_hw_s *self, bool wol_enabled, u8 *mac); 64586d36773SIgor Russkikh 64686d36773SIgor Russkikh int hw_atl_utils_fw_rpc_call(struct aq_hw_s *self, unsigned int rpc_size); 64786d36773SIgor Russkikh 64886d36773SIgor Russkikh int hw_atl_utils_fw_rpc_wait(struct aq_hw_s *self, 64986d36773SIgor Russkikh struct hw_aq_atl_utils_fw_rpc **rpc); 65086d36773SIgor Russkikh 65186d36773SIgor Russkikh extern const struct aq_fw_ops aq_fw_1x_ops; 65286d36773SIgor Russkikh extern const struct aq_fw_ops aq_fw_2x_ops; 65386d36773SIgor Russkikh 65486d36773SIgor Russkikh #endif /* HW_ATL_UTILS_H */ 655