summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/hwtracing/coresight/coresight-etm4x.c39
-rw-r--r--drivers/hwtracing/coresight/coresight-etm4x.h3
2 files changed, 42 insertions, 0 deletions
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c b/drivers/hwtracing/coresight/coresight-etm4x.c
index 0773a9757649..bb9c934dc951 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x.c
+++ b/drivers/hwtracing/coresight/coresight-etm4x.c
@@ -2548,6 +2548,41 @@ static void etm4_init_default_data(struct etmv4_drvdata *drvdata)
drvdata->trcid = 0x1 + drvdata->cpu;
}
+static int etm4_set_reg_dump(struct etmv4_drvdata *drvdata)
+{
+ int ret;
+ void *baddr;
+ struct amba_device *adev;
+ struct resource *res;
+ struct device *dev = drvdata->dev;
+ struct msm_dump_entry dump_entry;
+ uint32_t size;
+
+ adev = to_amba_device(dev);
+ if (!adev)
+ return -EINVAL;
+
+ res = &adev->res;
+ size = resource_size(res);
+
+ baddr = devm_kzalloc(dev, size, GFP_KERNEL);
+ if (!baddr)
+ return -ENOMEM;
+
+ drvdata->reg_data.addr = virt_to_phys(baddr);
+ drvdata->reg_data.len = size;
+
+ dump_entry.id = MSM_DUMP_DATA_ETM_REG + drvdata->cpu;
+ dump_entry.addr = virt_to_phys(&drvdata->reg_data);
+
+ ret = msm_dump_data_register(MSM_DUMP_TABLE_APPS,
+ &dump_entry);
+ if (ret)
+ devm_kfree(dev, baddr);
+
+ return ret;
+}
+
static int etm4_late_init(struct etmv4_drvdata *drvdata)
{
int ret;
@@ -2559,6 +2594,10 @@ static int etm4_late_init(struct etmv4_drvdata *drvdata)
etm4_init_default_data(drvdata);
+ ret = etm4_set_reg_dump(drvdata);
+ if (ret)
+ dev_err(dev, "ETM REG dump setup failed. ret %d\n", ret);
+
desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
if (!desc)
return -ENOMEM;
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h
index c4ce5febe94a..f920793daa80 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x.h
+++ b/drivers/hwtracing/coresight/coresight-etm4x.h
@@ -16,6 +16,7 @@
#include <linux/spinlock.h>
#include <linux/mutex.h>
#include "coresight-priv.h"
+#include <soc/qcom/memory_dump.h>
/*
* Device registers:
@@ -283,6 +284,7 @@
* @ns_ex_level:In non-secure state, indicates whether instruction tracing is
* supported for the corresponding Exception level.
* @ext_inp: External input selection.
+ * @reg_data: MSM memory dump data
*/
struct etmv4_drvdata {
void __iomem *base;
@@ -371,6 +373,7 @@ struct etmv4_drvdata {
u8 s_ex_level;
u8 ns_ex_level;
u32 ext_inp;
+ struct msm_dump_data reg_data;
};
/* Address comparator access types */