DW PCIE LINUX的初始化分析

news2024/12/28 19:46:04

一些定义

PCIE复位:一些PCIE复位的知识链接
PCIE初始化:初始化相关定义看下面链接和下图

C语言简化初始化看本人的《DW PCIE的PCIE的RC和EP最简初始化学习笔记》文章。

Sticky Registers:与传统的复位方式相同,FLR方式不能复位这些寄存器,但是系统软件对部分Sticky Registers进行修改。当Vaux(备用电源)被移除后,这些寄存器中的保存的数据才会丢失。可以看前面PCIE复位详解部分内容。

ARI:Alternative Routing-ID Interpretation,顾名思义,可替换的Routing ID,意味着这是一种要把Routing ID的部分或全部替换掉的机制。使用ARI格式时,一个PCIe设备最多可以支持256个Function,而传统的PCIe设备最多只能支持8个Function。
ARI的介绍

Secondary Bus Number: 桥设备(Bridge)下游端口连接的 PCIe 总线号。
Subordinate Bus Number:挂载到桥设备(Bridge)下的最大的 PCIe 总线号。
Secondary Bus和Subordinate Bus Number介绍链接

BUS DEV FUNC的定义看下图和前面PCIE初始化的链接:
在这里插入图片描述

DW LINUX作为RC的底层操作调用

DBI寄存器和DBI2寄存器对应关系看文章DW PCIE 的Register Module, LBC, and DBI章节学习笔记

 _pcie_write_dbi(0x710,0x70120);
	 _pcie_write_dbi(0x80c,0x10430);
	 _pcie_write_dbi(0x82c,0xffffffff);
	 _pcie_write_dbi(0x828,0xffffffff);
	 _pcie_read_dbi(0x8bc);
	 _pcie_write_dbi(0x8bc,0xbff41);
	 _pcie_write_dbi(0x100010,0);
	 _pcie_write_dbi(0x10,0);
	 _pcie_read_dbi(0x8bc);
	 _pcie_write_dbi(0x8bc,0xbff40);
	 _pcie_read_dbi(0x8bc);
	 _pcie_write_dbi(0x8bc,0xbff41);
	 _pcie_write_dbi(0x14,0);
	 _pcie_read_dbi(0x8bc);
	 _pcie_write_dbi(0x8bc,0xbff40);
	 _pcie_read_dbi(0x8bc);
	 _pcie_write_dbi(0x8bc,0xbff41);
	 _pcie_read_dbi(0x3c);
	 _pcie_write_dbi(0x3c,0x1ff);
	 _pcie_read_dbi(0x8bc);
	 _pcie_write_dbi(0x8bc,0xbff40);
	 _pcie_read_dbi(0x18);
	 _pcie_write_dbi(0x18,0xff0100);
	 _pcie_read_dbi(0x4);
	 _pcie_write_dbi(0x4,0x100107);
	 _pcie_read_dbi(0x900);
	
	 _pcie_write_dbi(0x300008,0xf9020000);
	 _pcie_write_dbi(0x30000c,0);
	 _pcie_write_dbi(0x300010,0xf9ffffff);
	 _pcie_write_dbi(0x300014,0xf9020000);
	 _pcie_write_dbi(0x300018,0x0);
	 _pcie_write_dbi(0x300000,0x0);
	 _pcie_write_dbi(0x300004,0x80000000);
	 _pcie_read_dbi(0x300004);
	
	 _pcie_write_dbi(0x300408,0xf9010000);
	 _pcie_write_dbi(0x30040c,0);
	 _pcie_write_dbi(0x300410,0xf901ffff);
	 _pcie_write_dbi(0x300414,0xf9010000);
	 _pcie_write_dbi(0x300418,0);
	 _pcie_write_dbi(0x300400,0x2);
	 _pcie_write_dbi(0x300404,0x80000000);
	 _pcie_read_dbi(0x300404);
	
	 _pcie_write_dbi(0x10,0);
	 _pcie_read_dbi(0x8bc);
	 _pcie_write_dbi(0x8bc,0xbff41);
	 _pcie_write_dbi_16(0xa,0x604);
	 _pcie_read_dbi(0x8bc);
	 _pcie_write_dbi(0x8bc,0xbff40);
	 _pcie_read_dbi(0x80c);
	 _pcie_write_dbi(0x80c,0x30430);

ATU

TLP 是什么看《DW PCIE 的TLP Processing章节学习笔记》
地址转换用于将不同的地址范围映射到支持的不同内存空间你的申请。 一个典型的示例将您的应用程序内存空间映射到 PCI 内存空间。 iATU还支持类型转换。 如果没有地址转换,您的应用程序地址会未经修改地传递直接通过 Tx 应用程序接口发送到 TLP。 您可以对 iATU 进行编程以实现您的自己的出站地址转换方案,无需外部逻辑。

ATU 简单理解就是一个Inband输入和Outband输出的地址转换,内部总线和PCIE总线产生一个对应关系的表。输入输出(非BAR匹配输入)关系实例图如下:

在这里插入图片描述

ATU寄存器说明

在文档中下面两个图放德顺序是掉过来的,开始我还理解不了什么意思。感觉调过来说比较好理解。
ATU寄存器地址说明,其中0-16位是有效地址位。16-9位是选择第几个ATU的范n围设置,8位是选择配置out输入还是输出的范围控制。(对于ATU有BYPASS模式,对应设置比如DMA输出可以不经过ATU转换)。我使用芯片0区域outbound读地址设置为0x300000地址开始,1区域读对应0x300200,Intbound写0区域地址应该为0x300100,1区域地址应该为0x300300。
LINUX下有这样的定义:

#define PCIE_DMA_UNR_CONTROL1_WRCH(ch)		(0x200 + ch * 0x200)
#define PCIE_DMA_UNR_TRANSFER_SIZE_WRCH(ch)	(0x208 + ch * 0x200)
#define PCIE_DMA_UNR_SAR_LOW_WRCH(ch)		(0x20c + ch * 0x200)
#define PCIE_DMA_UNR_SAR_HIGH_WRCH(ch)		(0x210 + ch * 0x200)
#define PCIE_DMA_UNR_DAR_LOW_WRCH(ch)		(0x214 + ch * 0x200)
#define PCIE_DMA_UNR_DAR_HIGH_WRCH(ch)		(0x218 + ch * 0x200)

#define PCIE_DMA_UNR_CONTROL1_RDCH(ch)		(0x300 + ch * 0x200)
#define PCIE_DMA_UNR_TRANSFER_SIZE_RDCH(ch)	(0x308 + ch * 0x200)
#define PCIE_DMA_UNR_SAR_LOW_RDCH(ch)		(0x30c + ch * 0x200)
#define PCIE_DMA_UNR_SAR_HIGH_RDCH(ch)		(0x310 + ch * 0x200)
#define PCIE_DMA_UNR_DAR_LOW_RDCH(ch)		(0x314 + ch * 0x200)
#define PCIE_DMA_UNR_DAR_HIGH_RDCH(ch)		(0x318 + ch * 0x200)

在这里插入图片描述

ATU寄存器0-7位的选择:
Inband和Outband类似所以不特别说明。
在这里插入图片描述

Region Control定义

在DATABOOK文档中没有找到Region Control的对应为的定义,在寄存器文档中有介绍,从LINUX 代码中找到了实际应用对应内容的定义,需要详细了解可以去看寄存器介绍文档。
控制寄存器1:
#define PCIE_ATU_TYPE_MEM (0x0 << 0)
#define PCIE_ATU_TYPE_IO (0x2 << 0)
#define PCIE_ATU_TYPE_CFG0 (0x4 << 0)
#define PCIE_ATU_TYPE_CFG1 (0x5 << 0)
控制寄存器2:
#define PCIE_ATU_ENABLE (0x1 << 31)
#define PCIE_ATU_BAR_MODE_ENABLE (0x1 << 30)

Outbound

Address translation is used for mapping different address ranges to different memory spaces supported by your application. A typical example maps your application memory space to PCI memory space. The iATU also supports type translation. Without address translation, your application address is passed unmodified to the TLPs directly through the Tx application interface. You can program the iATU to implement your own outbound address translation scheme without external logic.
地址转换用于将不同的地址范围映射到应用程序支持的不同内存空间。 一个典型的示例将您的应用程序内存空间映射到 PCI 内存空间。 iATU 还支持类型转换。 如果没有地址转换,您的应用程序地址会直接通过 Tx 应用程序接口未经修改地传递给 TLP。 您可以对 iATU 进行编程以实现您自己的出站地址转换方案,而无需外部逻辑。
Outbound Features:
■ Address Match mode operation for MEM and I/O, CFG, and MSG TLPs. No translation for completions.
MEM 和I/O、CFG 和MSG TLP 的地址匹配模式操作。没有传输完成包
■ Supports type translation through TLP type header field replacement for MEM or I/O types to MSG/CFG types.
通过将 MEM 或 I/O 类型的 TLP 类型标头字段替换为 MSG/CFG 类型,支持类型转换。
■ Programmable TLP header field replacement.
可编程TLP 报头字段替换
■ Multiple (up to 256) address regions programmable for location and size.
多个区域可配置
■ Programmable enable/disable per region.
可独立使能或禁止每个区域
■ Automatic FMT field translation between three DWORDs and four DWORDs for 64-bit addresses.
用于 64 位地址的三个 DWORD 和四个 DWORD 之间的自动 FMT 字段转换。
■ Invert Address Matching mode to translate accesses outside of a successful address match.
反转地址匹配模式以转换成功地址匹配之外的访问。
■ Configuration Shift mode. Optimizes the memory footprint of CFG accesses destined for the Rx application interface in a multifunction device.
配置转换模式。优化针对多功能设备中 Rx 应用程序接口的 CFG 访问的内存占用。
■ Response code which defines the completion status to return for accesses matching a region.
响应代码,它定义为匹配区域的访问返回的完成状态。
■ Payload Inhibit marks all TLPs as having no payload data.
Payload Inhibit 将所有 TLP 标记为没有有效负载数据。
■ Header Substitution replaces bytes 8 to 11 (for 3 DWORD header) or bytes 12 to 15 (for 4 DWORD header), inclusive, of the outbound TLP header.
标头替换替换字节 8 到 11(对于 3 DWORD 标头)或字节 12 到 15(对于 4 DWORDheader),包括出站 TLP 标头。
■ Tag Substitution of the outbound TLP tag field.
出站TLP 标记字段的标记替换
■ Function number bypass mode to allow function number information to be supplied from your application transmit interface while translating the address and other attributes of the TLP.
功能编号旁路模式允许从您的应用程序传输接口提供功能编号信息,同时转换 TLP 的地址和其他属性。
■ DMA bypass mode to allow TLPs which are initiated by the embedded DMA engine, to pass through the iATU untranslated.
DMA 旁路模式允许由嵌入式 DMA 引擎启动的 TLP 未经翻译地通过 iATU。
■ TLP Header fields bypass mode to allow header information to be supplied from your application transmit interface or, if AMBA is configured, from the AMBA sideband bus while translating the address and Type of the TLP.
TLP 报头字段绕过模式,允许从应用程序传输接口提供报头信息,或者,如果配置了 AMBA,则在转换 TLP 的地址和类型时,从 AMBA 边带总线提供报头信息。

Inbound

When there is no match, then the address is untranslated. In addition,
■除了输入不匹配不传输外Inbound还有2个限制
❑ TLPs destined for the internal CDM or ELBI in an upstream port are not translated.
不能传世CMD和ELBI的控制
❑ TLPs that are not error-free (ECRC, malformed, and so on) are not translated.ECRC:Generation and Checking
TLPS没有malformed和ECRC完成的将不能传输
■ Address translation of completions is not supported in Address Match mode.
地址转换结束(结束包?时路由的东西》)在地址匹配模式不支持。
在这里插入图片描述
在描述TLP Type内容中MEM I/O符合模式下有个有个BAR Match Mode需要注意,这个部分输入的范围是BAR确定的不是ATU设置的最低最高地址决定。

在这里插入图片描述

ATU中的 CFG_SHIFT_MODE和ECAM

下面介绍的原链接
PCI Express Enhanced Configuration Access Mechanism (ECAM)

在这里插入图片描述

ECAM是访问PCIe配置空间一种机制,PCIe配置空间大小是4kbyte寄存器地址空间。通过扩展地址的形式把高位地址直接作为设备的Bus Number和DeviceNumber可以直接对对应总线和设备进行访问。

ATU软件配置分析

//下面都是输出地址转换  //PCIE SLAVE 的地址范围   F900_0000 F9FF_FFFF
//其实这个ATU并为修改地址转换PCIE总线地址 只是区分了IO访问和MEM访问,当处理器访问SLAVE地址空间时不同区域对外不同的TLP包访问。
oa1801_pcie_write_dbi(0x300008,0xf9020000);//内部地址为 芯片PCIE SLAVE 的地址区域
oa1801_pcie_write_dbi(0x30000c,0);//64位的高32为0
oa1801_pcie_write_dbi(0x300010,0xf9ffffff);//Limit 地址
oa1801_pcie_write_dbi(0x300014,0xf9020000);//外部PCIE 的对应地址
oa1801_pcie_write_dbi(0x300018,0x0);//64位的高32为0
oa1801_pcie_write_dbi(0x300000,0x0);//该区域为MEM访问
oa1801_pcie_write_dbi(0x300004,0x80000000);//使能ATU


oa1801_pcie_write_dbi(0x300408,0xf9010000);
oa1801_pcie_write_dbi(0x30040c,0);
oa1801_pcie_write_dbi(0x300410,0xf901ffff);
oa1801_pcie_write_dbi(0x300414,0xf9010000);
oa1801_pcie_write_dbi(0x300418,0);
oa1801_pcie_write_dbi(0x300400,0x2);//设置该部分为I/O区域访问
oa1801_pcie_write_dbi(0x300404,0x80000000);//使能ATU

初始化配置

文档中寄存器地址说明

部分带ID的寄存器的访问方式,我认为部分寄存器不是在配置空间内的是由IC设计人员指定的。
访问PCIe配置空间寄存器

【PCIe】配置空间
Capbility Pointer: PCI capbility的地址偏移, capbility用于表示pci设备支持的能力。该寄存器存放Capabilities 结构链表的头指针。在一个PCIe 设备中,可能含有多个Capability 结构,这些寄存器组成一个链表:

在这里插入图片描述

使用芯片的相关配置空间内容说明:
在这里插入图片描述

PCI-X和PCIe要求设备必须支持Capability结构。 在总线的基本配置空间0x40~0xFF中包含了Capability Pointer的寄存器,它存放的是Capabilities结构链表的头指针,在一个PCIe设备中可能存在多个Capability结构,这些寄存器组成一个链表。 每个Capability结构都有一个唯一的ID号,和一个指针。 指针指向下一个Capability结构,如果为0则表示到了链表的结尾。

看PCIE的寄存器文档的时候很多时候寄存器的地址(像这样 Offset: B+0x4)的描述,在文档的开头就有相关的描述:
PCI-compatible and PCI Express extended capability registers are organized into a linked list of structures
(blocks). The address of each block is configuration-dependent and cannot be computed until configuration
time in coreConsultant. In this document, register offsets within each block are specified (for example
B+0x04, where B+ indicates that 0x04 is an offset within the block); but the starting location of each block
must be found by traversing the linked list in software after configuration. The host O/S is expected to
traverse the linked list at boot time using the pointers in each block, and not the absolute address of the
blocks.
The B+ symbol appearing in the Offset value (as in Offset: B+0x4) indicates an address offset relative to the
capability base address. However, when you configure the core in coreConsultant, all parameters are
evaluated completely; and the resulting Offsets in the IP-XACT and coreConsultant GUI reports are
absolute, and not relative values.

PCI 兼容和 PCI Express 扩展能力寄存器被组织成一个链表结构(块)。 每个块的地址取决于配置,直到配置才能计算在 coreConsultant 的时间。 在本文档中,指定了每个块内的寄存器偏移量(例如B+0x04,其中B+表示0x04是块内的偏移量); 但是每个块的起始位置必须通过配置后在软件中遍历链表才能找到。 主机操作系统预计在引导时使用每个块中的指针遍历链表,而不是块的绝对地址块。出现在偏移值中的 B+ 符号(如偏移:B+0x4)表示相对于
能力基地址。 但是,当您在 coreConsultant 中配置核心时,所有参数都是完全评估; IP-XACT 和 coreConsultant GUI 报告中产生的偏移量为绝对值,而不是相对值。

Most of the implementation-specific registers (not defined by the PCI-SIG PCIe specification) are located in the Port Logic space beginning at 0x700.Going forward from release 4.40a, all new implementation-specific register groups are implemented as VSEC’s in the PCIe Extended Capability Structure address space.
大多数特定于实现的寄存器(未由 PCI-SIG PCIe 规范定义)位于从 0x700 开始的端口逻辑空间中。从版本 4.40a 开始,所有新的特定于实现的寄存器组都在 PCIe 中实现为 VSEC 扩展能力结构地址空间。

Vendor Specific Extended Capability

从LINUX的驱动设置可以推断0x700-0xc20 地址段的描述。 DWC_PCIE_DSP/PF0_PORT_LOGIC Registers 章节描述这个部分的地址是固定在0X700的固定逻辑空间。
在这里插入图片描述

/* Synopsys-specific PCIe configuration registers */
#define PCIE_PORT_LINK_CONTROL		0x710
#define PCIE_LINK_WIDTH_SPEED_CONTROL	0x80C
#define PCIE_MSI_ADDR_LO		0x820
#define PCIE_MSI_ADDR_HI		0x824
#define PCIE_MSI_INTR0_ENABLE		0x828
#define PCIE_MSI_INTR0_MASK		0x82C
#define PCIE_MSI_INTR0_STATUS		0x830
#define PCIE_ATU_VIEWPORT		0x900
#define PCIE_ATU_CR1			0x904
#define PCIE_ATU_CR2			0x908
#define PCIE_ATU_LOWER_BASE		0x90C
#define PCIE_ATU_UPPER_BASE		0x910
#define PCIE_ATU_LIMIT			0x914
#define PCIE_ATU_LOWER_TARGET		0x918
#define PCIE_ATU_UPPER_TARGET		0x91C
#define PCIE_MISC_CONTROL_1_OFF		0x8BC

	  _pcie_write_dbi(0x710,0x70120);//21:16 LINK_CAPABLE 0x7 (X4): x4//bit11:8 LINK_RATE // bit5:LINK_DISABLE 
		  _pcie_write_dbi(0x80c,0x10430);//bit 16 AUTO_LANE_FLIP_CTRL_EN 0x1 (ENABLE): Enable //bit12:8 NUM_OF_LANE S0x1 (_1_LANE) S0x4 (_4_LANE): 1 lane// bit7:0 FAST_TRAINING_SEQ
		  _pcie_write_dbi(0x82c,0xffffffff);//bit	31:0 MSI_CTRL_INT_0_EN 使能中断
		  _pcie_write_dbi(0x828,0xffffffff);//bit	31:0 MSI_CTRL_INT_0_MASK 设置中断屏蔽位,保证MSI能产生中断
		  _pcie_read_dbi(0x8bc);//读取了MISC_CONTROL_1_OFF
		  _pcie_write_dbi(0x8bc,0xbff41);//该寄存器后续单独介绍配置信息,该处主要是设置bit1进行RO写操作    
		  _pcie_write_dbi(0x100010,0);//通过DBI2设置BAR0 MASK 0,禁止BAR0
		  _pcie_write_dbi(0x10,0);//设置BAR0地址为0
		  _pcie_read_dbi(0x8bc);
		  _pcie_write_dbi(0x8bc,0xbff40);//退出RO写操作
		  _pcie_read_dbi(0x8bc);
		  _pcie_write_dbi(0x8bc,0xbff41);//该寄存器后续单独介绍配置信息,该处主要是设置bit1进行RO写操作    
		  _pcie_write_dbi(0x14,0);//设置BAR0地址为0
		  _pcie_read_dbi(0x8bc);
		  _pcie_write_dbi(0x8bc,0xbff40);//退出RO写操作
		  _pcie_read_dbi(0x8bc);
		  _pcie_write_dbi(0x8bc,0xbff41);//该寄存器后续单独介绍配置信息,该处主要是设置bit1进行RO写操作    
		  _pcie_read_dbi(0x3c);
		  _pcie_write_dbi(0x3c,0x1ff);//BRIDGE_CTRL_INT_PIN_INT_LINE_REG2 2:16 看手册  15:8 INT_PIN (选择中断脚)7:0 INT_LINE 
		  _pcie_read_dbi(0x8bc);
		  _pcie_write_dbi(0x8bc,0xbff40);//退出RO写操作
		  _pcie_read_dbi(0x18);
		  _pcie_write_dbi(0x18,0xff0100);//SEC_LAT_TIMER_SUB_BUS_SEC_BUS_PRI_BUS_REG 
		 //23:16 SUB_BUS从属总线编号
		 //15:8 SEC_BUS设置Secondary Bus Number(详细功能见定义) 15:8 SEC_BUS 7:0 PRIM_BUS 波流兼容不用
		  _pcie_read_dbi(0x4);
		  _pcie_write_dbi(0x4,0x100107);//TYPE1_STATUS_COMMAND_REG 配置状态和控制寄存器 bit16 立即准备看后续介绍  BIT 8 使能错误报告功能BIT 2:0 使能IO MSE BME (bus master)  该设置完成后PCIE启动了。
		  _pcie_read_dbi(0x900);

MISC_CONTROL_1_OFF 寄存器偏移地址 0x8bc介绍

bit 22 PORT_LOGIC_WR_DISABLE MISC_CONTROL_1_OFF Disable port logic register write from wire side.禁止从wire side(through the TRGT0 interface)端口逻辑寄存器写。EP模式下CFG requests are routed to TRGT0 and then to CDM through the LBC.

bit 21 P2P_ERR_RPT_CTRL Determines whether to enable Peer to Peer (P2P) error reporting.
确定是否启用对等 (P2P) 错误报告 1为启用。

bit 20 P2P_TRACK_CPL_TO_REG Determines whether to track completion of transmitted Non-Posted TLPs in P2P mode.
确定是否在 P2P 模式下跟踪传输的 Non-Posted TLP 的完成情况。1为跟踪。

bit 19:18 TARGET_ABOVE_CONFIG_LIMIT_REG Configuration requests with an address greater than CONFIG_LIMIT_REG are directed to either ELBI or TRGT1 interface based on the setting of this field.
根据该字段的设置,地址大于 CONFIG_LIMIT_REG 的配置请求将被定向到 ELBI 或 TRGT1 接口。0x1: ELBI 0x2: TRGT1。
本程序设置为0X2

bit 17:8 CONFIG_LIMIT_REG Configuration requests are directed either to CDM or ELBI/RTRGT1 based on the value of this field.
设置配置寄存器的范围,大于该范围的地址访问将变为 ELBI或RTRGT1的访问操作。
本程序设置为0X2FF

bit 7 CFG_TLP_BYPASS_EN_REG Setting of this field defines how to decide the destination of Configuration requests.
该字段的设置定义了如何决定配置请求的目的地。
设置1 Configuration TLPs are routed according to the setting of TARGET_ABOVE_CONFIG_LIMIT_REG, regardless the value of CONFIG_LIMIT_REG.
配置TLP包不理会CONFIG_LIMIT_REG。
设置0 Configuration TLPs are routed according to the setting of TARGET_ABOVE_CONFIG_LIMIT_REG, depending on the setting of CONFIG_LIMIT_REG.
配置TLP包受CONFIG_LIMIT_REG影响。

bit 6 CPLQ_MNG_EN enables the Completion Queue Management feature.
设置完成队列管理功能 1为使能
本程序设置1

bit 5 ARI_DEVICE_NUMBER When ARI is enabled, this field enables use of the device ID.
设置为1使能ARI_DEVICE_NUMBER(什么是ARI见文章开头定义)

bit 4 DISABLE_AUTO_LTR_CLR_MSG Disable the autonomous generation of LTR clear message in upstream port.
禁止上行端口自主生成 LTR 清除报文。1是禁止

bit 3 3 SIMPLIFIED_REPLAY_TIMER Enables Simplified Replay Timer (Gen4). For more details, see “Transmit Replay” in “Transmit TLP Processing”
启用简化重传计时器 。1是使能

bit 2 UR_CA_MASK_4_TRGT1 When this field is set to ‘1’, the controller suppresses error logging, error message generation, and CPL generation for non-posted requests TLPs (with UR filtering status) forwarded to your application (that is, when DEFAULT_TARGET =1). For more details, see “Advanced Error Handling For Received TLPs” chapter of the Databook.
当该字段设置为“1”时,控制器抑制错误日志记录、错误消息生成和 CPL 生成未发布的请求 TLP(具有 UR 过滤状态)
转发到您的应用程序(即,当DEFAULT_TARGET = 1)。 有关详细信息,请参阅“高级接收到的 TLP 的错误处理”数据手册的章节。

bit 1 DEFAULT_TARGET Default target for an IO or MEM request with UR/CA/CRS received. Based on the value of this field the controller either drops or forwards these requests to your application. For more details, see “ECRC Handling” and “Request TLP Routing Rules” in “Receive Routing” section of the “Controller Operations” chapter of the Databook.
带有 UR/CA/CRS 的 IO 或 MEM 请求的默认目标已收到。 根据该字段的值,控制器要么将这些请求丢弃或转发到您的应用程序。

bit 0 DBI_RO_WR_EN Write to RO Registers Using DBI. For more details, see “Writing to Read-Only Registers” in “Register Module, LBC,
and DBI” section in the “Controller Operations” chapter of the Databook.
0x1 (SET): Your application can write to some RO and HwInit register fields through the DBI when you set this field to ‘1’.
使用 DBI 写入 RO 寄存器。设置1可以通过DBI操作一些只读和初始化寄存器。初始化时需要设置1对PCIE进行初始
本程序设置1

TYPE1_STATUS_COMMAND_REG 偏移0x4 介绍

在这里插入图片描述
其他细节看手册

IMM_READINESS:
Immediate Readiness (optional).
立即准备(可选)。
■ When this bit is set, for accesses to this Function, software is exempt from all requirements to delay configuration accesses following any type of reset, including but not limited to the timing requirements defined in “PCI Express Reset - Rules” section of the PCI Express Base Specification.
■ 当该位置位时,对于对该功能的访问,软件免除在任何类型的复位后延迟配置访问的所有要求,包括但不限于 PCI 的“PCI Express 复位 - 规则”部分中定义的时序要求 Express 基本规范。
■ It is permitted that system software/firmware provide mechanisms that supersede the indication provided by this bit, however such software/firmware mechanisms are outside the scope of PCI Express Base Specification.
■ 允许系统软件/固件提供替代由该位提供的指示的机制,但是此类软件/固件机制超出了 PCI Express 基本规范的范围。

DMA

我使用DSP和
DMA的基地址
pcie_base_addr 应该是F9000000
#define PF0_DMA_CAP_BaseAddress 0x380000+pcie_base_addr
#define DMA_READ_ENGINE_EN_OFF (PF0_DMA_CAP_BaseAddress + 0x2c)
#define DMA_READ_INT_MASK_OFF (PF0_DMA_CAP_BaseAddress + 0xa8)

我使用的通道写是0X200基地址,读通道是0X300基地址。

#define DMA_CH_CONTROL1_OFF_RDCH_0 (PF0_DMA_CAP_BaseAddress + 0x300)

寄存器说明见1.35 DWC_PCIE_DSP/PF0_DMA_CAP Registers说明

关于RC和EP数据发送和接收的限制条件不同

DW使用有个很有意思的现象,在测试过程中导致了走了一些弯路。
IP在做RC的时候EP使用DMA读写RC的内存基本不用进行设置就能进行通信,但是RC对EP的内存空间进行DMA读写需要进行ATU和BAR的设置才能读写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1645980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程数据共享和安全(ThreadLocal)

目录 介绍图解底层代码解析 ThreadLocal是一个Java中的类&#xff0c;用于在多线程环境下存储线程本地变量。每个线程都可以独立访问自己的ThreadLocal变量&#xff0c;而不会影响其他线程的变量。ThreadLocal通常用来解决多线程并发访问共享变量时的线程安全性问题。 ThreadL…

Git操作GitHub全记录

目录 一. GitHub ssh-key配置二. 添加GitHub仓库Git提交本地代码到Github仓库远程克隆仓库到本地的文件夹再上传本地的无.git的文件夹上传到远程仓库 三. Git删除Github仓库或某个文件或文件夹1.删除已有Github仓库2.删除Github中的某个文件或文件夹①如果没有建立本地库或者克…

OSEK任务管理

1 前言 RTOS通过任务&#xff08;task&#xff09;来组织应用层程序框架&#xff08;framework&#xff09;&#xff0c;支持任务的并发和同步执行&#xff08;concurrent and asynchronous execution of tasks&#xff09;&#xff0c;并通过调度器&#xff08;scheduler&…

基于ESP32和ESP8266的物联网开发过程(一)

给大家演示一个小工具&#xff0c;通过Wifi去连接ESP32或者ESP8266出来的一个热点。连接到这个热点之后&#xff0c;可以输密码&#xff0c;也可以不输密码。这里我设置的是不输密码直接进来&#xff0c;我这个是ESP8266。 进来之后直接点配置Wifi&#xff0c;然后可以看到ESP8…

uniapp 禁止截屏(应用内,保护隐私)插件 Ba-ScreenShot

禁止截屏&#xff08;应用内&#xff0c;保护隐私&#xff09; Ba-ScreenShot 简介&#xff08;下载地址&#xff09; Ba-ScreenShot 是一款uniapp禁止应用内截屏的插件&#xff0c;保护隐私&#xff0c;支持禁止截屏、放开截屏 截图展示 也可关注博客&#xff0c;实时更新最…

uniapp的底部弹出层实现保姆式教程

实现照片: 此过程先进入uniapp官网,找到扩展组件 打开找到里面的uni-popup和uni-icons 点击进入,下载&安装 点击下载并导入HBuilderX 导入到你使用的目录,如test目录

4+1视图,注意区分类图与对象图

注意区分类图和对象图。对象图标记的是对象名&#xff0c;命名形式 对象名:类名&#xff0c;或者:类名。这里没有出现冒号&#xff0c;表示的是类图。 对象图(object diagram)。 对象图描述一组对象及它们之间的关系。对象图描述了在类图中所建立的事物实例的静态快照。和类图一…

RabbitMQ 是如何做延迟消息的 ?——Java全栈知识(15)

RabbitMQ 是如何做延迟消息的 &#xff1f; 1、什么是死信&#xff1f; 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信&#xff08;dead letter&#xff09;&#xff1a; 消费者使用 basic.reject 或 basic.nack 声明消费失败&#xff0c;并且消息的 reque…

(论文阅读-优化器)Selectivity Estimation using Probabilistic Models

目录 摘要 一、简介 二、单表估计 2.1 条件独立Condition Independence 2.2 贝叶斯网络Bayesian Networks 2.3 查询评估中的贝叶斯网络 三、Join选择性估计 3.1 两表Join 3.2 概率关系模型 3.3 使用PRMs的选择性估计 四、PRM构建 4.1 评分标准 4.2 参数估计 4.3 结…

9.媒体元素

视频元素 视频标签基本代码结构&#xff1a; <video src"" controls></video>其中src是视频资源的路径&#xff0c;这个路径有绝对路径和相对路径这里推荐用相对路径。&#xff08;这里可以回顾我html系列的第四篇图片标签&#xff09;&#xff0c;我们…

【数据结构】--- 深入剖析二叉树(中篇)--- 认识堆堆排序Topk

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 数据结构之旅 文章目录 &#x1f3e0; 初识堆 &#x1f4d2; 堆的概念 &#x1f4d2; 堆的性质 &#x1f3e0; 向上调整算法 && 向下调整算…

第一天学习(GPT)

1.图片和语义是如何映射的&#xff1f; **Dalle2&#xff1a;**首先会对图片和语义进行预训练&#xff0c;将二者向量存储起来&#xff0c;然后将语义的vector向量转成图片的向量&#xff0c;然后基于这个图片往回反向映射&#xff08;Diffusion&#xff09;——>根据这段描…

Junit 测试中如何对异常进行断言

本文对在 Junit 测试中如何对异常进行断言的几种方法进行说明。 使用 Junit 5 如果你使用 Junit 5 的话,你可以直接使用 assertThrows 方法来对异常进行断言。 代码如下: Exception exception = assertThrows(NumberFormatException.class, () -> {new Integer("on…

基于springboot+vue+Mysql的点餐平台网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

第四百九十二回

文章目录 1. 概念介绍2. 使用方法2.1 SegmentedButton2.2 ButtonSegment 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"SearchBar组件"相关的内容&#xff0c;本章回中将介绍SegmentedButton组件.闲话休提&#xff0c;让我们一起Talk …

引领农业新质生产力,鸿道(Intewell®)操作系统助力农业机器人创新发展

4月27日至29日&#xff0c;2024耒耜国际会议在江苏大学召开。科东软件作为特邀嘉宾出席此次盛会&#xff0c;并为江苏大学-科东软件“农业机器人操作系统”联合实验室揭牌。 校企联合实验室揭牌 在开幕式上&#xff0c;江苏大学、科东软件、上交碳中和动力研究院、遨博智能研究…

【c1】数据类型,运算符/循环,数组/指针,结构体,main参数,static/extern,typedef

文章目录 1.数据类型&#xff1a;编译器&#xff08;compiler&#xff09;与解释器&#xff08;interpreter&#xff09;&#xff0c;中文里的汉字和标点符号是两个字节&#xff0c;不能算一个字符&#xff08;单引号&#xff09;2.运算符/循环&#xff1a;sizeof/size_t3.数组…

顶管机种类多样 国内产量不断增长

顶管机种类多样 国内产量不断增长 顶管机是一种用于非开挖管道铺设的机械设备&#xff0c;能够通过非开挖施工技术降低对地面活动的影响&#xff0c;具有工作效率高、安全性好、受地质条件限制小、环保性强等优点&#xff0c;在隧道修建、城市管网建设、地下管线敷设等场景中发…

《QT实用小工具·五十八》模仿VSCode的可任意拖拽的Tab标签组

1、概述 源码放在文章末尾 该项目实现了模仿VSCode的可任意拖拽的Tab标签组&#xff0c;包含如下功能&#xff1a; 拖拽标签页至新窗口 拖拽标签页合并控件 无限嵌套的横纵分割布局&#xff08;类似Qt Creator的编辑框&#xff09; 获取当前使用的标签组、标签页 自动向上合并…

测径仪视窗镜片的维护和保养步骤

关键字:测径仪镜片,测径仪保养,测径仪维护,视窗镜片维护,视窗镜片擦拭保养,视窗镜片的检查, 视窗镜片定期保养 视窗镜片是保护光学镜头免受污染和损伤的光学平镜片&#xff0c;它的污染和破损会直接影响光学系统的测量结果。 视窗镜片一般在受到轻微污染&#xff08;指镜片上…