Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

soc: apple: sart: Add SARTv0 support

Add support for SARTv0 as found on Apple A11 SoC.

Reviewed-by: Sven Peter <sven@kernel.org>
Signed-off-by: Nick Chan <towinchenmi@gmail.com>
Link: https://lore.kernel.org/r/20250821-t8015-nvme-v3-5-14a4178adf68@gmail.com
Signed-off-by: Sven Peter <sven@kernel.org>

authored by

Nick Chan and committed by
Sven Peter
a67677d4 8409ebe2

+49
+49
drivers/soc/apple/sart.c
··· 25 25 26 26 #define APPLE_SART_MAX_ENTRIES 16 27 27 28 + /* SARTv0 registers */ 29 + #define APPLE_SART0_CONFIG(idx) (0x00 + 4 * (idx)) 30 + #define APPLE_SART0_CONFIG_FLAGS GENMASK(28, 24) 31 + #define APPLE_SART0_CONFIG_SIZE GENMASK(18, 0) 32 + #define APPLE_SART0_CONFIG_SIZE_SHIFT 12 33 + #define APPLE_SART0_CONFIG_SIZE_MAX GENMASK(18, 0) 34 + 35 + #define APPLE_SART0_PADDR(idx) (0x40 + 4 * (idx)) 36 + #define APPLE_SART0_PADDR_SHIFT 12 37 + 38 + #define APPLE_SART0_FLAGS_ALLOW 0xf 39 + 28 40 /* SARTv2 registers */ 29 41 #define APPLE_SART2_CONFIG(idx) (0x00 + 4 * (idx)) 30 42 #define APPLE_SART2_CONFIG_FLAGS GENMASK(31, 24) ··· 81 69 82 70 unsigned long protected_entries; 83 71 unsigned long used_entries; 72 + }; 73 + 74 + static void sart0_get_entry(struct apple_sart *sart, int index, u8 *flags, 75 + phys_addr_t *paddr, size_t *size) 76 + { 77 + u32 cfg = readl(sart->regs + APPLE_SART0_CONFIG(index)); 78 + phys_addr_t paddr_ = readl(sart->regs + APPLE_SART0_PADDR(index)); 79 + size_t size_ = FIELD_GET(APPLE_SART0_CONFIG_SIZE, cfg); 80 + 81 + *flags = FIELD_GET(APPLE_SART0_CONFIG_FLAGS, cfg); 82 + *size = size_ << APPLE_SART0_CONFIG_SIZE_SHIFT; 83 + *paddr = paddr_ << APPLE_SART0_PADDR_SHIFT; 84 + } 85 + 86 + static void sart0_set_entry(struct apple_sart *sart, int index, u8 flags, 87 + phys_addr_t paddr_shifted, size_t size_shifted) 88 + { 89 + u32 cfg; 90 + 91 + cfg = FIELD_PREP(APPLE_SART0_CONFIG_FLAGS, flags); 92 + cfg |= FIELD_PREP(APPLE_SART0_CONFIG_SIZE, size_shifted); 93 + 94 + writel(paddr_shifted, sart->regs + APPLE_SART0_PADDR(index)); 95 + writel(cfg, sart->regs + APPLE_SART0_CONFIG(index)); 96 + } 97 + 98 + static struct apple_sart_ops sart_ops_v0 = { 99 + .get_entry = sart0_get_entry, 100 + .set_entry = sart0_set_entry, 101 + .flags_allow = APPLE_SART0_FLAGS_ALLOW, 102 + .size_shift = APPLE_SART0_CONFIG_SIZE_SHIFT, 103 + .paddr_shift = APPLE_SART0_PADDR_SHIFT, 104 + .size_max = APPLE_SART0_CONFIG_SIZE_MAX, 84 105 }; 85 106 86 107 static void sart2_get_entry(struct apple_sart *sart, int index, u8 *flags, ··· 363 318 { 364 319 .compatible = "apple,t8103-sart", 365 320 .data = &sart_ops_v2, 321 + }, 322 + { 323 + .compatible = "apple,t8015-sart", 324 + .data = &sart_ops_v0, 366 325 }, 367 326 {} 368 327 };