PCIe ECAM机制

news/2025/1/16 14:40:52/

✅作者简介:嵌入式领域优质创作者,博客专家
✨个人主页:咸鱼弟
🔥系列专栏:Linux专栏 PCIe专栏
📃推荐一款求职面试、刷题神器👉注册免费刷题 

目录

1.PCIe ECAM机制

2.PCIe ECAM基地址

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

4.linux内核中对ECAM的实现


1.PCIe ECAM机制

PCI Express Enhanced Configuration Access Mechanism (ECAM)是访问PCIe配置空间的一种机制。是将PCIe的配置空间映射到MEM空间,使用MEM访问其配置空间的一种实现。可以根据一个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
 


http://www.ppmy.cn/news/94358.html

相关文章

基于Java+控制台实现教材管理系统

基于Java控制台实现教材管理系统 一、系统介绍二、功能展示1.教材订购2.教材出售3.教材统计4.库存管理 四、其它1.其他系统实现2.获取源码 一、系统介绍 系统主要包括了教材订购、教材出售、教材统计、库存管理几大部分&#xff1b; 其中功能主要包括&#xff1a; 一、教材订购…

2023年武汉市职业院校技能大赛“网络安全”竞赛任务书

2023年武汉市职业院校技能大赛“网络安全” 竞赛任务书 一、竞赛时间 总计&#xff1a;360分钟 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件监控 A-5 服…

【算法题】1718. 构建字典序最大的可行序列

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你一个整数 n &#xff0c;请你找…

CentOS 7:管理防火墙及开放指定端口

在 CentOS 7 中&#xff0c;默认的防火墙工具是 firewalld。本文将教你如何在 CentOS 7 上管理 firewalld 防火墙&#xff0c;包括如何关闭&#xff0c;开启防火墙以及如何开放指定的端口。在操作过程中&#xff0c;你需要管理员权限。请谨慎操作&#xff0c;关闭防火墙可能会带…

MATLAB算法实战应用案例精讲-【数模应用】灰色预测模型(Gray Forecast Model)(附python、R语言和MATLAB代码实现)

目录 前言 知识储备 1.累加生成算子(AGO) 2.逆累加生成算子(IAGO) 3.均值生成算子(MEAN)

leetcode练习(汇总插入区间)

文章目录 题目一&#xff1a;汇总区间题目二&#xff1a;插入区间 语言&#xff1a;python 工具&#xff1a;jupyuter 题目一&#xff1a;汇总区间 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c…

递归的练习

思路 1.确定能否使用递归求解 2.推到出递推关系&#xff0c;即父问题与子问题的关系&#xff0c;以及递归的结束条件 深入到最里层的叫做递 从最里层出来的叫做归 在递的过程中&#xff0c;外层函数内的局部变量&#xff08;以及方法参数&#xff09;并未消失&#xff0c;…

AcWing算法提高课-1.3.11二维费用的背包问题

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 有 N N N 件物品和一个容量是 V V V 的背包&#xff0c;背包能承受的最大重量是 M M M。 每件物品只能用一次。体积是 v i v_…