《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(7)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(6)

2.2 HOST主桥

MPC8548处理器的拓扑结构如图2-2所示:

OCeaN部件的拓扑结构如图2-3所示:

2.2.1 PCI设备配置空间的访问机制

为了便于理解,再次贴出图1-1。

PCI总线规定访问配置空间的总线事务,即配置读写总线事务,使用ID号进行寻址PCI设备的ID号总线号(Bus Number)设备号(Device Number)功能号(Function Number)组成。

  • 总线号(Bus Number)

其中,总线号在HOST主桥遍历PCI总线树时确定。PCI总线可以使用PCI桥扩展PCI总线,并形成一棵PCI总线树。在一棵PCI总线树上,有几个PCI桥(包括HOST主桥),就有几条PCI总线。在一棵PCI总线树中,总线号由系统软件决定通常,与HOST主桥直接相连的PCI总线编号为0,系统软件使用DFS(Depth-First Search,深度优先)算法扫描PCI总线树上的所有PCI总线,并依次进行编号。

  • 设备号(Device Number)

一条PCI总线的设备号PCI设备的IDSEL信号PCI总线地址线连接关系确定。

  • 功能号(Function Number)

功能号与PCI设备的具体设计相关。在一个PCI设备中,最多有8个功能设备,而且每一个设备都有各自的PCI配置空间。而在绝大多数PCI设备中,只有一个功能设备。

  • 寄存器号(Register Number)

HOST主桥使用寄存器号访问PCI设备配置空间的某个寄存器

在MPC8548处理器的HOST主桥中,与PCI设备配置空间相关的寄存器CFG_ADDRCFG_DATAINT_ACK寄存器组成。系统软件使用CFG_ADDR和CFG_DATA寄存器访问PCI设备的配置空间,而使用INT_ACK寄存器访问挂接在PCI总线上的中断控制器的中断向量。HOST主桥这3个寄存器的地址偏移和属性表如表2-1所示:

表2-1 PCI总线配置寄存器

偏移寄存器属性复位值
0x0000_8000CFG_ADDR可读写0x00000000
0x0000_8004CFG_DATA可读写0x00000000
0x0000_8008INT_ACK只读0x00000000

在MPC8548处理器中,所有内部寄存器都使用存储器映射方式进行寻址,并存放在BASE_ADDR变量为起始地址的“1MB连续的物理地址空间”中。PowerPC处理器可以通过BASE_ADDR+Offset的方式访问表2-1中的寄存器。

MPC8548处理器使用CFG_ADDR寄存器和CFG_DATA寄存器访问PCI设备的配置空间(上边一已提到)。其中用CFG_ADDR寄存器保存PCI设备的ID号和寄存器号,CFG_ADDR寄存器的各个字段的详细说明如下所示:

  • Enable位

当该位为1时,HOST主桥使能对PCI设备配置空间的访问。当HOST处理器对CFG_DATA寄存器进行访问时,HOST主桥将对这个寄存器的访问转换为PCI配置读写总线事务并发送到PCI总线上。

  • Bus Number字段

Bus Number字段记录PCI设备所在的总线号

  • Device Number字段

Device Number字段记录PCI设备的设备号

  • Function Number字段

Function Number字段记录PCI设备的功能号

  • Register Number字段

Register Number字段记录PCI设备的配置寄存器号

MPC8548处理器访问PCI设备的配置空间时,首先需要在CFG_ADDR寄存器中设置这个PCI设备对应的总线号、设备号、功能号和寄存器号然后使能Enable位之后当MPC8548处理器对CFG_DATA寄存器进行读写访问时HOST主桥将这个存储器读写访问转换为PCI配置读写请求,并发送到PCI总线上。如果Enable位没有使能,处理器对CFG_DATA的访问不过是一个普通的I/O访问,HOST主桥并不能将其转换为PCI读写配置请求。

HOST主桥根据CFG_ADDR寄存器中的ID号生成PCI配置读写总线事务并将该事务通过ID译码方式发送到指定的PCI设备。PCI设备将接收来自配置写总线事务的数据,或者为配置读总线事务提供数据

值得注意的是,在PowerPC处理器中,在CFG_DATA寄存器中保存的数据采用大端模式进行编址,而PCI设备的配置寄存器采用小端模式编址,因此,HOST主桥需要进行模式转换。下面以源代码2‑1为例说明PowerPC处理器如何访问PCI配置空间。

源代码2-1 PowerPC处理器访问PCI配置空间

stw r0, 0(r1)
ld r3,0(r2)

首先假设寄存器r1的初始值为BASE_ADDR+0x0_8000(即CFG_ADDR寄存器的地址),寄存器r0的初始值为0x80000008,寄存器r2的初始值为BASE_ADDR+0x0_8004 (即CFG_DATA寄存器的地址),而指定PCI设备(总线号、设备号、功能号都为0)的配置寄存器的0x0B~0x08中的值为0x99887766。

这段源代码的执行步骤如下:

(1)将r0寄存器的值赋值到r1寄存器所指向的地址空间中,即初始化CFG_ADDR寄存器为0x80000008;

(2)从r2寄存器所指向的地址空间中读取数据到r3寄存器中,即从CFG_DATA寄存器中读取数据到r3寄存器。

在MPC8548处理器中,源代码2‑1执行完毕后,寄存器r3保存的值为0x66778899,而不是0x9988-6677。系统程序员在使用这个返回值时,一定要注意大小端模式的转换。

值得注意的是,源代码2‑1可以使用lwbrx指令进行优化,该指令可以在读取数据的同时,进行大小端模式的转换。

处理器读取INT_ACK寄存器时,HOST主桥将这个读操作转换为PCI总线中断响应事务。PCI总线中断响应事务的作用是通过PCI总线读取中断控制器的中断向量号,这样做的前提是中断控制器需要连接在PCI总线上。

PowerPC处理器使用的MPIC中断控制器不是挂接在PCI总线上而是挂接在SoC平台总线上。因此,PCI总线提供的中断应答事务在这个处理器系统中并没有太大用途。但是并不排除某些PowerPC处理器系统使用了挂接在PCI总线上的中断控制器,比如PCI南桥芯片,此时PowerPC处理器系统需要使用中断应答事务读取PCI南桥中的中断控制器,以获取中断向量号

更多内容请看下回。

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

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

相关文章

大学生搜题软件,未来可期吗?

作为一家专注于软件开发的公司《智创有术》,我们致力于为客户提供创新、高效和可靠的解决方案。通过多年的经验和专业知识,我们已经在行业内建立了良好的声誉,并赢得了客户的信任和支持。 支持各种源码,网站搭建,APP&a…

如何撰写引人注目的博文

本文介绍了撰写博文和利用博客增加有机网站流量的艺术。本文将链接到我们博客上的一些最佳内容,以解决一些具体问题。 写什么 想知道如何创建博客吗?在撰写博文时,请始终牢记以下两个问题: 博客是为你的读者服务的,用…

2024年需要高度关注的六大网络安全威胁

创新技术(如生成式人工智能、无代码应用程序、自动化和物联网)的兴起和迅速采用,极大地改变了每个行业的全球网络安全和合规格局。 网络犯罪分子正在转向新的技术、工具和软件来发动攻击,造成更大的破坏。因此,《2023年…

如何在Android Glide中结合使用CenterCrop和自定义圆角变换(图片部分圆角矩形)

如何在Android Glide中结合使用CenterCrop和自定义圆角变换(图片部分圆角矩形) 在Android开发中,使用Glide加载图片时,我们经常需要对图片进行特定的处理,比如裁剪和圆角变换,特别是一些设计稿,…

基于R语言(SEM)结构方程模型教程

详情点击链接:基于R语言(SEM)结构方程模型教程 01、R/Rstudio (2)R语言基本操作,包括向量、矩阵、数据框及数据列表等生成和数据提取等 (3)R语言数据文件读取、整理(清洗)、结果存储等(含tidve…

红队专题-Web安全/渗透测试-文件上传/下载/包含

文件上传/下载/包含 招募六边形战士队员利用目录穿越反弹SHELL实战测试2.2 提交报文修改检测3.2 文件内容检测绕过完整文件结构 检测 第四章:解析漏洞第一节 常见解析漏洞iis/nginx php fastcgi 取值错误 解析漏洞 (配置错误)nginx 文件名逻…

加密的手机号如何模糊查询?

1 一次加载到内存 实现这个功能,我们第一个想到的办法可能是:把个人隐私数据一次性加载到内存中缓存起来,然后在内存中先解密,然后在代码中实现模糊搜索的功能。 这样做的好处是:实现起来比较简单,成本非常…

vue3 鲜为人知的知识点

该篇文章是个人觉得在平常开发过程中没怎么注意到&#xff08;新增加&#xff09;的知识点&#xff0c;每个章节的内容在官网中不只文章提到的这些。 &#x1f495; 模板语法 ✔ 动态参数 <script setup> import { ref } from vueconst attributeName ref(msg) const …

Noisy DQN 跑 CartPole-v1

gym 0.26.1 CartPole-v1 NoisyNet DQN NoisyNet 就是把原来Linear里的w/b 换成 mu sigma * epsilon, 这是一种非常简单的方法&#xff0c;但是可以显著提升DQN的表现。 和之前最原始的DQN相比就是改了两个地方&#xff0c;一个是Linear改成了NoisyLinear,另外一个是在agent在t…

关于位运算

只出现一次的数字&#xff1a; 给你一个非空整数数组 nums&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现一次的元素。 class Solution { public:int singleNumber(vector<int>& nums) {int j0;for(auto i:nums){j^i…

62.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏公告类的C++还原

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;游戏红字公告功能的逆向分析-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;0888e34878d9e7dd0acd08ef…

VMware Tools 启动脚本未能在虚拟机中成功运行。如果您在此虚拟机中配置了自定义启动脚本,请确保该脚本没有错误。您也可以提交支持请求,报告此问题。

问题描述&#xff1a;今天打开centos7虚拟机就是直接打不开了报了下面的错误&#xff0c;也没有动任何东西&#xff0c;点确定后&#xff0c;也是依然没有反应 问题原因&#xff1a;可能是虚拟机中的内存满了&#xff0c;需要清理内存 解决方法如下 首先cmd打开终端敲入如下命…