Message ID | 20240417085347.2836385-4-danieller@nvidia.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Add ability to flash modules' firmware | expand |
On Wed, Apr 17, 2024 at 11:53:40AM +0300, Danielle Ratson wrote: > +MODULE_FW_FLASH_ACT > +=================== > + > +Flashes transceiver module firmware. > + > +Request contents: > + > + ======================================= ====== =========================== > + ``ETHTOOL_A_MODULE_FW_FLASH_HEADER`` nested request header > + ``ETHTOOL_A_MODULE_FW_FLASH_FILE_NAME`` string firmware image file name > + ``ETHTOOL_A_MODULE_FW_FLASH_PASSWORD`` u32 transceiver module password > + ======================================= ====== =========================== > + > +The firmware update process is composed from three logical steps: "... consists of ..." > + > +1. Downloading a firmware image to the transceiver module and validating it. > +2. Running the firmware image. > +3. Committing the firmware image so that it is run upon reset. > + > +When flash command is given, those three steps are taken in that order. > + > +The ``ETHTOOL_A_MODULE_FW_FLASH_FILE_NAME`` attribute encodes the firmware > +image file name. The firmware image is downloaded to the transceiver module, > +validated, run and committed. > + > +The optional ``ETHTOOL_A_MODULE_FW_FLASH_PASSWORD`` attribute encodes a password > +that might be required as part of the transceiver module firmware update > +process. > + > +The firmware update process can take several minutes to complete. Therefore, > +during the update process notifications are emitted from the kernel to user > +space updating it about the status and progress. > + > +Notification contents: > + > + +---------------------------------------------------+--------+----------------+ > + | ``ETHTOOL_A_MODULE_FW_FLASH_HEADER`` | nested | reply header | > + +---------------------------------------------------+--------+----------------+ > + | ``ETHTOOL_A_MODULE_FW_FLASH_STATUS`` | u32 | status | > + +---------------------------------------------------+--------+----------------+ > + | ``ETHTOOL_A_MODULE_FW_FLASH_STATUS_MSG`` | string | status message | > + +---------------------------------------------------+--------+----------------+ > + | ``ETHTOOL_A_MODULE_FW_FLASH_DONE`` | u64 | progress | > + +---------------------------------------------------+--------+----------------+ > + | ``ETHTOOL_A_MODULE_FW_FLASH_TOTAL`` | u64 | total | > + +---------------------------------------------------+--------+----------------+ > + > +The ``ETHTOOL_A_MODULE_FW_FLASH_STATUS`` attribute encodes the current status > +of the firmware update process. Possible values are: > + > +.. kernel-doc:: include/uapi/linux/ethtool.h > + :identifiers: ethtool_module_fw_flash_status > + > +The ``ETHTOOL_A_MODULE_FW_FLASH_STATUS_MSG`` attribute encodes a status message > +string. > + > +The ``ETHTOOL_A_MODULE_FW_FLASH_DONE`` and ``ETHTOOL_A_MODULE_FW_FLASH_TOTAL`` > +attributes encode the completed and total amount of work, respectively. > + The rest of doc LGTM. Thanks.
> -----Original Message----- > From: Bagas Sanjaya <bagasdotme@gmail.com> > Sent: Thursday, 18 April 2024 5:38 > To: Danielle Ratson <danieller@nvidia.com>; netdev@vger.kernel.org > Cc: davem@davemloft.net; edumazet@google.com; kuba@kernel.org; > pabeni@redhat.com; corbet@lwn.net; linux@armlinux.org.uk; > sdf@google.com; kory.maincent@bootlin.com; > maxime.chevallier@bootlin.com; vladimir.oltean@nxp.com; > przemyslaw.kitszel@intel.com; ahmed.zaki@intel.com; > richardcochran@gmail.com; shayagr@amazon.com; > paul.greenwalt@intel.com; jiri@resnulli.us; linux-doc@vger.kernel.org; linux- > kernel@vger.kernel.org; mlxsw <mlxsw@nvidia.com>; Petr Machata > <petrm@nvidia.com>; Ido Schimmel <idosch@nvidia.com> > Subject: Re: [PATCH net-next v3 03/10] ethtool: Add an interface for flashing > transceiver modules' firmware > > On Wed, Apr 17, 2024 at 11:53:40AM +0300, Danielle Ratson wrote: > > +MODULE_FW_FLASH_ACT > > +=================== > > + > > +Flashes transceiver module firmware. > > + > > +Request contents: > > + > > + ======================================= ====== > =========================== > > + ``ETHTOOL_A_MODULE_FW_FLASH_HEADER`` nested request header > > + ``ETHTOOL_A_MODULE_FW_FLASH_FILE_NAME`` string firmware image > file name > > + ``ETHTOOL_A_MODULE_FW_FLASH_PASSWORD`` u32 transceiver > module password > > + ======================================= ====== > > + =========================== > > + > > +The firmware update process is composed from three logical steps: > "... consists of ..." > > + > > +1. Downloading a firmware image to the transceiver module and validating > it. > > +2. Running the firmware image. > > +3. Committing the firmware image so that it is run upon reset. > > + > > +When flash command is given, those three steps are taken in that order. > > + > > +The ``ETHTOOL_A_MODULE_FW_FLASH_FILE_NAME`` attribute encodes > the > > +firmware image file name. The firmware image is downloaded to the > > +transceiver module, validated, run and committed. > > + > > +The optional ``ETHTOOL_A_MODULE_FW_FLASH_PASSWORD`` attribute > encodes > > +a password that might be required as part of the transceiver module > > +firmware update process. > > + > > +The firmware update process can take several minutes to complete. > > +Therefore, during the update process notifications are emitted from > > +the kernel to user space updating it about the status and progress. > > + > > +Notification contents: > > + > > + +---------------------------------------------------+--------+----------------+ > > + | ``ETHTOOL_A_MODULE_FW_FLASH_HEADER`` | nested | reply > header | > > + +---------------------------------------------------+--------+----------------+ > > + | ``ETHTOOL_A_MODULE_FW_FLASH_STATUS`` | u32 | status > | > > + +---------------------------------------------------+--------+----------------+ > > + | ``ETHTOOL_A_MODULE_FW_FLASH_STATUS_MSG`` | string | status > message | > > + +---------------------------------------------------+--------+----------------+ > > + | ``ETHTOOL_A_MODULE_FW_FLASH_DONE`` | u64 | progress > | > > + +---------------------------------------------------+--------+----------------+ > > + | ``ETHTOOL_A_MODULE_FW_FLASH_TOTAL`` | u64 | total | > > + +---------------------------------------------------+--------+----------------+ > > + > > +The ``ETHTOOL_A_MODULE_FW_FLASH_STATUS`` attribute encodes the > > +current status of the firmware update process. Possible values are: > > + > > +.. kernel-doc:: include/uapi/linux/ethtool.h > > + :identifiers: ethtool_module_fw_flash_status > > + > > +The ``ETHTOOL_A_MODULE_FW_FLASH_STATUS_MSG`` attribute encodes > a > > +status message string. > > + > > +The ``ETHTOOL_A_MODULE_FW_FLASH_DONE`` and > > +``ETHTOOL_A_MODULE_FW_FLASH_TOTAL`` > > +attributes encode the completed and total amount of work, respectively. > > + > > The rest of doc LGTM. > > Thanks. > Hi, Since it is the only comment, can i maybe send a fix for that later if needed, and let this apply? Thanks, Danielle > -- > An old man doll... just what I always wanted! - Clara
On Thu, Apr 18, 2024 at 07:41:08AM +0000, Danielle Ratson wrote: > > On Wed, Apr 17, 2024 at 11:53:40AM +0300, Danielle Ratson wrote: > <snipped>... > > > +The firmware update process is composed from three logical steps: > > "... consists of ..." > <snipped>... > Hi, > > Since it is the only comment, can i maybe send a fix for that later if needed, and let this apply? IMO you can apply the wording suggestion above if you wish. Thanks.
diff --git a/Documentation/netlink/specs/ethtool.yaml b/Documentation/netlink/specs/ethtool.yaml index 87ae7b397984..718073f4fb3f 100644 --- a/Documentation/netlink/specs/ethtool.yaml +++ b/Documentation/netlink/specs/ethtool.yaml @@ -20,6 +20,10 @@ definitions: name: header-flags type: flags entries: [ compact-bitsets, omit-reply, stats ] + - + name: module-fw-flash-status + type: enum + entries: [ started, in_progress, completed, error ] attribute-sets: - @@ -963,6 +967,39 @@ attribute-sets: - name: burst-tmr type: u32 + - + name: module-fw-flash + attributes: + - + name: header + type: nest + nested-attributes: header + - + name: file-name + type: string + - + name: password + type: u32 + - + name: module-fw-flash-ntf + attributes: + - + name: header + type: nest + nested-attributes: header + - + name: status + type: u32 + enum: module-fw-flash-status + - + name: status-msg + type: string + - + name: done + type: u64 + - + name: total + type: u64 operations: enum-model: directional @@ -1715,3 +1752,28 @@ operations: name: mm-ntf doc: Notification for change in MAC Merge configuration. notify: mm-get + - + name: module-fw-flash-act + doc: Flash transceiver module firmware. + + attribute-set: module-fw-flash + + do: + request: + attributes: + - header + - file-name + - password + - + name: module-fw-flash-ntf + doc: Notification for firmware flashing progress and status. + + attribute-set: module-fw-flash-ntf + + event: + attributes: + - header + - status + - status-msg + - done + - total diff --git a/Documentation/networking/ethtool-netlink.rst b/Documentation/networking/ethtool-netlink.rst index 4e63d3708ed9..76ec2ac0d013 100644 --- a/Documentation/networking/ethtool-netlink.rst +++ b/Documentation/networking/ethtool-netlink.rst @@ -235,6 +235,7 @@ Userspace to kernel: ``ETHTOOL_MSG_PLCA_GET_STATUS`` get PLCA RS status ``ETHTOOL_MSG_MM_GET`` get MAC merge layer state ``ETHTOOL_MSG_MM_SET`` set MAC merge layer parameters + ``ETHTOOL_MSG_MODULE_FW_FLASH_ACT`` flash transceiver module firmware ===================================== ================================= Kernel to userspace: @@ -281,6 +282,7 @@ Kernel to userspace: ``ETHTOOL_MSG_PLCA_GET_STATUS_REPLY`` PLCA RS status ``ETHTOOL_MSG_PLCA_NTF`` PLCA RS parameters ``ETHTOOL_MSG_MM_GET_REPLY`` MAC merge layer status + ``ETHTOOL_MSG_MODULE_FW_FLASH_NTF`` transceiver module flash updates ======================================== ================================= ``GET`` requests are sent by userspace applications to retrieve device @@ -2020,6 +2022,65 @@ The attributes are propagated to the driver through the following structure: .. kernel-doc:: include/linux/ethtool.h :identifiers: ethtool_mm_cfg +MODULE_FW_FLASH_ACT +=================== + +Flashes transceiver module firmware. + +Request contents: + + ======================================= ====== =========================== + ``ETHTOOL_A_MODULE_FW_FLASH_HEADER`` nested request header + ``ETHTOOL_A_MODULE_FW_FLASH_FILE_NAME`` string firmware image file name + ``ETHTOOL_A_MODULE_FW_FLASH_PASSWORD`` u32 transceiver module password + ======================================= ====== =========================== + +The firmware update process is composed from three logical steps: + +1. Downloading a firmware image to the transceiver module and validating it. +2. Running the firmware image. +3. Committing the firmware image so that it is run upon reset. + +When flash command is given, those three steps are taken in that order. + +The ``ETHTOOL_A_MODULE_FW_FLASH_FILE_NAME`` attribute encodes the firmware +image file name. The firmware image is downloaded to the transceiver module, +validated, run and committed. + +The optional ``ETHTOOL_A_MODULE_FW_FLASH_PASSWORD`` attribute encodes a password +that might be required as part of the transceiver module firmware update +process. + +The firmware update process can take several minutes to complete. Therefore, +during the update process notifications are emitted from the kernel to user +space updating it about the status and progress. + +Notification contents: + + +---------------------------------------------------+--------+----------------+ + | ``ETHTOOL_A_MODULE_FW_FLASH_HEADER`` | nested | reply header | + +---------------------------------------------------+--------+----------------+ + | ``ETHTOOL_A_MODULE_FW_FLASH_STATUS`` | u32 | status | + +---------------------------------------------------+--------+----------------+ + | ``ETHTOOL_A_MODULE_FW_FLASH_STATUS_MSG`` | string | status message | + +---------------------------------------------------+--------+----------------+ + | ``ETHTOOL_A_MODULE_FW_FLASH_DONE`` | u64 | progress | + +---------------------------------------------------+--------+----------------+ + | ``ETHTOOL_A_MODULE_FW_FLASH_TOTAL`` | u64 | total | + +---------------------------------------------------+--------+----------------+ + +The ``ETHTOOL_A_MODULE_FW_FLASH_STATUS`` attribute encodes the current status +of the firmware update process. Possible values are: + +.. kernel-doc:: include/uapi/linux/ethtool.h + :identifiers: ethtool_module_fw_flash_status + +The ``ETHTOOL_A_MODULE_FW_FLASH_STATUS_MSG`` attribute encodes a status message +string. + +The ``ETHTOOL_A_MODULE_FW_FLASH_DONE`` and ``ETHTOOL_A_MODULE_FW_FLASH_TOTAL`` +attributes encode the completed and total amount of work, respectively. + Request translation =================== @@ -2126,4 +2187,5 @@ are netlink only. n/a ``ETHTOOL_MSG_PLCA_GET_STATUS`` n/a ``ETHTOOL_MSG_MM_GET`` n/a ``ETHTOOL_MSG_MM_SET`` + n/a ``ETHTOOL_MSG_MODULE_FW_FLASH_ACT`` =================================== ===================================== diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h index 95c2f09f0d0a..332df9f36062 100644 --- a/include/uapi/linux/ethtool.h +++ b/include/uapi/linux/ethtool.h @@ -822,6 +822,24 @@ enum ethtool_mm_verify_status { ETHTOOL_MM_VERIFY_STATUS_DISABLED, }; +/** + * enum ethtool_module_fw_flash_status - plug-in module firmware flashing status + * @ETHTOOL_MODULE_FW_FLASH_STATUS_STARTED: The firmware flashing process has + * started. + * @ETHTOOL_MODULE_FW_FLASH_STATUS_IN_PROGRESS: The firmware flashing process + * is in progress. + * @ETHTOOL_MODULE_FW_FLASH_STATUS_COMPLETED: The firmware flashing process was + * completed successfully. + * @ETHTOOL_MODULE_FW_FLASH_STATUS_ERROR: The firmware flashing process was + * stopped due to an error. + */ +enum ethtool_module_fw_flash_status { + ETHTOOL_MODULE_FW_FLASH_STATUS_STARTED = 1, + ETHTOOL_MODULE_FW_FLASH_STATUS_IN_PROGRESS, + ETHTOOL_MODULE_FW_FLASH_STATUS_COMPLETED, + ETHTOOL_MODULE_FW_FLASH_STATUS_ERROR, +}; + /** * struct ethtool_gstrings - string set for data tagging * @cmd: Command number = %ETHTOOL_GSTRINGS diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h index b4f0d233d048..c98c635c532f 100644 --- a/include/uapi/linux/ethtool_netlink.h +++ b/include/uapi/linux/ethtool_netlink.h @@ -57,6 +57,7 @@ enum { ETHTOOL_MSG_PLCA_GET_STATUS, ETHTOOL_MSG_MM_GET, ETHTOOL_MSG_MM_SET, + ETHTOOL_MSG_MODULE_FW_FLASH_ACT, /* add new constants above here */ __ETHTOOL_MSG_USER_CNT, @@ -109,6 +110,7 @@ enum { ETHTOOL_MSG_PLCA_NTF, ETHTOOL_MSG_MM_GET_REPLY, ETHTOOL_MSG_MM_NTF, + ETHTOOL_MSG_MODULE_FW_FLASH_NTF, /* add new constants above here */ __ETHTOOL_MSG_KERNEL_CNT, @@ -994,6 +996,24 @@ enum { ETHTOOL_A_MM_MAX = (__ETHTOOL_A_MM_CNT - 1) }; +/* MODULE_FW_FLASH */ + +enum { + ETHTOOL_A_MODULE_FW_FLASH_UNSPEC, + ETHTOOL_A_MODULE_FW_FLASH_HEADER, /* nest - _A_HEADER_* */ + ETHTOOL_A_MODULE_FW_FLASH_FILE_NAME, /* string */ + ETHTOOL_A_MODULE_FW_FLASH_PASSWORD, /* u32 */ + ETHTOOL_A_MODULE_FW_FLASH_PAD, + ETHTOOL_A_MODULE_FW_FLASH_STATUS, /* u8 */ + ETHTOOL_A_MODULE_FW_FLASH_STATUS_MSG, /* string */ + ETHTOOL_A_MODULE_FW_FLASH_DONE, /* u64 */ + ETHTOOL_A_MODULE_FW_FLASH_TOTAL, /* u64 */ + + /* add new constants above here */ + __ETHTOOL_A_MODULE_FW_FLASH_CNT, + ETHTOOL_A_MODULE_FW_FLASH_MAX = (__ETHTOOL_A_MODULE_FW_FLASH_CNT - 1) +}; + /* generic netlink info */ #define ETHTOOL_GENL_NAME "ethtool" #define ETHTOOL_GENL_VERSION 1
CMIS compliant modules such as QSFP-DD might be running a firmware that can be updated in a vendor-neutral way by exchanging messages between the host and the module as described in section 7.3.1 of revision 5.2 of the CMIS standard. Add a pair of new ethtool messages that allow: * User space to trigger firmware update of transceiver modules * The kernel to notify user space about the progress of the process The user interface is designed to be asynchronous in order to avoid RTNL being held for too long and to allow several modules to be updated simultaneously. The interface is designed with CMIS compliant modules in mind, but kept generic enough to accommodate future use cases, if these arise. Signed-off-by: Danielle Ratson <danieller@nvidia.com> --- Documentation/netlink/specs/ethtool.yaml | 62 ++++++++++++++++++++ Documentation/networking/ethtool-netlink.rst | 62 ++++++++++++++++++++ include/uapi/linux/ethtool.h | 18 ++++++ include/uapi/linux/ethtool_netlink.h | 20 +++++++ 4 files changed, 162 insertions(+)