Message ID | 1574497570-22102-16-git-send-email-michael.chan@broadcom.com |
---|---|
State | Changes Requested |
Delegated to: | David Miller |
Headers | show |
Series | bnxt_en: Updates. | expand |
On Sat, 23 Nov 2019 03:26:10 -0500, Michael Chan wrote: > From: Vasundhara Volam <vasundhara-v.volam@broadcom.com> > > Display the following information via devlink info command: > - Driver name > - Board id > - Broad revision > - Board Serial number > - Board Package version > - FW version > - FW management version > - FW RoCE version > > Standard output example: > $ devlink dev info pci/0000:3b:00.0 > pci/0000:3b:00.0: > driver bnxt_en > serial_number B0-26-28-FF-FE-25-84-20 > versions: > fixed: > board.id C454 > board.rev 1 > running: > board.package N/A Just don't report it if you don't have it? > fw.version 216.0.154.32004 > fw.mgmt 864.0.0.0 > fw.app 216.0.51.0 > > Cc: Jiri Pirko <jiri@mellanox.com> > Signed-off-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com> > Signed-off-by: Michael Chan <michael.chan@broadcom.com> > +static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req, > + struct netlink_ext_ack *extack) > +{ > + struct bnxt *bp = bnxt_get_bp_from_dl(dl); > + union devlink_param_value nvm_cfg_ver; > + struct hwrm_ver_get_output *ver_resp; > + char mgmt_ver[FW_VER_STR_LEN]; > + char roce_ver[FW_VER_STR_LEN]; > + char fw_ver[FW_VER_STR_LEN]; > + char buf[32]; > + int rc; > + > + rc = devlink_info_driver_name_put(req, DRV_MODULE_NAME); > + if (rc) > + return rc; > + > + sprintf(buf, "%X", bp->chip_num); > + rc = devlink_info_version_fixed_put(req, "board.id", buf); Are you sure chip_num is the board id and not the asic id? Is this the board version or the silicon version? Also please use the defines: DEVLINK_INFO_VERSION_GENERIC_BOARD_ID. > + if (rc) > + return rc; > + > + ver_resp = &bp->ver_resp; > + sprintf(buf, "%X", ver_resp->chip_rev); > + rc = devlink_info_version_fixed_put(req, "board.rev", buf); > + if (rc) > + return rc; > + > + if (BNXT_PF(bp)) { > + sprintf(buf, "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X", > + bp->dsn[7], bp->dsn[6], bp->dsn[5], bp->dsn[4], > + bp->dsn[3], bp->dsn[2], bp->dsn[1], bp->dsn[0]); > + rc = devlink_info_serial_number_put(req, buf); > + if (rc) > + return rc; > + } > + > + if (strlen(ver_resp->active_pkg_name)) { > + rc = > + devlink_info_version_running_put(req, "board.package", > + ver_resp->active_pkg_name); What's a board package? What HW people call a "module"? All devlink info versions should be documented in devlink-info-versions.rst. What are the possible values here? Reporting free form strings read from FW is going to be a tough sell. Probably worth dropping this one if you want the rest merged for 5.5. > + if (rc) > + return rc; > + } > + > + if (BNXT_PF(bp) && !bnxt_hwrm_get_nvm_cfg_ver(bp, &nvm_cfg_ver)) { > + u32 ver = nvm_cfg_ver.vu32; > + > + sprintf(buf, "%X.%X.%X", (ver >> 16) & 0xF, (ver >> 8) & 0xF, > + ver & 0xF); > + rc = devlink_info_version_running_put(req, "board.nvm_cfg_ver", ditto > + buf); > + if (rc) > + return rc; > + } > + > + if (ver_resp->flags & VER_GET_RESP_FLAGS_EXT_VER_AVAIL) { > + snprintf(fw_ver, FW_VER_STR_LEN, "%d.%d.%d.%d", > + ver_resp->hwrm_fw_major, ver_resp->hwrm_fw_minor, > + ver_resp->hwrm_fw_build, ver_resp->hwrm_fw_patch); > + > + snprintf(mgmt_ver, FW_VER_STR_LEN, "%d.%d.%d.%d", > + ver_resp->mgmt_fw_major, ver_resp->mgmt_fw_minor, > + ver_resp->mgmt_fw_build, ver_resp->mgmt_fw_patch); > + > + snprintf(roce_ver, FW_VER_STR_LEN, "%d.%d.%d.%d", > + ver_resp->roce_fw_major, ver_resp->roce_fw_minor, > + ver_resp->roce_fw_build, ver_resp->roce_fw_patch); > + } else { > + snprintf(fw_ver, FW_VER_STR_LEN, "%d.%d.%d.%d", > + ver_resp->hwrm_fw_maj_8b, ver_resp->hwrm_fw_min_8b, > + ver_resp->hwrm_fw_bld_8b, ver_resp->hwrm_fw_rsvd_8b); > + > + snprintf(mgmt_ver, FW_VER_STR_LEN, "%d.%d.%d.%d", > + ver_resp->mgmt_fw_maj_8b, ver_resp->mgmt_fw_min_8b, > + ver_resp->mgmt_fw_bld_8b, ver_resp->mgmt_fw_rsvd_8b); > + > + snprintf(roce_ver, FW_VER_STR_LEN, "%d.%d.%d.%d", > + ver_resp->roce_fw_maj_8b, ver_resp->roce_fw_min_8b, > + ver_resp->roce_fw_bld_8b, ver_resp->roce_fw_rsvd_8b); > + } > + rc = devlink_info_version_running_put(req, "fw.version", fw_ver); > + if (rc) > + return rc; > + > + if (!(bp->flags & BNXT_FLAG_CHIP_P5)) { > + rc = devlink_info_version_running_put(req, "fw.mgmt", mgmt_ver); > + if (rc) > + return rc; > + > + rc = devlink_info_version_running_put(req, "fw.app", roce_ver); Should this be fw.roce? Is the NIC ROCE centric, IOW the data path is all ROCE? What's hwrm? perhaps that's the datapath microcode version? > + if (rc) > + return rc; > + } > + return 0; > +} > + > static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg, > int msg_len, union devlink_param_value *val) > {
On Sat, Nov 23, 2019 at 11:55 AM Jakub Kicinski <jakub.kicinski@netronome.com> wrote: > What's a board package? What HW people call a "module"? All devlink info > versions should be documented in devlink-info-versions.rst. > > What are the possible values here? Reporting free form strings read > from FW is going to be a tough sell. Probably worth dropping this one > if you want the rest merged for 5.5. > Sure, we can drop this one for now. Do you want me to resend, or can you apply just the 1st 14 patches?
On Sat, 23 Nov 2019 12:15:39 -0800, Michael Chan wrote: > On Sat, Nov 23, 2019 at 11:55 AM Jakub Kicinski wrote: > > What's a board package? What HW people call a "module"? All devlink info > > versions should be documented in devlink-info-versions.rst. > > > > What are the possible values here? Reporting free form strings read > > from FW is going to be a tough sell. Probably worth dropping this one > > if you want the rest merged for 5.5. > > Sure, we can drop this one for now. Do you want me to resend, or can > you apply just the 1st 14 patches? A resend would be better, the cover letter also needs updating.
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c index 1c456fc..531d48f 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c @@ -239,11 +239,15 @@ void bnxt_dl_health_status_update(struct bnxt *bp, bool healthy) health->fatal = false; } +static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req, + struct netlink_ext_ack *extack); + static const struct devlink_ops bnxt_dl_ops = { #ifdef CONFIG_BNXT_SRIOV .eswitch_mode_set = bnxt_dl_eswitch_mode_set, .eswitch_mode_get = bnxt_dl_eswitch_mode_get, #endif /* CONFIG_BNXT_SRIOV */ + .info_get = bnxt_dl_info_get, .flash_update = bnxt_dl_flash_update, }; @@ -308,6 +312,130 @@ static void bnxt_copy_from_nvm_data(union devlink_param_value *dst, dst->vu8 = (u8)val32; } +static int bnxt_hwrm_get_nvm_cfg_ver(struct bnxt *bp, + union devlink_param_value *nvm_cfg_ver) +{ + struct hwrm_nvm_get_variable_input req = {0}; + union bnxt_nvm_data *data; + dma_addr_t data_dma_addr; + int rc; + + bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_GET_VARIABLE, -1, -1); + data = dma_alloc_coherent(&bp->pdev->dev, sizeof(*data), + &data_dma_addr, GFP_KERNEL); + if (!data) + return -ENOMEM; + + req.dest_data_addr = cpu_to_le64(data_dma_addr); + req.data_len = cpu_to_le16(BNXT_NVM_CFG_VER_BITS); + req.option_num = cpu_to_le16(NVM_OFF_NVM_CFG_VER); + + rc = hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + if (!rc) + bnxt_copy_from_nvm_data(nvm_cfg_ver, data, + BNXT_NVM_CFG_VER_BITS, + BNXT_NVM_CFG_VER_BYTES); + + dma_free_coherent(&bp->pdev->dev, sizeof(*data), data, data_dma_addr); + return rc; +} + +static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req, + struct netlink_ext_ack *extack) +{ + struct bnxt *bp = bnxt_get_bp_from_dl(dl); + union devlink_param_value nvm_cfg_ver; + struct hwrm_ver_get_output *ver_resp; + char mgmt_ver[FW_VER_STR_LEN]; + char roce_ver[FW_VER_STR_LEN]; + char fw_ver[FW_VER_STR_LEN]; + char buf[32]; + int rc; + + rc = devlink_info_driver_name_put(req, DRV_MODULE_NAME); + if (rc) + return rc; + + sprintf(buf, "%X", bp->chip_num); + rc = devlink_info_version_fixed_put(req, "board.id", buf); + if (rc) + return rc; + + ver_resp = &bp->ver_resp; + sprintf(buf, "%X", ver_resp->chip_rev); + rc = devlink_info_version_fixed_put(req, "board.rev", buf); + if (rc) + return rc; + + if (BNXT_PF(bp)) { + sprintf(buf, "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X", + bp->dsn[7], bp->dsn[6], bp->dsn[5], bp->dsn[4], + bp->dsn[3], bp->dsn[2], bp->dsn[1], bp->dsn[0]); + rc = devlink_info_serial_number_put(req, buf); + if (rc) + return rc; + } + + if (strlen(ver_resp->active_pkg_name)) { + rc = + devlink_info_version_running_put(req, "board.package", + ver_resp->active_pkg_name); + if (rc) + return rc; + } + + if (BNXT_PF(bp) && !bnxt_hwrm_get_nvm_cfg_ver(bp, &nvm_cfg_ver)) { + u32 ver = nvm_cfg_ver.vu32; + + sprintf(buf, "%X.%X.%X", (ver >> 16) & 0xF, (ver >> 8) & 0xF, + ver & 0xF); + rc = devlink_info_version_running_put(req, "board.nvm_cfg_ver", + buf); + if (rc) + return rc; + } + + if (ver_resp->flags & VER_GET_RESP_FLAGS_EXT_VER_AVAIL) { + snprintf(fw_ver, FW_VER_STR_LEN, "%d.%d.%d.%d", + ver_resp->hwrm_fw_major, ver_resp->hwrm_fw_minor, + ver_resp->hwrm_fw_build, ver_resp->hwrm_fw_patch); + + snprintf(mgmt_ver, FW_VER_STR_LEN, "%d.%d.%d.%d", + ver_resp->mgmt_fw_major, ver_resp->mgmt_fw_minor, + ver_resp->mgmt_fw_build, ver_resp->mgmt_fw_patch); + + snprintf(roce_ver, FW_VER_STR_LEN, "%d.%d.%d.%d", + ver_resp->roce_fw_major, ver_resp->roce_fw_minor, + ver_resp->roce_fw_build, ver_resp->roce_fw_patch); + } else { + snprintf(fw_ver, FW_VER_STR_LEN, "%d.%d.%d.%d", + ver_resp->hwrm_fw_maj_8b, ver_resp->hwrm_fw_min_8b, + ver_resp->hwrm_fw_bld_8b, ver_resp->hwrm_fw_rsvd_8b); + + snprintf(mgmt_ver, FW_VER_STR_LEN, "%d.%d.%d.%d", + ver_resp->mgmt_fw_maj_8b, ver_resp->mgmt_fw_min_8b, + ver_resp->mgmt_fw_bld_8b, ver_resp->mgmt_fw_rsvd_8b); + + snprintf(roce_ver, FW_VER_STR_LEN, "%d.%d.%d.%d", + ver_resp->roce_fw_maj_8b, ver_resp->roce_fw_min_8b, + ver_resp->roce_fw_bld_8b, ver_resp->roce_fw_rsvd_8b); + } + rc = devlink_info_version_running_put(req, "fw.version", fw_ver); + if (rc) + return rc; + + if (!(bp->flags & BNXT_FLAG_CHIP_P5)) { + rc = devlink_info_version_running_put(req, "fw.mgmt", mgmt_ver); + if (rc) + return rc; + + rc = devlink_info_version_running_put(req, "fw.app", roce_ver); + if (rc) + return rc; + } + return 0; +} + static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg, int msg_len, union devlink_param_value *val) { diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h index 665d4bd..5b2e796 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h @@ -38,6 +38,10 @@ static inline void bnxt_link_bp_to_dl(struct bnxt *bp, struct devlink *dl) #define NVM_OFF_IGNORE_ARI 164 #define NVM_OFF_DIS_GRE_VER_CHECK 171 #define NVM_OFF_ENABLE_SRIOV 401 +#define NVM_OFF_NVM_CFG_VER 602 + +#define BNXT_NVM_CFG_VER_BITS 24 +#define BNXT_NVM_CFG_VER_BYTES 4 #define BNXT_MSIX_VEC_MAX 1280 #define BNXT_MSIX_VEC_MIN_MAX 128