上一节讲述了PCI非桥设备的访问,这一节就讲述PCI桥设备的访问
根据PCI设备类型的划分,可以将PCI设备分为三类,分别为PCI Agent、PCI Bridge和Cardbus Bridge,它们各自的含义分别如下:
PCI Agent:真正的PCI设备(比如网卡),是PCI树的最末端PCI Bridge:桥,用来扩展PCI设备,必定有一个Root Bridge,下面还可以有其他BridgeCardbus Bridge:用得不多,不介绍怎么判读设备的类别?设备的配置空间里有Header Type,它的取值有:
00h:PCI Agent01h:PCI Bridge02h:Cardbus Bridge
上一章节提到了非桥设备的配置,配置桥设备,同样是要遵循该规则,具体如下:
选中:通过IDSEL来选中某个设备
访问配置空间:发起一个type 0的配置命令
PCI设备最多有8个功能,每个功能都有自己的配置空间(配置寄存器)CPU读取配置空间的BAR,得知:这个PCI设备想申请多大空间
CPU分配PCI地址,写到PCI设备的BAR里
PCI桥设备的配置空间表如下:
PCI设备一样,通过IDSEL来选中它type 0配置命令读取配置空间,发现它是PCI桥设备,把分配的总线号写给它PCI桥设备同样可以挂载桥设备,如下图:
那么重点来了,CPU如何去配置桥设备的桥设备呢?

type 1的配置命令Bus Number访问到PCI桥PCI桥根据Device Number去驱动IDSEL,选中下一级的PCI设备Function Number、Register Number访问PCI设备的配置空间CPU发出addr_cpu,被PCI Host桥转换为addr_pciPCI设备发现这个addr_pci是自己的,就驱动DEVSEL#,表示说:是我是我PCI设备参与传输:接收数据、返回数据