From 8c25dcbf7692902a16e55679d84964db54464064 Mon Sep 17 00:00:00 2001 From: Damien Le Moal Date: Thu, 24 Jan 2019 16:56:47 +0900 Subject: platform: add template platform files Create commented template files to use as a base for new platforms support implementation. Signed-off-by: Damien Le Moal --- platform/template/config.mk | 62 +++++++++++ platform/template/objects.mk | 15 +++ platform/template/platform.c | 242 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 319 insertions(+) create mode 100644 platform/template/config.mk create mode 100644 platform/template/objects.mk create mode 100644 platform/template/platform.c diff --git a/platform/template/config.mk b/platform/template/config.mk new file mode 100644 index 0000000..b1457da --- /dev/null +++ b/platform/template/config.mk @@ -0,0 +1,62 @@ +# +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2019 Western Digital Corporation or its affiliates. +# + +# Compiler pre-processor flags +platform-cppflags-y = + +# C Compiler and assembler flags. +# For a 64 bits platform, this will likely be: +# -mabi=lp64 -march=rv64imafdc -mcmodel=medany +# For a 32 bits platform, this will likely be: +# -mabi=lp32 -march=rv32imafdc -mcmodel=medlow +platform-cflags-y = -mabi=lp64 -march=rv64imafdc -mcmodel=medany +platform-asflags-y = -mabi=lp64 -march=rv64imafdc -mcmodel=medany + +# Linker flags: additional libraries and object files that the platform +# code needs can be added here +platform-ldflags-y = + +# +# OpenSBI implements generic drivers for some common generic hardware. The +# drivers currently available are the RISC-V Platform Level Interrupt +# Controller (PLIC), RISC-V Core Local Interrupt controller (CLINT) and a UART +# 8250 compliant serial line driver (UART8250). The following definitions allow +# enabling the use of these generic drivers for the platform. +# +# PLATFORM_IRQCHIP_PLIC= +# PLATFORM_SYS_CLINT= +# PLATFORM_SERIAL_UART8250= + +# Firmware load address configuration. This is mandatory. +FW_TEXT_START=0x80000000 + +# +# Jump firmware configuration. +# Optional parameters are commented out. Uncomment and define these parameters +# as needed. +# +FW_JUMP= +FW_JUMP_ADDR=0x80200000 +# FW_JUMP_FDT_ADDR=0x82200000 + +# +# Firmware with payload configuration. +# Optional parameters are commented out. Uncomment and define these parameters +# as needed. +# +FW_PAYLOAD= +FW_PAYLOAD_OFFSET=0x200000 +# FW_PAYLOAD_ALIGN=0x1000 +# FW_PAYLOAD_PATH="path to next boot stage binary image file" +# FW_PAYLOAD_FDT_PATH="path to platform flattened device tree file" +# FW_PAYLOAD_FDT="name of the platform defined flattened device tree file" +# FW_PAYLOAD_FDT_ADDR=0x82200000 + +# +# Allow linking against static libc for standard functions (memset, memcpy, etc) +# +# PLATFORM_INCLUDE_LIBC=y + diff --git a/platform/template/objects.mk b/platform/template/objects.mk new file mode 100644 index 0000000..b9ba231 --- /dev/null +++ b/platform/template/objects.mk @@ -0,0 +1,15 @@ +# +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2019 Western Digital Corporation or its affiliates. +# + +# Space separated list of object file names to be compiled for the platform +platform-objs-y += platform.o + +# +# If the platform support requires a device tree file, the name of the device +# tree compiled file should be specified here. The device tree source file +# be in the form
.dts +# +# platform-dtb-y +=
.dtb diff --git a/platform/template/platform.c b/platform/template/platform.c new file mode 100644 index 0000000..cc4065e --- /dev/null +++ b/platform/template/platform.c @@ -0,0 +1,242 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2019 Western Digital Corporation or its affiliates. + */ + +#include +#include +#include + +/* + * Include these files as needed. + * See config.mk PLATFORM_xxx configuration parameters. + */ +#include +#include +#include + +/* + * Platform early initialization. + */ +static int platform_early_init(bool cold_boot) +{ + return 0; +} + +/* + * Platform final initialization. + */ +static int platform final_init(bool cold_boot); +{ + return 0; +} + +/* + * Get number of PMP regions for given HART. + */ +static u32 platform_pmp_region_count(u32 hartid) +{ + return 0; +} + +/* + * Get PMP regions details (namely: protection, base address, and size) for + * a given HART. + */ +static int platform_pmp_region_info(u32 hartid, u32 index, + ulong *prot, ulong *addr, ulong *log2size) +{ + return 0; +} + +/* + * Initialize the platform console. + */ +static int platform_console_init(void) +{ + /* Example if the generic UART8250 driver is used */ + return uart8250_init(PLATFORM_UART_ADDR, + PLATFORM_UART_SHIFTREG_ADDR, + PLATFORM_UART_BAUDRATE, 0, 1); +} + +/* + * Write a character to the platform console output. + */ +static void platform_console_putc(char ch) +{ + /* Example if the generic UART8250 driver is used */ + uart8250_putc(ch); +} + +/* + * Read a character from the platform console input. + */ +static char platform_console_getc(void) +{ + return uart8250_getc(); +} + +/* + * Initialize the platform interrupt controller for current HART. + */ +static int platform_irqchip_init(bool cold_boot) +{ + u32 hartid = sbi_current_hartid(); + int ret; + + /* Example if the generic PLIC driver is used */ + if (cold_boot) { + ret = plic_cold_irqchip_init(PLATFORM_PLIC_ADDR, + PLATFORM_PLIC_NUM_SOURCES, + PLATFORM_HART_COUNT); + if (ret) + return ret; + } + + return plic_warm_irqchip_init(hartid, 2 * hartid, 2 * hartid + 1); +} + +/* + * Initialize IPI for current HART. + */ +static int platform_ipi_init(bool cold_boot) +{ + int ret; + + /* Example if the generic CLINT driver is used */ + if (cold_boot) { + ret = clint_cold_ipi_init(PLATFORM_CLINT_ADDR, + PLATFORM_HART_COUNT); + if (ret) + return ret; + } + + return clint_warm_ipi_init(); +} + +/* + * Send IPI to a target HART + */ +static void platform_ipi_send(u32 target_hart) +{ + /* Example if the generic CLINT driver is used */ + clint_ipi_send(target_hart); +} + +/* + * Wait for target HART to acknowledge IPI. + */ +static void platform_ipi_sync(u32 target_hart) +{ + /* Example if the generic CLINT driver is used */ + clint_ipi_sync(target_hart); +} + +/* + * Clear IPI for a target HART. + */ +static void platform_ipi_clear(u32 target_hart) +{ + /* Example if the generic CLINT driver is used */ + clint_ipi_clear(target_hart); +} + +/* + * Initialize platform timer for current HART. + */ +static int platform_timer_init(bool cold_boot) +{ + int ret; + + /* Example if the generic CLINT driver is used */ + if (cold_boot) { + ret = clint_cold_timer_init(PLATFORM_CLINT_ADDR, + PLATFORM_HART_COUNT); + if (ret) + return ret; + } + + return clint_warm_timer_init(); +} + +/* + * Get platform timer value. + */ +static u64 platform_timer_value(void) +{ + /* Example if the generic CLINT driver is used */ + return clint_timer_value(); +} + +/* + * Start platform timer event for current HART. + */ +static void platform_timer_event_start(u64 next_event) +{ + /* Example if the generic CLINT driver is used */ + clint_timer_event_start(next_event); +} + +/* + * Stop platform timer event for current HART. + */ +static void platform_timer_event_stop(void) +{ + /* Example if the generic CLINT driver is used */ + clint_timer_event_stop(); +} + +/* + * Reboot the platform. + */ +static int platform_system_reboot(u32 type) +{ + return 0; +} + +/* + * Shutdown or poweroff the platform. + */ +static int platform_system_shutdown(u32 type) +{ + return 0; +} + +/* + * Platform descriptor. + */ +struct sbi_platform platform = { + + .name = "platform-name", + .features = SBI_PLATFORM_DEFAULT_FEATURES, + .hart_count = 1, + .hart_stack_size = 4096, + .disabled_hart_mask = 0, + + .early_init = platform_final_init, + .final_init = platform_final_init, + + .pmp_region_count = platform_pmp_region_count, + .pmp_region_info = platform_pmp_region_info, + + .console_init = platform_console_init, + .console_putc = platform_console_putc, + .console_getc = platform_console_getc, + + .irqchip_init = platform_irqchip_init, + .ipi_init = platform_ipi_init, + .ipi_send = platform_ipi_send, + .ipi_sync = platform_ipi_sync, + .ipi_clear = platform_ipi_clear, + + .timer_init = platform_timer_init, + .timer_value = platform_timer_value, + .timer_event_start = platform_timer_event_start, + .timer_event_stop = platform_timer_event_stop, + + .system_reboot = platform_system_down, + .system_shutdown = platform_system_down +}; + -- cgit v1.2.3