PCIe知识摘要记录

摘要:
Endpoint处于PCIe总线系统拓扑结构中的最末端,一般作为总线操作的发起者或者终结者。所谓LagacyPCIeEndpoint是指那些原本准备设计为PCI-X总线接口的设备,但是却被改为PCIe接口的设备。而NativePCIeEndpoint则是标准的PCIe设备。其中,LagacyPCIeEndpoint可以使用一些在NativePCIeEndpoint禁止使用的操作,如IOSpace和LockedRequest等。NativePCIeEndpoint则全部通过MemoryMap来进行操作,因此,NativePCIeEndpoint也被称为MemoryMappedDevices。注:无论是PCI还是PCIe,都没有明确规定,第一个使用的BAR必须是BAR0。

摘:

一、

PCIe知识摘要记录第1张

在PCIe的Spec中,并没有特别详细的关于Root Complex的定义,从实际的角度来讲,可以把Root Complex理解为CPU与PCIe总线系统通信的媒介。Endpoint处于PCIe总线系统拓扑结构中的最末端,一般作为总线操作的发起者(initiator,类似于PCI总线中的主机)或者终结者(Completers,类似于PCI总线中的从机)。显然,Endpoint只能接受来自上级拓扑的数据包或者向上级拓扑发送数据包。

所谓Lagacy PCIe Endpoint是指那些原本准备设计为PCI-X总线接口的设备,但是却被改为PCIe接口的设备。而Native PCIe Endpoint则是标准的PCIe设备。其中,Lagacy PCIe Endpoint可以使用一些在Native PCIe Endpoint禁止使用的操作,如IO Space和Locked Request等。Native PCIe Endpoint则全部通过Memory Map来进行操作,因此,Native PCIe Endpoint也被称为Memory Mapped Devices(MMIO Devices)

二、

PCIe的Spec中明确规定只有Root有权限发起配置请求(Originate Configuration Requests),也就是说PCIe系统里面的其他设备是不允许去配置其他设备的配置空间的,即peer-to-peer的配置请求是不允许的。并且配置请求的路由(Routing)方式只能是采用BDF(Bus,Device,Function)。

处理器一般不能够直接发起配置读写请求,因为其只能产生Memory Request和IO Request。这就意味着Root必须要将处理器的相关请求转换为配置读写请求。针对传统的PCI设备(Legacy PCI),采用的是IO间接寻址访问(IO-indirect Accesses);针对PCIe设备,采用的是Memory-Mapped Accesses。

三、

Type0 Header最多有6个BAR,而Type1 Header最多有两个BAR。这就意味着,对于Endpoint来说,最多可以拥有6个不同的地址空间。但是实际应用中基本上不会用到6个,通常1~3个BAR比较常见。

主要注意的是,如果某个设备的BAR没有被全部使用,则对应的BAR应被硬件全被设置为0,并且告知软件这些BAR是不可以操作的。对于被使用的BAR来说,其部分低比特位是不可以被软件操作的,只有其高比特位才可以被软件操作。而这些不可操作的低比特决定了当前BAR支持的操作类型和可申请的地址空间的大小。

一旦BAR的值确定了(Have been programmed),其指定范围内的当前设备中的内部寄存器(或内部存储空间)就可以被访问了。当该设备确认某一个请求(Request)中的地址在自己的BAR的范围内,便会接受这请求。

注:需要特别注意的是,软件对BAR的检测与操作(Evaluating)必须是顺序执行的,即先BAR0,然后BAR1,……,直到BAR5。当软件检测到那些被硬件设置为全0的BAR,则认为这个BAR没有被使用。

注:无论是PCI还是PCIe,都没有明确规定,第一个使用的BAR必须是BAR0。事实上,只要设计者原意,完全可以将BAR4作为第一个BAR,并将BAR0~BAR3都设置为不使用。

关于BAR空间的初始化:

申请一个4KB的NP-MMIO的例子:

PCIe知识摘要记录第2张

申请64MB P-MMIO地址空间的例子:

PCIe知识摘要记录第3张

申请IO地址空间的例子:

PCIe知识摘要记录第4张

参考:http://blog.chinaaet.com/justlxy/p/5100053320

免责声明:文章转载自《PCIe知识摘要记录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle 迁移到clickhouse 45亿条数据4G EPS 中建立 eNB 与 MME 之间的 S1 连接下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

dpdk test + dpdk-procinfo

https://www.geek-share.com/detail/2586671676.html ABI_VERSION buildtools devtools GNUmakefile MAINTAINERS mk app config...

[虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(六)

目的: 1. 为我们自己的watchdog写一个驱动 步骤: 通过之前的介绍,我们很容易猜想到写我们基于PCI的watchdog驱动,可以分2个步骤。 1. 探测加载PCI设备 这部分代码跟我们的设备本身没有任何关系。 我们通过这部分代码,找到 厂商ID为 0x1af4, 设备ID为0x0101的设备。这个设备是我们用qemu中定义我们的watchdog中...

uniapp、Vue组件的使用引用子组件、传值

1 //子组件 bar.vue 2 <template> 3 <div class="search-box"> 4 <div @click="say" :title="title" class="icon-dismiss"></div> 5 </div> 6 </...

PCIE学习笔记--PCIe错误源详解(二)

转载地址:http://blog.chinaaet.com/justlxy/p/5100057799 这篇文章主要介绍事务(Transaction)错误、链路流量控制(Link Flow Control)相关的错误、异常的TLP(Malformed TLP)以及内部错误(Internal Errors)等。 事务(Transaction )错误 事务错误主...

PCIe固态存储和HDD常见的硬盘性能对比测试

2周测试后,导致以下结果 MySQL-OLTP测试结果:(50表。每个表1000广域网数据,1000个线程) TPS:MySQL在PCIe固态存储上执行是在HDD上执行的5.63倍 writes:MySQL在PCIe固态存储上执行是在HDD上执行的5.58倍 reads:MySQL在PCIe固态存储上执行是在HDD上执行的5.55倍 R...

debian内核代码执行流程(一)

 本文根据debian开机信息来查看内核源代码。 系统使用《debian下配置dynamic printk以及重新编译内核》中内核源码来查看执行流程。 使用dmesg命令,得到下面的开机信息: [ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgrou...