remoteproc: remove the hardcoded vring alignment

Remove the hardcoded vring alignment of 4096 bytes,
and instead utilize tha vring alignment as specified in
the resource table.

This is needed for remote processors that have rigid
memory requirement, and which have found the alignment of
4096 bytes to be excessively big.

Signed-off-by: Ohad Ben-Cohen <[email protected]>
Cc: Brian Swetland <[email protected]>
Cc: Iliyan Malchev <[email protected]>
Cc: Arnd Bergmann <[email protected]>
Cc: Grant Likely <[email protected]>
Cc: Rusty Russell <[email protected]>
Cc: Mark Grosen <[email protected]>
Cc: John Williams <[email protected]>
Cc: Michal Simek <[email protected]>
Cc: Loic PALLARDY <[email protected]>
Cc: Ludovic BARRE <[email protected]>
Cc: Omar Ramirez Luna <[email protected]>
Cc: Guzman Lugo Fernando <[email protected]>
Cc: Anna Suman <[email protected]>
Cc: Clark Rob <[email protected]>
Cc: Stephen Boyd <[email protected]>
Cc: Saravana Kannan <[email protected]>
Cc: David Brown <[email protected]>
Cc: Kieran Bingham <[email protected]>
Cc: Tony Lindgren <[email protected]>
This commit is contained in:
Ohad Ben-Cohen 2012-02-29 14:42:13 +02:00
commit 63140e0ed2
3 changed files with 10 additions and 13 deletions

View file

@ -298,14 +298,15 @@ __rproc_handle_vring(struct rproc_vdev *rvdev, struct fw_rsc_vdev *rsc, int i)
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");
@ -340,6 +341,7 @@ __rproc_handle_vring(struct rproc_vdev *rvdev, struct fw_rsc_vdev *rsc, int i)
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;
@ -354,7 +356,7 @@ static void __rproc_free_vrings(struct rproc_vdev *rvdev, int i)
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);

View file

@ -99,7 +99,7 @@ static struct virtqueue *rp_find_vq(struct virtio_device *vdev,
* 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);