kernel-brax3-ubuntu-touch/drivers/scsi/ufs/ufs-mediatek-dbg.h
erascape f319b992b1 kernel-5.15: Initial import brax3 UT kernel
* halium configs enabled

Signed-off-by: erascape <erascape@proton.me>
2025-09-23 15:17:10 +00:00

176 lines
3.1 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (C) 2019 MediaTek Inc.
*/
#ifndef _UFS_MEDIATEK_DBG_H
#define _UFS_MEDIATEK_DBG_H
#if IS_ENABLED(CONFIG_SCSI_UFS_MEDIATEK_DBG)
#include <linux/device.h>
#include <linux/seq_file.h>
#include <linux/types.h>
/*
* snprintf may return a value of size or "more" to indicate
* that the output was truncated, thus be careful of "more"
* case.
*/
#define SPREAD_PRINTF(buff, size, evt, fmt, args...) \
do { \
if (buff && size && *(size)) { \
unsigned long var = snprintf(*(buff), *(size), fmt, ##args); \
if (var > 0) { \
if (var > *(size)) \
var = *(size); \
*(size) -= var; \
*(buff) += var; \
} \
} \
if (evt) \
seq_printf(evt, fmt, ##args); \
if (!buff && !evt) { \
pr_info(fmt, ##args); \
} \
} while (0)
enum ufsdbg_cmd_type {
UFSDBG_CMD_LIST_DUMP = 0,
UFSDBG_PWR_MODE_DUMP = 1,
UFSDBG_HEALTH_DUMP = 2,
UFSDBG_CMD_LIST_ENABLE = 3,
UFSDBG_CMD_LIST_DISABLE = 4,
UFSDBG_CMD_QOS_ON = 5,
UFSDBG_CMD_QOS_OFF = 6,
UFSDBG_CMD_SKIPBTAG_ON = 7,
UFSDBG_CMD_SKIPBTAG_OFF = 8,
UFSDBG_CMD_IRQ_SET = 9,
UFSDBG_CMD_IRQ_UNSET = 10,
UFSDBG_UNKNOWN
};
enum ufsdbg_pm_state {
UFSDBG_RUNTIME_SUSPEND,
UFSDBG_RUNTIME_RESUME,
UFSDBG_SYSTEM_SUSPEND,
UFSDBG_SYSTEM_RESUME
};
/* clock scaling state */
enum clk_scaling_state {
CLKS_SCALE_DOWN,
CLKS_SCALE_UP,
CLKS_SCALE_UNKNOWN
};
enum cmd_hist_event {
CMD_SEND = 0,
CMD_COMPLETED = 1,
CMD_DEV_SEND = 2,
CMD_DEV_COMPLETED = 3,
CMD_TM_SEND = 4,
CMD_TM_COMPLETED = 5,
CMD_TM_COMPLETED_ERR = 6,
CMD_UIC_SEND = 7,
CMD_UIC_CMPL_GENERAL = 8,
CMD_UIC_CMPL_PWR_CTRL = 9,
CMD_REG_TOGGLE = 10,
CMD_ABORTING = 11,
CMD_DI_FAIL = 12,
CMD_DEVICE_RESET = 13,
CMD_PERF_MODE = 14,
CMD_DEBUG_PROC = 15,
CMD_GENERIC = 16,
CMD_CLK_GATING = 17,
CMD_PM = 18,
CMD_CLK_SCALING = 19,
CMD_UNKNOWN
};
struct tm_cmd_struct {
u8 lun;
u8 tag;
u8 task_tag;
u16 tm_func;
};
struct utp_cmd_struct {
u8 opcode;
u8 crypt_en;
u8 crypt_keyslot;
u16 tag;
u32 doorbell;
u32 intr;
int transfer_len;
u64 lba;
};
struct dev_cmd_struct {
u8 type;
u8 opcode;
u8 idn;
u8 index;
u8 selector;
u16 tag;
};
struct uic_cmd_struct {
u8 cmd;
u32 arg1;
u32 arg2;
u32 arg3;
};
struct clk_gating_event_struct {
u8 state;
u32 arg1;
u32 arg2;
u32 arg3;
};
struct clk_scaling_event_struct {
u8 state;
int err;
};
struct ufs_pm_struct {
u8 state;
int err;
s64 time_us;
int pwr_mode;
int link_state;
};
struct cmd_hist_struct {
u8 cpu;
enum cmd_hist_event event;
pid_t pid;
u64 time;
u64 duration;
union {
struct tm_cmd_struct tm;
struct dev_cmd_struct dev;
struct utp_cmd_struct utp;
struct uic_cmd_struct uic;
struct clk_gating_event_struct clk_gating;
struct clk_scaling_event_struct clk_scaling;
struct ufs_pm_struct pm;
} cmd;
};
int ufs_mtk_dbg_register(struct ufs_hba *hba);
void ufs_mtk_dbg_dump(u32 latest_cnt);
int ufs_mtk_dbg_cmd_hist_enable(void);
int ufs_mtk_dbg_cmd_hist_disable(void);
void ufs_mtk_init_clk_scaling_sysfs(struct ufs_hba *hba);
void ufs_mtk_remove_clk_scaling_sysfs(struct ufs_hba *hba);
#else
#define ufs_mtk_dbg_register(...)
#endif
#endif