From eb6abea1811676cfc548db499446b848c0221c40 Mon Sep 17 00:00:00 2001 From: Alexey Sheplyakov Date: Fri, 24 Dec 2021 19:55:09 +0400 Subject: [PATCH 620/634] drm/panfrost: forcibly set dma-coherent on Baikal-M With memattr 0x888d88 (set by arm_mali_lpae_alloc_pgtable) GPU (Mali T628 r1p0) experiences a lot of DATA_INVALID faults, unhandled page faults, and other errors. Also the screen goes black almost immediately. On the other hand with memattr 0x484d48 (as set by mali_kbase) the GPU appears to work just fine. Robin Murphy explains: > using the outer-cacheable attribute is deliberate because it is necessary > for I/O-coherent GPUs to work properly (and should be irrelevant for > non-coherent integrations) > I'd note that panfrost has been working OK - to the extent that Mesa > supports its older ISA - on the T624 (single core group) in Arm's > Juno SoC for over a year now since commit 268af50f38b1. > If you have to force outer non-cacheable to avoid getting translation > faults and other errors that look like the GPU is inexplicably seeing > the wrong data, I'd check whether you have the same thing where your > integration is actually I/O-coherent and you're missing the "dma-coherent" > property in your DT. Indeed setting the "gpu-coherent" property (and adjusting jobs affinity for dual core group GPU) makes panfrost work just fine on Baikal-M. However on Baikal-M the FDT is passed to the kernel by the firmware, and replacing the FDT in the firmware is tricky. Therefore set `coherent` property when running on Baikal-M (even if the `dma-coherent` property is missing in the FDT). X-DONTUPSTREAM --- drivers/gpu/drm/panfrost/panfrost_drv.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c index 1ffaef5ec..ffe14ed9e 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -552,6 +552,10 @@ static int panfrost_probe(struct platform_device *pdev) return -ENODEV; pfdev->coherent = device_get_dma_attr(&pdev->dev) == DEV_DMA_COHERENT; + if (!pfdev->coherent && of_device_is_compatible(of_root, "baikal,baikal-m")) { + pfdev->coherent = true; + dev_warn(&pdev->dev, "marking as DMA coherent on BE-M1000"); + } /* Allocate and initialze the DRM device. */ ddev = drm_dev_alloc(&panfrost_drm_driver, &pdev->dev); -- 2.33.2