aboutsummaryrefslogtreecommitdiff
path: root/framework/include/openamp/rpmsg_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'framework/include/openamp/rpmsg_internal.h')
-rw-r--r--framework/include/openamp/rpmsg_internal.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/framework/include/openamp/rpmsg_internal.h b/framework/include/openamp/rpmsg_internal.h
new file mode 100644
index 0000000..e4e1221
--- /dev/null
+++ b/framework/include/openamp/rpmsg_internal.h
@@ -0,0 +1,101 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _RPMSG_INTERNAL_H_
+#define _RPMSG_INTERNAL_H_
+
+#include <stdint.h>
+#include <openamp/rpmsg.h>
+#include <libmetal/compiler.h>
+
+#ifdef RPMSG_DEBUG
+#include <metal/log.h>
+
+#define RPMSG_ASSERT(_exp, _msg) do { \
+ if (!(_exp)) { \
+ metal_log(METAL_LOG_EMERGENCY, \
+ "FATAL: %s - "_msg, __func__); \
+ while (1) { \
+ ; \
+ } \
+ } \
+ } while (0)
+#else
+#define RPMSG_ASSERT(_exp, _msg) do { \
+ if (!(_exp)) \
+ while (1) { \
+ ; \
+ } \
+ } while (0)
+#endif
+
+#define RPMSG_LOCATE_DATA(p) ((unsigned char *)(p) + sizeof(struct rpmsg_hdr))
+/**
+ * enum rpmsg_ns_flags - dynamic name service announcement flags
+ *
+ * @RPMSG_NS_CREATE: a new remote service was just created
+ * @RPMSG_NS_DESTROY: a known remote service was just destroyed
+ * @RPMSG_NS_CREATE_WITH_ACK: a new remote service was just created waiting
+ * acknowledgment.
+ */
+enum rpmsg_ns_flags {
+ RPMSG_NS_CREATE = 0,
+ RPMSG_NS_DESTROY = 1,
+};
+
+/**
+ * struct rpmsg_hdr - common header for all rpmsg messages
+ * @src: source address
+ * @dst: destination address
+ * @reserved: reserved for future use
+ * @len: length of payload (in bytes)
+ * @flags: message flags
+ *
+ * Every message sent(/received) on the rpmsg bus begins with this header.
+ */
+OPENAMP_PACKED_BEGIN
+struct rpmsg_hdr {
+ uint32_t src;
+ uint32_t dst;
+ uint32_t reserved;
+ uint16_t len;
+ uint16_t flags;
+} OPENAMP_PACKED_END;
+
+/**
+ * struct rpmsg_ns_msg - dynamic name service announcement message
+ * @name: name of remote service that is published
+ * @addr: address of remote service that is published
+ * @flags: indicates whether service is created or destroyed
+ *
+ * This message is sent across to publish a new service, or announce
+ * about its removal. When we receive these messages, an appropriate
+ * rpmsg channel (i.e device) is created/destroyed. In turn, the ->probe()
+ * or ->remove() handler of the appropriate rpmsg driver will be invoked
+ * (if/as-soon-as one is registered).
+ */
+OPENAMP_PACKED_BEGIN
+struct rpmsg_ns_msg {
+ char name[RPMSG_NAME_SIZE];
+ uint32_t addr;
+ uint32_t flags;
+} OPENAMP_PACKED_END;
+
+int rpmsg_send_ns_message(struct rpmsg_endpoint *ept, unsigned long flags);
+
+struct rpmsg_endpoint *rpmsg_get_endpoint(struct rpmsg_device *rvdev,
+ const char *name, uint32_t addr,
+ uint32_t dest_addr);
+int rpmsg_register_endpoint(struct rpmsg_device *rdev,
+ struct rpmsg_endpoint *ept);
+
+static inline struct rpmsg_endpoint *
+rpmsg_get_ept_from_addr(struct rpmsg_device *rdev, uint32_t addr)
+{
+ return rpmsg_get_endpoint(rdev, NULL, addr, RPMSG_ADDR_ANY);
+}
+
+#endif /* _RPMSG_INTERNAL_H_ */