Spear PCIe Gadget 驱动程序

作者

Pratyush Anand (pratyush.anand@gmail.com)

位置

driver/misc/spear13xx_pcie_gadget.c

支持的芯片:

SPEAr1300 SPEAr1310

目的

该驱动程序有几个节点,可以通过 configfs 接口读取/写入。其主要目的是将选定的双模 PCIe 控制器配置为设备,然后对其各种寄存器进行编程,将其配置为特定的设备类型。此驱动程序可用于展示 spear 的 PCIe 设备能力。

不同节点的描述:

节点的读取行为:

link

给出 ltssm 状态。

int_type

支持的中断类型

no_of_msi

如果主机未启用 MSI,则为零。正值是授予的 MSI 向量的数量。

vendor_id

返回编程的供应商 ID (十六进制)

device_id

返回编程的设备 ID (十六进制)

bar0_size

以十六进制返回 bar0 的大小。

bar0_address

以十六进制返回 bar0 映射区域的地址。

bar0_rw_offset

返回 bar0 的偏移量,bar0_data 将返回该偏移量的值。

bar0_data

返回 bar0_rw_offset 的数据。

节点的写入行为:

link

写入 UP 以启用 ltsmm,写入 DOWN 以禁用

int_type

写入要配置的中断类型 (int_type 可以是 INTA、MSI 或 NO_INT)。仅当您已编程 no_of_msi 节点时才选择 MSI。

no_of_msi

需要的 MSI 向量数。

inta

写入 1 以置位 INTA,写入 0 以取消置位。

send_msi

写入要发送的 MSI 向量。

vendor_id

写入要编程的供应商 ID (十六进制)。

device_id

写入要编程的设备 ID (十六进制)。

bar0_size

以十六进制写入 bar0 的大小。默认 bar0 大小为 1000 (十六进制) 字节。

bar0_address

以十六进制写入 bar0 映射区域的地址。(bar0 的默认映射是 SYSRAM1(E0800000)。始终在 bar 地址之前编程 bar 大小。内核可能会修改 bar 大小和地址以进行对齐,因此在写入后读取回 bar 大小和地址进行交叉检查。

bar0_rw_offset

写入 bar0 的偏移量,bar0_data 将在该偏移量写入值。

bar0_data

写入要在 bar0_rw_offset 处写入的数据。

节点编程示例

以这样一种方式对所有 PCIe 寄存器进行编程,即当此设备连接到 PCIe 主机时,主机将此设备视为 1MB RAM。

#mount -t configfs none /Config

对于第 n 个 PCIe 设备控制器

# cd /config/pcie_gadget.n/

现在您在此目录中拥有所有节点。将供应商 ID 编程为 0x104a

# echo 104A >> vendor_id

将设备 ID 编程为 0xCD80

# echo CD80 >> device_id

将 BAR0 大小编程为 1MB

# echo 100000 >> bar0_size

检查编程的 bar0 大小

# cat bar0_size

将 BAR0 地址编程为 DDR (0x2100000)。这是内存的物理地址,该内存将被 PCIe 主机看到。同样,任何其他外围设备也可以对 PCIe 主机可见。例如,如果您将 UART 的基址编程为 BAR0 地址,那么当此设备连接到主机时,它将作为 UART 可见。

# echo 2100000 >> bar0_address

编程中断类型:INTA

# echo INTA >> int_type

现在进行链路启动

# echo UP >> link

必须确保,一旦 gadget 上完成链路启动,主机才能初始化并开始在其端口上搜索 PCIe 设备。

/*wait till link is up*/
# cat link

等待,直到它返回 UP。

要置位 INTA

# echo 1 >> inta

要取消置位 INTA

# echo 0 >> inta

如果要将 MSI 用作中断,请编程所需的 msi 向量数 (例如 4)

# echo 4 >> no_of_msi

选择 MSI 作为中断类型

# echo MSI >> int_type

现在进行链路启动

# echo UP >> link

等待直到链路启动

# cat link

应用程序可以重复读取此节点,直到发现链路启动。它可以在两次读取之间休眠。

等待直到启用 msi

# cat no_of_msi

应返回 4 (请求的 MSI 向量数)

发送 msi 向量 2

# echo 2 >> send_msi
# cd -