summaryrefslogtreecommitdiff
path: root/drivers/soc/qcom/peripheral-loader.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/soc/qcom/peripheral-loader.c')
-rw-r--r--drivers/soc/qcom/peripheral-loader.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c
index 3415338a1294..ace2bc4f30b6 100644
--- a/drivers/soc/qcom/peripheral-loader.c
+++ b/drivers/soc/qcom/peripheral-loader.c
@@ -39,6 +39,8 @@
#include <asm/uaccess.h>
#include <asm/setup.h>
#include <asm-generic/io-64-nonatomic-lo-hi.h>
+#define CREATE_TRACE_POINTS
+#include <trace/events/trace_msm_pil_event.h>
#include "peripheral-loader.h"
@@ -66,6 +68,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 +676,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 +712,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 +797,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 +807,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;
}
@@ -826,13 +837,16 @@ int pil_boot(struct pil_desc *desc)
goto release_fw;
}
+ trace_pil_event("before_init_image", desc);
if (desc->ops->init_image)
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;
}
+ trace_pil_event("before_mem_setup", desc);
if (desc->ops->mem_setup)
ret = desc->ops->mem_setup(desc, priv->region_start,
priv->region_end - priv->region_start);
@@ -848,6 +862,7 @@ int pil_boot(struct pil_desc *desc)
* Also for secure boot devices, modem memory has to be released
* after MBA is booted
*/
+ trace_pil_event("before_assign_mem", desc);
if (desc->modem_ssr) {
ret = pil_assign_mem_to_linux(desc, priv->region_start,
(priv->region_end - priv->region_start));
@@ -866,6 +881,7 @@ int pil_boot(struct pil_desc *desc)
hyp_assign = true;
}
+ trace_pil_event("before_load_seg", desc);
list_for_each_entry(seg, &desc->priv->segs, list) {
ret = pil_load_seg(desc, seg);
if (ret)
@@ -873,6 +889,7 @@ int pil_boot(struct pil_desc *desc)
}
if (desc->subsys_vmid > 0) {
+ trace_pil_event("before_reclaim_mem", desc);
ret = pil_reclaim_mem(desc, priv->region_start,
(priv->region_end - priv->region_start),
desc->subsys_vmid);
@@ -884,11 +901,14 @@ int pil_boot(struct pil_desc *desc)
hyp_assign = false;
}
+ trace_pil_event("before_auth_reset", 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;
}
+ trace_pil_event("reset_done", desc);
pil_info(desc, "Brought out of reset\n");
desc->modem_ssr = false;
err_auth_and_reset: