/* * SPDX-License-Identifier: BSD-3-Clause * * $FreeBSD$ */ #ifndef _RPMSG_INTERNAL_H_ #define _RPMSG_INTERNAL_H_ #include #include #if defined __cplusplus extern "C" { #endif #ifdef RPMSG_DEBUG #define RPMSG_ASSERT(_exp, _msg) do { \ if (!(_exp)) { \ openamp_print("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); } #if defined __cplusplus } #endif #endif /* _RPMSG_INTERNAL_H_ */