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.

[参考译文] AM623:为 DMA 缓冲池配置防火墙

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1475252/am623-configuring-firewall-for-dma-buffer-pool

器件型号:AM623

工具/软件:

您好:

这是对 https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1460476/am623-understanding-firewall-for-dma 的直接跟进

起初、该解决方案似乎有效、但随着开发的进行、我们现在发现此防火墙配置仅适用于描述符环。
它不包括为帧分配的缓冲区、因此 DMA 能够在不尊重防火墙配置的情况下将接收帧写入存储器中的任何位置。

是否需要阻止其他 ID? 为什么仍然有不同之处、是否涉及另一个负责帧事务的硬件组件?

谢谢

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

    您好:

    我不太熟悉 DMA 架构、但防火墙只关心保护给定的存储器地址空间。 如果像您所说的那样有多个与 DMA 关联的地址空间(例如描述符和缓冲区)、则需要对此类地址空间进行防火墙保护。

    此致、

    Prashant

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

    您好:

    我当前的防火墙配置如您所建议的那样:

    • 具有以下权限的整个地址空间0x80000000 - 0xe0000000的后台区域:
      • 允许使用通配符 privid 0xC3访问每个人。
      • 允许使用通配符 privid 0xC3 (冗余)访问每个人。
      • 块访问 DMA (privid = 0)。
    • 具有以下三种权限设置的前台区域0xb0000000-0xb0200000:
      • 允许使用通配符 privid 0xC3访问每个人。
      • 允许使用通配符 privid 0xC3 (冗余)访问每个人。
      • 允许使用通配符 privid 0xC3 (冗余)访问每个人。

    描述符环位于0xb0000000、帧缓冲区从0xa0000000开始分配。

    根据防火墙配置、我假设 DMA 应该无法在0xa0000000处写入、但可以写入。 另一方面、当前台区域位于其他位置时、由于缺少对0xb0000000的访问、DMA 不再工作。

    因此、对我来说、防火墙似乎没有正确地保护从 DMA 访问的内存。 我也尝试添加 priv ID 192 (DMA 保留 Priv-ID)到阻止的列表,但没有更改。

    我注意到帧缓冲区使用 ASEL (另一个我不完全理解的系统)、并且 TRM 指出 DDR 上的防火墙不支持 ASEL。  
    这可能是问题吗? 您能解释一下 ASEL 的用途吗?

    谢谢

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

    您好:

    从防火墙配置中、我假设 DMA 应该无法写入0xa0000000、但可以写入。

    应该是这样的、除非 DMA 事务被另一个 PRIVID 标记。

    您可以为帧缓冲区地址空间创建另一个前景区域、这些区域具有阻止所有人访问的权限(0xC30000)。 然后、您可以从 SYSFW 的防火墙例外记录中获取 PRIVID。

    此致、

    Prashant

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

    您好:

    如何启用防火墙日志记录?

    谢谢

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

    您好:

    有关启用 TIFS 日志的信息、请参阅以下指南:

    https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/10_01_10_04/exports/docs/linux/How_to_Guides/Host/SYSFW_Trace_Parser.html

    如果正确启用、TIFS 日志将出现在 MAIN_UART1实例上。

    此致、

    Prashant

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

    您好:

    感谢您的链接。 我需要一些时间来完成此操作、因为在我们的电路板上、UART1不容易从外部访问。

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

    您好:

    也可以从存储器缓冲区收集跟踪、如下所述:

    https://software-dl.ti.com/tisci/esd/latest/4_trace/trace.html#trace-memory-buffer-location

    但是、由于这些缓冲区是圆形缓冲区、因此捕获的迹线可能不完整、并且不提供相关信息。 但是、如果无法启用 UART1、可以尝试使用它。

    此致、

    Prashant

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

    您好:

    我设法从内存缓冲区读取跟踪。

    以下是我的调查结果:

    阻止描述符环(priv-id 0、从 0xB0200000开始):

    因为这里仅阻止了 priv-id 0、所以这应源自 DMA。

    FWL Bit  0x1
    Exception addr  0x45B0000
    FWL Exception  0x1000100
     0x60000
     0xB0200000
     0x0
     0x821000
     0x8
    
    FWL Bit  0x1
    Exception addr  0x45B08000
    FWL Exception  0x1000100
     0x60000
     0xB02002C8
     0x0
     0x821000
     0x8
    
    FWL Bit  0x1
    Exception addr  0x45B08000
    FWL Exception  0x1000100
     0x60000
     0xB0200570
     0x0
     0x821000
     0x8

    阻止缓冲环(priv-id 0xc3、从 0x8FFF0000开始):

    此处、发起方应为 DMA、因为在接收数据(AFAIK)之前未访问该地址。

    FWL Bit  0x1
    Exception addr  0x45B08000
    FWL Exception  0x1000100
     0x70000
     0x8FFF2040
     0x0
     0x42201
     0x40
     
    FWL Bit  0x1
    Exception addr  0x45B08000
    FWL Exception  0x1000100
     0x70000
     0x8FFF4040
     0x0
     0x42201
     0x40
    
    FWL Bit 
    0x1
    Exception addr  0x45B08000
    FWL Exception  0x1000100
     0x70000
     0x8FFF5040
     0x0
     0x42201
     0x40
    
    FWL Bit  0x1
    Exception addr  0x45B08000
    FWL Exception  0x1000100
     0x70000
     0x8FFF6040
     0x0
     0x42201
     0x40
    
    FWL Bit  0x1
    Exception addr  0x45B08000
    FWL Except
    on  0x1000100
     0x70000
     0x8FFF7040
     0x0
     0x42201
     0x40

    您能帮助我了解这些日志吗?
    我可以识别访问的地址、并假定 FWL 位是防火墙 ID (1=DDR)。 如何找到导致事务的 priv-id?

    谢谢。

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

    您好:

    根据表"表3-5防火墙违规参数"

    https://www.ti.com/document-viewer/lit/html/SPRUIV7B#GUID-26BD43DA-22BA-4EC0-A0BA-0E6F7AD6EE27/TITLE-SPRUIM0INT_SPRUIM0_SA_00050

    privid 是 DATA2寄存器的一部分。 在日志中、异常日志中最后第二个值是 DATA2寄存器值。 所以、

    阻止缓冲区环(priv-id 0xc3、起始地址为 0x8FFF0000):

    这些例外情况适用于 privid 1的写入事务。

    根据以下内容、privid 1与 A53关联。

    https://software-dl.ti.com/tisci/esd/latest/5_soc_doc/am62x/firewalls.html#list-of-priv-ids

    除非 DMA 继承启动器优先级、否则写入事务可能来自 Linux 内核。 是否确定除了 DMA 之外没有任何人正在写入这些缓冲区?

    此致、

    Prashant

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

    您好:

    实际上、DMA 似乎继承了 A53优先级 ID。 经过一些测试后、我确定 DMA 缓冲区区域中所需的权限为非安全/用户/缓存。 如果启用了此功能、则会正确接收帧、但如果禁用该功能、DMA 和 Linux 都无法访问该区域。 我仅使用这一个权限进行了测试、这向我表明它也被 DMA 使用、否则会触发另一个异常。 此外、我在 Linux 代码中看不到对 RX 缓冲区的写入访问。

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

    您好  Prashant、

    DMA 继承 A53优先 ID 的原因可能是什么? 是否可以在提取描述符后由 A53处理传入事务?

    我看到缓冲区地址的 ASEL 设置为15、这可以更改优先级 ID 吗? 但在设备树中将其设置为0时、会出现问题。

    谢谢。

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

    你好 

    是否对此问题进行了任何更新?

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

    您好:

    对延迟的回复表示歉意。

    我从 MCU+ SDK 测试了 A53内核的 UDMA_memcpy_Polling 示例。 我看不出 DMA 对描述符和帧缓冲区使用不同的 PrivID。

    // Descriptor buffer
    FWL Bit  0x1
    Exception addr  0x45B08000
    FWL Exception  0x1000100
     0x60000
     0xA0000000
     0x0
     0x801000
     0x10
    
    // Tx and Rx buffers
    FWL Bit  0x1
    Exception addr  0x45B08000
    FWL Exception  0x1000100
     0x60000
     0xA0100000
     0x0
     0x801000
     0x40

    您能否共享当前的防火墙配置?

    谢谢!

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

    您好 Prashant、

    感谢您的测试。 这让我希望硬件支持我的目标、我可能会错过一些配置。

    以下是我当前的防火墙配置、带有一些注释:

    TI UDMA (INFO)>: fwl_id=1, region=0, n_permission_regs=3
    TI UDMA (INFO)>: control=0x11a
    TI UDMA (INFO)>: perm[0]=0xc3ffff
    TI UDMA (INFO)>: perm[1]=0xc3ffff
    TI UDMA (INFO)>: perm[2]=0x008888 <- Disallow UDMA
    TI UDMA (INFO)>: Range: 0x80000000 - 0xefffffff <- full memory range
    TI UDMA (INFO)>: fwl_id=1, region=1, n_permission_regs=3
    TI UDMA (INFO)>: control=0x1a
    TI UDMA (INFO)>: perm[0]=0xc3ffff
    TI UDMA (INFO)>: perm[1]=0xc3ffff
    TI UDMA (INFO)>: perm[2]=0xc3ffff
    TI UDMA (INFO)>: Range: 0xb0000000 - 0xb007ffff <- buffer descriptor ring
    TI UDMA (INFO)>: fwl_id=1, region=2, n_permission_regs=3
    TI UDMA (INFO)>: control=0x1a
    TI UDMA (INFO)>: perm[0]=0xc38888
    TI UDMA (INFO)>: perm[1]=0xc38888
    TI UDMA (INFO)>: perm[2]=0x018888 <- Kernel cannot boot
                             0x018c88 (user,nsec,cache) <- Kernel can boot and frames can be received
    TI UDMA (INFO)>: Range: 0xa0000000 - 0xa8000fff <- Linux Kernel + frame buffers

    在最后一个区域、我将尝试了解哪些是有效的、哪些是无效的。 我确定了缓存权限标志、以启用从 Linux 进行的内存访问。 但是、通过设置此标志、DMA 也可以写入存储器。 可能缺少某些高速缓存配置?

    谢谢。此致

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

    您好 Prashant、

    是否有关于我的防火墙配置的备注?

    我现在已经发现、通过设置控制寄存器(0x200)中的高速缓存位、我可以更好地控制访问、并且读取/写入权限的表现更符合我的预期。

    但是、我仍然 只捕获对 priv-id 为1的帧缓冲区的访问。  

    DMA 继承 A53优先 ID 的原因可能是什么? 是否可以在提取描述符后由 A53处理传入事务?

    我看到缓冲区地址的 ASEL 设置为15、这可以更改优先级 ID 吗?

    谢谢。