]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'modem_shm/remoteproc-next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Wed, 20 Feb 2013 05:41:16 +0000 (16:41 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 20 Feb 2013 05:49:00 +0000 (16:49 +1100)
1  2 
drivers/remoteproc/remoteproc_virtio.c
include/linux/remoteproc.h

index 750b21818e278ad36f3ae2f66b537fb4d532cff5,d98cdd86b9a87b9c1d28a085a8d2a381a2acc357..dba33ff59b9fb82de7004b5192ba41f061932ce8
@@@ -186,106 -173,6 +186,106 @@@ error
        return ret;
  }
  
-                              rvdev->dfeatures,
 +/**
 + * rproc_virtio_new_vringh() - create a reversed virtio ring.
 + * @vdev: the virtio device
 + * @index: the virtio ring index
 + * @cb: callback for the reversed virtio ring
 + *
 + * This function should be called by the virtio-driver
 + * before calling find_vqs(). It returns a struct vringh for
 + * accessing the virtio ring.
 + *
 + * Return: struct vhost, or NULL upon error.
 + */
 +struct vringh *
 +rproc_virtio_new_vringh(struct virtio_device *vdev, unsigned index,
 +                      irqreturn_t (*cb)(struct virtio_device *vdev,
 +                                        struct vringh *vring))
 +{
 +      struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
 +      struct rproc_vring *rvring;
 +      struct vringh *vrh;
 +      int err;
 +
 +      if (index > ARRAY_SIZE(rvdev->vring)) {
 +              dev_err(&rvdev->vdev.dev, "bad vring index: %d\n", index);
 +              return NULL;
 +      }
 +
 +      vrh = kzalloc(sizeof(*vrh), GFP_KERNEL);
 +      if (!vrh)
 +              return NULL;
 +
 +      err = rproc_alloc_vring(rvdev, index);
 +      if (err)
 +              goto free_vring;
 +
 +
 +      rvring = &rvdev->vring[index];
 +      /* zero vring */
 +      memset(rvring->va, 0, vring_size(rvring->len, rvring->align));
 +      vring_init(&vrh->vring, rvring->len, rvring->va, rvring->align);
 +
 +      rvring->vringh_cb = cb;
 +      rvring->vringh = vrh;
 +
 +      err = vringh_init_kern(vrh,
++                             rvdev->rsc->dfeatures,
 +                             rvring->len,
 +                             false,
 +                             vrh->vring.desc,
 +                             vrh->vring.avail,
 +                             vrh->vring.used);
 +      if (!err)
 +              return vrh;
 +
 +      dev_err(&vdev->dev, "failed to create vhost: %d\n", err);
 +      rproc_free_vring(rvring);
 +free_vring:
 +      kfree(vrh);
 +      return NULL;
 +}
 +EXPORT_SYMBOL(rproc_virtio_new_vringh);
 +
 +/**
 + * rproc_virtio_del_vringh() - release a reversed virtio ring.
 + * @vdev: the virtio device
 + * @index: the virtio ring index
 + *
 + * This function release the reversed virtio ring.
 + */
 +void rproc_virtio_del_vringh(struct virtio_device *vdev, unsigned index)
 +{
 +      struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
 +      struct rproc_vring *rvring = &rvdev->vring[index];
 +      kfree(rvring->vringh);
 +      rproc_free_vring(rvring);
 +      rvring->vringh_cb = NULL;
 +      rvring->vringh = NULL;
 +}
 +EXPORT_SYMBOL(rproc_virtio_del_vringh);
 +
 +/**
 + * rproc_virtio_kick_vringh() - kick the remote processor.
 + * @vdev: the virtio device
 + * @index: the virtio ring index
 + *
 + * kick the remote processor, and let it know which vring to poke at
 + */
 +void rproc_virtio_kick_vringh(struct virtio_device *vdev, unsigned index)
 +{
 +      struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
 +      struct rproc_vring *rvring = &rvdev->vring[index];
 +      struct rproc *rproc = rvring->rvdev->rproc;
 +      int notifyid = rvring->notifyid;
 +
 +      dev_dbg(&rproc->dev, "kicking vq index: %d\n", notifyid);
 +
 +      rproc->ops->kick(rproc, notifyid);
 +}
 +EXPORT_SYMBOL(rproc_virtio_kick_vringh);
 +
  /*
   * We don't support yet real virtio status semantics.
   *
@@@ -332,10 -224,34 +337,34 @@@ static void rproc_virtio_finalize_featu
         * fixed as part of a small resource table overhaul and then an
         * extension of the virtio resource entries.
         */
-       rvdev->gfeatures = vdev->features[0];
+       rvdev->rsc->gfeatures = vdev->features[0];
+ }
+ void rproc_virtio_get(struct virtio_device *vdev, unsigned offset,
+                                                       void *buf, unsigned len)
+ {
+       struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
+       void *cfg = &rvdev->rsc->vring[rvdev->rsc->num_of_vrings];
+       if (offset + len > rvdev->rsc->config_len)
+               dev_err(&vdev->dev,
+                       "rproc_virtio_get: access out of bounds\n");
+       else
+               memcpy(buf, cfg + offset, len);
+ }
+ void rproc_virtio_set(struct virtio_device *vdev, unsigned offset,
+                     const void *buf, unsigned len)
+ {
+       struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
+       void *cfg = &rvdev->rsc->vring[rvdev->rsc->num_of_vrings];
+       if (offset + len > rvdev->rsc->config_len)
+               dev_err(&vdev->dev,
+                       "rproc_virtio_set: access out of bounds\n");
+       else
+               memcpy(cfg + offset, buf, len);
  }
  
 -static struct virtio_config_ops rproc_virtio_config_ops = {
 +static const struct virtio_config_ops rproc_virtio_config_ops = {
        .get_features   = rproc_virtio_get_features,
        .finalize_features = rproc_virtio_finalize_features,
        .find_vqs       = rproc_virtio_find_vqs,
index 414a1fda828bcb40947bfdc83ab9adf6b42d50b8,07deff4982d0d468c8e0881e7bdeea1ba1612429..eed19b2f8829c7c73a3c6846bc92488a926b5972
  #include <linux/klist.h>
  #include <linux/mutex.h>
  #include <linux/virtio.h>
 +#include <linux/vringh.h>
  #include <linux/completion.h>
 +#include <linux/interrupt.h>
  #include <linux/idr.h>
+ #include <asm/checksum.h>
  
  /**
   * struct resource_table - firmware resource table header