内核在PCI框架初始化时会调用pci_driver_init()来创建一个PCI总线结构(全局变量pci_bus_type),这里描述的PCI总线结构,是指驱动匹配模型中的概念,PCI的设备和驱动都会挂在该PCI总线上; 从pci_bus_type的函数操作接口也能看出来,pci_bus_match用来检查设备与驱动是否匹配,一旦匹配了就会调用pci_device_probe函数,下...
-->pci_create_root_bus //创建代表pcie控制器的pci_host_bridge和第一条pci总线,driver/pci/probe.c -->pci_scan_child_bus //枚举pci总线上的所有设备 -->pci_scan_slot //扫描PCI 多功能设备,如果发现是单功能设备,不再继续扫描,如果发现是多功能设备,则进行8次扫描 -->pci_scan_single_device //...
枚举的入口函数:pci_host_probe 设备的扫描从pci_scan_root_bus_bridge开始,首先需要先向系统注册一个host bridge,在注册的过程中需要创建一个root bus,也就是bus 0,在pci_register_host_bridge函数中,主要是一系列的初始化和注册工作,此外还为总线分配资源,包括地址空间等; pci_scan_child_bus开始,从bus 0向下...
1、创建根节点: 在dw_pcie_host_init中通过devm_pci_alloc_host_bridge()分配host bridge结构体 pci_register_host_bridge()注册上一步的host bridge,主要是为host bridge数据结构注册对应的设备,创建了一个根总线pci_bus, 也为该pci_bus数据结构注册一个设备并填充初始化的数据。 1、注册了bridge对应的Device,...
根据device_node节点,创建platform_device结构,并最终注册进系统,这个也就是PCIe Host设备的创建过程; 我们看看PCIe Host的设备树内容: pcie: pcie@fd0e0000 { compatible ="xlnx,nwl-pcie-2.11"; status ="disabled";#address-cells =<3>;#size-cells =<2>;#interrupt-cells =<1>;msi-controller; ...
PCI设备的使用模型是这样的,外设可以抽象成一片内存或者一排连续的端口,具体而言每个功能256字节的配置内存。它们可以被排布在PCI总线地址空间上,然后映射到host CPU的地址空间里。每个PCI插槽有4个中断引脚,每个功能可以使用其中一个。每个PCI外设由domain(16位)、bus(8位)、device(5位)以及function(3位)组成的...
驱动文件drivers\pci\host\pcie-rockchip.c中注册了一个platform_driver,从它的probe函数开始分析: 三、 设备树文件解析 RK3399访问PCIe控制器时,CPU地址空间可以分为: Client Register Set:地址范围 0xFD000000~0xFD7FFFFF,比如选择PCIe协议的版本(Gen1/Gen2)、电源控制等 ...
PCI总线规范定义了一系列与Cache相关的总线事务,以提高PCI设备与主存储器进行数据交换的效率,即DMA读写的效率。当PCI设备使用DMA方式向存储器进行读写操作时,一定需要经过HOST主桥,而HOST主桥通过FSB总线[1]向存储器控制器进行读写操作时,需要进行Cache共享一致性操作。
int pci_host_probe(struct pci_host_bridge *bridge) { struct pci_bus *bus, *child; int ret; pci_lock_rescan_remove(); ret = pci_scan_root_bus_bridge(bridge); pci_unlock_rescan_remove(); bus = bridge->bus; /* If we must preserve the resource configuration, claim now */ ...
针对PCI控制器的驱动,核心的流程是需要分配并初始化一个pci_host_bridge结构,最终通过这个bridge去枚举PCI总线上的所有设备; devm_pci_alloc_host_bridge:分配并初始化一个基础的pci_hsot_bridge结构; nwl_pcie_parse_dt:获取DTS中的寄存器信息及中断信息,并通过irq_set_chained_handler_and_data设置intx中断号对应...