(DXE_DRIVER)PciHostBridge
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.
相关文章:

(DXE_DRIVER)PciHostBridge
UEFI-PciHostBridge 1、PciHostBridge简介 PciHostBridge: 提供PCI配置空间,IO,MEM空间访问接口以及统一维护平台相关的PCI资源,提供gEfiPciHostBridgeResourceAllocationProtocolGuid,创建RootBridge等为PciBusDxe提供服务; 2、PciHostBridge 配置空间 PCI桥可管理其下PCI子…...

SpringMVC的增删改查的案例
目录 前言: 1.总体思路: 2.前期准备 3.前台页面 前言: 我们今天来学习研究SpringMVC的增删改查,希望这篇博客能够帮助正在学习,工作的你们!!! 1.总体思路: 首先我们得…...

golang入门笔记——nginx
文章目录 Nginx介绍Nginx的安装Nginx文件Nginx反向代理负载均衡nginx动静分离URLRewrite防盗链nginx高可用配置安全性Nginx限流Nginx缓存集成Lua脚本OpenRestry Nginx介绍 Nginx是一个高性能的HTTP和反向代理服务器,特点是占用内存少,并发能力强&#x…...

最新报告!TikTok 市场小家电大商机,GMV破亿的爆款如何复制?
近期,新锐小家电品牌Gaabor空气炸锅在东南亚卖爆了,单款商品GMV短时间内突破两亿,在印尼、泰国、马来西亚、菲律宾、越南均开设本土TikTok 小店,增长势头还在持续。 但Gaabor并不是个例。 整个东南亚家电市场规模增长迅速&#…...

功能定义-紧急制动系统
功能简介 紧急制动系统的触发过程如上图所示: 安全距离报警:当两车距离较近时,会给予驾驶员相应提示 预报警:当两车存在碰撞风险但风险较低【Danger Level1】时,会给予驾驶员提示【提示相比之前更为明显】 制动预填充&…...
Map与Set的区别
map与set是一种进行搜索的数据结构。 一 Map map存储的是key-value的键值对。 1 map中的常见方法 方法作用put(key,value)向map中存放key-value键值对get(key)根据key值得到value值getOrDefault(key,value)获取值为key的value,若不存在,则将key值对应…...

基于uwb和IMU融合的三维空间定位算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................................................kkk 0; for E…...

Visual Studio 2019下使用C++与Python进行混合编程——环境配置与C++调用Python API接口
前言 在vs2019下使用C与Python进行混合编程,在根源上讲,Python 本身就是一个C库,那么这里使用其中最简单的一种方法是把Python的C API来嵌入C项目中,来实现混合编程。当前的环境是,win10,IDE是vs2019,python版本是3.9,…...

STM32F4X RTC
STM32F4X RTC 什么是RTCSTM32F4X RTCSTM32F4X RTC框图STM32F4X RTC计数频率STM32F4X RTC日历STM32F4X RTC闹钟 STM32F4X RTC例程 什么是RTC RTC全程叫Real-Time Clock实时时钟,是MCU中一个用来计时的模块。RTC的一个主要作用是用来显示实时时间,就像日常…...

[git] 如何克隆仓库,进行项目撰写,并绑定自己的远程仓库
摘要:删除.git文件,才可重新绑定远程仓库。 具体步骤: 文件夹右键,进入”Git Bash Here“执行命令 1. 执行 ”git clone 仓库地址“,克隆仓库 2. 在生成的仓库中,删除 .git 文件 3. git init 初始化仓库…...

【C++】模拟实现二叉搜索树的增删查改功能
个人主页:🍝在肯德基吃麻辣烫 我的gitee:C仓库 个人专栏:C专栏 文章目录 一、二叉搜索树的Insert操作(非递归)分析过程代码求解 二、二叉搜索树的Erase操作(非递归)分析过程代码求解…...

Yolov8-pose关键点检测:模型轻量化创新 | ScConv结合c2f | CVPR2023
💡💡💡本文解决什么问题:ScConv(空间和通道重建卷积),一个即插即用的架构单元,可以可以直接用来替代各种卷积神经网络中的标准卷积。 ScConv | GFLOPs从9.6降低至9,参数量从6482kb降低至6479kb Yolov8-Pose关键点检测专栏介绍:https://blog.csdn.net/m0_637742…...
【洛谷 P1060】[NOIP2006 普及组] 开心的金明 题解(动态规划+01背包)
[NOIP2006 普及组] 开心的金明 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说…...
什么是CI/CD:持续集成与持续交付?(InsCode AI 创作助手)
在现代软件开发领域,CICD(Continuous Integration and Continuous Delivery)是一种关键性的开发实践,它有助于提高软件交付的质量和效率。本文将深入探讨CICD的定义、原理和重要性,以及如何在项目中实施CICD流程。 什…...

redis 高可用
Redis 高可用 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供…...
什么样的词条可以创建维基百科?
维基百科在国内用得比较少,有一些特殊原因,维基百科的控制权海外,目前维基百科和谷歌是一样的,在国内是无法正常访问的。但做海外推广的朋友都是知道维基百科的,小马识途营销顾问认为它在世界互联网领域的地位…...

poll epoll初学习
正是select这些缺点,才有了poll 1.I/O多路转接之poll 2.I/O多路转接之epoll 其中的struct epoll_event:...

BMS电池管理系统——电芯需求数据(三)
BMS电池管理系统 文章目录 BMS电池管理系统前言一、有什么基础数据二、基础数据分析1.充放电的截至电压2.SOC-OCV关系表3.充放电电流限制表4.充放电容量特性5.自放电率 总结 前言 在新能源产业中电芯的开发也占有很大部分,下面我们就来看一下电芯的需求数据有哪些 …...
【uniapp】关于小程序输入框聚焦、失焦(输入法占位)的问题
聊天小程序,界面带有输入框,当输入框中聚焦后,底部自动谈起输入法。此时输入框也要随之出现在输入法上方。默认情况下,输入框此时会被输入法覆盖掉。 以下是亲自实践,解决这个问题的方法: 一、小程序大概…...

MySQL的故事——创建高性能的索引
创建高性能的索引 文章目录 创建高性能的索引一、索引基础二、索引的优点三、高性能的索引策略 一、索引基础 要理解MySQL中索引是如何工作的,最简单的方法就是去看看一本书的“索引 ”部分:如果在一本书中找到某个特定主题,一般会先看书的“…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...