On 64-bit QorIQ platforms like T4240, the CPU supports 40-bit addressing
and it's safe to move resources to the upper bounds of the 1TiB limit to
make room for > 64GiB of memory. The PAMU driver does not account for
this, however.

Setup fsl,pamu driver to make use of the full 40-bit addressing space
when configuring liodn's that may have been configured in this range.
Specifically the e5500 and e6500 CPUs.

Signed-off-by: Ben Collins <bcoll...@kernel.org>
Cc: Joerg Roedel <j...@8bytes.org>
Cc: Will Deacon <w...@kernel.org>
Cc: Robin Murphy <robin.mur...@arm.com>
Cc: io...@lists.linux.dev
Cc: linux-ker...@vger.kernel.org
Cc: linuxppc-dev@lists.ozlabs.org
---
 drivers/iommu/fsl_pamu.c        | 5 +++--
 drivers/iommu/fsl_pamu.h        | 7 +++++++
 drivers/iommu/fsl_pamu_domain.c | 5 +++--
 3 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/iommu/fsl_pamu.c b/drivers/iommu/fsl_pamu.c
index f37d3b0441318..ceb352f824010 100644
--- a/drivers/iommu/fsl_pamu.c
+++ b/drivers/iommu/fsl_pamu.c
@@ -198,7 +198,7 @@ int pamu_config_ppaace(int liodn, u32 omi, u32 stashid, int 
prot)
 
        /* window size is 2^(WSE+1) bytes */
        set_bf(ppaace->addr_bitfields, PPAACE_AF_WSE,
-              map_addrspace_size_to_wse(1ULL << 36));
+              map_addrspace_size_to_wse(1ULL << PAMU_MAX_PHYS_BITS));
 
        pamu_init_ppaace(ppaace);
 
@@ -475,7 +475,8 @@ static void setup_liodns(void)
                        ppaace = pamu_get_ppaace(liodn);
                        pamu_init_ppaace(ppaace);
                        /* window size is 2^(WSE+1) bytes */
-                       set_bf(ppaace->addr_bitfields, PPAACE_AF_WSE, 35);
+                       set_bf(ppaace->addr_bitfields, PPAACE_AF_WSE,
+                              (PAMU_MAX_PHYS_BITS - 1));
                        ppaace->wbah = 0;
                        set_bf(ppaace->addr_bitfields, PPAACE_AF_WBAL, 0);
                        set_bf(ppaace->impl_attr, PAACE_IA_ATM,
diff --git a/drivers/iommu/fsl_pamu.h b/drivers/iommu/fsl_pamu.h
index 36df7975ff64d..5d88871610cfd 100644
--- a/drivers/iommu/fsl_pamu.h
+++ b/drivers/iommu/fsl_pamu.h
@@ -42,6 +42,13 @@ struct pamu_mmap_regs {
        u32 olal;
 };
 
+/* Physical addressing capability */
+#if defined(CONFIG_E6500_CPU) || defined(CONFIG_E5500_CPU)
+#define PAMU_MAX_PHYS_BITS     40
+#else
+#define PAMU_MAX_PHYS_BITS     36
+#endif
+
 /* PAMU Error Registers */
 #define PAMU_POES1 0x0040
 #define PAMU_POES2 0x0044
diff --git a/drivers/iommu/fsl_pamu_domain.c b/drivers/iommu/fsl_pamu_domain.c
index 30be786bff11e..a4bc6482a00f7 100644
--- a/drivers/iommu/fsl_pamu_domain.c
+++ b/drivers/iommu/fsl_pamu_domain.c
@@ -214,9 +214,10 @@ static struct iommu_domain *fsl_pamu_domain_alloc(unsigned 
type)
        INIT_LIST_HEAD(&dma_domain->devices);
        spin_lock_init(&dma_domain->domain_lock);
 
-       /* default geometry 64 GB i.e. maximum system address */
+       /* Set default geometry based on physical address limit. */
        dma_domain->iommu_domain. geometry.aperture_start = 0;
-       dma_domain->iommu_domain.geometry.aperture_end = (1ULL << 36) - 1;
+       dma_domain->iommu_domain.geometry.aperture_end =
+               (1ULL << PAMU_MAX_PHYS_BITS) - 1;
        dma_domain->iommu_domain.geometry.force_aperture = true;
 
        return &dma_domain->iommu_domain;
-- 
2.49.0


-- 
 Ben Collins
 https://libjwt.io
 https://github.com/benmcollins
 --
 3EC9 7598 1672 961A 1139  173A 5D5A 57C7 242B 22CF

Attachment: signature.asc
Description: PGP signature

Reply via email to