mirror of
https://abf.rosa.ru/djam/kernel-5.15.git
synced 2025-02-23 18:42:55 +00:00
60 lines
2.4 KiB
Diff
60 lines
2.4 KiB
Diff
From eb6abea1811676cfc548db499446b848c0221c40 Mon Sep 17 00:00:00 2001
|
|
From: Alexey Sheplyakov <asheplyakov@altlinux.org>
|
|
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 <robin.murphy@arm.com> 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
|
|
|