blob: bb89b25737e1c1fd5294982e04958d1209ead645 [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
/*
* Copyright 2019 IBM Corp.
*/
#include <skiboot.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/* 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 <assert.h>
#include "../../test/dt_common.c"
#define __TEST__
static inline unsigned long mfspr(unsigned int spr);
#include <ccan/str/str.c>
#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);
}