Message ID | 20190724045141.27703-3-skalluru@marvell.com |
---|---|
State | Changes Requested |
Delegated to: | David Miller |
Headers | show |
Series | qed: Support for NVM config attributes. | expand |
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. Also can you please clarify how the user reads/write from/to NVM config ? i mean what UAPIs and tools are being used ? > Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com> > Signed-off-by: Ariel Elior <aelior@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, > }; >
> -----Original Message----- > From: Saeed Mahameed <saeedm@mellanox.com> > Sent: Thursday, July 25, 2019 1:13 AM > To: Sudarsana Reddy Kalluru <skalluru@marvell.com>; > davem@davemloft.net > Cc: Ariel Elior <aelior@marvell.com>; Michal Kalderon > <mkalderon@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 <skalluru@marvell.com> > > Signed-off-by: Ariel Elior <aelior@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, > > }; > >
On Thu, 2019-07-25 at 00:48 +0000, Sudarsana Reddy Kalluru wrote: > > > > > -----Original Message----- > > From: Saeed Mahameed <saeedm@mellanox.com> > > Sent: Thursday, July 25, 2019 1:13 AM > > To: Sudarsana Reddy Kalluru <skalluru@marvell.com>; > > davem@davemloft.net > > Cc: Ariel Elior <aelior@marvell.com>; Michal Kalderon > > <mkalderon@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() > I see, thanks for the clarification.
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, };