(DXE_DRIVER)PciHostBridge

news2024/9/21 4:21:56

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/988371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

table 单元格中嵌套子表格 样式撑开问题

如图,表格中的td嵌套表格,里边表格把外层撑开,不能按100%显示; 解决办法 给父级table 加一个table-layout:fixed;样式

Tomcat启动! 一文带你知道什么是Tomcat以及如何安装

前言: Tomcat(全称为Apache Tomcat)是一个开源的Java Servlet容器,也是JavaServer Pages(JSP)的引擎。它是Apache软件基金会的一个项目,用于使Java应用能够在Web服务器上运行。Tomcat充当Web服务…

小节2:Python数学运算

1、Python的运算优先级顺序和平时数学中的一样,都是先括号,再乘方,再乘除,再加减。 PS:乘方符号再Python中用**表示,如2的三次方用2**3表示 2、用Python做更高级的运算(如:三角函数…

敏捷开发、V模型开发、瀑布模型

在软件开发领域,敏捷开发和V模型开发是两种主要的开发方法。它们之间的差异主要体现在开发过程的结构和组织方式上。在以下讨论中,我们将深入探讨这两种方法的特点和差异。 敏捷开发 敏捷开发是一种迭代和增量的软件开发方法,它强调灵活性和…

IDEA新建的Moudle失效显示为灰色

现象:IDEA新建的Moudle失效显示为灰色!!! 解决方案: 1. 右键点击父模块,选择Open Moudle Settings: 2. 点击加号,选择Import Moudle - 导入模块: 3. 找到对应模块的po…

GPT-人工智能如何改变我们的编码方式

在本文中,您将找到我对人工智能和工作的最新研究的总结(探索人工智能对生产力的影响,同时开启对长期影响的讨论),一个准实验方法的示例(通过 ChatGPT 和 Stack Overflow 进行说明,了解如何使用简…

怎么看电脑是32位还是64位?3个方法教会你

在计算机应用领域,32位和64位是两种不同的架构,涉及到操作系统、软件兼容性等方面。了解自己的计算机是32位还是64位可以帮助您更好地选择合适的软件和操作系统版本。可是怎么看电脑是32位还是64位呢?本文将为您介绍3个方法,以便轻…

微信新功能,图片直接一键生成Excel表格

前几天微信推出了一个新功能上了热搜,那就是图片转表格。 打工人应该接到过老板的这类需求: 丢张图片给你,甚至是丢一份纸质文件给你,然后要你把它做成 Excel 电子表格。 这个时候,如果你真的一个一个字输入到 Excel 里…

实现自动化生产的产品老化监测—模拟量数据采集

随着自动化生产的发展,产品老化监测成为提高产品质量和稳定性的重要环节。本文将介绍如何通过模拟量数据采集和上位机通信,实现自动化生产中产品老化监测的解决方案,从而帮助客户的产品更加稳定可靠。一、模拟量数据采集的流程在自动化生产中…

【算法专题突破】双指针 - 四数之和(8)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:18. 四数之和 - 力扣(Leetcode) 这道题跟三数之和也是一样的, 题目很好理解,就是四个数的和等于target的情况&#xff0c…

毕业设计基于Springboot+layui+mysql实现的在线考试系统源代码+数据库+部署文档

完整代码下载地址:基于Springbootlayuimysql实现的在线考试系统源代码数据库部署文档 1. 部署相关 1.1. 介绍 一个 JAVA 实现的在线考试系统,主要实现一套基于不同类型的客观题,进行自动组卷、批卷等功能的考试系统(没有主观题) 1.2. 系统…

开启全新教学模式!vLive虚拟直播如何赋能线上教培

 如今,教培领域正在经历一场数字化的变革。随着科技的迅猛发展,教培形式也在不断演变,越来越多的企业和讲师开始采用虚拟直播来进行在线教学。那么,vLive虚拟直播https://live.vsochina.com/cnvLive虚拟直播是如何赋…

Openresty(Nginx)内网安装,手把手详细教学+附安装包

Openresty(nginx)配置文档 一、基础Linux指令 查看nginx进程是否启动:ps -ef | grep nginx 关闭防火墙:systemctl stop firewalld 开放80端口:firewall-cmd --zonepublic --add-port80/tcp --permanent 关闭80端口&am…

谁在爬我的网站?我要“炸”了他

如果你曾经搭建过自己的网站,那么你一定对网络爬虫感到无比的烦恼。这些爬虫每天都在大量的访问你的网站,频繁且毫无节制地消耗你的服务器资源。那么,今天我们就来探讨一下,如何“干死”这些爬虫的服务器。 注意:本文…

2023高教社杯数学建模C题思路代码 - 蔬菜类商品的自动定价与补货决策

# 1 赛题 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此, 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

如何配置群辉相册Synology Photos实现公网访问并与朋友共享照片

文章目录 前言本教程解决的问题是:按照本教程操作完成能够达到的效果是:1.在群辉中下载并安装Synology Photos套件2.设置共享文件夹3.添加您想共享的照片4.cpolar搭建隧道5.公网ip地址访问您的分享相册6.移动端app使用公网上传照片并及时分享 前言 很多…

谷粒商城----Nginx篇

一、正向代理和反向代理 🚩正向代理和反向代理是两种常见的代理服务器模式,用于在网络通信中起到中介的作用。 🏴正向代理(Forward Proxy): 正向代理是在客户端和目标服务器之间充当中介的代理服务器。客…

ADW300物联网电表支持MODBUSTCP协议、MQTT协议-安科瑞黄安南

摘要 随着通信技术的应用越来越广泛,具有通信功能的电子产品越来越多,同时也随着Wi-Fi无线覆盖网络区域的形成,如何利用无线网络覆盖广、带宽高、低使用费率的优势组建物联网系统,变成了一个很实际的问题。 安科瑞也紧跟趋势推出…

旅游需求井喷,抖快书强势涌入,OTA如何制胜下半场?

文 | 螳螂观察 作者 | 图霖 自年初起就逐步恢复的旅游行业,这个暑期迎来意料之中的小高潮。 显著表现是,携程、同程等头部OTA平台迎来订单量大涨。 携程发布的数据预订大数据显示,截至6月14日,平台的暑期亲子订单量同比去年超…

vue3:22、vue-router的使用

import { createRouter, createWebHistory } from vue-router//history模式:createWebHistory //hash模式:createWebHashHistory//vite中的环境变量 import.meta.env.BASE_URL 就是vite.config.js中的base配置项 const router createRouter({history:…