diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
index 9a2def64..40b626ed 100644
--- a/src/ipa/ipu3/ipu3.cpp
+++ b/src/ipa/ipu3/ipu3.cpp
@@ -67,11 +67,7 @@ private:
 	/* Camera sensor controls. */
 	uint32_t defVBlank_;
 	uint32_t exposure_;
-	uint32_t minExposure_;
-	uint32_t maxExposure_;
 	uint32_t gain_;
-	uint32_t minGain_;
-	uint32_t maxGain_;
 
 	/* Interface to the AWB algorithm */
 	std::unique_ptr<IPU3Awb> awbAlgo_;
@@ -187,13 +183,9 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo)
 		return -EINVAL;
 	}
 
-	minExposure_ = std::max(itExp->second.min().get<int32_t>(), 1);
-	maxExposure_ = itExp->second.max().get<int32_t>();
-	exposure_ = minExposure_;
+	exposure_ = itExp->second.def().get<int32_t>();
 
-	minGain_ = std::max(itGain->second.min().get<int32_t>(), 1);
-	maxGain_ = itGain->second.max().get<int32_t>();
-	gain_ = minGain_;
+	gain_ = itGain->second.def().get<int32_t>();
 
 	defVBlank_ = itVBlank->second.def().get<int32_t>();
 
@@ -205,7 +197,7 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo)
 	awbAlgo_->initialise(params_, configInfo.bdsOutputSize, bdsGrid_);
 
 	agcAlgo_ = std::make_unique<IPU3Agc>();
-	agcAlgo_->initialise(bdsGrid_, sensorInfo_);
+	agcAlgo_->initialise(bdsGrid_, configInfo);
 
 	return 0;
 }
diff --git a/src/ipa/ipu3/ipu3_agc.cpp b/src/ipa/ipu3/ipu3_agc.cpp
index 6253ab94..042d67fa 100644
--- a/src/ipa/ipu3/ipu3_agc.cpp
+++ b/src/ipa/ipu3/ipu3_agc.cpp
@@ -10,10 +10,12 @@
 #include <algorithm>
 #include <cmath>
 #include <numeric>
+#include <stdint.h>
 
-#include <libcamera/base/log.h>
+#include <linux/v4l2-controls.h>
 
-#include <libcamera/ipa/core_ipa_interface.h>
+#include <libcamera/base/log.h>
+#include <libcamera/base/utils.h>
 
 #include "libipa/histogram.h"
 
@@ -59,12 +61,28 @@ IPU3Agc::IPU3Agc()
 {
 }
 
-void IPU3Agc::initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo)
+void IPU3Agc::initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPAConfigInfo &configInfo)
 {
 	aeGrid_ = bdsGrid;
+	ctrls_ = configInfo.entityControls.at(0);
 
-	lineDuration_ = sensorInfo.lineLength * 1.0s / sensorInfo.pixelRate;
-	maxExposureTime_ = kMaxExposure * lineDuration_;
+	const auto itExp = ctrls_.find(V4L2_CID_EXPOSURE);
+	if (itExp == ctrls_.end()) {
+		LOG(IPU3Agc, Debug) << "Can't find exposure control";
+		return;
+	}
+	minExposure_ = itExp->second.min().get<int32_t>();
+	maxExposure_ = itExp->second.max().get<int32_t>();
+	lineDuration_ = configInfo.sensorInfo.lineLength * 1.0s / configInfo.sensorInfo.pixelRate;
+	maxExposureTime_ = maxExposure_ * lineDuration_;
+
+	const auto itGain = ctrls_.find(V4L2_CID_ANALOGUE_GAIN);
+	if (itGain == ctrls_.end()) {
+		LOG(IPU3Agc, Debug) << "Can't find gain control";
+		return;
+	}
+	minGain_ = std::max(itGain->second.min().get<int32_t>(), 1);
+	maxGain_ = itGain->second.max().get<int32_t>();
 }
 
 void IPU3Agc::processBrightness(const ipu3_uapi_stats_3a *stats)
diff --git a/src/ipa/ipu3/ipu3_agc.h b/src/ipa/ipu3/ipu3_agc.h
index 774c8385..ce43c534 100644
--- a/src/ipa/ipu3/ipu3_agc.h
+++ b/src/ipa/ipu3/ipu3_agc.h
@@ -15,7 +15,7 @@
 #include <linux/intel-ipu3.h>
 
 #include <libcamera/base/utils.h>
-
+#include <libcamera/ipa/ipu3_ipa_interface.h>
 #include <libcamera/geometry.h>
 
 #include "libipa/algorithm.h"
@@ -35,8 +35,8 @@ public:
 	IPU3Agc();
 	~IPU3Agc() = default;
 
-	void initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo);
 	void process(const ipu3_uapi_stats_3a *stats, uint32_t &exposure, double &gain);
+	void initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPAConfigInfo &configInfo);
 	bool converged() { return converged_; }
 	bool updateControls() { return updateControls_; }
 	/* \todo Use a metadata exchange between IPAs */
@@ -48,6 +48,13 @@ private:
 	void lockExposureGain(uint32_t &exposure, double &gain);
 
 	struct ipu3_uapi_grid_config aeGrid_;
+	ControlInfoMap ctrls_;
+
+	uint32_t minExposure_;
+	uint32_t maxExposure_;
+
+	uint32_t minGain_;
+	uint32_t maxGain_;
 
 	uint64_t frameCount_;
 	uint64_t lastFrame_;
