mlxsw: core_linecards: Expose device PSID over device info

Use tunneled MGIR to obtain PSID of line card device and extend
device_info_get() op to fill up the info with that.

Example:

$ devlink dev info auxiliary/mlxsw_core.lc.0
auxiliary/mlxsw_core.lc.0:
  versions:
      fixed:
        hw.revision 0
        fw.psid MT_0000000749
      running:
        ini.version 4
        fw 19.2010.1312

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jiri Pirko 2022-07-25 10:29:22 +02:00 committed by Jakub Kicinski
parent 8f9b0513a9
commit 3fc0c51905
3 changed files with 35 additions and 0 deletions

View File

@ -75,6 +75,9 @@ The ``mlxsw`` driver reports the following versions for line card auxiliary devi
* - ``ini.version``
- running
- Version of line card INI loaded
* - ``fw.psid``
- fixed
- Line card device PSID
* - ``fw.version``
- running
- Three digit firmware version of line card device

View File

@ -570,6 +570,7 @@ struct mlxsw_linecard_device_info {
u16 fw_major;
u16 fw_minor;
u16 fw_sub_minor;
char psid[MLXSW_REG_MGIR_FW_INFO_PSID_SIZE];
};
struct mlxsw_linecard {

View File

@ -87,6 +87,27 @@ static const char *mlxsw_linecard_type_name(struct mlxsw_linecard *linecard)
return linecard->name;
}
static int mlxsw_linecard_device_psid_get(struct mlxsw_linecard *linecard,
u8 device_index, char *psid)
{
struct mlxsw_core *mlxsw_core = linecard->linecards->mlxsw_core;
char mddt_pl[MLXSW_REG_MDDT_LEN];
char *mgir_pl;
int err;
mlxsw_reg_mddt_pack(mddt_pl, linecard->slot_index, device_index,
MLXSW_REG_MDDT_METHOD_QUERY,
MLXSW_REG(mgir), &mgir_pl);
mlxsw_reg_mgir_pack(mgir_pl);
err = mlxsw_reg_query(mlxsw_core, MLXSW_REG(mddt), mddt_pl);
if (err)
return err;
mlxsw_reg_mgir_fw_info_psid_memcpy_from(mgir_pl, psid);
return 0;
}
static int mlxsw_linecard_device_info_update(struct mlxsw_linecard *linecard)
{
struct mlxsw_core *mlxsw_core = linecard->linecards->mlxsw_core;
@ -121,6 +142,12 @@ static int mlxsw_linecard_device_info_update(struct mlxsw_linecard *linecard)
linecard->slot_index);
return 0;
}
err = mlxsw_linecard_device_psid_get(linecard, device_index,
info.psid);
if (err)
return err;
linecard->device.info = info;
flashable_found = true;
} while (msg_seq);
@ -293,6 +320,10 @@ int mlxsw_linecard_devlink_info_get(struct mlxsw_linecard *linecard,
if (linecard->active) {
struct mlxsw_linecard_device_info *info = &linecard->device.info;
err = devlink_info_version_fixed_put(req,
DEVLINK_INFO_VERSION_GENERIC_FW_PSID,
info->psid);
sprintf(buf, "%u.%u.%u", info->fw_major, info->fw_minor,
info->fw_sub_minor);
err = devlink_info_version_running_put(req,