RapidIO 子系统指南¶
- 作者:
Matt Porter
简介¶
RapidIO 是一种高速交换结构互连,其特性面向嵌入式市场。RapidIO 为交换结构网络上的内存映射 I/O 以及基于消息的事务提供支持。RapidIO 具有标准化的发现机制,与 PCI 总线标准类似,可以简单地检测网络中的设备。
本文档旨在为计划在新架构上支持 RapidIO、编写新驱动程序或理解子系统内部结构的开发人员提供。
已知错误和限制¶
问题¶
无。 ;)
限制¶
不支持 RapidIO 内存区域的访问/管理
不支持多主机枚举
RapidIO 驱动程序接口¶
驱动程序被提供一组调用,以便与子系统接口,以收集设备信息、请求/映射内存区域资源以及管理邮箱/门铃。
函数¶
参数
struct rio_mport *port主端口
u32 offset本地配置空间中的偏移量
u32 * data用于读取数据到的指针
描述
从本地设备的配置空间中指定偏移量读取 32 位数据。
参数
struct rio_mport *port主端口
u32 offset本地配置空间中的偏移量
u32 data要写入的数据
描述
将 32 位数据写入本地设备的配置空间中指定偏移量。
参数
struct rio_mport *port主端口
u32 offset本地配置空间中的偏移量
u16 * data用于读取数据到的指针
描述
从本地设备的配置空间中指定偏移量读取 16 位数据。
参数
struct rio_mport *port主端口
u32 offset本地配置空间中的偏移量
u16 data要写入的数据
描述
将 16 位数据写入本地设备的配置空间中指定偏移量。
参数
struct rio_mport *port主端口
u32 offset本地配置空间中的偏移量
u8 * data用于读取数据到的指针
描述
从本地设备的配置空间中指定偏移量读取 8 位数据。
参数
struct rio_mport *port主端口
u32 offset本地配置空间中的偏移量
u8 data要写入的数据
描述
将 8 位数据写入本地设备的配置空间中指定偏移量。
参数
struct rio_dev *rdevRIO 设备
u32 offset设备配置空间中的偏移量
u32 * data用于读取数据到的指针
描述
从 RIO 设备的配置空间中指定偏移量读取 32 位数据。
参数
struct rio_dev *rdevRIO 设备
u32 offset设备配置空间中的偏移量
u32 data要写入的数据
描述
将 32 位数据写入 RIO 设备的配置空间中指定偏移量。
参数
struct rio_dev *rdevRIO 设备
u32 offset设备配置空间中的偏移量
u16 * data用于读取数据到的指针
描述
从 RIO 设备的配置空间中指定偏移量读取 16 位数据。
参数
struct rio_dev *rdevRIO 设备
u32 offset设备配置空间中的偏移量
u16 data要写入的数据
描述
将 16 位数据写入 RIO 设备的配置空间中指定偏移量。
参数
struct rio_dev *rdevRIO 设备
u32 offset设备配置空间中的偏移量
u8 * data用于读取数据到的指针
描述
从 RIO 设备的配置空间中指定偏移量读取 8 位数据。
参数
struct rio_dev *rdevRIO 设备
u32 offset设备配置空间中的偏移量
u8 data要写入的数据
描述
将 8 位数据写入 RIO 设备的配置空间中指定偏移量。
参数
struct rio_dev *rdevRIO 设备
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 设备的宏
参数
dev16 位 RIO 设备 ID
ven16 位 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。
参数
struct rio_mport *mport包含入站邮箱的主端口
int mbox入站邮箱号
void *buffer消息缓冲区指针
描述
将缓冲区添加到入站邮箱队列以接收数据。成功时返回 0。
参数
struct rio_mport *mport包含入站邮箱的主端口
int mbox入站邮箱号
描述
从入站邮箱队列获取 RIO 消息。成功时返回 0。
参数
struct rio_dev *rdevRIO 设备
描述
获取唯一的 RIO 设备标识符。返回设备标识符字符串。
参数
struct rio_dev *rdevRIO 设备
描述
获取 RIO 驱动程序特定数据。返回指向驱动程序特定数据的指针。
参数
struct rio_dev *rdevRIO 设备
void *data指向驱动程序特定数据的指针
描述
设置 RIO 驱动程序特定数据。设备 struct driver 数据指针被设置为 data 参数。
参数
struct rio_dev *rdev被引用的 RIO 设备
描述
每个对设备的活动引用都应当进行引用计数。
RIO 设备的驱动程序通常应在它们绑定设备时,在其 probe() 方法中记录此类引用,并在其 disconnect() 方法中通过调用 rio_dev_put() 来释放它们。
参数
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()函数来使其有机会进行清理,并将这些设备标记为无驱动程序。
参数
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_attrmport 属性数据结构
描述
通过指向属性数据结构的指针返回指定 mport 的属性。
参数
struct rio_mport *mport与 RIO 网络关联的主端口
描述
分配一个 RIO 网络结构,初始化每个网络的列表头,并将关联的主端口添加到关联主端口的网络列表中。成功时返回 RIO 网络指针,失败时返回 NULL。
参数
struct rio_mport *portRIO 主端口
u16 did要写入的设备 ID 值
描述
从设备写入基础/扩展设备 ID。
参数
struct rio_dev *rdevRIO 设备
描述
将 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。
参数
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。
参数
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。
参数
struct rio_mport *mport从中释放门铃资源的 RIO 主端口
u16 start门铃信息范围起始
u16 end门铃信息范围结束
描述
释放入站门铃资源的所有权,并从门铃事件列表中移除回调函数。如果请求已满足,则返回 0。
参数
struct rio_dev *rdev从中分配门铃资源的 RIO 设备
u16 start门铃消息范围起始
u16 end门铃消息范围结束
描述
请求门铃消息范围的所有权。如果请求已满足,则返回一个资源,否则失败时返回 NULL。
参数
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。
参数
struct rio_dev *rdev已注册入站端口写入回调的 RIO 设备
描述
从 rio_dev 结构中移除回调函数。如果请求已满足,则返回 0。
参数
struct rio_mport *mport与端口写入处理相关联的主端口
int enable1=启用, 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 空间到本地内存的映射。
参数
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 rbaseRIO 基地址窗口转换为
u32 size内存区域的大小
u32 rflags映射标志。
dma_addr_t *local已映射内存区域的物理地址
返回
0 -- 成功。
描述
此函数将创建从 RIO 空间到本地内存的映射。
参数
struct rio_mport *mport主端口
u16 destid映射指向的目标 ID
u64 rstartRIO 基地址窗口转换为
-
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指向存储寄存器映射类型信息的位置的指针
参数
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 locallocal=1 选择本地端口,否则访问远程设备
u16 destid要检查主机位的设备的目标 ID
u8 hopcount到达目标的跳数
u8 port_num在远端设备上启用的端口(交换机上的编号)
描述
从通用控制命令和状态寄存器 (EXT_PTR+0x3C) 返回 0 或 1
参数
struct rio_mport *mport用于发送事务的主端口
u16 destid网络中的设备目标 ID
u8 hopcount网络中的跳数
参数
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。
参数
struct rio_mport *port用于发送事务的主端口
u16 destid设备/交换机的目标 ID
u8 hopcount到达交换机的跳数
int wait_ms最大等待时间(毫秒)(0 = 无超时)
描述
尝试为指定设备获取主机设备锁。如果设备锁已获取,则返回 0,如果超时,则返回 EINVAL。
参数
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 *rdevRIO 设备
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 *rdevRIO 设备
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。
参数
struct rio_dev *rdevRIO 设备
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 *dataRIO特定数据描述符
enum dma_transfer_direction directionDMA数据传输方向(到设备或来自设备)
unsigned long flagsDMA引擎定义的标志
描述
为指定数据传输初始化支持RapidIO的DMA通道。使用DMA通道私有扩展传递与远程目标RIO设备相关的信息。
返回
如果成功,返回DMA事务描述符的指针;如果失败,返回带有错误值的指针或NULL。
参数
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_tagRIO组件标签
phys_efptrRIO设备扩展特性指针
phys_rmapLP-串行寄存器映射类型(1或2)
em_efptrRIO错误管理特性指针
dma_mask此设备实现的RIO地址位掩码
driver声明此设备的驱动程序
dev设备模型设备
riores此设备拥有的RIO资源
pwcback此设备的端口写入回调函数
destid网络目的ID(或交换机的关联目的ID)
hopcount到此设备的跳数
prev连接到当前设备的上一个RIO设备
state设备状态
rswitchstruct 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_msgRIO入站消息事件描述符
outb_msgRIO出站消息事件描述符
host_deviceid与此主端口关联的主机设备ID
ops配置空间函数
id端口ID,在所有端口中是唯一的
index端口索引,在所有同类型端口接口中是唯一的
sys_sizeRapidIO通用传输系统大小
phys_efptrRIO端口扩展特性指针
phys_rmapLP-串行EFB寄存器映射类型(1或2)。
name端口名称字符串
dev与mport关联的设备结构
priv主端口私有数据
dma与mport关联的DMA设备
nscanRapidIO网络枚举/发现操作
statemport设备状态
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访问此网络的默认端口
idRIO网络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;
};
成员
flagsmport设备能力标志
link_speedSRIO链路速度值(由RapidIO规范定义)
link_widthSRIO链路宽度值(由RapidIO规范定义)
dma_max_sgeDMA通道可处理的SG列表条目数量
dma_max_size单次DMA传输(SG条目)中的最大字节数
dma_alignDMA操作的对齐偏移(与其他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驱动列表中的节点
nameRIO驱动名称
id_table与此驱动关联的RIO设备ID
probeRIO设备已插入
removeRIO设备已移除
shutdown关机通知回调
suspendRIO设备已挂起
resumeRIO设备已唤醒
enable_wakeRIO设备唤醒事件使能
driverLDM驱动结构
描述
提供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已注册枚举器全局列表中的节点
opsRIO枚举和发现操作
枚举与发现¶
参数
struct rio_net *netRIO网络
描述
返回指定RIO网络的下一个可用设备目的ID。将已分配的ID标记为正在使用。如果新的目的ID不可用,则返回RIO_INVALID_DESTID。
参数
struct rio_net *netRIO网络
u16 destid要保留的目的ID
描述
尝试保留指定的目的ID。如果成功,返回0。
参数
struct rio_net *netRIO网络
u16 destid要释放的目的ID
描述
使指定的目的ID可用。
参数
struct rio_net *netRIO网络
参数
struct rio_net *netRIO网络
u16 from搜索将继续的目的ID
参数
struct rio_mport *portRIO 主端口
u16 destid设备的目的ID
u8 hopcount到设备的跳数
描述
从设备读取基/扩展设备ID。返回8/16位设备ID。
参数
struct rio_mport *portRIO 主端口
u16 destid设备的目的ID
u8 hopcount到设备的跳数
u16 did要写入的设备 ID 值
描述
从设备写入基础/扩展设备 ID。
参数
struct rio_net *net要运行的RIO网络
描述
在每个设备的组件标签CSR上标记枚举完成标志。完成后,它释放每个设备上的主机锁。成功返回0,失败返回-EINVAL。
参数
struct rio_mport *port发起事务的主端口
描述
使用主机设备ID值设置本地主机主端口锁和目的ID寄存器。主机设备ID值由平台提供。成功返回0,失败返回-1。
参数
struct rio_mport *port发起事务的主端口
int src_opsRIO设备源操作
int dst_opsRIO设备目的操作
描述
检查提供的**src_ops**和**dst_ops**以获取必要的事务能力,这些能力指示设备是否将实现目的ID寄存器。如果为真返回1,否则返回0。
参数
struct device *dev与RIO设备结构体关联的LDM设备
描述
获取与RIO设备结构体关联的RIO设备 struct associated。RIO设备 struct is 被释放。
参数
struct rio_dev *rdevRIO 设备
描述
获取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 *netRIO网络
struct rio_mport *port用于发送事务的主端口
u16 destid当前目的ID
u8 hopcount当前跳数
int do_enum枚举/发现模式标志
描述
分配一个RIO设备并根据配置空间内容配置字段。如果设备有目的ID寄存器,则在枚举模式下分配一个目的ID,或在发现模式下从配置空间读取。如果设备具有交换机能力,则分配并适当配置一个交换机。成功返回指向RIO设备的指针,失败返回NULL。
参数
struct rio_dev *rdevRapidIO设备对象
int sp交换机端口号
描述
读取特定交换机端口的端口错误状态CSR,以确定该端口是否具有活动链路。如果端口处于活动状态,则返回RIO_PORT_N_ERR_STS_PORT_OK;如果处于非活动状态,则返回0。
参数
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**中传递的主端口发送。
参数
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**中传递的主端口发送。
参数
struct rio_mport *port要测试的主端口
描述
读取主端口的端口错误状态CSR,以确定该端口是否具有活动链路。如果主端口处于活动状态,则返回RIO_PORT_N_ERR_STS_PORT_OK;如果处于非活动状态,则返回0。
参数
struct rio_net *net要在其上运行更新的RIO网络
描述
对于每个枚举的设备,确保系统中的每个交换机都有正确的路由条目。为在第一次通过交换机的枚举过程中未知的设备添加路由。
参数
struct rio_dev *rdevRIO 设备
描述
对于每个枚举的交换机,调用设备特定的错误管理初始化例程(如果由交换机驱动提供)。
参数
struct rio_mport *mport用于发送事务的主端口
u32 flags枚举控制标志
描述
开始枚举过程。如果有人枚举了我们的主端口设备,则放弃。如果未被枚举且我们有活动链路,则开始递归对等枚举。如果枚举成功返回0,如果枚举失败返回-EBUSY。
参数
struct rio_net *net要在其上运行路由表扫描的RIO网络
描述
对于每个交换机设备,通过复制交换机中的现有路由条目来生成路由表。
参数
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。
参数
struct rio_dev *rdevRIO设备未能响应
struct rio_dev **nrdev到rdev路由上的最后一个活动设备
int *npnum到rdev路由上nrdev的端口号
描述
沿着到指定RIO设备的路由,确定路由上最后一个可用设备(以及相应的RIO端口)。
参数
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来自链路伙伴的响应
参数
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_idmport设备的编号(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。
参数
struct device *dev要匹配的RIO设备结构
描述
当驱动声明rio_dev时返回0并设置rio_dev->driver,否则返回错误
参数
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 *mportRapidIO主端口信息
int indexRapidIO接口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 *mportRapidIO主端口信息
int indexRapidIO接口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 *mportRapidIO主端口信息
int indexRapidIO接口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 *mportRapidIO主端口信息
int indexRapidIO接口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 *devplatform_device 指针
描述
初始化 MPC85xx RapidIO 硬件接口,使用系统特定信息配置主端口,并将主端口注册到 RapidIO 子系统。
致谢¶
以下人员直接或间接地为 RapidIO 子系统做出了贡献
Matt Portermporter@kernel.crashing.org
Randy Vinsonrvinson@mvista.com
Dan Malekdan@embeddedalley.com
以下人员对本文档做出了贡献
Matt Portermporter@kernel.crashing.org