diff mbox series

[V3,2/2] soc: qcom: smp2p: Introduce tracepoint support

Message ID 20240627104831.4176799-3-quic_sudeepgo@quicinc.com (mailing list archive)
State Superseded
Headers show
Series Use of devname for interrupt descriptions and tracepoint support for smp2p | expand

Commit Message

Sudeepgoud Patil June 27, 2024, 10:48 a.m. UTC
This commit introduces tracepoint support for smp2p, enabling
logging of communication between local and remote processors.
These tracepoints include information about the remote subsystem
name, negotiation details, supported features, bit change
notifications, and ssr activity. These logs are useful for
debugging issues between subsystems.

Signed-off-by: Sudeepgoud Patil <quic_sudeepgo@quicinc.com>
---
 drivers/soc/qcom/Makefile      |  1 +
 drivers/soc/qcom/smp2p.c       |  9 ++++
 drivers/soc/qcom/trace-smp2p.h | 98 ++++++++++++++++++++++++++++++++++
 3 files changed, 108 insertions(+)
 create mode 100644 drivers/soc/qcom/trace-smp2p.h

--

Comments

Deepak Kumar Singh June 28, 2024, 9:22 a.m. UTC | #1
On 6/27/2024 4:18 PM, Sudeepgoud Patil wrote:
> This commit introduces tracepoint support for smp2p, enabling
> logging of communication between local and remote processors.
> These tracepoints include information about the remote subsystem
> name, negotiation details, supported features, bit change
> notifications, and ssr activity. These logs are useful for
> debugging issues between subsystems.
> 
> Signed-off-by: Sudeepgoud Patil <quic_sudeepgo@quicinc.com>
Reviewed-by: Deepak Kumar Singh <quic_deesin@quicinc.com>
> ---
>   drivers/soc/qcom/Makefile      |  1 +
>   drivers/soc/qcom/smp2p.c       |  9 ++++
>   drivers/soc/qcom/trace-smp2p.h | 98 ++++++++++++++++++++++++++++++++++
>   3 files changed, 108 insertions(+)
>   create mode 100644 drivers/soc/qcom/trace-smp2p.h
> 
> diff --git a/drivers/soc/qcom/Makefile b/drivers/soc/qcom/Makefile
> index ca0bece0dfff..30c1bf645501 100644
> --- a/drivers/soc/qcom/Makefile
> +++ b/drivers/soc/qcom/Makefile
> @@ -23,6 +23,7 @@ qcom_rpmh-y			+= rpmh.o
>   obj-$(CONFIG_QCOM_SMD_RPM)	+= rpm-proc.o smd-rpm.o
>   obj-$(CONFIG_QCOM_SMEM) +=	smem.o
>   obj-$(CONFIG_QCOM_SMEM_STATE) += smem_state.o
> +CFLAGS_smp2p.o := -I$(src)
>   obj-$(CONFIG_QCOM_SMP2P)	+= smp2p.o
>   obj-$(CONFIG_QCOM_SMSM)	+= smsm.o
>   obj-$(CONFIG_QCOM_SOCINFO)	+= socinfo.o
> diff --git a/drivers/soc/qcom/smp2p.c b/drivers/soc/qcom/smp2p.c
> index 696c2a8387d0..4aa61b0f11ad 100644
> --- a/drivers/soc/qcom/smp2p.c
> +++ b/drivers/soc/qcom/smp2p.c
> @@ -161,6 +161,9 @@ struct qcom_smp2p {
>   	struct list_head outbound;
>   };
>   
> +#define CREATE_TRACE_POINTS
> +#include "trace-smp2p.h"
> +
>   static void qcom_smp2p_kick(struct qcom_smp2p *smp2p)
>   {
>   	/* Make sure any updated data is written before the kick */
> @@ -192,6 +195,7 @@ static void qcom_smp2p_do_ssr_ack(struct qcom_smp2p *smp2p)
>   	struct smp2p_smem_item *out = smp2p->out;
>   	u32 val;
>   
> +	trace_smp2p_ssr_ack(smp2p->dev);
>   	smp2p->ssr_ack = !smp2p->ssr_ack;
>   
>   	val = out->flags & ~BIT(SMP2P_FLAGS_RESTART_ACK_BIT);
> @@ -214,6 +218,7 @@ static void qcom_smp2p_negotiate(struct qcom_smp2p *smp2p)
>   			smp2p->ssr_ack_enabled = true;
>   
>   		smp2p->negotiation_done = true;
> +		trace_smp2p_negotiate(smp2p->dev, out->features);
>   	}
>   }
>   
> @@ -252,6 +257,8 @@ static void qcom_smp2p_notify_in(struct qcom_smp2p *smp2p)
>   		status = val ^ entry->last_value;
>   		entry->last_value = val;
>   
> +		trace_smp2p_notify_in(entry, status, val);
> +
>   		/* No changes of this entry? */
>   		if (!status)
>   			continue;
> @@ -415,6 +422,8 @@ static int smp2p_update_bits(void *data, u32 mask, u32 value)
>   	writel(val, entry->value);
>   	spin_unlock_irqrestore(&entry->lock, flags);
>   
> +	trace_smp2p_update_bits(entry, orig, val);
> +
>   	if (val != orig)
>   		qcom_smp2p_kick(entry->smp2p);
>   
> diff --git a/drivers/soc/qcom/trace-smp2p.h b/drivers/soc/qcom/trace-smp2p.h
> new file mode 100644
> index 000000000000..fa985a0d7615
> --- /dev/null
> +++ b/drivers/soc/qcom/trace-smp2p.h
> @@ -0,0 +1,98 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
> + */
> +
> +#undef TRACE_SYSTEM
> +#define TRACE_SYSTEM qcom_smp2p
> +
> +#if !defined(__QCOM_SMP2P_TRACE_H__) || defined(TRACE_HEADER_MULTI_READ)
> +#define __QCOM_SMP2P_TRACE_H__
> +
> +#include <linux/device.h>
> +#include <linux/tracepoint.h>
> +
> +TRACE_EVENT(smp2p_ssr_ack,
> +	TP_PROTO(const struct device *dev),
> +	TP_ARGS(dev),
> +	TP_STRUCT__entry(
> +		__string(dev_name, dev_name(dev))
> +	),
> +	TP_fast_assign(
> +		__assign_str(dev_name, dev_name(dev));
> +	),
> +	TP_printk("%s: SSR detected", __get_str(dev_name))
> +);
> +
> +TRACE_EVENT(smp2p_negotiate,
> +	TP_PROTO(const struct device *dev, unsigned int features),
> +	TP_ARGS(dev, features),
> +	TP_STRUCT__entry(
> +		__string(dev_name, dev_name(dev))
> +		__field(u32, out_features)
> +	),
> +	TP_fast_assign(
> +		__assign_str(dev_name, dev_name(dev));
> +		__entry->out_features = features;
> +	),
> +	TP_printk("%s: state=open out_features=%s", __get_str(dev_name),
> +		__print_flags(__entry->out_features, "|",
> +			{SMP2P_FEATURE_SSR_ACK, "SMP2P_FEATURE_SSR_ACK"})
> +	)
> +);
> +
> +TRACE_EVENT(smp2p_notify_in,
> +	TP_PROTO(struct smp2p_entry *smp2p_entry, unsigned long status, u32 val),
> +	TP_ARGS(smp2p_entry, status, val),
> +	TP_STRUCT__entry(
> +		__string(dev_name, dev_name(smp2p_entry->smp2p->dev))
> +		__string(client_name, smp2p_entry->name)
> +		__field(unsigned long, status)
> +		__field(u32, val)
> +	),
> +	TP_fast_assign(
> +		__assign_str(dev_name, dev_name(smp2p_entry->smp2p->dev));
> +		__assign_str(client_name, smp2p_entry->name);
> +		__entry->status = status;
> +		__entry->val = val;
> +	),
> +	TP_printk("%s: %s: status:0x%0lx val:0x%0x",
> +		__get_str(dev_name),
> +		__get_str(client_name),
> +		__entry->status,
> +		__entry->val
> +	)
> +);
> +
> +TRACE_EVENT(smp2p_update_bits,
> +	TP_PROTO(struct smp2p_entry *smp2p_entry, u32 orig, u32 val),
> +	TP_ARGS(smp2p_entry, orig, val),
> +	TP_STRUCT__entry(
> +		__string(dev_name, dev_name(smp2p_entry->smp2p->dev))
> +		__string(client_name, smp2p_entry->name)
> +		__field(u32, orig)
> +		__field(u32, val)
> +	),
> +	TP_fast_assign(
> +		__assign_str(dev_name, dev_name(smp2p_entry->smp2p->dev));
> +		__assign_str(client_name, smp2p_entry->name);
> +		__entry->orig = orig;
> +		__entry->val = val;
> +	),
> +	TP_printk("%s: %s: orig:0x%0x new:0x%0x",
> +		__get_str(dev_name),
> +		__get_str(client_name),
> +		__entry->orig,
> +		__entry->val
> +	)
> +);
> +
> +#endif /* __QCOM_SMP2P_TRACE_H__ */
> +
> +#undef TRACE_INCLUDE_PATH
> +#define TRACE_INCLUDE_PATH .
> +
> +#undef TRACE_INCLUDE_FILE
> +#define TRACE_INCLUDE_FILE trace-smp2p
> +
> +#include <trace/define_trace.h>
kernel test robot June 28, 2024, 5:36 p.m. UTC | #2
Hi Sudeepgoud,

kernel test robot noticed the following build errors:

[auto build test ERROR on linus/master]
[also build test ERROR on v6.10-rc5 next-20240627]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Sudeepgoud-Patil/soc-qcom-smp2p-Use-devname-for-interrupt-descriptions/20240628-061654
base:   linus/master
patch link:    https://lore.kernel.org/r/20240627104831.4176799-3-quic_sudeepgo%40quicinc.com
patch subject: [PATCH V3 2/2] soc: qcom: smp2p: Introduce tracepoint support
config: arc-allmodconfig (https://download.01.org/0day-ci/archive/20240629/202406290037.KaJgVUWB-lkp@intel.com/config)
compiler: arceb-elf-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240629/202406290037.KaJgVUWB-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202406290037.KaJgVUWB-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from include/trace/trace_events.h:419,
                    from include/trace/define_trace.h:102,
                    from drivers/soc/qcom/trace-smp2p.h:98,
                    from drivers/soc/qcom/smp2p.c:165:
>> drivers/soc/qcom/./trace-smp2p.h:25:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      25 | );
         | ^~                 
   In file included from include/trace/trace_events.h:375:
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h: In function 'trace_event_raw_event_smp2p_ssr_ack':
>> drivers/soc/qcom/./trace-smp2p.h:22:17: error: '__assign_str' undeclared (first use in this function)
      22 |                 __assign_str(dev_name, dev_name(dev));
         |                 ^~~~~~~~~~~~
   include/trace/trace_events.h:402:11: note: in definition of macro 'DECLARE_EVENT_CLASS'
     402 |         { assign; }                                                     \
         |           ^~~~~~
   include/trace/trace_events.h:44:30: note: in expansion of macro 'PARAMS'
      44 |                              PARAMS(assign),                   \
         |                              ^~~~~~
   drivers/soc/qcom/./trace-smp2p.h:15:1: note: in expansion of macro 'TRACE_EVENT'
      15 | TRACE_EVENT(smp2p_ssr_ack,
         | ^~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h:21:9: note: in expansion of macro 'TP_fast_assign'
      21 |         TP_fast_assign(
         |         ^~~~~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h:22:17: note: each undeclared identifier is reported only once for each function it appears in
      22 |                 __assign_str(dev_name, dev_name(dev));
         |                 ^~~~~~~~~~~~
   include/trace/trace_events.h:402:11: note: in definition of macro 'DECLARE_EVENT_CLASS'
     402 |         { assign; }                                                     \
         |           ^~~~~~
   include/trace/trace_events.h:44:30: note: in expansion of macro 'PARAMS'
      44 |                              PARAMS(assign),                   \
         |                              ^~~~~~
   drivers/soc/qcom/./trace-smp2p.h:15:1: note: in expansion of macro 'TRACE_EVENT'
      15 | TRACE_EVENT(smp2p_ssr_ack,
         | ^~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h:21:9: note: in expansion of macro 'TP_fast_assign'
      21 |         TP_fast_assign(
         |         ^~~~~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h: At top level:
   drivers/soc/qcom/./trace-smp2p.h:42:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      42 | );
         | ^~                 
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h: In function 'trace_event_raw_event_smp2p_negotiate':
   drivers/soc/qcom/./trace-smp2p.h:35:17: error: '__assign_str' undeclared (first use in this function)
      35 |                 __assign_str(dev_name, dev_name(dev));
         |                 ^~~~~~~~~~~~
   include/trace/trace_events.h:402:11: note: in definition of macro 'DECLARE_EVENT_CLASS'
     402 |         { assign; }                                                     \
         |           ^~~~~~
   include/trace/trace_events.h:44:30: note: in expansion of macro 'PARAMS'
      44 |                              PARAMS(assign),                   \
         |                              ^~~~~~
   drivers/soc/qcom/./trace-smp2p.h:27:1: note: in expansion of macro 'TRACE_EVENT'
      27 | TRACE_EVENT(smp2p_negotiate,
         | ^~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h:34:9: note: in expansion of macro 'TP_fast_assign'
      34 |         TP_fast_assign(
         |         ^~~~~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h: At top level:
   drivers/soc/qcom/./trace-smp2p.h:65:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      65 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:65:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      65 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h: In function 'trace_event_raw_event_smp2p_notify_in':
   drivers/soc/qcom/./trace-smp2p.h:54:17: error: '__assign_str' undeclared (first use in this function)
      54 |                 __assign_str(dev_name, dev_name(smp2p_entry->smp2p->dev));
         |                 ^~~~~~~~~~~~
   include/trace/trace_events.h:402:11: note: in definition of macro 'DECLARE_EVENT_CLASS'
     402 |         { assign; }                                                     \
         |           ^~~~~~
   include/trace/trace_events.h:44:30: note: in expansion of macro 'PARAMS'
      44 |                              PARAMS(assign),                   \
         |                              ^~~~~~
   drivers/soc/qcom/./trace-smp2p.h:44:1: note: in expansion of macro 'TRACE_EVENT'
      44 | TRACE_EVENT(smp2p_notify_in,
         | ^~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h:53:9: note: in expansion of macro 'TP_fast_assign'
      53 |         TP_fast_assign(
         |         ^~~~~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h: At top level:
   drivers/soc/qcom/./trace-smp2p.h:88:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      88 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:88:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      88 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h: In function 'trace_event_raw_event_smp2p_update_bits':
   drivers/soc/qcom/./trace-smp2p.h:77:17: error: '__assign_str' undeclared (first use in this function)
      77 |                 __assign_str(dev_name, dev_name(smp2p_entry->smp2p->dev));
         |                 ^~~~~~~~~~~~
   include/trace/trace_events.h:402:11: note: in definition of macro 'DECLARE_EVENT_CLASS'
     402 |         { assign; }                                                     \
         |           ^~~~~~
   include/trace/trace_events.h:44:30: note: in expansion of macro 'PARAMS'
      44 |                              PARAMS(assign),                   \
         |                              ^~~~~~
   drivers/soc/qcom/./trace-smp2p.h:67:1: note: in expansion of macro 'TRACE_EVENT'
      67 | TRACE_EVENT(smp2p_update_bits,
         | ^~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h:76:9: note: in expansion of macro 'TP_fast_assign'
      76 |         TP_fast_assign(
         |         ^~~~~~~~~~~~~~
   In file included from include/trace/trace_events.h:469:
   drivers/soc/qcom/./trace-smp2p.h: At top level:
>> drivers/soc/qcom/./trace-smp2p.h:25:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      25 | );
         | ^~                 
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:42:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      42 | );
         | ^~                 
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:65:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      65 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:65:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      65 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:88:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      88 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:88:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      88 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   In file included from include/trace/perf.h:75,
                    from include/trace/define_trace.h:103:
>> drivers/soc/qcom/./trace-smp2p.h:25:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      25 | );
         | ^~                 
   In file included from include/trace/perf.h:7:
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h: In function 'perf_trace_smp2p_ssr_ack':
>> drivers/soc/qcom/./trace-smp2p.h:22:17: error: '__assign_str' undeclared (first use in this function)
      22 |                 __assign_str(dev_name, dev_name(dev));
         |                 ^~~~~~~~~~~~
   include/trace/perf.h:51:11: note: in definition of macro 'DECLARE_EVENT_CLASS'
      51 |         { assign; }                                                     \
         |           ^~~~~~
   include/trace/trace_events.h:44:30: note: in expansion of macro 'PARAMS'
      44 |                              PARAMS(assign),                   \
         |                              ^~~~~~
   drivers/soc/qcom/./trace-smp2p.h:15:1: note: in expansion of macro 'TRACE_EVENT'
      15 | TRACE_EVENT(smp2p_ssr_ack,
         | ^~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h:21:9: note: in expansion of macro 'TP_fast_assign'
      21 |         TP_fast_assign(
         |         ^~~~~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h: At top level:
   drivers/soc/qcom/./trace-smp2p.h:42:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      42 | );
         | ^~                 
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h: In function 'perf_trace_smp2p_negotiate':
   drivers/soc/qcom/./trace-smp2p.h:35:17: error: '__assign_str' undeclared (first use in this function)
      35 |                 __assign_str(dev_name, dev_name(dev));
         |                 ^~~~~~~~~~~~
   include/trace/perf.h:51:11: note: in definition of macro 'DECLARE_EVENT_CLASS'
      51 |         { assign; }                                                     \
         |           ^~~~~~
   include/trace/trace_events.h:44:30: note: in expansion of macro 'PARAMS'
      44 |                              PARAMS(assign),                   \
         |                              ^~~~~~
   drivers/soc/qcom/./trace-smp2p.h:27:1: note: in expansion of macro 'TRACE_EVENT'
      27 | TRACE_EVENT(smp2p_negotiate,
         | ^~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h:34:9: note: in expansion of macro 'TP_fast_assign'
      34 |         TP_fast_assign(
         |         ^~~~~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h: At top level:
   drivers/soc/qcom/./trace-smp2p.h:65:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      65 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:65:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      65 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h: In function 'perf_trace_smp2p_notify_in':
   drivers/soc/qcom/./trace-smp2p.h:54:17: error: '__assign_str' undeclared (first use in this function)
      54 |                 __assign_str(dev_name, dev_name(smp2p_entry->smp2p->dev));
         |                 ^~~~~~~~~~~~
   include/trace/perf.h:51:11: note: in definition of macro 'DECLARE_EVENT_CLASS'
      51 |         { assign; }                                                     \
         |           ^~~~~~
   include/trace/trace_events.h:44:30: note: in expansion of macro 'PARAMS'
      44 |                              PARAMS(assign),                   \
         |                              ^~~~~~
   drivers/soc/qcom/./trace-smp2p.h:44:1: note: in expansion of macro 'TRACE_EVENT'
      44 | TRACE_EVENT(smp2p_notify_in,
         | ^~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h:53:9: note: in expansion of macro 'TP_fast_assign'
      53 |         TP_fast_assign(
         |         ^~~~~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h: At top level:
   drivers/soc/qcom/./trace-smp2p.h:88:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      88 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:88:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      88 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h: In function 'perf_trace_smp2p_update_bits':
   drivers/soc/qcom/./trace-smp2p.h:77:17: error: '__assign_str' undeclared (first use in this function)
      77 |                 __assign_str(dev_name, dev_name(smp2p_entry->smp2p->dev));
         |                 ^~~~~~~~~~~~
   include/trace/perf.h:51:11: note: in definition of macro 'DECLARE_EVENT_CLASS'
      51 |         { assign; }                                                     \
         |           ^~~~~~
   include/trace/trace_events.h:44:30: note: in expansion of macro 'PARAMS'
      44 |                              PARAMS(assign),                   \
         |                              ^~~~~~
   drivers/soc/qcom/./trace-smp2p.h:67:1: note: in expansion of macro 'TRACE_EVENT'
      67 | TRACE_EVENT(smp2p_update_bits,
         | ^~~~~~~~~~~
   drivers/soc/qcom/./trace-smp2p.h:76:9: note: in expansion of macro 'TP_fast_assign'
      76 |         TP_fast_assign(
         |         ^~~~~~~~~~~~~~
   In file included from include/trace/bpf_probe.h:117,
                    from include/trace/define_trace.h:104:
   drivers/soc/qcom/./trace-smp2p.h: At top level:
>> drivers/soc/qcom/./trace-smp2p.h:25:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      25 | );
         | ^~                 
   In file included from include/trace/bpf_probe.h:7:
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:42:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      42 | );
         | ^~                 
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:65:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      65 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:65:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      65 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:88:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      88 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 
   drivers/soc/qcom/./trace-smp2p.h:88:1: error: macro "__assign_str" passed 2 arguments, but takes just 1
      88 | );
         | ^~                    
   include/trace/stages/stage6_event_callback.h:34: note: macro "__assign_str" defined here
      34 | #define __assign_str(dst)                                               \
         | 


vim +/__assign_str +25 drivers/soc/qcom/./trace-smp2p.h

    14	
    15	TRACE_EVENT(smp2p_ssr_ack,
    16		TP_PROTO(const struct device *dev),
    17		TP_ARGS(dev),
    18		TP_STRUCT__entry(
    19			__string(dev_name, dev_name(dev))
    20		),
    21		TP_fast_assign(
  > 22			__assign_str(dev_name, dev_name(dev));
    23		),
    24		TP_printk("%s: SSR detected", __get_str(dev_name))
  > 25	);
    26
Dmitry Baryshkov July 2, 2024, 8:03 a.m. UTC | #3
On Thu, Jun 27, 2024 at 04:18:31PM GMT, Sudeepgoud Patil wrote:
> This commit introduces tracepoint support for smp2p, enabling

See Documentation/process/submitting-patches.rst, "This patch".

> logging of communication between local and remote processors.
> These tracepoints include information about the remote subsystem
> name, negotiation details, supported features, bit change
> notifications, and ssr activity. These logs are useful for
> debugging issues between subsystems.
> 
> Signed-off-by: Sudeepgoud Patil <quic_sudeepgo@quicinc.com>
> ---
>  drivers/soc/qcom/Makefile      |  1 +
>  drivers/soc/qcom/smp2p.c       |  9 ++++
>  drivers/soc/qcom/trace-smp2p.h | 98 ++++++++++++++++++++++++++++++++++
>  3 files changed, 108 insertions(+)
>  create mode 100644 drivers/soc/qcom/trace-smp2p.h
>
diff mbox series

Patch

diff --git a/drivers/soc/qcom/Makefile b/drivers/soc/qcom/Makefile
index ca0bece0dfff..30c1bf645501 100644
--- a/drivers/soc/qcom/Makefile
+++ b/drivers/soc/qcom/Makefile
@@ -23,6 +23,7 @@  qcom_rpmh-y			+= rpmh.o
 obj-$(CONFIG_QCOM_SMD_RPM)	+= rpm-proc.o smd-rpm.o
 obj-$(CONFIG_QCOM_SMEM) +=	smem.o
 obj-$(CONFIG_QCOM_SMEM_STATE) += smem_state.o
+CFLAGS_smp2p.o := -I$(src)
 obj-$(CONFIG_QCOM_SMP2P)	+= smp2p.o
 obj-$(CONFIG_QCOM_SMSM)	+= smsm.o
 obj-$(CONFIG_QCOM_SOCINFO)	+= socinfo.o
diff --git a/drivers/soc/qcom/smp2p.c b/drivers/soc/qcom/smp2p.c
index 696c2a8387d0..4aa61b0f11ad 100644
--- a/drivers/soc/qcom/smp2p.c
+++ b/drivers/soc/qcom/smp2p.c
@@ -161,6 +161,9 @@  struct qcom_smp2p {
 	struct list_head outbound;
 };
 
+#define CREATE_TRACE_POINTS
+#include "trace-smp2p.h"
+
 static void qcom_smp2p_kick(struct qcom_smp2p *smp2p)
 {
 	/* Make sure any updated data is written before the kick */
@@ -192,6 +195,7 @@  static void qcom_smp2p_do_ssr_ack(struct qcom_smp2p *smp2p)
 	struct smp2p_smem_item *out = smp2p->out;
 	u32 val;
 
+	trace_smp2p_ssr_ack(smp2p->dev);
 	smp2p->ssr_ack = !smp2p->ssr_ack;
 
 	val = out->flags & ~BIT(SMP2P_FLAGS_RESTART_ACK_BIT);
@@ -214,6 +218,7 @@  static void qcom_smp2p_negotiate(struct qcom_smp2p *smp2p)
 			smp2p->ssr_ack_enabled = true;
 
 		smp2p->negotiation_done = true;
+		trace_smp2p_negotiate(smp2p->dev, out->features);
 	}
 }
 
@@ -252,6 +257,8 @@  static void qcom_smp2p_notify_in(struct qcom_smp2p *smp2p)
 		status = val ^ entry->last_value;
 		entry->last_value = val;
 
+		trace_smp2p_notify_in(entry, status, val);
+
 		/* No changes of this entry? */
 		if (!status)
 			continue;
@@ -415,6 +422,8 @@  static int smp2p_update_bits(void *data, u32 mask, u32 value)
 	writel(val, entry->value);
 	spin_unlock_irqrestore(&entry->lock, flags);
 
+	trace_smp2p_update_bits(entry, orig, val);
+
 	if (val != orig)
 		qcom_smp2p_kick(entry->smp2p);
 
diff --git a/drivers/soc/qcom/trace-smp2p.h b/drivers/soc/qcom/trace-smp2p.h
new file mode 100644
index 000000000000..fa985a0d7615
--- /dev/null
+++ b/drivers/soc/qcom/trace-smp2p.h
@@ -0,0 +1,98 @@ 
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
+ */
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM qcom_smp2p
+
+#if !defined(__QCOM_SMP2P_TRACE_H__) || defined(TRACE_HEADER_MULTI_READ)
+#define __QCOM_SMP2P_TRACE_H__
+
+#include <linux/device.h>
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(smp2p_ssr_ack,
+	TP_PROTO(const struct device *dev),
+	TP_ARGS(dev),
+	TP_STRUCT__entry(
+		__string(dev_name, dev_name(dev))
+	),
+	TP_fast_assign(
+		__assign_str(dev_name, dev_name(dev));
+	),
+	TP_printk("%s: SSR detected", __get_str(dev_name))
+);
+
+TRACE_EVENT(smp2p_negotiate,
+	TP_PROTO(const struct device *dev, unsigned int features),
+	TP_ARGS(dev, features),
+	TP_STRUCT__entry(
+		__string(dev_name, dev_name(dev))
+		__field(u32, out_features)
+	),
+	TP_fast_assign(
+		__assign_str(dev_name, dev_name(dev));
+		__entry->out_features = features;
+	),
+	TP_printk("%s: state=open out_features=%s", __get_str(dev_name),
+		__print_flags(__entry->out_features, "|",
+			{SMP2P_FEATURE_SSR_ACK, "SMP2P_FEATURE_SSR_ACK"})
+	)
+);
+
+TRACE_EVENT(smp2p_notify_in,
+	TP_PROTO(struct smp2p_entry *smp2p_entry, unsigned long status, u32 val),
+	TP_ARGS(smp2p_entry, status, val),
+	TP_STRUCT__entry(
+		__string(dev_name, dev_name(smp2p_entry->smp2p->dev))
+		__string(client_name, smp2p_entry->name)
+		__field(unsigned long, status)
+		__field(u32, val)
+	),
+	TP_fast_assign(
+		__assign_str(dev_name, dev_name(smp2p_entry->smp2p->dev));
+		__assign_str(client_name, smp2p_entry->name);
+		__entry->status = status;
+		__entry->val = val;
+	),
+	TP_printk("%s: %s: status:0x%0lx val:0x%0x",
+		__get_str(dev_name),
+		__get_str(client_name),
+		__entry->status,
+		__entry->val
+	)
+);
+
+TRACE_EVENT(smp2p_update_bits,
+	TP_PROTO(struct smp2p_entry *smp2p_entry, u32 orig, u32 val),
+	TP_ARGS(smp2p_entry, orig, val),
+	TP_STRUCT__entry(
+		__string(dev_name, dev_name(smp2p_entry->smp2p->dev))
+		__string(client_name, smp2p_entry->name)
+		__field(u32, orig)
+		__field(u32, val)
+	),
+	TP_fast_assign(
+		__assign_str(dev_name, dev_name(smp2p_entry->smp2p->dev));
+		__assign_str(client_name, smp2p_entry->name);
+		__entry->orig = orig;
+		__entry->val = val;
+	),
+	TP_printk("%s: %s: orig:0x%0x new:0x%0x",
+		__get_str(dev_name),
+		__get_str(client_name),
+		__entry->orig,
+		__entry->val
+	)
+);
+
+#endif /* __QCOM_SMP2P_TRACE_H__ */
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH .
+
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_FILE trace-smp2p
+
+#include <trace/define_trace.h>