Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
dmaengine: bcm2835: Load driver early and support legacy API
Load driver early since at least bcm2708_fb doesn't support deferred probing and even if it did, we don't want the video driver deferred. Support the legacy DMA API which is needed by bcm2708_fb. Don't mask out channel 2. Signed-off-by: Noralf Trønnes <noralf@tronnes.org> bcm2835-dma: Add support for per-channel flags Add the ability to interpret the high bits of the dreq specifier as flags to be included in the DMA_CS register. The motivation for this change is the ability to set the DISDEBUG flag for SD card transfers to avoid corruption when using the VPU debugger. Signed-off-by: Phil Elwell <phil@raspberrypi.org> bcm2835-dma: Add proper 40-bit DMA support BCM2711 has 4 DMA channels with a 40-bit address range, allowing them to access the full 4GB of memory on a Pi 4. Signed-off-by: Phil Elwell <phil@raspberrypi.org> bcm2835-dma: Derive slave DMA addresses correctly Slave addresses for DMA are meant to be supplied as physical addresses (contrary to what struct snd_dmaengine_dai_dma_data does). It is up to the DMA controller driver to perform the translation based on its own view of the world, as described in Device Tree. Now that the Pi Device Trees have the correct peripheral mappings, replace the hacky address munging with phys_to_dma(). Signed-off-by: Phil Elwell <phil@raspberrypi.com> bcm2835-dma: Add NO_WAIT_RESP flag Use bit 27 of the dreq value (the second cell of the DT DMA descriptor) to request that the WAIT_RESP bit is not set. Signed-off-by: Phil Elwell <phil@raspberrypi.com> bcm2835-dma: Advertise the full DMA range Unless the DMA mask is set wider than 32 bits, DMA mapping will use a bounce buffer. Signed-off-by: Phil Elwell <phil@raspberrypi.com> bcm2835-dma: only reserve channel 0 if legacy dma driver is enabled If CONFIG_DMA_BCM2708 isn't enabled there's no need to mask out one of the already scarce DMA channels. Signed-off-by: Matthias Reichl <hias@horus.com> bcm2835-dma: Avoid losing CS flags after interrupt Signed-off-by: Dom Cobley <popcornmix@gmail.com> bcm2835-dma: Add bcm2835-dma: Add DMA_WIDE_SOURCE and DMA_WIDE_DEST flags Use (reserved) bits 24 and 25 of the dreq value (the second cell of the DT DMA descriptor) to request that wide source reads or wide dest writes are required Signed-off-by: Dom Cobley <popcornmix@gmail.com> dmaengine: bcm2835: Fix position reporting for 40 bits channels For 40 bits channels, the position is reported by reading the upper byte in the SRCI/DESTI registers. However the driver adds that upper byte with an 8-bits left shift, while it should be 32. Fixes: 9a52a99 ("bcm2835-dma: Add proper 40-bit DMA support") Signed-off-by: Maxime Ripard <maxime@cerno.tech> dmaengine: bcm2835: Use to_bcm2711_cbaddr where relevant bcm2711_dma40_memcpy has some code strictly equivalent to the to_bcm2711_cbaddr() function. Let's use it instead. Signed-off-by: Maxime Ripard <maxime@cerno.tech> dmaengine: bcm2835: Fix descriptors usage for 40-bits channels The bcm2835_dma_create_cb_chain() function is in charge of building up the descriptors chain for a given transfer. It was initially supporting only the BCM2835-style DMA controller, and was later expanded to support controllers with 40-bits channels that use a different descriptor layout. However, some part of the function only use the old style descriptor, even when building a chain of new-style descriptors, resulting in weird bugs. Fixes: 9a52a99 ("bcm2835-dma: Add proper 40-bit DMA support") Signed-off-by: Maxime Ripard <maxime@cerno.tech> bcm2835-dma: Fix WAIT_RESP on memcpy It goes in info not extra Signed-off-by: Dom Cobley <popcornmix@gmail.com> bcm2835-dma: Fix dma_abort for 40-bit channels It wasn't aborting the transfer and caused stop/start of hdmi audio dma to be unreliable. New sequence approved by Broadcom. Signed-off-by: Dom Cobley <popcornmix@gmail.com> bcm2835-dma: Fix dma_abort for non-40bit channels The sequence we were doing was not safe. Clearing CS meant BCM2835_DMA_WAIT_FOR_WRITES was cleared and so polling BCM2835_DMA_WAITING_FOR_WRITES has no benefit Broadcom have provided a recommended sequence to abort a dma lite channel, so switch to that. Signed-off-by: Dom Cobley <popcornmix@gmail.com> bcm2835-dma: Support dma flags for multi-beat burst Add a control bit to enable a multi-beat burst on a DMA. This improves DMA performance and is required for HDMI audio. Signed-off-by: Dom Cobley <popcornmix@gmail.com> bcm2835-dma: Need to keep PROT bits set in CS on 40bit controller Resetting them to zero puts DMA channel into secure mode which makes further accesses impossible Signed-off-by: Dom Cobley <popcornmix@gmail.com> dmaengine: bcm2835: Delete vestigial code The dedicated dma40 memcpy code is no longer used, and without a prototype the kernel build fails. Delete it. Signed-off-by: Phil Elwell <phil@raspberrypi.com>
- Loading branch information