summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBhalchandra Gajare <gajare@codeaurora.org>2015-11-11 17:03:58 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:12:05 -0700
commit625bbd03d81b883ddfed360d92ed07edeeb1da89 (patch)
treef72318f7957d6bf3b0bcecad9ad229424f9e7a64
parentc4254bcb1985ccbd2719534ab63d7e0169ae3063 (diff)
ASoC: wcd_cpe_core: Fix address and size for ramdumps
Since the underlying codec can have different memory map, it is possible the starting offset and size for DRAM can be different as well. This causes the collected dumps to be incorrect on some platforms. Fix the ramdump collection to obtain DRAM offset and size from CPE services which is aware of the codec being used. CRs-fixed: 929517 Change-Id: I6a592d8f97da117d1e58154460cd0b8f3cbf62c7 Signed-off-by: Bhalchandra Gajare <gajare@codeaurora.org>
-rw-r--r--sound/soc/codecs/wcd_cpe_core.c38
-rw-r--r--sound/soc/codecs/wcd_cpe_core.h10
2 files changed, 39 insertions, 9 deletions
diff --git a/sound/soc/codecs/wcd_cpe_core.c b/sound/soc/codecs/wcd_cpe_core.c
index 0ec42cc28843..ad34e8cd13af 100644
--- a/sound/soc/codecs/wcd_cpe_core.c
+++ b/sound/soc/codecs/wcd_cpe_core.c
@@ -37,8 +37,6 @@
#define CMI_CMD_TIMEOUT (10 * HZ)
#define WCD_CPE_LSM_MAX_SESSIONS 1
#define WCD_CPE_AFE_MAX_PORTS 4
-#define WCD_CPE_DRAM_SIZE 0x30000
-#define WCD_CPE_DRAM_OFFSET 0x50000
#define AFE_SVC_EXPLICIT_PORT_START 1
#define ELF_FLAG_EXECUTE (1 << 0)
@@ -203,9 +201,17 @@ static int wcd_cpe_collect_ramdump(struct wcd_cpe_core *core)
struct cpe_svc_mem_segment dump_seg;
int rc;
+ if (!core->cpe_ramdump_dev || !core->cpe_dump_v_addr ||
+ core->hw_info.dram_size == 0) {
+ dev_err(core->dev,
+ "%s: Ramdump devices not set up, size = %zu\n",
+ __func__, core->hw_info.dram_size);
+ return -EINVAL;
+ }
+
dump_seg.type = CPE_SVC_DATA_MEM;
- dump_seg.cpe_addr = WCD_CPE_DRAM_OFFSET;
- dump_seg.size = WCD_CPE_DRAM_SIZE;
+ dump_seg.cpe_addr = core->hw_info.dram_offset;
+ dump_seg.size = core->hw_info.dram_size;
dump_seg.data = core->cpe_dump_v_addr;
dev_dbg(core->dev,
@@ -225,7 +231,7 @@ static int wcd_cpe_collect_ramdump(struct wcd_cpe_core *core)
__func__);
core->cpe_ramdump_seg.address = (unsigned long) core->cpe_dump_addr;
- core->cpe_ramdump_seg.size = WCD_CPE_DRAM_SIZE;
+ core->cpe_ramdump_seg.size = core->hw_info.dram_size;
core->cpe_ramdump_seg.v_address = core->cpe_dump_v_addr;
rc = do_ramdump(core->cpe_ramdump_dev,
@@ -1882,6 +1888,7 @@ struct wcd_cpe_core *wcd_cpe_init(const char *img_fname,
char proc_name[WCD_CPE_STATE_MAX_LEN];
const char *cpe_name = "cpe";
const char *state_name = "_state";
+ const struct cpe_svc_hw_cfg *hw_info;
int id = 0;
if (wcd_cpe_validate_params(codec, params))
@@ -1995,6 +2002,19 @@ struct wcd_cpe_core *wcd_cpe_init(const char *img_fname,
wcd_cpe_sysfs_init(core, id);
+ hw_info = cpe_svc_get_hw_cfg(core->cpe_handle);
+ if (!hw_info) {
+ dev_err(core->dev,
+ "%s: hw info not available\n",
+ __func__);
+ goto schedule_dload_work;
+ } else {
+ core->hw_info.dram_offset = hw_info->DRAM_offset;
+ core->hw_info.dram_size = hw_info->DRAM_size;
+ core->hw_info.iram_offset = hw_info->IRAM_offset;
+ core->hw_info.iram_size = hw_info->IRAM_size;
+ }
+
/* Setup the ramdump device and buffer */
core->cpe_ramdump_dev = create_ramdump_device("cpe",
core->dev);
@@ -2006,16 +2026,16 @@ struct wcd_cpe_core *wcd_cpe_init(const char *img_fname,
}
core->cpe_dump_v_addr = dma_alloc_coherent(core->dev,
- WCD_CPE_DRAM_SIZE,
+ core->hw_info.dram_size,
&core->cpe_dump_addr,
GFP_KERNEL);
if (!core->cpe_dump_v_addr) {
dev_err(core->dev,
- "%s: Failed to alloc memory for cpe dump, size = %d\n",
- __func__, WCD_CPE_DRAM_SIZE);
+ "%s: Failed to alloc memory for cpe dump, size = %zd\n",
+ __func__, core->hw_info.dram_size);
goto schedule_dload_work;
} else {
- memset(core->cpe_dump_v_addr, 0, WCD_CPE_DRAM_SIZE);
+ memset(core->cpe_dump_v_addr, 0, core->hw_info.dram_size);
}
schedule_dload_work:
diff --git a/sound/soc/codecs/wcd_cpe_core.h b/sound/soc/codecs/wcd_cpe_core.h
index bd7b4841fabd..77027d58b178 100644
--- a/sound/soc/codecs/wcd_cpe_core.h
+++ b/sound/soc/codecs/wcd_cpe_core.h
@@ -101,6 +101,13 @@ struct wcd_cpe_irq_info {
u8 cpe_fatal_irqs;
};
+struct wcd_cpe_hw_info {
+ u32 dram_offset;
+ size_t dram_size;
+ u32 iram_offset;
+ size_t iram_size;
+};
+
struct wcd_cpe_core {
/* handle to cpe services */
void *cpe_handle;
@@ -189,6 +196,9 @@ struct wcd_cpe_core {
/* Reference count for cpe clk*/
int cpe_clk_ref;
+
+ /* codec based hardware info */
+ struct wcd_cpe_hw_info hw_info;
};
struct wcd_cpe_params {