blob: f0d916fb465d0e1619602b546f16fc55edaff2ed [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 Pappireddy7caaa4a2022-01-28 17:01:35 -060025extern spinlock_t sp_handler_lock[NUM_VINT_ID];
26
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050027void cactus_interrupt_handler(void)
Manish Pandeyf7aafef2021-03-03 11:31:47 +000028{
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050029 uint32_t intid = spm_interrupt_get();
Manish Pandeyf7aafef2021-03-03 11:31:47 +000030
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050031 switch (intid) {
32 case MANAGED_EXIT_INTERRUPT_ID:
33 /*
34 * A secure partition performs its housekeeping and sends a
35 * direct response to signal interrupt completion.
36 * This is a pure virtual interrupt, no need for deactivation.
37 */
38 cactus_response(g_ffa_id, HYP_ID, MANAGED_EXIT_INTERRUPT_ID);
39 break;
40 case IRQ_TWDOG_INTID:
41 /*
42 * Interrupt triggered due to Trusted watchdog timer expiry.
43 * Clear the interrupt and stop the timer.
44 */
45 NOTICE("Trusted WatchDog timer stopped\n");
46 sp805_twdog_stop();
Manish Pandeyd27b37d2021-03-02 14:41:58 +000047
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050048 /* Perform secure interrupt de-activation. */
49 spm_interrupt_deactivate(intid);
Manish Pandeyd27b37d2021-03-02 14:41:58 +000050
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050051 break;
J-Alvesa076d4c2021-10-19 16:06:15 +010052 case NOTIFICATION_PENDING_INTERRUPT_INTID:
53 notification_pending_interrupt_handler();
54 break;
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050055 default:
56 /*
57 * Currently the only source of secure interrupt is Trusted
58 * Watchdog timer.
59 */
60 ERROR("%s: Interrupt ID %x not handled!\n", __func__,
61 intid);
62 panic();
Manish Pandeyf7aafef2021-03-03 11:31:47 +000063 }
Madhukar Pappireddy7caaa4a2022-01-28 17:01:35 -060064
65 /* Invoke the tail end handler registered by the SP. */
66 spin_lock(&sp_handler_lock[intid]);
67 if (sp_interrupt_tail_end_handler[intid]) {
68 sp_interrupt_tail_end_handler[intid]();
69 }
70 spin_unlock(&sp_handler_lock[intid]);
Manish Pandeyd27b37d2021-03-02 14:41:58 +000071}