• Linus Walleij's avatar
    of/platform: initialise AMBA default DMA masks · 8c89ef7b
    Linus Walleij authored
    This addresses a v4.19-rc1 regression in the PL111 DRM driver in
    drivers/gpu/pl111/*
    
    The driver uses the CMA KMS helpers and will thus at some point call
    down to dma_alloc_attrs() to allocate a chunk of contigous DMA memory
    for the framebuffer.
    
    It appears that in v4.18, it was OK that this (and other DMA mastering
    AMBA devices) left dev->coherent_dma_mask blank (zero).
    
    In v4.19-rc1 the WARN_ON_ONCE(dev && !dev->coherent_dma_mask) in
    dma_alloc_attrs() in include/linux/dma-mapping.h is triggered.  The
    allocation later fails when get_coherent_dma_mask() is called from
    __dma_alloc() and __dma_alloc() returns NULL:
    
    drm-clcd-pl111 dev:20: coherent DMA mask is unset
    drm-clcd-pl111 dev:20: [drm:drm_fb_helper_fbdev_setup] *ERROR*
     	       	        Failed to set fbdev configuration
    
    It turns out that in commit 4d8bde88 ("OF: Don't set default
    coherent DMA mask") the OF core stops setting the default DMA mask on
    new devices, especially those lines of the patch:
    
    - if (!dev->coherent_dma_mask)
    -               dev->coherent_dma_mask = DMA_BIT_MASK(32);
    
    Robin Murphy solved a similar problem in a5516219 ("of/platform:
    Initialise default DMA masks") by simply assigning dev.coherent_dma_mask
    and the dev.dma_mask to point to the same when creating devices from the
    device tree, and introducing the same code into the code path creating
    AMBA/PrimeCell devices solved my problem, graphics now come up.
    
    The code simply assumes that the device can access all of the system
    memory by setting the coherent DMA mask to 0xffffffff when creating a
    device from the device tree, which is crude, but seems to be what kernel
    v4.18 assumed.
    
    The AMBA PrimeCells do not differ between coherent and streaming DMA so
    we can just assign the same to any DMA mask.
    
    Possibly drivers should augment their coherent DMA mask in accordance
    with "dma-ranges" from the device tree if more finegranular masking is
    needed.
    Reported-by: default avatarRussell King <linux@armlinux.org.uk>
    Fixes: 4d8bde88 ("OF: Don't set default coherent DMA mask")
    Cc: Russell King <linux@armlinux.org.uk>
    Cc: Robin Murphy <robin.murphy@arm.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    8c89ef7b
platform.c 19.8 KB