SimpleKernel 1.17.0
Loading...
Searching...
No Matches
gic.h
Go to the documentation of this file.
1
5#pragma once
6
7#include <etl/io_port.h>
8
9#include <cstddef>
10#include <cstdint>
11
17class Gic {
18 public:
19 static constexpr const char* kCompatibleName = "arm,gic-v3";
20
21 static constexpr size_t kSgiBase = 0;
22 static constexpr size_t kSgiCount = 16;
23 static constexpr size_t kPpiBase = 16;
24 static constexpr size_t kPpiCount = 16;
25 static constexpr size_t kSpiBase = 32;
26 static constexpr size_t kSpiCount = 988;
27
31 class Gicd {
32 public:
37 auto Enable(uint32_t intid) const -> void;
38
42 auto EnableGrp1Ns() const -> void;
43
48 auto Disable(uint32_t intid) const -> void;
49
54 auto Clear(uint32_t intid) const -> void;
55
62 [[nodiscard]] auto IsEnable(uint32_t intid) const -> bool;
63
69 auto SetPrio(uint32_t intid, uint32_t prio) const -> void;
70
76 auto SetConfig(uint32_t intid, uint32_t config) const -> void;
77
83 auto SetTarget(uint32_t intid, uint32_t cpuid) const -> void;
84
92 auto SetupSpi(uint32_t intid, uint32_t cpuid) const -> void;
93
96
101 explicit Gicd(uint64_t _base_addr);
102 Gicd() = default;
103 Gicd(const Gicd&) = delete;
104 Gicd(Gicd&&) = delete;
105 auto operator=(const Gicd&) -> Gicd& = delete;
106 auto operator=(Gicd&&) -> Gicd& = default;
107 ~Gicd() = default;
109
110 private:
115 static constexpr uint32_t kCtlr = 0x0000;
116 static constexpr uint32_t kCtlrEnableGrp1Ns = 0x2;
117
123 struct GicdCtlr {
125 uint32_t rwp : 1;
126 uint32_t reserved1 : 23;
128 uint32_t e1nwf : 1;
130 uint32_t ds : 1;
132 uint32_t are_ns : 1;
134 uint32_t are_s : 1;
135 uint32_t reserved0 : 1;
137 uint32_t enable_grp1_s : 1;
139 uint32_t enable_grp1_ns : 1;
141 uint32_t enable_grp0 : 1;
142 };
143
145 static constexpr uint32_t kTyper = 0x0004;
146 static constexpr uint32_t kTyperItLinesNumberMask = 0x1F;
147
153 struct GicdTyper {
155 uint32_t reserved1 : 6;
157 uint32_t no1n : 1;
159 uint32_t a3v : 1;
161 uint32_t idbits : 5;
163 uint32_t dvis : 1;
165 uint32_t lpis : 1;
167 uint32_t mbis : 1;
170 uint32_t num_lpis : 5;
172 uint32_t security_extn : 1;
174 uint32_t reserved0 : 2;
177 uint32_t cpu_number : 3;
181 uint32_t it_lines_number : 5;
182 };
183
186 static constexpr uint32_t kIidr = 0x0008;
187
193 struct GicdIidr {
195 uint32_t product_id : 8;
197 uint32_t reserved0 : 4;
200 uint32_t variant : 4;
203 uint32_t revision : 4;
206 uint32_t implementer : 12;
207 };
208
210 static constexpr uint32_t kFctlr = 0x0020;
212 static constexpr uint32_t kSac = 0x0024;
214 static constexpr uint32_t kSetSpiNsr = 0x0040;
216 static constexpr uint32_t kClrSpiNsr = 0x0048;
218 static constexpr uint32_t kSetSpiSr = 0x0050;
220 static constexpr uint32_t kClrSpiSr = 0x0058;
221
225 static constexpr uint32_t kIgrouprn = 0x0080;
226
232 [[nodiscard]] __always_inline auto Igrouprn(uint64_t n) const -> uint64_t {
233 return kIgrouprn + n * 4;
234 }
235
239 static constexpr uint32_t kIsEnablern = 0x0100;
240 static constexpr uint32_t kIsEnablernSize = 32;
241
247 [[nodiscard]] __always_inline auto Isenablern(uint64_t n) const
248 -> uint64_t {
249 return kIsEnablern + n * 4;
250 }
251
255 static constexpr uint32_t kIcEnablern = 0x0180;
256 static constexpr uint32_t kIcEnablernSize = 32;
257
263 [[nodiscard]] __always_inline auto Icenablern(uint64_t n) const
264 -> uint64_t {
265 return kIcEnablern + n * 4;
266 }
267
269 static constexpr uint32_t kIsPendrn = 0x0200;
270
274 static constexpr uint32_t kIcPendrn = 0x0280;
275 static constexpr uint32_t kIcPendrnSize = 32;
276
282 [[nodiscard]] __always_inline auto Icpendrn(uint64_t n) const -> uint64_t {
283 return kIcPendrn + n * 4;
284 }
285
287 static constexpr uint32_t kIsActivern = 0x0300;
289 static constexpr uint32_t kIcActivern = 0x0380;
290
295 static constexpr uint32_t kIpriorityrn = 0x0400;
296 static constexpr uint32_t kIpriorityrnSize = 4;
297 static constexpr uint32_t kIpriorityrnBits = 8;
298 static constexpr uint32_t kIpriorityrnBitsMask = 0xFF;
299
305 [[nodiscard]] __always_inline auto Ipriorityrn(uint64_t n) const
306 -> uint64_t {
307 return kIpriorityrn + n * 4;
308 }
309
313 static constexpr uint32_t kItargetsrn = 0x0800;
314 static constexpr uint32_t kItargetsrnSize = 4;
315 static constexpr uint32_t kItargetsrnBits = 8;
316 static constexpr uint32_t kItargetsrnBitsMask = 0xFF;
317
323 [[nodiscard]] __always_inline auto Itargetsrn(uint64_t n) const
324 -> uint64_t {
325 return kItargetsrn + n * 4;
326 }
327
331 static constexpr uint32_t kIcfgrn = 0x0C00;
332 static constexpr uint32_t kIcfgrnSize = 16;
333 static constexpr uint32_t kIcfgrnBits = 2;
334 static constexpr uint32_t kIcfgrnBitsMask = 0x3;
335 static constexpr uint32_t kIcfgrnLevelSensitive = 0;
336 static constexpr uint32_t kIcfgrnEdgeTriggered = 1;
337
343 [[nodiscard]] __always_inline auto Icfgrn(uint64_t n) const -> uint64_t {
344 return kIcfgrn + n * 4;
345 }
346
349 static constexpr uint32_t kIgrpmodrn = 0x0D00;
352 static constexpr uint32_t kNsacrn = 0x0E00;
355 static constexpr uint32_t kIroutern = 0x6000;
357 static constexpr uint32_t kChipsr = 0xC000;
359 static constexpr uint32_t kDchipr = 0xC004;
361 static constexpr uint32_t kChiprn = 0xC008;
363 static constexpr uint32_t kIclarn = 0xE000;
365 static constexpr uint32_t kIcerrrn = 0xE100;
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;
392
394 uint64_t base_addr_{0};
395
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)};
398 return reg.read();
399 }
400
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)};
403 reg.write(val);
404 }
405 };
406
410 class Gicr {
411 public:
417 auto Enable(uint32_t intid, uint32_t cpuid) const -> void;
418
424 auto Disable(uint32_t intid, uint32_t cpuid) const -> void;
425
431 auto Clear(uint32_t intid, uint32_t cpuid) const -> void;
432
439 auto SetPrio(uint32_t intid, uint32_t cpuid, uint32_t prio) const -> void;
440
444 auto SetUp() const -> void;
445
453 auto SetupPpi(uint32_t intid, uint32_t cpuid) const -> void;
454
462 auto SetupSgi(uint32_t intid, uint32_t cpuid) const -> void;
463
466
471 explicit Gicr(uint64_t _base_addr);
472 Gicr() = default;
473 Gicr(const Gicr&) = delete;
474 Gicr(Gicr&&) = delete;
475 auto operator=(const Gicr&) -> Gicr& = delete;
476 auto operator=(Gicr&&) -> Gicr& = default;
477 ~Gicr() = default;
479
480 private:
482 static constexpr uint32_t kStride = 0x20000;
483
487 static constexpr uint32_t kCtlr = 0x0000;
489 static constexpr uint32_t kIidr = 0x0004;
491 static constexpr uint32_t kTyper = 0x0008;
492
496 static constexpr uint32_t kWaker = 0x0014;
497 static constexpr uint32_t kWakerProcessorSleepMask = 2;
498 static constexpr uint32_t kWakerChildrenAsleepMask = 4;
499
501 static constexpr uint32_t kFctlr = 0x0020;
503 static constexpr uint32_t kPwrr = 0x0024;
505 static constexpr uint32_t kClassr = 0x0028;
507 static constexpr uint32_t kPropbaser = 0x0070;
509 static constexpr uint32_t kPendbaser = 0x0078;
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;
534
536 static constexpr uint32_t kSgiBase = 0x10000;
537
541 static constexpr uint32_t kIgroupr0 = kSgiBase + 0x0080;
542 static constexpr uint32_t kIgroupr0Clear = 0;
543 static constexpr uint32_t kIgroupr0Set = UINT32_MAX;
544
548 static constexpr uint32_t kIsEnabler0 = kSgiBase + 0x0100;
549 static constexpr uint32_t kIsEnabler0Size = 32;
550
554 static constexpr uint32_t kIcEnabler0 = kSgiBase + 0x0180;
555 static constexpr uint32_t kIcEnabler0Size = 32;
556
558 static constexpr uint32_t kIsPendr0 = kSgiBase + 0x0200;
559
563 static constexpr uint32_t kIcPendr0 = kSgiBase + 0x0280;
564 static constexpr uint32_t kIcPendr0Size = 32;
565
567 static constexpr uint32_t kIsActiver0 = kSgiBase + 0x0300;
569 static constexpr uint32_t kIcActiver0 = kSgiBase + 0x0380;
573 static constexpr uint32_t kIpriorityrn = kSgiBase + 0x0400;
574 static constexpr uint32_t kIpriorityrnSize = 4;
575 static constexpr uint32_t kIpriorityrnBits = 8;
576 static constexpr uint32_t kIpriorityrnBitsMask = 0xFF;
577
583 [[nodiscard]] __always_inline auto Ipriorityrn(uint64_t n) const
584 -> uint64_t {
585 return kIpriorityrn + n * 4;
586 }
587
589 static constexpr uint32_t kIcfgrn = 0x0C00;
590
594 static constexpr uint32_t kIgrpmodr0 = 0x0D00;
595 // kIgrpmodr0 kIgroupr0 Definition
596 // 0b0 0b0 Secure Group 0 G0S
597 // 0b0 0b1 Non-secure Group 1 G1NS
598 // 0b1 0b0 Secure Group 1 G1S
599 static constexpr uint32_t kIgrpmodr0Clear = 0;
600 static constexpr uint32_t kIgrpmodr0Set = UINT32_MAX;
601
603 static constexpr uint32_t kNsacr = 0x0E00;
605 static constexpr uint32_t kMiscstatusr = 0xC000;
607 static constexpr uint32_t kIerrvr = 0xC008;
609 static constexpr uint32_t kSgidr = 0xC010;
611 static constexpr uint32_t kCfgid0 = 0xF000;
613 static constexpr uint32_t kCfgid1 = 0xF004;
614
616 uint64_t base_addr_{0};
617
618 [[nodiscard]] __always_inline auto Read(uint32_t cpuid, uint32_t off) const
619 -> uint32_t {
620 etl::io_port_ro<uint32_t> reg{
621 reinterpret_cast<void*>(base_addr_ + cpuid * kStride + off)};
622 return reg.read();
623 }
624
625 __always_inline auto Write(uint32_t cpuid, uint32_t off, uint32_t val) const
626 -> void {
627 etl::io_port_wo<uint32_t> reg{
628 reinterpret_cast<void*>(base_addr_ + cpuid * kStride + off)};
629 reg.write(val);
630 }
631 };
632
636 auto SetUp() const -> void;
637
643 auto Spi(uint32_t intid, uint32_t cpuid) const -> void;
644
650 auto Ppi(uint32_t intid, uint32_t cpuid) const -> void;
651
657 auto Sgi(uint32_t intid, uint32_t cpuid) const -> void;
658
661
667 explicit Gic(uint64_t gicd_base_addr, uint64_t gicr_base_addr);
668 Gic() = default;
669 Gic(const Gic&) = delete;
670 Gic(Gic&&) = delete;
671 auto operator=(const Gic&) -> Gic& = delete;
672 auto operator=(Gic&&) -> Gic& = default;
673 ~Gic() = default;
675
676 private:
681};
GIC Distributor 接口
Definition gic.h:31
static constexpr uint32_t kClrSpiNsr
Non-secure SPI Clear Register, WO.
Definition gic.h:216
static constexpr uint32_t kCtlrEnableGrp1Ns
Definition gic.h:116
static constexpr uint32_t kChiprn
Chip Registers, n = 0-15. Reserved in single-chip configurations.
Definition gic.h:361
static constexpr uint32_t kIgrpmodrn
Definition gic.h:349
static constexpr uint32_t kIpriorityrn
Definition gic.h:295
static constexpr uint32_t kPidr0
Peripheral ID0 register, RO.
Definition gic.h:377
static constexpr uint32_t kTyper
Configuration dependent Interrupt Controller Type Register, RO.
Definition gic.h:145
static constexpr uint32_t kIcEnablernSize
Definition gic.h:256
Gicd(Gicd &&)=delete
__always_inline auto Itargetsrn(uint64_t n) const -> uint64_t
计算 ITARGETSR 寄存器偏移
Definition gic.h:323
auto EnableGrp1Ns() const -> void
允许 no-sec group1 中断
Definition gic.cpp:66
static constexpr uint32_t kPidr4
Peripheral ID4 register , RO.
Definition gic.h:369
static constexpr uint32_t kIroutern
Definition gic.h:355
static constexpr uint32_t kCidr1
Component ID 1 Register, RO.
Definition gic.h:387
static constexpr uint32_t kIcfgrnEdgeTriggered
Definition gic.h:336
auto SetTarget(uint32_t intid, uint32_t cpuid) const -> void
设置 intid 的由指定 cpu 处理
Definition gic.cpp:104
static constexpr uint32_t kIcPendrnSize
Definition gic.h:275
auto SetConfig(uint32_t intid, uint32_t config) const -> void
设置 intid 的属性
Definition gic.cpp:96
static constexpr uint32_t kIcfgrn
Definition gic.h:331
~Gicd()=default
Gicd()=default
static constexpr uint32_t kItargetsrnSize
Definition gic.h:314
static constexpr uint32_t kIidr
Definition gic.h:186
__always_inline auto Icfgrn(uint64_t n) const -> uint64_t
计算 ICFGR 寄存器偏移
Definition gic.h:343
static constexpr uint32_t kPidr5
Peripheral ID 5 Register, RO.
Definition gic.h:371
static constexpr uint32_t kNsacrn
Definition gic.h:352
static constexpr uint32_t kItargetsrn
Definition gic.h:313
__always_inline auto Isenablern(uint64_t n) const -> uint64_t
计算 ISENABLER 寄存器偏移
Definition gic.h:247
Gicd(const Gicd &)=delete
static constexpr uint32_t kIpriorityrnSize
Definition gic.h:296
static constexpr uint32_t kIsEnablernSize
Definition gic.h:240
__always_inline auto Icenablern(uint64_t n) const -> uint64_t
计算 ICENABLER 寄存器偏移
Definition gic.h:263
static constexpr uint32_t kIsActivern
Interrupt Set-Active Registers, n = 0-31, but n=0 is Reserved.
Definition gic.h:287
static constexpr uint32_t kIcfgrnBitsMask
Definition gic.h:334
static constexpr uint32_t kClrSpiSr
Secure SPI Clear Register, WO.
Definition gic.h:220
static constexpr uint32_t kCidr2
Component ID 2 Register, RO.
Definition gic.h:389
auto SetupSpi(uint32_t intid, uint32_t cpuid) const -> void
设置指定 SPI 中断 SPI: shared peripheral interrupt, 共享外设中断,该中断来源于外设,但是该中断可以对所有的 core 有效
Definition gic.cpp:137
auto Disable(uint32_t intid) const -> void
禁止从 Distributor 转发到 redistributor
Definition gic.cpp:71
static constexpr uint32_t kIgrouprn
Definition gic.h:225
static constexpr uint32_t kSetSpiSr
Secure SPI Set Register, WO.
Definition gic.h:218
uint64_t base_addr_
GICD 基地址
Definition gic.h:394
auto operator=(Gicd &&) -> Gicd &=default
static constexpr uint32_t kCidr0
Component ID 0 Register, RO.
Definition gic.h:385
__always_inline auto Igrouprn(uint64_t n) const -> uint64_t
计算 IGROUPR 寄存器偏移
Definition gic.h:232
static constexpr uint64_t kCfgid
Configuration dependent Configuration ID Register, RO.
Definition gic.h:367
static constexpr uint32_t kDchipr
Default Chip Register, RW.
Definition gic.h:359
static constexpr uint32_t kIclarn
Interrupt Class Registers, n = 0-63, but n=0-1 are Reserved.
Definition gic.h:363
__always_inline auto Write(uint32_t off, uint32_t val) const -> void
Definition gic.h:401
static constexpr uint32_t kIcfgrnBits
Definition gic.h:333
static constexpr uint32_t kPidr7
Peripheral ID 7 Register, RO.
Definition gic.h:375
auto SetPrio(uint32_t intid, uint32_t prio) const -> void
设置 intid 的优先级
Definition gic.cpp:88
auto Clear(uint32_t intid) const -> void
清除 intid 的中断
Definition gic.cpp:77
static constexpr uint32_t kIpriorityrnBitsMask
Definition gic.h:298
static constexpr uint32_t kIcerrrn
Interrupt Clear Error Registers, n = 0-31, but n=0 is Reserved.
Definition gic.h:365
static constexpr uint32_t kSac
Tie-off dependentb Secure Access Control register, RW.
Definition gic.h:212
static constexpr uint32_t kSetSpiNsr
Non-secure SPI Set Register, WO.
Definition gic.h:214
auto IsEnable(uint32_t intid) const -> bool
判断 intid 中断是否使能
Definition gic.cpp:83
static constexpr uint32_t kFctlr
Function Control Register, RW.
Definition gic.h:210
static constexpr uint32_t kIcfgrnLevelSensitive
Definition gic.h:335
static constexpr uint32_t kIcfgrnSize
Definition gic.h:332
static constexpr uint32_t kChipsr
P-Channel dependent Chip Status Register, RW.
Definition gic.h:357
static constexpr uint32_t kItargetsrnBitsMask
Definition gic.h:316
static constexpr uint32_t kPidr6
Peripheral ID 6 Register, RO.
Definition gic.h:373
__always_inline auto Icpendrn(uint64_t n) const -> uint64_t
计算 ICPENDR 寄存器偏移
Definition gic.h:282
static constexpr uint32_t kCidr3
Component ID 3 Register, RO.
Definition gic.h:391
__always_inline auto Read(uint32_t off) const -> uint32_t
Definition gic.h:396
static constexpr uint32_t kIsEnablern
Definition gic.h:239
auto operator=(const Gicd &) -> Gicd &=delete
__always_inline auto Ipriorityrn(uint64_t n) const -> uint64_t
计算 IPRIORITYR 寄存器偏移
Definition gic.h:305
static constexpr uint32_t kPidr3
Peripheral ID3 register, RO.
Definition gic.h:383
static constexpr uint32_t kIcEnablern
Definition gic.h:255
static constexpr uint32_t kPidr1
Peripheral ID1 register, RO.
Definition gic.h:379
static constexpr uint32_t kIcPendrn
Definition gic.h:274
static constexpr uint32_t kTyperItLinesNumberMask
Definition gic.h:146
static constexpr uint32_t kIcActivern
Interrupt Clear-Active Registers, n = 0-31, but n=0 is Reserved.
Definition gic.h:289
static constexpr uint32_t kItargetsrnBits
Definition gic.h:315
static constexpr uint32_t kIpriorityrnBits
Definition gic.h:297
static constexpr uint32_t kPidr2
Peripheral ID2 register, RO.
Definition gic.h:381
static constexpr uint32_t kCtlr
Definition gic.h:115
auto Enable(uint32_t intid) const -> void
允许从 Distributor 转发到 redistributor
Definition gic.cpp:60
static constexpr uint32_t kIsPendrn
Interrupt Set-Pending Registers, n = 0-31, but n=0 is Reserved.
Definition gic.h:269
GIC Redistributor 接口
Definition gic.h:410
static constexpr uint32_t kIsPendr0
Interrupt Set-Pending Register, RW.
Definition gic.h:558
static constexpr uint32_t kIsEnabler0
Definition gic.h:548
__always_inline auto Ipriorityrn(uint64_t n) const -> uint64_t
计算 IPRIORITYR 寄存器偏移
Definition gic.h:583
auto operator=(Gicr &&) -> Gicr &=default
auto SetPrio(uint32_t intid, uint32_t cpuid, uint32_t prio) const -> void
设置 intid 的优先级
Definition gic.cpp:197
static constexpr uint32_t kIgrpmodr0
Definition gic.h:594
static constexpr uint32_t kCtlr
Definition gic.h:487
static constexpr uint32_t kIcPendr0Size
Definition gic.h:564
static constexpr uint32_t kFctlr
Function Control Register, RW.
Definition gic.h:501
auto SetUp() const -> void
初始化 gicr,在多核场景使用
Definition gic.cpp:112
static constexpr uint32_t kStride
每个 GICR 长度 2 * 64 * 1024
Definition gic.h:482
static constexpr uint32_t kCidr1
Component ID 1 Register, RO.
Definition gic.h:529
static constexpr uint32_t kCidr0
Component ID 0 Register, RO.
Definition gic.h:527
auto SetupPpi(uint32_t intid, uint32_t cpuid) const -> void
设置指定 PPI 中断 PPI: private peripheral interrupt, 私有外设中断,该中断来源于外设,但是该中断只对指定的 core 有效
Definition gic.cpp:206
static constexpr uint32_t kIgroupr0
Definition gic.h:541
~Gicr()=default
static constexpr uint32_t kPidr3
Peripheral ID 3 Register, RO.
Definition gic.h:525
static constexpr uint32_t kPidr2
Peripheral ID 2 Register, RO.
Definition gic.h:523
static constexpr uint32_t kIsEnabler0Size
Definition gic.h:549
uint64_t base_addr_
GICR 基地址
Definition gic.h:616
static constexpr uint32_t kIpriorityrnSize
Definition gic.h:574
static constexpr uint32_t kTyper
Redistributor Type Register, RO.
Definition gic.h:491
static constexpr uint32_t kIcfgrn
Interrupt Configuration Registers, RW.
Definition gic.h:589
static constexpr uint32_t kPidr5
Peripheral ID 5 Register, RO.
Definition gic.h:513
static constexpr uint32_t kNsacr
Non-secure Access Control Register, RW.
Definition gic.h:603
static constexpr uint32_t kIidr
Redistributor Implementation Identification Register, RO.
Definition gic.h:489
static constexpr uint32_t kPidr1
Peripheral ID 1 Register, RO.
Definition gic.h:521
auto SetupSgi(uint32_t intid, uint32_t cpuid) const -> void
设置指定 SGI 中断 SGI: Software Generated Interrupt, 软件生成中断,用于处理器间通信
Definition gic.cpp:212
static constexpr uint32_t kIsActiver0
Interrupt Set-Active Register, RW.
Definition gic.h:567
static constexpr uint32_t kWaker
Definition gic.h:496
static constexpr uint32_t kIcEnabler0Size
Definition gic.h:555
static constexpr uint32_t kCfgid1
Configuration ID1 Register, RO.
Definition gic.h:613
static constexpr uint32_t kIerrvr
Interrupt Error Valid Register, RW.
Definition gic.h:607
auto Enable(uint32_t intid, uint32_t cpuid) const -> void
允许从 redistributor 转发到 CPU interface
Definition gic.cpp:179
static constexpr uint32_t kIpriorityrnBitsMask
Definition gic.h:576
static constexpr uint32_t kClassr
Class Register, RW.
Definition gic.h:505
static constexpr uint32_t kCidr2
Component ID 2 Register, RO.
Definition gic.h:531
static constexpr uint32_t kPidr7
Peripheral ID 7 Register, RO.
Definition gic.h:517
static constexpr uint32_t kPidr6
Peripheral ID 6 Register, RO.
Definition gic.h:515
static constexpr uint32_t kPendbaser
Redistributor LPI Pending Table Base Address Register, RW.
Definition gic.h:509
static constexpr uint32_t kPwrr
Power Register, RW.
Definition gic.h:503
static constexpr uint32_t kIgrpmodr0Set
Definition gic.h:600
auto Clear(uint32_t intid, uint32_t cpuid) const -> void
清除指定 cpu intid 的中断
Definition gic.cpp:191
static constexpr uint32_t kIgroupr0Clear
Definition gic.h:542
Gicr(Gicr &&)=delete
static constexpr uint32_t kPidr0
Peripheral ID 0 Register, RO.
Definition gic.h:519
static constexpr uint32_t kMiscstatusr
Miscellaneous Status Register, RO.
Definition gic.h:605
static constexpr uint32_t kIgroupr0Set
Definition gic.h:543
__always_inline auto Write(uint32_t cpuid, uint32_t off, uint32_t val) const -> void
Definition gic.h:625
static constexpr uint32_t kPidr4
Peripheral ID 4 Register, RO.
Definition gic.h:511
static constexpr uint32_t kPropbaser
Redistributor Properties Base Address Register, RW.
Definition gic.h:507
Gicr(const Gicr &)=delete
static constexpr uint32_t kIpriorityrnBits
Definition gic.h:575
static constexpr uint32_t kIgrpmodr0Clear
Definition gic.h:599
static constexpr uint32_t kCfgid0
Configuration ID0 Register, RO.
Definition gic.h:611
static constexpr uint32_t kSgidr
SGI Default Register, RW.
Definition gic.h:609
static constexpr uint32_t kIpriorityrn
Definition gic.h:573
static constexpr uint32_t kSgiBase
SGI 基地址 64 * 1024.
Definition gic.h:536
__always_inline auto Read(uint32_t cpuid, uint32_t off) const -> uint32_t
Definition gic.h:618
static constexpr uint32_t kIcActiver0
Interrupt Clear-Active Register, RW.
Definition gic.h:569
static constexpr uint32_t kIcEnabler0
Definition gic.h:554
static constexpr uint32_t kWakerChildrenAsleepMask
Definition gic.h:498
static constexpr uint32_t kIcPendr0
Definition gic.h:563
static constexpr uint32_t kCidr3
Component ID 3 Register, RO.
Definition gic.h:533
auto Disable(uint32_t intid, uint32_t cpuid) const -> void
禁止从 redistributor 转发到 CPU interface
Definition gic.cpp:185
Gicr()=default
static constexpr uint32_t kWakerProcessorSleepMask
Definition gic.h:497
auto operator=(const Gicr &) -> Gicr &=delete
GIC 中断控制器驱动
Definition gic.h:17
static constexpr size_t kPpiCount
Definition gic.h:24
auto Spi(uint32_t intid, uint32_t cpuid) const -> void
配置共享外设中断 (SPI)
Definition gic.cpp:31
auto Sgi(uint32_t intid, uint32_t cpuid) const -> void
配置软件生成中断 (SGI)
Definition gic.cpp:39
static constexpr size_t kSpiBase
Definition gic.h:25
Gicd gicd_
Distributor 实例
Definition gic.h:678
static constexpr size_t kSgiBase
Definition gic.h:21
auto SetUp() const -> void
初始化当前 CPU 的 GIC 配置
Definition gic.cpp:23
auto Ppi(uint32_t intid, uint32_t cpuid) const -> void
配置私有外设中断 (PPI)
Definition gic.cpp:35
static constexpr const char * kCompatibleName
Definition gic.h:19
static constexpr size_t kPpiBase
Definition gic.h:23
static constexpr size_t kSpiCount
Definition gic.h:26
Gicr gicr_
Redistributor 实例
Definition gic.h:680
static constexpr size_t kSgiCount
Definition gic.h:22
GICD_CTLR, Distributor Control Register.
Definition gic.h:123
uint32_t rwp
[31] Register Write Pending
Definition gic.h:125
uint32_t enable_grp0
[0] EnableGrp0 Enable Group 0 interrupts
Definition gic.h:141
uint32_t e1nwf
[7] E1NWF Enable 1 of N Wakeup Functionality
Definition gic.h:128
uint32_t reserved1
Definition gic.h:126
uint32_t are_ns
[5] ARE_NS Affinity Routing Enable, Non-secure state
Definition gic.h:132
uint32_t reserved0
Definition gic.h:135
uint32_t enable_grp1_s
[2] EnableGrp1S Enable Secure Group 1 interrupts
Definition gic.h:137
uint32_t are_s
[4] ARE_S Affinity Routing Enable, Secure state
Definition gic.h:134
uint32_t enable_grp1_ns
[1] EnableGrp1NS Enable Non-secure Group 1 interrupts
Definition gic.h:139
uint32_t ds
[6] DS Disable Security
Definition gic.h:130
GICD_IIDR, Distributor Implementer Identification Register.
Definition gic.h:193
uint32_t product_id
[31:24] Product Identifier
Definition gic.h:195
uint32_t reserved0
[23:20] Reserved, RES0
Definition gic.h:197
uint32_t revision
Definition gic.h:203
uint32_t implementer
Definition gic.h:206
uint32_t variant
Definition gic.h:200
GICD_TYPER, Interrupt Controller Type Register.
Definition gic.h:153
uint32_t it_lines_number
Definition gic.h:181
uint32_t num_lpis
Definition gic.h:170
uint32_t lpis
[17] LPIS Indicates whether the implementation supports LPIs
Definition gic.h:165
uint32_t security_extn
[10] SecurityExtn Security state support
Definition gic.h:172
uint32_t no1n
[25] No1N 1 of N SPI
Definition gic.h:157
uint32_t cpu_number
Definition gic.h:177
uint32_t idbits
[23:19] IDbits Interrupt identifier bits
Definition gic.h:161
uint32_t a3v
[24] A3V Affinity level 3 values
Definition gic.h:159
uint32_t dvis
[18] DVIS Direct virtual LPI injection support
Definition gic.h:163
uint32_t reserved0
[9:8] Reserved, returns 0b00000
Definition gic.h:174
uint32_t reserved1
[31:26] Reserved, returns 0b000000
Definition gic.h:155
uint32_t mbis
[16] MBIS Message-based interrupt support
Definition gic.h:167