上一篇文章中写到每个PCIe的function都有自己的configuration space,其实就是配置寄存器了(这个当然是要有的了,不然软件要怎么玩?只不过PCIe的配置寄存器要通过tlp才能去访问)。其实PCIe设备是有自己独立的一套内部空间,不仅仅是配置空间,包括每个设备提供哪些I/O地址,memory地址。而BAR(Base Address Register)就是用来表征这些地址空间的。

一、BAR寄存器和PCIe内部空间

关于地址相关的问题,搞清楚这三个地址之间的关系就可以了:

  1. 存储器地址,就是CPU,DMA等设备直接读写的地址。
  2. TLP中的地址。
  3. BAR空间地址。

如果两两组合的话,能够形成三种关系,但是事实上,这三者之间的关系其实就两部分:

  1. 存储器地址和TLP地址字段的关系。
  2. TLP地址字段和BAR空间地址的关系。

解决这两个问题,地址相关的问题就应该都清楚了。

1.1 BAR寄存器

首先要知道BAR有什么用?通过BAR寄存器,我们首先知道这个基址对应的空间属性,然后给这段空间分配一个基址(这个基址只是用来路由寻址用的,不能和存储器空间的地址搞混,很多软件实现上会把两个地址设置成一样,但是本质上没有任何关系,只是TLP寻址的时候用的!)。这样的话,TLP就能根据地址被路由到对应设备的BAR空间中去。比如说现在有一个mem read request,如果路由地址(地址信息包含在TLP中)是0x71000000,而有一个设备func0的mem空间范围是0x70000000~0x80000000,那么这个TLP就会被这个func处理。从func0的0x71000000对应的地址读取相应数据。

这就是TLP中的地址字段和BAR空间的地址之间的关系。还有一个问题是关于存储器地址和TLP地址字段的关系,有个硬件单元非常重要,那就是ATU,见第二节。这里详细介绍一下BAR的配置问题。

BAR位置:

对于EP来讲,配置空间的映射是这样的:

从上图中看到,BAR是从配置空间0x10到0x24的连续6个32位寄存器。关于BAR每个字段的解释可以参考DWC_pcie_reference[1]

BAR配置过程:

  1. 通过cfg write request向BAR地址写入全1。
  2. 通过cfg read request读取BAR。
  3. 根据读取的BAR值进行如下判断:

从高位开始读取连续的1,说明这些比特位是可写的,表征该space的size,譬如读到的BAR为0x11100000,那么这个space的size为0x100000 bytes,同时由于第0位为0,表示memory BAR,否则为I/O BAR。bits[2:1]和bits[3]的含义如下图所示

1.2 ATU(Address Translation Unit)

TLP中的地址哪里来?ATU转换过来的。这个问题就是这么的简单。ATU是什么?是一个地址转换单元,负责将一段存储器域的地址转换到PCIe总线域地址,除了地址转换外,还能提供访问类型等信息,这些信息都是ATU根据总线上的信号自己做的,数据都打包到TLP中,不用软件参与。软件需要做的是配置ATU,所以如果ATU配置完成,并且能正常工作,那么CPU访问PCIe空间就和访问本地存储器空间方法是一样的,只要读写即可。

这就解释了存储器地址和TLP地址字段的关系了。至此,地址相关的问题就解决了。

ATU配置举例:以kernel 4.4中designware PCIe host驱动为例

static void dw_pcie_prog_outbound_atu(struct pcie_port *pp, int index,int type, u64 cpu_addr, u64 pci_addr, u32 size)
{// 使用哪个ATUdw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | index,PCIE_ATU_VIEWPORT);// source地址(存储器域)的低32位dw_pcie_writel_rc(pp, lower_32_bits(cpu_addr), PCIE_ATU_LOWER_BASE);dw_pcie_writel_rc(pp, upper_32_bits(cpu_addr), PCIE_ATU_UPPER_BASE);// space sizedw_pcie_writel_rc(pp, lower_32_bits(cpu_addr + size - 1),PCIE_ATU_LIMIT);// 目标地址空间(PCIe总线地址)dw_pcie_writel_rc(pp, lower_32_bits(pci_addr), PCIE_ATU_LOWER_TARGET);dw_pcie_writel_rc(pp, upper_32_bits(pci_addr), PCIE_ATU_UPPER_TARGET);// 空间类型(mem or IO)dw_pcie_writel_rc(pp, type, PCIE_ATU_CR1);// 使能ATUdw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
}

二、TLP

TLP(Transaction Layer Packet)应该算是PCIe中最重要的概念了。可以说TLP是用户程序和PCIe设备交互的唯一渠道(edma和MSI本质上还是通过TLP)。TLP的构成如下图所示,具体每个字段的含义参见PCI_Express_Base_Specification_Revision_4.0.Ver.0.3第2.2节

因为软件不需要显示的配置TLP,所以这里就没有TLP的配置了,取而代之的是相关硬件的配置(譬如ATU)。这里有个了解就行,等到调试的时候就需要仔细的了解了。

这篇文章总结了PCIe设备地址空间的知识,搞明白了这个之后应该能上手开始写PCIe驱动了,至少能枚举了。下篇就详细介绍PCIe设备枚举过程,也是对这些知识的一个应用。

下篇预告: PCIe设备枚举

参考文献:

[1] DWC_pcie_reference
[2] PCI_Express_Base_Specification_Revision_4.0.Ver.0.3

PCIe实践之路:BAR空间和TLP相关推荐

  1. PCIe实践之路:PCIe转USB Host驱动

    PCIe实践之路:PCIe转USB Host驱动 本次调试PCIe RC驱动,通过PCIe转USB芯片扩展出的USB口接入U盘.RC平台为ARM-A7,运行裸机环境,EP为一款PCIe转USB3.0芯 ...

  2. PCIE BAR空间

    PCIE应用程序编程,首先就要理清PCIE BAR空间到底说的是什么.在PCIE配置空间里,0x10开始后面有6个32位的BAR寄存器,BAR寄存器中存储的数据是表示PCIE设备在PCIE地址空间中的 ...

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

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

  4. 亿级用户百TB级数据的 AIOps 技术实践之路(增强版)

    作者简介 周荣,华为消费者BG云运维部 AIOps 负责人,GOPS 2018 深圳站金牌讲师,07年加入华为,先后分别负责下一代智能网.中间件平台.运维工具等产品的研发与规划,在分布式系统.大数据分 ...

  5. 数据仓库—stg层_有赞数据仓库实践之路

    原标题:有赞数据仓库实践之路 一.大数据环境下的有赞数仓 关于数据仓库,在维基百科中将它定义为 用于报表和数据分析的系统,是商务智能 Business Intelligence 的核心部分.在数据仓库 ...

  6. 领域驱动设计(DDD)实践之路(四):领域驱动在微服务设计中的应用

    这是"领域驱动设计实践之路"系列的第四篇文章,从单体架构的弊端引入微服务,结合领域驱动的概念介绍了如何做微服务划分.设计领域模型并展示了整体的微服务化的系统架构设计.结合分层架构. ...

  7. 有赞数据库自动化运维实践之路

    「运维内推」有赞诚聘:应用运维工程师.系统运维工程师.运维开发工程师.DBA.请关注文末链接 一.前言 有赞作为"新零售"的软件服务供应商,随着业务的不断发展,从第一批几十家商户到 ...

  8. 有赞数据仓库实践之路

    转载自:有赞数据仓库实践之路 一.大数据环境下的有赞数仓 关于数据仓库,在维基百科中将它定义为用于报表和数据分析的系统,是商务智能 Business Intelligence 的核心部分.在数据仓库诞 ...

  9. 缘起|蚂蚁应用级服务发现的实践之路

    文|肖健(花名:昱恒) 蚂蚁集团技术专家.SOFARegistry Maintainer 专注于服务发现领域,目前主要从事蚂蚁注册中心 SOFARegistry 的设计和研发工作. 本文 8339 字 ...

最新文章

  1. linux环境上c++ boost安装boost_1_67_0.tar
  2. 软件开发代码中各国语言对应的缩写
  3. SVD java 算法实现
  4. PyCharm安装好vim后,怎么配置.vimrc
  5. 做菜不好吃,你一定是忽略了这20个小技巧!
  6. openCVPracticalExercise学习笔记01
  7. ubuntu安装sasl失败 - 解决方法
  8. C语言 数组和指针
  9. 白嫖党进,全网最详细的信息安全术语合集终于来了
  10. 英文论文写作LaTeX模板
  11. springboot宠物医院管理系统、
  12. 计算机制图视频教程,机械制图视频教程
  13. Vue 面试常见知识点总结
  14. 参考文献标号字体_毕业论文参考文献格式字体
  15. Bugku CTF web22(Web)
  16. seo优化策略有哪些?
  17. 惠普笔记本按开机键后电源灯亮的,但是屏幕一直是黑的,只有大写锁定键闪烁,闪3次一个循环,听得到风扇...
  18. 【微信小程序】模板消息推送(测试成功)。
  19. 《图解密码技术》笔记5:公钥密码-用公钥加密,用私钥解密
  20. 品西游之馒头引起的血案(上)

热门文章

  1. linux 自动mv脚本,linux replace rm to mv(脚本)
  2. 马尔可夫链(Markov chain)的性质
  3. 淘宝内容场下的人物理解系统
  4. python中双向索引_Python 字典支持双向索引。Python 集合也支持双向索引
  5. 矩阵与坐标系的映射关系
  6. 英文网站更新自动采集工具
  7. 孙陶然:当机会降临到你头上时你必须去把握
  8. PMI-ACP练习题(15)
  9. 前后端分离基于Oauth2的SSO单点登录怎样做?
  10. 单片机优雅的开发Clion环境搭建