1. EndPoint模式下中断的发送
在EP模式下,PCIE会根据配置信息只产生MSI或者INTA中断中的一种,然后传送到RC端。
1.1 INTA中断的发送
INTA中断以带内消息(Assert_INTA/Deassert_INTA)的形式传递中断,其作用相当于传统PCI总线中使用边带中断信号线传递中断。根据以下步骤可产生INTA中断:
- 往EP_IRQ_SET寄存器写“1”,PCIE产生Assert_INTA消息;
- 往EP_IRQ_CLR寄存器写“1”,PCIE产生Deassert_INTA消息;
一旦一个Assert_INTA消息产生了,就必须等到Deassert_INTA消息产生后,才能产生下一个Assert_INTA消息,可通过查看EP_IRQ_STATUS寄存器确定中断的状态。
1.2 MSI中断的发送
MSI transaction的本质是中断 memory write transaction(IMWr),IMWr transaction是往设置好的一个固定地址里写入中断向量,每个EP支持32个中断向量。当设备生成MSI中断请求时,向远端设备产生一个IMWr transaction ,此transaction 的地址(IMWr)为MSI寄存器(MSI_ADDR_LOW_REG, MSI_ADDR_HIGH_REG)中的地址,数据(IMWr数据)为将MSI数据寄存器(MSI_DATA_REG)中的低5位修改为中断向量号,其余位不变。PCIE仅在EP模式时才有MSI接口。MSI transaction 支持iATU。
根据以下步骤产生MSI中断:
- 确保MSI中断已使能,即将寄存器MSI_CAP中MSI_En写为“1”,此时INTA中断使能必须关掉;
- 查询MSI地址寄存器,确定MSI中断的存储地址;
- 查询MSI数据寄存器;
- 确定分配给设备的MSI中断向量;
- 根据分配的中断向量,向RC发送一个Memory Write请求,地址为MSI寄存器中的地址,数据为将MSI数据寄存器中的数据低5位修改成中断向量,其余位不变。
2. RC模式下中断的接收
2.1 INTA中断的接收
RC模式下接收INTA中断时,需要在配置阶段做以下配置:
- 查询LEGACY_A_IRQ_EN寄存器,确认INTA中断使能是否打开,如果没有打开,往LEGACY_A_IRQ_EN寄存器第“0”位写“1”;
- 查询寄存器LEGACY_A_IRQ_MASK,确认INTA中断屏蔽位是否关掉,如果处于屏蔽状态,往寄存器LEGACY_A_IRQ_MASK第“0”位写“0”;
- 可通过查询寄存器LEGACY_A_IRQ_STATUS确定是否收到INTA中断请求,
2.2 MSI中断的接收
MSI中断支持32个中断向量,产生PCIE_MSI_Int0-PCIE_MSI_Int7八个中断事件,分别送给CorePac0-CorePac7。RC端PCIE接收到MSI transaction 后,当MSI transaction 的地址与RC端MSI地址寄存器(MSI_CTRL_ADDR_LOW_REG, MSI_CTRL_ADDR_HIGH_REG)中的地址匹配时,PCIE根据MSI transaction 的数据解析出MSI中断;地址不匹配时,通过AXI转接桥写到对应的Memory空间,PCIE并不区分MSI transaction与Memory Write transaction 。
RC模式下接收MSI中断时,需要在配置阶段做以下设置:
- 查询寄存器MSI_CTRL_INT_EN_REG,确认MSI中断使能是否打开,如果没有打开,往寄存器MSI_CTRL_INT_EN_REG的对应位写“1”;
- 查询寄存器MSI_CTRL_INT_EN_MASK_REG,确认MSI中断屏蔽位是否关掉,如果处于屏蔽状态,往寄存器MSI_CTRL_INT_EN_MASK_REG的对应位写“0”;
- 可查询寄存器MSI_CTRL_INT_EN_STATUS_REG确认是否收到MSI中断请求。
MSI_CTRL_INT_EN_REG,MSI_CTRL_INT_MASK_REG,MSI_CTRL_INT_STATUS_REG这三个寄存器的每一位对应一个中断向量的配置或者状态,例如:bit0对应中断向量0,bit7对应中断向量7。