前言
本文为读书笔记,如有误可以指正,一块学习交流
本章节主要介绍两种类型的数据传输:
a- host读写pci设备的bar寄存器。
b- pci设备通过DMA方式读写内存。对于PCI设备读写其他PCI设备的bar寄存器只了解
3.1- pci设备bar空间的初始化
3.1.1 内存域和pci总线域地址映射
每个pci设备都有一组bar寄存器,可以用于配置pci设备的寄存器,这段bar寄存器内存空间位于pci设备上。
在系统初始化时候,会遍历所有的pci设备,统一规划好pci地址空间,并将pci地址和内存地址进行映射。以书中示例说明:
a- 将pci bar寄存器空间0x7000 0000-0x7800 0000映射到内存空间0xF000 0000-0xF7FF FFFF的空间。注意,这里所有pci设备的bar寄存器空间总大小为0x800 0000,所以要在内存空间也开辟同样大小的空间用于映射。
b- 将内存的地址区域映射到PCI总线域。在PCI设备驱动初始化会申请一堆DMA内存资源,用于PCI设备使用DMA对内存进行读写。所以需要将内存地址映射到PCI总线域,并分配空间。本例将内存地址0x0000 0000-0x7FFF FFFF的空间映射到pci总线域的0x8000 0000-0xFFFF FFFF.
3.1.2 pci设备bar寄存器、pci桥的初始化
假定pci桥没有bar寄存器,每个pci设备的地址bar寄存器空间统一为16M(0x100 0000)大小;pci总线域上0x7000 0000起始存放bar寄存器。
系统遍历所有PCI设备,首先给PCI设备31分配bar空间0x7000 0000 - 0x70FFF FFFF
然后扫描到PCI设备32给其分配bar空间为0x71000 0000-0x71FF FFFF
扫描到PCI桥3,配置其管理的PCI设备的起始地址为0x7000 0000,地址大小为0x200 0000
以此类推,所有设备分配好bar空间地址后如下图所示:
3.2- PCI设备的数据传递
3.2.1- 处理器读写取pci设备的bar寄存器
host使用存储器写指令,访问内存0xF300 0008地址空间
由于该地址与PCI总线域有映射关系,存储器将该地址发送到host主桥
host主桥将内存地址0xF300 0008转化为PCI域的地址0x7300 0008,并接管存储器的写请求,对PCI设备11进行写操作。
3.2.3 PCI设备读写内存--DMA操作
a- PCI设备11写一组数据到0x1000 0000起始的地址,但是设备11不能操作内存地址,只能操作映射到PCI域的地址0x9000 0000。
b- 没有pci设备认领这个地址,最后HOST主桥发现0x9000 0000被映射到了内存地址0x1000 0000。
c- DMA控制器接管写操作,将host主桥接收的数据写入到0x1000 0000地址空间
3.2.4- PCI设备读其他设备
a- PCI设备11写一组数据到0x7500 0000起始的地址
b- 经过pci桥转发,后来pci设备42认领这个地址,就展开对PCI设备42的读写操作。