300 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			300 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  |  * Copyright (c) 2006-2022, RT-Thread Development Team | ||
|  |  * | ||
|  |  * SPDX-License-Identifier: Apache-2.0 | ||
|  |  * | ||
|  |  * Change Logs: | ||
|  |  * Date           Author       Notes | ||
|  |  * 2013-07-20     Bernard      first version | ||
|  |  * 2014-04-03     Grissiom     many enhancements | ||
|  |  * 2018-11-22     Jesven       add rt_hw_ipi_send() | ||
|  |  *                             add rt_hw_ipi_handler_install() | ||
|  |  * 2023-02-01     GuEe-GUI     move macros to header | ||
|  |  */ | ||
|  | 
 | ||
|  | #ifndef __IRQ_GICV3_H__
 | ||
|  | #define __IRQ_GICV3_H__
 | ||
|  | 
 | ||
|  | #include <rtdef.h>
 | ||
|  | 
 | ||
|  | #include <cpuport.h>
 | ||
|  | 
 | ||
|  | #include <drivers/pic.h>
 | ||
|  | #include <drivers/core/dm.h>
 | ||
|  | #include <dt-bindings/size.h>
 | ||
|  | 
 | ||
|  | /* Distributor registers */ | ||
|  | #define GICD_CTLR               0x0000
 | ||
|  | #define GICD_TYPER              0x0004
 | ||
|  | #define GICD_IIDR               0x0008
 | ||
|  | #define GICD_TYPER2             0x000C
 | ||
|  | #define GICD_STATUSR            0x0010
 | ||
|  | #define GICD_SETSPI_NSR         0x0040
 | ||
|  | #define GICD_CLRSPI_NSR         0x0048
 | ||
|  | #define GICD_SETSPI_SR          0x0050
 | ||
|  | #define GICD_CLRSPI_SR          0x0058
 | ||
|  | #define GICD_IGROUPR            0x0080
 | ||
|  | #define GICD_ISENABLER          0x0100
 | ||
|  | #define GICD_ICENABLER          0x0180
 | ||
|  | #define GICD_ISPENDR            0x0200
 | ||
|  | #define GICD_ICPENDR            0x0280
 | ||
|  | #define GICD_ISACTIVER          0x0300
 | ||
|  | #define GICD_ICACTIVER          0x0380
 | ||
|  | #define GICD_IPRIORITYR         0x0400
 | ||
|  | #define GICD_ICFGR              0x0C00
 | ||
|  | #define GICD_IGRPMODR           0x0D00
 | ||
|  | #define GICD_NSACR              0x0E00
 | ||
|  | #define GICD_IGROUPRnE          0x1000
 | ||
|  | #define GICD_ISENABLERnE        0x1200
 | ||
|  | #define GICD_ICENABLERnE        0x1400
 | ||
|  | #define GICD_ISPENDRnE          0x1600
 | ||
|  | #define GICD_ICPENDRnE          0x1800
 | ||
|  | #define GICD_ISACTIVERnE        0x1A00
 | ||
|  | #define GICD_ICACTIVERnE        0x1C00
 | ||
|  | #define GICD_IPRIORITYRnE       0x2000
 | ||
|  | #define GICD_ICFGRnE            0x3000
 | ||
|  | #define GICD_IROUTER            0x6000
 | ||
|  | #define GICD_IROUTERnE          0x8000
 | ||
|  | #define GICD_IDREGS             0xFFD0
 | ||
|  | #define GICD_PIDR2              0xFFE8
 | ||
|  | 
 | ||
|  | #define GICD_ITARGETSR          0x0800
 | ||
|  | #define GICD_SGIR               0x0F00
 | ||
|  | #define GICD_CPENDSGIR          0x0F10
 | ||
|  | #define GICD_SPENDSGIR          0x0F20
 | ||
|  | 
 | ||
|  | #define GICD_CTLR_RWP           (1U << 31)
 | ||
|  | #define GICD_CTLR_nASSGIreq     (1U << 8)
 | ||
|  | #define GICD_CTLR_DS            (1U << 6)
 | ||
|  | #define GICD_CTLR_ARE_NS        (1U << 4)
 | ||
|  | #define GICD_CTLR_ENABLE_G1A    (1U << 1)
 | ||
|  | #define GICD_CTLR_ENABLE_G1     (1U << 0)
 | ||
|  | 
 | ||
|  | #define GICD_TYPER_RSS          (1U << 26)
 | ||
|  | #define GICD_TYPER_LPIS         (1U << 17)
 | ||
|  | #define GICD_TYPER_MBIS         (1U << 16)
 | ||
|  | #define GICD_TYPER_ESPI         (1U << 8)
 | ||
|  | #define GICD_TYPER_ID_BITS(t)   ((((t) >> 19) & 0x1f) + 1)
 | ||
|  | #define GICD_TYPER_NUM_LPIS(t)  ((((t) >> 11) & 0x1f) + 1)
 | ||
|  | #define GICD_TYPER_SPIS(t)      ((((t) & 0x1f) + 1) * 32)
 | ||
|  | #define GICD_TYPER_ESPIS(t)     (((t) & GICD_TYPER_ESPI) ? GICD_TYPER_SPIS((t) >> 27) : 0)
 | ||
|  | 
 | ||
|  | /* Redistributor registers */ | ||
|  | #define GICR_CTLR               0x0000
 | ||
|  | #define GICR_IIDR               0x0004
 | ||
|  | #define GICR_TYPER              0x0008
 | ||
|  | #define GICR_STATUSR            0x0010
 | ||
|  | #define GICR_WAKER              0x0014
 | ||
|  | #define GICR_MPAMIDR            0x0018
 | ||
|  | #define GICR_PARTIDR            0x001C
 | ||
|  | #define GICR_SETLPIR            0x0040
 | ||
|  | #define GICR_CLRLPIR            0x0048
 | ||
|  | #define GICR_PROPBASER          0x0070
 | ||
|  | #define GICR_PENDBASER          0x0078
 | ||
|  | #define GICR_INVLPIR            0x00A0
 | ||
|  | #define GICR_INVALLR            0x00B0
 | ||
|  | #define GICR_SYNCR              0x00C0
 | ||
|  | #define GICR_PIDR2              GICD_PIDR2
 | ||
|  | 
 | ||
|  | #define GICR_CTLR_ENABLE_LPIS   (1UL << 0)
 | ||
|  | #define GICR_CTLR_CES           (1UL << 1)
 | ||
|  | #define GICR_CTLR_IR            (1UL << 2)
 | ||
|  | #define GICR_CTLR_RWP           (1UL << 3)
 | ||
|  | 
 | ||
|  | #define GICR_RD_BASE_SIZE       (64 * SIZE_KB)
 | ||
|  | #define GICR_SGI_OFFSET         (64 * SIZE_KB)
 | ||
|  | #define GICR_SGI_BASE_SIZE      GICR_SGI_OFFSET
 | ||
|  | 
 | ||
|  | /* Re-Distributor registers, offsets from SGI_base */ | ||
|  | #define GICR_IGROUPR0           GICD_IGROUPR
 | ||
|  | #define GICR_ISENABLER0         GICD_ISENABLER
 | ||
|  | #define GICR_ICENABLER0         GICD_ICENABLER
 | ||
|  | #define GICR_ISPENDR0           GICD_ISPENDR
 | ||
|  | #define GICR_ICPENDR0           GICD_ICPENDR
 | ||
|  | #define GICR_ISACTIVER0         GICD_ISACTIVER
 | ||
|  | #define GICR_ICACTIVER0         GICD_ICACTIVER
 | ||
|  | #define GICR_IPRIORITYR0        GICD_IPRIORITYR
 | ||
|  | #define GICR_ICFGR0             GICD_ICFGR
 | ||
|  | #define GICR_IGRPMODR0          GICD_IGRPMODR
 | ||
|  | #define GICR_NSACR              GICD_NSACR
 | ||
|  | 
 | ||
|  | #define GICR_TYPER_PLPIS        (1U << 0)
 | ||
|  | #define GICR_TYPER_VLPIS        (1U << 1)
 | ||
|  | #define GICR_TYPER_DIRTY        (1U << 2)
 | ||
|  | #define GICR_TYPER_DirectLPIS   (1U << 3)
 | ||
|  | #define GICR_TYPER_LAST         (1U << 4)
 | ||
|  | #define GICR_TYPER_RVPEID       (1U << 7)
 | ||
|  | #define GICR_TYPER_COM_LPI_AFF  RT_GENMASK_ULL(25, 24)
 | ||
|  | #define GICR_TYPER_AFFINITY     RT_GENMASK_ULL(63, 32)
 | ||
|  | 
 | ||
|  | #define GICR_INVLPIR_INTID      RT_GENMASK_ULL(31, 0)
 | ||
|  | #define GICR_INVLPIR_VPEID      RT_GENMASK_ULL(47, 32)
 | ||
|  | #define GICR_INVLPIR_V          RT_GENMASK_ULL(63, 63)
 | ||
|  | 
 | ||
|  | #define GICR_INVALLR_VPEID      GICR_INVLPIR_VPEID
 | ||
|  | #define GICR_INVALLR_V          GICR_INVLPIR_V
 | ||
|  | 
 | ||
|  | #define GICR_VLPI_BASE_SIZE     (64 * SIZE_KB)
 | ||
|  | #define GICR_RESERVED_SIZE      (64 * SIZE_KB)
 | ||
|  | 
 | ||
|  | #define GIC_V3_REDIST_SIZE      0x20000
 | ||
|  | 
 | ||
|  | #define GICR_TYPER_NR_PPIS(t)   (16 + ({ int __ppinum = (((t) >> 27) & 0x1f); __ppinum <= 2 ? __ppinum : 0; }) * 32)
 | ||
|  | 
 | ||
|  | #define GICR_WAKER_ProcessorSleep   (1U << 1)
 | ||
|  | #define GICR_WAKER_ChildrenAsleep   (1U << 2)
 | ||
|  | 
 | ||
|  | #define GICR_PROPBASER_IDBITS_MASK  (0x1f)
 | ||
|  | #define GICR_PROPBASER_ADDRESS(x)   ((x) & RT_GENMASK_ULL(51, 12))
 | ||
|  | #define GICR_PENDBASER_ADDRESS(x)   ((x) & RT_GENMASK_ULL(51, 16))
 | ||
|  | 
 | ||
|  | /* ITS registers */ | ||
|  | #define GITS_CTLR               0x0000
 | ||
|  | #define GITS_IIDR               0x0004
 | ||
|  | #define GITS_TYPER              0x0008
 | ||
|  | #define GITS_MPAMIDR            0x0010
 | ||
|  | #define GITS_PARTIDR            0x0014
 | ||
|  | #define GITS_MPIDR              0x0018
 | ||
|  | #define GITS_STATUSR            0x0040
 | ||
|  | #define GITS_UMSIR              0x0048
 | ||
|  | #define GITS_CBASER             0x0048
 | ||
|  | #define GITS_CWRITER            0x0088
 | ||
|  | #define GITS_CREADR             0x0090
 | ||
|  | #define GITS_BASER              0x0100 /* 0x0100~0x0138 */
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * ITS commands | ||
|  |  */ | ||
|  | #define GITS_CMD_MAPD           0x08
 | ||
|  | #define GITS_CMD_MAPC           0x09
 | ||
|  | #define GITS_CMD_MAPTI          0x0a
 | ||
|  | #define GITS_CMD_MAPI           0x0b
 | ||
|  | #define GITS_CMD_MOVI           0x01
 | ||
|  | #define GITS_CMD_DISCARD        0x0f
 | ||
|  | #define GITS_CMD_INV            0x0c
 | ||
|  | #define GITS_CMD_MOVALL         0x0e
 | ||
|  | #define GITS_CMD_INVALL         0x0d
 | ||
|  | #define GITS_CMD_INT            0x03
 | ||
|  | #define GITS_CMD_CLEAR          0x04
 | ||
|  | #define GITS_CMD_SYNC           0x05
 | ||
|  | 
 | ||
|  | /* ITS Config Area */ | ||
|  | #define GITS_LPI_CFG_GROUP1     (1 << 1)
 | ||
|  | #define GITS_LPI_CFG_ENABLED    (1 << 0)
 | ||
|  | 
 | ||
|  | /* ITS Command Queue Descriptor */ | ||
|  | #define GITS_CBASER_VALID                       (1UL << 63)
 | ||
|  | #define GITS_CBASER_SHAREABILITY_SHIFT          (10)
 | ||
|  | #define GITS_CBASER_INNER_CACHEABILITY_SHIFT    (59)
 | ||
|  | #define GITS_CBASER_OUTER_CACHEABILITY_SHIFT    (53)
 | ||
|  | 
 | ||
|  | #define GITS_TRANSLATION_TABLE_DESCRIPTORS_NR   8
 | ||
|  | 
 | ||
|  | #define GITS_BASER_CACHEABILITY(reg, inner_outer, type) \
 | ||
|  |     (GITS_CBASER_CACHE_##type << reg##_##inner_outer##_CACHEABILITY_SHIFT) | ||
|  | #define GITS_BASER_SHAREABILITY(reg, type)              \
 | ||
|  |     (GITS_CBASER_##type << reg##_SHAREABILITY_SHIFT) | ||
|  | 
 | ||
|  | #define GITS_CBASER_CACHE_DnGnRnE   0x0UL /* Device-nGnRnE. */
 | ||
|  | #define GITS_CBASER_CACHE_NIN       0x1UL /* Normal Inner Non-cacheable. */
 | ||
|  | #define GITS_CBASER_CACHE_NIRAWT    0x2UL /* Normal Inner Cacheable Read-allocate, Write-through. */
 | ||
|  | #define GITS_CBASER_CACHE_NIRAWB    0x3UL /* Normal Inner Cacheable Read-allocate, Write-back. */
 | ||
|  | #define GITS_CBASER_CACHE_NIWAWT    0x4UL /* Normal Inner Cacheable Write-allocate, Write-through. */
 | ||
|  | #define GITS_CBASER_CACHE_NIWAWB    0x5UL /* Normal Inner Cacheable Write-allocate, Write-back. */
 | ||
|  | #define GITS_CBASER_CACHE_NIRAWAWT  0x6UL /* Normal Inner Cacheable Read-allocate, Write-allocate, Write-through. */
 | ||
|  | #define GITS_CBASER_CACHE_NIRAWAWB  0x7UL /* Normal Inner Cacheable Read-allocate, Write-allocate, Write-back. */
 | ||
|  | #define GITS_CBASER_CACHE_MASK      0x7UL
 | ||
|  | #define GITS_CBASER_SHARE_NS        0x0UL /* Non-shareable. */
 | ||
|  | #define GITS_CBASER_SHARE_IS        0x1UL /* Inner Shareable. */
 | ||
|  | #define GITS_CBASER_SHARE_OS        0x2UL /* Outer Shareable. */
 | ||
|  | #define GITS_CBASER_SHARE_RES       0x3UL /* Reserved. Treated as 0b00 */
 | ||
|  | #define GITS_CBASER_SHARE_MASK      0x3UL
 | ||
|  | 
 | ||
|  | #define GITS_CBASER_InnerShareable  GITS_BASER_SHAREABILITY(GITS_CBASER, SHARE_IS)
 | ||
|  | #define GITS_CBASER_SHARE_MASK_ALL  GITS_BASER_SHAREABILITY(GITS_CBASER, SHARE_MASK)
 | ||
|  | #define GITS_CBASER_nCnB            GITS_BASER_CACHEABILITY(GITS_CBASER, INNER, DnGnRnE)
 | ||
|  | #define GITS_CBASER_nC              GITS_BASER_CACHEABILITY(GITS_CBASER, INNER, NIN)
 | ||
|  | #define GITS_CBASER_RaWt            GITS_BASER_CACHEABILITY(GITS_CBASER, INNER, NIRAWT)
 | ||
|  | #define GITS_CBASER_RaWb            GITS_BASER_CACHEABILITY(GITS_CBASER, INNER, NIRAWB)
 | ||
|  | #define GITS_CBASER_WaWt            GITS_BASER_CACHEABILITY(GITS_CBASER, INNER, NIWAWT)
 | ||
|  | #define GITS_CBASER_WaWb            GITS_BASER_CACHEABILITY(GITS_CBASER, INNER, NIWAWB)
 | ||
|  | #define GITS_CBASER_RaWaWt          GITS_BASER_CACHEABILITY(GITS_CBASER, INNER, NIRAWAWT)
 | ||
|  | #define GITS_CBASER_RaWaWb          GITS_BASER_CACHEABILITY(GITS_CBASER, INNER, NIRAWAWB)
 | ||
|  | 
 | ||
|  | #define GIC_EPPI_BASE_INTID         1056
 | ||
|  | #define GIC_ESPI_BASE_INTID         4096
 | ||
|  | 
 | ||
|  | #define GIC_IRQ_TYPE_LPI            0xa110c8ed
 | ||
|  | #define GIC_IRQ_TYPE_PARTITION      (GIC_IRQ_TYPE_LPI + 1)
 | ||
|  | 
 | ||
|  | #define read_gicreg(reg, out)           rt_hw_sysreg_read(reg, out)
 | ||
|  | #define write_gicreg(reg, in)           rt_hw_sysreg_write(reg, in)
 | ||
|  | 
 | ||
|  | #define ICC_CTLR_EOImode                0x2
 | ||
|  | #define ICC_PMR_MASK                    0xff
 | ||
|  | #define ICC_PMR_DEFAULT                 0xf0
 | ||
|  | #define ICC_IGRPEN1_EN                  0x1
 | ||
|  | 
 | ||
|  | #define ICC_SGIR_AFF3_SHIFT             48
 | ||
|  | #define ICC_SGIR_AFF2_SHIFT             32
 | ||
|  | #define ICC_SGIR_AFF1_SHIFT             16
 | ||
|  | #define ICC_SGIR_TARGET_MASK            0xffff
 | ||
|  | #define ICC_SGIR_IRQN_SHIFT             24
 | ||
|  | #define ICC_SGIR_ROUTING_BIT            (1ULL << 40)
 | ||
|  | 
 | ||
|  | #define ICC_SGI1R_TARGET_LIST_SHIFT     0
 | ||
|  | #define ICC_SGI1R_TARGET_LIST_MASK      (0xffff << ICC_SGI1R_TARGET_LIST_SHIFT)
 | ||
|  | #define ICC_SGI1R_TARGET_LIST_MAX       16
 | ||
|  | #define ICC_SGI1R_AFFINITY_1_SHIFT      16
 | ||
|  | #define ICC_SGI1R_AFFINITY_1_MASK       (0xff << ICC_SGI1R_AFFINITY_1_SHIFT)
 | ||
|  | #define ICC_SGI1R_SGI_ID_SHIFT          24
 | ||
|  | #define ICC_SGI1R_SGI_ID_MASK           (0xfULL << ICC_SGI1R_SGI_ID_SHIFT)
 | ||
|  | #define ICC_SGI1R_AFFINITY_2_SHIFT      32
 | ||
|  | #define ICC_SGI1R_AFFINITY_2_MASK       (0xffULL << ICC_SGI1R_AFFINITY_2_SHIFT)
 | ||
|  | #define ICC_SGI1R_IRQ_ROUTING_MODE_BIT  40
 | ||
|  | #define ICC_SGI1R_RS_SHIFT              44
 | ||
|  | #define ICC_SGI1R_RS_MASK               (0xfULL << ICC_SGI1R_RS_SHIFT)
 | ||
|  | #define ICC_SGI1R_AFFINITY_3_SHIFT      48
 | ||
|  | #define ICC_SGI1R_AFFINITY_3_MASK       (0xffULL << ICC_SGI1R_AFFINITY_3_SHIFT)
 | ||
|  | 
 | ||
|  | #define ICC_CTLR_EL1_CBPR_SHIFT         0
 | ||
|  | #define ICC_CTLR_EL1_CBPR_MASK          (1 << ICC_CTLR_EL1_CBPR_SHIFT)
 | ||
|  | #define ICC_CTLR_EL1_EOImode_SHIFT      (1)
 | ||
|  | #define ICC_CTLR_EL1_EOImode_drop       (1U << ICC_CTLR_EL1_EOImode_SHIFT)
 | ||
|  | #define ICC_CTLR_EL1_EOImode_drop_dir   (0U << ICC_CTLR_EL1_EOImode_SHIFT)
 | ||
|  | #define ICC_CTLR_EL1_PRI_BITS_SHIFT     (8)
 | ||
|  | #define ICC_CTLR_EL1_PRI_BITS_MASK      (0x7 << ICC_CTLR_EL1_PRI_BITS_SHIFT)
 | ||
|  | #define ICC_CTLR_EL1_RSS                (0x1 << 18)
 | ||
|  | #define ICC_CTLR_EL1_ExtRange           (0x1 << 19)
 | ||
|  | 
 | ||
|  | struct gicv3 | ||
|  | { | ||
|  |     struct rt_pic parent; | ||
|  | 
 | ||
|  |     int version; | ||
|  |     int irq_nr; | ||
|  |     rt_uint32_t gicd_typer; | ||
|  |     rt_size_t line_nr; | ||
|  |     rt_size_t espi_nr; | ||
|  |     rt_size_t lpi_nr; | ||
|  |     rt_ubase_t flags; | ||
|  | 
 | ||
|  |     void *dist_base; | ||
|  |     rt_size_t dist_size; | ||
|  | 
 | ||
|  |     void *redist_percpu_base[RT_CPUS_NR]; | ||
|  |     rt_size_t percpu_ppi_nr[RT_CPUS_NR]; | ||
|  | 
 | ||
|  |     struct | ||
|  |     { | ||
|  |         void *base; | ||
|  |         void *base_phy; | ||
|  |         rt_size_t size; | ||
|  |     } *redist_regions; | ||
|  |     rt_uint64_t redist_flags; | ||
|  |     rt_size_t redist_stride; | ||
|  |     rt_size_t redist_regions_nr; | ||
|  | }; | ||
|  | 
 | ||
|  | #endif /* __IRQ_GICV3_H__ */
 |