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

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

3天内不再提示

MPSoC Linux工程寒设计 DMA测试软件编译结果

454398 来源:赛灵思中文社区 作者:付汉杰 2020-11-04 12:19 次阅读

1. 参考文档 1.1. AR69446

AR# 69446 Zynq UltraScale+ MPSoC Example Design - Use AXI HPC port to perform coherent transfers

1.2. Zynq UltraScale MPSoC Cache Coherency

Zynq UltraScale MPSoC Cache Coherency

1.3. MPSoC HPC 连接

2. 主要更改 2.1. AxCACHE

需要把AXI上的AxCACHE,也就是ARCACHE[3:0]和AWCACHE[3:0],设置成1111, 表示Write-back Read and Write-allocate。

2.2. AxPROT[1] 2.3. Cache监听(Snooping)

缺省情况下,MPSoC CCI (Cache Coherent Interconnect)不监听APU cluster。为了利用CCI cache同步功能,需要设置寄存器Snoop_Control_Register_S3的最低位,使CCI监听APU cluster。
寄存器Snoop_Control_Register_S3的地址在0xFD6E4000,最低位的含义使Enable issuing of snoop requests from slave interface S3。

2.3.1. 修改FSBL

可以在FSBL里修改Snoop_Control_Register_S3。

case XFSBL_STAGE4:
{

XFsbl_Printf(DEBUG_INFO,
"================= In Stage 4 ============ /n/r");

{
/* Modify Register Snoop_Control_Register_S3 for HPC Cache Cohenercy */
unsigned int ui_snoop_control=0;
XFsbl_Printf(DEBUG_PRINT_ALWAYS,"Check snoop control register at 0xfd6e4000./n/r");
ui_snoop_control = XFsbl_In32(0xfd6e4000);
XFsbl_Printf(DEBUG_PRINT_ALWAYS,"Snoop control register at 0xfd6e4000 original value: 0x%08x./n/r", ui_snoop_control );
XFsbl_Out32(0xfd6e4000, ui_snoop_control|0x1);

ui_snoop_control = XFsbl_In32(0xfd6e4000);
XFsbl_Printf(DEBUG_PRINT_ALWAYS,"Snoop control register at 0xfd6e4000 new value: 0x%08x./n/r", ui_snoop_control );
}

/**
* Handoff to the applications
* Handoff address
* xip
* ps7 post config
*/
FsblStatus = XFsbl_Handoff(&FsblInstance, PartitionNum, EarlyHandoff);

... ...
}

2.4. Broadcasting Shareable

为了使相关传输被CCI监听,需要设置寄存器lpd_apu的最低两位为1,而且必须在A53处于复位态时设置。我们利用MPSoC BootROM在加载时设置寄存器lpd_apu。
为了用MPSoC BootROM在加载时设置寄存器lpd_apu,需要准备寄存器初始化文件,并且使用寄存器初始化文件创建启动文件boot.bin。

2.4.1. 寄存器初始化文件

.set. 0xFF41A040 = 0x3;

2.4.2. 修改启动文件boot.bin的配置信息

在启动文件boot.bin的配置信息中,以关键字"[init]"添加寄存器初始化文件。

//arch = zynqmp; split = false; format = BIN
the_ROM_image:
{
...
[init]
/regs.init
}

完整的boot.bin的配置信息,bootgen.bif

/* bootgen -arch zynqmp -image bootgen.bif -o BOOT.BIN -w on */

the_ROM_image:
{
[bootloader, destination_cpu=a53-0] ./zcu106_fsbl.elf
[pmufw_image] ./images/linux/pmufw.elf
[destination_device=pl] ./images/linux/system.bit
[destination_cpu=a53-0, exception_level=el-3, trustzone] ./images/linux/bl31.elf
[destination_cpu=a53-0, exception_level=el-2] ./images/linux/u-boot.elf
[init]./regs.init
}

2.4.3. 创建启动文件boot.bin

创建启动文件boot.bin

$ bootgen -arch zynqmp -image bootgen.bif -o BOOT.BIN -w on

****** Xilinx Bootgen v2019.1
**** Build date : May 24 2019-14:54:05
** Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.

3. 测试环境 3.1. 测试工具

测试过程,使用Vivado 2019.1创建逻辑设计和编译逻辑工程;使用PetaLinux 2019.1 创建和编译Linux工程。

3.2. 测试工程

为了简化设计,使用ZCU106 BSP 2019.1 作为基础。

3.2.1. 逻辑设计

对于逻辑设计,删除了ZCU106 BSP 2019.1中的其它逻辑设计,然后添加了相关设计。

3.2.2. Linux工程

对于Linux工程,以ZCU106 BSP 2019.1创建PetaLinux工程,再倒入新的逻辑设计HDF文件。

4. 硬件测试工程

可以添加CDMA和AXI DMA,连接到HPC端口,测试CCI cache同步功能。

4.1. DMA硬件设计 4.1.1. MPSoC顶层设计

MPSoC顶层设计

测试中,使用了HPC0端口,使用了GPIO去驱动AxCACHE,AxPROT[1]信号

4.1.2. DMA内部设计

4.1.3. MPSoC地址分配

5. 测试软件 5.1. DMA驱动

在Linux Kernel中使能如下选项,加入DMA驱动:

1)CONFIG_DMADEVICES
2)CONFIG_XILINX_DMA

5.2. DMA测试软件

以模块形式在Linux Kernel中使能如下选项,加入DMA测试软件:

1)CONFIG_XILINX_CDMATEST=m
2)CONFIG_XILINX_DMATEST=m

5.3. DMA测试软件

如果想看软件使用的内存属性,比如是否cache,可以在Linux Kernel中使能如下选项。Linux会在目录/sys/kernel/debug/kernel_page_tables下导出内存页表信息。驱动打印使用的内存地址,再结合内存页表信息,可以确认内存属性。

1)CONFIG_ARM64_PTDUMP_CORE=y
2)CONFIG_ARM64_PTDUMP_DEBUGFS=y

5.4. DMA的设备树

如下修改system-user.dtsi。

/include/ "system-conf.dtsi"
/ {
cdmatest_1: cdmatest@1 {
compatible ="xlnx,axi-cdma-test-1.00.a";
dmas = ;
dma-names = "cdma";
} ;

axidmatest_1: axidmatest@1 {
compatible ="xlnx,axi-dma-test-1.00.a";
dmas = &axi_dma_0 1>;
dma-names = "axidma0", "axidma1";
} ;
};

/* dma-coherent; */
&psu_axi_cdma_0 {
status = "okay";
dma-coherent;
};

/* dma-coherent; */
&axi_dma_0 {
status = "okay";
dma-coherent;
};

设备树节点psu_axi_cdma_0,axi_dma_0,在Petalinux自动生成的pl.dtsi里定义。

如果不使用Petalinux,以此为模板,增加设备树节点。

5.5. DMA测试软件编译结果

编译Linux后,DMA测试软件以内核模块的文件存在。

/lib/modules/4.19.0/kernel/drivers/dma/xilinx/cdmatest.ko
/lib/modules/4.19.0/kernel/drivers/dma/xilinx/axidmatest.ko

6. 测试过程 6.1. 没有使能CCI cache同步功能 6.1.1. CDMA 测试

# insmod cdmatest.ko
[ 98.016731] xilinx_cdmatest_probe()-619: Begin.
[ 98.040884] cdmatest: Started 1 threads using dma3chan0
[ 98.094364] xilinx-vdma a0001000.dma: Channel (____ptrval____) has errors 10, cdr 788c0000 tdr 788c0000
[ 98.227925] dma3chan0-copy0: dstbuf[0x8] not copied! Expected d7, got 37
[ 98.238618] dma3chan0-copy0: dstbuf[0x9] not copied! Expected d6, got 36
[ 98.245314] dma3chan0-copy0: dstbuf[0xa] not copied! Expected d5, got 35
......
[ 98.434642] dma3chan0-copy0: dstbuf[0x26] not copied! Expected d9, got 39
[ 98.441429] dma3chan0-copy0: dstbuf[0x27] not copied! Expected d8, got 38
[ 98.448210] dma3chan0-copy0: 20 errors suppressed
[ 98.452908] dma3chan0-copy0: #0: 52 errors with
[ 98.456908] src_off=0x8 dst_off=0x8 len=0x34
[ 98.523180] xilinx-vdma a0001000.dma: Channel (____ptrval____) has errors 100, cdr 788c0000 tdr 788c0000
[ 101.606407] dma3chan0-copy0: #1: test timed out

6.1.2. AXI-DMA 测试

# insmod axidmatest.ko
[ 392.529420] dmatest: Started 1 threads using dma2chan0 dma2chan1
[ 392.665889] xilinx-vdma a0010000.dma: Channel (____ptrval____) has errors 10, cdr 6fcb0000 tdr 6fcb0500
[ 393.729538] xilinx-vdma a0010000.dma: Cannot start channel (____ptrval____): 10009
[ 394.806248] dma2chan0-dma2c: #0: tx test timed out
[ 394.953756] xilinx-vdma a0010000.dma: Channel (____ptrval____) has errors 10, cdr 6fcb0580 tdr 6fcb0a80

6.2. 使能CCI cache同步功能 6.2.1. GPIO 初始化

# =====================================================
# gpio0_hpc0_awcache, 0xa0002000, AWCACHE[3:0] 1111
devmem 0xa0002004
devmem 0xa0002004 32 0x0
devmem 0xa0002004
devmem 0xa0002000 32 0xf
devmem 0xa0002000

# gpio1_hpc0_awprot, 0xa0003000, AWPROT
# AxPROT[1] ,0,secure transactions, standalone
# AxPROT[1] ,1,non-secure transactions, Linux kernel/Linux userspace.
devmem 0xa0003004
devmem 0xa0003004 32 0x0
devmem 0xa0003004
devmem 0xa0003000 32 0x2
devmem 0xa0003000

# gpio2_hpc0_arcache, 0xa0004000, ARCACHE[3:0] 1111
devmem 0xa0004004
devmem 0xa0004004 32 0x0
devmem 0xa0004004
devmem 0xa0004000 32 0xf
devmem 0xa0004000

# gpio3_hpc0_arprot, 0xa0003000, ARPROT
# AxPROT[1] ,0,secure transactions, standalone
# AxPROT[1] ,1,non-secure transactions, Linux kernel/Linux userspace.
devmem 0xa0005004
devmem 0xa0005004 32 0x0
devmem 0xa0005004
devmem 0xa0005000 32 0x2
devmem 0xa0005000

6.2.2. CDMA 测试

# insmod cdmatest.ko
[ 523.246063] cdmatest: Started 1 threads using dma3chan0
[ 539.926093] dma3chan0-copy0: terminating after 100 tests, 0 failures (status 0)

6.2.3. AXI-DMA 测试

# insmod axidmatest.ko
[ 210.871166] dmatest: Started 1 threads using dma1chan0 dma1chan1
[ 212.937889] dma1chan0-dma1c: terminating after 5 tests, 0 failures (status 0)

编辑;hfy

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

    关注

    87

    文章

    11222

    浏览量

    208889
  • CDMA
    +关注

    关注

    1

    文章

    584

    浏览量

    117928
  • dma
    dma
    +关注

    关注

    3

    文章

    559

    浏览量

    100416
  • MPSoC
    +关注

    关注

    0

    文章

    198

    浏览量

    24246
收藏 人收藏

    评论

    相关推荐

    如何编译Linux Kernel

    整个Linux内核编译的过程非常简单,但是内核编译需要花费很长的时间。因为Linux内核的代码非常多。当然,如果你的计算机性能强劲,时间会短很多。当你准备好性能强劲的计算机后,让小编带
    发表于 06-07 16:26 1.1w次阅读
    如何<b class='flag-5'>编译</b><b class='flag-5'>Linux</b> Kernel

    Linux内核的编译主要过程

    Linux内核的编译主要过程: 配置、编译、安装 。
    发表于 08-08 16:02 709次阅读
    <b class='flag-5'>Linux</b>内核的<b class='flag-5'>编译</b>主要过程

    如何构建linux开发环境和编译软件工程、应用程序

    前文介绍了如何使用官方提供的镜像文件启动开发板,本文将说明如何构建linux开发环境和编译软件工程、应用程序。
    的头像 发表于 01-03 12:31 1934次阅读
    如何构建<b class='flag-5'>linux</b>开发环境和<b class='flag-5'>编译</b><b class='flag-5'>软件工程</b>、应用程序

    NVIDIA 招聘 软件测试篇(深圳、上海)

    编译,如Makefile, GCC, GDB等,较强的Debug能力5.熟悉C语言6.分析测试结果,找出测试失败的解决方案7.功能测试,通用
    发表于 03-21 16:09

    Zynq UltraScale + MPSoC USB 3.0 CDC器件类设计

    Linux主机测试CDC功能履行实施细节设计类型仅PSSW类型Zynq®UltraScale+™MPSoC Linux操作系统CPU的ARM Cortex A53 Core 0以1.1
    发表于 01-03 09:59

    如何利用ZYNQ MPSoC玩DOOM?

    赛灵思和 DornerWorks 的系统软件团队在赛灵思的 Zynq® Ultrascale+™ MPSoC 上启动 Xen Project 管理程序时,我们发现可通过运行当年叱诧一时的流行电子游戏
    发表于 10-09 06:21

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

    ZCU102演示,DP-to-HDMI适配器目前无法开箱即用,即使将来也可能只支持一部分适配器。这需要更新的芯片版本和更多测试。”我想明白为什么会这样。1)Zynq Ultrascale + MPSOC
    发表于 10-14 09:17

    XILINX MPSOC系列FPGA视频教程

    Vitis软件调试50_AXI DMA之AN9767信号发生器Vivado工程51_AXI DMA之AN9767信号发生器Vitis工程七、
    发表于 07-21 10:34

    Linux内核编译详谈

    Linux内核编译详谈
    发表于 10-30 09:51 7次下载
    <b class='flag-5'>Linux</b>内核<b class='flag-5'>编译</b>详谈

    Zynq UltraScale+ MPSoC 上的多个Linux UIO设计

    本实验工程将介绍如何利在赛灵思异构多处理器产品系列 Zynq UtralScale+ MPSoC ZCU102 嵌入式评估板上实现多个 UIO,同时借助赛灵思的工具完成硬件工程linux
    发表于 03-21 14:55 3294次阅读
    Zynq UltraScale+ <b class='flag-5'>MPSoC</b> 上的多个<b class='flag-5'>Linux</b> UIO设计

    Linux DMA Engine框架的介绍

    此会话描述如何从设备驱动程序在Linux中使用DMA。 这包括内存分配,缓存控制和DMA设备控制。 详细介绍了Linux DMA Eng
    的头像 发表于 11-23 06:29 6263次阅读

    fireflyROC-RK3328编译Linux固件简介

    本 SDK 开发环境是在 Ubuntu 上开发测试的。我们推荐使用 Ubuntu 16.04 的系统进行编译。其他的 Linux 版本可能需要对软件包做相应调整。 除了系统要求外,还有
    的头像 发表于 12-21 10:56 3837次阅读
    fireflyROC-RK3328<b class='flag-5'>编译</b><b class='flag-5'>Linux</b>固件简介

    C语言条件编译语句and单片机DMA的介绍

    C语言条件编译语句and单片机DMA的介绍C语言条件编译:这里面介绍的很详细,也有历程。DMA的介绍:介绍了单片机中为什么要使用DMA,以及
    发表于 11-29 10:36 3次下载
    C语言条件<b class='flag-5'>编译</b>语句and单片机<b class='flag-5'>DMA</b>的介绍

    测试MPSoC GEM的1588功能

    MPSoC的MAC支持1588。在Linux Kernel的配置项中使能CONFIG_MACB_USE_HWSTAMP,并在Linux rootfs添加Linux ptp/ethtoo
    的头像 发表于 08-02 09:39 1691次阅读
    <b class='flag-5'>测试</b><b class='flag-5'>MPSoC</b> GEM的1588功能

    每次Vivado编译结果都一样吗

    很多FPGA工程师都有这种困惑,Vivado每次编译结果都一样吗? 在AMD官网上,有这样一个帖子: Are Vivado results repeatable for identical
    的头像 发表于 11-11 11:23 176次阅读
    每次Vivado<b class='flag-5'>编译</b>的<b class='flag-5'>结果</b>都一样吗