(DXE_DRIVER)PciHostBridge

news/2024/10/11 17:27:21/

UEFI-PciHostBridge

1、PciHostBridge简介

   PciHostBridge: 提供PCI配置空间,IO,MEM空间访问接口以及统一维护平台相关的PCI资源,提供gEfiPciHostBridgeResourceAllocationProtocolGuid,创建RootBridge等为PciBusDxe提供服务;

2、PciHostBridge 配置空间

在这里插入图片描述
  PCI桥可管理其下PCI子树
  SubBus:当前PCI子树中编号最大的PCI总线号
  SecBus:当前PCI桥的下游总线的总线号
  PriBus:当前PCI桥的上游总线的总线号
初始化为0
  Secondary Latency Timer:管理PCI桥发往下游总线的超时机制。
  I/O Limit 、I/O Base、Memory Limit、Memory Base:存放子树中所有设备使用的I/O或MEM地址空间集合的基地址及大小。PCI规定MEM的这个空间至少为1MB。
  Prefetchable Memory Limit、Prefetchable Memory Base:存放子树中所有设备使用的可预取MEM空间的基地址及大小。
Bridge Control Register:用来管理下游总线

3、PciHostBridgeDxe

3.1 InitializePciHostBridge

 PciHostBridgeGetRootBridges(ScanForRootBridges):
1、 一个PCI总线域的Bus取值范围为 0 ~ 255,Dev 0 ~ 31, Func 0 ~ 7.  通过Bus/Dev/Func三层for循环轮询,挨个检查每个Func的configuration space的Vendor ID是否为FFFFh. 按照PCI spec定义FFFFh表示Func不存在。
2、如果轮询发现一个Bus下至少存在一个Func, 则表示Root Bridge存在(有意义)。然后在RootBridges数组为这个Root Bridge分配并初始化一个PCI_ROOT_BRIDGE元素。

在这里插入图片描述
分配HostBridge IO空间
在这里插入图片描述
分配内存空间
在这里插入图片描述

3.2 相关指针

在这里插入图片描述

  • EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL;实例是由DXE驱动程序生成的,可以查询以识别关联的PCI根桥的设备句柄。
  • GetNextRootBridge:返回与此Host bridge关联的下一个PCI根桥的device handle。
  • NotifyPhase:这些是来自PCI总线驱动程序的通知,它即将进入某个
    PCI枚举过程的阶段。该成员功能可用于通知主桥驱动程序执行特定动作,包括任何芯片组特定的初始化,以便芯片组准备好进入下一阶段。
    1、 case EfiPciHostBridgeAllocateResources:
    PCI枚举器应发出此通知,在开始新的枚举过程之前。
    在这里插入图片描述
    2、EfiPciHostBridgeBeginBusAllocation:开始总线分配
    3、EfiPciHostBridgeEndBusAllocation:结束总线分配
    4、EfiPciHostBridgeBeginResourceAllocation:HostBridge开始资源分配
    5、EfiPciHostBridgeAllocateResources:HostBridge分配资源。
    在这里插入图片描述
    6、EfiPciHostBridgeSetResources:HostBridge设置资源
    7、EfiPciHostBridgeFreeResources:HostBridge释放资源
    8、EfiPciHostBridgeEndResourceAllocation:HostBridge 结束资源分配
  • GetNextRootBridge:返回与此Host bridge关联的下一个PCI根桥的device handle。
    在这里插入图片描述
  • GetAttributes:返回PCI根桥的分配属性。
  • StartBusEnumeration:为总线枚举进程设置指定的PCI根桥。主要填充EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR结构体。
  • SetBusNumbers:输入参数Configuration指定的总线范围。
  • SubmitResources:从Configuration中获取I/O 和内存资源,提交到PCI root bridge里。
  • GetProposedResources:从Configuration获取资源

4、PciBusDriver

1、EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL
  实例是由DXE驱动程序生成的,可以查询以识别关联的PCI根桥的设备句柄。

2、GetNextRootBridge:返回与此Host bridge关联的下一个PCI根桥的device handle。

3、NotifyPhase:这些是来自PCI总线驱动程序的通知,它即将进入某个
PCI枚举过程的阶段。该成员功能可用于通知主桥驱动程序执行特定动作,包括任何芯片组特定的初始化,以便芯片组准备好进入下一阶段。
此时定义了八个通知阶段。请参见以下内容:

EfiPciHostBridgeBeginEnumeration:PCI枚举器应发出此通知,在开始新的枚举过程之前。
EfiPciHostBridgeBeginBusAllocation:开始总线分配
EfiPciHostBridgeEndBusAllocation:结束总线分配
EfiPciHostBridgeBeginResourceAllocation:HostBridge开始资源分配
EfiPciHostBridgeAllocateResources:HostBridge分配资源
EfiPciHostBridgeSetResources:HostBridge设置资源
EfiPciHostBridgeFreeResources:HostBridge释放资源
EfiPciHostBridgeEndResourceAllocation:HostBridge 结束资源分配

4、GetAttributes:返回PCI根桥的分配属性。

5、StartBusEnumeration:为总线枚举进程设置指定的PCI根桥。

6、SetBusNumbers:对PCI根桥硬件进行编程,以便对指定的PCI总线范围进行解码,该成员函数对指定的PCI根桥进行编程,以解码输入参数Configuration指定的总线范围。

7、SubmitResources:提交特定的PCI root bridge 的I/O 和内存资源

8、GetProposedResources:得到特定的PCI root bridge 被提交的资源

9、PreprocessController:提供从PCI总线驱动程序到各个PCI控制器(设备/功能)的挂钩PCI枚举过程的阶段,允许主桥驱动程序预先初始化单个枚举之前的PCI控制器。

2、EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
  来自ACPI规范中的以下两种资源描述符类型只能用于描述不兼容的PCI设备资源需求:
  QWORD地址空间描述符可以描述动态或固定资源的内存、I/O和总线号范围。
PCI根桥接器的配置用一个或多个QWORD地址空间描述符来描述,然后是一个结束标记。下面的表5-20和表5-21包含了这两种描述符类型
在这里插入图片描述
在这里插入图片描述

4、PciBusDriver

4.1 PCI枚举过程

  Dev和Fun号应该是和硬件设计有关系,也就是硬件就已经固定,软件的枚举过程是更多的是在分配Bus号。
  对CPU来说,最开始仅仅知道Bus0的存在,Bus0下面都有什么设备,PCIE树是怎么样的一概不知。因此首先从Bus0,Dev0(桥A)开始,先去读Dev0中Fun0的DID&VID(一定是从Fun0开始),看其是否返回0,如果不为0则表示设备存在,继续下一步。若返回FFFF,则Dev0中没有Fun0(任何设备的第一种功能一定是0),因此该设备不存在,继续探查Bus0,Dev1,Fun0。
  PCI设备的扫描是基于深度优先搜索算法(DFS:Depth First Search),也就是说,下级分支最多的PCI桥将最先完成其子设备的扫描。BUS:0-255,Device:0-31,Function:0-7
在这里插入图片描述

4.2 PCI枚举设计

  • 1、如果硬件支持动态更改PCI根总线的数量或更改与PCI根总线相关联的段号,则必须在下一个步骤之前完成这些更改。
  • 2、PCI主机桥接驱动程序(s)为系统中的PCI主机桥接创建一个设备句柄,并在该句柄上安装一个EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL实例。
  • 3、PCI Root Bridge驱动程序(s)会为每个PCI根桥接器创建一个设备句柄,并在该句柄上安装以下内容:
    EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL的一个实例
    EFI_DEVICE_PATH_PROTOCOL的一个实例
    预计单个驱动程序将处理一个PCI Host Bridge,以及所有关联的PCI根桥。EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL的副句柄字段必须使用包含EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL实例的PCI主机桥接的句柄进行初始化。

4.3 PCI分配BUS号

在这里插入图片描述
  当枚举过程结束后,系统中就已经维护了PCI设备的各类信息了,在设备驱动匹配模型中,总线和设备都已经具备了。

4.4 PciBusDriver代码流程

MdeModulePkg\Bus\Pci\PciBusDxe\PciBus.c
PciBusDriverBindingStart():Start this driver on ControllerHandle and enumerate Pci bus and start all device under PCI bus.

 PciBusDriverBindingStart()1. PciEnumerator1、打开gEfiPciHostBridgeResourceAllocationProtocolGuid2、PciHostBridge枚举1、初始化RootBridgeList2、创建根桥设备RootBridgeDev3、PciRootBridgeEnumerator:枚举根桥下的所有总线1、PciScanBus:分配总线号1、递归搜索BUS,device,function2、维护根桥、设备信息4、有效根桥增加到RootBridgeLis链表中5、有效设备加到RootBridgeDev链表中3、PciHostBridgeResourceAllocator 提交资源分配1、CreateResourceNode:创建资源节点2、通过遍历受此根网桥约束的所有设备来创建资源映射3、 基于全部资源树,构造ACPI资源节点,向pci主桥协议提交资源aperture 4、提交AcpiConfig  PciResAlloc->SubmitResources5、通知平台开始对资源进行编程  NotifyPhase (PciResAlloc, EfiPciHostBridgeAllocateResources);     6、通知pci总线驱动程序开始对资源进行编程 NotifyPhase (PciResAlloc, EfiPciHostBridgeSetResources)7、通知资源分配阶段结束 NotifyPhase (PciResAlloc, EfiPciHostBridgeFreeResources);2. StartPciDevices1、Start all the devices under the entire host bridge.2、PciIoDevice->Handle 上安装gEfiDevicePathProtocolGuid,gEfiPciIoProtocolGuidGetPciRom:Get the OpRom provided by platformPciRomAddImageMapping:Add the Rom Image to internal database填充PciIoDevice与optionrom相关字段。ProcessOpRomImage ():Load and start the Option Rom image.

http://www.ppmy.cn/news/1099342.html

相关文章

axios返回几种数据格式? 其中Blob返回时的size是什么意思?

axios返回几种数据格式? 其中Blob返回时的size是什么意思? 1、字符串(String):服务器可以返回纯文本或HTML内容,Axios会将其作为字符串返回。 2、JSON(JavaScript Object Notation)&#xff…

视频汇聚/视频云存储/视频监控管理平台EasyCVR安全检查的相关问题及解决方法2.0

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多…

Spring框架中bean的生命周期(理解)

1.解释Spring框架中bean的生命周期 在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。一旦该bean不再被使用,则由Java自动进行垃圾回收。 相比之下,Spring容器中的bean的生命…

揭秘分布式文件系统大规模元数据管理机制——以Alluxio文件系统为例

作者简介: 辭七七,目前大,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f49…

扫地僧万能HTML模板站群【搜狗站群单站模式内页收录】配置教程

浅测【搜狗内页收录较好】可自行进行测试对比 [测试的域名有搜狗蜘蛛,但是不收录] [一换程序嘎嘎乱叫] [测试的为内页收录,非泛站] [泛站容易被端,搜狗不建议泛站] 第一步配置SEO设置如图: 站群模式:单站 泛站…

微店平台的商品详情怎么去批量复制

一、平台介绍: 微店平台创立于2011年5月,是北京口袋时尚科技开发的应用,2014年1月"微店"APP正式上线,如今微店拥有近9000万小微店主,通过微店和微店店长版两个app,微店已经从小微店主首选的开店…

谷粒商城----缓存与分布式锁

1、缓存使用 为了系统性能的提升,我们一般都会将部分数据放入缓存中,加速访问。而 db 承担数据落盘工作。 哪些数据适合放入缓存?  即时性、数据一致性要求不高的  访问量大且更新频率不高的数据(读多,写少&…

业务架构图是什么?用什么软件制作比较好?

​一 业务架构图是什么? 1.1业务架构图简介 业务架构图是一种可视化表达方法,用于描述一个企业或产品的业务活动、流程、系统、数据和关系。它将业务流程、职能、数据流动以及系统之间的交互关系可视化,帮助人们更好地理解业务运作的全…