百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

深入PCIE—配置空间详解1

feilongw 2024-12-13 12:35 6 浏览 0 评论

配置请求

PCI总线定义了两类配置请求,分别是Type 00h和Type 01h。其中HOST主桥或者PCI桥使用Type 00h配置请求,访问与HOST主桥或者PCI桥直接相连的PCI 设备或者PCI桥;而HOST主桥或者PCI桥使用Type 01h配置请求,需要至少穿越一个PCI桥,访问没有与其直接相连的PCI 设备或者PCI桥。也就是说Type 00访问现在桥下直接相连的PCI桥和设备,访问没有直接相连的设备时需要需用Type 01h访问,最后可以直接访问到设备时转化为Type 00h访问。

通常Type 01h访问会带有BUS号,而Type 00h只能访问当前BUS下的设备,所以只需要提供设备号和功能号。

PCI配置空间

PCI设备都有独立的配置空间,HOST主桥通过配置读写总线事务访问这段空间。PCI总线规定了三种类型的PCI配置空间,分别是PCI Agent设备使用的配置空间,PCI桥使用的配置空间和Cardbus桥片使用的配置空间。

下图为PCI Agent设备的配置空间寄存器描述:

PCIE在PCI基础上扩展了配置空间,配置空间大小为0~0xfff。其中在0x40~0xff之间添加了一个Capability链表来扩展PCI配置空间,链表的首地址存放在配置空间0x34的位置,链表如下图:

配置空间地址0x100~0xfff主要存放PCIe独有的一些capbility结构,如AER, SR-IOV等。

PCI配置空间寄存器简介

本节简单介绍配置空间的各个寄存器,下文会详细介绍。

  1. Device ID和Vendor ID代表PCI设备的生产厂商和厂商所生产的具体设备,Subsystem Vendor ID一般和厂商ID相同,Subsystem ID一般没有特别要求。
  2. Command寄存器为PCI设备的命令寄存器,Status寄存器保存PCI设备的状态。
  3. Revision ID寄存器记载PCI设备的版本号,Class Code寄存器表示设备所属类别,如网卡,存储卡,显卡等。
  4. Cache Line Size寄存器记录HOST处理器使用的Cache行长度,Latency Timer寄存器用来控制PCI设备占用PCI总线的时间.
  5. Header Type寄存器第7位为1表示当前PCI设备是多功能设备,为0表示为单功能设备,第6~0位表示当前配置空间的类型,为0表示该设备使用PCI Agent设备的配置空间,普通PCI设备都使用这种配置头;为1表示使用PCI桥的配置空间,PCI桥使用这种配置头;为2表示使用Cardbus桥片的配置空间。
  6. BIST寄存器可选,用于内部自检。Max_lat寄存器为设备期望的最大延时; Min_Gbt寄存器为设备期望的最小延时;CardBus CISpointer寄存器用于表明访问CIS(card info structure)的地址空间。
  7. BAR地址寄存器负责PCI设备内部空间的映射。type0有6个32bit的BAR寄存器,type1与2个32bit的BAR寄存器。每一个BAR地址对应一个地址空间。
  8. Capbility Pointer寄存器存放Capabilities 结构链表的头指针, capbility用于表示pci设备支持的能力。在一个PCIe 设备中,可能含有多个Capability 结构,这些寄存器组成一个链表。
  9. Expansion ROM base address寄存器存放一个基地址。有些PCI设备在处理器还没有运行操作系统之前,就需要完成基本的初始化设置,比如显卡的Vbios,该寄存器就是用来记录这段ROM程序的基地址的。
  10. Interrupt Line寄存器是系统软件对PCI设备进行配置时写入的,该寄存器记录当前PCI设备使用的中断向量号;Interrupt Pin寄存器保存PCI设备使用的中断引脚。

PCI配置空间部分寄存器详细定义

Command寄存器

 #define PCI_COMMAND     0x04    /* 16 bits */
 #define  PCI_COMMAND_IO     0x1 /* Enable response in I/O space */ 
 #define  PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */
 #define  PCI_COMMAND_MASTER 0x4 /* Enable bus mastering */
 #define  PCI_COMMAND_SPECIAL    0x8 /* Enable response to special cycles */
 #define  PCI_COMMAND_INVALIDATE 0x10    /* Use memory write and invalidate */
 #define  PCI_COMMAND_VGA_PALETTE 0x20   /* Enable palette snooping */
 #define  PCI_COMMAND_PARITY 0x40    /* Enable parity checking */
 #define  PCI_COMMAND_WAIT   0x80    /* Enable address/data stepping */
 #define  PCI_COMMAND_SERR   0x100   /* Enable SERR */
 #define  PCI_COMMAND_FAST_BACK  0x200   /* Enable back-to-back writes */
 #define  PCI_COMMAND_INTX_DISABLE 0x400 /* INTx Emulation Disable */

Status寄存器

 #define PCI_STATUS      0x06    /* 16 bits */
 #define  PCI_STATUS_INTERRUPT   0x08    /* Interrupt status */
 #define  PCI_STATUS_CAP_LIST    0x10    /* Support Capability List */
 #define  PCI_STATUS_66MHZ   0x20    /* Support 66 MHz PCI 2.1 bus */
 #define  PCI_STATUS_UDF     0x40    /* Support User Definable Features [obsolete] */
 #define  PCI_STATUS_FAST_BACK   0x80    /* Accept fast-back to back */
 #define  PCI_STATUS_PARITY  0x100   /* Detected parity error */
 #define  PCI_STATUS_DEVSEL_MASK 0x600   /* DEVSEL timing */
 #define  PCI_STATUS_DEVSEL_FAST     0x000
 #define  PCI_STATUS_DEVSEL_MEDIUM   0x200
 #define  PCI_STATUS_DEVSEL_SLOW     0x400
 #define  PCI_STATUS_SIG_TARGET_ABORT    0x800 /* Set on target abort */
 #define  PCI_STATUS_REC_TARGET_ABORT    0x1000 /* Master ack of " */
 #define  PCI_STATUS_REC_MASTER_ABORT    0x2000 /* Set on master abort */
 #define  PCI_STATUS_SIG_SYSTEM_ERROR    0x4000 /* Set when we drive SERR */
 #define  PCI_STATUS_DETECTED_PARITY 0x8000 /* Set on parity error */

Class Code寄存器

Class Code寄存器包含三个byte,0Bh为base class code;0Ah为sub-class code;09h表示编程接口。其中,按照PCI规范base class code不能为0,很多FPGA工程师将这位置0,导致pci扫描设备时直接返回,无法找到设备。下面为主要的base class,sub-class的种类太多,有兴趣的可以去看linux代码。

#define PCI_BASE_CLASS_STORAGE      0x01
#define PCI_BASE_CLASS_NETWORK      0x02
#define PCI_BASE_CLASS_DISPLAY      0x03
#define PCI_BASE_CLASS_MULTIMEDIA   0x04
#define PCI_BASE_CLASS_MEMORY       0x05
#define PCI_BASE_CLASS_BRIDGE       0x06
#define PCI_BASE_CLASS_COMMUNICATION    0x07
#define PCI_BASE_CLASS_SYSTEM       0x08
#define PCI_BASE_CLASS_INPUT        0x09
#define PCI_BASE_CLASS_DOCKING      0x0a
#define PCI_BASE_CLASS_PROCESSOR    0x0b
#define PCI_BASE_CLASS_SERIAL       0x0c
#define PCI_BASE_CLASS_WIRELESS         0x0d
#define PCI_BASE_CLASS_INTELLIGENT  0x0e
#define PCI_BASE_CLASS_SATELLITE    0x0f
#define PCI_BASE_CLASS_CRYPT        0x10
#define PCI_BASE_CLASS_SIGNAL_PROCESSING 0x11

配置空间先介绍到这里,下篇文章将举例来介绍pci配置空间及pcie扩展配置空间。

相关推荐

企业IT数字化运维运营平台(总体架构、总体蓝图)建设方案

这份文件是关于企业IT数字化运维运营平台的建设方案,主要介绍了业务背景、解决方案、成功应用案例等核心内容。更多参考公众号:优享智库以下是文件的核心要点总结:业务背景概述:IT运维趋势:随着万物互联时代...

新环境下的运维体系搭建

数字化转型的背景下,运维环境和技术实现发生很大变化。一、运维环境发生了哪些变化?例如业务上云,运维环境就发生变化,包括运维对象,运维流程和运维工具。首先运维对象在机房动环、物理设备基础上增加了虚拟机、...

大型银行文件传输架构设计及运维管理

一、背景随着银行信息化的快速发展,应用系统的数量逐步增多,系统间数据文件的传输需求呈指数级增长,起初系统间自行约定对接传输的方式,产生诸多问题,使日常运维和管理工作变得更为复杂。问题一业务系统间文件传...

充电桩运维方案,组织架构及岗位职责,运维人员配置标准

分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!充电桩运维方案如何拿到分享的源文件:请您关注、转发,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给您。...

优秀的运维架构师应该具备哪些能力?(1)

作者介绍苏君福(Jeff)10多年运营管理及系统架构规划经验,擅长ITIL企业实战。现任全时企业社交平台总监一职。合格的运营式运维工程师首先,我们总结下,关于谈到何为一名合格的运维运营工程师,大概就...

微服务时代,运维必须了解的那些事(服务架构演变)

现在IT已经进入了微服务时代,作为运维,思想观念也需要跟上,所以,这里跟大家说一下,运维需要知道哪些知识。服务架构演变史首先说一下架构的演变史。应用架构已经从最开始单体架构,SOA架构逐渐演变成了现在...

配电智能运维系统架构

随着云计算、大数据、人工智能领域的快速发展,企业配用电管理在经济性、持续性、可靠性上提出了挑战。传统末端配电和运维方式因其局限性而难以适应用户数字化、智能化管理,而使用智能、高效的配电运维方式,可以解...

机房动环监控运维的前端架构设计与实现

...

大型集团企业IT基础架构和应用运维体系解决方案PPT,架构体系

分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!大型集团企业IT基础架构和应用运维体系解决方案PPT如何拿到分享的源文件:请您关注、转发,然后私信本头条号“文米”2个字,按照操作流程,专...

轻松监控上万台服务器:企业运维监控平台架构设计与实践指南

一、Cacti/Nagios/Zabbix/centreon/Ganglia之抉择1、cactiCacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具。简单的说...

这效果真绝了:基于前端技术的机房动态监控运维系统架构设计实现

Junit+Jacoco+SonarQube实现单元测试及覆盖率

一、为什么要做单元测试一个程序是由许多基本单元代码组合而成复杂的系统,如果程序的基本单元都无法保证正确性,代码层级递增时,错误就会不断放大,直到整个系统无法使用。所以单元测试的意义就在于保证基本代码模...

第四篇 SonarQube部署及代码质量扫描

一、初始化SonarQubeToken点击右上角账号->下拉选择我的账号->点击安全选项,输入令牌名称->点击生成或者直接访问这个地址http://10...

聊一聊如何用SonarQube管理.NET代码质量

背景代码质量其实是一个很容易被忽略的关键点,可能有的团队会有CodeReview这些环节来做一定程度的保障,但是这个CodeReview会很耗费人力和时间,估计大部分团队都不会很经常的来...

Jenkins+Gitlab+Nginx+SonarQube+Maven编译Java项目自发布与回退

环境拓扑:?Jenkins-192.168.1.30?Gitlab-192.168.1.31?LB-192.168.1.32?Web1-192.168.1.33?Web2-192.168.1...

取消回复欢迎 发表评论: