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 Function 0 中断使能

0x10400

PCIe Function 0 到 CPU 消息 A

0x10420

CPU 到 PCIe Function 0 消息 A

0x10480

CPU 到 PCIe Function 0 门铃

0x10484

CPU 到 PCIe Function 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 Function 0 到 CPU 消息 A 寄存器发送。 具有相同值的 CPU 到 PCIe Function 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