问题描述
我正在学习 PCI 并尝试使用 EFI_PCI_IO_PROTOCOL 和 EDK2 编写一个在 UEFI 环境中列出 PCI 控制器的应用程序。我想从 Configuration Space Header 和每个实例的 Bus/Device/Function 位置列出一些信息。
我正在执行应用程序的系统是一个 ARM,它有一个高通 骁龙 SoC。该代码只是定位 EFI_PCI_IO_PROTOCOL 的所有句柄并从每个句柄读取一些信息,如以下代码片段所示:
EFI_GUID gPciIo = EFI_PCI_IO_PROTOCOL_GUID;
EFI_PCI_IO_PROTOCOL *PciIo;
...
// Locate all handles with PciIo protocol
gBS->LocateHandleBuffer(ByProtocol,&gPciIo,NULL,&NoHandles,&Buffer);
// Scan all found handles
for (Index = 0,Count = 0; Index < NoHandles; Index++) {
// Get PciIo protocol for current handle
gBS->HandleProtocol (Buffer[Index],(VOID**) &PciIo);
// Get some PCI information
PciIo->Pci.Read (PciIo,EfiPciIoWidthUint8,0x00,2,&vendorId);
...
// Check if vendorId is different from 0xFFFF
...
// Get location
PciIo->GetLocation (PciIo,&Segment,&Bus,&Device,&Function);
// Show PCI information
...
}
从EFI_PCI_IO_PROTOCOL中检索到的信息好像还可以,除了GetLocation的一些USB控制器句柄返回的信息,如下:
Class: Serial Bus Controller
Subclass: USB Controller
Bus: 0xFF
Device: 0x80
Function: 0x00
Class: Serial Bus Controller
Subclass: USB Controller
Bus: 0xFF
Device: 0x81
Function: 0x00
Class: Serial Bus Controller
Subclass: USB Controller
Bus: 0xFF
Device: 0x82
Function: 0x00
我的问题是:
1 - 我不熟悉 PCI,但据我所知,最大设备号是 32,因为它来自 5 位字段,我说得对吗?如果是这样,它怎么可能是 0x80、0x81 或 0x82,可能是 EFI_PCI_IO_PROTOCOL 代码中的错误还是我遗漏了什么?
2 - 通常,总线编号使用从 0 开始的序列号(再次验证),并且由于它是一个简单的小型系统,只有很少的 PCI 组件(它没有 255 条总线),总线的数字 0xFF 表示什么?
PS:UEFI Shell 中的“pci”命令不会显示这些 USB 控制器,但“devtree”命令会显示这些具有相同设备/功能编号的 USB 控制器。
非常感谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)