Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bnxt_en: Use msix_vec_per_pf_max and msix_vec_per_pf_min devlink params.

This patch adds support for following generic permanent mode
devlink parameters. They can be modified using devlink param
commands.

msix_vec_per_pf_max - This param sets the number of MSIX vectors
that the device requests from the host on driver initialization.
This value is set in the device which limits MSIX vectors per PF.

msix_vec_per_pf_min - This param sets the number of minimal MSIX
vectors required for the device initialization. Value 0 indicates
a default value is selected. This value is set in the device which
limits MSIX vectors per PF.

Cc: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Vasundhara Volam and committed by
David S. Miller
f399e849 3a1d52a5

+53 -2
+48 -2
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
··· 26 26 BNXT_NVM_SHARED_CFG, 1}, 27 27 {DEVLINK_PARAM_GENERIC_ID_IGNORE_ARI, NVM_OFF_IGNORE_ARI, 28 28 BNXT_NVM_SHARED_CFG, 1}, 29 + {DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX, 30 + NVM_OFF_MSIX_VEC_PER_PF_MAX, BNXT_NVM_SHARED_CFG, 10}, 31 + {DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN, 32 + NVM_OFF_MSIX_VEC_PER_PF_MIN, BNXT_NVM_SHARED_CFG, 7}, 29 33 }; 30 34 31 35 static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg, ··· 61 57 idx = bp->pf.fw_fid - BNXT_FIRST_PF_FID; 62 58 63 59 bytesize = roundup(nvm_param.num_bits, BITS_PER_BYTE) / BITS_PER_BYTE; 64 - if (nvm_param.num_bits == 1) 65 - buf = &val->vbool; 60 + switch (bytesize) { 61 + case 1: 62 + if (nvm_param.num_bits == 1) 63 + buf = &val->vbool; 64 + else 65 + buf = &val->vu8; 66 + break; 67 + case 2: 68 + buf = &val->vu16; 69 + break; 70 + case 4: 71 + buf = &val->vu32; 72 + break; 73 + default: 74 + return -EFAULT; 75 + } 66 76 67 77 data_addr = dma_zalloc_coherent(&bp->pdev->dev, bytesize, 68 78 &data_dma_addr, GFP_KERNEL); ··· 127 109 return bnxt_hwrm_nvm_req(bp, id, &req, sizeof(req), &ctx->val); 128 110 } 129 111 112 + static int bnxt_dl_msix_validate(struct devlink *dl, u32 id, 113 + union devlink_param_value val, 114 + struct netlink_ext_ack *extack) 115 + { 116 + int max_val; 117 + 118 + if (id == DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX) 119 + max_val = BNXT_MSIX_VEC_MAX; 120 + 121 + if (id == DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN) 122 + max_val = BNXT_MSIX_VEC_MIN_MAX; 123 + 124 + if (val.vu32 < 0 || val.vu32 > max_val) { 125 + NL_SET_ERR_MSG_MOD(extack, "MSIX value is exceeding the range"); 126 + return -EINVAL; 127 + } 128 + 129 + return 0; 130 + } 131 + 130 132 static const struct devlink_param bnxt_dl_params[] = { 131 133 DEVLINK_PARAM_GENERIC(ENABLE_SRIOV, 132 134 BIT(DEVLINK_PARAM_CMODE_PERMANENT), ··· 156 118 BIT(DEVLINK_PARAM_CMODE_PERMANENT), 157 119 bnxt_dl_nvm_param_get, bnxt_dl_nvm_param_set, 158 120 NULL), 121 + DEVLINK_PARAM_GENERIC(MSIX_VEC_PER_PF_MAX, 122 + BIT(DEVLINK_PARAM_CMODE_PERMANENT), 123 + bnxt_dl_nvm_param_get, bnxt_dl_nvm_param_set, 124 + bnxt_dl_msix_validate), 125 + DEVLINK_PARAM_GENERIC(MSIX_VEC_PER_PF_MIN, 126 + BIT(DEVLINK_PARAM_CMODE_PERMANENT), 127 + bnxt_dl_nvm_param_get, bnxt_dl_nvm_param_set, 128 + bnxt_dl_msix_validate), 159 129 }; 160 130 161 131 int bnxt_dl_register(struct bnxt *bp)
+5
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h
··· 33 33 } 34 34 } 35 35 36 + #define NVM_OFF_MSIX_VEC_PER_PF_MAX 108 37 + #define NVM_OFF_MSIX_VEC_PER_PF_MIN 114 36 38 #define NVM_OFF_IGNORE_ARI 164 37 39 #define NVM_OFF_ENABLE_SRIOV 401 40 + 41 + #define BNXT_MSIX_VEC_MAX 1280 42 + #define BNXT_MSIX_VEC_MIN_MAX 128 38 43 39 44 enum bnxt_nvm_dir_type { 40 45 BNXT_NVM_SHARED_CFG = 40,