irq_domain_ops 的两个版本的区别-应用向

V1 是什么

  • irq_domain_ops V1
CONFIG_IRQ_DOMAIN_HIERARCHY = n
struct irq_domain_ops {
	int (*match)(struct irq_domain *d, struct device_node *node,
		     enum irq_domain_bus_token bus_token);
	int (*select)(struct irq_domain *d, struct irq_fwspec *fwspec,
		      enum irq_domain_bus_token bus_token);
	int (*map)(struct irq_domain *d, unsigned int virq, irq_hw_number_t hw);
	void (*unmap)(struct irq_domain *d, unsigned int virq);
	int (*xlate)(struct irq_domain *d, struct device_node *node,
		     const u32 *intspec, unsigned int intsize,
		     unsigned long *out_hwirq, unsigned int *out_type);
};

V2 是什么

  • irq_domain_ops V2
CONFIG_IRQ_DOMAIN_HIERARCHY = y
struct irq_domain_ops {
	int (*match)(struct irq_domain *d, struct device_node *node,
		     enum irq_domain_bus_token bus_token);
	int (*select)(struct irq_domain *d, struct irq_fwspec *fwspec,
		      enum irq_domain_bus_token bus_token);
	int (*map)(struct irq_domain *d, unsigned int virq, irq_hw_number_t hw);
	void (*unmap)(struct irq_domain *d, unsigned int virq);
	int (*xlate)(struct irq_domain *d, struct device_node *node,
		     const u32 *intspec, unsigned int intsize,
		     unsigned long *out_hwirq, unsigned int *out_type);

	/* extended V2 interfaces to support hierarchy irq_domains */
	int (*alloc)(struct irq_domain *d, unsigned int virq,
		     unsigned int nr_irqs, void *arg);
	void (*free)(struct irq_domain *d, unsigned int virq,
		     unsigned int nr_irqs);
	int (*activate)(struct irq_domain *d, struct irq_data *irqd, bool reserve);
	void (*deactivate)(struct irq_domain *d, struct irq_data *irq_data);
	int (*translate)(struct irq_domain *d, struct irq_fwspec *fwspec,
			 unsigned long *out_hwirq, unsigned int *out_type);
};

为什么要升级 V2

因为 拥有 级联中断控制器 的 计算机系统越来越多了 !!!
所以 内核 要 把他 抽象!!! 
  • 不升级不行吗
也行,有一些缺点
1.用户代码支持:用户要在用户代码(irq chip 驱动中)处理(写死)这种父子关系(HIERARCHY)
2.不灵活 : 设备树变化了父子关系,需要改变代码来适应
3.不管需要与否,某些资源必备申请: 不管子中断控制器有没有使用设备,父中断控制器的该中断线(子中断控制器使用的)都申请了软件中断号和对应资源

升级前后有什么区别

大体上的问题

升级只是做了扩充,那么 V1 独有的API 还要实现吗?
	不需要了

解决了之前级联中断控制器编码的缺点,也适用非级联控制器.
系统中只要有级联中断控制器,一般都应该配置 CONFIG_IRQ_DOMAIN_HIERARCHY = y

V1 指针和 V2独有指针的区别

  • 有几个指针
V1 : match select map unmap xlate
V2 : match select alloc free activate deactivate translate
  • 相同点
V1 和 V2 都会用 match  和 select
但是一般不实现
  • 不同点
这里描述的必须实现
V1 的 map/unmap 对应 V2 的 alloc/free : 
	V1 的用于做以下事情
		1.设置irq_data.chip
		2.设置desc->handle_irq
		3.设置desc->irq_data.chip_data
		4.设置irq status // irq_set_probe
	V2 的包括V1的所有事情,还需要做
		1. 调用 V2的 translate 解析 fwsepc
		2. 设置irq_data->hwirq
		3. 有必要设置 desc->irq_common_data.handler_data 吗? TODO
这里的描述可以不实现,但是一般都实现!!!
// 如果不实现的话,把 属性的第一个值当做hwirq , 触发类型为IRQ_TYPE_NONE
// 如果想实现,可以用内核中的函数来填充!!!
V1 会用 xlate 和 默认 (不实现) // 优先级依次递减,参考irq_domain_translate
V2 会用 translate 或 xlate  或 默认(不实现) // 优先级依次递减
V1 的 xlate 对应 V2 的 translate 
	V1 和 V2 的功能完全一样,都是解析fwsepc 为 hwirq 和 触发类型
这里描述的一般不实现
但是用于msi的irq_domain要实现// 用于设置ITS相关的表
V2 的 activate  和 deactivate  是独有的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值