From 6585fabbcca24bf1c1df0582d048d93b3caf7ce7 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Fri, 24 Apr 2020 12:26:23 +0530 Subject: [PATCH] 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 Reviewed-by: Atish Patra --- include/sbi_utils/sys/sifive_test.h | 19 ++++++++++++++++ lib/utils/sys/objects.mk | 1 + lib/utils/sys/sifive_test.c | 44 +++++++++++++++++++++++++++++++++++++ platform/qemu/virt/platform.c | 24 ++++++++++---------- 4 files changed, 75 insertions(+), 13 deletions(-) create mode 100644 include/sbi_utils/sys/sifive_test.h create mode 100644 lib/utils/sys/sifive_test.c diff --git a/include/sbi_utils/sys/sifive_test.h b/include/sbi_utils/sys/sifive_test.h new file mode 100644 index 0000000..7e153d5 --- /dev/null +++ b/include/sbi_utils/sys/sifive_test.h @@ -0,0 +1,19 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 2020 Western Digital Corporation or its affiliates. + * + * Authors: + * Anup Patel + */ + +#ifndef __SYS_SIFIVE_TEST_H__ +#define __SYS_SIFIVE_TEST_H__ + +#include + +int sifive_test_system_reset(u32 type); + +int sifive_test_init(unsigned long base); + +#endif 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 + */ + +#include +#include +#include + +#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; +} diff --git a/platform/qemu/virt/platform.c b/platform/qemu/virt/platform.c index fd4571d..7836bee 100644 --- a/platform/qemu/virt/platform.c +++ b/platform/qemu/virt/platform.c @@ -18,14 +18,13 @@ #include #include #include +#include /* clang-format off */ #define VIRT_HART_COUNT 8 #define VIRT_TEST_ADDR 0x100000 -#define VIRT_TEST_FINISHER_FAIL 0x3333 -#define VIRT_TEST_FINISHER_PASS 0x5555 #define VIRT_CLINT_ADDR 0x2000000 @@ -39,6 +38,14 @@ /* clang-format on */ +static int virt_early_init(bool cold_boot) +{ + if (!cold_boot) + return 0; + + return sifive_test_init(VIRT_TEST_ADDR); +} + static int virt_final_init(bool cold_boot) { void *fdt; @@ -100,17 +107,8 @@ static int virt_timer_init(bool cold_boot) return clint_warm_timer_init(); } -static int virt_system_reset(u32 type) -{ - /* Tell the "finisher" that the simulation - * was successful so that QEMU exits - */ - writew(VIRT_TEST_FINISHER_PASS, (void *)VIRT_TEST_ADDR); - - return 0; -} - const struct sbi_platform_operations platform_ops = { + .early_init = virt_early_init, .final_init = virt_final_init, .console_putc = uart8250_putc, .console_getc = uart8250_getc, @@ -123,7 +121,7 @@ const struct sbi_platform_operations platform_ops = { .timer_event_stop = clint_timer_event_stop, .timer_event_start = clint_timer_event_start, .timer_init = virt_timer_init, - .system_reset = virt_system_reset, + .system_reset = sifive_test_system_reset, }; const struct sbi_platform platform = { -- 2.7.4