客户端驱动程序 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 消息中到帧中指定字段的偏移量。
-
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 Aggregator 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
的后缀,例如FLUSH
、DATA
、ACK
或NAK
。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
。用于数据包超时实现。在首次提交后持有挂起锁时才能访问。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
)提供。如果请求没有任何响应或未成功完成,则
cmd
和data
参数都将为 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 传输数据包。
节点
请求队列和待处理集合的列表节点。
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
。
-
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)。它旨在用作通过 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
表示通知已被处理。如果处理程序可以或已经对提供给它的事件采取了行动,则应由处理程序设置此标志。如果处理程序不是为提供的事件设计的主要处理程序,则不应设置此标志。
如果在遍历通知程序链后,任何处理程序都未设置此标志,则会发出警告,指出该事件尚未被处理。
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;
};
成员
节点
通知程序列表的节点。
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
事件源的目标类别。
实例
事件源的实例 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 *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
函数代表读/写信号量的读锁部分。导致控制器状态转换的操作必须在持有此读/写信号量的写锁部分时执行(请参阅 ssam_controller_lock()
和 ssam_controller_unlock())。
有关相应的解锁函数,请参阅 ssam_controller_stateunlock()
。
-
void ssam_controller_stateunlock(struct ssam_controller *c)¶
解锁控制器状态转换。
-
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
,则会禁用该事件。
对于热插拔设备非常有用,一旦物理删除设备,通信可能会失败。在这种情况下,将 disable
指定为 false
可以避免与 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()
。
-
int ssam_client_link(struct ssam_controller *c, struct device *client)¶
将任意客户端设备链接到控制器。
参数
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;
};
成员
域
设备的域。
类别
设备的目标类别。
目标
设备的目标 ID。
实例
设备的实例 ID。
功能
设备的子功能。此字段可用于将单个 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_ANY
、SSAM_SSH_IID_ANY
和 SSAM_SSH_FUN_ANY
来指定匹配应分别忽略目标 ID、实例 ID 和/或子功能。此宏根据给定的参数初始化 match_flags
字段。
注意
参数 d 和 cat 必须是有效的 u8
值,参数 tid、iid 和 fun 必须是有效的 u8
值,或者分别是 SSAM_SSH_TID_ANY
、SSAM_SSH_IID_ANY
或 SSAM_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_ANY
、 SSAM_SSH_IID_ANY
和 SSAM_SSH_FUN_ANY
可分别用于指定匹配时应忽略目标 ID、实例 ID 和/或子功能。此宏会根据给定的参数初始化 match_flags
字段。
注意
参数 cat 必须是有效的 u8
值,参数 tid、 iid 和 fun 必须是有效的 u8
值或 SSAM_SSH_TID_ANY
、 SSAM_SSH_IID_ANY
或 SSAM_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_ANY
、 SSAM_SSH_IID_ANY
和 SSAM_SSH_FUN_ANY
可分别用于指定匹配时应忽略目标 ID、实例 ID 和/或子功能。此宏会根据给定的参数初始化 match_flags
字段。
注意
参数 cat 必须是有效的 u8
值,参数 tid、 iid 和 fun 必须是有效的 u8
值或 SSAM_SSH_TID_ANY
、 SSAM_SSH_IID_ANY
或 SSAM_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
当驱动程序从设备解除绑定时调用。
参数
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()
。
返回
返回指向包装给定设备 d 的 struct ssam_device
的指针。
-
to_ssam_device_driver¶
to_ssam_device_driver (d)
将给定设备驱动程序强制转换为 SSAM 客户端设备驱动程序。
参数
d
要强制转换的驱动程序。
描述
将给定的 struct device_driver
强制转换为 struct ssam_device_driver
。调用方必须确保给定的驱动程序实际包含在 struct ssam_device_driver
中。
返回
返回指向包装给定设备驱动程序 d 的 struct 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 客户端设备的驱动程序数据。
-
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 设备驱动程序注册的辅助宏。
-
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,在调用此函数时提供。生成的函数负责设置请求结构、缓冲区分配以及请求本身的执行,在请求完全完成后返回。所需的传输缓冲区将在堆栈上分配。
生成的函数定义为 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,在调用此函数时提供。生成的函数负责设置请求结构、缓冲区分配以及请求本身的执行,在请求完全完成后返回。所需的传输缓冲区将在堆栈上分配。
生成的函数定义为 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,在调用此函数时提供。生成的函数负责设置请求结构、缓冲区分配以及请求本身的执行,在请求完全完成后返回。所需的传输缓冲区将在堆栈上分配。
生成的函数定义为 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,在调用此函数时提供。生成的函数负责设置请求结构、缓冲区分配以及请求本身的执行,在请求完全完成后返回。所需的传输缓冲区将在堆栈上分配。
生成的函数定义为 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 和固件节点)时使用(如设备注册表的平台中心中所做的那样)。
返回
成功时返回零,失败时返回非零。
参数
struct device *dev
要删除所有直接客户端的(父)设备。
描述
删除在给定设备下注册为直接子节点的所有 SSAM 客户端设备。请注意,这仅针对设备的直接子节点。有关更多详细信息,请参阅 ssam_device_add()
/ssam_device_remove()
。