0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AMD MPSoC PS PCIe使用要点

jf_pJlTbmA9 来源:jf_pJlTbmA9 作者:jf_pJlTbmA9 2023-07-10 16:52 次阅读

文档要点
框图
首先,UG1085 Figure 30‐1: Block Diagram of the Controller for PCIe 提供了MPSoC PCIe部分的框图。从中可以看到,客户需要的是Ingress传输,即X86的PCIe请求达到MPSoC PCIe 控制器后,转换成AXI Master,再取读写MPSoC的DDR内存。

100570825-301869-tu1.png

地址转换窗口
UG1085中的“Address Translation”部分,说明了MPSoC PCIe 控制器提供了8个地址转换的窗口。

Address Translation

The bridge provides eight fully-configurable address apertures to support address
translation both for ingress (from PCIe to AXI) and egress (from AXI to PCIe) transactions.
• In an AXI master, up to eight ingress translation regions can be set up. Translation is
done for the PCIe TLPs that are not decoded as MSI or MSI-X interrupts or internal
DMA transactions.

地址转换
如果PCIe地址的高位(基地址),等于source address (tran_src_base) 的高位,就会进行PCIe地址转换。

In the following discussions, the term tran refers to ingress/egress translation. For example,
tran_size refers to translation size and a tran_src_base refers to ingress/egress_src_base.

A translation is hit when the following occurs.
• Translation is enabled (tran_enable == 1).
• The tran_src_base[63:(12+tran_size)] == source address [63:(12+tran_size)].

转换后的目标地址,等于destination address (tran_dst_base)的高位(基地址),加上PCIe地址的低位(偏移地址)。

On a hit, the upper source address bits are replaced with destination base address bits
before forwarding the transaction to the destination.
Destination address = {tran_dst_base[63:(12+tran_size)] source address[12+tran_size]}.

地址转换窗口示例

1. Consider host assigns PCIe BAR2 = 0xFFA0_0000 ; 1MB size.
2. Ingress source base = 0xFFA0_0000 ; destination base = 0x44A0_0000 ;
aperture size = 64 KB
3. Incoming PCIe memory transaction hitting BAR2 at 0xFFA0_xyzw translates to address
0x44A0_xyzw on AXI master port.

示例代码
AMD提供了Standalone的示例"xilinxprocessoriplibdriverspciepsuexamplesXpciepsu_ep_enable_example.c” 和 “xilinxprocessoriplibdriverspciepsusrcXpciepsu_ep.c”。

总体流程
"xilinxprocessoriplibdriverspciepsuexamplesXpciepsu_ep_enable_example.c” 中的main()实现了总体流程,包括检查PCIe 链路状态,PCIe配置状态,最后再配置地址转换窗口。

int main()
{
int Status = XST_SUCCESS;
#ifdef XPAR_PSU_PCIE_DEVICE_ID
XPciePsu_InitEndPoint(&PciePsuInstance, XPAR_PSU_PCIE_DEVICE_ID);

xil_printf("Waiting for PCIe Link uprn");
XPciePsu_EP_WaitForLinkup(&PciePsuInstance);
xil_printf("PCIe Link up...rn");

XPciePsu_EP_BridgeInitialize(&PciePsuInstance);
xil_printf("Bridge Init done...rn");

XPciePsu_EP_WaitForEnumeration(&PciePsuInstance);

xil_printf("Host driver indicated readyrn");
int result = XPciePsu_EP_SetupIngress(&PciePsuInstance,
INGRESS_NUM, BAR_NUM, PS_DDR_ADDR);
if (result == XST_FAILURE) {
xil_printf("PCIE ingress setup failedrn");
} else {
xil_printf("PCIE Ingress Test donern");
}

#endif
return Status;
}

下面的参数定义了地址转换窗口数量、PCIe BAR、MPSoC的DDR内存的基地址。可以根据需要修改。

BAR_NUM定义了PCIe BAR的序号,在PCIe Host上一定要使用对应的BAR中的地址来访问。

#define INGRESS_NUM 0x0 /* Ingress num to setup ingress */
#define BAR_NUM 0x2 /* Bar no to setup ingress */
#define PS_DDR_ADDR 0x1000000 /* 32 or 64 bit PS DDR Addr

地址转换配置代码
XPciePsu_EP_SetupIngress()从PCIe BAR中读到PCIe的基地址,写入INGRESS0_SRC_BASE(tran_src_base, TRAN_INGRESS_SRC_BASE)。

接下来,XPciePsu_EP_SetupIngress()把MPSoC的DDR内存的基地址写入INGRESS0_DST_BASE(tran_dst_base, TRAN_INGRESS_DST_BASE)。

最后,XPciePsu_EP_SetupIngress() 设置 INGRESS0_CONTROL(TRAN_INGRESS_CONTROL)的大小和使能位,使能地址转换。

在这之后,PCIe Host就能读写MPSoC的在地址范围[PS_DDR_ADDR, PS_DDR_ADDR+INGRESS_SIZE_ENCODING]内的DDR内存。

int XPciePsu_EP_SetupIngress(XPciePsu *PciePsuPtr, u32 IngressNum, u32 BarNum,
u64 Dst){
Xil_AssertNonvoid(PciePsuPtr != NULL);
u32 SrcLo;
u32 SrcHi;
u32 Val;
u32 DestLo;
u32 DestHi;
if (IngressNum > 7) {
return XST_FAILURE;
}

XPciePSU_ReadBar(PciePsuPtr, BarNum, &SrcLo, &SrcHi);

/*
* Using Ingress Address Translation 0 to setup translation
* to PS DDR
*/
XPciePsu_WriteReg(PciePsuPtr->Config.BrigReg,
(INGRESS0_SRC_BASE_LO + (IngressNum * INGRESS_SIZE)),
SrcLo & ~0xf);
XPciePsu_WriteReg(PciePsuPtr->Config.BrigReg,
(INGRESS0_SRC_BASE_HI +
(IngressNum * INGRESS_SIZE)), SrcHi);

XPciePsu_Dbg("Done writing the Ingress Src registersrn");

DestLo = XPCIEPSU_LOWER32BITS(Dst);
DestHi = XPCIEPSU_UPPER32BITS(Dst);
XPciePsu_WriteReg(PciePsuPtr->Config.BrigReg,
(INGRESS0_DST_BASE_LO +
(IngressNum * INGRESS_SIZE)), DestLo);
XPciePsu_WriteReg(PciePsuPtr->Config.BrigReg,
(INGRESS0_DST_BASE_HI +
(IngressNum * INGRESS_SIZE)), DestHi);

XPciePsu_Dbg("Done writing the Ingress Dst registersrn");

Val = XPciePsu_ReadReg(PciePsuPtr->Config.BrigReg, INGRESS0_CONTROL);

XPciePsu_Dbg("Read Ingress Control registerrn");

Val &= (u32)(~INGRESS_SIZE_MASK);
Val |= (((u32)INGRESS_SIZE_ENCODING (u32)INGRESS_ENABLE | (u32)INGRESS_SECURITY_ENABLE);
Val |= INGRESS_RD_WR_ATTR;
XPciePsu_WriteReg(PciePsuPtr->Config.BrigReg,
(INGRESS0_CONTROL + (IngressNum * INGRESS_SIZE)), Val);

XPciePsu_Dbg("Done setting up the ingress trasnslation registersrn");
return XST_SUCCESS;
}

注意事项
在PCIe Host和A53通过共享DDR内存的方式交互数据时,要注意cache管理。

对于A53写、PCIe Host读的数据,A53要做cache Flush操作,PCIe Host要做cache Invalidate操作。

对于PCIe Host写、A53读的数据,PCIe Host要做cache Flush操作,A53要做cache Invalidate操作。

另外,在UG1085、UG1087里,同一个寄存器的名称,可能有出入。比如UG1085里的tran_dst_base,对应UG1087的TRAN_INGRESS_SRC_BASE_LO和TRAN_INGRESS_SRC_BASE_HI。


审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • amd
    amd
    +关注

    关注

    25

    文章

    5438

    浏览量

    133914
  • 控制器
    +关注

    关注

    112

    文章

    16185

    浏览量

    177333
  • PCIe
    +关注

    关注

    15

    文章

    1217

    浏览量

    82424
  • MPSoC
    +关注

    关注

    0

    文章

    198

    浏览量

    24246
收藏 人收藏

    评论

    相关推荐

    什么是Xilinx ZynqUltraScale+ MPSoC技术?

    ZynqUltraScale+ MPSoC是Xilinx推出的第二代多处理SoC系统,在第一代Zynq-7000的基础上做了全面升级。包括先进的multi-domain,multi-island电源
    发表于 10-09 06:07

    请问Zynq Ultrascale + MPSOC本身是否存在问题?

    你好我们正在考虑在我们的新设计中使用Zynq Ultrascale + MPSOC。我们想在我们的电路板设计中加入HDMI接口。 Zynq Ultrascale + MPSOCPS中有一个
    发表于 10-14 09:17

    ZYNQ调用XDMA PCIE IP同时读写PS DDR,导致蓝屏问题。

    你好!我在ZYNQ 7015里(或者7035)调用XDMA PCIE IP 从上位机HOST PC通过PCIE接口给ZYNQ的PS DDR发送数据(XDMA PCIE IP接到了
    发表于 11-21 10:35

    如何调试Zynq UltraScale+ MPSoC VCU DDR控制器

      如何调试Zynq UltraScale+ MPSoC VCU DDR控制器  Zynq UltraScale+ MPSoC VCU DDR 控制器是一款专用 DDR 控制器,只支持在 Zynq
    发表于 01-07 16:02

    使用 PCIE 更新 AMD ZYNQ™ 的 QSPI Flash 参考设计

    简介 AMD ZYNQ™ 7000 的 S_AXI 端口提供了外设访问 PS 内部外设控制器的接口,这其中包括 4 个 S_AXI_HP 端口以及两个 S_AXI_GP 端口。一般来说,可以访问
    发表于 11-30 18:49

    MPSoC SWDT在Standalone下的应用有哪些?

    工程师根据FSBL的main.c中的InitWatchDog( ),添加代码后,依然不能使MPSoCPS复位。
    的头像 发表于 09-19 11:15 1570次阅读
    <b class='flag-5'>MPSoC</b> SWDT在Standalone下的应用有哪些?

    关于MPSoC的中断处理介绍

    GIC: CoreLink GIC-400 Generic Interrupt Controller, DDI 0471B, r0p1。 MPSoC的A53(PS)的
    的头像 发表于 05-07 15:34 3979次阅读

    强制开放MPSoCPS-PL接口

    MPSoC含有PS、PL;在PS和PL之间有大量接口和信号线,比如AXI、时钟、GPIO等。缺省情况下,PS和PL之间有接口和信号线被关闭。加载bit后,软件才会打开
    发表于 08-02 09:45 948次阅读

    FPGAs,Zynq和Zynq MPSoC器件的特点

    Zynq MPSoC是Zynq-7000 SoC(之后简称Zynq)的进化版本。Zynq是赛灵思发布的集成PL(FPGA)和PS设计的最早的一代产品。如图2.1所示,在相对较高层次对比了三种器件。Zynq MPSoC
    的头像 发表于 08-15 09:16 2483次阅读

    基于AMD FPGA的PCIE DMA逻辑实现

    AMD FPGA自带PCIE硬核,实现了PCIE协议,把串行数据转换为并行的用户数据,以UltraScale系列FPGA为例,其支持Gen1.02.03.04.0,1~16 Lanes,如下图所示。
    的头像 发表于 06-09 09:34 1585次阅读
    基于<b class='flag-5'>AMD</b> FPGA的<b class='flag-5'>PCIE</b> DMA逻辑实现

    磐石测控:深圳插拔力试验机PS-1220S系列的维护要点

    磐石测控:深圳插拔力试验机PS-1220S系列的维护要点
    的头像 发表于 11-08 11:35 556次阅读
    磐石测控:深圳插拔力试验机<b class='flag-5'>PS</b>-1220S系列的维护<b class='flag-5'>要点</b>?

    基于AMD FPGA的PCIE DMA逻辑实现

    AMD FPGA自带PCIE硬核,实现了PCIE协议,把串行数据转换为并行的用户数据
    的头像 发表于 07-14 15:53 1433次阅读
    基于<b class='flag-5'>AMD</b> FPGA的<b class='flag-5'>PCIE</b> DMA逻辑实现

    AMD-Xilinx MPSoC的Watchdog在Linux中使用的简明教程

    AMD-Xilinx MPSoC的器件里,提供了内置的Watchdog
    的头像 发表于 07-07 14:15 1032次阅读

    AMD Versal™ Adaptive SoC CPM PCIE PIO EP设计CED示例

    本文可让开发者们看懂 AMD Vivado Design Tool 2023.2 中的“AMD Versal Adaptive SoC CPM PCIE PIO EP 设计”CED 示例。‍
    的头像 发表于 05-10 09:39 505次阅读
    <b class='flag-5'>AMD</b> Versal™ Adaptive SoC CPM <b class='flag-5'>PCIE</b> PIO EP设计CED示例

    AMD/Xilinx Zynq® UltraScale+ ™ MPSoC ZCU102 评估套件

    AMD/Xilinx Zynq® UltraScale+ ™ MPSoC ZCU102 评估套件可快速启动汽车、工业、视频和通信应用设计。AMD/Xilinx MPSoC ZCU102
    的头像 发表于 11-20 15:32 115次阅读
    <b class='flag-5'>AMD</b>/Xilinx Zynq® UltraScale+ ™ <b class='flag-5'>MPSoC</b> ZCU102 评估套件