工作记录[1]

为了防止未来的我忘记现在的我在想什么,同时也可以水一些博客,打算写写工作记录。

这些记录对绝大部分情况下的绝大部分人应该都没有什么参考价值。

Darjeeling中的Mailbox

(对于mailbox0)

  • 参考mbx_reg_pkg.sv中的代码:

    1
    2
    3
    4
    5
    // Register offsets for soc interface
    parameter logic [SocAw-1:0] MBX_SOC_CONTROL_OFFSET = 5'h 8;
    parameter logic [SocAw-1:0] MBX_SOC_STATUS_OFFSET = 5'h c;
    parameter logic [SocAw-1:0] MBX_SOC_DOE_INTR_MSG_ADDR_OFFSET = 5'h 18;
    parameter logic [SocAw-1:0] MBX_SOC_DOE_INTR_MSG_DATA_OFFSET = 5'h 1c;
  • 基地址:0,我在配置地址(在tl_mbx_pkg.sv中)时将其映射至0x3b100000。

  • 该邮箱不支持PCIe拓展,而所有邮箱(普通mailbox和mailbox_pcie)都是用一个同模块实例化的。故对于mailbox0,0~7的地址内(原本是DOE Extended Capability Header和DOE Capability Header)是无用的。

  • DOE Interrupt Message Address Register:

    • 仅在固件与固件之间的邮箱通信情况下定义。由邮箱响应方通过写入已配置的地址向请求方发送中断消息。需要注意的是,这种固件到固件的邮箱可能主要在CTN地址空间中可访问。因此,配置的地址属于SoC的CTN地址空间的一部分。
    • CPU执行指令访问邮箱并不属于固件与固件之间的邮箱通信,算是软件驱动的通信。故其对应地址空间也是无用的。
    • 映射后地址为0x3b100018。
  • DOE Interrupt Message Data Register:

    • 要发送到 DOE 中断消息地址寄存器中配置的地址的中断消息数据
    • 映射后地址为0x3b10001c。
  • 以上四个寄存器暂时都不在考虑范围内。

  • DOE Control Register:

    • DOE控制寄存器

    • 位位置 位定义 说明
      0 DOE中止(DOE Abort) 当向此字段中写入1’b1时,中止所有数据对象传输操作。读取此字段始终返回0。
      1 DOE中断使能(DOE Interrupt Enable) 设置时,DOE实例被允许发送中断。
      2 待定
      3 DOE异步消息使能(DOE Async Message Enable) 使响应者可以向请求者发送异步消息
      4:30 保留
      31 DOE启动(DOE Go) 表示通过DOE写数据邮箱寄存器传输的DOE对象已准备好被使用。
      传输整个对象之前设置Go位的行为是未定义的。
      DOE忙位被置位时设置Go位的行为是未定义的。
      读取此位始终返回零。
    • 映射地址为0x3b10000c。

  • DOE Status Register

    • DOE状态寄存器

    • 位位置 位定义 说明
      0 DOE忙(DOE Busy) 当DOE实例正在处理接收到的数据对象时,此位被设置。
      设置时表示DOE实例正忙,无法通过DOE写数据邮箱寄存器接受新的数据对象。
      在处理中止命令时,DOE实例必须设置此位,中止处理完成后清除。
      1 DOE中断状态(DOE Interrupt Status) 如果启用中断,则生成中断以指示数据对象(响应)已准备好供请求者使用,或DOE错误已设置,或DOE忙位已清除(即准备接受新对象)。
      当断言此类中断时,此位被设置。
      向此位写入值1会清除状态位。
      2 DOE错误(DOE Error) 如果处理接收到的数据对象时发生内部错误或遇到不支持的数据对象,DOE实例设置此位。
      通过向DOE控制寄存器中的DOE终止位写入1’b1来清除此位。
      DOE中止是清除此位的唯一机制。
      3 DOE异步消息状态(DOE Async Message Status) 当有一个或多个异步消息准备传输给请求者时,由响应者设置
      4 待定
      5:30 保留
      31 DOE对象就绪(DOE Object Ready) 表示DOE对象(响应)已准备好通过DOE读数据邮箱寄存器被系统主机读取。一旦系统软件读取整个数据对象且没有更多对象准备传输,DOE实例应清除此位。如果尚未清除,DOE实例应在响应DOE中止处理时清除此位。
      读取此位始终返回0(?为什么?)。默认值为0。
    • 映射地址为0x3b100008。

  • 同样参考mbx_reg_pkg.sv中的代码:

    1
    2
    3
    4
    5
    6
    7
    // Window parameters for soc interface
    parameter logic [SocAw-1:0] MBX_WDATA_OFFSET = 5'h 10;
    parameter int unsigned MBX_WDATA_SIZE = 'h 4;
    parameter int unsigned MBX_WDATA_IDX = 0;
    parameter logic [SocAw-1:0] MBX_RDATA_OFFSET = 5'h 14;
    parameter int unsigned MBX_RDATA_SIZE = 'h 4;
    parameter int unsigned MBX_RDATA_IDX = 1;
  • DOE Write Data Mailbox Register

    • DOE写数据邮箱寄存器
    • 32位
    • DOE 写数据双字:
      • 通过每次向此寄存器写入一个双字来将 DOE 对象传输到 DOE 实例。
      • 成功写入会向 DOE 实例中正在组装的数据对象添加一个双字。
      • 向 DOE 控制寄存器中的 DOE Go 位写入 1’b1 标志着数据传输的完成,即对象的最后一个双字已被写入。
    • 映射地址为0x3b100010
  • DOE Read Data Mailbox Register

    • DOE读数据邮箱寄存器
    • 32位
    • DOE 读数据双字:
      • 一旦 DOE 实例在 DOE 状态寄存器中设置了 DOE 对象就绪位,系统软件就可以通过每次读取此寄存器一个双字(DWORD)来从 DOE 实例读取 DOE 对象。
      • 向此寄存器写入任何值表示成功读取当前双字。随后对此寄存器的读取将返回正在读取的数据对象中的下一个双字。
      • 当 DOE 对象就绪位(DOE Status Register的31位)被设置时,可以连续传输数据对象。如果 DOE 数据对象就绪位被清除,向此寄存器写入任何值都不应产生效果,且从此寄存器读取必须返回零。
    • 映射地址为0x3b100014

问题

为什么mailbox的DOE状态寄存器的DOE对象就绪(DOE Object Ready)位在被读取时始终返回0?这样的话系统主机端怎么知道DOE响应是否就绪,以及现在从DOE读数据寄存器读出来的东西是否是DOE响应的一部分?虽然应该也可以通过DOE中断状态位来判断,但如果没启用中断怎么办。而且中断状态位是由系统主机置0的,那系统主机要怎么知道一个响应被读取完了没有?