| /* |
| * Copyright 2020 NXP |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| * |
| */ |
| |
| #include <bl31/interrupt_mgmt.h> |
| #include <common/debug.h> |
| #include <ls_interrupt_mgmt.h> |
| #include <plat/common/platform.h> |
| |
| static interrupt_type_handler_t type_el3_interrupt_table[MAX_INTR_EL3]; |
| |
| int request_intr_type_el3(uint32_t id, interrupt_type_handler_t handler) |
| { |
| /* Validate 'handler' and 'id' parameters */ |
| if (!handler || id >= MAX_INTR_EL3) { |
| return -EINVAL; |
| } |
| |
| /* Check if a handler has already been registered */ |
| if (type_el3_interrupt_table[id] != NULL) { |
| return -EALREADY; |
| } |
| |
| type_el3_interrupt_table[id] = handler; |
| |
| return 0; |
| } |
| |
| static uint64_t ls_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(); |
| |
| INFO("Interrupt recvd is %d\n", intr_id); |
| |
| handler = type_el3_interrupt_table[intr_id]; |
| if (handler != NULL) { |
| handler(intr_id, flags, handle, cookie); |
| } |
| |
| /* |
| * Mark this interrupt as complete to avoid a interrupt storm. |
| */ |
| plat_ic_end_of_interrupt(intr_id); |
| |
| return 0U; |
| } |
| |
| void ls_el3_interrupt_config(void) |
| { |
| uint64_t flags = 0U; |
| uint64_t rc; |
| |
| set_interrupt_rm_flag(flags, NON_SECURE); |
| rc = register_interrupt_type_handler(INTR_TYPE_EL3, |
| ls_el3_interrupt_handler, flags); |
| if (rc != 0U) { |
| panic(); |
| } |
| } |