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); 2915e111ed8SAndrew Rybchenko } efx_filter_ops_t; 2925e111ed8SAndrew Rybchenko 2935e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2945e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2955e111ed8SAndrew Rybchenko efx_filter_reconfigure( 2965e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2975e111ed8SAndrew Rybchenko __in_ecount(6) uint8_t const *mac_addr, 2985e111ed8SAndrew Rybchenko __in boolean_t all_unicst, 2995e111ed8SAndrew Rybchenko __in boolean_t mulcst, 3005e111ed8SAndrew Rybchenko __in boolean_t all_mulcst, 3015e111ed8SAndrew Rybchenko __in boolean_t brdcst, 3025e111ed8SAndrew Rybchenko __in_ecount(6*count) uint8_t const *addrs, 3035e111ed8SAndrew Rybchenko __in uint32_t count); 3045e111ed8SAndrew Rybchenko 3055e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_FILTER */ 3065e111ed8SAndrew Rybchenko 3075e111ed8SAndrew Rybchenko #if EFSYS_OPT_TUNNEL 3085e111ed8SAndrew Rybchenko typedef struct efx_tunnel_ops_s { 3095e111ed8SAndrew Rybchenko efx_rc_t (*eto_reconfigure)(efx_nic_t *); 3104dda992fSIgor Romanov void (*eto_fini)(efx_nic_t *); 3115e111ed8SAndrew Rybchenko } efx_tunnel_ops_t; 3125e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_TUNNEL */ 3135e111ed8SAndrew Rybchenko 3144dda72dbSVijay Srivastava #if EFSYS_OPT_VIRTIO 3154dda72dbSVijay Srivastava typedef struct efx_virtio_ops_s { 3164dda72dbSVijay Srivastava efx_rc_t (*evo_virtio_qstart)(efx_virtio_vq_t *, 3174dda72dbSVijay Srivastava efx_virtio_vq_cfg_t *, 3184dda72dbSVijay Srivastava efx_virtio_vq_dyncfg_t *); 3194dda72dbSVijay Srivastava efx_rc_t (*evo_virtio_qstop)(efx_virtio_vq_t *, 3204dda72dbSVijay Srivastava efx_virtio_vq_dyncfg_t *); 321ec03ce69SVijay Srivastava efx_rc_t (*evo_get_doorbell_offset)(efx_virtio_vq_t *, 322ec03ce69SVijay Srivastava uint32_t *); 32346d2b38bSVijay Kumar Srivastava efx_rc_t (*evo_get_features)(efx_nic_t *, 32446d2b38bSVijay Kumar Srivastava efx_virtio_device_type_t, uint64_t *); 325b8a896abSVijay Kumar Srivastava efx_rc_t (*evo_verify_features)(efx_nic_t *, 326b8a896abSVijay Kumar Srivastava efx_virtio_device_type_t, uint64_t); 3274dda72dbSVijay Srivastava } efx_virtio_ops_t; 3284dda72dbSVijay Srivastava #endif /* EFSYS_OPT_VIRTIO */ 3294dda72dbSVijay Srivastava 3305e111ed8SAndrew Rybchenko typedef struct efx_port_s { 3315e111ed8SAndrew Rybchenko efx_mac_type_t ep_mac_type; 3325e111ed8SAndrew Rybchenko uint32_t ep_phy_type; 3335e111ed8SAndrew Rybchenko uint8_t ep_port; 3345e111ed8SAndrew Rybchenko uint32_t ep_mac_pdu; 3355e111ed8SAndrew Rybchenko uint8_t ep_mac_addr[6]; 3365e111ed8SAndrew Rybchenko efx_link_mode_t ep_link_mode; 3375e111ed8SAndrew Rybchenko boolean_t ep_all_unicst; 3385e111ed8SAndrew Rybchenko boolean_t ep_all_unicst_inserted; 3395e111ed8SAndrew Rybchenko boolean_t ep_mulcst; 3405e111ed8SAndrew Rybchenko boolean_t ep_all_mulcst; 3415e111ed8SAndrew Rybchenko boolean_t ep_all_mulcst_inserted; 3425e111ed8SAndrew Rybchenko boolean_t ep_brdcst; 3435e111ed8SAndrew Rybchenko unsigned int ep_fcntl; 3445e111ed8SAndrew Rybchenko boolean_t ep_fcntl_autoneg; 3455e111ed8SAndrew Rybchenko efx_oword_t ep_multicst_hash[2]; 3465e111ed8SAndrew Rybchenko uint8_t ep_mulcst_addr_list[EFX_MAC_ADDR_LEN * 3475e111ed8SAndrew Rybchenko EFX_MAC_MULTICAST_LIST_MAX]; 3485e111ed8SAndrew Rybchenko uint32_t ep_mulcst_addr_count; 3495e111ed8SAndrew Rybchenko #if EFSYS_OPT_LOOPBACK 3505e111ed8SAndrew Rybchenko efx_loopback_type_t ep_loopback_type; 3515e111ed8SAndrew Rybchenko efx_link_mode_t ep_loopback_link_mode; 3525e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_LOOPBACK */ 3535e111ed8SAndrew Rybchenko #if EFSYS_OPT_PHY_FLAGS 3545e111ed8SAndrew Rybchenko uint32_t ep_phy_flags; 3555e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_PHY_FLAGS */ 3565e111ed8SAndrew Rybchenko #if EFSYS_OPT_PHY_LED_CONTROL 3575e111ed8SAndrew Rybchenko efx_phy_led_mode_t ep_phy_led_mode; 3585e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_PHY_LED_CONTROL */ 3595e111ed8SAndrew Rybchenko efx_phy_media_type_t ep_fixed_port_type; 3605e111ed8SAndrew Rybchenko efx_phy_media_type_t ep_module_type; 3615e111ed8SAndrew Rybchenko uint32_t ep_adv_cap_mask; 3625e111ed8SAndrew Rybchenko uint32_t ep_lp_cap_mask; 3635e111ed8SAndrew Rybchenko uint32_t ep_default_adv_cap_mask; 3645e111ed8SAndrew Rybchenko uint32_t ep_phy_cap_mask; 3655e111ed8SAndrew Rybchenko boolean_t ep_mac_drain; 3665e111ed8SAndrew Rybchenko #if EFSYS_OPT_BIST 3675e111ed8SAndrew Rybchenko efx_bist_type_t ep_current_bist; 3685e111ed8SAndrew Rybchenko #endif 3695e111ed8SAndrew Rybchenko const efx_mac_ops_t *ep_emop; 3705e111ed8SAndrew Rybchenko const efx_phy_ops_t *ep_epop; 3715e111ed8SAndrew Rybchenko } efx_port_t; 3725e111ed8SAndrew Rybchenko 3735e111ed8SAndrew Rybchenko typedef struct efx_mon_ops_s { 3745e111ed8SAndrew Rybchenko #if EFSYS_OPT_MON_STATS 3755e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 3765e111ed8SAndrew Rybchenko efx_mon_stat_value_t *); 3775e111ed8SAndrew Rybchenko efx_rc_t (*emo_limits_update)(efx_nic_t *, 3785e111ed8SAndrew Rybchenko efx_mon_stat_limits_t *); 3795e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MON_STATS */ 3805e111ed8SAndrew Rybchenko } efx_mon_ops_t; 3815e111ed8SAndrew Rybchenko 3825e111ed8SAndrew Rybchenko typedef struct efx_mon_s { 3835e111ed8SAndrew Rybchenko efx_mon_type_t em_type; 3845e111ed8SAndrew Rybchenko const efx_mon_ops_t *em_emop; 3855e111ed8SAndrew Rybchenko } efx_mon_t; 3865e111ed8SAndrew Rybchenko 3875e111ed8SAndrew Rybchenko typedef struct efx_intr_ops_s { 3885e111ed8SAndrew Rybchenko efx_rc_t (*eio_init)(efx_nic_t *, efx_intr_type_t, efsys_mem_t *); 3895e111ed8SAndrew Rybchenko void (*eio_enable)(efx_nic_t *); 3905e111ed8SAndrew Rybchenko void (*eio_disable)(efx_nic_t *); 3915e111ed8SAndrew Rybchenko void (*eio_disable_unlocked)(efx_nic_t *); 3925e111ed8SAndrew Rybchenko efx_rc_t (*eio_trigger)(efx_nic_t *, unsigned int); 3935e111ed8SAndrew Rybchenko void (*eio_status_line)(efx_nic_t *, boolean_t *, uint32_t *); 3945e111ed8SAndrew Rybchenko void (*eio_status_message)(efx_nic_t *, unsigned int, 3955e111ed8SAndrew Rybchenko boolean_t *); 3965e111ed8SAndrew Rybchenko void (*eio_fatal)(efx_nic_t *); 3975e111ed8SAndrew Rybchenko void (*eio_fini)(efx_nic_t *); 3985e111ed8SAndrew Rybchenko } efx_intr_ops_t; 3995e111ed8SAndrew Rybchenko 4005e111ed8SAndrew Rybchenko typedef struct efx_intr_s { 4015e111ed8SAndrew Rybchenko const efx_intr_ops_t *ei_eiop; 4025e111ed8SAndrew Rybchenko efsys_mem_t *ei_esmp; 4035e111ed8SAndrew Rybchenko efx_intr_type_t ei_type; 4045e111ed8SAndrew Rybchenko unsigned int ei_level; 4055e111ed8SAndrew Rybchenko } efx_intr_t; 4065e111ed8SAndrew Rybchenko 4075e111ed8SAndrew Rybchenko typedef struct efx_nic_ops_s { 4085e111ed8SAndrew Rybchenko efx_rc_t (*eno_probe)(efx_nic_t *); 4095e111ed8SAndrew Rybchenko efx_rc_t (*eno_board_cfg)(efx_nic_t *); 4105e111ed8SAndrew Rybchenko efx_rc_t (*eno_set_drv_limits)(efx_nic_t *, efx_drv_limits_t*); 4115e111ed8SAndrew Rybchenko efx_rc_t (*eno_reset)(efx_nic_t *); 4125e111ed8SAndrew Rybchenko efx_rc_t (*eno_init)(efx_nic_t *); 4135e111ed8SAndrew Rybchenko efx_rc_t (*eno_get_vi_pool)(efx_nic_t *, uint32_t *); 4145e111ed8SAndrew Rybchenko efx_rc_t (*eno_get_bar_region)(efx_nic_t *, efx_nic_region_t, 4155e111ed8SAndrew Rybchenko uint32_t *, size_t *); 4165e111ed8SAndrew Rybchenko boolean_t (*eno_hw_unavailable)(efx_nic_t *); 4175e111ed8SAndrew Rybchenko void (*eno_set_hw_unavailable)(efx_nic_t *); 4185e111ed8SAndrew Rybchenko #if EFSYS_OPT_DIAG 4195e111ed8SAndrew Rybchenko efx_rc_t (*eno_register_test)(efx_nic_t *); 4205e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_DIAG */ 4215e111ed8SAndrew Rybchenko void (*eno_fini)(efx_nic_t *); 4225e111ed8SAndrew Rybchenko void (*eno_unprobe)(efx_nic_t *); 4235e111ed8SAndrew Rybchenko } efx_nic_ops_t; 4245e111ed8SAndrew Rybchenko 4255e111ed8SAndrew Rybchenko #ifndef EFX_TXQ_LIMIT_TARGET 4265e111ed8SAndrew Rybchenko #define EFX_TXQ_LIMIT_TARGET 259 4275e111ed8SAndrew Rybchenko #endif 4285e111ed8SAndrew Rybchenko #ifndef EFX_RXQ_LIMIT_TARGET 4295e111ed8SAndrew Rybchenko #define EFX_RXQ_LIMIT_TARGET 512 4305e111ed8SAndrew Rybchenko #endif 4315e111ed8SAndrew Rybchenko 43260fb370cSAndrew Rybchenko typedef struct efx_nic_dma_region_s { 43360fb370cSAndrew Rybchenko efsys_dma_addr_t endr_nic_base; 43460fb370cSAndrew Rybchenko efsys_dma_addr_t endr_trgt_base; 43560fb370cSAndrew Rybchenko unsigned int endr_window_log2; 43660fb370cSAndrew Rybchenko unsigned int endr_align_log2; 43760fb370cSAndrew Rybchenko boolean_t endr_inuse; 43860fb370cSAndrew Rybchenko } efx_nic_dma_region_t; 43960fb370cSAndrew Rybchenko 44060fb370cSAndrew Rybchenko typedef struct efx_nic_dma_region_info_s { 44160fb370cSAndrew Rybchenko unsigned int endri_count; 44260fb370cSAndrew Rybchenko efx_nic_dma_region_t *endri_regions; 44360fb370cSAndrew Rybchenko } efx_nic_dma_region_info_t; 44460fb370cSAndrew Rybchenko 44560fb370cSAndrew Rybchenko typedef struct efx_nic_dma_s { 44660fb370cSAndrew Rybchenko union { 44760fb370cSAndrew Rybchenko /* No configuration in the case flat mapping type */ 44860fb370cSAndrew Rybchenko efx_nic_dma_region_info_t endu_region_info; 44960fb370cSAndrew Rybchenko } end_u; 45060fb370cSAndrew Rybchenko } efx_nic_dma_t; 4515e111ed8SAndrew Rybchenko 4525e111ed8SAndrew Rybchenko #if EFSYS_OPT_FILTER 4535e111ed8SAndrew Rybchenko 4545e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 4555e111ed8SAndrew Rybchenko 4565e111ed8SAndrew Rybchenko typedef struct siena_filter_spec_s { 4575e111ed8SAndrew Rybchenko uint8_t sfs_type; 4585e111ed8SAndrew Rybchenko uint32_t sfs_flags; 4595e111ed8SAndrew Rybchenko uint32_t sfs_dmaq_id; 4605e111ed8SAndrew Rybchenko uint32_t sfs_dword[3]; 4615e111ed8SAndrew Rybchenko } siena_filter_spec_t; 4625e111ed8SAndrew Rybchenko 4635e111ed8SAndrew Rybchenko typedef enum siena_filter_type_e { 4645e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_TCP_FULL, /* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */ 4655e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_TCP_WILD, /* TCP/IPv4 {dIP,dTCP, -, -} */ 4665e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_UDP_FULL, /* UDP/IPv4 {dIP,dUDP,sIP,sUDP} */ 4675e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_UDP_WILD, /* UDP/IPv4 {dIP,dUDP, -, -} */ 4685e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_MAC_FULL, /* Ethernet {dMAC,VLAN} */ 4695e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_MAC_WILD, /* Ethernet {dMAC, -} */ 4705e111ed8SAndrew Rybchenko 4715e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_TCP_FULL, /* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */ 4725e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_TCP_WILD, /* TCP/IPv4 { -, -,sIP,sTCP} */ 4735e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_UDP_FULL, /* UDP/IPv4 {dIP,dTCP,sIP,sTCP} */ 4745e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_UDP_WILD, /* UDP/IPv4 { -, -,sIP,sUDP} */ 4755e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_MAC_FULL, /* Ethernet {sMAC,VLAN} */ 4765e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_MAC_WILD, /* Ethernet {sMAC, -} */ 4775e111ed8SAndrew Rybchenko 4785e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_NTYPES 4795e111ed8SAndrew Rybchenko } siena_filter_type_t; 4805e111ed8SAndrew Rybchenko 4815e111ed8SAndrew Rybchenko typedef enum siena_filter_tbl_id_e { 4825e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_RX_IP = 0, 4835e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_RX_MAC, 4845e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_TX_IP, 4855e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_TX_MAC, 4865e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_NTBLS 4875e111ed8SAndrew Rybchenko } siena_filter_tbl_id_t; 4885e111ed8SAndrew Rybchenko 4895e111ed8SAndrew Rybchenko typedef struct siena_filter_tbl_s { 4905e111ed8SAndrew Rybchenko int sft_size; /* number of entries */ 4915e111ed8SAndrew Rybchenko int sft_used; /* active count */ 4925e111ed8SAndrew Rybchenko uint32_t *sft_bitmap; /* active bitmap */ 4935e111ed8SAndrew Rybchenko siena_filter_spec_t *sft_spec; /* array of saved specs */ 4945e111ed8SAndrew Rybchenko } siena_filter_tbl_t; 4955e111ed8SAndrew Rybchenko 4965e111ed8SAndrew Rybchenko typedef struct siena_filter_s { 4975e111ed8SAndrew Rybchenko siena_filter_tbl_t sf_tbl[EFX_SIENA_FILTER_NTBLS]; 4985e111ed8SAndrew Rybchenko unsigned int sf_depth[EFX_SIENA_FILTER_NTYPES]; 4995e111ed8SAndrew Rybchenko } siena_filter_t; 5005e111ed8SAndrew Rybchenko 5015e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 5025e111ed8SAndrew Rybchenko 5035e111ed8SAndrew Rybchenko typedef struct efx_filter_s { 5045e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 5055e111ed8SAndrew Rybchenko siena_filter_t *ef_siena_filter; 5065e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 507e1fe2c33SAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 5085e111ed8SAndrew Rybchenko ef10_filter_table_t *ef_ef10_filter_table; 509e1fe2c33SAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 5105e111ed8SAndrew Rybchenko } efx_filter_t; 5115e111ed8SAndrew Rybchenko 5125e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 5135e111ed8SAndrew Rybchenko 5145e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 5155e111ed8SAndrew Rybchenko extern void 5165e111ed8SAndrew Rybchenko siena_filter_tbl_clear( 5175e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 5185e111ed8SAndrew Rybchenko __in siena_filter_tbl_id_t tbl); 5195e111ed8SAndrew Rybchenko 5205e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 5215e111ed8SAndrew Rybchenko 5225e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_FILTER */ 5235e111ed8SAndrew Rybchenko 5245e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 5255e111ed8SAndrew Rybchenko 5265e111ed8SAndrew Rybchenko #define EFX_TUNNEL_MAXNENTRIES (16) 5275e111ed8SAndrew Rybchenko 5285e111ed8SAndrew Rybchenko #if EFSYS_OPT_TUNNEL 5295e111ed8SAndrew Rybchenko 53072e9af05SIgor Romanov /* State of a UDP tunnel table entry */ 53172e9af05SIgor Romanov typedef enum efx_tunnel_udp_entry_state_e { 53272e9af05SIgor Romanov EFX_TUNNEL_UDP_ENTRY_ADDED, /* Tunnel addition is requested */ 53372e9af05SIgor Romanov EFX_TUNNEL_UDP_ENTRY_REMOVED, /* Tunnel removal is requested */ 53472e9af05SIgor Romanov EFX_TUNNEL_UDP_ENTRY_APPLIED, /* Tunnel is applied by HW */ 53572e9af05SIgor Romanov } efx_tunnel_udp_entry_state_t; 53672e9af05SIgor Romanov 537d874d2a1SIgor Romanov #if EFSYS_OPT_RIVERHEAD 538d874d2a1SIgor Romanov typedef uint32_t efx_vnic_encap_rule_handle_t; 539d874d2a1SIgor Romanov #endif /* EFSYS_OPT_RIVERHEAD */ 540d874d2a1SIgor Romanov 5415e111ed8SAndrew Rybchenko typedef struct efx_tunnel_udp_entry_s { 5425e111ed8SAndrew Rybchenko uint16_t etue_port; /* host/cpu-endian */ 5435e111ed8SAndrew Rybchenko uint16_t etue_protocol; 54472e9af05SIgor Romanov boolean_t etue_busy; 54572e9af05SIgor Romanov efx_tunnel_udp_entry_state_t etue_state; 546d874d2a1SIgor Romanov #if EFSYS_OPT_RIVERHEAD 547d874d2a1SIgor Romanov efx_vnic_encap_rule_handle_t etue_handle; 548d874d2a1SIgor Romanov #endif /* EFSYS_OPT_RIVERHEAD */ 5495e111ed8SAndrew Rybchenko } efx_tunnel_udp_entry_t; 5505e111ed8SAndrew Rybchenko 5515e111ed8SAndrew Rybchenko typedef struct efx_tunnel_cfg_s { 5525e111ed8SAndrew Rybchenko efx_tunnel_udp_entry_t etc_udp_entries[EFX_TUNNEL_MAXNENTRIES]; 5535e111ed8SAndrew Rybchenko unsigned int etc_udp_entries_num; 5545e111ed8SAndrew Rybchenko } efx_tunnel_cfg_t; 5555e111ed8SAndrew Rybchenko 5565e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_TUNNEL */ 5575e111ed8SAndrew Rybchenko 5585e111ed8SAndrew Rybchenko typedef struct efx_mcdi_ops_s { 5595e111ed8SAndrew Rybchenko efx_rc_t (*emco_init)(efx_nic_t *, const efx_mcdi_transport_t *); 5605e111ed8SAndrew Rybchenko void (*emco_send_request)(efx_nic_t *, void *, size_t, 5615e111ed8SAndrew Rybchenko void *, size_t); 5625e111ed8SAndrew Rybchenko efx_rc_t (*emco_poll_reboot)(efx_nic_t *); 5635e111ed8SAndrew Rybchenko boolean_t (*emco_poll_response)(efx_nic_t *); 5645e111ed8SAndrew Rybchenko void (*emco_read_response)(efx_nic_t *, void *, size_t, size_t); 5655e111ed8SAndrew Rybchenko void (*emco_fini)(efx_nic_t *); 5665e111ed8SAndrew Rybchenko efx_rc_t (*emco_feature_supported)(efx_nic_t *, 5675e111ed8SAndrew Rybchenko efx_mcdi_feature_id_t, boolean_t *); 5685e111ed8SAndrew Rybchenko void (*emco_get_timeout)(efx_nic_t *, efx_mcdi_req_t *, 5695e111ed8SAndrew Rybchenko uint32_t *); 5705e111ed8SAndrew Rybchenko } efx_mcdi_ops_t; 5715e111ed8SAndrew Rybchenko 5725e111ed8SAndrew Rybchenko typedef struct efx_mcdi_s { 5735e111ed8SAndrew Rybchenko const efx_mcdi_ops_t *em_emcop; 5745e111ed8SAndrew Rybchenko const efx_mcdi_transport_t *em_emtp; 5755e111ed8SAndrew Rybchenko efx_mcdi_iface_t em_emip; 5765e111ed8SAndrew Rybchenko } efx_mcdi_t; 5775e111ed8SAndrew Rybchenko 5785e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 5795e111ed8SAndrew Rybchenko 5805e111ed8SAndrew Rybchenko #if EFSYS_OPT_NVRAM 5815e111ed8SAndrew Rybchenko 5825e111ed8SAndrew Rybchenko /* Invalid partition ID for en_nvram_partn_locked field of efx_nc_t */ 5835e111ed8SAndrew Rybchenko #define EFX_NVRAM_PARTN_INVALID (0xffffffffu) 5845e111ed8SAndrew Rybchenko 5855e111ed8SAndrew Rybchenko typedef struct efx_nvram_ops_s { 5865e111ed8SAndrew Rybchenko #if EFSYS_OPT_DIAG 5875e111ed8SAndrew Rybchenko efx_rc_t (*envo_test)(efx_nic_t *); 5885e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_DIAG */ 5895e111ed8SAndrew Rybchenko efx_rc_t (*envo_type_to_partn)(efx_nic_t *, efx_nvram_type_t, 5905e111ed8SAndrew Rybchenko uint32_t *); 5915e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_info)(efx_nic_t *, uint32_t, 5925e111ed8SAndrew Rybchenko efx_nvram_info_t *); 5935e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_rw_start)(efx_nic_t *, uint32_t, size_t *); 5945e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_read)(efx_nic_t *, uint32_t, 5955e111ed8SAndrew Rybchenko unsigned int, caddr_t, size_t); 5965e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_read_backup)(efx_nic_t *, uint32_t, 5975e111ed8SAndrew Rybchenko unsigned int, caddr_t, size_t); 5985e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_erase)(efx_nic_t *, uint32_t, 5995e111ed8SAndrew Rybchenko unsigned int, size_t); 6005e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_write)(efx_nic_t *, uint32_t, 6015e111ed8SAndrew Rybchenko unsigned int, caddr_t, size_t); 6025e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_rw_finish)(efx_nic_t *, uint32_t, 6035e111ed8SAndrew Rybchenko uint32_t *); 6045e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_get_version)(efx_nic_t *, uint32_t, 6055e111ed8SAndrew Rybchenko uint32_t *, uint16_t *); 6065e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_set_version)(efx_nic_t *, uint32_t, 6075e111ed8SAndrew Rybchenko uint16_t *); 6085e111ed8SAndrew Rybchenko efx_rc_t (*envo_buffer_validate)(uint32_t, 6095e111ed8SAndrew Rybchenko caddr_t, size_t); 6105e111ed8SAndrew Rybchenko } efx_nvram_ops_t; 6115e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NVRAM */ 6125e111ed8SAndrew Rybchenko 6135e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 6145e111ed8SAndrew Rybchenko typedef struct efx_vpd_ops_s { 6155e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_init)(efx_nic_t *); 6165e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_size)(efx_nic_t *, size_t *); 6175e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_read)(efx_nic_t *, caddr_t, size_t); 6185e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_verify)(efx_nic_t *, caddr_t, size_t); 6195e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_reinit)(efx_nic_t *, caddr_t, size_t); 6205e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_get)(efx_nic_t *, caddr_t, size_t, 6215e111ed8SAndrew Rybchenko efx_vpd_value_t *); 6225e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_set)(efx_nic_t *, caddr_t, size_t, 6235e111ed8SAndrew Rybchenko efx_vpd_value_t *); 6245e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_next)(efx_nic_t *, caddr_t, size_t, 6255e111ed8SAndrew Rybchenko efx_vpd_value_t *, unsigned int *); 6265e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_write)(efx_nic_t *, caddr_t, size_t); 6275e111ed8SAndrew Rybchenko void (*evpdo_fini)(efx_nic_t *); 6285e111ed8SAndrew Rybchenko } efx_vpd_ops_t; 6295e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 6305e111ed8SAndrew Rybchenko 6315e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM 6325e111ed8SAndrew Rybchenko 6335e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6345e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6355e111ed8SAndrew Rybchenko efx_mcdi_nvram_partitions( 6365e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6375e111ed8SAndrew Rybchenko __out_bcount(size) caddr_t data, 6385e111ed8SAndrew Rybchenko __in size_t size, 6395e111ed8SAndrew Rybchenko __out unsigned int *npartnp); 6405e111ed8SAndrew Rybchenko 6415e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6425e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6435e111ed8SAndrew Rybchenko efx_mcdi_nvram_metadata( 6445e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6455e111ed8SAndrew Rybchenko __in uint32_t partn, 6465e111ed8SAndrew Rybchenko __out uint32_t *subtypep, 6475e111ed8SAndrew Rybchenko __out_ecount(4) uint16_t version[4], 6485e111ed8SAndrew Rybchenko __out_bcount_opt(size) char *descp, 6495e111ed8SAndrew Rybchenko __in size_t size); 6505e111ed8SAndrew Rybchenko 6515e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6525e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6535e111ed8SAndrew Rybchenko efx_mcdi_nvram_info( 6545e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6555e111ed8SAndrew Rybchenko __in uint32_t partn, 6565e111ed8SAndrew Rybchenko __out efx_nvram_info_t *eni); 6575e111ed8SAndrew Rybchenko 6585e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6595e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6605e111ed8SAndrew Rybchenko efx_mcdi_nvram_update_start( 6615e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6625e111ed8SAndrew Rybchenko __in uint32_t partn); 6635e111ed8SAndrew Rybchenko 6645e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6655e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6665e111ed8SAndrew Rybchenko efx_mcdi_nvram_read( 6675e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6685e111ed8SAndrew Rybchenko __in uint32_t partn, 6695e111ed8SAndrew Rybchenko __in uint32_t offset, 6705e111ed8SAndrew Rybchenko __out_bcount(size) caddr_t data, 6715e111ed8SAndrew Rybchenko __in size_t size, 6725e111ed8SAndrew Rybchenko __in uint32_t mode); 6735e111ed8SAndrew Rybchenko 6745e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6755e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6765e111ed8SAndrew Rybchenko efx_mcdi_nvram_erase( 6775e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6785e111ed8SAndrew Rybchenko __in uint32_t partn, 6795e111ed8SAndrew Rybchenko __in uint32_t offset, 6805e111ed8SAndrew Rybchenko __in size_t size); 6815e111ed8SAndrew Rybchenko 6825e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6835e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6845e111ed8SAndrew Rybchenko efx_mcdi_nvram_write( 6855e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6865e111ed8SAndrew Rybchenko __in uint32_t partn, 6875e111ed8SAndrew Rybchenko __in uint32_t offset, 6885e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 6895e111ed8SAndrew Rybchenko __in size_t size); 6905e111ed8SAndrew Rybchenko 6915e111ed8SAndrew Rybchenko #define EFX_NVRAM_UPDATE_FLAGS_BACKGROUND 0x00000001 6925e111ed8SAndrew Rybchenko #define EFX_NVRAM_UPDATE_FLAGS_POLL 0x00000002 6935e111ed8SAndrew Rybchenko 6945e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6955e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6965e111ed8SAndrew Rybchenko efx_mcdi_nvram_update_finish( 6975e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6985e111ed8SAndrew Rybchenko __in uint32_t partn, 6995e111ed8SAndrew Rybchenko __in boolean_t reboot, 7005e111ed8SAndrew Rybchenko __in uint32_t flags, 7015e111ed8SAndrew Rybchenko __out_opt uint32_t *verify_resultp); 7025e111ed8SAndrew Rybchenko 7035e111ed8SAndrew Rybchenko #if EFSYS_OPT_DIAG 7045e111ed8SAndrew Rybchenko 7055e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 7065e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 7075e111ed8SAndrew Rybchenko efx_mcdi_nvram_test( 7085e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 7095e111ed8SAndrew Rybchenko __in uint32_t partn); 7105e111ed8SAndrew Rybchenko 7115e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_DIAG */ 7125e111ed8SAndrew Rybchenko 7135e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */ 7145e111ed8SAndrew Rybchenko 7155e111ed8SAndrew Rybchenko #if EFSYS_OPT_LICENSING 7165e111ed8SAndrew Rybchenko 7175e111ed8SAndrew Rybchenko typedef struct efx_lic_ops_s { 7185e111ed8SAndrew Rybchenko efx_rc_t (*elo_update_licenses)(efx_nic_t *); 7195e111ed8SAndrew Rybchenko efx_rc_t (*elo_get_key_stats)(efx_nic_t *, efx_key_stats_t *); 7205e111ed8SAndrew Rybchenko efx_rc_t (*elo_app_state)(efx_nic_t *, uint64_t, boolean_t *); 7215e111ed8SAndrew Rybchenko efx_rc_t (*elo_get_id)(efx_nic_t *, size_t, uint32_t *, 7225e111ed8SAndrew Rybchenko size_t *, uint8_t *); 7235e111ed8SAndrew Rybchenko efx_rc_t (*elo_find_start) 7245e111ed8SAndrew Rybchenko (efx_nic_t *, caddr_t, size_t, uint32_t *); 7255e111ed8SAndrew Rybchenko efx_rc_t (*elo_find_end)(efx_nic_t *, caddr_t, size_t, 7265e111ed8SAndrew Rybchenko uint32_t, uint32_t *); 7275e111ed8SAndrew Rybchenko boolean_t (*elo_find_key)(efx_nic_t *, caddr_t, size_t, 7285e111ed8SAndrew Rybchenko uint32_t, uint32_t *, uint32_t *); 7295e111ed8SAndrew Rybchenko boolean_t (*elo_validate_key)(efx_nic_t *, 7305e111ed8SAndrew Rybchenko caddr_t, uint32_t); 7315e111ed8SAndrew Rybchenko efx_rc_t (*elo_read_key)(efx_nic_t *, 7325e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t, uint32_t, 7335e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t *); 7345e111ed8SAndrew Rybchenko efx_rc_t (*elo_write_key)(efx_nic_t *, 7355e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t, 7365e111ed8SAndrew Rybchenko caddr_t, uint32_t, uint32_t *); 7375e111ed8SAndrew Rybchenko efx_rc_t (*elo_delete_key)(efx_nic_t *, 7385e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t, 7395e111ed8SAndrew Rybchenko uint32_t, uint32_t, uint32_t *); 7405e111ed8SAndrew Rybchenko efx_rc_t (*elo_create_partition)(efx_nic_t *, 7415e111ed8SAndrew Rybchenko caddr_t, size_t); 7425e111ed8SAndrew Rybchenko efx_rc_t (*elo_finish_partition)(efx_nic_t *, 7435e111ed8SAndrew Rybchenko caddr_t, size_t); 7445e111ed8SAndrew Rybchenko } efx_lic_ops_t; 7455e111ed8SAndrew Rybchenko 7465e111ed8SAndrew Rybchenko #endif 7475e111ed8SAndrew Rybchenko 7485e111ed8SAndrew Rybchenko #if EFSYS_OPT_EVB 7495e111ed8SAndrew Rybchenko 7505e111ed8SAndrew Rybchenko struct efx_vswitch_s { 7515e111ed8SAndrew Rybchenko efx_nic_t *ev_enp; 7525e111ed8SAndrew Rybchenko efx_vswitch_id_t ev_vswitch_id; 7535e111ed8SAndrew Rybchenko uint32_t ev_num_vports; 7545e111ed8SAndrew Rybchenko /* 7555e111ed8SAndrew Rybchenko * Vport configuration array: index 0 to store PF configuration 7565e111ed8SAndrew Rybchenko * and next ev_num_vports-1 entries hold VFs configuration. 7575e111ed8SAndrew Rybchenko */ 7585e111ed8SAndrew Rybchenko efx_vport_config_t *ev_evcp; 7595e111ed8SAndrew Rybchenko }; 7605e111ed8SAndrew Rybchenko 7615e111ed8SAndrew Rybchenko typedef struct efx_evb_ops_s { 7625e111ed8SAndrew Rybchenko efx_rc_t (*eeo_init)(efx_nic_t *); 7635e111ed8SAndrew Rybchenko void (*eeo_fini)(efx_nic_t *); 7645e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vswitch_alloc)(efx_nic_t *, efx_vswitch_id_t *); 7655e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vswitch_free)(efx_nic_t *, efx_vswitch_id_t); 7665e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_alloc)(efx_nic_t *, efx_vswitch_id_t, 7675e111ed8SAndrew Rybchenko efx_vport_type_t, uint16_t, 7685e111ed8SAndrew Rybchenko boolean_t, efx_vport_id_t *); 7695e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_free)(efx_nic_t *, efx_vswitch_id_t, 7705e111ed8SAndrew Rybchenko efx_vport_id_t); 7715e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_mac_addr_add)(efx_nic_t *, efx_vswitch_id_t, 7725e111ed8SAndrew Rybchenko efx_vport_id_t, uint8_t *); 7735e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_mac_addr_del)(efx_nic_t *, efx_vswitch_id_t, 7745e111ed8SAndrew Rybchenko efx_vport_id_t, uint8_t *); 7755e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vadaptor_alloc)(efx_nic_t *, efx_vswitch_id_t, 7765e111ed8SAndrew Rybchenko efx_vport_id_t); 7775e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vadaptor_free)(efx_nic_t *, efx_vswitch_id_t, 7785e111ed8SAndrew Rybchenko efx_vport_id_t); 7795e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_assign)(efx_nic_t *, efx_vswitch_id_t, 7805e111ed8SAndrew Rybchenko efx_vport_id_t, uint32_t); 7815e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_reconfigure)(efx_nic_t *, efx_vswitch_id_t, 7825e111ed8SAndrew Rybchenko efx_vport_id_t, 7835e111ed8SAndrew Rybchenko uint16_t *, uint8_t *, 7845e111ed8SAndrew Rybchenko boolean_t *); 7855e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_stats)(efx_nic_t *, efx_vswitch_id_t, 7865e111ed8SAndrew Rybchenko efx_vport_id_t, efsys_mem_t *); 7875e111ed8SAndrew Rybchenko } efx_evb_ops_t; 7885e111ed8SAndrew Rybchenko 7895e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 7905e111ed8SAndrew Rybchenko extern __checkReturn boolean_t 7915e111ed8SAndrew Rybchenko efx_is_zero_eth_addr( 7925e111ed8SAndrew Rybchenko __in_bcount(EFX_MAC_ADDR_LEN) const uint8_t *addrp); 7935e111ed8SAndrew Rybchenko 7945e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_EVB */ 7955e111ed8SAndrew Rybchenko 7965e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER 7975e111ed8SAndrew Rybchenko 7985e111ed8SAndrew Rybchenko #define EFX_PROXY_CONFIGURE_MAGIC 0xAB2015EF 7995e111ed8SAndrew Rybchenko 8005e111ed8SAndrew Rybchenko 8015e111ed8SAndrew Rybchenko typedef struct efx_proxy_ops_s { 8025e111ed8SAndrew Rybchenko efx_rc_t (*epo_init)(efx_nic_t *); 8035e111ed8SAndrew Rybchenko void (*epo_fini)(efx_nic_t *); 8045e111ed8SAndrew Rybchenko efx_rc_t (*epo_mc_config)(efx_nic_t *, efsys_mem_t *, 8055e111ed8SAndrew Rybchenko efsys_mem_t *, efsys_mem_t *, 8065e111ed8SAndrew Rybchenko uint32_t, uint32_t *, size_t); 8075e111ed8SAndrew Rybchenko efx_rc_t (*epo_disable)(efx_nic_t *); 8085e111ed8SAndrew Rybchenko efx_rc_t (*epo_privilege_modify)(efx_nic_t *, uint32_t, uint32_t, 8095e111ed8SAndrew Rybchenko uint32_t, uint32_t, uint32_t); 8105e111ed8SAndrew Rybchenko efx_rc_t (*epo_set_privilege_mask)(efx_nic_t *, uint32_t, 8115e111ed8SAndrew Rybchenko uint32_t, uint32_t); 8125e111ed8SAndrew Rybchenko efx_rc_t (*epo_complete_request)(efx_nic_t *, uint32_t, 8135e111ed8SAndrew Rybchenko uint32_t, uint32_t); 8145e111ed8SAndrew Rybchenko efx_rc_t (*epo_exec_cmd)(efx_nic_t *, efx_proxy_cmd_params_t *); 8155e111ed8SAndrew Rybchenko efx_rc_t (*epo_get_privilege_mask)(efx_nic_t *, uint32_t, 8165e111ed8SAndrew Rybchenko uint32_t, uint32_t *); 8175e111ed8SAndrew Rybchenko } efx_proxy_ops_t; 8185e111ed8SAndrew Rybchenko 8195e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */ 8205e111ed8SAndrew Rybchenko 8216f956d5cSIvan Malov #if EFSYS_OPT_MAE 8226f956d5cSIvan Malov 82334285fd0SIvan Malov typedef struct efx_mae_field_cap_s { 82434285fd0SIvan Malov uint32_t emfc_support; 82534285fd0SIvan Malov boolean_t emfc_mask_affects_class; 82634285fd0SIvan Malov boolean_t emfc_match_affects_class; 82734285fd0SIvan Malov } efx_mae_field_cap_t; 82834285fd0SIvan Malov 8296f956d5cSIvan Malov typedef struct efx_mae_s { 830d761ec9fSIvan Malov uint32_t em_max_n_action_prios; 83134285fd0SIvan Malov /* 83234285fd0SIvan Malov * The number of MAE field IDs recognised by the FW implementation. 83334285fd0SIvan Malov * Any field ID greater than or equal to this value is unsupported. 83434285fd0SIvan Malov */ 83534285fd0SIvan Malov uint32_t em_max_nfields; 83634285fd0SIvan Malov /** Action rule match field capabilities. */ 83734285fd0SIvan Malov efx_mae_field_cap_t *em_action_rule_field_caps; 83834285fd0SIvan Malov size_t em_action_rule_field_caps_size; 839891408c4SIvan Malov uint32_t em_max_n_outer_prios; 840891408c4SIvan Malov uint32_t em_encap_types_supported; 841ed15d7f8SIvan Malov /** Outer rule match field capabilities. */ 842ed15d7f8SIvan Malov efx_mae_field_cap_t *em_outer_rule_field_caps; 843ed15d7f8SIvan Malov size_t em_outer_rule_field_caps_size; 844bbc42f34SIgor Romanov uint32_t em_max_ncounters; 8456f956d5cSIvan Malov } efx_mae_t; 8466f956d5cSIvan Malov 8476f956d5cSIvan Malov #endif /* EFSYS_OPT_MAE */ 8486f956d5cSIvan Malov 8495e111ed8SAndrew Rybchenko #define EFX_DRV_VER_MAX 20 8505e111ed8SAndrew Rybchenko 8515e111ed8SAndrew Rybchenko typedef struct efx_drv_cfg_s { 8525e111ed8SAndrew Rybchenko uint32_t edc_min_vi_count; 8535e111ed8SAndrew Rybchenko uint32_t edc_max_vi_count; 8545e111ed8SAndrew Rybchenko 8555e111ed8SAndrew Rybchenko uint32_t edc_max_piobuf_count; 8565e111ed8SAndrew Rybchenko uint32_t edc_pio_alloc_size; 8575e111ed8SAndrew Rybchenko } efx_drv_cfg_t; 8585e111ed8SAndrew Rybchenko 8595e111ed8SAndrew Rybchenko struct efx_nic_s { 8605e111ed8SAndrew Rybchenko uint32_t en_magic; 8615e111ed8SAndrew Rybchenko efx_family_t en_family; 8625e111ed8SAndrew Rybchenko uint32_t en_features; 8635e111ed8SAndrew Rybchenko efsys_identifier_t *en_esip; 8645e111ed8SAndrew Rybchenko efsys_lock_t *en_eslp; 8655e111ed8SAndrew Rybchenko efsys_bar_t *en_esbp; 8665e111ed8SAndrew Rybchenko unsigned int en_mod_flags; 8675e111ed8SAndrew Rybchenko unsigned int en_reset_flags; 8685e111ed8SAndrew Rybchenko efx_nic_cfg_t en_nic_cfg; 8695e111ed8SAndrew Rybchenko efx_drv_cfg_t en_drv_cfg; 8705e111ed8SAndrew Rybchenko efx_port_t en_port; 8715e111ed8SAndrew Rybchenko efx_mon_t en_mon; 8725e111ed8SAndrew Rybchenko efx_intr_t en_intr; 8735e111ed8SAndrew Rybchenko uint32_t en_ev_qcount; 8745e111ed8SAndrew Rybchenko uint32_t en_rx_qcount; 8755e111ed8SAndrew Rybchenko uint32_t en_tx_qcount; 8765e111ed8SAndrew Rybchenko const efx_nic_ops_t *en_enop; 8775e111ed8SAndrew Rybchenko const efx_ev_ops_t *en_eevop; 8785e111ed8SAndrew Rybchenko const efx_tx_ops_t *en_etxop; 8795e111ed8SAndrew Rybchenko const efx_rx_ops_t *en_erxop; 8805e111ed8SAndrew Rybchenko efx_fw_variant_t efv; 8815e111ed8SAndrew Rybchenko char en_drv_version[EFX_DRV_VER_MAX]; 88260fb370cSAndrew Rybchenko efx_nic_dma_t en_dma; 8835e111ed8SAndrew Rybchenko #if EFSYS_OPT_FILTER 8845e111ed8SAndrew Rybchenko efx_filter_t en_filter; 8855e111ed8SAndrew Rybchenko const efx_filter_ops_t *en_efop; 8865e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_FILTER */ 8875e111ed8SAndrew Rybchenko #if EFSYS_OPT_TUNNEL 8885e111ed8SAndrew Rybchenko efx_tunnel_cfg_t en_tunnel_cfg; 8895e111ed8SAndrew Rybchenko const efx_tunnel_ops_t *en_etop; 8905e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_TUNNEL */ 8915e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 8925e111ed8SAndrew Rybchenko efx_mcdi_t en_mcdi; 8935e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 8945e111ed8SAndrew Rybchenko #if EFSYS_OPT_NVRAM 8955e111ed8SAndrew Rybchenko uint32_t en_nvram_partn_locked; 8965e111ed8SAndrew Rybchenko const efx_nvram_ops_t *en_envop; 8975e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NVRAM */ 8985e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 8995e111ed8SAndrew Rybchenko const efx_vpd_ops_t *en_evpdop; 9005e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 9014dda72dbSVijay Srivastava #if EFSYS_OPT_VIRTIO 9024dda72dbSVijay Srivastava const efx_virtio_ops_t *en_evop; 9034dda72dbSVijay Srivastava #endif /* EFSYS_OPT_VPD */ 9045e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_SCALE 9055e111ed8SAndrew Rybchenko efx_rx_hash_support_t en_hash_support; 9065e111ed8SAndrew Rybchenko efx_rx_scale_context_type_t en_rss_context_type; 9075e111ed8SAndrew Rybchenko uint32_t en_rss_context; 9085e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_RX_SCALE */ 9095e111ed8SAndrew Rybchenko uint32_t en_vport_id; 9105e111ed8SAndrew Rybchenko #if EFSYS_OPT_LICENSING 9115e111ed8SAndrew Rybchenko const efx_lic_ops_t *en_elop; 9125e111ed8SAndrew Rybchenko boolean_t en_licensing_supported; 9135e111ed8SAndrew Rybchenko #endif 9145e111ed8SAndrew Rybchenko union { 9155e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 9165e111ed8SAndrew Rybchenko struct { 9175e111ed8SAndrew Rybchenko #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD 9185e111ed8SAndrew Rybchenko unsigned int enu_partn_mask; 9195e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */ 9205e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 9215e111ed8SAndrew Rybchenko caddr_t enu_svpd; 9225e111ed8SAndrew Rybchenko size_t enu_svpd_length; 9235e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 9245e111ed8SAndrew Rybchenko int enu_unused; 9255e111ed8SAndrew Rybchenko } siena; 9265e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 9275e111ed8SAndrew Rybchenko int enu_unused; 9285e111ed8SAndrew Rybchenko } en_u; 9293c1c5cc4SAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 9305e111ed8SAndrew Rybchenko union en_arch { 9315e111ed8SAndrew Rybchenko struct { 9325e111ed8SAndrew Rybchenko int ena_vi_base; 9335e111ed8SAndrew Rybchenko int ena_vi_count; 9345e111ed8SAndrew Rybchenko int ena_vi_shift; 935341bd4e0SIgor Romanov uint32_t ena_fcw_base; 9365e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 9375e111ed8SAndrew Rybchenko caddr_t ena_svpd; 9385e111ed8SAndrew Rybchenko size_t ena_svpd_length; 9395e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 9405e111ed8SAndrew Rybchenko efx_piobuf_handle_t ena_piobuf_handle[EF10_MAX_PIOBUF_NBUFS]; 9415e111ed8SAndrew Rybchenko uint32_t ena_piobuf_count; 9425e111ed8SAndrew Rybchenko uint32_t ena_pio_alloc_map[EF10_MAX_PIOBUF_NBUFS]; 9435e111ed8SAndrew Rybchenko uint32_t ena_pio_write_vi_base; 9445e111ed8SAndrew Rybchenko /* Memory BAR mapping regions */ 9455e111ed8SAndrew Rybchenko uint32_t ena_uc_mem_map_offset; 9465e111ed8SAndrew Rybchenko size_t ena_uc_mem_map_size; 9475e111ed8SAndrew Rybchenko uint32_t ena_wc_mem_map_offset; 9485e111ed8SAndrew Rybchenko size_t ena_wc_mem_map_size; 9495e111ed8SAndrew Rybchenko } ef10; 9505e111ed8SAndrew Rybchenko } en_arch; 9513c1c5cc4SAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 9525e111ed8SAndrew Rybchenko #if EFSYS_OPT_EVB 9535e111ed8SAndrew Rybchenko const efx_evb_ops_t *en_eeop; 9545e111ed8SAndrew Rybchenko struct efx_vswitch_s *en_vswitchp; 9555e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_EVB */ 9565e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER 9575e111ed8SAndrew Rybchenko const efx_proxy_ops_t *en_epop; 9585e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */ 9596f956d5cSIvan Malov #if EFSYS_OPT_MAE 9606f956d5cSIvan Malov efx_mae_t *en_maep; 9616f956d5cSIvan Malov #endif /* EFSYS_OPT_MAE */ 9625e111ed8SAndrew Rybchenko }; 9635e111ed8SAndrew Rybchenko 9645e111ed8SAndrew Rybchenko #define EFX_FAMILY_IS_EF10(_enp) \ 9655e111ed8SAndrew Rybchenko ((_enp)->en_family == EFX_FAMILY_MEDFORD2 || \ 9665e111ed8SAndrew Rybchenko (_enp)->en_family == EFX_FAMILY_MEDFORD || \ 9675e111ed8SAndrew Rybchenko (_enp)->en_family == EFX_FAMILY_HUNTINGTON) 9685e111ed8SAndrew Rybchenko 969206ef24fSAndrew Rybchenko #define EFX_FAMILY_IS_EF100(_enp) \ 970206ef24fSAndrew Rybchenko ((_enp)->en_family == EFX_FAMILY_RIVERHEAD) 971206ef24fSAndrew Rybchenko 9725e111ed8SAndrew Rybchenko 9735e111ed8SAndrew Rybchenko #define EFX_NIC_MAGIC 0x02121996 9745e111ed8SAndrew Rybchenko 9755e111ed8SAndrew Rybchenko typedef boolean_t (*efx_ev_handler_t)(efx_evq_t *, efx_qword_t *, 9765e111ed8SAndrew Rybchenko const efx_ev_callbacks_t *, void *); 9775e111ed8SAndrew Rybchenko 978ea42cae4SAndy Moreton #if EFSYS_OPT_EV_EXTENDED_WIDTH 979ea42cae4SAndy Moreton typedef boolean_t (*efx_ev_ew_handler_t)(efx_evq_t *, efx_xword_t *, 980ea42cae4SAndy Moreton const efx_ev_callbacks_t *, void *); 981ea42cae4SAndy Moreton #endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */ 982ea42cae4SAndy Moreton 9835e111ed8SAndrew Rybchenko typedef struct efx_evq_rxq_state_s { 9845e111ed8SAndrew Rybchenko unsigned int eers_rx_read_ptr; 9855e111ed8SAndrew Rybchenko unsigned int eers_rx_mask; 9865e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM || EFSYS_OPT_RX_ES_SUPER_BUFFER 9875e111ed8SAndrew Rybchenko unsigned int eers_rx_stream_npackets; 9885e111ed8SAndrew Rybchenko boolean_t eers_rx_packed_stream; 9895e111ed8SAndrew Rybchenko #endif 9905e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM 9915e111ed8SAndrew Rybchenko unsigned int eers_rx_packed_stream_credits; 9925e111ed8SAndrew Rybchenko #endif 9935e111ed8SAndrew Rybchenko } efx_evq_rxq_state_t; 9945e111ed8SAndrew Rybchenko 9955e111ed8SAndrew Rybchenko struct efx_evq_s { 9965e111ed8SAndrew Rybchenko uint32_t ee_magic; 9975e111ed8SAndrew Rybchenko uint32_t ee_flags; 9985e111ed8SAndrew Rybchenko efx_nic_t *ee_enp; 9995e111ed8SAndrew Rybchenko unsigned int ee_index; 10005e111ed8SAndrew Rybchenko unsigned int ee_mask; 10015e111ed8SAndrew Rybchenko efsys_mem_t *ee_esmp; 10025e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 10035e111ed8SAndrew Rybchenko uint32_t ee_stat[EV_NQSTATS]; 10045e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_QSTATS */ 10055e111ed8SAndrew Rybchenko 10065e111ed8SAndrew Rybchenko efx_ev_handler_t ee_rx; 10075e111ed8SAndrew Rybchenko efx_ev_handler_t ee_tx; 10085e111ed8SAndrew Rybchenko efx_ev_handler_t ee_driver; 10095e111ed8SAndrew Rybchenko efx_ev_handler_t ee_global; 10105e111ed8SAndrew Rybchenko efx_ev_handler_t ee_drv_gen; 10115e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 10125e111ed8SAndrew Rybchenko efx_ev_handler_t ee_mcdi; 10135e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 10145e111ed8SAndrew Rybchenko 1015ea42cae4SAndy Moreton #if EFSYS_OPT_DESC_PROXY 1016ea42cae4SAndy Moreton efx_ev_ew_handler_t ee_ew_txq_desc; 1017ea42cae4SAndy Moreton efx_ev_ew_handler_t ee_ew_virtq_desc; 1018ea42cae4SAndy Moreton #endif /* EFSYS_OPT_DESC_PROXY */ 1019ea42cae4SAndy Moreton 10205e111ed8SAndrew Rybchenko efx_evq_rxq_state_t ee_rxq_state[EFX_EV_RX_NLABELS]; 10215e111ed8SAndrew Rybchenko }; 10225e111ed8SAndrew Rybchenko 10235e111ed8SAndrew Rybchenko #define EFX_EVQ_MAGIC 0x08081997 10245e111ed8SAndrew Rybchenko 10255e111ed8SAndrew Rybchenko #define EFX_EVQ_SIENA_TIMER_QUANTUM_NS 6144 /* 768 cycles */ 10265e111ed8SAndrew Rybchenko 10275e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 10285e111ed8SAndrew Rybchenko #define EFX_EV_QSTAT_INCR(_eep, _stat) \ 10295e111ed8SAndrew Rybchenko do { \ 10305e111ed8SAndrew Rybchenko (_eep)->ee_stat[_stat]++; \ 10315e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10325e111ed8SAndrew Rybchenko } while (B_FALSE) 10335e111ed8SAndrew Rybchenko #else 10345e111ed8SAndrew Rybchenko #define EFX_EV_QSTAT_INCR(_eep, _stat) 10355e111ed8SAndrew Rybchenko #endif 10365e111ed8SAndrew Rybchenko 10375e111ed8SAndrew Rybchenko struct efx_rxq_s { 10385e111ed8SAndrew Rybchenko uint32_t er_magic; 10395e111ed8SAndrew Rybchenko efx_nic_t *er_enp; 10405e111ed8SAndrew Rybchenko efx_evq_t *er_eep; 10415e111ed8SAndrew Rybchenko unsigned int er_index; 10425e111ed8SAndrew Rybchenko unsigned int er_label; 10435e111ed8SAndrew Rybchenko unsigned int er_mask; 10445e111ed8SAndrew Rybchenko size_t er_buf_size; 10455e111ed8SAndrew Rybchenko efsys_mem_t *er_esmp; 10465e111ed8SAndrew Rybchenko efx_evq_rxq_state_t *er_ev_qstate; 10476bba823fSAndrew Rybchenko efx_rx_prefix_layout_t er_prefix_layout; 10485e111ed8SAndrew Rybchenko }; 10495e111ed8SAndrew Rybchenko 10505e111ed8SAndrew Rybchenko #define EFX_RXQ_MAGIC 0x15022005 10515e111ed8SAndrew Rybchenko 10525e111ed8SAndrew Rybchenko struct efx_txq_s { 10535e111ed8SAndrew Rybchenko uint32_t et_magic; 10545e111ed8SAndrew Rybchenko efx_nic_t *et_enp; 10555e111ed8SAndrew Rybchenko unsigned int et_index; 10565e111ed8SAndrew Rybchenko unsigned int et_mask; 10575e111ed8SAndrew Rybchenko efsys_mem_t *et_esmp; 10585e111ed8SAndrew Rybchenko #if EFSYS_OPT_HUNTINGTON 10595e111ed8SAndrew Rybchenko uint32_t et_pio_bufnum; 10605e111ed8SAndrew Rybchenko uint32_t et_pio_blknum; 10615e111ed8SAndrew Rybchenko uint32_t et_pio_write_offset; 10625e111ed8SAndrew Rybchenko uint32_t et_pio_offset; 10635e111ed8SAndrew Rybchenko size_t et_pio_size; 10645e111ed8SAndrew Rybchenko #endif 10655e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 10665e111ed8SAndrew Rybchenko uint32_t et_stat[TX_NQSTATS]; 10675e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_QSTATS */ 10685e111ed8SAndrew Rybchenko }; 10695e111ed8SAndrew Rybchenko 10705e111ed8SAndrew Rybchenko #define EFX_TXQ_MAGIC 0x05092005 10715e111ed8SAndrew Rybchenko 10725e111ed8SAndrew Rybchenko #define EFX_MAC_ADDR_COPY(_dst, _src) \ 10735e111ed8SAndrew Rybchenko do { \ 10745e111ed8SAndrew Rybchenko (_dst)[0] = (_src)[0]; \ 10755e111ed8SAndrew Rybchenko (_dst)[1] = (_src)[1]; \ 10765e111ed8SAndrew Rybchenko (_dst)[2] = (_src)[2]; \ 10775e111ed8SAndrew Rybchenko (_dst)[3] = (_src)[3]; \ 10785e111ed8SAndrew Rybchenko (_dst)[4] = (_src)[4]; \ 10795e111ed8SAndrew Rybchenko (_dst)[5] = (_src)[5]; \ 10805e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10815e111ed8SAndrew Rybchenko } while (B_FALSE) 10825e111ed8SAndrew Rybchenko 10835e111ed8SAndrew Rybchenko #define EFX_MAC_BROADCAST_ADDR_SET(_dst) \ 10845e111ed8SAndrew Rybchenko do { \ 10855e111ed8SAndrew Rybchenko uint16_t *_d = (uint16_t *)(_dst); \ 10865e111ed8SAndrew Rybchenko _d[0] = 0xffff; \ 10875e111ed8SAndrew Rybchenko _d[1] = 0xffff; \ 10885e111ed8SAndrew Rybchenko _d[2] = 0xffff; \ 10895e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10905e111ed8SAndrew Rybchenko } while (B_FALSE) 10915e111ed8SAndrew Rybchenko 10925e111ed8SAndrew Rybchenko #if EFSYS_OPT_CHECK_REG 10935e111ed8SAndrew Rybchenko #define EFX_CHECK_REG(_enp, _reg) \ 10945e111ed8SAndrew Rybchenko do { \ 10955e111ed8SAndrew Rybchenko const char *name = #_reg; \ 10965e111ed8SAndrew Rybchenko char min = name[4]; \ 10975e111ed8SAndrew Rybchenko char max = name[5]; \ 10985e111ed8SAndrew Rybchenko char rev; \ 10995e111ed8SAndrew Rybchenko \ 11005e111ed8SAndrew Rybchenko switch ((_enp)->en_family) { \ 11015e111ed8SAndrew Rybchenko case EFX_FAMILY_SIENA: \ 11025e111ed8SAndrew Rybchenko rev = 'C'; \ 11035e111ed8SAndrew Rybchenko break; \ 11045e111ed8SAndrew Rybchenko \ 11055e111ed8SAndrew Rybchenko case EFX_FAMILY_HUNTINGTON: \ 11065e111ed8SAndrew Rybchenko rev = 'D'; \ 11075e111ed8SAndrew Rybchenko break; \ 11085e111ed8SAndrew Rybchenko \ 11095e111ed8SAndrew Rybchenko case EFX_FAMILY_MEDFORD: \ 11105e111ed8SAndrew Rybchenko rev = 'E'; \ 11115e111ed8SAndrew Rybchenko break; \ 11125e111ed8SAndrew Rybchenko \ 11135e111ed8SAndrew Rybchenko case EFX_FAMILY_MEDFORD2: \ 11145e111ed8SAndrew Rybchenko rev = 'F'; \ 11155e111ed8SAndrew Rybchenko break; \ 11165e111ed8SAndrew Rybchenko \ 111782c17c52SAndrew Rybchenko case EFX_FAMILY_RIVERHEAD: \ 111882c17c52SAndrew Rybchenko rev = 'G'; \ 111982c17c52SAndrew Rybchenko break; \ 112082c17c52SAndrew Rybchenko \ 11215e111ed8SAndrew Rybchenko default: \ 11225e111ed8SAndrew Rybchenko rev = '?'; \ 11235e111ed8SAndrew Rybchenko break; \ 11245e111ed8SAndrew Rybchenko } \ 11255e111ed8SAndrew Rybchenko \ 11265e111ed8SAndrew Rybchenko EFSYS_ASSERT3S(rev, >=, min); \ 11275e111ed8SAndrew Rybchenko EFSYS_ASSERT3S(rev, <=, max); \ 11285e111ed8SAndrew Rybchenko \ 11295e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11305e111ed8SAndrew Rybchenko } while (B_FALSE) 11315e111ed8SAndrew Rybchenko #else 11325e111ed8SAndrew Rybchenko #define EFX_CHECK_REG(_enp, _reg) do { \ 11335e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11345e111ed8SAndrew Rybchenko } while (B_FALSE) 11355e111ed8SAndrew Rybchenko #endif 11365e111ed8SAndrew Rybchenko 11375e111ed8SAndrew Rybchenko #define EFX_BAR_READD(_enp, _reg, _edp, _lock) \ 11385e111ed8SAndrew Rybchenko do { \ 11395e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11405e111ed8SAndrew Rybchenko EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST, \ 11415e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 11425e111ed8SAndrew Rybchenko EFSYS_PROBE3(efx_bar_readd, const char *, #_reg, \ 11435e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11445e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 11455e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11465e111ed8SAndrew Rybchenko } while (B_FALSE) 11475e111ed8SAndrew Rybchenko 11485e111ed8SAndrew Rybchenko #define EFX_BAR_WRITED(_enp, _reg, _edp, _lock) \ 11495e111ed8SAndrew Rybchenko do { \ 11505e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11515e111ed8SAndrew Rybchenko EFSYS_PROBE3(efx_bar_writed, const char *, #_reg, \ 11525e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11535e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 11545e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST, \ 11555e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 11565e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11575e111ed8SAndrew Rybchenko } while (B_FALSE) 11585e111ed8SAndrew Rybchenko 11595e111ed8SAndrew Rybchenko #define EFX_BAR_READQ(_enp, _reg, _eqp) \ 11605e111ed8SAndrew Rybchenko do { \ 11615e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11625e111ed8SAndrew Rybchenko EFSYS_BAR_READQ((_enp)->en_esbp, _reg ## _OFST, \ 11635e111ed8SAndrew Rybchenko (_eqp)); \ 11645e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_readq, const char *, #_reg, \ 11655e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11665e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 11675e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 11685e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11695e111ed8SAndrew Rybchenko } while (B_FALSE) 11705e111ed8SAndrew Rybchenko 11715e111ed8SAndrew Rybchenko #define EFX_BAR_WRITEQ(_enp, _reg, _eqp) \ 11725e111ed8SAndrew Rybchenko do { \ 11735e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11745e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_writeq, 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 EFSYS_BAR_WRITEQ((_enp)->en_esbp, _reg ## _OFST, \ 11795e111ed8SAndrew Rybchenko (_eqp)); \ 11805e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11815e111ed8SAndrew Rybchenko } while (B_FALSE) 11825e111ed8SAndrew Rybchenko 11835e111ed8SAndrew Rybchenko #define EFX_BAR_READO(_enp, _reg, _eop) \ 11845e111ed8SAndrew Rybchenko do { \ 11855e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11865e111ed8SAndrew Rybchenko EFSYS_BAR_READO((_enp)->en_esbp, _reg ## _OFST, \ 11875e111ed8SAndrew Rybchenko (_eop), B_TRUE); \ 11885e111ed8SAndrew Rybchenko EFSYS_PROBE6(efx_bar_reado, const char *, #_reg, \ 11895e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11905e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 11915e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 11925e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 11935e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 11945e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11955e111ed8SAndrew Rybchenko } while (B_FALSE) 11965e111ed8SAndrew Rybchenko 11975e111ed8SAndrew Rybchenko #define EFX_BAR_WRITEO(_enp, _reg, _eop) \ 11985e111ed8SAndrew Rybchenko do { \ 11995e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12005e111ed8SAndrew Rybchenko EFSYS_PROBE6(efx_bar_writeo, const char *, #_reg, \ 12015e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12025e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 12035e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 12045e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 12055e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 12065e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEO((_enp)->en_esbp, _reg ## _OFST, \ 12075e111ed8SAndrew Rybchenko (_eop), B_TRUE); \ 12085e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12095e111ed8SAndrew Rybchenko } while (B_FALSE) 12105e111ed8SAndrew Rybchenko 12115e111ed8SAndrew Rybchenko /* 12125e111ed8SAndrew Rybchenko * Accessors for memory BAR non-VI tables. 12135e111ed8SAndrew Rybchenko * 12145e111ed8SAndrew Rybchenko * Code used on EF10 *must* use EFX_BAR_VI_*() macros for per-VI registers, 12155e111ed8SAndrew Rybchenko * to ensure the correct runtime VI window size is used on Medford2. 12165e111ed8SAndrew Rybchenko * 1217341bd4e0SIgor Romanov * Code used on EF100 *must* use EFX_BAR_FCW_* macros for function control 1218341bd4e0SIgor Romanov * window registers, to ensure the correct starting offset is used. 1219341bd4e0SIgor Romanov * 12205e111ed8SAndrew Rybchenko * Siena-only code may continue using EFX_BAR_TBL_*() macros for VI registers. 12215e111ed8SAndrew Rybchenko */ 12225e111ed8SAndrew Rybchenko 12235e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_READD(_enp, _reg, _index, _edp, _lock) \ 12245e111ed8SAndrew Rybchenko do { \ 12255e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12265e111ed8SAndrew Rybchenko EFSYS_BAR_READD((_enp)->en_esbp, \ 12275e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12285e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 12295e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_tbl_readd, const char *, #_reg, \ 12305e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12315e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12325e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 12335e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12345e111ed8SAndrew Rybchenko } while (B_FALSE) 12355e111ed8SAndrew Rybchenko 12365e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITED(_enp, _reg, _index, _edp, _lock) \ 12375e111ed8SAndrew Rybchenko do { \ 12385e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12395e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 12405e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12415e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12425e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 12435e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 12445e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12455e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 12465e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12475e111ed8SAndrew Rybchenko } while (B_FALSE) 12485e111ed8SAndrew Rybchenko 12495e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITED3(_enp, _reg, _index, _edp, _lock) \ 12505e111ed8SAndrew Rybchenko do { \ 12515e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12525e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 12535e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12545e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12555e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 12565e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 12575e111ed8SAndrew Rybchenko (_reg ## _OFST + \ 12585e111ed8SAndrew Rybchenko (3 * sizeof (efx_dword_t)) + \ 12595e111ed8SAndrew Rybchenko ((_index) * _reg ## _STEP)), \ 12605e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 12615e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12625e111ed8SAndrew Rybchenko } while (B_FALSE) 12635e111ed8SAndrew Rybchenko 12645e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_READQ(_enp, _reg, _index, _eqp) \ 12655e111ed8SAndrew Rybchenko do { \ 12665e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12675e111ed8SAndrew Rybchenko EFSYS_BAR_READQ((_enp)->en_esbp, \ 12685e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12695e111ed8SAndrew Rybchenko (_eqp)); \ 12705e111ed8SAndrew Rybchenko EFSYS_PROBE5(efx_bar_tbl_readq, const char *, #_reg, \ 12715e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12725e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12735e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 12745e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 12755e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12765e111ed8SAndrew Rybchenko } while (B_FALSE) 12775e111ed8SAndrew Rybchenko 12785e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITEQ(_enp, _reg, _index, _eqp) \ 12795e111ed8SAndrew Rybchenko do { \ 12805e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12815e111ed8SAndrew Rybchenko EFSYS_PROBE5(efx_bar_tbl_writeq, const char *, #_reg, \ 12825e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12835e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12845e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 12855e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 12865e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEQ((_enp)->en_esbp, \ 12875e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12885e111ed8SAndrew Rybchenko (_eqp)); \ 12895e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12905e111ed8SAndrew Rybchenko } while (B_FALSE) 12915e111ed8SAndrew Rybchenko 12925e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_READO(_enp, _reg, _index, _eop, _lock) \ 12935e111ed8SAndrew Rybchenko do { \ 12945e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12955e111ed8SAndrew Rybchenko EFSYS_BAR_READO((_enp)->en_esbp, \ 12965e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12975e111ed8SAndrew Rybchenko (_eop), (_lock)); \ 12985e111ed8SAndrew Rybchenko EFSYS_PROBE7(efx_bar_tbl_reado, const char *, #_reg, \ 12995e111ed8SAndrew Rybchenko uint32_t, (_index), \ 13005e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 13015e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 13025e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 13035e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 13045e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 13055e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13065e111ed8SAndrew Rybchenko } while (B_FALSE) 13075e111ed8SAndrew Rybchenko 13085e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITEO(_enp, _reg, _index, _eop, _lock) \ 13095e111ed8SAndrew Rybchenko do { \ 13105e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 13115e111ed8SAndrew Rybchenko EFSYS_PROBE7(efx_bar_tbl_writeo, const char *, #_reg, \ 13125e111ed8SAndrew Rybchenko uint32_t, (_index), \ 13135e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 13145e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 13155e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 13165e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 13175e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 13185e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEO((_enp)->en_esbp, \ 13195e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 13205e111ed8SAndrew Rybchenko (_eop), (_lock)); \ 13215e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13225e111ed8SAndrew Rybchenko } while (B_FALSE) 13235e111ed8SAndrew Rybchenko 13245e111ed8SAndrew Rybchenko /* 1325341bd4e0SIgor Romanov * Accessors for memory BAR function control window registers. 1326341bd4e0SIgor Romanov * 1327341bd4e0SIgor Romanov * The function control window is located at an offset which can be 1328341bd4e0SIgor Romanov * non-zero in case of Riverhead. 1329341bd4e0SIgor Romanov */ 1330341bd4e0SIgor Romanov 1331341bd4e0SIgor Romanov #if EFSYS_OPT_RIVERHEAD 1332341bd4e0SIgor Romanov 1333341bd4e0SIgor Romanov #define EFX_BAR_FCW_READD(_enp, _reg, _edp) \ 1334341bd4e0SIgor Romanov do { \ 1335341bd4e0SIgor Romanov EFX_CHECK_REG((_enp), (_reg)); \ 1336341bd4e0SIgor Romanov EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST + \ 1337341bd4e0SIgor Romanov (_enp)->en_arch.ef10.ena_fcw_base, \ 1338341bd4e0SIgor Romanov (_edp), B_FALSE); \ 1339341bd4e0SIgor Romanov EFSYS_PROBE3(efx_bar_fcw_readd, const char *, #_reg, \ 1340341bd4e0SIgor Romanov uint32_t, _reg ## _OFST, \ 1341341bd4e0SIgor Romanov uint32_t, (_edp)->ed_u32[0]); \ 1342341bd4e0SIgor Romanov _NOTE(CONSTANTCONDITION) \ 1343341bd4e0SIgor Romanov } while (B_FALSE) 1344341bd4e0SIgor Romanov 1345341bd4e0SIgor Romanov #define EFX_BAR_FCW_WRITED(_enp, _reg, _edp) \ 1346341bd4e0SIgor Romanov do { \ 1347341bd4e0SIgor Romanov EFX_CHECK_REG((_enp), (_reg)); \ 1348341bd4e0SIgor Romanov EFSYS_PROBE3(efx_bar_fcw_writed, const char *, #_reg, \ 1349341bd4e0SIgor Romanov uint32_t, _reg ## _OFST, \ 1350341bd4e0SIgor Romanov uint32_t, (_edp)->ed_u32[0]); \ 1351341bd4e0SIgor Romanov EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST + \ 1352341bd4e0SIgor Romanov (_enp)->en_arch.ef10.ena_fcw_base, \ 1353341bd4e0SIgor Romanov (_edp), B_FALSE); \ 1354341bd4e0SIgor Romanov _NOTE(CONSTANTCONDITION) \ 1355341bd4e0SIgor Romanov } while (B_FALSE) 1356341bd4e0SIgor Romanov 1357341bd4e0SIgor Romanov #endif /* EFSYS_OPT_RIVERHEAD */ 1358341bd4e0SIgor Romanov 1359341bd4e0SIgor Romanov /* 13605e111ed8SAndrew Rybchenko * Accessors for memory BAR per-VI registers. 13615e111ed8SAndrew Rybchenko * 13625e111ed8SAndrew Rybchenko * The VI window size is 8KB for Medford and all earlier controllers. 13635e111ed8SAndrew Rybchenko * For Medford2, the VI window size can be 8KB, 16KB or 64KB. 13645e111ed8SAndrew Rybchenko */ 13655e111ed8SAndrew Rybchenko 13665e111ed8SAndrew Rybchenko #define EFX_BAR_VI_READD(_enp, _reg, _index, _edp, _lock) \ 13675e111ed8SAndrew Rybchenko do { \ 13685e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 13695e111ed8SAndrew Rybchenko EFSYS_BAR_READD((_enp)->en_esbp, \ 13705e111ed8SAndrew Rybchenko ((_reg ## _OFST) + \ 13715e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 13725e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 13735e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_vi_readd, const char *, #_reg, \ 13745e111ed8SAndrew Rybchenko uint32_t, (_index), \ 13755e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 13765e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 13775e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13785e111ed8SAndrew Rybchenko } while (B_FALSE) 13795e111ed8SAndrew Rybchenko 13805e111ed8SAndrew Rybchenko #define EFX_BAR_VI_WRITED(_enp, _reg, _index, _edp, _lock) \ 13815e111ed8SAndrew Rybchenko do { \ 13825e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 13835e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_vi_writed, const char *, #_reg, \ 13845e111ed8SAndrew Rybchenko uint32_t, (_index), \ 13855e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 13865e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 13875e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 13885e111ed8SAndrew Rybchenko ((_reg ## _OFST) + \ 13895e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 13905e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 13915e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13925e111ed8SAndrew Rybchenko } while (B_FALSE) 13935e111ed8SAndrew Rybchenko 13945e111ed8SAndrew Rybchenko #define EFX_BAR_VI_WRITED2(_enp, _reg, _index, _edp, _lock) \ 13955e111ed8SAndrew Rybchenko do { \ 13965e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 13975e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_vi_writed, const char *, #_reg, \ 13985e111ed8SAndrew Rybchenko uint32_t, (_index), \ 13995e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 14005e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 14015e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 14025e111ed8SAndrew Rybchenko ((_reg ## _OFST) + \ 14035e111ed8SAndrew Rybchenko (2 * sizeof (efx_dword_t)) + \ 14045e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 14055e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 14065e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 14075e111ed8SAndrew Rybchenko } while (B_FALSE) 14085e111ed8SAndrew Rybchenko 14095e111ed8SAndrew Rybchenko /* 14105e111ed8SAndrew Rybchenko * Allow drivers to perform optimised 128-bit VI doorbell writes. 14115e111ed8SAndrew Rybchenko * The DMA descriptor pointers (RX_DESC_UPD and TX_DESC_UPD) are 14125e111ed8SAndrew Rybchenko * special-cased in the BIU on the Falcon/Siena and EF10 architectures to avoid 14135e111ed8SAndrew Rybchenko * the need for locking in the host, and are the only ones known to be safe to 14145e111ed8SAndrew Rybchenko * use 128-bites write with. 14155e111ed8SAndrew Rybchenko */ 14165e111ed8SAndrew Rybchenko #define EFX_BAR_VI_DOORBELL_WRITEO(_enp, _reg, _index, _eop) \ 14175e111ed8SAndrew Rybchenko do { \ 14185e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 14195e111ed8SAndrew Rybchenko EFSYS_PROBE7(efx_bar_vi_doorbell_writeo, \ 14205e111ed8SAndrew Rybchenko const char *, #_reg, \ 14215e111ed8SAndrew Rybchenko uint32_t, (_index), \ 14225e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 14235e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 14245e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 14255e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 14265e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 14275e111ed8SAndrew Rybchenko EFSYS_BAR_DOORBELL_WRITEO((_enp)->en_esbp, \ 14285e111ed8SAndrew Rybchenko (_reg ## _OFST + \ 14295e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 14305e111ed8SAndrew Rybchenko (_eop)); \ 14315e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 14325e111ed8SAndrew Rybchenko } while (B_FALSE) 14335e111ed8SAndrew Rybchenko 143482192e22SAndrew Rybchenko #define EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _desc_size, \ 143582192e22SAndrew Rybchenko _wptr, _owptr) \ 14365e111ed8SAndrew Rybchenko do { \ 14375e111ed8SAndrew Rybchenko unsigned int _new = (_wptr); \ 14385e111ed8SAndrew Rybchenko unsigned int _old = (_owptr); \ 14395e111ed8SAndrew Rybchenko \ 14405e111ed8SAndrew Rybchenko if ((_new) >= (_old)) \ 14415e111ed8SAndrew Rybchenko EFSYS_DMA_SYNC_FOR_DEVICE((_esmp), \ 144282192e22SAndrew Rybchenko (_old) * (_desc_size), \ 144382192e22SAndrew Rybchenko ((_new) - (_old)) * (_desc_size)); \ 14445e111ed8SAndrew Rybchenko else \ 14455e111ed8SAndrew Rybchenko /* \ 14465e111ed8SAndrew Rybchenko * It is cheaper to sync entire map than sync \ 14475e111ed8SAndrew Rybchenko * two parts especially when offset/size are \ 14485e111ed8SAndrew Rybchenko * ignored and entire map is synced in any case.\ 14495e111ed8SAndrew Rybchenko */ \ 14505e111ed8SAndrew Rybchenko EFSYS_DMA_SYNC_FOR_DEVICE((_esmp), \ 14515e111ed8SAndrew Rybchenko 0, \ 145282192e22SAndrew Rybchenko (_entries) * (_desc_size)); \ 14535e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 14545e111ed8SAndrew Rybchenko } while (B_FALSE) 14555e111ed8SAndrew Rybchenko 14565e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14575e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14585e111ed8SAndrew Rybchenko efx_mac_select( 14595e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 14605e111ed8SAndrew Rybchenko 14615e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14625e111ed8SAndrew Rybchenko extern void 14635e111ed8SAndrew Rybchenko efx_mac_multicast_hash_compute( 14645e111ed8SAndrew Rybchenko __in_ecount(6*count) uint8_t const *addrs, 14655e111ed8SAndrew Rybchenko __in int count, 14665e111ed8SAndrew Rybchenko __out efx_oword_t *hash_low, 14675e111ed8SAndrew Rybchenko __out efx_oword_t *hash_high); 14685e111ed8SAndrew Rybchenko 14695e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14705e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14715e111ed8SAndrew Rybchenko efx_phy_probe( 14725e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 14735e111ed8SAndrew Rybchenko 14745e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14755e111ed8SAndrew Rybchenko extern void 14765e111ed8SAndrew Rybchenko efx_phy_unprobe( 14775e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 14785e111ed8SAndrew Rybchenko 14795e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 14805e111ed8SAndrew Rybchenko 14815e111ed8SAndrew Rybchenko /* VPD utility functions */ 14825e111ed8SAndrew Rybchenko 14835e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14845e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14855e111ed8SAndrew Rybchenko efx_vpd_hunk_length( 14865e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 14875e111ed8SAndrew Rybchenko __in size_t size, 14885e111ed8SAndrew Rybchenko __out size_t *lengthp); 14895e111ed8SAndrew Rybchenko 14905e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14915e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14925e111ed8SAndrew Rybchenko efx_vpd_hunk_verify( 14935e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 14945e111ed8SAndrew Rybchenko __in size_t size, 14955e111ed8SAndrew Rybchenko __out_opt boolean_t *cksummedp); 14965e111ed8SAndrew Rybchenko 14975e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14985e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14995e111ed8SAndrew Rybchenko efx_vpd_hunk_reinit( 15005e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 15015e111ed8SAndrew Rybchenko __in size_t size, 15025e111ed8SAndrew Rybchenko __in boolean_t wantpid); 15035e111ed8SAndrew Rybchenko 15045e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15055e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15065e111ed8SAndrew Rybchenko efx_vpd_hunk_get( 15075e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 15085e111ed8SAndrew Rybchenko __in size_t size, 15095e111ed8SAndrew Rybchenko __in efx_vpd_tag_t tag, 15105e111ed8SAndrew Rybchenko __in efx_vpd_keyword_t keyword, 15115e111ed8SAndrew Rybchenko __out unsigned int *payloadp, 15125e111ed8SAndrew Rybchenko __out uint8_t *paylenp); 15135e111ed8SAndrew Rybchenko 15145e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15155e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15165e111ed8SAndrew Rybchenko efx_vpd_hunk_next( 15175e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 15185e111ed8SAndrew Rybchenko __in size_t size, 15195e111ed8SAndrew Rybchenko __out efx_vpd_tag_t *tagp, 15205e111ed8SAndrew Rybchenko __out efx_vpd_keyword_t *keyword, 15215e111ed8SAndrew Rybchenko __out_opt unsigned int *payloadp, 15225e111ed8SAndrew Rybchenko __out_opt uint8_t *paylenp, 15235e111ed8SAndrew Rybchenko __inout unsigned int *contp); 15245e111ed8SAndrew Rybchenko 15255e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15265e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15275e111ed8SAndrew Rybchenko efx_vpd_hunk_set( 15285e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 15295e111ed8SAndrew Rybchenko __in size_t size, 15305e111ed8SAndrew Rybchenko __in efx_vpd_value_t *evvp); 15315e111ed8SAndrew Rybchenko 15325e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 15335e111ed8SAndrew Rybchenko 15345e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 15355e111ed8SAndrew Rybchenko 15365e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15375e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15385e111ed8SAndrew Rybchenko efx_mcdi_set_workaround( 15395e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 15405e111ed8SAndrew Rybchenko __in uint32_t type, 15415e111ed8SAndrew Rybchenko __in boolean_t enabled, 15425e111ed8SAndrew Rybchenko __out_opt uint32_t *flagsp); 15435e111ed8SAndrew Rybchenko 15445e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15455e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15465e111ed8SAndrew Rybchenko efx_mcdi_get_workarounds( 15475e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 15485e111ed8SAndrew Rybchenko __out_opt uint32_t *implementedp, 15495e111ed8SAndrew Rybchenko __out_opt uint32_t *enabledp); 15505e111ed8SAndrew Rybchenko 1551b97bf1caSAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 155285270581SAndrew Rybchenko 155385270581SAndrew Rybchenko LIBEFX_INTERNAL 155485270581SAndrew Rybchenko extern __checkReturn efx_rc_t 15557d104a8dSViacheslav Galaktionov efx_mcdi_intf_from_pcie( 15567d104a8dSViacheslav Galaktionov __in uint32_t pcie_intf, 15577d104a8dSViacheslav Galaktionov __out efx_pcie_interface_t *efx_intf); 15587d104a8dSViacheslav Galaktionov 15597d104a8dSViacheslav Galaktionov LIBEFX_INTERNAL 15607d104a8dSViacheslav Galaktionov extern __checkReturn efx_rc_t 1561b85f5048SIvan Malov efx_mcdi_intf_to_pcie( 1562b85f5048SIvan Malov __in efx_pcie_interface_t efx_intf, 1563b85f5048SIvan Malov __out uint32_t *pcie_intf); 1564b85f5048SIvan Malov 1565b85f5048SIvan Malov LIBEFX_INTERNAL 1566b85f5048SIvan Malov extern __checkReturn efx_rc_t 156785270581SAndrew Rybchenko efx_mcdi_init_evq( 156885270581SAndrew Rybchenko __in efx_nic_t *enp, 156985270581SAndrew Rybchenko __in unsigned int instance, 157085270581SAndrew Rybchenko __in efsys_mem_t *esmp, 157185270581SAndrew Rybchenko __in size_t nevs, 157285270581SAndrew Rybchenko __in uint32_t irq, 15733dee345aSAndrew Rybchenko __in uint32_t target_evq, 157485270581SAndrew Rybchenko __in uint32_t us, 157585270581SAndrew Rybchenko __in uint32_t flags, 157685270581SAndrew Rybchenko __in boolean_t low_latency); 157785270581SAndrew Rybchenko 157885270581SAndrew Rybchenko LIBEFX_INTERNAL 157985270581SAndrew Rybchenko extern __checkReturn efx_rc_t 158085270581SAndrew Rybchenko efx_mcdi_fini_evq( 158185270581SAndrew Rybchenko __in efx_nic_t *enp, 158285270581SAndrew Rybchenko __in uint32_t instance); 158385270581SAndrew Rybchenko 15847640543fSAndrew Rybchenko typedef struct efx_mcdi_init_rxq_params_s { 15857640543fSAndrew Rybchenko boolean_t disable_scatter; 15867640543fSAndrew Rybchenko boolean_t want_inner_classes; 15877640543fSAndrew Rybchenko uint32_t buf_size; 15887640543fSAndrew Rybchenko uint32_t ps_buf_size; 15897640543fSAndrew Rybchenko uint32_t es_bufs_per_desc; 15907640543fSAndrew Rybchenko uint32_t es_max_dma_len; 15917640543fSAndrew Rybchenko uint32_t es_buf_stride; 15927640543fSAndrew Rybchenko uint32_t hol_block_timeout; 1593c1f02189SAndrew Rybchenko uint32_t prefix_id; 15947640543fSAndrew Rybchenko } efx_mcdi_init_rxq_params_t; 15957640543fSAndrew Rybchenko 159609b59c7dSAndrew Rybchenko LIBEFX_INTERNAL 159709b59c7dSAndrew Rybchenko extern __checkReturn efx_rc_t 159809b59c7dSAndrew Rybchenko efx_mcdi_init_rxq( 159909b59c7dSAndrew Rybchenko __in efx_nic_t *enp, 160009b59c7dSAndrew Rybchenko __in uint32_t ndescs, 160109b59c7dSAndrew Rybchenko __in efx_evq_t *eep, 160209b59c7dSAndrew Rybchenko __in uint32_t label, 160309b59c7dSAndrew Rybchenko __in uint32_t instance, 160409b59c7dSAndrew Rybchenko __in efsys_mem_t *esmp, 16057640543fSAndrew Rybchenko __in const efx_mcdi_init_rxq_params_t *params); 160609b59c7dSAndrew Rybchenko 160709b59c7dSAndrew Rybchenko LIBEFX_INTERNAL 160809b59c7dSAndrew Rybchenko extern __checkReturn efx_rc_t 160909b59c7dSAndrew Rybchenko efx_mcdi_fini_rxq( 161009b59c7dSAndrew Rybchenko __in efx_nic_t *enp, 161109b59c7dSAndrew Rybchenko __in uint32_t instance); 161209b59c7dSAndrew Rybchenko 161370dc9c54SAndrew Rybchenko LIBEFX_INTERNAL 161470dc9c54SAndrew Rybchenko extern __checkReturn efx_rc_t 161570dc9c54SAndrew Rybchenko efx_mcdi_init_txq( 161670dc9c54SAndrew Rybchenko __in efx_nic_t *enp, 161770dc9c54SAndrew Rybchenko __in uint32_t ndescs, 161870dc9c54SAndrew Rybchenko __in uint32_t target_evq, 161970dc9c54SAndrew Rybchenko __in uint32_t label, 162070dc9c54SAndrew Rybchenko __in uint32_t instance, 162170dc9c54SAndrew Rybchenko __in uint16_t flags, 162270dc9c54SAndrew Rybchenko __in efsys_mem_t *esmp); 162370dc9c54SAndrew Rybchenko 162470dc9c54SAndrew Rybchenko LIBEFX_INTERNAL 162570dc9c54SAndrew Rybchenko extern __checkReturn efx_rc_t 162670dc9c54SAndrew Rybchenko efx_mcdi_fini_txq( 162770dc9c54SAndrew Rybchenko __in efx_nic_t *enp, 162870dc9c54SAndrew Rybchenko __in uint32_t instance); 162970dc9c54SAndrew Rybchenko 16304fd0181fSAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 163109b59c7dSAndrew Rybchenko 16325e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 16335e111ed8SAndrew Rybchenko 16345e111ed8SAndrew Rybchenko #if EFSYS_OPT_MAC_STATS 16355e111ed8SAndrew Rybchenko 16365e111ed8SAndrew Rybchenko /* 16375e111ed8SAndrew Rybchenko * Closed range of stats (i.e. the first and the last are included). 16385e111ed8SAndrew Rybchenko * The last must be greater or equal (if the range is one item only) to 16395e111ed8SAndrew Rybchenko * the first. 16405e111ed8SAndrew Rybchenko */ 16415e111ed8SAndrew Rybchenko struct efx_mac_stats_range { 16425e111ed8SAndrew Rybchenko efx_mac_stat_t first; 16435e111ed8SAndrew Rybchenko efx_mac_stat_t last; 16445e111ed8SAndrew Rybchenko }; 16455e111ed8SAndrew Rybchenko 16465e111ed8SAndrew Rybchenko typedef enum efx_stats_action_e { 16475e111ed8SAndrew Rybchenko EFX_STATS_CLEAR, 16485e111ed8SAndrew Rybchenko EFX_STATS_UPLOAD, 16495e111ed8SAndrew Rybchenko EFX_STATS_ENABLE_NOEVENTS, 16505e111ed8SAndrew Rybchenko EFX_STATS_ENABLE_EVENTS, 16515e111ed8SAndrew Rybchenko EFX_STATS_DISABLE, 16525e111ed8SAndrew Rybchenko } efx_stats_action_t; 16535e111ed8SAndrew Rybchenko 16545e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 16555e111ed8SAndrew Rybchenko extern efx_rc_t 16565e111ed8SAndrew Rybchenko efx_mac_stats_mask_add_ranges( 16575e111ed8SAndrew Rybchenko __inout_bcount(mask_size) uint32_t *maskp, 16585e111ed8SAndrew Rybchenko __in size_t mask_size, 16595e111ed8SAndrew Rybchenko __in_ecount(rng_count) const struct efx_mac_stats_range *rngp, 16605e111ed8SAndrew Rybchenko __in unsigned int rng_count); 16615e111ed8SAndrew Rybchenko 16625e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 16635e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 16645e111ed8SAndrew Rybchenko efx_mcdi_mac_stats( 16655e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 16665e111ed8SAndrew Rybchenko __in uint32_t vport_id, 16675e111ed8SAndrew Rybchenko __in_opt efsys_mem_t *esmp, 16685e111ed8SAndrew Rybchenko __in efx_stats_action_t action, 16695e111ed8SAndrew Rybchenko __in uint16_t period_ms); 16705e111ed8SAndrew Rybchenko 16715e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MAC_STATS */ 16725e111ed8SAndrew Rybchenko 1673a45edfceSIgor Romanov #if EFSYS_OPT_PCI 1674a45edfceSIgor Romanov 1675a45edfceSIgor Romanov /* 1676a45edfceSIgor Romanov * Find the next extended capability in a PCI device's config space 1677a45edfceSIgor Romanov * with specified capability id. 1678a45edfceSIgor Romanov * Passing 0 offset makes the function search from the start. 1679a45edfceSIgor Romanov * If search succeeds, found capability is in modified offset. 1680a45edfceSIgor Romanov * 1681a45edfceSIgor Romanov * Returns ENOENT if a capability is not found. 1682a45edfceSIgor Romanov */ 1683a45edfceSIgor Romanov LIBEFX_INTERNAL 1684a45edfceSIgor Romanov extern __checkReturn efx_rc_t 1685a45edfceSIgor Romanov efx_pci_config_find_next_ext_cap( 1686a45edfceSIgor Romanov __in efsys_pci_config_t *espcp, 168707999984SIgor Romanov __in const efx_pci_ops_t *epop, 1688a45edfceSIgor Romanov __in uint16_t cap_id, 1689a45edfceSIgor Romanov __inout size_t *offsetp); 1690a45edfceSIgor Romanov 1691a45edfceSIgor Romanov /* 1692a45edfceSIgor Romanov * Get the next extended capability in a PCI device's config space. 1693a45edfceSIgor Romanov * Passing 0 offset makes the function get the first capability. 1694a45edfceSIgor Romanov * If search succeeds, the capability is in modified offset. 1695a45edfceSIgor Romanov * 1696a45edfceSIgor Romanov * Returns ENOENT if there is no next capability. 1697a45edfceSIgor Romanov */ 1698a45edfceSIgor Romanov LIBEFX_INTERNAL 1699a45edfceSIgor Romanov extern __checkReturn efx_rc_t 1700a45edfceSIgor Romanov efx_pci_config_next_ext_cap( 1701a45edfceSIgor Romanov __in efsys_pci_config_t *espcp, 170207999984SIgor Romanov __in const efx_pci_ops_t *epop, 1703a45edfceSIgor Romanov __inout size_t *offsetp); 1704a45edfceSIgor Romanov 1705a45edfceSIgor Romanov /* 1706a45edfceSIgor Romanov * Find the next Xilinx capabilities table location by searching 1707a45edfceSIgor Romanov * PCI extended capabilities. 1708a45edfceSIgor Romanov * 1709a45edfceSIgor Romanov * Returns ENOENT if a table location is not found. 1710a45edfceSIgor Romanov */ 1711a45edfceSIgor Romanov LIBEFX_INTERNAL 1712a45edfceSIgor Romanov extern __checkReturn efx_rc_t 1713a45edfceSIgor Romanov efx_pci_find_next_xilinx_cap_table( 1714a45edfceSIgor Romanov __in efsys_pci_config_t *espcp, 171507999984SIgor Romanov __in const efx_pci_ops_t *epop, 1716a45edfceSIgor Romanov __inout size_t *pci_cap_offsetp, 1717a45edfceSIgor Romanov __out unsigned int *xilinx_tbl_barp, 1718a45edfceSIgor Romanov __out efsys_dma_addr_t *xilinx_tbl_offsetp); 1719a45edfceSIgor Romanov 1720a45edfceSIgor Romanov /* 1721a45edfceSIgor Romanov * Read a Xilinx extended PCI capability that gives the location 1722a45edfceSIgor Romanov * of a Xilinx capabilities table. 1723a45edfceSIgor Romanov * 1724a45edfceSIgor Romanov * Returns ENOENT if the extended PCI capability does not contain 1725a45edfceSIgor Romanov * Xilinx capabilities table locator. 1726a45edfceSIgor Romanov */ 1727a45edfceSIgor Romanov LIBEFX_INTERNAL 1728a45edfceSIgor Romanov extern __checkReturn efx_rc_t 1729a45edfceSIgor Romanov efx_pci_read_ext_cap_xilinx_table( 1730a45edfceSIgor Romanov __in efsys_pci_config_t *espcp, 173107999984SIgor Romanov __in const efx_pci_ops_t *epop, 1732a45edfceSIgor Romanov __in size_t cap_offset, 1733a45edfceSIgor Romanov __out unsigned int *barp, 1734a45edfceSIgor Romanov __out efsys_dma_addr_t *offsetp); 1735a45edfceSIgor Romanov 1736ba9568b8SIgor Romanov /* 1737ba9568b8SIgor Romanov * Find a capability with specified format_id in a Xilinx capabilities table. 1738ba9568b8SIgor Romanov * Searching is started from provided offset, taking skip_first into account. 1739ba9568b8SIgor Romanov * If search succeeds, found capability is in modified offset. 1740ba9568b8SIgor Romanov * 1741ba9568b8SIgor Romanov * Returns ENOENT if an entry with specified format id is not found. 1742ba9568b8SIgor Romanov */ 1743ba9568b8SIgor Romanov LIBEFX_INTERNAL 1744ba9568b8SIgor Romanov extern __checkReturn efx_rc_t 1745ba9568b8SIgor Romanov efx_pci_xilinx_cap_tbl_find( 1746ba9568b8SIgor Romanov __in efsys_bar_t *esbp, 1747ba9568b8SIgor Romanov __in uint32_t format_id, 1748ba9568b8SIgor Romanov __in boolean_t skip_first, 1749ba9568b8SIgor Romanov __inout efsys_dma_addr_t *entry_offsetp); 1750ba9568b8SIgor Romanov 1751a45edfceSIgor Romanov #endif /* EFSYS_OPT_PCI */ 1752a45edfceSIgor Romanov 1753b75eb50dSIvan Malov #if EFSYS_OPT_MAE 1754b75eb50dSIvan Malov 1755b75eb50dSIvan Malov struct efx_mae_match_spec_s { 1756b75eb50dSIvan Malov efx_mae_rule_type_t emms_type; 1757b75eb50dSIvan Malov uint32_t emms_prio; 175834285fd0SIvan Malov union emms_mask_value_pairs { 175937907899SIvan Malov uint8_t action[ 176037907899SIvan Malov MAE_FIELD_MASK_VALUE_PAIRS_V2_LEN]; 17611efc26e1SIvan Malov uint8_t outer[MAE_ENC_FIELD_PAIRS_LEN]; 176234285fd0SIvan Malov } emms_mask_value_pairs; 17635cf153e7SIvan Malov uint8_t emms_outer_rule_recirc_id; 1764*be698f34SIvan Malov boolean_t emms_outer_rule_do_ct; 1765b75eb50dSIvan Malov }; 1766b75eb50dSIvan Malov 176780019097SIvan Malov typedef enum efx_mae_action_e { 1768616b03e0SIvan Malov /* These actions are strictly ordered. */ 17690f6b017bSIvan Malov EFX_MAE_ACTION_DECAP, 1770616b03e0SIvan Malov EFX_MAE_ACTION_VLAN_POP, 177192bafeffSIvan Malov EFX_MAE_ACTION_SET_DST_MAC, 177292bafeffSIvan Malov EFX_MAE_ACTION_SET_SRC_MAC, 1773c6e3e6c4SIvan Malov EFX_MAE_ACTION_DECR_IP_TTL, 177412cd7909SIvan Malov EFX_MAE_ACTION_VLAN_PUSH, 1775238306cfSIgor Romanov EFX_MAE_ACTION_COUNT, 17763907defaSIvan Malov EFX_MAE_ACTION_ENCAP, 1777616b03e0SIvan Malov 177877da5888SIvan Malov /* 177977da5888SIvan Malov * These actions are not strictly ordered and can 178077da5888SIvan Malov * be passed by a client in any order (before DELIVER). 178177da5888SIvan Malov * However, these enumerants must be kept compactly 178277da5888SIvan Malov * in the end of the enumeration (before DELIVER). 178377da5888SIvan Malov */ 178477da5888SIvan Malov EFX_MAE_ACTION_FLAG, 178583352289SIvan Malov EFX_MAE_ACTION_MARK, 178677da5888SIvan Malov 178780019097SIvan Malov /* DELIVER is always the last action. */ 178880019097SIvan Malov EFX_MAE_ACTION_DELIVER, 178980019097SIvan Malov 179080019097SIvan Malov EFX_MAE_NACTIONS 179180019097SIvan Malov } efx_mae_action_t; 179280019097SIvan Malov 1793616b03e0SIvan Malov /* MAE VLAN_POP action can handle 1 or 2 tags. */ 1794616b03e0SIvan Malov #define EFX_MAE_VLAN_POP_MAX_NTAGS (2) 1795616b03e0SIvan Malov 179612cd7909SIvan Malov /* MAE VLAN_PUSH action can handle 1 or 2 tags. */ 179712cd7909SIvan Malov #define EFX_MAE_VLAN_PUSH_MAX_NTAGS (2) 179812cd7909SIvan Malov 179912cd7909SIvan Malov typedef struct efx_mae_action_vlan_push_s { 180012cd7909SIvan Malov uint16_t emavp_tpid_be; 180112cd7909SIvan Malov uint16_t emavp_tci_be; 180212cd7909SIvan Malov } efx_mae_action_vlan_push_t; 180312cd7909SIvan Malov 1804cf1e1a8eSIvan Malov /* 1805cf1e1a8eSIvan Malov * Helper efx_mae_action_set_clear_fw_rsrc_ids() is responsible 1806cf1e1a8eSIvan Malov * to initialise every field in this structure to INVALID value. 1807cf1e1a8eSIvan Malov */ 18083907defaSIvan Malov typedef struct efx_mae_actions_rsrc_s { 180992bafeffSIvan Malov efx_mae_mac_id_t emar_dst_mac_id; 181092bafeffSIvan Malov efx_mae_mac_id_t emar_src_mac_id; 18113907defaSIvan Malov efx_mae_eh_id_t emar_eh_id; 1812238306cfSIgor Romanov efx_counter_t emar_counter_id; 18133907defaSIvan Malov } efx_mae_actions_rsrc_t; 18143907defaSIvan Malov 1815799889baSIvan Malov struct efx_mae_actions_s { 181680019097SIvan Malov /* Bitmap of actions in spec, indexed by action type */ 181780019097SIvan Malov uint32_t ema_actions; 181880019097SIvan Malov 1819616b03e0SIvan Malov unsigned int ema_n_vlan_tags_to_pop; 182012cd7909SIvan Malov unsigned int ema_n_vlan_tags_to_push; 182112cd7909SIvan Malov efx_mae_action_vlan_push_t ema_vlan_push_descs[ 182212cd7909SIvan Malov EFX_MAE_VLAN_PUSH_MAX_NTAGS]; 1823238306cfSIgor Romanov unsigned int ema_n_count_actions; 182483352289SIvan Malov uint32_t ema_mark_value; 182580019097SIvan Malov efx_mport_sel_t ema_deliver_mport; 18263907defaSIvan Malov 18273907defaSIvan Malov /* 18283907defaSIvan Malov * Always keep this at the end of the struct since 18293907defaSIvan Malov * efx_mae_action_set_specs_equal() relies on that 18303907defaSIvan Malov * to make sure that resource IDs are not compared. 18313907defaSIvan Malov */ 18323907defaSIvan Malov efx_mae_actions_rsrc_t ema_rsrc; 1833c6e3e6c4SIvan Malov 1834c6e3e6c4SIvan Malov /* 1835c6e3e6c4SIvan Malov * A copy of encp->enc_mae_aset_v2_supported. 1836c6e3e6c4SIvan Malov * It is set by efx_mae_action_set_spec_init(). 1837c6e3e6c4SIvan Malov * This value is ignored on spec comparisons. 1838c6e3e6c4SIvan Malov */ 1839c6e3e6c4SIvan Malov boolean_t ema_v2_is_supported; 1840799889baSIvan Malov }; 1841799889baSIvan Malov 1842b75eb50dSIvan Malov #endif /* EFSYS_OPT_MAE */ 1843b75eb50dSIvan Malov 18444dda72dbSVijay Srivastava #if EFSYS_OPT_VIRTIO 18454dda72dbSVijay Srivastava 18464dda72dbSVijay Srivastava #define EFX_VQ_MAGIC 0x026011950 18474dda72dbSVijay Srivastava 18484dda72dbSVijay Srivastava typedef enum efx_virtio_vq_state_e { 18494dda72dbSVijay Srivastava EFX_VIRTIO_VQ_STATE_UNKNOWN = 0, 18504dda72dbSVijay Srivastava EFX_VIRTIO_VQ_STATE_INITIALIZED, 18514dda72dbSVijay Srivastava EFX_VIRTIO_VQ_STATE_STARTED, 18524dda72dbSVijay Srivastava EFX_VIRTIO_VQ_NSTATES 18534dda72dbSVijay Srivastava } efx_virtio_vq_state_t; 18544dda72dbSVijay Srivastava 18554dda72dbSVijay Srivastava struct efx_virtio_vq_s { 18564dda72dbSVijay Srivastava uint32_t evv_magic; 18574dda72dbSVijay Srivastava efx_nic_t *evv_enp; 18584dda72dbSVijay Srivastava efx_virtio_vq_state_t evv_state; 18594dda72dbSVijay Srivastava uint32_t evv_vi_index; 18604dda72dbSVijay Srivastava efx_virtio_vq_type_t evv_type; 18614dda72dbSVijay Srivastava uint16_t evv_target_vf; 18624dda72dbSVijay Srivastava }; 18634dda72dbSVijay Srivastava 18644dda72dbSVijay Srivastava #endif /* EFSYS_OPT_VIRTIO */ 18654dda72dbSVijay Srivastava 18665e111ed8SAndrew Rybchenko #ifdef __cplusplus 18675e111ed8SAndrew Rybchenko } 18685e111ed8SAndrew Rybchenko #endif 18695e111ed8SAndrew Rybchenko 18705e111ed8SAndrew Rybchenko #endif /* _SYS_EFX_IMPL_H */ 1871