> -----Original Message----- > From: Saeed Mahameed <sae...@mellanox.com> > Sent: Thursday, July 25, 2019 1:13 AM > To: Sudarsana Reddy Kalluru <skall...@marvell.com>; > da...@davemloft.net > Cc: Ariel Elior <ael...@marvell.com>; Michal Kalderon > <mkalde...@marvell.com>; netdev@vger.kernel.org > Subject: [EXT] Re: [PATCH net-next 2/2] qed: Add API for flashing the nvm > attributes. > > External Email > > ---------------------------------------------------------------------- > On Tue, 2019-07-23 at 21:51 -0700, Sudarsana Reddy Kalluru wrote: > > The patch adds driver interface for reading the NVM config request and > > update the attributes on nvm config flash partition. > > > > You didn't not use the get_cfg API you added in previous patch. Thanks for your review. Will move this API to the next patch series which will plan to send shortly.
> > Also can you please clarify how the user reads/write from/to NVM config > ? i mean what UAPIs and tools are being used ? NVM config/partition will be updated using ethtool flash update command (i.e., ethtool -f) just like the update of other flash partitions of qed device. Example code path, ethool-flash_device --> qede_flash_device() --> qed_nvm_flash() --> qed_nvm_flash_cfg_write() > > > Signed-off-by: Sudarsana Reddy Kalluru <skall...@marvell.com> > > Signed-off-by: Ariel Elior <ael...@marvell.com> > > --- > > drivers/net/ethernet/qlogic/qed/qed_main.c | 65 > > ++++++++++++++++++++++++++++++ > > include/linux/qed/qed_if.h | 1 + > > 2 files changed, 66 insertions(+) > > > > diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c > > b/drivers/net/ethernet/qlogic/qed/qed_main.c > > index 829dd60..54f00d2 100644 > > --- a/drivers/net/ethernet/qlogic/qed/qed_main.c > > +++ b/drivers/net/ethernet/qlogic/qed/qed_main.c > > @@ -67,6 +67,8 @@ > > #define QED_ROCE_QPS (8192) > > #define QED_ROCE_DPIS (8) > > #define QED_RDMA_SRQS QED_ROCE_QPS > > +#define QED_NVM_CFG_SET_FLAGS 0xE > > +#define QED_NVM_CFG_SET_PF_FLAGS 0x1E > > > > static char version[] = > > "QLogic FastLinQ 4xxxx Core Module qed " DRV_MODULE_VERSION > > "\n"; > > @@ -2227,6 +2229,66 @@ static int qed_nvm_flash_image_validate(struct > > qed_dev *cdev, > > return 0; > > } > > > > +/* Binary file format - > > + * /---------------------------------------------------------- > > ------------\ > > + * 0B | 0x5 [command > > index] | > > + * 4B | Entity ID | Reserved | Number of config > > attributes | > > + * 8B | Config ID | Length | > > Value | > > + > > * | > > | > > + * \---------------------------------------------------------- > > ------------/ > > + * There can be several Cfg_id-Length-Value sets as specified by > > 'Number of...'. > > + * Entity ID - A non zero entity value for which the config need to > > be updated. > > + */ > > +static int qed_nvm_flash_cfg_write(struct qed_dev *cdev, const u8 > > **data) > > +{ > > + struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); > > + u8 entity_id, len, buf[32]; > > + struct qed_ptt *ptt; > > + u16 cfg_id, count; > > + int rc = 0, i; > > + u32 flags; > > + > > + ptt = qed_ptt_acquire(hwfn); > > + if (!ptt) > > + return -EAGAIN; > > + > > + /* NVM CFG ID attribute header */ > > + *data += 4; > > + entity_id = **data; > > + *data += 2; > > + count = *((u16 *)*data); > > + *data += 2; > > + > > + DP_VERBOSE(cdev, NETIF_MSG_DRV, > > + "Read config ids: entity id %02x num _attrs = > > %0d\n", > > + entity_id, count); > > + /* NVM CFG ID attributes */ > > + for (i = 0; i < count; i++) { > > + cfg_id = *((u16 *)*data); > > + *data += 2; > > + len = **data; > > + (*data)++; > > + memcpy(buf, *data, len); > > + *data += len; > > + > > + flags = entity_id ? QED_NVM_CFG_SET_PF_FLAGS : > > + QED_NVM_CFG_SET_FLAGS; > > + > > + DP_VERBOSE(cdev, NETIF_MSG_DRV, > > + "cfg_id = %d len = %d\n", cfg_id, len); > > + rc = qed_mcp_nvm_set_cfg(hwfn, ptt, cfg_id, entity_id, > > flags, > > + buf, len); > > + if (rc) { > > + DP_ERR(cdev, "Error %d configuring %d\n", rc, > > cfg_id); > > + break; > > + } > > + } > > + > > + qed_ptt_release(hwfn, ptt); > > + > > + return rc; > > +} > > + > > static int qed_nvm_flash(struct qed_dev *cdev, const char *name) > > { > > const struct firmware *image; > > @@ -2268,6 +2330,9 @@ static int qed_nvm_flash(struct qed_dev *cdev, > > const char *name) > > rc = qed_nvm_flash_image_access(cdev, &data, > > &check_resp); > > break; > > + case QED_NVM_FLASH_CMD_NVM_CFG_ID: > > + rc = qed_nvm_flash_cfg_write(cdev, &data); > > + break; > > default: > > DP_ERR(cdev, "Unknown command %08x\n", > > cmd_type); > > rc = -EINVAL; > > diff --git a/include/linux/qed/qed_if.h b/include/linux/qed/qed_if.h > > index eef02e6..23805ea 100644 > > --- a/include/linux/qed/qed_if.h > > +++ b/include/linux/qed/qed_if.h > > @@ -804,6 +804,7 @@ enum qed_nvm_flash_cmd { > > QED_NVM_FLASH_CMD_FILE_DATA = 0x2, > > QED_NVM_FLASH_CMD_FILE_START = 0x3, > > QED_NVM_FLASH_CMD_NVM_CHANGE = 0x4, > > + QED_NVM_FLASH_CMD_NVM_CFG_ID = 0x5, > > QED_NVM_FLASH_CMD_NVM_MAX, > > }; > >