common/sfc_efx/base: support NIC DMA memory regions API
[dpdk.git] / drivers / common / sfc_efx / base / ef10_nic.c
index bbc5981..355d274 100644 (file)
@@ -1452,6 +1452,15 @@ ef10_get_datapath_caps(
                encp->enc_mae_supported = B_FALSE;
                encp->enc_mae_admin = B_FALSE;
        }
+
+       /*
+        * Check support for MAE action set v2 features.
+        * These provide support for packet edits.
+        */
+       if (CAP_FLAGS3(req, MAE_ACTION_SET_ALLOC_V2_SUPPORTED))
+               encp->enc_mae_aset_v2_supported = B_TRUE;
+       else
+               encp->enc_mae_aset_v2_supported = B_FALSE;
 #else
        encp->enc_mae_supported = B_FALSE;
        encp->enc_mae_admin = B_FALSE;
@@ -1845,6 +1854,51 @@ fail1:
        return (rc);
 }
 
+static __checkReturn   efx_rc_t
+efx_mcdi_get_nic_addr_caps(
+       __in            efx_nic_t *enp)
+{
+       efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+       uint32_t mapping_type;
+       efx_rc_t rc;
+
+       rc = efx_mcdi_get_nic_addr_info(enp, &mapping_type);
+       if (rc != 0) {
+               if (rc == ENOTSUP) {
+                       encp->enc_dma_mapping = EFX_NIC_DMA_MAPPING_FLAT;
+                       goto out;
+               }
+               goto fail1;
+       }
+
+       switch (mapping_type) {
+       case MC_CMD_GET_DESC_ADDR_INFO_OUT_MAPPING_FLAT:
+               encp->enc_dma_mapping = EFX_NIC_DMA_MAPPING_FLAT;
+               break;
+       case MC_CMD_GET_DESC_ADDR_INFO_OUT_MAPPING_REGIONED:
+               encp->enc_dma_mapping = EFX_NIC_DMA_MAPPING_REGIONED;
+               rc = efx_mcdi_get_nic_addr_regions(enp,
+                   &enp->en_dma.end_u.endu_region_info);
+               if (rc != 0)
+                       goto fail2;
+               break;
+       default:
+               goto fail3;
+       }
+
+out:
+       return (0);
+
+fail3:
+       EFSYS_PROBE(fail3);
+fail2:
+       EFSYS_PROBE(fail2);
+fail1:
+       EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+       return (rc);
+}
+
        __checkReturn   efx_rc_t
 efx_mcdi_nic_board_cfg(
        __in            efx_nic_t *enp)
@@ -1985,8 +2039,14 @@ efx_mcdi_nic_board_cfg(
        encp->enc_intr_vec_base = base;
        encp->enc_intr_limit = nvec;
 
+       rc = efx_mcdi_get_nic_addr_caps(enp);
+       if (rc != 0)
+               goto fail12;
+
        return (0);
 
+fail12:
+       EFSYS_PROBE(fail12);
 fail11:
        EFSYS_PROBE(fail11);
 fail10: