在龙芯 3A 的硬件平台上,所有的 IO 设备中断都是由位于南桥中的中断控制器—8259
—来转发给上层硬件的。
在启动初期阶段,软件会配置好 8259 的中断向量,即绑定中断引脚 INTx 到中断向量
号 IRQn。这样绑定之后,i8259 才会将收到的 INTx 中断信号转换成对应的 IRQn,并将
IRQn 报告给上层硬件,请求处理。
比如,IO 设备产生了一个中断 INTA,信号会传递给 8259 的 INTB 引脚,(PCI 通过
硬件连线传递信号,PCIE 通过数据报文传递中断信息。)并触发 8259 中的 INTB 中断信号,
假设 8259 的 INTB 与 IRQ4 绑定了,那么,8259 就会将 IRQ4 向上通报给 HT,请求处理。
注意:在为设备分配 IRQ 号时,必须要与绑定的 IRQ 一致,比如例子中的设备,只能分
IRQ4,否则,会出现 cpu 无法找到正确的中断源,而设备中断又不被处理的情况。
HT 的转发
8259 报告的中断会向上层传递给 HT 控制单元。在 HT 控制器中,有一个记录各个向
量是否有中断的中断向量寄存器,一旦收到 IRQn 的中断请求,中断向量寄存器的第 n 位就
会置位,以表示 IRQn 发生了中断请求。(这里有一点还需要说明,HT 还有一个与中断向
量寄存器相对应的中断使能寄存器,用于控制各个中断向量是否被接受,所以,中断被转
发的前提就是已经使能了该中断向量被 HT 接收的请求。)这样,软件在处理中断时,就
能通过查询 HT 中断向量寄存器,获得这个向量号,并根据此信息执行特定的设备驱动程
序。HT 记录了这个中断向量后,就会继续将中断请求报告给处理器。
处理器的中断路由
3A 处理器支持接收 32 个外部 IO 中断源,每个中断源都对应一个固定的 IO 中断,比
如,HT0 的 INT0~INT7 对应中断源的 16~23,HT1 的 INT0~INT7 对应中断源的 24~31,两
个 DDR 控制器对应 11~12,LPC 对应 10 等等。由 HT 报告的中断会触发这 32 个中断源中
特定的一个做出响应。
处理器会设计 32 个可路由的外部中断源的目的,应该是想为软件提供一种灵活处理中
断的手段,通过路由配置,将特定的中断转发给特定 core 的特定 IP,不同的 core 来处理可
以分担工作量,不同的 IP 可以实现不同的处理方法!
关于中断路由的配置,可以参考龙芯 3A 的用户手册,里面介绍了相关的寄存器含义
和具体的路由配置方法,每一个中断源都有一组自己的路由配置寄存器。