diff options
author | Anup Patel <anup.patel@wdc.com> | 2020-04-24 12:26:23 +0530 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2020-04-27 14:37:57 +0530 |
commit | 6585fabbcca24bf1c1df0582d048d93b3caf7ce7 (patch) | |
tree | f20de7aa4fde868e508c7128340c97f4ac0f51b1 /lib/utils/sys | |
parent | a9eac67ad019200e9a281a6fc10e394353a026f2 (diff) |
lib: utils: Add SiFive test device
This patch factor-out SiFive test device related stuff into
it's own source file from qemu/virt platform. In future, we
can find SiFive test device address from device tree as well.
Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
Diffstat (limited to 'lib/utils/sys')
-rw-r--r-- | lib/utils/sys/objects.mk | 1 | ||||
-rw-r--r-- | lib/utils/sys/sifive_test.c | 44 |
2 files changed, 45 insertions, 0 deletions
diff --git a/lib/utils/sys/objects.mk b/lib/utils/sys/objects.mk index c6df2bd..7878ca8 100644 --- a/lib/utils/sys/objects.mk +++ b/lib/utils/sys/objects.mk @@ -9,3 +9,4 @@ libsbiutils-objs-y += sys/clint.o libsbiutils-objs-y += sys/htif.o +libsbiutils-objs-y += sys/sifive_test.o diff --git a/lib/utils/sys/sifive_test.c b/lib/utils/sys/sifive_test.c new file mode 100644 index 0000000..15369da --- /dev/null +++ b/lib/utils/sys/sifive_test.c @@ -0,0 +1,44 @@ +/* + * 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_platform.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(u32 type) +{ + /* + * Tell the "finisher" that the simulation + * was successful so that QEMU exits + */ + switch (type) { + case SBI_PLATFORM_RESET_SHUTDOWN: + writew(FINISHER_PASS, sifive_test_base); + break; + case SBI_PLATFORM_RESET_COLD: + case SBI_PLATFORM_RESET_WARM: + writew(FINISHER_RESET, sifive_test_base); + break; + } + + return 0; +} + +int sifive_test_init(unsigned long base) +{ + sifive_test_base = (void *)base; + + return 0; +} |