7#include <etl/io_port.h>
37 auto Enable(uint32_t intid)
const -> void;
48 auto Disable(uint32_t intid)
const -> void;
54 auto Clear(uint32_t intid)
const -> void;
62 [[nodiscard]]
auto IsEnable(uint32_t intid)
const -> bool;
69 auto SetPrio(uint32_t intid, uint32_t prio)
const -> void;
76 auto SetConfig(uint32_t intid, uint32_t config)
const -> void;
83 auto SetTarget(uint32_t intid, uint32_t cpuid)
const -> void;
92 auto SetupSpi(uint32_t intid, uint32_t cpuid)
const -> void;
101 explicit Gicd(uint64_t _base_addr);
115 static constexpr uint32_t
kCtlr = 0x0000;
145 static constexpr uint32_t
kTyper = 0x0004;
186 static constexpr uint32_t
kIidr = 0x0008;
210 static constexpr uint32_t
kFctlr = 0x0020;
212 static constexpr uint32_t
kSac = 0x0024;
232 [[nodiscard]] __always_inline
auto Igrouprn(uint64_t n)
const -> uint64_t {
247 [[nodiscard]] __always_inline
auto Isenablern(uint64_t n)
const
263 [[nodiscard]] __always_inline
auto Icenablern(uint64_t n)
const
282 [[nodiscard]] __always_inline
auto Icpendrn(uint64_t n)
const -> uint64_t {
323 [[nodiscard]] __always_inline
auto Itargetsrn(uint64_t n)
const
343 [[nodiscard]] __always_inline
auto Icfgrn(uint64_t n)
const -> uint64_t {
367 static constexpr uint64_t
kCfgid = 0xF000;
369 static constexpr uint32_t
kPidr4 = 0xFFD0;
371 static constexpr uint32_t
kPidr5 = 0xFFD4;
373 static constexpr uint32_t
kPidr6 = 0xFFD8;
375 static constexpr uint32_t
kPidr7 = 0xFFDC;
377 static constexpr uint32_t
kPidr0 = 0xFFE0;
379 static constexpr uint32_t
kPidr1 = 0xFFE4;
381 static constexpr uint32_t
kPidr2 = 0xFFE8;
383 static constexpr uint32_t
kPidr3 = 0xFFEC;
385 static constexpr uint32_t
kCidr0 = 0xFFF0;
387 static constexpr uint32_t
kCidr1 = 0xFFF4;
389 static constexpr uint32_t
kCidr2 = 0xFFF8;
391 static constexpr uint32_t
kCidr3 = 0xFFFC;
396 [[nodiscard]] __always_inline
auto Read(uint32_t off)
const -> uint32_t {
397 etl::io_port_ro<uint32_t> reg{
reinterpret_cast<void*
>(
base_addr_ + off)};
401 __always_inline
auto Write(uint32_t off, uint32_t val)
const ->
void {
402 etl::io_port_wo<uint32_t> reg{
reinterpret_cast<void*
>(
base_addr_ + off)};
417 auto Enable(uint32_t intid, uint32_t cpuid)
const -> void;
424 auto Disable(uint32_t intid, uint32_t cpuid)
const -> void;
431 auto Clear(uint32_t intid, uint32_t cpuid)
const -> void;
439 auto SetPrio(uint32_t intid, uint32_t cpuid, uint32_t prio)
const -> void;
444 auto SetUp()
const -> void;
453 auto SetupPpi(uint32_t intid, uint32_t cpuid)
const -> void;
462 auto SetupSgi(uint32_t intid, uint32_t cpuid)
const -> void;
471 explicit Gicr(uint64_t _base_addr);
487 static constexpr uint32_t
kCtlr = 0x0000;
489 static constexpr uint32_t
kIidr = 0x0004;
491 static constexpr uint32_t
kTyper = 0x0008;
496 static constexpr uint32_t
kWaker = 0x0014;
501 static constexpr uint32_t
kFctlr = 0x0020;
503 static constexpr uint32_t
kPwrr = 0x0024;
511 static constexpr uint32_t
kPidr4 = 0xFFD0;
513 static constexpr uint32_t
kPidr5 = 0xFFD4;
515 static constexpr uint32_t
kPidr6 = 0xFFD8;
517 static constexpr uint32_t
kPidr7 = 0xFFDC;
519 static constexpr uint32_t
kPidr0 = 0xFFE0;
521 static constexpr uint32_t
kPidr1 = 0xFFE4;
523 static constexpr uint32_t
kPidr2 = 0xFFE8;
525 static constexpr uint32_t
kPidr3 = 0xFFEC;
527 static constexpr uint32_t
kCidr0 = 0xFFF0;
529 static constexpr uint32_t
kCidr1 = 0xFFF4;
531 static constexpr uint32_t
kCidr2 = 0xFFF8;
533 static constexpr uint32_t
kCidr3 = 0xFFFC;
603 static constexpr uint32_t
kNsacr = 0x0E00;
609 static constexpr uint32_t
kSgidr = 0xC010;
618 [[nodiscard]] __always_inline
auto Read(uint32_t cpuid, uint32_t off)
const
620 etl::io_port_ro<uint32_t> reg{
625 __always_inline
auto Write(uint32_t cpuid, uint32_t off, uint32_t val)
const
627 etl::io_port_wo<uint32_t> reg{
636 auto SetUp() const ->
void;
643 auto
Spi(uint32_t intid, uint32_t cpuid) const ->
void;
650 auto
Ppi(uint32_t intid, uint32_t cpuid) const ->
void;
657 auto
Sgi(uint32_t intid, uint32_t cpuid) const ->
void;
667 explicit
Gic(uint64_t gicd_base_addr, uint64_t gicr_base_addr);
671 auto operator=(const
Gic&) ->
Gic& = delete;
static constexpr uint32_t kClrSpiNsr
Non-secure SPI Clear Register, WO.
static constexpr uint32_t kCtlrEnableGrp1Ns
static constexpr uint32_t kChiprn
Chip Registers, n = 0-15. Reserved in single-chip configurations.
static constexpr uint32_t kIgrpmodrn
static constexpr uint32_t kIpriorityrn
static constexpr uint32_t kPidr0
Peripheral ID0 register, RO.
static constexpr uint32_t kTyper
Configuration dependent Interrupt Controller Type Register, RO.
static constexpr uint32_t kIcEnablernSize
__always_inline auto Itargetsrn(uint64_t n) const -> uint64_t
计算 ITARGETSR 寄存器偏移
auto EnableGrp1Ns() const -> void
允许 no-sec group1 中断
static constexpr uint32_t kPidr4
Peripheral ID4 register , RO.
static constexpr uint32_t kIroutern
static constexpr uint32_t kCidr1
Component ID 1 Register, RO.
static constexpr uint32_t kIcfgrnEdgeTriggered
auto SetTarget(uint32_t intid, uint32_t cpuid) const -> void
设置 intid 的由指定 cpu 处理
static constexpr uint32_t kIcPendrnSize
auto SetConfig(uint32_t intid, uint32_t config) const -> void
设置 intid 的属性
static constexpr uint32_t kIcfgrn
static constexpr uint32_t kItargetsrnSize
static constexpr uint32_t kIidr
__always_inline auto Icfgrn(uint64_t n) const -> uint64_t
计算 ICFGR 寄存器偏移
static constexpr uint32_t kPidr5
Peripheral ID 5 Register, RO.
static constexpr uint32_t kNsacrn
static constexpr uint32_t kItargetsrn
__always_inline auto Isenablern(uint64_t n) const -> uint64_t
计算 ISENABLER 寄存器偏移
Gicd(const Gicd &)=delete
static constexpr uint32_t kIpriorityrnSize
static constexpr uint32_t kIsEnablernSize
__always_inline auto Icenablern(uint64_t n) const -> uint64_t
计算 ICENABLER 寄存器偏移
static constexpr uint32_t kIsActivern
Interrupt Set-Active Registers, n = 0-31, but n=0 is Reserved.
static constexpr uint32_t kIcfgrnBitsMask
static constexpr uint32_t kClrSpiSr
Secure SPI Clear Register, WO.
static constexpr uint32_t kCidr2
Component ID 2 Register, RO.
auto SetupSpi(uint32_t intid, uint32_t cpuid) const -> void
设置指定 SPI 中断 SPI: shared peripheral interrupt, 共享外设中断,该中断来源于外设,但是该中断可以对所有的 core 有效
auto Disable(uint32_t intid) const -> void
禁止从 Distributor 转发到 redistributor
static constexpr uint32_t kIgrouprn
static constexpr uint32_t kSetSpiSr
Secure SPI Set Register, WO.
uint64_t base_addr_
GICD 基地址
auto operator=(Gicd &&) -> Gicd &=default
static constexpr uint32_t kCidr0
Component ID 0 Register, RO.
__always_inline auto Igrouprn(uint64_t n) const -> uint64_t
计算 IGROUPR 寄存器偏移
static constexpr uint64_t kCfgid
Configuration dependent Configuration ID Register, RO.
static constexpr uint32_t kDchipr
Default Chip Register, RW.
static constexpr uint32_t kIclarn
Interrupt Class Registers, n = 0-63, but n=0-1 are Reserved.
__always_inline auto Write(uint32_t off, uint32_t val) const -> void
static constexpr uint32_t kIcfgrnBits
static constexpr uint32_t kPidr7
Peripheral ID 7 Register, RO.
auto SetPrio(uint32_t intid, uint32_t prio) const -> void
设置 intid 的优先级
auto Clear(uint32_t intid) const -> void
清除 intid 的中断
static constexpr uint32_t kIpriorityrnBitsMask
static constexpr uint32_t kIcerrrn
Interrupt Clear Error Registers, n = 0-31, but n=0 is Reserved.
static constexpr uint32_t kSac
Tie-off dependentb Secure Access Control register, RW.
static constexpr uint32_t kSetSpiNsr
Non-secure SPI Set Register, WO.
auto IsEnable(uint32_t intid) const -> bool
判断 intid 中断是否使能
static constexpr uint32_t kFctlr
Function Control Register, RW.
static constexpr uint32_t kIcfgrnLevelSensitive
static constexpr uint32_t kIcfgrnSize
static constexpr uint32_t kChipsr
P-Channel dependent Chip Status Register, RW.
static constexpr uint32_t kItargetsrnBitsMask
static constexpr uint32_t kPidr6
Peripheral ID 6 Register, RO.
__always_inline auto Icpendrn(uint64_t n) const -> uint64_t
计算 ICPENDR 寄存器偏移
static constexpr uint32_t kCidr3
Component ID 3 Register, RO.
__always_inline auto Read(uint32_t off) const -> uint32_t
static constexpr uint32_t kIsEnablern
auto operator=(const Gicd &) -> Gicd &=delete
__always_inline auto Ipriorityrn(uint64_t n) const -> uint64_t
计算 IPRIORITYR 寄存器偏移
static constexpr uint32_t kPidr3
Peripheral ID3 register, RO.
static constexpr uint32_t kIcEnablern
static constexpr uint32_t kPidr1
Peripheral ID1 register, RO.
static constexpr uint32_t kIcPendrn
static constexpr uint32_t kTyperItLinesNumberMask
static constexpr uint32_t kIcActivern
Interrupt Clear-Active Registers, n = 0-31, but n=0 is Reserved.
static constexpr uint32_t kItargetsrnBits
static constexpr uint32_t kIpriorityrnBits
static constexpr uint32_t kPidr2
Peripheral ID2 register, RO.
static constexpr uint32_t kCtlr
auto Enable(uint32_t intid) const -> void
允许从 Distributor 转发到 redistributor
static constexpr uint32_t kIsPendrn
Interrupt Set-Pending Registers, n = 0-31, but n=0 is Reserved.
static constexpr uint32_t kIsPendr0
Interrupt Set-Pending Register, RW.
static constexpr uint32_t kIsEnabler0
__always_inline auto Ipriorityrn(uint64_t n) const -> uint64_t
计算 IPRIORITYR 寄存器偏移
auto operator=(Gicr &&) -> Gicr &=default
auto SetPrio(uint32_t intid, uint32_t cpuid, uint32_t prio) const -> void
设置 intid 的优先级
static constexpr uint32_t kIgrpmodr0
static constexpr uint32_t kCtlr
static constexpr uint32_t kIcPendr0Size
static constexpr uint32_t kFctlr
Function Control Register, RW.
auto SetUp() const -> void
初始化 gicr,在多核场景使用
static constexpr uint32_t kStride
每个 GICR 长度 2 * 64 * 1024
static constexpr uint32_t kCidr1
Component ID 1 Register, RO.
static constexpr uint32_t kCidr0
Component ID 0 Register, RO.
auto SetupPpi(uint32_t intid, uint32_t cpuid) const -> void
设置指定 PPI 中断 PPI: private peripheral interrupt, 私有外设中断,该中断来源于外设,但是该中断只对指定的 core 有效
static constexpr uint32_t kIgroupr0
static constexpr uint32_t kPidr3
Peripheral ID 3 Register, RO.
static constexpr uint32_t kPidr2
Peripheral ID 2 Register, RO.
static constexpr uint32_t kIsEnabler0Size
uint64_t base_addr_
GICR 基地址
static constexpr uint32_t kIpriorityrnSize
static constexpr uint32_t kTyper
Redistributor Type Register, RO.
static constexpr uint32_t kIcfgrn
Interrupt Configuration Registers, RW.
static constexpr uint32_t kPidr5
Peripheral ID 5 Register, RO.
static constexpr uint32_t kNsacr
Non-secure Access Control Register, RW.
static constexpr uint32_t kIidr
Redistributor Implementation Identification Register, RO.
static constexpr uint32_t kPidr1
Peripheral ID 1 Register, RO.
auto SetupSgi(uint32_t intid, uint32_t cpuid) const -> void
设置指定 SGI 中断 SGI: Software Generated Interrupt, 软件生成中断,用于处理器间通信
static constexpr uint32_t kIsActiver0
Interrupt Set-Active Register, RW.
static constexpr uint32_t kWaker
static constexpr uint32_t kIcEnabler0Size
static constexpr uint32_t kCfgid1
Configuration ID1 Register, RO.
static constexpr uint32_t kIerrvr
Interrupt Error Valid Register, RW.
auto Enable(uint32_t intid, uint32_t cpuid) const -> void
允许从 redistributor 转发到 CPU interface
static constexpr uint32_t kIpriorityrnBitsMask
static constexpr uint32_t kClassr
Class Register, RW.
static constexpr uint32_t kCidr2
Component ID 2 Register, RO.
static constexpr uint32_t kPidr7
Peripheral ID 7 Register, RO.
static constexpr uint32_t kPidr6
Peripheral ID 6 Register, RO.
static constexpr uint32_t kPendbaser
Redistributor LPI Pending Table Base Address Register, RW.
static constexpr uint32_t kPwrr
Power Register, RW.
static constexpr uint32_t kIgrpmodr0Set
auto Clear(uint32_t intid, uint32_t cpuid) const -> void
清除指定 cpu intid 的中断
static constexpr uint32_t kIgroupr0Clear
static constexpr uint32_t kPidr0
Peripheral ID 0 Register, RO.
static constexpr uint32_t kMiscstatusr
Miscellaneous Status Register, RO.
static constexpr uint32_t kIgroupr0Set
__always_inline auto Write(uint32_t cpuid, uint32_t off, uint32_t val) const -> void
static constexpr uint32_t kPidr4
Peripheral ID 4 Register, RO.
static constexpr uint32_t kPropbaser
Redistributor Properties Base Address Register, RW.
Gicr(const Gicr &)=delete
static constexpr uint32_t kIpriorityrnBits
static constexpr uint32_t kIgrpmodr0Clear
static constexpr uint32_t kCfgid0
Configuration ID0 Register, RO.
static constexpr uint32_t kSgidr
SGI Default Register, RW.
static constexpr uint32_t kIpriorityrn
static constexpr uint32_t kSgiBase
SGI 基地址 64 * 1024.
__always_inline auto Read(uint32_t cpuid, uint32_t off) const -> uint32_t
static constexpr uint32_t kIcActiver0
Interrupt Clear-Active Register, RW.
static constexpr uint32_t kIcEnabler0
static constexpr uint32_t kWakerChildrenAsleepMask
static constexpr uint32_t kIcPendr0
static constexpr uint32_t kCidr3
Component ID 3 Register, RO.
auto Disable(uint32_t intid, uint32_t cpuid) const -> void
禁止从 redistributor 转发到 CPU interface
static constexpr uint32_t kWakerProcessorSleepMask
auto operator=(const Gicr &) -> Gicr &=delete
static constexpr size_t kPpiCount
auto Spi(uint32_t intid, uint32_t cpuid) const -> void
配置共享外设中断 (SPI)
auto Sgi(uint32_t intid, uint32_t cpuid) const -> void
配置软件生成中断 (SGI)
static constexpr size_t kSpiBase
static constexpr size_t kSgiBase
auto SetUp() const -> void
初始化当前 CPU 的 GIC 配置
auto Ppi(uint32_t intid, uint32_t cpuid) const -> void
配置私有外设中断 (PPI)
static constexpr const char * kCompatibleName
static constexpr size_t kPpiBase
static constexpr size_t kSpiCount
Gicr gicr_
Redistributor 实例
static constexpr size_t kSgiCount
GICD_CTLR, Distributor Control Register.
uint32_t rwp
[31] Register Write Pending
uint32_t enable_grp0
[0] EnableGrp0 Enable Group 0 interrupts
uint32_t e1nwf
[7] E1NWF Enable 1 of N Wakeup Functionality
uint32_t are_ns
[5] ARE_NS Affinity Routing Enable, Non-secure state
uint32_t enable_grp1_s
[2] EnableGrp1S Enable Secure Group 1 interrupts
uint32_t are_s
[4] ARE_S Affinity Routing Enable, Secure state
uint32_t enable_grp1_ns
[1] EnableGrp1NS Enable Non-secure Group 1 interrupts
uint32_t ds
[6] DS Disable Security
GICD_IIDR, Distributor Implementer Identification Register.
uint32_t product_id
[31:24] Product Identifier
uint32_t reserved0
[23:20] Reserved, RES0
GICD_TYPER, Interrupt Controller Type Register.
uint32_t lpis
[17] LPIS Indicates whether the implementation supports LPIs
uint32_t security_extn
[10] SecurityExtn Security state support
uint32_t no1n
[25] No1N 1 of N SPI
uint32_t idbits
[23:19] IDbits Interrupt identifier bits
uint32_t a3v
[24] A3V Affinity level 3 values
uint32_t dvis
[18] DVIS Direct virtual LPI injection support
uint32_t reserved0
[9:8] Reserved, returns 0b00000
uint32_t reserved1
[31:26] Reserved, returns 0b000000
uint32_t mbis
[16] MBIS Message-based interrupt support