diff options
Diffstat (limited to 'roms/opensbi/lib/utils/sys/sifive_test.c')
-rw-r--r-- | roms/opensbi/lib/utils/sys/sifive_test.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/roms/opensbi/lib/utils/sys/sifive_test.c b/roms/opensbi/lib/utils/sys/sifive_test.c new file mode 100644 index 000000000..fdf31690c --- /dev/null +++ b/roms/opensbi/lib/utils/sys/sifive_test.c @@ -0,0 +1,57 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 2020 Western Digital Corporation or its affiliates. + * + * Authors: + * Anup Patel <anup.patel@wdc.com> + */ + +#include <sbi/riscv_io.h> +#include <sbi/sbi_ecall_interface.h> +#include <sbi_utils/sys/sifive_test.h> + +#define FINISHER_FAIL 0x3333 +#define FINISHER_PASS 0x5555 +#define FINISHER_RESET 0x7777 + +static void *sifive_test_base; + +int sifive_test_system_reset_check(u32 type, u32 reason) +{ + switch (type) { + case SBI_SRST_RESET_TYPE_SHUTDOWN: + case SBI_SRST_RESET_TYPE_COLD_REBOOT: + case SBI_SRST_RESET_TYPE_WARM_REBOOT: + return 1; + } + + return 0; +} + +void sifive_test_system_reset(u32 type, u32 reason) +{ + /* + * Tell the "finisher" that the simulation + * was successful so that QEMU exits + */ + switch (type) { + case SBI_SRST_RESET_TYPE_SHUTDOWN: + if (reason == SBI_SRST_RESET_REASON_NONE) + writew(FINISHER_PASS, sifive_test_base); + else + writew(FINISHER_FAIL, sifive_test_base); + break; + case SBI_SRST_RESET_TYPE_COLD_REBOOT: + case SBI_SRST_RESET_TYPE_WARM_REBOOT: + writew(FINISHER_RESET, sifive_test_base); + break; + } +} + +int sifive_test_init(unsigned long base) +{ + sifive_test_base = (void *)base; + + return 0; +} |