mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-10 06:09:23 -04:00
disp: msm: dsi: Fix potential data race in ctrl isr
Use atomic operations for shared variables to ensure safe concurrent access from both ISR and task context. Change-Id: I72a235007f0b36553f436a900a3e9a91afcd75a4 Signed-off-by: Arpit Saini <arpisain@qti.qualcomm.com>
This commit is contained in:
parent
d52214b6e3
commit
13fa1e2401
2 changed files with 20 additions and 9 deletions
|
|
@ -1,7 +1,7 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#include <linux/of_device.h>
|
||||
|
|
@ -229,10 +229,10 @@ static ssize_t debugfs_line_count_read(struct file *file,
|
|||
dsi_ctrl->cmd_trigger_frame);
|
||||
len += scnprintf((buf + len), max_len - len,
|
||||
"Command successful at line: %04x\n",
|
||||
dsi_ctrl->cmd_success_line);
|
||||
atomic_read(&dsi_ctrl->cmd_success_line));
|
||||
len += scnprintf((buf + len), max_len - len,
|
||||
"Command successful at frame: %04x\n",
|
||||
dsi_ctrl->cmd_success_frame);
|
||||
atomic_read(&dsi_ctrl->cmd_success_frame));
|
||||
|
||||
mutex_unlock(&dsi_ctrl->ctrl_lock);
|
||||
|
||||
|
|
@ -2889,14 +2889,20 @@ static irqreturn_t dsi_ctrl_isr(int irq, void *ptr)
|
|||
|
||||
if (status & DSI_CMD_MODE_DMA_DONE) {
|
||||
if (dsi_ctrl->enable_cmd_dma_stats) {
|
||||
u32 reg = dsi_ctrl->hw.ops.log_line_count(&dsi_ctrl->hw,
|
||||
dsi_ctrl->cmd_mode);
|
||||
dsi_ctrl->cmd_success_line = (reg & 0xFFFF);
|
||||
dsi_ctrl->cmd_success_frame = ((reg >> 16) & 0xFFFF);
|
||||
if (dsi_ctrl->hw.ops.log_line_count[dsi_ctrl->disp_op])
|
||||
reg =
|
||||
dsi_ctrl->hw.ops.log_line_count[dsi_ctrl->disp_op](&dsi_ctrl->hw,
|
||||
dsi_ctrl->cmd_mode);
|
||||
else
|
||||
reg = 0;
|
||||
atomic_set(&dsi_ctrl->cmd_success_line, (reg & 0xFFFF));
|
||||
atomic_set(&dsi_ctrl->cmd_success_frame, ((reg >> 16) & 0xFFFF));
|
||||
SDE_EVT32(dsi_ctrl->cell_index, SDE_EVTLOG_FUNC_CASE1,
|
||||
dsi_ctrl->cmd_success_line,
|
||||
dsi_ctrl->cmd_success_frame);
|
||||
}
|
||||
|
||||
atomic64_set(&dsi_ctrl->cmd_success_ts, ktime_get());
|
||||
atomic_set(&dsi_ctrl->dma_irq_trig, 1);
|
||||
dsi_ctrl_disable_status_interrupt(dsi_ctrl,
|
||||
DSI_SINT_CMD_MODE_DMA_DONE);
|
||||
|
|
@ -3481,6 +3487,7 @@ int dsi_ctrl_cmd_transfer(struct dsi_ctrl *dsi_ctrl,
|
|||
rc);
|
||||
}
|
||||
|
||||
cmd->ts = atomic64_read(&dsi_ctrl->cmd_success_ts);
|
||||
dsi_ctrl_update_state(dsi_ctrl, DSI_CTRL_OP_CMD_TX, 0x0);
|
||||
|
||||
error:
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
* Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
|
|
@ -309,8 +310,11 @@ struct dsi_ctrl {
|
|||
bool cmd_mode;
|
||||
u32 cmd_trigger_line;
|
||||
u32 cmd_trigger_frame;
|
||||
u32 cmd_success_line;
|
||||
u32 cmd_success_frame;
|
||||
atomic_t cmd_success_line;
|
||||
atomic_t cmd_success_frame;
|
||||
u32 cmd_engine_refcount;
|
||||
u32 pending_cmd_flags;
|
||||
atomic64_t cmd_success_ts;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in a new issue