linux kernel的中断子系统之(七):GIC代码分析

作者:linuxer 发布于:2014-9-4 16:59 分类:中断子系统


GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1~V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结构)。目前在ARM官方网站只能下载到Version 2的GIC architecture specification,因此,本文主要描述符合V2规范的GIC硬件及其驱动。

具体GIC硬件的实现形态有两种,一种是在ARM vensor研发自己的SOC的时候,会向ARM公司购买GIC的IP,这些IP包括的型号有:PL390,GIC-400,GIC-500。其中 GIC-500最多支持128个 cpu core,它要求ARM core必须是ARMV8指令集的(例如Cortex-A57),符合GIC architecture specification version 3。另外一种形态是ARM vensor直接购买ARM公司的Cortex A9或者A15的IP,Cortex A9或者A15中会包括了GIC的实现,当然,这些实现也是符合GIC V2的规格。

本文在进行硬件描述的时候主要是以GIC-400为目标,当然,也会顺便提及一些Cortex A9或者A15上的GIC实现。

本 文主要分析了linux kernel中GIC中断控制器的驱动代码(位于drivers/irqchip/irq-gic.c和irq-gic-common.c)。 irq-gic-common.c中是GIC V2和V3的通用代码,而irq-gic.c是V2 specific的代码,irq-gic-v3.c是V3 specific的代码,不在本文的描述范围。本文主要分成三个部分:第二章描述了GIC V2的硬件;第三章描述了GIC V2的初始化过程;第四章描述了底层的硬件call back函数。

注:具体的linux kernel的版本是linux-3.17-rc3。



阅读全文>>

标签: GIC 代码分析

评论(111) 浏览(122048)

linux kernel的中断子系统之(四):High level irq event handler

作者:linuxer 发布于:2014-8-28 20:00 分类:中断子系统

当外设触发一次中断后,一个大概的处理过程是:

1、具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler

2、machine driver对应的中断处理handler中会根据硬件的信息获取HW interrupt ID,并且通过irq domain模块翻译成IRQ number

3、 调用该IRQ number对应的high level irq event handler,在这个high level的handler中,会通过和interupt controller交互,进行中断处理的flow control(处理中断的嵌套、抢占等),当然最终会遍历该中断描述符的IRQ action list,调用外设的specific handler来处理该中断

4、具体CPU architecture相关的模块会进行现场恢复。

上面的1、4这两个步骤在linux kernel的中断子系统之(六):ARM中断处理过程中已经有了较为细致的描述,步骤2在linux kernel的中断子系统之(二):irq domain介绍中介绍,本文主要描述步骤3,也就是linux中断子系统的high level irq event handler。

阅读全文>>

标签: 中断处理

评论(51) 浏览(60583)

linux kernel的中断子系统之(三):IRQ number和中断描述符

作者:linuxer 发布于:2014-8-26 17:03 分类:中断子系统

本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程。第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述符等。第三章描述中断描述符数据结构的各个成员。第四章描述了初始化中断描述符相关的接口API。第五章描述中断描述符相关 的接口API。

阅读全文>>

标签: irq 中断子系统 中断描述符

评论(79) 浏览(104100)

Linux电源管理(6)_Generic PM之Suspend功能

作者:wowo 发布于:2014-8-22 21:40 分类:电源管理子系统

Linux内核提供了三种Suspend: Freeze、Standby和STR(Suspend to RAM),在用户空间向”/sys/power/state”文件分别写入”freeze”、”standby”和”mem”,即可触发它们。

内核中,Suspend及Resume过程涉及到PM Core、Device PM、各个设备的驱动、Platform dependent PM、CPU control等多个模块,涉及了console switch、process freeze、CPU hotplug、wakeup处理等过个知识点。就让我们跟着内核代码,一一见识它们吧。

阅读全文>>

标签: Linux 内核 suspend 电源管理 resume

评论(120) 浏览(127560)

Linux kernel的中断子系统之(二):IRQ Domain介绍

作者:linuxer 发布于:2014-8-19 18:46 分类:中断子系统

在linux kernel中,我们使用下面两个ID来标识一个来自外设的中断:

1、IRQ number。CPU需要为每一个外设中断编号,我们称之IRQ Number。这个IRQ number是一个虚拟的interrupt ID,和硬件无关,仅仅是被CPU用来标识一个外设中断。

2、 HW interrupt ID。对于interrupt controller而言,它收集了多个外设的interrupt request line并向上传递,因此,interrupt controller需要对外设中断进行编码。Interrupt controller用HW interrupt ID来标识外设的中断。在interrupt controller级联的情况下,仅仅用HW interrupt ID已经不能唯一标识一个外设中断,还需要知道该HW interrupt ID所属的interrupt controller(HW interrupt ID在不同的Interrupt controller上是会重复编码的)。

这样,CPU和interrupt controller在标识中断上就有了一些不同的概念,但是,对于驱动工程师而言,我们和CPU视角是一样的,我们只希望得到一个IRQ number,而不关系具体是那个interrupt controller上的那个HW interrupt ID。这样一个好处是在中断相关的硬件发生变化的时候,驱动软件不需要修改。因此,linux kernel中的中断子系统需要提供一个将HW interrupt ID映射到IRQ number上来的机制,这就是本文主要的内容。

阅读全文>>

标签: irq_domain

评论(80) 浏览(134086)

DMB DSB ISB以及SMP CPU 乱序

作者:forion 发布于:2014-8-15 16:57

不知道大家对DMB DSB ISB以及SMP CPU 乱序,有没有认识。我想在这个讨论贴上面来跟大家讨论一下。

标签: SMP 内存屏障 DSB DMB ISB

评论(11) 浏览(30372)

Linux kernel的中断子系统之(一):综述

作者:linuxer 发布于:2014-8-14 19:12 分类:中断子系统

一个合格的linux驱动工程师需要对kernel中的中断子系统有深刻的理解,只有这样,在写具体driver的时候才能:

1、正确的使用linux kernel提供的的API,例如最著名的request_threaded_irq(request_irq)接口

2、正确使用同步机制保护驱动代码中的临界区

3、正确的使用kernel提供的softirq、tasklet、workqueue等机制来完成具体的中断处理

基于上面的原因,我希望能够通过一系列的文档来描述清楚linux kernel中的中断子系统方方面面的知识。一方面是整理自己的思绪,另外一方面,希望能够对其他的驱动工程师(或者想从事linux驱动工作的工程师)有所帮助。


阅读全文>>

标签: 软件框架 中断子系统

评论(84) 浏览(100954)

开源的RF硬件平台

作者:linuxer 发布于:2014-8-13 9:13

http://greatscottgadgets.com/hackrf/

http://www.hackrf.net/


评论(13) 浏览(18055)

启动regulator framework分析任务

作者:linuxer 发布于:2014-8-12 19:36

电源管理也是很有意思的内核模块,原来蜗窝同学写了一些文章,我准备狗尾续貂,启动regulator framework分析任务

评论(4) 浏览(10226)

建立讨论区的原因

作者:linuxer 发布于:2014-8-10 23:26

这个网站的名字叫做“蜗窝科技”,所谓蜗窝,就是蜗牛之家的意思,为那些愿意慢下来细细品味linux kernel中各种技术的“蜗牛”提供一个可以交流的平台。不过建站半年来,似乎广大人民群众参与度不够,使得这个网站看起来更像一个个人的博客。一个人的能力是有限的,写文章需要时间,在工作比较忙碌的时候,其实很难保持不断的更新。

基于上面的想法,一个叫做讨论区的板块被创建了。发表在其他的板块的文章都会是一个成体系的文章,描述技术的某个方面。但是,发表在这个板块的文章没有这个限制,一句感悟、一句抱怨、一点建议、技术问题、一些天马行空的想法等等都可以随意在这里交流,没有任何的限制,而且,这里的文章不会出现在主页,大家不必有心理压力,尽情的灌水、吐槽吧~~~~

评论(1) 浏览(8144)

Copyright @ 2013-2015 蜗窝科技 All rights reserved. Powered by emlog