drivers/irqchip/irq-riscv-imsic-platform.c
Source file repositories/reference/linux-study-clean/drivers/irqchip/irq-riscv-imsic-platform.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/irqchip/irq-riscv-imsic-platform.c- Extension
.c- Size
- 10771 bytes
- Lines
- 391
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/acpi.hlinux/bitmap.hlinux/cpu.hlinux/interrupt.hlinux/io.hlinux/irq.hlinux/irqchip.hlinux/irqdomain.hlinux/module.hlinux/msi.hlinux/pci.hlinux/platform_device.hlinux/spinlock.hlinux/smp.hlinux/irqchip/irq-msi-lib.hirq-riscv-imsic-state.h
Detected Declarations
function Copyrightfunction imsic_irq_maskfunction imsic_irq_unmaskfunction imsic_irq_retriggerfunction imsic_irq_ackfunction imsic_irq_compose_vector_msgfunction imsic_irq_compose_msgfunction imsic_msi_update_msgfunction imsic_irq_set_affinityfunction followingfunction imsic_irq_force_complete_movefunction imsic_irq_domain_allocfunction imsic_irq_domain_freefunction imsic_irq_debug_showfunction imsic_init_dev_msi_infofunction imsic_irqdomain_initfunction imsic_platform_probe_commonfunction imsic_platform_dt_probefunction acpi_scan_init
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2021 Western Digital Corporation or its affiliates.
* Copyright (C) 2022 Ventana Micro Systems Inc.
*/
#define pr_fmt(fmt) "riscv-imsic: " fmt
#include <linux/acpi.h>
#include <linux/bitmap.h>
#include <linux/cpu.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/irq.h>
#include <linux/irqchip.h>
#include <linux/irqdomain.h>
#include <linux/module.h>
#include <linux/msi.h>
#include <linux/pci.h>
#include <linux/platform_device.h>
#include <linux/spinlock.h>
#include <linux/smp.h>
#include <linux/irqchip/irq-msi-lib.h>
#include "irq-riscv-imsic-state.h"
static bool imsic_cpu_page_phys(unsigned int cpu, unsigned int guest_index,
phys_addr_t *out_msi_pa)
{
struct imsic_global_config *global;
struct imsic_local_config *local;
global = &imsic->global;
local = per_cpu_ptr(global->local, cpu);
if (BIT(global->guest_index_bits) <= guest_index)
return false;
if (out_msi_pa)
*out_msi_pa = local->msi_pa + (guest_index * IMSIC_MMIO_PAGE_SZ);
return true;
}
static void imsic_irq_mask(struct irq_data *d)
{
imsic_vector_mask(irq_data_get_irq_chip_data(d));
}
static void imsic_irq_unmask(struct irq_data *d)
{
imsic_vector_unmask(irq_data_get_irq_chip_data(d));
}
static int imsic_irq_retrigger(struct irq_data *d)
{
struct imsic_vector *vec = irq_data_get_irq_chip_data(d);
struct imsic_local_config *local;
if (WARN_ON(!vec))
return -ENOENT;
local = per_cpu_ptr(imsic->global.local, vec->cpu);
writel_relaxed(vec->local_id, local->msi_va);
return 0;
}
static void imsic_irq_ack(struct irq_data *d)
{
irq_move_irq(d);
}
static void imsic_irq_compose_vector_msg(struct imsic_vector *vec, struct msi_msg *msg)
{
phys_addr_t msi_addr;
if (WARN_ON(!vec))
return;
if (WARN_ON(!imsic_cpu_page_phys(vec->cpu, 0, &msi_addr)))
return;
msg->address_hi = upper_32_bits(msi_addr);
msg->address_lo = lower_32_bits(msi_addr);
msg->data = vec->local_id;
}
static void imsic_irq_compose_msg(struct irq_data *d, struct msi_msg *msg)
{
imsic_irq_compose_vector_msg(irq_data_get_irq_chip_data(d), msg);
}
Annotation
- Immediate include surface: `linux/acpi.h`, `linux/bitmap.h`, `linux/cpu.h`, `linux/interrupt.h`, `linux/io.h`, `linux/irq.h`, `linux/irqchip.h`, `linux/irqdomain.h`.
- Detected declarations: `function Copyright`, `function imsic_irq_mask`, `function imsic_irq_unmask`, `function imsic_irq_retrigger`, `function imsic_irq_ack`, `function imsic_irq_compose_vector_msg`, `function imsic_irq_compose_msg`, `function imsic_msi_update_msg`, `function imsic_irq_set_affinity`, `function following`.
- Atlas domain: Driver Families / drivers/irqchip.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.