disp: msm: add capability to dump limited debugbus info in logs

Add a flag SDE_DBG_DUMP_IN_LOG_LIMITED based on which the debug bus
registers dumped in log can be limited. In memory logging will continue
to dump the full range of configured registers if that flag is set.
Currently the in-log limited support is enabled  only for the sde/vbif
debugbus and both IN_LOG & IN_LOG_LIMITED will be treated the same way
for other blocks.

Change-Id: Ie85d3d16955cfa507bb3e02954d9b313851eef78
Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
Signed-off-by: Andhavarapu Karthik <kartkart@codeaurora.org>
This commit is contained in:
Veera Sundaram Sankaran 2021-02-17 09:55:11 -08:00 committed by Andhavarapu Karthik
parent 75fa44a8ab
commit b8a5bf949a
2 changed files with 81 additions and 3 deletions

View File

@ -190,6 +190,7 @@ struct sde_dbg_debug_bus_common {
u32 enable_mask;
bool include_in_deferred_work;
u32 entries_size;
u32 limited_entries_size;
u32 *dumped_content;
u32 content_idx;
u32 content_size;
@ -198,6 +199,7 @@ struct sde_dbg_debug_bus_common {
struct sde_dbg_sde_debug_bus {
struct sde_dbg_debug_bus_common cmn;
struct sde_debug_bus_entry *entries;
struct sde_debug_bus_entry *limited_entries;
u32 top_blk_off;
u32 (*read_tp)(void __iomem *mem_base, u32 wr_addr, u32 rd_addr, u32 block_id, u32 test_id);
void (*clear_tp)(void __iomem *mem_base, u32 wr_addr);
@ -327,6 +329,34 @@ static void _sde_debug_bus_ppb1_dump(u32 wr_addr, u32 block_id, u32 test_id, u32
SDE_DBG_LOG_DEBUGBUS("pp1", wr_addr, block_id, test_id, val);
}
static struct sde_debug_bus_entry dbg_bus_sde_limited[] = {
{ DBGBUS_SSPP0, DBGBUS_DSPP_STATUS, 0, 9, 0, 8 },
{ DBGBUS_SSPP0, DBGBUS_DSPP_STATUS, 20, 34, 0, 8 },
{ DBGBUS_SSPP0, DBGBUS_DSPP_STATUS, 60, 4, 0, 8 },
{ DBGBUS_SSPP0, DBGBUS_DSPP_STATUS, 70, 4, 0, 8 },
{ DBGBUS_SSPP1, DBGBUS_DSPP_STATUS, 0, 9, 0, 8 },
{ DBGBUS_SSPP1, DBGBUS_DSPP_STATUS, 20, 34, 0, 8 },
{ DBGBUS_SSPP1, DBGBUS_DSPP_STATUS, 60, 4, 0, 8 },
{ DBGBUS_SSPP1, DBGBUS_DSPP_STATUS, 70, 4, 0, 8 },
{ DBGBUS_DSPP, DBGBUS_DSPP_STATUS, 0, 1, 0, 8 },
{ DBGBUS_DSPP, DBGBUS_DSPP_STATUS, 9, 1, 0, 8 },
{ DBGBUS_DSPP, DBGBUS_DSPP_STATUS, 13, 2, 0, 8 },
{ DBGBUS_DSPP, DBGBUS_DSPP_STATUS, 19, 2, 0, 8 },
{ DBGBUS_DSPP, DBGBUS_DSPP_STATUS, 24, 2, 0, 8 },
{ DBGBUS_DSPP, DBGBUS_DSPP_STATUS, 31, 8, 0, 8 },
{ DBGBUS_DSPP, DBGBUS_DSPP_STATUS, 42, 12, 0, 8 },
{ DBGBUS_DSPP, DBGBUS_DSPP_STATUS, 54, 2, 0, 32 },
{ DBGBUS_DSPP, DBGBUS_DSPP_STATUS, 56, 2, 0, 8 },
{ DBGBUS_DSPP, DBGBUS_DSPP_STATUS, 63, 73, 0, 8 },
{ DBGBUS_PERIPH, DBGBUS_DSPP_STATUS, 0, 1, 0, 8 },
{ DBGBUS_PERIPH, DBGBUS_DSPP_STATUS, 47, 7, 0, 8 },
{ DBGBUS_PERIPH, DBGBUS_DSPP_STATUS, 60, 14, 0, 8 },
{ DBGBUS_PERIPH, DBGBUS_DSPP_STATUS, 80, 3, 0, 8 },
};
static struct sde_debug_bus_entry dbg_bus_sde[] = {
{ DBGBUS_SSPP0, DBGBUS_DSPP_STATUS, 0, 74, 0, 32 },
{ DBGBUS_SSPP1, DBGBUS_DSPP_STATUS, 0, 74, 0, 32 },
@ -362,6 +392,21 @@ static struct sde_debug_bus_entry dbg_bus_sde[] = {
{ DBGBUS_DSPP, DBGBUS_DSPP_STATUS, 124, 1, 7, 1, _sde_debug_bus_lm_dump }
};
static struct sde_debug_bus_entry vbif_dbg_bus_limited[] = {
{ MMSS_VBIF_TEST_BUS1_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 0, 2, 0, 12},
{ MMSS_VBIF_TEST_BUS1_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 4, 6, 0, 12},
{ MMSS_VBIF_TEST_BUS1_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 12, 2, 0, 12},
{ MMSS_VBIF_TEST_BUS2_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 0, 2, 0, 16},
{ MMSS_VBIF_TEST_BUS2_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 0, 2, 128, 208},
{ MMSS_VBIF_TEST_BUS2_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 4, 6, 0, 16},
{ MMSS_VBIF_TEST_BUS2_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 4, 6, 128, 208},
{ MMSS_VBIF_TEST_BUS2_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 12, 2, 0, 16},
{ MMSS_VBIF_TEST_BUS2_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 12, 2, 128, 208},
{ MMSS_VBIF_TEST_BUS2_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 16, 2, 0, 16},
{ MMSS_VBIF_TEST_BUS2_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 16, 2, 128, 208},
};
static struct sde_debug_bus_entry vbif_dbg_bus[] = {
{ MMSS_VBIF_TEST_BUS1_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 0, 15, 0, 512},
{ MMSS_VBIF_TEST_BUS2_CTRL0, MMSS_VBIF_TEST_BUS_OUT, 0, 18, 0, 512},
@ -425,7 +470,8 @@ static void _sde_dump_reg(const char *dump_name, u32 reg_dump_flag,
if (!len_bytes || !dump_mem)
return;
in_log = (reg_dump_flag & SDE_DBG_DUMP_IN_LOG);
in_log = (reg_dump_flag & SDE_DBG_DUMP_IN_LOG)
| (reg_dump_flag & SDE_DBG_DUMP_IN_LOG_LIMITED);
in_mem = (reg_dump_flag & SDE_DBG_DUMP_IN_MEM);
pr_debug("%s: reg_dump_flag=%d in_log=%d in_mem=%d\n",
@ -821,13 +867,37 @@ static void _sde_dbg_dump_vbif_err_info(void __iomem *mem_base)
}
}
static bool _is_dbg_bus_limited_valid(struct sde_dbg_sde_debug_bus *bus,
u32 wr_addr, u32 block_id, u32 test_id)
{
struct sde_debug_bus_entry *entry;
u32 block_id_max, test_id_max;
int i;
if (!bus->limited_entries || !bus->cmn.limited_entries_size)
return true;
for (i = 0; i < bus->cmn.limited_entries_size; i++) {
entry = bus->limited_entries + i;
block_id_max = entry->block_id + entry->block_id_max;
test_id_max = entry->test_id + entry->test_id_max;
if ((wr_addr == entry->wr_addr)
&& ((block_id >= entry->block_id) && (block_id < block_id_max))
&& ((test_id >= entry->test_id) && (test_id < test_id_max)))
return true;
}
return false;
}
static void _sde_dbg_dump_bus_entry(struct sde_dbg_sde_debug_bus *bus,
struct sde_debug_bus_entry *entries, u32 bus_size,
void __iomem *mem_base, u32 *dump_addr)
{
u32 status = 0;
int i, j, k;
bool in_mem, in_log;
bool in_mem, in_log, in_log_limited;
struct sde_debug_bus_entry *entry;
if (!bus->read_tp || !bus->clear_tp)
@ -835,6 +905,7 @@ static void _sde_dbg_dump_bus_entry(struct sde_dbg_sde_debug_bus *bus,
in_mem = (bus->cmn.enable_mask & SDE_DBG_DUMP_IN_MEM);
in_log = (bus->cmn.enable_mask & SDE_DBG_DUMP_IN_LOG);
in_log_limited = (bus->cmn.enable_mask & SDE_DBG_DUMP_IN_LOG_LIMITED);
for (k = 0; k < bus_size; k++) {
entry = entries + k;
@ -846,7 +917,9 @@ static void _sde_dbg_dump_bus_entry(struct sde_dbg_sde_debug_bus *bus,
status = bus->read_tp(mem_base, entry->wr_addr,
entry->rd_addr, i, j);
if (!entry->analyzer && in_log)
if (!entry->analyzer && (in_log || (in_log_limited &&
_is_dbg_bus_limited_valid(bus, entry->wr_addr, i, j))))
SDE_DBG_LOG_ENTRY(0, entry->wr_addr, i, j, status);
if (dump_addr && in_mem) {
@ -2220,6 +2293,8 @@ void sde_dbg_init_dbg_buses(u32 hwversion)
dbg->dbgbus_sde.entries = dbg_bus_sde;
dbg->dbgbus_sde.cmn.entries_size = ARRAY_SIZE(dbg_bus_sde);
dbg->dbgbus_sde.limited_entries = dbg_bus_sde_limited;
dbg->dbgbus_sde.cmn.limited_entries_size = ARRAY_SIZE(dbg_bus_sde_limited);
dbg->dbgbus_sde.cmn.name = DBGBUS_NAME_SDE;
dbg->dbgbus_sde.cmn.enable_mask = DEFAULT_DBGBUS_SDE;
dbg->dbgbus_sde.read_tp = _sde_dbg_sde_read_test_point;
@ -2227,6 +2302,8 @@ void sde_dbg_init_dbg_buses(u32 hwversion)
dbg->dbgbus_vbif_rt.entries = vbif_dbg_bus;
dbg->dbgbus_vbif_rt.cmn.entries_size = ARRAY_SIZE(vbif_dbg_bus);
dbg->dbgbus_vbif_rt.limited_entries = vbif_dbg_bus_limited;
dbg->dbgbus_vbif_rt.cmn.limited_entries_size = ARRAY_SIZE(vbif_dbg_bus_limited);
dbg->dbgbus_vbif_rt.cmn.name = DBGBUS_NAME_VBIF_RT;
dbg->dbgbus_vbif_rt.cmn.enable_mask = DEFAULT_DBGBUS_VBIFRT;
dbg->dbgbus_vbif_rt.read_tp = _sde_dbg_vbif_read_test_point;

View File

@ -43,6 +43,7 @@ enum sde_dbg_evtlog_flag {
enum sde_dbg_dump_flag {
SDE_DBG_DUMP_IN_LOG = BIT(0),
SDE_DBG_DUMP_IN_MEM = BIT(1),
SDE_DBG_DUMP_IN_LOG_LIMITED = BIT(2),
};
enum sde_dbg_dump_context {