diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 9a6e71514c90..72261d16e9f8 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -71,6 +71,7 @@ private:
 	IPU3CameraData *data_;
 
 	StreamConfiguration cio2Configuration_;
+	ImgUDevice::PipeConfig pipeConfig_;
 };
 
 class PipelineHandlerIPU3 : public PipelineHandler
@@ -179,6 +180,9 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
 
 	LOG(IPU3, Debug) << "CIO2 configuration: " << cio2Configuration_.toString();
 
+	ImgUDevice::Pipe pipe{};
+	pipe.input = cio2Configuration_.size;
+
 	/*
 	 * Adjust the configurations if needed and assign streams while
 	 * iterating them.
@@ -250,11 +254,13 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
 		    (oldCfg.size == yuvSize || outCount == 1)) {
 			cfg.setStream(&data_->outStream_);
 			mainOutputAvailable = false;
+			pipe.output = cfg.size;
 
 			LOG(IPU3, Debug) << "Assigned " << cfg.toString()
 					 << " to the main output";
 		} else {
 			cfg.setStream(&data_->vfStream_);
+			pipe.viewfinder = cfg.size;
 
 			LOG(IPU3, Debug) << "Assigned " << cfg.toString()
 					 << " to the viewfinder output";
@@ -269,6 +275,13 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
 		}
 	}
 
+	pipeConfig_ = data_->imgu_->calculatePipeConfig(&pipe);
+	if (pipeConfig_.isNull()) {
+		LOG(IPU3, Error) << "Failed to calculate pipe configuration: "
+				 << "unsupported resolutions.";
+		return Invalid;
+	}
+
 	return status;
 }
 
