Patch "drm/panfrost: Ignore core_mask for poweroff and disable PWRTRANS irq" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    drm/panfrost: Ignore core_mask for poweroff and disable PWRTRANS irq

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     drm-panfrost-ignore-core_mask-for-poweroff-and-disab.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit fd84ff8d45d779747bee37a71fae2786ecc90fe0
Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@xxxxxxxxxxxxx>
Date:   Mon Dec 4 12:42:13 2023 +0100

    drm/panfrost: Ignore core_mask for poweroff and disable PWRTRANS irq
    
    [ Upstream commit a4f5892914ca7709ea6d191f0edace93a5935966 ]
    
    Some SoCs may be equipped with a GPU containing two core groups
    and this is exactly the case of Samsung's Exynos 5422 featuring
    an ARM Mali-T628 MP6 GPU: the support for this GPU in Panfrost
    is partial, as this driver currently supports using only one
    core group and that's reflected on all parts of it, including
    the power on (and power off, previously to this patch) function.
    
    The issue with this is that even though executing the soft reset
    operation should power off all cores unconditionally, on at least
    one platform we're seeing a crash that seems to be happening due
    to an interrupt firing which may be because we are calling power
    transition only on the first core group, leaving the second one
    unchanged, or because ISR execution was pending before entering
    the panfrost_gpu_power_off() function and executed after powering
    off the GPU cores, or all of the above.
    
    Finally, solve this by:
     - Avoid to enable the power transition interrupt on reset; and
     - Ignoring the core_mask and ask the GPU to poweroff both core groups
    
    Fixes: 22aa1a209018 ("drm/panfrost: Really power off GPU cores in panfrost_gpu_power_off()")
    Reviewed-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx>
    Reviewed-by: Steven Price <steven.price@xxxxxxx>
    Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@xxxxxxxxxxxxx>
    Tested-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx>
    Signed-off-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx>
    Link: https://patchwork.freedesktop.org/patch/msgid/20231204114215.54575-2-angelogioacchino.delregno@xxxxxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/gpu/drm/panfrost/panfrost_gpu.c b/drivers/gpu/drm/panfrost/panfrost_gpu.c
index c08715f033c5..55d243048516 100644
--- a/drivers/gpu/drm/panfrost/panfrost_gpu.c
+++ b/drivers/gpu/drm/panfrost/panfrost_gpu.c
@@ -71,7 +71,12 @@ int panfrost_gpu_soft_reset(struct panfrost_device *pfdev)
 	}
 
 	gpu_write(pfdev, GPU_INT_CLEAR, GPU_IRQ_MASK_ALL);
-	gpu_write(pfdev, GPU_INT_MASK, GPU_IRQ_MASK_ALL);
+
+	/* Only enable the interrupts we care about */
+	gpu_write(pfdev, GPU_INT_MASK,
+		  GPU_IRQ_MASK_ERROR |
+		  GPU_IRQ_PERFCNT_SAMPLE_COMPLETED |
+		  GPU_IRQ_CLEAN_CACHES_COMPLETED);
 
 	return 0;
 }
@@ -369,11 +374,10 @@ void panfrost_gpu_power_on(struct panfrost_device *pfdev)
 
 void panfrost_gpu_power_off(struct panfrost_device *pfdev)
 {
-	u64 core_mask = panfrost_get_core_mask(pfdev);
 	int ret;
 	u32 val;
 
-	gpu_write(pfdev, SHADER_PWROFF_LO, pfdev->features.shader_present & core_mask);
+	gpu_write(pfdev, SHADER_PWROFF_LO, pfdev->features.shader_present);
 	ret = readl_relaxed_poll_timeout(pfdev->iomem + SHADER_PWRTRANS_LO,
 					 val, !val, 1, 1000);
 	if (ret)
@@ -385,7 +389,7 @@ void panfrost_gpu_power_off(struct panfrost_device *pfdev)
 	if (ret)
 		dev_err(pfdev->dev, "tiler power transition timeout");
 
-	gpu_write(pfdev, L2_PWROFF_LO, pfdev->features.l2_present & core_mask);
+	gpu_write(pfdev, L2_PWROFF_LO, pfdev->features.l2_present);
 	ret = readl_poll_timeout(pfdev->iomem + L2_PWRTRANS_LO,
 				 val, !val, 0, 1000);
 	if (ret)




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux