1.PCIe ECAM机制

PCI Express Enhanced Configuration Access Mechanism (ECAM)是访问PCIe配置空间的一种机制。是将PCIe的配置空间映射到MEM空间,使用MEM访问其配置空间的一种实现。可参考NCB-PCI_Express_Base_5.0r1.0-2019-05-22.pdf的第7.2.2小节。
其地址映射如下图所示:

根据上图,可以根据一个PCIe设备的BDF得到其配置空间偏移地址:

#define PCI_ECAM_ADDRESS(Bus,Device,Function,Offset) \(((Offset) & 0xfff) | (((Function) & 0x07) << 12) | (((Device) & 0x1f) << 15) | (((Bus) & 0xff) << 20))

2.PCIe ECAM基地址

查看一台主机是否支持PCIe ECAM机制,可通过以下命令查看:

  • 2.1.对于x86主机:
sudo cat /proc/iomem | grep MMCONFIG

若支持ECAM,则会出现类似以下字段:

f8000000 - fbffffff : PCI MMCONFIG 0000 [bus 00-3f]

其中0xf8000000就是该主机下PCIe ECAM的基地址。加上PCI_ECAM_ADDRESS(bus, device, func, reg),就得到了指定PCIe设备的物理地址,可以使用此地址直接访问其配置空间。

  • 2.2.对于ARM64主机:
sudo cat /proc/iomem | grep ECAM

若支持ECAM,则会出现以下字段:

40000000-4fffffff : PCI ECAM

其中0x40000000就是该主机下PCIe ECAM的基地址。加上PCI_ECAM_ADDRESS(bus, device, func, reg),就得到了指定PCIe设备的物理地址,可以使用此地址直接访问其配置空间。

3.linux下使用devmem2工具读取PCIe配置空间的寄存器。

  • 3.1 devmem2读数据用法

    devmem2 address [ type ]
    

    参数说明:
    address : 物理地址
    type :要访问的数据类型 : [b]yte, [h]alfword, [w]ord

  • 3.2.devmem2写数据用法

    devmem2 address type data
    

    参数说明:
    address : 物理地址
    type :要访问的数据类型 : [b]yte, [h]alfword, [w]ord
    data :想要写入的数据

  • 3.3.devmem2读写BDF=1:0:0的PCIe的配值空间,假设ECAM_BASE = 0x40000000
    3.3.1. 读取venderid和deviceid,reg =0x00:
    offset = PCI_ECAM_ADDRESS(1, 0, 0, 0) = 0x100000

    sudo devmem2 0x40100000 w
    

    3.3.2. 读取BAR0,reg =0x10:
    offset = PCI_ECAM_ADDRESS(1, 0, 0, 0x10) = 0x100010

    sudo devmem2 0x40100010 w
    

    3.3.3. Enable Expansion ROM,reg =0x30:
    offset = PCI_ECAM_ADDRESS(1, 0, 0, 0x30) = 0x100030
    获取Expansion ROM基地址:

    sudo devmem2 0x40100030 w
    

    假设读出的值为0x60800000。
    以下命令使能Expansion ROM

    sudo devmem2 0x40100030 w 0x60800001
    

4.linux内核中对ECAM的实现

代码路径:drivers\pci\ecam.c

PCIe ECAM机制访问PCIE的配置空间相关推荐

  1. pcie 的function_PCIe扫盲——BDF与配置空间

    前面的文章中介绍过,每一个PCIe设备可以只有一个功能(Function),即Fun0.也可以拥有最多8个功能,即多功能设备(Multi-Fun).不管这个PCIe设备拥有多少个功能,其每一个功能都有 ...

  2. PCIE设备访问及其配置空间

    早期的PCI时期,系统为每个PCI设备分配的内存大小仅有256个Bytes.到后来的PCIE时期,随着设备性能增强,PCIE设备的配置空间扩展至4K个Bytes.在这里需要注意: PCIE一共支持25 ...

  3. 7.PCIE配置空间读写软件

    软件-7.PCIE配置空间读写 软件-7.PCIE配置空间读写 软件-7.PCIE配置空间读写 软件读写配置空间 驱动层接口 原理分析 驱动层代码接口 驱动层接口与原理 相关参考 基础知识 raw_p ...

  4. PowerPC下PCI、PCI-E设备的配置空间

    PCI总线规定访问配置空间的总线事务,称为配置读写事务.不同于存储访问事务使用存储地址访问,而是使用ID号来寻址访问PCI配置空间. PCI设备的ID号由总线号(BUS NUMBER).设备号(DEV ...

  5. pci配置基地址_PCI/PCIe基础——配置空间

    简介 PCI/PCIe设备有自己的独立地址空间,这部分空间会映射到整个系统的地址空间. 映射地址在BIOS/UEFI下指定(如果有的话,对于使用非BIOS启动的OS,不清楚),它有两种类型,一种是MM ...

  6. PCI Express解析——系列文章【5】:PCIe原理分析之——PCI Express 配置解析(BDF、BAR)、 MEM Read举例

    PCI Express解析--系列文章[5]:PCIe原理分析之--PCI Express 配置解析BDF.BAR. MEM Read举例 2.5 Memory Read举例 (1)事务层TLP包准备 ...

  7. pci配置基地址_PCI配置空间简介

    配置空间 操作系统 PCI总线推出以来,以其独有的特性受到众多厂商的青睐,已经成为计算机扩展总线的主流.目前,国内的许多技术人员已经具备开发PCI总线接口设备的能力.但是PCI总线的编程技术,也就是对 ...

  8. PCI设备与PCI桥的配置空间

    PCI配置空间 HOST主桥通过配置读写事务报文访问设备的配置空间,PCI总线规定了三种类型的PCI配置空间.配置空间中出现的地址都是PCI总线域的地址. (1)Agent设备配置空间 (2)Brid ...

  9. [转]PCI配置空间简介

    PCI配置空间简介  作者:敏行 PCI有三个相互独立的物理地址空间: 设备存储器地址空间. I/O地址空间和 配置空间. 配置空间是PCI所特有的一个物理空间.由于PCI支持设备即插即用,所以PCI ...

最新文章

  1. 【Task】- JVM逃逸分析等待学习任务
  2. python之print实践
  3. java dispose事件_Android-在 ViewModel 中使用 AutoDispose2 解决 RxJava 的内存泄露问题
  4. Linux Shell处理文本最常用的工具大盘点
  5. 推荐一些不错的公众号【二】
  6. 【优化算法】蛾群优化算法(MSA)【含Matlab源码 1807期】
  7. Java从入门到放弃系列
  8. 罗振宇跨年演讲全文、PPT、图解
  9. 移植littleVGL到STM32(个人笔记)
  10. Angular ng命令
  11. K2 BPM平台应用价值(上篇):统一的流程管理平台对企业有多重要?|工作流平台
  12. 【论文简述】Rethinking Depth Estimation for Multi-View Stereo: A Unified Representation(CVPR 2022)
  13. 镭速传输荣获“2021年度优秀软件产品”称号
  14. 【Spring Web教程】SpringBoot 整合SpringFox-SwaggerUI 3
  15. 姚期智亲任主编,正规军的高中AI教材来了
  16. 手机怎样和宽带连接无线路由器设置路由器连接服务器,怎么用手机设置无线路由器...
  17. js 递归算法将扁平数据处理成树状数据
  18. python:HTTPX 库的快速开始
  19. html点击自动复制功能,html5页面如何实现点击复制的功能
  20. sm3算法 java_“国密加密算法”SM系列的C#实现方法

热门文章

  1. 优缺点 快速扫描 硬盘监测_有了这6款mac硬盘检测工具 你就能够快速检测磁盘的状态和错误情况...
  2. 【办公】关于←(Backspace)退格键和Delete键盘的区别
  3. 智能手表,能否成为苹果的二次革命?
  4. 哈工大计算机网络Mooc 第十一章笔记(局域网)
  5. 2018,我在保险公司当卧底--本文长期更新
  6. HTML+CSS 编辑的(多列布局、相册、百度首页)、盒子模型
  7. txt文本的魔数到底是多少
  8. Android反编译工具的使用-Android Killer
  9. 说说C/C++编译的那些事儿
  10. prometheus 配置服务器监控、服务监控、容器中服务监控与告警