diff --git a/src/ipa/libipa/algorithm.cpp b/src/ipa/libipa/algorithm.cpp
index 8549fe3f..38200e57 100644
--- a/src/ipa/libipa/algorithm.cpp
+++ b/src/ipa/libipa/algorithm.cpp
@@ -81,6 +81,22 @@ 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 number to apply the control values
+ * \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 2a8871d8..ccc659a6 100644
--- a/src/ipa/libipa/algorithm.h
+++ b/src/ipa/libipa/algorithm.h
@@ -9,6 +9,8 @@
 #include <memory>
 #include <string>
 
+#include <libcamera/controls.h>
+
 namespace libcamera {
 
 class YamlObject;
@@ -40,6 +42,12 @@ public:
 	{
 	}
 
+	virtual void queueRequest([[maybe_unused]] typename Module::Context &context,
+				  [[maybe_unused]] const uint32_t frame,
+				  [[maybe_unused]] const ControlList &controls)
+	{
+	}
+
 	virtual void process([[maybe_unused]] typename Module::Context &context,
 			     [[maybe_unused]] typename Module::FrameContext *frameContext,
 			     [[maybe_unused]] const typename Module::Stats *stats)
