Highpoint RocketRAID 3xxx/4xxx 适配器驱动 (hptiop)

控制器寄存器映射

对于基于 RR44xx Intel IOP 的适配器,控制器 IOP 通过 PCI BAR0 和 BAR2 访问

BAR0 偏移

寄存器

0x11C5C

链路接口 IRQ 设置

0x11C60

链路接口 IRQ 清除

BAR2 偏移

寄存器

0x10

入站消息寄存器 0

0x14

入站消息寄存器 1

0x18

出站消息寄存器 0

0x1C

出站消息寄存器 1

0x20

入站门铃寄存器

0x24

入站中断状态寄存器

0x28

入站中断掩码寄存器

0x30

出站中断状态寄存器

0x34

出站中断掩码寄存器

0x40

入站队列端口

0x44

出站队列端口

对于基于 Intel IOP 的适配器,控制器 IOP 通过 PCI BAR0 访问

BAR0 偏移

寄存器

0x10

入站消息寄存器 0

0x14

入站消息寄存器 1

0x18

出站消息寄存器 0

0x1C

出站消息寄存器 1

0x20

入站门铃寄存器

0x24

入站中断状态寄存器

0x28

入站中断掩码寄存器

0x30

出站中断状态寄存器

0x34

出站中断掩码寄存器

0x40

入站队列端口

0x44

出站队列端口

对于基于 Marvell 非 Frey IOP 的适配器,IOP 通过 PCI BAR0 和 BAR1 访问

BAR0 偏移

寄存器

0x20400

入站门铃寄存器

0x20404

入站中断掩码寄存器

0x20408

出站门铃寄存器

0x2040C

出站中断掩码寄存器

BAR1 偏移

寄存器

0x0

入站队列头指针

0x4

入站队列尾指针

0x8

出站队列头指针

0xC

出站队列尾指针

0x10

入站消息寄存器

0x14

出站消息寄存器

0x40-0x1040

入站队列

0x1040-0x2040

出站队列

对于基于 Marvell Frey IOP 的适配器,IOP 通过 PCI BAR0 和 BAR1 访问

BAR0 偏移

寄存器

0x0

IOP 配置信息。

BAR1 偏移

寄存器

0x4000

入站列表基址低位

0x4004

入站列表基址高位

0x4018

入站列表写指针

0x402C

入站列表配置和控制

0x4050

出站列表基址低位

0x4054

出站列表基址高位

0x4058

出站列表复制指针阴影基址低位

0x405C

出站列表复制指针阴影基址高位

0x4088

出站列表中断原因

0x408C

出站列表中断使能

0x1020C

PCIe 功能 0 中断使能

0x10400

PCIe 功能 0 到 CPU 消息 A

0x10420

CPU 到 PCIe 功能 0 消息 A

0x10480

CPU 到 PCIe 功能 0 门铃

0x10484

CPU 到 PCIe 功能 0 门铃使能

非 Marvell Frey 的 I/O 请求工作流程

所有排队的请求都通过入站/出站队列端口处理。请求数据包可以分配在 IOP 或主机内存中。

要向控制器发送请求:

  • 通过读取入站队列端口获取空闲的请求数据包,或在主机 DMA 一致性内存中分配空闲的请求。

    从入站队列端口返回的值是相对于 IOP BAR0 的偏移量。

    在主机内存中分配的请求必须在 32 字节边界上对齐。

  • 填充数据包。

  • 通过写入入站队列将数据包发送到 IOP。对于在 IOP 内存中分配的请求,将偏移量写入入站队列端口。对于在主机内存中分配的请求,将 (0x80000000|(bus_addr>>5)) 写入入站队列端口。

  • IOP 处理该请求。当请求完成后,它将被放入出站队列。将生成一个出站中断。

    对于在 IOP 内存中分配的请求,请求偏移量将被发送到出站队列。

    对于在主机内存中分配的请求,(0x80000000|(bus_addr>>5)) 被发送到出站队列。如果在请求中设置了 IOP_REQUEST_FLAG_OUTPUT_CONTEXT 标志,则将发送低 32 位上下文值。

  • 主机读取出站队列并完成请求。

    对于在 IOP 内存中分配的请求,主机驱动程序通过将其写入出站队列来释放该请求。

非排队请求(复位/刷新等)可以通过入站消息寄存器 0 发送。具有相同值的出站消息表示入站消息已完成。

Marvell Frey 的 I/O 请求工作流程

所有排队的请求都通过入站/出站列表处理。

要向控制器发送请求:

  • 在主机 DMA 一致性内存中分配一个空闲的请求。

    在主机内存中分配的请求必须在 32 字节边界上对齐。

  • 使用请求索引填充请求中的标志。

    使用请求的物理地址和大小填充一个空闲的入站列表单元。

    使用先前单元的索引设置入站列表写指针,如果索引达到支持的请求计数,则舍入为 0。

  • 将入站列表写入指针发送到 IOP。

  • IOP 处理该请求。当请求完成后,请求的标志与 or-ed IOPMU_QUEUE_MASK_HOST_BITS 将被放入一个空闲的出站列表单元中,并且出站列表单元的索引将被放入复制指针阴影寄存器中。将生成一个出站中断。

  • 主机读取出站列表复制指针阴影寄存器,并与先前保存的读指针 N 进行比较。如果它们不同,主机将读取第 (N+1) 个出站列表单元。

    主机从第 (N+1) 个出站列表单元获取请求的索引并完成该请求。

非排队请求(复位通信/复位/刷新等)可以通过 PCIe 功能 0 到 CPU 消息 A 寄存器发送。具有相同值的 CPU 到 PCIe 功能 0 消息寄存器表示消息已完成。

用户级接口

该驱动程序公开以下 sysfs 属性

名称

R/W

描述

driver-version

R

驱动程序版本字符串

firmware-version

R

固件版本字符串


版权所有 © 2006-2012 HighPoint Technologies, Inc. 保留所有权利。

本文件分发目的是希望它能有所用处,但**不提供任何担保**;甚至不保证适销性或适用于特定用途。有关更多详细信息,请参阅 GNU 通用公共许可证。

linux@highpoint-tech.com

http://www.highpoint-tech.com