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

Commit 68475922 authored by Krishna Manikandan's avatar Krishna Manikandan
Browse files

disp: msm: sde: avoid using spinlock for register log



Add support to use atomic variable instead of
spinlock for register logs during register
write. In the current architecture, register
writes are serialised and happen in commit
context.

Change-Id: I2a0b8ae404c94807ef06141867ee427909498ebf
Signed-off-by: default avatarKrishna Manikandan <mkrishn@codeaurora.org>
parent 85453402
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
 */

#ifndef SDE_DBG_H_
@@ -156,11 +156,10 @@ struct sde_dbg_reglog {
	u32 first;
	u32 last;
	u32 last_dump;
	u32 curr;
	atomic64_t curr;
	u32 next;
	u32 enable;
	u32 enable_mask;
	spinlock_t spin_lock;
};

extern struct sde_dbg_reglog *sde_dbg_base_reglog;
+5 −10
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
 */

#define pr_fmt(fmt)	"sde_dbg:[%s] " fmt, __func__
@@ -103,27 +103,22 @@ void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line,

void sde_reglog_log(u8 blk_id, u32 val, u32 addr)
{
	unsigned long flags;
	struct sde_dbg_reglog_log *log;
	struct sde_dbg_reglog *reglog = sde_dbg_base_reglog;
	int index;

	if (!reglog)
		return;

	spin_lock_irqsave(&reglog->spin_lock, flags);

	log = &reglog->logs[reglog->curr];
	index = abs(atomic64_inc_return(&reglog->curr) % SDE_REGLOG_ENTRY);

	log = &reglog->logs[index];
	log->blk_id = blk_id;
	log->val = val;
	log->addr = addr;
	log->time = local_clock();
	log->pid = current->pid;

	reglog->curr = (reglog->curr + 1) % SDE_REGLOG_ENTRY;
	reglog->last++;

	spin_unlock_irqrestore(&reglog->spin_lock, flags);
}

/* always dump the last entries which are not dumped yet */
@@ -244,7 +239,7 @@ struct sde_dbg_reglog *sde_reglog_init(void)
	if (!reglog)
		return ERR_PTR(-ENOMEM);

	spin_lock_init(&reglog->spin_lock);
	atomic64_set(&reglog->curr, 0);

	return reglog;
}