PCI/e配置空间

PCI/PCIe的配置空间Configuration Space是一个与Memory空间和IO空间并列的独立的空间。PCI Configuration Space有256 Bytes,对于PCIe Configuration Space,扩展为4096 Bytes,PCIe是在PCI基础上发展的协议,并且在此基础之上进行了扩展,其扩展形式是通过一种称为Capability的寄存器块来完成的。

访问方式

IO方式

CPU提供了两组I/O寄存器用于访问配置空间:

  • 配置空间控制寄存器 CF8h-CFBh
  • 配置空间数据寄存器 CFCh-CFFh

传统方式,写IO端口CFCh和CF8h。只能访问PCI/PCIe设备的开始256个字节(PCI设备的配置空间本来就只有256个字节......)

// for PCI
address = BIT31 | ((Bus & 0xFF) << 16) | ((Dev & 0x1F) << 11) | ((Fun & 0x7) << 8) | (Reg & 0xfffffffc);//BIT31=0x80000000// write cfg register
IoWrite8(0xcf8, address);
// read data register
data8  = IoRead8(0xcfc);
data16 = IoRead16(0xcfc);
data32 = IoRead32(0xcfc);

Bit31代表enable bit。一定要置起来,否则不起作用。

MMIO方式

对于MMIO的访问,跟访问内存的方式一样,它从称为PCIEXBAR的基地址开始,有很大的一段空间,这个PCIEXBAR的值根据不同的平台可能不同,大致可能值有0xB0000000、0xC0000000等(飞腾用的就是0xB0000000)。

#define pcie_addr(m, b, d, f, o)        (m + ((b & 0xff) << 20) + ((d & 0x1f) << 15) + ((f & 0x7) << 12) + (o & 0xfffffffc)
#define mmio_read8(addr)            (*(volatile uint8 *)addr)
#define mmio_write8(addr, data8)    *(volatile uint8 *)addr = data8
#define mmio_read16(addr)           (*(volatile uint16 *)addr)
#define mmio_write16(addr, data16)  *(volatile uint16 *)addr = data16
#define mmio_read32(addr)           (*(volatile uint32 *)addr)
#define mmio_write32(addr, data32)  *(volatile uint32 *)addr = data32

配置寄存器组内保留了对PCI设备的基本特性进行详尽说明的可读信息,CPU读取这些信息后,就可以为PCI设备设定符合需要的配置内容,从而实现自动配置。这些可读信息包括:

Vendor ID :设备供应商编号,由PCI SIG国际组织分配。

Device ID :特定设备编号,由设备供应商分配。

Revision ID :设备的特定版本号,由设备供应商分配。

Class Code :设备的功能类别编号。

Header Type :指示Header 中从地址10H到3FH区域的内容格式,同时指示该设备是否为多功能设备。

扫描PCI设备的时候,我们可以直接通过Vendor ID与Device ID是否为0xffff来判断设备是否存在,如果是,则设备不存在,不过也有一种情况,国产并不完备,在硬件设计的时候,很有可能这个不存在的值并不是0xffff,也有可能是0才不存在:

//// Create PCI address map in terms of Bus, Device and Func//Address = EFI_PCI_ADDRESS (Bus, Device, Func, 0);//// Read the Vendor ID register//Status = PciRootBridgeIo->Pci.Read (PciRootBridgeIo,EfiPciWidthUint32,Address,1,Pci);if (!EFI_ERROR (Status) && (Pci->Hdr).VendorId != 0xffff && (Pci->Hdr).VendorId != 0) {//// Read the entire config header for the device//Status = PciRootBridgeIo->Pci.Read (PciRootBridgeIo,EfiPciWidthUint32,Address,sizeof (PCI_TYPE00) / sizeof (UINT32),Pci);return EFI_SUCCESS;}

这部分代码在PciEnumeratorSupport.c文件中有定义

PCI/PCIE相关知识相关推荐

  1. PCIe基础知识及Xilinx相关IP核介绍

    补发以下以前学习PCIe总结的知识. PCIe学习笔记系列: PCIe基础知识及Xilinx相关IP核介绍 概念了解:简单学习PCIe的数据链路与拓扑结构,另外看看有什么相关的IP核. [PG054] ...

  2. PCI设备驱动和相关知识

    在研究黑苹果驱动时,经常会看到修改Info.plist中的IOPCIMatch字段.需要研究一下相关内容. PCI是一种外设部件互连标准总线,和USB总线差不多,可以将不同类型的设备连接到同一条总线上 ...

  3. pcie dma 相关知识整理(xilinx平台)

    PCIE的DMA和PIO介绍 DMA数据传输方式 DMA(Direct Memory Access),直接内存访问,在该模式下,数据传送不是由CPU负责处理,而是由一个特殊的处理器DMA控制器来完成, ...

  4. PCI-E基础知识学习

    PCIE特点: (1)2种路由方式:基于地址的路由方式.基于ID(BDFR)的路由方式 (2)2种数据发送方式:Posted方式和No-Posted方式: (3)多种总线事务:配置读写.内存读写.IO ...

  5. PCIe物理层详细总结-PCIe专题知识(一)

    目录 前言 一.简介 二.PCIe物理层结构及功能 2.1 PCIe端对端连接方式 2.2 PCIe组成 2.2.1 逻辑层(Logic) 1 发送逻辑 2 接收逻辑 2.2.2 电气层(Electr ...

  6. SSD固态硬盘的相关知识和选购

    SSD固态硬盘的相关知识和选购 内存与外存 硬盘 固态硬盘的品牌.容量.颗粒 品牌(略) 容量(根据需求决定) 颗粒 固态硬盘的接口类型.总线通道.传输协议 固态硬盘的接口类型(插槽的形状) SATA ...

  7. 【PCI】PCI PCIE基础(一)

    关于PCI相关基础知识请参阅 王齐 先生的著作<PCI Express 体系结构导读>,个人认为这本书是学习PCI与PCIE的经典之作,以下简要说明初学者应阅读哪些章节. PCI 第一 ~ ...

  8. PCIe热插拔机制(详细)总结-PCIe专题知识(五)

    目录 前言 一.概述 二.原理详解 2.1 热插拔原理总结 2.2 热插拔软硬件要求 三.其他相关知识链接 1.PCIe物理层总结-PCIE专题知识(一) 2.PCIe数据链路层图文总结-PCIe专题 ...

  9. 主板是计算机所有部分连接的基础,计算机基础相关知识答案.doc

    计算机基础相关知识答案 计算机基础相关知识 一.填空题: 1.计算机的硬件主要由(控制器).(运算器).(存储器).(输入输出设备)以及电源等硬件组成. 2.计算机硬件系统可以分为两大部分,即(主机 ...

  10. 硬件知识:固态硬盘相关知识介绍

    今天就为大家全面科普一下固态硬盘的相关知识,让大家购买时做到心中有数,按需选择. 首先还是从SSD的结构来说起,SSD最基本的组成部件分为:主控芯片.闪存芯片.固件算法,下面我们分别阐述三者的工作职责 ...

最新文章

  1. getContext(),getApplicationContext(),getBaseContext()和“ this”之间的区别
  2. Kali Linux重新支持RTL8814au芯片
  3. java properties 路径问题_Java 读取Properties文件时应注意的路径问题
  4. 提示No Launcher activity found
  5. 使用JPA + Eclipselink操作PostgreSQL数据库
  6. Marshal在C#中的应用(void *指针到IntPtr的转化)
  7. C#设计模式--模板方法模式(学习Learning hard 设计模式笔记)
  8. 在ListView控件中绘底图
  9. oracle 修改 回话数,Oracle命令--修改oracle回话数
  10. 好未来:今年12月31日停止内地义务教育阶段学科类培训
  11. Linux拷贝分区内容,dd复制分区后目标分区的大小变成原分区了
  12. kjb文件 解析_微信安装包解析异常
  13. echarts全国地图显示到城市级别
  14. 书籍折页是什么效果_书籍折页什么样 - 卡饭网
  15. mysql like 百分号_mysql语句中使用like后面的%(百分号)的问题
  16. 关于kali出现乱码问题
  17. 云免停机卡免流服务器监控
  18. Excel之动态数据分析报表
  19. HTML5之canvas剪切图片
  20. 教你制作服务器中更高效率的刷怪塔,我的世界低耗材高效率凋零骷髅刷怪塔制作攻略...

热门文章

  1. Excel——批量填充有序序列、填充字母序列、自定义序列排序
  2. 使用Github上传本地项目代码
  3. AcWing 1402. 星空之夜(Flood Fill/哈希/DFS)
  4. python读取nc文件并转换成csv_python - 在python 3中读取Crystal Report .rpt文件并将其转换为.csv或.xlsx - 堆栈内存溢出...
  5. c语言实现http下载功能
  6. python创建工作簿_【Python操作Excel】02_操作工作簿与工作表
  7. 属性动画实现卫星菜单效果
  8. BAT大牛亲授从零起步基于ElasticSearch的搜房网(前后端集成)实战(第二章需求分析和数据库设计)
  9. 前端基础知识总结 (三)
  10. 在华为工作十年的感悟