PCI Configuration 下载本文

10h 80h

00h 00h

娱乐加密/解密. 其它加密/解密.

Base Class 11h

数据撷取与讯号处理控制器

子类别 00h 80h 程序界面 00h 00h 描述

DPIO模块

其它数据撷取与讯号处理控制器.

Cache Line Size Register 快取线大小缓存器(Offset 0Ch)

此读/写组态缓存器指定了以dword为单位的系统快取线大小(例如:在P6的系统 里此缓存器的值为08h,表示其快取线大小为8个dword,或32个字节),实作了 Memory Write-and-Invalidate指令的Bus Master必须实作此缓存器,因为它必须

知道快取线大小,以便确保它从快取线边界起始交易,并遵守它将整条线写入内存的约定,所以当这缓存器被设定为0(表示组态软件尚未把快取线大小告诉它)时,

Bus Master不可以使用Memory Write-and-Invalidate指令,在这种情况,Master 只能够使用Memory Write(内存写入)指令来更新内存.

装置可以限制它所支持的快取线大小数目,假如组态软件写入一个未支持的数值, 则装置会将此数值当作0来动作.

Latency Timer 等待时间(Offset 0Dh)

等待时间以PCI频率周期为单位,定义了在bus master起始新交易时,它可保留总线有权的最小时间量,最理想的是,每一个bus master都应该将此缓存器实作为可读/写的缓存器,藉此给予组态软件在bus master群组间分配可用的总线时间上有最大的弹性,组态软件以读取功能的Min_Gnt(Minimum Grant最小授权)缓存器,决定bus master想要的时间片段.

Header Type

表头型态缓存器(Offset 0Eh)

每一个PCI功能拥有保留给实作其组态缓存器用的64个组态dword区块,前16个dword的格式(Offset 00h~3Fh)与使用是由PCI规格预先定义的,这区域被称为装置的组态表头区域(或表头空间(Header Space)),规格目前定义了三种表头格式,称为Header Type Zero,One与Two: ? Header Type One是为PCI-to-PCI桥接器定义的(01h).

? Header Type Two是为PCI-to-CardBus桥接器定义的(02h).

? Header Type Zero是给所有除了PCI-to-PCI与CardBus桥接器以外的装置使用的(00h).

Header Type位7是用来表示此装置含有除了桥接器功能以外的其它功能, 固位7=1表示为多功能,0=表示为单功能.

Built-in Self Test

BIST内建自我测试(Offset 0Fh)

非必要的,假如装置不支持BIST的话,在读取此缓存器时,它必须要传回为0,装置的BIST是以设定位6为1的方式来请求,在完成BIST后,装置会将位6重置,但必须在二秒钟内完成重置,位0~3为0则表示成功,非零值代表装置特定的错误码.

Bass Address

基地址缓存器(Offset 10h~27h)

在开机时,系统必须自动地组态,以便让所有IO与内存能占用户不相干的地址范围,

为了达到此目标,系统必须有能力侦测到装置需要多少个内存与IO地址范围,以及每一个大小.当位0传回1则表示这是一个IO译码器,不是内存译码器,位[31:2]是基地址字段,并且用来IO区块所需的大小以及设定它的起始地址.

区块大小的决定与地址范围的指定:

? 是否实作基地址缓存器?

? 它是一个内存,还是IO地址译码器?

? 假如它是内存译码器,它是一个32位还是64位的基地址缓存器? ? 假如它是内存译码器,与此缓存器相关的内存是可预读的还是不可预读的? ? 它需要多少内存或地址空间,并且是以什么单位来排列?

这所有信息可以很简单的用写入一个全部为1的值到基地址缓存器里,然后读取它来确认,传回值为0表是没有实作基地址缓存器,假设所读取的值不为0,程序执行装置可从基地址栏的最低有效位向上扫瞄传回值,以找出第一个被设定为1的位来决定所需的内存或IO空间的大小.

内存范例:

假设FFFFFFFFh被写入在组态13h~10h的基地址缓存器里,然后再读取时,所得的值为FFF00000h,由此可知有任何位可以被更改成1表示实作了基地址缓存器, ? 位 0 = 0 表示这是一个内存地址译码器.

? 位 [2:1] = 00b表示它是一个32位内存地址译码器. ? 位 3 = 0 表示它不是可预读的内存.

? 位20是在基地址字段里所找到的第一个1,此位的二进制权值为1,048,576,表示这是一个1MB大小

的内存地址译码器.

接下来,程序执行装置写入32位基地址到缓存器里,不过只有位[31:20]是可写入的,译码器接荍位[31:20]并假设所指定的基地址的位[19:0]为0,这表示基地址可以被1MB,既所请求的内存范围大小整除,所指定的起始地址一定会被所请求的内存范围大小整除是PCI译码器的特性.

IO范例:

假设FFFFFFFFh被写入在组态17h~14h的基地址缓存器里,然后再读取时,所得的值为FFFFFF01h,位0为1,表示这是一个IO地址译码器,从位2(基地址栏的最低有效位向上扫瞄)开始向上扫瞄,找到位8是第一个被成功地改成1的位,此二进权值为256,表示此IO地址译码器大小为256B,或将所得的值作一补码运算后再加1,易可得相同的值.

CardBus CIS Pointer

CardBus与PCI共享的装置实作此非必要的缓存器,此字段指向CardBus卡的借面 卡信息结构(CardBus Information Structure,CIS),此缓存器是只读的,并且包含在下列 其中一个地方的CIS相对地址(offset):

? 在功能的装置特定组态空间里(在功能的组态空间的Offset 40h之后)的相对地址(Offset).

? 与其中一个装置内存基地址缓存器所指示的起始地址间之相对地址(offset). ? 在装置扩充ROM程序代码影像(Code Image)里的相对地址(offset). CIS的详细说明请参考”CardBus System Architecture”.

Subsystem Vendor ID and Subsystem ID

Subsystem Vendor ID

子系统制造商识别码(Offset 2Ch~2Dh)

Subsystem ID

子系统识别码(Offset 2Eh~2Fh)

PCI功能可以位于界面卡上或内建装置里,使用相同PCI核心逻辑(由third-party(其它厂商)生厂)的两个界面卡或子系统可能会有相同制造商识别码与装置识别码(假如核心逻辑制造商以硬件接线将它们自己的识别码设定在这些缓存器里),假如在这种情况下,在OS辨识要加载到内存的真正装置驱动程序上,可能会有问题.

这两个强制性的缓存器被用来确认装置所在的附加卡或子系统,使用这两个缓存器,OS可以分辨在由不同制造商制造,但使用相同third-party核心逻辑的界面卡或子系统之间的差异,这使得随插即用(Plug-and-Play)OS有能力去寻找要加载到内存的正确驱动程序.

Expansion ROM Base Address

扩充ROM基地址缓存器(Offset 30h~33h)

对于含有装置ROM的装置来说是必要的,许多PCI装置都含有一个内含装置的装置驱动程序之装置ROM, 在开机时,系统必须自动地组态,以便让所有IO与内存能占用户不相干的地址范围,为了达到此目标,系统必须有能力侦测到ROM需要多少个内存空间,可以很简单的用写入一个全部为1的值到基地址缓存器里,然后读取它来确认,它必须检查在ROM里的前两个位置是否有扩充ROM的签名,以决定ROM是否真的被安装,假如有安装的话,组态程序必须SHADOW此ROM,并且执行其初始化程序代码.

? 位0 = 1 致能装置的ROM地址译码器. ? 位[10:1]保留.

? 位[31:11]用来指定ROM的起始地址.

假设FFFFFFFFh被写入到ROM的基地址缓存器里(位0,既扩充ROM致能位被清除,所以ROM地址译码器不会被致能,直到指定起始内存地址之后),随后再读取此缓存器,所得的值为FFFE0000h,这表示:

? 位0 = 0 ,表示ROM地址译码器目前被关闭. ? 位[10:1]保留.

? 在基地址字段(位[31:11])里,位17为程序执行装置可以设定为1的最低有效位,其二进制权值

为128K,表示ROM译码器需要128K的内存地址,然后,程序执行装置写入一个32位的起始地址到此缓存器中,指定128KB的地址边界当作ROM的起始地址.