文章目录

  • pcie 知识
  • 感官认识
  • PCIe与PCI的不同
  • PCIe的存储空间
    • PCIe 控制器寄存器空间
    • 映射出来的空间1:PCI Configuration Space( for all PCI devices)
    • 映射出来的空间1:PCIe Configuration Space扩展空间( for all PCIe devices)
    • 映射出来的空间2:PCIe 插槽上插入的设备上的寄存器空间
  • PCIe的映射
  • 配置空间
    • Header Type0
    • Header Type1
  • PCI与PCIe 非桥设备的访问
  • PCI与PCIe 桥设备的访问
  • PCIe 在 linux 下的驱动
  • PCIe 验证
    • 1.PCIe 传递裸数据
    • 2.PCIe 转其他设备
  • PCIe转其他总线
    • RS232
    • USB
  • 从用户空间理解PCIe
  • lspci 实例
  • IO address space in x86
    • I/O Address Space 中的 0xCF8-0xCFF(仅限X86)
  • x86 pc 中的 pcie
  • PCIe 驱动
  • PCIe IO address space

pcie 知识

  • PCIE详细介绍

感官认识

  • 总线协议接口 视频介绍
  • pcie 总线接口引脚定义1&2
REFCLK对于控制器来说是 输入PCIE的REFCLK一般由外部提供
CLKREQ对于控制器是输出Downstream/Upstream  Component通过assert CLKREQ#来请求REFCLK。
RESET对于 host 来说 是 输入输出,对于 ep(slave) 来说是输入
WAKEUP不知道是用于 host 串行 ep , 还是 ep 唤醒host
  • PCIe 视频介绍及PCIe文字介绍
PCIe上可以接各种控制器硬盘控制器+硬盘声卡控制器+音响咪头/耳机显卡USB控制器RS232

PCIe与PCI的不同

1. PCIe数据是串行的,PCI数据是并行的
2. 由于数据是串行的,PCIe 数据要封包,PCI数据不需要封包,地址和数据直接呈现在总线上
3. PCIe 拓扑架构(RC+switch+device)和PCI拓扑架构(bridge+device)有明显的不同3.1. PCIe bridge 下面 最多有1个 PCIe device. PCI bridge 下面 最多有256个 PCI device. 3.2. 在同一个PCIe总线上,最多只有1个PCIe device . 在同一个PCIe总线上,最多有256个PCIe device . 3.3. PICe device 只和 一个 PCIe bridge的扇出 直接相连,不和 其他的 PCIe bridge 和 PCIe device 直接相连 . PIC device    和 一个 PCI bridge的扇出 直接相连,也可和多达 255个PCI device 直接相连 .3.4. PICe bridge在PCIe拓扑中的位置 类似于 PIC device在PCI拓扑中的位置

PCIe的存储空间

https://zhuanlan.zhihu.com/p/612366598
https://blog.csdn.net/yeiris/article/details/126633678
https://blog.csdn.net/yeiris/article/details/126694729
PCIe 控制器寄存器空间
Memory Address Space
MMIO
映射出来的空间1:PCI Configuration Space( for all PCI devices)
插槽上插入的设备的信息所在地址
(256Byte)
  • 访问原理
  • 代码
空间大小PCI : 16MB // 每个设备 256Byte配置前的访问方式 // 配置region 前 不可访问 待更新2023-4-29 18:23:02x86中访问方式: 3种1. 通过 I/O Address Space 0xCF8-0xCFB 和 0XCFC-0xCFF 访问 前 256Byte // 每个function  的起始地址(共256Byte) 由 (bus<<16)|(dev<<11)|(fun<<8) 决定// IO访问仅能读取到前256个Byte,256Byte后的空间需要用内存访问2. MMIO访问 , 映射A是 启动就建立好的 , BIOS 中写入基地址就建立了隐性映射A(cpu addr <-> 16MB的配置空间)arm中访问1. MMIO访问 , 映射A是 启动就建立好的配置后的访问方式 // 如果只能用于IO 访问, 那么需要建立映射Bx86中访问方式: 3种1. 配置前的访问方式2. DMA 访问 前4096Byte // 可以用映射A,也可以用映射B3. MMIO 访问 前4096Byte // 可以用映射A,也可以用映射Barm中访问1. 配置前的访问方式 // IO 只能 访问 前256字节// MMIO 可以访问 前4096字节 // 用映射A2. DMA 访问 前4096Byte // 可以用映射A,也可以用映射B3. MMIO 访问 前4096Byte // 可以用映射A,也可以用映射B
================
如果需要 DMA 访问或者 MMIO 访问
需要提前配置 reigon0 的 寄存器 以 建立 cpu addr 到 pcie addr 的映射关系
================
访问方式: 不同的 访问方式对应的 linux驱动 中定义的 struct pci_ops 中的 read 和 write
MMIO访问  是 readl     和 writel
IO访问        是 inl      和 outl
映射出来的空间1:PCIe Configuration Space扩展空间( for all PCIe devices)
插槽上插入的设备的信息所在地址
(4096Byte)
  • 访问原理
  • 代码
空间大小PCIe: 256MB // 每个设备4096Byte
配置前的访问方式 : x86 和 arm 是一样的  // 配置region 前 不可访问 待更新2023-4-29 18:23:021. 通过 I/O Address Space 0xCF8-0xCFB 和 0XCFC-0xCFF 访问 前 256Byte // 每个function  的起始地址(共256Byte) 由 (bus<<16)|(dev<<11)|(fun<<8) 决定// IO访问仅能读取到前256个Byte,256Byte后的空间需要用内存访问注意 : 256-4096 Byte 只能在配置后访问2. MMIO访问 , 映射A是 启动就建立好的 , BIOS 中写入基地址就建立了隐性映射A(cpu addr <-> 256MB的配置空间)arm中访问1. MMIO访问 , 映射A是 启动就建立好的
配置后的访问方式x86中访问方式: 3种1. 配置前的访问方式// IO 只能 访问 前256字节// MMIO 可以访问 前4096字节 // 用映射A2. DMA 访问  前4096Byte // 可以用映射A,也可以用映射B3. MMIO 访问 前4096Byte // 可以用映射A,也可以用映射Barm中访问1. 配置前的访问方式 // 用映射A2. DMA  访问 前4096Byte// 可以用映射A,也可以用映射B3. MMIO 访问 前4096Byte// 可以用映射A,也可以用映射B
映射出来的空间2:PCIe 插槽上插入的设备上的寄存器空间
访问方式 和 配置空间一样,具体要用那种手段要看 BAR 支持 哪种访问属性1. DMA&MMIO access2. IO access如果需要 DMA 访问或者 MMIO 访问
需要提前1.配置 reigon0 的 寄存器 以 建立 cpu(mmio) addr 到 pcie addr 的映射关系2.填充配置空间的 bar 区域如果需要 DMA 访问或者 MMIO 访问
需要提前1.配置 reigon0 的 寄存器 以 建立 cpu(mmio) addr 到 pcie addr 的映射关系2.填充配置空间的 bar 区域

PCIe的映射

Outbound是将 cpu地址  翻译到 PCIe地址
Inbound 是将 PCIe地址 翻译成 cpu地址
host侧 cpu 主动发起的 对 设备寄存器的访问1. host侧的 cpu addr 经过 pcie rc 的 outbound 转换为 pcie addr2. pcie 总线上 接的设备 收到 地址(pcie addr)3. 设备侧pcie ep 的 inbound 将 pcie addr 转换为 设备侧真实存在的寄存器地址(可以是设备的一个version地址)设备 主动发起的 对 rc侧内存 的访问1. 设备侧的 cpu addr 经过 pcie ep 的 outbound 转换为 pcie addr2. pcie 总线上 接的host 收到 地址(pcie addr)3. 主机侧pcie rc 的 inbound 将 pcie addr 转换为 主机侧真实存在的内存地址(可以是内存中的一个地址)

配置空间

Configuration Address Space的大小为:256 Bytes/function x 8 functions/device x 32 devices/bus x 256 buses/system = 16MB。每个 function(256字节) 的空间分布每一个PCI功能(Function)都包含256个字节的配置空间(Configuration Space)前64个字节被称为HeaderPCI Spec规定了两种类型的Header:Type1 和 Type0Type0 Header表示该PCI设备功能     不是桥Type1 Header表示该PCI设备功能      是桥(Bridge)后192个字节用于 function-specific
Header Type0
BAR存储了大小和属性BAR寄存器在PCIe配置空间里面,一个PCIe设备
可能有若干个内部空间(最多6个)需要映射到主机memory地址空间,
设备出厂时,这些空间的大小和属性都写在

Header Type1
  • Header Type 1

PCI与PCIe 非桥设备的访问

PCI配置空间访问的时候1.根据idsel 选中设备2.ce 是表示读还是写3.总线上的type0地址选中 fuction和 reg4.配置设备(给设备分配pci地址空间,每个设备的pci地址空间不同).内存空间访问的时候读写地址可以,发送到pcie总线,地址符合的设备会回应。PCIe配置空间访问的时候1.发出request , 因为是直连的,所以不需要选中设备2.request 中的 type cfgrd0表示是配置空间访问3.request 中的 fuction和 reg 表示4.配置设备(给设备分配pcie地址空间,每个设备的pcie地址空间不同).内存空间访问的时候读写地址可以,发送到pcie总线,地址符合的pcie桥会转发,pcie桥连接的唯一设备会回应。点到点说的就是这个(PCIe桥唯一连接一个设备).独享带宽说的也是这个

PCI与PCIe 桥设备的访问

PCI桥设备配置空间访问的时候1.根据idsel 选中设备2.ce 是表示读还是写3.总线上的type0地址选中 fuction 和 reg4.配置桥的总线number1.上级桥number2.自己的number3.下面的最大的number5.配置桥下属设备的地址空间桥下属设备配置空间访问的时候转发 type1 信号 到下一级(可能转发为type1,也可能转发为type0)非桥设备内存空间访问的时候地址如果匹配,转发PCIe配置空间访问的时候1.发出request , 因为是直连的,所以不需要选中设备2.request 中的 type cfgrd0表示是配置空间访问3.request 中的 fuction和 reg 表示4.配置桥1.上级桥number2.自己的number3.下面的最大的number5.配置桥下属设备的地址空间桥下属设备配置空间访问的时候转发 cfgrd1 信号 到下一级(可能转发为 cfgrd1,也可能转发为 cfgrd0)非桥设备内存空间访问的时候地址如果匹配,转发

PCIe 在 linux 下的驱动

  • 【原创】Linux PCI驱动框架分析(一)

  • 【原创】Linux PCI驱动框架分析(二)

  • 【原创】Linux PCI驱动框架分析(三)

  • PCIe 专栏1

PCIe 验证

  • PCIe 2.0 验证
  • PCIe 与 AMBA 兼容
  • PCIe 总线
1.PCIe 传递裸数据

2.PCIe 转其他设备
如果转 xhci(USB3.0)
如果PCIe已经处理好BAR,那么在软件上
只需要 处理 xhci 的寄存器空间即可?

PCIe转其他总线

RS232
  • CH382及我的理解
  • CH382 github 代码
USB
  • VL805,需单独供电及 VL805裸机

  • μPD720202K8及我的理解

从用户空间理解PCIe

# lspci
00:00.0 PCI bridge: Texas Instruments Device b01000:00.0 表示含义为 <bus number>:<device number>.<function number>bus number       : 8bits 最多连接到       256     个bus
device number   : 6bits 最多连接到       32      种装置
function number : 3bits 最多每种装置有     8       种功能
0100: 1000:0056 表示含义为 Class ID: Vendor ID Device ID

参数说明

查看所有pci设备
lspci
查看指定的pci设备信息(VID&PID)
lspci -s 02:03.0 -n
查看指定的pci设备信息(前64)
lspci -s 02:03.0 -x
查看指定的pci设备信息(前256)
lspci -s 02:03.0 -xxx
查看指定的pci设备信息(前4096)
lspci -s 02:03.0 -xxxx

lspci 实例

 lspci  -vvv -s 05:00.0
05:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 10)Subsystem: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet ControllerControl: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-Latency: 0, Cache Line Size: 64 bytesInterrupt: pin A routed to IRQ 17NUMA node: 0Region 0: I/O ports at d000 [size=256] // 这里提到的 region 0 是 BAR0,里面是 pcie地址Region 2: Memory at fb104000 (64-bit, non-prefetchable) [size=4K]  // BAR2Region 4: Memory at fb100000 (64-bit, non-prefetchable) [size=16K] // BAR4Capabilities: <access denied>Kernel driver in use: r8169Kernel modules: r8169sudo lspci  -xxx -s 05:00.0
05:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 10)
00: ec 10 68 81 07 04 10 00 10 00 00 02 10 00 00 00
10: <01 d0 00 00> <00 00 00 00> <04 40 10 fb> <00 00 00 00>
20: <04 00 10 fb> <00 00 00 00> 00 00 00 00 ec 10 23 01
30: 00 00 00 00 40 00 00 00 00 00 00 00 0a 01 00 00
40: 01 50 c3 ff 08 00 00 00 00 00 00 00 00 00 00 00
50: 05 70 80 00 00 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 10 b0 02 02 c0 8c 00 00 00 50 19 00 11 7c 47 00
80: 42 00 11 10 00 00 00 00 00 00 00 00 00 00 00 00
90: 00 00 00 00 1f 08 0c 00 00 00 00 00 02 00 00 00
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
b0: 11 d0 03 80 04 00 00 00 04 08 00 00 00 00 00 00
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
d0: 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00/proc/ioports
0cf8-0cff : PCI conf1 // x86 的 用于访问 配置空间的 ioport
1000-ffff : PCI Bus 0000:00 // 1000-ffff 用于所有设备内存的IO PORT空间d000-dfff : PCI Bus 0000:05<d000-d0ff : 0000:05:00.0>e000-efff : PCI Bus 0000:03e000-e07f : 0000:03:00.0f000-f01f : 0000:00:1f.2f000-f01f : ahcif020-f023 : 0000:00:1f.2f020-f023 : ahcif030-f037 : 0000:00:1f.2f030-f037 : ahcif040-f043 : 0000:00:1f.2f040-f043 : ahcif050-f057 : 0000:00:1f.2f050-f057 : ahci/proc/iomem80000000-8fffffff : PCI MMCONFIG 0000 [bus 00-ff] // 配置空间 的地址 256MB ,, 这些地址是cpu物理地址
90000000-fbffbfff : PCI Bus 0000:00 // 90000000-fbffbfff 用于所有设备内存的IO PORT空间, 这些地址是cpu物理地址e0000000-f1ffffff : PCI Bus 0000:03e0000000-efffffff : 0000:03:00.0f0000000-f1ffffff : 0000:03:00.0fa000000-fb0fffff : PCI Bus 0000:03fa000000-faffffff : 0000:03:00.0fb080000-fb083fff : 0000:03:00.1fb080000-fb083fff : ICH HD audiofb100000-fb1fffff : PCI Bus 0000:05<fb100000-fb103fff : 0000:05:00.0><fb104000-fb104fff : 0000:05:00.0>fb104000-fb104fff : r8169fb200000-fb2fffff : PCI Bus 0000:02fb200000-fb203fff : 0000:02:00.0fb200000-fb203fff : nvmefb300000-fb30ffff : 0000:00:14.0fb300000-fb30ffff : xhci-hcdfb310000-fb313fff : 0000:00:1b.0fb310000-fb313fff : ICH HD audiofb315000-fb3150ff : 0000:00:1f.3fb316000-fb3167ff : 0000:00:1f.2fb316000-fb3167ff : ahcifb317000-fb3173ff : 0000:00:1d.0fb317000-fb3173ff : ehci_hcdfb318000-fb3183ff : 0000:00:1a.0fb318000-fb3183ff : ehci_hcdfb319000-fb31900f : 0000:00:16.1fb31a000-fb31a00f : 0000:00:16.0fb31b000-fb31bfff : 0000:00:05.4-------------------\-[0000:00]-+-00.0+-01.0-[01]--+-01.1-[02]----00.0+-03.0-[03]--+-00.0|            \-00.1+-05.0+-1a.0+-1b.0+-1c.0-[04]--+-1c.7-[05]----00.0
$ lspci -s 00:1c.7 -vvv
00:1c.7 PCI bridge: Intel Corporation C610/X99 series chipset PCI Express Root Port #8 (rev d5) (prog-if 00 [Normal decode])Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-Latency: 0, Cache Line Size: 64 bytesInterrupt: pin D routed to IRQ 30NUMA node: 0Bus: primary=00, secondary=05, subordinate=05, sec-latency=0I/O behind bridge: <0000d000-0000dfff [size=4K]>Memory behind bridge: <fb100000-fb1fffff [size=1M]>Prefetchable memory behind bridge: 00000000fff00000-00000000000fffff [disabled]Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort+ <SERR- <PERR-BridgeCtl: Parity- SERR+ NoISA- VGA- VGA16+ MAbort- >Reset- FastB2B-PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-Capabilities: <access denied>Kernel driver in use: pcieport
00:03.0 PCI bridge: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 (rev 02) (prog-if 00 [Normal decode])Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-Latency: 0, Cache Line Size: 64 bytesInterrupt: pin A routed to IRQ 28NUMA node: 0Bus: primary=00, secondary=03, subordinate=03, sec-latency=0I/O behind bridge: 0000e000-0000efff [size=4K]  ----------------------------Memory behind bridge: fa000000-fb0fffff [size=17M] ----------------------------Prefetchable memory behind bridge: 00000000e0000000-00000000f1ffffff [size=288M] ----------------------------Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort+ <SERR- <PERR-BridgeCtl: Parity- SERR+ NoISA- VGA+ VGA16+ MAbort- >Reset- FastB2B-PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-Capabilities: <access denied>Kernel driver in use: pcieport\-[0000:00]-+-00.0+-01.0-[01]--+-01.1-[02]----00.0+-03.0-[03]--+-00.0|            \-00.1
$ lspci -s 03:00.0 -vvv
03:00.0 VGA compatible controller: NVIDIA Corporation GT216 [GeForce GT 220] (rev a2) (prog-if 00 [VGA controller])Physical Slot: 4Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-Latency: 0, Cache Line Size: 32 bytesInterrupt: pin A routed to IRQ 44NUMA node: 0Region 0: Memory at fa000000 (32-bit, non-prefetchable) [size=16M] ----------------------------Region 1: Memory at e0000000 (64-bit, prefetchable) [size=256M] ----------------------------Region 3: Memory at f0000000 (64-bit, prefetchable) [size=32M] ----------------------------Region 5: I/O ports at e000 [size=128] ----------------------------Expansion ROM at 000c0000 [disabled] [size=128K]Capabilities: <access denied>Kernel driver in use: nouveauKernel modules: nvidiafb, nouveau$ lspci -s 03:00.1 -vvv
03:00.1 Audio device: NVIDIA Corporation GT216 HDMI Audio Controller (rev a1)Physical Slot: 4Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-Latency: 0, Cache Line Size: 32 bytesInterrupt: pin A routed to IRQ 27NUMA node: 0Region 0: Memory at fb080000 (32-bit, non-prefetchable) [size=16K] ----------------------------Capabilities: <access denied>Kernel driver in use: snd_hda_intelKernel modules: snd_hda_intel

IO address space in x86

I/O Address Space 中的 0xCF8-0xCFF(仅限X86)
x86独有64KB(0x0000-0xffff)的I/O Address Space,arm没有
对于PCIe来说,只用到了 0xCF8-0xCFB 和 0XCFC-0xCFF,用来访问 Configuration Address Space
Configuration Address Space所使用的IO寄存器范围为0xCF8~0xCFF。
其中0xCF8~0xCFB (可以存储32bit)为端口地址,0xCFC~0xCFF为配置数据。访问方式:IO汇编在linux中, outl inl

x86 pc 中的 pcie

  • 该文阐述的北桥-南桥式架构已经发生了变化
1. 南北桥还存在
2. 南北桥一体化了,做成了一个芯片(2023-4-22 22:21:21) https://zhuanlan.zhihu.com/p/461982828
3. 主板上没有pci总线了,也没有isa总线了,只有pcie总线和其他总线// 虽然南北桥芯片中会有pcie-isa 设备,也会有总线接口, 但是一般主板上不接出来了// 不知道南北桥芯片中会不会有pcie-pci bridge,目前看主板上一般上没有pci总线了
4. 南北桥芯片出来的是 各种 "pcie总线桥" 转化过的总线 或者 pcie子总线南北桥芯片输出的非pcie 接口音频接口(里面已经集成了了pcie接口的音频控制器) // 这内置的设备都是 internal bus 0上的设备,属于rcusb接口(里面已经集成了了pcie接口的usb控制器)// 这内置的设备都是 internal bus 0上的设备,属于rc(Root Complex)// internal bus 0 存在于 rc 内部,只要是在rc外部, bus number 肯定不是0 , 最小 为 1// internal bus 0(root bus) 是 host bridge 直连的pcie总线// pcie 控制器驱动就是 Root Complex的驱动, 更本质上是 host bridge 的驱动(pci_scan_root_bus_bridge->pci_register_host_bridge)// 当然 pcie 控制器驱动 会处理 子桥 (pci_scan_root_bus_bridge->pci_scan_child_bus) 以及更深层次的桥(递归调用pci_scan_child_bus)// 在这里https://www.cnblogs.com/LoyenWang/p/14165852.html看 rc 和 host bridge 的关系// Host bridge 作为 internal bus 0 的 第一个设备的第一个function存在,id为 00:00.0南北桥芯片输出的pcie 接口// 该pcie接口对应的总线 不是 internal bus 0// 至少是 经过了一级 pci-pci bridge 的总线// bus number 最小 为 1pcie接口(主板上连接了pcie网卡+phy)pcie 插槽 // 只要是插槽,其所在的bus number肯定不为0m.2 插槽

PCIe 驱动

分两类1. pcie控制器 的驱动也可以称为 host bridge 的驱动, 也可称为  pcie 控制器的驱动.一般由 soc厂家 开发维护pcie控制器一般设置为rc功能 : 枚举设备,为pcie设备分配 配置空间和内存空间和中断2. pcie 设备的驱动pcie 设备中也有pcie控制器,且必须设置为ep,一般由 pcie板卡厂家 开发维护功能:应用 "pcie控制器为其准备好的 内存空间" 初始化 pcie设备应用 "pcie控制器为其准备好的 中断"     获取软中断, 并注册 中断处理函数等等

PCIe IO address space

  • PCIe架构下memory空间、IO空间、PCIe配置空间简介
 X86采用独立编址的方式,将memory操作与外设IO操作分开了,才有了memory空间和IO空间的区分。X86平台CPU内部对内存和外设寄存器访问的指令也是不同的。
ARM 架构没有 IO 空间的 概念,不支持 IO 空间IO空间:访问外部设备寄存器的地址区域,(PCI支持4GB的IO空间,但是x86平台为64KB),因为X86平台只支持64KB的IO空间,Endpoint为了能在X86上使用,只能把自己的消耗的IO资源限制在64KB以内。由于Endpoint纷纷把IO资源的消耗限制在64KB,因此,大部分其他架构的CPU也把IO空间限制到64KB以内了(不是无法支持,而是根本用不着这么大IO空间)。
————————————————
版权声明:本文为CSDN博主「linjiasen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/linjiasen/article/details/87944672
  • 如果一个设备只支持 IO Address Space , 那么 可以用在 arm64 平台吗?
支持 , 参考 rk3399的pcie
这个 IO Address Space 这个空间的映射关系及 对应的 region 寄存器来 控制,假设 对应   REGION1
在REGION1 的 desc0(地址为0x028) 中的 [3:0] 表示了 这次映射 是是 "memory IO" 还是 "IO"
在 rockchip_pcie_prog_ob_atu 时第三个参数为 AXI_WRAPPER_MEM_WRITE 时表示 设置为  "memory IO"第三个参数为 AXI_WRAPPER_IO_WRITE  时表示 设置为  "IO"当arm64 对 这块 内存空间 进行ioport 访问 的时候如果设置为 "memory IO" , 将会产生 一个 TLP, TLP Type 为 CfgRdx或者CfgWrx如果设置为 "IO"      , 将会产生 一个 TLP, TLP Type 为  IORd或者 IOWr
arm64 如何进行 ioport 访问呢?实际上arm64架构 不支持 ioport , 只支持 iomemarm64架构的linux 中也有ioport的概念,但实际上是底层走了 iomem,只是呈现出来 在 /proc/ioport 有 映射关系 而已. 即实际 ioport 访问的时候 ,底层 走的 指令是 load 或者 store , 而不是 inb(arm64没有这种指令) 或者 outb(arm64没有这种指令)

PCIe 资料收集2相关推荐

  1. Spring Cloud 学习资料收集

    导读 关于Spring Cloud 去年开始逐渐多的出现在我的视线中,随着微服务这个词越来越热,我们或多或少的都听说过这个词,我们可以将Spring Cloud 看做是java 中Spring 为我们 ...

  2. JNI学习开始篇 基础知识 数据映射及学习资料收集

    JNI学习开始篇 基础知识 数据映射及学习资料收集 JNI介绍 JNI(Java Native Interface) ,Java本地接口. 用Java去调用其他语言编写的程序,比如C或C++. JNI ...

  3. VULKAN学习资料收集

    VULKAN学习资料收集 https://github.com/vinjn/awesome-vulkan 张静初 https://zhuanlan.zhihu.com/p/24798656 知乎 ht ...

  4. RTS寻路相关资料收集

    RTS寻路相关资料收集 http://www.cocoachina.com/game/20150824/13174.html RVO算法 RVO避开agent posted on 2018-09-20 ...

  5. UNITY优化资料收集

    UNITY优化资料收集 U3D手册: Optimizing garbage collection in Unity games https://zhuanlan.zhihu.com/p/2530699 ...

  6. c# LUA 互通,相关资料收集

    c# LUA 互通,相关资料收集 1,https://blog.csdn.net/henren555/article/details/44095509 posted on 2018-07-27 11: ...

  7. UNITY 内存问题资料收集

    UNITY 内存问题资料收集 1,https://blog.csdn.net/wetest_tencent/article/details/52130703 2,http://blog.51cto.c ...

  8. dubbo/dubbox部署资料收集

    dubbo/dubbox部署资料收集 最近由于项目需要要部署bubbox,dubbo,在找资料过程中用的的一些网址如下,后来由于取消没有实际应用,以备今后再用 http://dubbo.io/Admi ...

  9. 【转帖】财务尽职调查资料收集总结

    资料收集是进行财务尽职调查的重要依据,资料收集不仅有外部资料,也有企业内部资料.并且客户从项目组资料的收集过程中,可以判断出一个项目经理及其团队的素质及能力. 一.资料来源 项目期间资料主要来源于以下 ...

最新文章

  1. Windows 7任务栏图标特别说明
  2. ASP.NET Core EFCore 之Code First
  3. php把int转string,如何在php中实现int转string
  4. 解决 No module named ‘PyQt5.QtWebEngineWidgets‘
  5. smooth_L1_loss_layer.cpp:28] Check failed: bottom[0]-channels() == bottom[1]-channels() (12 vs. 84
  6. java f.lenth返回值_long length
  7. 我是如何自学 Python 的,分享一下经验
  8. 使用jfreechart来创建一个简单的柱状图
  9. 2021年五月下旬推荐文章
  10. SpringBoot学习之logback.xml 配置指定包或类输出至单独的日志文件中
  11. 如何查看进程的socket_socket编程1--创建socket
  12. 最好用的木门免费录单软件
  13. html 抓取 post 请求,自动向网页Post信息并提取返回的信息(一)
  14. USGS批量下载Landsat遥感影像数据时无法下载Surface Reflectance的解决
  15. 一、大话HTTP协议-HTTP的前世今生
  16. 程序人生 - 参与杭州车牌摇号人数已破百万!附杭州车牌摇号及竞价操作指南!
  17. uniapp IOS数字键盘没有小数点
  18. Unity根据文字内容自动滚动显示最新文字
  19. 费曼学习法为什么会如此有魅力
  20. python socket通信 心跳_python socket 编程之三:长连接、短连接以及心跳(转药师Aric的文章)...

热门文章

  1. 128. 损益类科目能说出几个?
  2. 再谈Android的许可证
  3. PAT-Top-1003 Universal Travel Sites (35分)网络流最大流
  4. 智能家居语音控制及摄像头人脸识别(含代码)
  5. 人脸识别摄像头采集数据训练
  6. Elastic Job 入门详解
  7. c++ tuple的使用
  8. cut out数据增强_常见的数据增强项目和论文介绍
  9. Twitter系统结构分析
  10. echarts全国地图只显示南海诸岛问题