From: Sasha Levin <sashal@kernel.org>
To: patches@lists.linux.dev, stable@vger.kernel.org
Cc: Wentao Liang <vulab@iscas.ac.cn>,
Hans Verkuil <hverkuil@xs4all.nl>,
Sasha Levin <sashal@kernel.org>,
mchehab@kernel.org, krzk@kernel.org, linux-media@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH AUTOSEL 5.10 25/34] media: platform: exynos4-is: Add hardware sync wait to fimc_is_hw_change_mode()
Date: Sun, 1 Jun 2025 19:43:49 -0400 [thread overview]
Message-ID: <20250601234359.3518595-25-sashal@kernel.org> (raw)
In-Reply-To: <20250601234359.3518595-1-sashal@kernel.org>
From: Wentao Liang <vulab@iscas.ac.cn>
[ Upstream commit bd9f6ce7d512fa21249415c16af801a4ed5d97b6 ]
In fimc_is_hw_change_mode(), the function changes camera modes without
waiting for hardware completion, risking corrupted data or system hangs
if subsequent operations proceed before the hardware is ready.
Add fimc_is_hw_wait_intmsr0_intmsd0() after mode configuration, ensuring
hardware state synchronization and stable interrupt handling.
Signed-off-by: Wentao Liang <vulab@iscas.ac.cn>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
Based on my analysis of the commit and examination of the kernel code,
here is my assessment: **YES** This commit should be backported to
stable kernel trees for the following reasons: ## Analysis of the Code
Change The commit adds a single line
`fimc_is_hw_wait_intmsr0_intmsd0(is);` at line 167 in the
`fimc_is_hw_change_mode()` function in
`drivers/media/platform/samsung/exynos4-is/fimc-is-regs.c`. ## Why This
Should Be Backported 1. **Clear Bug Fix**: The commit message explicitly
states this fixes a race condition where "the function changes camera
modes without waiting for hardware completion, risking corrupted data or
system hangs if subsequent operations proceed before the hardware is
ready." This is a classic hardware synchronization bug. 2. **Consistent
Pattern**: Examining the surrounding code shows that ALL other similar
hardware control functions (`fimc_is_hw_get_setfile_addr()`,
`fimc_is_hw_load_setfile()`, `fimc_is_hw_stream_on()`,
`fimc_is_hw_stream_off()`) already call
`fimc_is_hw_wait_intmsr0_intmsd0()` before writing to hardware
registers. The `fimc_is_hw_change_mode()` function was the only outlier
missing this synchronization. 3. **Minimal and Safe**: The change is
extremely small (one line) and uses an existing, well-tested
synchronization primitive. The `fimc_is_hw_wait_intmsr0_intmsd0()`
function implements a timeout-based wait with proper error handling. 4.
**Critical Subsystem**: This affects camera hardware control in Samsung
Exynos4 SoCs. Hardware synchronization issues in camera drivers can
cause: - System hangs (as mentioned in commit message) - Data corruption
- Unpredictable hardware state 5. **Runtime Safety**: The wait function
has built-in timeout protection (2000 iterations with 1μs delay each),
so it cannot cause infinite hangs even if hardware fails. 6. **Follows
Hardware Protocol**: The pattern clearly shows the proper hardware
protocol is: wait for ready state → write command → trigger interrupt.
The missing wait was a protocol violation. ## Comparison with Historical
References Looking at the provided similar commits marked "NO" for
backporting, they were all: - Documentation/binding changes (commits #1,
#2) - Code cleanup/feature removal (commit #3) - Architecture changes
(commit #4) The one commit marked "YES" (commit #5) was a simple bug fix
correcting a return value check, very similar in nature to this
synchronization fix. This commit fits the stable tree criteria
perfectly: it's a small, contained bug fix addressing a real hardware
synchronization issue that could cause system instability, with minimal
risk of regression.
drivers/media/platform/exynos4-is/fimc-is-regs.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/media/platform/exynos4-is/fimc-is-regs.c b/drivers/media/platform/exynos4-is/fimc-is-regs.c
index 366e6393817d2..5f9c44e825a5f 100644
--- a/drivers/media/platform/exynos4-is/fimc-is-regs.c
+++ b/drivers/media/platform/exynos4-is/fimc-is-regs.c
@@ -164,6 +164,7 @@ int fimc_is_hw_change_mode(struct fimc_is *is)
if (WARN_ON(is->config_index >= ARRAY_SIZE(cmd)))
return -EINVAL;
+ fimc_is_hw_wait_intmsr0_intmsd0(is);
mcuctl_write(cmd[is->config_index], is, MCUCTL_REG_ISSR(0));
mcuctl_write(is->sensor_index, is, MCUCTL_REG_ISSR(1));
mcuctl_write(is->setfile.sub_index, is, MCUCTL_REG_ISSR(2));
--
2.39.5
next prev parent reply other threads:[~2025-06-01 23:44 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-01 23:43 [PATCH AUTOSEL 5.10 01/34] drm/amdgpu/gfx6: fix CSIB handling Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 02/34] sunrpc: update nextcheck time when adding new cache entries Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 03/34] drm/bridge: analogix_dp: Add irq flag IRQF_NO_AUTOEN instead of calling disable_irq() Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 04/34] exfat: fix double free in delayed_free Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 05/34] arm64/cpuinfo: only show one cpu's info in c_show() Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 06/34] drm/msm/hdmi: add runtime PM calls to DDC transfer function Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 07/34] media: uapi: v4l: Fix V4L2_TYPE_IS_OUTPUT condition Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 08/34] drm/amd/display: Add NULL pointer checks in dm_force_atomic_commit() Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 09/34] drm/msm/a6xx: Increase HFI response timeout Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 10/34] drm/amdgpu/gfx10: fix CSIB handling Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 11/34] media: uapi: v4l: Change V4L2_TYPE_IS_CAPTURE condition Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 12/34] drm/amdgpu/gfx7: fix CSIB handling Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 13/34] ext4: ext4: unify EXT4_EX_NOCACHE|NOFAIL flags in ext4_ext_remove_space() Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 14/34] jfs: fix array-index-out-of-bounds read in add_missing_indices Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 15/34] media: rkvdec: h264: Use bytesperline and buffer height as virstride Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 16/34] media: rkvdec: Initialize the m2m context before the controls Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 17/34] sunrpc: fix race in cache cleanup causing stale nextcheck time Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 18/34] ext4: prevent stale extent cache entries caused by concurrent get es_cache Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 19/34] drm/amdgpu/gfx8: fix CSIB handling Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 20/34] drm/amdgpu/gfx9: " Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 21/34] jfs: Fix null-ptr-deref in jfs_ioc_trim Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 22/34] drm/msm/dpu: don't select single flush for active CTL blocks Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 23/34] drm/amdkfd: Set SDMA_RLCx_IB_CNTL/SWITCH_INSIDE_IB Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 24/34] media: tc358743: ignore video while HPD is low Sasha Levin
2025-06-01 23:43 ` Sasha Levin [this message]
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 26/34] nios2: force update_mmu_cache on spurious tlb-permission--related pagefaults Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 27/34] PM: runtime: fix denying of auto suspend in pm_suspend_timer_fn() Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 28/34] thermal/drivers/qcom/tsens: Update conditions to strictly evaluate for IP v2+ Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 29/34] clocksource: Fix the CPUs' choice in the watchdog per CPU verification Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 30/34] ACPICA: Avoid sequence overread in call to strncmp() Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 31/34] ACPICA: utilities: Fix overflow check in vsnprintf() Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 32/34] cpufreq: Force sync policy boost with global boost on sysfs update Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 33/34] power: supply: bq27xxx: Retrieve again when busy Sasha Levin
2025-06-01 23:43 ` [PATCH AUTOSEL 5.10 34/34] ASoC: tas2770: Power cycle amp on ISENSE/VSENSE change Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250601234359.3518595-25-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=hverkuil@xs4all.nl \
--cc=krzk@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=patches@lists.linux.dev \
--cc=stable@vger.kernel.org \
--cc=vulab@iscas.ac.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®