diff --git a/src/ipa/libipa/algorithm.cpp b/src/ipa/libipa/algorithm.cpp
index 65e9e8a56fc4..020b0b57b632 100644
--- a/src/ipa/libipa/algorithm.cpp
+++ b/src/ipa/libipa/algorithm.cpp
@@ -83,6 +83,23 @@ namespace ipa {
  * includes setting fields and flags that enable those processing blocks.
  */
 
+/**
+ * \fn Algorithm::queueRequest()
+ * \brief Provide control values to the algorithm
+ * \param[in] context The shared IPA context
+ * \param[in] frame The frame context sequence number
+ * \param[in] frameContext The current frame's context
+ * \param[in] controls The list of user controls
+ *
+ * This function is called for each request queued to the camera. It provides
+ * the controls stored in the request to the algorithm. The \a frame number
+ * is the Request sequence number and identifies the desired corresponding
+ * frame to target for the controls to take effect.
+ *
+ * Algorithms shall read the applicable controls and store their value for later
+ * use during frame processing.
+ */
+
 /**
  * \fn Algorithm::process()
  * \brief Process ISP statistics, and run algorithm operations
diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h
index 1d2544a767eb..5ccc640955c4 100644
--- a/src/ipa/libipa/algorithm.h
+++ b/src/ipa/libipa/algorithm.h
@@ -11,6 +11,7 @@
 
 namespace libcamera {
 
+class ControlList;
 class YamlObject;
 
 namespace ipa {
@@ -35,6 +36,14 @@ public:
 		return 0;
 	}
 
+
+	virtual void queueRequest([[maybe_unused]] typename Module::Context &context,
+				  [[maybe_unused]] const uint32_t frame,
+				  [[maybe_unused]] typename Module::FrameContext &frameContext,
+				  [[maybe_unused]] const ControlList &controls)
+	{
+	}
+
 	virtual void prepare([[maybe_unused]] typename Module::Context &context,
 			     [[maybe_unused]] unsigned int frame,
 			     [[maybe_unused]] typename Module::FrameContext &frameContext,
