
cat /proc/interrupt
比如,一般 eth0 的 IRQ 编号是 16,所以控制 eth0 中断绑定的 /proc 文件名是 /proc/irq/16/smp_affinity。上面这个命令还可以看到某些中断对应的CPU处理的次数,缺省的时候肯定是不平衡的。
设置其值的方法很简单,smp_affinity 自身是一个位掩码(bitmask),特定的位对应特定的 CPU,这样,01 就意味着只有第一个 CPU 可以处理对应的中断,而 0f(0x1111)意味着四个 CPU 都会参与中断处理。
几乎所有外设都有这个参数设置,可以关注一下。
这个数值的推荐设置,其实在很大程度上,让专门的CPU处理专门的中断是效率最高的,比如,给磁盘IO一个CPU,给网卡一个CPU,这样是比较合理的。
现在的服务器一般都是多核了,但是中断很多时候都是只用一个核,如果有些中断要求比较高,可以把它独立分配给一个cpu使用。
Linux内核中可使用 platform_get_irq() 函数获取 dts 文件中设置的中断号。
函数原型: int platform_get_irq(struct platform_device *dev, unsigned int num)
定义文件: drivers\base\platform.c
中断号获取函数 platform_get_irq() 调用流程如下:
rk3399 使用的是 GICv3 ,对应 irq_domain->name 。
文件: drivers/irqchip/irq-gic-v3.c 。
translate() 函数实现如下:
以 RockPI 4A 单板 Debian 系统Linux 4.4内核中的获取 HDMI 中断号为例。
1、查找中断号
从手册“Rockchip RK3399 TRM V1.3 Part1.pdf”中,可以查到 HDMI_IRQ 中断号,即55。
2、 dts 配置
文件: arch/arm64/boot/dts/rockchip/rk3399.dtsi
hdmi 使用的是 GIC_SPI 中断,按照 gic_irq_domain_translate() 函数中处理,需要将中断号55减去32,得到 dts 中的中断号23。
注: interrupts = <中断类型 中断号 中断触发类型 中断分区(对应哪个CPU cluster,PPI类型中断特有)>
3、驱动函数
文件: drivers\gpu\drm\rockchip\dw_hdmi-rockchip.c
此时, irq 返回值为55。
后续会介绍 GIC 和中断注册等实现函数。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)