123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- /*
- * 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();
- }
- }
|