build: disable experimental API check internally
[dpdk.git] / drivers / net / sfc / base / ef10_rx.c
index d18010d..5f5dd3c 100644 (file)
@@ -8,19 +8,20 @@
 #include "efx_impl.h"
 
 
-#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
+#if EFX_OPTS_EF10()
 
 
 static __checkReturn   efx_rc_t
 efx_mcdi_init_rxq(
        __in            efx_nic_t *enp,
        __in            uint32_t ndescs,
-       __in            uint32_t target_evq,
+       __in            efx_evq_t *eep,
        __in            uint32_t label,
        __in            uint32_t instance,
        __in            efsys_mem_t *esmp,
        __in            boolean_t disable_scatter,
        __in            boolean_t want_inner_classes,
+       __in            uint32_t buf_size,
        __in            uint32_t ps_bufsize,
        __in            uint32_t es_bufs_per_desc,
        __in            uint32_t es_max_dma_len,
@@ -29,23 +30,32 @@ efx_mcdi_init_rxq(
 {
        efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
        efx_mcdi_req_t req;
-       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V3_IN_LEN,
-               MC_CMD_INIT_RXQ_V3_OUT_LEN);
-       int npages = EFX_RXQ_NBUFS(ndescs);
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V4_IN_LEN,
+               MC_CMD_INIT_RXQ_V4_OUT_LEN);
+       int npages = efx_rxq_nbufs(enp, ndescs);
        int i;
        efx_qword_t *dma_addr;
        uint64_t addr;
        efx_rc_t rc;
        uint32_t dma_mode;
        boolean_t want_outer_classes;
+       boolean_t no_cont_ev;
 
-       EFSYS_ASSERT3U(ndescs, <=, EFX_RXQ_MAXNDESCS);
+       EFSYS_ASSERT3U(ndescs, <=, encp->enc_rxq_max_ndescs);
 
-       if ((esmp == NULL) || (EFSYS_MEM_SIZE(esmp) < EFX_RXQ_SIZE(ndescs))) {
+       if ((esmp == NULL) ||
+           (EFSYS_MEM_SIZE(esmp) < efx_rxq_size(enp, ndescs))) {
                rc = EINVAL;
                goto fail1;
        }
 
+       no_cont_ev = (eep->ee_flags & EFX_EVQ_FLAGS_NO_CONT_EV);
+       if ((no_cont_ev == B_TRUE) && (disable_scatter == B_FALSE)) {
+               /* TODO: Support scatter in NO_CONT_EV mode */
+               rc = EINVAL;
+               goto fail2;
+       }
+
        if (ps_bufsize > 0)
                dma_mode = MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM;
        else if (es_bufs_per_desc > 0)
@@ -75,15 +85,15 @@ efx_mcdi_init_rxq(
 
        req.emr_cmd = MC_CMD_INIT_RXQ;
        req.emr_in_buf = payload;
-       req.emr_in_length = MC_CMD_INIT_RXQ_V3_IN_LEN;
+       req.emr_in_length = MC_CMD_INIT_RXQ_V4_IN_LEN;
        req.emr_out_buf = payload;
-       req.emr_out_length = MC_CMD_INIT_RXQ_V3_OUT_LEN;
+       req.emr_out_length = MC_CMD_INIT_RXQ_V4_OUT_LEN;
 
        MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
-       MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, target_evq);
+       MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
        MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_LABEL, label);
        MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_INSTANCE, instance);
-       MCDI_IN_POPULATE_DWORD_9(req, INIT_RXQ_EXT_IN_FLAGS,
+       MCDI_IN_POPULATE_DWORD_10(req, INIT_RXQ_EXT_IN_FLAGS,
            INIT_RXQ_EXT_IN_FLAG_BUFF_MODE, 0,
            INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT, 0,
            INIT_RXQ_EXT_IN_FLAG_TIMESTAMP, 0,
@@ -93,9 +103,10 @@ efx_mcdi_init_rxq(
            INIT_RXQ_EXT_IN_DMA_MODE,
            dma_mode,
            INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, ps_bufsize,
-           INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes);
+           INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes,
+           INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV, no_cont_ev);
        MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0);
-       MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, EVB_PORT_ID_ASSIGNED);
+       MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, enp->en_vport_id);
 
        if (es_bufs_per_desc > 0) {
                MCDI_IN_SET_DWORD(req,
@@ -110,6 +121,10 @@ efx_mcdi_init_rxq(
                    hol_block_timeout);
        }
 
+       if (encp->enc_init_rxq_with_buffer_size)
+               MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
+                   buf_size);
+
        dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
        addr = EFSYS_MEM_ADDR(esmp);
 
@@ -126,11 +141,13 @@ efx_mcdi_init_rxq(
 
        if (req.emr_rc != 0) {
                rc = req.emr_rc;
-               goto fail2;
+               goto fail3;
        }
 
        return (0);
 
+fail3:
+       EFSYS_PROBE(fail3);
 fail2:
        EFSYS_PROBE(fail2);
 fail1:
@@ -216,7 +233,7 @@ efx_mcdi_rss_context_alloc(
        req.emr_out_length = MC_CMD_RSS_CONTEXT_ALLOC_OUT_LEN;
 
        MCDI_IN_SET_DWORD(req, RSS_CONTEXT_ALLOC_IN_UPSTREAM_PORT_ID,
-           EVB_PORT_ID_ASSIGNED);
+               enp->en_vport_id);
        MCDI_IN_SET_DWORD(req, RSS_CONTEXT_ALLOC_IN_TYPE, context_type);
 
        /*
@@ -842,7 +859,7 @@ ef10_rx_qpush(
        efx_dword_t dword;
 
        /* Hardware has alignment restriction for WPTR */
-       wptr = P2ALIGN(added, EF10_RX_WPTR_ALIGN);
+       wptr = EFX_P2ALIGN(unsigned int, added, EF10_RX_WPTR_ALIGN);
        if (pushed == wptr)
                return;
 
@@ -930,8 +947,9 @@ ef10_rx_qps_packet_info(
        *lengthp   = EFX_QWORD_FIELD(*qwordp, ES_DZ_PS_RX_PREFIX_ORIG_LEN);
        buf_len    = EFX_QWORD_FIELD(*qwordp, ES_DZ_PS_RX_PREFIX_CAP_LEN);
 
-       buf_len = P2ROUNDUP(buf_len + EFX_RX_PACKED_STREAM_RX_PREFIX_SIZE,
-                           EFX_RX_PACKED_STREAM_ALIGNMENT);
+       buf_len = EFX_P2ROUNDUP(uint16_t,
+           buf_len + EFX_RX_PACKED_STREAM_RX_PREFIX_SIZE,
+           EFX_RX_PACKED_STREAM_ALIGNMENT);
        *next_offsetp =
            current_offset + buf_len + EFX_RX_PACKED_STREAM_ALIGNMENT;
 
@@ -1006,27 +1024,24 @@ ef10_rx_qcreate(
        uint32_t es_buf_stride = 0;
        uint32_t hol_block_timeout = 0;
 
-       _NOTE(ARGUNUSED(id, erp, type_data))
+       _NOTE(ARGUNUSED(id, erp))
 
        EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
        EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
        EFSYS_ASSERT3U(enp->en_rx_qcount + 1, <, encp->enc_rxq_limit);
 
-       EFX_STATIC_ASSERT(ISP2(EFX_RXQ_MAXNDESCS));
-       EFX_STATIC_ASSERT(ISP2(EFX_RXQ_MINNDESCS));
-
-       if (!ISP2(ndescs) ||
-           (ndescs < EFX_RXQ_MINNDESCS) || (ndescs > EFX_RXQ_MAXNDESCS)) {
-               rc = EINVAL;
-               goto fail1;
-       }
        if (index >= encp->enc_rxq_limit) {
                rc = EINVAL;
-               goto fail2;
+               goto fail1;
        }
 
        switch (type) {
        case EFX_RXQ_TYPE_DEFAULT:
+               if (type_data == NULL) {
+                       rc = EINVAL;
+                       goto fail2;
+               }
+               erp->er_buf_size = type_data->ertd_default.ed_buf_size;
                ps_buf_size = 0;
                break;
 #if EFSYS_OPT_RX_PACKED_STREAM
@@ -1055,6 +1070,7 @@ ef10_rx_qcreate(
                        rc = ENOTSUP;
                        goto fail4;
                }
+               erp->er_buf_size = type_data->ertd_packed_stream.eps_buf_size;
                break;
 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
 #if EFSYS_OPT_RX_ES_SUPER_BUFFER
@@ -1103,12 +1119,12 @@ ef10_rx_qcreate(
                        rc = ENOTSUP;
                        goto fail9;
                }
-               if (!IS_P2ALIGNED(es_max_dma_len,
+               if (!EFX_IS_P2ALIGNED(uint32_t, es_max_dma_len,
                            EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
                        rc = EINVAL;
                        goto fail10;
                }
-               if (!IS_P2ALIGNED(es_buf_stride,
+               if (!EFX_IS_P2ALIGNED(uint32_t, es_buf_stride,
                            EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
                        rc = EINVAL;
                        goto fail11;
@@ -1129,8 +1145,8 @@ ef10_rx_qcreate(
        else
                want_inner_classes = B_FALSE;
 
-       if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep->ee_index, label, index,
-                   esmp, disable_scatter, want_inner_classes,
+       if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
+                   esmp, disable_scatter, want_inner_classes, erp->er_buf_size,
                    ps_buf_size, es_bufs_per_desc, es_max_dma_len,
                    es_buf_stride, hol_block_timeout)) != 0)
                goto fail12;
@@ -1210,4 +1226,4 @@ ef10_rx_fini(
 #endif /* EFSYS_OPT_RX_SCALE */
 }
 
-#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
+#endif /* EFX_OPTS_EF10() */