aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/remoteproc
diff options
context:
space:
mode:
authorOhad Ben-Cohen <ohad@wizery.com>2012-02-29 07:42:13 -0500
committerOhad Ben-Cohen <ohad@wizery.com>2012-03-06 12:14:37 -0500
commit63140e0ed2e69bdafe62bc19fd6551d9213f80a7 (patch)
treea885f08832b5479721898b3dbef17edc17958d2c /drivers/remoteproc
parent55f34080d99be0ac75122a27e7b151c76a5b070d (diff)
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 <ohad@wizery.com> Cc: Brian Swetland <swetland@google.com> Cc: Iliyan Malchev <malchev@google.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Grant Likely <grant.likely@secretlab.ca> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Mark Grosen <mgrosen@ti.com> Cc: John Williams <john.williams@petalogix.com> Cc: Michal Simek <monstr@monstr.eu> Cc: Loic PALLARDY <loic.pallardy@stericsson.com> Cc: Ludovic BARRE <ludovic.barre@stericsson.com> Cc: Omar Ramirez Luna <omar.luna@linaro.org> Cc: Guzman Lugo Fernando <fernando.lugo@ti.com> Cc: Anna Suman <s-anna@ti.com> Cc: Clark Rob <rob@ti.com> Cc: Stephen Boyd <sboyd@codeaurora.org> Cc: Saravana Kannan <skannan@codeaurora.org> Cc: David Brown <davidb@codeaurora.org> Cc: Kieran Bingham <kieranbingham@gmail.com> Cc: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'drivers/remoteproc')
-rw-r--r--drivers/remoteproc/remoteproc_core.c12
-rw-r--r--drivers/remoteproc/remoteproc_virtio.c2
2 files changed, 8 insertions, 6 deletions
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index ca02f128b435..9be5dadaa3a3 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -298,14 +298,15 @@ __rproc_handle_vring(struct rproc_vdev *rvdev, struct fw_rsc_vdev *rsc, int i)
298 return -EINVAL; 298 return -EINVAL;
299 } 299 }
300 300
301 /* the firmware must provide the expected queue size */ 301 /* verify queue size and vring alignment are sane */
302 if (!vring->num) { 302 if (!vring->num || !vring->align) {
303 dev_err(dev, "invalid qsz (%d)\n", vring->num); 303 dev_err(dev, "invalid qsz (%d) or alignment (%d)\n",
304 vring->num, vring->align);
304 return -EINVAL; 305 return -EINVAL;
305 } 306 }
306 307
307 /* actual size of vring (in bytes) */ 308 /* actual size of vring (in bytes) */
308 size = PAGE_ALIGN(vring_size(vring->num, AMP_VRING_ALIGN)); 309 size = PAGE_ALIGN(vring_size(vring->num, vring->align));
309 310
310 if (!idr_pre_get(&rproc->notifyids, GFP_KERNEL)) { 311 if (!idr_pre_get(&rproc->notifyids, GFP_KERNEL)) {
311 dev_err(dev, "idr_pre_get failed\n"); 312 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)
340 dma, size, notifyid); 341 dma, size, notifyid);
341 342
342 rvdev->vring[i].len = vring->num; 343 rvdev->vring[i].len = vring->num;
344 rvdev->vring[i].align = vring->align;
343 rvdev->vring[i].va = va; 345 rvdev->vring[i].va = va;
344 rvdev->vring[i].dma = dma; 346 rvdev->vring[i].dma = dma;
345 rvdev->vring[i].notifyid = notifyid; 347 rvdev->vring[i].notifyid = notifyid;
@@ -354,7 +356,7 @@ static void __rproc_free_vrings(struct rproc_vdev *rvdev, int i)
354 356
355 for (i--; i > 0; i--) { 357 for (i--; i > 0; i--) {
356 struct rproc_vring *rvring = &rvdev->vring[i]; 358 struct rproc_vring *rvring = &rvdev->vring[i];
357 int size = PAGE_ALIGN(vring_size(rvring->len, AMP_VRING_ALIGN)); 359 int size = PAGE_ALIGN(vring_size(rvring->len, rvring->align));
358 360
359 dma_free_coherent(rproc->dev, size, rvring->va, rvring->dma); 361 dma_free_coherent(rproc->dev, size, rvring->va, rvring->dma);
360 idr_remove(&rproc->notifyids, rvring->notifyid); 362 idr_remove(&rproc->notifyids, rvring->notifyid);
diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
index 07004106c954..ecf612130750 100644
--- a/drivers/remoteproc/remoteproc_virtio.c
+++ b/drivers/remoteproc/remoteproc_virtio.c
@@ -99,7 +99,7 @@ static struct virtqueue *rp_find_vq(struct virtio_device *vdev,
99 * Create the new vq, and tell virtio we're not interested in 99 * Create the new vq, and tell virtio we're not interested in
100 * the 'weak' smp barriers, since we're talking with a real device. 100 * the 'weak' smp barriers, since we're talking with a real device.
101 */ 101 */
102 vq = vring_new_virtqueue(len, AMP_VRING_ALIGN, vdev, false, addr, 102 vq = vring_new_virtqueue(len, rvring->align, vdev, false, addr,
103 rproc_virtio_notify, callback, name); 103 rproc_virtio_notify, callback, name);
104 if (!vq) { 104 if (!vq) {
105 dev_err(rproc->dev, "vring_new_virtqueue %s failed\n", name); 105 dev_err(rproc->dev, "vring_new_virtqueue %s failed\n", name);