OpenAMP Library
rpmsg_virtio.h
Go to the documentation of this file.
1 /*
2  * rpmsg based on virtio
3  *
4  * Copyright (C) 2018 Linaro, Inc.
5  *
6  * All rights reserved.
7  * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.
8  *
9  * SPDX-License-Identifier: BSD-3-Clause
10  */
11 
12 #ifndef _RPMSG_VIRTIO_H_
13 #define _RPMSG_VIRTIO_H_
14 
15 #include <metal/io.h>
16 #include <metal/mutex.h>
17 #include <openamp/rpmsg.h>
18 #include <openamp/virtio.h>
19 
20 #if defined __cplusplus
21 extern "C" {
22 #endif
23 
24 /* Configurable parameters */
25 #ifndef RPMSG_BUFFER_SIZE
26 #define RPMSG_BUFFER_SIZE (512)
27 #endif
28 
29 /* The feature bitmap for virtio rpmsg */
30 #define VIRTIO_RPMSG_F_NS 0 /* RP supports name service notifications */
31 
39  void *base;
40  size_t avail;
41  size_t size;
42 };
43 
55  uint32_t h2r_buf_size;
56  uint32_t r2h_buf_size;
58 };
59 
73  struct rpmsg_device rdev;
76  struct virtqueue *rvq;
77  struct virtqueue *svq;
78  struct metal_io_region *shbuf_io;
80  struct metal_list reclaimer;
81 };
82 
83 #define RPMSG_REMOTE VIRTIO_DEV_DEVICE
84 #define RPMSG_HOST VIRTIO_DEV_DRIVER
85 
86 #define RPMSG_SLAVE deprecated_rpmsg_slave()
87 #define RPMSG_MASTER deprecated_rpmsg_master()
88 
89 __deprecated static inline int deprecated_rpmsg_master(void)
90 {
91  /* "RPMSG_MASTER is deprecated, please use RPMSG_HOST" */
92  return RPMSG_HOST;
93 }
94 
95 __deprecated static inline int deprecated_rpmsg_slave(void)
96 {
97  /* "RPMSG_SLAVE is deprecated, please use RPMSG_REMOTE" */
98  return RPMSG_REMOTE;
99 }
100 
101 static inline unsigned int
103 {
104  return rvdev->vdev->role;
105 }
106 
107 static inline void rpmsg_virtio_set_status(struct rpmsg_virtio_device *rvdev,
108  uint8_t status)
109 {
110  rvdev->vdev->func->set_status(rvdev->vdev, status);
111 }
112 
113 static inline uint8_t rpmsg_virtio_get_status(struct rpmsg_virtio_device *rvdev)
114 {
115  return rvdev->vdev->func->get_status(rvdev->vdev);
116 }
117 
118 static inline uint32_t
120 {
121  return rvdev->vdev->func->get_features(rvdev->vdev);
122 }
123 
124 static inline void
126  uint32_t offset, void *dst, int length)
127 {
128  rvdev->vdev->func->read_config(rvdev->vdev, offset, dst, length);
129 }
130 
131 static inline void
133  uint32_t offset, void *dst, int length)
134 {
135  rvdev->vdev->func->write_config(rvdev->vdev, offset, dst, length);
136 }
137 
138 static inline int
140  int flags, unsigned int nvqs,
141  const char *names[],
142  vq_callback *callbacks)
143 {
144  return virtio_create_virtqueues(rvdev->vdev, flags, nvqs, names,
145  callbacks);
146 }
147 
156 
180 int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
181  struct virtio_device *vdev,
182  rpmsg_ns_bind_cb ns_bind_cb,
183  struct metal_io_region *shm_io,
184  struct rpmsg_virtio_shm_pool *shpool);
185 
219  struct virtio_device *vdev,
220  rpmsg_ns_bind_cb ns_bind_cb,
221  struct metal_io_region *shm_io,
222  struct rpmsg_virtio_shm_pool *shpool,
223  const struct rpmsg_virtio_config *config);
224 
230 void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev);
231 
245  void *shbuf, size_t size);
246 
254 static inline struct rpmsg_device *
256 {
257  if (!rvdev)
258  return NULL;
259 
260  return &rvdev->rdev;
261 }
262 
276 metal_weak void *
278  size_t size);
279 
280 #if defined __cplusplus
281 }
282 #endif
283 
284 #endif /* _RPMSG_VIRTIO_H_ */
void(* rpmsg_ns_bind_cb)(struct rpmsg_device *rdev, const char *name, uint32_t dest)
Definition: rpmsg.h:54
static void rpmsg_virtio_read_config(struct rpmsg_virtio_device *rvdev, uint32_t offset, void *dst, int length)
Definition: rpmsg_virtio.h:125
int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev, struct virtio_device *vdev, rpmsg_ns_bind_cb ns_bind_cb, struct metal_io_region *shm_io, struct rpmsg_virtio_shm_pool *shpool, const struct rpmsg_virtio_config *config)
Initialize rpmsg virtio device with config.
Definition: rpmsg_virtio.c:695
static uint32_t rpmsg_virtio_get_features(struct rpmsg_virtio_device *rvdev)
Definition: rpmsg_virtio.h:119
static __deprecated int deprecated_rpmsg_master(void)
Definition: rpmsg_virtio.h:89
metal_weak void * rpmsg_virtio_shm_pool_get_buffer(struct rpmsg_virtio_shm_pool *shpool, size_t size)
Get buffer in the shared memory pool.
Definition: rpmsg_virtio.c:56
#define RPMSG_REMOTE
Definition: rpmsg_virtio.h:83
static struct rpmsg_device * rpmsg_virtio_get_rpmsg_device(struct rpmsg_virtio_device *rvdev)
Get RPMsg device from RPMsg virtio device.
Definition: rpmsg_virtio.h:255
static int rpmsg_virtio_create_virtqueues(struct rpmsg_virtio_device *rvdev, int flags, unsigned int nvqs, const char *names[], vq_callback *callbacks)
Definition: rpmsg_virtio.h:139
static unsigned int rpmsg_virtio_get_role(struct rpmsg_virtio_device *rvdev)
Definition: rpmsg_virtio.h:102
static uint8_t rpmsg_virtio_get_status(struct rpmsg_virtio_device *rvdev)
Definition: rpmsg_virtio.h:113
void rpmsg_virtio_init_shm_pool(struct rpmsg_virtio_shm_pool *shpool, void *shbuf, size_t size)
Initialize default shared buffers pool.
Definition: rpmsg_virtio.c:70
void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev)
Deinitialize rpmsg virtio device.
Definition: rpmsg_virtio.c:860
int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, struct virtio_device *vdev, rpmsg_ns_bind_cb ns_bind_cb, struct metal_io_region *shm_io, struct rpmsg_virtio_shm_pool *shpool)
Initialize rpmsg virtio device.
Definition: rpmsg_virtio.c:685
#define RPMSG_HOST
Definition: rpmsg_virtio.h:84
static __deprecated int deprecated_rpmsg_slave(void)
Definition: rpmsg_virtio.h:95
static void rpmsg_virtio_set_status(struct rpmsg_virtio_device *rvdev, uint8_t status)
Definition: rpmsg_virtio.h:107
int rpmsg_virtio_get_buffer_size(struct rpmsg_device *rdev)
Get rpmsg virtio buffer size.
Definition: rpmsg_virtio.c:671
static void rpmsg_virtio_write_config(struct rpmsg_virtio_device *rvdev, uint32_t offset, void *dst, int length)
Definition: rpmsg_virtio.h:132
Definition: rpmsg.h:120
Definition: rpmsg_virtio.h:54
bool split_shpool
Definition: rpmsg_virtio.h:57
uint32_t h2r_buf_size
Definition: rpmsg_virtio.h:55
uint32_t r2h_buf_size
Definition: rpmsg_virtio.h:56
Definition: rpmsg_virtio.h:72
struct virtio_device * vdev
Definition: rpmsg_virtio.h:75
struct metal_io_region * shbuf_io
Definition: rpmsg_virtio.h:78
struct rpmsg_virtio_shm_pool * shpool
Definition: rpmsg_virtio.h:79
struct virtqueue * rvq
Definition: rpmsg_virtio.h:76
struct virtqueue * svq
Definition: rpmsg_virtio.h:77
struct rpmsg_device rdev
Definition: rpmsg_virtio.h:73
struct rpmsg_virtio_config config
Definition: rpmsg_virtio.h:74
struct metal_list reclaimer
Definition: rpmsg_virtio.h:80
Definition: rpmsg_virtio.h:38
size_t size
Definition: rpmsg_virtio.h:41
size_t avail
Definition: rpmsg_virtio.h:40
void * base
Definition: rpmsg_virtio.h:39
Definition: virtio.h:118
unsigned int role
Definition: virtio.h:124
const struct virtio_dispatch * func
Definition: virtio.h:126
void(* read_config)(struct virtio_device *dev, uint32_t offset, void *dst, int length)
Definition: virtio.h:159
uint8_t(* get_status)(struct virtio_device *dev)
Definition: virtio.h:147
uint32_t(* get_features)(struct virtio_device *dev)
Definition: virtio.h:149
void(* set_status)(struct virtio_device *dev, uint8_t status)
Definition: virtio.h:148
void(* write_config)(struct virtio_device *dev, uint32_t offset, void *src, int length)
Definition: virtio.h:161
Definition: virtqueue.h:60
int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags, unsigned int nvqs, const char *names[], vq_callback callbacks[])
Definition: virtio.c:86
void(* vq_callback)(struct virtqueue *)
Definition: virtqueue.h:112