Skip to content

Commit

Permalink
eth: fbnic: Add devlink firmware version info
Browse files Browse the repository at this point in the history
This adds support to show firmware version information for both stored and
running firmware versions. The version and commit is displayed separately
to aid monitoring tools which only care about the version.

Example output:
  # devlink dev info
  pci/0000:01:00.0:
    driver fbnic
    serial_number 88-25-08-ff-ff-01-50-92
    versions:
        running:
          fw 24.07.15-017
          fw.commit h999784ae9df0
          fw.bootloader 24.07.10-000
          fw.bootloader.commit hfef3ac835ce7
        stored:
          fw 24.07.24-002
          fw.commit hc9d14a68b3f2
          fw.bootloader 24.07.22-000
          fw.bootloader.commit h922f8493eb96
          fw.undi 01.00.03-000

Signed-off-by: Lee Trager <lee@trager.us>
Reviewed-by: Jakub Kicinski <kuba@kernel.org>
Link: https://patch.msgid.link/20240905233820.1713043-1-lee@trager.us
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
  • Loading branch information
Lee Trager authored and Paolo Abeni committed Sep 10, 2024
1 parent 9284594 commit 0246388
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 0 deletions.
1 change: 1 addition & 0 deletions Documentation/networking/device_drivers/ethernet/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ Contents:
marvell/octeon_ep
marvell/octeon_ep_vf
mellanox/mlx5/index
meta/fbnic
microsoft/netvsc
neterion/s2io
netronome/nfp
Expand Down
29 changes: 29 additions & 0 deletions Documentation/networking/device_drivers/ethernet/meta/fbnic.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
.. SPDX-License-Identifier: GPL-2.0+
=====================================
Meta Platforms Host Network Interface
=====================================

Firmware Versions
-----------------

fbnic has three components stored on the flash which are provided in one PLDM
image:

1. fw - The control firmware used to view and modify firmware settings, request
firmware actions, and retrieve firmware counters outside of the data path.
This is the firmware which fbnic_fw.c interacts with.
2. bootloader - The firmware which validate firmware security and control basic
operations including loading and updating the firmware. This is also known
as the cmrt firmware.
3. undi - This is the UEFI driver which is based on the Linux driver.

fbnic stores two copies of these three components on flash. This allows fbnic
to fall back to an older version of firmware automatically in case firmware
fails to boot. Version information for both is provided as running and stored.
The undi is only provided in stored as it is not actively running once the Linux
driver takes over.

devlink dev info provides version information for all three components. In
addition to the version the hg commit hash of the build is included as a
separate entry.
1 change: 1 addition & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -14833,6 +14833,7 @@ M: Alexander Duyck <alexanderduyck@fb.com>
M: Jakub Kicinski <kuba@kernel.org>
R: kernel-team@meta.com
S: Supported
F: Documentation/networking/device_drivers/ethernet/meta/
F: drivers/net/ethernet/meta/

METHODE UDPU SUPPORT
Expand Down
75 changes: 75 additions & 0 deletions drivers/net/ethernet/meta/fbnic/fbnic_devlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,88 @@

#define FBNIC_SN_STR_LEN 24

static int fbnic_version_running_put(struct devlink_info_req *req,
struct fbnic_fw_ver *fw_ver,
char *ver_name)
{
char running_ver[FBNIC_FW_VER_MAX_SIZE];
int err;

fbnic_mk_fw_ver_str(fw_ver->version, running_ver);
err = devlink_info_version_running_put(req, ver_name, running_ver);
if (err)
return err;

if (strlen(fw_ver->commit) > 0) {
char commit_name[FBNIC_SN_STR_LEN];

snprintf(commit_name, FBNIC_SN_STR_LEN, "%s.commit", ver_name);
err = devlink_info_version_running_put(req, commit_name,
fw_ver->commit);
if (err)
return err;
}

return 0;
}

static int fbnic_version_stored_put(struct devlink_info_req *req,
struct fbnic_fw_ver *fw_ver,
char *ver_name)
{
char stored_ver[FBNIC_FW_VER_MAX_SIZE];
int err;

fbnic_mk_fw_ver_str(fw_ver->version, stored_ver);
err = devlink_info_version_stored_put(req, ver_name, stored_ver);
if (err)
return err;

if (strlen(fw_ver->commit) > 0) {
char commit_name[FBNIC_SN_STR_LEN];

snprintf(commit_name, FBNIC_SN_STR_LEN, "%s.commit", ver_name);
err = devlink_info_version_stored_put(req, commit_name,
fw_ver->commit);
if (err)
return err;
}

return 0;
}

static int fbnic_devlink_info_get(struct devlink *devlink,
struct devlink_info_req *req,
struct netlink_ext_ack *extack)
{
struct fbnic_dev *fbd = devlink_priv(devlink);
int err;

err = fbnic_version_running_put(req, &fbd->fw_cap.running.mgmt,
DEVLINK_INFO_VERSION_GENERIC_FW);
if (err)
return err;

err = fbnic_version_running_put(req, &fbd->fw_cap.running.bootloader,
DEVLINK_INFO_VERSION_GENERIC_FW_BOOTLOADER);
if (err)
return err;

err = fbnic_version_stored_put(req, &fbd->fw_cap.stored.mgmt,
DEVLINK_INFO_VERSION_GENERIC_FW);
if (err)
return err;

err = fbnic_version_stored_put(req, &fbd->fw_cap.stored.bootloader,
DEVLINK_INFO_VERSION_GENERIC_FW_BOOTLOADER);
if (err)
return err;

err = fbnic_version_stored_put(req, &fbd->fw_cap.stored.undi,
DEVLINK_INFO_VERSION_GENERIC_FW_UNDI);
if (err)
return err;

if (fbd->dsn) {
unsigned char serial[FBNIC_SN_STR_LEN];
u8 dsn[8];
Expand Down

0 comments on commit 0246388

Please sign in to comment.