xref: /arm-trusted-firmware/plat/nxp/common/setup/ls_interrupt_mgmt.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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