1. ITS操作

一个外设通过写ITS中的GITS_TRANSLATER来产生LPI。写操作提供给ITS如下信息:

(1)EventID

该值会写往GITS_TRANSLATER。EventID标识外设发送的是哪个中断。EventID可能与INTID一样,或通过ITS将INTID转换为EventID。

(2)DeviceID

DeviceID标识外设。DeviceID的产生由实现定义的。

ITS转换EventID,该EventID被通过外设写到GITS_TRANSLATER。如何将EventID转化为INTID对每个设备是特殊的,这也是为什么要求DeviceID。

ITS使用三种类型的表来处理事务和LPI的路由。这些表如下:

(1)Device Tables

用来将DeviceID映射到时中断转换表ITT。

(2)Interrupt Translation Tables

它包含DeviceID相关的从EventID到INTID之间的映射。它也包含Collection,其中INTID为Collection的成员。

(3)Collection Tables

用来将Collection映射到Redistributor。

当外设写GITS_TRANSLATER,ITS:

  1. 用DeviceID来选择Device Table中合适的条目。这个条目标识使用的是哪个中断转换表ITT;
  2. 使用EventID从ITT中选择合适的条目。这个条目提供INTID和Collection ID;
  3. 使用Collection ID选择Collection Table中合适的条目,Collection Table返回路由信息;
  4. 将中断传递给目标Redistributor。

NOTE: ITS可以选择性的支持部分硬件Collection。硬件Collection为ITS在内部保持配置,而不是将其存储在内存中。GITS_TYPER.HCC表示支持的硬件Collection数目。

2. 命令队列

通过使用内存中的命令队列来控制ITS。命令队列是环形buffer并由三个寄存定义:

(1)GITS_CBASER

该寄存器表明命令队列的基地址和大小。命令队列必须64KB对齐,大小必须是4KB的整数倍。命令队列中的每项为32byte。GITS_CBASER指明了在ITS访问命令队列时CACHE和共享能力。

(2)GITS_CREADR

该寄存器指向ITS下一个将要处理的命令。

(3)GITS_CWRITER

该寄存器指向在队列中下一个将要写的新的命令。

下图显示一个命令队列的简要表示:

3. ITS的初始配置

为了在系统启动时配置ITS,软件需要:

(1)为Device Table和Collection Table分配内存

GITS_BASER[0..7]寄存器表明ITS中Device Table和Collection Table的基地址和大小。软件使用寄存器发现ITS支持的表数目和类型。软件必须分配要求的内存,并设置GITS_BASERn寄存器指向分配的内存。

(2)为命令队列分配内存

软件必须为命令队列分配内存,并设置GITS_CBASER和GITS_CWRITER指向分配内存的开始。

(3)使能ITS

当上述表和命令队列已分配时,可以使能ITS,设置GITS_CTLR.Enable位为1。

一旦GITS_CTLR.Enable被设置,GITS_BASERn和GITS_CBASER寄存变为只读。

4. Collection和Device Table的size和layout

Collection和Device Table的位置和大小通过GITS_BASERn寄存器配置。软件须分配为这些表分配足够的内存,并在使能ITS之前配置GITS_BASERn寄存器。

软件可以分配一级表,或两级表。这由GITS_BASERn.Indirect。

NOTE: 对两级表的支持是可选的。若ITS只支持一级表,GITS_BASERn.Indirect为RAZ/WI。

(1)一级表

对于一级表,需要为ITS分配一块连续的内存来记录映射。要求软件在使能ITS之前填充内存。之后ITS从命令队列处理命令,由ITS populate表。

表格的规模由DeviceID和CollectionID的宽度决定。可以通过如下计算出来:

Size = 2~ID_width * entry_size

其中entry_size是每个表项的bytes数,由GITS_BASERn.Entry_size。

当配置GITS_BASERn寄存器,表的大小是一些页。每个页的size由GITS_BASERn.Page_Size,可以为4KB,16KB或64KB。因此,公式结果必须向上舍入整个页。

比如,若系统实现了8bit DeviceID,每个表项的bytes为8,4K页:

2~8 *8 = 2048bytes -> 4K

(2)二级表

对于二级表,软件分配一个一级表,数个二级表。

软件来找到一级表,一级表中的每个项要么指向二级表或标识为无效。在二级表分配给ITS之前必须以0来填充。

当ITS被使能(GITS_CTLR.Enabled = 1),软件分配更多的二级表,并更新将一级表指向二级表。在ITS使能时,软件不能移除分配,或改变已存在的分配。

每个二级表的大小为一个页。由于二级表为flat表,由GITS_BASERn.Page_Size配置。因此它包含(PAGE_SIZE/ENTRY_SIZE)个项。

每个一级表项代表(PAGE_SIZE/ENTRY_SIZE)ID,可以指向二级表或标识为无效。任何指向无效项的ITS命令都会被丢弃。

一级表要求的大小可计算:

SIZE = 2~ID_width / (PAGE_SIZE/ENTRY_SIZE) *8

对于单级表,一级表的大小为页的整数倍。因此公式的结果必须向上舍入到页大小。

GICv3软件overview手册之LPI(1)相关推荐

  1. GICv3软件overview手册之介绍

    本文档提供了GICv3特性的软件overview,并且描述GICV3中断控制器的操作.它也只是如何在裸机环境下配置GICV3中断控制器的简介. 本文档是ARM通用中断控制器架构手册V3.0和V4.0的 ...

  2. GICv3软件overview手册之GICv4对虚拟LPI的直接注入(2)

    1. vPE和vINTID的映射 EventID-DeviceID的合并被映射到vPE和vINTID.当EventID和DeviceID相同时使用VMAPI命令: VMAPI <DeviceID ...

  3. GICv3软件overview手册之GICv4对虚拟LPI的直接注入(1)

    GICv4增加对虚拟LPI(vLPI)中断的直接注入.该特性允许软件对ITS如何将物理event(EventID和DeviceID的合并)映射到虚拟中断.若中断的目标vPE正在运行,虚拟中断可以直接发 ...

  4. GICv3软件overview手册之GICv3基本功能(4)

    GICv3架构支持ARM trustZone技术.每个INTID都赋予给一个group和安全设置.GICv3支持三种合并,如表中所示: 中断类型 使用例子 Secure Group 0 EL3的中断( ...

  5. GICv3软件overview手册之GICv3基本功能(1)

    本章描述与GICV3架构兼容的中断控制的基本操作.它也会描述不同的编程接口. 1. 中断类型 GICV3定义了如下中断类型: (1)SPI共享外设中断 这是一种全局外设中断,可路由到某个PE,或一组P ...

  6. GICv3软件overview手册之GICv3基本功能(5)

    GICv3中断控制器的寄存器接口分为三组: (1)Distributor接口: (2)edistributor接口: (3)CPU接口: Distributor(GICD_*) Distributor ...

  7. GICv3软件overview手册之GICv3基本功能(2)

    中断控制器对每个SPI/PPI/SGI中断源维护了一个状态机.状态机包含以下四种状态: (1)Inactive:中断源当前没有触发: (2)Pending:中断源被触发,但还未被PE应答: (3)Ac ...

  8. GICv3软件overview手册之GICv3基本功能(3)

    GICv3使用亲和路由来区分连接的PE,让中断路由到某个PE或某一组PE.PE的亲和性由4个8bit域表示. <affinity level3>.<affinity level2&g ...

  9. GICv3软件overview手册之虚拟化

    ARMv8-A 可选择支持虚拟化.GICv3也支持虚拟化.GICv3对虚拟化的支持包括: (1)CPU接口寄存器的硬件虚拟化: (2)虚拟化中断: (3)维护中断: NOTE: GIC架构不提供虚拟化 ...

最新文章

  1. c语言进位程序,c语言中如何做带进位位移
  2. IntelliJ IDEA 2018.1新特性
  3. BSTR 、LPCTSTR、CString附C语言串基本操作
  4. VanDyke.SecureCRT.v7.0.0.326官方英文版x86 x64 + Keymaker-ZWT
  5. 约瑟夫环之循环链表实现
  6. 快为网易云官网出谋划策,5步轻松获得网易味央猪肉!
  7. 【收集】ADOADO.NET 读取 Oracle 数据集
  8. php$this-conn可以不先定义吗,CodeIgniter 是不是支持PDO 查询?还是本来就不支持
  9. Magento数据库结构:EAV
  10. 关于类型的存储时间和链接
  11. 软件测试人员【必备】的九种工具
  12. vue.js的生命周期
  13. PAIP.MYSQL SLEEP 连接太多解决
  14. linux的4k播放器,【Linux1GB4K(3840*2160)电视播放器】Linux1GB4K(3840*2160)电视播放器报价及图片大全-列表版-ZOL中关村在线...
  15. 抄书——最优化的理论与方法(5)——数学基础(凸集和凸函数)
  16. 用Mysql得到Webshell(MySql Backup WebShell)
  17. E4A易安卓Apost提交文本合并编码相关
  18. dilated conv带孔卷积、pooling层提高感受野 反卷积 的理解
  19. arduino入门-用arduino uno制作基于蓝牙的数据监控系统
  20. Python web开发框架—— Pyramid学习(一)

热门文章

  1. 张尧学获奖申报材料,读后有感
  2. 水处理设计 工艺设计 水处理计算公式 污水处理厂设计整理了AAO AO SBR UASB 氧化沟工艺计算公式
  3. 用计算机接入gps秒脉冲信号实现精确时间对准的方法,基于GPS秒脉冲的高精度校时实现方法与流程...
  4. 三菱SFC程序编程心得
  5. NBIOT 移动M5310A模块 AT+MIPLCREATE注册码自动生成
  6. fileformat set
  7. OpenWrt共享打印机关键问题
  8. 软件绿化之注册表右键菜单二
  9. decode函数吗 jsp_SQL优化 ----- 使用 DECODE 函数来减少处理时间
  10. 公岸网:公共基础知识必背内容