EFI Driver Model(中)-PCI 驱动设计

UEFI 驱动类别

1、设备驱动

   必需的设备驱动程序功能

  • 安装驱动程序绑定协议的一个或多个实例的驱动程序入口点。
  • 管理一个或多个控制器句柄。即使驱动程序编写者确信驱动程序只管理一个控制器,也强烈建议将驱动程序设计为管理多个控制器。此功能的开销很低,并且它使驱动程序更可移植。
  • 不产生任何子句柄。这个特性是设备驱动程序和总线/混合动力驱动程序之间的主要区别。
  • 忽略传递到驱动程序绑定协议的受支持的()和启动()服务的RemainingDevicePath参数。
  • 从控制器句柄消耗一个或多个I/O相关协议。
  • 在同一控制器句柄上产生一个或多个与I/O相关的协议。

PCI 驱动设计

  参考、翻译、总结 Driver Writer Guide for UEFI 2.3.1
  有几个类别的PCI驱动程序合作为平台中的PCI控制器提供支持,下表列出这些PCI驱动

驱动类别描述
PCI root bridge driver产生一个或多个 PCI Root Bridge I/O 的实例
PCI bus driver使用PCI Root Bridge I/O协议,为每个PCI控制器生成一个子句柄,并将设备路径协议和PCII/O协议安装到每个子句柄上。
PCI driver使用PCII/O协议,并生成I/O抽象,为启动符合EFI的操作系统所需的控制台和引导设备提供服务。

  本章主要介绍PCI驱动程序的设计和实现
  PCI总线驱动程序使用PCI_ROOT_BRIDGE_IO_PROTOCOL的服务,该服务枚举系统中存在的PCI控制器,可检测到磁盘控制器、图形控制器和USB主机控制器,每个控制器生成一个句柄。因此,PCI总线驱动程序产生了EFI_DEVICE_PATH_PROTOCOL和 EFI_PCI_IO_PROTOCOL的三个子句柄。

  • PCI磁盘控制器的驱动程序使用EFI_PCI_IO_PROTOCOL服务,产生两个包含EFI_DEVICE_PATH_PROTOCOL和EFI_BLOCK_IO_PROTOCOL.的子句柄。
  • 图形控制器的PCI驱动程序使用EFI_PCI_IO_PROTOCOL的服务,产生一个EFI_GRAPHICS_OUTPUT_PROTOCOL.子句柄。
  • USB主机控制器的PCI驱动程序使用EFI_PCI_IO_PROTOCOL的服务来生成EFI_USB_HOST_CONTROLLER_PROTOCOL。USB总线驱动程序将使用EFI_USB_HOST_CONTROLLER_PROTOCOL,为每个USB设备生成子句柄。USB驱动程序将管理这些子句柄。

在这里插入图片描述

1、PCI Root Bridge I/O Protocol Drivers

  针对平台的UEFI固件通常实现一个根桥驱动程序,从而生成PCI根桥I/O协议。此代码是特定于芯片组的,并直接访问产生PCI根桥I/O协议服务的芯片组资源。EDKII中包含了一个带有pc-at兼容芯片组的系统的示例驱动程序。
  这个驱动程序的源代码可以从EDK II的PcAtChipsetPkg/PciHostBridgeDxe找到。

2、PCI Bus Drivers

  EDKII包含一个通用的PCI总线驱动程序。它使用EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL的服务枚举PCI设备并且生成包含 EFI_DEVICE_PATH_PROTOCOL和 EFI_PCI_IO_PROTOCOL的子句柄。源代码可以在
MdeModulePkg/Bus/Pci/PciBusDxe中找到。
  此总线类型可以在 Supported()和Start()服务中解析RemainingDevicePath来支持生成一个子句柄。然而,一次为PCI总线生成一个子句柄通常没有意义。这是因为PCI总线驱动程序需要枚举并分配资源给所有的PCI设备,然后才能生成单个子句柄。
  为所有枚举的PCI设备生成子句柄并不需要太多额外的时间。因此,建议PCI总线驱动程序在第一次调用Start()时产生所有的PCI设备。
  如果将基于UEFI的系统固件移植到一个新平台,那么大多数与pci相关的更改都发生在根桥驱动产生EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL实例的实施中。

3、PCI drivers

  PCI驱动程序使用EFI_PCI_IO_PROTOCOL的服务来生成一个或多个协议,为一个PCI控制器提供I/O抽象。PCI驱动程序遵循UEFI驱动程序模型,所以它们可能是以下任何一种:
;• Device drivers
• Bus drivers
• Hybrid drivers
  图形控制器的PCI驱动程序通常是使用EFI_PCI_IO_PROTOCOL并产生EFI_GRAPHICS_OUTPUT_PROTOCOL的设备驱动程序。USB主机控制器的PCI驱动程序通常是使用EFI_PCI_IO_PROTOCOL并产生EFI_USB_HOST_CONTROLLER_PROTOCOL的设备驱动程序。
磁盘控制器的PCI驱动程序通常是总线驱动程序或混合驱动程序,它们使用EFI_PCI_IO_PROTOCOL和EFI_DEVICE_PATH_PROTOCOL,并使用EFI_DEVICE_PATH_PROTOCOL和EFI_BLOCK_IO_PROTOCOL产生子句柄。
  使用SCSI命令集的磁盘控制器的PCI驱动程序通常会为磁盘控制器生成的每个SCSI通道生成EFI_EXT_SCSI_PASS_THRU_PROTOCOL。

3.1 Supported()

  PCI驱动程序必须实现包含Supported()、Start()和Stop()服务的EFI_DRIVER_BINDING_PROTOCOL。 Supported()服务评估传入的ControllerHandle,以查看控ControllerHandle是否代表PCI驱动程序可以管理的PCI设备。
  实现测试的最常见方法是让PCI驱动程序从PCI控制器检索PCI配置头,并评估设备ID、供应商ID,以及可能的PCI配置头的类代码字段。如果这些字段与PCI驱动程序管理的值相匹配,则Supported()将返回EFI_SUCCESS。否则,Supported()服务将返回EFI_UNSUPPORTED。PCI驱动程序必须仔细,不干扰PCI控制器的状态,因为可能有不同的PCI驱动程序正在管理PCI控制器。

3.2 Start() and Stop()

  针对PCI驱动程序的驱动程序绑定协议的Start()服务也会打开具有EFI_OPEN_PROTOCOL_BY_DRIVER属性的PCII/O协议。Start()连接Driver与Handle,Stop()断开Driver跟Handle之间的连结.

3.3 PCI Cards with Multiple PCI Controllers

  一些PCI设备在单个设备上有一系列相同的设备,通常在PCI桥后面。如果这些设备需要由UEFI驱动程序的单个实例来控制,那么它们可能需要额外的工作。以下图作为设备的示例。
在这里插入图片描述
可能要求选项ROM中的驱动程序控制PCI设备上的所有3个控制器。为此,请使用以下操作:

  • .在“ Supported()”函数中,确保UEFI驱动程序支持传递到“ Supported()”函数中的控制器。传入的第一个控制器可以是PCI卡上的任何一个控制器。
  • 在“Supported()”函数中,确保该函数没有触摸或更改HW状态。这很重要。如果PCII/O实例已经打开(如果一些其他的应用程序或驱动程序已经在管理控制器),则返回一个错误。
  • 在PCI卡上的第一个控制器的Start()函数中,使用EFI_OPEN_PROTOCOL_BY_DRIVER属性打开同一PCI卡上的其他句柄上的PCII/O协议实例。这将通知该平台上的所有其他UEFI驱动程序,即PCI卡上的所有控制器都已被管理。
  • 在Stop()函数中,撤销在Start()中完成的所有操作。在这些更复杂的用例中,使用私有上下文数据结构来跟踪完成Stop()操作所需的信息。

3.4 访问PCI资源

   PCI驱动程序应该只访问它们所管理的PCI控制器上的I/O和内存映射的I/O资源。通过PCI I/O协议提供的另一个重要资源是PCI选项ROM的内容。PCI I/O协议的RomSize和RomImage字段提供了对PCI选项ROM内容的副本的访问。如果PCI驱动程序需要来自PCI选项ROM的内容的附加信息,则这些字段可能很有用。

4、PCI Option ROM Images

  EDKII提供了一些工具来帮助开发针对PCI适配器的UEFI驱动程序。一旦UEFI驱动器的PCI适配器建立,他们需要打包成PCI选项ROM兼容的图像格式。存储在PCI选项rom中的UEFI驱动程序会在PCI枚举期间由PCI总线驱动程序自动加载和执行。
  EfiRom实用程序对UEFI驱动程序执行一些基本检查,以验证它们是有效的PE/由微软便携式可执行文件和公共对象文件格式规范定义的COFF图像的。如果任何这些检查失败,该实用程序将中止,而不创建输出ROM映像文件。例如,在UEFI驱动程序上执行以下检查:

  • 验证DOS存根魔术值为0x5A4D
  • 验证PE签名是否为“PE\0\0”
  • EfiRom实用程序还执行对PC BIOS遗留选项ROM图像的基本检查。如果任何这些检查失败,该实用程序将中止,而不创建输出ROM映像文件。对PC BIOS legacy 选项ROM执行以下检查:
  • 验证选项ROM标头的签名是否为0xAA55
  • 验证对PCI数据结构的偏移量是否在文件大小的范围内。
  • 验证PCI数据结构的签名为“PCIR”。

  PCI总线驱动程序返回图像句柄的顺序与在PCI选项ROM中找到UEFI驱动程序的顺序相匹配,从最低地址到最高地址。
PCI总线驱动程序负责枚举PCI总线上的PCI设备。当发现一个PCI设备时,系统也会检查该PCI设备,以查看它是否有一个附加的PCI选项ROM。
PCI选项ROM内容必须遵循PCI规范来存储一个或多个图像。PCI总线驱动程序在PCI选项ROM中的图像列表,寻找UEFI驱动程序。如果找到一个UEFI驱动程序,可以选择使用解压协议解压缩它,然后使用UEFI启动服务LoadImage()和 StartImage()调用驱动程序入口点。如果LoadImage()没有返回错误,则必须在调用UEFI驱动程序()服务后,在该PCI设备返回的总线特定驱动程序覆盖协议列表的末尾。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值