// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later /* * Copyright 2019 IBM Corp. */ #include #include #include #include /* Override this for testing. */ #define is_rodata(p) fake_is_rodata(p) char __rodata_start[16]; #define __rodata_end (__rodata_start + sizeof(__rodata_start)) static inline bool fake_is_rodata(const void *p) { return ((char *)p >= __rodata_start && (char *)p < __rodata_end); } #define zalloc(bytes) calloc((bytes), 1) #include "../device.c" #include #include "../../test/dt_common.c" #define __TEST__ static inline unsigned long mfspr(unsigned int spr); #include #include "../cpufeatures.c" static unsigned long fake_pvr = PVR_TYPE_P8; static inline unsigned long mfspr(unsigned int spr) { assert(spr == SPR_PVR); return fake_pvr; } int main(void) { struct dt_node *dt_root; dt_root = dt_new_root(""); dt_add_cpufeatures(dt_root); dump_dt(dt_root, 0, true); dt_free(dt_root); fake_pvr = (PVR_TYPE_P8E << 16) | 0x100; // P8E DD1.0 dt_root = dt_new_root(""); dt_add_cpufeatures(dt_root); dump_dt(dt_root, 0, false); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix") == 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0); dt_free(dt_root); fake_pvr = (PVR_TYPE_P8E << 16) | 0x200; // P8E DD2.0 dt_root = dt_new_root(""); dt_add_cpufeatures(dt_root); dump_dt(dt_root, 0, false); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix") == 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0); dt_free(dt_root); fake_pvr = (PVR_TYPE_P8 << 16) | 0x100; // P8 DD1.0 dt_root = dt_new_root(""); dt_add_cpufeatures(dt_root); dump_dt(dt_root, 0, false); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix") == 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0); dt_free(dt_root); fake_pvr = (PVR_TYPE_P8 << 16) | 0x200; // P8 DD2.0 dt_root = dt_new_root(""); dt_add_cpufeatures(dt_root); dump_dt(dt_root, 0, false); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix") == 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0); dt_free(dt_root); fake_pvr = (PVR_TYPE_P8NVL << 16) | 0x100; // P8NVL DD1.0 dt_root = dt_new_root(""); dt_add_cpufeatures(dt_root); dump_dt(dt_root, 0, false); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix") == 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0); dt_free(dt_root); fake_pvr = (PVR_TYPE_P9 << 16) | 0x200; // P9 DD2.0 dt_root = dt_new_root(""); dt_add_cpufeatures(dt_root); dump_dt(dt_root, 0, false); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix")); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0); dt_free(dt_root); fake_pvr = (PVR_TYPE_P9 << 16) | 0x201; // P9 DD2.1 dt_root = dt_new_root(""); dt_add_cpufeatures(dt_root); dump_dt(dt_root, 0, false); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix")); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0); dt_free(dt_root); fake_pvr = (PVR_TYPE_P9 << 16) | 0x202; // P9 DD2.2 dt_root = dt_new_root(""); dt_add_cpufeatures(dt_root); dump_dt(dt_root, 0, false); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix")); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") != 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") != 0); dt_free(dt_root); fake_pvr = (PVR_TYPE_P9 << 16) | 0x203; // P9 DD2.3 dt_root = dt_new_root(""); dt_add_cpufeatures(dt_root); dump_dt(dt_root, 0, false); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix")); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") != 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0); dt_free(dt_root); fake_pvr = (PVR_TYPE_P9P << 16) | 0x100; // P9P DD1.0 dt_root = dt_new_root(""); dt_add_cpufeatures(dt_root); dump_dt(dt_root, 0, false); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix")); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") != 0); assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0); dt_free(dt_root); exit(EXIT_SUCCESS); }