return -EINVAL;
}
- /* the firmware must provide the expected queue size */
- if (!vring->num) {
- dev_err(dev, "invalid qsz (%d)\n", vring->num);
+ /* verify queue size and vring alignment are sane */
+ if (!vring->num || !vring->align) {
+ dev_err(dev, "invalid qsz (%d) or alignment (%d)\n",
+ vring->num, vring->align);
return -EINVAL;
}
/* actual size of vring (in bytes) */
- size = PAGE_ALIGN(vring_size(vring->num, AMP_VRING_ALIGN));
+ size = PAGE_ALIGN(vring_size(vring->num, vring->align));
if (!idr_pre_get(&rproc->notifyids, GFP_KERNEL)) {
dev_err(dev, "idr_pre_get failed\n");
dma, size, notifyid);
rvdev->vring[i].len = vring->num;
+ rvdev->vring[i].align = vring->align;
rvdev->vring[i].va = va;
rvdev->vring[i].dma = dma;
rvdev->vring[i].notifyid = notifyid;
for (i--; i > 0; i--) {
struct rproc_vring *rvring = &rvdev->vring[i];
- int size = PAGE_ALIGN(vring_size(rvring->len, AMP_VRING_ALIGN));
+ int size = PAGE_ALIGN(vring_size(rvring->len, rvring->align));
dma_free_coherent(rproc->dev, size, rvring->va, rvring->dma);
idr_remove(&rproc->notifyids, rvring->notifyid);
* Create the new vq, and tell virtio we're not interested in
* the 'weak' smp barriers, since we're talking with a real device.
*/
- vq = vring_new_virtqueue(len, AMP_VRING_ALIGN, vdev, false, addr,
+ vq = vring_new_virtqueue(len, rvring->align, vdev, false, addr,
rproc_virtio_notify, callback, name);
if (!vq) {
dev_err(rproc->dev, "vring_new_virtqueue %s failed\n", name);
#include <linux/completion.h>
#include <linux/idr.h>
-/*
- * The alignment between the consumer and producer parts of the vring.
- * Note: this is part of the "wire" protocol. If you change this, you need
- * to update your peers too.
- */
-#define AMP_VRING_ALIGN (4096)
-
/**
* struct resource_table - firmware resource table header
* @ver: version number
* @dma: dma address
* @len: length, in bytes
* @da: device address
+ * @align: vring alignment
* @notifyid: rproc-specific unique vring index
* @rvdev: remote vdev
* @vq: the virtqueue of this vring
dma_addr_t dma;
int len;
u32 da;
+ u32 align;
int notifyid;
struct rproc_vdev *rvdev;
struct virtqueue *vq;