RapidIO 子系统指南

作者:

Matt Porter

简介

RapidIO 是一种高速交换结构互连,其特性面向嵌入式市场。RapidIO 为交换结构网络上的内存映射 I/O 以及基于消息的事务提供支持。RapidIO 具有标准化的发现机制,与 PCI 总线标准类似,可以简单地检测网络中的设备。

本文档旨在为计划在新架构上支持 RapidIO、编写新驱动程序或理解子系统内部结构的开发人员提供。

已知错误和限制

问题

无。 ;)

限制

  1. 不支持 RapidIO 内存区域的访问/管理

  2. 不支持多主机枚举

RapidIO 驱动程序接口

驱动程序被提供一组调用,以便与子系统接口,以收集设备信息、请求/映射内存区域资源以及管理邮箱/门铃。

函数

int rio_local_read_config_32(struct rio_mport *port, u32 offset, u32 *data)

从本地配置空间读取 32 位数据

参数

struct rio_mport *port

主端口

u32 offset

本地配置空间中的偏移量

u32 * data

用于读取数据到的指针

描述

从本地设备的配置空间中指定偏移量读取 32 位数据。

int rio_local_write_config_32(struct rio_mport *port, u32 offset, u32 data)

向本地配置空间写入 32 位数据

参数

struct rio_mport *port

主端口

u32 offset

本地配置空间中的偏移量

u32 data

要写入的数据

描述

将 32 位数据写入本地设备的配置空间中指定偏移量。

int rio_local_read_config_16(struct rio_mport *port, u32 offset, u16 *data)

从本地配置空间读取 16 位数据

参数

struct rio_mport *port

主端口

u32 offset

本地配置空间中的偏移量

u16 * data

用于读取数据到的指针

描述

从本地设备的配置空间中指定偏移量读取 16 位数据。

int rio_local_write_config_16(struct rio_mport *port, u32 offset, u16 data)

向本地配置空间写入 16 位数据

参数

struct rio_mport *port

主端口

u32 offset

本地配置空间中的偏移量

u16 data

要写入的数据

描述

将 16 位数据写入本地设备的配置空间中指定偏移量。

int rio_local_read_config_8(struct rio_mport *port, u32 offset, u8 *data)

从本地配置空间读取 8 位数据

参数

struct rio_mport *port

主端口

u32 offset

本地配置空间中的偏移量

u8 * data

用于读取数据到的指针

描述

从本地设备的配置空间中指定偏移量读取 8 位数据。

int rio_local_write_config_8(struct rio_mport *port, u32 offset, u8 data)

向本地配置空间写入 8 位数据

参数

struct rio_mport *port

主端口

u32 offset

本地配置空间中的偏移量

u8 data

要写入的数据

描述

将 8 位数据写入本地设备的配置空间中指定偏移量。

int rio_read_config_32(struct rio_dev *rdev, u32 offset, u32 *data)

从配置空间读取 32 位数据

参数

struct rio_dev *rdev

RIO 设备

u32 offset

设备配置空间中的偏移量

u32 * data

用于读取数据到的指针

描述

从 RIO 设备的配置空间中指定偏移量读取 32 位数据。

int rio_write_config_32(struct rio_dev *rdev, u32 offset, u32 data)

向配置空间写入 32 位数据

参数

struct rio_dev *rdev

RIO 设备

u32 offset

设备配置空间中的偏移量

u32 data

要写入的数据

描述

将 32 位数据写入 RIO 设备的配置空间中指定偏移量。

int rio_read_config_16(struct rio_dev *rdev, u32 offset, u16 *data)

从配置空间读取 16 位数据

参数

struct rio_dev *rdev

RIO 设备

u32 offset

设备配置空间中的偏移量

u16 * data

用于读取数据到的指针

描述

从 RIO 设备的配置空间中指定偏移量读取 16 位数据。

int rio_write_config_16(struct rio_dev *rdev, u32 offset, u16 data)

向配置空间写入 16 位数据

参数

struct rio_dev *rdev

RIO 设备

u32 offset

设备配置空间中的偏移量

u16 data

要写入的数据

描述

将 16 位数据写入 RIO 设备的配置空间中指定偏移量。

int rio_read_config_8(struct rio_dev *rdev, u32 offset, u8 *data)

从配置空间读取 8 位数据

参数

struct rio_dev *rdev

RIO 设备

u32 offset

设备配置空间中的偏移量

u8 * data

用于读取数据到的指针

描述

从 RIO 设备的配置空间中指定偏移量读取 8 位数据。

int rio_write_config_8(struct rio_dev *rdev, u32 offset, u8 data)

向配置空间写入 8 位数据

参数

struct rio_dev *rdev

RIO 设备

u32 offset

设备配置空间中的偏移量

u8 data

要写入的数据

描述

将 8 位数据写入 RIO 设备的配置空间中指定偏移量。

int rio_send_doorbell(struct rio_dev *rdev, u16 data)

向设备发送门铃消息

参数

struct rio_dev *rdev

RIO 设备

u16 data

门铃消息数据

描述

向 RIO 设备发送门铃消息。门铃消息包含一个由 data 参数提供的 16 位信息字段。

void rio_init_mbox_res(struct resource *res, int start, int end)

初始化 RIO 邮箱资源

参数

struct resource *res

资源结构体

int start

邮箱范围的起始

int end

邮箱范围的结束

描述

此函数用于初始化资源字段,以便作为邮箱资源使用。它使用 start 和 end 参数初始化一个邮箱范围。

void rio_init_dbell_res(struct resource *res, u16 start, u16 end)

初始化 RIO 门铃资源

参数

struct resource *res

资源结构体

u16 start

门铃范围的起始

u16 end

门铃范围的结束

描述

此函数用于初始化资源字段,以便作为门铃资源使用。它使用 start 和 end 参数初始化一个门铃消息范围。

RIO_DEVICE

RIO_DEVICE (dev, ven)

用于描述特定 RIO 设备的宏

参数

dev

16 位 RIO 设备 ID

ven

16 位 RIO 供应商 ID

描述

此宏用于创建一个与特定设备匹配的 struct rio_device_id。组装厂商和组装设备字段将设置为 RIO_ANY_ID

int rio_add_outb_message(struct rio_mport *mport, struct rio_dev *rdev, int mbox, void *buffer, size_t len)

将 RIO 消息添加到出站邮箱队列

参数

struct rio_mport *mport

包含出站队列的 RIO 主端口

struct rio_dev *rdev

消息将发送到的 RIO 设备

int mbox

出站邮箱队列

void *buffer

消息缓冲区指针

size_t len

消息缓冲区的长度

描述

将 RIO 消息缓冲区添加到出站邮箱队列以进行传输。成功时返回 0。

int rio_add_inb_buffer(struct rio_mport *mport, int mbox, void *buffer)

将缓冲区添加到入站邮箱队列

参数

struct rio_mport *mport

包含入站邮箱的主端口

int mbox

入站邮箱号

void *buffer

消息缓冲区指针

描述

将缓冲区添加到入站邮箱队列以接收数据。成功时返回 0。

void *rio_get_inb_message(struct rio_mport *mport, int mbox)

从入站邮箱队列获取 RIO 消息

参数

struct rio_mport *mport

包含入站邮箱的主端口

int mbox

入站邮箱号

描述

从入站邮箱队列获取 RIO 消息。成功时返回 0。

const char *rio_name(struct rio_dev *rdev)

获取唯一的 RIO 设备标识符

参数

struct rio_dev *rdev

RIO 设备

描述

获取唯一的 RIO 设备标识符。返回设备标识符字符串。

void *rio_get_drvdata(struct rio_dev *rdev)

获取 RIO 驱动程序特定数据

参数

struct rio_dev *rdev

RIO 设备

描述

获取 RIO 驱动程序特定数据。返回指向驱动程序特定数据的指针。

void rio_set_drvdata(struct rio_dev *rdev, void *data)

设置 RIO 驱动程序特定数据

参数

struct rio_dev *rdev

RIO 设备

void *data

指向驱动程序特定数据的指针

描述

设置 RIO 驱动程序特定数据。设备 struct driver 数据指针被设置为 data 参数。

struct rio_dev *rio_dev_get(struct rio_dev *rdev)

增加 RIO 设备结构体的引用计数

参数

struct rio_dev *rdev

被引用的 RIO 设备

描述

每个对设备的活动引用都应当进行引用计数。

RIO 设备的驱动程序通常应在它们绑定设备时,在其 probe() 方法中记录此类引用,并在其 disconnect() 方法中通过调用 rio_dev_put() 来释放它们。

void rio_dev_put(struct rio_dev *rdev)

释放 RIO 设备结构体的一个使用

参数

struct rio_dev *rdev

正在断开连接的 RIO 设备

描述

当设备的使用者完成对其使用时必须调用此函数。当该设备的最后一个使用者调用此函数时,将释放该设备的内存。

int rio_register_driver(struct rio_driver *rdrv)

注册一个新的 RIO 驱动程序

参数

struct rio_driver *rdrv

要注册的 RIO 驱动程序结构体

描述

将一个 struct rio_driver 添加到已注册驱动程序列表中。错误时返回负值,否则返回 0。如果未发生错误,即使在注册期间没有设备被声明,驱动程序仍保持注册状态。

void rio_unregister_driver(struct rio_driver *rdrv)

注销一个 RIO 驱动程序

参数

struct rio_driver *rdrv

要注销的 RIO 驱动程序结构体

描述

从已注册的 RIO 驱动程序列表中删除 struct rio_driver,通过为它负责的每个设备调用其 remove() 函数来使其有机会进行清理,并将这些设备标记为无驱动程序。

u16 rio_local_get_device_id(struct rio_mport *port)

获取端口的基础/扩展设备 ID

参数

struct rio_mport *port

从中获取设备 ID 的 RIO 主端口

描述

从实现主端口的本地设备读取基础/扩展设备 ID。返回 8/16 位设备 ID。

int rio_query_mport(struct rio_mport *port, struct rio_mport_attr *mport_attr)

查询 mport 设备属性

参数

struct rio_mport *port

要查询的 mport 设备

struct rio_mport_attr *mport_attr

mport 属性数据结构

描述

通过指向属性数据结构的指针返回指定 mport 的属性。

struct rio_net *rio_alloc_net(struct rio_mport *mport)

分配并初始化新的 RIO 网络数据结构

参数

struct rio_mport *mport

与 RIO 网络关联的主端口

描述

分配一个 RIO 网络结构,初始化每个网络的列表头,并将关联的主端口添加到关联主端口的网络列表中。成功时返回 RIO 网络指针,失败时返回 NULL

void rio_local_set_device_id(struct rio_mport *port, u16 did)

设置端口的基础/扩展设备 ID

参数

struct rio_mport *port

RIO 主端口

u16 did

要写入的设备 ID 值

描述

从设备写入基础/扩展设备 ID。

int rio_add_device(struct rio_dev *rdev)

将 RIO 设备添加到设备模型

参数

struct rio_dev *rdev

RIO 设备

描述

将 RIO 设备添加到全局设备列表,并将 RIO 设备添加到 RIO 设备列表。为 RIO 设备创建通用的 sysfs 节点。

int rio_request_inb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries, void (*minb)(struct rio_mport *mport, void *dev_id, int mbox, int slot))

请求入站邮箱服务

参数

struct rio_mport *mport

从中分配邮箱资源的 RIO 主端口

void *dev_id

事件发生时传递的设备特定指针

int mbox

要声明的邮箱号

int entries

入站邮箱队列中的条目数

void (*minb) (struct rio_mport * mport, void *dev_id, int mbox, int slot)

接收到入站消息时执行的回调函数

描述

请求入站邮箱资源的所有权,并将回调函数绑定到该资源。成功时返回 0

int rio_release_inb_mbox(struct rio_mport *mport, int mbox)

释放入站邮箱消息服务

参数

struct rio_mport *mport

从中释放邮箱资源的 RIO 主端口

int mbox

要释放的邮箱号

描述

释放入站邮箱资源的所有权。如果请求已满足,则返回 0。

int rio_request_outb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries, void (*moutb)(struct rio_mport *mport, void *dev_id, int mbox, int slot))

请求出站邮箱服务

参数

struct rio_mport *mport

从中分配邮箱资源的 RIO 主端口

void *dev_id

事件发生时传递的设备特定指针

int mbox

要声明的邮箱号

int entries

出站邮箱队列中的条目数

void (*moutb) (struct rio_mport * mport, void *dev_id, int mbox, int slot)

发送出站消息时执行的回调函数

描述

请求出站邮箱资源的所有权,并将回调函数绑定到该资源。成功时返回 0。

int rio_release_outb_mbox(struct rio_mport *mport, int mbox)

释放出站邮箱消息服务

参数

struct rio_mport *mport

从中释放邮箱资源的 RIO 主端口

int mbox

要释放的邮箱号

描述

释放入站邮箱资源的所有权。如果请求已满足,则返回 0。

int rio_request_inb_dbell(struct rio_mport *mport, void *dev_id, u16 start, u16 end, void (*dinb)(struct rio_mport *mport, void *dev_id, u16 src, u16 dst, u16 info))

请求入站门铃消息服务

参数

struct rio_mport *mport

从中分配门铃资源的 RIO 主端口

void *dev_id

事件发生时传递的设备特定指针

u16 start

门铃信息范围起始

u16 end

门铃信息范围结束

void (*dinb) (struct rio_mport * mport, void *dev_id, u16 src, u16 dst, u16 info)

接收到门铃时执行的回调函数

描述

请求入站门铃资源的所有权,并将回调函数绑定到该资源。如果请求已满足,则返回 0。

int rio_release_inb_dbell(struct rio_mport *mport, u16 start, u16 end)

释放入站门铃消息服务

参数

struct rio_mport *mport

从中释放门铃资源的 RIO 主端口

u16 start

门铃信息范围起始

u16 end

门铃信息范围结束

描述

释放入站门铃资源的所有权,并从门铃事件列表中移除回调函数。如果请求已满足,则返回 0。

struct resource *rio_request_outb_dbell(struct rio_dev *rdev, u16 start, u16 end)

请求出站门铃消息范围

参数

struct rio_dev *rdev

从中分配门铃资源的 RIO 设备

u16 start

门铃消息范围起始

u16 end

门铃消息范围结束

描述

请求门铃消息范围的所有权。如果请求已满足,则返回一个资源,否则失败时返回 NULL

int rio_release_outb_dbell(struct rio_dev *rdev, struct resource *res)

释放出站门铃消息范围

参数

struct rio_dev *rdev

从中释放门铃资源的 RIO 设备

struct resource *res

要释放的门铃资源

描述

释放门铃消息范围的所有权。如果请求已满足,则返回 0。

int rio_add_mport_pw_handler(struct rio_mport *mport, void *context, int (*pwcback)(struct rio_mport *mport, void *context, union rio_pw_msg *msg, int step))

将端口写入消息处理程序添加到 mport 特定 pw 处理程序列表

参数

struct rio_mport *mport

用于绑定端口写入回调的 RIO 主端口

void *context

事件发生时传递的特定于处理程序的上下文

int (*pwcback)(struct rio_mport *mport, void *context, union rio_pw_msg *msg, int step)

接收到端口写入时执行的回调函数

描述

如果请求已满足,则返回 0。

int rio_del_mport_pw_handler(struct rio_mport *mport, void *context, int (*pwcback)(struct rio_mport *mport, void *context, union rio_pw_msg *msg, int step))

从 mport 特定 pw 处理程序列表中移除端口写入消息处理程序

参数

struct rio_mport *mport

用于绑定端口写入回调的 RIO 主端口

void *context

事件发生时传递的已注册处理程序特定上下文

int (*pwcback)(struct rio_mport *mport, void *context, union rio_pw_msg *msg, int step)

已注册的回调函数

描述

如果请求已满足,则返回 0。

int rio_request_inb_pwrite(struct rio_dev *rdev, int (*pwcback)(struct rio_dev *rdev, union rio_pw_msg *msg, int step))

为特定 RapidIO 设备请求入站端口写入消息服务

参数

struct rio_dev *rdev

注册入站端口写入回调例程的 RIO 设备

int (*pwcback)(struct rio_dev *rdev, union rio_pw_msg *msg, int step)

接收到端口写入时执行的回调例程

描述

将端口写入回调函数绑定到 RapidIO 设备。如果请求已满足,则返回 0。

int rio_release_inb_pwrite(struct rio_dev *rdev)

释放与特定 RapidIO 设备关联的入站端口写入消息服务

参数

struct rio_dev *rdev

已注册入站端口写入回调的 RIO 设备

描述

从 rio_dev 结构中移除回调函数。如果请求已满足,则返回 0。

void rio_pw_enable(struct rio_mport *mport, int enable)

启用/禁用主端口的端口写入处理

参数

struct rio_mport *mport

与端口写入处理相关联的主端口

int enable

1=启用, 0=禁用

int rio_map_inb_region(struct rio_mport *mport, dma_addr_t local, u64 rbase, u32 size, u32 rflags)
  • 映射入站内存区域。

参数

struct rio_mport *mport

主端口。

dma_addr_t local

要映射的内存区域的物理地址

u64 rbase

分配给此窗口的 RIO 基地址

u32 size

内存区域的大小

u32 rflags

映射标志。

返回

0 -- 成功。

描述

此函数将创建从 RIO 空间到本地内存的映射。

void rio_unmap_inb_region(struct rio_mport *mport, dma_addr_t lstart)
  • 取消映射入站内存区域

参数

struct rio_mport *mport

主端口

dma_addr_t lstart

要取消映射的内存区域的物理地址

int rio_map_outb_region(struct rio_mport *mport, u16 destid, u64 rbase, u32 size, u32 rflags, dma_addr_t *local)
  • 映射出站内存区域。

参数

struct rio_mport *mport

主端口。

u16 destid

窗口指向的目标 ID

u64 rbase

RIO 基地址窗口转换为

u32 size

内存区域的大小

u32 rflags

映射标志。

dma_addr_t *local

已映射内存区域的物理地址

返回

0 -- 成功。

描述

此函数将创建从 RIO 空间到本地内存的映射。

void rio_unmap_outb_region(struct rio_mport *mport, u16 destid, u64 rstart)
  • 取消映射入站内存区域

参数

struct rio_mport *mport

主端口

u16 destid

映射指向的目标 ID

u64 rstart

RIO 基地址窗口转换为

u32 rio_mport_get_physefb(struct rio_mport *port, int local, u16 destid, u8 hopcount, u32 *rmap)

辅助函数,返回物理层扩展功能块的寄存器偏移量。

参数

struct rio_mport *port

发起事务的主端口

int local

指示本地主端口或远程设备访问

u16 destid

设备的目標 ID

u8 hopcount

到设备的交换机跳数

u32 *rmap

指向存储寄存器映射类型信息的位置的指针

struct rio_dev *rio_get_comptag(u32 comp_tag, struct rio_dev *from)

通过组件标签开始或继续搜索 RIO 设备

参数

u32 comp_tag

要匹配的 RIO 组件标签

struct rio_dev *from

搜索中找到的上一个 RIO 设备,或者新搜索时为 NULL

描述

遍历已知 RIO 设备列表。如果找到匹配 comp_tag 的 RIO 设备,则返回指向其设备结构的指针。否则,返回 NULL。通过将 NULL 传递给 from 参数来启动新搜索。否则,如果 from 不为 NULL,则从全局列表中的下一个设备继续搜索。

int rio_set_port_lockout(struct rio_dev *rdev, u32 pnum, int lock)

设置/清除交换机端口的 LOCKOUT 位 (RIO EM 1.3)。

参数

struct rio_dev *rdev

指向 RIO 设备控制结构的指针

u32 pnum

要设置 LOCKOUT 位的交换机端口号

int lock

操作:设置 (=1) 或 清除 (=0)

int rio_enable_rx_tx_port(struct rio_mport *port, int local, u16 destid, u8 hopcount, u8 port_num)

启用给定端口的输入接收器和输出发送器

参数

struct rio_mport *port

与 RIO 网络关联的主端口

int local

local=1 选择本地端口,否则访问远程设备

u16 destid

要检查主机位的设备的目标 ID

u8 hopcount

到达目标的跳数

u8 port_num

在远端设备上启用的端口(交换机上的编号)

描述

从通用控制命令和状态寄存器 (EXT_PTR+0x3C) 返回 0 或 1

int rio_mport_chk_dev_access(struct rio_mport *mport, u16 destid, u8 hopcount)

验证对指定设备的访问。

参数

struct rio_mport *mport

用于发送事务的主端口

u16 destid

网络中的设备目标 ID

u8 hopcount

网络中的跳数

int rio_inb_pwrite_handler(struct rio_mport *mport, union rio_pw_msg *pw_msg)

入站端口写入消息处理程序

参数

struct rio_mport *mport

与端口写入关联的 mport 设备

union rio_pw_msg *pw_msg

指向入站端口写入消息的指针

描述

处理入站端口写入消息。如果请求已满足,则返回 0。

u32 rio_mport_get_efb(struct rio_mport *port, int local, u16 destid, u8 hopcount, u32 from)

获取指向下一个扩展功能块的指针

参数

struct rio_mport *port

发起事务的主端口

int local

指示本地主端口或远程设备访问

u16 destid

设备的目標 ID

u8 hopcount

到设备的交换机跳数

u32 from

当前扩展功能块头部的偏移量(如果为 0 则从 ExtFeaturePtr 开始)

u32 rio_mport_get_feature(struct rio_mport *port, int local, u16 destid, u8 hopcount, int ftr)

查询设备的扩展功能

参数

struct rio_mport * port

发起事务的主端口

int local

指示本地主端口或远程设备访问

u16 destid

设备的目標 ID

u8 hopcount

到设备的交换机跳数

int ftr

扩展功能代码

描述

判断设备是否支持给定的 RapidIO 功能。返回设备 RIO 配置空间中请求的扩展功能块的偏移量,如果设备不支持则返回 0。

int rio_lock_device(struct rio_mport *port, u16 destid, u8 hopcount, int wait_ms)

为指定设备获取主机设备锁

参数

struct rio_mport *port

用于发送事务的主端口

u16 destid

设备/交换机的目标 ID

u8 hopcount

到达交换机的跳数

int wait_ms

最大等待时间(毫秒)(0 = 无超时)

描述

尝试为指定设备获取主机设备锁。如果设备锁已获取,则返回 0,如果超时,则返回 EINVAL。

int rio_unlock_device(struct rio_mport *port, u16 destid, u8 hopcount)

释放指定设备的主机设备锁

参数

struct rio_mport *port

用于发送事务的主端口

u16 destid

设备/交换机的目标 ID

u8 hopcount

到达交换机的跳数

描述

如果设备锁已释放,则返回 0,如果失败,则返回 EINVAL。

int rio_route_add_entry(struct rio_dev *rdev, u16 table, u16 route_destid, u8 route_port, int lock)

向交换机路由表添加路由条目

参数

struct rio_dev *rdev

RIO 设备

u16 table

路由表 ID

u16 route_destid

要路由的目标 ID

u8 route_port

要路由的端口号

int lock

对交换机设备标志应用硬件锁 (1=锁定, 0=不锁定)

描述

如果可用,调用交换机特定的 add_entry() 方法将路由条目添加到交换机路由表。否则,使用 RapidIO 规范定义的标准 RT 更新方法。如果交换机具有每个端口的路由表,可以使用 table 参数选择特定的路由表,或者通过在 table 中传递 RIO_GLOBAL_TABLE 来使用标准(或全局)表。

成功时返回 0,失败时返回 -EINVAL

int rio_route_get_entry(struct rio_dev *rdev, u16 table, u16 route_destid, u8 *route_port, int lock)

从交换机路由表读取条目

参数

struct rio_dev *rdev

RIO 设备

u16 table

路由表 ID

u16 route_destid

要路由的目标 ID

u8 *route_port

指向读取端口号的指针

int lock

对交换机设备标志应用硬件锁 (1=锁定, 0=不锁定)

描述

如果可用,调用交换机特定的 get_entry() 方法从交换机路由表获取路由条目。否则,使用 RapidIO 规范定义的标准 RT 读取方法。如果交换机具有每个端口的路由表,可以使用 table 参数选择特定的路由表,或者通过在 table 中传递 RIO_GLOBAL_TABLE 来使用标准(或全局)表。

成功时返回 0,失败时返回 -EINVAL

int rio_route_clr_table(struct rio_dev *rdev, u16 table, int lock)

清除交换机路由表

参数

struct rio_dev *rdev

RIO 设备

u16 table

路由表 ID

int lock

对交换机设备标志应用硬件锁 (1=锁定, 0=不锁定)

描述

如果可用,调用交换机特定的 clr_table() 方法清除交换机路由表。否则,使用 RapidIO 规范定义的标准 RT 写入方法。如果交换机具有每个端口的路由表,可以使用 table 参数选择特定的路由表,或者通过在 table 中传递 RIO_GLOBAL_TABLE 来使用标准(或全局)表。

成功时返回 0,失败时返回 -EINVAL

struct dma_chan *rio_request_mport_dma(struct rio_mport *mport)

请求与指定本地 RapidIO mport 设备关联的支持 RapidIO 的 DMA 通道。

参数

struct rio_mport *mport

用于执行 DMA 数据传输的 RIO mport

描述

返回指向已分配 DMA 通道的指针,如果失败则返回 NULL。

void rio_release_dma(struct dma_chan *dchan)

释放指定的 DMA 通道

参数

struct dma_chan *dchan

要释放的 DMA 通道

struct dma_async_tx_descriptor *rio_dma_prep_xfer(struct dma_chan *dchan, u16 destid, struct rio_dma_data *data, enum dma_transfer_direction direction, unsigned long flags)

DMAENGINE定义的device_prep_slave_sg回调的RapidIO特定封装。

参数

struct dma_chan *dchan

要配置的DMA通道

u16 destid

目标RapidIO设备目的ID

struct rio_dma_data *data

RIO特定数据描述符

enum dma_transfer_direction direction

DMA数据传输方向(到设备或来自设备)

unsigned long flags

DMA引擎定义的标志

描述

为指定数据传输初始化支持RapidIO的DMA通道。使用DMA通道私有扩展传递与远程目标RIO设备相关的信息。

返回

如果成功,返回DMA事务描述符的指针;如果失败,返回带有错误值的指针或NULL。

int rio_register_scan(int mport_id, struct rio_scan *scan_ops)

枚举/发现方法注册接口

参数

int mport_id

需要设置互连网扫描例程的mport设备ID(RIO_MPORT_ANY = 为所有可用mport设置)

struct rio_scan *scan_ops

枚举/发现操作结构

描述

向RapidIO子系统注册枚举/发现操作,并将其附加到指定的mport设备(如果指定了RIO_MPORT_ANY,则附加到所有可用mport)。

如果mport已附加枚举器,则返回错误。如果为RIO_MPORT_ANY,则跳过具有有效扫描例程的mport(无错误)。

内部结构

本章包含RapidIO子系统的自动生成文档。

结构体

struct rio_switch

RIO交换机信息

定义:

struct rio_switch {
    struct list_head node;
    u8 *route_table;
    u32 port_ok;
    struct rio_switch_ops *ops;
    spinlock_t lock;
    struct rio_dev *nextdev[];
};

成员

node

全局交换机列表中的节点

route_table

交换机路由表的副本

port_ok

每个端口的状态(每个端口一位)- OK=1 或 UNINIT=0

ops

指向交换机特定操作的指针

lock

用于序列化操作更新的锁

nextdev

每端口指向下一个连接设备的指针数组

struct rio_switch_ops

每交换机操作

定义:

struct rio_switch_ops {
    struct module *owner;
    int (*add_entry) (struct rio_mport *mport, u16 destid, u8 hopcount, u16 table, u16 route_destid, u8 route_port);
    int (*get_entry) (struct rio_mport *mport, u16 destid, u8 hopcount, u16 table, u16 route_destid, u8 *route_port);
    int (*clr_table) (struct rio_mport *mport, u16 destid, u8 hopcount, u16 table);
    int (*set_domain) (struct rio_mport *mport, u16 destid, u8 hopcount, u8 sw_domain);
    int (*get_domain) (struct rio_mport *mport, u16 destid, u8 hopcount, u8 *sw_domain);
    int (*em_init) (struct rio_dev *dev);
    int (*em_handle) (struct rio_dev *dev, u8 swport);
};

成员

owner

此结构的模块所有者

add_entry

交换机特定路由添加函数的回调

get_entry

交换机特定路由获取函数的回调

clr_table

交换机特定清除路由表函数的回调

set_domain

交换机特定域设置函数的回调

get_domain

交换机特定域获取函数的回调

em_init

交换机特定错误管理初始化函数的回调

em_handle

交换机特定错误管理处理函数的回调

描述

定义初始化/控制特定RIO交换机设备所需的操作。

struct rio_dev

RIO设备信息

定义:

struct rio_dev {
    struct list_head global_list;
    struct list_head net_list;
    struct rio_net *net;
    bool do_enum;
    u16 did;
    u16 vid;
    u32 device_rev;
    u16 asm_did;
    u16 asm_vid;
    u16 asm_rev;
    u16 efptr;
    u32 pef;
    u32 swpinfo;
    u32 src_ops;
    u32 dst_ops;
    u32 comp_tag;
    u32 phys_efptr;
    u32 phys_rmap;
    u32 em_efptr;
    u64 dma_mask;
    struct rio_driver *driver;
    struct device dev;
    struct resource riores[RIO_MAX_DEV_RESOURCES];
    int (*pwcback) (struct rio_dev *rdev, union rio_pw_msg *msg, int step);
    u16 destid;
    u8 hopcount;
    struct rio_dev *prev;
    atomic_t state;
    struct rio_switch rswitch[];
};

成员

global_list

所有RIO设备列表中的节点

net_list

网络中RIO设备列表中的节点

net

此设备所属的网络

do_enum

枚举标志

did

设备ID

vid

供应商ID

device_rev

设备修订版

asm_did

汇编设备ID

asm_vid

汇编供应商ID

asm_rev

汇编修订版

efptr

扩展特性指针

pef

处理元素特性

swpinfo

交换机端口信息

src_ops

源操作能力

dst_ops

目的操作能力

comp_tag

RIO组件标签

phys_efptr

RIO设备扩展特性指针

phys_rmap

LP-串行寄存器映射类型(1或2)

em_efptr

RIO错误管理特性指针

dma_mask

此设备实现的RIO地址位掩码

driver

声明此设备的驱动程序

dev

设备模型设备

riores

此设备拥有的RIO资源

pwcback

此设备的端口写入回调函数

destid

网络目的ID(或交换机的关联目的ID)

hopcount

到此设备的跳数

prev

连接到当前设备的上一个RIO设备

state

设备状态

rswitch

struct rio_switch (如果对此设备有效)

struct rio_msg

RIO消息事件

定义:

struct rio_msg {
    struct resource *res;
    void (*mcback) (struct rio_mport * mport, void *dev_id, int mbox, int slot);
};

成员

res

邮箱资源

mcback

消息事件回调

struct rio_dbell

RIO门铃事件

定义:

struct rio_dbell {
    struct list_head node;
    struct resource *res;
    void (*dinb) (struct rio_mport *mport, void *dev_id, u16 src, u16 dst, u16 info);
    void *dev_id;
};

成员

node

门铃事件列表中的节点

res

门铃资源

dinb

门铃事件回调

dev_id

事件发生时传递的设备特定指针

struct rio_mport

RIO主端口信息

定义:

struct rio_mport {
    struct list_head dbells;
    struct list_head pwrites;
    struct list_head node;
    struct list_head nnode;
    struct rio_net *net;
    struct mutex lock;
    struct resource iores;
    struct resource riores[RIO_MAX_MPORT_RESOURCES];
    struct rio_msg inb_msg[RIO_MAX_MBOX];
    struct rio_msg outb_msg[RIO_MAX_MBOX];
    int host_deviceid;
    struct rio_ops *ops;
    unsigned char id;
    unsigned char index;
    unsigned int sys_size;
    u32 phys_efptr;
    u32 phys_rmap;
    unsigned char name[RIO_MAX_MPORT_NAME];
    struct device dev;
    void *priv;
#ifdef CONFIG_RAPIDIO_DMA_ENGINE;
    struct dma_device       dma;
#endif;
    struct rio_scan *nscan;
    atomic_t state;
    unsigned int pwe_refcnt;
};

成员

dbells

门铃事件列表

pwrites

端口写入事件列表

node

全局主端口列表中的节点

nnode

网络主端口列表中的节点

net

此mport连接的RIO网络

lock

用于同步列表操作的锁

iores

此主端口接口拥有的I/O内存资源

riores

此主端口接口拥有的RIO资源

inb_msg

RIO入站消息事件描述符

outb_msg

RIO出站消息事件描述符

host_deviceid

与此主端口关联的主机设备ID

ops

配置空间函数

id

端口ID,在所有端口中是唯一的

index

端口索引,在所有同类型端口接口中是唯一的

sys_size

RapidIO通用传输系统大小

phys_efptr

RIO端口扩展特性指针

phys_rmap

LP-串行EFB寄存器映射类型(1或2)。

name

端口名称字符串

dev

与mport关联的设备结构

priv

主端口私有数据

dma

与mport关联的DMA设备

nscan

RapidIO网络枚举/发现操作

state

mport设备状态

pwe_refcnt

端口写入使能引用计数器,用于跟踪使能/禁用请求

struct rio_net

RIO网络信息

定义:

struct rio_net {
    struct list_head node;
    struct list_head devices;
    struct list_head switches;
    struct list_head mports;
    struct rio_mport *hport;
    unsigned char id;
    struct device dev;
    void *enum_data;
    void (*release)(struct rio_net *net);
};

成员

node

全局RIO网络列表中的节点

devices

此网络中的设备列表

switches

此网络中的交换机列表

mports

访问此网络的主端口列表

hport

访问此网络的默认端口

id

RIO网络ID

dev

设备对象

enum_data

特定于网络枚举器的私有数据

release

枚举器特定释放回调

struct rio_mport_attr

RIO mport设备属性

定义:

struct rio_mport_attr {
    int flags;
    int link_speed;
    int link_width;
    int dma_max_sge;
    int dma_max_size;
    int dma_align;
};

成员

flags

mport设备能力标志

link_speed

SRIO链路速度值(由RapidIO规范定义)

link_width

SRIO链路宽度值(由RapidIO规范定义)

dma_max_sge

DMA通道可处理的SG列表条目数量

dma_max_size

单次DMA传输(SG条目)中的最大字节数

dma_align

DMA操作的对齐偏移(与其他DMA操作相同)

struct rio_ops

低级RIO配置空间操作

定义:

struct rio_ops {
    int (*lcread) (struct rio_mport *mport, int index, u32 offset, int len, u32 *data);
    int (*lcwrite) (struct rio_mport *mport, int index, u32 offset, int len, u32 data);
    int (*cread) (struct rio_mport *mport, int index, u16 destid, u8 hopcount, u32 offset, int len, u32 *data);
    int (*cwrite) (struct rio_mport *mport, int index, u16 destid, u8 hopcount, u32 offset, int len, u32 data);
    int (*dsend) (struct rio_mport *mport, int index, u16 destid, u16 data);
    int (*pwenable) (struct rio_mport *mport, int enable);
    int (*open_outb_mbox)(struct rio_mport *mport, void *dev_id, int mbox, int entries);
    void (*close_outb_mbox)(struct rio_mport *mport, int mbox);
    int (*open_inb_mbox)(struct rio_mport *mport, void *dev_id, int mbox, int entries);
    void (*close_inb_mbox)(struct rio_mport *mport, int mbox);
    int (*add_outb_message)(struct rio_mport *mport, struct rio_dev *rdev, int mbox, void *buffer, size_t len);
    int (*add_inb_buffer)(struct rio_mport *mport, int mbox, void *buf);
    void *(*get_inb_message)(struct rio_mport *mport, int mbox);
    int (*map_inb)(struct rio_mport *mport, dma_addr_t lstart, u64 rstart, u64 size, u32 flags);
    void (*unmap_inb)(struct rio_mport *mport, dma_addr_t lstart);
    int (*query_mport)(struct rio_mport *mport, struct rio_mport_attr *attr);
    int (*map_outb)(struct rio_mport *mport, u16 destid, u64 rstart, u32 size, u32 flags, dma_addr_t *laddr);
    void (*unmap_outb)(struct rio_mport *mport, u16 destid, u64 rstart);
};

成员

lcread

执行本地(主端口)配置空间读取的回调。

lcwrite

执行本地(主端口)配置空间写入的回调。

cread

执行网络配置空间读取的回调。

cwrite

执行网络配置空间写入的回调。

dsend

发送门铃消息的回调。

pwenable

启用/禁用端口写入消息处理的回调。

open_outb_mbox

初始化出站邮箱的回调。

close_outb_mbox

关闭出站邮箱的回调。

open_inb_mbox

初始化入站邮箱的回调。

close_inb_mbox

关闭入站邮箱的回调。

add_outb_message

将消息添加到出站邮箱队列的回调。

add_inb_buffer

将缓冲区添加入站邮箱队列的回调。

get_inb_message

从入站邮箱队列获取消息的回调。

map_inb

将RapidIO地址区域映射到本地内存空间的回调。

unmap_inb

解除与map_inb()映射的RapidIO地址区域的回调。

query_mport

查询mport设备属性的回调。

map_outb

将出站地址区域映射到本地内存空间的回调。

unmap_outb

解除出站RapidIO地址区域映射的回调。

struct rio_driver

RIO驱动信息

定义:

struct rio_driver {
    struct list_head node;
    char *name;
    const struct rio_device_id *id_table;
    int (*probe) (struct rio_dev * dev, const struct rio_device_id * id);
    void (*remove) (struct rio_dev * dev);
    void (*shutdown)(struct rio_dev *dev);
    int (*suspend) (struct rio_dev * dev, u32 state);
    int (*resume) (struct rio_dev * dev);
    int (*enable_wake) (struct rio_dev * dev, u32 state, int enable);
    struct device_driver driver;
};

成员

node

驱动列表中的节点

name

RIO驱动名称

id_table

与此驱动关联的RIO设备ID

probe

RIO设备已插入

remove

RIO设备已移除

shutdown

关机通知回调

suspend

RIO设备已挂起

resume

RIO设备已唤醒

enable_wake

RIO设备唤醒事件使能

driver

LDM驱动结构

描述

提供RIO设备驱动的插入/移除和电源管理信息。

struct rio_scan

RIO枚举和发现操作

定义:

struct rio_scan {
    struct module *owner;
    int (*enumerate)(struct rio_mport *mport, u32 flags);
    int (*discover)(struct rio_mport *mport, u32 flags);
};

成员

owner

此结构的模块所有者

enumerate

执行RapidIO互连网枚举的回调。

discover

执行RapidIO互连网发现的回调。

struct rio_scan_node

注册RapidIO枚举和发现方法到RapidIO核心的列表节点。

定义:

struct rio_scan_node {
    int mport_id;
    struct list_head node;
    struct rio_scan *ops;
};

成员

mport_id

由此枚举器服务的mport(网络)ID

node

已注册枚举器全局列表中的节点

ops

RIO枚举和发现操作

枚举与发现

u16 rio_destid_alloc(struct rio_net *net)

为给定网络分配下一个可用的目的ID

参数

struct rio_net *net

RIO网络

描述

返回指定RIO网络的下一个可用设备目的ID。将已分配的ID标记为正在使用。如果新的目的ID不可用,则返回RIO_INVALID_DESTID。

int rio_destid_reserve(struct rio_net *net, u16 destid)

保留指定的目的ID

参数

struct rio_net *net

RIO网络

u16 destid

要保留的目的ID

描述

尝试保留指定的目的ID。如果成功,返回0。

void rio_destid_free(struct rio_net *net, u16 destid)

释放先前分配的目的ID

参数

struct rio_net *net

RIO网络

u16 destid

要释放的目的ID

描述

使指定的目的ID可用。

u16 rio_destid_first(struct rio_net *net)

返回第一个正在使用的目的ID

参数

struct rio_net *net

RIO网络

u16 rio_destid_next(struct rio_net *net, u16 from)

返回下一个正在使用的目的ID

参数

struct rio_net *net

RIO网络

u16 from

搜索将继续的目的ID

u16 rio_get_device_id(struct rio_mport *port, u16 destid, u8 hopcount)

获取设备的基/扩展设备ID

参数

struct rio_mport *port

RIO 主端口

u16 destid

设备的目的ID

u8 hopcount

到设备的跳数

描述

从设备读取基/扩展设备ID。返回8/16位设备ID。

void rio_set_device_id(struct rio_mport *port, u16 destid, u8 hopcount, u16 did)

设置设备的基/扩展设备ID

参数

struct rio_mport *port

RIO 主端口

u16 destid

设备的目的ID

u8 hopcount

到设备的跳数

u16 did

要写入的设备 ID 值

描述

从设备写入基础/扩展设备 ID。

int rio_clear_locks(struct rio_net *net)

释放所有主机锁并发出枚举完成信号

参数

struct rio_net *net

要运行的RIO网络

描述

在每个设备的组件标签CSR上标记枚举完成标志。完成后,它释放每个设备上的主机锁。成功返回0,失败返回-EINVAL

int rio_enum_host(struct rio_mport *port)

设置主机锁并初始化主机目的ID

参数

struct rio_mport *port

发起事务的主端口

描述

使用主机设备ID值设置本地主机主端口锁和目的ID寄存器。主机设备ID值由平台提供。成功返回0,失败返回-1

int rio_device_has_destid(struct rio_mport *port, int src_ops, int dst_ops)

测试设备是否包含目的ID寄存器

参数

struct rio_mport *port

发起事务的主端口

int src_ops

RIO设备源操作

int dst_ops

RIO设备目的操作

描述

检查提供的**src_ops**和**dst_ops**以获取必要的事务能力,这些能力指示设备是否将实现目的ID寄存器。如果为真返回1,否则返回0。

void rio_release_dev(struct device *dev)

释放RIO设备结构体

参数

struct device *dev

与RIO设备结构体关联的LDM设备

描述

获取与RIO设备结构体关联的RIO设备 struct associated。RIO设备 struct is 被释放。

int rio_is_switch(struct rio_dev *rdev)

测试RIO设备是否具有交换机能力

参数

struct rio_dev *rdev

RIO 设备

描述

获取RIO设备处理元素特性寄存器内容并测试其交换机能力。如果设备是交换机,则返回1;如果不是交换机,则返回0。RIO设备 struct is 被释放。

struct rio_dev *rio_setup_device(struct rio_net *net, struct rio_mport *port, u16 destid, u8 hopcount, int do_enum)

分配并设置一个RIO设备

参数

struct rio_net *net

RIO网络

struct rio_mport *port

用于发送事务的主端口

u16 destid

当前目的ID

u8 hopcount

当前跳数

int do_enum

枚举/发现模式标志

描述

分配一个RIO设备并根据配置空间内容配置字段。如果设备有目的ID寄存器,则在枚举模式下分配一个目的ID,或在发现模式下从配置空间读取。如果设备具有交换机能力,则分配并适当配置一个交换机。成功返回指向RIO设备的指针,失败返回NULL。

int rio_sport_is_active(struct rio_dev *rdev, int sp)

测试交换机端口是否具有活动连接。

参数

struct rio_dev *rdev

RapidIO设备对象

int sp

交换机端口号

描述

读取特定交换机端口的端口错误状态CSR,以确定该端口是否具有活动链路。如果端口处于活动状态,则返回RIO_PORT_N_ERR_STS_PORT_OK;如果处于非活动状态,则返回0

u16 rio_get_host_deviceid_lock(struct rio_mport *port, u8 hopcount)

读取设备上的主机设备ID锁CSR

参数

struct rio_mport *port

用于发送事务的主端口

u8 hopcount

到设备的跳数

描述

在枚举期间用于读取RIO设备上的主机设备ID锁CSR。返回锁寄存器的值。

int rio_enum_peer(struct rio_net *net, struct rio_mport *port, u8 hopcount, struct rio_dev *prev, int prev_port)

通过主端口递归枚举RIO网络

参数

struct rio_net *net

正在枚举的RIO网络

struct rio_mport *port

用于发送事务的主端口

u8 hopcount

网络中的跳数

struct rio_dev *prev

连接到被枚举设备的上一个RIO设备

int prev_port

上一个RIO设备上的端口

描述

递归枚举RIO网络。事务通过**port**中传递的主端口发送。

int rio_enum_complete(struct rio_mport *port)

测试网络枚举是否完成

参数

struct rio_mport *port

用于发送事务的主端口

描述

测试PGCCSR发现位是否为非零值(枚举完成标志)。如果枚举完成返回1,如果枚举未完成返回0

int rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid, u8 hopcount, struct rio_dev *prev, int prev_port)

通过主端口递归发现RIO网络

参数

struct rio_net *net

正在发现的RIO网络

struct rio_mport *port

用于发送事务的主端口

u16 destid

网络中当前目的ID

u8 hopcount

网络中的跳数

struct rio_dev *prev

上一个rio_dev

int prev_port

上一个端口号

描述

递归发现RIO网络。事务通过**port**中传递的主端口发送。

int rio_mport_is_active(struct rio_mport *port)

测试主端口链路是否活动

参数

struct rio_mport *port

要测试的主端口

描述

读取主端口的端口错误状态CSR,以确定该端口是否具有活动链路。如果主端口处于活动状态,则返回RIO_PORT_N_ERR_STS_PORT_OK;如果处于非活动状态,则返回0

void rio_update_route_tables(struct rio_net *net)

更新交换机中的路由表

参数

struct rio_net *net

要在其上运行更新的RIO网络

描述

对于每个枚举的设备,确保系统中的每个交换机都有正确的路由条目。为在第一次通过交换机的枚举过程中未知的设备添加路由。

void rio_init_em(struct rio_dev *rdev)

初始化RIO错误管理(用于交换机)

参数

struct rio_dev *rdev

RIO 设备

描述

对于每个枚举的交换机,调用设备特定的错误管理初始化例程(如果由交换机驱动提供)。

int rio_enum_mport(struct rio_mport *mport, u32 flags)

通过主端口开始枚举

参数

struct rio_mport *mport

用于发送事务的主端口

u32 flags

枚举控制标志

描述

开始枚举过程。如果有人枚举了我们的主端口设备,则放弃。如果未被枚举且我们有活动链路,则开始递归对等枚举。如果枚举成功返回0,如果枚举失败返回-EBUSY

void rio_build_route_tables(struct rio_net *net)

从交换机路由条目生成路由表

参数

struct rio_net *net

要在其上运行路由表扫描的RIO网络

描述

对于每个交换机设备,通过复制交换机中的现有路由条目来生成路由表。

int rio_disc_mport(struct rio_mport *mport, u32 flags)

通过主端口开始发现

参数

struct rio_mport *mport

用于发送事务的主端口

u32 flags

发现控制标志

描述

开始发现过程。如果我们有活动链路,则等待枚举完成信号(如果允许等待)。当枚举完成信号发出时,开始递归对等发现。如果发现成功返回0,失败返回-EBUSY

int rio_basic_attach(void)

参数

void

无参数

描述

当此枚举/发现方法作为模块加载时,此函数为所有可用的RapidIO mport设备注册其特定的枚举和发现例程。“scan”命令行参数控制模块自动启动RapidIO枚举/发现的能力。

成功返回0,如果无法注册自身则返回-EIO。

此枚举/发现方法无法卸载,因此不提供匹配的cleanup_module例程。

驱动功能

int rio_setup_inb_dbell(struct rio_mport *mport, void *dev_id, struct resource *res, void (*dinb)(struct rio_mport *mport, void *dev_id,u16 src, u16 dst, u16 info))

绑定入站门铃回调

参数

struct rio_mport *mport

要绑定门铃回调的RIO主端口

void *dev_id

事件发生时传递的设备特定指针

struct resource *res

门铃消息资源

void (*dinb) (struct rio_mport * mport, void *dev_id, u16 src, u16 dst, u16 info)

接收到门铃时执行的回调函数

描述

将门铃资源/回调对添加到端口的门铃事件列表。如果请求已满足,则返回0。

int rio_chk_dev_route(struct rio_dev *rdev, struct rio_dev **nrdev, int *npnum)

验证到指定设备的路由。

参数

struct rio_dev *rdev

RIO设备未能响应

struct rio_dev **nrdev

到rdev路由上的最后一个活动设备

int *npnum

到rdev路由上nrdev的端口号

描述

沿着到指定RIO设备的路由,确定路由上最后一个可用设备(以及相应的RIO端口)。

int rio_chk_dev_access(struct rio_dev *rdev)

验证对指定设备的访问。

参数

struct rio_dev *rdev

指向 RIO 设备控制结构的指针

int rio_get_input_status(struct rio_dev *rdev, int pnum, u32 *lnkresp)

发送链路请求/输入状态控制符号并返回链路响应(如果请求)。

参数

struct rio_dev *rdev

发出输入状态命令的RIO设备

int pnum

发出命令的设备端口号

u32 *lnkresp

来自链路伙伴的响应

int rio_clr_err_stopped(struct rio_dev *rdev, u32 pnum, u32 err_status)

清除端口错误停止状态。

参数

struct rio_dev *rdev

指向 RIO 设备控制结构的指针

u32 pnum

要清除错误的交换机端口号

u32 err_status

端口错误状态(如果为0则从设备读取寄存器)

描述

待办:当前此例程与idt_gen3 RapidIO交换机设备指定的恢复过程不兼容。需要审查以实现与所有可用设备兼容的通用恢复过程。IDT gen3交换机驱动程序现在实现了特定于硬件的错误处理程序,该处理程序向端口发出软端口重置以重置ERR_STOP位和ackIDs。

int rio_std_route_add_entry(struct rio_mport *mport, u16 destid, u8 hopcount, u16 table, u16 route_destid, u8 route_port)

使用RIO规范修订版1.3中定义的标准寄存器添加交换机路由表条目

参数

struct rio_mport *mport

发起事务的主端口

u16 destid

设备的目標 ID

u8 hopcount

到设备的交换机跳数

u16 table

路由表ID(全局或端口特定)

u16 route_destid

路由表中的目的ID条目

u8 route_port

指定目的ID的目的端口

int rio_std_route_get_entry(struct rio_mport *mport, u16 destid, u8 hopcount, u16 table, u16 route_destid, u8 *route_port)

使用RIO规范修订版1.3中定义的标准寄存器读取与指定目的ID关联的交换机路由表条目(端口号)

参数

struct rio_mport *mport

发起事务的主端口

u16 destid

设备的目標 ID

u8 hopcount

到设备的交换机跳数

u16 table

路由表ID(全局或端口特定)

u16 route_destid

路由表中的目的ID条目

u8 *route_port

指定目的ID的返回目的端口

int rio_std_route_clr_table(struct rio_mport *mport, u16 destid, u8 hopcount, u16 table)

使用RIO规范修订版1.3中定义的标准寄存器清除交换机路由表。

参数

struct rio_mport *mport

发起事务的主端口

u16 destid

设备的目標 ID

u8 hopcount

到设备的交换机跳数

u16 table

路由表ID(全局或端口特定)

int rio_mport_scan(int mport_id)

在指定的mport上执行枚举/发现

参数

int mport_id

mport设备的编号(ID)

RIO_LOP_READ

RIO_LOP_READ (size, type, len)

生成rio_local_read_config_*函数

参数

size

配置空间读取大小(8、16、32位)

type

值参数的C类型

len

配置空间读取长度(1、2、4字节)

描述

生成用于访问本地设备上配置空间寄存器的rio_local_read_config_*函数。

RIO_LOP_WRITE

RIO_LOP_WRITE (size, type, len)

生成rio_local_write_config_*函数

参数

size

配置空间写入大小(8、16、32位)

type

值参数的C类型

len

配置空间写入长度(1、2、4字节)

描述

生成用于访问本地设备上配置空间寄存器的rio_local_write_config_*函数。

RIO_OP_READ

RIO_OP_READ (size, type, len)

生成rio_mport_read_config_*函数

参数

size

配置空间读取大小(8、16、32位)

type

值参数的C类型

len

配置空间读取长度(1、2、4字节)

描述

生成用于访问本地设备上配置空间寄存器的rio_mport_read_config_*函数。

RIO_OP_WRITE

RIO_OP_WRITE (size, type, len)

生成rio_mport_write_config_*函数

参数

size

配置空间写入大小(8、16、32位)

type

值参数的C类型

len

配置空间写入长度(1、2、4字节)

描述

生成用于访问本地设备上配置空间寄存器的rio_mport_write_config_*函数。

设备模型支持

const struct rio_device_id *rio_match_device(const struct rio_device_id *id, const struct rio_dev *rdev)

判断RIO设备是否具有匹配的RIO设备ID结构

参数

const struct rio_device_id *id

要匹配的RIO设备ID结构

const struct rio_dev *rdev

要匹配的RIO设备结构

描述

用于驱动探测和总线匹配,以检查RIO设备是否与RIO驱动提供的设备ID结构匹配。返回匹配的struct rio_device_id,如果没有匹配则返回NULL

int rio_device_probe(struct device *dev)

判断RIO设备结构是否具有匹配的RIO设备ID结构

参数

struct device *dev

要匹配的RIO设备结构

描述

当驱动声明rio_dev时返回0并设置rio_dev->driver,否则返回错误

void rio_device_remove(struct device *dev)

从系统中移除RIO设备

参数

struct device *dev

要匹配的RIO设备结构

描述

从系统中移除一个RIO设备。如果它有关联的驱动程序,则运行驱动程序的remove()方法。然后更新引用计数。

int rio_match_bus(struct device *dev, const struct device_driver *drv)

判断RIO设备结构是否具有匹配的RIO驱动设备ID结构

参数

struct device *dev

要匹配的标准设备结构

const struct device_driver *drv

包含要匹配ID的标准驱动结构

描述

驱动程序用于检查系统中存在的RIO设备是否在其支持设备列表中。如果存在匹配的struct rio_device_id则返回1,否则返回0。

int rio_bus_init(void)

向设备模型注册RapidIO总线

参数

void

无参数

描述

向Linux设备模型注册RIO mport设备类和RIO总线类型。

PPC32支持

int fsl_local_config_read(struct rio_mport *mport, int index, u32 offset, int len, u32 *data)

生成MPC85xx本地配置空间读取

参数

struct rio_mport *mport

RapidIO主端口信息

int index

RapidIO接口ID

u32 offset

配置空间偏移量

int len

维护事务的长度(字节)

u32 *data

要读取的值

描述

生成MPC85xx本地配置空间读取。成功返回0,失败返回-EINVAL

int fsl_local_config_write(struct rio_mport *mport, int index, u32 offset, int len, u32 data)

生成MPC85xx本地配置空间写入

参数

struct rio_mport *mport

RapidIO主端口信息

int index

RapidIO接口ID

u32 offset

配置空间偏移量

int len

维护事务的长度(字节)

u32 data

要写入的值

描述

生成MPC85xx本地配置空间写入。成功返回0,失败返回-EINVAL

int fsl_rio_config_read(struct rio_mport *mport, int index, u16 destid, u8 hopcount, u32 offset, int len, u32 *val)

生成MPC85xx读取维护事务

参数

struct rio_mport *mport

RapidIO主端口信息

int index

RapidIO接口ID

u16 destid

事务的目的ID

u8 hopcount

到目标设备的跳数

u32 offset

配置空间偏移量

int len

维护事务的长度(字节)

u32 *val

要读取的位置

描述

生成MPC85xx读取维护事务。成功返回0,失败返回-EINVAL

int fsl_rio_config_write(struct rio_mport *mport, int index, u16 destid, u8 hopcount, u32 offset, int len, u32 val)

生成MPC85xx写入维护事务

参数

struct rio_mport *mport

RapidIO主端口信息

int index

RapidIO接口ID

u16 destid

事务的目的ID

u8 hopcount

到目标设备的跳数

u32 offset

配置空间偏移量

int len

维护事务的长度(字节)

u32 val

要写入的值

描述

生成一个 MPC85xx 写维护事务。成功时返回 0,失败时返回 -EINVAL

int fsl_rio_setup(struct platform_device *dev)

设置飞思卡尔 PowerPC RapidIO 接口

参数

struct platform_device *dev

platform_device 指针

描述

初始化 MPC85xx RapidIO 硬件接口,使用系统特定信息配置主端口,并将主端口注册到 RapidIO 子系统。

致谢

以下人员直接或间接地为 RapidIO 子系统做出了贡献

  1. Matt Portermporter@kernel.crashing.org

  2. Randy Vinsonrvinson@mvista.com

  3. Dan Malekdan@embeddedalley.com

以下人员对本文档做出了贡献

  1. Matt Portermporter@kernel.crashing.org