|
|
@@ -592,6 +592,9 @@ int qed_mcp_nvm_wr_cmd(struct qed_hwfn *p_hwfn,
|
|
|
*o_mcp_resp = mb_params.mcp_resp;
|
|
|
*o_mcp_param = mb_params.mcp_param;
|
|
|
|
|
|
+ /* nvm_info needs to be updated */
|
|
|
+ p_hwfn->nvm_info.valid = false;
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -2555,11 +2558,14 @@ int qed_mcp_bist_nvm_get_image_att(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
int qed_mcp_nvm_info_populate(struct qed_hwfn *p_hwfn)
|
|
|
{
|
|
|
- struct qed_nvm_image_info *nvm_info = &p_hwfn->nvm_info;
|
|
|
+ struct qed_nvm_image_info nvm_info;
|
|
|
struct qed_ptt *p_ptt;
|
|
|
int rc;
|
|
|
u32 i;
|
|
|
|
|
|
+ if (p_hwfn->nvm_info.valid)
|
|
|
+ return 0;
|
|
|
+
|
|
|
p_ptt = qed_ptt_acquire(p_hwfn);
|
|
|
if (!p_ptt) {
|
|
|
DP_ERR(p_hwfn, "failed to acquire ptt\n");
|
|
|
@@ -2567,29 +2573,29 @@ int qed_mcp_nvm_info_populate(struct qed_hwfn *p_hwfn)
|
|
|
}
|
|
|
|
|
|
/* Acquire from MFW the amount of available images */
|
|
|
- nvm_info->num_images = 0;
|
|
|
+ nvm_info.num_images = 0;
|
|
|
rc = qed_mcp_bist_nvm_get_num_images(p_hwfn,
|
|
|
- p_ptt, &nvm_info->num_images);
|
|
|
+ p_ptt, &nvm_info.num_images);
|
|
|
if (rc == -EOPNOTSUPP) {
|
|
|
DP_INFO(p_hwfn, "DRV_MSG_CODE_BIST_TEST is not supported\n");
|
|
|
goto out;
|
|
|
- } else if (rc || !nvm_info->num_images) {
|
|
|
+ } else if (rc || !nvm_info.num_images) {
|
|
|
DP_ERR(p_hwfn, "Failed getting number of images\n");
|
|
|
goto err0;
|
|
|
}
|
|
|
|
|
|
- nvm_info->image_att = kmalloc_array(nvm_info->num_images,
|
|
|
- sizeof(struct bist_nvm_image_att),
|
|
|
- GFP_KERNEL);
|
|
|
- if (!nvm_info->image_att) {
|
|
|
+ nvm_info.image_att = kmalloc_array(nvm_info.num_images,
|
|
|
+ sizeof(struct bist_nvm_image_att),
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!nvm_info.image_att) {
|
|
|
rc = -ENOMEM;
|
|
|
goto err0;
|
|
|
}
|
|
|
|
|
|
/* Iterate over images and get their attributes */
|
|
|
- for (i = 0; i < nvm_info->num_images; i++) {
|
|
|
+ for (i = 0; i < nvm_info.num_images; i++) {
|
|
|
rc = qed_mcp_bist_nvm_get_image_att(p_hwfn, p_ptt,
|
|
|
- &nvm_info->image_att[i], i);
|
|
|
+ &nvm_info.image_att[i], i);
|
|
|
if (rc) {
|
|
|
DP_ERR(p_hwfn,
|
|
|
"Failed getting image index %d attributes\n", i);
|
|
|
@@ -2597,14 +2603,22 @@ int qed_mcp_nvm_info_populate(struct qed_hwfn *p_hwfn)
|
|
|
}
|
|
|
|
|
|
DP_VERBOSE(p_hwfn, QED_MSG_SP, "image index %d, size %x\n", i,
|
|
|
- nvm_info->image_att[i].len);
|
|
|
+ nvm_info.image_att[i].len);
|
|
|
}
|
|
|
out:
|
|
|
+ /* Update hwfn's nvm_info */
|
|
|
+ if (nvm_info.num_images) {
|
|
|
+ p_hwfn->nvm_info.num_images = nvm_info.num_images;
|
|
|
+ kfree(p_hwfn->nvm_info.image_att);
|
|
|
+ p_hwfn->nvm_info.image_att = nvm_info.image_att;
|
|
|
+ p_hwfn->nvm_info.valid = true;
|
|
|
+ }
|
|
|
+
|
|
|
qed_ptt_release(p_hwfn, p_ptt);
|
|
|
return 0;
|
|
|
|
|
|
err1:
|
|
|
- kfree(nvm_info->image_att);
|
|
|
+ kfree(nvm_info.image_att);
|
|
|
err0:
|
|
|
qed_ptt_release(p_hwfn, p_ptt);
|
|
|
return rc;
|
|
|
@@ -2641,6 +2655,7 @@ qed_mcp_get_nvm_image_att(struct qed_hwfn *p_hwfn,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+ qed_mcp_nvm_info_populate(p_hwfn);
|
|
|
for (i = 0; i < p_hwfn->nvm_info.num_images; i++)
|
|
|
if (type == p_hwfn->nvm_info.image_att[i].image_type)
|
|
|
break;
|