[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(-)

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)