构建一个atf必须读点gic的原生文档

简介: 构建一个atf必须读点gic的原生文档

1、更新

1-更新的GIC支持:

- Introduce new APIs for GICv2 and GICv3 that provide the capability to
    specify interrupt properties rather than list of interrupt numbers alone.
    The Arm platforms and other upstream platforms are migrated to use interrupt
    properties.
  • 为GICv2和GICv3引入新的API,提供指定中断特性的功能,而不仅仅是中断编号列表。
    移植Arm平台和其他上游平台以使用中断特性。
  • 添加了帮助程序以保存/恢复GICv3上下文,特别是分发器和再分发器上下文以及ITS电源管理的体系结构部分。分发器和再分发器助手还支持GIC-500和GIC-600的实现定义部分。
  • 更新了Arm FVP平台,以在系统挂起/恢复时保存/恢复GICv3上下文,作为如何使用助手的示例。
  • 引入了一种新的TZC安全DDR划分,供Arm平台用于存储EL3运行时数据,如GICv3寄存器上下文。

2-更新的GICv3支持:

  • 更新的GICv3支持:
  • 使用GICv3启用处理器断电和自动通电。
  • 已启用独立配置G1S或G0中断。
  • 将FVP默认中断驱动程序更改为仅GICv3驱动程序。TF-A的默认构建将无法使用GICv2 FDT blob启动Linux内核。
  • 通过临时重新路由中断并在恢复后恢复,启用从CPU_SUSPEND到待机的唤醒。

-为GICv3和GICv2提供了单独的驱动程序。它们期望整个软件堆栈使用GICv2或GICv3;混合GIC软件系统不再受支持,传统的Arm GIC驱动程序已被弃用。

-增加了对以secure-EL1有效负载(SP)为目标的安全中断的支持(仅使用GICv2路由)。通过向TSP添加中断目标和支持测试代码,证明了这一点。还演示了TSP处理期间的非安全中断处理。

2、配置安全中断

GIC驱动程序负责在平台上执行安全中断的初始配置。为此,期望平台在驱动程序初始化期间向GIC驱动程序(由平台选择的GICv2或GICv3)提供中断配置

安全中断配置在安全中断特性数组中指定。在这个方案中,在GICv2和GICv3驱动程序数据结构中,interrupt_props成员指向一个中断特性数组。数组的每个元素指定中断号及其属性(优先级、组、配置)。数组的每个元素都应由宏INTR_PROP_DESC()填充。宏采用以下参数:

  • -10位中断号,
  • -8位中断优先级,
- Interrupt type (one of ``INTR_TYPE_EL3``, ``INTR_TYPE_S_EL1``,
  ``INTR_TYPE_NS``),
- Interrupt configuration (either ``GIC_INTR_CFG_LEVEL`` or
  ``GIC_INTR_CFG_EDGE``).

3、中断管理框架(在BL31中)

BL31实施中断管理框架(IMF),以管理在安全状态下生成的中断。该框架的设计在:ref:中断管理框架

平台应导出以下API以支持IMF。以下文本简要描述了每个API及其在Arm标准平台中的实现。API实现取决于平台中存在的中断控制器的类型。ARM标准平台层支持

Arm通用中断控制器版本2.0(GICv2)and3.0(GICv3)。Juno构建Arm平台层以使用GICv2,FVP可以配置为使用GICv2或GICv3,具体取决于构建标志FVP_use_GIC_DRIVER(有关详细信息,请参阅:ref:build_options_Arm_FVP_platform)。

另请参阅::ref:中断控制器抽象API<平台中断控制器API>

1-Function : plat_interrupt_type_to_line() [mandatory]

Arm处理器通过IRQ或FIQ中断线发出中断异常信号。

发出信号的特定行取决于中断控制器(IC)在任一安全状态下如何报告来自执行上下文的不同中断类型。

IMF使用此API来确定平台IC使用哪个中断线来从给定的安全状态向框架支持的每种类型的中断发出信号。必须在EL3处调用此API。

  • 第一个参数将是指示中断目标类型的“INTR_TYPE_*”值之一(参见:ref:‘Interrupt Management Framework’),
  • 第二个参数是发起执行上下文的安全状态。

返回结果是相应中断陷阱的“SCR_EL3”寄存器中的位位置:IRQ=1,FIQ=2。

在使用GICv2的Arm标准平台的情况下,S-EL1中断配置为FIQ,非安全中断配置为任一安全状态的IRQ。

在使用GICv3的Arm标准平台的情况下,要配置的中断线取决于发出中断信号时执行上下文的安全状态,如下所示:

  • -S-EL1中断在S-EL0/1上下文中作为IRQ发出信号,在NS-EL0/1/2上下文中作为FIQ发出信号。
  • -非安全中断在S-EL0/1上下文中作为FIQ发出信号,在NS-EL0/1/2上下文中作为IRQ发出信号。
  • -EL3中断在S-EL0/1和NS-EL0/1/2上下文中都以FIQ的形式发出信号。

2-Function : plat_ic_get_pending_interrupt_type() [mandatory]

此API返回平台IC上最高优先级未决中断的类型

IMF使用中断类型检索相应的处理程序函数当没有中断挂起时,返回INTR_TYPE_INVAL。可以返回的有效中断类型为INTR_TYPE_EL3、INTR_TYPE_S_EL1和INTR_YPE_NS。必须在EL3处调用此API。

在使用GICv2的Arm标准平台的情况下,读取最高优先级未决中断寄存器GICC_HPPIR)以确定未决中断的id。中断类型取决于id值,如下。

  • #. id<1022被报告为S-EL1中断
  • #. id=1022被报告为非安全中断。
  • #. id=1023被报告为无效中断类型。

在使用GICv3的Arm标准平台的情况下,读取系统寄存器“ICC_HPPIR0_EL1”,最高优先级挂起组0中断寄存器,以确定挂起中断的id。中断类型取决于id值,如下所示。

  • #. id=PENDING_G1S_INITID(1020)被报告为S-EL1中断
  • #. id=PENDING_G1NS_INTID(1021)被报告为非安全中断。
  • #. id=GIC_SPURIOUS_INTERRUPT(1023)被报告为无效中断类型。
  • #. 所有其他中断id都报告为EL3中断。

3-Function : plat_ic_get_pending_interrupt_id() [mandatory]

**此API返回平台IC上最高优先级未决中断的id

**当没有中断挂起时,返回INTR_ID_UNAVAILABLE

在使用GICv2的Arm标准平台的情况下,读取最高优先级未决中断寄存器GICC_HPPIR)以确定未决中断的id。API返回的id取决于从中断控制器读取的id值,如下所示。

#. id<1022。id按原样返回。

#. id=1022。读取别名最高优先级挂起中断寄存器GICC_AHPPIR)以确定非安全中断的id。此id由API返回。

#. id=1023返回INTR_ID_UNAVAILABLE

在使用GICv3的Arm标准平台的情况下,如果从EL3调用API,则读取系统寄存器“ICC_HPPIR0_EL1”,最高优先级挂起中断组0寄存器,以确定挂起中断的id。API返回的id取决于从中断控制器读取的id值,如下所示。

#. id<PENDING_G1S_INITID(1020)。id按原样返回。

#. id=PENDING_G1S_INTID(1020)或PENTING_G1NS_INTID(1021)。读取系统寄存器“ICC_HPPIR1_EL1”,最高优先级未决中断组1寄存器,以确定组1中断的id。只要该id是有效的中断id,API就会返回该id

#. 如果id是任何特殊中断标识符,则返回INTR_id_UNAVAILABLE

当从S-EL1为GICv3系统调用API时,如果不等于IC_SPURIOUS_Interrupt(1023),则返回从系统寄存器“ICC_HPPIR1_EL1”,最高优先级挂起组1中断寄存器读取的id,否则返回“INTR_id_UNAVAILABLE”。

4-Function : plat_ic_acknowledge_interrupt() [mandatory]

CPU使用该API向平台IC指示最高未决中断的处理已经开始

当确认中断时,它应该返回从中断控制器获得的未修改的原始值。

应使用API“plat_ic_get_interrupt_id()<plat_ic_get _interrupt _id>”从该原始值中提取实际中断号。

在使用GICv2的Arm标准平台中,此函数读取中断确认寄存器GICC_IAR)。这将中断控制器中最高优先级未决中断的状态从未决更改为活动。

它返回从“GICC_IAR”读取的值,未修改。

在使用GICv3的Arm标准平台的情况下,如果从EL3调用API,该函数将读取系统寄存器ICC_IAR0_EL1中断确认寄存器组0。如果从S-EL1调用API,则该函数读取系统寄存器ICC_IAR1_EL1中断确认寄存器组1。读取将中断控制器中最高挂起中断的状态从挂起更改为活动。读取的值未经修改返回。

TSP使用此API开始处理安全物理计时器中断。

5-Function : plat_ic_end_of_interrupt() [mandatory]

CPU使用该API向平台IC指示对应于id(作为参数传递)的中断的处理已经完成。

id应与plat_ic_acknowledge_crupt()API返回的id相同。

如果是GICv2,Arm标准平台将id写入中断结束寄存器GICC_EOIR);如果是GIC v3,则根据从EL3或S-EL1调用API的位置,将id写入ICC_EOIR0_EL1ICC_EOER1_EL1系统寄存器。这将停用中断控制器中的相应中断。

TSP使用此API完成安全物理计时器中断的处理。

6-Function : plat_ic_get_interrupt_type() [mandatory]

此API返回作为参数传递的中断id的类型

如果id无效,则返回INTR_TYPE_INVAL。如果id有效,则根据平台IC如何配置中断,返回有效的中断类型(“INTR_type_EL3”、“INTR_YPE_S_EL1”和“INTR_type NS”之一)。必须在EL3处调用此API。

使用GICv2的Arm标准平台将S-EL1中断配置为Group0中断,将非安全中断配置为Group 1中断。它从相关的中断组寄存器GICD_IGROUPRn)中读取与中断id对应的组值。它使用组值来确定中断类型。

在使用GICv3的Arm标准平台的情况下,读取中断组寄存器GICD_IGROUPRn)和中断组修改寄存器 GICD-IGRPMODRn ),以确定中断是配置为组0安全中断、组1安全中断还是组1 NS中断。

4、GICV2_G0_FOR_EL3

-GICV2_G0_FOR_EL3与GICv3不同,GICV2体系结构不支持特定的EL3类型中断。将此构建选项设置为“1”假设GICv2组0中断预期以EL3为目标,通过:ref:platform abstraction layer<platform Interrupt Controller API>和:ref:中断管理框架<中断管理框架>

这允许GICv2平台启用需要EL3中断类型的功能。

这也意味着所有GICv2组0中断都被传送到EL3,安全有效负载中断需要同步地移交给安全EL1进行处理。

此选项的默认值为“0”,这意味着组0中断假定由安全EL1处理。

5、GICv3驱动程序选项

GICv3驱动程序选项

GICv3驱动程序文件包含在指令中:

包括drivers/arm/ggic/v3/gicv3.mk

可以使用平台makefile中设置的以下选项配置驱动程序:

-GICV3_SUPPORT_GIC600:添加对GICV3的GIC-600变体的支持。

启用此选项将为GIC-600添加运行时检测支持,因此即使是GIC500实现也可以安全选择。此选项默认为0。

-GICV3_SUPPORT_GIC600AE_FMU:添加对GIC-600 AE故障管理单元的支持。启用此选项将引入对FMU初始化的支持。平台应在引导期间调用init函数以启用FMU及其安全机制。此选项默认为0。

-GICV3_IMPL_GIC600_MULTICHIP:选择具有多芯片功能的GIC-600变体。此选项默认为0

-GICV3_OVERRIDE_DISTIF_PWR_OPS:允许覆盖arm_GICV3_DISTIF_pre_savearm_GICV3_DISTIF_post_restore 函数的默认实现。这对于FVP平台是必需的,它需要在SYSTEM_SUSPEND期间模拟GIC保存和恢复,而不关闭GIC。默认值为0。

-GIC_ENABLE_V4_EXTN:启用GICv3驱动程序中与GICv4相关的更改。此选项默认为0。

-GIC_EXT_INTID:当设置为``1’`时,GICv3驱动程序将支持扩展的PPI(1056-1119)和SPI(4096-5119)范围。此选项默认为0。

目录
相关文章
|
1月前
|
前端开发 JavaScript API
构建一个自定义的图表库
构建一个自定义的图表库
|
1月前
|
XML JSON 缓存
原生AXAJ
本文介绍了原生AJAX的特性,其主要优点是能无刷新获取数据,但也存在跨域问题。接着讲解了Express框架的基本使用,包括创建应用、定义路由和启动服务。然后展示了如何通过AJAX从服务器获取并显示JSON数据,处理了IE的缓存问题和网络延时,以及如何处理重复请求。最后提到了通过设置超时和错误处理来改善用户体验。
27 1
|
1月前
|
移动开发 JavaScript Android开发
H5封装和原生开发这两种不同的应用开发方式有什么区别?
原生开发是指为特定操作系统(如iOS或Android)开发应用程序。整个应用程序代码,逻辑和界面都是按照该系统提供的规范来开发,因此其性能和体验感会很好,可以与设备充分融洽,提供流畅的用户体验。原生开发App充分的利用了操作系统的功能,给设备上的应用程序提供了高性能和良好的用户体验。原生应用程序拥有很好的设备兼容性,可以直接访问设备的硬件功能等,如相机,蓝牙等。
19 1
|
1月前
|
开发框架 Dart API
Flutter引擎工作原理:深入解析FlutterEngine
【4月更文挑战第26天】FlutterEngine是Flutter应用的关键,负责Dart代码转换为原生代码,管理应用生命周期、渲染和事件处理。它初始化Flutter运行时环境,加载并编译Dart代码,创建渲染树,处理事件并实现跨平台兼容。通过理解其工作原理,开发者能更好地掌握Flutter应用内部机制并优化开发。随着Flutter生态系统发展,FlutterEngine将持续提供强大支持。
|
8月前
|
XML JavaScript 前端开发
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示试读版
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示试读版
|
11月前
|
开发框架 JavaScript 小程序
扩展应用功能的无限可能——UniApp生态系统中的组件库与插件探索
扩展应用功能的无限可能——UniApp生态系统中的组件库与插件探索
|
9月前
|
移动开发 小程序 开发工具
Donut 多端框架是支持使用小程序原生语法开发移动应用的框架
Donut 多端框架是支持使用小程序原生语法开发移动应用的框架,开发者可以一次编码,分别编译为小程序和 Android 以及 iOS 应用,实现多端开发
334 0
Donut 多端框架是支持使用小程序原生语法开发移动应用的框架
|
11月前
|
开发框架 前端开发 JavaScript
扩展应用功能的无限可能——UniApp生态系统中的组件库探索(二)(上)
扩展应用功能的无限可能——UniApp生态系统中的组件库探索(二)
|
11月前
|
开发框架 JavaScript API
扩展应用功能的无限可能——UniApp生态系统中的组件库探索(二)(下)
扩展应用功能的无限可能——UniApp生态系统中的组件库探索(二)
|
自然语言处理 索引