net/sfc/base: add function to create packed stream RxQ
[dpdk.git] / drivers / net / sfc / base / ef10_impl.h
index 3efba1f..a17b471 100644 (file)
@@ -50,8 +50,9 @@ extern "C" {
  */
 #define        EF10_NVRAM_CHUNK 0x80
 
-/* Alignment requirement for value written to RX WPTR:
- *  the WPTR must be aligned to an 8 descriptor boundary
+/*
+ * Alignment requirement for value written to RX WPTR: the WPTR must be aligned
+ * to an 8 descriptor boundary.
  */
 #define        EF10_RX_WPTR_ALIGN 8
 
@@ -80,7 +81,7 @@ ef10_ev_qcreate(
        __in            efx_nic_t *enp,
        __in            unsigned int index,
        __in            efsys_mem_t *esmp,
-       __in            size_t n,
+       __in            size_t ndescs,
        __in            uint32_t id,
        __in            uint32_t us,
        __in            uint32_t flags,
@@ -117,7 +118,7 @@ ef10_ev_rxlabel_init(
        __in            efx_evq_t *eep,
        __in            efx_rxq_t *erp,
        __in            unsigned int label,
-       __in            boolean_t packed_stream);
+       __in            efx_rxq_type_t type);
 
                void
 ef10_ev_rxlabel_fini(
@@ -259,6 +260,33 @@ extern                     void
 ef10_mac_filter_default_rxq_clear(
        __in            efx_nic_t *enp);
 
+#if EFSYS_OPT_LOOPBACK
+
+extern __checkReturn   efx_rc_t
+ef10_mac_loopback_set(
+       __in            efx_nic_t *enp,
+       __in            efx_link_mode_t link_mode,
+       __in            efx_loopback_type_t loopback_type);
+
+#endif /* EFSYS_OPT_LOOPBACK */
+
+#if EFSYS_OPT_MAC_STATS
+
+extern __checkReturn                   efx_rc_t
+ef10_mac_stats_get_mask(
+       __in                            efx_nic_t *enp,
+       __inout_bcount(mask_size)       uint32_t *maskp,
+       __in                            size_t mask_size);
+
+extern __checkReturn                   efx_rc_t
+ef10_mac_stats_update(
+       __in                            efx_nic_t *enp,
+       __in                            efsys_mem_t *esmp,
+       __inout_ecount(EFX_MAC_NSTATS)  efsys_stat_t *stat,
+       __inout_opt                     uint32_t *generationp);
+
+#endif /* EFSYS_OPT_MAC_STATS */
+
 
 /* MCDI */
 
@@ -312,6 +340,230 @@ ef10_mcdi_get_timeout(
 
 /* NVRAM */
 
+#if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buf_read_tlv(
+       __in                            efx_nic_t *enp,
+       __in_bcount(max_seg_size)       caddr_t seg_data,
+       __in                            size_t max_seg_size,
+       __in                            uint32_t tag,
+       __deref_out_bcount_opt(*sizep)  caddr_t *datap,
+       __out                           size_t *sizep);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buf_write_tlv(
+       __inout_bcount(partn_size)      caddr_t partn_data,
+       __in                            size_t partn_size,
+       __in                            uint32_t tag,
+       __in_bcount(tag_size)           caddr_t tag_data,
+       __in                            size_t tag_size,
+       __out                           size_t *total_lengthp);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_read_tlv(
+       __in                            efx_nic_t *enp,
+       __in                            uint32_t partn,
+       __in                            uint32_t tag,
+       __deref_out_bcount_opt(*sizep)  caddr_t *datap,
+       __out                           size_t *sizep);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_write_tlv(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    uint32_t tag,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_write_segment_tlv(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    uint32_t tag,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size,
+       __in                    boolean_t all_segments);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_lock(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_unlock(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __out_opt               uint32_t *resultp);
+
+#endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
+
+#if EFSYS_OPT_NVRAM
+
+#if EFSYS_OPT_DIAG
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_test(
+       __in                    efx_nic_t *enp);
+
+#endif /* EFSYS_OPT_DIAG */
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_type_to_partn(
+       __in                    efx_nic_t *enp,
+       __in                    efx_nvram_type_t type,
+       __out                   uint32_t *partnp);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_size(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __out                   size_t *sizep);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_rw_start(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __out                   size_t *chunk_sizep);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_read_mode(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    unsigned int offset,
+       __out_bcount(size)      caddr_t data,
+       __in                    size_t size,
+       __in                    uint32_t mode);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_read(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    unsigned int offset,
+       __out_bcount(size)      caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_read_backup(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    unsigned int offset,
+       __out_bcount(size)      caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_erase(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    unsigned int offset,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_write(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    unsigned int offset,
+       __out_bcount(size)      caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_rw_finish(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __out_opt               uint32_t *verify_resultp);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_get_version(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __out                   uint32_t *subtypep,
+       __out_ecount(4)         uint16_t version[4]);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_set_version(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in_ecount(4)          uint16_t version[4]);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_validate(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_create(
+       __in                    efx_nic_t *enp,
+       __in                    uint16_t partn_type,
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_find_item_start(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size,
+       __out                   uint32_t *startp);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_find_end(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size,
+       __in                    uint32_t offset,
+       __out                   uint32_t *endp);
+
+extern __checkReturn   __success(return != B_FALSE)    boolean_t
+ef10_nvram_buffer_find_item(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size,
+       __in                    uint32_t offset,
+       __out                   uint32_t *startp,
+       __out                   uint32_t *lengthp);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_get_item(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size,
+       __in                    uint32_t offset,
+       __in                    uint32_t length,
+       __out_bcount_part(item_max_size, *lengthp)
+                               caddr_t itemp,
+       __in                    size_t item_max_size,
+       __out                   uint32_t *lengthp);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_insert_item(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size,
+       __in                    uint32_t offset,
+       __in_bcount(length)     caddr_t keyp,
+       __in                    uint32_t length,
+       __out                   uint32_t *lengthp);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_delete_item(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size,
+       __in                    uint32_t offset,
+       __in                    uint32_t length,
+       __in                    uint32_t end);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_finish(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size);
+
+#endif /* EFSYS_OPT_NVRAM */
+
 
 /* PHY */
 
@@ -320,6 +572,9 @@ typedef struct ef10_link_state_s {
        uint32_t                els_lp_cap_mask;
        unsigned int            els_fcntl;
        efx_link_mode_t         els_link_mode;
+#if EFSYS_OPT_LOOPBACK
+       efx_loopback_type_t     els_loopback;
+#endif
        boolean_t               els_mac_up;
 } ef10_link_state_t;
 
@@ -407,7 +662,7 @@ ef10_tx_qcreate(
        __in            unsigned int index,
        __in            unsigned int label,
        __in            efsys_mem_t *esmp,
-       __in            size_t n,
+       __in            size_t ndescs,
        __in            uint32_t id,
        __in            uint16_t flags,
        __in            efx_evq_t *eep,
@@ -418,13 +673,13 @@ extern            void
 ef10_tx_qdestroy(
        __in            efx_txq_t *etp);
 
-extern __checkReturn   efx_rc_t
+extern __checkReturn           efx_rc_t
 ef10_tx_qpost(
-       __in            efx_txq_t *etp,
-       __in_ecount(n)  efx_buffer_t *eb,
-       __in            unsigned int n,
-       __in            unsigned int completed,
-       __inout         unsigned int *addedp);
+       __in                    efx_txq_t *etp,
+       __in_ecount(ndescs)     efx_buffer_t *ebp,
+       __in                    unsigned int ndescs,
+       __in                    unsigned int completed,
+       __inout                 unsigned int *addedp);
 
 extern                 void
 ef10_tx_qpush(
@@ -432,6 +687,22 @@ ef10_tx_qpush(
        __in            unsigned int added,
        __in            unsigned int pushed);
 
+#if EFSYS_OPT_RX_PACKED_STREAM
+extern                 void
+ef10_rx_qpush_ps_credits(
+       __in            efx_rxq_t *erp);
+
+extern __checkReturn   uint8_t *
+ef10_rx_qps_packet_info(
+       __in            efx_rxq_t *erp,
+       __in            uint8_t *buffer,
+       __in            uint32_t buffer_length,
+       __in            uint32_t current_offset,
+       __out           uint16_t *lengthp,
+       __out           uint32_t *next_offsetp,
+       __out           uint32_t *timestamp);
+#endif
+
 extern __checkReturn   efx_rc_t
 ef10_tx_qpace(
        __in            efx_txq_t *etp,
@@ -518,7 +789,7 @@ ef10_tx_qstats_update(
 
 typedef uint32_t       efx_piobuf_handle_t;
 
-#define        EFX_PIOBUF_HANDLE_INVALID       ((efx_piobuf_handle_t) -1)
+#define        EFX_PIOBUF_HANDLE_INVALID       ((efx_piobuf_handle_t)-1)
 
 extern __checkReturn   efx_rc_t
 ef10_nic_pio_alloc(
@@ -549,6 +820,69 @@ ef10_nic_pio_unlink(
 
 /* VPD */
 
+#if EFSYS_OPT_VPD
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_init(
+       __in                    efx_nic_t *enp);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_size(
+       __in                    efx_nic_t *enp,
+       __out                   size_t *sizep);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_read(
+       __in                    efx_nic_t *enp,
+       __out_bcount(size)      caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_verify(
+       __in                    efx_nic_t *enp,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_reinit(
+       __in                    efx_nic_t *enp,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_get(
+       __in                    efx_nic_t *enp,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size,
+       __inout                 efx_vpd_value_t *evvp);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_set(
+       __in                    efx_nic_t *enp,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size,
+       __in                    efx_vpd_value_t *evvp);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_next(
+       __in                    efx_nic_t *enp,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size,
+       __out                   efx_vpd_value_t *evvp,
+       __inout                 unsigned int *contp);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_write(
+       __in                    efx_nic_t *enp,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size);
+
+extern                         void
+ef10_vpd_fini(
+       __in                    efx_nic_t *enp);
+
+#endif /* EFSYS_OPT_VPD */
+
 
 /* RX */
 
@@ -556,6 +890,57 @@ extern     __checkReturn   efx_rc_t
 ef10_rx_init(
        __in            efx_nic_t *enp);
 
+#if EFSYS_OPT_RX_SCATTER
+extern __checkReturn   efx_rc_t
+ef10_rx_scatter_enable(
+       __in            efx_nic_t *enp,
+       __in            unsigned int buf_size);
+#endif /* EFSYS_OPT_RX_SCATTER */
+
+
+#if EFSYS_OPT_RX_SCALE
+
+extern __checkReturn   efx_rc_t
+ef10_rx_scale_context_alloc(
+       __in            efx_nic_t *enp,
+       __in            efx_rx_scale_context_type_t type,
+       __in            uint32_t num_queues,
+       __out           uint32_t *rss_contextp);
+
+extern __checkReturn   efx_rc_t
+ef10_rx_scale_context_free(
+       __in            efx_nic_t *enp,
+       __in            uint32_t rss_context);
+
+extern __checkReturn   efx_rc_t
+ef10_rx_scale_mode_set(
+       __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
+       __in            efx_rx_hash_alg_t alg,
+       __in            efx_rx_hash_type_t type,
+       __in            boolean_t insert);
+
+extern __checkReturn   efx_rc_t
+ef10_rx_scale_key_set(
+       __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
+       __in_ecount(n)  uint8_t *key,
+       __in            size_t n);
+
+extern __checkReturn   efx_rc_t
+ef10_rx_scale_tbl_set(
+       __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
+       __in_ecount(n)  unsigned int *table,
+       __in            size_t n);
+
+extern __checkReturn   uint32_t
+ef10_rx_prefix_hash(
+       __in            efx_nic_t *enp,
+       __in            efx_rx_hash_alg_t func,
+       __in            uint8_t *buffer);
+
+#endif /* EFSYS_OPT_RX_SCALE */
 
 extern __checkReturn   efx_rc_t
 ef10_rx_prefix_pktlen(
@@ -563,14 +948,14 @@ ef10_rx_prefix_pktlen(
        __in            uint8_t *buffer,
        __out           uint16_t *lengthp);
 
-extern                 void
+extern                         void
 ef10_rx_qpost(
-       __in            efx_rxq_t *erp,
-       __in_ecount(n)  efsys_dma_addr_t *addrp,
-       __in            size_t size,
-       __in            unsigned int n,
-       __in            unsigned int completed,
-       __in            unsigned int added);
+       __in                    efx_rxq_t *erp,
+       __in_ecount(ndescs)     efsys_dma_addr_t *addrp,
+       __in                    size_t size,
+       __in                    unsigned int ndescs,
+       __in                    unsigned int completed,
+       __in                    unsigned int added);
 
 extern                 void
 ef10_rx_qpush(
@@ -592,9 +977,11 @@ ef10_rx_qcreate(
        __in            unsigned int index,
        __in            unsigned int label,
        __in            efx_rxq_type_t type,
+       __in            uint32_t type_data,
        __in            efsys_mem_t *esmp,
-       __in            size_t n,
+       __in            size_t ndescs,
        __in            uint32_t id,
+       __in            unsigned int flags,
        __in            efx_evq_t *eep,
        __in            efx_rxq_t *erp);
 
@@ -638,6 +1025,13 @@ typedef struct ef10_filter_entry_s {
 /* Allow for the broadcast address to be added to the multicast list */
 #define        EFX_EF10_FILTER_MULTICAST_FILTERS_MAX   (EFX_MAC_MULTICAST_LIST_MAX + 1)
 
+/*
+ * For encapsulated packets, there is one filter each for each combination of
+ * IPv4 or IPv6 outer frame, VXLAN, GENEVE or NVGRE packet type, and unicast or
+ * multicast inner frames.
+ */
+#define        EFX_EF10_FILTER_ENCAP_FILTERS_MAX       12
+
 typedef struct ef10_filter_table_s {
        ef10_filter_entry_t     eft_entry[EFX_EF10_FILTER_TBL_ROWS];
        efx_rxq_t               *eft_default_rxq;
@@ -649,6 +1043,9 @@ typedef struct ef10_filter_table_s {
            EFX_EF10_FILTER_MULTICAST_FILTERS_MAX];
        uint32_t                eft_mulcst_filter_count;
        boolean_t               eft_using_all_mulcst;
+       uint32_t                eft_encap_filter_indexes[
+           EFX_EF10_FILTER_ENCAP_FILTERS_MAX];
+       uint32_t                eft_encap_filter_count;
 } ef10_filter_table_t;
 
        __checkReturn   efx_rc_t
@@ -676,9 +1073,10 @@ ef10_filter_delete(
 
 extern __checkReturn   efx_rc_t
 ef10_filter_supported_filters(
-       __in            efx_nic_t *enp,
-       __out           uint32_t *list,
-       __out           size_t *length);
+       __in                            efx_nic_t *enp,
+       __out_ecount(buffer_length)     uint32_t *buffer,
+       __in                            size_t buffer_length,
+       __out                           size_t *list_lengthp);
 
 extern __checkReturn   efx_rc_t
 ef10_filter_reconfigure(
@@ -778,6 +1176,36 @@ ef10_external_port_mapping(
        __in            uint32_t port,
        __out           uint8_t *external_portp);
 
+#if EFSYS_OPT_RX_PACKED_STREAM
+
+/* Data space per credit in packed stream mode */
+#define        EFX_RX_PACKED_STREAM_MEM_PER_CREDIT (1 << 16)
+
+/*
+ * Received packets are always aligned at this boundary. Also there always
+ * exists a gap of this size between packets.
+ * (see SF-112241-TC, 4.5)
+ */
+#define        EFX_RX_PACKED_STREAM_ALIGNMENT 64
+
+/*
+ * Size of a pseudo-header prepended to received packets
+ * in packed stream mode
+ */
+#define        EFX_RX_PACKED_STREAM_RX_PREFIX_SIZE 8
+
+/* Minimum space for packet in packed stream mode */
+#define        EFX_RX_PACKED_STREAM_MIN_PACKET_SPACE                \
+       P2ROUNDUP(EFX_RX_PACKED_STREAM_RX_PREFIX_SIZE +      \
+           EFX_MAC_PDU_MIN +                                \
+           EFX_RX_PACKED_STREAM_ALIGNMENT,                  \
+           EFX_RX_PACKED_STREAM_ALIGNMENT)
+
+/* Maximum number of credits */
+#define        EFX_RX_PACKED_STREAM_MAX_CREDITS 127
+
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
+
 #ifdef __cplusplus
 }
 #endif