This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VM:如何在 A72内核上设置 DDR 内存高速缓存?

Guru**** 2027820 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1219325/tda4vm-how-to-set-ddr-mem-cache-on-a72-core

器件型号:TDA4VM

尊敬的 TI 专家:

当我们使用共享存储器来读取和写入数据时、我们会发现写入 A72中的数据与 MCU1_0读取的数据不一致。

我们认为它应该是由存储器一致性问题引起的。  请告诉我们如何 在 A72内核上设置 DDR 内存高速缓存?

此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 TI 专家:

    当我 在 app_mem_linux_dma_heap.c 文件中使用 appMemCacheInv 和 appMemCacheWb 接口时、将出现如屏幕截图中所示的错误消息。 信息。

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 xie JC:

    此存储器是否由 DMA buf 框架、 即 OpenVX 框架中的 TIvxMemAlloc 分配? 因为如果不是、则不能在该缓冲区上使用 DMA_BUF_IOCTL_SYNC。  

    另请注意、这必须由 A72分配。 我们不能在 mcu1_0上分配它而不能在 A72上使用、因为 DMA buf 无法管理外部分配的缓冲区。  

    此致、

    Brijesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Brijesh:

    此内存是否由 DMA buf 框架( 即 OpenVX 框架中的 TIvxMemAlloc)分配? [/报价]

    我认为它不是 DMA 分配。 我们只是想确保 mcu1_0可以正确读取 a72写入 DDR 的数据。

    如何确保写入 A72的存储器为缓存?

    我不能使用接口 appMemCacheInv 和 appMemCacheWb?

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void appMemCacheInv(void *ptr, uint32_t size)
    {
    int32_t status = 0;
    uint32_t offset = 0;
    uint32_t dmaBufFd = appMemGetDmaBufFd(ptr, &offset);
    struct dma_buf_sync sync_flags;
    sync_flags.flags = DMA_BUF_SYNC_RW;
    if(dmaBufFd > 0)
    {
    status = ioctl(dmaBufFd, DMA_BUF_IOCTL_SYNC, &sync_flags);
    if(status < 0)
    {
    printf("MEM: ERROR: DMA_BUF_IOCTL_SYNC failed for appMemCacheInv(%p, %d) !!!\n",
    ptr, size
    );
    }
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 xie JC:

    我不是指 DMA 分配。 我是指 dma-buf 框架。 此框架在 Vision Apps 中用于分配和管理缓冲区。 此框架从内存的512MB 独立分区中分配缓冲区。 不可以、   如果未 使用 TIvxMemAlloc API 分配存储器、则我们无法使用 appMemCacheInv 和 appMemCacheWb API。 首先、您能帮助我了解如何分配存储器吗?  

    此致、

    Brijesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Brijesh V ä,

    很抱歉  误解了您的意思。

    实际上、我调用了 appMemMap 接口以将物理地址替换为虚拟地址。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #define NOR_TX_FIFO_ADDR (0xFB100400)
    #define NOR_RX_FIFO_ADDR (0xFB102400)
    void Update_Msg_Init_Nor(void)
    {
    UpdateRxFifoNor = (UpdateFifo_Nor_t *) NOR_RX_FIFO_ADDR;
    UpdateTxFifoNor = (UpdateFifo_Nor_t *) NOR_TX_FIFO_ADDR;
    UpdateRxFifoNor = appMemMap(UpdateRxFifoNor, NOR_FIFO_CACHE_SIZE);
    UpdateTxFifoNor = appMemMap(UpdateTxFifoNor, NOR_FIFO_CACHE_SIZE);
    initQue(&(UpdateTxFifoNor->que), NOR_FIFO_DEPTH);
    initQue(&(UpdateRxFifoNor->que), NOR_FIFO_DEPTH);
    appMemCacheWb(UpdateTxFifoNor, NOR_FIFO_CACHE_SIZE);
    appMemCacheWb(UpdateRxFifoNor, NOR_FIFO_CACHE_SIZE);
    }
    void *appMemMap(void *phys_ptr, uint32_t size)
    {
    uint32_t pageSize = getpagesize ();
    uintptr_t taddr;
    uint32_t tsize;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 xie JC:

     分配缓冲区的地址不是使用 dma-buf 分配器管理的、因此我们 无法加载 使用 appMemCacheWb 和 appMemCacheInv API。

    我看到您已  使用 O_SYNC 标志打开/dev/mem 器件。 现在、在映射 存储器时、您是否 还可以添加 PROT_NoCache 标志、如下所示? 完成此更改后、无需调用 Cache API。  

    Virt_ptr = mmap (0、tsize、
    (PROT_READ | PROT_WRITE | PROT_NoCache )、
    (map_shared)、dev_mem_fd、taddr);

    此致、

    Brijesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Brijesh:

    我看到您已  使用 O_SYNC 标志打开/dev/mem 设备。 现在、在映射 存储器时、您是否 还可以添加 PROT_NoCache 标志、如下所示? 完成此更改后、无需调用 Cache API。  [/报价]

    我将尝试这种改变,并给你反馈。但我仍然有一些困惑。

    1) PROT_NoCache 标志 指示存储器是高速缓存还是 NOCache?

    2) QNX 的系统将使用 PROT_NoCache 标志, Linux 是否也可以使用该标志?My process is run on linux8.4。

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 xie JC:

    好的、我看到它在 QNX 上受支持、但在 Linux 上不受支持。 因此、如果您不调用 cacheWb、您就不会 在 mcu1_0上看到内存更新?

    此致、

    Brijesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Brijesh:

    实际上、mcu1_0上的存储器已更新、但数据不符合预期。  在操作存储器时、MCU1_0称为接口高速缓存 Wb 和高速缓存 Inv。  我们要在 A72上调用类似的接口、以便在同一个块上运行。

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 xie JC:

    但是、如果内存未映射为在 A72上缓存、则无需调用缓存操作。  

    现在、如果此存储器缓存在 mcu1_0上、则是、您需要在 mcu1_0上调用缓存操作。 如果  不想对 mcu1_0调用缓存操作、则 即使在 mcu1_0上也将此存储器映射为缓存。

    此致、

    Brijesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Brijesh:

    但如果内存未映射为 A72上的缓存,则无需调用缓存操作

    是的、但现在我们需要 映射在 A72上缓存的存储器。我需要确保 A72将数据写入存储器、mcu1_ 0可以读取一致的数据。

    我看到过 mcu1_0的代码、它们没有将存储器映射为缓存。

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 xie JC:

    在 mcu1_0上、您能否检查 MPU 配置? MPU 将存储器映射为缓存或非缓存。  

    此致、

    Brijesh  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Brijesh:

    从何处检查 MPU 配置? DT 或 SBL?

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 xie JC:

    您在 mcu1_0上使用什么应用来检查此存储器?  

    请注意、SBL 不使用 DT 进行 MPU 配置。 它(在常规 PDK 应用中)有自己的方式来配置 MPU 配置。

    此致、

    Brijesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    一些提示:

    • 在 Linux 上,dev/mem 无法处理任何缓存甚至正常内存。 它始终具有强内存类型
    • 通过 dev.mem 获得缓存内存的最简单方法是复制 devmem 驱动程序并添加选项以通过您自己~~ 1-2天的工作来打开缓存设置
    • 在此类存储器上、您可以使用使用映射虚拟地址的常规 ARMv8缓存写回和失效等效函数(直到 SCTLR_EL1.UCI 设置为1)
    • DMA 堆缓存确实有限;)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 xie JC:

    此 TT 有任何进一步的更新?  

    此致、

    Brijesh