內部 API 文件

資料包傳輸層

struct sshp_buf

用於 SSH 訊息的解析器緩衝區。

定義:

struct sshp_buf {
    u8 *ptr;
    size_t len;
    size_t cap;
};

成員

ptr

指向緩衝區開頭的指標。

len

緩衝區中使用的位元組數。

cap

緩衝區的最大容量。

void sshp_buf_init(struct sshp_buf *buf, u8 *ptr, size_t cap)

初始化 SSH 解析器緩衝區。

引數

struct sshp_buf *buf

要初始化的緩衝區。

u8 *ptr

支援緩衝區的記憶體。

size_t cap

支援緩衝區的記憶體長度,即其容量。

描述

使用給定的記憶體作為後備初始化緩衝區,並將其已用長度設定為零。

int sshp_buf_alloc(struct sshp_buf *buf, size_t cap, gfp_t flags)

分配並初始化 SSH 解析器緩衝區。

引數

struct sshp_buf *buf

要初始化/分配到的緩衝區。

size_t cap

緩衝區的所需容量。

gfp_t flags

用於分配記憶體的標誌。

描述

分配 cap 位元組,並使用分配的記憶體初始化提供的緩衝區結構。

返回

成功返回零,如果分配失敗,則返回 -ENOMEM

void sshp_buf_free(struct sshp_buf *buf)

釋放 SSH 解析器緩衝區。

引數

struct sshp_buf *buf

要釋放的緩衝區。

描述

透過釋放支援它的記憶體,然後將其指標重置為 NULL 並將長度和容量重置為零來釋放 SSH 解析器緩衝區。旨在釋放先前使用 sshp_buf_alloc() 分配的緩衝區。

void sshp_buf_drop(struct sshp_buf *buf, size_t n)

從緩衝區的開頭刪除資料。

引數

struct sshp_buf *buf

要從中刪除資料的緩衝區。

size_t n

要刪除的位元組數。

描述

從緩衝區中刪除前 n 個位元組。將任何剩餘資料重新對齊到緩衝區的開頭。

size_t sshp_buf_read_from_fifo(struct sshp_buf *buf, struct kfifo *fifo)

將資料從 fifo 傳輸到緩衝區。

引數

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 offset

span 應在緩衝區中開始的偏移量。

struct ssam_span *span

要初始化的 span (輸出)。

描述

初始化提供的 span 以指向緩衝區中給定偏移量的記憶體,span 的長度由偏移量後緩衝區中使用的位元組數(即偏移量後剩餘的位元組數)限制。

警告:此函式不驗證 offset 是否小於或等於緩衝區中使用的位元組數或緩衝區容量。這必須由呼叫者保證。

bool sshp_validate_crc(const struct ssam_span *src, const u8 *crc)

驗證原始訊息資料中的 CRC。

引數

const struct ssam_span *src

應該計算 CRC 的資料 span。

const u8 *crc

指向預期 u16 CRC 值的指標。

描述

計算提供的資料 span (src) 的 CRC,將其與儲存在給定地址 (crc) 的 CRC 進行比較,並返回此比較的結果,即如果相等則返回 true。此函式旨在對原始輸入/訊息資料執行。

返回

如果計算的 CRC 與儲存的 CRC 匹配,則返回 true,否則返回 false

bool sshp_starts_with_syn(const struct ssam_span *src)

檢查給定的資料是否以 SSH SYN 位元組開頭。

引數

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 *rem

span (輸出) 指示剩餘資料,如果找到,則以 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

指向已分配緩衝區空間末尾(最後一個元素之後的一個位置)的指標。

ptr

Pointer

void msgb_init(struct msgbuf *msgb, u8 *ptr, size_t cap)

初始化給定的訊息緩衝區結構。

引數

struct msgbuf *msgb

要初始化的緩衝區結構

u8 *ptr

Pointer

size_t cap

Size

描述

使用提供的記憶體作為後備初始化給定的訊息緩衝區結構。

size_t msgb_bytes_used(const struct msgbuf *msgb)

返回緩衝區中當前使用的位元組數。

引數

const struct msgbuf *msgb

訊息緩衝區。

void msgb_push_u16(struct msgbuf *msgb, u16 value)

將 u16 值推送到緩衝區。

引數

struct msgbuf *msgb

訊息緩衝區。

u16 value

要推送到緩衝區的值。

void msgb_push_syn(struct msgbuf *msgb)

將 SSH SYN 位元組推送到緩衝區。

引數

struct msgbuf *msgb

訊息緩衝區。

void msgb_push_buf(struct msgbuf *msgb, const u8 *buf, size_t len)

將原始資料推送到緩衝區。

引數

struct msgbuf *msgb

訊息緩衝區。

const u8 *buf

要推送到緩衝區的資料。

size_t len

要推送到緩衝區的資料的長度。

void msgb_push_crc(struct msgbuf *msgb, const u8 *buf, size_t len)

計算 CRC 並將其推送到緩衝區。

引數

struct msgbuf *msgb

訊息緩衝區。

const u8 *buf

Const

size_t len

The

void msgb_push_frame(struct msgbuf *msgb, u8 ty, u16 len, u8 seq)

將 SSH 訊息幀頭推送到緩衝區。

引數

struct msgbuf *msgb

The

u8 ty

幀的型別。

u16 len

幀的有效負載的長度。

u8 seq

幀/資料包的序列 ID。

void msgb_push_ack(struct msgbuf *msgb, u8 seq)

將 SSH ACK 幀推送到緩衝區。

引數

struct msgbuf *msgb

The

u8 seq

要 ACK 的幀/資料包的序列 ID。

void msgb_push_nak(struct msgbuf *msgb)

將 SSH NAK 幀推送到緩衝區。

引數

struct msgbuf *msgb

The

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 device *ssh_ptl_get_device(struct ssh_ptl *ptl)

獲取與資料包傳輸層關聯的裝置。

引數

struct ssh_ptl *ptl

資料包傳輸層。

返回

返回給定的資料包傳輸層構建於其上的裝置。

void ssh_ptl_tx_wakeup_transfer(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

要釋放的資料包。

void ssh_ptl_tx_wakeup_packet(struct ssh_ptl *ptl)

喚醒用於新資料包的資料包傳送器執行緒。

引數

struct ssh_ptl *ptl

資料包傳輸層。

描述

喚醒資料包傳送器執行緒,通知它新資料包已到達並準備好傳輸。如果資料包傳輸層已關閉,則對此函式的呼叫將被忽略。

int ssh_ptl_tx_start(struct ssh_ptl *ptl)

啟動資料包傳送器執行緒。

引數

struct ssh_ptl *ptl

資料包傳輸層。

返回

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

int ssh_ptl_tx_stop(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

要取消的資料包。

描述

取消資料包。無法保證何時將呼叫完成和釋放回調。這可能在此函式執行期間發生,也可能在稍後的任何時間點發生。

請注意,如果另一個程序併發完成該資料包,則不能保證實際取消該資料包。此函式的唯一保證是資料包將在合理的時間範圍內完成(成功、失敗或取消)並從傳輸層釋放。

可以在提交資料包之前呼叫,在這種情況下,任何稍後的資料包提交都會失敗。

int ssh_ptl_rx_start(struct ssh_ptl *ptl)

啟動資料包傳輸層接收器執行緒。

引數

struct ssh_ptl *ptl

資料包傳輸層。

返回

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

int ssh_ptl_rx_stop(struct ssh_ptl *ptl)

停止資料包傳輸層接收器執行緒。

引數

struct ssh_ptl *ptl

資料包傳輸層。

返回

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

ssize_t ssh_ptl_rx_rcvbuf(struct ssh_ptl *ptl, const u8 *buf, size_t n)

將來自下層傳輸的資料推送到資料包層。

引數

struct ssh_ptl *ptl

資料包傳輸層。

const u8 *buf

指向要推送到層的資料的指標。

size_t n

要推送到層的資料大小(以位元組為單位)。

描述

將來自下層傳輸的資料推送到資料包層的接收器 FIFO 緩衝區,並通知接收器執行緒。一旦資料包層已關閉,對此函式的呼叫將被忽略。

返回

成功時返回傳輸的位元組數(正數或零)。如果資料包層已關閉,則返回 -ESHUTDOWN

void ssh_ptl_shutdown(struct ssh_ptl *ptl)

關閉資料包傳輸層。

引數

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() 單獨啟動傳送器和接收器執行緒。

返回

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

void ssh_ptl_destroy(struct ssh_ptl *ptl)

取消初始化資料包傳輸層。

引數

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 device *ssh_rtl_get_device(struct ssh_rtl *rtl)

獲取與請求傳輸層關聯的裝置。

引數

struct ssh_rtl *rtl

請求傳輸層。

返回

返回給定的請求傳輸層構建於其上的裝置。

struct ssh_rtl *ssh_request_rtl(struct ssh_request *rqst)

獲取與請求關聯的請求傳輸層。

引數

struct ssh_request *rqst

要獲取請求傳輸層引用的請求。

返回

返回與給定的 SSH 請求關聯的 struct ssh_rtl

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

是否也取消待處理的請求。

描述

取消給定的請求。如果 pendingfalse,則這不會取消待處理的請求,即已經提交到資料包層但尚未完成的請求。如果 pendingtrue,則無論給定請求處於何種狀態,都會取消該請求。

如果已透過呼叫此函式取消請求,則請求的完成和釋放回調都會在合理的時間範圍內執行。這可能在此函式執行期間發生,但是,不能保證這一點。例如,當前正在傳輸的請求只有在傳輸完成後才會取消/完成,並且相應的回撥將在傳送器執行緒上執行,這可能在取消函式執行期間發生,也可能在取消函式執行後的一段時間發生。

返回

如果給定的請求已被此函式或在呼叫此函式之前取消或完成,則返回 true,否則返回 false。如果 pendingtrue,則此函式將始終返回 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() 單獨啟動傳送器和接收器執行緒。

返回

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

void ssh_rtl_destroy(struct ssh_rtl *rtl)

取消初始化請求傳輸層。

引數

struct ssh_rtl *rtl

要取消初始化的請求傳輸層。

描述

取消初始化給定的請求傳輸層並釋放與其關聯的資源。如果接收器和/或傳送器執行緒已啟動,則必須先透過 ssh_rtl_shutdown() 關閉該層,然後才能呼叫此函式。

int ssh_rtl_start(struct ssh_rtl *rtl)

啟動請求傳送器和接收器。

引數

struct ssh_rtl *rtl

請求傳輸層。

返回

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

int ssh_rtl_flush(struct ssh_rtl *rtl, unsigned long timeout)

重新整理請求傳輸層。

引數

struct ssh_rtl *rtl

請求傳輸層

unsigned long timeout

重新整理操作的超時時間(單位為 jiffies)

描述

將特殊的重新整理請求排隊並等待其完成。此請求將在所有其他當前排隊和掛起的請求完成後完成。此請求不是提交正常的資料包,而是提交特殊的重新整理包,這意味著完成時,也會重新整理底層的資料包傳輸層。

重新整理請求層可確保在此呼叫返回之前,所有先前提交的請求都已完全完成。此外,重新整理會阻止所有稍後提交的請求的執行,直到重新整理完成為止。

如果呼叫方確保在此函式呼叫之後不提交新請求,則保證在此呼叫返回時,請求傳輸層沒有剩餘請求。相同的保證不適用於資料包層,在此呼叫之後,控制資料包可能仍在排隊。

返回

成功時返回零,如果重新整理超時並由於超時而取消,則返回 -ETIMEDOUT,如果在此呼叫之前資料包和/或請求傳輸層已關閉,則返回 -ESHUTDOWN。如果底層資料包傳輸已中斷,也可能返回 -EINTR

void ssh_rtl_shutdown(struct ssh_rtl *rtl)

關閉請求傳輸層。

引數

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.target

struct 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_profile

SSH 電源配置檔案。

ssh_buffer_size

SSH 驅動程式 UART 緩衝區大小。

screen_on_sleep_idle_timeout

SAM UART 螢幕開啟睡眠空閒超時。

screen_off_sleep_idle_timeout

SAM UART 螢幕關閉睡眠空閒超時。

d3_closes_handle

SAM 在 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_HANDLEDSSAM_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

bool ssam_nf_refcount_empty(struct ssam_nf *nf)

測試通知系統是否具有任何已啟用/啟用的事件。

引數

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 的值,指示該事件不會未經處理/忽略。如果未註冊的回撥可以處理事件,此函式將發出警告。

如果回撥失敗,此函式將發出錯誤訊息。

int ssam_nf_init(struct ssam_nf *nf)

初始化通知器系統。

引數

struct ssam_nf *nf

要初始化的通知器系統。

void ssam_nf_destroy(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)。

bool ssam_cplt_submit(struct ssam_cplt *cplt, struct work_struct *work)

將工作項提交到完成系統工作佇列。

引數

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

void ssam_cplt_flush(struct ssam_cplt *cplt)

重新整理完成系統。

引數

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

要初始化的事件佇列。

int ssam_cplt_init(struct ssam_cplt *cplt, struct device *dev)

初始化完成系統。

引數

struct ssam_cplt *cplt

要初始化的完成系統。

struct device *dev

用於日誌記錄的裝置。

void ssam_cplt_destroy(struct ssam_cplt *cplt)

取消初始化完成系統。

引數

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 handle

ACPI 控制器/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 中斷。

引數

struct ssam_controller *ctrl

應為其釋放 IRQ 的控制器。

描述

釋放先前透過 ssam_irq_setup() 設定的喚醒 GPIO IRQ。

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