drivers/irqchip/irq-riscv-intc.c

Source file repositories/reference/linux-study-clean/drivers/irqchip/irq-riscv-intc.c

File Facts

System
Linux kernel
Corpus path
drivers/irqchip/irq-riscv-intc.c
Extension
.c
Size
10368 bytes
Lines
395
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct rintc_data {
	union {
		u32		ext_intc_id;
		struct {
			u32	context_id	: 16,
				reserved	:  8,
				aplic_plic_id	:  8;
		};
	};
	unsigned long		hart_id;
	u64			imsic_addr;
	u32			imsic_size;
};

static u32 nr_rintc;
static struct rintc_data **rintc_acpi_data;

#define for_each_matching_plic(_plic_id)				\
	unsigned int _plic;						\
									\
	for (_plic = 0; _plic < nr_rintc; _plic++)			\
		if (rintc_acpi_data[_plic]->aplic_plic_id != _plic_id)	\
			continue;					\
		else

unsigned int acpi_rintc_get_plic_nr_contexts(unsigned int plic_id)
{
	unsigned int nctx = 0;

	for_each_matching_plic(plic_id)
		nctx++;

	return nctx;
}

static struct rintc_data *get_plic_context(unsigned int plic_id, unsigned int ctxt_idx)
{
	unsigned int ctxt = 0;

	for_each_matching_plic(plic_id) {
		if (ctxt == ctxt_idx)
			return rintc_acpi_data[_plic];

		ctxt++;
	}

	return NULL;
}

unsigned long acpi_rintc_ext_parent_to_hartid(unsigned int plic_id, unsigned int ctxt_idx)
{
	struct rintc_data *data = get_plic_context(plic_id, ctxt_idx);

	return data ? data->hart_id : INVALID_HARTID;
}

unsigned int acpi_rintc_get_plic_context(unsigned int plic_id, unsigned int ctxt_idx)
{
	struct rintc_data *data = get_plic_context(plic_id, ctxt_idx);

	return data ? data->context_id : INVALID_CONTEXT;
}

unsigned long acpi_rintc_index_to_hartid(u32 index)
{
	return index >= nr_rintc ? INVALID_HARTID : rintc_acpi_data[index]->hart_id;
}

int acpi_rintc_get_imsic_mmio_info(u32 index, struct resource *res)
{
	if (index >= nr_rintc)
		return -1;

	res->start = rintc_acpi_data[index]->imsic_addr;
	res->end = res->start + rintc_acpi_data[index]->imsic_size - 1;
	res->flags = IORESOURCE_MEM;
	return 0;
}

static int __init riscv_intc_acpi_match(union acpi_subtable_headers *header,
					const unsigned long end)
{
	return 0;
}

static int __init riscv_intc_acpi_init(union acpi_subtable_headers *header,
				       const unsigned long end)
{
	struct acpi_madt_rintc *rintc;
	struct fwnode_handle *fn;

Annotation

Implementation Notes