1、gicv2_spis_configure_defaults

用来配置SPI的一些默认的属性,SPI中断

  • SPI:(shared peripheral interrupt),共享外设中断,该中断来源于外设,但是该中断可以对所有的core有效。

在gic的文档里面有写这样一句话,来说明这个中断。

SPIs are routed from the source through the Distributor to the target Redistributor and the associated CPU
interface

SPIs从源通过分发器路由到目标再分发器和相关的CPU接口,这里有个关键词目标。因此这个目标可以是一个或者多个。

/*******************************************************************************

  • Helper function to configure the default attributes of SPIs.
    ******************************************************************************/
    void gicv2_spis_configure_defaults(uintptr_t gicd_base)
    {
    unsigned int index, num_ints;

    num_ints = gicd_read_typer(gicd_base);

1-通过GICD_TYPER获得最多支持的SPI中断数量

 注:gicd_read_typer(gicd_base);static inline unsigned int gicd_read_typer(uintptr_t base){return mmio_read_32(base + GICD_TYPER);}GICD_TYPER寄存器:提供有关GIC实现支持的功能的信息。它表明:•GIC实施是否支持两种安全状态。•GIC实施支持的最大INTID数。•可用作中断目标的PE数量。num_ints &= TYPER_IT_LINES_NO_MASK;
num_ints = (num_ints + 1U) << 5;注the maximum SPI INTID is 32(N+1)-1. For example, 00011 specifies that the maximum SPI INTID is 127.从该字段派生的值指定GIC实现可能支持的最大SPI数。一个实现可能无法实现达到此最大值的所有SPI。/** Treat all SPIs as G1NS by default. The number of interrupts is* calculated as 32 * (IT_LINES + 1). We do 32 at a time.*/
for (index = MIN_SPI_ID; index < num_ints; index += 32U)gicd_write_igroupr(gicd_base, index, ~0U);

2-通过IGROUPR设置中断的分组,对每次pe生效

     注*访问器,用于写入与中断“id”对应的GIC分发器IGROUPR,一次32个中断id。void gicd_write_igroupr(uintptr_t base, unsigned int id, unsigned int val){unsigned int n = id >> IGROUPR_SHIFT;mmio_write_32(base + GICD_IGROUPR + (n << 2), val);}GICD_IGROUPR **控制相应的中断是在组0还是组1中。**对于SGI和PPI:•当中断的安全状态ARE为1时,该中断的字段为RES0,在这种情况下允许实现RAZ/WI字段。(RAZ/WI:read as zero, write ignored)•GICR_IGROUPR0提供了等效功能。当GICD_CTLR.DS==0时,寄存器为RAZ/WI,用于非安全访问。与未实现中断相对应的位是RAZ/WI。笔记当未为安全状态启用关联路由时,访问GICD_IGROUPR0访问与GICR_IGROUGR0相同的状态,并且必须更新与执行访问的PE关联的Redistributor状态。实现必须确保在写入时挂起的中断使用旧值或新值,并且必须确保中断不会丢失或处理多次。变化的影响必须在有限的时间内可见。配置这些寄存器在所有GIC配置中都可用。如果GIC实现支持两种安全状态,则这些寄存器是安全的。实现的GICD_IGROUPR<n>寄存器的数量为**GICD_TYPER.ITLinesNumber**+1。寄存器从0开始编号。GICD_IGROUPR0为每个连接的PE存储。此寄存器为中断0-31提供组状态位。属性GICD_IGROUPR<n>是一个32位寄存器。


     后面这段比较 重要,解释了为什么这句代码这么写的。如果为中断的安全状态启用了关联路由,则与中断对应的位与GICD_IGRPMODR<n>中的等效位连接,以形成定义中断组的2位字段。GICD_IGRPMODR<n>中描述了该字段的编码。如果针对中断的安全状态禁用了关联路由,则:•对应的GICD_IGRPMODR<n>位为RES0。•对于安全中断,中断为安全组0。•对于非安全中断,中断为非安全组1。对于INTID m,当DIV和MOD是整数除法和模运算时:•对应的GICD_IGROUP<n>编号n由n=m DIV 32给出。•所需GICD_IGROUP的偏移量为(0x080+(4*n))。•此寄存器中所需的组修饰符位的位数为m MOD 32。通常,所有GICD_IGROUPR<n>和GICD_IGRPMODR<n>寄存器的重置值均为0,**因此所有中断均为组0,除非通过对适当寄存器的安全访问将其重新编程为组1。**这里是手动把所有的都写成了1,每个中断对于每个pe,所以需要循环。应该是这个中断,对于所有的PE都是1。中断是循环量。

/* Setup the default SPI priorities doing four at a time */
for (index = MIN_SPI_ID; index < num_ints; index += 4U)
gicd_write_ipriorityr(gicd_base,
index,
GICD_IPRIORITYR_DEF_VAL)

3-通过GICD_IPRIORITYR设置了每个SPI中断的优先级

     注寄存器:GICD_IPRIORITYR保持相应中断的优先级,中断的优先级配置

/* Treat all SPIs as level triggered by default, 16 at a time */
for (index = MIN_SPI_ID; index < num_ints; index += 16U)
gicd_write_icfgr(gicd_base, index, 0U);
}

4-通过GICD_ICFGR确定相应的中断是边缘触发的还是电平触发的。

 注:寄存器 GICD_ICFGR确定相应的中断是边缘触发的还是电平触发的。

ATF:Gicv源码解读系列-gicv2_spis_configure_defaults相关推荐

  1. Alamofire源码解读系列(九)之响应封装(Response)

    本篇主要带来Alamofire中Response的解读 前言 在每篇文章的前言部分,我都会把我认为的本篇最重要的内容提前讲一下.我更想同大家分享这些顶级框架在设计和编码层次究竟有哪些过人的地方?当然, ...

  2. Alamofire源码解读系列(五)之结果封装(Result)

    本篇讲解Result的封装 前言 有时候,我们会根据现实中的事物来对程序中的某个业务关系进行抽象,这句话很难理解.在Alamofire中,使用Response来描述请求后的结果.我们都知道Alamof ...

  3. py-faster-rcnn源码解读系列

    转载自: py-faster-rcnn源码解读系列(一)--train_faster_rcnn_alt_opt.py - sunyiyou9的博客 - 博客频道 - CSDN.NET http://b ...

  4. Hadoop源码解读系列目录

    Hadoop源码解读系列 1.hadoop源码|common模块-configuration详解 2.hadoop源码|core模块-序列化与压缩详解 3.hadoop源码|core模块-远程调用与N ...

  5. Alamofire源码解读系列(十二)之请求(Request)

    本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...

  6. Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)

    Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager) 本篇主要讲解iOS开发中的网络监控 前言 在开发中,有时候我们需要获取这些信息: 手机是否联网 ...

  7. spring源码解读系列(八):观察者模式--spring监听器详解

    一.前言 在前面的文章spring源码解读系列(七)中,我们继续剖析了spring的核心refresh()方法中的registerBeanPostProcessors(beanFactory)(完成B ...

  8. 【注意力机制集锦】Channel Attention通道注意力网络结构、源码解读系列一

    Channel Attention网络结构.源码解读系列一 SE-Net.SK-Net与CBAM 1 SENet 原文链接:SENet原文 源码链接:SENet源码 Squeeze-and-Excit ...

  9. Alamofire源码解读系列(十一)之多表单(MultipartFormData)

    本篇讲解跟上传数据相关的多表单 前言 我相信应该有不少的开发者不明白多表单是怎么一回事,然而事实上,多表单确实很简单.试想一下,如果有多个不同类型的文件(png/txt/mp3/pdf等等)需要上传给 ...

最新文章

  1. 机器学习中涉及的概率论知识回顾(一)
  2. LeetCode之Power of Two
  3. Nat Mach Intell | 江瑞课题组提出首个针对单细胞染色质开放性数据的细胞类型辨识神经网络模型EpiAnno...
  4. java println源码_System.out.println()相关源码
  5. 普通人如何站在时代风口学好AI?这是我看过最好的答案
  6. 使用了visual assist.net
  7. Java项目Lombok
  8. C# Linq以及反射总结
  9. windows server 2008远程桌面轻松搞定
  10. html5的file api,HTML5 File API
  11. python 弹窗选择文件并获取文件路径
  12. 串口数据visual c++ MSComm 串口控件程序开发
  13. Java餐饮酒店管理系统PC端,使用SpringBoot、Layer,Beetl
  14. 百万比亚迪仰望出圈靠的不止技术
  15. zabbix_get [71696]: Check access restrictions in Zabbix agent configuration
  16. 【算法题解】Codeforces Round #817 (Div. 4)题解
  17. 做一个互联网+时代的新农民
  18. 关于nginx连接被重置引发的网络协议工作解析
  19. MUM System
  20. 尚硅谷java练习题to循环

热门文章

  1. 解决Win10系统过期失效问题的经验总结
  2. 【Python】Pyside6简易版教程
  3. Win10系统无法访问局域网共享文件夹的问题解
  4. 制作古装人物彩色工笔画图片的PS教程
  5. 发明者电子实用宝典_人类发明电话后的第一次通话,竟然是来自发明者的求救声?...
  6. Orserg WSPT WEB 安全项目组A-3项目训练文档
  7. 数组转这种格式 county_list:{ 110101: “东城区“, 110102: “西城区“, 110105: “朝阳区“, 110106: “丰台区“,
  8. UVM基础-Sequence、Sequencer(二)
  9. [产品分析] Palm Pre,iPhone,Gphone全面大比拼
  10. 辞职信:写给我的“藤野先生”