0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PCIe—Bar空间是怎么生效的?

冬至子 来源:Spinal FPGA 作者:玉骐 2023-07-03 17:47 次阅读

最近在研究cocotbext-pcie的实现,对于学习PCIe还是挺有帮助的,陆陆续续做个总结,有时间也会在SpinalHDL下实现类似的方针功能。

》抛砖

PCIe接口相对来讲还是打交道比较多的接口。无论是Intel还是Xilinx的IP也都接触到过。谈及PCIe,就不可避免地涉及Bar空间。当然厂商的IP还是包装的可以的,我们直接配置就行。但在使用时关于Bar空间的配置,往往牵涉到这么几个概念:

  • IO/Mem
  • Prefetchable
  • 32位/64位
    早前这东西不假思索,抄抄之前的设计照着配置就好了。乍看pcieext-cocotb中的实现,不禁思索,这些参数软件是如何识别的呢?像下面EP常涉及的配置空间:

image.png

配置空间中所涉及到的只有6个Base Address Registers,似乎并无很明显的指示~

》协议解读

先来看看Spec中关于Base Address Registers的定义:

image.png

关于如何区分是Mem空间还是IO空间,Spec中定义了:

bit0:为1表示Memory Space,为0则表示I/O Space。

(I/O空间仅支持32位,且现在PCIe设备里也较少使用,这里不再展开,感兴趣小伙伴可自行翻看Spec)

对于Memory类型空间,bit[3:0]均为只读。在bit[2:1]中定义了Memory类型空间

image.png

可见,当bit[2]为1时表示64位地址空间,否则为32位地址空间。

而当bit[3]为1时,表示该Bar空间为Prefetchable,为0则不是非prefetchable。

看到这里,上面的疑问也基本可以解答了。在cocotbext-pcie中的配置方式也有所验证:

image.png

》Prefetchable

关于Prefetchable这个属性,一直也没有非常清晰的认识。按照Spec中的定义:

A Function is permitted to mark a range as prefetchable if there are no side effects on reads, the Function returns all bytes on reads regardless of the byte enables, and host bridges can merge processor writes into this range without causing errors.

Any device that has a range that behaves like normal memory should mark the range as prefetchable. A linear frame buffer in a graphics device is an example of a range that should be marked prefetchable.

一般而言,在PCIe设备里,Bar空间基本用于实现寄存器读写,是基本符合上面所描述的情况的,所以配置成prefetchable还是有必要的。而且在spec中,也提到了:

PCI Express adapters with Memory Space BARs that request a large amount of non-prefetchable Memory Space(e.g., over 64 MB) may cause shortages of that Space on certain scalable platforms, since many platforms support a total of only 1 GB or less of non-prefetchable Memory Space.This may limit the number of such adapters that

can be supported on those platforms. For this reason, it is especially encouraged for BARs requesting large amounts of Memory Space to have their Prefetchable bit Set, since prefetchable Memory Space is more bountiful on most scalable platforms.

On PCI Express systems that meet the criteria enumerated below, setting the Prefetchable bit in a candidate BAR will still permit correct operation even if the BAR’s range includes some locations that have read side-effects or cannot tolerate write merging. This is primarily due to the fact that PCI Express Memory Reads always contain an

explicit length, and PCI Express Switches never prefetch or do byte merging. Generally only 64-bit BARs are good candidates, since only Legacy Endpoints are permitted to set the Prefetchable bit in 32-bit BARs, and most scalable platforms map all 32-bit Memory BARs into non-prefetchable Memory Space regardless of the Prefetchable bit value.

这里贴上Spec中的原话,总结起来:尽可能配置成64 bit prefetchable.

》Bar空间的初始化

对于Bar空间,其核心除了上述的属性检测外另一重点便是为Bar空间分配指定大小的地址空间。

对于Base Address Registers,Bar空间的大小只能配置成2的n次方。以32位Memory 空间为例,其可配置的范围是16Byte~2GB(低四bit用于设置Bar空间属性)。对于指定大小所占用的位,其只读并且始终为0,若没有被使用,则其会返回全0。在初始化时软件可以向Bar空间写全1然后回读。对于读会的数据,将低4bit清零,然后所有bit取反后加1即为对应的Bar空间大小。分配好地址空间好将Base地址写回到Base Address Registers中~

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HDL语言
    +关注

    关注

    0

    文章

    46

    浏览量

    8908
  • PCIe接口
    +关注

    关注

    0

    文章

    120

    浏览量

    9674
收藏 人收藏

    评论

    相关推荐

    6678通过pcie进行boot时,PC无法写bar空间

    我使用windriver开发了pcie的驱动,可以通过windriver看到分配的bao0和bar1空间,其地址范围对应的是DDR3的空间,此时出现问题:可以通过windriver对
    发表于 03-28 16:06

    求教:关于DM8168的PCIe寄存器

    :                1.如何将DM8168 PCIe寄存器(地址是0x51000000)映射到它的内核空间,这样我就可以在内核空间通过访问其对应的虚拟地址查看PCIe寄存
    发表于 05-28 01:52

    关于PCIEBAR配置的问题。

    \drv\exampleProjects\PCIE_exampleProject 里面的例子 这个工程可以成功跑起来,并且在PC端通过用WinDriver可以看到设备,但是目前有一个关于例程中BAR配置
    发表于 06-19 00:50

    关于C6678的PCIEBAR配置问题

    设备。现在有几个问题想要搞明白: 1.pdk的PCIE例程中配置了bar1基地址为0x70000000,我通过WinDriver查看bar1基地址也是0x70000000,然后用WinDriver在
    发表于 06-19 04:33

    C6657 PCIE 问题咨询

    link 完成后, 在本地PCIE config空间映射的 EP端的config空间, 后续初始化EP端Bar base地址的时候,就是操作 gpPCIE_remote_EP_reg
    发表于 06-21 18:49

    C6678,PCIeBAR的地址范围

    it to the internal bus side.” 1.这段话的大概意思是说PCIe接收数据包是有条件的,只有数据包中的PCIe地址在BAR配置的地址范围内时,PCIe模块才
    发表于 06-21 18:17

    如何通过BAR0和BAR1访问(读/写)寄存器?

    各位大家好,我正在尝试使用我在Xilinx论坛下载的SP605连接套件参考设计,我阅读了用户指南:我了解了如何通过BAR0和BAR1访问(读/写)寄存器,但我不明白如何通过PCIe(当然还有DMA
    发表于 07-09 08:40

    如何使用AXI-PCIe桥接IP与我的逻辑进行通信

    嗨,我正在使用AXI-PCIe桥接IP与我的逻辑进行通信。我的poroject要求有128K内存。我不知道如何配置AXI BAR地址来扩展内存。我阅读了IP文档,但没有任何意义。目前我能够从具有32K PCIe
    发表于 06-19 10:14

    关于PCI9054在BAR3空间读取SDRAM数据地址需要*4的问题

    板卡集成了16M*32Bit的SDRAM, 可通过BAR空间+页地址访问。BAR3空间在本协议中规定为1M*32Bit的空间。所有的SDR
    发表于 05-14 16:23

    如何解决PCIe采集卡在3588J开发板无法进行大容量高端BAR Memory空间分配的问题

    | 一、贵司3588J开发板,4x PCIe插槽插入我司的PCIe采集卡,无法进行大容量64MB的高端 BAR Memory地址空间分配问题:1、lspci、lspci -vvv 及相
    发表于 10-20 14:56

    IMX8 PCIE BAR 15没有空间是怎么回事?

    0x18900000-0x1890ffff pref][5.246523] pci 0000:01:00.0:BAR 0:[mem size 0x400000000 64bit pref]没有空间[5.254191
    发表于 04-11 06:30

    体验紫光PCIE之使用WinDriver驱动紫光PCIE

    可以表明主机与FPGA硬核能够链接成功,link_up后主机内核程序可以读到PCIE的配置空间信息,进而给FPGA的PCIE分配PCIE总线域空间
    发表于 11-17 14:35

    PCIeBar空间是怎么生效

    PCIe接口相对来讲还是打交道比较多的接口。无论是Intel还是Xilinx的IP也都接触到过。
    的头像 发表于 06-05 10:47 6464次阅读
    <b class='flag-5'>PCIe</b>—<b class='flag-5'>Bar</b><b class='flag-5'>空间</b>是怎么<b class='flag-5'>生效</b>的

    PCIe相关问题解答

    CPU 发起的,访问PCIe设备配置空间的数据流。这种数据流主要是BIOS/Linux PCIe driver 对设备进行初始化、资源分配时,读写配置空间的。包括
    的头像 发表于 09-15 09:39 1599次阅读
    <b class='flag-5'>PCIe</b>相关问题解答

    PCIEBAR空间介绍

    PCIE是一种高速串行总线接口标准,用于连接计算机内部的各种外设和组件。在PCIe架构中,BAR(Base Address Register)空间是用于映射I/O端口或内存地址
    的头像 发表于 04-22 11:00 4013次阅读