客戶端驅動程式 API 文件

序列集線器通訊

enum ssh_frame_type

SSH 幀的幀型別。

常量

SSH_FRAME_TYPE_DATA_SEQ

指示資料幀,後跟一個有效負載,其長度在 struct ssh_frame.len 欄位中指定。此幀是排序的,這意味著需要 ACK。

SSH_FRAME_TYPE_DATA_NSQ

SSH_FRAME_TYPE_DATA_SEQ 相同,但未排序,這意味著訊息不必被 ACK。

SSH_FRAME_TYPE_ACK

指示 ACK 訊息。

SSH_FRAME_TYPE_NAK

指示先前傳送的幀的錯誤響應。一般來說,這意味著幀和/或有效負載格式錯誤,例如 CRC 錯誤。對於命令型別有效負載,這也可能意味著該命令無效。

struct ssh_frame

SSH 通訊幀。

定義:

struct ssh_frame {
    u8 type;
    __le16 len;
    u8 seq;
};

成員

type

幀的型別。參見 enum ssh_frame_type

len

緊隨此幀的 CRC 之後的幀有效負載的長度。不包括該有效負載的最終 CRC。

seq

此訊息/交換的序列號。

enum ssh_payload_type

SSH 有效負載的型別指示符。

常量

SSH_PLD_TYPE_CMD

有效負載是帶有可選命令有效負載的命令結構。

struct ssh_command

命令型別幀的有效負載。

定義:

struct ssh_command {
    u8 type;
    u8 tc;
    u8 tid;
    u8 sid;
    u8 iid;
    __le16 rqid;
    u8 cid;
};

成員

type

有效負載的型別。參見 enum ssh_payload_type。對於此結構,應為 SSH_PLD_TYPE_CMD。

tc

命令目標類別。

tid

目標 ID。指示訊息的目標。

sid

源 ID。指示訊息的來源。

iid

例項 ID。

rqid

請求 ID。用於將請求與響應匹配,並區分響應和事件。

cid

命令 ID。

SSH_MESSAGE_LENGTH

SSH_MESSAGE_LENGTH (payload_size)

計算 SSH 訊息的長度。

引數

payload_size

SSH 幀內的有效負載的長度。

返回值

返回具有指定大小的有效負載的 SSH 訊息的長度。

SSH_COMMAND_MESSAGE_LENGTH

SSH_COMMAND_MESSAGE_LENGTH (payload_size)

計算 SSH 命令訊息的長度。

引數

payload_size

命令有效負載的長度。

返回值

返回帶有指定大小的命令有效負載的 SSH 命令訊息的長度。

SSH_MSGOFFSET_FRAME

SSH_MSGOFFSET_FRAME (field)

計算 SSH 訊息中到幀中指定欄位的偏移量。

引數

field

應計算偏移量的欄位。

返回值

以原始 SSH 訊息資料返回指定 struct ssh_frame 欄位的偏移量。考慮了幀之前的 SYN 位元組 (u16)。

SSH_MSGOFFSET_COMMAND

SSH_MSGOFFSET_COMMAND (field)

計算 SSH 訊息中到命令中指定欄位的偏移量。

引數

field

應計算偏移量的欄位。

返回值

以原始 SSH 訊息資料返回指定 struct ssh_command 欄位的偏移量。考慮了幀之前的 SYN 位元組 (u16) 以及幀和命令之間的幀 CRC (u16)。

u16 ssh_crc(const u8 *buf, size_t len)

計算 SSH 訊息的 CRC。

引數

const u8 *buf

指向應計算 CRC 的資料的指標。

size_t len

應計算 CRC 的資料的長度。

返回值

返回在提供的資料上計算的 CRC,用於 SSH 訊息。

u16 ssh_rqid_next_valid(u16 rqid)

返回下一個有效的請求 ID。

引數

u16 rqid

當前請求 ID。

返回值

返回下一個有效的請求 ID,遵循提供給此函式的當前請求 ID。此函式跳過為事件保留的任何請求 ID。

u16 ssh_rqid_to_event(u16 rqid)

將請求 ID 轉換為其對應的事件 ID。

引數

u16 rqid

要轉換的請求 ID。

bool ssh_rqid_is_event(u16 rqid)

檢查給定的請求 ID 是否為有效的事件 ID。

引數

u16 rqid

要檢查的請求 ID。

u16 ssh_tc_to_rqid(u8 tc)

將目標類別轉換為其對應的請求 ID。

引數

u8 tc

要轉換的目標類別。

u8 ssh_tid_to_index(u8 tid)

將目標 ID 轉換為其對應的目標索引。

引數

u8 tid

要轉換的目標 ID。

bool ssh_tid_is_valid(u8 tid)

檢查目標 ID 是否有效/受支援。

引數

u8 tid

要檢查的目標 ID。

struct ssam_span

對緩衝區區域的引用。

定義:

struct ssam_span {
    u8 *ptr;
    size_t len;
};

成員

ptr

指向緩衝區區域的指標。

len

緩衝區區域的長度。

描述

對(非擁有的)緩衝區段的引用,由指標和長度組成。使用此結構表示非擁有的資料,即生命週期由另一個指標管理(即,已分配/釋放)的資料。

enum ssam_ssh_tid

序列集線器訊息的目標/源 ID。

常量

SSAM_SSH_TID_HOST

我們作為核心序列集線器驅動程式。

SSAM_SSH_TID_SAM

Surface 聚合器 EC。

SSAM_SSH_TID_KIP

鍵盤和外圍裝置控制器。

SSAM_SSH_TID_DEBUG

除錯聯結器。

SSAM_SSH_TID_SURFLINK

SurfLink 聯結器。

enum ssh_packet_base_priority

struct ssh_packet 的基本優先順序。

常量

SSH_PACKET_PRIORITY_FLUSH

重新整理資料包的基本優先順序。

SSH_PACKET_PRIORITY_DATA

普通資料包的基本優先順序。

SSH_PACKET_PRIORITY_NAK

NAK 資料包的基本優先順序。

SSH_PACKET_PRIORITY_ACK

ACK 資料包的基本優先順序。

SSH_PACKET_PRIORITY

SSH_PACKET_PRIORITY (base, try)

從基本優先順序和嘗試次數計算資料包優先順序。

引數

base

作為 enum ssh_packet_base_priority 的字尾的基本優先順序,例如 FLUSHDATAACKNAK

try

嘗試次數(必須小於 16)。

描述

計算組合資料包優先順序。組合優先順序由基本優先順序主導,而(重新)嘗試次數決定了具有相同基本優先順序的資料包的優先順序,從而為已經有更多嘗試的資料包賦予更高的優先順序。

返回值

將計算出的優先順序作為適合在 u8 中儲存的值返回。數字越大,優先順序越高。

u8 ssh_packet_priority_get_try(u8 priority)

從資料包優先順序獲取嘗試次數。

引數

u8 priority

資料包優先順序。

返回值

返回在指定的資料包優先順序中編碼的嘗試次數。

u8 ssh_packet_priority_get_base(u8 priority)

從資料包優先順序獲取基本優先順序。

引數

u8 priority

資料包優先順序。

返回值

返回在給定的資料包優先順序中編碼的基本優先順序。

struct ssh_packet_ops

SSH 資料包的回撥操作。

定義:

struct ssh_packet_ops {
    void (*release)(struct ssh_packet *p);
    void (*complete)(struct ssh_packet *p, int status);
};

成員

release

當資料包引用計數達到零時呼叫的函式。必須依賴此回撥來確保資料包已離開傳輸系統。

complete

當資料包完成時(成功或失敗)呼叫的函式。如果失敗,則失敗原因由提供的狀態程式碼引數的值指示。如果成功,此值為零。請注意,呼叫此回撥並不能保證資料包不再被傳輸系統使用。

struct ssh_packet

SSH 傳輸資料包。

定義:

struct ssh_packet {
    struct ssh_ptl *ptl;
    struct kref refcnt;
    u8 priority;
    struct {
        size_t len;
        u8 *ptr;
    } data;
    unsigned long state;
    ktime_t timestamp;
    struct list_head queue_node;
    struct list_head pending_node;
    const struct ssh_packet_ops *ops;
};

成員

ptl

指向資料包傳輸層的指標。如果尚未提交資料包(或封閉的請求),則可能為 NULL

refcnt

資料包的引用計數。

priority

資料包的優先順序。必須透過 SSH_PACKET_PRIORITY() 計算。首次提交後,只能在持有佇列鎖時訪問。

data

原始訊息資料。

data.len

原始訊息資料的長度。

data.ptr

指向原始訊息資料緩衝區的指標。

state

描述當前資料包狀態(動態)和型別(靜態)的狀態和型別標誌。有關可能的選項,請參見 enum ssh_packet_flags

timestamp

時間戳,指定當前掛起資料包的最新傳輸何時開始。 在傳輸嘗試之前或之間,可能為 KTIME_MAX。 用於資料包超時實現。 首次提交後,必須在持有 pending 鎖的情況下才能訪問。

queue_node

資料包佇列的列表節點。

pending_node

掛起資料包集合的列表節點。

ops

資料包操作。

void ssh_packet_set_data(struct ssh_packet *p, u8 *ptr, size_t len)

設定資料包的原始訊息資料。

引數

struct ssh_packet *p

應設定訊息資料的資料包。

u8 *ptr

指向儲存訊息資料的記憶體的指標。

size_t len

訊息資料的長度。

描述

將資料包的原始訊息資料緩衝區設定為提供的記憶體。 不復制記憶體。 相反,呼叫者負責記憶體的管理(即分配和釋放)。 呼叫者必須確保提供的記憶體有效,幷包含有效的 SSH 訊息,從資料包提交時開始,直到呼叫 release 回撥為止。 在此期間,不得以任何方式更改記憶體。

struct ssh_request_ops

SSH 請求的回撥操作。

定義:

struct ssh_request_ops {
    void (*release)(struct ssh_request *rqst);
    void (*complete)(struct ssh_request *rqst,const struct ssh_command *cmd, const struct ssam_span *data, int status);
};

成員

release

當請求的引用計數達到零時呼叫的函式。 必須依靠此回撥來確保請求已離開傳輸系統(資料包和請求系統)。

complete

請求完成時呼叫的函式,無論成功還是失敗。 請求響應的命令資料透過 struct ssh_command 引數 (cmd) 提供,請求響應的命令有效負載透過 struct ssh_span 引數 (data) 提供。

如果請求沒有任何響應或未成功完成,則 cmddata 引數都將為 NULL。 如果請求響應沒有任何命令有效負載,則 data span 將是一個空的(零長度)span。

如果失敗,失敗的原因由提供的狀態程式碼引數 (status) 的值指示。 成功時此值為零,否則為常規 errno。

請注意,呼叫此回撥並不能保證請求不再被傳輸系統使用。

struct ssh_request

SSH 傳輸請求。

定義:

struct ssh_request {
    struct ssh_packet packet;
    struct list_head node;
    unsigned long state;
    ktime_t timestamp;
    const struct ssh_request_ops *ops;
};

成員

packet

底層 SSH 傳輸資料包。

node

請求佇列和掛起集合的列表節點。

state

描述當前請求狀態(動態)和型別(靜態)的狀態和型別標誌。 有關可能的選項,請參見 enum ssh_request_flags

timestamp

時間戳,指定我們何時開始等待請求的響應。 一旦底層資料包完成,就會設定此時間戳,並且在此之前或當請求不期望響應時,該時間戳可能為 KTIME_MAX。 用於請求超時實現。

ops

請求操作。

struct ssh_request *to_ssh_request(struct ssh_packet *p)

將 SSH 資料包強制轉換為其封閉的 SSH 請求。

引數

struct ssh_packet *p

要強制轉換的資料包。

描述

將給定的 struct ssh_packet 強制轉換為其封閉的 struct ssh_request。 呼叫者負責確保資料包實際上包含在 struct ssh_request 中。

返回值

返回包裝提供的資料包的 struct ssh_request

struct ssh_request *ssh_request_get(struct ssh_request *r)

增加請求的引用計數。

引數

struct ssh_request *r

要增加引用計數的請求。

描述

透過增加其中包含的底層 struct ssh_packet 的引用計數,來增加給定請求的引用計數。

另請參見 ssh_request_put()ssh_packet_get()

返回值

返回作為輸入提供的請求。

void ssh_request_put(struct ssh_request *r)

減少請求的引用計數。

引數

struct ssh_request *r

要減少引用計數的請求。

描述

透過減少其中包含的底層 struct ssh_packet 的引用計數,來減少給定請求的引用計數。 如果引用計數達到零,則會呼叫請求的 struct ssh_request_ops 中指定的 release 回撥,即 r->ops->release

另請參見 ssh_request_get()ssh_packet_put()

void ssh_request_set_data(struct ssh_request *r, u8 *ptr, size_t len)

設定請求的原始訊息資料。

引數

struct ssh_request *r

應設定訊息資料的請求。

u8 *ptr

指向儲存訊息資料的記憶體的指標。

size_t len

訊息資料的長度。

描述

將底層資料包的原始訊息資料緩衝區設定為指定的緩衝區。 不復制實際訊息資料,僅設定緩衝區指標和長度。 有關更多詳細資訊,請參見 ssh_packet_set_data()

struct ssh_packet *ssh_packet_get(struct ssh_packet *packet)

增加資料包的引用計數。

引數

struct ssh_packet *packet

要增加引用計數的資料包。

描述

增加給定資料包的引用計數。 有關此函式的對應部分,請參見 ssh_packet_put()

返回值

返回作為輸入提供的資料包。

void ssh_packet_put(struct ssh_packet *packet)

減少資料包的引用計數。

引數

struct ssh_packet *packet

要減少引用計數的資料包。

描述

如果引用計數達到零,則會呼叫資料包的 struct ssh_packet_ops 中指定的 release 回撥,即 packet->ops->release

有關此函式的對應部分,請參見 ssh_packet_get()

控制器和核心介面

enum ssam_event_flags

用於啟用/停用 SAM 事件的標誌

常量

SSAM_EVENT_SEQUENCED

該事件將透過排序的資料幀傳送。

struct ssam_event

從 EC 傳送到主機的 SAM 事件。

定義:

struct ssam_event {
    u8 target_category;
    u8 target_id;
    u8 command_id;
    u8 instance_id;
    u16 length;
    u8 data[] ;
};

成員

target_category

事件源的目標類別。 請參見 enum ssam_ssh_tc

target_id

事件源的目標 ID。

command_id

事件的命令 ID。

instance_id

事件源的例項 ID。

length

事件有效負載的長度(以位元組為單位)。

data

事件有效負載資料。

enum ssam_request_flags

SAM 請求的標誌。

常量

SSAM_REQUEST_HAS_RESPONSE

指定請求期望得到響應。 如果未設定,則在傳輸其底層資料包後,將直接完成請求。 如果設定,則請求傳輸系統將等待請求的響應。

SSAM_REQUEST_UNSEQUENCED

指定應透過未排序的資料包傳輸請求。 如果設定,則請求不得有響應,這意味著此標誌和 SSAM_REQUEST_HAS_RESPONSE 標誌是互斥的。

struct ssam_request

SAM 請求描述。

定義:

struct ssam_request {
    u8 target_category;
    u8 target_id;
    u8 command_id;
    u8 instance_id;
    u16 flags;
    u16 length;
    const u8 *payload;
};

成員

target_category

請求目標類別。 請參見 enum ssam_ssh_tc

target_id

請求目標的 ID。

command_id

請求的命令 ID。

instance_id

請求目標的例項 ID。

flags

請求的標誌。 請參見 enum ssam_request_flags

length

請求有效負載的長度(以位元組為單位)。

payload

請求有效負載資料。

描述

此結構完整描述了帶有有效負載的 SAM 請求。 它旨在幫助設定實際的傳輸結構,例如 struct ssam_request_sync,特別是透過 ssam_request_write_data() 設定其原始訊息資料。

struct ssam_response

SAM 請求的響應緩衝區。

定義:

struct ssam_response {
    size_t capacity;
    size_t length;
    u8 *pointer;
};

成員

capacity

緩衝區的容量(以位元組為單位)。

length

實際儲存在 pointer 指向的記憶體中的資料的長度(以位元組為單位)。 由傳輸系統設定。

pointer

指向緩衝區的記憶體的指標,用於儲存響應有效負載資料。

struct ssam_request_sync

同步 SAM 請求結構。

定義:

struct ssam_request_sync {
    struct ssh_request base;
    struct completion comp;
    struct ssam_response *resp;
    int status;
};

成員

base

底層 SSH 請求。

comp

用於表示請求完全完成的完成物件。 提交請求後,只有在完成物件發出訊號後,才能修改或釋放此結構。 提交請求後,

resp

用於儲存響應的緩衝區。

status

請求的狀態,在基本請求完成或失敗後設置。

void ssam_request_sync_set_data(struct ssam_request_sync *rqst, u8 *ptr, size_t len)

設定同步請求的訊息資料。

引數

struct ssam_request_sync *rqst

請求。

u8 *ptr

指向請求訊息資料的指標。

size_t len

請求訊息資料的長度。

描述

設定同步請求的請求訊息資料。 提供的緩衝區需要在請求完成之前一直存在。

void ssam_request_sync_set_resp(struct ssam_request_sync *rqst, struct ssam_response *resp)

設定同步請求的響應緩衝區。

引數

struct ssam_request_sync *rqst

請求。

struct ssam_response *resp

響應緩衝區。

描述

設定同步請求的響應緩衝區。 完成請求後,此緩衝區將儲存請求的響應。 如果不期望任何響應,則可以為 NULL

int ssam_request_sync_wait(struct ssam_request_sync *rqst)

等待同步請求完成。

引數

struct ssam_request_sync *rqst

要等待的請求。

描述

等待同步請求完成並釋放。 此函式終止後,可以保證該請求已離開傳輸系統。 成功提交請求後,必須在訪問請求的響應、釋放請求或釋放與請求關聯的任何緩衝區之前呼叫此函式。

如果尚未提交請求,則不得呼叫此函式,並且如果後續請求提交在這種情況下失敗,可能會導致死鎖/無限等待,因為完成物件永遠不會觸發。

返回值

返回給定請求的狀態,該狀態在資料包完成後設定。 成功時此值為零,失敗時為負數。

ssam_request_do_sync_onstack

ssam_request_do_sync_onstack (ctrl, rqst, rsp, payload_len)

在堆疊上執行同步請求。

引數

ctrl

透過其提交請求的控制器。

rqst

請求規範。

rsp

響應緩衝區。

payload_len

(最大)請求有效負載長度。

描述

在堆疊上分配具有指定有效負載長度的同步請求,透過提供的請求規範完全初始化它,提交它,最後等待其完成後再返回其狀態。 此幫助程式宏基本上在堆疊上分配請求訊息緩衝區,然後呼叫 ssam_request_do_sync_with_buffer()

請注意

payload_len 引數指定最大有效負載長度,用於緩衝區分配。 實際有效負載長度可能更小。

返回值

返回請求的狀態或設定期間的任何失敗,即成功時為零,失敗時為負值。

__ssam_retry

__ssam_retry (request, n, args...)

如果出現 I/O 錯誤或超時,則重試請求。

引數

request

要執行的請求函式。 必須返回一個整數。

n

嘗試次數。

args...

請求函式的引數。

描述

執行給定的請求函式,即呼叫 request。如果請求返回 -EREMOTEIO(表示 I/O 錯誤)或 -ETIMEDOUT(請求或底層資料包超時),request 將再次重新執行,總共最多執行 n 次。

返回值

返回最後一次執行 request 的返回值。

ssam_retry

ssam_retry (request, args...)

如果發生 I/O 錯誤或超時,則重試請求,總共最多三次。

引數

request

要執行的請求函式。 必須返回一個整數。

args...

請求函式的引數。

描述

執行給定的請求函式,即呼叫 request。如果請求返回 -EREMOTEIO(表示 I/O 錯誤)或 -ETIMEDOUT(請求或底層資料包超時),request 將再次重新執行,總共最多三次。

有關此目的的更通用的宏,請參閱 __ssam_retry()

返回值

返回最後一次執行 request 的返回值。

struct ssam_request_spec

SAM 請求的藍圖規範。

定義:

struct ssam_request_spec {
    u8 target_category;
    u8 target_id;
    u8 command_id;
    u8 instance_id;
    u8 flags;
};

成員

target_category

請求目標類別。 請參見 enum ssam_ssh_tc

target_id

請求目標的 ID。

command_id

請求的命令 ID。

instance_id

請求目標的例項 ID。

flags

請求的標誌。 請參見 enum ssam_request_flags

描述

SAM 請求的藍圖規範。此結構描述了請求的唯一靜態引數(即型別),而不指定任何特定於例項的資料(例如,有效負載)。它旨在用作透過 SSAM_DEFINE_SYNC_REQUEST_x() 宏系列定義簡單請求函式的基礎。

struct ssam_request_spec_md

多裝置 SAM 請求的藍圖規範。

定義:

struct ssam_request_spec_md {
    u8 target_category;
    u8 command_id;
    u8 flags;
};

成員

target_category

請求目標類別。 請參見 enum ssam_ssh_tc

command_id

請求的命令 ID。

flags

請求的標誌。 請參見 enum ssam_request_flags

描述

多裝置 SAM 請求的藍圖規範,即適用於多個裝置例項的請求,這些例項由其各自的目標 ID 和例項 ID 描述。此結構描述了請求的唯一靜態引數(即型別),而不指定任何特定於例項的資料(例如,有效負載),也不指定任何特定於裝置的 ID(即目標 ID 和例項 ID)。它旨在用作透過 SSAM_DEFINE_SYNC_REQUEST_MD_x()SSAM_DEFINE_SYNC_REQUEST_CL_x() 宏系列定義簡單多裝置請求函式的基礎。

SSAM_DEFINE_SYNC_REQUEST_N

SSAM_DEFINE_SYNC_REQUEST_N (name, spec...)

定義沒有引數也沒有返回值的同步 SAM 請求函式。

引數

name

生成的函式的名稱。

spec...

定義請求的規範(struct ssam_request_spec)。

描述

定義一個函式,該函式執行由 spec 指定的同步 SAM 請求,該請求既沒有引數也沒有返回值。生成的函式負責設定請求結構和緩衝區分配,以及請求本身的執行,一旦請求完全完成就返回。所需的傳輸緩衝區將在堆疊上分配。

生成的函式定義為 static int name(struct ssam_controller *ctrl),返回請求的狀態,成功時為零,失敗時為負數。ctrl 引數是透過其傳送請求的控制器。

有關生成函式行為的更多詳細資訊,請參閱 ssam_request_do_sync_onstack()

SSAM_DEFINE_SYNC_REQUEST_W

SSAM_DEFINE_SYNC_REQUEST_W (name, atype, spec...)

定義帶有引數的同步 SAM 請求函式。

引數

name

生成的函式的名稱。

atype

請求的引數的型別。

spec...

定義請求的規範(struct ssam_request_spec)。

描述

定義一個函式,該函式執行由 spec 指定的同步 SAM 請求,該請求採用 atype 型別的引數,並且沒有返回值。生成的函式負責設定請求結構、緩衝區分配以及請求本身的執行,一旦請求完全完成就返回。所需的傳輸緩衝區將在堆疊上分配。

生成的函式定義為 static int name(struct ssam_controller *ctrl, const atype *arg),返回請求的狀態,成功時為零,失敗時為負數。ctrl 引數是透過其傳送請求的控制器。請求引數透過 arg 指標指定。

有關生成函式行為的更多詳細資訊,請參閱 ssam_request_do_sync_onstack()

SSAM_DEFINE_SYNC_REQUEST_R

SSAM_DEFINE_SYNC_REQUEST_R (name, rtype, spec...)

定義帶有返回值的同步 SAM 請求函式。

引數

name

生成的函式的名稱。

rtype

請求的返回值的型別。

spec...

定義請求的規範(struct ssam_request_spec)。

描述

定義一個函式,該函式執行由 spec 指定的同步 SAM 請求,該請求不帶引數,但具有 rtype 型別的返回值。生成的函式負責設定請求和響應結構、緩衝區分配以及請求本身的執行,一旦請求完全完成就返回。所需的傳輸緩衝區將在堆疊上分配。

生成的函式定義為 static int name(struct ssam_controller *ctrl, rtype *ret),返回請求的狀態,成功時為零,失敗時為負數。ctrl 引數是透過其傳送請求的控制器。請求的返回值寫入到 ret 引數指向的記憶體中。

有關生成函式行為的更多詳細資訊,請參閱 ssam_request_do_sync_onstack()

SSAM_DEFINE_SYNC_REQUEST_WR

SSAM_DEFINE_SYNC_REQUEST_WR (name, atype, rtype, spec...)

定義既帶有引數又帶有返回值的同步 SAM 請求函式。

引數

name

生成的函式的名稱。

atype

請求的引數的型別。

rtype

請求的返回值的型別。

spec...

定義請求的規範(struct ssam_request_spec)。

描述

定義一個函式,該函式執行由 spec 指定的同步 SAM 請求,該請求採用 atype 型別的引數,並且具有 rtype 型別的返回值。生成的函式負責設定請求和響應結構、緩衝區分配以及請求本身的執行,一旦請求完全完成就返回。所需的傳輸緩衝區將在堆疊上分配。

生成的函式定義為 static int name(struct ssam_controller *ctrl, const atype *arg, rtype *ret),返回請求的狀態,成功時為零,失敗時為負數。ctrl 引數是透過其傳送請求的控制器。請求引數透過 arg 指標指定。請求的返回值寫入到 ret 引數指向的記憶體中。

有關生成函式行為的更多詳細資訊,請參閱 ssam_request_do_sync_onstack()

SSAM_DEFINE_SYNC_REQUEST_MD_N

SSAM_DEFINE_SYNC_REQUEST_MD_N (name, spec...)

定義沒有引數也沒有返回值的同步多裝置 SAM 請求函式。

引數

name

生成的函式的名稱。

spec...

定義請求的規範(struct ssam_request_spec_md)。

描述

定義一個函式,該函式執行由 spec 指定的同步 SAM 請求,該請求既沒有引數也沒有返回值。裝置指定引數不是硬編碼的,而是必須提供給函式。生成的函式負責設定請求結構、緩衝區分配以及請求本身的執行,一旦請求完全完成就返回。所需的傳輸緩衝區將在堆疊上分配。

生成的函式定義為 static int name(struct ssam_controller *ctrl, u8 tid, u8 iid),返回請求的狀態,成功時為零,失敗時為負數。ctrl 引數是透過其傳送請求的控制器,tid 是請求的目標 ID,iid 是例項 ID。

有關生成函式行為的更多詳細資訊,請參閱 ssam_request_do_sync_onstack()

SSAM_DEFINE_SYNC_REQUEST_MD_W

SSAM_DEFINE_SYNC_REQUEST_MD_W (name, atype, spec...)

定義帶有引數的同步多裝置 SAM 請求函式。

引數

name

生成的函式的名稱。

atype

請求的引數的型別。

spec...

定義請求的規範(struct ssam_request_spec_md)。

描述

定義一個函式,該函式執行由 spec 指定的同步 SAM 請求,該請求採用 atype 型別的引數,並且沒有返回值。裝置指定引數不是硬編碼的,而是必須提供給函式。生成的函式負責設定請求結構、緩衝區分配以及請求本身的執行,一旦請求完全完成就返回。所需的傳輸緩衝區將在堆疊上分配。

生成的函式定義為 static int name(struct ssam_controller *ctrl, u8 tid, u8 iid, const atype *arg),返回請求的狀態,成功時為零,失敗時為負數。ctrl 引數是透過其傳送請求的控制器,tid 是請求的目標 ID,iid 是例項 ID。請求引數透過 arg 指標指定。

有關生成函式行為的更多詳細資訊,請參閱 ssam_request_do_sync_onstack()

SSAM_DEFINE_SYNC_REQUEST_MD_R

SSAM_DEFINE_SYNC_REQUEST_MD_R (name, rtype, spec...)

定義帶有返回值的同步多裝置 SAM 請求函式。

引數

name

生成的函式的名稱。

rtype

請求的返回值的型別。

spec...

定義請求的規範(struct ssam_request_spec_md)。

描述

定義一個函式,該函式執行由 spec 指定的同步 SAM 請求,該請求不帶引數,但具有 rtype 型別的返回值。裝置指定引數不是硬編碼的,而是必須提供給函式。生成的函式負責設定請求和響應結構、緩衝區分配以及請求本身的執行,一旦請求完全完成就返回。所需的傳輸緩衝區將在堆疊上分配。

生成的函式定義為 static int name(struct ssam_controller *ctrl, u8 tid, u8 iid, rtype *ret),返回請求的狀態,成功時為零,失敗時為負數。ctrl 引數是透過其傳送請求的控制器,tid 是請求的目標 ID,iid 是例項 ID。請求的返回值寫入到 ret 引數指向的記憶體中。

有關生成函式行為的更多詳細資訊,請參閱 ssam_request_do_sync_onstack()

SSAM_DEFINE_SYNC_REQUEST_MD_WR

SSAM_DEFINE_SYNC_REQUEST_MD_WR (name, atype, rtype, spec...)

定義既帶有引數又帶有返回值的同步多裝置 SAM 請求函式。

引數

name

生成的函式的名稱。

atype

請求的引數的型別。

rtype

請求的返回值的型別。

spec...

定義請求的規範(struct ssam_request_spec_md)。

描述

定義一個函式,該函式執行由 spec 指定的同步 SAM 請求,該請求採用 atype 型別的引數,並且具有 rtype 型別的返回值。裝置指定引數不是硬編碼的,而是必須提供給函式。生成的函式負責設定請求和響應結構、緩衝區分配以及請求本身的執行,一旦請求完全完成就返回。所需的傳輸緩衝區將在堆疊上分配。

生成的函式定義為 static int name(struct ssam_controller *ctrl, u8 tid, u8 iid, const atype *arg, rtype *ret),返回請求的狀態,成功時為零,失敗時為負數。ctrl 引數是透過其傳送請求的控制器,tid 是請求的目標 ID,iid 是例項 ID。請求引數透過 arg 指標指定。請求的返回值寫入到 ret 引數指向的記憶體中。

有關生成函式行為的更多詳細資訊,請參閱 ssam_request_do_sync_onstack()

enum ssam_notif_flags

SSAM 通知器回撥函式中的返回值中使用的標誌。

常量

SSAM_NOTIF_HANDLED

表示通知已處理。如果處理程式可以作用/已經作用於提供給它的事件,則處理程式應設定此標誌。如果處理程式不是 intended 適用於所提供事件的主處理程式,則不應設定此標誌。

如果在遍歷通知程式鏈後,任何處理程式都未設定此標誌,則會發出警告,指出該事件未處理。

SSAM_NOTIF_STOP

表示通知程式遍歷應停止。如果從此通知程式回撥返回此標誌,則通知程式鏈遍歷將立即停止,並且不會呼叫任何剩餘的通知程式。當使用負錯誤值呼叫 ssam_notifier_from_errno() 時,將自動設定此標誌。

struct ssam_notifier_block

SSAM 事件通知的基本通知程式塊。

定義:

struct ssam_notifier_block {
    struct list_head node;
    ssam_notifier_fn_t fn;
    int priority;
};

成員

node

通知程式列表的節點。

fn

此通知程式的回撥函式。此函式將各自的通知程式塊和事件作為輸入,並應返回一個通知程式值,該值可以從 enum ssam_notif_flags 中提供的標誌獲得,透過 ssam_notifier_from_errno() 從標準錯誤值轉換,或兩者的組合(例如,ssam_notifier_from_errno(e) | SSAM_NOTIF_HANDLED)。

priority

優先順序值,用於確定呼叫通知程式回撥的順序。值越高表示優先順序越高,即關聯的回撥將比其他(較低優先順序)回撥更早執行。

u32 ssam_notifier_from_errno(int err)

將標準錯誤值轉換為通知程式返回值。

引數

int err

要轉換的錯誤程式碼,如果失敗則必須為負數,如果成功則必須為零。

返回值

返回透過轉換指定的 err 值獲得的通知程式返回值。如果 err 為負數,則將設定 SSAM_NOTIF_STOP 標誌,導致通知程式呼叫鏈遍歷中止。

int ssam_notifier_to_errno(u32 ret)

將通知程式返回值轉換為標準錯誤值。

引數

u32 ret

要轉換的通知程式返回值。

返回值

返回 ret 中編碼的負錯誤值,如果 ret 表示成功,則返回零。

struct ssam_event_registry

用於啟用事件的登錄檔規範。

定義:

struct ssam_event_registry {
    u8 target_category;
    u8 target_id;
    u8 cid_enable;
    u8 cid_disable;
};

成員

target_category

事件登錄檔請求的目標類別。

target_id

事件登錄檔請求的目標 ID。

cid_enable

用於事件啟用請求的命令 ID。

cid_disable

用於事件停用請求的命令 ID。

描述

此結構透過指定用於啟用和停用事件的請求的最小 SAM ID 集合來描述 SAM 事件登錄檔。要啟用/停用的單個事件本身透過 struct ssam_event_id 指定。

struct ssam_event_id

用於啟用事件的唯一事件 ID。

定義:

struct ssam_event_id {
    u8 target_category;
    u8 instance;
};

成員

target_category

事件源的目標類別。

instance

事件源的例項 ID。

描述

此結構透過外部提供的登錄檔指定要啟用/停用的事件。它不指定要使用的登錄檔本身,這透過 struct ssam_event_registry 完成。

enum ssam_event_mask

指定如何將事件與通知程式匹配的標誌。

常量

SSAM_EVENT_MASK_TARGET

除了按目標類別過濾外,僅為目標 ID 與用於啟用/停用事件的登錄檔的 ID 匹配的事件執行通知程式回撥。

SSAM_EVENT_MASK_INSTANCE

除了按目標類別過濾外,僅為例項 ID 與啟用事件時使用的例項 ID 匹配的事件執行通知程式回撥。

SSAM_EVENT_MASK_NONE

為具有匹配目標類別的任何事件執行回撥。不執行任何其他過濾。

SSAM_EVENT_MASK_STRICT

執行以上所有過濾。

SSAM_EVENT_REGISTRY

SSAM_EVENT_REGISTRY (tc, tid, cid_en, cid_dis)

定義新的事件登錄檔。

引數

tc

事件登錄檔請求的目標類別。

tid

事件登錄檔請求的目標 ID。

cid_en

用於事件啟用請求的命令 ID。

cid_dis

用於事件停用請求的命令 ID。

返回值

返回由給定引數指定的 struct ssam_event_registry

enum ssam_event_notifier_flags

事件通知程式的標誌。

常量

SSAM_EVENT_NOTIFIER_OBSERVER

相應的通知程式充當觀察者。註冊設定了此標誌的通知程式不會嘗試啟用任何事件。同樣,取消註冊不會嘗試停用任何事件。請注意,帶有此標誌的通知程式甚至可能根本不對應於某個特定事件,僅對應於某個特定事件目標類別。事件匹配不會受此標誌的影響。

struct ssam_event_notifier

SSAM 事件的通知程式塊。

定義:

struct ssam_event_notifier {
    struct ssam_notifier_block base;
    struct {
        struct ssam_event_registry reg;
        struct ssam_event_id id;
        enum ssam_event_mask mask;
        u8 flags;
    } event;
    unsigned long flags;
};

成員

base

具有回撥函式和優先順序的基本通知程式塊。

event

此塊將接收通知的事件。

event.reg

將透過其啟用/停用事件的登錄檔。

event.id

指定事件的 ID。

event.mask

確定如何將事件與通知程式匹配的標誌。

event.flags

用於啟用事件的標誌。

flags

通知程式標誌(請參閱 enum ssam_event_notifier_flags)。

int ssam_notifier_unregister(struct ssam_controller *ctrl, struct ssam_event_notifier *n)

登出事件通知器。

引數

struct ssam_controller *ctrl

已註冊通知器的控制器。

struct ssam_event_notifier *n

要登出的事件通知器。

描述

登出事件通知器。如果通知器未標記為觀察者,則遞減關聯 SAM 事件的使用計數器。如果使用計數器達到零,則將停用該事件。

返回值

成功時返回零,如果給定的通知器塊尚未在控制器上註冊,則返回 -ENOENT。如果給定的通知器塊是與其特定事件關聯的最後一個通知器塊,則返回事件停用 EC 命令的狀態。

struct device *ssam_controller_device(struct ssam_controller *c)

獲取與此控制器關聯的 struct device

引數

struct ssam_controller *c

要獲取裝置的控制器。

返回值

返回與此控制器關聯的 struct device,提供其較低級別的傳輸。

struct ssam_controller *ssam_controller_get(struct ssam_controller *c)

遞增控制器的引用計數。

引數

struct ssam_controller *c

控制器。

返回值

返回作為輸入提供的控制器。

void ssam_controller_put(struct ssam_controller *c)

遞減控制器的引用計數。

引數

struct ssam_controller *c

控制器。

void ssam_controller_statelock(struct ssam_controller *c)

鎖定控制器以防止狀態轉換。

引數

struct ssam_controller *c

要鎖定的控制器。

描述

鎖定控制器以防止狀態轉換。持有此鎖可保證控制器不會在狀態之間轉換,即,如果控制器處於“已啟動”狀態,則在獲取此鎖後,它將至少保持在此狀態,直到釋放該鎖為止。

多個客戶端可以同時持有此鎖。換句話說:statelock 函式表示 r/w 訊號量的讀鎖部分。導致控制器狀態轉換的操作必須在持有此 r/w 訊號量的寫鎖部分時執行(有關此,請參見 ssam_controller_lock() 和 ssam_controller_unlock())。

有關相應的解鎖函式,請參見 ssam_controller_stateunlock()

void ssam_controller_stateunlock(struct ssam_controller *c)

解鎖控制器狀態轉換。

引數

struct ssam_controller *c

要解鎖的控制器。

描述

有關相應的鎖定函式,請參見 ssam_controller_statelock()

ssize_t ssam_request_write_data(struct ssam_span *buf, struct ssam_controller *ctrl, const struct ssam_request *spec)

構造 SAM 請求訊息並將其寫入緩衝區。

引數

struct ssam_span *buf

要將資料寫入的緩衝區。

struct ssam_controller *ctrl

將透過其傳送請求的控制器。

const struct ssam_request *spec

請求資料和規範。

描述

構造 SAM/SSH 請求訊息並將其寫入提供的緩衝區。請求和傳輸計數器,特別是 RQID 和 SEQ,將在此呼叫中設定。這些計數器是從控制器獲得的。因此,僅透過此處指定的控制器傳送生成的訊息才有效。

有關所需緩衝區大小的計算,請參閱 SSH_COMMAND_MESSAGE_LENGTH() 宏。

返回值

成功時返回緩衝區中使用的位元組數。如果請求規範中提供的有效負載長度太大(大於 SSH_COMMAND_MAX_PAYLOAD_SIZE),或者如果提供的緩衝區太小,則返回 -EINVAL

int ssam_request_sync_alloc(size_t payload_len, gfp_t flags, struct ssam_request_sync **rqst, struct ssam_span *buffer)

分配一個同步請求。

引數

size_t payload_len

請求有效負載的長度。

gfp_t flags

用於分配的標誌。

struct ssam_request_sync **rqst

儲存指向已分配請求的指標的位置。

struct ssam_span *buffer

儲存請求訊息緩衝區的緩衝區描述符的位置。

描述

分配一個帶有相應訊息緩衝區的同步請求。在提交之前,仍然需要使用 ssam_request_sync_init() 初始化該請求,並且在填充訊息緩衝區資料後,仍然必須透過 ssam_request_sync_set_data() 將其設定為返回的緩衝區(如果需要調整訊息長度)。

使用後,應透過 ssam_request_sync_free() 釋放該請求及其相應的訊息緩衝區。不得單獨釋放緩衝區。

返回值

成功時返回零,如果無法分配請求,則返回 -ENOMEM

void ssam_request_sync_free(struct ssam_request_sync *rqst)

釋放一個同步請求。

引數

struct ssam_request_sync *rqst

要釋放的請求。

描述

釋放一個同步請求及其使用 ssam_request_sync_alloc() 分配的相應緩衝區。不要用於在堆疊上或透過任何其他函式分配的請求。

警告:呼叫者必須確保該請求不再使用。即,呼叫者必須確保它擁有對該請求的唯一引用,並且該請求當前未掛起。這意味著呼叫者要麼從未提交該請求,請求提交失敗,要麼呼叫者已等到提交的請求透過 ssam_request_sync_wait() 完成。

int ssam_request_sync_init(struct ssam_request_sync *rqst, enum ssam_request_flags flags)

初始化同步請求結構。

引數

struct ssam_request_sync *rqst

要初始化的請求。

enum ssam_request_flags flags

請求標誌。

描述

初始化給定的請求結構。不初始化請求訊息資料。在此呼叫之後,必須透過 ssam_request_sync_set_data() 顯式執行此操作,並且必須透過 ssam_request_write_data() 寫入實際訊息資料。

返回值

成功時返回零,如果給定的標誌無效,則返回 -EINVAL

int ssam_request_sync_submit(struct ssam_controller *ctrl, struct ssam_request_sync *rqst)

提交一個同步請求。

引數

struct ssam_controller *ctrl

提交請求的控制器。

struct ssam_request_sync *rqst

要提交的請求。

描述

提交一個同步請求。必須初始化並正確設定請求,包括響應緩衝區(如果不需要響應,則可以為 NULL)和命令訊息資料。此函式不等待請求完成。

如果此函式成功,則必須使用 ssam_request_sync_wait() 來確保在可以訪問響應資料和/或釋放請求之前,請求已完成。如果失敗,則可以立即釋放該請求。

僅當控制器處於活動狀態(即已初始化且未暫停)時,才能使用此函式。

int ssam_request_do_sync(struct ssam_controller *ctrl, const struct ssam_request *spec, struct ssam_response *rsp)

執行一個同步請求。

引數

struct ssam_controller *ctrl

將透過其提交請求的控制器。

const struct ssam_request *spec

請求規範和有效負載。

struct ssam_response *rsp

響應緩衝區。

描述

透過 ssam_request_sync_alloc() 在堆上分配一個帶有其訊息資料緩衝區的同步請求,透過提供的請求規範完全初始化它,提交它,並在釋放它並返回其狀態之前,最後等待其完成。

返回值

返回請求的狀態或設定期間的任何故障。

int ssam_request_do_sync_with_buffer(struct ssam_controller *ctrl, const struct ssam_request *spec, struct ssam_response *rsp, struct ssam_span *buf)

執行一個同步請求,並將提供的緩衝區用作訊息緩衝區的後端。

引數

struct ssam_controller *ctrl

將透過其提交請求的控制器。

const struct ssam_request *spec

請求規範和有效負載。

struct ssam_response *rsp

響應緩衝區。

struct ssam_span *buf

請求訊息資料的緩衝區。

描述

在堆疊上分配一個同步請求結構,使用提供的緩衝區作為訊息資料緩衝區完全初始化它,提交它,然後在返回其狀態之前等待其完成。可以使用 SSH_COMMAND_MESSAGE_LENGTH() 宏來計算所需的訊息緩衝區大小。

此函式本質上與 ssam_request_do_sync() 相同,但它不是動態分配請求和訊息資料緩衝區,而是使用提供的訊息資料緩衝區並將(小)請求結構儲存在堆上。

返回值

返回請求的狀態或設定期間的任何故障。

int ssam_notifier_register(struct ssam_controller *ctrl, struct ssam_event_notifier *n)

註冊事件通知器。

引數

struct ssam_controller *ctrl

要在其上註冊通知器的控制器。

struct ssam_event_notifier *n

要註冊的事件通知器。

描述

註冊事件通知器。如果通知器未標記為觀察者,則遞增關聯 SAM 事件的使用計數器。如果事件未標記為觀察者,並且當前未啟用,則將在本次呼叫期間啟用它。如果通知器被標記為觀察者,則不會嘗試啟用任何事件,也不會修改任何引用計數。

標記為觀察者的通知器不需要與一個特定的事件相關聯,即,只要不執行任何事件匹配,則只需要設定事件目標類別。

返回值

成功時返回零,如果已為與註冊的通知器塊關聯的事件 ID/型別存在 INT_MAX 個通知器,則返回 -ENOSPC,如果無法分配相應的事件條目,則返回 -ENOMEM。如果這是第一次為特定的關聯事件註冊通知器塊,則返回事件啟用 EC 命令的狀態。

int __ssam_notifier_unregister(struct ssam_controller *ctrl, struct ssam_event_notifier *n, bool disable)

登出事件通知器。

引數

struct ssam_controller *ctrl

已註冊通知器的控制器。

struct ssam_event_notifier *n

要登出的事件通知器。

bool disable

是否在 EC 上停用相應的事件。

描述

登出事件通知器。如果通知器未標記為觀察者,則遞減關聯 SAM 事件的使用計數器。如果使用計數器達到零並且 disable 等於 true,則將停用該事件。

對於熱插拔裝置很有用,一旦裝置已物理移除,通訊可能會失敗。在這種情況下,指定 disablefalse 可避免與 EC 通訊。

返回值

成功時返回零,如果給定的通知器塊尚未在控制器上註冊,則返回 -ENOENT。如果給定的通知器塊是與其特定事件關聯的最後一個通知器塊,則返回事件停用 EC 命令的狀態。

int ssam_controller_event_enable(struct ssam_controller *ctrl, struct ssam_event_registry reg, struct ssam_event_id id, u8 flags)

啟用指定的事件。

引數

struct ssam_controller *ctrl

要為其啟用事件的控制器。

struct ssam_event_registry reg

用於啟用事件的事件登錄檔。

struct ssam_event_id id

指定要啟用的事件的事件 ID。

u8 flags

用於啟用事件的 SAM 事件標誌。

描述

遞增指定事件的事件引用計數。如果該事件之前未被啟用,則將透過此呼叫啟用它。

請注意

通常,對於啟用/停用事件,應優先使用帶有非觀察者通知器的 ssam_notifier_register(),因為這將保證在事件啟用/停用期間發生錯誤時能夠正確排序和轉發事件。

返回值

成功時返回零,如果指定事件的引用計數已達到其最大值,則返回 -ENOSPC,如果無法分配相應的事件條目,則返回 -ENOMEM。如果這是第一次啟用此事件(即,此呼叫將引用計數從零遞增到一),則返回事件啟用 EC 命令的狀態。

int ssam_controller_event_disable(struct ssam_controller *ctrl, struct ssam_event_registry reg, struct ssam_event_id id, u8 flags)

停用指定的事件。

引數

struct ssam_controller *ctrl

要為其停用事件的控制器。

struct ssam_event_registry reg

用於停用事件的事件登錄檔。

struct ssam_event_id id

指定要停用的事件的事件 ID。

u8 flags

啟用事件時使用的標誌。

描述

遞減指定事件的引用計數。如果引用計數達到零,則將停用該事件。

請注意

通常,對於啟用/停用事件,應優先使用帶有非觀察者通知器的 ssam_notifier_register()/ssam_notifier_unregister(),因為這將保證在事件啟用/停用期間發生錯誤時能夠正確排序和轉發事件。

返回值

成功時返回零,如果給定的事件未在控制器上啟用,則返回 -ENOENT。如果在呼叫期間事件的引用計數達到零,則返回事件停用 EC 命令的狀態。

struct ssam_controller *ssam_get_controller(void)

獲取對 SSAM 控制器的引用。

引數

void

無引數

描述

返回對系統 SSAM 控制器的引用;如果不存在,尚未設定或已被登出,則返回 NULL。此函式自動遞增控制器的引用計數,因此呼叫方必須確保在不再需要控制器時呼叫 ssam_controller_put()

將任意客戶端裝置連結到控制器。

引數

struct ssam_controller *c

要連結到的控制器。

struct device *client

客戶端裝置。

描述

透過在其作為消費者和控制器裝置作為提供者之間建立裝置連結,將任意客戶端裝置連結到控制器。此函式可用於非 SSAM 裝置(或未註冊為控制器下的子裝置的 SSAM 裝置),以保證只要客戶端裝置的驅動程式已繫結,控制器就有效,並且保證了正確的掛起和恢復順序。

裝置連結不必手動銷燬。一旦客戶端裝置的驅動程式解除繫結,它就會自動刪除。

返回值

成功時返回零,如果控制器未準備好或即將被刪除,則返回 -ENODEV,如果由於其他原因無法建立裝置連結,則返回 -ENOMEM

struct ssam_controller *ssam_client_bind(struct device *client)

將任意客戶端裝置繫結到控制器。

引數

struct device *client

客戶端裝置。

描述

透過在其作為消費者和主控制器裝置作為提供者之間建立裝置連結,將任意客戶端裝置連結到控制器。此函式可用於非 SSAM 裝置,以保證只要客戶端裝置的驅動程式已繫結,由此函式返回的控制器就有效,並且保證了正確的掛起和恢復順序。

此函式基本上與 ssam_client_link() 相同,除了它首先獲取主控制器引用,然後建立連結,最後返回此引用。請注意,此函式不會遞增控制器的引用計數,因為由於連結,只要客戶端裝置的驅動程式已繫結,就可以保證控制器的生命週期。

如果不首先透過 ssam_controller_get() 遞增控制器的引用計數,則使用此方法獲得的控制器引用在驅動程式繫結到呼叫此函式時所繫結的客戶端裝置之外無效。即使這樣做之後,也必須注意,只有當控制器處於活動狀態且未掛起時,才能提交請求和(取消)註冊通知器。換句話說:裝置連結僅在客戶端驅動程式繫結時存在,並且此連結強制執行的任何保證(例如,活動控制器狀態)只能在此連結存在時依賴,並且之後可能需要以其他方式強制執行。

建立的裝置連結不必手動銷燬。一旦客戶端裝置的驅動程式解除繫結,它就會自動刪除。

返回值

成功時返回控制器,如果控制器不存在、未準備好或即將被刪除,則返回帶有 -ENODEV 的錯誤指標,如果由於其他原因無法建立裝置連結,則返回 -ENOMEM

客戶端匯流排和客戶端裝置 API

enum ssam_device_domain

SAM 裝置域。

常量

SSAM_DOMAIN_VIRTUAL

虛擬裝置。

SSAM_DOMAIN_SERIALHUB

透過 Surface Serial Hub 連線的物理裝置。

enum ssam_virtual_tc

虛擬 SAM 域的目標類別。

常量

SSAM_VIRTUAL_TC_HUB

裝置集線器類別。

struct ssam_device_uid

SSAM 裝置的唯一識別符號。

定義:

struct ssam_device_uid {
    u8 domain;
    u8 category;
    u8 target;
    u8 instance;
    u8 function;
};

成員

domain

裝置的域。

category

裝置的目標類別。

target

裝置的目標 ID。

instance

裝置的例項 ID。

function

裝置的子功能。此欄位可用於將單個 SAM 裝置拆分為多個虛擬子裝置,以分離該裝置的不同功能,並允許每個功能使用一個驅動程式。

SSAM_DEVICE

SSAM_DEVICE (d, cat, tid, iid, fun)

使用給定的引數初始化 struct ssam_device_id

引數

d

裝置的域。

cat

裝置的目標類別。

tid

裝置的目標 ID。

iid

裝置的例項 ID。

fun

裝置的子功能。

描述

使用給定的引數初始化 struct ssam_device_id。有關引數的詳細資訊,請參閱 struct ssam_device_uid。特殊值 SSAM_SSH_TID_ANYSSAM_SSH_IID_ANYSSAM_SSH_FUN_ANY 可用於指定匹配應分別忽略目標 ID、例項 ID 和/或子功能。此宏基於給定的引數初始化 match_flags 欄位。

請注意

引數 dcat 必須是有效的 u8 值,引數 tidiidfun 必須是有效的 u8 值或 SSAM_SSH_TID_ANYSSAM_SSH_IID_ANYSSAM_SSH_FUN_ANY。不允許使用其他非 u8 值。

SSAM_VDEV

SSAM_VDEV (cat, tid, iid, fun)

使用給定的引數將 struct ssam_device_id 初始化為虛擬裝置。

引數

cat

裝置的目標類別。

tid

裝置的目標 ID。

iid

裝置的例項 ID。

fun

裝置的子功能。

描述

使用虛擬域中給定的引數初始化 struct ssam_device_id。有關引數的詳細資訊,請參閱 struct ssam_device_uid。特殊值 SSAM_SSH_TID_ANYSSAM_SSH_IID_ANYSSAM_SSH_FUN_ANY 可用於指定匹配應分別忽略目標 ID、例項 ID 和/或子功能。此宏基於給定的引數初始化 match_flags 欄位。

請注意

引數 cat 必須是有效的 u8 值,引數 tidiidfun 必須是有效的 u8 值或 SSAM_SSH_TID_ANYSSAM_SSH_IID_ANYSSAM_SSH_FUN_ANY。不允許使用其他非 u8 值。

SSAM_SDEV

SSAM_SDEV (cat, tid, iid, fun)

使用給定的引數將 struct ssam_device_id 初始化為物理 SSH 裝置。

引數

cat

裝置的目標類別。

tid

裝置的目標 ID。

iid

裝置的例項 ID。

fun

裝置的子功能。

描述

使用 SSH 域中給定的引數初始化 struct ssam_device_id。有關引數的詳細資訊,請參閱 struct ssam_device_uid。特殊值 SSAM_SSH_TID_ANYSSAM_SSH_IID_ANYSSAM_SSH_FUN_ANY 可用於指定匹配應分別忽略目標 ID、例項 ID 和/或子功能。此宏基於給定的引數初始化 match_flags 欄位。

請注意

引數 cat 必須是有效的 u8 值,引數 tidiidfun 必須是有效的 u8 值或 SSAM_SSH_TID_ANYSSAM_SSH_IID_ANYSSAM_SSH_FUN_ANY。不允許使用其他非 u8 值。

struct ssam_device

SSAM 客戶端裝置。

定義:

struct ssam_device {
    struct device dev;
    struct ssam_controller *ctrl;
    struct ssam_device_uid uid;
    unsigned long flags;
};

成員

dev

裝置的驅動程式模型表示。

ctrl

SSAM 控制器管理此裝置。

uid

標識裝置的 UID。

flags

裝置狀態標誌,請參閱 enum ssam_device_flags

struct ssam_device_driver

SSAM 客戶端裝置驅動程式。

定義:

struct ssam_device_driver {
    struct device_driver driver;
    const struct ssam_device_id *match_table;
    int (*probe)(struct ssam_device *sdev);
    void (*remove)(struct ssam_device *sdev);
};

成員

driver

基本驅動程式模型結構。

match_table

匹配表,指定驅動程式應繫結到哪些裝置。

probe

當驅動程式繫結到裝置時呼叫。

remove

當驅動程式從裝置解除繫結時呼叫。

bool is_ssam_device(struct device *d)

檢查給定的裝置是否為 SSAM 客戶端裝置。

引數

struct device *d

要測試其型別的裝置。

返回值

如果指定的裝置型別為 struct ssam_device,即裝置型別指向 ssam_device_type,則返回 true,否則返回 false

to_ssam_device

to_ssam_device (d)

將給定的裝置強制轉換為 SSAM 客戶端裝置。

引數

d

要強制轉換的裝置。

描述

將給定的 struct device 強制轉換為 struct ssam_device。呼叫方必須確保給定的裝置實際上包含在 struct ssam_device 中,例如,透過呼叫 is_ssam_device()

返回值

返回指向包裝給定裝置 dstruct ssam_device 的指標。

to_ssam_device_driver

to_ssam_device_driver (d)

將給定的裝置驅動程式強制轉換為 SSAM 客戶端裝置驅動程式。

引數

d

要強制轉換的驅動程式。

描述

將給定的 struct device_driver 強制轉換為 struct ssam_device_driver。呼叫方必須確保給定的驅動程式實際上包含在 struct ssam_device_driver 中。

返回值

返回指向包裝給定裝置驅動程式 dstruct ssam_device_driver 的指標。

void ssam_device_mark_hot_removed(struct ssam_device *sdev)

將給定的裝置標記為熱移除。

引數

struct ssam_device *sdev

要標記為熱移除的裝置。

描述

將裝置標記為已熱移除。這會向使用該裝置的驅動程式發出訊號,表明應避免與該裝置通訊,並且可能會導致超時。

bool ssam_device_is_hot_removed(struct ssam_device *sdev)

檢查給定的裝置是否已熱移除。

引數

struct ssam_device *sdev

要檢查的裝置。

描述

檢查給定的裝置是否已被標記為熱移除。 詳情請參閱 ssam_device_mark_hot_removed()

返回值

如果裝置已被標記為熱移除,則返回 true

struct ssam_device *ssam_device_get(struct ssam_device *sdev)

增加 SSAM 客戶端裝置的引用計數。

引數

struct ssam_device *sdev

要增加引用計數的裝置。

描述

透過使用 get_device() 增加所包含的 struct device 的引用計數,從而增加給定 SSAM 客戶端裝置的引用計數。

此函式的對應部分請參閱 ssam_device_put()

返回值

返回作為輸入提供的裝置。

void ssam_device_put(struct ssam_device *sdev)

減少 SSAM 客戶端裝置的引用計數。

引數

struct ssam_device *sdev

要減少引用計數的裝置。

描述

透過使用 put_device() 減少所包含的 struct device 的引用計數,從而減少給定 SSAM 客戶端裝置的引用計數。

此函式的對應部分請參閱 ssam_device_get()

void *ssam_device_get_drvdata(struct ssam_device *sdev)

獲取 SSAM 客戶端裝置的驅動程式資料。

引數

struct ssam_device *sdev

要從中獲取驅動程式資料的裝置。

返回值

返回給定裝置的驅動程式資料,該資料之前透過 ssam_device_set_drvdata() 設定。

void ssam_device_set_drvdata(struct ssam_device *sdev, void *data)

設定 SSAM 客戶端裝置的驅動程式資料。

引數

struct ssam_device *sdev

要設定驅動程式資料的裝置。

void *data

要將裝置的驅動程式資料指標設定為的資料。

ssam_device_driver_register

ssam_device_driver_register (drv)

註冊 SSAM 客戶端裝置驅動程式。

引數

drv

要註冊的驅動程式。

module_ssam_device_driver

module_ssam_device_driver (drv)

用於 SSAM 裝置驅動程式註冊的輔助宏。

引數

drv

由此模組管理的驅動程式。

描述

輔助宏,用於透過 module_init()module_exit() 註冊 SSAM 裝置驅動程式。 此宏每個模組只能使用一次,並取代上述定義。

int ssam_register_clients(struct device *dev, struct ssam_controller *ctrl)

註冊在給定父裝置下定義的所有客戶端裝置。

引數

struct device *dev

應在其下注冊客戶端的父裝置。

struct ssam_controller *ctrl

客戶端應註冊到的控制器。

描述

註冊所有已透過韌體節點定義為給定(父)裝置的子裝置的客戶端。 各個子韌體節點將與相應建立的子裝置相關聯。

給定的控制器將用於例項化新裝置。 詳情請參閱 ssam_device_add()

返回值

成功時返回零,失敗時返回非零值。

int ssam_device_register_clients(struct ssam_device *sdev)

註冊在給定 SSAM 父裝置下定義的所有客戶端裝置。

引數

struct ssam_device *sdev

應在其下注冊客戶端的父裝置。

描述

註冊所有已透過韌體節點定義為給定(父)裝置的子裝置的客戶端。 各個子韌體節點將與相應建立的子裝置相關聯。

父裝置使用的控制器將用於例項化新裝置。 詳情請參閱 ssam_device_add()

返回值

成功時返回零,失敗時返回非零值。

SSAM_DEFINE_SYNC_REQUEST_CL_N

SSAM_DEFINE_SYNC_REQUEST_CL_N (name, spec...)

定義不帶引數且不帶返回值的同步客戶端裝置 SAM 請求函式。

引數

name

生成的函式的名稱。

spec...

定義請求的規範(struct ssam_request_spec_md)。

描述

定義一個函式,用於執行由 spec 指定的同步 SAM 請求,該請求不帶引數且不帶返回值。 裝置指定引數不是硬編碼的,而是透過客戶端裝置提供的,特別是它的 UID,該 UID 在呼叫此函式時提供。 生成的函式負責設定請求結構、緩衝區分配以及請求本身的執行,並在請求完全完成後返回。 所需的傳輸緩衝區將在堆疊上分配。

生成的函式定義為 static int name(struct ssam_device *sdev),返回請求的狀態,成功時為零,失敗時為負數。 sdev 引數同時指定請求的目標裝置,並透過關聯指定傳送請求的控制器。

有關生成函式行為的更多詳細資訊,請參閱 ssam_request_do_sync_onstack()

SSAM_DEFINE_SYNC_REQUEST_CL_W

SSAM_DEFINE_SYNC_REQUEST_CL_W (name, atype, spec...)

定義帶引數的同步客戶端裝置 SAM 請求函式。

引數

name

生成的函式的名稱。

atype

請求的引數的型別。

spec...

定義請求的規範(struct ssam_request_spec_md)。

描述

定義一個函式,用於執行由 spec 指定的同步 SAM 請求,該請求採用 atype 型別的引數且不帶返回值。 裝置指定引數不是硬編碼的,而是透過客戶端裝置提供的,特別是它的 UID,該 UID 在呼叫此函式時提供。 生成的函式負責設定請求結構、緩衝區分配以及請求本身的執行,並在請求完全完成後返回。 所需的傳輸緩衝區將在堆疊上分配。

生成的函式定義為 static int name(struct ssam_device *sdev, const atype *arg),返回請求的狀態,成功時為零,失敗時為負數。 sdev 引數同時指定請求的目標裝置,並透過關聯指定傳送請求的控制器。 請求的引數透過 arg 指標指定。

有關生成函式行為的更多詳細資訊,請參閱 ssam_request_do_sync_onstack()

SSAM_DEFINE_SYNC_REQUEST_CL_R

SSAM_DEFINE_SYNC_REQUEST_CL_R (name, rtype, spec...)

定義帶返回值的同步客戶端裝置 SAM 請求函式。

引數

name

生成的函式的名稱。

rtype

請求的返回值的型別。

spec...

定義請求的規範(struct ssam_request_spec_md)。

描述

定義一個函式,用於執行由 spec 指定的同步 SAM 請求,該請求不帶引數但具有 rtype 型別的返回值。 裝置指定引數不是硬編碼的,而是透過客戶端裝置提供的,特別是它的 UID,該 UID 在呼叫此函式時提供。 生成的函式負責設定請求結構、緩衝區分配以及請求本身的執行,並在請求完全完成後返回。 所需的傳輸緩衝區將在堆疊上分配。

生成的函式定義為 static int name(struct ssam_device *sdev, rtype *ret),返回請求的狀態,成功時為零,失敗時為負數。 sdev 引數同時指定請求的目標裝置,並透過關聯指定傳送請求的控制器。 請求的返回值寫入到 ret 引數指向的記憶體中。

有關生成函式行為的更多詳細資訊,請參閱 ssam_request_do_sync_onstack()

SSAM_DEFINE_SYNC_REQUEST_CL_WR

SSAM_DEFINE_SYNC_REQUEST_CL_WR (name, atype, rtype, spec...)

定義帶引數和返回值的同步客戶端裝置 SAM 請求函式。

引數

name

生成的函式的名稱。

atype

請求的引數的型別。

rtype

請求的返回值的型別。

spec...

定義請求的規範(struct ssam_request_spec_md)。

描述

定義一個函式,用於執行由 spec 指定的同步 SAM 請求,該請求採用 atype 型別的引數且具有 rtype 型別的返回值。 裝置指定引數不是硬編碼的,而是透過客戶端裝置提供的,特別是它的 UID,該 UID 在呼叫此函式時提供。 生成的函式負責設定請求結構、緩衝區分配以及請求本身的執行,並在請求完全完成後返回。 所需的傳輸緩衝區將在堆疊上分配。

生成的函式定義為 static int name(struct ssam_device *sdev, const atype *arg, rtype *ret),返回請求的狀態,成功時為零,失敗時為負數。 sdev 引數同時指定請求的目標裝置,並透過關聯指定傳送請求的控制器。 請求的引數透過 arg 指標指定。 請求的返回值寫入到 ret 引數指向的記憶體中。

有關生成函式行為的更多詳細資訊,請參閱 ssam_request_do_sync_onstack()

int ssam_device_notifier_register(struct ssam_device *sdev, struct ssam_event_notifier *n)

為指定的客戶端設備註冊事件通知程式。

引數

struct ssam_device *sdev

通知程式應註冊到的裝置。

struct ssam_event_notifier *n

要註冊的事件通知器。

描述

註冊事件通知器。如果通知器未標記為觀察者,則遞增關聯 SAM 事件的使用計數器。如果事件未標記為觀察者,並且當前未啟用,則將在本次呼叫期間啟用它。如果通知器被標記為觀察者,則不會嘗試啟用任何事件,也不會修改任何引用計數。

標記為觀察者的通知器不需要與一個特定的事件相關聯,即,只要不執行任何事件匹配,則只需要設定事件目標類別。

返回值

成功時返回零,如果與註冊的通知程式塊關聯的事件 ID/型別已經有 INT_MAX 個通知程式,則返回 -ENOSPC,如果無法分配相應的事件條目,則返回 -ENOMEM,如果裝置被標記為熱移除,則返回 -ENODEV。 如果這是第一次為特定關聯的事件註冊通知程式塊,則返回事件啟用 EC 命令的狀態。

int ssam_device_notifier_unregister(struct ssam_device *sdev, struct ssam_event_notifier *n)

取消註冊指定客戶端裝置的事件通知程式。

引數

struct ssam_device *sdev

通知程式已註冊到的裝置。

struct ssam_event_notifier *n

要登出的事件通知器。

描述

登出事件通知器。如果通知器未標記為觀察者,則遞減關聯 SAM 事件的使用計數器。如果使用計數器達到零,則將停用該事件。

如果裝置已被標記為熱移除,則不會在 EC 上停用事件,因為在這些情況下,任何執行此操作的嘗試都可能超時。

返回值

成功時返回零,如果給定的通知器塊尚未在控制器上註冊,則返回 -ENOENT。如果給定的通知器塊是與其特定事件關聯的最後一個通知器塊,則返回事件停用 EC 命令的狀態。

struct ssam_device *ssam_device_alloc(struct ssam_controller *ctrl, struct ssam_device_uid uid)

分配並初始化 SSAM 客戶端裝置。

引數

struct ssam_controller *ctrl

應在其下新增裝置的控制器。

struct ssam_device_uid uid

要新增的裝置的 UID。

描述

分配並初始化新的客戶端裝置。 裝置的父裝置將設定為控制器裝置,名稱將基於 UID 設定。 請注意,仍然必須透過 ssam_device_add() 新增該裝置。 有關更多詳細資訊,請參閱該函式。

返回值

返回新分配和初始化的 SSAM 客戶端裝置,如果無法分配,則返回 NULL

int ssam_device_add(struct ssam_device *sdev)

新增 SSAM 客戶端裝置。

引數

struct ssam_device *sdev

要新增的 SSAM 客戶端裝置。

描述

必須保證新增的客戶端裝置始終具有有效的且處於活動狀態的控制器。 因此,如果裝置的控制器尚未初始化、已掛起或已關閉,則此函式將失敗並返回 -ENODEV

此函式的呼叫方應確保在控制器關閉之前發出對 ssam_device_remove() 的相應呼叫。 如果新增的裝置是控制器裝置的直接子裝置(預設),則會在控制器關閉時自動刪除該裝置。

預設情況下,控制器裝置將成為新建立的客戶端裝置的父裝置。 可以在呼叫 ssam_device_add 之前更改父裝置,但必須注意 a) 保證正確的掛起/恢復順序,並且 b) 客戶端裝置的生存期不會超過控制器,即在關閉控制器之前刪除裝置。 如果必須手動強制執行這些保證,請參閱 ssam_client_link()ssam_client_bind() 函式,這些函式旨在為此目的設定裝置連結。

返回值

成功時返回零,失敗時返回負錯誤程式碼。

void ssam_device_remove(struct ssam_device *sdev)

刪除 SSAM 客戶端裝置。

引數

struct ssam_device *sdev

要刪除的裝置。

描述

刪除並取消註冊提供的 SSAM 客戶端裝置。

const struct ssam_device_id *ssam_device_id_match(const struct ssam_device_id *table, const struct ssam_device_uid uid)

查詢給定 UID 的匹配 ID 表條目。

引數

const struct ssam_device_id *table

要在其中搜索的表。

const struct ssam_device_uid uid

要與各個表條目匹配的 UID。

描述

在提供的 ID 表中查詢提供的裝置 UID 的第一個匹配項並返回它。 如果找不到匹配項,則返回 NULL

const struct ssam_device_id *ssam_device_get_match(const struct ssam_device *dev)

查詢並返回已繫結驅動程式的 ID 表中與裝置匹配的 ID。

引數

const struct ssam_device *dev

用於獲取匹配 ID 表項的裝置。

描述

在當前繫結的驅動程式的 ID 表中查詢裝置的 UID 的第一個匹配項並返回它。如果裝置沒有繫結驅動程式,驅動程式沒有 match_table(即它是 NULL),或者驅動程式的 match_table 中沒有匹配項,則返回 NULL

此函式本質上使用繫結裝置驅動程式的 ID 表和裝置的 UID 呼叫 ssam_device_id_match()

返回值

返回裝置驅動程式的匹配表中裝置 UID 的第一個匹配項,如果找不到這樣的匹配項,則返回 NULL

const void *ssam_device_get_match_data(const struct ssam_device *dev)

在繫結驅動程式的 ID 表中查詢與裝置匹配的 ID,並返回其 driver_data 成員。

引數

const struct ssam_device *dev

用於獲取匹配資料的裝置。

描述

在相應驅動程式的 ID 表中查詢裝置 UID 的第一個匹配項,並返回其 driver_data。如果裝置沒有繫結驅動程式,驅動程式沒有 match_table(即它是 NULL),驅動程式的 match_table 中沒有匹配項,或者匹配項沒有任何 driver_data,則返回 NULL

此函式本質上呼叫 ssam_device_get_match(),如果找到任何匹配項,則返回其 struct ssam_device_id.driver_data 成員。

返回值

返回與裝置驅動程式的匹配表中裝置 UID 的第一個匹配項關聯的驅動程式資料,如果找不到這樣的匹配項,則返回 NULL

int __ssam_device_driver_register(struct ssam_device_driver *sdrv, struct module *owner)

註冊 SSAM 客戶端裝置驅動程式。

引數

struct ssam_device_driver *sdrv

要註冊的驅動程式。

struct module *owner

擁有提供的驅動程式的模組。

描述

請參閱 ssam_device_driver_register() 宏,瞭解從其所屬模組內部註冊驅動程式的常用方法。

void ssam_device_driver_unregister(struct ssam_device_driver *sdrv)

登出 SSAM 裝置驅動程式。

引數

struct ssam_device_driver *sdrv

要登出的驅動程式。

int __ssam_register_clients(struct device *parent, struct ssam_controller *ctrl, struct fwnode_handle *node)

將給定韌體節點下定義的客戶端設備註冊為給定裝置的子裝置。

引數

struct device *parent

應在其下注冊客戶端的父裝置。

struct ssam_controller *ctrl

客戶端應註冊到的控制器。

struct fwnode_handle *node

儲存要新增的裝置定義的韌體節點。

描述

將所有已定義為給定根韌體節點的子節點的客戶端註冊為給定父裝置的子裝置。相應的子韌體節點將與相應建立的子裝置相關聯。

給定的控制器將用於例項化新裝置。 詳情請參閱 ssam_device_add()

請注意,通常應首選使用 ssam_device_register_clients()ssam_register_clients(),因為它們直接使用與給定裝置關聯的韌體節點和/或控制器。 此函式僅用於需要組合不同的裝置規範(例如 ACPI 和韌體節點)時(就像在設備註冊表的平臺中心中完成的那樣)。

返回值

成功時返回零,失敗時返回非零值。

void ssam_remove_clients(struct device *dev)

刪除註冊為給定父裝置下直接子裝置的 SSAM 客戶端裝置。

引數

struct device *dev

要刪除所有直接客戶端的(父)裝置。

描述

刪除註冊為給定裝置下直接子裝置的所有 SSAM 客戶端裝置。請注意,這僅適用於裝置的直接子裝置。有關更多詳細資訊,請參閱 ssam_device_add()/ssam_device_remove()