https://www.cnblogs.com/LoyenWang/p/14209318.html
PCIE物理结构
PCI Device;
PCI总线中有三类设备:PCI从设备,PCI主设备,桥设备。
PCI从设备:被动接收来自Host Bridge或者其他PCI设备的读写请求;
PCI主设备:可以通过总线仲裁获得PCI总线的使用权,主动向其他PCI设备或主存储器发起读写请求;
桥设备:管理下游的PCI总线,并转发上下游总线之间的总线事务,包括PCI桥、PCI-to-ISA桥、PCI-to-Cardbus桥等。
层级划分
linux数据结构
host bridge
Host Bridge连接CPU和PCI系统,由struct pci_host_bridge描述
struct pci_host_bridge
pci_bus
struct pci_bus用于描述PCI总线
pci_dev
struct pci_dev描述PCI设备,以及PCI-to-PCI桥设备;
pci_slot
struct pci_slot用于描述总线上的物理插槽
/i/l/?n=20&i=blog/1771657/202012/1771657-20201229232452417-1541535796.pngW
- 总体来看,数据结构对硬件模块进行了抽象,数据结构之间也能很便捷的构建一个类似PCI子系统物理拓扑的关系图;
- 顶层的结构为pci_host_bridge,这个结构一般由Host驱动负责来初始化创建;
- pci_host_bridge指向root bus,也就是编号为0的总线,在该总线下,可以挂接各种外设或物理slot,也可以通过PCI桥去扩展总线;
流程分析
/i/l/?n=20&i=blog/1771657/202012/1771657-20201229232507268-1330517277.png
简单来说,Linux内核建立了一个统一的设备模型,分别采用总线、设备、驱动三者进行抽象,其中设备与驱动都挂在总线上,当有新的设备注册或者新的驱动注册时,总线会去进行匹配操作(match函数),当发现驱动与设备能进行匹配时,就会执行probe函数的操作;
从数据结构中可以看出,bus_type会维护两个链表,分别用于挂接向其注册的设备和驱动,而match函数就负责匹配检测;
各类驱动框架也都是基于图中的机制来实现,在这之上进行封装,比如I2C总线框架等;
设备驱动模型中,包含了很多kset/kobject等内容,建议去看看之前的文章《linux设备模型之kset/kobj/ktype分析》
bus match
设备或者驱动注册后,触发pci_bus_match函数的调用,实际会去比对vendor和device等信息,这个都是厂家固化的,在驱动中设置成PCI_ANY_ID就能支持所有设备;
一旦匹配成功后,就会去触发pci_device_probe的执行;
bus probe
枚举
/i/l/?n=20&i=blog/1771657/202012/1771657-20201229232552417-1229310319.png
标签:PCI,bus,总线,PCIE,pci,linux,驱动,转载,设备 From: https://www.cnblogs.com/ycjstudy/p/18207700