首页 理论教育PCIExpress总线初始化相关函数

PCIExpress总线初始化相关函数

【摘要】:对于Linux x86而言,BIOS已经将PCI设备使用的存储器和I/O资源设置完毕,而其他Linux系统,如Linux PowerPC,需要使用该函数设置PCI设备使用的存储器和I/O资源。pci_init函数的主要作用是对已经完成枚举的PCI设备进行修复工作,用于修补一些BI-OS中对PCI设备有影响的Bugs。CompactPCI总线在通信系统中较为常见。而pci_sysfs_init函数与sysfs文件系统相关,主要功能是将每一个PCI设备加入到sysfs文件系统的相应目录中,本节对此不做进一步介绍。Linux x86对PCI总线进行初始化时,使用了许多不完美的源代码。

pci_iommu_init函数在./arch/x86/kernel/pci-dma.c文件中,该函数用来初始化处理器系统的IOMMU,可以配置IBM X-Series刀片服务器使用的Calgary IOMMU、Intel的Vtd和AMD的IOMMU使用的I/O页表。如果在Linux系统中没有使能IOMMU选项,pci_iommu_init函数将调用no_iommu_init函数,并将dma_ops函数设置为nommu_dma_ops。本节不进一步介绍该函数的详细实现机制。

pcibios_assign_resources函数主要处理PCI设备使用的ROM空间和PCI设备使用的存储器和I/O资源。该函数的主要功能是调用pci_assign_unassigned_resources函数对PCI设备使用的存储器和I/O资源进行设置。对于Linux x86而言,BIOS已经将PCI设备使用的存储器和I/O资源设置完毕,而其他Linux系统,如Linux PowerPC,需要使用该函数设置PCI设备使用的存储器和I/O资源。

pci_init函数的主要作用是对已经完成枚举的PCI设备进行修复工作,用于修补一些BI-OS中对PCI设备有影响的Bugs。

pci_proc_init函数的主要功能是在proc文件系统中建立./bus/pci目录,并将proc_fs默认提供的file_operations更换为proc_bus_pci_dev_operations。

pcie_portdrv_init函数首先在./sys/bus中建立pci_express目录,然后使用pci_register_driver函数向内核注册一个名为pcie_portdriver的pci_driver结构。在Linux x86中,pci_ex-press目录中的设备都是从sysfs文件系统的pci目录中链接过来的。该函数的实现较为简单。(www.chuimin.cn)

pci_hotplug_init函数主要用来支持CompactPCI的热插拔功能。CompactPCI总线在通信系统中较为常见。

而pci_sysfs_init函数与sysfs文件系统相关,主要功能是将每一个PCI设备加入到sysfs文件系统的相应目录中,本节对此不做进一步介绍。pci_mmcfg_late_insert_resources函数的主要功能是将MMCFG使用的资源放入系统的Resource Tree中,并标记这些资源已经被使用,之后其他驱动程序不能再使用这个资源。

本章并不会对Linux x86使用的Legacy PCI总线枚举方法进一步描述,x86处理器为了实现向前兼容,付出了巨大的努力。x86处理器在实现新的功能的同时,需要向前兼容古董级别的功能,有时BIOS无所适从。Linux x86对PCI总线进行初始化时,使用了许多不完美的源代码。而这些貌似不完美的源代码背后,都有许多与向前兼容有关的故事。