Line data Source code
1 0 : /*
2 : * Copyright (c) 2021 Carlo Caione <ccaione@baylibre.com>
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_IPC_SERVICE_IPC_STATIC_VRINGS_H_
8 : #define ZEPHYR_INCLUDE_IPC_SERVICE_IPC_STATIC_VRINGS_H_
9 :
10 : #include <zephyr/ipc/ipc_service.h>
11 : #include <openamp/open_amp.h>
12 :
13 : #ifdef __cplusplus
14 : extern "C" {
15 : #endif
16 :
17 : /**
18 : * @brief IPC service static VRINGs API
19 : * @defgroup ipc_service_static_vrings_api IPC service static VRINGs API
20 : * @ingroup ipc
21 : * @{
22 : */
23 :
24 : /** Number of used VRING buffers. */
25 1 : #define VRING_COUNT (2)
26 :
27 : /**
28 : * Memory alignment.
29 : *
30 : * This should take into account the cache line if the cache is enabled, otherwise
31 : * it should be naturally aligned to the machine word size.
32 : */
33 1 : #define MEM_ALIGNMENT CONFIG_IPC_SERVICE_STATIC_VRINGS_MEM_ALIGNMENT
34 :
35 : /**
36 : * @typedef ipc_notify_cb
37 : * @brief Define the notify callback.
38 : *
39 : * This callback is defined at instance level and it is called on virtqueue notify.
40 : *
41 : * @param vq Virtqueue.
42 : * @param priv Priv data.
43 : */
44 1 : typedef void (*ipc_notify_cb)(struct virtqueue *vq, void *priv);
45 :
46 : /** @brief Static VRINGs structure.
47 : *
48 : * Struct used to represent and carry information about static allocation of VRINGs.
49 : */
50 1 : struct ipc_static_vrings {
51 : /** virtIO device. */
52 1 : struct virtio_device vdev;
53 :
54 : /** SHM physmap. */
55 1 : metal_phys_addr_t shm_physmap[1];
56 :
57 : /** SHM and addresses. */
58 1 : uintptr_t status_reg_addr;
59 :
60 : /** TX VRING address. */
61 1 : uintptr_t tx_addr;
62 :
63 : /** RX VRING address. */
64 1 : uintptr_t rx_addr;
65 :
66 : /** VRING size. */
67 1 : size_t vring_size;
68 :
69 : /** Shared memory region address. */
70 1 : uintptr_t shm_addr;
71 :
72 : /** Share memory region size. */
73 1 : size_t shm_size;
74 :
75 : /** SHM IO region. */
76 1 : struct metal_io_region shm_io;
77 :
78 : /** VRINGs */
79 1 : struct virtio_vring_info rvrings[VRING_COUNT];
80 :
81 : /** Virtqueues. */
82 1 : struct virtqueue *vq[VRING_COUNT];
83 :
84 : /** Private data to be passed to the notify callback. */
85 1 : void *priv;
86 :
87 : /** Notify callback. */
88 1 : ipc_notify_cb notify_cb;
89 : };
90 :
91 : /** @brief Init the static VRINGs.
92 : *
93 : * Init VRINGs and Virtqueues of an OpenAMP / RPMsg instance.
94 : *
95 : * @param vr Pointer to the VRINGs instance struct.
96 : * @param role Host / Remote role.
97 : *
98 : * @retval -EINVAL When some parameter is missing.
99 : * @retval -ENOMEM When memory is not enough for VQs allocation.
100 : * @retval 0 If successful.
101 : * @retval Other errno codes depending on the OpenAMP implementation.
102 : */
103 1 : int ipc_static_vrings_init(struct ipc_static_vrings *vr, unsigned int role);
104 :
105 : /** @brief Deinitialise the static VRINGs.
106 : *
107 : * Deinitialise VRINGs and Virtqueues of an OpenAMP / RPMsg instance.
108 : *
109 : * @param vr Pointer to the VRINGs instance struct.
110 : * @param role Host / Remote role.
111 : *
112 : * @retval 0 If successful.
113 : * @retval Other errno codes depending on the OpenAMP implementation.
114 : */
115 1 : int ipc_static_vrings_deinit(struct ipc_static_vrings *vr, unsigned int role);
116 :
117 : /**
118 : * @}
119 : */
120 :
121 : #ifdef __cplusplus
122 : }
123 : #endif
124 :
125 : #endif /* ZEPHYR_INCLUDE_IPC_SERVICE_IPC_STATIC_VRINGS_H_ */
|