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

powerpc: Add Power11 architected and raw mode

Add CPU table entries for raw and architected mode. Most fields are
copied from the Power10 table entries.

CPU, MMU and user (ELF_HWCAP) features are unchanged vs P10. However
userspace can detect P11 because the AT_PLATFORM value changes to
"power11".

The logical PVR value of 0x0F000007, passed to firmware via the
ibm_arch_vec, indicates the kernel can support a P11 compatible CPU,
which means at least ISA v3.1 compliant.

Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20240221044623.1598642-1-mpe@ellerman.id.au

authored by

Madhavan Srinivasan and committed by
Michael Ellerman
c2ed087e 8c328de8

+60 -1
+3
arch/powerpc/include/asm/cputable.h
··· 454 454 CPU_FTR_ARCH_300 | CPU_FTR_ARCH_31 | \ 455 455 CPU_FTR_DAWR | CPU_FTR_DAWR1 | \ 456 456 CPU_FTR_DEXCR_NPHIE) 457 + 458 + #define CPU_FTRS_POWER11 CPU_FTRS_POWER10 459 + 457 460 #define CPU_FTRS_CELL (CPU_FTR_LWSYNC | \ 458 461 CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ 459 462 CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \
+1
arch/powerpc/include/asm/mmu.h
··· 133 133 #define MMU_FTRS_POWER8 MMU_FTRS_POWER6 134 134 #define MMU_FTRS_POWER9 MMU_FTRS_POWER6 135 135 #define MMU_FTRS_POWER10 MMU_FTRS_POWER6 136 + #define MMU_FTRS_POWER11 MMU_FTRS_POWER6 136 137 #define MMU_FTRS_CELL MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \ 137 138 MMU_FTR_CI_LARGE_PAGE 138 139 #define MMU_FTRS_PA6T MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \
+2
arch/powerpc/include/asm/reg.h
··· 1364 1364 #define PVR_HX_C2000 0x0066 1365 1365 #define PVR_POWER9 0x004E 1366 1366 #define PVR_POWER10 0x0080 1367 + #define PVR_POWER11 0x0082 1367 1368 #define PVR_BE 0x0070 1368 1369 #define PVR_PA6T 0x0090 1369 1370 ··· 1376 1375 #define PVR_ARCH_207 0x0f000004 1377 1376 #define PVR_ARCH_300 0x0f000005 1378 1377 #define PVR_ARCH_31 0x0f000006 1378 + #define PVR_ARCH_31_P11 0x0f000007 1379 1379 1380 1380 /* Macros for setting and retrieving special purpose registers */ 1381 1381 #ifndef __ASSEMBLY__
+34
arch/powerpc/kernel/cpu_specs_book3s_64.h
··· 60 60 PPC_FEATURE2_ISEL | PPC_FEATURE2_TAR | \ 61 61 PPC_FEATURE2_VEC_CRYPTO) 62 62 63 + #define COMMON_USER_POWER11 COMMON_USER_POWER10 64 + #define COMMON_USER2_POWER11 COMMON_USER2_POWER10 65 + 63 66 static struct cpu_spec cpu_specs[] __initdata = { 64 67 { /* PPC970 */ 65 68 .pvr_mask = 0xffff0000, ··· 284 281 .cpu_restore = __restore_cpu_power10, 285 282 .platform = "power10", 286 283 }, 284 + { /* 3.1-compliant processor, i.e. Power11 "architected" mode */ 285 + .pvr_mask = 0xffffffff, 286 + .pvr_value = 0x0f000007, 287 + .cpu_name = "Power11 (architected)", 288 + .cpu_features = CPU_FTRS_POWER11, 289 + .cpu_user_features = COMMON_USER_POWER11, 290 + .cpu_user_features2 = COMMON_USER2_POWER11, 291 + .mmu_features = MMU_FTRS_POWER11, 292 + .icache_bsize = 128, 293 + .dcache_bsize = 128, 294 + .cpu_setup = __setup_cpu_power10, 295 + .cpu_restore = __restore_cpu_power10, 296 + .platform = "power11", 297 + }, 287 298 { /* Power7 */ 288 299 .pvr_mask = 0xffff0000, 289 300 .pvr_value = 0x003f0000, ··· 467 450 .cpu_restore = __restore_cpu_power10, 468 451 .machine_check_early = __machine_check_early_realmode_p10, 469 452 .platform = "power10", 453 + }, 454 + { /* Power11 */ 455 + .pvr_mask = 0xffff0000, 456 + .pvr_value = 0x00820000, 457 + .cpu_name = "Power11 (raw)", 458 + .cpu_features = CPU_FTRS_POWER11, 459 + .cpu_user_features = COMMON_USER_POWER11, 460 + .cpu_user_features2 = COMMON_USER2_POWER11, 461 + .mmu_features = MMU_FTRS_POWER11, 462 + .icache_bsize = 128, 463 + .dcache_bsize = 128, 464 + .num_pmcs = 6, 465 + .pmc_type = PPC_PMC_IBM, 466 + .cpu_setup = __setup_cpu_power10, 467 + .cpu_restore = __restore_cpu_power10, 468 + .machine_check_early = __machine_check_early_realmode_p10, 469 + .platform = "power11", 470 470 }, 471 471 { /* Cell Broadband Engine */ 472 472 .pvr_mask = 0xffff0000,
+10
arch/powerpc/kernel/dt_cpu_ftrs.c
··· 458 458 return 1; 459 459 } 460 460 461 + static int __init feat_enable_mce_power11(struct dt_cpu_feature *f) 462 + { 463 + cur_cpu_spec->platform = "power11"; 464 + cur_cpu_spec->machine_check_early = __machine_check_early_realmode_p10; 465 + 466 + return 1; 467 + } 468 + 461 469 static int __init feat_enable_tm(struct dt_cpu_feature *f) 462 470 { 463 471 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM ··· 656 648 {"pc-relative-addressing", feat_enable, 0}, 657 649 {"machine-check-power9", feat_enable_mce_power9, 0}, 658 650 {"machine-check-power10", feat_enable_mce_power10, 0}, 651 + {"machine-check-power11", feat_enable_mce_power11, 0}, 659 652 {"performance-monitor-power9", feat_enable_pmu_power9, 0}, 660 653 {"performance-monitor-power10", feat_enable_pmu_power10, 0}, 654 + {"performance-monitor-power11", feat_enable_pmu_power10, 0}, 661 655 {"event-based-branch-v3", feat_enable, 0}, 662 656 {"random-number-generator", feat_enable, 0}, 663 657 {"system-call-vectored", feat_disable, 0},
+9 -1
arch/powerpc/kernel/prom_init.c
··· 947 947 } __packed; 948 948 949 949 struct ibm_arch_vec { 950 - struct { __be32 mask, val; } pvrs[14]; 950 + struct { __be32 mask, val; } pvrs[16]; 951 951 952 952 u8 num_vectors; 953 953 ··· 1006 1006 { 1007 1007 .mask = cpu_to_be32(0xffff0000), /* POWER10 */ 1008 1008 .val = cpu_to_be32(0x00800000), 1009 + }, 1010 + { 1011 + .mask = cpu_to_be32(0xffff0000), /* POWER11 */ 1012 + .val = cpu_to_be32(0x00820000), 1013 + }, 1014 + { 1015 + .mask = cpu_to_be32(0xffffffff), /* P11 compliant */ 1016 + .val = cpu_to_be32(0x0f000007), 1009 1017 }, 1010 1018 { 1011 1019 .mask = cpu_to_be32(0xffffffff), /* all 3.1-compliant */
+1
arch/powerpc/kvm/book3s_hv.c
··· 427 427 cap = H_GUEST_CAP_POWER9; 428 428 break; 429 429 case PVR_ARCH_31: 430 + case PVR_ARCH_31_P11: 430 431 guest_pcr_bit = PCR_ARCH_31; 431 432 cap = H_GUEST_CAP_POWER10; 432 433 break;