Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2013, 2014 ARM Limited, All Rights Reserved.
0004  * Author: Marc Zyngier <marc.zyngier@arm.com>
0005  */
0006 #ifndef __LINUX_IRQCHIP_ARM_GIC_V3_H
0007 #define __LINUX_IRQCHIP_ARM_GIC_V3_H
0008 
0009 /*
0010  * Distributor registers. We assume we're running non-secure, with ARE
0011  * being set. Secure-only and non-ARE registers are not described.
0012  */
0013 #define GICD_CTLR           0x0000
0014 #define GICD_TYPER          0x0004
0015 #define GICD_IIDR           0x0008
0016 #define GICD_TYPER2         0x000C
0017 #define GICD_STATUSR            0x0010
0018 #define GICD_SETSPI_NSR         0x0040
0019 #define GICD_CLRSPI_NSR         0x0048
0020 #define GICD_SETSPI_SR          0x0050
0021 #define GICD_CLRSPI_SR          0x0058
0022 #define GICD_IGROUPR            0x0080
0023 #define GICD_ISENABLER          0x0100
0024 #define GICD_ICENABLER          0x0180
0025 #define GICD_ISPENDR            0x0200
0026 #define GICD_ICPENDR            0x0280
0027 #define GICD_ISACTIVER          0x0300
0028 #define GICD_ICACTIVER          0x0380
0029 #define GICD_IPRIORITYR         0x0400
0030 #define GICD_ICFGR          0x0C00
0031 #define GICD_IGRPMODR           0x0D00
0032 #define GICD_NSACR          0x0E00
0033 #define GICD_IGROUPRnE          0x1000
0034 #define GICD_ISENABLERnE        0x1200
0035 #define GICD_ICENABLERnE        0x1400
0036 #define GICD_ISPENDRnE          0x1600
0037 #define GICD_ICPENDRnE          0x1800
0038 #define GICD_ISACTIVERnE        0x1A00
0039 #define GICD_ICACTIVERnE        0x1C00
0040 #define GICD_IPRIORITYRnE       0x2000
0041 #define GICD_ICFGRnE            0x3000
0042 #define GICD_IROUTER            0x6000
0043 #define GICD_IROUTERnE          0x8000
0044 #define GICD_IDREGS         0xFFD0
0045 #define GICD_PIDR2          0xFFE8
0046 
0047 #define ESPI_BASE_INTID         4096
0048 
0049 /*
0050  * Those registers are actually from GICv2, but the spec demands that they
0051  * are implemented as RES0 if ARE is 1 (which we do in KVM's emulated GICv3).
0052  */
0053 #define GICD_ITARGETSR          0x0800
0054 #define GICD_SGIR           0x0F00
0055 #define GICD_CPENDSGIR          0x0F10
0056 #define GICD_SPENDSGIR          0x0F20
0057 
0058 #define GICD_CTLR_RWP           (1U << 31)
0059 #define GICD_CTLR_nASSGIreq     (1U << 8)
0060 #define GICD_CTLR_DS            (1U << 6)
0061 #define GICD_CTLR_ARE_NS        (1U << 4)
0062 #define GICD_CTLR_ENABLE_G1A        (1U << 1)
0063 #define GICD_CTLR_ENABLE_G1     (1U << 0)
0064 
0065 #define GICD_IIDR_IMPLEMENTER_SHIFT 0
0066 #define GICD_IIDR_IMPLEMENTER_MASK  (0xfff << GICD_IIDR_IMPLEMENTER_SHIFT)
0067 #define GICD_IIDR_REVISION_SHIFT    12
0068 #define GICD_IIDR_REVISION_MASK     (0xf << GICD_IIDR_REVISION_SHIFT)
0069 #define GICD_IIDR_VARIANT_SHIFT     16
0070 #define GICD_IIDR_VARIANT_MASK      (0xf << GICD_IIDR_VARIANT_SHIFT)
0071 #define GICD_IIDR_PRODUCT_ID_SHIFT  24
0072 #define GICD_IIDR_PRODUCT_ID_MASK   (0xff << GICD_IIDR_PRODUCT_ID_SHIFT)
0073 
0074 
0075 /*
0076  * In systems with a single security state (what we emulate in KVM)
0077  * the meaning of the interrupt group enable bits is slightly different
0078  */
0079 #define GICD_CTLR_ENABLE_SS_G1      (1U << 1)
0080 #define GICD_CTLR_ENABLE_SS_G0      (1U << 0)
0081 
0082 #define GICD_TYPER_RSS          (1U << 26)
0083 #define GICD_TYPER_LPIS         (1U << 17)
0084 #define GICD_TYPER_MBIS         (1U << 16)
0085 #define GICD_TYPER_ESPI         (1U << 8)
0086 
0087 #define GICD_TYPER_ID_BITS(typer)   ((((typer) >> 19) & 0x1f) + 1)
0088 #define GICD_TYPER_NUM_LPIS(typer)  ((((typer) >> 11) & 0x1f) + 1)
0089 #define GICD_TYPER_SPIS(typer)      ((((typer) & 0x1f) + 1) * 32)
0090 #define GICD_TYPER_ESPIS(typer)                     \
0091     (((typer) & GICD_TYPER_ESPI) ? GICD_TYPER_SPIS((typer) >> 27) : 0)
0092 
0093 #define GICD_TYPER2_nASSGIcap       (1U << 8)
0094 #define GICD_TYPER2_VIL         (1U << 7)
0095 #define GICD_TYPER2_VID         GENMASK(4, 0)
0096 
0097 #define GICD_IROUTER_SPI_MODE_ONE   (0U << 31)
0098 #define GICD_IROUTER_SPI_MODE_ANY   (1U << 31)
0099 
0100 #define GIC_PIDR2_ARCH_MASK     0xf0
0101 #define GIC_PIDR2_ARCH_GICv3        0x30
0102 #define GIC_PIDR2_ARCH_GICv4        0x40
0103 
0104 #define GIC_V3_DIST_SIZE        0x10000
0105 
0106 #define GIC_PAGE_SIZE_4K        0ULL
0107 #define GIC_PAGE_SIZE_16K       1ULL
0108 #define GIC_PAGE_SIZE_64K       2ULL
0109 #define GIC_PAGE_SIZE_MASK      3ULL
0110 
0111 /*
0112  * Re-Distributor registers, offsets from RD_base
0113  */
0114 #define GICR_CTLR           GICD_CTLR
0115 #define GICR_IIDR           0x0004
0116 #define GICR_TYPER          0x0008
0117 #define GICR_STATUSR            GICD_STATUSR
0118 #define GICR_WAKER          0x0014
0119 #define GICR_SETLPIR            0x0040
0120 #define GICR_CLRLPIR            0x0048
0121 #define GICR_PROPBASER          0x0070
0122 #define GICR_PENDBASER          0x0078
0123 #define GICR_INVLPIR            0x00A0
0124 #define GICR_INVALLR            0x00B0
0125 #define GICR_SYNCR          0x00C0
0126 #define GICR_IDREGS         GICD_IDREGS
0127 #define GICR_PIDR2          GICD_PIDR2
0128 
0129 #define GICR_CTLR_ENABLE_LPIS       (1UL << 0)
0130 #define GICR_CTLR_CES           (1UL << 1)
0131 #define GICR_CTLR_IR            (1UL << 2)
0132 #define GICR_CTLR_RWP           (1UL << 3)
0133 
0134 #define GICR_TYPER_CPU_NUMBER(r)    (((r) >> 8) & 0xffff)
0135 
0136 #define EPPI_BASE_INTID         1056
0137 
0138 #define GICR_TYPER_NR_PPIS(r)                       \
0139     ({                              \
0140         unsigned int __ppinum = ((r) >> 27) & 0x1f;     \
0141         unsigned int __nr_ppis = 16;                \
0142         if (__ppinum == 1 || __ppinum == 2)         \
0143             __nr_ppis +=  __ppinum * 32;            \
0144                                     \
0145         __nr_ppis;                      \
0146      })
0147 
0148 #define GICR_WAKER_ProcessorSleep   (1U << 1)
0149 #define GICR_WAKER_ChildrenAsleep   (1U << 2)
0150 
0151 #define GIC_BASER_CACHE_nCnB        0ULL
0152 #define GIC_BASER_CACHE_SameAsInner 0ULL
0153 #define GIC_BASER_CACHE_nC      1ULL
0154 #define GIC_BASER_CACHE_RaWt        2ULL
0155 #define GIC_BASER_CACHE_RaWb        3ULL
0156 #define GIC_BASER_CACHE_WaWt        4ULL
0157 #define GIC_BASER_CACHE_WaWb        5ULL
0158 #define GIC_BASER_CACHE_RaWaWt      6ULL
0159 #define GIC_BASER_CACHE_RaWaWb      7ULL
0160 #define GIC_BASER_CACHE_MASK        7ULL
0161 #define GIC_BASER_NonShareable      0ULL
0162 #define GIC_BASER_InnerShareable    1ULL
0163 #define GIC_BASER_OuterShareable    2ULL
0164 #define GIC_BASER_SHAREABILITY_MASK 3ULL
0165 
0166 #define GIC_BASER_CACHEABILITY(reg, inner_outer, type)          \
0167     (GIC_BASER_CACHE_##type << reg##_##inner_outer##_CACHEABILITY_SHIFT)
0168 
0169 #define GIC_BASER_SHAREABILITY(reg, type)               \
0170     (GIC_BASER_##type << reg##_SHAREABILITY_SHIFT)
0171 
0172 /* encode a size field of width @w containing @n - 1 units */
0173 #define GIC_ENCODE_SZ(n, w) (((unsigned long)(n) - 1) & GENMASK_ULL(((w) - 1), 0))
0174 
0175 #define GICR_PROPBASER_SHAREABILITY_SHIFT       (10)
0176 #define GICR_PROPBASER_INNER_CACHEABILITY_SHIFT     (7)
0177 #define GICR_PROPBASER_OUTER_CACHEABILITY_SHIFT     (56)
0178 #define GICR_PROPBASER_SHAREABILITY_MASK                \
0179     GIC_BASER_SHAREABILITY(GICR_PROPBASER, SHAREABILITY_MASK)
0180 #define GICR_PROPBASER_INNER_CACHEABILITY_MASK              \
0181     GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, MASK)
0182 #define GICR_PROPBASER_OUTER_CACHEABILITY_MASK              \
0183     GIC_BASER_CACHEABILITY(GICR_PROPBASER, OUTER, MASK)
0184 #define GICR_PROPBASER_CACHEABILITY_MASK GICR_PROPBASER_INNER_CACHEABILITY_MASK
0185 
0186 #define GICR_PROPBASER_InnerShareable                   \
0187     GIC_BASER_SHAREABILITY(GICR_PROPBASER, InnerShareable)
0188 
0189 #define GICR_PROPBASER_nCnB GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, nCnB)
0190 #define GICR_PROPBASER_nC   GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, nC)
0191 #define GICR_PROPBASER_RaWt GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWt)
0192 #define GICR_PROPBASER_RaWb GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWb)
0193 #define GICR_PROPBASER_WaWt GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, WaWt)
0194 #define GICR_PROPBASER_WaWb GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, WaWb)
0195 #define GICR_PROPBASER_RaWaWt   GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWaWt)
0196 #define GICR_PROPBASER_RaWaWb   GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWaWb)
0197 
0198 #define GICR_PROPBASER_IDBITS_MASK          (0x1f)
0199 #define GICR_PROPBASER_ADDRESS(x)   ((x) & GENMASK_ULL(51, 12))
0200 #define GICR_PENDBASER_ADDRESS(x)   ((x) & GENMASK_ULL(51, 16))
0201 
0202 #define GICR_PENDBASER_SHAREABILITY_SHIFT       (10)
0203 #define GICR_PENDBASER_INNER_CACHEABILITY_SHIFT     (7)
0204 #define GICR_PENDBASER_OUTER_CACHEABILITY_SHIFT     (56)
0205 #define GICR_PENDBASER_SHAREABILITY_MASK                \
0206     GIC_BASER_SHAREABILITY(GICR_PENDBASER, SHAREABILITY_MASK)
0207 #define GICR_PENDBASER_INNER_CACHEABILITY_MASK              \
0208     GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, MASK)
0209 #define GICR_PENDBASER_OUTER_CACHEABILITY_MASK              \
0210     GIC_BASER_CACHEABILITY(GICR_PENDBASER, OUTER, MASK)
0211 #define GICR_PENDBASER_CACHEABILITY_MASK GICR_PENDBASER_INNER_CACHEABILITY_MASK
0212 
0213 #define GICR_PENDBASER_InnerShareable                   \
0214     GIC_BASER_SHAREABILITY(GICR_PENDBASER, InnerShareable)
0215 
0216 #define GICR_PENDBASER_nCnB GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, nCnB)
0217 #define GICR_PENDBASER_nC   GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, nC)
0218 #define GICR_PENDBASER_RaWt GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWt)
0219 #define GICR_PENDBASER_RaWb GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWb)
0220 #define GICR_PENDBASER_WaWt GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, WaWt)
0221 #define GICR_PENDBASER_WaWb GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, WaWb)
0222 #define GICR_PENDBASER_RaWaWt   GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWaWt)
0223 #define GICR_PENDBASER_RaWaWb   GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWaWb)
0224 
0225 #define GICR_PENDBASER_PTZ              BIT_ULL(62)
0226 
0227 /*
0228  * Re-Distributor registers, offsets from SGI_base
0229  */
0230 #define GICR_IGROUPR0           GICD_IGROUPR
0231 #define GICR_ISENABLER0         GICD_ISENABLER
0232 #define GICR_ICENABLER0         GICD_ICENABLER
0233 #define GICR_ISPENDR0           GICD_ISPENDR
0234 #define GICR_ICPENDR0           GICD_ICPENDR
0235 #define GICR_ISACTIVER0         GICD_ISACTIVER
0236 #define GICR_ICACTIVER0         GICD_ICACTIVER
0237 #define GICR_IPRIORITYR0        GICD_IPRIORITYR
0238 #define GICR_ICFGR0         GICD_ICFGR
0239 #define GICR_IGRPMODR0          GICD_IGRPMODR
0240 #define GICR_NSACR          GICD_NSACR
0241 
0242 #define GICR_TYPER_PLPIS        (1U << 0)
0243 #define GICR_TYPER_VLPIS        (1U << 1)
0244 #define GICR_TYPER_DIRTY        (1U << 2)
0245 #define GICR_TYPER_DirectLPIS       (1U << 3)
0246 #define GICR_TYPER_LAST         (1U << 4)
0247 #define GICR_TYPER_RVPEID       (1U << 7)
0248 #define GICR_TYPER_COMMON_LPI_AFF   GENMASK_ULL(25, 24)
0249 #define GICR_TYPER_AFFINITY     GENMASK_ULL(63, 32)
0250 
0251 #define GICR_INVLPIR_INTID      GENMASK_ULL(31, 0)
0252 #define GICR_INVLPIR_VPEID      GENMASK_ULL(47, 32)
0253 #define GICR_INVLPIR_V          GENMASK_ULL(63, 63)
0254 
0255 #define GICR_INVALLR_VPEID      GICR_INVLPIR_VPEID
0256 #define GICR_INVALLR_V          GICR_INVLPIR_V
0257 
0258 #define GIC_V3_REDIST_SIZE      0x20000
0259 
0260 #define LPI_PROP_GROUP1         (1 << 1)
0261 #define LPI_PROP_ENABLED        (1 << 0)
0262 
0263 /*
0264  * Re-Distributor registers, offsets from VLPI_base
0265  */
0266 #define GICR_VPROPBASER         0x0070
0267 
0268 #define GICR_VPROPBASER_IDBITS_MASK 0x1f
0269 
0270 #define GICR_VPROPBASER_SHAREABILITY_SHIFT      (10)
0271 #define GICR_VPROPBASER_INNER_CACHEABILITY_SHIFT    (7)
0272 #define GICR_VPROPBASER_OUTER_CACHEABILITY_SHIFT    (56)
0273 
0274 #define GICR_VPROPBASER_SHAREABILITY_MASK               \
0275     GIC_BASER_SHAREABILITY(GICR_VPROPBASER, SHAREABILITY_MASK)
0276 #define GICR_VPROPBASER_INNER_CACHEABILITY_MASK             \
0277     GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, MASK)
0278 #define GICR_VPROPBASER_OUTER_CACHEABILITY_MASK             \
0279     GIC_BASER_CACHEABILITY(GICR_VPROPBASER, OUTER, MASK)
0280 #define GICR_VPROPBASER_CACHEABILITY_MASK               \
0281     GICR_VPROPBASER_INNER_CACHEABILITY_MASK
0282 
0283 #define GICR_VPROPBASER_InnerShareable                  \
0284     GIC_BASER_SHAREABILITY(GICR_VPROPBASER, InnerShareable)
0285 
0286 #define GICR_VPROPBASER_nCnB    GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, nCnB)
0287 #define GICR_VPROPBASER_nC  GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, nC)
0288 #define GICR_VPROPBASER_RaWt    GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWt)
0289 #define GICR_VPROPBASER_RaWb    GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWb)
0290 #define GICR_VPROPBASER_WaWt    GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, WaWt)
0291 #define GICR_VPROPBASER_WaWb    GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, WaWb)
0292 #define GICR_VPROPBASER_RaWaWt  GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWaWt)
0293 #define GICR_VPROPBASER_RaWaWb  GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWaWb)
0294 
0295 /*
0296  * GICv4.1 VPROPBASER reinvention. A subtle mix between the old
0297  * VPROPBASER and ITS_BASER. Just not quite any of the two.
0298  */
0299 #define GICR_VPROPBASER_4_1_VALID   (1ULL << 63)
0300 #define GICR_VPROPBASER_4_1_ENTRY_SIZE  GENMASK_ULL(61, 59)
0301 #define GICR_VPROPBASER_4_1_INDIRECT    (1ULL << 55)
0302 #define GICR_VPROPBASER_4_1_PAGE_SIZE   GENMASK_ULL(54, 53)
0303 #define GICR_VPROPBASER_4_1_Z       (1ULL << 52)
0304 #define GICR_VPROPBASER_4_1_ADDR    GENMASK_ULL(51, 12)
0305 #define GICR_VPROPBASER_4_1_SIZE    GENMASK_ULL(6, 0)
0306 
0307 #define GICR_VPENDBASER         0x0078
0308 
0309 #define GICR_VPENDBASER_SHAREABILITY_SHIFT      (10)
0310 #define GICR_VPENDBASER_INNER_CACHEABILITY_SHIFT    (7)
0311 #define GICR_VPENDBASER_OUTER_CACHEABILITY_SHIFT    (56)
0312 #define GICR_VPENDBASER_SHAREABILITY_MASK               \
0313     GIC_BASER_SHAREABILITY(GICR_VPENDBASER, SHAREABILITY_MASK)
0314 #define GICR_VPENDBASER_INNER_CACHEABILITY_MASK             \
0315     GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, MASK)
0316 #define GICR_VPENDBASER_OUTER_CACHEABILITY_MASK             \
0317     GIC_BASER_CACHEABILITY(GICR_VPENDBASER, OUTER, MASK)
0318 #define GICR_VPENDBASER_CACHEABILITY_MASK               \
0319     GICR_VPENDBASER_INNER_CACHEABILITY_MASK
0320 
0321 #define GICR_VPENDBASER_NonShareable                    \
0322     GIC_BASER_SHAREABILITY(GICR_VPENDBASER, NonShareable)
0323 
0324 #define GICR_VPENDBASER_InnerShareable                  \
0325     GIC_BASER_SHAREABILITY(GICR_VPENDBASER, InnerShareable)
0326 
0327 #define GICR_VPENDBASER_nCnB    GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, nCnB)
0328 #define GICR_VPENDBASER_nC  GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, nC)
0329 #define GICR_VPENDBASER_RaWt    GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWt)
0330 #define GICR_VPENDBASER_RaWb    GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWb)
0331 #define GICR_VPENDBASER_WaWt    GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, WaWt)
0332 #define GICR_VPENDBASER_WaWb    GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, WaWb)
0333 #define GICR_VPENDBASER_RaWaWt  GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWaWt)
0334 #define GICR_VPENDBASER_RaWaWb  GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWaWb)
0335 
0336 #define GICR_VPENDBASER_Dirty       (1ULL << 60)
0337 #define GICR_VPENDBASER_PendingLast (1ULL << 61)
0338 #define GICR_VPENDBASER_IDAI        (1ULL << 62)
0339 #define GICR_VPENDBASER_Valid       (1ULL << 63)
0340 
0341 /*
0342  * GICv4.1 VPENDBASER, used for VPE residency. On top of these fields,
0343  * also use the above Valid, PendingLast and Dirty.
0344  */
0345 #define GICR_VPENDBASER_4_1_DB      (1ULL << 62)
0346 #define GICR_VPENDBASER_4_1_VGRP0EN (1ULL << 59)
0347 #define GICR_VPENDBASER_4_1_VGRP1EN (1ULL << 58)
0348 #define GICR_VPENDBASER_4_1_VPEID   GENMASK_ULL(15, 0)
0349 
0350 #define GICR_VSGIR          0x0080
0351 
0352 #define GICR_VSGIR_VPEID        GENMASK(15, 0)
0353 
0354 #define GICR_VSGIPENDR          0x0088
0355 
0356 #define GICR_VSGIPENDR_BUSY     (1U << 31)
0357 #define GICR_VSGIPENDR_PENDING      GENMASK(15, 0)
0358 
0359 /*
0360  * ITS registers, offsets from ITS_base
0361  */
0362 #define GITS_CTLR           0x0000
0363 #define GITS_IIDR           0x0004
0364 #define GITS_TYPER          0x0008
0365 #define GITS_MPIDR          0x0018
0366 #define GITS_CBASER         0x0080
0367 #define GITS_CWRITER            0x0088
0368 #define GITS_CREADR         0x0090
0369 #define GITS_BASER          0x0100
0370 #define GITS_IDREGS_BASE        0xffd0
0371 #define GITS_PIDR0          0xffe0
0372 #define GITS_PIDR1          0xffe4
0373 #define GITS_PIDR2          GICR_PIDR2
0374 #define GITS_PIDR4          0xffd0
0375 #define GITS_CIDR0          0xfff0
0376 #define GITS_CIDR1          0xfff4
0377 #define GITS_CIDR2          0xfff8
0378 #define GITS_CIDR3          0xfffc
0379 
0380 #define GITS_TRANSLATER         0x10040
0381 
0382 #define GITS_SGIR           0x20020
0383 
0384 #define GITS_SGIR_VPEID         GENMASK_ULL(47, 32)
0385 #define GITS_SGIR_VINTID        GENMASK_ULL(3, 0)
0386 
0387 #define GITS_CTLR_ENABLE        (1U << 0)
0388 #define GITS_CTLR_ImDe          (1U << 1)
0389 #define GITS_CTLR_ITS_NUMBER_SHIFT  4
0390 #define GITS_CTLR_ITS_NUMBER        (0xFU << GITS_CTLR_ITS_NUMBER_SHIFT)
0391 #define GITS_CTLR_QUIESCENT     (1U << 31)
0392 
0393 #define GITS_TYPER_PLPIS        (1UL << 0)
0394 #define GITS_TYPER_VLPIS        (1UL << 1)
0395 #define GITS_TYPER_ITT_ENTRY_SIZE_SHIFT 4
0396 #define GITS_TYPER_ITT_ENTRY_SIZE   GENMASK_ULL(7, 4)
0397 #define GITS_TYPER_IDBITS_SHIFT     8
0398 #define GITS_TYPER_DEVBITS_SHIFT    13
0399 #define GITS_TYPER_DEVBITS      GENMASK_ULL(17, 13)
0400 #define GITS_TYPER_PTA          (1UL << 19)
0401 #define GITS_TYPER_HCC_SHIFT        24
0402 #define GITS_TYPER_HCC(r)       (((r) >> GITS_TYPER_HCC_SHIFT) & 0xff)
0403 #define GITS_TYPER_VMOVP        (1ULL << 37)
0404 #define GITS_TYPER_VMAPP        (1ULL << 40)
0405 #define GITS_TYPER_SVPET        GENMASK_ULL(42, 41)
0406 
0407 #define GITS_IIDR_REV_SHIFT     12
0408 #define GITS_IIDR_REV_MASK      (0xf << GITS_IIDR_REV_SHIFT)
0409 #define GITS_IIDR_REV(r)        (((r) >> GITS_IIDR_REV_SHIFT) & 0xf)
0410 #define GITS_IIDR_PRODUCTID_SHIFT   24
0411 
0412 #define GITS_CBASER_VALID           (1ULL << 63)
0413 #define GITS_CBASER_SHAREABILITY_SHIFT      (10)
0414 #define GITS_CBASER_INNER_CACHEABILITY_SHIFT    (59)
0415 #define GITS_CBASER_OUTER_CACHEABILITY_SHIFT    (53)
0416 #define GITS_CBASER_SHAREABILITY_MASK                   \
0417     GIC_BASER_SHAREABILITY(GITS_CBASER, SHAREABILITY_MASK)
0418 #define GITS_CBASER_INNER_CACHEABILITY_MASK             \
0419     GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, MASK)
0420 #define GITS_CBASER_OUTER_CACHEABILITY_MASK             \
0421     GIC_BASER_CACHEABILITY(GITS_CBASER, OUTER, MASK)
0422 #define GITS_CBASER_CACHEABILITY_MASK GITS_CBASER_INNER_CACHEABILITY_MASK
0423 
0424 #define GITS_CBASER_InnerShareable                  \
0425     GIC_BASER_SHAREABILITY(GITS_CBASER, InnerShareable)
0426 
0427 #define GITS_CBASER_nCnB    GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, nCnB)
0428 #define GITS_CBASER_nC      GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, nC)
0429 #define GITS_CBASER_RaWt    GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWt)
0430 #define GITS_CBASER_RaWb    GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWb)
0431 #define GITS_CBASER_WaWt    GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, WaWt)
0432 #define GITS_CBASER_WaWb    GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, WaWb)
0433 #define GITS_CBASER_RaWaWt  GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWaWt)
0434 #define GITS_CBASER_RaWaWb  GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWaWb)
0435 
0436 #define GITS_CBASER_ADDRESS(cbaser) ((cbaser) & GENMASK_ULL(51, 12))
0437 
0438 #define GITS_BASER_NR_REGS      8
0439 
0440 #define GITS_BASER_VALID            (1ULL << 63)
0441 #define GITS_BASER_INDIRECT         (1ULL << 62)
0442 
0443 #define GITS_BASER_INNER_CACHEABILITY_SHIFT (59)
0444 #define GITS_BASER_OUTER_CACHEABILITY_SHIFT (53)
0445 #define GITS_BASER_INNER_CACHEABILITY_MASK              \
0446     GIC_BASER_CACHEABILITY(GITS_BASER, INNER, MASK)
0447 #define GITS_BASER_CACHEABILITY_MASK        GITS_BASER_INNER_CACHEABILITY_MASK
0448 #define GITS_BASER_OUTER_CACHEABILITY_MASK              \
0449     GIC_BASER_CACHEABILITY(GITS_BASER, OUTER, MASK)
0450 #define GITS_BASER_SHAREABILITY_MASK                    \
0451     GIC_BASER_SHAREABILITY(GITS_BASER, SHAREABILITY_MASK)
0452 
0453 #define GITS_BASER_nCnB     GIC_BASER_CACHEABILITY(GITS_BASER, INNER, nCnB)
0454 #define GITS_BASER_nC       GIC_BASER_CACHEABILITY(GITS_BASER, INNER, nC)
0455 #define GITS_BASER_RaWt     GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWt)
0456 #define GITS_BASER_RaWb     GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWb)
0457 #define GITS_BASER_WaWt     GIC_BASER_CACHEABILITY(GITS_BASER, INNER, WaWt)
0458 #define GITS_BASER_WaWb     GIC_BASER_CACHEABILITY(GITS_BASER, INNER, WaWb)
0459 #define GITS_BASER_RaWaWt   GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWaWt)
0460 #define GITS_BASER_RaWaWb   GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWaWb)
0461 
0462 #define GITS_BASER_TYPE_SHIFT           (56)
0463 #define GITS_BASER_TYPE(r)      (((r) >> GITS_BASER_TYPE_SHIFT) & 7)
0464 #define GITS_BASER_ENTRY_SIZE_SHIFT     (48)
0465 #define GITS_BASER_ENTRY_SIZE(r)    ((((r) >> GITS_BASER_ENTRY_SIZE_SHIFT) & 0x1f) + 1)
0466 #define GITS_BASER_ENTRY_SIZE_MASK  GENMASK_ULL(52, 48)
0467 #define GITS_BASER_PHYS_52_to_48(phys)                  \
0468     (((phys) & GENMASK_ULL(47, 16)) | (((phys) >> 48) & 0xf) << 12)
0469 #define GITS_BASER_ADDR_48_to_52(baser)                 \
0470     (((baser) & GENMASK_ULL(47, 16)) | (((baser) >> 12) & 0xf) << 48)
0471 
0472 #define GITS_BASER_SHAREABILITY_SHIFT   (10)
0473 #define GITS_BASER_InnerShareable                   \
0474     GIC_BASER_SHAREABILITY(GITS_BASER, InnerShareable)
0475 #define GITS_BASER_PAGE_SIZE_SHIFT  (8)
0476 #define __GITS_BASER_PSZ(sz)        (GIC_PAGE_SIZE_ ## sz << GITS_BASER_PAGE_SIZE_SHIFT)
0477 #define GITS_BASER_PAGE_SIZE_4K     __GITS_BASER_PSZ(4K)
0478 #define GITS_BASER_PAGE_SIZE_16K    __GITS_BASER_PSZ(16K)
0479 #define GITS_BASER_PAGE_SIZE_64K    __GITS_BASER_PSZ(64K)
0480 #define GITS_BASER_PAGE_SIZE_MASK   __GITS_BASER_PSZ(MASK)
0481 #define GITS_BASER_PAGES_MAX        256
0482 #define GITS_BASER_PAGES_SHIFT      (0)
0483 #define GITS_BASER_NR_PAGES(r)      (((r) & 0xff) + 1)
0484 
0485 #define GITS_BASER_TYPE_NONE        0
0486 #define GITS_BASER_TYPE_DEVICE      1
0487 #define GITS_BASER_TYPE_VCPU        2
0488 #define GITS_BASER_TYPE_RESERVED3   3
0489 #define GITS_BASER_TYPE_COLLECTION  4
0490 #define GITS_BASER_TYPE_RESERVED5   5
0491 #define GITS_BASER_TYPE_RESERVED6   6
0492 #define GITS_BASER_TYPE_RESERVED7   7
0493 
0494 #define GITS_LVL1_ENTRY_SIZE           (8UL)
0495 
0496 /*
0497  * ITS commands
0498  */
0499 #define GITS_CMD_MAPD           0x08
0500 #define GITS_CMD_MAPC           0x09
0501 #define GITS_CMD_MAPTI          0x0a
0502 #define GITS_CMD_MAPI           0x0b
0503 #define GITS_CMD_MOVI           0x01
0504 #define GITS_CMD_DISCARD        0x0f
0505 #define GITS_CMD_INV            0x0c
0506 #define GITS_CMD_MOVALL         0x0e
0507 #define GITS_CMD_INVALL         0x0d
0508 #define GITS_CMD_INT            0x03
0509 #define GITS_CMD_CLEAR          0x04
0510 #define GITS_CMD_SYNC           0x05
0511 
0512 /*
0513  * GICv4 ITS specific commands
0514  */
0515 #define GITS_CMD_GICv4(x)       ((x) | 0x20)
0516 #define GITS_CMD_VINVALL        GITS_CMD_GICv4(GITS_CMD_INVALL)
0517 #define GITS_CMD_VMAPP          GITS_CMD_GICv4(GITS_CMD_MAPC)
0518 #define GITS_CMD_VMAPTI         GITS_CMD_GICv4(GITS_CMD_MAPTI)
0519 #define GITS_CMD_VMOVI          GITS_CMD_GICv4(GITS_CMD_MOVI)
0520 #define GITS_CMD_VSYNC          GITS_CMD_GICv4(GITS_CMD_SYNC)
0521 /* VMOVP, VSGI and INVDB are the odd ones, as they dont have a physical counterpart */
0522 #define GITS_CMD_VMOVP          GITS_CMD_GICv4(2)
0523 #define GITS_CMD_VSGI           GITS_CMD_GICv4(3)
0524 #define GITS_CMD_INVDB          GITS_CMD_GICv4(0xe)
0525 
0526 /*
0527  * ITS error numbers
0528  */
0529 #define E_ITS_MOVI_UNMAPPED_INTERRUPT       0x010107
0530 #define E_ITS_MOVI_UNMAPPED_COLLECTION      0x010109
0531 #define E_ITS_INT_UNMAPPED_INTERRUPT        0x010307
0532 #define E_ITS_CLEAR_UNMAPPED_INTERRUPT      0x010507
0533 #define E_ITS_MAPD_DEVICE_OOR           0x010801
0534 #define E_ITS_MAPD_ITTSIZE_OOR          0x010802
0535 #define E_ITS_MAPC_PROCNUM_OOR          0x010902
0536 #define E_ITS_MAPC_COLLECTION_OOR       0x010903
0537 #define E_ITS_MAPTI_UNMAPPED_DEVICE     0x010a04
0538 #define E_ITS_MAPTI_ID_OOR          0x010a05
0539 #define E_ITS_MAPTI_PHYSICALID_OOR      0x010a06
0540 #define E_ITS_INV_UNMAPPED_INTERRUPT        0x010c07
0541 #define E_ITS_INVALL_UNMAPPED_COLLECTION    0x010d09
0542 #define E_ITS_MOVALL_PROCNUM_OOR        0x010e01
0543 #define E_ITS_DISCARD_UNMAPPED_INTERRUPT    0x010f07
0544 
0545 /*
0546  * CPU interface registers
0547  */
0548 #define ICC_CTLR_EL1_EOImode_SHIFT  (1)
0549 #define ICC_CTLR_EL1_EOImode_drop_dir   (0U << ICC_CTLR_EL1_EOImode_SHIFT)
0550 #define ICC_CTLR_EL1_EOImode_drop   (1U << ICC_CTLR_EL1_EOImode_SHIFT)
0551 #define ICC_CTLR_EL1_EOImode_MASK   (1 << ICC_CTLR_EL1_EOImode_SHIFT)
0552 #define ICC_CTLR_EL1_CBPR_SHIFT     0
0553 #define ICC_CTLR_EL1_CBPR_MASK      (1 << ICC_CTLR_EL1_CBPR_SHIFT)
0554 #define ICC_CTLR_EL1_PMHE_SHIFT     6
0555 #define ICC_CTLR_EL1_PMHE_MASK      (1 << ICC_CTLR_EL1_PMHE_SHIFT)
0556 #define ICC_CTLR_EL1_PRI_BITS_SHIFT 8
0557 #define ICC_CTLR_EL1_PRI_BITS_MASK  (0x7 << ICC_CTLR_EL1_PRI_BITS_SHIFT)
0558 #define ICC_CTLR_EL1_ID_BITS_SHIFT  11
0559 #define ICC_CTLR_EL1_ID_BITS_MASK   (0x7 << ICC_CTLR_EL1_ID_BITS_SHIFT)
0560 #define ICC_CTLR_EL1_SEIS_SHIFT     14
0561 #define ICC_CTLR_EL1_SEIS_MASK      (0x1 << ICC_CTLR_EL1_SEIS_SHIFT)
0562 #define ICC_CTLR_EL1_A3V_SHIFT      15
0563 #define ICC_CTLR_EL1_A3V_MASK       (0x1 << ICC_CTLR_EL1_A3V_SHIFT)
0564 #define ICC_CTLR_EL1_RSS        (0x1 << 18)
0565 #define ICC_CTLR_EL1_ExtRange       (0x1 << 19)
0566 #define ICC_PMR_EL1_SHIFT       0
0567 #define ICC_PMR_EL1_MASK        (0xff << ICC_PMR_EL1_SHIFT)
0568 #define ICC_BPR0_EL1_SHIFT      0
0569 #define ICC_BPR0_EL1_MASK       (0x7 << ICC_BPR0_EL1_SHIFT)
0570 #define ICC_BPR1_EL1_SHIFT      0
0571 #define ICC_BPR1_EL1_MASK       (0x7 << ICC_BPR1_EL1_SHIFT)
0572 #define ICC_IGRPEN0_EL1_SHIFT       0
0573 #define ICC_IGRPEN0_EL1_MASK        (1 << ICC_IGRPEN0_EL1_SHIFT)
0574 #define ICC_IGRPEN1_EL1_SHIFT       0
0575 #define ICC_IGRPEN1_EL1_MASK        (1 << ICC_IGRPEN1_EL1_SHIFT)
0576 #define ICC_SRE_EL1_DIB         (1U << 2)
0577 #define ICC_SRE_EL1_DFB         (1U << 1)
0578 #define ICC_SRE_EL1_SRE         (1U << 0)
0579 
0580 /* These are for GICv2 emulation only */
0581 #define GICH_LR_VIRTUALID       (0x3ffUL << 0)
0582 #define GICH_LR_PHYSID_CPUID_SHIFT  (10)
0583 #define GICH_LR_PHYSID_CPUID        (7UL << GICH_LR_PHYSID_CPUID_SHIFT)
0584 
0585 #define ICC_IAR1_EL1_SPURIOUS       0x3ff
0586 
0587 #define ICC_SRE_EL2_SRE         (1 << 0)
0588 #define ICC_SRE_EL2_ENABLE      (1 << 3)
0589 
0590 #define ICC_SGI1R_TARGET_LIST_SHIFT 0
0591 #define ICC_SGI1R_TARGET_LIST_MASK  (0xffff << ICC_SGI1R_TARGET_LIST_SHIFT)
0592 #define ICC_SGI1R_AFFINITY_1_SHIFT  16
0593 #define ICC_SGI1R_AFFINITY_1_MASK   (0xff << ICC_SGI1R_AFFINITY_1_SHIFT)
0594 #define ICC_SGI1R_SGI_ID_SHIFT      24
0595 #define ICC_SGI1R_SGI_ID_MASK       (0xfULL << ICC_SGI1R_SGI_ID_SHIFT)
0596 #define ICC_SGI1R_AFFINITY_2_SHIFT  32
0597 #define ICC_SGI1R_AFFINITY_2_MASK   (0xffULL << ICC_SGI1R_AFFINITY_2_SHIFT)
0598 #define ICC_SGI1R_IRQ_ROUTING_MODE_BIT  40
0599 #define ICC_SGI1R_RS_SHIFT      44
0600 #define ICC_SGI1R_RS_MASK       (0xfULL << ICC_SGI1R_RS_SHIFT)
0601 #define ICC_SGI1R_AFFINITY_3_SHIFT  48
0602 #define ICC_SGI1R_AFFINITY_3_MASK   (0xffULL << ICC_SGI1R_AFFINITY_3_SHIFT)
0603 
0604 #include <asm/arch_gicv3.h>
0605 
0606 #ifndef __ASSEMBLY__
0607 
0608 /*
0609  * We need a value to serve as a irq-type for LPIs. Choose one that will
0610  * hopefully pique the interest of the reviewer.
0611  */
0612 #define GIC_IRQ_TYPE_LPI        0xa110c8ed
0613 
0614 struct rdists {
0615     struct {
0616         raw_spinlock_t  rd_lock;
0617         void __iomem    *rd_base;
0618         struct page *pend_page;
0619         phys_addr_t phys_base;
0620         u64             flags;
0621         cpumask_t   *vpe_table_mask;
0622         void        *vpe_l1_base;
0623     } __percpu      *rdist;
0624     phys_addr_t     prop_table_pa;
0625     void            *prop_table_va;
0626     u64         flags;
0627     u32         gicd_typer;
0628     u32         gicd_typer2;
0629     int                     cpuhp_memreserve_state;
0630     bool            has_vlpis;
0631     bool            has_rvpeid;
0632     bool            has_direct_lpi;
0633     bool            has_vpend_valid_dirty;
0634 };
0635 
0636 struct irq_domain;
0637 struct fwnode_handle;
0638 int __init its_lpi_memreserve_init(void);
0639 int its_cpu_init(void);
0640 int its_init(struct fwnode_handle *handle, struct rdists *rdists,
0641          struct irq_domain *domain);
0642 int mbi_init(struct fwnode_handle *fwnode, struct irq_domain *parent);
0643 
0644 static inline bool gic_enable_sre(void)
0645 {
0646     u32 val;
0647 
0648     val = gic_read_sre();
0649     if (val & ICC_SRE_EL1_SRE)
0650         return true;
0651 
0652     val |= ICC_SRE_EL1_SRE;
0653     gic_write_sre(val);
0654     val = gic_read_sre();
0655 
0656     return !!(val & ICC_SRE_EL1_SRE);
0657 }
0658 
0659 #endif
0660 
0661 #endif