关于ARM系统中使用EFI_PCI_IO_PROTOCOL时PCI位置异常的问题

问题描述

我正在学习 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 (将#修改为@)