Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1685653
  • 博文数量: 511
  • 博客积分: 967
  • 博客等级: 准尉
  • 技术积分: 2560
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-06 14:19
文章分类

全部博文(511)

文章存档

2016年(11)

2015年(61)

2014年(257)

2013年(63)

2012年(119)

分类: LINUX

2014-08-27 21:51:58

原文地址:如何访问PCI配置空间 作者:怪怪虎

系统中的CPU是通过PCI设备的设备号以及配置空间中的寄存器编号来访问配置空间寄存器的。PCI设备配置空间的寄存器地址编码格式如图25-6所示。

                图25-6  PCI设备配置空间寄存器地址

CPU通过产生PCI配置空间访问周期来访问PCI设备的配置空间,产生PCI配置空间访问周期的机制有以下两种。

n 机制1

通过CPU中专门为PCI总线设置的PCI配置空间地址寄存器和配置空间数据寄存器来访问配 置空间的寄存器,其中配置空间地址寄存器的编码格式与上面“PCI设备配置空间寄存器地址”的编码相同,有的CPU会将其中的bit31用作使能配置空间 访问控制位,只有当bit31等于1时才能访问配置空间。使用这种机制的CPU,用户首先将要访问的配置空间的寄存器地址写入配置空间地址寄存器中(如果 需要,同时将地址寄存器的bit31置1),然后直接从数据寄存器中读取配置空间寄存器的值或者将要写入的数据直接写入数据解存器即可。

使用这种机制的CPU有PPC440EP、IXP425和PNX1500/1700。

PPC440EP使用PCIC0_CFGADDR(0xEEC00000)和 PCIC0_CFGDATA(0xEEC00004)来访问配置空间中的寄存器,程序员只需将要访问的寄存器地址写入PCIC0_CFGADDR中,同时 将bit31置1,然后如果是读操作则直接从PCIC0_CFGDATA寄存器读取配置寄存器的值,如果是写操作则将要写入配置寄存器的值直接写入 PCIC0_CFGDATA寄存器中。

IXP425使用PCI_CRP_AD_CBE(0xC0000010)、 PCI_CRP_WDATA(0xC0000014)和PCI_CRP_RDATA(0xC0000018)三个寄存器来访问配置空间中的寄存器,程序员 首先将要访问的配置空间寄存器的地址写入PCI_CRP_AD_CBE中,然后对于读操作,直接从PCI_CRP_RDATA寄存器中读取配置空间寄存器 的值,对于写操作,将要写入配置空间寄存器的值直接写入PCI_CRP_WDATA寄存器中即可。

PNX1500/1700使用GPPM_ADDR(0x0004002C)、 GPPM_RDATA(0x00040030)、GPPM_WDATA(0x00040034)和GPPM_CTRL(0x00040038)四个寄存器 来访问配置空间寄存器,与IXP425的操作基本相同,只是当读写时要设置GPPM_CTRL寄存器中的适当位来配合。

n 机制2

CPU在自己的整个地址空间中专门为PCI总线的配置空间分配一段地址空间,这个地址空间刚 好可以存放256条PCI总线上的满载设备的配置空间,计算一下:256条PCI总线,每条总线最多32个设备,每个设备最多8个功能,每个功能的配置寄 存器空间占256字节,这样总共需要16MB的地址空间。CPU为PCI总线分配16MB的地址空间,我们可以通过访问这16MB地址空间来访问系统中所 有PCI总线上的所有设备的配置空间,每个PCI设备的配置空间的起始地址等于这个16MB空间的起始地址加上该PCI设备的(总线号*设备号*功能 号)。如果CPU中为PCI总线分配的16MB空间的起始地址是0xD00000000,那么访问0xD00000000地址开始256字节空间就可以访 问系统中总线号为0、设备号为0以及功能号也是0的PCI设备的配置空间。

使用这种配置机制的CPU有BCM1250。

BCM1250内部为PCI总线分配的总共16MB配置空间的起始地址是 0xFE000000(0xDE000000),BCM1250处理器内部集成了一个PCI总线控制器和一个HT(HyperTransport超级传 输)接口控制器,它们都挂在PCI总线0上,而且分别作为设备0和1,所以分别访问从0xFE000000和(0xFE000000 + 0x100)地址开始的256字节地址空间,就可以分别访问到BCM1250处理器的内部PCI总线控制器以及HT接口控制器的配置空间了。

到了这里似乎已经将这一节介绍完了,但是还有一个问题,那就是如何将上述PCI设备的配置空间地址与具体的PCI设备对应起来呢?也就是如何将PCI设备的配置空间地址转换成对应PCI设备的配置空间选择信号呢?

在第25.5.2节“PCI设备的三个地址空间”中提到,处理器是通过驱动PCI设备的 IDSEL信号来选择访问PCI总线上哪个PCI设备的配置空间的。PCI规范中并没有规定系统如何来产生IDSEL信号,一种通用的规则就是用PCI接 口的地址/数据信号线的AD[31:11]来产生IDSEL信号,其中AD11信号线对应总线中的设备0,AD12对应设备1,依次类推,AD31对应总 线中的设备20。当我们访问总线号为0、设备号为0的PCI设备时,在访问的地址周期内,CPU

将驱动AD11信号线有效,这样如果PCI设备的IDSEL信号连到了AD11信号线,那么该PCI设备将被激活并响应该访问配置空间的操作。

比如:当我们访问BCM1250处理器的0xFE000008地址时,在访问的地址周期,处 理器将使得PCI接口的AD11为高电平,从而访问内部的PCI控制器的配置地址空间,当然,由于BCM1250的PCI控制器和HT控制器都在内部实 现,并不需要真正从外部连接到AD11和AD12引脚,BCM1250芯片没有引出IDSEL信号线,是内部连接的,但是AD11和AD12只能用于内部 PCI控制器和HT控制器,外挂的PCI总线设备只能使用AD13~AD31之间的信号线与其IDSEL信号相连,而IXP425、PPC440EP和 PNX1500/1700则都引出了IDSEL信号。

阅读(1708) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~