Hi, (please don't top-post) "Thang Q. Nguyen" <tqnguyen@xxxxxxx> writes: > Hi Balbi, > If CONFIG_DMA_CMA=y, dma mask is set properly. The issue just happen > when CONFIG_DMA_CMA is not set. In this case, dma mask is not set and > we need this code to check if dma mask should be manually set to 32 or > 64. Can you point me to the code which has this conditional ? Why would DMA_CMA=n mean that dma_mask isn't initialized ? According to DMA_CMA's help text (see below) that's supposed to allow drivers to *allocate* large contiguous buffers, but that's not the case here. config DMA_CMA bool "DMA Contiguous Memory Allocator" depends on HAVE_DMA_CONTIGUOUS && CMA help This enables the Contiguous Memory Allocator which allows drivers to allocate big physically-contiguous blocks of memory for use with hardware components that do not support I/O map nor scatter-gather. You can disable CMA by specifying "cma=0" on the kernel's command line. For more information see <include/linux/dma-contiguous.h>. If unsure, say "n". > > ---- > Thang > > On Wed, Mar 30, 2016 at 8:09 PM, Felipe Balbi > <felipe.balbi@xxxxxxxxxxxxxxx> wrote: >> >> Hi, >> >> "Thang Q. Nguyen" <tqnguyen@xxxxxxx> writes: >>> From: "Thang Q. Nguyen" <tqnguyen@xxxxxxx> >>> >>> Add 64-bit DMA operation support to the USB DWC3 driver. >>> First attempt to set the coherent DMA mask for 64-bit DMA. >>> If that failed, attempt again with 32-bit DMA. >>> >>> Changes from v2: >>> - None. >>> >>> Changes from v1: >>> - Remove WARN_ON if dma_mask is NULL >> >> these changes lines should be between the tearline (---) and diffstat >> below. >> >>> Signed-off-by: Thang Q. Nguyen <tqnguyen@xxxxxxx> >>> --- >>> drivers/usb/dwc3/core.c | 15 +++++++++++++++ >>> 1 file changed, 15 insertions(+) >>> >>> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c >>> index de5e01f..2479c24 100644 >>> --- a/drivers/usb/dwc3/core.c >>> +++ b/drivers/usb/dwc3/core.c >>> @@ -831,6 +831,21 @@ static int dwc3_probe(struct platform_device *pdev) >>> dwc->mem = mem; >>> dwc->dev = dev; >>> >>> + /* Try to set 64-bit DMA first */ >>> + if (!pdev->dev.dma_mask) >>> + /* Platform did not initialize dma_mask */ >>> + ret = dma_coerce_mask_and_coherent(&pdev->dev, >>> + DMA_BIT_MASK(64)); >>> + else >>> + ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); >>> + >>> + /* If seting 64-bit DMA mask fails, fall back to 32-bit DMA mask */ >>> + if (ret) { >>> + ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); >>> + if (ret) >>> + return ret; >>> + } >> >> Also, why is it so that you need this now ? glue layers are copying dma >> mask from parent device and that should be set properly. This really >> shouldn't be necessary in dwc3-core; it would mean that glue layer >> didn't set this device up properly. >> >> -- >> balbi > > > > -- > > Thang Q. Nguyen | Staff SW Eng. > > C: +849.7684.7606 | O: +848.3770.0640 > > F: +848.3770.0641 | tqnguyen@xxxxxxx -- balbi
Attachment:
signature.asc
Description: PGP signature