i2c.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /* I2C message transfer tracepoints
  3. *
  4. * Copyright (C) 2013 Red Hat, Inc. All Rights Reserved.
  5. * Written by David Howells ([email protected])
  6. */
  7. #undef TRACE_SYSTEM
  8. #define TRACE_SYSTEM i2c
  9. #if !defined(_TRACE_I2C_H) || defined(TRACE_HEADER_MULTI_READ)
  10. #define _TRACE_I2C_H
  11. #include <linux/i2c.h>
  12. #include <linux/tracepoint.h>
  13. /*
  14. * drivers/i2c/i2c-core-base.c
  15. */
  16. extern int i2c_transfer_trace_reg(void);
  17. extern void i2c_transfer_trace_unreg(void);
  18. /*
  19. * __i2c_transfer() write request
  20. */
  21. TRACE_EVENT_FN(i2c_write,
  22. TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
  23. int num),
  24. TP_ARGS(adap, msg, num),
  25. TP_STRUCT__entry(
  26. __field(int, adapter_nr )
  27. __field(__u16, msg_nr )
  28. __field(__u16, addr )
  29. __field(__u16, flags )
  30. __field(__u16, len )
  31. __dynamic_array(__u8, buf, msg->len) ),
  32. TP_fast_assign(
  33. __entry->adapter_nr = adap->nr;
  34. __entry->msg_nr = num;
  35. __entry->addr = msg->addr;
  36. __entry->flags = msg->flags;
  37. __entry->len = msg->len;
  38. memcpy(__get_dynamic_array(buf), msg->buf, msg->len);
  39. ),
  40. TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]",
  41. __entry->adapter_nr,
  42. __entry->msg_nr,
  43. __entry->addr,
  44. __entry->flags,
  45. __entry->len,
  46. __entry->len, __get_dynamic_array(buf)
  47. ),
  48. i2c_transfer_trace_reg,
  49. i2c_transfer_trace_unreg);
  50. /*
  51. * __i2c_transfer() read request
  52. */
  53. TRACE_EVENT_FN(i2c_read,
  54. TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
  55. int num),
  56. TP_ARGS(adap, msg, num),
  57. TP_STRUCT__entry(
  58. __field(int, adapter_nr )
  59. __field(__u16, msg_nr )
  60. __field(__u16, addr )
  61. __field(__u16, flags )
  62. __field(__u16, len )
  63. ),
  64. TP_fast_assign(
  65. __entry->adapter_nr = adap->nr;
  66. __entry->msg_nr = num;
  67. __entry->addr = msg->addr;
  68. __entry->flags = msg->flags;
  69. __entry->len = msg->len;
  70. ),
  71. TP_printk("i2c-%d #%u a=%03x f=%04x l=%u",
  72. __entry->adapter_nr,
  73. __entry->msg_nr,
  74. __entry->addr,
  75. __entry->flags,
  76. __entry->len
  77. ),
  78. i2c_transfer_trace_reg,
  79. i2c_transfer_trace_unreg);
  80. /*
  81. * __i2c_transfer() read reply
  82. */
  83. TRACE_EVENT_FN(i2c_reply,
  84. TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
  85. int num),
  86. TP_ARGS(adap, msg, num),
  87. TP_STRUCT__entry(
  88. __field(int, adapter_nr )
  89. __field(__u16, msg_nr )
  90. __field(__u16, addr )
  91. __field(__u16, flags )
  92. __field(__u16, len )
  93. __dynamic_array(__u8, buf, msg->len) ),
  94. TP_fast_assign(
  95. __entry->adapter_nr = adap->nr;
  96. __entry->msg_nr = num;
  97. __entry->addr = msg->addr;
  98. __entry->flags = msg->flags;
  99. __entry->len = msg->len;
  100. memcpy(__get_dynamic_array(buf), msg->buf, msg->len);
  101. ),
  102. TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]",
  103. __entry->adapter_nr,
  104. __entry->msg_nr,
  105. __entry->addr,
  106. __entry->flags,
  107. __entry->len,
  108. __entry->len, __get_dynamic_array(buf)
  109. ),
  110. i2c_transfer_trace_reg,
  111. i2c_transfer_trace_unreg);
  112. /*
  113. * __i2c_transfer() result
  114. */
  115. TRACE_EVENT_FN(i2c_result,
  116. TP_PROTO(const struct i2c_adapter *adap, int num, int ret),
  117. TP_ARGS(adap, num, ret),
  118. TP_STRUCT__entry(
  119. __field(int, adapter_nr )
  120. __field(__u16, nr_msgs )
  121. __field(__s16, ret )
  122. ),
  123. TP_fast_assign(
  124. __entry->adapter_nr = adap->nr;
  125. __entry->nr_msgs = num;
  126. __entry->ret = ret;
  127. ),
  128. TP_printk("i2c-%d n=%u ret=%d",
  129. __entry->adapter_nr,
  130. __entry->nr_msgs,
  131. __entry->ret
  132. ),
  133. i2c_transfer_trace_reg,
  134. i2c_transfer_trace_unreg);
  135. #endif /* _TRACE_I2C_H */
  136. /* This part must be outside protection */
  137. #include <trace/define_trace.h>