blob: 0ef114833c539748b0d773108ed9247e5914541c [file] [log] [blame]
Achin Gupta92712a52015-09-03 14:18:02 +01001/*
Jeenu Viswambharanb6982c02018-03-22 08:57:52 +00002 * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
Achin Gupta92712a52015-09-03 14:18:02 +01003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Achin Gupta92712a52015-09-03 14:18:02 +01005 */
6
7#ifndef __GIC_COMMON_H__
8#define __GIC_COMMON_H__
9
Jeenu Viswambharan837cc9c2018-08-02 10:14:12 +010010#include <utils_def.h>
11
Achin Gupta92712a52015-09-03 14:18:02 +010012/*******************************************************************************
13 * GIC Distributor interface general definitions
14 ******************************************************************************/
15/* Constants to categorise interrupts */
Antonio Nino Diaz2e590712018-08-24 11:46:33 +010016#define MIN_SGI_ID U(0)
17#define MIN_SEC_SGI_ID U(8)
18#define MIN_PPI_ID U(16)
19#define MIN_SPI_ID U(32)
20#define MAX_SPI_ID U(1019)
Soby Mathew327548c2017-07-13 15:19:51 +010021
Antonio Nino Diaz2e590712018-08-24 11:46:33 +010022#define TOTAL_SPI_INTR_NUM (MAX_SPI_ID - MIN_SPI_ID + U(1))
Soby Mathew327548c2017-07-13 15:19:51 +010023#define TOTAL_PCPU_INTR_NUM (MIN_SPI_ID - MIN_SGI_ID)
Achin Gupta92712a52015-09-03 14:18:02 +010024
25/* Mask for the priority field common to all GIC interfaces */
Antonio Nino Diaz2e590712018-08-24 11:46:33 +010026#define GIC_PRI_MASK U(0xff)
Achin Gupta92712a52015-09-03 14:18:02 +010027
Jeenu Viswambharan4684bce2017-09-22 08:32:09 +010028/* Mask for the configuration field common to all GIC interfaces */
Antonio Nino Diaz2e590712018-08-24 11:46:33 +010029#define GIC_CFG_MASK U(0x3)
Jeenu Viswambharan4684bce2017-09-22 08:32:09 +010030
Achin Gupta92712a52015-09-03 14:18:02 +010031/* Constant to indicate a spurious interrupt in all GIC versions */
Antonio Nino Diaz2e590712018-08-24 11:46:33 +010032#define GIC_SPURIOUS_INTERRUPT U(1023)
Achin Gupta92712a52015-09-03 14:18:02 +010033
Jeenu Viswambharanb6982c02018-03-22 08:57:52 +000034/* Interrupt configurations: 2-bit fields with LSB reserved */
35#define GIC_INTR_CFG_LEVEL (0 << 1)
36#define GIC_INTR_CFG_EDGE (1 << 1)
Jeenu Viswambharanaeb267c2017-09-22 08:32:09 +010037
Achin Gupta92712a52015-09-03 14:18:02 +010038/* Constants to categorise priorities */
Jeenu Viswambharan837cc9c2018-08-02 10:14:12 +010039#define GIC_HIGHEST_SEC_PRIORITY U(0x00)
40#define GIC_LOWEST_SEC_PRIORITY U(0x7f)
41#define GIC_HIGHEST_NS_PRIORITY U(0x80)
42#define GIC_LOWEST_NS_PRIORITY U(0xfe) /* 0xff would disable all interrupts */
Achin Gupta92712a52015-09-03 14:18:02 +010043
44/*******************************************************************************
45 * GIC Distributor interface register offsets that are common to GICv3 & GICv2
46 ******************************************************************************/
Antonio Nino Diaz2e590712018-08-24 11:46:33 +010047#define GICD_CTLR U(0x0)
48#define GICD_TYPER U(0x4)
49#define GICD_IIDR U(0x8)
50#define GICD_IGROUPR U(0x80)
51#define GICD_ISENABLER U(0x100)
52#define GICD_ICENABLER U(0x180)
53#define GICD_ISPENDR U(0x200)
54#define GICD_ICPENDR U(0x280)
55#define GICD_ISACTIVER U(0x300)
56#define GICD_ICACTIVER U(0x380)
57#define GICD_IPRIORITYR U(0x400)
58#define GICD_ICFGR U(0xc00)
59#define GICD_NSACR U(0xe00)
Achin Gupta92712a52015-09-03 14:18:02 +010060
61/* GICD_CTLR bit definitions */
62#define CTLR_ENABLE_G0_SHIFT 0
Antonio Nino Diaz2e590712018-08-24 11:46:33 +010063#define CTLR_ENABLE_G0_MASK U(0x1)
64#define CTLR_ENABLE_G0_BIT BIT_32(CTLR_ENABLE_G0_SHIFT)
Achin Gupta92712a52015-09-03 14:18:02 +010065
66
67/*******************************************************************************
68 * GIC Distributor interface register constants that are common to GICv3 & GICv2
69 ******************************************************************************/
70#define PIDR2_ARCH_REV_SHIFT 4
Antonio Nino Diaz2e590712018-08-24 11:46:33 +010071#define PIDR2_ARCH_REV_MASK U(0xf)
Achin Gupta92712a52015-09-03 14:18:02 +010072
73/* GICv3 revision as reported by the PIDR2 register */
Antonio Nino Diaz2e590712018-08-24 11:46:33 +010074#define ARCH_REV_GICV3 U(0x3)
Achin Gupta92712a52015-09-03 14:18:02 +010075/* GICv2 revision as reported by the PIDR2 register */
Antonio Nino Diaz2e590712018-08-24 11:46:33 +010076#define ARCH_REV_GICV2 U(0x2)
Etienne Carriere0a8c3532017-11-05 22:57:38 +010077/* GICv1 revision as reported by the PIDR2 register */
Antonio Nino Diaz2e590712018-08-24 11:46:33 +010078#define ARCH_REV_GICV1 U(0x1)
Achin Gupta92712a52015-09-03 14:18:02 +010079
80#define IGROUPR_SHIFT 5
81#define ISENABLER_SHIFT 5
82#define ICENABLER_SHIFT ISENABLER_SHIFT
83#define ISPENDR_SHIFT 5
84#define ICPENDR_SHIFT ISPENDR_SHIFT
85#define ISACTIVER_SHIFT 5
86#define ICACTIVER_SHIFT ISACTIVER_SHIFT
87#define IPRIORITYR_SHIFT 2
Jeenu Viswambharandce70b32017-09-22 08:32:09 +010088#define ITARGETSR_SHIFT 2
Achin Gupta92712a52015-09-03 14:18:02 +010089#define ICFGR_SHIFT 4
90#define NSACR_SHIFT 4
91
92/* GICD_TYPER shifts and masks */
Antonio Nino Diaz2e590712018-08-24 11:46:33 +010093#define TYPER_IT_LINES_NO_SHIFT U(0)
94#define TYPER_IT_LINES_NO_MASK U(0x1f)
Achin Gupta92712a52015-09-03 14:18:02 +010095
96/* Value used to initialize Normal world interrupt priorities four at a time */
97#define GICD_IPRIORITYR_DEF_VAL \
98 (GIC_HIGHEST_NS_PRIORITY | \
99 (GIC_HIGHEST_NS_PRIORITY << 8) | \
100 (GIC_HIGHEST_NS_PRIORITY << 16) | \
101 (GIC_HIGHEST_NS_PRIORITY << 24))
102
Achin Gupta92712a52015-09-03 14:18:02 +0100103#endif /* __GIC_COMMON_H__ */