• Jacob Keller's avatar
    ice: implement device flash update via devlink · d69ea414
    Jacob Keller authored
    Use the newly added pldmfw library to implement device flash update for
    the Intel ice networking device driver. This support uses the devlink
    flash update interface.
    
    The main parts of the flash include the Option ROM, the netlist module,
    and the main NVM data. The PLDM firmware file contains modules for each
    of these components.
    
    Using the pldmfw library, the provided firmware file will be scanned for
    the three major components, "fw.undi" for the Option ROM, "fw.mgmt" for
    the main NVM module containing the primary device firmware, and
    "fw.netlist" containing the netlist module.
    
    The flash is separated into two banks, the active bank containing the
    running firmware, and the inactive bank which we use for update. Each
    module is updated in a staged process. First, the inactive bank is
    erased, preparing the device for update. Second, the contents of the
    component are copied to the inactive portion of the flash. After all
    components are updated, the driver signals the device to switch the
    active bank during the next EMP reset (which would usually occur during
    the next reboot).
    
    Although the firmware AdminQ interface does report an immediate status
    for each command, the NVM erase and NVM write commands receive status
    asynchronously. The driver must not continue writing until previous
    erase and write commands have finished. The real status of the NVM
    commands is returned over the receive AdminQ. Implement a simple
    interface that uses a wait queue so that the main update thread can
    sleep until the completion status is reported by firmware. For erasing
    the inactive banks, this can take quite a while in practice.
    
    To help visualize the process to the devlink application and other
    applications based on the devlink netlink interface, status is reported
    via the devlink_flash_update_status_notify. While we do report status
    after each 4k block when writing, there is no real status we can report
    during erasing. We simply must wait for the complete module erasure to
    finish.
    
    With this implementation, basic flash update for the ice hardware is
    supported.
    Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    d69ea414
ice_main.c 176 KB