lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <adc04ee0-4a75-71a5-ef67-a2851265e6e9@amd.com>
Date:   Mon, 10 Apr 2023 15:59:30 -0700
From:   Shannon Nelson <shannon.nelson@....com>
To:     Simon Horman <simon.horman@...igine.com>
Cc:     brett.creeley@....com, davem@...emloft.net, netdev@...r.kernel.org,
        kuba@...nel.org, drivers@...sando.io, leon@...nel.org,
        jiri@...nulli.us
Subject: Re: [PATCH v9 net-next 07/14] pds_core: add FW update feature to
 devlink

On 4/10/23 8:44 AM, Simon Horman wrote:
> 
> On Thu, Apr 06, 2023 at 04:41:36PM -0700, Shannon Nelson wrote:
>> Add in the support for doing firmware updates.  Of the two
>> main banks available, a and b, this updates the one not in
>> use and then selects it for the next boot.
>>
>> Example:
>>      devlink dev flash pci/0000:b2:00.0 \
>>            file pensando/dsc_fw_1.63.0-22.tar
>>
>> Signed-off-by: Shannon Nelson <shannon.nelson@....com>
> 
> Hi Shannon,
> 
> some minor feedback from my side.

Thanks, I'll take care of these.
sln


> 
> ...
> 
>> diff --git a/Documentation/networking/device_drivers/ethernet/amd/pds_core.rst b/Documentation/networking/device_drivers/ethernet/amd/pds_core.rst
>> index 265d948a8c02..6faf46390f5f 100644
>> --- a/Documentation/networking/device_drivers/ethernet/amd/pds_core.rst
>> +++ b/Documentation/networking/device_drivers/ethernet/amd/pds_core.rst
>> @@ -73,6 +73,16 @@ The ``pds_core`` driver reports the following versions
>>        - fixed
>>        - The revision of the ASIC for this device
>>
>> +Firmware Management
>> +===================
>> +
>> +The ``flash`` command can update a the DSC firmware.  The downloaded firmware
>> +will be saved into either of firmware bank 1 or bank 2, whichever is not
>> +currrently in use, and that bank will used for the next boot::
> 
> nit: s/currrently/currently/



> 
> ...
> 
>> diff --git a/drivers/net/ethernet/amd/pds_core/fw.c b/drivers/net/ethernet/amd/pds_core/fw.c
> 
> ...
> 
>> +int pdsc_firmware_update(struct pdsc *pdsc, const struct firmware *fw,
>> +                      struct netlink_ext_ack *extack)
>> +{
>> +     u32 buf_sz, copy_sz, offset;
>> +     struct devlink *dl;
>> +     int next_interval;
>> +     u64 data_addr;
>> +     int err = 0;
>> +     u8 fw_slot;
>> +
>> +     dev_info(pdsc->dev, "Installing firmware\n");
>> +
>> +     dl = priv_to_devlink(pdsc);
>> +     devlink_flash_update_status_notify(dl, "Preparing to flash",
>> +                                        NULL, 0, 0);
>> +
>> +     buf_sz = sizeof(pdsc->cmd_regs->data);
>> +
>> +     dev_dbg(pdsc->dev,
>> +             "downloading firmware - size %d part_sz %d nparts %lu\n",
>> +             (int)fw->size, buf_sz, DIV_ROUND_UP(fw->size, buf_sz));
>> +
>> +     offset = 0;
>> +     next_interval = 0;
>> +     data_addr = offsetof(struct pds_core_dev_cmd_regs, data);
>> +     while (offset < fw->size) {
>> +             if (offset >= next_interval) {
>> +                     devlink_flash_update_status_notify(dl, "Downloading",
>> +                                                        NULL, offset,
>> +                                                        fw->size);
>> +                     next_interval = offset +
>> +                                     (fw->size / PDSC_FW_INTERVAL_FRACTION);
>> +             }
>> +
>> +             copy_sz = min_t(unsigned int, buf_sz, fw->size - offset);
>> +             mutex_lock(&pdsc->devcmd_lock);
>> +             memcpy_toio(&pdsc->cmd_regs->data, fw->data + offset, copy_sz);
>> +             err = pdsc_devcmd_fw_download_locked(pdsc, data_addr,
>> +                                                  offset, copy_sz);
>> +             mutex_unlock(&pdsc->devcmd_lock);
>> +             if (err) {
>> +                     dev_err(pdsc->dev,
>> +                             "download failed offset 0x%x addr 0x%llx len 0x%x: %pe\n",
>> +                             offset, data_addr, copy_sz, ERR_PTR(err));
>> +                     NL_SET_ERR_MSG_MOD(extack, "Segment download failed");
>> +                     goto err_out;
>> +             }
>> +             offset += copy_sz;
>> +     }
>> +     devlink_flash_update_status_notify(dl, "Downloading", NULL,
>> +                                        fw->size, fw->size);
>> +
>> +     devlink_flash_update_timeout_notify(dl, "Installing", NULL,
>> +                                         PDSC_FW_INSTALL_TIMEOUT);
>> +
>> +     fw_slot = pdsc_devcmd_fw_install(pdsc);
>> +     if (fw_slot < 0) {
> 
> The type of fs_slot is u8.
> But the return type of pdsc_devcmd_fw_install is int,
> (I think) it can return negative error values,
> and that case is checked on the line above.
> 
> Perhaps the type of fw_slot should be int?
> 
> Flagged by Coccinelle as:
> 
> drivers/net/ethernet/amd/pds_core/fw.c:154:5-12: WARNING: Unsigned expression compared with zero: fw_slot < 0
> 
> And Smatch as:
> 
> drivers/net/ethernet/amd/pds_core/fw.c:154 pdsc_firmware_update() warn: impossible condition '(fw_slot < 0) => (0-255 < 0)'
> 
>> +             err = fw_slot;
>> +             dev_err(pdsc->dev, "install failed: %pe\n", ERR_PTR(err));
>> +             NL_SET_ERR_MSG_MOD(extack, "Failed to start firmware install");
>> +             goto err_out;
>> +     }
> 
> ...
> 
> --
> You received this message because you are subscribed to the Google Groups "Pensando Drivers" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to drivers+unsubscribe@...sando.io.
> To view this discussion on the web visit https://groups.google.com/a/pensando.io/d/msgid/drivers/ZDQuxBlfH5foSEFA%40corigine.com.

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ