162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci *
362306a36Sopenharmony_ci * Copyright (C) 2020-2021 Intel Corporation.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef IOSM_IPC_TRACE_H
762306a36Sopenharmony_ci#define IOSM_IPC_TRACE_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/debugfs.h>
1062306a36Sopenharmony_ci#include <linux/relay.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include "iosm_ipc_chnl_cfg.h"
1362306a36Sopenharmony_ci#include "iosm_ipc_imem_ops.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/**
1662306a36Sopenharmony_ci * enum trace_ctrl_mode - State of trace channel
1762306a36Sopenharmony_ci * @TRACE_DISABLE:	mode for disable trace
1862306a36Sopenharmony_ci * @TRACE_ENABLE:	mode for enable trace
1962306a36Sopenharmony_ci */
2062306a36Sopenharmony_cienum trace_ctrl_mode {
2162306a36Sopenharmony_ci	TRACE_DISABLE = 0,
2262306a36Sopenharmony_ci	TRACE_ENABLE,
2362306a36Sopenharmony_ci};
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/**
2662306a36Sopenharmony_ci * struct iosm_trace - Struct for trace interface
2762306a36Sopenharmony_ci * @ipc_rchan:		Pointer to relay channel
2862306a36Sopenharmony_ci * @ctrl_file:		Pointer to trace control file
2962306a36Sopenharmony_ci * @ipc_imem:		Imem instance
3062306a36Sopenharmony_ci * @dev:		Pointer to device struct
3162306a36Sopenharmony_ci * @channel:		Channel instance
3262306a36Sopenharmony_ci * @chl_id:		Channel Indentifier
3362306a36Sopenharmony_ci * @trc_mutex:		Mutex used for read and write mode
3462306a36Sopenharmony_ci * @mode:		Mode for enable and disable trace
3562306a36Sopenharmony_ci */
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistruct iosm_trace {
3862306a36Sopenharmony_ci	struct rchan *ipc_rchan;
3962306a36Sopenharmony_ci	struct dentry *ctrl_file;
4062306a36Sopenharmony_ci	struct iosm_imem *ipc_imem;
4162306a36Sopenharmony_ci	struct device *dev;
4262306a36Sopenharmony_ci	struct ipc_mem_channel *channel;
4362306a36Sopenharmony_ci	enum ipc_channel_id chl_id;
4462306a36Sopenharmony_ci	struct mutex trc_mutex;	/* Mutex used for read and write mode */
4562306a36Sopenharmony_ci	enum trace_ctrl_mode mode;
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#ifdef CONFIG_WWAN_DEBUGFS
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistatic inline bool ipc_is_trace_channel(struct iosm_imem *ipc_mem, u16 chl_id)
5162306a36Sopenharmony_ci{
5262306a36Sopenharmony_ci	return ipc_mem->trace && ipc_mem->trace->chl_id == chl_id;
5362306a36Sopenharmony_ci}
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistruct iosm_trace *ipc_trace_init(struct iosm_imem *ipc_imem);
5662306a36Sopenharmony_civoid ipc_trace_deinit(struct iosm_trace *ipc_trace);
5762306a36Sopenharmony_civoid ipc_trace_port_rx(struct iosm_imem *ipc_imem, struct sk_buff *skb);
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#else
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistatic inline bool ipc_is_trace_channel(struct iosm_imem *ipc_mem, u16 chl_id)
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci	return false;
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistatic inline void ipc_trace_port_rx(struct iosm_imem *ipc_imem,
6762306a36Sopenharmony_ci				     struct sk_buff *skb)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	dev_kfree_skb(skb);
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#endif
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#endif
75