PCIe学习笔记(一)

您所在的位置:网站首页 电脑pcie是什么意思 PCIe学习笔记(一)

PCIe学习笔记(一)

2024-07-11 01:58| 来源: 网络整理| 查看: 265

吹个牛先:计划写三篇文章,本文主要描述PCIe设备识别过程,接下来会完成两篇,(二)中断,(三)数据传输 博观而约取,厚积而薄发 写在开始的话,不知道看了多少资料才总结出一点知识,能输入已经很不容易,何况想要输出,有十能输出一二就算不错了。所以这个过程中真的很难坚持下来,何况没有实际项目作为载体,真的不知道实际运用中这些知识够不够用,这只是基于我之前的经验,认为一个全新的硬件模块中需要掌握的部分。 1 首先要了解这个硬件的用途,物理接口,pin定义。 2 要知道需要做什么样的配置才能使得设备达到我们的预期。 3 设备工作中最重要的就是三个模块,正确识别,注册中断以及终端处理函数,数据传输。 完成以上三步一个硬件模块的bringup就完成了。本文忽略了大部分细节,只为了用最短的篇幅描述好PCIe。 MSI、MSI-X中断和TLP这里不详细展开去说,必要的时候会带出来。 PCIE整体印象 首先用一张图来直观的呈现出要了解PCIe,我们需要知道的一些基本概念。 由于PCI/PCIe常见设备分为Bridge和Agent两种,这两种设备的区分是写在配置空间的header字段中的,所以配置空间也有两种类型: 其中Agent的配置空间类型称为Type 00h,Bridge的配置空间,它的类型被称为Type 01h。 PCI/PCIe的配置地址空间Configuration Space是一个与Memory空间和IO空间并列的独立的空间。

对Legacy PCI来讲,Configuration Space有256 Bytes对于PCIe, Configuration Space有4096 Bytes BAR(Base Address Registers):决定PCI/PCIe设备空间映射到系统空间具体位置的寄存器,映射方式有两种,分别是IO和Memory映射,因此配置空间的访问方式也有两种:IO方式(CF8h/CFCh)Memory方式(ECAM) https://blog.csdn.net/vc66vcc/article/details/81014637 https://blog.csdn.net/huangkangying/article/details/50570612 用华为hisi的芯片来描述PCIe在linux中的驱动注册过程,可以参考本文:https://blog.csdn.net/chengch512/article/details/52635736?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task 参考文章链接: https://www.cnblogs.com/szhb-5251/p/11620310.html https://www.cnblogs.com/yangxingsha/p/11551472.html https://blog.csdn.net/kunkliu/article/details/94380357 https://www.sohu.com/a/300238384_505795 https://blog.csdn.net/buyi_shizi/article/details/51068609 https://blog.csdn.net/abcamus/article/details/74157026 https://blog.csdn.net/abcamus/article/details/74157026 一个PCIe设备能够被识别,大致需要经过以下步骤: 在这里插入图片描述 上述过程的详细描述可以参考这个链接: https://blog.csdn.net/maxwell2ic/article/details/90759280 https://blog.csdn.net/yijingjijng/article/details/48196531 上面的描述我们也能看到,一个设备之所以能够被检测并正确的识别,需要很多个过程,首先这个设备能够从物理上被识别到。而识别到这个设备的第一个关键步骤就是物理层上能够检测到。在设备中按照OSI模型,都会有多个层次结构。对于PCIe同样也不例外,下图就是一个PCIe的层次结构。 在这里插入图片描述 此处只简单描述下PHY层(也就是物理层)中的链路训练状态机(LTSSM,Link Training and Status State Mechine)。 主要包含五类状态: 1 链路训练状态(Link Training State) Detect Polling Configuration 2 重训练状态(Re-Training(Recovery)State) Recovery 3 软件驱动功耗管理状态(Software Driven Power Managment State) L2 L0 L1 4 活动状态功耗管理状态(Active-State Power Management State,ASPM State) L1 L0s 5 其它状态(Other State) From Configuration or Recovery :Disabled\External Loopback。 From Recovery: Hot Reset。 具体我们可以通过这张图来了解一下LTSSM: 在这里插入图片描述 这一部分更为详细的描述,我们可以通过这个链接来看:https://blog.csdn.net/kunkliu/article/details/94594501

以上是在理论层面上全面的了解了PCIe,具体我们在使用的过程中,需要通过软件的方式来实现,从而能够正确的被上层应用使用。 pci驱动在linux中的描述如下: Once the driver knows about a PCI device and takes ownership, the driver generally needs to perform the following initialization:

Enable the device Request MMIO/IOP resources Set the DMA mask size (for both coherent and streaming DMA) Allocate and initialize shared control data (pci_allocate_coherent()) Access device configuration space (if needed) Register IRQ handler (request_irq()) Initialize non-PCI (i.e. LAN/SCSI/etc parts of the chip) Enable DMA/processing engines

When done using the device, and perhaps the module needs to be unloaded, the driver needs to take the follow steps:

Disable the device from generating IRQs Release the IRQ (free_irq()) Stop all DMA activity Release DMA buffers (both streaming and coherent) Unregister from other subsystems (e.g. scsi or netdev) Release MMIO/IOP resources Disable the device

PCIe的BAR地址是如何分配的呢?

在PCIE配置空间里,0x10开始后面有6个32位的BAR寄存器,BAR寄存器中存储的数据是表示PCIE设备在PCIE地址空间中的基地址,注意这里不是表示PCIE设备内存在CPU内存中的映射地址,至于这两者之间如何转换,就是前面提到的TLP的工作。 枚举的过程描述可以参考: http://blog.chinaaet.com/justlxy/p/5100053320 https://blog.csdn.net/buyi_shizi/article/details/51068609枚举 总结如下: 1 向BAR空间写1。 2 读取BAR值,确定地址空间大小和类型。 3 像高比特写入地址空间地址(系统分配的)。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3