內部 API 文件¶
資料包傳輸層¶
-
struct sshp_buf¶
用於 SSH 訊息的解析器緩衝區。
定義:
struct sshp_buf {
u8 *ptr;
size_t len;
size_t cap;
};
成員
ptr指向緩衝區開頭的指標。
len緩衝區中使用的位元組數。
cap緩衝區的最大容量。
引數
struct sshp_buf *buf要初始化的緩衝區。
u8 *ptr支援緩衝區的記憶體。
size_t cap支援緩衝區的記憶體長度,即其容量。
描述
使用給定的記憶體作為後備初始化緩衝區,並將其已用長度設定為零。
引數
struct sshp_buf *buf要初始化/分配到的緩衝區。
size_t cap緩衝區的所需容量。
gfp_t flags用於分配記憶體的標誌。
描述
分配 cap 位元組,並使用分配的記憶體初始化提供的緩衝區結構。
返回
成功返回零,如果分配失敗,則返回 -ENOMEM。
引數
struct sshp_buf *buf要釋放的緩衝區。
描述
透過釋放支援它的記憶體,然後將其指標重置為 NULL 並將長度和容量重置為零來釋放 SSH 解析器緩衝區。旨在釋放先前使用 sshp_buf_alloc() 分配的緩衝區。
引數
struct sshp_buf *buf要從中刪除資料的緩衝區。
size_t n要刪除的位元組數。
描述
從緩衝區中刪除前 n 個位元組。將任何剩餘資料重新對齊到緩衝區的開頭。
引數
struct sshp_buf *buf要將資料寫入的緩衝區。
struct kfifo *fifo要從中讀取資料的 fifo。
描述
將 fifo 中包含的資料傳輸到緩衝區,並從 fifo 中刪除它。此函式將嘗試傳輸儘可能多的資料,這受到緩衝區中剩餘空間或 fifo 中可用位元組數的限制。
返回
返回傳輸的位元組數。
-
void sshp_buf_span_from(struct sshp_buf *buf, size_t offset, struct ssam_span *span)¶
從給定的緩衝區和偏移量初始化 span。
引數
struct sshp_buf *buf要從中建立 span 的緩衝區。
size_t offsetspan 應在緩衝區中開始的偏移量。
struct ssam_span *span要初始化的 span (輸出)。
描述
初始化提供的 span 以指向緩衝區中給定偏移量的記憶體,span 的長度由偏移量後緩衝區中使用的位元組數(即偏移量後剩餘的位元組數)限制。
警告:此函式不驗證 offset 是否小於或等於緩衝區中使用的位元組數或緩衝區容量。這必須由呼叫者保證。
引數
const struct ssam_span *src應該計算 CRC 的資料 span。
const u8 *crc指向預期 u16 CRC 值的指標。
描述
計算提供的資料 span (src) 的 CRC,將其與儲存在給定地址 (crc) 的 CRC 進行比較,並返回此比較的結果,即如果相等則返回 true。此函式旨在對原始輸入/訊息資料執行。
返回
如果計算的 CRC 與儲存的 CRC 匹配,則返回 true,否則返回 false。
引數
const struct ssam_span *src要檢查開頭的資料 span。
-
bool sshp_find_syn(const struct ssam_span *src, struct ssam_span *rem)¶
在給定的資料 span 中查詢 SSH SYN 位元組。
引數
const struct ssam_span *src要在其中搜索的資料 span。
struct ssam_span *remspan (輸出) 指示剩餘資料,如果找到,則以 SSH SYN 位元組開頭。
描述
在給定的源 span 中搜索 SSH SYN 位元組。如果找到,則將 rem span 設定為剩餘資料,以第一個 SYN 位元組開頭,並以源 span 長度為上限,並返回 true。此函式不復制任何資料,而是僅設定指向各自起始地址和長度值的指標。
如果找不到 SSH SYN 位元組,則將 rem span 設定為源 span 末尾的零長度 span,並返回 false。
如果在源 span 的末尾找到部分 SSH SYN 位元組,則將 rem span 設定為覆蓋這些部分 SYN 位元組,以源 span 的末尾為上限,並返回 false。一旦更多資料可用,應再次執行此函式。
返回
如果找到完整的 SSH SYN 序列,則返回 true,否則返回 false。
-
int sshp_parse_frame(const struct device *dev, const struct ssam_span *source, struct ssh_frame **frame, struct ssam_span *payload, size_t maxlen)¶
解析 SSH 幀。
引數
const struct device *dev用於日誌記錄的裝置。
const struct ssam_span *source從中解析的源。
struct ssh_frame **frame解析的幀(輸出)。
struct ssam_span *payload解析的有效負載(輸出)。
size_t maxlen支援的最大訊息長度。
描述
從給定的源解析和驗證 SSH 幀,包括其有效負載。將提供的 frame 指標設定為幀的開頭,並將幀有效負載的限制寫入提供的 payload span 指標。
此函式不復制任何資料,而是僅驗證訊息資料並設定指標(和長度值)以指示各個部分。
如果找不到完整的 SSH 幀,則幀指標將設定為 NULL 指標,有效負載 span 將設定為 null span(起始指標 NULL,大小為零)。
返回
如果幀不完整,則返回零;如果訊息的開頭無效,則返回 -ENOMSG;如果任何(幀頭或有效負載)CRC 無效,則返回 -EBADMSG;如果 SSH 訊息大於 maxlen 引數中指定的最大訊息長度,則返回 -EMSGSIZE。
-
int sshp_parse_command(const struct device *dev, const struct ssam_span *source, struct ssh_command **command, struct ssam_span *command_data)¶
解析 SSH 命令幀有效負載。
引數
const struct device *dev用於日誌記錄的裝置。
const struct ssam_span *source從中解析的源。
struct ssh_command **command解析的命令(輸出)。
struct ssam_span *command_data解析的命令資料/有效負載(輸出)。
描述
解析並驗證 SSH 命令幀有效負載。將 command 指標設定為命令頭,將 command_data span 設定為命令資料(即命令的有效負載)。如果命令沒有任何關聯的資料/有效負載,這將導致零長度 span。此函式不檢查 frame-payload-type 欄位,呼叫者應在呼叫此函式之前檢查該欄位。
source 引數應該是完整的幀有效負載,例如由 sshp_parse_frame() 命令返回的。
此函式不復制任何資料,而是僅驗證幀有效負載資料並設定指標(和長度值)以指示各個部分。
返回
如果 source 不表示有效的命令型別幀有效負載,即太短,則返回零;如果 source 不表示有效的命令型別幀有效負載,即太短,則返回 -ENOMSG。
-
struct msgbuf¶
用於構造 SSH 訊息的緩衝區結構。
定義:
struct msgbuf {
u8 *begin;
u8 *end;
u8 *ptr;
};
成員
begin指向已分配緩衝區空間開頭的指標。
end指向已分配緩衝區空間末尾(最後一個元素之後的一個位置)的指標。
ptrPointer
引數
struct msgbuf *msgb要初始化的緩衝區結構
u8 *ptrPointer
size_t capSize
描述
使用提供的記憶體作為後備初始化給定的訊息緩衝區結構。
引數
const struct msgbuf *msgb訊息緩衝區。
引數
struct msgbuf *msgb訊息緩衝區。
u16 value要推送到緩衝區的值。
引數
struct msgbuf *msgb訊息緩衝區。
引數
struct msgbuf *msgb訊息緩衝區。
const u8 *buf要推送到緩衝區的資料。
size_t len要推送到緩衝區的資料的長度。
引數
struct msgbuf *msgb訊息緩衝區。
const u8 *bufConst
size_t lenThe
引數
struct msgbuf *msgbThe
u8 ty幀的型別。
u16 len幀的有效負載的長度。
u8 seq幀/資料包的序列 ID。
引數
struct msgbuf *msgbThe
u8 seq要 ACK 的幀/資料包的序列 ID。
引數
struct msgbuf *msgbThe
-
void msgb_push_cmd(struct msgbuf *msgb, u8 seq, u16 rqid, const struct ssam_request *rqst)¶
將帶有有效負載的 SSH 命令幀推送到緩衝區。
引數
struct msgbuf *msgb訊息緩衝區。
u8 seq幀/資料包的序列 ID (SEQ)。
u16 rqid幀中包含的請求的請求 ID (RQID)。
const struct ssam_request *rqst要包裝在幀中的請求。
-
enum ssh_ptl_state_flags¶
struct ssh_ptl的狀態標誌。
常量
SSH_PTL_SF_SHUTDOWN_BIT指示資料包傳輸層已關閉或正在關閉,不應接受任何新資料包/資料。
-
struct ssh_ptl_ops¶
資料包傳輸層的回撥操作。
定義:
struct ssh_ptl_ops {
void (*data_received)(struct ssh_ptl *p, const struct ssam_span *data);
};
成員
data_received在收到資料包時呼叫的函式。接收資料包的資料包層和資料包的有效負載資料都提供給此函式。
-
struct ssh_ptl¶
SSH 資料包傳輸層。
定義:
struct ssh_ptl {
struct serdev_device *serdev;
unsigned long state;
struct {
spinlock_t lock;
struct list_head head;
} queue;
struct {
spinlock_t lock;
struct list_head head;
atomic_t count;
} pending;
struct {
atomic_t running;
struct task_struct *thread;
struct completion thread_cplt_tx;
struct completion thread_cplt_pkt;
struct wait_queue_head packet_wq;
} tx;
struct {
struct task_struct *thread;
struct wait_queue_head wq;
struct kfifo fifo;
struct sshp_buf buf;
struct {
u16 seqs[8];
u16 offset;
} blocked;
} rx;
struct {
spinlock_t lock;
ktime_t timeout;
ktime_t expires;
struct delayed_work reaper;
} rtx_timeout;
struct ssh_ptl_ops ops;
};
成員
serdev提供底層資料傳輸的序列裝置。
state傳輸層的狀態(標誌)。
queue資料包提交佇列。
queue.lock用於修改資料包提交佇列的鎖。
queue.head資料包提交佇列的列表頭。
pending掛起資料包的集合/列表。
pending.lock用於修改掛起集合的鎖。
pending.head待處理集合/列表的列表頭。
pending.count當前待處理資料包的數量。
tx傳送器子系統。
tx.running指示(期望的)傳送器執行緒狀態的標誌。
tx.thread傳送器執行緒。
tx.thread_cplt_tx用於等待傳輸的傳送器執行緒的完成。
tx.thread_cplt_pkt用於等待資料包的傳送器執行緒的完成。
tx.packet_wq資料包傳輸完成的等待佇列頭。
rx接收器子系統。
rx.thread接收器執行緒。
rx.wq接收器執行緒的等待佇列頭。
rx.fifo用於接收資料/將資料推送到接收器執行緒的緩衝區。
rx.buf用於評估接收器執行緒上的資料的緩衝區。
rx.blocked用於檢測重傳的最近/阻塞序列 ID 的列表。
rx.blocked.seqs阻塞序列 ID 的陣列。
rx.blocked.offset指示應插入新 ID 的偏移量。
rtx_timeout重傳超時子系統。
rtx_timeout.lock用於修改重傳超時 Reaper 的鎖。
rtx_timeout.timeout重傳的超時時間間隔。
rtx_timeout.expires指定下次安排 Reaper 工作的時間。
rtx_timeout.reaper執行超時檢查和後續操作的工作。
ops資料包層操作。
引數
struct ssh_ptl *ptl資料包傳輸層。
返回
返回給定的資料包傳輸層構建於其上的裝置。
引數
struct ssh_ptl *ptl資料包傳輸層。
描述
喚醒資料包傳送器執行緒,通知它底層傳輸有更多空間可用於傳輸資料。如果資料包傳輸層已關閉,則對此函式的呼叫將被忽略。
-
bool ssh_ptl_should_drop_ack_packet(void)¶
錯誤注入掛鉤以丟棄 ACK 資料包。
引數
void沒有引數
描述
有助於測試 EC 的自動重傳的檢測和處理。具體來說,是 EC 認為未 ACK 的資料包,但驅動程式已經認為是 ACKed 的資料包(由於丟棄的 ACK)。在這種情況下,EC 會重新傳輸要 ACK 的資料包,驅動程式應將其檢測為重複/已處理。請注意,驅動程式仍應為重新傳輸的資料包傳送 ACK。
-
bool ssh_ptl_should_drop_nak_packet(void)¶
錯誤注入掛鉤以丟棄 NAK 資料包。
引數
void沒有引數
描述
有助於測試/強制 EC 的自動(基於超時)重傳。具體來說,資料包尚未完全到達驅動程式/具有有效的校驗和。僅在與接收(注入的)錯誤資料結合使用時才有用。
-
bool ssh_ptl_should_drop_dsq_packet(void)¶
錯誤注入掛鉤以丟棄排序資料包。
引數
void沒有引數
描述
有助於測試驅動程式的重傳超時。如果在一定時間後未 ACK 資料包,驅動程式應重新傳輸該資料包,最多傳輸 SSH_PTL_MAX_PACKET_TRIES 中定義的次數。
-
int ssh_ptl_should_fail_write(void)¶
錯誤注入掛鉤以使 serdev_device_write() 失敗。
引數
void沒有引數
描述
用於模擬傳輸資料包時 serdev_device_write 中的錯誤的掛鉤。
-
bool ssh_ptl_should_corrupt_tx_data(void)¶
錯誤注入掛鉤以模擬傳送到 EC 的無效資料。
引數
void沒有引數
描述
用於模擬從主機(驅動程式)傳送到 EC 的損壞/無效資料的掛鉤。導致資料包資料被主動損壞,方法是用預定義的值覆蓋它,使其變為無效,導致 EC 以 NAK 資料包響應。有助於測試驅動程式接收到的 NAK 資料包的處理。
-
bool ssh_ptl_should_corrupt_rx_syn(void)¶
錯誤注入掛鉤以模擬 EC 傳送的無效資料。
引數
void沒有引數
描述
用於模擬無效 SYN 位元組的掛鉤,即無效的訊息開頭,並測試驅動程式中的處理方式。
-
bool ssh_ptl_should_corrupt_rx_data(void)¶
錯誤注入掛鉤以模擬 EC 傳送的無效資料。
引數
void沒有引數
描述
用於模擬訊息幀的無效資料/校驗和並測試驅動程式中的處理方式的掛鉤。
-
void ssh_packet_init(struct ssh_packet *packet, unsigned long type, u8 priority, const struct ssh_packet_ops *ops)¶
初始化 SSH 資料包。
引數
struct ssh_packet *packet要初始化的資料包。
unsigned long type資料包的型別標誌。
u8 priority資料包的優先順序。有關詳細資訊,請參閱
SSH_PACKET_PRIORITY()。const struct ssh_packet_ops *ops資料包操作。
描述
初始化給定的 SSH 資料包。將傳輸緩衝區指標設定為 NULL,並將傳輸緩衝區長度設定為零。對於資料型別的資料包,必須在提交之前透過 ssh_packet_set_data() 單獨設定此緩衝區,並且必須包含有效的 SSH 訊息,即具有任何型別的可選負載的幀。
-
int ssh_ctrl_packet_cache_init(void)¶
初始化控制資料包快取。
引數
void沒有引數
-
void ssh_ctrl_packet_cache_destroy(void)¶
取消初始化控制資料包快取。
引數
void沒有引數
-
int ssh_ctrl_packet_alloc(struct ssh_packet **packet, struct ssam_span *buffer, gfp_t flags)¶
從控制資料包快取分配資料包。
引數
struct ssh_packet **packet應儲存新分配的資料包的指標的位置。
struct ssam_span *buffer與此資料包對應的緩衝區。
gfp_t flags用於分配的標誌。
描述
從控制資料包快取分配資料包和相應的傳輸緩衝區。將資料包的緩衝區引用設定為已分配的緩衝區。必須透過 ssh_ctrl_packet_free() 釋放該資料包,這還將釋放相應的緩衝區。不得單獨釋放相應的緩衝區。旨在與 ssh_ptl_ctrl_packet_ops 作為資料包操作一起使用。
返回
成功時返回零,如果分配失敗,則返回 -ENOMEM。
-
void ssh_ctrl_packet_free(struct ssh_packet *p)¶
釋放從控制資料包快取分配的資料包。
引數
struct ssh_packet *p要釋放的資料包。
引數
struct ssh_ptl *ptl資料包傳輸層。
描述
喚醒資料包傳送器執行緒,通知它新資料包已到達並準備好傳輸。如果資料包傳輸層已關閉,則對此函式的呼叫將被忽略。
引數
struct ssh_ptl *ptl資料包傳輸層。
返回
成功時返回零,失敗時返回負錯誤程式碼。
引數
struct ssh_ptl *ptl資料包傳輸層。
返回
成功時返回零,失敗時返回負錯誤程式碼。
-
int ssh_ptl_submit(struct ssh_ptl *ptl, struct ssh_packet *p)¶
將資料包提交到傳輸層。
引數
struct ssh_ptl *ptl要將資料包提交到的資料包傳輸層。
struct ssh_packet *p要提交的資料包。
描述
將新資料包提交到傳輸層,將其排隊以進行傳送。此函式不應用於重新提交。
返回
成功時返回零,如果資料包欄位無效或資料包在提交之前已被取消,則返回 -EINVAL,如果資料包已被提交,則返回 -EALREADY,如果資料包傳輸層已關閉,則返回 -ESHUTDOWN。
-
void ssh_ptl_cancel(struct ssh_packet *p)¶
取消資料包。
引數
struct ssh_packet *p要取消的資料包。
描述
取消資料包。無法保證何時將呼叫完成和釋放回調。這可能在此函式執行期間發生,也可能在稍後的任何時間點發生。
請注意,如果另一個程序併發完成該資料包,則不能保證實際取消該資料包。此函式的唯一保證是資料包將在合理的時間範圍內完成(成功、失敗或取消)並從傳輸層釋放。
可以在提交資料包之前呼叫,在這種情況下,任何稍後的資料包提交都會失敗。
引數
struct ssh_ptl *ptl資料包傳輸層。
返回
成功時返回零,失敗時返回負錯誤程式碼。
引數
struct ssh_ptl *ptl資料包傳輸層。
返回
成功時返回零,失敗時返回負錯誤程式碼。
引數
struct ssh_ptl *ptl資料包傳輸層。
const u8 *buf指向要推送到層的資料的指標。
size_t n要推送到層的資料大小(以位元組為單位)。
描述
將來自下層傳輸的資料推送到資料包層的接收器 FIFO 緩衝區,並通知接收器執行緒。一旦資料包層已關閉,對此函式的呼叫將被忽略。
返回
成功時返回傳輸的位元組數(正數或零)。如果資料包層已關閉,則返回 -ESHUTDOWN。
引數
struct ssh_ptl *ptl資料包傳輸層。
描述
關閉資料包傳輸層,刪除和取消所有排隊和待處理的資料包。由此操作取消的資料包將以 -ESHUTDOWN 作為狀態完成。將停止接收器和傳送器執行緒。
作為此函式的結果,傳輸層將被標記為已關閉。在傳輸層已關閉後提交資料包將失敗並顯示 -ESHUTDOWN。
-
int ssh_ptl_init(struct ssh_ptl *ptl, struct serdev_device *serdev, struct ssh_ptl_ops *ops)¶
初始化資料包傳輸層。
引數
struct ssh_ptl *ptl要初始化的資料包傳輸層。
struct serdev_device *serdev底層序列裝置,即下層傳輸。
struct ssh_ptl_ops *ops資料包層操作。
描述
初始化給定的資料包傳輸層。在初始化資料包層並設定了下層傳輸層之後,必須透過 ssh_ptl_tx_start() 和 ssh_ptl_rx_start() 單獨啟動傳送器和接收器執行緒。
返回
成功時返回零,失敗時返回非零錯誤程式碼。
引數
struct ssh_ptl *ptl要取消初始化的資料包傳輸層。
描述
取消初始化給定的資料包傳輸層並釋放與之關聯的資源。如果已啟動接收器和/或傳送器執行緒,則必須先透過 ssh_ptl_shutdown() 關閉該層,然後才能呼叫此函式。
請求傳輸層¶
-
enum ssh_rtl_state_flags¶
struct ssh_rtl的狀態標誌。
常量
SSH_RTL_SF_SHUTDOWN_BIT指示請求傳輸層已關閉或正在關閉,並且不應接受任何新請求。
-
struct ssh_rtl_ops¶
請求傳輸層的回撥操作。
定義:
struct ssh_rtl_ops {
void (*handle_event)(struct ssh_rtl *rtl, const struct ssh_command *cmd, const struct ssam_span *data);
};
成員
handle_event收到 SSH 事件時呼叫的函式。指定的函式將請求層、收到的命令結構和相應的負載作為引數。如果事件沒有負載,則負載跨度為空(不是
NULL)。
-
struct ssh_rtl¶
SSH 請求傳輸層。
定義:
struct ssh_rtl {
struct ssh_ptl ptl;
unsigned long state;
struct {
spinlock_t lock;
struct list_head head;
} queue;
struct {
spinlock_t lock;
struct list_head head;
atomic_t count;
} pending;
struct {
struct work_struct work;
} tx;
struct {
spinlock_t lock;
ktime_t timeout;
ktime_t expires;
struct delayed_work reaper;
} rtx_timeout;
struct ssh_rtl_ops ops;
};
成員
ptl底層資料包傳輸層。
state傳輸層的狀態(標誌)。
queue請求提交佇列。
queue.lock用於修改請求提交佇列的鎖。
queue.head請求提交佇列的列表頭。
pending待處理請求的集合/列表。
pending.lock用於修改請求集的鎖。
pending.head待處理集合/列表的列表頭。
pending.count當前待處理的請求數。
tx傳送器子系統。
tx.work傳送器工作項。
rtx_timeout重傳超時子系統。
rtx_timeout.lock用於修改重傳超時 Reaper 的鎖。
rtx_timeout.timeout重傳的超時時間間隔。
rtx_timeout.expires指定下次安排 Reaper 工作的時間。
rtx_timeout.reaper執行超時檢查和後續操作的工作。
ops請求層操作。
引數
struct ssh_rtl *rtl請求傳輸層。
返回
返回給定的請求傳輸層構建於其上的裝置。
-
struct ssh_rtl *ssh_request_rtl(struct ssh_request *rqst)¶
獲取與請求關聯的請求傳輸層。
-
bool ssh_rtl_should_drop_response(void)¶
錯誤注入掛鉤以丟棄請求響應。
引數
void沒有引數
描述
有助於透過丟棄對請求的響應來導致驅動程式中的請求傳輸超時。
-
int ssh_rtl_submit(struct ssh_rtl *rtl, struct ssh_request *rqst)¶
將請求提交到傳輸層。
引數
struct ssh_rtl *rtl請求傳輸層。
struct ssh_request *rqst要提交的請求。
描述
將請求提交到傳輸層。未經重新初始化,單個請求可能不會多次提交。
返回
成功時返回零,如果請求型別無效或者請求在提交之前已被取消,則返回 -EINVAL,如果請求已被提交,則返回 -EALREADY,如果請求傳輸層已關閉,則返回 -ESHUTDOWN。
-
bool ssh_rtl_cancel(struct ssh_request *rqst, bool pending)¶
取消請求。
引數
struct ssh_request *rqst要取消的請求。
bool pending是否也取消待處理的請求。
描述
取消給定的請求。如果 pending 為 false,則這不會取消待處理的請求,即已經提交到資料包層但尚未完成的請求。如果 pending 為 true,則無論給定請求處於何種狀態,都會取消該請求。
如果已透過呼叫此函式取消請求,則請求的完成和釋放回調都會在合理的時間範圍內執行。這可能在此函式執行期間發生,但是,不能保證這一點。例如,當前正在傳輸的請求只有在傳輸完成後才會取消/完成,並且相應的回撥將在傳送器執行緒上執行,這可能在取消函式執行期間發生,也可能在取消函式執行後的一段時間發生。
返回
如果給定的請求已被此函式或在呼叫此函式之前取消或完成,則返回 true,否則返回 false。如果 pending 為 true,則此函式將始終返回 true。
-
int ssh_request_init(struct ssh_request *rqst, enum ssam_request_flags flags, const struct ssh_request_ops *ops)¶
初始化 SSH 請求。
引數
struct ssh_request *rqst要初始化的請求。
enum ssam_request_flags flags請求標誌,確定請求的型別。
const struct ssh_request_ops *ops請求操作。
描述
初始化給定的 SSH 請求和底層資料包。將訊息緩衝區指標設定為 NULL,並將訊息緩衝區長度設定為零。必須在提交之前透過 ssh_request_set_data() 單獨設定此緩衝區,並且必須包含有效的 SSH 請求訊息。
返回
成功時返回零,如果給定的標誌無效,則返回 -EINVAL。
-
int ssh_rtl_init(struct ssh_rtl *rtl, struct serdev_device *serdev, const struct ssh_rtl_ops *ops)¶
初始化請求傳輸層。
引數
struct ssh_rtl *rtl要初始化的請求傳輸層。
struct serdev_device *serdev底層序列裝置,即下層傳輸。
const struct ssh_rtl_ops *ops請求傳輸層操作。
描述
初始化給定的請求傳輸層和關聯的資料包傳輸層。在請求層初始化並且底層序列裝置層已設定完成後,必須透過 ssh_rtl_start() 單獨啟動傳送器和接收器執行緒。
返回
成功時返回零,失敗時返回非零錯誤程式碼。
引數
struct ssh_rtl *rtl要取消初始化的請求傳輸層。
描述
取消初始化給定的請求傳輸層並釋放與其關聯的資源。如果接收器和/或傳送器執行緒已啟動,則必須先透過 ssh_rtl_shutdown() 關閉該層,然後才能呼叫此函式。
引數
struct ssh_rtl *rtl請求傳輸層。
返回
成功時返回零,失敗時返回負錯誤程式碼。
引數
struct ssh_rtl *rtl請求傳輸層
unsigned long timeout重新整理操作的超時時間(單位為 jiffies)
描述
將特殊的重新整理請求排隊並等待其完成。此請求將在所有其他當前排隊和掛起的請求完成後完成。此請求不是提交正常的資料包,而是提交特殊的重新整理包,這意味著完成時,也會重新整理底層的資料包傳輸層。
重新整理請求層可確保在此呼叫返回之前,所有先前提交的請求都已完全完成。此外,重新整理會阻止所有稍後提交的請求的執行,直到重新整理完成為止。
如果呼叫方確保在此函式呼叫之後不提交新請求,則保證在此呼叫返回時,請求傳輸層沒有剩餘請求。相同的保證不適用於資料包層,在此呼叫之後,控制資料包可能仍在排隊。
返回
成功時返回零,如果重新整理超時並由於超時而取消,則返回 -ETIMEDOUT,如果在此呼叫之前資料包和/或請求傳輸層已關閉,則返回 -ESHUTDOWN。如果底層資料包傳輸已中斷,也可能返回 -EINTR。
引數
struct ssh_rtl *rtl請求傳輸層。
描述
關閉請求傳輸層,刪除和取消所有排隊和掛起的請求。透過此操作取消的請求將以 -ESHUTDOWN 作為狀態完成。接收器和傳送器執行緒將停止,底層資料包層將關閉。
此函式的結果是,傳輸層將被標記為已關閉。在傳輸層關閉後提交請求將失敗,並顯示 -ESHUTDOWN。
控制器¶
-
struct ssh_seq_counter¶
用於 SSH 序列 ID 的安全計數器。
定義:
struct ssh_seq_counter {
u8 value;
};
成員
值當前計數器值。
-
struct ssh_rqid_counter¶
用於 SSH 請求 ID 的安全計數器。
定義:
struct ssh_rqid_counter {
u16 value;
};
成員
值當前計數器值。
-
struct ssam_nf_head¶
SSAM 事件的通知器頭部。
定義:
struct ssam_nf_head {
struct srcu_struct srcu;
struct list_head head;
};
成員
srcu用於同步的 SRCU 結構。
頭部在此頭部下注冊的通知器塊的列表頭部。
-
struct ssam_nf¶
SSAM 事件的通知器回撥和啟用登錄檔。
定義:
struct ssam_nf {
struct mutex lock;
struct rb_root refcount;
struct ssam_nf_head head[SSH_NUM_EVENTS];
};
成員
鎖用於保護通知器塊的(取消)註冊的鎖。注意:此鎖不需要用於通知器呼叫,僅用於註冊和取消註冊。
引用計數用於引用計數啟用事件/通知的 RB 樹的根。
頭部用於事件/通知回撥的通知器頭部列表。
-
struct ssam_event_item¶
用於事件排隊和完成的結構。
定義:
struct ssam_event_item {
struct list_head node;
u16 rqid;
struct {
void (*free)(struct ssam_event_item *event);
} ops;
struct ssam_event event;
};
成員
節點佇列中的節點。
rqid事件的請求 ID。
ops例項特定函式。
ops.free用於釋放此事件項的回撥。
事件實際事件資料。
-
struct ssam_event_queue¶
用於完成接收到的事件的佇列。
定義:
struct ssam_event_queue {
struct ssam_cplt *cplt;
spinlock_t lock;
struct list_head head;
struct work_struct work;
};
成員
cplt對此佇列處於活動狀態的完成系統的引用。
鎖佇列上任何操作的鎖。
頭部佇列的列表頭部。
工作執行此佇列的完成工作的
struct work_struct。
-
struct ssam_event_target¶
單個 SSH 目標 ID 的佇列集。
定義:
struct ssam_event_target {
struct ssam_event_queue queue[SSH_NUM_EVENTS];
};
成員
queue佇列陣列,每個事件 ID 一個佇列。
-
struct ssam_cplt¶
SSAM 事件/非同步請求完成系統。
定義:
struct ssam_cplt {
struct device *dev;
struct workqueue_struct *wq;
struct {
struct ssam_event_target target[SSH_NUM_TARGETS];
struct ssam_nf notif;
} event;
};
成員
開發與此係統關聯的裝置。僅用於日誌記錄。
wq所有完成工作項都排隊的
struct workqueue_struct。事件事件完成管理。
event.targetstruct ssam_event_target陣列,每個目標一個。event.notif通知器回撥和事件啟用引用計數。
-
enum ssam_controller_state¶
struct ssam_controller的狀態值。
常量
SSAM_CONTROLLER_UNINITIALIZED控制器尚未初始化或已取消初始化。
SSAM_CONTROLLER_INITIALIZED控制器已初始化,但尚未啟動。
SSAM_CONTROLLER_STARTED控制器已啟動並可以使用。
SSAM_CONTROLLER_STOPPED控制器已停止。
SSAM_CONTROLLER_SUSPENDED控制器已掛起。
-
struct ssam_controller_caps¶
控制器裝置功能。
定義:
struct ssam_controller_caps {
u32 ssh_power_profile;
u32 ssh_buffer_size;
u32 screen_on_sleep_idle_timeout;
u32 screen_off_sleep_idle_timeout;
u32 d3_closes_handle:1;
};
成員
ssh_power_profileSSH 電源配置檔案。
ssh_buffer_sizeSSH 驅動程式 UART 緩衝區大小。
screen_on_sleep_idle_timeoutSAM UART 螢幕開啟睡眠空閒超時。
screen_off_sleep_idle_timeoutSAM UART 螢幕關閉睡眠空閒超時。
d3_closes_handleSAM 在 D3 中關閉 UART 控制代碼。
描述
在 ACPI 中找到的控制器和 SSH 裝置功能。
-
struct ssam_controller¶
SSAM 控制器裝置。
定義:
struct ssam_controller {
struct kref kref;
struct rw_semaphore lock;
enum ssam_controller_state state;
struct ssh_rtl rtl;
struct ssam_cplt cplt;
struct {
struct ssh_seq_counter seq;
struct ssh_rqid_counter rqid;
} counter;
struct {
int num;
bool wakeup_enabled;
} irq;
struct ssam_controller_caps caps;
};
成員
kref控制器的引用計數。
鎖控制器的主要鎖,用於保護狀態更改。
state控制器狀態。
rtl用於 SSH I/O 的請求傳輸層。
cplt用於 SSH/SSAM 事件和非同步請求的完成系統。
計數器安全 SSH 訊息 ID 計數器。
counter.seq序列 ID 計數器。
counter.rqid請求 ID 計數器。
irq喚醒 IRQ 資源。
irq.num喚醒 IRQ 編號。
irq.wakeup_enabled掛起期間是否啟用透過 IRQ 喚醒。
caps控制器裝置功能。
-
ssize_t ssam_controller_receive_buf(struct ssam_controller *ctrl, const u8 *buf, size_t n)¶
向控制器提供輸入資料。
引數
struct ssam_controller *ctrl控制器。
const u8 *buf輸入緩衝區。
size_t n輸入緩衝區中的位元組數。
描述
提供要由控制器評估的輸入資料,這些資料已透過底層傳輸接收。
返回
返回消耗的位元組數,或者,如果控制器的包傳輸層已關閉,則返回 -ESHUTDOWN。
-
void ssam_controller_write_wakeup(struct ssam_controller *ctrl)¶
通知控制器底層裝置有可用於寫入資料的空間。
引數
struct ssam_controller *ctrl控制器。
-
void ssh_seq_reset(struct ssh_seq_counter *c)¶
重置/初始化序列 ID 計數器。
引數
struct ssh_seq_counter *c要重置的計數器。
-
u8 ssh_seq_next(struct ssh_seq_counter *c)¶
獲取下一個序列 ID。
引數
struct ssh_seq_counter *c提供序列 ID 的計數器。
返回
返回計數器的下一個序列 ID。
-
void ssh_rqid_reset(struct ssh_rqid_counter *c)¶
重置/初始化請求 ID 計數器。
引數
struct ssh_rqid_counter *c要重置的計數器。
-
u16 ssh_rqid_next(struct ssh_rqid_counter *c)¶
獲取下一個請求 ID。
引數
struct ssh_rqid_counter *c提供請求 ID 的計數器。
返回
返回計數器的下一個請求 ID,跳過任何保留的請求 ID。
-
bool ssam_event_matches_notifier(const struct ssam_event_notifier *n, const struct ssam_event *event)¶
測試事件是否與通知器匹配。
引數
const struct ssam_event_notifier *n要測試的事件通知器。
const struct ssam_event *event要測試的事件。
返回
如果給定的事件根據通知器的事件掩碼中設定的規則與給定的通知器匹配,則返回 true,否則返回 false。
-
int ssam_nfblk_call_chain(struct ssam_nf_head *nh, struct ssam_event *event)¶
呼叫給定鏈的事件通知器回撥。
引數
struct ssam_nf_head *nh應為其呼叫通知器回撥的通知器頭部。
struct ssam_event *event提供給回撥的事件資料。
描述
按優先順序順序呼叫所有已註冊的通知器回撥,直到沒有剩餘通知器或通知器返回設定了 SSAM_NOTIF_STOP 位的返回值。請注意,此位透過 ssam_notifier_from_errno() 在任何非零錯誤值上自動設定。
返回
返回通知器狀態值,其中包含通知器狀態位(SSAM_NOTIF_HANDLED 和 SSAM_NOTIF_STOP)以及從上次執行的通知器回撥返回的潛在錯誤值。使用 ssam_notifier_to_errno() 將此值轉換為原始錯誤值。
-
int ssam_nfblk_insert(struct ssam_nf_head *nh, struct ssam_notifier_block *nb)¶
將新的通知器塊插入到給定的通知器列表中。
引數
struct ssam_nf_head *nh應將塊插入到的通知器頭部。
struct ssam_notifier_block *nb要新增的通知器塊。
注意
對於其他插入、查詢和/或刪除呼叫,呼叫方必須透過持有 struct ssam_nf.lock 來同步此函式。
返回
成功時返回零,如果已註冊通知器塊,則返回 -EEXIST。
-
bool ssam_nfblk_find(struct ssam_nf_head *nh, struct ssam_notifier_block *nb)¶
檢查通知器塊是否已在給定的通知器頭部上註冊。列表。
引數
struct ssam_nf_head *nh要在其上搜索的通知器頭部。
struct ssam_notifier_block *nb要搜尋的通知器塊。
注意
對於其他插入、查詢和/或刪除呼叫,呼叫方必須透過持有 struct ssam_nf.lock 來同步此函式。
返回
如果給定的通知器塊已在給定的通知器頭部上註冊,則返回 true,否則返回 false。
-
void ssam_nfblk_remove(struct ssam_notifier_block *nb)¶
從通知器列表中刪除通知器塊。
引數
struct ssam_notifier_block *nb要刪除的通知器塊。
注意
對於其他插入、查詢和/或刪除呼叫,呼叫方必須透過持有 struct ssam_nf.lock 來同步此函式。此外,呼叫方_必須_透過在離開臨界區後使用 nh->srcu 呼叫 synchronize_srcu() 來確保 SRCU 同步,以確保不再使用已刪除的通知器塊。
-
int ssam_nf_head_init(struct ssam_nf_head *nh)¶
初始化給定的通知器頭部。
引數
struct ssam_nf_head *nh要初始化的通知器頭部。
-
void ssam_nf_head_destroy(struct ssam_nf_head *nh)¶
取消初始化給定的通知器頭部。
引數
struct ssam_nf_head *nh要取消初始化的通知器頭部。
-
struct ssam_nf_refcount_key¶
用於事件啟用引用計數的鍵。
定義:
struct ssam_nf_refcount_key {
struct ssam_event_registry reg;
struct ssam_event_id id;
};
成員
reg事件透過其啟用/停用的登錄檔。
id唯一描述事件的 ID。
-
struct ssam_nf_refcount_entry¶
用於引用計數事件啟用的 RB 樹條目。
定義:
struct ssam_nf_refcount_entry {
struct rb_node node;
struct ssam_nf_refcount_key key;
int refcount;
u8 flags;
};
成員
節點節點
此條目在 rb 樹中的節點。key
引用計數引用計數
flags啟用事件時使用的標誌。
-
struct ssam_nf_refcount_entry *ssam_nf_refcount_inc(struct ssam_nf *nf, struct ssam_event_registry reg, struct ssam_event_id id)¶
增加給定事件的引用計數/啟用計數。
引數
struct ssam_nf *nf通知器系統引用。
struct ssam_event_registry reg用於啟用/停用事件的登錄檔。
struct ssam_event_id id事件 ID。
描述
增加與指定的事件型別/ID 關聯的引用計數/啟用計數,必要時為此事件 ID 分配新條目。新分配的條目的引用計數為 1。
注意
呼叫此函式時必須持有 nf->lock。
返回
成功時返回引用計數條目。如果已註冊指定 ID 和型別的 INT_MAX 個事件,則返回帶有 -ENOSPC 的錯誤指標,如果無法分配條目,則返回 -ENOMEM。
-
struct ssam_nf_refcount_entry *ssam_nf_refcount_dec(struct ssam_nf *nf, struct ssam_event_registry reg, struct ssam_event_id id)¶
減少給定事件的引用/啟用計數。
引數
struct ssam_nf *nf通知器系統引用。
struct ssam_event_registry reg用於啟用/停用事件的登錄檔。
struct ssam_event_id id事件 ID。
描述
減少指定事件的引用/啟用計數,並返回其條目。如果返回的條目的引用計數為零,則呼叫者負責使用 kfree() 釋放它。
注意
呼叫此函式時必須持有 nf->lock。
返回
成功時返回引用計數條目,如果未找到該條目,則返回 NULL。
-
void ssam_nf_refcount_dec_free(struct ssam_nf *nf, struct ssam_event_registry reg, struct ssam_event_id id)¶
減少給定事件的引用/啟用計數,如果引用計數達到零,則釋放其條目。
引數
struct ssam_nf *nf通知器系統引用。
struct ssam_event_registry reg用於啟用/停用事件的登錄檔。
struct ssam_event_id id事件 ID。
描述
減少指定事件的引用/啟用計數,如果達到零,則釋放其條目。
注意
呼叫此函式時必須持有 nf->lock。
引數
struct ssam_nf *nf通知系統。
-
void ssam_nf_call(struct ssam_nf *nf, struct device *dev, u16 rqid, struct ssam_event *event)¶
為提供的事件呼叫通知回撥。
引數
struct ssam_nf *nf通知器系統
struct device *dev關聯的裝置,僅用於日誌記錄。
u16 rqid事件的請求 ID。
struct ssam_event *event提供給回撥的事件。
描述
按照其優先順序順序執行註冊的回撥,直到沒有回撥剩餘或回撥返回一個設定了 SSAM_NOTIF_STOP 位的返回值。請注意,當透過 ssam_notifier_from_errno() 將非零錯誤值轉換為通知器值時,會自動設定此位。
另請注意,任何可以處理事件的回撥都應返回一個設定了位 SSAM_NOTIF_HANDLED 的值,指示該事件不會未經處理/忽略。如果未註冊的回撥可以處理事件,此函式將發出警告。
如果回撥失敗,此函式將發出錯誤訊息。
引數
struct ssam_nf *nf要初始化的通知器系統。
引數
struct ssam_nf *nf要取消初始化的通知器系統。
-
int ssam_event_item_cache_init(void)¶
初始化事件項快取。
引數
void沒有引數
-
void ssam_event_item_cache_destroy(void)¶
取消初始化事件項快取。
引數
void沒有引數
-
void ssam_event_item_free(struct ssam_event_item *item)¶
釋放提供的事件項。
引數
struct ssam_event_item *item要釋放的事件項。
-
struct ssam_event_item *ssam_event_item_alloc(size_t len, gfp_t flags)¶
分配具有給定有效負載大小的事件項。
引數
size_t len事件有效負載長度。
gfp_t flags用於分配的標誌。
描述
分配具有給定有效負載大小的事件項,如果有效負載足夠小(即小於 SSAM_EVENT_ITEM_CACHE_PAYLOAD_LEN),則優先從事件項快取中分配。設定項操作和有效負載長度值。在此呼叫之後,不應覆蓋項釋放回調(ops.free)。
返回
返回新分配的事件項。
-
void ssam_event_queue_push(struct ssam_event_queue *q, struct ssam_event_item *item)¶
將事件項推送到事件佇列。
引數
struct ssam_event_queue *q事件佇列。
struct ssam_event_item *item要新增的項。
-
struct ssam_event_item *ssam_event_queue_pop(struct ssam_event_queue *q)¶
從事件佇列中彈出下一個事件項。
引數
struct ssam_event_queue *q事件佇列。
描述
從佇列中返回並刪除下一個事件項。如果剩餘事件項,則返回 NULL。
-
bool ssam_event_queue_is_empty(struct ssam_event_queue *q)¶
檢查事件佇列是否為空。
引數
struct ssam_event_queue *q事件佇列。
-
struct ssam_event_queue *ssam_cplt_get_event_queue(struct ssam_cplt *cplt, u8 tid, u16 rqid)¶
獲取給定引數的事件佇列。
引數
struct ssam_cplt *cplt在其上查詢佇列的完成系統。
u8 tid佇列的目標 ID。
u16 rqid請求 ID,表示要獲取佇列的事件 ID。
返回
返回對應於給定引數描述的事件型別的事件佇列。如果請求 ID 不表示事件,則此函式返回 NULL。如果不支援目標 ID,則此函式將回退到預設目標 ID(tid = 1)。
引數
struct ssam_cplt *cplt完成系統。
struct work_struct *work要提交的工作項。
-
int ssam_cplt_submit_event(struct ssam_cplt *cplt, struct ssam_event_item *item)¶
將事件提交到完成系統。
引數
struct ssam_cplt *cplt完成系統。
struct ssam_event_item *item要提交的事件項。
描述
透過將其排隊到事件項佇列並將相應的事件佇列工作項排隊到完成工作佇列,將事件提交到完成系統,最終完成該事件。
返回
成功時返回零,如果沒有可以處理給定事件項的事件佇列,則返回 -EINVAL。
引數
struct ssam_cplt *cplt完成系統。
描述
透過等待直到所有當前提交的工作項都已完成,來重新整理完成系統。
此操作僅用於在關閉之前的正常操作期間,嘗試完成大多數事件和請求,以便在系統仍在完全執行的情況下將其從系統中刪除。它並不旨在提供任何保證,即所有事件和請求都已處理。
注意
此函式不能保證在此呼叫終止後所有事件都將被處理。如果存在大量要完成的事件,事件佇列工作函式可能會重新安排其工作項,此重新整理操作將忽略該工作項。
-
void ssam_event_queue_init(struct ssam_cplt *cplt, struct ssam_event_queue *evq)¶
初始化事件佇列。
引數
struct ssam_cplt *cplt佇列所在的完成系統。
struct ssam_event_queue *evq要初始化的事件佇列。
引數
struct ssam_cplt *cplt要初始化的完成系統。
struct device *dev用於日誌記錄的裝置。
引數
struct ssam_cplt *cplt要取消初始化的完成系統。
描述
取消初始化給定的完成系統,並確保已處理所有掛起的,即尚未完成的事件項和請求。
-
void ssam_controller_lock(struct ssam_controller *c)¶
獲取主控制器鎖。
引數
struct ssam_controller *c要鎖定的控制器。
描述
對於任何狀態轉換,包括轉換到掛起/恢復狀態以及關閉期間,都必須持有此鎖。有關控制器鎖定的更多詳細資訊,請參見 ssam_controller_statelock()。
有關相應的解鎖函式,請參見 ssam_controller_unlock()。
-
int ssam_controller_caps_load_from_acpi(acpi_handle handle, struct ssam_controller_caps *caps)¶
從 ACPI _DSM 載入控制器功能。
引數
acpi_handle handleACPI 控制器/SSH 裝置的控制代碼。
struct ssam_controller_caps *caps在何處儲存功能。
描述
使用預設值初始化給定的控制器功能,然後檢查,如果相應的 _DSM 功能可用,則從 _DSM 載入實際功能。
返回
成功時返回零,失敗時返回負錯誤程式碼。
-
int ssam_controller_caps_load_from_of(struct device *dev, struct ssam_controller_caps *caps)¶
從 OF/DT 載入控制器功能。
引數
struct device *dev指向控制器裝置的指標
struct ssam_controller_caps *caps在何處儲存功能。
返回
成功時返回零,失敗時返回負錯誤程式碼。
-
int ssam_controller_caps_load(struct device *dev, struct ssam_controller_caps *caps)¶
載入控制器功能
引數
struct device *dev指向控制器裝置的指標
struct ssam_controller_caps *caps在何處儲存功能。
返回
成功時返回零,失敗時返回負錯誤程式碼。
-
int ssam_controller_init(struct ssam_controller *ctrl, struct serdev_device *serdev)¶
初始化 SSAM 控制器。
引數
struct ssam_controller *ctrl要初始化的控制器。
struct serdev_device *serdev表示底層資料傳輸的序列裝置。
描述
初始化給定的控制器。既不啟動接收器執行緒也不啟動傳送器執行緒。在此呼叫之後,必須透過 struct serdev_device_ops 將控制器單獨連線到 serdev 核心,將呼叫中繼到 ssam_controller_receive_buf() 和 ssam_controller_write_wakeup()。連線控制器後,可以透過 ssam_controller_start() 啟動傳送器執行緒和接收器執行緒。這些設定步驟需要在控制器可用於請求之前完成。
-
int ssam_controller_start(struct ssam_controller *ctrl)¶
啟動控制器的接收器執行緒和傳送器執行緒。
引數
struct ssam_controller *ctrl控制器。
注意
呼叫此函式時,應透過 struct serdev_device_ops 將控制器正確連線到 serdev 核心。有關控制器初始化的更多詳細資訊,請參見 ssam_controller_init()。
描述
必須在持有主控制器鎖的情況下呼叫此函式(即透過呼叫 ssam_controller_lock())。
-
void ssam_controller_shutdown(struct ssam_controller *ctrl)¶
關閉控制器。
引數
struct ssam_controller *ctrl控制器。
描述
透過重新整理所有掛起的請求並停止傳送器執行緒和接收器執行緒來關閉控制器。在此呼叫之後提交的所有請求都將失敗,並顯示 -ESHUTDOWN。雖然不建議這樣做,但此函式可以安全地與正在進行的請求提交併行使用。
在此關閉過程中,所有當前註冊的通知器都將被取消註冊。但是,強烈建議不要依賴此行為,而是註冊通知器的一方應在控制器關閉之前取消註冊它,例如,透過 SSAM 匯流排,該匯流排保證在關閉之前刪除客戶端裝置。
請注意,在此呼叫之後可能仍有掛起的事件,但是由於通知器已取消註冊,因此當控制器隨後透過 ssam_controller_destroy() 銷燬時,這些事件將被丟棄。
必須在持有主控制器鎖的情況下呼叫此函式(即透過呼叫 ssam_controller_lock())。
-
void ssam_controller_destroy(struct ssam_controller *ctrl)¶
銷燬控制器並釋放其資源。
引數
struct ssam_controller *ctrl控制器。
描述
確保釋放與控制器關聯的所有資源。僅應在透過 ssam_controller_shutdown() 停止控制器後呼叫此函式。通常,不應直接呼叫此函式。直接呼叫此函式的唯一有效位置是在初始化期間,在控制器已完全初始化並傳遞給其他程序之前。當控制器的引用計數達到零時,將自動呼叫此函式。
必須在持有主控制器鎖的情況下呼叫此函式(即透過呼叫 ssam_controller_lock())。
-
int ssam_controller_suspend(struct ssam_controller *ctrl)¶
掛起控制器。
引數
struct ssam_controller *ctrl要掛起的控制器。
描述
將控制器標記為已掛起。請注意,必須先手動傳送顯示關閉和 D0-exit 通知,然後才能透過此函式將控制器轉換到掛起狀態。
有關相應的恢復函式,請參見 ssam_controller_resume()。
返回
如果控制器當前未處於“已啟動”狀態,則返回 -EINVAL。
-
int ssam_controller_resume(struct ssam_controller *ctrl)¶
從掛起狀態恢復控制器。
引數
struct ssam_controller *ctrl要恢復的控制器。
描述
從透過 ssam_controller_suspend() 置於掛起狀態的控制器恢復。此函式不會發出顯示開啟和 D0-entry 通知。如果需要,必須在此呼叫後手動傳送這些通知。
返回
如果控制器當前未掛起,則返回 -EINVAL。
-
struct ssh_notification_params¶
啟用/停用 SSH 通知的命令有效負載。
定義:
struct ssh_notification_params {
u8 target_category;
u8 flags;
__le16 request_id;
u8 instance_id;
};
成員
target_category應為其啟用/停用通知的目標類別。
flags標誌,確定如何傳送通知。
request_id用於傳送這些通知的請求 ID。
instance_id應為其啟用通知的給定目標類別中的特定例項。
-
int ssam_ssh_event_enable(struct ssam_controller *ctrl, struct ssam_event_registry reg, struct ssam_event_id id, u8 flags)¶
啟用 SSH 事件。
引數
struct ssam_controller *ctrl為其啟用事件的控制器。
struct ssam_event_registry reg事件登錄檔,描述用於啟用和停用事件的請求。
struct ssam_event_id id事件識別符號。
u8 flags事件標誌。
描述
在 EC 上啟用指定的事件。此函式不管理已啟用事件的引用計數,並且基本上只是原始 EC 請求的包裝器。如果指定的事件已經啟用,EC 將忽略此請求。
返回
如果請求響應指示失敗,則返回執行的 SAM 請求的狀態(成功時為零,直接失敗時為負數)或 -EPROTO。
-
int ssam_ssh_event_disable(struct ssam_controller *ctrl, struct ssam_event_registry reg, struct ssam_event_id id, u8 flags)¶
停用 SSH 事件。
引數
struct ssam_controller *ctrl為其停用事件的控制器。
struct ssam_event_registry reg事件登錄檔,描述用於啟用和停用事件的請求(必須與啟用事件時使用的相同)。
struct ssam_event_id id事件識別符號。
u8 flags事件標誌(很可能在停用事件時被忽略)。
描述
在 EC 上停用指定的事件。此函式不管理已啟用事件的引用計數,並且基本上只是原始 EC 請求的包裝器。如果指定的事件已經停用,EC 將忽略此請求。
返回
如果請求響應指示失敗,則返回執行的 SAM 請求的狀態(成功時為零,直接失敗時為負數)或 -EPROTO。
-
int ssam_get_firmware_version(struct ssam_controller *ctrl, u32 *version)¶
獲取 SAM/EC 韌體版本。
引數
struct ssam_controller *ctrl控制器。
u32 *version儲存版本號的位置。
返回
成功時返回零,如果執行的 SAM 請求失敗,則返回該請求的狀態。
-
int ssam_ctrl_notif_display_off(struct ssam_controller *ctrl)¶
通知 EC 顯示器已關閉。
引數
struct ssam_controller *ctrl控制器。
描述
通知 EC 顯示器已關閉,驅動程式可能會進入低功耗狀態。 這將阻止直接傳送事件。 相反,EC 透過將喚醒 GPIO 拉高來發出事件訊號,只要有掛起的事件。 然後需要透過 GPIO 回撥請求手動逐個釋放事件。 透過發出顯示開啟通知(例如透過 ssam_ctrl_notif_display_on())也可以釋放在此狀態期間累積的所有掛起事件,這也將重置 GPIO。
在某些裝置上,特別是具有整合鍵盤的裝置,鍵盤背光將透過此呼叫關閉。
僅當 EC 支援顯示通知時,此函式才會傳送顯示關閉通知命令。 目前,所有已知的裝置都支援這些通知。
使用 ssam_ctrl_notif_display_on() 來反轉此函式的效果。
返回
成功時返回零或如果未執行任何請求,則返回執行的 SAM 請求的狀態(如果該請求失敗),或者如果收到意外響應,則返回 -EPROTO。
-
int ssam_ctrl_notif_display_on(struct ssam_controller *ctrl)¶
通知 EC 顯示器已開啟。
引數
struct ssam_controller *ctrl控制器。
描述
通知 EC 顯示器已重新開啟,並且驅動程式已退出其低功耗狀態。 此通知是經由 ssam_ctrl_notif_display_off() 傳送的顯示關閉通知的對應方,並且將反轉其效果,包括將事件重置為其預設行為。
僅當 EC 支援顯示通知時,此函式才會傳送顯示開啟通知命令。 目前,所有已知的裝置都支援這些通知。
有關更多詳細資訊,請參見 ssam_ctrl_notif_display_off()。
返回
成功時返回零或如果未執行任何請求,則返回執行的 SAM 請求的狀態(如果該請求失敗),或者如果收到意外響應,則返回 -EPROTO。
-
int ssam_ctrl_notif_d0_exit(struct ssam_controller *ctrl)¶
通知 EC 驅動程式/裝置退出 D0 電源狀態。
引數
struct ssam_controller *ctrl控制器
描述
通知 EC 驅動程式準備退出 D0 電源狀態,以支援較低功耗的狀態。 目前尚不清楚此函式與 EC 相關的確切效果。
僅當 EC 支援 D0 狀態通知時,此函式才會傳送 D0 退出通知命令。 只有較新的 Surface 代支援這些通知。
使用 ssam_ctrl_notif_d0_entry() 來反轉此函式的效果。
返回
成功時返回零或如果未執行任何請求,則返回執行的 SAM 請求的狀態(如果該請求失敗),或者如果收到意外響應,則返回 -EPROTO。
-
int ssam_ctrl_notif_d0_entry(struct ssam_controller *ctrl)¶
通知 EC 驅動程式/裝置進入 D0 電源狀態。
引數
struct ssam_controller *ctrl控制器
描述
通知 EC 驅動程式已退出較低功耗狀態並進入 D0 電源狀態。 目前尚不清楚此函式與 EC 相關的確切效果。
僅當 EC 支援 D0 進入通知時,此函式才會傳送 D0 進入通知命令。 只有較新的 Surface 代支援這些通知。
有關更多詳細資訊,請參見 ssam_ctrl_notif_d0_exit()。
返回
成功時返回零或如果未執行任何請求,則返回執行的 SAM 請求的狀態(如果該請求失敗),或者如果收到意外響應,則返回 -EPROTO。
-
int ssam_nf_refcount_enable(struct ssam_controller *ctrl, struct ssam_nf_refcount_entry *entry, u8 flags)¶
如果尚未啟用,則為引用計數條目啟用事件。
引數
struct ssam_controller *ctrl要在其上啟用事件的控制器。
struct ssam_nf_refcount_entry *entry要啟用的事件的引用計數條目。
u8 flags用於在 EC 上啟用事件的標誌。
描述
如果引用計數等於 1,則啟用與給定引用計數條目關聯的事件,即,之前未啟用該事件。 如果該事件已被啟用(即,引用計數不等於 1),請檢查用於啟用的標誌是否匹配,如果不匹配,則發出警告。
這不會修改引用計數本身,引用計數本身透過 ssam_nf_refcount_inc() / ssam_nf_refcount_dec() 完成。
注意
呼叫此函式時必須持有 nf->lock。
返回
成功時返回零。 如果事件由此呼叫啟用,則返回事件啟用 EC 命令的狀態。
-
int ssam_nf_refcount_disable_free(struct ssam_controller *ctrl, struct ssam_nf_refcount_entry *entry, u8 flags, bool ec)¶
如果引用計數條目不再使用,則停用該條目的事件,並釋放相應的條目。
引數
struct ssam_controller *ctrl要在其上停用事件的控制器。
struct ssam_nf_refcount_entry *entry要停用的事件的引用計數條目。
u8 flags用於在 EC 上啟用事件的標誌。
bool ec一個標誌,用於指定是否應實際在 EC 上停用事件。
描述
如果 ec 等於 true 並且引用計數等於 0(即,任何客戶端都不再請求該事件),則將透過相應的請求在 EC 上停用指定的事件。
如果 ec 等於 false,則不會向 EC 傳送任何請求,並且該事件可以被視為處於分離狀態(即,不再使用但仍啟用)。 對於熱插拔裝置,可能需要透過此方法停用事件,在這種情況下,裝置被物理移除後,事件停用請求可能會超時。
在這兩種情況下,如果引用計數等於 0,則將釋放相應的引用計數條目。 在呼叫此函式後,不得再使用該引用計數條目。
此外,還會檢查用於停用事件的標誌是否與用於啟用事件的標誌匹配,如果不匹配,則發出警告(無論引用計數如何)。
這不會修改引用計數本身,引用計數本身透過 ssam_nf_refcount_inc() / ssam_nf_refcount_dec() 完成。
注意
呼叫此函式時必須持有 nf->lock。
返回
成功時返回零。 如果事件由此呼叫停用,則返回事件啟用 EC 命令的狀態。
-
int ssam_notifier_disable_registered(struct ssam_controller *ctrl)¶
停用所有已註冊通知程式的事件。
引數
struct ssam_controller *ctrl要停用通知程式/事件的控制器。
描述
停用所有當前已註冊通知程式的事件。 如果發生錯誤(EC 命令失敗),則將恢復所有先前停用的事件,並返回錯誤程式碼。
此函式旨在休眠條目之前停用所有事件。 有關更多資訊,請參見 ssam_notifier_restore_registered() 以還原/重新啟用使用此函式停用的所有事件。
請注意,此函式不會停用在此函式呼叫之後註冊的通知程式的事件。 因此,應確保在此呼叫之後和對 ssam_notifier_restore_registered() 的相應呼叫之前,不會新增任何新的通知程式。
返回
成功時返回零。 如果失敗,則返回停用事件的失敗 EC 命令返回的錯誤程式碼。
-
void ssam_notifier_restore_registered(struct ssam_controller *ctrl)¶
還原/重新啟用所有已註冊通知程式的事件。
引數
struct ssam_controller *ctrl要還原通知程式/事件的控制器。
描述
還原/重新啟用在給定控制器上已註冊通知程式的所有事件。 如果發生故障,則會記錄該錯誤,並且該函式會繼續嘗試啟用剩餘的事件。
此函式旨在在休眠後還原/重新啟用所有已註冊的事件。 有關停用事件的對應部分以及更多詳細資訊,請參見 ssam_notifier_disable_registered()。
-
bool ssam_notifier_is_empty(struct ssam_controller *ctrl)¶
檢查是否有任何已註冊的通知程式。
引數
struct ssam_controller *ctrl要檢查的控制器。
返回
如果當前沒有在控制器上註冊任何通知程式,則返回 true,否則返回 false。
-
void ssam_notifier_unregister_all(struct ssam_controller *ctrl)¶
取消註冊所有當前已註冊的通知程式。
引數
struct ssam_controller *ctrl要在其上取消註冊通知程式的控制器。
描述
取消註冊所有當前已註冊的通知程式。 當控制器正在關閉時,此函式用於確保取消註冊所有通知程式並釋放關聯的條目/資源。
-
int ssam_irq_setup(struct ssam_controller *ctrl)¶
設定 SAM EC 喚醒 GPIO 中斷。
引數
struct ssam_controller *ctrl應為其設定 IRQ 的控制器。
描述
為 SAM EC 的喚醒 GPIO 引腳設定 IRQ。 此 IRQ 可用於將裝置從低功耗狀態喚醒。
請注意,只有當 EC 處於顯示關閉狀態時,才能觸發此 IRQ。 在這種狀態下,事件不會以通常的方式傳送到主機。 相反,只要有掛起的事件,喚醒 GPIO 就會被拉至“高電平”,並且這些事件需要透過 GPIO 回撥請求逐個釋放,直到沒有剩餘事件且 GPIO 重置,或者透過將 EC 轉換為顯示關閉狀態來一次性釋放所有事件,這也將清除 GPIO。
但是,並非所有事件都應觸發完整的系統喚醒。 相反,驅動程式應在必要時檢查每個事件並將其轉發到相應的子系統,而子系統又應決定是否需要喚醒系統。 此邏輯尚未實現,因此預設情況下應停用此 IRQ 的喚醒,以避免出現假喚醒,例如,由剩餘電池百分比變化引起的喚醒。 有關如何實現此功能的更多詳細資訊,請參見此函式中的註釋以及相應 IRQ 處理程式中的註釋。
另請參見 ssam_ctrl_notif_display_off() 和 ssam_ctrl_notif_display_off(),以瞭解將 EC 轉換為顯示關閉狀態以及退出顯示關閉狀態的函式以及有關它的更多詳細資訊。
預設情況下停用 IRQ,並且必須先啟用 IRQ,然後才能透過 ssam_irq_arm_for_wakeup() 將裝置從掛起狀態喚醒。 在拆卸時,應透過 ssam_irq_free() 釋放 IRQ。
-
void ssam_irq_free(struct ssam_controller *ctrl)¶
釋放 SAM EC 喚醒 GPIO 中斷。
-
int ssam_irq_arm_for_wakeup(struct ssam_controller *ctrl)¶
如果已啟用,則準備 EC IRQ 以進行喚醒。
引數
struct ssam_controller *ctrl應準備 IRQ 的控制器。
描述
設定 IRQ,使其可用於喚醒裝置。 具體來說,此函式會啟用 irq,然後,如果允許裝置喚醒系統,則呼叫 enable_irq_wake()。 有關停用 IRQ 的相應函式,請參見 ssam_irq_disarm_wakeup()。
此函式旨在在進入 S2idle 掛起之前準備 IRQ。
注意
必須平衡對 ssam_irq_arm_for_wakeup() 和 ssam_irq_disarm_wakeup() 的呼叫。
-
void ssam_irq_disarm_wakeup(struct ssam_controller *ctrl)¶
解除喚醒 IRQ 的準備。
引數
struct ssam_controller *ctrl應解除 IRQ 準備的控制器。
描述
解除先前透過 ssam_irq_arm_for_wakeup() 設定的喚醒 IRQ 的準備。
此函式旨在退出 S2idle 掛起後解除 IRQ 的準備。
注意
必須平衡對 ssam_irq_arm_for_wakeup() 和 ssam_irq_disarm_wakeup() 的呼叫。
客戶端裝置匯流排¶
-
bool ssam_device_id_compatible(const struct ssam_device_id *id, struct ssam_device_uid uid)¶
檢查裝置 ID 是否與 UID 匹配。
引數
const struct ssam_device_id *id作為潛在匹配項的裝置 ID。
struct ssam_device_uid uid用於匹配的裝置 UID。
描述
檢查給定的 ID 是否與給定的 UID 匹配,即,具有提供的 UID 的裝置是否與給定的 ID 相容,遵循其 ssam_device_id.match_flags 成員中描述的匹配規則。
返回
如果給定的 UID 與給定的 ID 描述的匹配規則相容,則返回 true,否則返回 false。
-
bool ssam_device_id_is_null(const struct ssam_device_id *id)¶
檢查裝置 ID 是否為空。
引數
const struct ssam_device_id *id要檢查的裝置 ID。
描述
檢查給定的裝置 ID 是否為空,即,是否全部為零。 用於檢查 MODULE_DEVICE_TABLE(ssam, ...) 或類似列表的結尾。
返回
如果給定的 ID 表示空 ID,則返回 true,否則返回 false。
-
int ssam_bus_register(void)¶
註冊並設定 SSAM 客戶端裝置匯流排。
引數
void沒有引數
-
void ssam_bus_unregister(void)¶
取消註冊 SSAM 客戶端裝置匯流排。
引數
void沒有引數
核心¶
-
int ssam_try_set_controller(struct ssam_controller *ctrl)¶
嘗試設定主控制器引用。
引數
struct ssam_controller *ctrl引用應指向的控制器。
描述
如果尚未設定引用,則將主控制器引用設定為給定的指標。
返回
成功時返回零,如果已設定引用,則返回 -EEXIST。
-
void ssam_clear_controller(void)¶
刪除/清除主控制器引用。
引數
void沒有引數
描述
清除主控制器引用,即,將其設定為 NULL。 在關閉控制器之前應呼叫此函式。
跟蹤幫助器¶
-
void ssam_trace_ptr_uid(const void *ptr, char *uid_str)¶
將指標轉換為非指標 UID 字串。
引數
const void *ptr要轉換的指標。
char *uid_str長度為 SSAM_PTR_UID_LEN 的緩衝區,UID 將儲存在該緩衝區中。
描述
將給定的指標轉換為 UID 字串,該字串可以安全地與使用者空間和日誌共享,即,不會洩露實際的記憶體位置。
-
u16 ssam_trace_get_packet_seq(const struct ssh_packet *p)¶
讀取資料包的序列 ID。
引數
const struct ssh_packet *p資料包。
返回
如果存在,則返回資料包的序列 ID (SEQ) 欄位,如果不存在(例如,重新整理資料包),則返回 SSAM_SEQ_NOT_APPLICABLE。
-
u32 ssam_trace_get_request_id(const struct ssh_packet *p)¶
讀取資料包的請求 ID。
引數
const struct ssh_packet *p資料包。
返回
如果資料包表示帶有命令資料的請求,則返回資料包的請求 ID (RQID) 欄位,如果不是(例如,重新整理請求、控制資料包),則返回 SSAM_RQID_NOT_APPLICABLE。
-
u32 ssam_trace_get_request_tid(const struct ssh_packet *p)¶
讀取資料包的請求目標 ID。
引數
const struct ssh_packet *p資料包。
返回
如果資料包表示帶有命令資料的請求,則返回資料包的請求目標 ID (TID) 欄位,如果不是(例如,重新整理請求、控制資料包),則返回 SSAM_SSH_TID_NOT_APPLICABLE。
-
u32 ssam_trace_get_request_sid(const struct ssh_packet *p)¶
讀取資料包的請求源 ID。
引數
const struct ssh_packet *p資料包。
返回
如果資料包表示帶有命令資料的請求,則返回資料包的請求源 ID (SID) 欄位,如果不是(例如,重新整理請求、控制資料包),則返回 SSAM_SSH_TID_NOT_APPLICABLE。
-
u32 ssam_trace_get_request_tc(const struct ssh_packet *p)¶
讀取資料包的請求目標類別。
引數
const struct ssh_packet *p資料包。
返回
如果資料包表示帶有命令資料的請求,則返回資料包的請求目標類別 (TC) 欄位,如果不是(例如,重新整理請求、控制資料包),則返回 SSAM_SSH_TC_NOT_APPLICABLE。