[libcamera-devel,14/38] libcamera: Add IPAIPC

Message ID 20200922133537.258098-15-paul.elder@ideasonboard.com
State Superseded
Headers show
Series
  • IPA isolation implementation
Related show

Commit Message

Paul Elder Sept. 22, 2020, 1:35 p.m. UTC
Create a virtual IPAIPC class that models an IPC/RPC system. IPA proxies
and proxy workers will call into the IPAIPC, rather than implementing
the IPC themselves.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>

---
Changes in v2:
- add documentation
---
 include/libcamera/internal/ipa_ipc.h |  41 ++++++++++
 src/libcamera/ipa_ipc.cpp            | 110 +++++++++++++++++++++++++++
 src/libcamera/meson.build            |   1 +
 3 files changed, 152 insertions(+)
 create mode 100644 include/libcamera/internal/ipa_ipc.h
 create mode 100644 src/libcamera/ipa_ipc.cpp

Comments

Jacopo Mondi Sept. 24, 2020, 10:32 a.m. UTC | #1
Hi Paul,

On Tue, Sep 22, 2020 at 10:35:13PM +0900, Paul Elder wrote:
> Create a virtual IPAIPC class that models an IPC/RPC system. IPA proxies
> and proxy workers will call into the IPAIPC, rather than implementing
> the IPC themselves.
>
> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
>
> ---
> Changes in v2:
> - add documentation
> ---
>  include/libcamera/internal/ipa_ipc.h |  41 ++++++++++
>  src/libcamera/ipa_ipc.cpp            | 110 +++++++++++++++++++++++++++
>  src/libcamera/meson.build            |   1 +
>  3 files changed, 152 insertions(+)
>  create mode 100644 include/libcamera/internal/ipa_ipc.h
>  create mode 100644 src/libcamera/ipa_ipc.cpp
>
> diff --git a/include/libcamera/internal/ipa_ipc.h b/include/libcamera/internal/ipa_ipc.h
> new file mode 100644
> index 00000000..34ca6eda
> --- /dev/null
> +++ b/include/libcamera/internal/ipa_ipc.h
> @@ -0,0 +1,41 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2020, Google Inc.
> + *
> + * ipa_ipc.h - Image Processing Algorithm IPC module for IPA proxies
> + */
> +#ifndef __LIBCAMERA_INTERNAL_IPA_IPC_H__
> +#define __LIBCAMERA_INTERNAL_IPA_IPC_H__
> +
> +#include <vector>
> +
> +namespace libcamera {
> +
> +class IPAIPC
> +{
> +public:
> +	IPAIPC([[maybe_unused]] const char *ipa_module_path,
> +	       [[maybe_unused]] const char *ipa_proxy_worker_path);
> +	virtual ~IPAIPC();
> +
> +	bool isValid() const { return valid_; }
> +
> +	virtual int sendSync(uint32_t cmd,
> +			     const std::vector<uint8_t> &data_in,
> +			     const std::vector<int32_t> &fds_in,
> +			     std::vector<uint8_t> *data_out = nullptr,
> +			     std::vector<int32_t> *fds_out = nullptr) = 0;
> +
> +	virtual int sendAsync(uint32_t cmd,
> +			      const std::vector<uint8_t> &data_in,
> +			      const std::vector<int32_t> &fds_in) = 0;
> +
> +	Signal<std::vector<uint8_t> &, std::vector<int32_t> &> recvIPC;

Proxyes and workers need to connect a slot to this Signal and IPAIPC
derived classses have to emit it, right ?

> +
> +protected:
> +	bool valid_;
> +};
> +
> +} /* namespace libcamera */
> +
> +#endif /* __LIBCAMERA_INTERNAL_IPA_IPC_H__ */
> diff --git a/src/libcamera/ipa_ipc.cpp b/src/libcamera/ipa_ipc.cpp
> new file mode 100644
> index 00000000..88af648e
> --- /dev/null
> +++ b/src/libcamera/ipa_ipc.cpp
> @@ -0,0 +1,110 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2020, Google Inc.
> + *
> + * ipa_ipc.cpp - Image Processing Algorithm IPC module for IPA proxies
> + */
> +
> +#include <vector>
> +
> +#include "libcamera/internal/ipc_unixsocket.h"
> +#include "libcamera/internal/log.h"
> +#include "libcamera/internal/process.h"
> +#include "libcamera/internal/thread.h"
> +
> +#include <libcamera/event_dispatcher.h>
> +#include <libcamera/timer.h>
> +
> +#include "libcamera/internal/ipa_ipc.h"
> +
> +/**
> + * \file ipa_ipc.h
> + * \brief IPC mechanism for IPA isolation
> + */
> +
> +namespace libcamera {
> +
> +LOG_DEFINE_CATEGORY(IPAIPC)
> +
> +/**
> + * \class IPAIPC
> + * \brief IPC mechanism for IPA isolation
> + *
> + * Virtual class to model an IPC mechanism for use by IPA proxies for IPA
> + * isolation. sendSync(), sendAsync(), and the emitter for the recvIPC signal
> + * must be implemented.

So I would

        sendSync(), sendAsync() must be implemented and the recvIPC
        signal emitted whenever new data are available.


> + */
> +
> +/**
> + * \brief Construct an IPAIPC instance
> + * \param[in] ipa_module_path Path to the IPA module shared object
> + * \param[in] ipa_proxy_worker_path Path to the IPA proxy worker shared object
> + */
> +IPAIPC::IPAIPC([[maybe_unused]] const char *ipa_module_path,
> +	       [[maybe_unused]] const char *ipa_proxy_worker_path)
> +	: valid_(false)
> +{
> +}
> +
> +IPAIPC::~IPAIPC()
> +{
> +}
> +
> +/**
> + * \fn IPAIPC::isValid()
> + * \brief Check if the IPAIPC instance is valid
> + *
> + * An IPAIPC instance is valid if the IPA interface is successfully created in
> + * isolation, and IPC is successfully set up.
> + *
> + * \return True if the IPAIPC is valid, false otherwise
> + */
> +
> +/**
> + * \fn IPAIPC::sendSync()
> + * \brief Send a message over IPC synchronously
> + * \param[in] cmd Command ID
> + * \param[in] data_in Data to send, as a byte vector
> + * \param[in] fds_in Fds to send, in a vector
> + * \param[in] data_out Byte vector in which to receive data, if applicable
> + * \param[in] fds_out Fds vector in which to receive fds, if applicable
> + *
> + * This function will not return until a response is received. The event loop
> + * will still continue to execute, however.
> + *
> + * \return Zero on success, negative error code otherwise
> + */
> +
> +/**
> + * \fn IPAIPC::sendAsync()
> + * \brief Send a message over IPC asynchronously
> + * \param[in] cmd Command ID
> + * \param[in] data_in Data to send, as a byte vector
> + * \param[in] fds_in Fds to send, in a vector
> + *
> + * This function will return immediately after sending the message.
> + *
> + * \return Zero on success, negative error code otherwise
> + */
> +
> +/**
> + * \var IPAIPC::recvIPC
> + * \brief Signal to be emitted when data is received over IPC
> + *
> + * When data is received over IPC, this signal shall be emitted.

And specify users have to connect to this in order to receive
new data

I wonder if we can document the signal parameters

> + */
> +
> +/**
> + * \var IPAIPC::valid_
> + * \brief Flag to indicate if the IPAIPC instance is valid
> + *
> + * An IPAIPC instance is valid if the IPA interface is successfully created in
> + * isolation, and IPC is successfully set up.
> + *
> + * This flag can be read via IPAIPC::isValid().
> + *
> + * Implementations of the IPAIPC class should set this flag upon successful
> + * construction.
> + */
> +
> +} /* namespace libcamera */
> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
> index 61aad08e..e3eade57 100644
> --- a/src/libcamera/meson.build
> +++ b/src/libcamera/meson.build
> @@ -24,6 +24,7 @@ libcamera_sources = files([
>      'ipa_context_wrapper.cpp',
>      'ipa_controls.cpp',
>      'ipa_data_serializer.cpp',
> +    'ipa_ipc.cpp',
>      'ipa_interface.cpp',
>      'ipa_manager.cpp',
>      'ipa_module.cpp',
> --
> 2.27.0
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

Patch

diff --git a/include/libcamera/internal/ipa_ipc.h b/include/libcamera/internal/ipa_ipc.h
new file mode 100644
index 00000000..34ca6eda
--- /dev/null
+++ b/include/libcamera/internal/ipa_ipc.h
@@ -0,0 +1,41 @@ 
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2020, Google Inc.
+ *
+ * ipa_ipc.h - Image Processing Algorithm IPC module for IPA proxies
+ */
+#ifndef __LIBCAMERA_INTERNAL_IPA_IPC_H__
+#define __LIBCAMERA_INTERNAL_IPA_IPC_H__
+
+#include <vector>
+
+namespace libcamera {
+
+class IPAIPC
+{
+public:
+	IPAIPC([[maybe_unused]] const char *ipa_module_path,
+	       [[maybe_unused]] const char *ipa_proxy_worker_path);
+	virtual ~IPAIPC();
+
+	bool isValid() const { return valid_; }
+
+	virtual int sendSync(uint32_t cmd,
+			     const std::vector<uint8_t> &data_in,
+			     const std::vector<int32_t> &fds_in,
+			     std::vector<uint8_t> *data_out = nullptr,
+			     std::vector<int32_t> *fds_out = nullptr) = 0;
+
+	virtual int sendAsync(uint32_t cmd,
+			      const std::vector<uint8_t> &data_in,
+			      const std::vector<int32_t> &fds_in) = 0;
+
+	Signal<std::vector<uint8_t> &, std::vector<int32_t> &> recvIPC;
+
+protected:
+	bool valid_;
+};
+
+} /* namespace libcamera */
+
+#endif /* __LIBCAMERA_INTERNAL_IPA_IPC_H__ */
diff --git a/src/libcamera/ipa_ipc.cpp b/src/libcamera/ipa_ipc.cpp
new file mode 100644
index 00000000..88af648e
--- /dev/null
+++ b/src/libcamera/ipa_ipc.cpp
@@ -0,0 +1,110 @@ 
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2020, Google Inc.
+ *
+ * ipa_ipc.cpp - Image Processing Algorithm IPC module for IPA proxies
+ */
+
+#include <vector>
+
+#include "libcamera/internal/ipc_unixsocket.h"
+#include "libcamera/internal/log.h"
+#include "libcamera/internal/process.h"
+#include "libcamera/internal/thread.h"
+
+#include <libcamera/event_dispatcher.h>
+#include <libcamera/timer.h>
+
+#include "libcamera/internal/ipa_ipc.h"
+
+/**
+ * \file ipa_ipc.h
+ * \brief IPC mechanism for IPA isolation
+ */
+
+namespace libcamera {
+
+LOG_DEFINE_CATEGORY(IPAIPC)
+
+/**
+ * \class IPAIPC
+ * \brief IPC mechanism for IPA isolation
+ *
+ * Virtual class to model an IPC mechanism for use by IPA proxies for IPA
+ * isolation. sendSync(), sendAsync(), and the emitter for the recvIPC signal
+ * must be implemented.
+ */
+
+/**
+ * \brief Construct an IPAIPC instance
+ * \param[in] ipa_module_path Path to the IPA module shared object
+ * \param[in] ipa_proxy_worker_path Path to the IPA proxy worker shared object
+ */
+IPAIPC::IPAIPC([[maybe_unused]] const char *ipa_module_path,
+	       [[maybe_unused]] const char *ipa_proxy_worker_path)
+	: valid_(false)
+{
+}
+
+IPAIPC::~IPAIPC()
+{
+}
+
+/**
+ * \fn IPAIPC::isValid()
+ * \brief Check if the IPAIPC instance is valid
+ *
+ * An IPAIPC instance is valid if the IPA interface is successfully created in
+ * isolation, and IPC is successfully set up.
+ *
+ * \return True if the IPAIPC is valid, false otherwise
+ */
+
+/**
+ * \fn IPAIPC::sendSync()
+ * \brief Send a message over IPC synchronously
+ * \param[in] cmd Command ID
+ * \param[in] data_in Data to send, as a byte vector
+ * \param[in] fds_in Fds to send, in a vector
+ * \param[in] data_out Byte vector in which to receive data, if applicable
+ * \param[in] fds_out Fds vector in which to receive fds, if applicable
+ *
+ * This function will not return until a response is received. The event loop
+ * will still continue to execute, however.
+ *
+ * \return Zero on success, negative error code otherwise
+ */
+
+/**
+ * \fn IPAIPC::sendAsync()
+ * \brief Send a message over IPC asynchronously
+ * \param[in] cmd Command ID
+ * \param[in] data_in Data to send, as a byte vector
+ * \param[in] fds_in Fds to send, in a vector
+ *
+ * This function will return immediately after sending the message.
+ *
+ * \return Zero on success, negative error code otherwise
+ */
+
+/**
+ * \var IPAIPC::recvIPC
+ * \brief Signal to be emitted when data is received over IPC
+ *
+ * When data is received over IPC, this signal shall be emitted.
+ */
+
+/**
+ * \var IPAIPC::valid_
+ * \brief Flag to indicate if the IPAIPC instance is valid
+ *
+ * An IPAIPC instance is valid if the IPA interface is successfully created in
+ * isolation, and IPC is successfully set up.
+ *
+ * This flag can be read via IPAIPC::isValid().
+ *
+ * Implementations of the IPAIPC class should set this flag upon successful
+ * construction.
+ */
+
+} /* namespace libcamera */
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 61aad08e..e3eade57 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -24,6 +24,7 @@  libcamera_sources = files([
     'ipa_context_wrapper.cpp',
     'ipa_controls.cpp',
     'ipa_data_serializer.cpp',
+    'ipa_ipc.cpp',
     'ipa_interface.cpp',
     'ipa_manager.cpp',
     'ipa_module.cpp',