drivers/irqchip/irq-hip04.c
Source file repositories/reference/linux-study-clean/drivers/irqchip/irq-hip04.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/irqchip/irq-hip04.c- Extension
.c- Size
- 10464 bytes
- Lines
- 405
- Domain
- Driver Families
- Bucket
- drivers/irqchip
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/init.hlinux/kernel.hlinux/err.hlinux/module.hlinux/list.hlinux/smp.hlinux/cpu.hlinux/cpu_pm.hlinux/cpumask.hlinux/io.hlinux/of.hlinux/of_address.hlinux/of_irq.hlinux/irqdomain.hlinux/interrupt.hlinux/slab.hlinux/irqchip.hlinux/irqchip/arm-gic.hasm/irq.hasm/exception.hasm/smp_plat.hirq-gic-common.h
Detected Declarations
struct hip04_irq_datafunction hip04_irqfunction hip04_mask_irqfunction hip04_unmask_irqfunction hip04_eoi_irqfunction hip04_irq_set_typefunction hip04_irq_set_affinityfunction hip04_ipi_send_maskfunction hip04_handle_irqfunction hip04_get_cpumaskfunction hip04_irq_dist_initfunction hip04_irq_cpu_initfunction hip04_irq_domain_mapfunction hip04_irq_domain_xlatefunction hip04_irq_starting_cpufunction hip04_of_init
Annotated Snippet
struct hip04_irq_data {
void __iomem *dist_base;
void __iomem *cpu_base;
struct irq_domain *domain;
unsigned int nr_irqs;
};
static DEFINE_RAW_SPINLOCK(irq_controller_lock);
/*
* The GIC mapping of CPU interfaces does not necessarily match
* the logical CPU numbering. Let's use a mapping as returned
* by the GIC itself.
*/
#define NR_HIP04_CPU_IF 16
static u16 hip04_cpu_map[NR_HIP04_CPU_IF] __read_mostly;
static struct hip04_irq_data hip04_data __read_mostly;
static inline void __iomem *hip04_dist_base(struct irq_data *d)
{
struct hip04_irq_data *hip04_data = irq_data_get_irq_chip_data(d);
return hip04_data->dist_base;
}
static inline void __iomem *hip04_cpu_base(struct irq_data *d)
{
struct hip04_irq_data *hip04_data = irq_data_get_irq_chip_data(d);
return hip04_data->cpu_base;
}
static inline unsigned int hip04_irq(struct irq_data *d)
{
return d->hwirq;
}
/*
* Routines to acknowledge, disable and enable interrupts
*/
static void hip04_mask_irq(struct irq_data *d)
{
u32 mask = 1 << (hip04_irq(d) % 32);
raw_spin_lock(&irq_controller_lock);
writel_relaxed(mask, hip04_dist_base(d) + GIC_DIST_ENABLE_CLEAR +
(hip04_irq(d) / 32) * 4);
raw_spin_unlock(&irq_controller_lock);
}
static void hip04_unmask_irq(struct irq_data *d)
{
u32 mask = 1 << (hip04_irq(d) % 32);
raw_spin_lock(&irq_controller_lock);
writel_relaxed(mask, hip04_dist_base(d) + GIC_DIST_ENABLE_SET +
(hip04_irq(d) / 32) * 4);
raw_spin_unlock(&irq_controller_lock);
}
static void hip04_eoi_irq(struct irq_data *d)
{
writel_relaxed(hip04_irq(d), hip04_cpu_base(d) + GIC_CPU_EOI);
}
static int hip04_irq_set_type(struct irq_data *d, unsigned int type)
{
void __iomem *base = hip04_dist_base(d);
unsigned int irq = hip04_irq(d);
int ret;
/* Interrupt configuration for SGIs can't be changed */
if (irq < 16)
return -EINVAL;
/* SPIs have restrictions on the supported types */
if (irq >= 32 && type != IRQ_TYPE_LEVEL_HIGH &&
type != IRQ_TYPE_EDGE_RISING)
return -EINVAL;
raw_spin_lock(&irq_controller_lock);
ret = gic_configure_irq(irq, type, base + GIC_DIST_CONFIG);
if (ret && irq < 32) {
/* Misconfigured PPIs are usually not fatal */
pr_warn("GIC: PPI%d is secure or misconfigured\n", irq - 16);
ret = 0;
}
raw_spin_unlock(&irq_controller_lock);
Annotation
- Immediate include surface: `linux/init.h`, `linux/kernel.h`, `linux/err.h`, `linux/module.h`, `linux/list.h`, `linux/smp.h`, `linux/cpu.h`, `linux/cpu_pm.h`.
- Detected declarations: `struct hip04_irq_data`, `function hip04_irq`, `function hip04_mask_irq`, `function hip04_unmask_irq`, `function hip04_eoi_irq`, `function hip04_irq_set_type`, `function hip04_irq_set_affinity`, `function hip04_ipi_send_mask`, `function hip04_handle_irq`, `function hip04_get_cpumask`.
- Atlas domain: Driver Families / drivers/irqchip.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.