From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Sat, 22 Aug 2020 10:47:33 -0700 Subject: NOUPSTREAM: ANDROID: scsi: SCSI related vendor hooks Add a 'fill_prdt' Android vendor hook so that UFS platform drivers can initialize variant-specific PRDT fields. This is needed for FMP support. [CPNOTE: 03/06/21] Lee: Vendor related code - maintain forever Squash: NOUPSTREAM: ANDROID: scsi: ufs: add a hook to prepare command NOUPSTREAM: ANDROID: scsi: ufs: add a hook to add sysfs entries NOUPSTREAM: ANDROID: scsi: ufs: add hooks to monitor stats of UFS traffic NOUPSTREAM: ANDROID: scsi: ufs: add hooks to track ufs commands Bug: 166139333 Bug: 162257402 Bug: 181359082 Bug: 158050260 Bug: 172874931 Bug: 172305874 Bug: 176940922 Change-Id: Icd07b5e475555ef3eaa0ae9e18a1ae9a4b981679 Signed-off-by: Eric Biggers Signed-off-by: Lee Jones --- drivers/android/vendor_hooks.c | 3 ++ drivers/ufs/core/ufshcd.c | 28 +++++++++++++++-- include/trace/hooks/ufshcd.h | 55 ++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 include/trace/hooks/ufshcd.h diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -52,6 +52,9 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_command); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_compl_command); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cgroup_set_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_syscall_prctl_finished); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_uic_command); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_tm_command); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_check_int_errors); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cgroup_attach); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_iommu_setup_dma_ops); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ptype_head); diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -41,6 +41,9 @@ #define CREATE_TRACE_POINTS #include +#undef CREATE_TRACE_POINTS +#include + #define UFSHCD_ENABLE_INTRS (UTP_TRANSFER_REQ_COMPL |\ UTP_TASK_REQ_COMPL |\ UFSHCD_ERROR_MASK) @@ -364,6 +367,8 @@ static void ufshcd_add_tm_upiu_trace(struct ufs_hba *hba, unsigned int tag, { struct utp_task_req_desc *descp = &hba->utmrdl_base_addr[tag]; + trace_android_vh_ufs_send_tm_command(hba, tag, (int)str_t); + if (!trace_ufshcd_upiu_enabled()) return; @@ -385,6 +390,8 @@ static void ufshcd_add_uic_command_trace(struct ufs_hba *hba, { u32 cmd; + trace_android_vh_ufs_send_uic_command(hba, ucmd, (int)str_t); + if (!trace_ufshcd_uic_command_enabled()) return; @@ -2265,6 +2272,7 @@ void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag, lrbp->issue_time_stamp_local_clock = local_clock(); lrbp->compl_time_stamp = ktime_set(0, 0); lrbp->compl_time_stamp_local_clock = 0; + trace_android_vh_ufs_send_command(hba, lrbp); ufshcd_add_command_trace(hba, task_tag, UFS_CMD_SEND); if (lrbp->cmd) ufshcd_clk_scaling_start_busy(hba); @@ -2600,13 +2608,16 @@ static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) { struct scsi_cmnd *cmd = lrbp->cmd; int sg_segments = scsi_dma_map(cmd); + int err; if (sg_segments < 0) return sg_segments; ufshcd_sgl_to_prdt(hba, lrbp, sg_segments, scsi_sglist(cmd)); - return 0; + err = 0; + trace_android_vh_ufs_fill_prdt(hba, lrbp, sg_segments, &err); + return err; } /** @@ -2976,6 +2987,14 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) ufshcd_prepare_lrbp_crypto(scsi_cmd_to_rq(cmd), lrbp); + trace_android_vh_ufs_prepare_command(hba, scsi_cmd_to_rq(cmd), lrbp, + &err); + if (err) { + lrbp->cmd = NULL; + ufshcd_release(hba); + goto out; + } + lrbp->req_abort_skip = false; ufshcd_comp_scsi_upiu(hba, lrbp); @@ -5489,6 +5508,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag, lrbp->compl_time_stamp = ktime_get(); cmd = lrbp->cmd; if (cmd) { + trace_android_vh_ufs_compl_command(hba, lrbp); if (unlikely(ufshcd_should_inform_monitor(hba, lrbp))) ufshcd_update_monitor(hba, lrbp); ufshcd_add_command_trace(hba, task_tag, UFS_CMD_COMP); @@ -5499,6 +5519,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag, } else if (lrbp->command_type == UTP_CMD_TYPE_DEV_MANAGE || lrbp->command_type == UTP_CMD_TYPE_UFS_STORAGE) { if (hba->dev_cmd.complete) { + trace_android_vh_ufs_compl_command(hba, lrbp); if (cqe) { ocs = le32_to_cpu(cqe->status) & MASK_OCS; lrbp->utr_descriptor_ptr->header.ocs = ocs; @@ -6808,6 +6829,8 @@ static irqreturn_t ufshcd_check_errors(struct ufs_hba *hba, u32 intr_status) queue_eh_work = true; } + trace_android_vh_ufs_check_int_errors(hba, queue_eh_work); + if (queue_eh_work) { /* * update the transfer error masks to sticky bits, let's do this @@ -10571,7 +10594,8 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) ufshcd_set_ufs_dev_active(hba); async_schedule(ufshcd_async_scan, hba); - ufs_sysfs_add_nodes(hba->dev); + ufs_sysfs_add_nodes(dev); + trace_android_vh_ufs_update_sysfs(hba); device_enable_async_suspend(dev); return 0; diff --git a/include/trace/hooks/ufshcd.h b/include/trace/hooks/ufshcd.h new file mode 100644 --- /dev/null +++ b/include/trace/hooks/ufshcd.h @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM ufshcd +#define TRACE_INCLUDE_PATH trace/hooks +#if !defined(_TRACE_HOOK_UFSHCD_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_UFSHCD_H +#include +#include +/* + * Following tracepoints are not exported in tracefs and provide a + * mechanism for vendor modules to hook and extend functionality + */ +struct ufs_hba; +struct request; +struct ufshcd_lrb; + +DECLARE_HOOK(android_vh_ufs_fill_prdt, + TP_PROTO(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, + unsigned int segments, int *err), + TP_ARGS(hba, lrbp, segments, err)); + +DECLARE_HOOK(android_vh_ufs_prepare_command, + TP_PROTO(struct ufs_hba *hba, struct request *rq, + struct ufshcd_lrb *lrbp, int *err), + TP_ARGS(hba, rq, lrbp, err)); + +DECLARE_HOOK(android_vh_ufs_update_sysfs, + TP_PROTO(struct ufs_hba *hba), + TP_ARGS(hba)); + +DECLARE_HOOK(android_vh_ufs_send_command, + TP_PROTO(struct ufs_hba *hba, struct ufshcd_lrb *lrbp), + TP_ARGS(hba, lrbp)); + +DECLARE_HOOK(android_vh_ufs_compl_command, + TP_PROTO(struct ufs_hba *hba, struct ufshcd_lrb *lrbp), + TP_ARGS(hba, lrbp)); + +struct uic_command; +DECLARE_HOOK(android_vh_ufs_send_uic_command, + TP_PROTO(struct ufs_hba *hba, const struct uic_command *ucmd, + int str_t), + TP_ARGS(hba, ucmd, str_t)); + +DECLARE_HOOK(android_vh_ufs_send_tm_command, + TP_PROTO(struct ufs_hba *hba, int tag, int str_t), + TP_ARGS(hba, tag, str_t)); + +DECLARE_HOOK(android_vh_ufs_check_int_errors, + TP_PROTO(struct ufs_hba *hba, bool queue_eh_work), + TP_ARGS(hba, queue_eh_work)); + +#endif /* _TRACE_HOOK_UFSHCD_H */ +/* This part must be outside protection */ +#include