913 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2// Copyright (c) 2024 Takashi Sakamoto3 4#undef TRACE_SYSTEM5#define TRACE_SYSTEM firewire6 7#if !defined(_FIREWIRE_TRACE_EVENT_H) || defined(TRACE_HEADER_MULTI_READ)8#define _FIREWIRE_TRACE_EVENT_H9 10#include <linux/tracepoint.h>11#include <linux/firewire.h>12 13#include <linux/firewire-constants.h>14 15// Some macros are defined in 'drivers/firewire/packet-header-definitions.h'.16 17// The content of TP_printk field is preprocessed, then put to the module binary.18#define ASYNC_HEADER_GET_DESTINATION(header) \19 (((header)[0] & ASYNC_HEADER_Q0_DESTINATION_MASK) >> ASYNC_HEADER_Q0_DESTINATION_SHIFT)20 21#define ASYNC_HEADER_GET_TLABEL(header) \22 (((header)[0] & ASYNC_HEADER_Q0_TLABEL_MASK) >> ASYNC_HEADER_Q0_TLABEL_SHIFT)23 24#define ASYNC_HEADER_GET_TCODE(header) \25 (((header)[0] & ASYNC_HEADER_Q0_TCODE_MASK) >> ASYNC_HEADER_Q0_TCODE_SHIFT)26 27#define ASYNC_HEADER_GET_SOURCE(header) \28 (((header)[1] & ASYNC_HEADER_Q1_SOURCE_MASK) >> ASYNC_HEADER_Q1_SOURCE_SHIFT)29 30#define ASYNC_HEADER_GET_OFFSET(header) \31 ((((unsigned long long)((header)[1] & ASYNC_HEADER_Q1_OFFSET_HIGH_MASK)) >> ASYNC_HEADER_Q1_OFFSET_HIGH_SHIFT) << 32)| \32 (header)[2]33 34#define ASYNC_HEADER_GET_RCODE(header) \35 (((header)[1] & ASYNC_HEADER_Q1_RCODE_MASK) >> ASYNC_HEADER_Q1_RCODE_SHIFT)36 37#define QUADLET_SIZE 438 39DECLARE_EVENT_CLASS(async_outbound_initiate_template,40 TP_PROTO(u64 transaction, unsigned int card_index, unsigned int generation, unsigned int scode, const u32 *header, const u32 *data, unsigned int data_count),41 TP_ARGS(transaction, card_index, generation, scode, header, data, data_count),42 TP_STRUCT__entry(43 __field(u64, transaction)44 __field(u8, card_index)45 __field(u8, generation)46 __field(u8, scode)47 __array(u32, header, ASYNC_HEADER_QUADLET_COUNT)48 __dynamic_array(u32, data, data_count)49 ),50 TP_fast_assign(51 __entry->transaction = transaction;52 __entry->card_index = card_index;53 __entry->generation = generation;54 __entry->scode = scode;55 memcpy(__entry->header, header, QUADLET_SIZE * ASYNC_HEADER_QUADLET_COUNT);56 memcpy(__get_dynamic_array(data), data, __get_dynamic_array_len(data));57 ),58 // This format is for the request subaction.59 TP_printk(60 "transaction=0x%llx card_index=%u generation=%u scode=%u dst_id=0x%04x tlabel=%u tcode=%u src_id=0x%04x offset=0x%012llx header=%s data=%s",61 __entry->transaction,62 __entry->card_index,63 __entry->generation,64 __entry->scode,65 ASYNC_HEADER_GET_DESTINATION(__entry->header),66 ASYNC_HEADER_GET_TLABEL(__entry->header),67 ASYNC_HEADER_GET_TCODE(__entry->header),68 ASYNC_HEADER_GET_SOURCE(__entry->header),69 ASYNC_HEADER_GET_OFFSET(__entry->header),70 __print_array(__entry->header, ASYNC_HEADER_QUADLET_COUNT, QUADLET_SIZE),71 __print_array(__get_dynamic_array(data),72 __get_dynamic_array_len(data) / QUADLET_SIZE, QUADLET_SIZE)73 )74);75 76// The value of status is one of ack codes and rcodes specific to Linux FireWire subsystem.77DECLARE_EVENT_CLASS(async_outbound_complete_template,78 TP_PROTO(u64 transaction, unsigned int card_index, unsigned int generation, unsigned int scode, unsigned int status, unsigned int timestamp),79 TP_ARGS(transaction, card_index, generation, scode, status, timestamp),80 TP_STRUCT__entry(81 __field(u64, transaction)82 __field(u8, card_index)83 __field(u8, generation)84 __field(u8, scode)85 __field(u8, status)86 __field(u16, timestamp)87 ),88 TP_fast_assign(89 __entry->transaction = transaction;90 __entry->card_index = card_index;91 __entry->generation = generation;92 __entry->scode = scode;93 __entry->status = status;94 __entry->timestamp = timestamp;95 ),96 TP_printk(97 "transaction=0x%llx card_index=%u generation=%u scode=%u status=%u timestamp=0x%04x",98 __entry->transaction,99 __entry->card_index,100 __entry->generation,101 __entry->scode,102 __entry->status,103 __entry->timestamp104 )105);106 107// The value of status is one of ack codes and rcodes specific to Linux FireWire subsystem.108DECLARE_EVENT_CLASS(async_inbound_template,109 TP_PROTO(u64 transaction, unsigned int card_index, unsigned int generation, unsigned int scode, unsigned int status, unsigned int timestamp, const u32 *header, const u32 *data, unsigned int data_count),110 TP_ARGS(transaction, card_index, generation, scode, status, timestamp, header, data, data_count),111 TP_STRUCT__entry(112 __field(u64, transaction)113 __field(u8, card_index)114 __field(u8, generation)115 __field(u8, scode)116 __field(u8, status)117 __field(u16, timestamp)118 __array(u32, header, ASYNC_HEADER_QUADLET_COUNT)119 __dynamic_array(u32, data, data_count)120 ),121 TP_fast_assign(122 __entry->transaction = transaction;123 __entry->card_index = card_index;124 __entry->generation = generation;125 __entry->scode = scode;126 __entry->status = status;127 __entry->timestamp = timestamp;128 memcpy(__entry->header, header, QUADLET_SIZE * ASYNC_HEADER_QUADLET_COUNT);129 memcpy(__get_dynamic_array(data), data, __get_dynamic_array_len(data));130 ),131 // This format is for the response subaction.132 TP_printk(133 "transaction=0x%llx card_index=%u generation=%u scode=%u status=%u timestamp=0x%04x dst_id=0x%04x tlabel=%u tcode=%u src_id=0x%04x rcode=%u header=%s data=%s",134 __entry->transaction,135 __entry->card_index,136 __entry->generation,137 __entry->scode,138 __entry->status,139 __entry->timestamp,140 ASYNC_HEADER_GET_DESTINATION(__entry->header),141 ASYNC_HEADER_GET_TLABEL(__entry->header),142 ASYNC_HEADER_GET_TCODE(__entry->header),143 ASYNC_HEADER_GET_SOURCE(__entry->header),144 ASYNC_HEADER_GET_RCODE(__entry->header),145 __print_array(__entry->header, ASYNC_HEADER_QUADLET_COUNT, QUADLET_SIZE),146 __print_array(__get_dynamic_array(data),147 __get_dynamic_array_len(data) / QUADLET_SIZE, QUADLET_SIZE)148 )149);150 151DEFINE_EVENT(async_outbound_initiate_template, async_request_outbound_initiate,152 TP_PROTO(u64 transaction, unsigned int card_index, unsigned int generation, unsigned int scode, const u32 *header, const u32 *data, unsigned int data_count),153 TP_ARGS(transaction, card_index, generation, scode, header, data, data_count)154);155 156DEFINE_EVENT(async_outbound_complete_template, async_request_outbound_complete,157 TP_PROTO(u64 transaction, unsigned int card_index, unsigned int generation, unsigned int scode, unsigned int status, unsigned int timestamp),158 TP_ARGS(transaction, card_index, generation, scode, status, timestamp)159);160 161DEFINE_EVENT(async_inbound_template, async_response_inbound,162 TP_PROTO(u64 transaction, unsigned int card_index, unsigned int generation, unsigned int scode, unsigned int status, unsigned int timestamp, const u32 *header, const u32 *data, unsigned int data_count),163 TP_ARGS(transaction, card_index, generation, scode, status, timestamp, header, data, data_count)164);165 166DEFINE_EVENT_PRINT(async_inbound_template, async_request_inbound,167 TP_PROTO(u64 transaction, unsigned int card_index, unsigned int generation, unsigned int scode, unsigned int status, unsigned int timestamp, const u32 *header, const u32 *data, unsigned int data_count),168 TP_ARGS(transaction, card_index, generation, scode, status, timestamp, header, data, data_count),169 TP_printk(170 "transaction=0x%llx card_index=%u generation=%u scode=%u status=%u timestamp=0x%04x dst_id=0x%04x tlabel=%u tcode=%u src_id=0x%04x offset=0x%012llx header=%s data=%s",171 __entry->transaction,172 __entry->card_index,173 __entry->generation,174 __entry->scode,175 __entry->status,176 __entry->timestamp,177 ASYNC_HEADER_GET_DESTINATION(__entry->header),178 ASYNC_HEADER_GET_TLABEL(__entry->header),179 ASYNC_HEADER_GET_TCODE(__entry->header),180 ASYNC_HEADER_GET_SOURCE(__entry->header),181 ASYNC_HEADER_GET_OFFSET(__entry->header),182 __print_array(__entry->header, ASYNC_HEADER_QUADLET_COUNT, QUADLET_SIZE),183 __print_array(__get_dynamic_array(data),184 __get_dynamic_array_len(data) / QUADLET_SIZE, QUADLET_SIZE)185 )186);187 188DEFINE_EVENT_PRINT(async_outbound_initiate_template, async_response_outbound_initiate,189 TP_PROTO(u64 transaction, unsigned int card_index, unsigned int generation, unsigned int scode, const u32 *header, const u32 *data, unsigned int data_count),190 TP_ARGS(transaction, card_index, generation, scode, header, data, data_count),191 TP_printk(192 "transaction=0x%llx card_index=%u generation=%u scode=%u dst_id=0x%04x tlabel=%u tcode=%u src_id=0x%04x rcode=%u header=%s data=%s",193 __entry->transaction,194 __entry->card_index,195 __entry->generation,196 __entry->scode,197 ASYNC_HEADER_GET_DESTINATION(__entry->header),198 ASYNC_HEADER_GET_TLABEL(__entry->header),199 ASYNC_HEADER_GET_TCODE(__entry->header),200 ASYNC_HEADER_GET_SOURCE(__entry->header),201 ASYNC_HEADER_GET_RCODE(__entry->header),202 __print_array(__entry->header, ASYNC_HEADER_QUADLET_COUNT, QUADLET_SIZE),203 __print_array(__get_dynamic_array(data),204 __get_dynamic_array_len(data) / QUADLET_SIZE, QUADLET_SIZE)205 )206);207 208DEFINE_EVENT(async_outbound_complete_template, async_response_outbound_complete,209 TP_PROTO(u64 transaction, unsigned int card_index, unsigned int generation, unsigned int scode, unsigned int status, unsigned int timestamp),210 TP_ARGS(transaction, card_index, generation, scode, status, timestamp)211);212 213#undef ASYNC_HEADER_GET_DESTINATION214#undef ASYNC_HEADER_GET_TLABEL215#undef ASYNC_HEADER_GET_TCODE216#undef ASYNC_HEADER_GET_SOURCE217#undef ASYNC_HEADER_GET_OFFSET218#undef ASYNC_HEADER_GET_RCODE219 220TRACE_EVENT(async_phy_outbound_initiate,221 TP_PROTO(u64 packet, unsigned int card_index, unsigned int generation, u32 first_quadlet, u32 second_quadlet),222 TP_ARGS(packet, card_index, generation, first_quadlet, second_quadlet),223 TP_STRUCT__entry(224 __field(u64, packet)225 __field(u8, card_index)226 __field(u8, generation)227 __field(u32, first_quadlet)228 __field(u32, second_quadlet)229 ),230 TP_fast_assign(231 __entry->packet = packet;232 __entry->card_index = card_index;233 __entry->generation = generation;234 __entry->first_quadlet = first_quadlet;235 __entry->second_quadlet = second_quadlet236 ),237 TP_printk(238 "packet=0x%llx card_index=%u generation=%u first_quadlet=0x%08x second_quadlet=0x%08x",239 __entry->packet,240 __entry->card_index,241 __entry->generation,242 __entry->first_quadlet,243 __entry->second_quadlet244 )245);246 247TRACE_EVENT(async_phy_outbound_complete,248 TP_PROTO(u64 packet, unsigned int card_index, unsigned int generation, unsigned int status, unsigned int timestamp),249 TP_ARGS(packet, card_index, generation, status, timestamp),250 TP_STRUCT__entry(251 __field(u64, packet)252 __field(u8, card_index)253 __field(u8, generation)254 __field(u8, status)255 __field(u16, timestamp)256 ),257 TP_fast_assign(258 __entry->packet = packet;259 __entry->card_index = card_index;260 __entry->generation = generation;261 __entry->status = status;262 __entry->timestamp = timestamp;263 ),264 TP_printk(265 "packet=0x%llx card_index=%u generation=%u status=%u timestamp=0x%04x",266 __entry->packet,267 __entry->card_index,268 __entry->generation,269 __entry->status,270 __entry->timestamp271 )272);273 274TRACE_EVENT(async_phy_inbound,275 TP_PROTO(u64 packet, unsigned int card_index, unsigned int generation, unsigned int status, unsigned int timestamp, u32 first_quadlet, u32 second_quadlet),276 TP_ARGS(packet, card_index, generation, status, timestamp, first_quadlet, second_quadlet),277 TP_STRUCT__entry(278 __field(u64, packet)279 __field(u8, card_index)280 __field(u8, generation)281 __field(u8, status)282 __field(u16, timestamp)283 __field(u32, first_quadlet)284 __field(u32, second_quadlet)285 ),286 TP_fast_assign(287 __entry->packet = packet;288 __entry->generation = generation;289 __entry->status = status;290 __entry->timestamp = timestamp;291 __entry->first_quadlet = first_quadlet;292 __entry->second_quadlet = second_quadlet293 ),294 TP_printk(295 "packet=0x%llx card_index=%u generation=%u status=%u timestamp=0x%04x first_quadlet=0x%08x second_quadlet=0x%08x",296 __entry->packet,297 __entry->card_index,298 __entry->generation,299 __entry->status,300 __entry->timestamp,301 __entry->first_quadlet,302 __entry->second_quadlet303 )304);305 306DECLARE_EVENT_CLASS(bus_reset_arrange_template,307 TP_PROTO(unsigned int card_index, unsigned int generation, bool short_reset),308 TP_ARGS(card_index, generation, short_reset),309 TP_STRUCT__entry(310 __field(u8, card_index)311 __field(u8, generation)312 __field(bool, short_reset)313 ),314 TP_fast_assign(315 __entry->card_index = card_index;316 __entry->generation = generation;317 __entry->short_reset = short_reset;318 ),319 TP_printk(320 "card_index=%u generation=%u short_reset=%s",321 __entry->card_index,322 __entry->generation,323 __entry->short_reset ? "true" : "false"324 )325);326 327DEFINE_EVENT(bus_reset_arrange_template, bus_reset_initiate,328 TP_PROTO(unsigned int card_index, unsigned int generation, bool short_reset),329 TP_ARGS(card_index, generation, short_reset)330);331 332DEFINE_EVENT(bus_reset_arrange_template, bus_reset_schedule,333 TP_PROTO(unsigned int card_index, unsigned int generation, bool short_reset),334 TP_ARGS(card_index, generation, short_reset)335);336 337DEFINE_EVENT(bus_reset_arrange_template, bus_reset_postpone,338 TP_PROTO(unsigned int card_index, unsigned int generation, bool short_reset),339 TP_ARGS(card_index, generation, short_reset)340);341 342TRACE_EVENT(bus_reset_handle,343 TP_PROTO(unsigned int card_index, unsigned int generation, unsigned int node_id, bool bm_abdicate, u32 *self_ids, unsigned int self_id_count),344 TP_ARGS(card_index, generation, node_id, bm_abdicate, self_ids, self_id_count),345 TP_STRUCT__entry(346 __field(u8, card_index)347 __field(u8, generation)348 __field(u8, node_id)349 __field(bool, bm_abdicate)350 __dynamic_array(u32, self_ids, self_id_count)351 ),352 TP_fast_assign(353 __entry->card_index = card_index;354 __entry->generation = generation;355 __entry->node_id = node_id;356 __entry->bm_abdicate = bm_abdicate;357 memcpy(__get_dynamic_array(self_ids), self_ids, __get_dynamic_array_len(self_ids));358 ),359 TP_printk(360 "card_index=%u generation=%u node_id=0x%04x bm_abdicate=%s self_ids=%s",361 __entry->card_index,362 __entry->generation,363 __entry->node_id,364 __entry->bm_abdicate ? "true" : "false",365 __print_array(__get_dynamic_array(self_ids),366 __get_dynamic_array_len(self_ids) / QUADLET_SIZE, QUADLET_SIZE)367 )368);369 370// Some macros are defined in 'drivers/firewire/phy-packet-definitions.h'.371 372// The content of TP_printk field is preprocessed, then put to the module binary.373 374#define PHY_PACKET_SELF_ID_GET_PHY_ID(quads) \375 ((((const u32 *)quads)[0] & SELF_ID_PHY_ID_MASK) >> SELF_ID_PHY_ID_SHIFT)376 377#define PHY_PACKET_SELF_ID_GET_LINK_ACTIVE(quads) \378 ((((const u32 *)quads)[0] & SELF_ID_ZERO_LINK_ACTIVE_MASK) >> SELF_ID_ZERO_LINK_ACTIVE_SHIFT)379 380#define PHY_PACKET_SELF_ID_GET_GAP_COUNT(quads) \381 ((((const u32 *)quads)[0] & SELF_ID_ZERO_GAP_COUNT_MASK) >> SELF_ID_ZERO_GAP_COUNT_SHIFT)382 383#define PHY_PACKET_SELF_ID_GET_SCODE(quads) \384 ((((const u32 *)quads)[0] & SELF_ID_ZERO_SCODE_MASK) >> SELF_ID_ZERO_SCODE_SHIFT)385 386#define PHY_PACKET_SELF_ID_GET_CONTENDER(quads) \387 ((((const u32 *)quads)[0] & SELF_ID_ZERO_CONTENDER_MASK) >> SELF_ID_ZERO_CONTENDER_SHIFT)388 389#define PHY_PACKET_SELF_ID_GET_POWER_CLASS(quads) \390 ((((const u32 *)quads)[0] & SELF_ID_ZERO_POWER_CLASS_MASK) >> SELF_ID_ZERO_POWER_CLASS_SHIFT)391 392#define PHY_PACKET_SELF_ID_GET_INITIATED_RESET(quads) \393 ((((const u32 *)quads)[0] & SELF_ID_ZERO_INITIATED_RESET_MASK) >> SELF_ID_ZERO_INITIATED_RESET_SHIFT)394 395TRACE_EVENT(self_id_sequence,396 TP_PROTO(unsigned int card_index, const u32 *self_id_sequence, unsigned int quadlet_count, unsigned int generation),397 TP_ARGS(card_index, self_id_sequence, quadlet_count, generation),398 TP_STRUCT__entry(399 __field(u8, card_index)400 __field(u8, generation)401 __dynamic_array(u8, port_status, self_id_sequence_get_port_capacity(quadlet_count))402 __dynamic_array(u32, self_id_sequence, quadlet_count)403 ),404 TP_fast_assign(405 __entry->card_index = card_index;406 __entry->generation = generation;407 {408 u8 *port_status = __get_dynamic_array(port_status);409 unsigned int port_index;410 411 for (port_index = 0; port_index < __get_dynamic_array_len(port_status); ++port_index) {412 port_status[port_index] =413 self_id_sequence_get_port_status(self_id_sequence,414 quadlet_count, port_index);415 }416 }417 memcpy(__get_dynamic_array(self_id_sequence), self_id_sequence,418 __get_dynamic_array_len(self_id_sequence));419 ),420 TP_printk(421 "card_index=%u generation=%u phy_id=0x%02x link_active=%s gap_count=%u scode=%u contender=%s power_class=%u initiated_reset=%s port_status=%s self_id_sequence=%s",422 __entry->card_index,423 __entry->generation,424 PHY_PACKET_SELF_ID_GET_PHY_ID(__get_dynamic_array(self_id_sequence)),425 PHY_PACKET_SELF_ID_GET_LINK_ACTIVE(__get_dynamic_array(self_id_sequence)) ? "true" : "false",426 PHY_PACKET_SELF_ID_GET_GAP_COUNT(__get_dynamic_array(self_id_sequence)),427 PHY_PACKET_SELF_ID_GET_SCODE(__get_dynamic_array(self_id_sequence)),428 PHY_PACKET_SELF_ID_GET_CONTENDER(__get_dynamic_array(self_id_sequence)) ? "true" : "false",429 PHY_PACKET_SELF_ID_GET_POWER_CLASS(__get_dynamic_array(self_id_sequence)),430 PHY_PACKET_SELF_ID_GET_INITIATED_RESET(__get_dynamic_array(self_id_sequence)) ? "true" : "false",431 __print_array(__get_dynamic_array(port_status), __get_dynamic_array_len(port_status), 1),432 __print_array(__get_dynamic_array(self_id_sequence),433 __get_dynamic_array_len(self_id_sequence) / QUADLET_SIZE, QUADLET_SIZE)434 )435);436 437#undef PHY_PACKET_SELF_ID_GET_PHY_ID438#undef PHY_PACKET_SELF_ID_GET_LINK_ACTIVE439#undef PHY_PACKET_SELF_ID_GET_GAP_COUNT440#undef PHY_PACKET_SELF_ID_GET_SCODE441#undef PHY_PACKET_SELF_ID_GET_CONTENDER442#undef PHY_PACKET_SELF_ID_GET_POWER_CLASS443#undef PHY_PACKET_SELF_ID_GET_INITIATED_RESET444 445TRACE_EVENT_CONDITION(isoc_outbound_allocate,446 TP_PROTO(const struct fw_iso_context *ctx, unsigned int channel, unsigned int scode),447 TP_ARGS(ctx, channel, scode),448 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_TRANSMIT),449 TP_STRUCT__entry(450 __field(u64, context)451 __field(u8, card_index)452 __field(u8, channel)453 __field(u8, scode)454 ),455 TP_fast_assign(456 __entry->context = (uintptr_t)ctx;457 __entry->card_index = ctx->card->index;458 __entry->channel = channel;459 __entry->scode = scode;460 ),461 TP_printk(462 "context=0x%llx card_index=%u channel=%u scode=%u",463 __entry->context,464 __entry->card_index,465 __entry->channel,466 __entry->scode467 )468);469 470TRACE_EVENT_CONDITION(isoc_inbound_single_allocate,471 TP_PROTO(const struct fw_iso_context *ctx, unsigned int channel, unsigned int header_size),472 TP_ARGS(ctx, channel, header_size),473 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE),474 TP_STRUCT__entry(475 __field(u64, context)476 __field(u8, card_index)477 __field(u8, channel)478 __field(u8, header_size)479 ),480 TP_fast_assign(481 __entry->context = (uintptr_t)ctx;482 __entry->card_index = ctx->card->index;483 __entry->channel = channel;484 __entry->header_size = header_size;485 ),486 TP_printk(487 "context=0x%llx card_index=%u channel=%u header_size=%u",488 __entry->context,489 __entry->card_index,490 __entry->channel,491 __entry->header_size492 )493);494 495TRACE_EVENT_CONDITION(isoc_inbound_multiple_allocate,496 TP_PROTO(const struct fw_iso_context *ctx),497 TP_ARGS(ctx),498 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL),499 TP_STRUCT__entry(500 __field(u64, context)501 __field(u8, card_index)502 ),503 TP_fast_assign(504 __entry->context = (uintptr_t)ctx;505 __entry->card_index = ctx->card->index;506 ),507 TP_printk(508 "context=0x%llx card_index=%u",509 __entry->context,510 __entry->card_index511 )512);513 514DECLARE_EVENT_CLASS(isoc_destroy_template,515 TP_PROTO(const struct fw_iso_context *ctx),516 TP_ARGS(ctx),517 TP_STRUCT__entry(518 __field(u64, context)519 __field(u8, card_index)520 ),521 TP_fast_assign(522 __entry->context = (uintptr_t)ctx;523 __entry->card_index = ctx->card->index;524 ),525 TP_printk(526 "context=0x%llx card_index=%u",527 __entry->context,528 __entry->card_index529 )530)531 532DEFINE_EVENT_CONDITION(isoc_destroy_template, isoc_outbound_destroy,533 TP_PROTO(const struct fw_iso_context *ctx),534 TP_ARGS(ctx),535 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_TRANSMIT)536);537 538DEFINE_EVENT_CONDITION(isoc_destroy_template, isoc_inbound_single_destroy,539 TP_PROTO(const struct fw_iso_context *ctx),540 TP_ARGS(ctx),541 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE)542);543 544DEFINE_EVENT_CONDITION(isoc_destroy_template, isoc_inbound_multiple_destroy,545 TP_PROTO(const struct fw_iso_context *ctx),546 TP_ARGS(ctx),547 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL)548);549 550TRACE_EVENT(isoc_inbound_multiple_channels,551 TP_PROTO(const struct fw_iso_context *ctx, u64 channels),552 TP_ARGS(ctx, channels),553 TP_STRUCT__entry(554 __field(u64, context)555 __field(u8, card_index)556 __field(u64, channels)557 ),558 TP_fast_assign(559 __entry->context = (uintptr_t)ctx;560 __entry->card_index = ctx->card->index;561 __entry->channels = channels;562 ),563 TP_printk(564 "context=0x%llx card_index=%u channels=0x%016llx",565 __entry->context,566 __entry->card_index,567 __entry->channels568 )569);570 571TRACE_EVENT_CONDITION(isoc_outbound_start,572 TP_PROTO(const struct fw_iso_context *ctx, int cycle_match),573 TP_ARGS(ctx, cycle_match),574 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_TRANSMIT),575 TP_STRUCT__entry(576 __field(u64, context)577 __field(u8, card_index)578 __field(bool, cycle_match)579 __field(u16, cycle)580 ),581 TP_fast_assign(582 __entry->context = (uintptr_t)ctx;583 __entry->card_index = ctx->card->index;584 __entry->cycle_match = cycle_match < 0 ? false : true;585 __entry->cycle = __entry->cycle_match ? (u16)cycle_match : 0;586 ),587 TP_printk(588 "context=0x%llx card_index=%u cycle_match=%s cycle=0x%04x",589 __entry->context,590 __entry->card_index,591 __entry->cycle_match ? "true" : "false",592 __entry->cycle593 )594);595 596DECLARE_EVENT_CLASS(isoc_inbound_start_template,597 TP_PROTO(const struct fw_iso_context *ctx, int cycle_match, unsigned int sync, unsigned int tags),598 TP_ARGS(ctx, cycle_match, sync, tags),599 TP_STRUCT__entry(600 __field(u64, context)601 __field(u8, card_index)602 __field(bool, cycle_match)603 __field(u16, cycle)604 __field(u8, sync)605 __field(u8, tags)606 ),607 TP_fast_assign(608 __entry->context = (uintptr_t)ctx;609 __entry->card_index = ctx->card->index;610 __entry->cycle_match = cycle_match < 0 ? false : true;611 __entry->cycle = __entry->cycle_match ? (u16)cycle_match : 0;612 __entry->sync = sync;613 __entry->tags = tags;614 ),615 TP_printk(616 "context=0x%llx card_index=%u cycle_match=%s cycle=0x%04x sync=%u tags=%s",617 __entry->context,618 __entry->card_index,619 __entry->cycle_match ? "true" : "false",620 __entry->cycle,621 __entry->sync,622 __print_flags(__entry->tags, "|",623 { FW_ISO_CONTEXT_MATCH_TAG0, "0" },624 { FW_ISO_CONTEXT_MATCH_TAG1, "1" },625 { FW_ISO_CONTEXT_MATCH_TAG2, "2" },626 { FW_ISO_CONTEXT_MATCH_TAG3, "3" }627 )628 )629);630 631DEFINE_EVENT_CONDITION(isoc_inbound_start_template, isoc_inbound_single_start,632 TP_PROTO(const struct fw_iso_context *ctx, int cycle_match, unsigned int sync, unsigned int tags),633 TP_ARGS(ctx, cycle_match, sync, tags),634 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE)635);636 637DEFINE_EVENT_CONDITION(isoc_inbound_start_template, isoc_inbound_multiple_start,638 TP_PROTO(const struct fw_iso_context *ctx, int cycle_match, unsigned int sync, unsigned int tags),639 TP_ARGS(ctx, cycle_match, sync, tags),640 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL)641);642 643DECLARE_EVENT_CLASS(isoc_stop_template,644 TP_PROTO(const struct fw_iso_context *ctx),645 TP_ARGS(ctx),646 TP_STRUCT__entry(647 __field(u64, context)648 __field(u8, card_index)649 ),650 TP_fast_assign(651 __entry->context = (uintptr_t)ctx;652 __entry->card_index = ctx->card->index;653 ),654 TP_printk(655 "context=0x%llx card_index=%u",656 __entry->context,657 __entry->card_index658 )659)660 661DEFINE_EVENT_CONDITION(isoc_stop_template, isoc_outbound_stop,662 TP_PROTO(const struct fw_iso_context *ctx),663 TP_ARGS(ctx),664 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_TRANSMIT)665);666 667DEFINE_EVENT_CONDITION(isoc_stop_template, isoc_inbound_single_stop,668 TP_PROTO(const struct fw_iso_context *ctx),669 TP_ARGS(ctx),670 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE)671);672 673DEFINE_EVENT_CONDITION(isoc_stop_template, isoc_inbound_multiple_stop,674 TP_PROTO(const struct fw_iso_context *ctx),675 TP_ARGS(ctx),676 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL)677);678 679DECLARE_EVENT_CLASS(isoc_flush_template,680 TP_PROTO(const struct fw_iso_context *ctx),681 TP_ARGS(ctx),682 TP_STRUCT__entry(683 __field(u64, context)684 __field(u8, card_index)685 ),686 TP_fast_assign(687 __entry->context = (uintptr_t)ctx;688 __entry->card_index = ctx->card->index;689 ),690 TP_printk(691 "context=0x%llx card_index=%u",692 __entry->context,693 __entry->card_index694 )695);696 697DEFINE_EVENT_CONDITION(isoc_flush_template, isoc_outbound_flush,698 TP_PROTO(const struct fw_iso_context *ctx),699 TP_ARGS(ctx),700 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_TRANSMIT)701);702 703DEFINE_EVENT_CONDITION(isoc_flush_template, isoc_inbound_single_flush,704 TP_PROTO(const struct fw_iso_context *ctx),705 TP_ARGS(ctx),706 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE)707);708 709DEFINE_EVENT_CONDITION(isoc_flush_template, isoc_inbound_multiple_flush,710 TP_PROTO(const struct fw_iso_context *ctx),711 TP_ARGS(ctx),712 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL)713);714 715DECLARE_EVENT_CLASS(isoc_flush_completions_template,716 TP_PROTO(const struct fw_iso_context *ctx),717 TP_ARGS(ctx),718 TP_STRUCT__entry(719 __field(u64, context)720 __field(u8, card_index)721 ),722 TP_fast_assign(723 __entry->context = (uintptr_t)ctx;724 __entry->card_index = ctx->card->index;725 ),726 TP_printk(727 "context=0x%llx card_index=%u",728 __entry->context,729 __entry->card_index730 )731);732 733DEFINE_EVENT_CONDITION(isoc_flush_completions_template, isoc_outbound_flush_completions,734 TP_PROTO(const struct fw_iso_context *ctx),735 TP_ARGS(ctx),736 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_TRANSMIT)737);738 739DEFINE_EVENT_CONDITION(isoc_flush_completions_template, isoc_inbound_single_flush_completions,740 TP_PROTO(const struct fw_iso_context *ctx),741 TP_ARGS(ctx),742 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE)743);744 745DEFINE_EVENT_CONDITION(isoc_flush_completions_template, isoc_inbound_multiple_flush_completions,746 TP_PROTO(const struct fw_iso_context *ctx),747 TP_ARGS(ctx),748 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL)749);750 751#define TP_STRUCT__entry_iso_packet(ctx, buffer_offset, packet) \752 TP_STRUCT__entry( \753 __field(u64, context) \754 __field(u8, card_index) \755 __field(u32, buffer_offset) \756 __field(bool, interrupt) \757 __field(bool, skip) \758 __field(u8, sy) \759 __field(u8, tag) \760 __dynamic_array(u32, header, packet->header_length / QUADLET_SIZE) \761 )762 763#define TP_fast_assign_iso_packet(ctx, buffer_offset, packet) \764 TP_fast_assign( \765 __entry->context = (uintptr_t)ctx; \766 __entry->card_index = ctx->card->index; \767 __entry->buffer_offset = buffer_offset; \768 __entry->interrupt = packet->interrupt; \769 __entry->skip = packet->skip; \770 __entry->sy = packet->sy; \771 __entry->tag = packet->tag; \772 memcpy(__get_dynamic_array(header), packet->header, \773 __get_dynamic_array_len(header)); \774 )775 776TRACE_EVENT_CONDITION(isoc_outbound_queue,777 TP_PROTO(const struct fw_iso_context *ctx, unsigned long buffer_offset, const struct fw_iso_packet *packet),778 TP_ARGS(ctx, buffer_offset, packet),779 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_TRANSMIT),780 TP_STRUCT__entry_iso_packet(ctx, buffer_offset, packet),781 TP_fast_assign_iso_packet(ctx, buffer_offset, packet),782 TP_printk(783 "context=0x%llx card_index=%u buffer_offset=0x%x interrupt=%s skip=%s sy=%d tag=%u header=%s",784 __entry->context,785 __entry->card_index,786 __entry->buffer_offset,787 __entry->interrupt ? "true" : "false",788 __entry->skip ? "true" : "false",789 __entry->sy,790 __entry->tag,791 __print_array(__get_dynamic_array(header),792 __get_dynamic_array_len(header) / QUADLET_SIZE, QUADLET_SIZE)793 )794);795 796TRACE_EVENT_CONDITION(isoc_inbound_single_queue,797 TP_PROTO(const struct fw_iso_context *ctx, unsigned long buffer_offset, const struct fw_iso_packet *packet),798 TP_ARGS(ctx, buffer_offset, packet),799 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE),800 TP_STRUCT__entry_iso_packet(ctx, buffer_offset, packet),801 TP_fast_assign_iso_packet(ctx, buffer_offset, packet),802 TP_printk(803 "context=0x%llx card_index=%u buffer_offset=0x%x interrupt=%s skip=%s",804 __entry->context,805 __entry->card_index,806 __entry->buffer_offset,807 __entry->interrupt ? "true" : "false",808 __entry->skip ? "true" : "false"809 )810);811 812TRACE_EVENT_CONDITION(isoc_inbound_multiple_queue,813 TP_PROTO(const struct fw_iso_context *ctx, unsigned long buffer_offset, const struct fw_iso_packet *packet),814 TP_ARGS(ctx, buffer_offset, packet),815 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL),816 TP_STRUCT__entry_iso_packet(ctx, buffer_offset, packet),817 TP_fast_assign_iso_packet(ctx, buffer_offset, packet),818 TP_printk(819 "context=0x%llx card_index=%u buffer_offset=0x%x interrupt=%s",820 __entry->context,821 __entry->card_index,822 __entry->buffer_offset,823 __entry->interrupt ? "true" : "false"824 )825);826 827#undef TP_STRUCT__entry_iso_packet828#undef TP_fast_assign_iso_packet829 830#ifndef show_cause831enum fw_iso_context_completions_cause {832 FW_ISO_CONTEXT_COMPLETIONS_CAUSE_FLUSH = 0,833 FW_ISO_CONTEXT_COMPLETIONS_CAUSE_INTERRUPT,834 FW_ISO_CONTEXT_COMPLETIONS_CAUSE_HEADER_OVERFLOW,835};836#define show_cause(cause) \837 __print_symbolic(cause, \838 { FW_ISO_CONTEXT_COMPLETIONS_CAUSE_FLUSH, "FLUSH" }, \839 { FW_ISO_CONTEXT_COMPLETIONS_CAUSE_INTERRUPT, "INTERRUPT" }, \840 { FW_ISO_CONTEXT_COMPLETIONS_CAUSE_HEADER_OVERFLOW, "HEADER_OVERFLOW" } \841 )842#endif843 844DECLARE_EVENT_CLASS(isoc_single_completions_template,845 TP_PROTO(const struct fw_iso_context *ctx, u16 timestamp, enum fw_iso_context_completions_cause cause, const u32 *header, unsigned int header_length),846 TP_ARGS(ctx, timestamp, cause, header, header_length),847 TP_STRUCT__entry(848 __field(u64, context)849 __field(u8, card_index)850 __field(u16, timestamp)851 __field(u8, cause)852 __dynamic_array(u32, header, header_length / QUADLET_SIZE)853 ),854 TP_fast_assign(855 __entry->context = (uintptr_t)ctx;856 __entry->card_index = ctx->card->index;857 __entry->timestamp = timestamp;858 __entry->cause = cause;859 memcpy(__get_dynamic_array(header), header, __get_dynamic_array_len(header));860 ),861 TP_printk(862 "context=0x%llx card_index=%u timestamp=0x%04x cause=%s header=%s",863 __entry->context,864 __entry->card_index,865 __entry->timestamp,866 show_cause(__entry->cause),867 __print_array(__get_dynamic_array(header),868 __get_dynamic_array_len(header) / QUADLET_SIZE, QUADLET_SIZE)869 )870)871 872DEFINE_EVENT_CONDITION(isoc_single_completions_template, isoc_outbound_completions,873 TP_PROTO(const struct fw_iso_context *ctx, u16 timestamp, enum fw_iso_context_completions_cause cause, const u32 *header, unsigned int header_length),874 TP_ARGS(ctx, timestamp, cause, header, header_length),875 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_TRANSMIT)876);877 878DEFINE_EVENT_CONDITION(isoc_single_completions_template, isoc_inbound_single_completions,879 TP_PROTO(const struct fw_iso_context *ctx, u16 timestamp, enum fw_iso_context_completions_cause cause, const u32 *header, unsigned int header_length),880 TP_ARGS(ctx, timestamp, cause, header, header_length),881 TP_CONDITION(ctx->type == FW_ISO_CONTEXT_RECEIVE)882);883 884TRACE_EVENT(isoc_inbound_multiple_completions,885 TP_PROTO(const struct fw_iso_context *ctx, unsigned int completed, enum fw_iso_context_completions_cause cause),886 TP_ARGS(ctx, completed, cause),887 TP_STRUCT__entry(888 __field(u64, context)889 __field(u8, card_index)890 __field(u16, completed)891 __field(u8, cause)892 ),893 TP_fast_assign(894 __entry->context = (uintptr_t)ctx;895 __entry->card_index = ctx->card->index;896 __entry->completed = completed;897 __entry->cause = cause;898 ),899 TP_printk(900 "context=0x%llx card_index=%u completed=%u cause=%s",901 __entry->context,902 __entry->card_index,903 __entry->completed,904 show_cause(__entry->cause)905 )906);907 908#undef QUADLET_SIZE909 910#endif // _FIREWIRE_TRACE_EVENT_H911 912#include <trace/define_trace.h>913