【ARM系列】GIC700 LPI中断-配置表空间分配

本文详细介绍了LPI中断的配置过程,包括LPIConfigurationTable和LPIPendingTable的内存布局,以及itsTable中的DeviceTable、InterruptTranslationTable和CollectionTable的作用与组成。

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

LPI是一种比较特殊的中断,它采用软件解析的模式,将收到的访问信息进行解析,通过查询ITS Table(包括设备表,中断翻译表,集合表)解析出对应的LPI中断号和路由信息,进而将中断发送给对应的Redistributor。Redistributor再通过查LPI Configuration Table(中断配置表),确定该LPI是否使能,优先级等信息。

本文重点描述配置各Table的过程

1、LPI Table
Redistributor对LPI的配置信息放在内存的表里,称为LPI Configuration Table,并且同一chip上的所有的Redistributor会共享同一组LPI中断配置表。LPI Pending Table每Redistributor一份,如下图所示。
在这里插入图片描述

①LPI Configuration Table

  • LPI配置表存放在内存中,GICR_PROPBASER指定了一个4KB对齐的基地址,即为存放LPI配置表的初始地址base_addr

  • LPI配置表包含了每个LPI的配置信息(优先级和使能情况),每个LPI占用8bit
    在这里插入图片描述

  • 对于任何LPI(N),存放的地址为base_addr+(N-8192),

在这里插入图片描述

②LPI Pending Table

  • 每个Redistributor有单独的LPI Pending Table,GICR_PENDBASER用于记录LPI Pending Table的基地址base_addr
  • 用于记录LPI中断是否处于pending状态
  • 对于任何LPI(N),存放位置:
    byte:base_addr+N/8 bit:N mod 8

在这里插入图片描述
2、its Table

①Device Table

  • 由Device Table entry(DTE)组成,DTE描述DevicedID与ITT base address的映射关系
  • DTE的组成如图所示:
    在这里插入图片描述
    实际中每个DTE为 8 Bytes
    在这里插入图片描述

② Interrupt Translation Table

  • 由 Interrupt Translation entry(ITE)组成,ITE描述了DeviceID/EventID与pINTID及ICID的对应关系
  • ITE的组成如图所示:

    实际每个ITE为 4 Bytes
    在ITE中,所有ITE都是从EventID=0开始,可以不用配置全部的ITE
    在这里插入图片描述

③Collection Table

  • 由Collection Table entry(CTE)组成,CTE描述了ICID与路由目标之间的关系
  • CTE的组成如下图所示:
    在这里插入图片描述
    每个CTE占据 2 Bytes,在内存中排布如下

在这里插入图片描述

### ARM GIC 中断系统结构 ARM通用中断控制器(Generic Interrupt Controller, GIC)是ARM架构中的重要组成部分[^1]。其主要功能在于管理和分发来自不同源的中断请求至合适的CPU核心,从而实现高效的中断处理机制。 #### Distributor 和 CPU Interface 组成 GIC内部可以划分为两大逻辑单元:Distributor和CPU接口(CPU Interface)[^2]。前者负责接收并优先级排序外部设备发出的中断信号;后者则连接着各个处理器内核,用于传递已选定需响应的具体中断事件给目标CPU。 ### 工作原理 当有新的中断到来时,首先由Distributor对其进行初步筛选与排列顺序,依据预先设定好的规则决定哪些应该被激活并向下游发送通知。对于共享外围组件互联(Shared Peripheral Interrupts, SPI),允许指定特定的一组或多组CPU来共同承担该类别的服务职责,以此达到负载均衡的效果,在多核环境中尤为重要[^3]。 一旦确定好接受者列表后,相应的消息就会通过各自的CPU接口传达出去。值得注意的是,在某些情况下还可以设置独占模式下的私有快速中断(PPI),它们只会触发单个关联的核心而不会影响其他成员。 ### 配置过程概述 在实际应用过程中,为了使能整个GIC框架正常运作,必须经历一系列必要的初始化步骤: - **硬件资源准备**:确保所有涉及的寄存器地址空间已被正确映射,并且能够访问到物理层面的操作权限。 - **IRQ映射创建**:动态地为每一个待使用的HW IRQ编号分配虚拟表示(Virtual IRQ Number),建立起两者间的双向联系表项。这项任务通常是在首次尝试引用某具体位置之前完成的[^4]。 - **参数调整优化**:针对不同的应用场景需求,可能还需要进一步微调诸如优先级别、敏感度阈值之类的属性配置选项,以满足最佳性能表现的要求。 ```c // 示例代码片段展示如何查询当前系统的最大支持SPI数量 #include <linux/of.h> #include <linux/irqdomain.h> static int __init gic_max_spi_init(void){ struct device_node *np; np = of_find_compatible_node(NULL, NULL, "arm,gic"); if (!np) return -ENODEV; printk(KERN_INFO "Max SPI number supported by this system is %d\n", irq_domain_get_irq_count(np)-16); // 减去PPI数目得到纯SPI计数 of_node_put(np); return 0; } module_init(gic_max_spi_init); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值