NXP i.MX8系列平台开发讲解 - 3.10 Linux PCIe资源分配与访问(二)

news2024/12/24 11:55:17

目录

1. PCIe BFD

2. PCIe 配置空间

2.1 PCIe 配置空间访问

PCIe I/O访问方法

PCIe MMIO访问方法

3. PCIe BAR相关

4. PCIe Capbility

5. PCIe 操作


本文将重点讲解PCIe的资源访问相关内容,对于PCIe资源访问是从Host 端老看可以对PCIe进行配置与访问的资源主要包括以下相关类目

  • BDF:BUS Devices Function

  • 配置空间

  • BAR

  • Capability

  • MSI/MSI-X

  • DMA

1. PCIe BFD

PCIe总线中的每一个功能都需要需要对应一个唯一的标识符,这个标识符就是这里提到的BDF,全称英文为Bus,Device,Function;

BUS:总线号【8位】,最多通过配置软件分配256个总线号,初始总线号为0,通常都是由硬件分配给Root Complex。在分配总线号时候,当发现网桥时候,软件就给新的总线分配一个唯一并且大于网桥所在的总线号,一旦新的总线号分配成功,软件就继续扫描当前总线上更多的桥之前寻找新总线上的桥,这也是我们称为的“深度优先搜索”

Device:设备号【5位】,PCIe允许在单个PCI总线上最多32个设备号;

Function:功能号【3位】,最大值也就是可以定义8个Function,Fucntion 号也就是每个Device功能,这些功能可能包括硬盘接口,显示接口,以太网控制器,USB控制器。对于多功能的设备无需按照顺序实现。每个Function也有自己的配置地址,用于设置关联的资源;

对于BUS分配的规则如图:

图中对于BUS号的分配,遵循深度优先的方式,从Root Complex开始分配BUS0,Virtual P2P下端分配了BUS1,在此遇到了一个桥设备,对于桥设备总线定义了BUS2,继续往下分配了BUS3,也就是看到图中最左下端位置,分配完毕后,往右边继续分配了BUS4,依次类推。

思考:

对于Device和Fuction是如何分配?

这里就不在采用何种深度优先去分配,而是设备本身就分配好的了。

每个设备的BDF信息存在哪里?

BDF是不存储在Device中,而是在逻辑上存在,在程序中,放在协议中去传输。

查看BUS总线相关,可以采用lspci -tv

2. PCIe 配置空间

PCIe设备都有自己独立的一段配置空间,该部分空间是这个设备的。在系统中需要对这个设备分配一段内容空间,CPU访问这段内容空间就是访问此设备的配置空间,设备在出厂时,对于PCIe的配置空间都是默认值的。

配置空间特点:

设备端实现的一组特别的寄存器;

软件和设备交互的接口,软件可以用来控制设备和查看设备的状态;

每个设备的Fuction对应一个配置空间,而不是每个设备只有一个配置空间;

配置空间大小:

在PCI定义了256字节,但是在PCIe已经扩展到了4K,如图0x00~0xFFF;

组成结构:

头部数据:64字节(0x00~0x40)

Capability Structure:192字节

PCIe扩展空间:4096~256字节

PCIe与PCI的配置空间的区别联系:

在PCIe 配置空间中可以看到PCI相关,PCIe的发展是兼容PCI,每个设备的配置空间的256字节是PCI空间,后面的4~256字节是PCIE扩展空间。目前PCIe的配置空间为4K,PCIE一共支持256条Bus,32个Dev,8个Fun。 因此在满负载的情况下,共需内存大小 = 4k * 256 328 = 256K Bytes = 256M,这个256M的内存空间是为PCIE设备准备的空间系统不可用,这也是你的内存条实际可用的总是会小于标称的主要原因之一。对于PCIe配置空间有两种类型,主要通过Header Type进行区分

PCIe 标准配置空间分两种Type 0 和Type1

Type 0 主要是针对PCI的endpoint设备;

type 1 主要是针对PCI bridge, switch。

PCIe中配置空间头部信息根据Type0/1 不一样,可以看到

2.1 PCIe 配置空间访问

Pcie 配置空间的访问方法目前有两种,一种是IO, 还有一种是MIMO访问

  • PCIe I/O访问方法

I/O访问,定义了两个IO寄存器用来访问设备的配置空间:

CONFIG_ADDRESS

CONFIG_DATA

写入数据到配置空间:地址寄存器写入BDF和register;数据寄存器写入数据,完成写入

从配置空间读取数据:地址寄存器写入BDF和register;然后从数据寄存器读取数据,完成读取;

  • PCIe MMIO访问方法

MIMO方法:IO端口只能访问256(2^6)字节的配置空间,PCIe的配置空间扩展到4K,IO端口的无法访问到扩展的配置空间,所以定义了这么一段MMIO空间来配置访问空间,大小256M,空间地址范围查看如下

hywel@ubuntu:~$ grep MMCONFIG -i /proc/iomem 
  00000000-00000000 : PCI MMCONFIG 0000 [bus 00-7f]

读写操作:

# 读取
hywel@ubuntu:~$ lspci -xxx
00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)
00: 86 80 90 71 06 00 00 02 01 00 00 06 00 00 00 00
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 ad 15 76 19
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
# 省略很多
# ...
00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00: 86 80 11 71 05 00 80 02 01 8a 01 01 00 40 00 00
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 61 10 00 00 00 00 00 00 00 00 00 00 ad 15 76 19
30: 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00
# 读取
hywel@ubuntu:~$ lspci -s 00:07.1 VENDOR_ID
# 写入。。注意当前是什么设备,有时候写完后不正常了
hywel@ubuntu:~$ lspci -s 00.07.1 VENDOR_ID=0X111

3. PCIe BAR相关

PCIe BAR(Base Address Register) 基地址寄存器

BAR的存在的意义是什么:

设备内部使用RAM或者寄存器实现一些功能,有时候需要让外部来访问,比如网卡的队列描述符,DMA控制器等等,需要让Host来操作才能写入,或者GPU的显存RAM需要Host传输,然后才能GPU渲染计算;

这些内部的RAM或者寄存器被Host访问,就需要Host统一寻址,也就是统一映射到Host物理地址空间;

BAR里面写入的值,为了Host映射设备内部的RAM或者寄存器而分配的地址;

BAR如何分配

Host软件读取设备BAR的个数和大小,开始向BAR写入1,再读取,如果返回0,则没有;

Host软件为设备的每一个BAR,进行分配统一物理地址空间,然后把基地址写入BAR;

后面Host软件访问设备的RAM或者寄存器,就通过BAR里面的值加上偏移方向;

4. PCIe Capbility

PCIe Capbility是兼容PCI的Capbility,从PCIe的配置文件分布看到里面在地址空间0x40~0xff作为PCI的Capbility空间,PCIe的Capbility是在扩展部分存在。Capbility作为表示设备的能力,同时会提供设备状态额反应设备状态的功能。

遍历标准的Capbility:地址范围(0x40~0xff),头部组成,Nex Capability指向下一个Capability ID,这样就形成了一个单向链表;

遍历PCIe的Capability:地址范围(0x100~0xfff),0x100放第一个扩展的Capability

Capability示例

lspci -s 00:07.1 vxxxx|less

5. PCIe 操作

PCIe 设备可以发起操作主要分为两种DMA和interuput

DMA

Host无需参与数据传输,把数据从一个端点的数据传到另外一个端点,此过程完全不需要CPU的参与;

MDA底层寓意:完全不需要CPU暗语的memory类型的TLP包传输;

Interuput

PCIe支持两种中断,

INTx message: 模拟INTx,可选支持

MSI : Message Signaled Interuput中断,必须支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1627729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序的常用API②

一、动画API (1)作用:用于在微信小程序中完成动画效果的制作 (2)使用:创建实例 wx.createAnimation() (3)常用属性: duration 【number型】 动画持续时间&…

TCN-LSTM时间卷积网络长短期记忆网络多输入多输出回归预测

文章目录 效果一览文章概述 订阅专栏只能获取一份代码部分源码参考资料 效果一览 文章概述 TCN-LSTM时间卷积网络长短期记忆网络多输入多输出回归预测 matlab2021 订阅专栏只能获取一份代码 部分源码 %------------------------------------------------------------------…

EureKa技术解析:科技行业的革新风暴(ai写作)

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

目标检测——YOLOv6算法解读

论文:YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications (2022.9.7) 作者:Chuyi Li, Lulu Li, Hongliang Jiang, Kaiheng Weng, Yifei Geng, Liang Li, Zaidan Ke, Qingyuan Li, Meng Cheng, Weiqiang Nie, Yiduo Li, Bo …

SpringBoot---------整合Redis

目录 第一步:引入依赖 第二步:配置Redis信息 第三步:选择Spring Data Redis进行操作Redis数据库 ①操作String类型数据(用的少) ②操作Object类型数据(重要!!!&#x…

Linux 设置 ssh 服务开机自启并允许 root 账户以密码验证身份登录

确保openssh-server已安装。 确保防火墙已允许 ssh 端口上的传入连接。 修改 ssh 服务的 sshd_config 文件,以允许 root 账户以密码验证身份登录。 1、 从 sshd_config 中删除所有包含 “PermitRootLogin” 的行 sed -i "/^PermitRootLogin/d" /etc/s…

微信小程序关于主包大小不能超过1.5MB的问题

常规的解决办法有以下几种 1、把资源文件改成远程服务器的,比如png这些 2、进入如图的分析页面,能明确知道你哪个插件包太大,我这里之前echart的包就1mb,现在给他缩减到了500kb的样子 3、解决vant等npm包太大的问题&#xff0c…

【代码随想录刷题记录】LeetCode283移动零

题目地址 1. 思路 1.1 基本思路及假设 拿到这个题,首先想到,这是类似删除元素的方法,因为删除元素也是移动元素,但是移动的方向和删除元素的方法刚好相反,我们都知道,如果在数组中删除某个元素&#xff…

小程序使用阿里巴巴矢量图标库

一、登录官网 www.iconfont.cn 二、在搜索框中搜索想要的图标,将鼠标移动到图标上会看到三个标记 可以使用下载,直接使用: 可以使用css文件使用: 首先点击购物车样式的选项,而后点击下图位置: 点击自己创…

嵌入式Linux学习——Linux常用命令(上)

Linux命令行介绍 Linux Shell 简介 Shell 的意思是“外壳”,在 Linux 中它是一个程序,比如/bin/sh、/bin/bash 等。它负责接收用户的输入,根据用户的输入找到其他程序并运行。比如我们输入“ ls”并回车时, shell 程序找到“ ls…

Kafka 3.x.x 入门到精通(06)——Kafka进阶

Kafka 3.x.x 入门到精通(06)👉👉👉👉 Kafka进阶 3. Kafka进阶3.1 Controller选举3.2 Broker上线下线3.3 数据偏移量定位3.4 Topic删除3.5 日志清理和压缩3.7 页缓存3.8 零拷贝3.9 顺写日志3.10 Linux集群部…

循环购模式:电商消费增值的新引擎

大家好,我是微三云周丽! 在数业模式和创新的营销策字经济的浪潮下,电商行业以其独特的商略,不断刷新着消费者的购物体验。 近年来,循环购模式作为一种新兴的电商消费增值模式,逐渐在市场中崭露头角&#…

上门服务系统|上门服务小程序搭建流程

随着科技的不断进步和人们生活水平的提高,越来越多的服务开始向线上转型。传统的上门服务业也不例外,随着上门服务小程序的兴起,人们的生活变得更加便捷和高效。本文将为大家介绍上门服务小程序的搭建流程以及应用范围。 一、上门服务小程序搭…

知名专业定制线缆生产源头工厂推荐-精工电联:线缆行业的质量与成本双赢

知名专业定制线缆生产源头工厂推荐-精工电联 在当今科技飞速发展的时代,企业要想在激烈的市场竞争中立于不败之地,必须具备高质量、高效率、低成本的核心竞争力。作为线缆制造领域的领先者,精工电联始终秉持“与智者同行,与制造为…

“AI技能,新的职场通行证?揭秘阿里最新职业趋势报告“

随着“五一”劳动节的临近,阿里巴巴发布了一份引人注目的报告——《“AI”职业趋势报告》。这份报告不仅揭示了人工智能(AI)在各行各业中的关键作用,也预示了一个全新的工作时代正在加速到来。 报告中明确指出,AI的应用…

探索和构建 LLaMA 3 架构:深入探讨组件、编码和推理技术(四)分组多查询注意力

探索和构建 LLaMA 3 架构:深入探讨组件、编码和推理技术(四)分组多查询注意力 Grouped-query Attention,简称GQA 分组查询注意力(Grouped-query Attention,简称GQA)是多查询和多头注意力的插值…

栈和队列OJ——括号匹配问题,用队列实现栈,用栈实现队列,设计循环队列

题目1——括号匹配问题 题目来源. - 力扣(LeetCode) 思路——辅助栈法 括号匹配问题是一个经典的计算机科学问题,常用于检查一个字符串中的括号是否正确匹配。这包括各种括号,如小括号“()”,大括号“{}”&#xff0…

Eagle for Mac:强大的图片管理工具

Eagle for Mac是一款专为Mac用户设计的图片管理工具,旨在帮助用户更高效、有序地管理和查找图片资源。 Eagle for Mac v1.9.2中文版下载 Eagle支持多种图片格式,包括JPG、PNG、GIF、SVG、PSD、AI等,无论是矢量图还是位图,都能以清…

你的网站还在使用HTTP? 免费升级至HTTPS吧

如果您的网站还在使用老的http协议,可以申请一个免费的SSL证书升级至https! 具体步骤如下: 1 申请免费SSL证书 根据你的需求选择合适的SSL证书类型,如单域名证书,多域名证书、通配符证书 登录免费供应商JoySSL官网&…

18 JavaScript学习:错误

JavaScript错误 JavaScript错误通常指的是在编写JavaScript代码时发生的错误。这些错误可能是语法错误、运行时错误或逻辑错误。以下是对这些错误的一些常见分类和解释: 语法错误: 这类错误发生在代码编写阶段,通常是由于代码不符合JavaScrip…