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