20 #include <linux/export.h>
22 #include <linux/virtio.h>
23 #include <linux/virtio_config.h>
25 #include <linux/virtio_ring.h>
28 #include <linux/slab.h>
33 static void rproc_virtio_notify(
struct virtqueue *vq)
39 dev_dbg(&rproc->
dev,
"kicking vq index: %d\n", notifyid);
41 rproc->
ops->kick(rproc, notifyid);
60 dev_dbg(&rproc->
dev,
"vq index %d is interrupted\n", notifyid);
63 if (!rvring || !rvring->
vq)
75 struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
76 struct rproc *rproc = vdev_to_rproc(vdev);
99 size = vring_size(len, rvring->
align);
102 dev_dbg(dev,
"vring%d: va %p qsz %d notifyid %d\n",
110 rproc_virtio_notify,
callback, name);
112 dev_err(dev,
"vring_new_virtqueue %s failed\n", name);
123 static void __rproc_virtio_del_vqs(
struct virtio_device *vdev)
138 struct rproc *rproc = vdev_to_rproc(vdev);
143 __rproc_virtio_del_vqs(vdev);
146 static int rproc_virtio_find_vqs(
struct virtio_device *vdev,
unsigned nvqs,
151 struct rproc *rproc = vdev_to_rproc(vdev);
154 for (i = 0; i < nvqs; ++
i) {
155 vqs[
i] = rp_find_vq(vdev, i, callbacks[i], names[i]);
156 if (IS_ERR(vqs[i])) {
157 ret = PTR_ERR(vqs[i]);
165 dev_err(&rproc->
dev,
"rproc_boot() failed %d\n", ret);
172 __rproc_virtio_del_vqs(vdev);
201 struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
206 static void rproc_virtio_finalize_features(
struct virtio_device *vdev)
208 struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
226 .get_features = rproc_virtio_get_features,
227 .finalize_features = rproc_virtio_finalize_features,
228 .find_vqs = rproc_virtio_find_vqs,
229 .del_vqs = rproc_virtio_del_vqs,
230 .reset = rproc_virtio_reset,
231 .set_status = rproc_virtio_set_status,
232 .get_status = rproc_virtio_get_status,
243 static void rproc_vdev_release(
struct device *dev)
246 struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
247 struct rproc *rproc = vdev_to_rproc(vdev);
266 struct rproc *rproc = rvdev->
rproc;
271 vdev->
id.device =
id,
272 vdev->
config = &rproc_virtio_config_ops,
274 vdev->
dev.release = rproc_vdev_release;
289 dev_err(dev,
"failed to register vdev: %d\n", ret);
293 dev_info(dev,
"registered %s (type %d)\n", dev_name(&vdev->
dev),
id);