| /* SPDX-License-Identifier: GPL-2.0+ */ |
| /* |
| * Trace points for SSAM/SSH. |
| * |
| * Copyright (C) 2020-2022 Maximilian Luz <luzmaximilian@gmail.com> |
| */ |
| |
| #undef TRACE_SYSTEM |
| #define TRACE_SYSTEM surface_aggregator |
| |
| #if !defined(_SURFACE_AGGREGATOR_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) |
| #define _SURFACE_AGGREGATOR_TRACE_H |
| |
| #include <linux/surface_aggregator/serial_hub.h> |
| |
| #include <linux/unaligned.h> |
| #include <linux/tracepoint.h> |
| |
| TRACE_DEFINE_ENUM(SSH_FRAME_TYPE_DATA_SEQ); |
| TRACE_DEFINE_ENUM(SSH_FRAME_TYPE_DATA_NSQ); |
| TRACE_DEFINE_ENUM(SSH_FRAME_TYPE_ACK); |
| TRACE_DEFINE_ENUM(SSH_FRAME_TYPE_NAK); |
| |
| TRACE_DEFINE_ENUM(SSH_PACKET_SF_LOCKED_BIT); |
| TRACE_DEFINE_ENUM(SSH_PACKET_SF_QUEUED_BIT); |
| TRACE_DEFINE_ENUM(SSH_PACKET_SF_PENDING_BIT); |
| TRACE_DEFINE_ENUM(SSH_PACKET_SF_TRANSMITTING_BIT); |
| TRACE_DEFINE_ENUM(SSH_PACKET_SF_TRANSMITTED_BIT); |
| TRACE_DEFINE_ENUM(SSH_PACKET_SF_ACKED_BIT); |
| TRACE_DEFINE_ENUM(SSH_PACKET_SF_CANCELED_BIT); |
| TRACE_DEFINE_ENUM(SSH_PACKET_SF_COMPLETED_BIT); |
| |
| TRACE_DEFINE_ENUM(SSH_PACKET_TY_FLUSH_BIT); |
| TRACE_DEFINE_ENUM(SSH_PACKET_TY_SEQUENCED_BIT); |
| TRACE_DEFINE_ENUM(SSH_PACKET_TY_BLOCKING_BIT); |
| |
| TRACE_DEFINE_ENUM(SSH_PACKET_FLAGS_SF_MASK); |
| TRACE_DEFINE_ENUM(SSH_PACKET_FLAGS_TY_MASK); |
| |
| TRACE_DEFINE_ENUM(SSH_REQUEST_SF_LOCKED_BIT); |
| TRACE_DEFINE_ENUM(SSH_REQUEST_SF_QUEUED_BIT); |
| TRACE_DEFINE_ENUM(SSH_REQUEST_SF_PENDING_BIT); |
| TRACE_DEFINE_ENUM(SSH_REQUEST_SF_TRANSMITTING_BIT); |
| TRACE_DEFINE_ENUM(SSH_REQUEST_SF_TRANSMITTED_BIT); |
| TRACE_DEFINE_ENUM(SSH_REQUEST_SF_RSPRCVD_BIT); |
| TRACE_DEFINE_ENUM(SSH_REQUEST_SF_CANCELED_BIT); |
| TRACE_DEFINE_ENUM(SSH_REQUEST_SF_COMPLETED_BIT); |
| |
| TRACE_DEFINE_ENUM(SSH_REQUEST_TY_FLUSH_BIT); |
| TRACE_DEFINE_ENUM(SSH_REQUEST_TY_HAS_RESPONSE_BIT); |
| |
| TRACE_DEFINE_ENUM(SSH_REQUEST_FLAGS_SF_MASK); |
| TRACE_DEFINE_ENUM(SSH_REQUEST_FLAGS_TY_MASK); |
| |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_SAM); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_BAT); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_TMP); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_PMC); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_FAN); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_PoM); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_DBG); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_KBD); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_FWU); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_UNI); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_LPC); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_TCL); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_SFL); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_KIP); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_EXT); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_BLD); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_BAS); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_SEN); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_SRQ); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_MCU); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_HID); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_TCH); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_BKL); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_TAM); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_ACC0); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_UFI); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_USC); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_PEN); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_VID); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_AUD); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_SMC); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_KPD); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_REG); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_SPT); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_SYS); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_ACC1); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_SHB); |
| TRACE_DEFINE_ENUM(SSAM_SSH_TC_POS); |
| |
| #define SSAM_PTR_UID_LEN 9 |
| #define SSAM_U8_FIELD_NOT_APPLICABLE ((u16)-1) |
| #define SSAM_SEQ_NOT_APPLICABLE ((u16)-1) |
| #define SSAM_RQID_NOT_APPLICABLE ((u32)-1) |
| #define SSAM_SSH_TC_NOT_APPLICABLE 0 |
| #define SSAM_SSH_TID_NOT_APPLICABLE ((u8)-1) |
| |
| #ifndef _SURFACE_AGGREGATOR_TRACE_HELPERS |
| #define _SURFACE_AGGREGATOR_TRACE_HELPERS |
| |
| /** |
| * ssam_trace_ptr_uid() - Convert the pointer to a non-pointer UID string. |
| * @ptr: The pointer to convert. |
| * @uid_str: A buffer of length SSAM_PTR_UID_LEN where the UID will be stored. |
| * |
| * Converts the given pointer into a UID string that is safe to be shared |
| * with userspace and logs, i.e. doesn't give away the real memory location. |
| */ |
| static inline void ssam_trace_ptr_uid(const void *ptr, char *uid_str) |
| { |
| char buf[2 * sizeof(void *) + 1]; |
| |
| BUILD_BUG_ON(ARRAY_SIZE(buf) < SSAM_PTR_UID_LEN); |
| |
| snprintf(buf, ARRAY_SIZE(buf), "%p", ptr); |
| memcpy(uid_str, &buf[ARRAY_SIZE(buf) - SSAM_PTR_UID_LEN], |
| SSAM_PTR_UID_LEN); |
| } |
| |
| /** |
| * ssam_trace_get_packet_seq() - Read the packet's sequence ID. |
| * @p: The packet. |
| * |
| * Return: Returns the packet's sequence ID (SEQ) field if present, or |
| * %SSAM_SEQ_NOT_APPLICABLE if not (e.g. flush packet). |
| */ |
| static inline u16 ssam_trace_get_packet_seq(const struct ssh_packet *p) |
| { |
| if (!p->data.ptr || p->data.len < SSH_MESSAGE_LENGTH(0)) |
| return SSAM_SEQ_NOT_APPLICABLE; |
| |
| return p->data.ptr[SSH_MSGOFFSET_FRAME(seq)]; |
| } |
| |
| /** |
| * ssam_trace_get_request_id() - Read the packet's request ID. |
| * @p: The packet. |
| * |
| * Return: Returns the packet's request ID (RQID) field if the packet |
| * represents a request with command data, or %SSAM_RQID_NOT_APPLICABLE if not |
| * (e.g. flush request, control packet). |
| */ |
| static inline u32 ssam_trace_get_request_id(const struct ssh_packet *p) |
| { |
| if (!p->data.ptr || p->data.len < SSH_COMMAND_MESSAGE_LENGTH(0)) |
| return SSAM_RQID_NOT_APPLICABLE; |
| |
| return get_unaligned_le16(&p->data.ptr[SSH_MSGOFFSET_COMMAND(rqid)]); |
| } |
| |
| /** |
| * ssam_trace_get_request_tid() - Read the packet's request target ID. |
| * @p: The packet. |
| * |
| * Return: Returns the packet's request target ID (TID) field if the packet |
| * represents a request with command data, or %SSAM_SSH_TID_NOT_APPLICABLE |
| * if not (e.g. flush request, control packet). |
| */ |
| static inline u32 ssam_trace_get_request_tid(const struct ssh_packet *p) |
| { |
| if (!p->data.ptr || p->data.len < SSH_COMMAND_MESSAGE_LENGTH(0)) |
| return SSAM_SSH_TID_NOT_APPLICABLE; |
| |
| return get_unaligned_le16(&p->data.ptr[SSH_MSGOFFSET_COMMAND(tid)]); |
| } |
| |
| /** |
| * ssam_trace_get_request_sid() - Read the packet's request source ID. |
| * @p: The packet. |
| * |
| * Return: Returns the packet's request source ID (SID) field if the packet |
| * represents a request with command data, or %SSAM_SSH_TID_NOT_APPLICABLE |
| * if not (e.g. flush request, control packet). |
| */ |
| static inline u32 ssam_trace_get_request_sid(const struct ssh_packet *p) |
| { |
| if (!p->data.ptr || p->data.len < SSH_COMMAND_MESSAGE_LENGTH(0)) |
| return SSAM_SSH_TID_NOT_APPLICABLE; |
| |
| return get_unaligned_le16(&p->data.ptr[SSH_MSGOFFSET_COMMAND(sid)]); |
| } |
| |
| /** |
| * ssam_trace_get_request_tc() - Read the packet's request target category. |
| * @p: The packet. |
| * |
| * Return: Returns the packet's request target category (TC) field if the |
| * packet represents a request with command data, or %SSAM_SSH_TC_NOT_APPLICABLE |
| * if not (e.g. flush request, control packet). |
| */ |
| static inline u32 ssam_trace_get_request_tc(const struct ssh_packet *p) |
| { |
| if (!p->data.ptr || p->data.len < SSH_COMMAND_MESSAGE_LENGTH(0)) |
| return SSAM_SSH_TC_NOT_APPLICABLE; |
| |
| return get_unaligned_le16(&p->data.ptr[SSH_MSGOFFSET_COMMAND(tc)]); |
| } |
| |
| #endif /* _SURFACE_AGGREGATOR_TRACE_HELPERS */ |
| |
| #define ssam_trace_get_command_field_u8(packet, field) \ |
| ((!(packet) || (packet)->data.len < SSH_COMMAND_MESSAGE_LENGTH(0)) \ |
| ? 0 : (packet)->data.ptr[SSH_MSGOFFSET_COMMAND(field)]) |
| |
| #define ssam_show_generic_u8_field(value) \ |
| __print_symbolic(value, \ |
| { SSAM_U8_FIELD_NOT_APPLICABLE, "N/A" } \ |
| ) |
| |
| #define ssam_show_frame_type(ty) \ |
| __print_symbolic(ty, \ |
| { SSH_FRAME_TYPE_DATA_SEQ, "DSEQ" }, \ |
| { SSH_FRAME_TYPE_DATA_NSQ, "DNSQ" }, \ |
| { SSH_FRAME_TYPE_ACK, "ACK" }, \ |
| { SSH_FRAME_TYPE_NAK, "NAK" } \ |
| ) |
| |
| #define ssam_show_packet_type(type) \ |
| __print_flags(flags & SSH_PACKET_FLAGS_TY_MASK, "", \ |
| { BIT(SSH_PACKET_TY_FLUSH_BIT), "F" }, \ |
| { BIT(SSH_PACKET_TY_SEQUENCED_BIT), "S" }, \ |
| { BIT(SSH_PACKET_TY_BLOCKING_BIT), "B" } \ |
| ) |
| |
| #define ssam_show_packet_state(state) \ |
| __print_flags(flags & SSH_PACKET_FLAGS_SF_MASK, "", \ |
| { BIT(SSH_PACKET_SF_LOCKED_BIT), "L" }, \ |
| { BIT(SSH_PACKET_SF_QUEUED_BIT), "Q" }, \ |
| { BIT(SSH_PACKET_SF_PENDING_BIT), "P" }, \ |
| { BIT(SSH_PACKET_SF_TRANSMITTING_BIT), "S" }, \ |
| { BIT(SSH_PACKET_SF_TRANSMITTED_BIT), "T" }, \ |
| { BIT(SSH_PACKET_SF_ACKED_BIT), "A" }, \ |
| { BIT(SSH_PACKET_SF_CANCELED_BIT), "C" }, \ |
| { BIT(SSH_PACKET_SF_COMPLETED_BIT), "F" } \ |
| ) |
| |
| #define ssam_show_packet_seq(seq) \ |
| __print_symbolic(seq, \ |
| { SSAM_SEQ_NOT_APPLICABLE, "N/A" } \ |
| ) |
| |
| #define ssam_show_request_type(flags) \ |
| __print_flags((flags) & SSH_REQUEST_FLAGS_TY_MASK, "", \ |
| { BIT(SSH_REQUEST_TY_FLUSH_BIT), "F" }, \ |
| { BIT(SSH_REQUEST_TY_HAS_RESPONSE_BIT), "R" } \ |
| ) |
| |
| #define ssam_show_request_state(flags) \ |
| __print_flags((flags) & SSH_REQUEST_FLAGS_SF_MASK, "", \ |
| { BIT(SSH_REQUEST_SF_LOCKED_BIT), "L" }, \ |
| { BIT(SSH_REQUEST_SF_QUEUED_BIT), "Q" }, \ |
| { BIT(SSH_REQUEST_SF_PENDING_BIT), "P" }, \ |
| { BIT(SSH_REQUEST_SF_TRANSMITTING_BIT), "S" }, \ |
| { BIT(SSH_REQUEST_SF_TRANSMITTED_BIT), "T" }, \ |
| { BIT(SSH_REQUEST_SF_RSPRCVD_BIT), "A" }, \ |
| { BIT(SSH_REQUEST_SF_CANCELED_BIT), "C" }, \ |
| { BIT(SSH_REQUEST_SF_COMPLETED_BIT), "F" } \ |
| ) |
| |
| #define ssam_show_request_id(rqid) \ |
| __print_symbolic(rqid, \ |
| { SSAM_RQID_NOT_APPLICABLE, "N/A" } \ |
| ) |
| |
| #define ssam_show_ssh_tid(tid) \ |
| __print_symbolic(tid, \ |
| { SSAM_SSH_TID_NOT_APPLICABLE, "N/A" }, \ |
| { SSAM_SSH_TID_HOST, "Host" }, \ |
| { SSAM_SSH_TID_SAM, "SAM" }, \ |
| { SSAM_SSH_TID_KIP, "KIP" }, \ |
| { SSAM_SSH_TID_DEBUG, "Debug" }, \ |
| { SSAM_SSH_TID_SURFLINK, "SurfLink" } \ |
| ) |
| |
| #define ssam_show_ssh_tc(tc) \ |
| __print_symbolic(tc, \ |
| { SSAM_SSH_TC_NOT_APPLICABLE, "N/A" }, \ |
| { SSAM_SSH_TC_SAM, "SAM" }, \ |
| { SSAM_SSH_TC_BAT, "BAT" }, \ |
| { SSAM_SSH_TC_TMP, "TMP" }, \ |
| { SSAM_SSH_TC_PMC, "PMC" }, \ |
| { SSAM_SSH_TC_FAN, "FAN" }, \ |
| { SSAM_SSH_TC_PoM, "PoM" }, \ |
| { SSAM_SSH_TC_DBG, "DBG" }, \ |
| { SSAM_SSH_TC_KBD, "KBD" }, \ |
| { SSAM_SSH_TC_FWU, "FWU" }, \ |
| { SSAM_SSH_TC_UNI, "UNI" }, \ |
| { SSAM_SSH_TC_LPC, "LPC" }, \ |
| { SSAM_SSH_TC_TCL, "TCL" }, \ |
| { SSAM_SSH_TC_SFL, "SFL" }, \ |
| { SSAM_SSH_TC_KIP, "KIP" }, \ |
| { SSAM_SSH_TC_EXT, "EXT" }, \ |
| { SSAM_SSH_TC_BLD, "BLD" }, \ |
| { SSAM_SSH_TC_BAS, "BAS" }, \ |
| { SSAM_SSH_TC_SEN, "SEN" }, \ |
| { SSAM_SSH_TC_SRQ, "SRQ" }, \ |
| { SSAM_SSH_TC_MCU, "MCU" }, \ |
| { SSAM_SSH_TC_HID, "HID" }, \ |
| { SSAM_SSH_TC_TCH, "TCH" }, \ |
| { SSAM_SSH_TC_BKL, "BKL" }, \ |
| { SSAM_SSH_TC_TAM, "TAM" }, \ |
| { SSAM_SSH_TC_ACC0, "ACC0" }, \ |
| { SSAM_SSH_TC_UFI, "UFI" }, \ |
| { SSAM_SSH_TC_USC, "USC" }, \ |
| { SSAM_SSH_TC_PEN, "PEN" }, \ |
| { SSAM_SSH_TC_VID, "VID" }, \ |
| { SSAM_SSH_TC_AUD, "AUD" }, \ |
| { SSAM_SSH_TC_SMC, "SMC" }, \ |
| { SSAM_SSH_TC_KPD, "KPD" }, \ |
| { SSAM_SSH_TC_REG, "REG" }, \ |
| { SSAM_SSH_TC_SPT, "SPT" }, \ |
| { SSAM_SSH_TC_SYS, "SYS" }, \ |
| { SSAM_SSH_TC_ACC1, "ACC1" }, \ |
| { SSAM_SSH_TC_SHB, "SMB" }, \ |
| { SSAM_SSH_TC_POS, "POS" } \ |
| ) |
| |
| DECLARE_EVENT_CLASS(ssam_frame_class, |
| TP_PROTO(const struct ssh_frame *frame), |
| |
| TP_ARGS(frame), |
| |
| TP_STRUCT__entry( |
| __field(u8, type) |
| __field(u8, seq) |
| __field(u16, len) |
| ), |
| |
| TP_fast_assign( |
| __entry->type = frame->type; |
| __entry->seq = frame->seq; |
| __entry->len = get_unaligned_le16(&frame->len); |
| ), |
| |
| TP_printk("ty=%s, seq=%#04x, len=%u", |
| ssam_show_frame_type(__entry->type), |
| __entry->seq, |
| __entry->len |
| ) |
| ); |
| |
| #define DEFINE_SSAM_FRAME_EVENT(name) \ |
| DEFINE_EVENT(ssam_frame_class, ssam_##name, \ |
| TP_PROTO(const struct ssh_frame *frame), \ |
| TP_ARGS(frame) \ |
| ) |
| |
| DECLARE_EVENT_CLASS(ssam_command_class, |
| TP_PROTO(const struct ssh_command *cmd, u16 len), |
| |
| TP_ARGS(cmd, len), |
| |
| TP_STRUCT__entry( |
| __field(u16, rqid) |
| __field(u16, len) |
| __field(u8, tid) |
| __field(u8, sid) |
| __field(u8, tc) |
| __field(u8, cid) |
| __field(u8, iid) |
| ), |
| |
| TP_fast_assign( |
| __entry->rqid = get_unaligned_le16(&cmd->rqid); |
| __entry->tid = cmd->tid; |
| __entry->sid = cmd->sid; |
| __entry->tc = cmd->tc; |
| __entry->cid = cmd->cid; |
| __entry->iid = cmd->iid; |
| __entry->len = len; |
| ), |
| |
| TP_printk("rqid=%#06x, tid=%s, sid=%s, tc=%s, cid=%#04x, iid=%#04x, len=%u", |
| __entry->rqid, |
| ssam_show_ssh_tid(__entry->tid), |
| ssam_show_ssh_tid(__entry->sid), |
| ssam_show_ssh_tc(__entry->tc), |
| __entry->cid, |
| __entry->iid, |
| __entry->len |
| ) |
| ); |
| |
| #define DEFINE_SSAM_COMMAND_EVENT(name) \ |
| DEFINE_EVENT(ssam_command_class, ssam_##name, \ |
| TP_PROTO(const struct ssh_command *cmd, u16 len), \ |
| TP_ARGS(cmd, len) \ |
| ) |
| |
| DECLARE_EVENT_CLASS(ssam_packet_class, |
| TP_PROTO(const struct ssh_packet *packet), |
| |
| TP_ARGS(packet), |
| |
| TP_STRUCT__entry( |
| __field(unsigned long, state) |
| __array(char, uid, SSAM_PTR_UID_LEN) |
| __field(u8, priority) |
| __field(u16, length) |
| __field(u16, seq) |
| ), |
| |
| TP_fast_assign( |
| __entry->state = READ_ONCE(packet->state); |
| ssam_trace_ptr_uid(packet, __entry->uid); |
| __entry->priority = READ_ONCE(packet->priority); |
| __entry->length = packet->data.len; |
| __entry->seq = ssam_trace_get_packet_seq(packet); |
| ), |
| |
| TP_printk("uid=%s, seq=%s, ty=%s, pri=%#04x, len=%u, sta=%s", |
| __entry->uid, |
| ssam_show_packet_seq(__entry->seq), |
| ssam_show_packet_type(__entry->state), |
| __entry->priority, |
| __entry->length, |
| ssam_show_packet_state(__entry->state) |
| ) |
| ); |
| |
| #define DEFINE_SSAM_PACKET_EVENT(name) \ |
| DEFINE_EVENT(ssam_packet_class, ssam_##name, \ |
| TP_PROTO(const struct ssh_packet *packet), \ |
| TP_ARGS(packet) \ |
| ) |
| |
| DECLARE_EVENT_CLASS(ssam_packet_status_class, |
| TP_PROTO(const struct ssh_packet *packet, int status), |
| |
| TP_ARGS(packet, status), |
| |
| TP_STRUCT__entry( |
| __field(unsigned long, state) |
| __field(int, status) |
| __array(char, uid, SSAM_PTR_UID_LEN) |
| __field(u8, priority) |
| __field(u16, length) |
| __field(u16, seq) |
| ), |
| |
| TP_fast_assign( |
| __entry->state = READ_ONCE(packet->state); |
| __entry->status = status; |
| ssam_trace_ptr_uid(packet, __entry->uid); |
| __entry->priority = READ_ONCE(packet->priority); |
| __entry->length = packet->data.len; |
| __entry->seq = ssam_trace_get_packet_seq(packet); |
| ), |
| |
| TP_printk("uid=%s, seq=%s, ty=%s, pri=%#04x, len=%u, sta=%s, status=%d", |
| __entry->uid, |
| ssam_show_packet_seq(__entry->seq), |
| ssam_show_packet_type(__entry->state), |
| __entry->priority, |
| __entry->length, |
| ssam_show_packet_state(__entry->state), |
| __entry->status |
| ) |
| ); |
| |
| #define DEFINE_SSAM_PACKET_STATUS_EVENT(name) \ |
| DEFINE_EVENT(ssam_packet_status_class, ssam_##name, \ |
| TP_PROTO(const struct ssh_packet *packet, int status), \ |
| TP_ARGS(packet, status) \ |
| ) |
| |
| DECLARE_EVENT_CLASS(ssam_request_class, |
| TP_PROTO(const struct ssh_request *request), |
| |
| TP_ARGS(request), |
| |
| TP_STRUCT__entry( |
| __field(unsigned long, state) |
| __field(u32, rqid) |
| __array(char, uid, SSAM_PTR_UID_LEN) |
| __field(u8, tc) |
| __field(u16, cid) |
| __field(u16, iid) |
| __field(u8, tid) |
| __field(u8, sid) |
| ), |
| |
| TP_fast_assign( |
| const struct ssh_packet *p = &request->packet; |
| |
| /* Use packet for UID so we can match requests to packets. */ |
| __entry->state = READ_ONCE(request->state); |
| __entry->rqid = ssam_trace_get_request_id(p); |
| ssam_trace_ptr_uid(p, __entry->uid); |
| __entry->tid = ssam_trace_get_request_tid(p); |
| __entry->sid = ssam_trace_get_request_sid(p); |
| __entry->tc = ssam_trace_get_request_tc(p); |
| __entry->cid = ssam_trace_get_command_field_u8(p, cid); |
| __entry->iid = ssam_trace_get_command_field_u8(p, iid); |
| ), |
| |
| TP_printk("uid=%s, rqid=%s, ty=%s, sta=%s, tid=%s, sid=%s, tc=%s, cid=%s, iid=%s", |
| __entry->uid, |
| ssam_show_request_id(__entry->rqid), |
| ssam_show_request_type(__entry->state), |
| ssam_show_request_state(__entry->state), |
| ssam_show_ssh_tid(__entry->tid), |
| ssam_show_ssh_tid(__entry->sid), |
| ssam_show_ssh_tc(__entry->tc), |
| ssam_show_generic_u8_field(__entry->cid), |
| ssam_show_generic_u8_field(__entry->iid) |
| ) |
| ); |
| |
| #define DEFINE_SSAM_REQUEST_EVENT(name) \ |
| DEFINE_EVENT(ssam_request_class, ssam_##name, \ |
| TP_PROTO(const struct ssh_request *request), \ |
| TP_ARGS(request) \ |
| ) |
| |
| DECLARE_EVENT_CLASS(ssam_request_status_class, |
| TP_PROTO(const struct ssh_request *request, int status), |
| |
| TP_ARGS(request, status), |
| |
| TP_STRUCT__entry( |
| __field(unsigned long, state) |
| __field(u32, rqid) |
| __field(int, status) |
| __array(char, uid, SSAM_PTR_UID_LEN) |
| __field(u8, tc) |
| __field(u16, cid) |
| __field(u16, iid) |
| __field(u8, tid) |
| __field(u8, sid) |
| ), |
| |
| TP_fast_assign( |
| const struct ssh_packet *p = &request->packet; |
| |
| /* Use packet for UID so we can match requests to packets. */ |
| __entry->state = READ_ONCE(request->state); |
| __entry->rqid = ssam_trace_get_request_id(p); |
| __entry->status = status; |
| ssam_trace_ptr_uid(p, __entry->uid); |
| __entry->tid = ssam_trace_get_request_tid(p); |
| __entry->sid = ssam_trace_get_request_sid(p); |
| __entry->tc = ssam_trace_get_request_tc(p); |
| __entry->cid = ssam_trace_get_command_field_u8(p, cid); |
| __entry->iid = ssam_trace_get_command_field_u8(p, iid); |
| ), |
| |
| TP_printk("uid=%s, rqid=%s, ty=%s, sta=%s, tid=%s, sid=%s, tc=%s, cid=%s, iid=%s, status=%d", |
| __entry->uid, |
| ssam_show_request_id(__entry->rqid), |
| ssam_show_request_type(__entry->state), |
| ssam_show_request_state(__entry->state), |
| ssam_show_ssh_tid(__entry->tid), |
| ssam_show_ssh_tid(__entry->sid), |
| ssam_show_ssh_tc(__entry->tc), |
| ssam_show_generic_u8_field(__entry->cid), |
| ssam_show_generic_u8_field(__entry->iid), |
| __entry->status |
| ) |
| ); |
| |
| #define DEFINE_SSAM_REQUEST_STATUS_EVENT(name) \ |
| DEFINE_EVENT(ssam_request_status_class, ssam_##name, \ |
| TP_PROTO(const struct ssh_request *request, int status),\ |
| TP_ARGS(request, status) \ |
| ) |
| |
| DECLARE_EVENT_CLASS(ssam_alloc_class, |
| TP_PROTO(void *ptr, size_t len), |
| |
| TP_ARGS(ptr, len), |
| |
| TP_STRUCT__entry( |
| __field(size_t, len) |
| __array(char, uid, SSAM_PTR_UID_LEN) |
| ), |
| |
| TP_fast_assign( |
| __entry->len = len; |
| ssam_trace_ptr_uid(ptr, __entry->uid); |
| ), |
| |
| TP_printk("uid=%s, len=%zu", __entry->uid, __entry->len) |
| ); |
| |
| #define DEFINE_SSAM_ALLOC_EVENT(name) \ |
| DEFINE_EVENT(ssam_alloc_class, ssam_##name, \ |
| TP_PROTO(void *ptr, size_t len), \ |
| TP_ARGS(ptr, len) \ |
| ) |
| |
| DECLARE_EVENT_CLASS(ssam_free_class, |
| TP_PROTO(void *ptr), |
| |
| TP_ARGS(ptr), |
| |
| TP_STRUCT__entry( |
| __array(char, uid, SSAM_PTR_UID_LEN) |
| ), |
| |
| TP_fast_assign( |
| ssam_trace_ptr_uid(ptr, __entry->uid); |
| ), |
| |
| TP_printk("uid=%s", __entry->uid) |
| ); |
| |
| #define DEFINE_SSAM_FREE_EVENT(name) \ |
| DEFINE_EVENT(ssam_free_class, ssam_##name, \ |
| TP_PROTO(void *ptr), \ |
| TP_ARGS(ptr) \ |
| ) |
| |
| DECLARE_EVENT_CLASS(ssam_pending_class, |
| TP_PROTO(unsigned int pending), |
| |
| TP_ARGS(pending), |
| |
| TP_STRUCT__entry( |
| __field(unsigned int, pending) |
| ), |
| |
| TP_fast_assign( |
| __entry->pending = pending; |
| ), |
| |
| TP_printk("pending=%u", __entry->pending) |
| ); |
| |
| #define DEFINE_SSAM_PENDING_EVENT(name) \ |
| DEFINE_EVENT(ssam_pending_class, ssam_##name, \ |
| TP_PROTO(unsigned int pending), \ |
| TP_ARGS(pending) \ |
| ) |
| |
| DECLARE_EVENT_CLASS(ssam_data_class, |
| TP_PROTO(size_t length), |
| |
| TP_ARGS(length), |
| |
| TP_STRUCT__entry( |
| __field(size_t, length) |
| ), |
| |
| TP_fast_assign( |
| __entry->length = length; |
| ), |
| |
| TP_printk("length=%zu", __entry->length) |
| ); |
| |
| #define DEFINE_SSAM_DATA_EVENT(name) \ |
| DEFINE_EVENT(ssam_data_class, ssam_##name, \ |
| TP_PROTO(size_t length), \ |
| TP_ARGS(length) \ |
| ) |
| |
| DEFINE_SSAM_FRAME_EVENT(rx_frame_received); |
| DEFINE_SSAM_COMMAND_EVENT(rx_response_received); |
| DEFINE_SSAM_COMMAND_EVENT(rx_event_received); |
| |
| DEFINE_SSAM_PACKET_EVENT(packet_release); |
| DEFINE_SSAM_PACKET_EVENT(packet_submit); |
| DEFINE_SSAM_PACKET_EVENT(packet_resubmit); |
| DEFINE_SSAM_PACKET_EVENT(packet_timeout); |
| DEFINE_SSAM_PACKET_EVENT(packet_cancel); |
| DEFINE_SSAM_PACKET_STATUS_EVENT(packet_complete); |
| DEFINE_SSAM_PENDING_EVENT(ptl_timeout_reap); |
| |
| DEFINE_SSAM_REQUEST_EVENT(request_submit); |
| DEFINE_SSAM_REQUEST_EVENT(request_timeout); |
| DEFINE_SSAM_REQUEST_EVENT(request_cancel); |
| DEFINE_SSAM_REQUEST_STATUS_EVENT(request_complete); |
| DEFINE_SSAM_PENDING_EVENT(rtl_timeout_reap); |
| |
| DEFINE_SSAM_PACKET_EVENT(ei_tx_drop_ack_packet); |
| DEFINE_SSAM_PACKET_EVENT(ei_tx_drop_nak_packet); |
| DEFINE_SSAM_PACKET_EVENT(ei_tx_drop_dsq_packet); |
| DEFINE_SSAM_PACKET_STATUS_EVENT(ei_tx_fail_write); |
| DEFINE_SSAM_PACKET_EVENT(ei_tx_corrupt_data); |
| DEFINE_SSAM_DATA_EVENT(ei_rx_corrupt_syn); |
| DEFINE_SSAM_FRAME_EVENT(ei_rx_corrupt_data); |
| DEFINE_SSAM_REQUEST_EVENT(ei_rx_drop_response); |
| |
| DEFINE_SSAM_ALLOC_EVENT(ctrl_packet_alloc); |
| DEFINE_SSAM_FREE_EVENT(ctrl_packet_free); |
| |
| DEFINE_SSAM_ALLOC_EVENT(event_item_alloc); |
| DEFINE_SSAM_FREE_EVENT(event_item_free); |
| |
| #endif /* _SURFACE_AGGREGATOR_TRACE_H */ |
| |
| /* This part must be outside protection */ |
| #undef TRACE_INCLUDE_PATH |
| #undef TRACE_INCLUDE_FILE |
| |
| #define TRACE_INCLUDE_PATH . |
| #define TRACE_INCLUDE_FILE trace |
| |
| #include <trace/define_trace.h> |