From: Jiale Yao <yaojiale02@163.com>
To: Nas Chung <nas.chung@chipsnmedia.com>,
Jackson Lee <jackson.lee@chipsnmedia.com>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Nicolas Dufresne <nicolas.dufresne@collabora.com>,
Sebastian Fricke <sebastian.fricke@collabora.com>,
Hans Verkuil <hverkuil@kernel.org>,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: stable@vger.kernel.org
Subject: [PATCH v4 1/4] media: wave5: handle remaining decoder runtime resume failures
Date: Fri, 23 Oct 2026 17:28:00 +0800 [thread overview]
Message-ID: <20261023092804.673980-2-yaojiale02@163.com> (raw)
In-Reply-To: <20261023092804.673980-1-yaojiale02@163.com>
Several decoder callbacks continue into firmware commands after
pm_runtime_resume_and_get() fails. The runtime resume callback can fail
while enabling the VPU clocks, so those commands may access registers
while the device is unavailable. The matching runtime PM puts can also
be issued without a reference.
Check the remaining resume results. Propagate errors from callbacks that
can return them, complete buffers or jobs from void callbacks, and avoid
firmware access and unmatched puts on failure. If runtime resume fails in
device_run(), stop the instance, fail both queues, and return their queued
buffers so the mem2mem scheduler cannot repeatedly run the failed job.
Fixes: 2092b3833487 ("media: chips-media: wave5: Support runtime suspend/resume")
Fixes: cbb9c0d50e47 ("media: chips-media: wave5: Fix SError of kernel panic when closed")
Fixes: a52e6f7923c1 ("media: chips-media: wave5: Resume device before setting EOS flag")
Cc: stable@vger.kernel.org
Signed-off-by: Jiale Yao <yaojiale02@163.com>
---
.../chips-media/wave5/wave5-vpu-dec.c | 55 +++++++++++++++++--
1 file changed, 50 insertions(+), 5 deletions(-)
diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
index 86bc36ee17..0088501f93 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
@@ -829,7 +829,10 @@ static int wave5_vpu_dec_stop(struct vpu_instance *inst)
* accesses VPU registers via send_firmware_command(), so the
* device must be resumed first to avoid an asynchronous SError.
*/
- pm_runtime_resume_and_get(inst->dev->dev);
+ ret = pm_runtime_resume_and_get(inst->dev->dev);
+ if (ret < 0)
+ return ret;
+
ret = wave5_vpu_dec_set_eos_on_firmware(inst);
pm_runtime_put_autosuspend(inst->dev->dev);
if (ret)
@@ -1392,7 +1395,11 @@ static int wave5_vpu_dec_start_streaming(struct vb2_queue *q, unsigned int count
int ret = 0;
dev_dbg(inst->dev->dev, "%s: type: %u\n", __func__, q->type);
- pm_runtime_resume_and_get(inst->dev->dev);
+ ret = pm_runtime_resume_and_get(inst->dev->dev);
+ if (ret < 0) {
+ wave5_return_bufs(q, VB2_BUF_STATE_QUEUED);
+ return ret;
+ }
v4l2_m2m_update_start_streaming_state(m2m_ctx, q);
@@ -1556,9 +1563,28 @@ static void wave5_vpu_dec_stop_streaming(struct vb2_queue *q)
struct vpu_instance *inst = vb2_get_drv_priv(q);
struct v4l2_m2m_ctx *m2m_ctx = inst->v4l2_fh.m2m_ctx;
unsigned long timeout;
+ int ret;
dev_dbg(inst->dev->dev, "%s: type: %u\n", __func__, q->type);
- pm_runtime_resume_and_get(inst->dev->dev);
+ ret = pm_runtime_resume_and_get(inst->dev->dev);
+ if (ret < 0) {
+ if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+ struct vpu_src_buffer *vpu_buf;
+
+ inst->retry = false;
+ inst->queuing_num = 0;
+ while ((vpu_buf = inst_src_buf_remove(inst)) != NULL)
+ ;
+ inst->eos = false;
+ }
+
+ v4l2_m2m_update_stop_streaming_state(m2m_ctx, q);
+ wave5_return_bufs(q, VB2_BUF_STATE_ERROR);
+ inst->empty_queue = false;
+ inst->sent_eos = false;
+ return;
+ }
+
inst->empty_queue = true;
timeout = jiffies + msecs_to_jiffies(VPU_DEC_STOP_TIMEOUT);
@@ -1675,7 +1701,21 @@ static void wave5_vpu_dec_device_run(void *priv)
bool cmd_issued = false;
dev_dbg(inst->dev->dev, "%s: Fill the ring buffer with new bitstream data", __func__);
- pm_runtime_resume_and_get(inst->dev->dev);
+ ret = pm_runtime_resume_and_get(inst->dev->dev);
+ if (ret < 0) {
+ struct vb2_queue *src_vq = v4l2_m2m_get_src_vq(m2m_ctx);
+ struct vb2_queue *dst_vq = v4l2_m2m_get_dst_vq(m2m_ctx);
+
+ dev_err(inst->dev->dev, "Failed to resume VPU: %d\n", ret);
+ set_instance_state(inst, VPU_INST_STATE_STOP);
+ vb2_queue_error(src_vq);
+ vb2_queue_error(dst_vq);
+ wave5_return_bufs(src_vq, VB2_BUF_STATE_ERROR);
+ wave5_return_bufs(dst_vq, VB2_BUF_STATE_ERROR);
+ v4l2_m2m_job_finish(inst->v4l2_m2m_dev, m2m_ctx);
+ return;
+ }
+
if (!inst->retry) {
ret = fill_ringbuffer(inst);
if (ret < 0) {
@@ -1818,7 +1858,11 @@ static void wave5_vpu_dec_job_abort(void *priv)
* device must be resumed first; otherwise the register access faults
* with an asynchronous SError.
*/
- pm_runtime_resume_and_get(inst->dev->dev);
+ ret = pm_runtime_resume_and_get(inst->dev->dev);
+ if (ret < 0) {
+ dev_warn(inst->dev->dev, "Failed to resume VPU: %d\n", ret);
+ goto finish_job;
+ }
ret = wave5_vpu_dec_set_eos_on_firmware(inst);
if (ret)
@@ -1827,6 +1871,7 @@ static void wave5_vpu_dec_job_abort(void *priv)
pm_runtime_put_autosuspend(inst->dev->dev);
+finish_job:
v4l2_m2m_job_finish(inst->v4l2_m2m_dev, m2m_ctx);
}
--
2.34.1
next prev parent reply other threads:[~2026-10-23 9:28 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-23 9:27 [PATCH v4 0/4] media: wave5: fix runtime PM error handling Jiale Yao
2026-10-23 9:28 ` Jiale Yao [this message]
2026-10-23 9:28 ` [PATCH v4 2/4] media: wave5: use m2m buffer completion helper Jiale Yao
2026-10-23 9:28 ` [PATCH v4 3/4] media: wave5: handle encoder runtime resume failures Jiale Yao
2026-10-23 9:28 ` [PATCH v4 4/4] media: wave5: handle runtime resume failure when closing Jiale Yao
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=20261023092804.673980-2-yaojiale02@163.com \
--to=yaojiale02@163.com \
--cc=hverkuil@kernel.org \
--cc=jackson.lee@chipsnmedia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=nas.chung@chipsnmedia.com \
--cc=nicolas.dufresne@collabora.com \
--cc=sebastian.fricke@collabora.com \
--cc=stable@vger.kernel.org \
/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®