blob: 02d1fbfe3db03ca6c80cb03310a1b88327de5e44 [file] [log] [blame]
Manish Pandeyd27b37d2021-03-02 14:41:58 +00001/*
Madhukar Pappireddy7caaa4a2022-01-28 17:01:35 -06002 * Copyright (c) 2021-2022, Arm Limited. All rights reserved.
Manish Pandeyd27b37d2021-03-02 14:41:58 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <debug.h>
8
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -05009#include "cactus_message_loop.h"
10#include "cactus_test_cmds.h"
11#include <drivers/arm/sp805.h>
Manish Pandeyd27b37d2021-03-02 14:41:58 +000012#include <ffa_helpers.h>
13#include <sp_helpers.h>
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050014#include "spm_common.h"
Manish Pandey58971b62020-09-21 21:10:38 +010015#include <spm_helpers.h>
Manish Pandeyd27b37d2021-03-02 14:41:58 +000016
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050017#include <platform_def.h>
Manish Pandeyf7aafef2021-03-03 11:31:47 +000018
J-Alvesa076d4c2021-10-19 16:06:15 +010019#define NOTIFICATION_PENDING_INTERRUPT_INTID 5
20
21extern void notification_pending_interrupt_handler(void);
22
Daniel Boulbye79d2072021-03-03 11:34:53 +000023extern ffa_id_t g_ffa_id;
Manish Pandeyf7aafef2021-03-03 11:31:47 +000024
Madhukar Pappireddyf4c8e8d2022-02-15 15:52:53 -060025/* Secure virtual interrupt that was last handled by Cactus SP. */
26uint32_t last_serviced_interrupt[PLATFORM_CORE_COUNT];
27
Madhukar Pappireddy7caaa4a2022-01-28 17:01:35 -060028extern spinlock_t sp_handler_lock[NUM_VINT_ID];
29
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050030void cactus_interrupt_handler(void)
Manish Pandeyf7aafef2021-03-03 11:31:47 +000031{
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050032 uint32_t intid = spm_interrupt_get();
Madhukar Pappireddyf4c8e8d2022-02-15 15:52:53 -060033 unsigned int core_pos = get_current_core_id();
Manish Pandeyf7aafef2021-03-03 11:31:47 +000034
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050035 switch (intid) {
36 case MANAGED_EXIT_INTERRUPT_ID:
37 /*
38 * A secure partition performs its housekeeping and sends a
39 * direct response to signal interrupt completion.
40 * This is a pure virtual interrupt, no need for deactivation.
41 */
42 cactus_response(g_ffa_id, HYP_ID, MANAGED_EXIT_INTERRUPT_ID);
43 break;
44 case IRQ_TWDOG_INTID:
45 /*
46 * Interrupt triggered due to Trusted watchdog timer expiry.
47 * Clear the interrupt and stop the timer.
48 */
Olivier Deprezb92d91b2022-03-16 17:14:26 +010049 VERBOSE("Trusted WatchDog timer stopped\n");
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050050 sp805_twdog_stop();
Manish Pandeyd27b37d2021-03-02 14:41:58 +000051
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050052 /* Perform secure interrupt de-activation. */
53 spm_interrupt_deactivate(intid);
Manish Pandeyd27b37d2021-03-02 14:41:58 +000054
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050055 break;
J-Alvesa076d4c2021-10-19 16:06:15 +010056 case NOTIFICATION_PENDING_INTERRUPT_INTID:
57 notification_pending_interrupt_handler();
58 break;
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050059 default:
60 /*
61 * Currently the only source of secure interrupt is Trusted
62 * Watchdog timer.
63 */
64 ERROR("%s: Interrupt ID %x not handled!\n", __func__,
65 intid);
66 panic();
Manish Pandeyf7aafef2021-03-03 11:31:47 +000067 }
Madhukar Pappireddy7caaa4a2022-01-28 17:01:35 -060068
Madhukar Pappireddyf4c8e8d2022-02-15 15:52:53 -060069 last_serviced_interrupt[core_pos] = intid;
70
Madhukar Pappireddy7caaa4a2022-01-28 17:01:35 -060071 /* Invoke the tail end handler registered by the SP. */
72 spin_lock(&sp_handler_lock[intid]);
73 if (sp_interrupt_tail_end_handler[intid]) {
74 sp_interrupt_tail_end_handler[intid]();
75 }
76 spin_unlock(&sp_handler_lock[intid]);
Manish Pandeyd27b37d2021-03-02 14:41:58 +000077}