diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp
index f438cab8840a..e6fb7b8dbeb3 100644
--- a/src/ipa/raspberrypi/controller/rpi/agc.cpp
+++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp
@@ -31,17 +31,12 @@ LOG_DEFINE_CATEGORY(RPiAgc)
 int AgcMeteringMode::read(const libcamera::YamlObject &params)
 {
 	const YamlObject &yamlWeights = params["weights"];
-	if (yamlWeights.size() != AgcStatsSize) {
-		LOG(RPiAgc, Error) << "AgcMeteringMode: Incorrect number of weights";
-		return -EINVAL;
-	}
 
-	unsigned int num = 0;
 	for (const auto &p : yamlWeights.asList()) {
 		auto value = p.get<double>();
 		if (!value)
 			return -EINVAL;
-		weights[num++] = *value;
+		weights.push_back(*value);
 	}
 
 	return 0;
@@ -248,6 +243,14 @@ int Agc::read(const libcamera::YamlObject &params)
 	if (ret)
 		return ret;
 
+	const Size &size = getHardwareConfig().agcZoneWeights;
+	for (auto const &modes : config_.meteringModes) {
+		if (modes.second.weights.size() != size.width * size.height) {
+			LOG(RPiAgc, Error) << "AgcMeteringMode: Incorrect number of weights";
+			return -EINVAL;
+		}
+	}
+
 	/*
 	 * Set the config's defaults (which are the first ones it read) as our
 	 * current modes, until someone changes them.  (they're all known to
@@ -585,9 +588,12 @@ void Agc::fetchAwbStatus(Metadata *imageMetadata)
 }
 
 static double computeInitialY(StatisticsPtr &stats, AwbStatus const &awb,
-			      double weights[], double gain)
+			      std::vector<double> &weights, double gain)
 {
 	constexpr uint64_t maxVal = 1 << Statistics::NormalisationFactorPow2;
+
+	ASSERT(weights.size() == stats->agcRegions.numRegions());
+
 	/*
 	 * Note how the calculation below means that equal weights give you
 	 * "average" metering (i.e. all pixels equally important).
diff --git a/src/ipa/raspberrypi/controller/rpi/agc.h b/src/ipa/raspberrypi/controller/rpi/agc.h
index 4fa9b8de5fb2..4e5f272fac78 100644
--- a/src/ipa/raspberrypi/controller/rpi/agc.h
+++ b/src/ipa/raspberrypi/controller/rpi/agc.h
@@ -17,17 +17,10 @@
 
 /* This is our implementation of AGC. */
 
-/*
- * This is the number actually set up by the firmware, not the maximum possible
- * number (which is 16).
- */
-
-constexpr unsigned int AgcStatsSize = 15;
-
 namespace RPiController {
 
 struct AgcMeteringMode {
-	double weights[AgcStatsSize];
+	std::vector<double> weights;
 	int read(const libcamera::YamlObject &params);
 };
 
