tools/testing/selftests/kvm/lib/arm64/gic_v3.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/kvm/lib/arm64/gic_v3.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/kvm/lib/arm64/gic_v3.c- Extension
.c- Size
- 11325 bytes
- Lines
- 450
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/sizes.hkvm_util.hprocessor.hdelay.hgic.hgic_v3.hgic_private.h
Detected Declarations
struct gicv3_dataenum gicv3_intid_rangefunction gicv3_gicd_wait_for_rwpfunction gicv3_gicr_wait_for_rwpfunction gicv3_wait_for_rwpfunction get_intid_rangefunction gicv3_read_iarfunction gicv3_write_eoirfunction gicv3_write_dirfunction gicv3_set_priority_maskfunction gicv3_set_eoi_splitfunction gicv3_reg_readlfunction gicv3_reg_writelfunction gicv3_getl_fieldsfunction gicv3_setl_fieldsfunction gicv3_access_regfunction gicv3_write_regfunction gicv3_read_regfunction gicv3_set_priorityfunction gicv3_irq_set_configfunction gicv3_irq_enablefunction gicv3_irq_disablefunction gicv3_irq_set_activefunction gicv3_irq_clear_activefunction gicv3_irq_get_activefunction gicv3_irq_set_pendingfunction gicv3_irq_clear_pendingfunction gicv3_irq_get_pendingfunction gicv3_enable_redistfunction gicv3_set_groupfunction gicv3_cpu_initfunction gicv3_dist_initfunction gicv3_initfunction gic_rdist_enable_lpis
Annotated Snippet
struct gicv3_data {
unsigned int nr_cpus;
unsigned int nr_spis;
};
#define sgi_base_from_redist(redist_base) (redist_base + SZ_64K)
#define DIST_BIT (1U << 31)
enum gicv3_intid_range {
SGI_RANGE,
PPI_RANGE,
SPI_RANGE,
INVALID_RANGE,
};
static struct gicv3_data gicv3_data;
static void gicv3_gicd_wait_for_rwp(void)
{
unsigned int count = 100000; /* 1s */
while (readl(GICD_BASE_GVA + GICD_CTLR) & GICD_CTLR_RWP) {
GUEST_ASSERT(count--);
udelay(10);
}
}
static inline volatile void *gicr_base_cpu(u32 cpu)
{
/* Align all the redistributors sequentially */
return GICR_BASE_GVA + cpu * SZ_64K * 2;
}
static void gicv3_gicr_wait_for_rwp(u32 cpu)
{
unsigned int count = 100000; /* 1s */
while (readl(gicr_base_cpu(cpu) + GICR_CTLR) & GICR_CTLR_RWP) {
GUEST_ASSERT(count--);
udelay(10);
}
}
static void gicv3_wait_for_rwp(u32 cpu_or_dist)
{
if (cpu_or_dist & DIST_BIT)
gicv3_gicd_wait_for_rwp();
else
gicv3_gicr_wait_for_rwp(cpu_or_dist);
}
static enum gicv3_intid_range get_intid_range(unsigned int intid)
{
switch (intid) {
case 0 ... 15:
return SGI_RANGE;
case 16 ... 31:
return PPI_RANGE;
case 32 ... 1019:
return SPI_RANGE;
}
/* We should not be reaching here */
GUEST_ASSERT(0);
return INVALID_RANGE;
}
static u64 gicv3_read_iar(void)
{
u64 irqstat = read_sysreg_s(SYS_ICC_IAR1_EL1);
dsb(sy);
return irqstat;
}
static void gicv3_write_eoir(u32 irq)
{
write_sysreg_s(irq, SYS_ICC_EOIR1_EL1);
isb();
}
static void gicv3_write_dir(u32 irq)
{
write_sysreg_s(irq, SYS_ICC_DIR_EL1);
isb();
}
static void gicv3_set_priority_mask(u64 mask)
{
Annotation
- Immediate include surface: `linux/sizes.h`, `kvm_util.h`, `processor.h`, `delay.h`, `gic.h`, `gic_v3.h`, `gic_private.h`.
- Detected declarations: `struct gicv3_data`, `enum gicv3_intid_range`, `function gicv3_gicd_wait_for_rwp`, `function gicv3_gicr_wait_for_rwp`, `function gicv3_wait_for_rwp`, `function get_intid_range`, `function gicv3_read_iar`, `function gicv3_write_eoir`, `function gicv3_write_dir`, `function gicv3_set_priority_mask`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.