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