Skip to content

Commit dc09fe1

Browse files
svenpeter42joergroedel
authored andcommitted
iommu/io-pgtable-dart: Add DART PTE support for t6000
The DARTs present in the M1 Pro/Max/Ultra SoC use a diffent PTE format. They support a 42bit physical address space by shifting the paddr and extending its mask inside the PTE. They also come with mandatory sub-page protection now which we just configure to always allow access to the entire page. This feature is already present but optional on the previous DARTs which allows to unconditionally configure it. Signed-off-by: Sven Peter <sven@svenpeter.dev> Co-developed-by: Janne Grunau <j@jannau.net> Signed-off-by: Janne Grunau <j@jannau.net> Reviewed-by: Rob Herring <robh@kernel.org> Acked-by: Hector Martin <marcan@marcan.st> Link: https://lore.kernel.org/r/20220916094152.87137-5-j@jannau.net Signed-off-by: Joerg Roedel <jroedel@suse.de>
1 parent d8fe365 commit dc09fe1

File tree

3 files changed

+44
-7
lines changed

3 files changed

+44
-7
lines changed

drivers/iommu/io-pgtable-dart.c

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,19 @@
4545
#define APPLE_DART_PTE_SUBPAGE_END GENMASK_ULL(51, 40)
4646

4747
#define APPLE_DART1_PADDR_MASK GENMASK_ULL(35, 12)
48+
#define APPLE_DART2_PADDR_MASK GENMASK_ULL(37, 10)
49+
#define APPLE_DART2_PADDR_SHIFT (4)
4850

4951
/* Apple DART1 protection bits */
5052
#define APPLE_DART1_PTE_PROT_NO_READ BIT(8)
5153
#define APPLE_DART1_PTE_PROT_NO_WRITE BIT(7)
5254
#define APPLE_DART1_PTE_PROT_SP_DIS BIT(1)
5355

56+
/* Apple DART2 protection bits */
57+
#define APPLE_DART2_PTE_PROT_NO_READ BIT(3)
58+
#define APPLE_DART2_PTE_PROT_NO_WRITE BIT(2)
59+
#define APPLE_DART2_PTE_PROT_NO_CACHE BIT(1)
60+
5461
/* marks PTE as valid */
5562
#define APPLE_DART_PTE_VALID BIT(0)
5663

@@ -72,13 +79,31 @@ typedef u64 dart_iopte;
7279
static dart_iopte paddr_to_iopte(phys_addr_t paddr,
7380
struct dart_io_pgtable *data)
7481
{
75-
return paddr & APPLE_DART1_PADDR_MASK;
82+
dart_iopte pte;
83+
84+
if (data->iop.fmt == APPLE_DART)
85+
return paddr & APPLE_DART1_PADDR_MASK;
86+
87+
/* format is APPLE_DART2 */
88+
pte = paddr >> APPLE_DART2_PADDR_SHIFT;
89+
pte &= APPLE_DART2_PADDR_MASK;
90+
91+
return pte;
7692
}
7793

7894
static phys_addr_t iopte_to_paddr(dart_iopte pte,
7995
struct dart_io_pgtable *data)
8096
{
81-
return pte & APPLE_DART1_PADDR_MASK;
97+
u64 paddr;
98+
99+
if (data->iop.fmt == APPLE_DART)
100+
return pte & APPLE_DART1_PADDR_MASK;
101+
102+
/* format is APPLE_DART2 */
103+
paddr = pte & APPLE_DART2_PADDR_MASK;
104+
paddr <<= APPLE_DART2_PADDR_SHIFT;
105+
106+
return paddr;
82107
}
83108

84109
static void *__dart_alloc_pages(size_t size, gfp_t gfp,
@@ -190,10 +215,20 @@ static dart_iopte dart_prot_to_pte(struct dart_io_pgtable *data,
190215
{
191216
dart_iopte pte = 0;
192217

193-
if (!(prot & IOMMU_WRITE))
194-
pte |= APPLE_DART1_PTE_PROT_NO_WRITE;
195-
if (!(prot & IOMMU_READ))
196-
pte |= APPLE_DART1_PTE_PROT_NO_READ;
218+
if (data->iop.fmt == APPLE_DART) {
219+
if (!(prot & IOMMU_WRITE))
220+
pte |= APPLE_DART1_PTE_PROT_NO_WRITE;
221+
if (!(prot & IOMMU_READ))
222+
pte |= APPLE_DART1_PTE_PROT_NO_READ;
223+
}
224+
if (data->iop.fmt == APPLE_DART2) {
225+
if (!(prot & IOMMU_WRITE))
226+
pte |= APPLE_DART2_PTE_PROT_NO_WRITE;
227+
if (!(prot & IOMMU_READ))
228+
pte |= APPLE_DART2_PTE_PROT_NO_READ;
229+
if (!(prot & IOMMU_CACHE))
230+
pte |= APPLE_DART2_PTE_PROT_NO_CACHE;
231+
}
197232

198233
return pte;
199234
}
@@ -368,7 +403,7 @@ apple_dart_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie)
368403
if (!cfg->coherent_walk)
369404
return NULL;
370405

371-
if (cfg->oas > DART1_MAX_ADDR_BITS)
406+
if (cfg->oas != 36 && cfg->oas != 42)
372407
return NULL;
373408

374409
if (cfg->ias > cfg->oas)

drivers/iommu/io-pgtable.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ io_pgtable_init_table[IO_PGTABLE_NUM_FMTS] = {
2323
#endif
2424
#ifdef CONFIG_IOMMU_IO_PGTABLE_DART
2525
[APPLE_DART] = &io_pgtable_apple_dart_init_fns,
26+
[APPLE_DART2] = &io_pgtable_apple_dart_init_fns,
2627
#endif
2728
#ifdef CONFIG_IOMMU_IO_PGTABLE_ARMV7S
2829
[ARM_V7S] = &io_pgtable_arm_v7s_init_fns,

include/linux/io-pgtable.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ enum io_pgtable_fmt {
1717
ARM_MALI_LPAE,
1818
AMD_IOMMU_V1,
1919
APPLE_DART,
20+
APPLE_DART2,
2021
IO_PGTABLE_NUM_FMTS,
2122
};
2223

0 commit comments

Comments
 (0)