diff options
Diffstat (limited to 'plat/xilinx/versal/bl31_versal_setup.c')
-rw-r--r-- | plat/xilinx/versal/bl31_versal_setup.c | 77 |
1 files changed, 64 insertions, 13 deletions
diff --git a/plat/xilinx/versal/bl31_versal_setup.c b/plat/xilinx/versal/bl31_versal_setup.c index 5e870ff5f..8b8714cb6 100644 --- a/plat/xilinx/versal/bl31_versal_setup.c +++ b/plat/xilinx/versal/bl31_versal_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2018-2021, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -11,6 +11,7 @@ #include <bl31/bl31.h> #include <common/bl_common.h> #include <common/debug.h> +#include <drivers/arm/dcc.h> #include <drivers/arm/pl011.h> #include <drivers/console.h> #include <lib/mmio.h> @@ -22,7 +23,6 @@ static entry_point_info_t bl32_image_ep_info; static entry_point_info_t bl33_image_ep_info; -static console_t versal_runtime_console; /* * Return a pointer to the 'entry_point_info' structure of the next image for @@ -64,18 +64,26 @@ void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, { uint64_t atf_handoff_addr; - /* Initialize the console to provide early debug support */ - int rc = console_pl011_register(VERSAL_UART_BASE, - VERSAL_UART_CLOCK, - VERSAL_UART_BAUDRATE, - &versal_runtime_console); - if (rc == 0) { - panic(); + if (VERSAL_CONSOLE_IS(pl011)) { + static console_t versal_runtime_console; + /* Initialize the console to provide early debug support */ + int rc = console_pl011_register(VERSAL_UART_BASE, + VERSAL_UART_CLOCK, + VERSAL_UART_BAUDRATE, + &versal_runtime_console); + if (rc == 0) { + panic(); + } + + console_set_scope(&versal_runtime_console, CONSOLE_FLAG_BOOT | + CONSOLE_FLAG_RUNTIME); + } else if (VERSAL_CONSOLE_IS(dcc)) { + /* Initialize the dcc console for debug */ + int rc = console_dcc_register(); + if (rc == 0) { + panic(); + } } - - console_set_scope(&versal_runtime_console, CONSOLE_FLAG_BOOT | - CONSOLE_FLAG_RUNTIME); - /* Initialize the platform config for future decision making */ versal_config_setup(); /* There are no parameters from BL2 if BL31 is a reset vector */ @@ -109,6 +117,40 @@ void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, NOTICE("BL31: Non secure code at 0x%lx\n", bl33_image_ep_info.pc); } +static interrupt_type_handler_t type_el3_interrupt_handler; + +int request_intr_type_el3(uint32_t id, interrupt_type_handler_t handler) +{ + /* Validate 'handler'*/ + if (!handler) { + return -EINVAL; + } + + type_el3_interrupt_handler = handler; + + return 0; +} + +static uint64_t rdo_el3_interrupt_handler(uint32_t id, uint32_t flags, + void *handle, void *cookie) +{ + uint32_t intr_id; + interrupt_type_handler_t handler; + + intr_id = plat_ic_get_pending_interrupt_id(); + /* Currently we support one interrupt */ + if (intr_id != PLAT_VERSAL_IPI_IRQ) { + WARN("Unexpected interrupt call: 0x%x\n", intr_id); + return 0; + } + + handler = type_el3_interrupt_handler; + if (handler) { + return handler(intr_id, flags, handle, cookie); + } + + return 0; +} void bl31_platform_setup(void) { /* Initialize the gic cpu and distributor interfaces */ @@ -118,6 +160,15 @@ void bl31_platform_setup(void) void bl31_plat_runtime_setup(void) { + uint64_t flags = 0; + uint64_t rc; + + set_interrupt_rm_flag(flags, NON_SECURE); + rc = register_interrupt_type_handler(INTR_TYPE_EL3, + rdo_el3_interrupt_handler, flags); + if (rc) { + panic(); + } } /* |