> -----Original Message-----
> From: Guo, Junfeng <junfeng....@intel.com>
> Sent: Thursday, October 28, 2021 5:14 PM
> To: Zhang, Qi Z <qi.z.zh...@intel.com>; Wu, Jingjing <jingjing...@intel.com>;
> Xing, Beilei <beilei.x...@intel.com>
> Cc: dev@dpdk.org; Yigit, Ferruh <ferruh.yi...@intel.com>; Xu, Ting
> <ting...@intel.com>; Guo, Junfeng <junfeng....@intel.com>
> Subject: [PATCH v7 2/4] net/ice/base: add function to set HW profile for raw
> flow
>
> Based on the parser library, we can directly set HW profile and associate the
> main/ctrl vsi.
>
> Signed-off-by: Junfeng Guo <junfeng....@intel.com>
Acked-by: Qi Zhang <qi.z.zh...@intel.com>
As this is the last base code patch for DPDK 21.11, update FreeBSD release
version in driver/net/ice/base/README during merge.
Applied to dpdk-next-net-intel.
Thanks
Qi
> ---
> drivers/net/ice/base/ice_flex_pipe.c | 49 ++++++++++++++++
> drivers/net/ice/base/ice_flex_pipe.h | 3 +
> drivers/net/ice/base/ice_flow.c | 84 ++++++++++++++++++++++++++++
> drivers/net/ice/base/ice_flow.h | 4 ++
> 4 files changed, 140 insertions(+)
>
> diff --git a/drivers/net/ice/base/ice_flex_pipe.c
> b/drivers/net/ice/base/ice_flex_pipe.c
> index 06a233990f..395787806b 100644
> --- a/drivers/net/ice/base/ice_flex_pipe.c
> +++ b/drivers/net/ice/base/ice_flex_pipe.c
> @@ -6365,3 +6365,52 @@ ice_rem_prof_id_flow(struct ice_hw *hw, enum
> ice_block blk, u16 vsi, u64 hdl)
>
> return status;
> }
> +
> +/**
> + * ice_flow_assoc_hw_prof - add profile id flow for main/ctrl VSI flow
> +entry
> + * @hw: pointer to the HW struct
> + * @blk: HW block
> + * @dest_vsi_handle: dest VSI handle
> + * @fdir_vsi_handle: fdir programming VSI handle
> + * @id: profile id (handle)
> + *
> + * Calling this function will update the hardware tables to enable the
> + * profile indicated by the ID parameter for the VSIs specified in the
> +VSI
> + * array. Once successfully called, the flow will be enabled.
> + */
> +enum ice_status
> +ice_flow_assoc_hw_prof(struct ice_hw *hw, enum ice_block blk,
> + u16 dest_vsi_handle, u16 fdir_vsi_handle, int id) {
> + enum ice_status status = ICE_SUCCESS;
> + u16 vsi_num;
> +
> + vsi_num = ice_get_hw_vsi_num(hw, dest_vsi_handle);
> + status = ice_add_prof_id_flow(hw, blk, vsi_num, id);
> + if (status) {
> + ice_debug(hw, ICE_DBG_FLOW, "HW profile add failed for main VSI
> flow entry, %d\n",
> + status);
> + goto err_add_prof;
> + }
> +
> + if (blk != ICE_BLK_FD)
> + return status;
> +
> + vsi_num = ice_get_hw_vsi_num(hw, fdir_vsi_handle);
> + status = ice_add_prof_id_flow(hw, blk, vsi_num, id);
> + if (status) {
> + ice_debug(hw, ICE_DBG_FLOW, "HW profile add failed for ctrl VSI
> flow entry, %d\n",
> + status);
> + goto err_add_entry;
> + }
> +
> + return status;
> +
> +err_add_entry:
> + vsi_num = ice_get_hw_vsi_num(hw, dest_vsi_handle);
> + ice_rem_prof_id_flow(hw, blk, vsi_num, id);
> +err_add_prof:
> + ice_flow_rem_prof(hw, blk, id);
> +
> + return status;
> +}
> diff --git a/drivers/net/ice/base/ice_flex_pipe.h
> b/drivers/net/ice/base/ice_flex_pipe.h
> index dd332312dd..23ba45564a 100644
> --- a/drivers/net/ice/base/ice_flex_pipe.h
> +++ b/drivers/net/ice/base/ice_flex_pipe.h
> @@ -76,6 +76,9 @@ enum ice_status
> ice_add_prof_id_flow(struct ice_hw *hw, enum ice_block blk, u16 vsi, u64
> hdl); enum ice_status ice_rem_prof_id_flow(struct ice_hw *hw, enum
> ice_block blk, u16 vsi, u64 hdl);
> +enum ice_status
> +ice_flow_assoc_hw_prof(struct ice_hw *hw, enum ice_block blk,
> + u16 dest_vsi_handle, u16 fdir_vsi_handle, int id);
> enum ice_status ice_init_pkg(struct ice_hw *hw, u8 *buff, u32 len); enum
> ice_status ice_copy_and_init_pkg(struct ice_hw *hw, const u8 *buf, u32 len);
> diff --git a/drivers/net/ice/base/ice_flow.c b/drivers/net/ice/base/ice_flow.c
> index 77b6b130c1..f699dbbc74 100644
> --- a/drivers/net/ice/base/ice_flow.c
> +++ b/drivers/net/ice/base/ice_flow.c
> @@ -2524,6 +2524,90 @@ ice_flow_disassoc_prof(struct ice_hw *hw, enum
> ice_block blk,
> return status;
> }
>
> +#define FLAG_GTP_EH_PDU_LINK BIT_ULL(13)
> +#define FLAG_GTP_EH_PDU BIT_ULL(14)
> +
> +#define FLAG_GTPU_MSK \
> + (FLAG_GTP_EH_PDU | FLAG_GTP_EH_PDU_LINK)
> +#define FLAG_GTPU_DW \
> + (FLAG_GTP_EH_PDU | FLAG_GTP_EH_PDU_LINK)
> +#define FLAG_GTPU_UP \
> + (FLAG_GTP_EH_PDU)
> +/**
> + * ice_flow_set_hw_prof - Set HW flow profile based on the parsed
> +profile info
> + * @hw: pointer to the HW struct
> + * @dest_vsi_handle: dest VSI handle
> + * @fdir_vsi_handle: fdir programming VSI handle
> + * @prof: stores parsed profile info from raw flow
> + * @blk: classification stage
> + */
> +enum ice_status
> +ice_flow_set_hw_prof(struct ice_hw *hw, u16 dest_vsi_handle,
> + u16 fdir_vsi_handle, struct ice_parser_profile *prof,
> + enum ice_block blk)
> +{
> + int id = ice_find_first_bit(prof->ptypes, UINT16_MAX);
> + struct ice_flow_prof_params *params;
> + u8 fv_words = hw->blk[blk].es.fvw;
> + enum ice_status status;
> + u16 vsi_num;
> + int i, idx;
> +
> + params = (struct ice_flow_prof_params *)ice_malloc(hw, sizeof(*params));
> + if (!params)
> + return ICE_ERR_NO_MEMORY;
> +
> + for (i = 0; i < ICE_MAX_FV_WORDS; i++) {
> + params->es[i].prot_id = ICE_PROT_INVALID;
> + params->es[i].off = ICE_FV_OFFSET_INVAL;
> + }
> +
> + for (i = 0; i < prof->fv_num; i++) {
> + if (hw->blk[blk].es.reverse)
> + idx = fv_words - i - 1;
> + else
> + idx = i;
> + params->es[idx].prot_id = prof->fv[i].proto_id;
> + params->es[idx].off = prof->fv[i].offset;
> + params->mask[idx] = CPU_TO_BE16(prof->fv[i].msk);
> + }
> +
> + switch (prof->flags) {
> + case FLAG_GTPU_DW:
> + params->attr = ice_attr_gtpu_down;
> + params->attr_cnt = ARRAY_SIZE(ice_attr_gtpu_down);
> + break;
> + case FLAG_GTPU_UP:
> + params->attr = ice_attr_gtpu_up;
> + params->attr_cnt = ARRAY_SIZE(ice_attr_gtpu_up);
> + break;
> + default:
> + if (prof->flags_msk & FLAG_GTPU_MSK) {
> + params->attr = ice_attr_gtpu_session;
> + params->attr_cnt = ARRAY_SIZE(ice_attr_gtpu_session);
> + }
> + break;
> + }
> +
> + status = ice_add_prof(hw, blk, id, (u8 *)prof->ptypes,
> + params->attr, params->attr_cnt,
> + params->es, params->mask, false);
> + if (status)
> + goto free_params;
> +
> + status = ice_flow_assoc_hw_prof(hw, blk, dest_vsi_handle,
> + fdir_vsi_handle, id);
> + if (status)
> + goto free_params;
> +
> + return ICE_SUCCESS;
> +
> +free_params:
> + ice_free(hw, params);
> +
> + return status;
> +}
> +
> /**
> * ice_flow_add_prof - Add a flow profile for packet segments and matched
> fields
> * @hw: pointer to the HW struct
> diff --git a/drivers/net/ice/base/ice_flow.h b/drivers/net/ice/base/ice_flow.h
> index 371d960066..dea7b3c0e8 100644
> --- a/drivers/net/ice/base/ice_flow.h
> +++ b/drivers/net/ice/base/ice_flow.h
> @@ -548,6 +548,10 @@ enum ice_status
> ice_flow_assoc_vsig_vsi(struct ice_hw *hw, enum ice_block blk, u16
> vsi_handle,
> u16 vsig);
> enum ice_status
> +ice_flow_set_hw_prof(struct ice_hw *hw, u16 dest_vsi_handle,
> + u16 fdir_vsi_handle, struct ice_parser_profile *prof,
> + enum ice_block blk);
> +enum ice_status
> ice_flow_get_hw_prof(struct ice_hw *hw, enum ice_block blk, u64 prof_id,
> u8 *hw_prof);
>
> --
> 2.25.1