From: Paul Greenwalt <paul.greenw...@intel.com> Date: Wed, 31 Jul 2024 21:58:29 -0400
> E830 adds hardware support to prevent the VF from overflowing the PF > mailbox with VIRTCHNL messages. E830 will use the hardware feature > (ICE_F_MBX_LIMIT) instead of the software solution ice_is_malicious_vf(). > > To prevent a VF from overflowing the PF, the PF sets the number of > messages per VF that can be in the PF's mailbox queue > (ICE_MBX_OVERFLOW_WATERMARK). When the PF process a message from a VF, > the PF decrements the per VF message count using the E830_MBX_VF_DEC_TRIG > register. > > Signed-off-by: Paul Greenwalt <paul.greenw...@intel.com> > --- > v1 -> v2: > - Update ice_mbx_vf_dec_trig_e830 and ice_mbx_vf_clear_cnt_e830 onstack > variables to const > --- > drivers/net/ethernet/intel/ice/ice.h | 1 + > .../net/ethernet/intel/ice/ice_hw_autogen.h | 3 ++ > drivers/net/ethernet/intel/ice/ice_lib.c | 12 +++++++ > drivers/net/ethernet/intel/ice/ice_main.c | 24 ++++++++++---- > drivers/net/ethernet/intel/ice/ice_sriov.c | 3 +- > drivers/net/ethernet/intel/ice/ice_vf_lib.c | 26 +++++++++++++-- > drivers/net/ethernet/intel/ice/ice_vf_mbx.c | 32 +++++++++++++++++++ > drivers/net/ethernet/intel/ice/ice_vf_mbx.h | 3 ++ > drivers/net/ethernet/intel/ice/ice_virtchnl.c | 8 +++-- > 9 files changed, 99 insertions(+), 13 deletions(-) > > diff --git a/drivers/net/ethernet/intel/ice/ice.h > b/drivers/net/ethernet/intel/ice/ice.h > index 4c563b0d57ac..53c8edbfaede 100644 > --- a/drivers/net/ethernet/intel/ice/ice.h > +++ b/drivers/net/ethernet/intel/ice/ice.h > @@ -207,6 +207,7 @@ enum ice_feature { > ICE_F_GNSS, > ICE_F_ROCE_LAG, > ICE_F_SRIOV_LAG, > + ICE_F_MBX_LIMIT, > ICE_F_MAX > }; > > diff --git a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h > b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h > index 91cbae1eec89..a306ea9b207c 100644 > --- a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h > +++ b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h > @@ -539,5 +539,8 @@ > #define E830_PRTMAC_CL01_QNT_THR_CL0_M GENMASK(15, 0) > #define VFINT_DYN_CTLN(_i) (0x00003800 + ((_i) * 4)) > #define VFINT_DYN_CTLN_CLEARPBA_M BIT(1) > +#define E830_MBX_PF_IN_FLIGHT_VF_MSGS_THRESH 0x00234000 > +#define E830_MBX_VF_DEC_TRIG(_VF) (0x00233800 + ((_VF) * 4)) > +#define E830_MBX_VF_IN_FLIGHT_MSGS_AT_PF_CNT(_VF) (0x00233000 + ((_VF) * 4)) Still poor indentation, there must be tabs, no spaces. Also, parenthesis around `(_VF) * 4` are redundant. > > #endif /* _ICE_HW_AUTOGEN_H_ */ > diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c > b/drivers/net/ethernet/intel/ice/ice_lib.c > index fc5b87f51702..a6fa2ed6c4ab 100644 > --- a/drivers/net/ethernet/intel/ice/ice_lib.c > +++ b/drivers/net/ethernet/intel/ice/ice_lib.c > @@ -3938,6 +3938,18 @@ void ice_init_feature_support(struct ice_pf *pf) > if (ice_gnss_is_gps_present(&pf->hw)) > ice_set_feature_support(pf, ICE_F_GNSS); > break; > + case ICE_DEV_ID_E830CC_BACKPLANE: > + case ICE_DEV_ID_E830CC_QSFP56: > + case ICE_DEV_ID_E830CC_SFP: > + case ICE_DEV_ID_E830CC_SFP_DD: > + case ICE_DEV_ID_E830C_BACKPLANE: > + case ICE_DEV_ID_E830C_QSFP: > + case ICE_DEV_ID_E830C_SFP: > + case ICE_DEV_ID_E830_XXV_BACKPLANE: > + case ICE_DEV_ID_E830_XXV_QSFP: > + case ICE_DEV_ID_E830_XXV_SFP: Can't this be somehow compressed via case A .. B There are no holes between at least some of these. > + ice_set_feature_support(pf, ICE_F_MBX_LIMIT); > + break; > default: > break; > } [...] > diff --git a/drivers/net/ethernet/intel/ice/ice_vf_mbx.c > b/drivers/net/ethernet/intel/ice/ice_vf_mbx.c > index 40cb4ba0789c..65d9c41bed21 100644 > --- a/drivers/net/ethernet/intel/ice/ice_vf_mbx.c > +++ b/drivers/net/ethernet/intel/ice/ice_vf_mbx.c > @@ -210,6 +210,38 @@ ice_mbx_detect_malvf(struct ice_hw *hw, struct > ice_mbx_vf_info *vf_info, > return 0; > } > > +/** > + * ice_mbx_vf_dec_trig_e830 - Decrements the VF mailbox queue counter > + * @hw: pointer to the HW struct > + * @event: pointer to the control queue receive event > + * > + * This function triggers to decrement the counter > + * MBX_VF_IN_FLIGHT_MSGS_AT_PF_CNT when the driver replenishes > + * the buffers at the PF mailbox queue. > + */ > +void ice_mbx_vf_dec_trig_e830(const struct ice_hw *hw, > + const struct ice_rq_event_info *event) > +{ > + const u16 vfid = le16_to_cpu(event->desc.retval); Oops, I may've confused you. You don't need to constify scalars. Mainly pointers and structures when possible. > + > + wr32(hw, E830_MBX_VF_DEC_TRIG(vfid), 1); > +} > + > +/** > + * ice_mbx_vf_clear_cnt_e830 - Clear the VF mailbox queue count > + * @hw: pointer to the HW struct > + * @vf_id: VF ID in the PF space > + * > + * This function clears the counter MBX_VF_IN_FLIGHT_MSGS_AT_PF_CNT, and > should > + * be called when a VF is created and on VF reset. > + */ > +void ice_mbx_vf_clear_cnt_e830(const struct ice_hw *hw, const u16 vf_id) > +{ > + const u32 reg = rd32(hw, E830_MBX_VF_IN_FLIGHT_MSGS_AT_PF_CNT(vf_id)); Same here for @vf_id and @reg. > + > + wr32(hw, E830_MBX_VF_DEC_TRIG(vf_id), reg); > +} Thanks, Olek