RPMsg-Lite User's Guide Rev. v5.4.0
NXP Semiconductors
Loading...
Searching...
No Matches
rpmsg_lite.h
1/*
2 * Copyright (c) 2014, Mentor Graphics Corporation
3 * Copyright (c) 2015 Xilinx, Inc.
4 * Copyright (c) 2016 Freescale Semiconductor, Inc.
5 * Copyright 2016-2025 NXP
6 * Copyright 2021 ACRIOS Systems s.r.o.
7 * Copyright 2026 NXP
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright notice,
15 * this list of conditions and the following disclaimer in the documentation
16 * and/or other materials provided with the distribution.
17 * 3. Neither the name of the copyright holder nor the names of its
18 * contributors may be used to endorse or promote products derived from this
19 * software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 */
33
34#ifndef RPMSG_LITE_H_
35#define RPMSG_LITE_H_
36
37#if defined(__cplusplus)
38extern "C" {
39#endif
40
41#include <stddef.h>
42#include "rpmsg_compiler.h"
43#include "virtqueue.h"
44#include "rpmsg_env.h"
45#include "llist.h"
47
50
51/*******************************************************************************
52 * Definitions
53 ******************************************************************************/
54
55#define RL_VERSION "v5.4.0"
57/* Shared memory "allocator" parameters */
59#define RL_WORD_SIZE (sizeof(uint32_t))
61#define RL_WORD_ALIGN_UP(a) (((uintptr_t)(a) + (RL_WORD_SIZE - 1U)) & (~((uintptr_t)(RL_WORD_SIZE - 1U))))
63#define RL_WORD_ALIGN_DOWN(a) ((uintptr_t)(a) & (~((uintptr_t)(RL_WORD_SIZE - 1U))))
64
65/* Definitions for device types , null pointer, etc.*/
67#define RL_SUCCESS (0)
69#define RL_NULL ((void *)0)
71#define RL_REMOTE (0)
73#define RL_MASTER (1)
75#define RL_TRUE (1UL)
77#define RL_FALSE (0UL)
79#define RL_ADDR_ANY (0xFFFFFFFFU)
81#define RL_RELEASE (0)
83#define RL_HOLD (1)
85#define RL_DONT_BLOCK (0)
87#define RL_BLOCK (~0UL)
88
89/* Error macros. */
91#define RL_ERRORS_BASE (-5000)
93#define RL_ERR_NO_MEM (RL_ERRORS_BASE - 1)
95#define RL_ERR_BUFF_SIZE (RL_ERRORS_BASE - 2)
97#define RL_ERR_PARAM (RL_ERRORS_BASE - 3)
99#define RL_ERR_DEV_ID (RL_ERRORS_BASE - 4)
101#define RL_ERR_MAX_VQ (RL_ERRORS_BASE - 5)
103#define RL_ERR_NO_BUFF (RL_ERRORS_BASE - 6)
105#define RL_NOT_READY (RL_ERRORS_BASE - 7)
107#define RL_ALREADY_DONE (RL_ERRORS_BASE - 8)
108
109/* Init flags */
111#define RL_NO_FLAGS (0U)
112
121{
122 uint16_t rfu; /* reserved for future usage */
123 uint16_t idx;
124};
125
126RL_PACKED_BEGIN
132{
133 uint32_t src;
134 uint32_t dst;
136 uint16_t len;
137 uint16_t flags;
139
140RL_PACKED_BEGIN
146{
148 uint8_t data[1];
150
154typedef int32_t (*rl_ept_rx_cb_t)(void *payload, uint32_t payload_len, uint32_t src, void *priv);
155
160{
161 uint32_t addr;
164 void *rfu;
165 /* 16 bytes aligned on 32bit architecture */
166};
167
172{
174 struct llist node;
175};
176
184{
185 struct virtqueue *rvq;
186 struct virtqueue *tvq;
187 struct llist *rl_endpoints;
188 LOCK *lock;
189#if defined(RL_USE_STATIC_API) && (RL_USE_STATIC_API == 1)
190 LOCK_STATIC_CONTEXT lock_static_ctxt;
191#endif
192 uint32_t link_state;
195 uint32_t sh_mem_total;
196 struct virtqueue_ops const *vq_ops;
197#if defined(RL_USE_ENVIRONMENT_CONTEXT) && (RL_USE_ENVIRONMENT_CONTEXT == 1)
198 void *env;
199#endif
200
201#if defined(RL_USE_STATIC_API) && (RL_USE_STATIC_API == 1)
202 struct vq_static_context vq_ctxt[2];
203#endif
204 uint32_t link_id;
205};
206
207/*******************************************************************************
208 * API
209 ******************************************************************************/
210
211/* Exported API functions */
212
233#if defined(RL_USE_STATIC_API) && (RL_USE_STATIC_API == 1)
234struct rpmsg_lite_instance *rpmsg_lite_master_init(void *shmem_addr,
235 size_t shmem_length,
236 uint32_t link_id,
237 uint32_t init_flags,
238 struct rpmsg_lite_instance *static_context);
239#elif defined(RL_USE_ENVIRONMENT_CONTEXT) && (RL_USE_ENVIRONMENT_CONTEXT == 1)
241 void *shmem_addr, size_t shmem_length, uint32_t link_id, uint32_t init_flags, void *env_cfg);
242#else
244 size_t shmem_length,
245 uint32_t link_id,
246 uint32_t init_flags);
247#endif
248
267#if defined(RL_USE_STATIC_API) && (RL_USE_STATIC_API == 1)
268struct rpmsg_lite_instance *rpmsg_lite_remote_init(void *shmem_addr,
269 uint32_t link_id,
270 uint32_t init_flags,
271 struct rpmsg_lite_instance *static_context);
272#elif defined(RL_USE_ENVIRONMENT_CONTEXT) && (RL_USE_ENVIRONMENT_CONTEXT == 1)
273struct rpmsg_lite_instance *rpmsg_lite_remote_init(void *shmem_addr,
274 uint32_t link_id,
275 uint32_t init_flags,
276 void *env_cfg);
277#else
278struct rpmsg_lite_instance *rpmsg_lite_remote_init(void *shmem_addr, uint32_t link_id, uint32_t init_flags);
279#endif
280
292int32_t rpmsg_lite_deinit(struct rpmsg_lite_instance *rpmsg_lite_dev);
293
308#if defined(RL_USE_STATIC_API) && (RL_USE_STATIC_API == 1)
310 uint32_t addr,
312 void *rx_cb_data,
313 struct rpmsg_lite_ept_static_context *ept_context);
314#else
316 uint32_t addr,
318 void *rx_cb_data);
319#endif
320
328int32_t rpmsg_lite_destroy_ept(struct rpmsg_lite_instance *rpmsg_lite_dev, struct rpmsg_lite_endpoint *rl_ept);
329
347int32_t rpmsg_lite_send(struct rpmsg_lite_instance *rpmsg_lite_dev,
348 struct rpmsg_lite_endpoint *ept,
349 uint32_t dst,
350 char *data,
351 uint32_t size,
352 uintptr_t timeout);
353
362uint32_t rpmsg_lite_is_link_up(struct rpmsg_lite_instance *rpmsg_lite_dev);
363
374uint32_t rpmsg_lite_wait_for_link_up(struct rpmsg_lite_instance *rpmsg_lite_dev, uint32_t timeout);
375
376#if defined(RL_API_HAS_ZEROCOPY) && (RL_API_HAS_ZEROCOPY == 1)
377
388int32_t rpmsg_lite_release_rx_buffer(struct rpmsg_lite_instance *rpmsg_lite_dev, void *rxbuf);
389
406void *rpmsg_lite_alloc_tx_buffer(struct rpmsg_lite_instance *rpmsg_lite_dev, uint32_t *size, uintptr_t timeout);
407
433int32_t rpmsg_lite_send_nocopy(struct rpmsg_lite_instance *rpmsg_lite_dev,
434 struct rpmsg_lite_endpoint *ept,
435 uint32_t dst,
436 void *data,
437 uint32_t size);
438#endif /* RL_API_HAS_ZEROCOPY */
439
441
442#if defined(__cplusplus)
443}
444#endif
445
446#endif /* RPMSG_LITE_H_ */
struct virtqueue_ops const * vq_ops
Definition: rpmsg_lite.h:196
uint32_t dst
Definition: rpmsg_lite.h:134
struct rpmsg_hdr_reserved reserved
Definition: rpmsg_lite.h:135
void * rx_cb_data
Definition: rpmsg_lite.h:163
struct virtqueue * rvq
Definition: rpmsg_lite.h:185
rl_ept_rx_cb_t rx_cb
Definition: rpmsg_lite.h:162
struct rpmsg_lite_endpoint ept
Definition: rpmsg_lite.h:173
struct llist * rl_endpoints
Definition: rpmsg_lite.h:187
uint32_t link_id
Definition: rpmsg_lite.h:204
uint32_t link_state
Definition: rpmsg_lite.h:192
uint16_t len
Definition: rpmsg_lite.h:136
uint16_t flags
Definition: rpmsg_lite.h:137
char * sh_mem_base
Definition: rpmsg_lite.h:193
uint32_t addr
Definition: rpmsg_lite.h:161
uint8_t data[1]
Definition: rpmsg_lite.h:148
uint32_t src
Definition: rpmsg_lite.h:133
struct llist node
Definition: rpmsg_lite.h:174
LOCK * lock
Definition: rpmsg_lite.h:188
uint32_t sh_mem_remaining
Definition: rpmsg_lite.h:194
struct rpmsg_std_hdr hdr
Definition: rpmsg_lite.h:147
void * rfu
Definition: rpmsg_lite.h:164
uint32_t sh_mem_total
Definition: rpmsg_lite.h:195
struct virtqueue * tvq
Definition: rpmsg_lite.h:186
RL_PACKED_BEGIN struct rpmsg_std_hdr RL_PACKED_END
End of packed structure.
int32_t(* rl_ept_rx_cb_t)(void *payload, uint32_t payload_len, uint32_t src, void *priv)
Receive callback function type.
Definition: rpmsg_lite.h:154
void * rpmsg_lite_alloc_tx_buffer(struct rpmsg_lite_instance *rpmsg_lite_dev, uint32_t *size, uintptr_t timeout)
Allocates the tx buffer for message payload.
int32_t rpmsg_lite_send(struct rpmsg_lite_instance *rpmsg_lite_dev, struct rpmsg_lite_endpoint *ept, uint32_t dst, char *data, uint32_t size, uintptr_t timeout)
Sends a message contained in data field of length size to the remote endpoint with address dst....
int32_t rpmsg_lite_release_rx_buffer(struct rpmsg_lite_instance *rpmsg_lite_dev, void *rxbuf)
Releases the rx buffer for future reuse in vring. This API can be called at process context when the ...
int32_t rpmsg_lite_send_nocopy(struct rpmsg_lite_instance *rpmsg_lite_dev, struct rpmsg_lite_endpoint *ept, uint32_t dst, void *data, uint32_t size)
Sends a message in tx buffer allocated by rpmsg_lite_alloc_tx_buffer()
int32_t rpmsg_lite_deinit(struct rpmsg_lite_instance *rpmsg_lite_dev)
Deinitialized the RPMsg-Lite communication stack This function always succeeds. rpmsg_lite_init() can...
struct rpmsg_lite_instance * rpmsg_lite_remote_init(void *shmem_addr, uint32_t link_id, uint32_t init_flags)
Initializes the RPMsg-Lite communication stack. Must be called prior to any other RPMsg-Lite API....
int32_t rpmsg_lite_destroy_ept(struct rpmsg_lite_instance *rpmsg_lite_dev, struct rpmsg_lite_endpoint *rl_ept)
This function deletes rpmsg endpoint and performs cleanup.
uint32_t rpmsg_lite_wait_for_link_up(struct rpmsg_lite_instance *rpmsg_lite_dev, uint32_t timeout)
Function to wait until the link is up. Returns RL_TRUE once the link_state is set or RL_FALSE in case...
struct rpmsg_lite_endpoint * rpmsg_lite_create_ept(struct rpmsg_lite_instance *rpmsg_lite_dev, uint32_t addr, rl_ept_rx_cb_t rx_cb, void *rx_cb_data)
Create a new rpmsg endpoint, which can be used for communication.
struct rpmsg_lite_instance * rpmsg_lite_master_init(void *shmem_addr, size_t shmem_length, uint32_t link_id, uint32_t init_flags)
Initializes the RPMsg-Lite communication stack. Must be called prior to any other RPMSG lite API....
uint32_t rpmsg_lite_is_link_up(struct rpmsg_lite_instance *rpmsg_lite_dev)
Function to get the link state.
Reserved field structure used in rpmsg_std_hdr.
Definition: rpmsg_lite.h:121
Definition: rpmsg_lite.h:160
Definition: rpmsg_lite.h:172
Definition: rpmsg_lite.h:184
Definition: rpmsg_lite.h:132
Definition: rpmsg_lite.h:146