diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
index fed36bf26e47..5d8c9b1a3121 100644
--- a/include/libcamera/internal/camera_sensor.h
+++ b/include/libcamera/internal/camera_sensor.h
@@ -33,6 +33,9 @@ struct CameraSensorInfo {
 
 	uint64_t pixelRate;
 	uint32_t lineLength;
+
+	uint32_t minFrameLength;
+	uint32_t maxFrameLength;
 };
 
 class CameraSensor : protected Loggable
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index ab315bdc468c..f60d0cc9c6fa 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -113,6 +113,36 @@ LOG_DEFINE_CATEGORY(CameraSensor)
  * The total line length in pixel clock periods, including blanking.
  */
 
+/**
+ * \var CameraSensorInfo::minFrameLength
+ * \brief The minimum allowable frame length in units of lines
+ *
+ * The sensor frame length comprises of active output lines and blanking lines
+ * in a frame. The minimum frame length value dictates the minimum allowable
+ * frame duration of the sensor mode.
+ *
+ * To obtain the minimum frame duration:
+ *
+ * \verbatim
+	frameDuration(s) = minFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second)
+   \endverbatim
+ */
+
+/**
+ * \var CameraSensorInfo::maxFrameLength
+ * \brief The maximum allowable frame length in units of lines
+ *
+ * The sensor frame length comprises of active output lines and blanking lines
+ * in a frame. The maximum frame length value dictates the maximum allowable
+ * frame duration of the sensor mode.
+ *
+ * To obtain the maximum frame duration:
+ *
+ * \verbatim
+	frameDuration(s) = maxFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second)
+   \endverbatim
+ */
+
 /**
  * \class CameraSensor
  * \brief A camera sensor based on V4L2 subdevices
@@ -699,12 +729,13 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const
 	info->outputSize = format.size;
 
 	/*
-	 * Retrieve the pixel rate and the line length through V4L2 controls.
-	 * Support for the V4L2_CID_PIXEL_RATE and V4L2_CID_HBLANK controls is
-	 * mandatory.
+	 * Retrieve the pixel rate, line length and minimum/maximum frame
+	 * duration through V4L2 controls. Support for the V4L2_CID_PIXEL_RATE,
+	 * V4L2_CID_HBLANK and V4L2_CID_VBLANK controls is mandatory.
 	 */
 	ControlList ctrls = subdev_->getControls({ V4L2_CID_PIXEL_RATE,
-						   V4L2_CID_HBLANK });
+						   V4L2_CID_HBLANK,
+						   V4L2_CID_VBLANK });
 	if (ctrls.empty()) {
 		LOG(CameraSensor, Error)
 			<< "Failed to retrieve camera info controls";
@@ -715,6 +746,10 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const
 	info->lineLength = info->outputSize.width + hblank;
 	info->pixelRate = ctrls.get(V4L2_CID_PIXEL_RATE).get<int64_t>();
 
+	const ControlInfo vblank = ctrls.infoMap()->at(V4L2_CID_VBLANK);
+	info->minFrameLength = info->outputSize.height + vblank.min().get<int32_t>();
+	info->maxFrameLength = info->outputSize.height + vblank.max().get<int32_t>();
+
 	return 0;
 }
 
diff --git a/test/ipa/ipa_wrappers_test.cpp b/test/ipa/ipa_wrappers_test.cpp
index 47533d105d03..eb6d783e8489 100644
--- a/test/ipa/ipa_wrappers_test.cpp
+++ b/test/ipa/ipa_wrappers_test.cpp
@@ -313,6 +313,8 @@ protected:
 			.outputSize = { 2560, 1940 },
 			.pixelRate = 96000000,
 			.lineLength = 2918,
+			.minFrameLength = 1940,
+			.maxFrameLength = 2880
 		};
 		std::map<unsigned int, IPAStream> config{
 			{ 1, { V4L2_PIX_FMT_YUYV, { 1024, 768 } } },
