Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6d002d7 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/sde: avoid vbif and wb register dumps in secure mode"

parents 3ded0418 32a097fa
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -580,6 +580,9 @@ static int _sde_encoder_phys_cmd_handle_ppdone_timeout(

		SDE_EVT32(DRMID(phys_enc->parent), SDE_EVTLOG_FATAL);
		sde_encoder_helper_unregister_irq(phys_enc, INTR_IDX_RDPTR);
		if (sde_kms_is_secure_session_inprogress(phys_enc->sde_kms))
			SDE_DBG_DUMP("secure");
		else
			SDE_DBG_DUMP("all", "dbg_bus", "vbif_dbg_bus");
		sde_encoder_helper_register_irq(phys_enc, INTR_IDX_RDPTR);
	}
+55 −13
Original line number Diff line number Diff line
@@ -236,6 +236,7 @@ static struct sde_dbg_base {
	struct sde_dbg_vbif_debug_bus dbgbus_vbif_rt;
	struct sde_dbg_dsi_debug_bus dbgbus_dsi;
	bool dump_all;
	bool dump_secure;
	bool dsi_dbg_bus;
	u32 debugfs_ctrl;

@@ -3521,13 +3522,32 @@ static int _sde_dump_reg_range_cmp(void *priv, struct list_head *a,
	return ar->offset.start - br->offset.start;
}

static const char *const exclude_modules[] = {
	"vbif_rt",
	"vbif_nrt",
	"wb_2",
	NULL
};

static bool is_block_exclude(char **modules, char *name)
{
	char **ptr = modules;

	while (*ptr != NULL) {
		if (!strcmp(name, *ptr))
			return true;
		++ptr;
	}
	return false;
}

/**
 * _sde_dump_reg_by_ranges - dump ranges or full range of the register blk base
 * @dbg: register blk base structure
 * @reg_dump_flag: dump target, memory, kernel log, or both
 */
static void _sde_dump_reg_by_ranges(struct sde_dbg_reg_base *dbg,
	u32 reg_dump_flag)
	u32 reg_dump_flag, bool dump_secure)
{
	char *addr;
	size_t len;
@@ -3550,6 +3570,12 @@ static void _sde_dump_reg_by_ranges(struct sde_dbg_reg_base *dbg,
			len = _sde_dbg_get_dump_range(&range_node->offset,
				dbg->max_offset);
			addr = dbg->base + range_node->offset.start;

			if (dump_secure &&
				is_block_exclude((char **)exclude_modules,
				range_node->range_name))
				continue;

			pr_debug("%s: range_base=0x%pK start=0x%x end=0x%x\n",
				range_node->range_name,
				addr, range_node->offset.start,
@@ -3576,7 +3602,7 @@ static void _sde_dump_reg_by_ranges(struct sde_dbg_reg_base *dbg,
 * _sde_dump_reg_by_blk - dump a named register base region
 * @blk_name: register blk name
 */
static void _sde_dump_reg_by_blk(const char *blk_name)
static void _sde_dump_reg_by_blk(const char *blk_name, bool dump_secure)
{
	struct sde_dbg_base *dbg_base = &sde_dbg_base;
	struct sde_dbg_reg_base *blk_base;
@@ -3588,7 +3614,7 @@ static void _sde_dump_reg_by_blk(const char *blk_name)
		if (strlen(blk_base->name) &&
			!strcmp(blk_base->name, blk_name)) {
			_sde_dump_reg_by_ranges(blk_base,
				dbg_base->enable_reg_dump);
				dbg_base->enable_reg_dump, dump_secure);
			break;
		}
	}
@@ -3597,7 +3623,7 @@ static void _sde_dump_reg_by_blk(const char *blk_name)
/**
 * _sde_dump_reg_all - dump all register regions
 */
static void _sde_dump_reg_all(void)
static void _sde_dump_reg_all(bool dump_secure)
{
	struct sde_dbg_base *dbg_base = &sde_dbg_base;
	struct sde_dbg_reg_base *blk_base;
@@ -3605,9 +3631,18 @@ static void _sde_dump_reg_all(void)
	if (!dbg_base)
		return;

	list_for_each_entry(blk_base, &dbg_base->reg_base_list, reg_base_head)
		if (strlen(blk_base->name))
			_sde_dump_reg_by_blk(blk_base->name);
	list_for_each_entry(blk_base, &dbg_base->reg_base_list, reg_base_head) {

		if (!strlen(blk_base->name))
			continue;

		if (dump_secure &&
			is_block_exclude((char **)exclude_modules,
			blk_base->name))
			continue;

		_sde_dump_reg_by_blk(blk_base->name, dump_secure);
	}
}

/**
@@ -3915,7 +3950,7 @@ static void _sde_dbg_dump_vbif_dbg_bus(struct sde_dbg_vbif_debug_bus *bus)
 */
static void _sde_dump_array(struct sde_dbg_reg_base *blk_arr[],
	u32 len, bool do_panic, const char *name, bool dump_dbgbus_sde,
	bool dump_dbgbus_vbif_rt, bool dump_all)
	bool dump_dbgbus_vbif_rt, bool dump_all, bool dump_secure)
{
	int i;

@@ -3925,12 +3960,13 @@ static void _sde_dump_array(struct sde_dbg_reg_base *blk_arr[],
		sde_evtlog_dump_all(sde_dbg_base.evtlog);

	if (dump_all || !blk_arr || !len) {
		_sde_dump_reg_all();
		_sde_dump_reg_all(dump_secure);
	} else {
		for (i = 0; i < len; i++) {
			if (blk_arr[i] != NULL)
				_sde_dump_reg_by_ranges(blk_arr[i],
					sde_dbg_base.enable_reg_dump);
					sde_dbg_base.enable_reg_dump,
					dump_secure);
		}
	}

@@ -3961,7 +3997,8 @@ static void _sde_dump_work(struct work_struct *work)
		sde_dbg_base.work_panic, "evtlog_workitem",
		sde_dbg_base.dbgbus_sde.cmn.include_in_deferred_work,
		sde_dbg_base.dbgbus_vbif_rt.cmn.include_in_deferred_work,
		sde_dbg_base.dump_all);
		sde_dbg_base.dump_all,
		sde_dbg_base.dump_secure);
}

void sde_dbg_dump(bool queue_work, const char *name, ...)
@@ -3971,6 +4008,7 @@ void sde_dbg_dump(bool queue_work, const char *name, ...)
	bool dump_dbgbus_sde = false;
	bool dump_dbgbus_vbif_rt = false;
	bool dump_all = false;
	bool dump_secure = false;
	va_list args;
	char *blk_name = NULL;
	struct sde_dbg_reg_base *blk_base = NULL;
@@ -4025,6 +4063,9 @@ void sde_dbg_dump(bool queue_work, const char *name, ...)

		if (!strcmp(blk_name, "panic"))
			do_panic = true;

		if (!strcmp(blk_name, "secure"))
			dump_secure = true;
	}
	va_end(args);

@@ -4039,7 +4080,8 @@ void sde_dbg_dump(bool queue_work, const char *name, ...)
		schedule_work(&sde_dbg_base.dump_work);
	} else {
		_sde_dump_array(blk_arr, blk_len, do_panic, name,
				dump_dbgbus_sde, dump_dbgbus_vbif_rt, dump_all);
				dump_dbgbus_sde, dump_dbgbus_vbif_rt, dump_all,
				dump_secure);
	}
}

@@ -4159,7 +4201,7 @@ static ssize_t sde_evtlog_dump_write(struct file *file,
	const char __user *user_buf, size_t count, loff_t *ppos)
{
	_sde_dump_array(NULL, 0, sde_dbg_base.panic_on_err, "dump_debugfs",
		true, true, true);
		true, true, true, false);

	return count;
}