RapidIO 子系統指南

作者:

Matt Porter

簡介

RapidIO 是一種高速交換結構互連,其特性面向嵌入式市場。 RapidIO 提供對基於交換結構網路的記憶體對映 I/O 和基於訊息的事務的支援。 RapidIO 具有標準化的發現機制,與 PCI 匯流排標準非常相似,可以簡單地檢測網路中的裝置。

本文件為希望在新架構上支援 RapidIO、編寫新驅動程式或瞭解子系統內部結構的開發人員提供。

已知 Bug 和限制

Bug

無。 ;)

限制

  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 驅動程式特定資料。裝置結構的驅動程式資料指標設定為 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

從中獲取 deviceid 的 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

繫結 portwrite 回撥的 RIO 主埠

void *context

要在事件中傳遞的處理程式特定上下文

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

接收到 portwrite 時執行的回撥函式

描述

如果請求已滿足,則返回 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

繫結 portwrite 回撥的 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 資料傳輸方向(TO 或 FROM 裝置)

unsigned long flags

dmaengine 定義的標誌

描述

初始化支援 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-Serial 暫存器對映型別(1 或 2)

em_efptr

RIO 錯誤管理功能指標

dma_mask

此裝置實現的 RIO 地址的位掩碼

driver

宣告此裝置的驅動程式

dev

裝置模型裝置

riores

RIO 資源,此裝置擁有

pwcback

此裝置的埠寫入回撥函式

destid

網路目標 ID(或交換機的關聯 destid)

hopcount

到此裝置的跳數

prev

連線到當前 RIO 裝置的上一個 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-Serial 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)

為給定網路分配下一個可用的 destID

引數

struct rio_net *net

RIO 網路

描述

返回指定 RIO 網路的下一個可用裝置目標 ID。 將分配的 ID 標記為正在使用。 如果沒有可用的新 destID,則返回 RIO_INVALID_DESTID。

int rio_destid_reserve(struct rio_net *net, u16 destid)

保留指定 destID

引數

struct rio_net *net

RIO 網路

u16 destid

要保留的 destID

描述

嘗試保留指定的 destID。 如果成功,則返回 0。

void rio_destid_free(struct rio_net *net, u16 destid)

釋放先前分配的 destID

引數

struct rio_net *net

RIO 網路

u16 destid

要釋放的 destID

描述

使指定的 destID 可供使用。

u16 rio_destid_first(struct rio_net *net)

返回正在使用的第一個 destID

引數

struct rio_net *net

RIO 網路

u16 rio_destid_next(struct rio_net *net, u16 from)

返回正在使用的下一個 destID

引數

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_opsdst_ops 是否具有必要的事務能力,這些能力指示裝置是否將實現目標 ID 暫存器。 如果為真,則返回 1,如果為假,則返回 0。

void rio_release_dev(struct device *dev)

釋放 RIO 裝置結構

引數

struct device *dev

與 RIO 裝置結構關聯的 LDM 裝置

描述

獲取與 RIO 裝置結構關聯的 RIO 裝置結構。 RIO 裝置結構將被釋放。

int rio_is_switch(struct rio_dev *rdev)

測試 RIO 裝置是否具有交換機功能

引數

struct rio_dev *rdev

RIO 裝置

描述

獲取 RIO 裝置處理元素功能暫存器的內容並測試交換機功能。 如果裝置是交換機,則返回 1,如果不是交換機,則返回 0。 RIO 裝置結構將被釋放。

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,或在發現模式下從配置空間讀取目標 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 devive發出輸入狀態命令

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從裝置讀取暫存器)

描述

TODO:當前,此例程與為idt_gen3 RapidIO交換機裝置指定的恢復過程不相容。 必須對其進行審查以實現與所有可用裝置相容的通用恢復過程。 IDT gen3交換機驅動程式現在實現HW特定的錯誤處理程式,該處理程式向埠發出軟埠重置以重置ERR_STOP位和ackID。

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

RT中的destID條目

u8 route_port

指定destID的目標埠

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中定義的標準暫存器指定的destID關聯的交換機路由表條目(埠號)

引數

struct rio_mport *mport

發出事務的主埠

u16 destid

裝置的目標 ID

u8 hopcount

到裝置的中轉站數

u16 table

路由表ID(全域性或埠特定)

u16 route_destid

RT中的destID條目

u8 *route_port

指定destID的返回目標埠

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

使用 RIO 規範 rev.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_* 函式

引數

大小

配置空間讀取的大小(8、16、32 位)

型別

value 引數的 C 型別

長度

配置空間讀取的長度(1、2、4 位元組)

描述

生成用於訪問本地裝置上配置空間暫存器的 rio_local_read_config_* 函式。

RIO_LOP_WRITE

RIO_LOP_WRITE (size, type, len)

生成 rio_local_write_config_* 函式

引數

大小

配置空間寫入的大小(8、16、32 位)

型別

value 引數的 C 型別

長度

配置空間寫入的長度(1、2、4 位元組)

描述

生成用於訪問本地裝置上配置空間暫存器的 rio_local_write_config_* 函式。

RIO_OP_READ

RIO_OP_READ (size, type, len)

生成 rio_mport_read_config_* 函式

引數

大小

配置空間讀取的大小(8、16、32 位)

型別

value 引數的 C 型別

長度

配置空間讀取的長度(1、2、4 位元組)

描述

生成用於訪問本地裝置上配置空間暫存器的 rio_mport_read_config_* 函式。

RIO_OP_WRITE

RIO_OP_WRITE (size, type, len)

生成 rio_mport_write_config_* 函式

引數

大小

配置空間寫入的大小(8、16、32 位)

型別

value 引數的 C 型別

長度

配置空間寫入的長度(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 裝置結構體

描述

當 drv 宣告 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

RapdiIO 介面的 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

RapdiIO 介面的 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

RapdiIO 介面的 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

RapdiIO 介面的 ID

u16 destid

事務的目標 ID

u8 hopcount

到目標裝置的跳數

u32 offset

配置空間的偏移量

int len

維護事務的長度(以位元組為單位)

u32 val

要寫入的值

描述

生成 MPC85xx 寫入維護事務。成功時返回 0,失敗時返回 -EINVAL

int fsl_rio_setup(struct platform_device *dev)

設定 Freescale 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