Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+10 -13
+7 -5
drivers/remoteproc/remoteproc_core.c
··· 298 298 return -EINVAL; 299 299 } 300 300 301 - /* the firmware must provide the expected queue size */ 302 - if (!vring->num) { 303 - dev_err(dev, "invalid qsz (%d)\n", vring->num); 301 + /* verify queue size and vring alignment are sane */ 302 + if (!vring->num || !vring->align) { 303 + dev_err(dev, "invalid qsz (%d) or alignment (%d)\n", 304 + vring->num, vring->align); 304 305 return -EINVAL; 305 306 } 306 307 307 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 311 if (!idr_pre_get(&rproc->notifyids, GFP_KERNEL)) { 311 312 dev_err(dev, "idr_pre_get failed\n"); ··· 341 340 dma, size, notifyid); 342 341 343 342 rvdev->vring[i].len = vring->num; 343 + rvdev->vring[i].align = vring->align; 344 344 rvdev->vring[i].va = va; 345 345 rvdev->vring[i].dma = dma; 346 346 rvdev->vring[i].notifyid = notifyid; ··· 356 354 357 355 for (i--; i > 0; i--) { 358 356 struct rproc_vring *rvring = &rvdev->vring[i]; 359 - int size = PAGE_ALIGN(vring_size(rvring->len, AMP_VRING_ALIGN)); 357 + int size = PAGE_ALIGN(vring_size(rvring->len, rvring->align)); 360 358 361 359 dma_free_coherent(rproc->dev, size, rvring->va, rvring->dma); 362 360 idr_remove(&rproc->notifyids, rvring->notifyid);
+1 -1
drivers/remoteproc/remoteproc_virtio.c
··· 99 99 * Create the new vq, and tell virtio we're not interested in 100 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 103 rproc_virtio_notify, callback, name); 104 104 if (!vq) { 105 105 dev_err(rproc->dev, "vring_new_virtqueue %s failed\n", name);
+2 -7
include/linux/remoteproc.h
··· 43 43 #include <linux/completion.h> 44 44 #include <linux/idr.h> 45 45 46 - /* 47 - * The alignment between the consumer and producer parts of the vring. 48 - * Note: this is part of the "wire" protocol. If you change this, you need 49 - * to update your peers too. 50 - */ 51 - #define AMP_VRING_ALIGN (4096) 52 - 53 46 /** 54 47 * struct resource_table - firmware resource table header 55 48 * @ver: version number ··· 416 423 * @dma: dma address 417 424 * @len: length, in bytes 418 425 * @da: device address 426 + * @align: vring alignment 419 427 * @notifyid: rproc-specific unique vring index 420 428 * @rvdev: remote vdev 421 429 * @vq: the virtqueue of this vring ··· 426 432 dma_addr_t dma; 427 433 int len; 428 434 u32 da; 435 + u32 align; 429 436 int notifyid; 430 437 struct rproc_vdev *rvdev; 431 438 struct virtqueue *vq;