15e111ed8SAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause 25e111ed8SAndrew Rybchenko * 3672386c1SAndrew Rybchenko * Copyright(c) 2019-2021 Xilinx, Inc. 45e111ed8SAndrew Rybchenko * Copyright(c) 2007-2019 Solarflare Communications Inc. 55e111ed8SAndrew Rybchenko */ 65e111ed8SAndrew Rybchenko 75e111ed8SAndrew Rybchenko #ifndef _SYS_EFX_IMPL_H 85e111ed8SAndrew Rybchenko #define _SYS_EFX_IMPL_H 95e111ed8SAndrew Rybchenko 105e111ed8SAndrew Rybchenko #include "efx.h" 115e111ed8SAndrew Rybchenko #include "efx_regs.h" 125e111ed8SAndrew Rybchenko #include "efx_regs_ef10.h" 134d80109cSAndrew Rybchenko #include "efx_regs_ef100.h" 145e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 155e111ed8SAndrew Rybchenko #include "efx_mcdi.h" 165e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 175e111ed8SAndrew Rybchenko 185e111ed8SAndrew Rybchenko /* FIXME: Add definition for driver generated software events */ 195e111ed8SAndrew Rybchenko #ifndef ESE_DZ_EV_CODE_DRV_GEN_EV 205e111ed8SAndrew Rybchenko #define ESE_DZ_EV_CODE_DRV_GEN_EV FSE_AZ_EV_CODE_DRV_GEN_EV 215e111ed8SAndrew Rybchenko #endif 225e111ed8SAndrew Rybchenko 235e111ed8SAndrew Rybchenko 245e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 255e111ed8SAndrew Rybchenko #include "siena_impl.h" 265e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 275e111ed8SAndrew Rybchenko 285e111ed8SAndrew Rybchenko #if EFSYS_OPT_HUNTINGTON 295e111ed8SAndrew Rybchenko #include "hunt_impl.h" 305e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_HUNTINGTON */ 315e111ed8SAndrew Rybchenko 325e111ed8SAndrew Rybchenko #if EFSYS_OPT_MEDFORD 335e111ed8SAndrew Rybchenko #include "medford_impl.h" 345e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MEDFORD */ 355e111ed8SAndrew Rybchenko 365e111ed8SAndrew Rybchenko #if EFSYS_OPT_MEDFORD2 375e111ed8SAndrew Rybchenko #include "medford2_impl.h" 385e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MEDFORD2 */ 395e111ed8SAndrew Rybchenko 409b5b182dSAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 415e111ed8SAndrew Rybchenko #include "ef10_impl.h" 429b5b182dSAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 435e111ed8SAndrew Rybchenko 443c1c5cc4SAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD 453c1c5cc4SAndrew Rybchenko #include "rhead_impl.h" 463c1c5cc4SAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD */ 473c1c5cc4SAndrew Rybchenko 485e111ed8SAndrew Rybchenko #ifdef __cplusplus 495e111ed8SAndrew Rybchenko extern "C" { 505e111ed8SAndrew Rybchenko #endif 515e111ed8SAndrew Rybchenko 525e111ed8SAndrew Rybchenko #define EFX_MOD_MCDI 0x00000001 535e111ed8SAndrew Rybchenko #define EFX_MOD_PROBE 0x00000002 545e111ed8SAndrew Rybchenko #define EFX_MOD_NVRAM 0x00000004 555e111ed8SAndrew Rybchenko #define EFX_MOD_VPD 0x00000008 565e111ed8SAndrew Rybchenko #define EFX_MOD_NIC 0x00000010 575e111ed8SAndrew Rybchenko #define EFX_MOD_INTR 0x00000020 585e111ed8SAndrew Rybchenko #define EFX_MOD_EV 0x00000040 595e111ed8SAndrew Rybchenko #define EFX_MOD_RX 0x00000080 605e111ed8SAndrew Rybchenko #define EFX_MOD_TX 0x00000100 615e111ed8SAndrew Rybchenko #define EFX_MOD_PORT 0x00000200 625e111ed8SAndrew Rybchenko #define EFX_MOD_MON 0x00000400 635e111ed8SAndrew Rybchenko #define EFX_MOD_FILTER 0x00001000 645e111ed8SAndrew Rybchenko #define EFX_MOD_LIC 0x00002000 655e111ed8SAndrew Rybchenko #define EFX_MOD_TUNNEL 0x00004000 665e111ed8SAndrew Rybchenko #define EFX_MOD_EVB 0x00008000 675e111ed8SAndrew Rybchenko #define EFX_MOD_PROXY 0x00010000 684dda72dbSVijay Srivastava #define EFX_MOD_VIRTIO 0x00020000 695e111ed8SAndrew Rybchenko 705e111ed8SAndrew Rybchenko #define EFX_RESET_PHY 0x00000001 715e111ed8SAndrew Rybchenko #define EFX_RESET_RXQ_ERR 0x00000002 725e111ed8SAndrew Rybchenko #define EFX_RESET_TXQ_ERR 0x00000004 735e111ed8SAndrew Rybchenko #define EFX_RESET_HW_UNAVAIL 0x00000008 745e111ed8SAndrew Rybchenko 755e111ed8SAndrew Rybchenko typedef enum efx_mac_type_e { 765e111ed8SAndrew Rybchenko EFX_MAC_INVALID = 0, 775e111ed8SAndrew Rybchenko EFX_MAC_SIENA, 785e111ed8SAndrew Rybchenko EFX_MAC_HUNTINGTON, 795e111ed8SAndrew Rybchenko EFX_MAC_MEDFORD, 805e111ed8SAndrew Rybchenko EFX_MAC_MEDFORD2, 81de0d268fSAndrew Rybchenko EFX_MAC_RIVERHEAD, 825e111ed8SAndrew Rybchenko EFX_MAC_NTYPES 835e111ed8SAndrew Rybchenko } efx_mac_type_t; 845e111ed8SAndrew Rybchenko 855e111ed8SAndrew Rybchenko typedef struct efx_ev_ops_s { 865e111ed8SAndrew Rybchenko efx_rc_t (*eevo_init)(efx_nic_t *); 875e111ed8SAndrew Rybchenko void (*eevo_fini)(efx_nic_t *); 885e111ed8SAndrew Rybchenko efx_rc_t (*eevo_qcreate)(efx_nic_t *, unsigned int, 895e111ed8SAndrew Rybchenko efsys_mem_t *, size_t, uint32_t, 90aa6dc101SAndrew Rybchenko uint32_t, uint32_t, uint32_t, 91aa6dc101SAndrew Rybchenko efx_evq_t *); 925e111ed8SAndrew Rybchenko void (*eevo_qdestroy)(efx_evq_t *); 935e111ed8SAndrew Rybchenko efx_rc_t (*eevo_qprime)(efx_evq_t *, unsigned int); 945e111ed8SAndrew Rybchenko void (*eevo_qpost)(efx_evq_t *, uint16_t); 95ad1e3ed8SAndrew Rybchenko void (*eevo_qpoll)(efx_evq_t *, unsigned int *, 96ad1e3ed8SAndrew Rybchenko const efx_ev_callbacks_t *, void *); 975e111ed8SAndrew Rybchenko efx_rc_t (*eevo_qmoderate)(efx_evq_t *, unsigned int); 985e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 995e111ed8SAndrew Rybchenko void (*eevo_qstats_update)(efx_evq_t *, efsys_stat_t *); 1005e111ed8SAndrew Rybchenko #endif 1015e111ed8SAndrew Rybchenko } efx_ev_ops_t; 1025e111ed8SAndrew Rybchenko 1035e111ed8SAndrew Rybchenko typedef struct efx_tx_ops_s { 1045e111ed8SAndrew Rybchenko efx_rc_t (*etxo_init)(efx_nic_t *); 1055e111ed8SAndrew Rybchenko void (*etxo_fini)(efx_nic_t *); 1065e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qcreate)(efx_nic_t *, 1075e111ed8SAndrew Rybchenko unsigned int, unsigned int, 1085e111ed8SAndrew Rybchenko efsys_mem_t *, size_t, 1095e111ed8SAndrew Rybchenko uint32_t, uint16_t, 1105e111ed8SAndrew Rybchenko efx_evq_t *, efx_txq_t *, 1115e111ed8SAndrew Rybchenko unsigned int *); 1125e111ed8SAndrew Rybchenko void (*etxo_qdestroy)(efx_txq_t *); 1135e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpost)(efx_txq_t *, efx_buffer_t *, 1145e111ed8SAndrew Rybchenko unsigned int, unsigned int, 1155e111ed8SAndrew Rybchenko unsigned int *); 1165e111ed8SAndrew Rybchenko void (*etxo_qpush)(efx_txq_t *, unsigned int, unsigned int); 1175e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpace)(efx_txq_t *, unsigned int); 1185e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qflush)(efx_txq_t *); 1195e111ed8SAndrew Rybchenko void (*etxo_qenable)(efx_txq_t *); 1205e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpio_enable)(efx_txq_t *); 1215e111ed8SAndrew Rybchenko void (*etxo_qpio_disable)(efx_txq_t *); 1225e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpio_write)(efx_txq_t *, uint8_t *, size_t, 1235e111ed8SAndrew Rybchenko size_t); 1245e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpio_post)(efx_txq_t *, size_t, unsigned int, 1255e111ed8SAndrew Rybchenko unsigned int *); 1265e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qdesc_post)(efx_txq_t *, efx_desc_t *, 1275e111ed8SAndrew Rybchenko unsigned int, unsigned int, 1285e111ed8SAndrew Rybchenko unsigned int *); 1295e111ed8SAndrew Rybchenko void (*etxo_qdesc_dma_create)(efx_txq_t *, efsys_dma_addr_t, 1305e111ed8SAndrew Rybchenko size_t, boolean_t, 1315e111ed8SAndrew Rybchenko efx_desc_t *); 1325e111ed8SAndrew Rybchenko void (*etxo_qdesc_tso_create)(efx_txq_t *, uint16_t, 1335e111ed8SAndrew Rybchenko uint32_t, uint8_t, 1345e111ed8SAndrew Rybchenko efx_desc_t *); 1355e111ed8SAndrew Rybchenko void (*etxo_qdesc_tso2_create)(efx_txq_t *, uint16_t, 1365e111ed8SAndrew Rybchenko uint16_t, uint32_t, uint16_t, 1375e111ed8SAndrew Rybchenko efx_desc_t *, int); 1385e111ed8SAndrew Rybchenko void (*etxo_qdesc_vlantci_create)(efx_txq_t *, uint16_t, 1395e111ed8SAndrew Rybchenko efx_desc_t *); 1405e111ed8SAndrew Rybchenko void (*etxo_qdesc_checksum_create)(efx_txq_t *, uint16_t, 1415e111ed8SAndrew Rybchenko efx_desc_t *); 1425e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 1435e111ed8SAndrew Rybchenko void (*etxo_qstats_update)(efx_txq_t *, 1445e111ed8SAndrew Rybchenko efsys_stat_t *); 1455e111ed8SAndrew Rybchenko #endif 1465e111ed8SAndrew Rybchenko } efx_tx_ops_t; 1475e111ed8SAndrew Rybchenko 1485e111ed8SAndrew Rybchenko typedef union efx_rxq_type_data_u { 1495e111ed8SAndrew Rybchenko struct { 1505e111ed8SAndrew Rybchenko size_t ed_buf_size; 1515e111ed8SAndrew Rybchenko } ertd_default; 1525e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM 1535e111ed8SAndrew Rybchenko struct { 1545e111ed8SAndrew Rybchenko uint32_t eps_buf_size; 1555e111ed8SAndrew Rybchenko } ertd_packed_stream; 1565e111ed8SAndrew Rybchenko #endif 1575e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_ES_SUPER_BUFFER 1585e111ed8SAndrew Rybchenko struct { 1595e111ed8SAndrew Rybchenko uint32_t eessb_bufs_per_desc; 1605e111ed8SAndrew Rybchenko uint32_t eessb_max_dma_len; 1615e111ed8SAndrew Rybchenko uint32_t eessb_buf_stride; 1625e111ed8SAndrew Rybchenko uint32_t eessb_hol_block_timeout; 1635e111ed8SAndrew Rybchenko } ertd_es_super_buffer; 1645e111ed8SAndrew Rybchenko #endif 1655e111ed8SAndrew Rybchenko } efx_rxq_type_data_t; 1665e111ed8SAndrew Rybchenko 1675e111ed8SAndrew Rybchenko typedef struct efx_rx_ops_s { 1685e111ed8SAndrew Rybchenko efx_rc_t (*erxo_init)(efx_nic_t *); 1695e111ed8SAndrew Rybchenko void (*erxo_fini)(efx_nic_t *); 1705e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_SCATTER 1715e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scatter_enable)(efx_nic_t *, unsigned int); 1725e111ed8SAndrew Rybchenko #endif 1735e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_SCALE 1745e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_context_alloc)(efx_nic_t *, 1755e111ed8SAndrew Rybchenko efx_rx_scale_context_type_t, 176e7ea5f30SIvan Malov uint32_t, uint32_t, 177e7ea5f30SIvan Malov uint32_t *); 1785e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_context_free)(efx_nic_t *, uint32_t); 1795e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_mode_set)(efx_nic_t *, uint32_t, 1805e111ed8SAndrew Rybchenko efx_rx_hash_alg_t, 1815e111ed8SAndrew Rybchenko efx_rx_hash_type_t, boolean_t); 1825e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_key_set)(efx_nic_t *, uint32_t, 1835e111ed8SAndrew Rybchenko uint8_t *, size_t); 1845e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_tbl_set)(efx_nic_t *, uint32_t, 1855e111ed8SAndrew Rybchenko unsigned int *, size_t); 1865e111ed8SAndrew Rybchenko uint32_t (*erxo_prefix_hash)(efx_nic_t *, efx_rx_hash_alg_t, 1875e111ed8SAndrew Rybchenko uint8_t *); 1885e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_RX_SCALE */ 1895e111ed8SAndrew Rybchenko efx_rc_t (*erxo_prefix_pktlen)(efx_nic_t *, uint8_t *, 1905e111ed8SAndrew Rybchenko uint16_t *); 1915e111ed8SAndrew Rybchenko void (*erxo_qpost)(efx_rxq_t *, efsys_dma_addr_t *, size_t, 1925e111ed8SAndrew Rybchenko unsigned int, unsigned int, 1935e111ed8SAndrew Rybchenko unsigned int); 1945e111ed8SAndrew Rybchenko void (*erxo_qpush)(efx_rxq_t *, unsigned int, unsigned int *); 1955e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM 1965e111ed8SAndrew Rybchenko void (*erxo_qpush_ps_credits)(efx_rxq_t *); 1975e111ed8SAndrew Rybchenko uint8_t * (*erxo_qps_packet_info)(efx_rxq_t *, uint8_t *, 1985e111ed8SAndrew Rybchenko uint32_t, uint32_t, 1995e111ed8SAndrew Rybchenko uint16_t *, uint32_t *, uint32_t *); 2005e111ed8SAndrew Rybchenko #endif 2015e111ed8SAndrew Rybchenko efx_rc_t (*erxo_qflush)(efx_rxq_t *); 2025e111ed8SAndrew Rybchenko void (*erxo_qenable)(efx_rxq_t *); 2035e111ed8SAndrew Rybchenko efx_rc_t (*erxo_qcreate)(efx_nic_t *enp, unsigned int, 2045e111ed8SAndrew Rybchenko unsigned int, efx_rxq_type_t, 2055e111ed8SAndrew Rybchenko const efx_rxq_type_data_t *, 2065e111ed8SAndrew Rybchenko efsys_mem_t *, size_t, uint32_t, 2075e111ed8SAndrew Rybchenko unsigned int, 2085e111ed8SAndrew Rybchenko efx_evq_t *, efx_rxq_t *); 2095e111ed8SAndrew Rybchenko void (*erxo_qdestroy)(efx_rxq_t *); 2105e111ed8SAndrew Rybchenko } efx_rx_ops_t; 2115e111ed8SAndrew Rybchenko 2125e111ed8SAndrew Rybchenko typedef struct efx_mac_ops_s { 2135e111ed8SAndrew Rybchenko efx_rc_t (*emo_poll)(efx_nic_t *, efx_link_mode_t *); 2145e111ed8SAndrew Rybchenko efx_rc_t (*emo_up)(efx_nic_t *, boolean_t *); 2155e111ed8SAndrew Rybchenko efx_rc_t (*emo_addr_set)(efx_nic_t *); 2165e111ed8SAndrew Rybchenko efx_rc_t (*emo_pdu_set)(efx_nic_t *); 2175e111ed8SAndrew Rybchenko efx_rc_t (*emo_pdu_get)(efx_nic_t *, size_t *); 2185e111ed8SAndrew Rybchenko efx_rc_t (*emo_reconfigure)(efx_nic_t *); 2195e111ed8SAndrew Rybchenko efx_rc_t (*emo_multicast_list_set)(efx_nic_t *); 2205e111ed8SAndrew Rybchenko efx_rc_t (*emo_filter_default_rxq_set)(efx_nic_t *, 2215e111ed8SAndrew Rybchenko efx_rxq_t *, boolean_t); 2225e111ed8SAndrew Rybchenko void (*emo_filter_default_rxq_clear)(efx_nic_t *); 2235e111ed8SAndrew Rybchenko #if EFSYS_OPT_LOOPBACK 2245e111ed8SAndrew Rybchenko efx_rc_t (*emo_loopback_set)(efx_nic_t *, efx_link_mode_t, 2255e111ed8SAndrew Rybchenko efx_loopback_type_t); 2265e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_LOOPBACK */ 2275e111ed8SAndrew Rybchenko #if EFSYS_OPT_MAC_STATS 2285e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_get_mask)(efx_nic_t *, uint32_t *, size_t); 2295e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_clear)(efx_nic_t *); 2305e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_upload)(efx_nic_t *, efsys_mem_t *); 2315e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_periodic)(efx_nic_t *, efsys_mem_t *, 2325e111ed8SAndrew Rybchenko uint16_t, boolean_t); 2335e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 2345e111ed8SAndrew Rybchenko efsys_stat_t *, uint32_t *); 2355e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MAC_STATS */ 2365e111ed8SAndrew Rybchenko } efx_mac_ops_t; 2375e111ed8SAndrew Rybchenko 2385e111ed8SAndrew Rybchenko typedef struct efx_phy_ops_s { 2395e111ed8SAndrew Rybchenko efx_rc_t (*epo_power)(efx_nic_t *, boolean_t); /* optional */ 2405e111ed8SAndrew Rybchenko efx_rc_t (*epo_reset)(efx_nic_t *); 2415e111ed8SAndrew Rybchenko efx_rc_t (*epo_reconfigure)(efx_nic_t *); 2425e111ed8SAndrew Rybchenko efx_rc_t (*epo_verify)(efx_nic_t *); 2435e111ed8SAndrew Rybchenko efx_rc_t (*epo_oui_get)(efx_nic_t *, uint32_t *); 2445e111ed8SAndrew Rybchenko efx_rc_t (*epo_link_state_get)(efx_nic_t *, efx_phy_link_state_t *); 2455e111ed8SAndrew Rybchenko #if EFSYS_OPT_PHY_STATS 2465e111ed8SAndrew Rybchenko efx_rc_t (*epo_stats_update)(efx_nic_t *, efsys_mem_t *, 2475e111ed8SAndrew Rybchenko uint32_t *); 2485e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_PHY_STATS */ 2495e111ed8SAndrew Rybchenko #if EFSYS_OPT_BIST 2505e111ed8SAndrew Rybchenko efx_rc_t (*epo_bist_enable_offline)(efx_nic_t *); 2515e111ed8SAndrew Rybchenko efx_rc_t (*epo_bist_start)(efx_nic_t *, efx_bist_type_t); 2525e111ed8SAndrew Rybchenko efx_rc_t (*epo_bist_poll)(efx_nic_t *, efx_bist_type_t, 2535e111ed8SAndrew Rybchenko efx_bist_result_t *, uint32_t *, 2545e111ed8SAndrew Rybchenko unsigned long *, size_t); 2555e111ed8SAndrew Rybchenko void (*epo_bist_stop)(efx_nic_t *, efx_bist_type_t); 2565e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_BIST */ 2575e111ed8SAndrew Rybchenko } efx_phy_ops_t; 2585e111ed8SAndrew Rybchenko 2595e111ed8SAndrew Rybchenko #if EFSYS_OPT_FILTER 2605e111ed8SAndrew Rybchenko 2615e111ed8SAndrew Rybchenko /* 2625e111ed8SAndrew Rybchenko * Policy for replacing existing filter when inserting a new one. 2635e111ed8SAndrew Rybchenko * Note that all policies allow for storing the new lower priority 2645e111ed8SAndrew Rybchenko * filters as overridden by existing higher priority ones. It is needed 2655e111ed8SAndrew Rybchenko * to restore the lower priority filters on higher priority ones removal. 2665e111ed8SAndrew Rybchenko */ 2675e111ed8SAndrew Rybchenko typedef enum efx_filter_replacement_policy_e { 2685e111ed8SAndrew Rybchenko /* Cannot replace existing filter */ 2695e111ed8SAndrew Rybchenko EFX_FILTER_REPLACEMENT_NEVER, 2705e111ed8SAndrew Rybchenko /* Higher priority filters can replace lower priotiry ones */ 2715e111ed8SAndrew Rybchenko EFX_FILTER_REPLACEMENT_HIGHER_PRIORITY, 2725e111ed8SAndrew Rybchenko /* 2735e111ed8SAndrew Rybchenko * Higher priority filters can replace lower priority ones and 2745e111ed8SAndrew Rybchenko * equal priority filters can replace each other. 2755e111ed8SAndrew Rybchenko */ 2765e111ed8SAndrew Rybchenko EFX_FILTER_REPLACEMENT_HIGHER_OR_EQUAL_PRIORITY, 2775e111ed8SAndrew Rybchenko } efx_filter_replacement_policy_t; 2785e111ed8SAndrew Rybchenko 2795e111ed8SAndrew Rybchenko typedef struct efx_filter_ops_s { 2805e111ed8SAndrew Rybchenko efx_rc_t (*efo_init)(efx_nic_t *); 2815e111ed8SAndrew Rybchenko void (*efo_fini)(efx_nic_t *); 2825e111ed8SAndrew Rybchenko efx_rc_t (*efo_restore)(efx_nic_t *); 2835e111ed8SAndrew Rybchenko efx_rc_t (*efo_add)(efx_nic_t *, efx_filter_spec_t *, 2845e111ed8SAndrew Rybchenko efx_filter_replacement_policy_t policy); 2855e111ed8SAndrew Rybchenko efx_rc_t (*efo_delete)(efx_nic_t *, efx_filter_spec_t *); 2865e111ed8SAndrew Rybchenko efx_rc_t (*efo_supported_filters)(efx_nic_t *, uint32_t *, 2875e111ed8SAndrew Rybchenko size_t, size_t *); 2885e111ed8SAndrew Rybchenko efx_rc_t (*efo_reconfigure)(efx_nic_t *, uint8_t const *, boolean_t, 2895e111ed8SAndrew Rybchenko boolean_t, boolean_t, boolean_t, 2905e111ed8SAndrew Rybchenko uint8_t const *, uint32_t); 29135876819SArtemii Morozov efx_rc_t (*efo_get_count)(efx_nic_t *, uint32_t *); 2925e111ed8SAndrew Rybchenko } efx_filter_ops_t; 2935e111ed8SAndrew Rybchenko 2945e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2955e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2965e111ed8SAndrew Rybchenko efx_filter_reconfigure( 2975e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2985e111ed8SAndrew Rybchenko __in_ecount(6) uint8_t const *mac_addr, 2995e111ed8SAndrew Rybchenko __in boolean_t all_unicst, 3005e111ed8SAndrew Rybchenko __in boolean_t mulcst, 3015e111ed8SAndrew Rybchenko __in boolean_t all_mulcst, 3025e111ed8SAndrew Rybchenko __in boolean_t brdcst, 3035e111ed8SAndrew Rybchenko __in_ecount(6*count) uint8_t const *addrs, 3045e111ed8SAndrew Rybchenko __in uint32_t count); 3055e111ed8SAndrew Rybchenko 30635876819SArtemii Morozov LIBEFX_INTERNAL 30735876819SArtemii Morozov extern __checkReturn efx_rc_t 30835876819SArtemii Morozov efx_filter_get_count( 30935876819SArtemii Morozov __in efx_nic_t *enp, 31035876819SArtemii Morozov __out uint32_t *countp); 31135876819SArtemii Morozov 3125e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_FILTER */ 3135e111ed8SAndrew Rybchenko 3145e111ed8SAndrew Rybchenko #if EFSYS_OPT_TUNNEL 3155e111ed8SAndrew Rybchenko typedef struct efx_tunnel_ops_s { 3165e111ed8SAndrew Rybchenko efx_rc_t (*eto_reconfigure)(efx_nic_t *); 3174dda992fSIgor Romanov void (*eto_fini)(efx_nic_t *); 3185e111ed8SAndrew Rybchenko } efx_tunnel_ops_t; 3195e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_TUNNEL */ 3205e111ed8SAndrew Rybchenko 3214dda72dbSVijay Srivastava #if EFSYS_OPT_VIRTIO 3224dda72dbSVijay Srivastava typedef struct efx_virtio_ops_s { 3234dda72dbSVijay Srivastava efx_rc_t (*evo_virtio_qstart)(efx_virtio_vq_t *, 3244dda72dbSVijay Srivastava efx_virtio_vq_cfg_t *, 3254dda72dbSVijay Srivastava efx_virtio_vq_dyncfg_t *); 3264dda72dbSVijay Srivastava efx_rc_t (*evo_virtio_qstop)(efx_virtio_vq_t *, 3274dda72dbSVijay Srivastava efx_virtio_vq_dyncfg_t *); 328ec03ce69SVijay Srivastava efx_rc_t (*evo_get_doorbell_offset)(efx_virtio_vq_t *, 329ec03ce69SVijay Srivastava uint32_t *); 33046d2b38bSVijay Kumar Srivastava efx_rc_t (*evo_get_features)(efx_nic_t *, 33146d2b38bSVijay Kumar Srivastava efx_virtio_device_type_t, uint64_t *); 332b8a896abSVijay Kumar Srivastava efx_rc_t (*evo_verify_features)(efx_nic_t *, 333b8a896abSVijay Kumar Srivastava efx_virtio_device_type_t, uint64_t); 3344dda72dbSVijay Srivastava } efx_virtio_ops_t; 3354dda72dbSVijay Srivastava #endif /* EFSYS_OPT_VIRTIO */ 3364dda72dbSVijay Srivastava 3375e111ed8SAndrew Rybchenko typedef struct efx_port_s { 3385e111ed8SAndrew Rybchenko efx_mac_type_t ep_mac_type; 3395e111ed8SAndrew Rybchenko uint32_t ep_phy_type; 3405e111ed8SAndrew Rybchenko uint8_t ep_port; 3415e111ed8SAndrew Rybchenko uint32_t ep_mac_pdu; 3425e111ed8SAndrew Rybchenko uint8_t ep_mac_addr[6]; 3435e111ed8SAndrew Rybchenko efx_link_mode_t ep_link_mode; 3445e111ed8SAndrew Rybchenko boolean_t ep_all_unicst; 3455e111ed8SAndrew Rybchenko boolean_t ep_all_unicst_inserted; 3465e111ed8SAndrew Rybchenko boolean_t ep_mulcst; 3475e111ed8SAndrew Rybchenko boolean_t ep_all_mulcst; 3485e111ed8SAndrew Rybchenko boolean_t ep_all_mulcst_inserted; 3495e111ed8SAndrew Rybchenko boolean_t ep_brdcst; 3505e111ed8SAndrew Rybchenko unsigned int ep_fcntl; 3515e111ed8SAndrew Rybchenko boolean_t ep_fcntl_autoneg; 3525e111ed8SAndrew Rybchenko efx_oword_t ep_multicst_hash[2]; 3535e111ed8SAndrew Rybchenko uint8_t ep_mulcst_addr_list[EFX_MAC_ADDR_LEN * 3545e111ed8SAndrew Rybchenko EFX_MAC_MULTICAST_LIST_MAX]; 3555e111ed8SAndrew Rybchenko uint32_t ep_mulcst_addr_count; 3565e111ed8SAndrew Rybchenko #if EFSYS_OPT_LOOPBACK 3575e111ed8SAndrew Rybchenko efx_loopback_type_t ep_loopback_type; 3585e111ed8SAndrew Rybchenko efx_link_mode_t ep_loopback_link_mode; 3595e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_LOOPBACK */ 3605e111ed8SAndrew Rybchenko #if EFSYS_OPT_PHY_FLAGS 3615e111ed8SAndrew Rybchenko uint32_t ep_phy_flags; 3625e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_PHY_FLAGS */ 3635e111ed8SAndrew Rybchenko #if EFSYS_OPT_PHY_LED_CONTROL 3645e111ed8SAndrew Rybchenko efx_phy_led_mode_t ep_phy_led_mode; 3655e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_PHY_LED_CONTROL */ 3665e111ed8SAndrew Rybchenko efx_phy_media_type_t ep_fixed_port_type; 3675e111ed8SAndrew Rybchenko efx_phy_media_type_t ep_module_type; 3685e111ed8SAndrew Rybchenko uint32_t ep_adv_cap_mask; 3695e111ed8SAndrew Rybchenko uint32_t ep_lp_cap_mask; 3705e111ed8SAndrew Rybchenko uint32_t ep_default_adv_cap_mask; 3715e111ed8SAndrew Rybchenko uint32_t ep_phy_cap_mask; 3725e111ed8SAndrew Rybchenko boolean_t ep_mac_drain; 373718263c4SRoman Zhukov boolean_t ep_include_fcs; 374*e5e5c127SArtemii Morozov boolean_t ep_vlan_strip; 3755e111ed8SAndrew Rybchenko #if EFSYS_OPT_BIST 3765e111ed8SAndrew Rybchenko efx_bist_type_t ep_current_bist; 3775e111ed8SAndrew Rybchenko #endif 3785e111ed8SAndrew Rybchenko const efx_mac_ops_t *ep_emop; 3795e111ed8SAndrew Rybchenko const efx_phy_ops_t *ep_epop; 3805e111ed8SAndrew Rybchenko } efx_port_t; 3815e111ed8SAndrew Rybchenko 3825e111ed8SAndrew Rybchenko typedef struct efx_mon_ops_s { 3835e111ed8SAndrew Rybchenko #if EFSYS_OPT_MON_STATS 3845e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 3855e111ed8SAndrew Rybchenko efx_mon_stat_value_t *); 3865e111ed8SAndrew Rybchenko efx_rc_t (*emo_limits_update)(efx_nic_t *, 3875e111ed8SAndrew Rybchenko efx_mon_stat_limits_t *); 3885e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MON_STATS */ 3895e111ed8SAndrew Rybchenko } efx_mon_ops_t; 3905e111ed8SAndrew Rybchenko 3915e111ed8SAndrew Rybchenko typedef struct efx_mon_s { 3925e111ed8SAndrew Rybchenko efx_mon_type_t em_type; 3935e111ed8SAndrew Rybchenko const efx_mon_ops_t *em_emop; 3945e111ed8SAndrew Rybchenko } efx_mon_t; 3955e111ed8SAndrew Rybchenko 3965e111ed8SAndrew Rybchenko typedef struct efx_intr_ops_s { 3975e111ed8SAndrew Rybchenko efx_rc_t (*eio_init)(efx_nic_t *, efx_intr_type_t, efsys_mem_t *); 3985e111ed8SAndrew Rybchenko void (*eio_enable)(efx_nic_t *); 3995e111ed8SAndrew Rybchenko void (*eio_disable)(efx_nic_t *); 4005e111ed8SAndrew Rybchenko void (*eio_disable_unlocked)(efx_nic_t *); 4015e111ed8SAndrew Rybchenko efx_rc_t (*eio_trigger)(efx_nic_t *, unsigned int); 4025e111ed8SAndrew Rybchenko void (*eio_status_line)(efx_nic_t *, boolean_t *, uint32_t *); 4035e111ed8SAndrew Rybchenko void (*eio_status_message)(efx_nic_t *, unsigned int, 4045e111ed8SAndrew Rybchenko boolean_t *); 4055e111ed8SAndrew Rybchenko void (*eio_fatal)(efx_nic_t *); 4065e111ed8SAndrew Rybchenko void (*eio_fini)(efx_nic_t *); 4075e111ed8SAndrew Rybchenko } efx_intr_ops_t; 4085e111ed8SAndrew Rybchenko 4095e111ed8SAndrew Rybchenko typedef struct efx_intr_s { 4105e111ed8SAndrew Rybchenko const efx_intr_ops_t *ei_eiop; 4115e111ed8SAndrew Rybchenko efsys_mem_t *ei_esmp; 4125e111ed8SAndrew Rybchenko efx_intr_type_t ei_type; 4135e111ed8SAndrew Rybchenko unsigned int ei_level; 4145e111ed8SAndrew Rybchenko } efx_intr_t; 4155e111ed8SAndrew Rybchenko 4165e111ed8SAndrew Rybchenko typedef struct efx_nic_ops_s { 4175e111ed8SAndrew Rybchenko efx_rc_t (*eno_probe)(efx_nic_t *); 4185e111ed8SAndrew Rybchenko efx_rc_t (*eno_board_cfg)(efx_nic_t *); 4195e111ed8SAndrew Rybchenko efx_rc_t (*eno_set_drv_limits)(efx_nic_t *, efx_drv_limits_t*); 4205e111ed8SAndrew Rybchenko efx_rc_t (*eno_reset)(efx_nic_t *); 4215e111ed8SAndrew Rybchenko efx_rc_t (*eno_init)(efx_nic_t *); 4225e111ed8SAndrew Rybchenko efx_rc_t (*eno_get_vi_pool)(efx_nic_t *, uint32_t *); 4235e111ed8SAndrew Rybchenko efx_rc_t (*eno_get_bar_region)(efx_nic_t *, efx_nic_region_t, 4245e111ed8SAndrew Rybchenko uint32_t *, size_t *); 4255e111ed8SAndrew Rybchenko boolean_t (*eno_hw_unavailable)(efx_nic_t *); 4265e111ed8SAndrew Rybchenko void (*eno_set_hw_unavailable)(efx_nic_t *); 4275e111ed8SAndrew Rybchenko #if EFSYS_OPT_DIAG 4285e111ed8SAndrew Rybchenko efx_rc_t (*eno_register_test)(efx_nic_t *); 4295e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_DIAG */ 4305e111ed8SAndrew Rybchenko void (*eno_fini)(efx_nic_t *); 4315e111ed8SAndrew Rybchenko void (*eno_unprobe)(efx_nic_t *); 4325e111ed8SAndrew Rybchenko } efx_nic_ops_t; 4335e111ed8SAndrew Rybchenko 4345e111ed8SAndrew Rybchenko #ifndef EFX_TXQ_LIMIT_TARGET 4355e111ed8SAndrew Rybchenko #define EFX_TXQ_LIMIT_TARGET 259 4365e111ed8SAndrew Rybchenko #endif 4375e111ed8SAndrew Rybchenko #ifndef EFX_RXQ_LIMIT_TARGET 4385e111ed8SAndrew Rybchenko #define EFX_RXQ_LIMIT_TARGET 512 4395e111ed8SAndrew Rybchenko #endif 4405e111ed8SAndrew Rybchenko 44160fb370cSAndrew Rybchenko typedef struct efx_nic_dma_region_s { 44260fb370cSAndrew Rybchenko efsys_dma_addr_t endr_nic_base; 44360fb370cSAndrew Rybchenko efsys_dma_addr_t endr_trgt_base; 44460fb370cSAndrew Rybchenko unsigned int endr_window_log2; 44560fb370cSAndrew Rybchenko unsigned int endr_align_log2; 44660fb370cSAndrew Rybchenko boolean_t endr_inuse; 44760fb370cSAndrew Rybchenko } efx_nic_dma_region_t; 44860fb370cSAndrew Rybchenko 44960fb370cSAndrew Rybchenko typedef struct efx_nic_dma_region_info_s { 45060fb370cSAndrew Rybchenko unsigned int endri_count; 45160fb370cSAndrew Rybchenko efx_nic_dma_region_t *endri_regions; 45260fb370cSAndrew Rybchenko } efx_nic_dma_region_info_t; 45360fb370cSAndrew Rybchenko 45460fb370cSAndrew Rybchenko typedef struct efx_nic_dma_s { 45560fb370cSAndrew Rybchenko union { 45660fb370cSAndrew Rybchenko /* No configuration in the case flat mapping type */ 45760fb370cSAndrew Rybchenko efx_nic_dma_region_info_t endu_region_info; 45860fb370cSAndrew Rybchenko } end_u; 45960fb370cSAndrew Rybchenko } efx_nic_dma_t; 4605e111ed8SAndrew Rybchenko 4615e111ed8SAndrew Rybchenko #if EFSYS_OPT_FILTER 4625e111ed8SAndrew Rybchenko 4635e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 4645e111ed8SAndrew Rybchenko 4655e111ed8SAndrew Rybchenko typedef struct siena_filter_spec_s { 4665e111ed8SAndrew Rybchenko uint8_t sfs_type; 4675e111ed8SAndrew Rybchenko uint32_t sfs_flags; 4685e111ed8SAndrew Rybchenko uint32_t sfs_dmaq_id; 4695e111ed8SAndrew Rybchenko uint32_t sfs_dword[3]; 4705e111ed8SAndrew Rybchenko } siena_filter_spec_t; 4715e111ed8SAndrew Rybchenko 4725e111ed8SAndrew Rybchenko typedef enum siena_filter_type_e { 4735e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_TCP_FULL, /* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */ 4745e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_TCP_WILD, /* TCP/IPv4 {dIP,dTCP, -, -} */ 4755e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_UDP_FULL, /* UDP/IPv4 {dIP,dUDP,sIP,sUDP} */ 4765e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_UDP_WILD, /* UDP/IPv4 {dIP,dUDP, -, -} */ 4775e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_MAC_FULL, /* Ethernet {dMAC,VLAN} */ 4785e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_MAC_WILD, /* Ethernet {dMAC, -} */ 4795e111ed8SAndrew Rybchenko 4805e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_TCP_FULL, /* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */ 4815e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_TCP_WILD, /* TCP/IPv4 { -, -,sIP,sTCP} */ 4825e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_UDP_FULL, /* UDP/IPv4 {dIP,dTCP,sIP,sTCP} */ 4835e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_UDP_WILD, /* UDP/IPv4 { -, -,sIP,sUDP} */ 4845e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_MAC_FULL, /* Ethernet {sMAC,VLAN} */ 4855e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_MAC_WILD, /* Ethernet {sMAC, -} */ 4865e111ed8SAndrew Rybchenko 4875e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_NTYPES 4885e111ed8SAndrew Rybchenko } siena_filter_type_t; 4895e111ed8SAndrew Rybchenko 4905e111ed8SAndrew Rybchenko typedef enum siena_filter_tbl_id_e { 4915e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_RX_IP = 0, 4925e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_RX_MAC, 4935e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_TX_IP, 4945e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_TX_MAC, 4955e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_NTBLS 4965e111ed8SAndrew Rybchenko } siena_filter_tbl_id_t; 4975e111ed8SAndrew Rybchenko 4985e111ed8SAndrew Rybchenko typedef struct siena_filter_tbl_s { 4995e111ed8SAndrew Rybchenko int sft_size; /* number of entries */ 5005e111ed8SAndrew Rybchenko int sft_used; /* active count */ 5015e111ed8SAndrew Rybchenko uint32_t *sft_bitmap; /* active bitmap */ 5025e111ed8SAndrew Rybchenko siena_filter_spec_t *sft_spec; /* array of saved specs */ 5035e111ed8SAndrew Rybchenko } siena_filter_tbl_t; 5045e111ed8SAndrew Rybchenko 5055e111ed8SAndrew Rybchenko typedef struct siena_filter_s { 5065e111ed8SAndrew Rybchenko siena_filter_tbl_t sf_tbl[EFX_SIENA_FILTER_NTBLS]; 5075e111ed8SAndrew Rybchenko unsigned int sf_depth[EFX_SIENA_FILTER_NTYPES]; 5085e111ed8SAndrew Rybchenko } siena_filter_t; 5095e111ed8SAndrew Rybchenko 5105e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 5115e111ed8SAndrew Rybchenko 5125e111ed8SAndrew Rybchenko typedef struct efx_filter_s { 5135e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 5145e111ed8SAndrew Rybchenko siena_filter_t *ef_siena_filter; 5155e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 516e1fe2c33SAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 5175e111ed8SAndrew Rybchenko ef10_filter_table_t *ef_ef10_filter_table; 518e1fe2c33SAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 5195e111ed8SAndrew Rybchenko } efx_filter_t; 5205e111ed8SAndrew Rybchenko 5215e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 5225e111ed8SAndrew Rybchenko 5235e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 5245e111ed8SAndrew Rybchenko extern void 5255e111ed8SAndrew Rybchenko siena_filter_tbl_clear( 5265e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 5275e111ed8SAndrew Rybchenko __in siena_filter_tbl_id_t tbl); 5285e111ed8SAndrew Rybchenko 5295e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 5305e111ed8SAndrew Rybchenko 5315e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_FILTER */ 5325e111ed8SAndrew Rybchenko 5335e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 5345e111ed8SAndrew Rybchenko 5355e111ed8SAndrew Rybchenko #define EFX_TUNNEL_MAXNENTRIES (16) 5365e111ed8SAndrew Rybchenko 5375e111ed8SAndrew Rybchenko #if EFSYS_OPT_TUNNEL 5385e111ed8SAndrew Rybchenko 53972e9af05SIgor Romanov /* State of a UDP tunnel table entry */ 54072e9af05SIgor Romanov typedef enum efx_tunnel_udp_entry_state_e { 54172e9af05SIgor Romanov EFX_TUNNEL_UDP_ENTRY_ADDED, /* Tunnel addition is requested */ 54272e9af05SIgor Romanov EFX_TUNNEL_UDP_ENTRY_REMOVED, /* Tunnel removal is requested */ 54372e9af05SIgor Romanov EFX_TUNNEL_UDP_ENTRY_APPLIED, /* Tunnel is applied by HW */ 54472e9af05SIgor Romanov } efx_tunnel_udp_entry_state_t; 54572e9af05SIgor Romanov 546d874d2a1SIgor Romanov #if EFSYS_OPT_RIVERHEAD 547d874d2a1SIgor Romanov typedef uint32_t efx_vnic_encap_rule_handle_t; 548d874d2a1SIgor Romanov #endif /* EFSYS_OPT_RIVERHEAD */ 549d874d2a1SIgor Romanov 5505e111ed8SAndrew Rybchenko typedef struct efx_tunnel_udp_entry_s { 5515e111ed8SAndrew Rybchenko uint16_t etue_port; /* host/cpu-endian */ 5525e111ed8SAndrew Rybchenko uint16_t etue_protocol; 55372e9af05SIgor Romanov boolean_t etue_busy; 55472e9af05SIgor Romanov efx_tunnel_udp_entry_state_t etue_state; 555d874d2a1SIgor Romanov #if EFSYS_OPT_RIVERHEAD 556d874d2a1SIgor Romanov efx_vnic_encap_rule_handle_t etue_handle; 557d874d2a1SIgor Romanov #endif /* EFSYS_OPT_RIVERHEAD */ 5585e111ed8SAndrew Rybchenko } efx_tunnel_udp_entry_t; 5595e111ed8SAndrew Rybchenko 5605e111ed8SAndrew Rybchenko typedef struct efx_tunnel_cfg_s { 5615e111ed8SAndrew Rybchenko efx_tunnel_udp_entry_t etc_udp_entries[EFX_TUNNEL_MAXNENTRIES]; 5625e111ed8SAndrew Rybchenko unsigned int etc_udp_entries_num; 5635e111ed8SAndrew Rybchenko } efx_tunnel_cfg_t; 5645e111ed8SAndrew Rybchenko 5655e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_TUNNEL */ 5665e111ed8SAndrew Rybchenko 5675e111ed8SAndrew Rybchenko typedef struct efx_mcdi_ops_s { 5685e111ed8SAndrew Rybchenko efx_rc_t (*emco_init)(efx_nic_t *, const efx_mcdi_transport_t *); 5695e111ed8SAndrew Rybchenko void (*emco_send_request)(efx_nic_t *, void *, size_t, 5705e111ed8SAndrew Rybchenko void *, size_t); 5715e111ed8SAndrew Rybchenko efx_rc_t (*emco_poll_reboot)(efx_nic_t *); 5725e111ed8SAndrew Rybchenko boolean_t (*emco_poll_response)(efx_nic_t *); 5735e111ed8SAndrew Rybchenko void (*emco_read_response)(efx_nic_t *, void *, size_t, size_t); 5745e111ed8SAndrew Rybchenko void (*emco_fini)(efx_nic_t *); 5755e111ed8SAndrew Rybchenko efx_rc_t (*emco_feature_supported)(efx_nic_t *, 5765e111ed8SAndrew Rybchenko efx_mcdi_feature_id_t, boolean_t *); 5775e111ed8SAndrew Rybchenko void (*emco_get_timeout)(efx_nic_t *, efx_mcdi_req_t *, 5785e111ed8SAndrew Rybchenko uint32_t *); 5795e111ed8SAndrew Rybchenko } efx_mcdi_ops_t; 5805e111ed8SAndrew Rybchenko 5815e111ed8SAndrew Rybchenko typedef struct efx_mcdi_s { 5825e111ed8SAndrew Rybchenko const efx_mcdi_ops_t *em_emcop; 5835e111ed8SAndrew Rybchenko const efx_mcdi_transport_t *em_emtp; 5845e111ed8SAndrew Rybchenko efx_mcdi_iface_t em_emip; 5855e111ed8SAndrew Rybchenko } efx_mcdi_t; 5865e111ed8SAndrew Rybchenko 5875e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 5885e111ed8SAndrew Rybchenko 5895e111ed8SAndrew Rybchenko #if EFSYS_OPT_NVRAM 5905e111ed8SAndrew Rybchenko 5915e111ed8SAndrew Rybchenko /* Invalid partition ID for en_nvram_partn_locked field of efx_nc_t */ 5925e111ed8SAndrew Rybchenko #define EFX_NVRAM_PARTN_INVALID (0xffffffffu) 5935e111ed8SAndrew Rybchenko 5945e111ed8SAndrew Rybchenko typedef struct efx_nvram_ops_s { 5955e111ed8SAndrew Rybchenko #if EFSYS_OPT_DIAG 5965e111ed8SAndrew Rybchenko efx_rc_t (*envo_test)(efx_nic_t *); 5975e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_DIAG */ 5985e111ed8SAndrew Rybchenko efx_rc_t (*envo_type_to_partn)(efx_nic_t *, efx_nvram_type_t, 5995e111ed8SAndrew Rybchenko uint32_t *); 6005e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_info)(efx_nic_t *, uint32_t, 6015e111ed8SAndrew Rybchenko efx_nvram_info_t *); 6025e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_rw_start)(efx_nic_t *, uint32_t, size_t *); 6035e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_read)(efx_nic_t *, uint32_t, 6045e111ed8SAndrew Rybchenko unsigned int, caddr_t, size_t); 6055e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_read_backup)(efx_nic_t *, uint32_t, 6065e111ed8SAndrew Rybchenko unsigned int, caddr_t, size_t); 6075e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_erase)(efx_nic_t *, uint32_t, 6085e111ed8SAndrew Rybchenko unsigned int, size_t); 6095e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_write)(efx_nic_t *, uint32_t, 6105e111ed8SAndrew Rybchenko unsigned int, caddr_t, size_t); 6115e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_rw_finish)(efx_nic_t *, uint32_t, 6125e111ed8SAndrew Rybchenko uint32_t *); 6135e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_get_version)(efx_nic_t *, uint32_t, 6145e111ed8SAndrew Rybchenko uint32_t *, uint16_t *); 6155e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_set_version)(efx_nic_t *, uint32_t, 6165e111ed8SAndrew Rybchenko uint16_t *); 6175e111ed8SAndrew Rybchenko efx_rc_t (*envo_buffer_validate)(uint32_t, 6185e111ed8SAndrew Rybchenko caddr_t, size_t); 6195e111ed8SAndrew Rybchenko } efx_nvram_ops_t; 6205e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NVRAM */ 6215e111ed8SAndrew Rybchenko 6225e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 6235e111ed8SAndrew Rybchenko typedef struct efx_vpd_ops_s { 6245e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_init)(efx_nic_t *); 6255e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_size)(efx_nic_t *, size_t *); 6265e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_read)(efx_nic_t *, caddr_t, size_t); 6275e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_verify)(efx_nic_t *, caddr_t, size_t); 6285e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_reinit)(efx_nic_t *, caddr_t, size_t); 6295e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_get)(efx_nic_t *, caddr_t, size_t, 6305e111ed8SAndrew Rybchenko efx_vpd_value_t *); 6315e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_set)(efx_nic_t *, caddr_t, size_t, 6325e111ed8SAndrew Rybchenko efx_vpd_value_t *); 6335e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_next)(efx_nic_t *, caddr_t, size_t, 6345e111ed8SAndrew Rybchenko efx_vpd_value_t *, unsigned int *); 6355e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_write)(efx_nic_t *, caddr_t, size_t); 6365e111ed8SAndrew Rybchenko void (*evpdo_fini)(efx_nic_t *); 6375e111ed8SAndrew Rybchenko } efx_vpd_ops_t; 6385e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 6395e111ed8SAndrew Rybchenko 6405e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM 6415e111ed8SAndrew Rybchenko 6425e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6435e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6445e111ed8SAndrew Rybchenko efx_mcdi_nvram_partitions( 6455e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6465e111ed8SAndrew Rybchenko __out_bcount(size) caddr_t data, 6475e111ed8SAndrew Rybchenko __in size_t size, 6485e111ed8SAndrew Rybchenko __out unsigned int *npartnp); 6495e111ed8SAndrew Rybchenko 6505e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6515e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6525e111ed8SAndrew Rybchenko efx_mcdi_nvram_metadata( 6535e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6545e111ed8SAndrew Rybchenko __in uint32_t partn, 6555e111ed8SAndrew Rybchenko __out uint32_t *subtypep, 6565e111ed8SAndrew Rybchenko __out_ecount(4) uint16_t version[4], 6575e111ed8SAndrew Rybchenko __out_bcount_opt(size) char *descp, 6585e111ed8SAndrew Rybchenko __in size_t size); 6595e111ed8SAndrew Rybchenko 6605e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6615e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6625e111ed8SAndrew Rybchenko efx_mcdi_nvram_info( 6635e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6645e111ed8SAndrew Rybchenko __in uint32_t partn, 6655e111ed8SAndrew Rybchenko __out efx_nvram_info_t *eni); 6665e111ed8SAndrew Rybchenko 6675e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6685e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6695e111ed8SAndrew Rybchenko efx_mcdi_nvram_update_start( 6705e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6715e111ed8SAndrew Rybchenko __in uint32_t partn); 6725e111ed8SAndrew Rybchenko 6735e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6745e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6755e111ed8SAndrew Rybchenko efx_mcdi_nvram_read( 6765e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6775e111ed8SAndrew Rybchenko __in uint32_t partn, 6785e111ed8SAndrew Rybchenko __in uint32_t offset, 6795e111ed8SAndrew Rybchenko __out_bcount(size) caddr_t data, 6805e111ed8SAndrew Rybchenko __in size_t size, 6815e111ed8SAndrew Rybchenko __in uint32_t mode); 6825e111ed8SAndrew Rybchenko 6835e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6845e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6855e111ed8SAndrew Rybchenko efx_mcdi_nvram_erase( 6865e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6875e111ed8SAndrew Rybchenko __in uint32_t partn, 6885e111ed8SAndrew Rybchenko __in uint32_t offset, 6895e111ed8SAndrew Rybchenko __in size_t size); 6905e111ed8SAndrew Rybchenko 6915e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6925e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6935e111ed8SAndrew Rybchenko efx_mcdi_nvram_write( 6945e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6955e111ed8SAndrew Rybchenko __in uint32_t partn, 6965e111ed8SAndrew Rybchenko __in uint32_t offset, 6975e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 6985e111ed8SAndrew Rybchenko __in size_t size); 6995e111ed8SAndrew Rybchenko 7005e111ed8SAndrew Rybchenko #define EFX_NVRAM_UPDATE_FLAGS_BACKGROUND 0x00000001 7015e111ed8SAndrew Rybchenko #define EFX_NVRAM_UPDATE_FLAGS_POLL 0x00000002 7025e111ed8SAndrew Rybchenko 7035e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 7045e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 7055e111ed8SAndrew Rybchenko efx_mcdi_nvram_update_finish( 7065e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 7075e111ed8SAndrew Rybchenko __in uint32_t partn, 7085e111ed8SAndrew Rybchenko __in boolean_t reboot, 7095e111ed8SAndrew Rybchenko __in uint32_t flags, 7105e111ed8SAndrew Rybchenko __out_opt uint32_t *verify_resultp); 7115e111ed8SAndrew Rybchenko 7125e111ed8SAndrew Rybchenko #if EFSYS_OPT_DIAG 7135e111ed8SAndrew Rybchenko 7145e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 7155e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 7165e111ed8SAndrew Rybchenko efx_mcdi_nvram_test( 7175e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 7185e111ed8SAndrew Rybchenko __in uint32_t partn); 7195e111ed8SAndrew Rybchenko 7205e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_DIAG */ 7215e111ed8SAndrew Rybchenko 7225e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */ 7235e111ed8SAndrew Rybchenko 7245e111ed8SAndrew Rybchenko #if EFSYS_OPT_LICENSING 7255e111ed8SAndrew Rybchenko 7265e111ed8SAndrew Rybchenko typedef struct efx_lic_ops_s { 7275e111ed8SAndrew Rybchenko efx_rc_t (*elo_update_licenses)(efx_nic_t *); 7285e111ed8SAndrew Rybchenko efx_rc_t (*elo_get_key_stats)(efx_nic_t *, efx_key_stats_t *); 7295e111ed8SAndrew Rybchenko efx_rc_t (*elo_app_state)(efx_nic_t *, uint64_t, boolean_t *); 7305e111ed8SAndrew Rybchenko efx_rc_t (*elo_get_id)(efx_nic_t *, size_t, uint32_t *, 7315e111ed8SAndrew Rybchenko size_t *, uint8_t *); 7325e111ed8SAndrew Rybchenko efx_rc_t (*elo_find_start) 7335e111ed8SAndrew Rybchenko (efx_nic_t *, caddr_t, size_t, uint32_t *); 7345e111ed8SAndrew Rybchenko efx_rc_t (*elo_find_end)(efx_nic_t *, caddr_t, size_t, 7355e111ed8SAndrew Rybchenko uint32_t, uint32_t *); 7365e111ed8SAndrew Rybchenko boolean_t (*elo_find_key)(efx_nic_t *, caddr_t, size_t, 7375e111ed8SAndrew Rybchenko uint32_t, uint32_t *, uint32_t *); 7385e111ed8SAndrew Rybchenko boolean_t (*elo_validate_key)(efx_nic_t *, 7395e111ed8SAndrew Rybchenko caddr_t, uint32_t); 7405e111ed8SAndrew Rybchenko efx_rc_t (*elo_read_key)(efx_nic_t *, 7415e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t, uint32_t, 7425e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t *); 7435e111ed8SAndrew Rybchenko efx_rc_t (*elo_write_key)(efx_nic_t *, 7445e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t, 7455e111ed8SAndrew Rybchenko caddr_t, uint32_t, uint32_t *); 7465e111ed8SAndrew Rybchenko efx_rc_t (*elo_delete_key)(efx_nic_t *, 7475e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t, 7485e111ed8SAndrew Rybchenko uint32_t, uint32_t, uint32_t *); 7495e111ed8SAndrew Rybchenko efx_rc_t (*elo_create_partition)(efx_nic_t *, 7505e111ed8SAndrew Rybchenko caddr_t, size_t); 7515e111ed8SAndrew Rybchenko efx_rc_t (*elo_finish_partition)(efx_nic_t *, 7525e111ed8SAndrew Rybchenko caddr_t, size_t); 7535e111ed8SAndrew Rybchenko } efx_lic_ops_t; 7545e111ed8SAndrew Rybchenko 7555e111ed8SAndrew Rybchenko #endif 7565e111ed8SAndrew Rybchenko 7575e111ed8SAndrew Rybchenko #if EFSYS_OPT_EVB 7585e111ed8SAndrew Rybchenko 7595e111ed8SAndrew Rybchenko struct efx_vswitch_s { 7605e111ed8SAndrew Rybchenko efx_nic_t *ev_enp; 7615e111ed8SAndrew Rybchenko efx_vswitch_id_t ev_vswitch_id; 7625e111ed8SAndrew Rybchenko uint32_t ev_num_vports; 7635e111ed8SAndrew Rybchenko /* 7645e111ed8SAndrew Rybchenko * Vport configuration array: index 0 to store PF configuration 7655e111ed8SAndrew Rybchenko * and next ev_num_vports-1 entries hold VFs configuration. 7665e111ed8SAndrew Rybchenko */ 7675e111ed8SAndrew Rybchenko efx_vport_config_t *ev_evcp; 7685e111ed8SAndrew Rybchenko }; 7695e111ed8SAndrew Rybchenko 7705e111ed8SAndrew Rybchenko typedef struct efx_evb_ops_s { 7715e111ed8SAndrew Rybchenko efx_rc_t (*eeo_init)(efx_nic_t *); 7725e111ed8SAndrew Rybchenko void (*eeo_fini)(efx_nic_t *); 7735e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vswitch_alloc)(efx_nic_t *, efx_vswitch_id_t *); 7745e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vswitch_free)(efx_nic_t *, efx_vswitch_id_t); 7755e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_alloc)(efx_nic_t *, efx_vswitch_id_t, 7765e111ed8SAndrew Rybchenko efx_vport_type_t, uint16_t, 7775e111ed8SAndrew Rybchenko boolean_t, efx_vport_id_t *); 7785e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_free)(efx_nic_t *, efx_vswitch_id_t, 7795e111ed8SAndrew Rybchenko efx_vport_id_t); 7805e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_mac_addr_add)(efx_nic_t *, efx_vswitch_id_t, 7815e111ed8SAndrew Rybchenko efx_vport_id_t, uint8_t *); 7825e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_mac_addr_del)(efx_nic_t *, efx_vswitch_id_t, 7835e111ed8SAndrew Rybchenko efx_vport_id_t, uint8_t *); 7845e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vadaptor_alloc)(efx_nic_t *, efx_vswitch_id_t, 7855e111ed8SAndrew Rybchenko efx_vport_id_t); 7865e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vadaptor_free)(efx_nic_t *, efx_vswitch_id_t, 7875e111ed8SAndrew Rybchenko efx_vport_id_t); 7885e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_assign)(efx_nic_t *, efx_vswitch_id_t, 7895e111ed8SAndrew Rybchenko efx_vport_id_t, uint32_t); 7905e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_reconfigure)(efx_nic_t *, efx_vswitch_id_t, 7915e111ed8SAndrew Rybchenko efx_vport_id_t, 7925e111ed8SAndrew Rybchenko uint16_t *, uint8_t *, 7935e111ed8SAndrew Rybchenko boolean_t *); 7945e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_stats)(efx_nic_t *, efx_vswitch_id_t, 7955e111ed8SAndrew Rybchenko efx_vport_id_t, efsys_mem_t *); 7965e111ed8SAndrew Rybchenko } efx_evb_ops_t; 7975e111ed8SAndrew Rybchenko 7985e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 7995e111ed8SAndrew Rybchenko extern __checkReturn boolean_t 8005e111ed8SAndrew Rybchenko efx_is_zero_eth_addr( 8015e111ed8SAndrew Rybchenko __in_bcount(EFX_MAC_ADDR_LEN) const uint8_t *addrp); 8025e111ed8SAndrew Rybchenko 8035e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_EVB */ 8045e111ed8SAndrew Rybchenko 8055e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER 8065e111ed8SAndrew Rybchenko 8075e111ed8SAndrew Rybchenko #define EFX_PROXY_CONFIGURE_MAGIC 0xAB2015EF 8085e111ed8SAndrew Rybchenko 8095e111ed8SAndrew Rybchenko 8105e111ed8SAndrew Rybchenko typedef struct efx_proxy_ops_s { 8115e111ed8SAndrew Rybchenko efx_rc_t (*epo_init)(efx_nic_t *); 8125e111ed8SAndrew Rybchenko void (*epo_fini)(efx_nic_t *); 8135e111ed8SAndrew Rybchenko efx_rc_t (*epo_mc_config)(efx_nic_t *, efsys_mem_t *, 8145e111ed8SAndrew Rybchenko efsys_mem_t *, efsys_mem_t *, 8155e111ed8SAndrew Rybchenko uint32_t, uint32_t *, size_t); 8165e111ed8SAndrew Rybchenko efx_rc_t (*epo_disable)(efx_nic_t *); 8175e111ed8SAndrew Rybchenko efx_rc_t (*epo_privilege_modify)(efx_nic_t *, uint32_t, uint32_t, 8185e111ed8SAndrew Rybchenko uint32_t, uint32_t, uint32_t); 8195e111ed8SAndrew Rybchenko efx_rc_t (*epo_set_privilege_mask)(efx_nic_t *, uint32_t, 8205e111ed8SAndrew Rybchenko uint32_t, uint32_t); 8215e111ed8SAndrew Rybchenko efx_rc_t (*epo_complete_request)(efx_nic_t *, uint32_t, 8225e111ed8SAndrew Rybchenko uint32_t, uint32_t); 8235e111ed8SAndrew Rybchenko efx_rc_t (*epo_exec_cmd)(efx_nic_t *, efx_proxy_cmd_params_t *); 8245e111ed8SAndrew Rybchenko efx_rc_t (*epo_get_privilege_mask)(efx_nic_t *, uint32_t, 8255e111ed8SAndrew Rybchenko uint32_t, uint32_t *); 8265e111ed8SAndrew Rybchenko } efx_proxy_ops_t; 8275e111ed8SAndrew Rybchenko 8285e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */ 8295e111ed8SAndrew Rybchenko 8306f956d5cSIvan Malov #if EFSYS_OPT_MAE 8316f956d5cSIvan Malov 83234285fd0SIvan Malov typedef struct efx_mae_field_cap_s { 83334285fd0SIvan Malov uint32_t emfc_support; 83434285fd0SIvan Malov boolean_t emfc_mask_affects_class; 83534285fd0SIvan Malov boolean_t emfc_match_affects_class; 83634285fd0SIvan Malov } efx_mae_field_cap_t; 83734285fd0SIvan Malov 8386f956d5cSIvan Malov typedef struct efx_mae_s { 839d761ec9fSIvan Malov uint32_t em_max_n_action_prios; 84034285fd0SIvan Malov /* 84134285fd0SIvan Malov * The number of MAE field IDs recognised by the FW implementation. 84234285fd0SIvan Malov * Any field ID greater than or equal to this value is unsupported. 84334285fd0SIvan Malov */ 84434285fd0SIvan Malov uint32_t em_max_nfields; 84534285fd0SIvan Malov /** Action rule match field capabilities. */ 84634285fd0SIvan Malov efx_mae_field_cap_t *em_action_rule_field_caps; 84734285fd0SIvan Malov size_t em_action_rule_field_caps_size; 848891408c4SIvan Malov uint32_t em_max_n_outer_prios; 849891408c4SIvan Malov uint32_t em_encap_types_supported; 850ed15d7f8SIvan Malov /** Outer rule match field capabilities. */ 851ed15d7f8SIvan Malov efx_mae_field_cap_t *em_outer_rule_field_caps; 852ed15d7f8SIvan Malov size_t em_outer_rule_field_caps_size; 853d19e7dd9SIvan Malov uint32_t em_max_n_action_counters; 854f4a6d074SIvan Malov uint32_t em_max_n_conntrack_counters; 8556f956d5cSIvan Malov } efx_mae_t; 8566f956d5cSIvan Malov 8576f956d5cSIvan Malov #endif /* EFSYS_OPT_MAE */ 8586f956d5cSIvan Malov 8595e111ed8SAndrew Rybchenko #define EFX_DRV_VER_MAX 20 8605e111ed8SAndrew Rybchenko 8615e111ed8SAndrew Rybchenko typedef struct efx_drv_cfg_s { 8625e111ed8SAndrew Rybchenko uint32_t edc_min_vi_count; 8635e111ed8SAndrew Rybchenko uint32_t edc_max_vi_count; 8645e111ed8SAndrew Rybchenko 8655e111ed8SAndrew Rybchenko uint32_t edc_max_piobuf_count; 8665e111ed8SAndrew Rybchenko uint32_t edc_pio_alloc_size; 8675e111ed8SAndrew Rybchenko } efx_drv_cfg_t; 8685e111ed8SAndrew Rybchenko 8695e111ed8SAndrew Rybchenko struct efx_nic_s { 8705e111ed8SAndrew Rybchenko uint32_t en_magic; 8715e111ed8SAndrew Rybchenko efx_family_t en_family; 8725e111ed8SAndrew Rybchenko uint32_t en_features; 8735e111ed8SAndrew Rybchenko efsys_identifier_t *en_esip; 8745e111ed8SAndrew Rybchenko efsys_lock_t *en_eslp; 8755e111ed8SAndrew Rybchenko efsys_bar_t *en_esbp; 8765e111ed8SAndrew Rybchenko unsigned int en_mod_flags; 8775e111ed8SAndrew Rybchenko unsigned int en_reset_flags; 8785e111ed8SAndrew Rybchenko efx_nic_cfg_t en_nic_cfg; 8795e111ed8SAndrew Rybchenko efx_drv_cfg_t en_drv_cfg; 8805e111ed8SAndrew Rybchenko efx_port_t en_port; 8815e111ed8SAndrew Rybchenko efx_mon_t en_mon; 8825e111ed8SAndrew Rybchenko efx_intr_t en_intr; 8835e111ed8SAndrew Rybchenko uint32_t en_ev_qcount; 8845e111ed8SAndrew Rybchenko uint32_t en_rx_qcount; 8855e111ed8SAndrew Rybchenko uint32_t en_tx_qcount; 8865e111ed8SAndrew Rybchenko const efx_nic_ops_t *en_enop; 8875e111ed8SAndrew Rybchenko const efx_ev_ops_t *en_eevop; 8885e111ed8SAndrew Rybchenko const efx_tx_ops_t *en_etxop; 8895e111ed8SAndrew Rybchenko const efx_rx_ops_t *en_erxop; 8905e111ed8SAndrew Rybchenko efx_fw_variant_t efv; 8915e111ed8SAndrew Rybchenko char en_drv_version[EFX_DRV_VER_MAX]; 89260fb370cSAndrew Rybchenko efx_nic_dma_t en_dma; 8935e111ed8SAndrew Rybchenko #if EFSYS_OPT_FILTER 8945e111ed8SAndrew Rybchenko efx_filter_t en_filter; 8955e111ed8SAndrew Rybchenko const efx_filter_ops_t *en_efop; 8965e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_FILTER */ 8975e111ed8SAndrew Rybchenko #if EFSYS_OPT_TUNNEL 8985e111ed8SAndrew Rybchenko efx_tunnel_cfg_t en_tunnel_cfg; 8995e111ed8SAndrew Rybchenko const efx_tunnel_ops_t *en_etop; 9005e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_TUNNEL */ 9015e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 9025e111ed8SAndrew Rybchenko efx_mcdi_t en_mcdi; 9035e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 9045e111ed8SAndrew Rybchenko #if EFSYS_OPT_NVRAM 9055e111ed8SAndrew Rybchenko uint32_t en_nvram_partn_locked; 9065e111ed8SAndrew Rybchenko const efx_nvram_ops_t *en_envop; 9075e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NVRAM */ 9085e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 9095e111ed8SAndrew Rybchenko const efx_vpd_ops_t *en_evpdop; 9105e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 9114dda72dbSVijay Srivastava #if EFSYS_OPT_VIRTIO 9124dda72dbSVijay Srivastava const efx_virtio_ops_t *en_evop; 9134dda72dbSVijay Srivastava #endif /* EFSYS_OPT_VPD */ 9145e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_SCALE 9155e111ed8SAndrew Rybchenko efx_rx_hash_support_t en_hash_support; 9165e111ed8SAndrew Rybchenko efx_rx_scale_context_type_t en_rss_context_type; 9175e111ed8SAndrew Rybchenko uint32_t en_rss_context; 9185e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_RX_SCALE */ 9195e111ed8SAndrew Rybchenko uint32_t en_vport_id; 9205e111ed8SAndrew Rybchenko #if EFSYS_OPT_LICENSING 9215e111ed8SAndrew Rybchenko const efx_lic_ops_t *en_elop; 9225e111ed8SAndrew Rybchenko boolean_t en_licensing_supported; 9235e111ed8SAndrew Rybchenko #endif 9245e111ed8SAndrew Rybchenko union { 9255e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 9265e111ed8SAndrew Rybchenko struct { 9275e111ed8SAndrew Rybchenko #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD 9285e111ed8SAndrew Rybchenko unsigned int enu_partn_mask; 9295e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */ 9305e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 9315e111ed8SAndrew Rybchenko caddr_t enu_svpd; 9325e111ed8SAndrew Rybchenko size_t enu_svpd_length; 9335e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 9345e111ed8SAndrew Rybchenko int enu_unused; 9355e111ed8SAndrew Rybchenko } siena; 9365e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 9375e111ed8SAndrew Rybchenko int enu_unused; 9385e111ed8SAndrew Rybchenko } en_u; 9393c1c5cc4SAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 9405e111ed8SAndrew Rybchenko union en_arch { 9415e111ed8SAndrew Rybchenko struct { 9425e111ed8SAndrew Rybchenko int ena_vi_base; 9435e111ed8SAndrew Rybchenko int ena_vi_count; 9445e111ed8SAndrew Rybchenko int ena_vi_shift; 945341bd4e0SIgor Romanov uint32_t ena_fcw_base; 9465e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 9475e111ed8SAndrew Rybchenko caddr_t ena_svpd; 9485e111ed8SAndrew Rybchenko size_t ena_svpd_length; 9495e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 9505e111ed8SAndrew Rybchenko efx_piobuf_handle_t ena_piobuf_handle[EF10_MAX_PIOBUF_NBUFS]; 9515e111ed8SAndrew Rybchenko uint32_t ena_piobuf_count; 9525e111ed8SAndrew Rybchenko uint32_t ena_pio_alloc_map[EF10_MAX_PIOBUF_NBUFS]; 9535e111ed8SAndrew Rybchenko uint32_t ena_pio_write_vi_base; 9545e111ed8SAndrew Rybchenko /* Memory BAR mapping regions */ 9555e111ed8SAndrew Rybchenko uint32_t ena_uc_mem_map_offset; 9565e111ed8SAndrew Rybchenko size_t ena_uc_mem_map_size; 9575e111ed8SAndrew Rybchenko uint32_t ena_wc_mem_map_offset; 9585e111ed8SAndrew Rybchenko size_t ena_wc_mem_map_size; 9595e111ed8SAndrew Rybchenko } ef10; 9605e111ed8SAndrew Rybchenko } en_arch; 9613c1c5cc4SAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 9625e111ed8SAndrew Rybchenko #if EFSYS_OPT_EVB 9635e111ed8SAndrew Rybchenko const efx_evb_ops_t *en_eeop; 9645e111ed8SAndrew Rybchenko struct efx_vswitch_s *en_vswitchp; 9655e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_EVB */ 9665e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER 9675e111ed8SAndrew Rybchenko const efx_proxy_ops_t *en_epop; 9685e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */ 9696f956d5cSIvan Malov #if EFSYS_OPT_MAE 9706f956d5cSIvan Malov efx_mae_t *en_maep; 9716f956d5cSIvan Malov #endif /* EFSYS_OPT_MAE */ 9725e111ed8SAndrew Rybchenko }; 9735e111ed8SAndrew Rybchenko 9745e111ed8SAndrew Rybchenko #define EFX_FAMILY_IS_EF10(_enp) \ 9755e111ed8SAndrew Rybchenko ((_enp)->en_family == EFX_FAMILY_MEDFORD2 || \ 9765e111ed8SAndrew Rybchenko (_enp)->en_family == EFX_FAMILY_MEDFORD || \ 9775e111ed8SAndrew Rybchenko (_enp)->en_family == EFX_FAMILY_HUNTINGTON) 9785e111ed8SAndrew Rybchenko 979206ef24fSAndrew Rybchenko #define EFX_FAMILY_IS_EF100(_enp) \ 980206ef24fSAndrew Rybchenko ((_enp)->en_family == EFX_FAMILY_RIVERHEAD) 981206ef24fSAndrew Rybchenko 9825e111ed8SAndrew Rybchenko 9835e111ed8SAndrew Rybchenko #define EFX_NIC_MAGIC 0x02121996 9845e111ed8SAndrew Rybchenko 9855e111ed8SAndrew Rybchenko typedef boolean_t (*efx_ev_handler_t)(efx_evq_t *, efx_qword_t *, 9865e111ed8SAndrew Rybchenko const efx_ev_callbacks_t *, void *); 9875e111ed8SAndrew Rybchenko 988ea42cae4SAndy Moreton #if EFSYS_OPT_EV_EXTENDED_WIDTH 989ea42cae4SAndy Moreton typedef boolean_t (*efx_ev_ew_handler_t)(efx_evq_t *, efx_xword_t *, 990ea42cae4SAndy Moreton const efx_ev_callbacks_t *, void *); 991ea42cae4SAndy Moreton #endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */ 992ea42cae4SAndy Moreton 9935e111ed8SAndrew Rybchenko typedef struct efx_evq_rxq_state_s { 9945e111ed8SAndrew Rybchenko unsigned int eers_rx_read_ptr; 9955e111ed8SAndrew Rybchenko unsigned int eers_rx_mask; 9965e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM || EFSYS_OPT_RX_ES_SUPER_BUFFER 9975e111ed8SAndrew Rybchenko unsigned int eers_rx_stream_npackets; 9985e111ed8SAndrew Rybchenko boolean_t eers_rx_packed_stream; 9995e111ed8SAndrew Rybchenko #endif 10005e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM 10015e111ed8SAndrew Rybchenko unsigned int eers_rx_packed_stream_credits; 10025e111ed8SAndrew Rybchenko #endif 10035e111ed8SAndrew Rybchenko } efx_evq_rxq_state_t; 10045e111ed8SAndrew Rybchenko 10055e111ed8SAndrew Rybchenko struct efx_evq_s { 10065e111ed8SAndrew Rybchenko uint32_t ee_magic; 10075e111ed8SAndrew Rybchenko uint32_t ee_flags; 10085e111ed8SAndrew Rybchenko efx_nic_t *ee_enp; 10095e111ed8SAndrew Rybchenko unsigned int ee_index; 10105e111ed8SAndrew Rybchenko unsigned int ee_mask; 10115e111ed8SAndrew Rybchenko efsys_mem_t *ee_esmp; 10125e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 10135e111ed8SAndrew Rybchenko uint32_t ee_stat[EV_NQSTATS]; 10145e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_QSTATS */ 10155e111ed8SAndrew Rybchenko 10165e111ed8SAndrew Rybchenko efx_ev_handler_t ee_rx; 10175e111ed8SAndrew Rybchenko efx_ev_handler_t ee_tx; 10185e111ed8SAndrew Rybchenko efx_ev_handler_t ee_driver; 10195e111ed8SAndrew Rybchenko efx_ev_handler_t ee_global; 10205e111ed8SAndrew Rybchenko efx_ev_handler_t ee_drv_gen; 10215e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 10225e111ed8SAndrew Rybchenko efx_ev_handler_t ee_mcdi; 10235e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 10245e111ed8SAndrew Rybchenko 1025ea42cae4SAndy Moreton #if EFSYS_OPT_DESC_PROXY 1026ea42cae4SAndy Moreton efx_ev_ew_handler_t ee_ew_txq_desc; 1027ea42cae4SAndy Moreton efx_ev_ew_handler_t ee_ew_virtq_desc; 1028ea42cae4SAndy Moreton #endif /* EFSYS_OPT_DESC_PROXY */ 1029ea42cae4SAndy Moreton 10305e111ed8SAndrew Rybchenko efx_evq_rxq_state_t ee_rxq_state[EFX_EV_RX_NLABELS]; 10315e111ed8SAndrew Rybchenko }; 10325e111ed8SAndrew Rybchenko 10335e111ed8SAndrew Rybchenko #define EFX_EVQ_MAGIC 0x08081997 10345e111ed8SAndrew Rybchenko 10355e111ed8SAndrew Rybchenko #define EFX_EVQ_SIENA_TIMER_QUANTUM_NS 6144 /* 768 cycles */ 10365e111ed8SAndrew Rybchenko 10375e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 10385e111ed8SAndrew Rybchenko #define EFX_EV_QSTAT_INCR(_eep, _stat) \ 10395e111ed8SAndrew Rybchenko do { \ 10405e111ed8SAndrew Rybchenko (_eep)->ee_stat[_stat]++; \ 10415e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10425e111ed8SAndrew Rybchenko } while (B_FALSE) 10435e111ed8SAndrew Rybchenko #else 10445e111ed8SAndrew Rybchenko #define EFX_EV_QSTAT_INCR(_eep, _stat) 10455e111ed8SAndrew Rybchenko #endif 10465e111ed8SAndrew Rybchenko 10475e111ed8SAndrew Rybchenko struct efx_rxq_s { 10485e111ed8SAndrew Rybchenko uint32_t er_magic; 10495e111ed8SAndrew Rybchenko efx_nic_t *er_enp; 10505e111ed8SAndrew Rybchenko efx_evq_t *er_eep; 10515e111ed8SAndrew Rybchenko unsigned int er_index; 10525e111ed8SAndrew Rybchenko unsigned int er_label; 10535e111ed8SAndrew Rybchenko unsigned int er_mask; 10545e111ed8SAndrew Rybchenko size_t er_buf_size; 10555e111ed8SAndrew Rybchenko efsys_mem_t *er_esmp; 10565e111ed8SAndrew Rybchenko efx_evq_rxq_state_t *er_ev_qstate; 10576bba823fSAndrew Rybchenko efx_rx_prefix_layout_t er_prefix_layout; 10585e111ed8SAndrew Rybchenko }; 10595e111ed8SAndrew Rybchenko 10605e111ed8SAndrew Rybchenko #define EFX_RXQ_MAGIC 0x15022005 10615e111ed8SAndrew Rybchenko 10625e111ed8SAndrew Rybchenko struct efx_txq_s { 10635e111ed8SAndrew Rybchenko uint32_t et_magic; 10645e111ed8SAndrew Rybchenko efx_nic_t *et_enp; 10655e111ed8SAndrew Rybchenko unsigned int et_index; 10665e111ed8SAndrew Rybchenko unsigned int et_mask; 10675e111ed8SAndrew Rybchenko efsys_mem_t *et_esmp; 10685e111ed8SAndrew Rybchenko #if EFSYS_OPT_HUNTINGTON 10695e111ed8SAndrew Rybchenko uint32_t et_pio_bufnum; 10705e111ed8SAndrew Rybchenko uint32_t et_pio_blknum; 10715e111ed8SAndrew Rybchenko uint32_t et_pio_write_offset; 10725e111ed8SAndrew Rybchenko uint32_t et_pio_offset; 10735e111ed8SAndrew Rybchenko size_t et_pio_size; 10745e111ed8SAndrew Rybchenko #endif 10755e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 10765e111ed8SAndrew Rybchenko uint32_t et_stat[TX_NQSTATS]; 10775e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_QSTATS */ 10785e111ed8SAndrew Rybchenko }; 10795e111ed8SAndrew Rybchenko 10805e111ed8SAndrew Rybchenko #define EFX_TXQ_MAGIC 0x05092005 10815e111ed8SAndrew Rybchenko 10825e111ed8SAndrew Rybchenko #define EFX_MAC_ADDR_COPY(_dst, _src) \ 10835e111ed8SAndrew Rybchenko do { \ 10845e111ed8SAndrew Rybchenko (_dst)[0] = (_src)[0]; \ 10855e111ed8SAndrew Rybchenko (_dst)[1] = (_src)[1]; \ 10865e111ed8SAndrew Rybchenko (_dst)[2] = (_src)[2]; \ 10875e111ed8SAndrew Rybchenko (_dst)[3] = (_src)[3]; \ 10885e111ed8SAndrew Rybchenko (_dst)[4] = (_src)[4]; \ 10895e111ed8SAndrew Rybchenko (_dst)[5] = (_src)[5]; \ 10905e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10915e111ed8SAndrew Rybchenko } while (B_FALSE) 10925e111ed8SAndrew Rybchenko 10935e111ed8SAndrew Rybchenko #define EFX_MAC_BROADCAST_ADDR_SET(_dst) \ 10945e111ed8SAndrew Rybchenko do { \ 10955e111ed8SAndrew Rybchenko uint16_t *_d = (uint16_t *)(_dst); \ 10965e111ed8SAndrew Rybchenko _d[0] = 0xffff; \ 10975e111ed8SAndrew Rybchenko _d[1] = 0xffff; \ 10985e111ed8SAndrew Rybchenko _d[2] = 0xffff; \ 10995e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11005e111ed8SAndrew Rybchenko } while (B_FALSE) 11015e111ed8SAndrew Rybchenko 11025e111ed8SAndrew Rybchenko #if EFSYS_OPT_CHECK_REG 11035e111ed8SAndrew Rybchenko #define EFX_CHECK_REG(_enp, _reg) \ 11045e111ed8SAndrew Rybchenko do { \ 11055e111ed8SAndrew Rybchenko const char *name = #_reg; \ 11065e111ed8SAndrew Rybchenko char min = name[4]; \ 11075e111ed8SAndrew Rybchenko char max = name[5]; \ 11085e111ed8SAndrew Rybchenko char rev; \ 11095e111ed8SAndrew Rybchenko \ 11105e111ed8SAndrew Rybchenko switch ((_enp)->en_family) { \ 11115e111ed8SAndrew Rybchenko case EFX_FAMILY_SIENA: \ 11125e111ed8SAndrew Rybchenko rev = 'C'; \ 11135e111ed8SAndrew Rybchenko break; \ 11145e111ed8SAndrew Rybchenko \ 11155e111ed8SAndrew Rybchenko case EFX_FAMILY_HUNTINGTON: \ 11165e111ed8SAndrew Rybchenko rev = 'D'; \ 11175e111ed8SAndrew Rybchenko break; \ 11185e111ed8SAndrew Rybchenko \ 11195e111ed8SAndrew Rybchenko case EFX_FAMILY_MEDFORD: \ 11205e111ed8SAndrew Rybchenko rev = 'E'; \ 11215e111ed8SAndrew Rybchenko break; \ 11225e111ed8SAndrew Rybchenko \ 11235e111ed8SAndrew Rybchenko case EFX_FAMILY_MEDFORD2: \ 11245e111ed8SAndrew Rybchenko rev = 'F'; \ 11255e111ed8SAndrew Rybchenko break; \ 11265e111ed8SAndrew Rybchenko \ 112782c17c52SAndrew Rybchenko case EFX_FAMILY_RIVERHEAD: \ 112882c17c52SAndrew Rybchenko rev = 'G'; \ 112982c17c52SAndrew Rybchenko break; \ 113082c17c52SAndrew Rybchenko \ 11315e111ed8SAndrew Rybchenko default: \ 11325e111ed8SAndrew Rybchenko rev = '?'; \ 11335e111ed8SAndrew Rybchenko break; \ 11345e111ed8SAndrew Rybchenko } \ 11355e111ed8SAndrew Rybchenko \ 11365e111ed8SAndrew Rybchenko EFSYS_ASSERT3S(rev, >=, min); \ 11375e111ed8SAndrew Rybchenko EFSYS_ASSERT3S(rev, <=, max); \ 11385e111ed8SAndrew Rybchenko \ 11395e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11405e111ed8SAndrew Rybchenko } while (B_FALSE) 11415e111ed8SAndrew Rybchenko #else 11425e111ed8SAndrew Rybchenko #define EFX_CHECK_REG(_enp, _reg) do { \ 11435e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11445e111ed8SAndrew Rybchenko } while (B_FALSE) 11455e111ed8SAndrew Rybchenko #endif 11465e111ed8SAndrew Rybchenko 11475e111ed8SAndrew Rybchenko #define EFX_BAR_READD(_enp, _reg, _edp, _lock) \ 11485e111ed8SAndrew Rybchenko do { \ 11495e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11505e111ed8SAndrew Rybchenko EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST, \ 11515e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 11525e111ed8SAndrew Rybchenko EFSYS_PROBE3(efx_bar_readd, const char *, #_reg, \ 11535e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11545e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 11555e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11565e111ed8SAndrew Rybchenko } while (B_FALSE) 11575e111ed8SAndrew Rybchenko 11585e111ed8SAndrew Rybchenko #define EFX_BAR_WRITED(_enp, _reg, _edp, _lock) \ 11595e111ed8SAndrew Rybchenko do { \ 11605e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11615e111ed8SAndrew Rybchenko EFSYS_PROBE3(efx_bar_writed, const char *, #_reg, \ 11625e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11635e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 11645e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST, \ 11655e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 11665e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11675e111ed8SAndrew Rybchenko } while (B_FALSE) 11685e111ed8SAndrew Rybchenko 11695e111ed8SAndrew Rybchenko #define EFX_BAR_READQ(_enp, _reg, _eqp) \ 11705e111ed8SAndrew Rybchenko do { \ 11715e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11725e111ed8SAndrew Rybchenko EFSYS_BAR_READQ((_enp)->en_esbp, _reg ## _OFST, \ 11735e111ed8SAndrew Rybchenko (_eqp)); \ 11745e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_readq, const char *, #_reg, \ 11755e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11765e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 11775e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 11785e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11795e111ed8SAndrew Rybchenko } while (B_FALSE) 11805e111ed8SAndrew Rybchenko 11815e111ed8SAndrew Rybchenko #define EFX_BAR_WRITEQ(_enp, _reg, _eqp) \ 11825e111ed8SAndrew Rybchenko do { \ 11835e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11845e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_writeq, const char *, #_reg, \ 11855e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11865e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 11875e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 11885e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEQ((_enp)->en_esbp, _reg ## _OFST, \ 11895e111ed8SAndrew Rybchenko (_eqp)); \ 11905e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11915e111ed8SAndrew Rybchenko } while (B_FALSE) 11925e111ed8SAndrew Rybchenko 11935e111ed8SAndrew Rybchenko #define EFX_BAR_READO(_enp, _reg, _eop) \ 11945e111ed8SAndrew Rybchenko do { \ 11955e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11965e111ed8SAndrew Rybchenko EFSYS_BAR_READO((_enp)->en_esbp, _reg ## _OFST, \ 11975e111ed8SAndrew Rybchenko (_eop), B_TRUE); \ 11985e111ed8SAndrew Rybchenko EFSYS_PROBE6(efx_bar_reado, const char *, #_reg, \ 11995e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12005e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 12015e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 12025e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 12035e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 12045e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12055e111ed8SAndrew Rybchenko } while (B_FALSE) 12065e111ed8SAndrew Rybchenko 12075e111ed8SAndrew Rybchenko #define EFX_BAR_WRITEO(_enp, _reg, _eop) \ 12085e111ed8SAndrew Rybchenko do { \ 12095e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12105e111ed8SAndrew Rybchenko EFSYS_PROBE6(efx_bar_writeo, const char *, #_reg, \ 12115e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12125e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 12135e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 12145e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 12155e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 12165e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEO((_enp)->en_esbp, _reg ## _OFST, \ 12175e111ed8SAndrew Rybchenko (_eop), B_TRUE); \ 12185e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12195e111ed8SAndrew Rybchenko } while (B_FALSE) 12205e111ed8SAndrew Rybchenko 12215e111ed8SAndrew Rybchenko /* 12225e111ed8SAndrew Rybchenko * Accessors for memory BAR non-VI tables. 12235e111ed8SAndrew Rybchenko * 12245e111ed8SAndrew Rybchenko * Code used on EF10 *must* use EFX_BAR_VI_*() macros for per-VI registers, 12255e111ed8SAndrew Rybchenko * to ensure the correct runtime VI window size is used on Medford2. 12265e111ed8SAndrew Rybchenko * 1227341bd4e0SIgor Romanov * Code used on EF100 *must* use EFX_BAR_FCW_* macros for function control 1228341bd4e0SIgor Romanov * window registers, to ensure the correct starting offset is used. 1229341bd4e0SIgor Romanov * 12305e111ed8SAndrew Rybchenko * Siena-only code may continue using EFX_BAR_TBL_*() macros for VI registers. 12315e111ed8SAndrew Rybchenko */ 12325e111ed8SAndrew Rybchenko 12335e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_READD(_enp, _reg, _index, _edp, _lock) \ 12345e111ed8SAndrew Rybchenko do { \ 12355e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12365e111ed8SAndrew Rybchenko EFSYS_BAR_READD((_enp)->en_esbp, \ 12375e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12385e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 12395e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_tbl_readd, const char *, #_reg, \ 12405e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12415e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12425e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 12435e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12445e111ed8SAndrew Rybchenko } while (B_FALSE) 12455e111ed8SAndrew Rybchenko 12465e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITED(_enp, _reg, _index, _edp, _lock) \ 12475e111ed8SAndrew Rybchenko do { \ 12485e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12495e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 12505e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12515e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12525e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 12535e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 12545e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12555e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 12565e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12575e111ed8SAndrew Rybchenko } while (B_FALSE) 12585e111ed8SAndrew Rybchenko 12595e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITED3(_enp, _reg, _index, _edp, _lock) \ 12605e111ed8SAndrew Rybchenko do { \ 12615e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12625e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 12635e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12645e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12655e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 12665e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 12675e111ed8SAndrew Rybchenko (_reg ## _OFST + \ 12685e111ed8SAndrew Rybchenko (3 * sizeof (efx_dword_t)) + \ 12695e111ed8SAndrew Rybchenko ((_index) * _reg ## _STEP)), \ 12705e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 12715e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12725e111ed8SAndrew Rybchenko } while (B_FALSE) 12735e111ed8SAndrew Rybchenko 12745e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_READQ(_enp, _reg, _index, _eqp) \ 12755e111ed8SAndrew Rybchenko do { \ 12765e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12775e111ed8SAndrew Rybchenko EFSYS_BAR_READQ((_enp)->en_esbp, \ 12785e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12795e111ed8SAndrew Rybchenko (_eqp)); \ 12805e111ed8SAndrew Rybchenko EFSYS_PROBE5(efx_bar_tbl_readq, const char *, #_reg, \ 12815e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12825e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12835e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 12845e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 12855e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12865e111ed8SAndrew Rybchenko } while (B_FALSE) 12875e111ed8SAndrew Rybchenko 12885e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITEQ(_enp, _reg, _index, _eqp) \ 12895e111ed8SAndrew Rybchenko do { \ 12905e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12915e111ed8SAndrew Rybchenko EFSYS_PROBE5(efx_bar_tbl_writeq, const char *, #_reg, \ 12925e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12935e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12945e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 12955e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 12965e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEQ((_enp)->en_esbp, \ 12975e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12985e111ed8SAndrew Rybchenko (_eqp)); \ 12995e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13005e111ed8SAndrew Rybchenko } while (B_FALSE) 13015e111ed8SAndrew Rybchenko 13025e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_READO(_enp, _reg, _index, _eop, _lock) \ 13035e111ed8SAndrew Rybchenko do { \ 13045e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 13055e111ed8SAndrew Rybchenko EFSYS_BAR_READO((_enp)->en_esbp, \ 13065e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 13075e111ed8SAndrew Rybchenko (_eop), (_lock)); \ 13085e111ed8SAndrew Rybchenko EFSYS_PROBE7(efx_bar_tbl_reado, const char *, #_reg, \ 13095e111ed8SAndrew Rybchenko uint32_t, (_index), \ 13105e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 13115e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 13125e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 13135e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 13145e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 13155e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13165e111ed8SAndrew Rybchenko } while (B_FALSE) 13175e111ed8SAndrew Rybchenko 13185e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITEO(_enp, _reg, _index, _eop, _lock) \ 13195e111ed8SAndrew Rybchenko do { \ 13205e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 13215e111ed8SAndrew Rybchenko EFSYS_PROBE7(efx_bar_tbl_writeo, const char *, #_reg, \ 13225e111ed8SAndrew Rybchenko uint32_t, (_index), \ 13235e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 13245e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 13255e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 13265e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 13275e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 13285e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEO((_enp)->en_esbp, \ 13295e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 13305e111ed8SAndrew Rybchenko (_eop), (_lock)); \ 13315e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13325e111ed8SAndrew Rybchenko } while (B_FALSE) 13335e111ed8SAndrew Rybchenko 13345e111ed8SAndrew Rybchenko /* 1335341bd4e0SIgor Romanov * Accessors for memory BAR function control window registers. 1336341bd4e0SIgor Romanov * 1337341bd4e0SIgor Romanov * The function control window is located at an offset which can be 1338341bd4e0SIgor Romanov * non-zero in case of Riverhead. 1339341bd4e0SIgor Romanov */ 1340341bd4e0SIgor Romanov 1341341bd4e0SIgor Romanov #if EFSYS_OPT_RIVERHEAD 1342341bd4e0SIgor Romanov 1343341bd4e0SIgor Romanov #define EFX_BAR_FCW_READD(_enp, _reg, _edp) \ 1344341bd4e0SIgor Romanov do { \ 1345341bd4e0SIgor Romanov EFX_CHECK_REG((_enp), (_reg)); \ 1346341bd4e0SIgor Romanov EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST + \ 1347341bd4e0SIgor Romanov (_enp)->en_arch.ef10.ena_fcw_base, \ 1348341bd4e0SIgor Romanov (_edp), B_FALSE); \ 1349341bd4e0SIgor Romanov EFSYS_PROBE3(efx_bar_fcw_readd, const char *, #_reg, \ 1350341bd4e0SIgor Romanov uint32_t, _reg ## _OFST, \ 1351341bd4e0SIgor Romanov uint32_t, (_edp)->ed_u32[0]); \ 1352341bd4e0SIgor Romanov _NOTE(CONSTANTCONDITION) \ 1353341bd4e0SIgor Romanov } while (B_FALSE) 1354341bd4e0SIgor Romanov 1355341bd4e0SIgor Romanov #define EFX_BAR_FCW_WRITED(_enp, _reg, _edp) \ 1356341bd4e0SIgor Romanov do { \ 1357341bd4e0SIgor Romanov EFX_CHECK_REG((_enp), (_reg)); \ 1358341bd4e0SIgor Romanov EFSYS_PROBE3(efx_bar_fcw_writed, const char *, #_reg, \ 1359341bd4e0SIgor Romanov uint32_t, _reg ## _OFST, \ 1360341bd4e0SIgor Romanov uint32_t, (_edp)->ed_u32[0]); \ 1361341bd4e0SIgor Romanov EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST + \ 1362341bd4e0SIgor Romanov (_enp)->en_arch.ef10.ena_fcw_base, \ 1363341bd4e0SIgor Romanov (_edp), B_FALSE); \ 1364341bd4e0SIgor Romanov _NOTE(CONSTANTCONDITION) \ 1365341bd4e0SIgor Romanov } while (B_FALSE) 1366341bd4e0SIgor Romanov 1367341bd4e0SIgor Romanov #endif /* EFSYS_OPT_RIVERHEAD */ 1368341bd4e0SIgor Romanov 1369341bd4e0SIgor Romanov /* 13705e111ed8SAndrew Rybchenko * Accessors for memory BAR per-VI registers. 13715e111ed8SAndrew Rybchenko * 13725e111ed8SAndrew Rybchenko * The VI window size is 8KB for Medford and all earlier controllers. 13735e111ed8SAndrew Rybchenko * For Medford2, the VI window size can be 8KB, 16KB or 64KB. 13745e111ed8SAndrew Rybchenko */ 13755e111ed8SAndrew Rybchenko 13765e111ed8SAndrew Rybchenko #define EFX_BAR_VI_READD(_enp, _reg, _index, _edp, _lock) \ 13775e111ed8SAndrew Rybchenko do { \ 13785e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 13795e111ed8SAndrew Rybchenko EFSYS_BAR_READD((_enp)->en_esbp, \ 13805e111ed8SAndrew Rybchenko ((_reg ## _OFST) + \ 13815e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 13825e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 13835e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_vi_readd, const char *, #_reg, \ 13845e111ed8SAndrew Rybchenko uint32_t, (_index), \ 13855e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 13865e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 13875e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13885e111ed8SAndrew Rybchenko } while (B_FALSE) 13895e111ed8SAndrew Rybchenko 13905e111ed8SAndrew Rybchenko #define EFX_BAR_VI_WRITED(_enp, _reg, _index, _edp, _lock) \ 13915e111ed8SAndrew Rybchenko do { \ 13925e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 13935e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_vi_writed, const char *, #_reg, \ 13945e111ed8SAndrew Rybchenko uint32_t, (_index), \ 13955e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 13965e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 13975e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 13985e111ed8SAndrew Rybchenko ((_reg ## _OFST) + \ 13995e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 14005e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 14015e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 14025e111ed8SAndrew Rybchenko } while (B_FALSE) 14035e111ed8SAndrew Rybchenko 14045e111ed8SAndrew Rybchenko #define EFX_BAR_VI_WRITED2(_enp, _reg, _index, _edp, _lock) \ 14055e111ed8SAndrew Rybchenko do { \ 14065e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 14075e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_vi_writed, const char *, #_reg, \ 14085e111ed8SAndrew Rybchenko uint32_t, (_index), \ 14095e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 14105e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 14115e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 14125e111ed8SAndrew Rybchenko ((_reg ## _OFST) + \ 14135e111ed8SAndrew Rybchenko (2 * sizeof (efx_dword_t)) + \ 14145e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 14155e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 14165e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 14175e111ed8SAndrew Rybchenko } while (B_FALSE) 14185e111ed8SAndrew Rybchenko 14195e111ed8SAndrew Rybchenko /* 14205e111ed8SAndrew Rybchenko * Allow drivers to perform optimised 128-bit VI doorbell writes. 14215e111ed8SAndrew Rybchenko * The DMA descriptor pointers (RX_DESC_UPD and TX_DESC_UPD) are 14225e111ed8SAndrew Rybchenko * special-cased in the BIU on the Falcon/Siena and EF10 architectures to avoid 14235e111ed8SAndrew Rybchenko * the need for locking in the host, and are the only ones known to be safe to 14245e111ed8SAndrew Rybchenko * use 128-bites write with. 14255e111ed8SAndrew Rybchenko */ 14265e111ed8SAndrew Rybchenko #define EFX_BAR_VI_DOORBELL_WRITEO(_enp, _reg, _index, _eop) \ 14275e111ed8SAndrew Rybchenko do { \ 14285e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 14295e111ed8SAndrew Rybchenko EFSYS_PROBE7(efx_bar_vi_doorbell_writeo, \ 14305e111ed8SAndrew Rybchenko const char *, #_reg, \ 14315e111ed8SAndrew Rybchenko uint32_t, (_index), \ 14325e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 14335e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 14345e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 14355e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 14365e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 14375e111ed8SAndrew Rybchenko EFSYS_BAR_DOORBELL_WRITEO((_enp)->en_esbp, \ 14385e111ed8SAndrew Rybchenko (_reg ## _OFST + \ 14395e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 14405e111ed8SAndrew Rybchenko (_eop)); \ 14415e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 14425e111ed8SAndrew Rybchenko } while (B_FALSE) 14435e111ed8SAndrew Rybchenko 144482192e22SAndrew Rybchenko #define EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _desc_size, \ 144582192e22SAndrew Rybchenko _wptr, _owptr) \ 14465e111ed8SAndrew Rybchenko do { \ 14475e111ed8SAndrew Rybchenko unsigned int _new = (_wptr); \ 14485e111ed8SAndrew Rybchenko unsigned int _old = (_owptr); \ 14495e111ed8SAndrew Rybchenko \ 14505e111ed8SAndrew Rybchenko if ((_new) >= (_old)) \ 14515e111ed8SAndrew Rybchenko EFSYS_DMA_SYNC_FOR_DEVICE((_esmp), \ 145282192e22SAndrew Rybchenko (_old) * (_desc_size), \ 145382192e22SAndrew Rybchenko ((_new) - (_old)) * (_desc_size)); \ 14545e111ed8SAndrew Rybchenko else \ 14555e111ed8SAndrew Rybchenko /* \ 14565e111ed8SAndrew Rybchenko * It is cheaper to sync entire map than sync \ 14575e111ed8SAndrew Rybchenko * two parts especially when offset/size are \ 14585e111ed8SAndrew Rybchenko * ignored and entire map is synced in any case.\ 14595e111ed8SAndrew Rybchenko */ \ 14605e111ed8SAndrew Rybchenko EFSYS_DMA_SYNC_FOR_DEVICE((_esmp), \ 14615e111ed8SAndrew Rybchenko 0, \ 146282192e22SAndrew Rybchenko (_entries) * (_desc_size)); \ 14635e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 14645e111ed8SAndrew Rybchenko } while (B_FALSE) 14655e111ed8SAndrew Rybchenko 14665e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14675e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14685e111ed8SAndrew Rybchenko efx_mac_select( 14695e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 14705e111ed8SAndrew Rybchenko 14715e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14725e111ed8SAndrew Rybchenko extern void 14735e111ed8SAndrew Rybchenko efx_mac_multicast_hash_compute( 14745e111ed8SAndrew Rybchenko __in_ecount(6*count) uint8_t const *addrs, 14755e111ed8SAndrew Rybchenko __in int count, 14765e111ed8SAndrew Rybchenko __out efx_oword_t *hash_low, 14775e111ed8SAndrew Rybchenko __out efx_oword_t *hash_high); 14785e111ed8SAndrew Rybchenko 14795e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14805e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14815e111ed8SAndrew Rybchenko efx_phy_probe( 14825e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 14835e111ed8SAndrew Rybchenko 14845e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14855e111ed8SAndrew Rybchenko extern void 14865e111ed8SAndrew Rybchenko efx_phy_unprobe( 14875e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 14885e111ed8SAndrew Rybchenko 14895e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 14905e111ed8SAndrew Rybchenko 14915e111ed8SAndrew Rybchenko /* VPD utility functions */ 14925e111ed8SAndrew Rybchenko 14935e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14945e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14955e111ed8SAndrew Rybchenko efx_vpd_hunk_length( 14965e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 14975e111ed8SAndrew Rybchenko __in size_t size, 14985e111ed8SAndrew Rybchenko __out size_t *lengthp); 14995e111ed8SAndrew Rybchenko 15005e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15015e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15025e111ed8SAndrew Rybchenko efx_vpd_hunk_verify( 15035e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 15045e111ed8SAndrew Rybchenko __in size_t size, 15055e111ed8SAndrew Rybchenko __out_opt boolean_t *cksummedp); 15065e111ed8SAndrew Rybchenko 15075e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15085e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15095e111ed8SAndrew Rybchenko efx_vpd_hunk_reinit( 15105e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 15115e111ed8SAndrew Rybchenko __in size_t size, 15125e111ed8SAndrew Rybchenko __in boolean_t wantpid); 15135e111ed8SAndrew Rybchenko 15145e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15155e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15165e111ed8SAndrew Rybchenko efx_vpd_hunk_get( 15175e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 15185e111ed8SAndrew Rybchenko __in size_t size, 15195e111ed8SAndrew Rybchenko __in efx_vpd_tag_t tag, 15205e111ed8SAndrew Rybchenko __in efx_vpd_keyword_t keyword, 15215e111ed8SAndrew Rybchenko __out unsigned int *payloadp, 15225e111ed8SAndrew Rybchenko __out uint8_t *paylenp); 15235e111ed8SAndrew Rybchenko 15245e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15255e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15265e111ed8SAndrew Rybchenko efx_vpd_hunk_next( 15275e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 15285e111ed8SAndrew Rybchenko __in size_t size, 15295e111ed8SAndrew Rybchenko __out efx_vpd_tag_t *tagp, 15305e111ed8SAndrew Rybchenko __out efx_vpd_keyword_t *keyword, 15315e111ed8SAndrew Rybchenko __out_opt unsigned int *payloadp, 15325e111ed8SAndrew Rybchenko __out_opt uint8_t *paylenp, 15335e111ed8SAndrew Rybchenko __inout unsigned int *contp); 15345e111ed8SAndrew Rybchenko 15355e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15365e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15375e111ed8SAndrew Rybchenko efx_vpd_hunk_set( 15385e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 15395e111ed8SAndrew Rybchenko __in size_t size, 15405e111ed8SAndrew Rybchenko __in efx_vpd_value_t *evvp); 15415e111ed8SAndrew Rybchenko 15425e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 15435e111ed8SAndrew Rybchenko 15445e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 15455e111ed8SAndrew Rybchenko 15465e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15475e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15485e111ed8SAndrew Rybchenko efx_mcdi_set_workaround( 15495e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 15505e111ed8SAndrew Rybchenko __in uint32_t type, 15515e111ed8SAndrew Rybchenko __in boolean_t enabled, 15525e111ed8SAndrew Rybchenko __out_opt uint32_t *flagsp); 15535e111ed8SAndrew Rybchenko 15545e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15555e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15565e111ed8SAndrew Rybchenko efx_mcdi_get_workarounds( 15575e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 15585e111ed8SAndrew Rybchenko __out_opt uint32_t *implementedp, 15595e111ed8SAndrew Rybchenko __out_opt uint32_t *enabledp); 15605e111ed8SAndrew Rybchenko 1561b97bf1caSAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 156285270581SAndrew Rybchenko 156385270581SAndrew Rybchenko LIBEFX_INTERNAL 156485270581SAndrew Rybchenko extern __checkReturn efx_rc_t 15657d104a8dSViacheslav Galaktionov efx_mcdi_intf_from_pcie( 15667d104a8dSViacheslav Galaktionov __in uint32_t pcie_intf, 15677d104a8dSViacheslav Galaktionov __out efx_pcie_interface_t *efx_intf); 15687d104a8dSViacheslav Galaktionov 15697d104a8dSViacheslav Galaktionov LIBEFX_INTERNAL 15707d104a8dSViacheslav Galaktionov extern __checkReturn efx_rc_t 1571b85f5048SIvan Malov efx_mcdi_intf_to_pcie( 1572b85f5048SIvan Malov __in efx_pcie_interface_t efx_intf, 1573b85f5048SIvan Malov __out uint32_t *pcie_intf); 1574b85f5048SIvan Malov 1575b85f5048SIvan Malov LIBEFX_INTERNAL 1576b85f5048SIvan Malov extern __checkReturn efx_rc_t 157785270581SAndrew Rybchenko efx_mcdi_init_evq( 157885270581SAndrew Rybchenko __in efx_nic_t *enp, 157985270581SAndrew Rybchenko __in unsigned int instance, 158085270581SAndrew Rybchenko __in efsys_mem_t *esmp, 158185270581SAndrew Rybchenko __in size_t nevs, 158285270581SAndrew Rybchenko __in uint32_t irq, 15833dee345aSAndrew Rybchenko __in uint32_t target_evq, 158485270581SAndrew Rybchenko __in uint32_t us, 158585270581SAndrew Rybchenko __in uint32_t flags, 158685270581SAndrew Rybchenko __in boolean_t low_latency); 158785270581SAndrew Rybchenko 158885270581SAndrew Rybchenko LIBEFX_INTERNAL 158985270581SAndrew Rybchenko extern __checkReturn efx_rc_t 159085270581SAndrew Rybchenko efx_mcdi_fini_evq( 159185270581SAndrew Rybchenko __in efx_nic_t *enp, 159285270581SAndrew Rybchenko __in uint32_t instance); 159385270581SAndrew Rybchenko 15947640543fSAndrew Rybchenko typedef struct efx_mcdi_init_rxq_params_s { 15957640543fSAndrew Rybchenko boolean_t disable_scatter; 15967640543fSAndrew Rybchenko boolean_t want_inner_classes; 15977640543fSAndrew Rybchenko uint32_t buf_size; 15987640543fSAndrew Rybchenko uint32_t ps_buf_size; 15997640543fSAndrew Rybchenko uint32_t es_bufs_per_desc; 16007640543fSAndrew Rybchenko uint32_t es_max_dma_len; 16017640543fSAndrew Rybchenko uint32_t es_buf_stride; 16027640543fSAndrew Rybchenko uint32_t hol_block_timeout; 1603c1f02189SAndrew Rybchenko uint32_t prefix_id; 16047640543fSAndrew Rybchenko } efx_mcdi_init_rxq_params_t; 16057640543fSAndrew Rybchenko 160609b59c7dSAndrew Rybchenko LIBEFX_INTERNAL 160709b59c7dSAndrew Rybchenko extern __checkReturn efx_rc_t 160809b59c7dSAndrew Rybchenko efx_mcdi_init_rxq( 160909b59c7dSAndrew Rybchenko __in efx_nic_t *enp, 161009b59c7dSAndrew Rybchenko __in uint32_t ndescs, 161109b59c7dSAndrew Rybchenko __in efx_evq_t *eep, 161209b59c7dSAndrew Rybchenko __in uint32_t label, 161309b59c7dSAndrew Rybchenko __in uint32_t instance, 161409b59c7dSAndrew Rybchenko __in efsys_mem_t *esmp, 16157640543fSAndrew Rybchenko __in const efx_mcdi_init_rxq_params_t *params); 161609b59c7dSAndrew Rybchenko 161709b59c7dSAndrew Rybchenko LIBEFX_INTERNAL 161809b59c7dSAndrew Rybchenko extern __checkReturn efx_rc_t 161909b59c7dSAndrew Rybchenko efx_mcdi_fini_rxq( 162009b59c7dSAndrew Rybchenko __in efx_nic_t *enp, 162109b59c7dSAndrew Rybchenko __in uint32_t instance); 162209b59c7dSAndrew Rybchenko 162370dc9c54SAndrew Rybchenko LIBEFX_INTERNAL 162470dc9c54SAndrew Rybchenko extern __checkReturn efx_rc_t 162570dc9c54SAndrew Rybchenko efx_mcdi_init_txq( 162670dc9c54SAndrew Rybchenko __in efx_nic_t *enp, 162770dc9c54SAndrew Rybchenko __in uint32_t ndescs, 162870dc9c54SAndrew Rybchenko __in uint32_t target_evq, 162970dc9c54SAndrew Rybchenko __in uint32_t label, 163070dc9c54SAndrew Rybchenko __in uint32_t instance, 163170dc9c54SAndrew Rybchenko __in uint16_t flags, 163270dc9c54SAndrew Rybchenko __in efsys_mem_t *esmp); 163370dc9c54SAndrew Rybchenko 163470dc9c54SAndrew Rybchenko LIBEFX_INTERNAL 163570dc9c54SAndrew Rybchenko extern __checkReturn efx_rc_t 163670dc9c54SAndrew Rybchenko efx_mcdi_fini_txq( 163770dc9c54SAndrew Rybchenko __in efx_nic_t *enp, 163870dc9c54SAndrew Rybchenko __in uint32_t instance); 163970dc9c54SAndrew Rybchenko 16404fd0181fSAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 164109b59c7dSAndrew Rybchenko 16425e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 16435e111ed8SAndrew Rybchenko 16445e111ed8SAndrew Rybchenko #if EFSYS_OPT_MAC_STATS 16455e111ed8SAndrew Rybchenko 16465e111ed8SAndrew Rybchenko /* 16475e111ed8SAndrew Rybchenko * Closed range of stats (i.e. the first and the last are included). 16485e111ed8SAndrew Rybchenko * The last must be greater or equal (if the range is one item only) to 16495e111ed8SAndrew Rybchenko * the first. 16505e111ed8SAndrew Rybchenko */ 16515e111ed8SAndrew Rybchenko struct efx_mac_stats_range { 16525e111ed8SAndrew Rybchenko efx_mac_stat_t first; 16535e111ed8SAndrew Rybchenko efx_mac_stat_t last; 16545e111ed8SAndrew Rybchenko }; 16555e111ed8SAndrew Rybchenko 16565e111ed8SAndrew Rybchenko typedef enum efx_stats_action_e { 16575e111ed8SAndrew Rybchenko EFX_STATS_CLEAR, 16585e111ed8SAndrew Rybchenko EFX_STATS_UPLOAD, 16595e111ed8SAndrew Rybchenko EFX_STATS_ENABLE_NOEVENTS, 16605e111ed8SAndrew Rybchenko EFX_STATS_ENABLE_EVENTS, 16615e111ed8SAndrew Rybchenko EFX_STATS_DISABLE, 16625e111ed8SAndrew Rybchenko } efx_stats_action_t; 16635e111ed8SAndrew Rybchenko 16645e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 16655e111ed8SAndrew Rybchenko extern efx_rc_t 16665e111ed8SAndrew Rybchenko efx_mac_stats_mask_add_ranges( 16675e111ed8SAndrew Rybchenko __inout_bcount(mask_size) uint32_t *maskp, 16685e111ed8SAndrew Rybchenko __in size_t mask_size, 16695e111ed8SAndrew Rybchenko __in_ecount(rng_count) const struct efx_mac_stats_range *rngp, 16705e111ed8SAndrew Rybchenko __in unsigned int rng_count); 16715e111ed8SAndrew Rybchenko 16725e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 16735e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 16745e111ed8SAndrew Rybchenko efx_mcdi_mac_stats( 16755e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 16765e111ed8SAndrew Rybchenko __in uint32_t vport_id, 16775e111ed8SAndrew Rybchenko __in_opt efsys_mem_t *esmp, 16785e111ed8SAndrew Rybchenko __in efx_stats_action_t action, 16795e111ed8SAndrew Rybchenko __in uint16_t period_ms); 16805e111ed8SAndrew Rybchenko 16815e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MAC_STATS */ 16825e111ed8SAndrew Rybchenko 1683a45edfceSIgor Romanov #if EFSYS_OPT_PCI 1684a45edfceSIgor Romanov 1685a45edfceSIgor Romanov /* 1686a45edfceSIgor Romanov * Find the next extended capability in a PCI device's config space 1687a45edfceSIgor Romanov * with specified capability id. 1688a45edfceSIgor Romanov * Passing 0 offset makes the function search from the start. 1689a45edfceSIgor Romanov * If search succeeds, found capability is in modified offset. 1690a45edfceSIgor Romanov * 1691a45edfceSIgor Romanov * Returns ENOENT if a capability is not found. 1692a45edfceSIgor Romanov */ 1693a45edfceSIgor Romanov LIBEFX_INTERNAL 1694a45edfceSIgor Romanov extern __checkReturn efx_rc_t 1695a45edfceSIgor Romanov efx_pci_config_find_next_ext_cap( 1696a45edfceSIgor Romanov __in efsys_pci_config_t *espcp, 169707999984SIgor Romanov __in const efx_pci_ops_t *epop, 1698a45edfceSIgor Romanov __in uint16_t cap_id, 1699a45edfceSIgor Romanov __inout size_t *offsetp); 1700a45edfceSIgor Romanov 1701a45edfceSIgor Romanov /* 1702a45edfceSIgor Romanov * Get the next extended capability in a PCI device's config space. 1703a45edfceSIgor Romanov * Passing 0 offset makes the function get the first capability. 1704a45edfceSIgor Romanov * If search succeeds, the capability is in modified offset. 1705a45edfceSIgor Romanov * 1706a45edfceSIgor Romanov * Returns ENOENT if there is no next capability. 1707a45edfceSIgor Romanov */ 1708a45edfceSIgor Romanov LIBEFX_INTERNAL 1709a45edfceSIgor Romanov extern __checkReturn efx_rc_t 1710a45edfceSIgor Romanov efx_pci_config_next_ext_cap( 1711a45edfceSIgor Romanov __in efsys_pci_config_t *espcp, 171207999984SIgor Romanov __in const efx_pci_ops_t *epop, 1713a45edfceSIgor Romanov __inout size_t *offsetp); 1714a45edfceSIgor Romanov 1715a45edfceSIgor Romanov /* 1716a45edfceSIgor Romanov * Find the next Xilinx capabilities table location by searching 1717a45edfceSIgor Romanov * PCI extended capabilities. 1718a45edfceSIgor Romanov * 1719a45edfceSIgor Romanov * Returns ENOENT if a table location is not found. 1720a45edfceSIgor Romanov */ 1721a45edfceSIgor Romanov LIBEFX_INTERNAL 1722a45edfceSIgor Romanov extern __checkReturn efx_rc_t 1723a45edfceSIgor Romanov efx_pci_find_next_xilinx_cap_table( 1724a45edfceSIgor Romanov __in efsys_pci_config_t *espcp, 172507999984SIgor Romanov __in const efx_pci_ops_t *epop, 1726a45edfceSIgor Romanov __inout size_t *pci_cap_offsetp, 1727a45edfceSIgor Romanov __out unsigned int *xilinx_tbl_barp, 1728a45edfceSIgor Romanov __out efsys_dma_addr_t *xilinx_tbl_offsetp); 1729a45edfceSIgor Romanov 1730a45edfceSIgor Romanov /* 1731a45edfceSIgor Romanov * Read a Xilinx extended PCI capability that gives the location 1732a45edfceSIgor Romanov * of a Xilinx capabilities table. 1733a45edfceSIgor Romanov * 1734a45edfceSIgor Romanov * Returns ENOENT if the extended PCI capability does not contain 1735a45edfceSIgor Romanov * Xilinx capabilities table locator. 1736a45edfceSIgor Romanov */ 1737a45edfceSIgor Romanov LIBEFX_INTERNAL 1738a45edfceSIgor Romanov extern __checkReturn efx_rc_t 1739a45edfceSIgor Romanov efx_pci_read_ext_cap_xilinx_table( 1740a45edfceSIgor Romanov __in efsys_pci_config_t *espcp, 174107999984SIgor Romanov __in const efx_pci_ops_t *epop, 1742a45edfceSIgor Romanov __in size_t cap_offset, 1743a45edfceSIgor Romanov __out unsigned int *barp, 1744a45edfceSIgor Romanov __out efsys_dma_addr_t *offsetp); 1745a45edfceSIgor Romanov 1746ba9568b8SIgor Romanov /* 1747ba9568b8SIgor Romanov * Find a capability with specified format_id in a Xilinx capabilities table. 1748ba9568b8SIgor Romanov * Searching is started from provided offset, taking skip_first into account. 1749ba9568b8SIgor Romanov * If search succeeds, found capability is in modified offset. 1750ba9568b8SIgor Romanov * 1751ba9568b8SIgor Romanov * Returns ENOENT if an entry with specified format id is not found. 1752ba9568b8SIgor Romanov */ 1753ba9568b8SIgor Romanov LIBEFX_INTERNAL 1754ba9568b8SIgor Romanov extern __checkReturn efx_rc_t 1755ba9568b8SIgor Romanov efx_pci_xilinx_cap_tbl_find( 1756ba9568b8SIgor Romanov __in efsys_bar_t *esbp, 1757ba9568b8SIgor Romanov __in uint32_t format_id, 1758ba9568b8SIgor Romanov __in boolean_t skip_first, 1759ba9568b8SIgor Romanov __inout efsys_dma_addr_t *entry_offsetp); 1760ba9568b8SIgor Romanov 1761a45edfceSIgor Romanov #endif /* EFSYS_OPT_PCI */ 1762a45edfceSIgor Romanov 1763b75eb50dSIvan Malov #if EFSYS_OPT_MAE 1764b75eb50dSIvan Malov 1765b75eb50dSIvan Malov struct efx_mae_match_spec_s { 1766b75eb50dSIvan Malov efx_mae_rule_type_t emms_type; 1767b75eb50dSIvan Malov uint32_t emms_prio; 176834285fd0SIvan Malov union emms_mask_value_pairs { 176937907899SIvan Malov uint8_t action[ 177037907899SIvan Malov MAE_FIELD_MASK_VALUE_PAIRS_V2_LEN]; 17711efc26e1SIvan Malov uint8_t outer[MAE_ENC_FIELD_PAIRS_LEN]; 177234285fd0SIvan Malov } emms_mask_value_pairs; 17735cf153e7SIvan Malov uint8_t emms_outer_rule_recirc_id; 1774be698f34SIvan Malov boolean_t emms_outer_rule_do_ct; 1775b75eb50dSIvan Malov }; 1776b75eb50dSIvan Malov 177780019097SIvan Malov typedef enum efx_mae_action_e { 1778616b03e0SIvan Malov /* These actions are strictly ordered. */ 17790f6b017bSIvan Malov EFX_MAE_ACTION_DECAP, 1780616b03e0SIvan Malov EFX_MAE_ACTION_VLAN_POP, 178192bafeffSIvan Malov EFX_MAE_ACTION_SET_DST_MAC, 178292bafeffSIvan Malov EFX_MAE_ACTION_SET_SRC_MAC, 1783c6e3e6c4SIvan Malov EFX_MAE_ACTION_DECR_IP_TTL, 17846cefdea5SIvan Malov EFX_MAE_ACTION_NAT, 178512cd7909SIvan Malov EFX_MAE_ACTION_VLAN_PUSH, 1786238306cfSIgor Romanov EFX_MAE_ACTION_COUNT, 17873907defaSIvan Malov EFX_MAE_ACTION_ENCAP, 1788616b03e0SIvan Malov 178977da5888SIvan Malov /* 179077da5888SIvan Malov * These actions are not strictly ordered and can 179177da5888SIvan Malov * be passed by a client in any order (before DELIVER). 179277da5888SIvan Malov * However, these enumerants must be kept compactly 179377da5888SIvan Malov * in the end of the enumeration (before DELIVER). 179477da5888SIvan Malov */ 179577da5888SIvan Malov EFX_MAE_ACTION_FLAG, 179683352289SIvan Malov EFX_MAE_ACTION_MARK, 179777da5888SIvan Malov 179880019097SIvan Malov /* DELIVER is always the last action. */ 179980019097SIvan Malov EFX_MAE_ACTION_DELIVER, 180080019097SIvan Malov 180180019097SIvan Malov EFX_MAE_NACTIONS 180280019097SIvan Malov } efx_mae_action_t; 180380019097SIvan Malov 1804616b03e0SIvan Malov /* MAE VLAN_POP action can handle 1 or 2 tags. */ 1805616b03e0SIvan Malov #define EFX_MAE_VLAN_POP_MAX_NTAGS (2) 1806616b03e0SIvan Malov 180712cd7909SIvan Malov /* MAE VLAN_PUSH action can handle 1 or 2 tags. */ 180812cd7909SIvan Malov #define EFX_MAE_VLAN_PUSH_MAX_NTAGS (2) 180912cd7909SIvan Malov 181012cd7909SIvan Malov typedef struct efx_mae_action_vlan_push_s { 181112cd7909SIvan Malov uint16_t emavp_tpid_be; 181212cd7909SIvan Malov uint16_t emavp_tci_be; 181312cd7909SIvan Malov } efx_mae_action_vlan_push_t; 181412cd7909SIvan Malov 1815cf1e1a8eSIvan Malov /* 1816cf1e1a8eSIvan Malov * Helper efx_mae_action_set_clear_fw_rsrc_ids() is responsible 1817cf1e1a8eSIvan Malov * to initialise every field in this structure to INVALID value. 1818cf1e1a8eSIvan Malov */ 18193907defaSIvan Malov typedef struct efx_mae_actions_rsrc_s { 182092bafeffSIvan Malov efx_mae_mac_id_t emar_dst_mac_id; 182192bafeffSIvan Malov efx_mae_mac_id_t emar_src_mac_id; 18223907defaSIvan Malov efx_mae_eh_id_t emar_eh_id; 1823238306cfSIgor Romanov efx_counter_t emar_counter_id; 18243907defaSIvan Malov } efx_mae_actions_rsrc_t; 18253907defaSIvan Malov 1826799889baSIvan Malov struct efx_mae_actions_s { 182780019097SIvan Malov /* Bitmap of actions in spec, indexed by action type */ 182880019097SIvan Malov uint32_t ema_actions; 182980019097SIvan Malov 1830616b03e0SIvan Malov unsigned int ema_n_vlan_tags_to_pop; 183112cd7909SIvan Malov unsigned int ema_n_vlan_tags_to_push; 183212cd7909SIvan Malov efx_mae_action_vlan_push_t ema_vlan_push_descs[ 183312cd7909SIvan Malov EFX_MAE_VLAN_PUSH_MAX_NTAGS]; 1834238306cfSIgor Romanov unsigned int ema_n_count_actions; 183583352289SIvan Malov uint32_t ema_mark_value; 183680019097SIvan Malov efx_mport_sel_t ema_deliver_mport; 18373907defaSIvan Malov 18383907defaSIvan Malov /* 18393907defaSIvan Malov * Always keep this at the end of the struct since 18403907defaSIvan Malov * efx_mae_action_set_specs_equal() relies on that 18413907defaSIvan Malov * to make sure that resource IDs are not compared. 18423907defaSIvan Malov */ 18433907defaSIvan Malov efx_mae_actions_rsrc_t ema_rsrc; 1844c6e3e6c4SIvan Malov 1845c6e3e6c4SIvan Malov /* 1846c6e3e6c4SIvan Malov * A copy of encp->enc_mae_aset_v2_supported. 1847c6e3e6c4SIvan Malov * It is set by efx_mae_action_set_spec_init(). 1848c6e3e6c4SIvan Malov * This value is ignored on spec comparisons. 1849c6e3e6c4SIvan Malov */ 1850c6e3e6c4SIvan Malov boolean_t ema_v2_is_supported; 1851799889baSIvan Malov }; 1852799889baSIvan Malov 1853b75eb50dSIvan Malov #endif /* EFSYS_OPT_MAE */ 1854b75eb50dSIvan Malov 18554dda72dbSVijay Srivastava #if EFSYS_OPT_VIRTIO 18564dda72dbSVijay Srivastava 18574dda72dbSVijay Srivastava #define EFX_VQ_MAGIC 0x026011950 18584dda72dbSVijay Srivastava 18594dda72dbSVijay Srivastava typedef enum efx_virtio_vq_state_e { 18604dda72dbSVijay Srivastava EFX_VIRTIO_VQ_STATE_UNKNOWN = 0, 18614dda72dbSVijay Srivastava EFX_VIRTIO_VQ_STATE_INITIALIZED, 18624dda72dbSVijay Srivastava EFX_VIRTIO_VQ_STATE_STARTED, 18634dda72dbSVijay Srivastava EFX_VIRTIO_VQ_NSTATES 18644dda72dbSVijay Srivastava } efx_virtio_vq_state_t; 18654dda72dbSVijay Srivastava 18664dda72dbSVijay Srivastava struct efx_virtio_vq_s { 18674dda72dbSVijay Srivastava uint32_t evv_magic; 18684dda72dbSVijay Srivastava efx_nic_t *evv_enp; 18694dda72dbSVijay Srivastava efx_virtio_vq_state_t evv_state; 18704dda72dbSVijay Srivastava uint32_t evv_vi_index; 18714dda72dbSVijay Srivastava efx_virtio_vq_type_t evv_type; 18724dda72dbSVijay Srivastava uint16_t evv_target_vf; 18734dda72dbSVijay Srivastava }; 18744dda72dbSVijay Srivastava 18754dda72dbSVijay Srivastava #endif /* EFSYS_OPT_VIRTIO */ 18764dda72dbSVijay Srivastava 18775e111ed8SAndrew Rybchenko #ifdef __cplusplus 18785e111ed8SAndrew Rybchenko } 18795e111ed8SAndrew Rybchenko #endif 18805e111ed8SAndrew Rybchenko 18815e111ed8SAndrew Rybchenko #endif /* _SYS_EFX_IMPL_H */ 1882