欢迎来到天天文库
浏览记录
ID:33950612
大小:252.54 KB
页数:23页
时间:2019-03-02
《基于MIPS的Linux内核PCI子系统分析系列--PCI 资源(io、mem)配置.pdf》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、基于MIPS的Linux内核PCI子系统分析基于MIPS的Linux内核PCI子系统分析系列—PCI资源(io、mem)配置CurrentVersion:V0.1Date:2011-10-31Author:leewg1基于MIPS的Linux内核PCI子系统分析版本作者参与者时间备注0.1LiWengang2011-10-31初始化版本备注:内核源代码版本:2.6.36代码流程的分支:基于MIPS下的loongson分支说明:文档参考了网上的诸多关于linuxPCI的文章,整理而成。存在问
2、题请大家即使指出,共同探讨进步。2基于MIPS的Linux内核PCI子系统分析一、基础知识解析1、PCI地址空间后面的文章均会以下面的图6.1为例来进行说明。CPU与PCI设备需要存取在它们之间共享的内存。设备驱动程序使用这片内存来控制PCI设备并用来传送信息。一般而言,这些共享内存中包含设备的控制和状态寄存器。这些寄存器用来控制设备和读取设备的状态。例如,PCISCSI设备驱动程序读取SCSI设备的状态寄存器以探测该设备是否已就绪可以将一个数据块写入SCSI磁盘。又例如,设备驱动程序可以在控制寄存器中写入控制数据从而使设备开始运转在设备
3、电源被开启之后。上述的共享内存可以是CPU的系统内存。但如果这样的话,每次PCI设备存取内存时,CPU将被阻塞,等待PCI设备存取的结束。一般而言,在某个特定时刻,只能一个系统部件存取一个特定的内存。所以,上述方法会使系统性能降低。另外,允许系统的外设不在一个良好的控制下存取主内存不是一个好的方法。这将会是非常危险的事情。一个“淘气”的设备可以使得系统非常不稳定。因此,外设一般拥有它们自己的内存空间。CPU可以存取这个空间。但是反之外设存取系统内存必须在DMA(DirectMemoryAccess)的控制之下。ISA设备可以存取两种地址空
4、间,ISAI/O(Input/Output)和ISAmemory。PCI可以有三种:PCII/O,PCImemory和PCI3基于MIPS的Linux内核PCI子系统分析Configuration空间。所有的这些地址空间都可以被CPU所存取。其中设备驱动程序要使用PCII/O和PCImemory空间。Linux核心中的PCI初始化代码要用到PCIConfiguration空间。1.1、PCI配置头(ConfigurationHeader)系统中的每一个PCI设备,包括PCI-PCI桥都由一个配置数据结构,位于PCI配置地址空间中。PCI配
5、置头允许系统识别和控制设备。这个头位于PCI配置地址空间的确切位置依赖于设备使用的PCI拓扑。例如,插在PC主板一个PCI槽位的一个PCI显示卡配置头会在一个位置,而如果它被插到另一个PCI槽位则它的头会出现在PCI配置内存中的另一个位置。但是不管这些PCI设备和桥在什么位置,系统都可以发现并使用它们配置头中的状态和配置寄存器来配置它们。通常,系统的设计使得每一个PCI槽位的PCI配置头都有一个和它在板上的槽位相关的偏移量。所以,举例来说,板上的第一个槽位的PCI配置可能位于偏移0而第二个槽位的在偏移256(所有的头都一样长度,256字节
6、),依此类推。定义了系统相关的硬件机制使得PCI配置代码可以尝试检查一个给定的PCI总线上的所有可能的PCI配置头,试图读取头中的一个域(通常是VendorIdentification域)得到一些错误,从而知道那些设备存在而那些设备不存在。PCILocalBus规范描述了一种可能的错误信息:试图读取一个空的PCI槽位的VerdorIdentification和DeviceIndentification域时候返回0xFFFFFFFF。每个寄存器的具体含义,请参考pcispec第六章。这里只介绍pci空间的读写相关。X86平台:在x86上,保
7、留了0xCF8~0xCFF的8个寄存器。实际上就是对应地址为0xCF8的32位寄存器和地址为0xCFC的32位寄存器。在0xCF8寄存中写入要访问设备对应的总线号、设备号、功能号和寄存器号组成的一个32位地址写入0xCF8。然后从0xCFC上就可以取出对应pci设备的信息。写入到0xCF8寄存器的格式如下:•低八位(0~7):(寄存器地址)&0xFC.低两位为零•8~10:功能位:一个pci设备可能对应多个功能。将每个功能单元分离出来,•对应一个独立的pcidevice•11~15位:设备号。对应该pci总线上的设备序号4基于MIPS的L
8、inux内核PCI子系统分析•16~23位:总线号。根总线号为0。每遍历到下层总线,总线号+1•31:有效位。如果该位为1,则说明写入的数据有效,否则无效例如:要读取n总线号,m设备号,f功能
此文档下载收益归作者所有