1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright 2020 NXP 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu * 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu #include <bl31/interrupt_mgmt.h> 9*91f16700Schasinglulu #include <common/debug.h> 10*91f16700Schasinglulu #include <ls_interrupt_mgmt.h> 11*91f16700Schasinglulu #include <plat/common/platform.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu static interrupt_type_handler_t type_el3_interrupt_table[MAX_INTR_EL3]; 14*91f16700Schasinglulu 15*91f16700Schasinglulu int request_intr_type_el3(uint32_t id, interrupt_type_handler_t handler) 16*91f16700Schasinglulu { 17*91f16700Schasinglulu /* Validate 'handler' and 'id' parameters */ 18*91f16700Schasinglulu if (!handler || id >= MAX_INTR_EL3) { 19*91f16700Schasinglulu return -EINVAL; 20*91f16700Schasinglulu } 21*91f16700Schasinglulu 22*91f16700Schasinglulu /* Check if a handler has already been registered */ 23*91f16700Schasinglulu if (type_el3_interrupt_table[id] != NULL) { 24*91f16700Schasinglulu return -EALREADY; 25*91f16700Schasinglulu } 26*91f16700Schasinglulu 27*91f16700Schasinglulu type_el3_interrupt_table[id] = handler; 28*91f16700Schasinglulu 29*91f16700Schasinglulu return 0; 30*91f16700Schasinglulu } 31*91f16700Schasinglulu 32*91f16700Schasinglulu static uint64_t ls_el3_interrupt_handler(uint32_t id, uint32_t flags, 33*91f16700Schasinglulu void *handle, void *cookie) 34*91f16700Schasinglulu { 35*91f16700Schasinglulu uint32_t intr_id; 36*91f16700Schasinglulu interrupt_type_handler_t handler; 37*91f16700Schasinglulu 38*91f16700Schasinglulu intr_id = plat_ic_get_pending_interrupt_id(); 39*91f16700Schasinglulu 40*91f16700Schasinglulu INFO("Interrupt recvd is %d\n", intr_id); 41*91f16700Schasinglulu 42*91f16700Schasinglulu handler = type_el3_interrupt_table[intr_id]; 43*91f16700Schasinglulu if (handler != NULL) { 44*91f16700Schasinglulu handler(intr_id, flags, handle, cookie); 45*91f16700Schasinglulu } 46*91f16700Schasinglulu 47*91f16700Schasinglulu /* 48*91f16700Schasinglulu * Mark this interrupt as complete to avoid a interrupt storm. 49*91f16700Schasinglulu */ 50*91f16700Schasinglulu plat_ic_end_of_interrupt(intr_id); 51*91f16700Schasinglulu 52*91f16700Schasinglulu return 0U; 53*91f16700Schasinglulu } 54*91f16700Schasinglulu 55*91f16700Schasinglulu void ls_el3_interrupt_config(void) 56*91f16700Schasinglulu { 57*91f16700Schasinglulu uint64_t flags = 0U; 58*91f16700Schasinglulu uint64_t rc; 59*91f16700Schasinglulu 60*91f16700Schasinglulu set_interrupt_rm_flag(flags, NON_SECURE); 61*91f16700Schasinglulu rc = register_interrupt_type_handler(INTR_TYPE_EL3, 62*91f16700Schasinglulu ls_el3_interrupt_handler, flags); 63*91f16700Schasinglulu if (rc != 0U) { 64*91f16700Schasinglulu panic(); 65*91f16700Schasinglulu } 66*91f16700Schasinglulu } 67