diff --git a/include/ipa/ipa_vimc.h b/include/ipa/ipa_vimc.h
new file mode 100644
index 000000000000..3e0375fe3a2c
--- /dev/null
+++ b/include/ipa/ipa_vimc.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * ipa_vimc.h - Vimc Image Processing Algorithm module
+ */
+
+#ifndef __LIBCAMERA_IPA_VIMC_H__
+#define __LIBCAMERA_IPA_VIMC_H__
+
+namespace libcamera {
+
+#define VIMC_IPA_FIFO_PATH "/tmp/vimc_ipa_fifo"
+
+enum IPAOperationCode {
+	IPAOperationNone,
+	IPAOperationInit,
+};
+
+}; /* namespace libcamera */
+
+#endif /* __LIBCAMERA_IPA_VIMC_H__ */
diff --git a/src/ipa/ipa_vimc.cpp b/src/ipa/ipa_vimc.cpp
index abc06e7f5fd5..83ce6bc19fd1 100644
--- a/src/ipa/ipa_vimc.cpp
+++ b/src/ipa/ipa_vimc.cpp
@@ -5,25 +5,91 @@
  * ipa_vimc.cpp - Vimc Image Processing Algorithm module
  */

+#include <ipa/ipa_vimc.h>
+
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
 #include <iostream>

 #include <ipa/ipa_interface.h>
 #include <ipa/ipa_module_info.h>

+#include "log.h"
+
 namespace libcamera {

+LOG_DEFINE_CATEGORY(IPAVimc)
+
 class IPAVimc : public IPAInterface
 {
 public:
+	IPAVimc();
+	~IPAVimc();
+
 	int init();
+
+private:
+	void initTrace();
+	void trace(enum IPAOperationCode operation);
+
+	int fd_;
 };

+IPAVimc::IPAVimc()
+	: fd_(-1)
+{
+	initTrace();
+}
+
+IPAVimc::~IPAVimc()
+{
+	if (fd_)
+		::close(fd_);
+}
+
 int IPAVimc::init()
 {
-	std::cout << "initializing vimc IPA!" << std::endl;
+	trace(IPAOperationInit);
+
+	LOG(IPAVimc, Debug) << "initializing vimc IPA!";
+
 	return 0;
 }

+void IPAVimc::initTrace()
+{
+	struct stat fifoStat;
+	int ret = stat(VIMC_IPA_FIFO_PATH, &fifoStat);
+	if (ret)
+		return;
+
+	ret = ::open(VIMC_IPA_FIFO_PATH, O_WRONLY);
+	if (ret < 0) {
+		ret = errno;
+		LOG(IPAVimc, Error) << "Failed to open vimc IPA test FIFO: "
+				    << strerror(ret);
+		return;
+	}
+
+	fd_ = ret;
+}
+
+void IPAVimc::trace(enum IPAOperationCode operation)
+{
+	if (fd_ < 0)
+		return;
+
+	int ret = ::write(fd_, &operation, sizeof(operation));
+	if (ret < 0) {
+		ret = errno;
+		LOG(IPAVimc, Error) << "Failed to write to vimc IPA test FIFO: "
+				    << strerror(ret);
+	}
+}
+
 /*
  * External IPA module interface
  */
