PCI配置空间访问的细节

本文出自:【InTheWorld的博客】

    前段时间在看DM9000驱动的时候,瞄了一眼DM9000的datasheet。以前确实没有留意这种形式的接口设计。简单来说就是,DM9000只占用主机的8字节的地址空间。前四字节用作地址端口,后四字节用作数据端口。进行写操作时,将目标地址写入到地址端口,源数据写入数据端口。读操作则与写操作类似。PCI设备中有三种地址空间,分别是内存空间、IO空间和配置空间。PCI总线很重要的一个特点就是配置空间。配置空间是内存空间和IO空间分配的基础。个人觉得,由于PCI设备可以直接通过映射后的地址进行访问。与这种透明机制相比,配置空间的访问反而是最难理解的了。

        要弄清楚PCI的细节,最直接的办法就是看PCI总线协议文档了。了解过PCI配置的人大概都知道两个非常重要的寄存器, config_address(0xCF8),config_data(0xCFC)。 然后软件干的事就很简单了,就像访问DM9000一样访问PCI的配置空间了。然后PCI host就自己去干活了。 好像事情就是这么简单,这大概就是PCI的成功原因之一。但是,这明显还不够,PCI host到底怎么实现对PCI设备的访问的呢?我看的这本PCI总线协议还是讲了一下的,当然是从PCI设备的角度讲的,没有几个人需要去设计PCI host或者PCI-PCI桥。

    CPU里的程序把地址和数据分别写入了config_address和config_data寄存器。假设我们自己就是一个PCI host,我们应该干啥呢?这虽然是个数字系统设计的问题,但是并不抽象。这样打个比方,我(PCI host)是一个员工,CPU是我的老板,PCI设备是其他公司的代表。老板要我和别的公司谈生意。我该怎么办?这样一来,感觉问题并不难了。                                                                    
    首先,我要让别人知道我(PCI host)是谈生意的,而不是讨饭的。怎么实现呢?答案是依靠C/BE[3::0]这一组信号。

C/BE[3::0]# Command Type                             
010        configuration read  

    把这组信号发到总线上,PCI设备立即知道PCI host要对配置空间进行访问了。就好比我穿上西装,提上公文包,别人就知道我是来谈生意的了。然后,那么多公司业务代表(PCI设备) 都在一个屋子里面,没人知到你要和谁谈生意。不用急,不是有项目协议吗?上面有乙方公司的详细信息(就是地址了),这时,我大吼了一声“XX公司的,我要和你谈生意!

    这一吼怎么来的,其实就是通过地址/数据总线。AD[31:11]会与PCI设备的IDSEL信号对应相连,这个片选决定了该设备在这条总线的设备号。一图胜千言,看看下图,一切都清楚了。   

  看图的左侧,host把设备号(config_address[11::15])转化到AD[31::11]。这相当于一个译码器的功能, AD[31::11]这12位中只会有一个是1,这说明一个PCI段上最多有只能有12个物理设备。 看上图的右侧,就知道PCI host把config_address[10::0]的数据搬运到AD[10::0]。这个功能相当于告诉别人业务代表,我具体要谈什么业务了。然后一个周期,就是PCI设备把数据放到AD总线上,PCI host把数据读回来,放到config_data中,相当于我把协议放到老板办公桌上。最后,我们霸气的CPU老板就看看合同(读config_data里面的数据)。

    好吧!事情干完了!博文也写完了,买夜宵去了。。。。                 

发表评论