linux/drivers/usb/dwc2
Antti Seppälä 56406e017a usb: dwc2: Fix DMA alignment to start at allocated boundary
The commit 3bc04e28a0 ("usb: dwc2: host: Get aligned DMA in a more
supported way") introduced a common way to align DMA allocations.
The code in the commit aligns the struct dma_aligned_buffer but the
actual DMA address pointed by data[0] gets aligned to an offset from
the allocated boundary by the kmalloc_ptr and the old_xfer_buffer
pointers.

This is against the recommendation in Documentation/DMA-API.txt which
states:

  Therefore, it is recommended that driver writers who don't take
  special care to determine the cache line size at run time only map
  virtual regions that begin and end on page boundaries (which are
  guaranteed also to be cache line boundaries).

The effect of this is that architectures with non-coherent DMA caches
may run into memory corruption or kernel crashes with Unhandled
kernel unaligned accesses exceptions.

Fix the alignment by positioning the DMA area in front of the allocation
and use memory at the end of the area for storing the orginal
transfer_buffer pointer. This may have the added benefit of increased
performance as the DMA area is now fully aligned on all architectures.

Tested with Lantiq xRX200 (MIPS) and RPi Model B Rev 2 (ARM).

Fixes: 3bc04e28a0 ("usb: dwc2: host: Get aligned DMA in a more supported way")
Cc: <stable@vger.kernel.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Antti Seppälä <a.seppala@gmail.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
2018-07-17 10:12:52 +03:00
..
core_intr.c usb: dwc2: Change reading of current frame number flow. 2018-05-15 10:17:09 +03:00
core.c usb: dwc2: Fix kernel doc's warnings. 2018-05-21 10:02:13 +03:00
core.h usb: dwc2: alloc dma aligned buffer for isoc split in 2018-06-19 12:48:13 +03:00
debug.h usb: dwc2: Fix kernel doc's warnings. 2018-05-21 10:02:13 +03:00
debugfs.c USB: dwc2: no need to check return value of debugfs_create functions 2018-05-31 12:54:22 +02:00
gadget.c usb: dwc2: avoid NULL dereferences 2018-07-17 10:12:51 +03:00
hcd_ddma.c usb: dwc2: Fix kernel doc's warnings. 2018-05-21 10:02:13 +03:00
hcd_intr.c usb: dwc2: host: do not delay retries for CONTROL IN transfers 2018-07-17 10:12:51 +03:00
hcd_queue.c usb: dwc2: alloc dma aligned buffer for isoc split in 2018-06-19 12:48:13 +03:00
hcd.c usb: dwc2: Fix DMA alignment to start at allocated boundary 2018-07-17 10:12:52 +03:00
hcd.h usb: dwc2: alloc dma aligned buffer for isoc split in 2018-06-19 12:48:13 +03:00
hw.h usb: dwc2: Add Interpacket Gap(IPG) feature support 2018-05-15 10:16:47 +03:00
Kconfig usb: add CONFIG_USB_PCI for system have both PCI HW and non-PCI based USB HW 2017-03-17 13:16:56 +09:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
params.c usb: dwc2: gadget: Fix coverity issue 2018-05-21 10:40:16 +03:00
pci.c usb: dwc2: pci: Fix error return code in dwc2_pci_probe() 2018-05-21 10:36:14 +03:00
platform.c usb: dwc2: Force mode optimizations 2018-03-13 10:47:58 +02:00