From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E9FB63368AB for ; Thu, 9 Apr 2026 20:15:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.11 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775765717; cv=none; b=iICCoyJxALH5HfeMEZutB+0WaCI7498brFLvzGtEX146D3WYT8LWFxvxKK9Xq4mAHEFCTqrIQVYG7wjgP7ednHq3U85dNU8Y0jo3GOTz8r84MKHJM77ghDrwuj/r45xXy+Ap5mAHQEgUt4qYryGdNlt/g18YOLIr/qKGFfkKHG4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775765717; c=relaxed/simple; bh=mh8GWOTVHWR164mnbRolvsiRel3N3/ci6+THyTN+P+g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IrMG57KE+lLLTK6S2jyUGNSfUu9ubAQJOLJ83CvAKO0uqx43tfS0mfC827VTTCYhy5zW+rAtZ14GFvPGglJ4qewGs6vC61ImM56YjKEe5eH9EwKRkxmu2977zi4nkasoHYwjqdUTVsUZh3uPfWfxD7cDnsyT+upuA3tkdQPZP6s= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=aX1AgJbz; arc=none smtp.client-ip=192.198.163.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="aX1AgJbz" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1775765716; x=1807301716; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=mh8GWOTVHWR164mnbRolvsiRel3N3/ci6+THyTN+P+g=; b=aX1AgJbz/wwZNVl1itPFDJbzXTjj8OfjzXUTwA2bqonBCo5+4rYLIbj0 +3GR7VEPw6QTHvO8edPa+1CMGYceQssQMrkGmXGwqAG9qIayJMA/v965K 8CQIDqSUYmt38BPeyNjfMU1LZP4BJUyEvosgfuIBrTQa2T16q0V2nPbC4 hepBPRG3W5OJXoBa8EHzcF7fkqEhMgBgYvs6ksTMHHPGhDOv5pzF3iZqa OR9Uwm2s96PCnFtZWQ9io851IYof2lQRjgudLn/J8Bkawu3Fzsnttg2EE B+6Ih+X4Awph/cmPN28n/rjmLJVJLJuwTiA9bZSMvvz1JsyqKAUkFvc/q w==; X-CSE-ConnectionGUID: zjRmI+jmQUSBxwxIHDENRQ== X-CSE-MsgGUID: 6PWeALbhSBmFDf2Id/L4hA== X-IronPort-AV: E=McAfee;i="6800,10657,11754"; a="87408780" X-IronPort-AV: E=Sophos;i="6.23,170,1770624000"; d="scan'208";a="87408780" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Apr 2026 13:15:10 -0700 X-CSE-ConnectionGUID: 0YDbZJlFSTufdlO1xXqj/Q== X-CSE-MsgGUID: eeiGQZINTOGC1vZWqvxRng== X-ExtLoop1: 1 Received: from dalessan-mobl3.ger.corp.intel.com (HELO kekkonen.fi.intel.com) ([10.245.244.29]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Apr 2026 13:15:03 -0700 Received: from punajuuri.localdomain (unknown [192.168.240.130]) by kekkonen.fi.intel.com (Postfix) with ESMTP id 4F834121FEE; Thu, 09 Apr 2026 23:15:03 +0300 (EEST) Received: from sailus by punajuuri.localdomain with local (Exim 4.98.2) (envelope-from ) id 1wAvmI-000000045po-3HyA; Thu, 09 Apr 2026 23:15:02 +0300 Organization: Intel Finland Oy - BIC 0357606-4 - c/o Alberga Business Park, 6 krs, Bertel Jungin Aukio 5, 02600 Espoo From: Sakari Ailus To: linux-media@vger.kernel.org Cc: hans@jjverkuil.nl, laurent.pinchart@ideasonboard.com, Prabhakar , Kate Hsuan , Dave Stevenson , Tommaso Merciai , Benjamin Mugnier , Sylvain Petinot , Christophe JAILLET , Julien Massot , Naushir Patuck , Stefan Klug , Mirela Rabulea , =?UTF-8?q?Andr=C3=A9=20Apitzsch?= , Heimir Thor Sverrisson , Kieran Bingham , Mehdi Djait , Ricardo Ribalda Delgado , Hans de Goede , Jacopo Mondi , Tomi Valkeinen , David Plowman , "Yu, Ong Hock" , "Ng, Khai Wen" , Jai Luthra , Rishikesh Donadkar Subject: [PATCH v12 74/86] media: ipu6: Start streaming once all queues have started, stop when not Date: Thu, 9 Apr 2026 23:14:49 +0300 Message-ID: <20260409201501.975242-75-sakari.ailus@linux.intel.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260409201501.975242-1-sakari.ailus@linux.intel.com> References: <20260409201501.975242-1-sakari.ailus@linux.intel.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Start streaming once all buffer queues connected via enabled routes have been set streaming, similarly stop when the first queue is stopped. Signed-off-by: Sakari Ailus --- drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 45 +++++++++++++++++++ .../media/pci/intel/ipu6/ipu6-isys-queue.c | 7 +-- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c index 04825cdce7c0..8deafe38be5d 100644 --- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -347,6 +348,42 @@ static int ipu6_isys_csi2_set_stream(struct v4l2_subdev *sd, return ret; } +static bool ipu6_isys_csi2_streaming_change(struct ipu6_isys_subdev *asd, + struct v4l2_subdev_state *state, + u32 pad, bool enable) +{ + u32 streams_enabled = 0, nodes_streaming = 0; + struct v4l2_subdev_route *route; + + for_each_active_route(&state->routing, route) { + struct media_pad *video_pad = + media_pad_remote_pad_unique(&asd->sd.entity.pads[route->source_pad]); + struct ipu6_isys_video *av = !video_pad ? NULL : + container_of_const(video_pad, + struct ipu6_isys_video, pad); + + if (!av) { + dev_dbg(asd->sd.dev, + "can't find source pad for \"%s\":%u\n", + asd->sd.entity.name, route->source_pad); + return false; + } + + streams_enabled++; + if (av->streaming || (enable && pad == route->source_pad)) + nodes_streaming++; + } + + if (streams_enabled == nodes_streaming) { + dev_dbg(asd->sd.dev, + "changing streaming state to %s on \"%s\":%u\n", + str_enabled_disabled(enable), asd->sd.entity.name, pad); + return true; + } + + return false; +} + static int ipu6_isys_csi2_enable_streams(struct v4l2_subdev *sd, struct v4l2_subdev_state *state, u32 pad, u64 streams_mask) @@ -364,6 +401,9 @@ static int ipu6_isys_csi2_enable_streams(struct v4l2_subdev *sd, list_add(&av->csi2_entry, &csi2->av_head); + if (!ipu6_isys_csi2_streaming_change(asd, state, pad, true)) + return 0; + ret = ipu6_isys_start_stream_firmware(av); if (ret) { dev_err(sd->dev, "start stream of firmware failed\n"); @@ -409,6 +449,7 @@ static int ipu6_isys_csi2_disable_streams(struct v4l2_subdev *sd, struct v4l2_subdev_state *state, u32 pad, u64 streams_mask) { + struct ipu6_isys_subdev *asd = to_ipu6_isys_subdev(sd); struct media_pad *remote_pad, *vdev_pad = media_pad_remote_pad_unique(&sd->entity.pads[pad]); struct ipu6_isys_video *av = @@ -416,6 +457,9 @@ static int ipu6_isys_csi2_disable_streams(struct v4l2_subdev *sd, struct v4l2_subdev *remote_sd; u64 sink_streams; + if (!ipu6_isys_csi2_streaming_change(asd, state, pad, false)) + goto out_del_csi2_entry; + sink_streams = v4l2_subdev_state_xlate_streams(state, pad, CSI2_PAD_SINK, &streams_mask); @@ -431,6 +475,7 @@ static int ipu6_isys_csi2_disable_streams(struct v4l2_subdev *sd, ipu6_isys_close_streaming_firmware(av); +out_del_csi2_entry: list_del(&av->csi2_entry); return 0; diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c index 13d759b27ca0..7df13d330667 100644 --- a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c @@ -585,14 +585,10 @@ static int start_streaming(struct vb2_queue *q, unsigned int count) ipu6_isys_configure_stream_watermark(av, source_pad->entity); ipu6_isys_update_stream_watermark(av, true); - if (stream->nr_streaming != stream->nr_queues) - goto out; - ret = ipu6_isys_stream_start(av); if (ret) goto out_stream_start; -out: mutex_unlock(&stream->mutex); return 0; @@ -626,8 +622,7 @@ static void stop_streaming(struct vb2_queue *q) ipu6_isys_update_stream_watermark(av, false); mutex_lock(&av->isys->stream_mutex); - if (stream->nr_streaming == stream->nr_queues) - ipu6_isys_video_set_streaming(av, 0); + ipu6_isys_video_set_streaming(av, 0); list_del(&aq->node); mutex_unlock(&av->isys->stream_mutex); -- 2.47.3