Message ID | 20181018153709.32664-6-anirudh.venkataramanan@intel.com |
---|---|
State | Accepted |
Delegated to: | Jeff Kirsher |
Headers | show |
Series | [1/7] ice: Make ice_msix_clean_rings static | expand |
On 10/18/2018 8:37 AM, Anirudh Venkataramanan wrote: > ice_dev_onetime_setup contains a couple of driver workarounds for current > firmware limitations. These workarounds are expected to go away once > these limitations are fixed in the firmware. Can you add a check for firmware version or feature to see if this is needed before using it? sln > > Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com> > --- > drivers/net/ethernet/intel/ice/ice_common.c | 19 +++++++++++++++++++ > drivers/net/ethernet/intel/ice/ice_common.h | 3 +++ > drivers/net/ethernet/intel/ice/ice_hw_autogen.h | 2 ++ > drivers/net/ethernet/intel/ice/ice_lib.c | 1 + > 4 files changed, 25 insertions(+) > > diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c > index 78df54b25bf1..5a91a9087d1e 100644 > --- a/drivers/net/ethernet/intel/ice/ice_common.c > +++ b/drivers/net/ethernet/intel/ice/ice_common.c > @@ -42,6 +42,23 @@ static enum ice_status ice_set_mac_type(struct ice_hw *hw) > return 0; > } > > +/** > + * ice_dev_onetime_setup - Temporary HW/FW workarounds > + * @hw: pointer to the HW structure > + * > + * This function provides temporary workarounds for certain issues > + * that are expected to be fixed in the HW/FW. > + */ > +void ice_dev_onetime_setup(struct ice_hw *hw) > +{ > + /* configure Rx - set non pxe mode */ > + wr32(hw, GLLAN_RCTL_0, 0x1); > + > +#define MBX_PF_VT_PFALLOC 0x00231E80 > + /* set VFs per PF */ > + wr32(hw, MBX_PF_VT_PFALLOC, rd32(hw, PF_VT_PFALLOC_HIF)); > +} > + > /** > * ice_clear_pf_cfg - Clear PF configuration > * @hw: pointer to the hardware structure > @@ -740,6 +757,8 @@ enum ice_status ice_init_hw(struct ice_hw *hw) > if (status) > goto err_unroll_sched; > > + ice_dev_onetime_setup(hw); > + > /* Get MAC information */ > /* A single port can report up to two (LAN and WoL) addresses */ > mac_buf = devm_kcalloc(ice_hw_to_dev(hw), 2, > diff --git a/drivers/net/ethernet/intel/ice/ice_common.h b/drivers/net/ethernet/intel/ice/ice_common.h > index 1900681289a4..876347e32b6f 100644 > --- a/drivers/net/ethernet/intel/ice/ice_common.h > +++ b/drivers/net/ethernet/intel/ice/ice_common.h > @@ -34,6 +34,9 @@ ice_sq_send_cmd(struct ice_hw *hw, struct ice_ctl_q_info *cq, > struct ice_sq_cd *cd); > void ice_clear_pxe_mode(struct ice_hw *hw); > enum ice_status ice_get_caps(struct ice_hw *hw); > + > +void ice_dev_onetime_setup(struct ice_hw *hw); > + > enum ice_status > ice_write_rxq_ctx(struct ice_hw *hw, struct ice_rlan_ctx *rlan_ctx, > u32 rxq_index); > diff --git a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h > index a6679a9bfd3a..228afcad6fc3 100644 > --- a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h > +++ b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h > @@ -157,6 +157,7 @@ > #define VPINT_ALLOC_LAST_S 12 > #define VPINT_ALLOC_LAST_M ICE_M(0x7FF, 12) > #define VPINT_ALLOC_VALID_M BIT(31) > +#define GLLAN_RCTL_0 0x002941F8 > #define QRX_CONTEXT(_i, _QRX) (0x00280000 + ((_i) * 8192 + (_QRX) * 4)) > #define QRX_CTRL(_QRX) (0x00120000 + ((_QRX) * 4)) > #define QRX_CTRL_MAX_INDEX 2047 > @@ -320,6 +321,7 @@ > #define GLV_UPRCL(_i) (0x003B2000 + ((_i) * 8)) > #define GLV_UPTCH(_i) (0x0030A004 + ((_i) * 8)) > #define GLV_UPTCL(_i) (0x0030A000 + ((_i) * 8)) > +#define PF_VT_PFALLOC_HIF 0x0009DD80 > #define VSIQF_HKEY_MAX_INDEX 12 > #define VSIQF_HLUT_MAX_INDEX 15 > #define VFINT_DYN_CTLN(_i) (0x00003800 + ((_i) * 4)) > diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c > index e750702bcdce..5bacad01f0c9 100644 > --- a/drivers/net/ethernet/intel/ice/ice_lib.c > +++ b/drivers/net/ethernet/intel/ice/ice_lib.c > @@ -2529,6 +2529,7 @@ int ice_vsi_rebuild(struct ice_vsi *vsi) > vsi->hw_base_vector = 0; > ice_vsi_clear_rings(vsi); > ice_vsi_free_arrays(vsi, false); > + ice_dev_onetime_setup(&vsi->back->hw); > ice_vsi_set_num_qs(vsi); > > /* Initialize VSI struct elements and create VSI in FW */ >
On Thu, 2018-10-18 at 09:06 -0700, Shannon Nelson wrote: > On 10/18/2018 8:37 AM, Anirudh Venkataramanan wrote: > > ice_dev_onetime_setup contains a couple of driver workarounds for > > current > > firmware limitations. These workarounds are expected to go away > > once > > these limitations are fixed in the firmware. > > Can you add a check for firmware version or feature to see if this > is > needed before using it? > > sln Hi Shannon, We discussed this internally a few weeks back and the conclusion was that right now there's no reliable way to apply these workarounds conditionally. On a FW release that has these issues addressed, these workarounds while unncessary, won't break anything. So for now, IMHO, it's fine the way it is. Thanks, Ani > > > > > > Signed-off-by: Anirudh Venkataramanan < > > anirudh.venkataramanan@intel.com> > > --- > > drivers/net/ethernet/intel/ice/ice_common.c | 19 > > +++++++++++++++++++ > > drivers/net/ethernet/intel/ice/ice_common.h | 3 +++ > > drivers/net/ethernet/intel/ice/ice_hw_autogen.h | 2 ++ > > drivers/net/ethernet/intel/ice/ice_lib.c | 1 + > > 4 files changed, 25 insertions(+) > > > > diff --git a/drivers/net/ethernet/intel/ice/ice_common.c > > b/drivers/net/ethernet/intel/ice/ice_common.c > > index 78df54b25bf1..5a91a9087d1e 100644 > > --- a/drivers/net/ethernet/intel/ice/ice_common.c > > +++ b/drivers/net/ethernet/intel/ice/ice_common.c > > @@ -42,6 +42,23 @@ static enum ice_status ice_set_mac_type(struct > > ice_hw *hw) > > return 0; > > } > > > > +/** > > + * ice_dev_onetime_setup - Temporary HW/FW workarounds > > + * @hw: pointer to the HW structure > > + * > > + * This function provides temporary workarounds for certain issues > > + * that are expected to be fixed in the HW/FW. > > + */ > > +void ice_dev_onetime_setup(struct ice_hw *hw) > > +{ > > + /* configure Rx - set non pxe mode */ > > + wr32(hw, GLLAN_RCTL_0, 0x1); > > + > > +#define MBX_PF_VT_PFALLOC 0x00231E80 > > + /* set VFs per PF */ > > + wr32(hw, MBX_PF_VT_PFALLOC, rd32(hw, PF_VT_PFALLOC_HIF)); > > +} > > + > > /** > > * ice_clear_pf_cfg - Clear PF configuration > > * @hw: pointer to the hardware structure > > @@ -740,6 +757,8 @@ enum ice_status ice_init_hw(struct ice_hw *hw) > > if (status) > > goto err_unroll_sched; > > > > + ice_dev_onetime_setup(hw); > > + > > /* Get MAC information */ > > /* A single port can report up to two (LAN and WoL) addresses > > */ > > mac_buf = devm_kcalloc(ice_hw_to_dev(hw), 2, > > diff --git a/drivers/net/ethernet/intel/ice/ice_common.h > > b/drivers/net/ethernet/intel/ice/ice_common.h > > index 1900681289a4..876347e32b6f 100644 > > --- a/drivers/net/ethernet/intel/ice/ice_common.h > > +++ b/drivers/net/ethernet/intel/ice/ice_common.h > > @@ -34,6 +34,9 @@ ice_sq_send_cmd(struct ice_hw *hw, struct > > ice_ctl_q_info *cq, > > struct ice_sq_cd *cd); > > void ice_clear_pxe_mode(struct ice_hw *hw); > > enum ice_status ice_get_caps(struct ice_hw *hw); > > + > > +void ice_dev_onetime_setup(struct ice_hw *hw); > > + > > enum ice_status > > ice_write_rxq_ctx(struct ice_hw *hw, struct ice_rlan_ctx > > *rlan_ctx, > > u32 rxq_index); > > diff --git a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h > > b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h > > index a6679a9bfd3a..228afcad6fc3 100644 > > --- a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h > > +++ b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h > > @@ -157,6 +157,7 @@ > > #define VPINT_ALLOC_LAST_S 12 > > #define VPINT_ALLOC_LAST_M ICE_M(0x7FF, > > 12) > > #define VPINT_ALLOC_VALID_M BIT(31) > > +#define GLLAN_RCTL_0 0x002941F8 > > #define QRX_CONTEXT(_i, _QRX) (0x00280000 + > > ((_i) * 8192 + (_QRX) * 4)) > > #define QRX_CTRL(_QRX) (0x00120000 + > > ((_QRX) * 4)) > > #define QRX_CTRL_MAX_INDEX 2047 > > @@ -320,6 +321,7 @@ > > #define GLV_UPRCL(_i) (0x003B2000 + > > ((_i) * 8)) > > #define GLV_UPTCH(_i) (0x0030A004 + > > ((_i) * 8)) > > #define GLV_UPTCL(_i) (0x0030A000 + > > ((_i) * 8)) > > +#define PF_VT_PFALLOC_HIF 0x0009DD80 > > #define VSIQF_HKEY_MAX_INDEX 12 > > #define VSIQF_HLUT_MAX_INDEX 15 > > #define VFINT_DYN_CTLN(_i) (0x00003800 + > > ((_i) * 4)) > > diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c > > b/drivers/net/ethernet/intel/ice/ice_lib.c > > index e750702bcdce..5bacad01f0c9 100644 > > --- a/drivers/net/ethernet/intel/ice/ice_lib.c > > +++ b/drivers/net/ethernet/intel/ice/ice_lib.c > > @@ -2529,6 +2529,7 @@ int ice_vsi_rebuild(struct ice_vsi *vsi) > > vsi->hw_base_vector = 0; > > ice_vsi_clear_rings(vsi); > > ice_vsi_free_arrays(vsi, false); > > + ice_dev_onetime_setup(&vsi->back->hw); > > ice_vsi_set_num_qs(vsi); > > > > /* Initialize VSI struct elements and create VSI in FW */ > >
> -----Original Message----- > From: Intel-wired-lan [mailto:intel-wired-lan-bounces@osuosl.org] On > Behalf Of Anirudh Venkataramanan > Sent: Thursday, October 18, 2018 8:37 AM > To: intel-wired-lan@lists.osuosl.org > Subject: [Intel-wired-lan] [PATCH 5/7] ice: Introduce > ice_dev_onetime_setup > > ice_dev_onetime_setup contains a couple of driver workarounds for current > firmware limitations. These workarounds are expected to go away once > these limitations are fixed in the firmware. > > Signed-off-by: Anirudh Venkataramanan > <anirudh.venkataramanan@intel.com> > --- > drivers/net/ethernet/intel/ice/ice_common.c | 19 > +++++++++++++++++++ > drivers/net/ethernet/intel/ice/ice_common.h | 3 +++ > drivers/net/ethernet/intel/ice/ice_hw_autogen.h | 2 ++ > drivers/net/ethernet/intel/ice/ice_lib.c | 1 + > 4 files changed, 25 insertions(+) Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
On 10/18/2018 2:05 PM, Venkataramanan, Anirudh wrote: > On Thu, 2018-10-18 at 09:06 -0700, Shannon Nelson wrote: >> On 10/18/2018 8:37 AM, Anirudh Venkataramanan wrote: >>> ice_dev_onetime_setup contains a couple of driver workarounds for >>> current >>> firmware limitations. These workarounds are expected to go away >>> once >>> these limitations are fixed in the firmware. >> >> Can you add a check for firmware version or feature to see if this >> is >> needed before using it? >> >> sln > > Hi Shannon, > > We discussed this internally a few weeks back and the conclusion was > that right now there's no reliable way to apply these workarounds > conditionally. > > On a FW release that has these issues addressed, these workarounds > while unncessary, won't break anything. So for now, IMHO, it's fine the > way it is. You should add this statement into the commit message. The "won't break anything" is something that has bitten things in the past, so you'll want to keep an eye on that. sln > > Thanks, > Ani > >> >> >>> >>> Signed-off-by: Anirudh Venkataramanan < >>> anirudh.venkataramanan@intel.com> >>> --- >>> drivers/net/ethernet/intel/ice/ice_common.c | 19 >>> +++++++++++++++++++ >>> drivers/net/ethernet/intel/ice/ice_common.h | 3 +++ >>> drivers/net/ethernet/intel/ice/ice_hw_autogen.h | 2 ++ >>> drivers/net/ethernet/intel/ice/ice_lib.c | 1 + >>> 4 files changed, 25 insertions(+) >>> >>> diff --git a/drivers/net/ethernet/intel/ice/ice_common.c >>> b/drivers/net/ethernet/intel/ice/ice_common.c >>> index 78df54b25bf1..5a91a9087d1e 100644 >>> --- a/drivers/net/ethernet/intel/ice/ice_common.c >>> +++ b/drivers/net/ethernet/intel/ice/ice_common.c >>> @@ -42,6 +42,23 @@ static enum ice_status ice_set_mac_type(struct >>> ice_hw *hw) >>> return 0; >>> } >>> >>> +/** >>> + * ice_dev_onetime_setup - Temporary HW/FW workarounds >>> + * @hw: pointer to the HW structure >>> + * >>> + * This function provides temporary workarounds for certain issues >>> + * that are expected to be fixed in the HW/FW. >>> + */ >>> +void ice_dev_onetime_setup(struct ice_hw *hw) >>> +{ >>> + /* configure Rx - set non pxe mode */ >>> + wr32(hw, GLLAN_RCTL_0, 0x1); >>> + >>> +#define MBX_PF_VT_PFALLOC 0x00231E80 >>> + /* set VFs per PF */ >>> + wr32(hw, MBX_PF_VT_PFALLOC, rd32(hw, PF_VT_PFALLOC_HIF)); >>> +} >>> + >>> /** >>> * ice_clear_pf_cfg - Clear PF configuration >>> * @hw: pointer to the hardware structure >>> @@ -740,6 +757,8 @@ enum ice_status ice_init_hw(struct ice_hw *hw) >>> if (status) >>> goto err_unroll_sched; >>> >>> + ice_dev_onetime_setup(hw); >>> + >>> /* Get MAC information */ >>> /* A single port can report up to two (LAN and WoL) addresses >>> */ >>> mac_buf = devm_kcalloc(ice_hw_to_dev(hw), 2, >>> diff --git a/drivers/net/ethernet/intel/ice/ice_common.h >>> b/drivers/net/ethernet/intel/ice/ice_common.h >>> index 1900681289a4..876347e32b6f 100644 >>> --- a/drivers/net/ethernet/intel/ice/ice_common.h >>> +++ b/drivers/net/ethernet/intel/ice/ice_common.h >>> @@ -34,6 +34,9 @@ ice_sq_send_cmd(struct ice_hw *hw, struct >>> ice_ctl_q_info *cq, >>> struct ice_sq_cd *cd); >>> void ice_clear_pxe_mode(struct ice_hw *hw); >>> enum ice_status ice_get_caps(struct ice_hw *hw); >>> + >>> +void ice_dev_onetime_setup(struct ice_hw *hw); >>> + >>> enum ice_status >>> ice_write_rxq_ctx(struct ice_hw *hw, struct ice_rlan_ctx >>> *rlan_ctx, >>> u32 rxq_index); >>> diff --git a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h >>> b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h >>> index a6679a9bfd3a..228afcad6fc3 100644 >>> --- a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h >>> +++ b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h >>> @@ -157,6 +157,7 @@ >>> #define VPINT_ALLOC_LAST_S 12 >>> #define VPINT_ALLOC_LAST_M ICE_M(0x7FF, >>> 12) >>> #define VPINT_ALLOC_VALID_M BIT(31) >>> +#define GLLAN_RCTL_0 0x002941F8 >>> #define QRX_CONTEXT(_i, _QRX) (0x00280000 + >>> ((_i) * 8192 + (_QRX) * 4)) >>> #define QRX_CTRL(_QRX) (0x00120000 + >>> ((_QRX) * 4)) >>> #define QRX_CTRL_MAX_INDEX 2047 >>> @@ -320,6 +321,7 @@ >>> #define GLV_UPRCL(_i) (0x003B2000 + >>> ((_i) * 8)) >>> #define GLV_UPTCH(_i) (0x0030A004 + >>> ((_i) * 8)) >>> #define GLV_UPTCL(_i) (0x0030A000 + >>> ((_i) * 8)) >>> +#define PF_VT_PFALLOC_HIF 0x0009DD80 >>> #define VSIQF_HKEY_MAX_INDEX 12 >>> #define VSIQF_HLUT_MAX_INDEX 15 >>> #define VFINT_DYN_CTLN(_i) (0x00003800 + >>> ((_i) * 4)) >>> diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c >>> b/drivers/net/ethernet/intel/ice/ice_lib.c >>> index e750702bcdce..5bacad01f0c9 100644 >>> --- a/drivers/net/ethernet/intel/ice/ice_lib.c >>> +++ b/drivers/net/ethernet/intel/ice/ice_lib.c >>> @@ -2529,6 +2529,7 @@ int ice_vsi_rebuild(struct ice_vsi *vsi) >>> vsi->hw_base_vector = 0; >>> ice_vsi_clear_rings(vsi); >>> ice_vsi_free_arrays(vsi, false); >>> + ice_dev_onetime_setup(&vsi->back->hw); >>> ice_vsi_set_num_qs(vsi); >>> >>> /* Initialize VSI struct elements and create VSI in FW */ >>>
diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c index 78df54b25bf1..5a91a9087d1e 100644 --- a/drivers/net/ethernet/intel/ice/ice_common.c +++ b/drivers/net/ethernet/intel/ice/ice_common.c @@ -42,6 +42,23 @@ static enum ice_status ice_set_mac_type(struct ice_hw *hw) return 0; } +/** + * ice_dev_onetime_setup - Temporary HW/FW workarounds + * @hw: pointer to the HW structure + * + * This function provides temporary workarounds for certain issues + * that are expected to be fixed in the HW/FW. + */ +void ice_dev_onetime_setup(struct ice_hw *hw) +{ + /* configure Rx - set non pxe mode */ + wr32(hw, GLLAN_RCTL_0, 0x1); + +#define MBX_PF_VT_PFALLOC 0x00231E80 + /* set VFs per PF */ + wr32(hw, MBX_PF_VT_PFALLOC, rd32(hw, PF_VT_PFALLOC_HIF)); +} + /** * ice_clear_pf_cfg - Clear PF configuration * @hw: pointer to the hardware structure @@ -740,6 +757,8 @@ enum ice_status ice_init_hw(struct ice_hw *hw) if (status) goto err_unroll_sched; + ice_dev_onetime_setup(hw); + /* Get MAC information */ /* A single port can report up to two (LAN and WoL) addresses */ mac_buf = devm_kcalloc(ice_hw_to_dev(hw), 2, diff --git a/drivers/net/ethernet/intel/ice/ice_common.h b/drivers/net/ethernet/intel/ice/ice_common.h index 1900681289a4..876347e32b6f 100644 --- a/drivers/net/ethernet/intel/ice/ice_common.h +++ b/drivers/net/ethernet/intel/ice/ice_common.h @@ -34,6 +34,9 @@ ice_sq_send_cmd(struct ice_hw *hw, struct ice_ctl_q_info *cq, struct ice_sq_cd *cd); void ice_clear_pxe_mode(struct ice_hw *hw); enum ice_status ice_get_caps(struct ice_hw *hw); + +void ice_dev_onetime_setup(struct ice_hw *hw); + enum ice_status ice_write_rxq_ctx(struct ice_hw *hw, struct ice_rlan_ctx *rlan_ctx, u32 rxq_index); diff --git a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h index a6679a9bfd3a..228afcad6fc3 100644 --- a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h +++ b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h @@ -157,6 +157,7 @@ #define VPINT_ALLOC_LAST_S 12 #define VPINT_ALLOC_LAST_M ICE_M(0x7FF, 12) #define VPINT_ALLOC_VALID_M BIT(31) +#define GLLAN_RCTL_0 0x002941F8 #define QRX_CONTEXT(_i, _QRX) (0x00280000 + ((_i) * 8192 + (_QRX) * 4)) #define QRX_CTRL(_QRX) (0x00120000 + ((_QRX) * 4)) #define QRX_CTRL_MAX_INDEX 2047 @@ -320,6 +321,7 @@ #define GLV_UPRCL(_i) (0x003B2000 + ((_i) * 8)) #define GLV_UPTCH(_i) (0x0030A004 + ((_i) * 8)) #define GLV_UPTCL(_i) (0x0030A000 + ((_i) * 8)) +#define PF_VT_PFALLOC_HIF 0x0009DD80 #define VSIQF_HKEY_MAX_INDEX 12 #define VSIQF_HLUT_MAX_INDEX 15 #define VFINT_DYN_CTLN(_i) (0x00003800 + ((_i) * 4)) diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c index e750702bcdce..5bacad01f0c9 100644 --- a/drivers/net/ethernet/intel/ice/ice_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_lib.c @@ -2529,6 +2529,7 @@ int ice_vsi_rebuild(struct ice_vsi *vsi) vsi->hw_base_vector = 0; ice_vsi_clear_rings(vsi); ice_vsi_free_arrays(vsi, false); + ice_dev_onetime_setup(&vsi->back->hw); ice_vsi_set_num_qs(vsi); /* Initialize VSI struct elements and create VSI in FW */
ice_dev_onetime_setup contains a couple of driver workarounds for current firmware limitations. These workarounds are expected to go away once these limitations are fixed in the firmware. Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com> --- drivers/net/ethernet/intel/ice/ice_common.c | 19 +++++++++++++++++++ drivers/net/ethernet/intel/ice/ice_common.h | 3 +++ drivers/net/ethernet/intel/ice/ice_hw_autogen.h | 2 ++ drivers/net/ethernet/intel/ice/ice_lib.c | 1 + 4 files changed, 25 insertions(+)