[v1,24/35] ipa: rkisp1: Ensure controls don't get lost
diff mbox series

Message ID 20251024085130.995967-25-stefan.klug@ideasonboard.com
State New
Headers show
Series
  • rkisp1: pipeline rework for PFC
Related show

Commit Message

Stefan Klug Oct. 24, 2025, 8:50 a.m. UTC
If a request too late for controls queuing because the frame context was
already initialised, store the controls and apply them on the next
request.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>

ipa: rkisp1: Store controls on when necessary

Store controls for later only when necessary. Add a proper log message for that condition.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
---
 src/ipa/rkisp1/rkisp1.cpp | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

Comments

Paul Elder Jan. 22, 2026, 9:17 a.m. UTC | #1
Quoting Stefan Klug (2025-10-24 17:50:48)
> If a request too late for controls queuing because the frame context was
> already initialised, store the controls and apply them on the next
> request.
> 
> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
> 
> ipa: rkisp1: Store controls on when necessary

Leftovers from squash? :)

> 
> Store controls for later only when necessary. Add a proper log message for that condition.
> 
> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>

The code looks good to me though.


Paul

> ---
>  src/ipa/rkisp1/rkisp1.cpp | 22 ++++++++++++++++++++--
>  1 file changed, 20 insertions(+), 2 deletions(-)
> 
> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> index 23d80bc43c5d..b714e2f10c65 100644
> --- a/src/ipa/rkisp1/rkisp1.cpp
> +++ b/src/ipa/rkisp1/rkisp1.cpp
> @@ -86,6 +86,7 @@ private:
>         std::map<unsigned int, MappedFrameBuffer> mappedBuffers_;
>  
>         ControlInfoMap sensorControls_;
> +       ControlList controlsToApply_;
>  
>         /* Local parameter storage */
>         struct IPAContext context_;
> @@ -343,16 +344,33 @@ void IPARkISP1::initializeFrameContext(const uint32_t frame,
>                                        IPAFrameContext &frameContext,
>                                        const ControlList &controls)
>  {
> -       if (frameContext.initialised)
> +       if (frameContext.initialised) {
> +               if (!controls.empty()) {
> +                       /* Too late to apply the controls. Store them for later. */
> +                       LOG(IPARkISP1, Warning)
> +                               << "Request underrun. Controls for frame "
> +                               << frame << " are delayed ";
> +                       controlsToApply_.merge(controls,
> +                                              ControlList::MergePolicy::OverwriteExisting);
> +               }
>                 return;
> +       }
> +
> +       const ControlList *controls2 = &controls;
> +       if (!controlsToApply_.empty()) {
> +               controlsToApply_.merge(controls, ControlList::MergePolicy::OverwriteExisting);
> +               controls2 = &controlsToApply_;
> +       }
>  
>         frameContext.initialised = true;
>         for (auto const &a : algorithms()) {
>                 Algorithm *algo = static_cast<Algorithm *>(a.get());
>                 if (algo->disabled_)
>                         continue;
> -               algo->queueRequest(context_, frame, frameContext, controls);
> +               algo->queueRequest(context_, frame, frameContext, *controls2);
>         }
> +
> +       controlsToApply_.clear();
>  }
>  
>  void IPARkISP1::computeParams(const uint32_t frame, const uint32_t bufferId)
> -- 
> 2.48.1
>

Patch
diff mbox series

diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index 23d80bc43c5d..b714e2f10c65 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -86,6 +86,7 @@  private:
 	std::map<unsigned int, MappedFrameBuffer> mappedBuffers_;
 
 	ControlInfoMap sensorControls_;
+	ControlList controlsToApply_;
 
 	/* Local parameter storage */
 	struct IPAContext context_;
@@ -343,16 +344,33 @@  void IPARkISP1::initializeFrameContext(const uint32_t frame,
 				       IPAFrameContext &frameContext,
 				       const ControlList &controls)
 {
-	if (frameContext.initialised)
+	if (frameContext.initialised) {
+		if (!controls.empty()) {
+			/* Too late to apply the controls. Store them for later. */
+			LOG(IPARkISP1, Warning)
+				<< "Request underrun. Controls for frame "
+				<< frame << " are delayed ";
+			controlsToApply_.merge(controls,
+					       ControlList::MergePolicy::OverwriteExisting);
+		}
 		return;
+	}
+
+	const ControlList *controls2 = &controls;
+	if (!controlsToApply_.empty()) {
+		controlsToApply_.merge(controls, ControlList::MergePolicy::OverwriteExisting);
+		controls2 = &controlsToApply_;
+	}
 
 	frameContext.initialised = true;
 	for (auto const &a : algorithms()) {
 		Algorithm *algo = static_cast<Algorithm *>(a.get());
 		if (algo->disabled_)
 			continue;
-		algo->queueRequest(context_, frame, frameContext, controls);
+		algo->queueRequest(context_, frame, frameContext, *controls2);
 	}
+
+	controlsToApply_.clear();
 }
 
 void IPARkISP1::computeParams(const uint32_t frame, const uint32_t bufferId)