EFI Driver Model(中)-PCI 驱动设计
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()操作所需的信息。
4、PCI Option ROM Images
??EDKII提供了一些工具來幫助開發針對PCI適配器的UEFI驅動程序。一旦UEFI驅動器的PCI適配器建立,他們需要打包成PCI選項ROM兼容的圖像格式。存儲在PCI選項rom中的UEFI驅動程序會在PCI枚舉期間由PCI總線驅動程序自動加載和執行。
總結
以上是生活随笔為你收集整理的EFI Driver Model(中)-PCI 驱动设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊天系统服务器端类图,使用Java多线程
- 下一篇: iReport连接数据库