首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何访问PCIe配置空间?(ECAM)

如何访问PCIe配置空间?(ECAM)
EN

Stack Overflow用户
提问于 2019-08-12 07:40:40
回答 2查看 9.6K关注 1票数 5

为了访问PCI配置空间,根据不同的文章使用I/O端口地址0xCF8,0xCFC。

代码语言:javascript
运行
复制
mov eax, dword 0x80000000

mov dx, word 0x0CF8
out dx, eax
mov dx, word 0x0CFC
in eax, dx

上述代码中eax的值是0x12378086,意思是vendor ID = 0x8086device ID = 0x1237

这里有个问题。

Q1.我已经看到这种方法只适用于PCI配置空间。那么,访问PCIe配置空间的另一种方法是什么?

“不能使用遗留的PCI方法(通过端口0xCF8和0xCFC)访问此扩展配置空间”

Express

但其他一些文章说,这种遗留方法也与PCIe配置空间兼容。

这太让人困惑了。

Q2.如果遗留的0xCF8,0xCFC也能与PCIe配置空间一起工作,那么将真正感谢NASM汇编的详细源代码(而不是关于linux),因为我已经看过很多ECAM(增强型配置访问机制)的文章,但它们都是关于概念内容的。

硬件规范:

代码语言:javascript
运行
复制
Motherboard : P775TM1
Processor : Intel i7 8700K
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-12 12:56:17

你读了这句话

无法使用遗留的PCI方法(通过端口0xCF8和0xCFC)访问此扩展配置空间。

脱离上下文。

以下是上下文中的引文(重点是我的引文):

-- PCI总线将配置空间从256个字节扩展到4096字节。不能使用遗留PCI方法(通过端口0xCF8和0xCFC)访问此扩展配置空间。

作者讨论的是从0x100开始的PCIe配置空间的一部分。

在开始时,每个PCI设备函数都有一个256字节的配置空间。

这个空间是在端口0xcf8和0xcfc上使用PCI遗留机制访问的(我们可以忽略两个机制的事实)。

PCIe将这个空间从256个字节扩展到4KiB,并引入了一种新的机制来访问配置空间(全部)。

因此,简单地说:

  • 只有一个4KiB的PCI配置空间。它分为一个PCI3.0兼容区域(从0x000到0x0ff)和PCIe扩展配置区域(从0x100到0xfff)。
  • 有两种访问PCI配置空间的机制。一个是0xcf 8/0xcfc上的遗留机制,另一个是内存映射区域。
  • 遗留机制只能访问兼容性区域(前256个字节)。
  • ECAM可以访问所有的空间。

引用PCIe规范:

per将配置空间扩展到每个函数4096字节,而PCI本地总线规范允许256字节。PCI配置空间被划分为一个与PCI3.0兼容的区域,该区域由函数配置空间的前256个字节组成,而一个PCI扩展配置空间由其余的配置空间组成(参见图7-3)。可以使用PCI规范NdR中定义的机制访问PCI3.0兼容的配置空间:传统配置机制或本节后面描述的PCI增强配置访问机制。使用任何一种访问机制进行的访问都是等效的。PCI Express扩展配置空间只能通过使用ECAM.访问。

它的非常(很可能),英特尔的CPU将支持遗留的PCI配置机制许多年以后。

在内部,生成PCI配置事务(即系统代理/UBox)的uncore部分已经只使用PCIe配置事务(即与ECAM生成的相同的MMCFG类型),但遗留的软件接口没有被删除。

由于PCIe根复合体位于CPU内,所以当涉及到传统的PCI 软件兼容性时,CPU是唯一关心的问题(遗留PCI需要一个PCIe到PCI桥接器,它可能会公开配置机制)。

简而言之,您可以安全地使用遗留的PCI机制访问PCIe配置空间的前256个字节(每个函数)。

实际上,除非Intel找到一种新的方法来配置非核心设备,否则遗留机制将永远不会消失,因为它需要配置ECAM本身。

遗留机制是直接使用的,您已经发布了一些使用它的代码。我不知道还需要什么。

你可以这样使用它:

代码语言:javascript
运行
复制
%define CFG(bus, dev, fun, reg) (0x80000000 | (bus << 16) | (dev << 11) | (fun << 8) | reg)

%macro cfg_arm 4
  mov dx, 0cf8h
  mov eax, CFG(%1, %2, %3, %4)
  out dx, eax
%endmacro

%macro cfg_read 4
  cfg_arm %1, %2, %3, %4
  mov dx, 0cfch
  in eax, dx
%endmacro

%macro cfg_write 5
  cfg_arm %1, %2, %3, %4
  mov dx, 0cfch
  mov eax, %5
  out dx, eax
%endmacro

 cfg_read 0, 0, 0, 0   ;eax <- VID:DID of dev 0, fun 0 on bus 0

这段代码是未经测试的

如果您指的是配置空间的内容(即设置什么),那就太宽泛了。

您可以读取感兴趣的设备的数据表,它们通常记录在PCI规范中定义的标准寄存器。

或者,您可以读取PCI规范本身。

如果你在问如何使用ECAM,请阅读Brendan的答案。

我能补充的唯一一点是,对于您的CPU,您可以通过从CPU的iMC的(旧的) PCI配置空间读取寄存器PCIEXBAR (偏移60h)来找到ECAM的基础(总线0、dev 0、by 0)。

就像这样:

代码语言:javascript
运行
复制
cfg_read 0, 0, 0, 60h       ;Low 32-bit
mov ebx, eax                
cfg_read 0, 0, 0, 64h       ;high 32-bit
shl rax, 32
or rax, rbx                 ;RAX = ptr to ECAM area 

固件已经配置了一切,以正确地使用该区域。

票数 10
EN

Stack Overflow用户

发布于 2019-08-12 09:26:59

Q1。我已经看到这种方法只适用于PCI配置空间。那么,访问PCIe配置空间的另一种方法是什么?

对于80x86个人计算机,实际上有3种访问PCI配置空间的机制。您提到的遗留机制(使用IO端口0x0CF8和0x0xCFC)是“机制#1”。还有另一种名为“机制#2”的遗留机制,它也使用了0x0CF8和0x0xCFC;但是许多芯片组并没有使用它,而且(对于现代计算机)可以被认为是过时的。

最初,每个PCI“函数”的PCI配置空间大小为256字节;对于这两种遗留机制,您只能访问256字节。当他们发明PCI时,他们增加了第三种机制(内存映射的ECAM),他们还将每个PCI“函数”的PCI配置空间增加到4096字节。遗留的“机制#1”仍然可以工作,但仍然只能访问前256个字节(在PCI“函数”可以拥有的4096字节中)。幸运的是,硬件制造商足够聪明地确保旧操作系统需要访问的内容在前256个字节之内,因此不支持PCI的旧操作系统仍然工作(使用“机理#1"),而4096字节(没有ECAM就无法访问)的其余部分主要用于诸如PCI扩展功能。

注意:它有可能有一个" PCI -E到PCI常规“桥接器,与PCI传统设备后桥。在这种情况下,传统的PCI设备/函数将只提供256字节的PCI配置空间,即使它仍然在使用ECAM。

要使用ECAM;您需要使用ACPI的“表索引”(RSDT或XSDT)来找到一个名为"MCFG“的表。可悲的是(除非我上次查看后它已经改变了)这个表不是在ACPI规范中描述的,而是在一个“极其昂贵的”PCI SIG付费墙后面的PCI规范中描述的。希望你能在某个地方找到可靠的第三方描述。

一般来说,MCFG表由描述要用于一系列总线号码的地址范围的条目组成;对于多个不同的总线号码范围,可能有多个不同的地址范围。这样做的想法是使用设备的总线号来查找正确区域的地址;然后将"address_of_area + ((bus - first_bus_for_area) << 20) | (device << 15) | (function << 12)“组合起来,以找到函数的PCI配置空间的起始地址。一旦找到,您就可以在物理页面中读取/写入偏移量/s,以访问函数的PCI配置空间中的相应偏移量。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57457283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档