blob: ef3d5ccab1cc01667caada440d4b82896e4f858c [file] [log] [blame]
Manish Pandeyd27b37d2021-03-02 14:41:58 +00001/*
2 * Copyright (c) 2021, Arm Limited. All rights reserved.
3 *
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 Pappireddycd183ef2021-08-05 15:34:07 -050025void cactus_interrupt_handler(void)
Manish Pandeyf7aafef2021-03-03 11:31:47 +000026{
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050027 uint32_t intid = spm_interrupt_get();
Manish Pandeyf7aafef2021-03-03 11:31:47 +000028
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050029 switch (intid) {
30 case MANAGED_EXIT_INTERRUPT_ID:
31 /*
32 * A secure partition performs its housekeeping and sends a
33 * direct response to signal interrupt completion.
34 * This is a pure virtual interrupt, no need for deactivation.
35 */
36 cactus_response(g_ffa_id, HYP_ID, MANAGED_EXIT_INTERRUPT_ID);
37 break;
38 case IRQ_TWDOG_INTID:
39 /*
40 * Interrupt triggered due to Trusted watchdog timer expiry.
41 * Clear the interrupt and stop the timer.
42 */
43 NOTICE("Trusted WatchDog timer stopped\n");
44 sp805_twdog_stop();
Manish Pandeyd27b37d2021-03-02 14:41:58 +000045
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050046 /* Perform secure interrupt de-activation. */
47 spm_interrupt_deactivate(intid);
Manish Pandeyd27b37d2021-03-02 14:41:58 +000048
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050049 break;
J-Alvesa076d4c2021-10-19 16:06:15 +010050 case NOTIFICATION_PENDING_INTERRUPT_INTID:
51 notification_pending_interrupt_handler();
52 break;
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050053 default:
54 /*
55 * Currently the only source of secure interrupt is Trusted
56 * Watchdog timer.
57 */
58 ERROR("%s: Interrupt ID %x not handled!\n", __func__,
59 intid);
60 panic();
Manish Pandeyf7aafef2021-03-03 11:31:47 +000061 }
Manish Pandeyd27b37d2021-03-02 14:41:58 +000062}