关闭

大话PCIe:设备枚举

标签: PCIe
1706人阅读 评论(6) 收藏 举报
分类:

人的一生是一个不断认识自我,发展自我的过程。

认识PCIe设备的枚举过程需要以下知识:

  1. 拓扑结构
  2. 设备的表征及配置空间的访问
  3. BAR空间的含义和访问

其中第1/2点在总线结构与配置空间已经介绍过了,第3点在BAR空间和TLP也已经进行过详细的介绍,可以说是万事具备。接下来涉及的过程有以下几个:

  1. 根据深度优先搜索进行设备总线号的分配
  2. BAR空间的映射和简单访问测试

上面就是枚举过程中做的事情了。

一、基于深度优先搜索的总线号分配

1.1 原理阐述

每一个switch代表一级bus,挂在该switch下的所有设备(包括SW和EP)都属于这级bus。

SW配置空间中的总线号有Primary Bus、Secondary Bus和Subordinate Bus。含义如下

总线号 含义
Primary Bus 当前级别的总线号,从该设备往下的所有设备都属于primary bus
Secondary Bus 下一级总线号
Subordinate Bus 从当前级别总线开始最远端的总线号

现在假设有一个tlp过来,首先瞅了瞅当前switch的subordinate bus number,发现比自己的bus number还小,那就很知趣的不往这级bus上路由了;如果发现subordinate bus比自己的大,她就知道我要去的地方在这一级bus上,然后就继续往secondary bus路由,继续重复上述过程。如果primary bus number等于tlp自己的bus number,那么这一级bus就是tlp的归宿了。上述这个tlp的路由过程由SW完成。

1.2 代码举例

init BUS[0]
push BUS[0] to bus_stack

while bus_stack != NULL:
    bus = pop(bus_stack)
    while find_next_sw(bus) is true:
        child.prim_bus = bus.prim_bus
        child.second_bus = bus.prim_bus+1
        child.subord_bus = bus.second_bus
        push(child)
    // find an EP
    update_subord_bus(bus_stack)

这个代码是刚敲的(风格似乎有点python的感觉),只是表示基于深度优先搜索的配置PCIe设备bus number的算法,其中的find_next_sw负责找到当前sw下游的设备(如果发现设备0是EP,那么应该继续根据是否是多功能设备来搜索设备1,2,…,直到找到SW,或者没有)。如果发现SW,则继续入栈,否则(是EP)更新当前栈上所有设备的subordinate bus number为最后一个SW的primary bus number,然后栈顶弹出SW,进行下一个分支的深度搜索。

二、映射BAR空间

前面的枚举过程是在链路上通过发送配置读写请求来进行的,PCIe协议规定:访问SW配置要通过类型1的配置请求,访问EP配置要通过类型0的配置请求。

那么如果我们想要访问PCIe设备内部的mem空间呢?就要通过mem rd/wr请求。请求里面包含了需要访问的mem地址,PCIe网络根据这个地址把tlp路由到对应的设备上去处理。所以我们需要在系统枚举的阶段配置好各个设备的BAR空间范围,这样mem/io tlp就能根据地址是不是在BAR范围内来判断是不是应该访问该设备。

这里再次注意:这里的tlp中的地址和系统ram空间的地址没有必然联系,只是PCIe内部分配的地址(上一篇文章已经提到过这个点了)。

而BAR的配置地址是在configuration空间的,所以在枚举阶段我们通过发送cfg rd/wr tlp来配置BAR就行,具体关于BAR的介绍在大话PCIe:BAR空间和TLP中有说明了。

上一篇文章遗留了两个问题,到这里可以进行解答了。

一是关于配置空间及其地址的问题。

每个设备都有其配置空间,而且是固定地址0~4096 Byte,前面64字节是PCI兼容的。这个配置空间的地址和外部总线地址并没有什么关系。通过指定tlp中的bus number、device number、function number+偏移地址(这个就是写到tlp中的地址)就可以访问到对应设备的配置空间。

二是关于如何发起cfg tlp的问题。

上篇文章介绍了一个功能模块ATU,这是和总线对接的一个模块,除了地址转换之外,还根据配置产生tlp。一般是这样的,系统会为PCIe设备预留256MB空间,访问这256MB空间的时候就会触发产生一个mem request tlp,然后ATU根据配置(如果配置了cfg type)将其转换成cfg request,其中的target地址就写入了tlp中。然后PCIe网络就将这个tlp路由到对应地址的设备功能上了。举例如下:

系统ram空间地址基址为0x40000000,ATU配置source address为0x40000000,target address为0x00000000,ATU type = cfg 0,size=0x10000000(256MB),那么CPU读0x40000000地址的时候触发了一个mem read request,经过ATU之后产生了一个cfg type 0 rd的request;同样的,如果往0x40000000写一笔数据,就会触发mem write request,处理过程也是类似的。如果访问0x40100000,转换后的target地址就成了0x100000。

关于PCIe设备的枚举过程内容都在这里了。接下来重点介绍PCIe dma和MSI(-X)中断。

下篇预告: PCIe设备dma和MSI(-X)

2
1
查看评论

pcie设备枚举(转载)

转载自chinaunix  seaquester 枚举所有PCI设备 冷胜魁(Seaquester) lengshengkui@gmail.com 2009-11-16 在Linux下,lspci可以枚举所有PCI设备。它是通过读取PCI配置空间(PCI Configur...
  • fys2xxx
  • fys2xxx
  • 2016-04-07 22:48
  • 2167

PCIe设备漫游记----驱动加载篇

上篇中,我们探讨了PCIe设备是如何在Bios中被初始化的,Bios中各种准备工作做好后,就开始引导装载操作系统,系统的控制权移交给操作系统,操作系统中也要对系统中各PCI设备进行扫描以及初始化(和上文中提到的Bios对PCI设备的枚举和配置一样),事实上,早期的操作系统也是通过Bios调用的方式来...
  • saloon_yuan
  • saloon_yuan
  • 2012-05-22 09:53
  • 7708

PCIe学习笔记分享

1、概述     本总结随着DM8168中PCIe的学习,以及PCIe原理的学习而添加,都是一些零碎的知识点,有部分个人理解,将来温故知新用。 《PCI Express 体系结构导读》,《PCI EXpress系统体系结构标准教材》DM8168相关文档,网上搜集资料...
  • mantis_1984
  • mantis_1984
  • 2014-02-26 11:39
  • 18995

枚举PCI设备的讨论

作者很明显不是做底层的,但是也研究出如何访问PCI设备。 可以借鉴和参考原作者的Source code。 ……………………………………………………以下为转载内容………………………………………………………………………… 原帖地址:http://blog.csdn.net/zyl910...
  • pankul
  • pankul
  • 2013-02-21 15:40
  • 2045

PCIe学习笔记(12)--- PCIe总线的枚举过程 ENUMERATION

1. 画张图 PROCESSOR ^ | |Primary bus | Root Complex Host to PCI bridge | |Secondary bus  |Bus 0 Bridge 的UPSTREAM, 我们称它为PRIMARY BUS Bridge的DOWNST...
  • u013140088
  • u013140088
  • 2017-03-13 13:16
  • 782

枚举的详细过程分析

下面介绍枚举的详细过程: ①USB主机检测到USB设备插入后,就会先对设备复位。USB设备在总线复位后其地址为0,这样主机就可以通过地址0和那些刚刚插入的设备通信。USB主机往地址为0的设备的端点0发送获取设备描述符的标准请求(这是一个控制传输的建立过程)。设备收到该请求后,会按照主机请求...
  • u013685499
  • u013685499
  • 2015-05-22 19:28
  • 556

pci设备枚举及建立

在pci驱动中pci调用pci_scan_device扫描每个设备的每个功能,当发现该功能存在时(通过读设备的vendor及product ID确定),就为该设备功能建立一个完整的pci_dev(通过pci_setup_device 完成),并将该设备功能加入到全局链表及总线链表中,当加载设备驱动程...
  • dianhuiren
  • dianhuiren
  • 2011-12-22 21:37
  • 2587

PCI设备扫描和资源分配

Pci设备的I/O和内存是一个比较复杂的问题.如下的总线结构: 在上图的总线结构中,ethernet设备和pci-pci bridge的同类型资源空间必须要是pci bus0的一个子集 例如,pci bus 0的I/O端口资源是0x00CC~0x01CC. Etherne...
  • heliangbin87
  • heliangbin87
  • 2017-06-29 21:22
  • 552

pcie对设备的枚举

kernel 中对pci设别的枚举flow如下: acpi_pci_root_add->pci_acpi_scan_root->acpi_pci_root_create->pci_scan_child_bus->pci_scan_slot 这里的slot表示一个独立的PC...
  • tiantao2012
  • tiantao2012
  • 2017-03-25 09:34
  • 776

PCIE扫描过程

1. PCIE扫描过程 从按下PC的电源按钮开始,BIOS就接管系统控制权开始工作,它会先进行一些内存和设备的初始化工作(当然,也包括PCI设备),由于商业上的原因,Phoenix等厂商的BIOS代码需要授权协议,下面以另外一款开源BIOS(openbios)为例,来剖析BIOS中,PCIe设备是如...
  • Best_Ccc
  • Best_Ccc
  • 2017-12-26 16:22
  • 128
    个人资料
    • 访问:343143次
    • 积分:3531
    • 等级:
    • 排名:第11138名
    • 原创:127篇
    • 转载:5篇
    • 译文:3篇
    • 评论:29条
    博客专栏
    联系方式