Linux中断管理(二):irq_domain(2):结构体与使用方法

本文深入探讨Linux内核中的irq_domain结构体及其操作,包括数据结构、flags和fwnode的解释,以及不同映射方式如Linear、Radix Tree、No Map和Legacy的使用场景。同时,分析了irq_domain的创建流程,并举例说明GIC V3和GPIO pl061的irq_domain创建方式和时机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文档:

<IRQ-domain.txt>

http://www.wowotech.net/linux_kenrel/irq-domain.html

https://blog.youkuaiyun.com/weixin_41028621/article/details/101448227

1.irq_domain的数据结构

./include/linux/irqdomain.h

struct irq_domain {
	struct list_head link;
	const char *name;
	const struct irq_domain_ops *ops;
	void *host_data;
	unsigned int flags;
	unsigned int mapcount;

	/* Optional data */
	struct fwnode_handle *fwnode;
	enum irq_domain_bus_token bus_token;
	struct irq_domain_chip_generic *gc;
#ifdef	CONFIG_IRQ_DOMAIN_HIERARCHY
	struct irq_domain *parent;
#endif
#ifdef CONFIG_GENERIC_IRQ_DEBUGFS
	struct dentry		*debugfs_file;
#endif

	/* reverse map data. The linear map gets appended to the irq_domain */
	irq_hw_number_t hwirq_max;
	unsigned int revmap_direct_max_irq;
	unsigned int revmap_size;
	struct radix_tree_root revmap_tree;
	unsigned int linear_revmap[];
};

2.详细解释

struct irq_domain_ops:

HIERARCHY英文原意为层级,等级的意思,这里是指级联,即中断控制器的级联

可以理解为:CONFIG_IRQ_DOMAIN_HIERARCHY宏为中断控制器级联开关

如果不存在中断控制器级联,则使用match/select/map/unmap/xlate

如果中断控制器存在级联,则使用alloc/free/activate/deactivate/translate

### Linux Kernel 中 `irq_data` 结构体成员详解 在 Linux 内核中,`irq_data` 是一个非常重要的结构体,用于存储特定中断源相关的配置和状态信息。以下是该结构体的主要成员及其功能说明: #### 1. `unsigned int irq` 这是中断号,表示当前 `irq_data` 对象所对应的硬件中断编号[^1]。 #### 2. `struct irq_chip *chip` 指向具体的中断控制器芯片描述符 (`irq_chip`) 的指针。每个中断可以有不同的处理逻辑,而这些逻辑通常由 `irq_chip` 定义并实现。 #### 3. `void *handler_data` 这是一个通用的数据字段,供中断处理器使用。它可能保存一些特定于中断类型的附加数据,比如 GPIO 控制器的相关参数[^2]。 #### 4. `void *chip_data` 类似于 `handler_data`,但它专属于 `irq_chip` 使用。此字段允许不同的中断控制器共享相同的 `irq_chip` 实现,同时保留各自的私有数据。 #### 5. `unsigned long hwirq` 硬件中断号,在某些复杂的多域 (multi-domain) 系统中非常重要。当存在多个独立的中断域时,`hwirq` 提供了一种方法来区分不同域内的中断号。 #### 6. `unsigned int parent_irq` 如果某个中断被嵌套到另一个中断中,则可以通过此字段指定父级中断号。这种机制常见于虚拟化环境或复杂 SoC 架构下的中断管理场景。 #### 7. `unsigned int common_flags` 一组标志位,用来标记全局范围适用的一些特性或者约束条件。例如是否支持线程化的中断处理程序等。 #### 8. `unsigned int trigger_mask` 触发模式掩码,指示当前中断的有效触发方式(边沿触发还是电平触发),以及实际使用的触发类型。 #### 9. `struct msi_desc *msi_desc` 对于 MSI (Message Signaled Interrupts),即消息信号型中断而言,这里会有一个专门的描述符对象指向其具体属性。 #### 10. `struct cpumask *affinity` 定义了哪些 CPU 可以响应这个中断请求。通过调整亲和力设置可以让系统更高效地调度资源。 ```c // 示例代码片段展示部分关键成员初始化过程 static void init_irq_data(struct irq_data *data, unsigned int irq_num, struct irq_chip *chip_ptr) { data->irq = irq_num; data->chip = chip_ptr; // 初始化其他必要字段... } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值