Commit 13f356f5 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'wwan-iosm-fw-flashing'



M Chetan Kumar says:

====================
net: wwan: iosm: fw flashing & cd collection

This patch series brings-in support for M.2 7560 Device firmware flashing &
coredump collection using devlink.
- Driver Registers with Devlink framework.
- Register devlink params callback for configuring device params
  required in flashing or coredump flow.
- Implements devlink ops flash_update callback that programs modem
  firmware.
- Creates region & snapshot required for device coredump log collection.

On early detection of device in boot rom stage. Driver registers with
Devlink framework and establish transport channel for PSI (Primary Signed
Image) injection. Once PSI is injected to device, the device execution
stage details are read to determine whether device is in flash or
exception mode. The collected information is reported to devlink user
space application & based on this informationi, application proceeds with
either modem firmware flashing or coredump collection.

Refer to iosm devlink documentation for details on Devlink Params, flash
update and coredump collection command usage.

Note: Patches are interdependent. Need to apply complete patch series for
compilation.

Changes since v1:
  * Break down single patch into multiple patches.
  * IOSM Driver devlink documentation.
  * Fixes NULL parameter deference in ipc_devlink_flash_update() reported
    by smatch static checker.
  * Fixes memory leak in ipc_devlink_create_region().
  * Use kmemdup instead of kzalloc and memcpy in ipc_flash_boot_psi().
  * Fixes linux-net build error.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents d44fd860 607d574a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -47,3 +47,4 @@ parameters, info versions, and other features it supports.
   ti-cpsw-switch
   am65-nuss-cpsw-switch
   prestera
   iosm
+182 −0
Original line number Diff line number Diff line
.. SPDX-License-Identifier: GPL-2.0

====================
iosm devlink support
====================

This document describes the devlink features implemented by the ``iosm``
device driver.

Parameters
==========

The ``iosm`` driver implements the following driver-specific parameters.

.. list-table:: Driver-specific parameters implemented
   :widths: 5 5 5 85

   * - Name
     - Type
     - Mode
     - Description
   * - ``erase_full_flash``
     - u8
     - runtime
     - erase_full_flash parameter is used to check if full erase is required for
       the device during firmware flashing.
       If set, Full nand erase command will be sent to the device. By default,
       only conditional erase support is enabled.
   * - ``download_region``
     - u8
     - runtime
     - download_region parameter is used to identify if we are flashing the
       loadmap/region file during the firmware flashing.
   * - ``address``
     - u32
     - runtime
     - address parameter is used to send the address information of the
       loadmap/region file which is required during the firmware flashing
       process. Each region file has be flashed to its respective flash address.
   * - ``region_count``
     - u8
     - runtime
     - region_count parameter is used to inform the driver on how many total
       loadmap/region files are present in modem firmware image that has to be
       flashed.


Flash Update
============

The ``iosm`` driver implements support for flash update using the
``devlink-flash`` interface.

It supports updating the device flash using a combined flash image which contains
the Bootloader images and other modem software images.

The driver uses DEVLINK_SUPPORT_FLASH_UPDATE_COMPONENT to identify type of
firmware image that need to be flashed as requested by user space application.
Supported firmware image types.

.. list-table:: Firmware Image types
    :widths: 15 85

    * - Name
      - Description
    * - ``PSI RAM``
      - Primary Signed Image
    * - ``EBL``
      - External Bootloader
    * - ``FLS``
      - Modem Software Image

PSI RAM and EBL are the RAM images which are injected to the device when the
device is in BOOT ROM stage. Once this is successful, the actual modem firmware
image is flashed to the device. The modem software image contains multiple files
each having one secure bin file and at least one Loadmap/Region file. For flashing
these files, appropriate commands are sent to the modem device along with the
data required for flashing. The data like region count and address of each region
has to be passed to the driver using the devlink param command.

If the device has to be fully erased before firmware flashing, user application
need to set the erase_full_flash parameter using devlink param command.
By default, conditional erase feature is supported.

Flash Commands:
===============
1) When modem is in Boot ROM stage, user can use below command to inject PSI RAM
image using devlink flash command.

$ devlink dev flash pci/0000:02:00.0 file <PSI_RAM_File_name> component PSI

2) If user want to do a full erase, below command need to be issued to set the
erase full flash param (To be set only if full erase required).

$ devlink dev param set pci/0000:02:00.0 name erase_full_flash value true cmode runtime

3) Inject EBL after the modem is in PSI stage.
$ devlink dev flash pci/0000:02:00.0 file <EBL_File_name> component EBL

4) Once EBL is injected successfully, then the actual firmware flashing takes
place. Below is the sequence of commands used for each of the firmware images.

a) Flash secure bin file.
$ devlink dev flash pci/0000:02:00.0 file <Secure_bin_file_name> component FLS

b) Flashing the Loadmap/Region file
$ devlink dev param set pci/0000:02:00.0 name region_count value 1 cmode runtime

$ devlink dev param set pci/0000:02:00.0 name download_region value true cmode runtime

$ devlink dev param set pci/0000:02:00.0 name address value <Nand_address> cmode runtime

$ devlink dev flash pci/0000:02:00.0 file <Load_map_file_name> component FLS

Regions
=======

The ``iosm`` driver supports dumping the coredump logs.

In case a firmware encounters an exception, a snapshot will be taken by the
driver. Following regions are accessed for device internal data.

.. list-table:: Regions implemented
    :widths: 15 85

    * - Name
      - Description
    * - ``report.json``
      - The summary of exception details logged as part of this region.
    * - ``coredump.fcd``
      - This region contains the details related to the exception occurred in the
        device (RAM dump).
    * - ``cdd.log``
      - This region contains the logs related to the modem CDD driver.
    * - ``eeprom.bin``
      - This region contains the eeprom logs.
    * - ``bootcore_trace.bin``
      -  This region contains the current instance of bootloader logs.
    * - ``bootcore_prev_trace.bin``
      - This region contains the previous instance of bootloader logs.


Region commands
===============

$ devlink region show

$ devlink region new pci/0000:02:00.0/report.json

$ devlink region dump pci/0000:02:00.0/report.json snapshot 0

$ devlink region del pci/0000:02:00.0/report.json snapshot 0

$ devlink region new pci/0000:02:00.0/coredump.fcd

$ devlink region dump pci/0000:02:00.0/coredump.fcd snapshot 1

$ devlink region del pci/0000:02:00.0/coredump.fcd snapshot 1

$ devlink region new pci/0000:02:00.0/cdd.log

$ devlink region dump pci/0000:02:00.0/cdd.log snapshot 2

$ devlink region del pci/0000:02:00.0/cdd.log snapshot 2

$ devlink region new pci/0000:02:00.0/eeprom.bin

$ devlink region dump pci/0000:02:00.0/eeprom.bin snapshot 3

$ devlink region del pci/0000:02:00.0/eeprom.bin snapshot 3

$ devlink region new pci/0000:02:00.0/bootcore_trace.bin

$ devlink region dump pci/0000:02:00.0/bootcore_trace.bin snapshot 4

$ devlink region del pci/0000:02:00.0/bootcore_trace.bin snapshot 4

$ devlink region new pci/0000:02:00.0/bootcore_prev_trace.bin

$ devlink region dump pci/0000:02:00.0/bootcore_prev_trace.bin snapshot 5

$ devlink region del pci/0000:02:00.0/bootcore_prev_trace.bin snapshot 5
+1 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ config RPMSG_WWAN_CTRL
config IOSM
	tristate "IOSM Driver for Intel M.2 WWAN Device"
	depends on INTEL_IOMMU
	select NET_DEVLINK
	help
	  This driver enables Intel M.2 WWAN Device communication.

+4 −1
Original line number Diff line number Diff line
@@ -18,6 +18,9 @@ iosm-y = \
	iosm_ipc_protocol.o		\
	iosm_ipc_protocol_ops.o	\
	iosm_ipc_mux.o			\
	iosm_ipc_mux_codec.o
	iosm_ipc_mux_codec.o		\
	iosm_ipc_devlink.o		\
	iosm_ipc_flash.o		\
	iosm_ipc_coredump.o

obj-$(CONFIG_IOSM) := iosm.o
+5 −1
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@
#include "iosm_ipc_chnl_cfg.h"

/* Max. sizes of a downlink buffers */
#define IPC_MEM_MAX_DL_FLASH_BUF_SIZE (16 * 1024)
#define IPC_MEM_MAX_DL_FLASH_BUF_SIZE (64 * 1024)
#define IPC_MEM_MAX_DL_LOOPBACK_SIZE (1 * 1024 * 1024)
#define IPC_MEM_MAX_DL_AT_BUF_SIZE 2048
#define IPC_MEM_MAX_DL_RPC_BUF_SIZE (32 * 1024)
@@ -60,6 +60,10 @@ static struct ipc_chnl_cfg modem_cfg[] = {
	{ IPC_MEM_CTRL_CHL_ID_6, IPC_MEM_PIPE_12, IPC_MEM_PIPE_13,
	  IPC_MEM_MAX_TDS_MBIM, IPC_MEM_MAX_TDS_MBIM,
	  IPC_MEM_MAX_DL_MBIM_BUF_SIZE, WWAN_PORT_MBIM },
	/* Flash Channel/Coredump Channel */
	{ IPC_MEM_CTRL_CHL_ID_7, IPC_MEM_PIPE_0, IPC_MEM_PIPE_1,
	  IPC_MEM_MAX_TDS_FLASH_UL, IPC_MEM_MAX_TDS_FLASH_DL,
	  IPC_MEM_MAX_DL_FLASH_BUF_SIZE, WWAN_PORT_UNKNOWN },
};

int ipc_chnl_cfg_get(struct ipc_chnl_cfg *chnl_cfg, int index)
Loading