Patch "iommu/arm-smmu-qcom: Work around SDM845 Adreno SMMU w/ 16K pages" has been added to the 6.6-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

    iommu/arm-smmu-qcom: Work around SDM845 Adreno SMMU w/ 16K pages

to the 6.6-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:
     iommu-arm-smmu-qcom-work-around-sdm845-adreno-smmu-w.patch
and it can be found in the queue-6.6 subdirectory.

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



commit eaa20b74cc5f28116311e288ef70f979c339903e
Author: Konrad Dybcio <konradybcio@xxxxxxxxxx>
Date:   Sat Aug 24 01:12:01 2024 +0200

    iommu/arm-smmu-qcom: Work around SDM845 Adreno SMMU w/ 16K pages
    
    [ Upstream commit 2d42d3ba443706c9164fa0bef4e5fd1c36bc1bd9 ]
    
    SDM845's Adreno SMMU is unique in that it actually advertizes support
    for 16K (and 32M) pages, which doesn't hold for newer SoCs.
    
    This however, seems either broken in the hardware implementation, the
    hypervisor middleware that abstracts the SMMU, or there's a bug in the
    Linux kernel somewhere down the line that nobody managed to track down.
    
    Booting SDM845 with 16K page sizes and drm/msm results in:
    
    *** gpu fault: ttbr0=0000000000000000 iova=000100000000c000 dir=READ
    type=TRANSLATION source=CP (0,0,0,0)
    
    right after loading the firmware. The GPU then starts spitting out
    illegal intstruction errors, as it's quite obvious that it got a
    bogus pointer.
    
    Moreover, it seems like this issue also concerns other implementations
    of SMMUv2 on Qualcomm SoCs, such as the one on SC7180.
    
    Hide 16K support on such instances to work around this.
    
    Reported-by: Sumit Semwal <sumit.semwal@xxxxxxxxxx>
    Signed-off-by: Konrad Dybcio <konrad.dybcio@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240824-topic-845_gpu_smmu-v2-1-a302b8acc052@xxxxxxxxxxx
    Signed-off-by: Will Deacon <will@xxxxxxxxxx>
    Stable-dep-of: 19eb465c969f ("iommu/arm-smmu-qcom: apply num_context_bank fixes for SDM630 / SDM660")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
index b899a7b7fa935..db2092d5af5eb 100644
--- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
+++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
@@ -341,6 +341,14 @@ static int qcom_smmu_cfg_probe(struct arm_smmu_device *smmu)
 	return 0;
 }
 
+static int qcom_adreno_smmuv2_cfg_probe(struct arm_smmu_device *smmu)
+{
+	/* Support for 16K pages is advertised on some SoCs, but it doesn't seem to work */
+	smmu->features &= ~ARM_SMMU_FEAT_FMT_AARCH64_16K;
+
+	return 0;
+}
+
 static void qcom_smmu_write_s2cr(struct arm_smmu_device *smmu, int idx)
 {
 	struct arm_smmu_s2cr *s2cr = smmu->s2crs + idx;
@@ -431,6 +439,7 @@ static const struct arm_smmu_impl sdm845_smmu_500_impl = {
 
 static const struct arm_smmu_impl qcom_adreno_smmu_v2_impl = {
 	.init_context = qcom_adreno_smmu_init_context,
+	.cfg_probe = qcom_adreno_smmuv2_cfg_probe,
 	.def_domain_type = qcom_smmu_def_domain_type,
 	.alloc_context_bank = qcom_adreno_smmu_alloc_context_bank,
 	.write_sctlr = qcom_adreno_smmu_write_sctlr,




[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