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

目录

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.mzph.cn/bicheng/3634.shtml

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

相关文章

【opencv 加速推理】如何安装 支持cuda的opencv 包 用于截帧加速

要在支持CUDA的系统上安装OpenCV,您可以使用pip来安装支持CUDA的OpenCV版本。OpenCV支持CUDA加速,但需要安装额外的库,如cuDNN和NVIDIA CUDA Toolkit。以下是一般步骤: 安装NVIDIA CUDA Toolkit: 首先,您需要安装NVID…

深度学习基础之《TensorFlow框架(12)—图片数据》

一、图像基本知识 1、如何转换图片文件 回忆:之前我们在特征抽取中讲过如何将文本处理成数据 思考:如何将图片文件转换成机器学习算法能够处理的数据? 我们经常接触到的图片有两种,一种是黑白图片(灰度图)…

网站被SmartScreen标记为不安全怎么办?

在互联网时代,网站的安全性和可信度是用户选择是否继续访问的重要因素之一,然而,网站运营者偶尔会发现使用Edge浏览器访问网站时,会出现Microsoft Defender SmartScreen(以下简称SmartScreen)提示网站不安全…

Windows下搭建Flutter开发环境

IDE:VS code Flutter官网:Flutter: 为所有屏幕创造精彩 - Flutter 中文开发者网站 - Flutter 下载&安装 下载Flutter SDK,如图,建议自行下载安装: SDK还是挺大的,近1G,使用迅雷下载会快不少。 下载完成,解压缩到指定目录即可! 设置Local SDK,按下面步骤操作即…

【数据结构(邓俊辉)学习笔记】绪论05——动态规划

文章目录 0.前言1. Fibonacci数应用1.1 fib():递归1.1.1 问题与代码1.1.2 复杂度分析1.1.3 递归分析 1.2 fib():迭代 0.前言 make it work,make it right,make it fast. 让代码能够不仅正确而且足够高效地…

适合初学者的自然语言处理 (NLP) 综合指南

一、简述 自然语言处理 (NLP) 是人工智能 (AI) 最热门的领域之一,现在主要指大语言模型了。这要归功于人们热衷于能编写故事的文本生成器、欺骗人们的聊天机器人以及产生照片级真实感的文本到图像程序等应用程序。近年来,计算机理解人类语言、编程语言&a…

前端开发攻略---用原生JS在网页中也能实现文本转语音

1、原理 语音合成 (也被称作是文本转为语音,英语简写是 tts) 包括接收 app 中需要语音合成的文本,再在设备麦克风播放出来这两个过程。 Web API中对此有一个主要控制接口 SpeechSynthesis,外加一些处理如何表示要被合成的文本 (也被称为 utte…

Idea:通义千问插件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、通义千问大模型 二、程序编写助手 三、Idea安装通义千问插件 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、通义千问大模型…

数据结构——二叉树的操作 (层序遍历)(C++实现)

数据结构——二叉树的操作(2)(C实现) 统计叶子结点个数统计结点个数层序遍历非递归方式递归方式 我们今天接着来看二叉树的操作,如果还没有看过上一篇的可以点击这里: https://blog.csdn.net/qq_67693066/a…

来自异国的客人 - 华为OD统一考试(D卷)

OD统一考试(D卷) 分值: 100分 题解: Java / Python / C++ 题目描述 有位客人来自异国,在该国使用m进制计数。 该客人有个幸运数字n(n<m),每次购物时,其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。 问: 当其购买一个在我国价值k的产品时,…

【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 子集(难度⭐⭐)(65)

1. 题目解析 题目链接&#xff1a;78. 子集 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路详解&#xff1a; 为了生成数组 nums 的所有子集&#xff0c;我们需要对数组中的每个元素进行“选择”或“不选择…

JavaScript-Vue入门

本文主要测分享Vue的一些基础 Vue简介 Vue.js 是一个构建数据驱动的 web 界面的渐进式框架。它的主要目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 下是一些 Vue 的主要特点和概念&#xff1a; 1. 响应式数据绑定&#xff1a;Vue 使用基于 HTML 的模板语法…

Visual Studio安装MFC开发组件

MFC由于比较古老了&#xff0c;Visual Studio默认没有这个开发组件。最近由于一些原因&#xff0c;需要使用这个库&#xff0c;这就需要另外安装。 参考了网上的一些资料&#xff0c;根据实际使用&#xff0c;其实很多步骤不是必须的。 https://zhuanlan.zhihu.com/p/68117276…

Neo-reGeorg(webshell代理)-php

https://github.com/L-codes/Neo-reGeorg python加载需要的库 pip install requests 生成webshell代理文件 python .\neoreg.py generate -k 123456 其中&#xff0c;123456为密码&#xff0c;可以修改 生成后的文件路径&#xff1a; > neoreg_servers/tunnel.ashx …

Java后台开发的前置说明

1.知识点逻辑 一个部分 都是先挑重点知识点讲解 然后根据这些重点知识点去完成一个项目的开发 然后在到返回来解决这个部分其他细枝末节的知识点 2.软件开发的分工 我们大致可以将软件开发分成四块&#xff1a; 1.前端开发(比如开发电脑中的京东 htmlcssjavascript) 2.移动开…

什么是主数据管理?合理管理主数据,奠定企业数据战略基石

主数据&#xff08;Master Data&#xff09;是指在企业多个业务系统中重复使用、共享的、具有高价值的核心业务实体数据&#xff0c;如客户、产品、供应商、员工等&#xff0c;它们是企业运营和决策的基础&#xff0c;需要保持高度的准确性、一致性和完整性&#xff0c;以确保业…

Scala 05 —— 函数式编程底层逻辑

Scala 05 —— 函数式编程底层逻辑 该文章来自2023/1/14的清华大学交叉信息学院助理教授——袁洋演讲。 文章目录 Scala 05 —— 函数式编程底层逻辑函数式编程假如...副作用是必须的&#xff1f;函数的定义函数是数据的函数&#xff0c;不是数字的函数如何把业务逻辑做成纯函…

贪吃蛇详解

Win32 API介绍&#xff1a; 在写贪吃蛇这款游戏时需要用到一些有关Win32 API的知识&#xff0c; 接下来我会将设计到的知识点列举并讲解&#xff1a; 首先我们先了解一下Win32 API是什么&#xff0c;Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外&am…

普乐蛙VR航天航空体验馆VR双人旋转座椅元宇宙VR飞船

多长假来袭&#xff01;&#xff01;想为门店寻找更多新鲜有趣的吸粉体验&#xff1f;想丰富景区体验&#xff1f;别着急&#xff0c;小编为你准备了一款爆款设备——时光穿梭机&#xff0c;720无死角旋转&#xff01;&#xff01;吸睛、刺激体验&#xff0c;将亲子、闺蜜、情侣…

Java对象不再使用时,为什么要赋值为 null

相信大家在面试Java开发的时候,会遇到比较多的问题是Java的内存管理,这里面涉及到Java垃圾回收机制,以及JVM调优等等,那么今天跟大家讨论一个问题:Java对象不再使用时,为什么要赋值为 null ? 1、Java内存管理 在Java中,对象是在堆内存中分配的。 这部分内存用于存储…