Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp1905231pxp; Mon, 21 Mar 2022 07:24:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxDgTSEilcYDG+eJSEBspY6e8/4Rf9MVD5XCQ8q2G9ErOmtbxDp4c/qihl2senFEm9QB5Fj X-Received: by 2002:aa7:d7c1:0:b0:419:2f7e:178d with SMTP id e1-20020aa7d7c1000000b004192f7e178dmr7873866eds.136.1647872643710; Mon, 21 Mar 2022 07:24:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647872643; cv=none; d=google.com; s=arc-20160816; b=JOtQ8YI5Dz5bmP+KgnU5+lNcQpKsXXg6hN5qCgI6K5zlQaECsuGIE5V5ZNzN/9f//S iNhBYjz4WPEB1bhjV3Hpyw4PTjfQW0dSG+fxIAS5OU1lo1Ao8NxJ+GVJ1henAExJKV1p 00BtwDW4yVSMWRnh/9dFc7F9le2FQgSzLm4vEg7LE+uO/Dkv+gq29xmIx99KixC5hjo5 WiyNS5SQodSt9TLwGu5B00NVG0zIr3iNM04DNs7hGbI1pjyaa73osrCMVXhkbyBbn6P6 veK/73s0puU6GMqPpvDnJzmzanvjA3Lx1+lHhZ2JD51MOCON98ARBSXneYcweCL1e/JO ZsGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=Fq0wZbk8atxPuFaALjnooW2wpUoFFUKI6rkPZWH8VS8=; b=wwPIIC+MFJk4Adsbt17T8glXHRi3+GehRplV3izWNHi7ZwWIgFzgg1LoT5ZP4TBinS kEnKG1psj51onVa/yZgxHcai/ef9ALPXn5xJkr5aqlUH3K5I2oUjnYGWrkNrQrh3icRI +vR+CnZXKEknxAiWlufet0m4ZACeuRGOl+gheRCuQEOVJp6N6ZCYXaxEKEz8obRVQEU/ 6pCp5io6QHrRIk6Q2R1cvGr4485ztaFCe5tz2wbIjQtT2SJauIL0zkhJJtV572YmH39n 7cd9mhS1ZPLzstIyJRWRnSlXkl51e+t5q6vK56Q7J3vTENSQMPO5JgDhM9KLKM3q+Qqw 1kUw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcdkim header.b=DyXIa84j; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d7-20020a50cd47000000b00418c2b5bdcfsi9693171edj.177.2022.03.21.07.23.36; Mon, 21 Mar 2022 07:24:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcdkim header.b=DyXIa84j; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240752AbiCRUnR (ORCPT + 99 others); Fri, 18 Mar 2022 16:43:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60340 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240614AbiCRUnQ (ORCPT ); Fri, 18 Mar 2022 16:43:16 -0400 Received: from alexa-out-sd-01.qualcomm.com (alexa-out-sd-01.qualcomm.com [199.106.114.38]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 688552878BA; Fri, 18 Mar 2022 13:41:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; i=@quicinc.com; q=dns/txt; s=qcdkim; t=1647636117; x=1679172117; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=Fq0wZbk8atxPuFaALjnooW2wpUoFFUKI6rkPZWH8VS8=; b=DyXIa84j1h0dUr93EcQNRlkgURt7oFzDSF4/vsoKNpSzDMdtDyCK10G5 AQh4AVL9NR3agBdcnaV5hNMmeHrwkj1m9gOfy2lvfFDPRarErpEkmowJH OHFkfM5vwWlCwTK2XZFvFMGzvTVwiXN8fM/ilcckpJHOxo7AWXgDTPyNh 4=; Received: from unknown (HELO ironmsg04-sd.qualcomm.com) ([10.53.140.144]) by alexa-out-sd-01.qualcomm.com with ESMTP; 18 Mar 2022 13:41:57 -0700 X-QCInternal: smtphost Received: from nasanex01c.na.qualcomm.com ([10.47.97.222]) by ironmsg04-sd.qualcomm.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Mar 2022 13:41:56 -0700 Received: from nalasex01a.na.qualcomm.com (10.47.209.196) by nasanex01c.na.qualcomm.com (10.47.97.222) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.22; Fri, 18 Mar 2022 13:41:56 -0700 Received: from maru.qualcomm.com (10.80.80.8) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.22; Fri, 18 Mar 2022 13:41:55 -0700 From: Jae Hyun Yoo To: Wolfram Sang , Steven Rostedt , "Ingo Molnar" CC: Jamie Iles , Graeme Gregory , , , Jae Hyun Yoo Subject: [PATCH v3] i2c: add tracepoints for I2C slave events Date: Fri, 18 Mar 2022 13:41:33 -0700 Message-ID: <20220318204133.657568-1-quic_jaehyoo@quicinc.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nalasex01a.na.qualcomm.com (10.47.209.196) X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I2C slave events tracepoints can be enabled by: echo 1 > /sys/kernel/tracing/events/i2c_slave/enable and logs in /sys/kernel/tracing/trace will look like: ... i2c_slave: i2c-0 a=010 ret=0 WR_REQ [] ... i2c_slave: i2c-0 a=010 ret=0 WR_RCV [02] ... i2c_slave: i2c-0 a=010 ret=0 WR_RCV [0c] ... i2c_slave: i2c-0 a=010 ret=0 STOP [] ... i2c_slave: i2c-0 a=010 ret=0 RD_REQ [04] ... i2c_slave: i2c-0 a=010 ret=0 RD_PRO [b4] ... i2c_slave: i2c-0 a=010 ret=0 STOP [] formatted as: i2c- a= ret= <- callback return value [] trace printings can be selected by adding a filter like: echo adapter_nr==1 >/sys/kernel/tracing/events/i2c_slave/filter Signed-off-by: Jae Hyun Yoo --- Changes in v3: * Made trace print even when a callback return value is non-zero and print out the value too (Wolfram) * Added TRACE_DEFINE_ENUM export for events to make it useful for perf and trace-cmd (Steven) Changes in v2: * Fixed trace_2c_slave call condition to optimize conditional compare logic (Steven) * Fixed TP entry order to prevent wasting spaces in the ring buffer (Steven) * Replaced __get_dynamic_array with __array for storing 1-length data value to make it faster and save space (Steven) drivers/i2c/i2c-core-slave.c | 15 +++++++ include/linux/i2c.h | 8 +--- include/trace/events/i2c_slave.h | 67 ++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 include/trace/events/i2c_slave.h diff --git a/drivers/i2c/i2c-core-slave.c b/drivers/i2c/i2c-core-slave.c index 1589179d5eb9..e3765e12f93b 100644 --- a/drivers/i2c/i2c-core-slave.c +++ b/drivers/i2c/i2c-core-slave.c @@ -14,6 +14,9 @@ #include "i2c-core.h" +#define CREATE_TRACE_POINTS +#include + int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb) { int ret; @@ -79,6 +82,18 @@ int i2c_slave_unregister(struct i2c_client *client) } EXPORT_SYMBOL_GPL(i2c_slave_unregister); +int i2c_slave_event(struct i2c_client *client, + enum i2c_slave_event event, u8 *val) +{ + int ret = client->slave_cb(client, event, val); + + if (trace_i2c_slave_enabled()) + trace_i2c_slave(client, event, val, ret); + + return ret; +} +EXPORT_SYMBOL_GPL(i2c_slave_event); + /** * i2c_detect_slave_mode - detect operation mode * @dev: The device owning the bus diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 7d4f52ceb7b5..fbda5ada2afc 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -392,12 +392,8 @@ enum i2c_slave_event { int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb); int i2c_slave_unregister(struct i2c_client *client); bool i2c_detect_slave_mode(struct device *dev); - -static inline int i2c_slave_event(struct i2c_client *client, - enum i2c_slave_event event, u8 *val) -{ - return client->slave_cb(client, event, val); -} +int i2c_slave_event(struct i2c_client *client, + enum i2c_slave_event event, u8 *val); #else static inline bool i2c_detect_slave_mode(struct device *dev) { return false; } #endif diff --git a/include/trace/events/i2c_slave.h b/include/trace/events/i2c_slave.h new file mode 100644 index 000000000000..811166abbe3a --- /dev/null +++ b/include/trace/events/i2c_slave.h @@ -0,0 +1,67 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * I2C slave tracepoints + * + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM i2c_slave + +#if !defined(_TRACE_I2C_SLAVE_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_I2C_SLAVE_H + +#include +#include + +TRACE_DEFINE_ENUM(I2C_SLAVE_READ_REQUESTED); +TRACE_DEFINE_ENUM(I2C_SLAVE_WRITE_REQUESTED); +TRACE_DEFINE_ENUM(I2C_SLAVE_READ_PROCESSED); +TRACE_DEFINE_ENUM(I2C_SLAVE_WRITE_RECEIVED); +TRACE_DEFINE_ENUM(I2C_SLAVE_STOP); + +#define show_event_type(type) \ + __print_symbolic(type, \ + { I2C_SLAVE_READ_REQUESTED, "RD_REQ" }, \ + { I2C_SLAVE_WRITE_REQUESTED, "WR_REQ" }, \ + { I2C_SLAVE_READ_PROCESSED, "RD_PRO" }, \ + { I2C_SLAVE_WRITE_RECEIVED, "WR_RCV" }, \ + { I2C_SLAVE_STOP, " STOP" }) + +TRACE_EVENT(i2c_slave, + TP_PROTO(const struct i2c_client *client, enum i2c_slave_event event, + __u8 *val, int cb_ret), + TP_ARGS(client, event, val, cb_ret), + TP_STRUCT__entry( + __field(int, adapter_nr ) + __field(int, ret ) + __field(__u16, addr ) + __field(__u16, len ) + __field(enum i2c_slave_event, event ) + __array(__u8, buf, 1) ), + + TP_fast_assign( + __entry->adapter_nr = client->adapter->nr; + __entry->addr = client->addr; + __entry->event = event; + __entry->ret = cb_ret; + switch (event) { + case I2C_SLAVE_READ_REQUESTED: + case I2C_SLAVE_READ_PROCESSED: + case I2C_SLAVE_WRITE_RECEIVED: + __entry->len = 1; + memcpy(__entry->buf, val, __entry->len); + break; + default: + __entry->len = 0; + break; + } + ), + TP_printk("i2c-%d a=%03x ret=%d %s [%*phD]", + __entry->adapter_nr, __entry->addr, __entry->ret, + show_event_type(__entry->event), __entry->len, __entry->buf + )); + +#endif /* _TRACE_I2C_SLAVE_H */ + +/* This part must be outside protection */ +#include -- 2.25.1