diff options
Diffstat (limited to 'drivers/soc/qcom/peripheral-loader.c')
| -rw-r--r-- | drivers/soc/qcom/peripheral-loader.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index 3415338a1294..ed8006cacc08 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -66,6 +66,7 @@ static int proxy_timeout_ms = -1; module_param(proxy_timeout_ms, int, S_IRUGO | S_IWUSR); static bool disable_timeouts; +static const char firmware_error_msg[] = "firmware_error\n"; /** * struct pil_mdt - Representation of <name>.mdt file in memory * @hdr: ELF32 header @@ -673,12 +674,14 @@ static int pil_load_seg(struct pil_desc *desc, struct pil_seg *seg) if (ret < 0) { pil_err(desc, "Failed to locate blob %s or blob is too big(rc:%d)\n", fw_name, ret); + subsys_set_error(desc->subsys_dev, firmware_error_msg); return ret; } if (ret != seg->filesz) { pil_err(desc, "Blob size %u doesn't match %lu\n", ret, seg->filesz); + subsys_set_error(desc->subsys_dev, firmware_error_msg); return -EPERM; } ret = 0; @@ -707,9 +710,11 @@ static int pil_load_seg(struct pil_desc *desc, struct pil_seg *seg) if (desc->ops->verify_blob) { ret = desc->ops->verify_blob(desc, seg->paddr, seg->sz); - if (ret) + if (ret) { pil_err(desc, "Blob%u failed verification(rc:%d)\n", num, ret); + subsys_set_error(desc->subsys_dev, firmware_error_msg); + } } return ret; @@ -790,6 +795,7 @@ int pil_boot(struct pil_desc *desc) if (fw->size < sizeof(*ehdr)) { pil_err(desc, "Not big enough to be an elf header\n"); + subsys_set_error(desc->subsys_dev, firmware_error_msg); ret = -EIO; goto release_fw; } @@ -799,18 +805,21 @@ int pil_boot(struct pil_desc *desc) if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG)) { pil_err(desc, "Not an elf header\n"); + subsys_set_error(desc->subsys_dev, firmware_error_msg); ret = -EIO; goto release_fw; } if (ehdr->e_phnum == 0) { pil_err(desc, "No loadable segments\n"); + subsys_set_error(desc->subsys_dev, firmware_error_msg); ret = -EIO; goto release_fw; } if (sizeof(struct elf32_phdr) * ehdr->e_phnum + sizeof(struct elf32_hdr) > fw->size) { pil_err(desc, "Program headers not within mdt\n"); + subsys_set_error(desc->subsys_dev, firmware_error_msg); ret = -EIO; goto release_fw; } @@ -830,6 +839,7 @@ int pil_boot(struct pil_desc *desc) ret = desc->ops->init_image(desc, fw->data, fw->size); if (ret) { pil_err(desc, "Initializing image failed(rc:%d)\n", ret); + subsys_set_error(desc->subsys_dev, firmware_error_msg); goto err_boot; } @@ -887,6 +897,7 @@ int pil_boot(struct pil_desc *desc) ret = desc->ops->auth_and_reset(desc); if (ret) { pil_err(desc, "Failed to bring out of reset(rc:%d)\n", ret); + subsys_set_error(desc->subsys_dev, firmware_error_msg); goto err_auth_and_reset; } pil_info(desc, "Brought out of reset\n"); |
