Snap for 11291747 from 8b95ddb951 to android12-5.10-keystone-qcom-release

Change-Id: I2f7a24ef31629b756a3cc9bb91b38e5634cfea19
Signed-off-by: Coastguard Worker <android-build-coastguard-worker@google.com>
This commit is contained in:
Android Build Coastguard Worker 2024-01-11 11:00:43 +00:00
commit d072db43ce
6 changed files with 2489 additions and 2502 deletions

File diff suppressed because it is too large Load Diff

View File

@ -2227,7 +2227,14 @@
__traceiter_android_vh_snd_compr_use_pause_in_drain __traceiter_android_vh_snd_compr_use_pause_in_drain
__traceiter_android_vh_sound_usb_support_cpu_suspend __traceiter_android_vh_sound_usb_support_cpu_suspend
__traceiter_android_vh_syscall_prctl_finished __traceiter_android_vh_syscall_prctl_finished
__traceiter_android_vh_ufs_abort_success_ctrl
__traceiter_android_vh_ufs_compl_rsp_check_done
__traceiter_android_vh_ufs_err_check_ctrl
__traceiter_android_vh_ufs_err_handler
__traceiter_android_vh_ufs_err_print_ctrl
__traceiter_android_vh_ufs_perf_huristic_ctrl
__traceiter_android_vh_ufs_send_command __traceiter_android_vh_ufs_send_command
__traceiter_android_vh_ufs_send_command_post_change
__traceiter_android_vh_ufs_send_tm_command __traceiter_android_vh_ufs_send_tm_command
__traceiter_cpu_frequency __traceiter_cpu_frequency
__traceiter_gpu_mem_total __traceiter_gpu_mem_total
@ -2312,7 +2319,14 @@
__tracepoint_android_vh_snd_compr_use_pause_in_drain __tracepoint_android_vh_snd_compr_use_pause_in_drain
__tracepoint_android_vh_sound_usb_support_cpu_suspend __tracepoint_android_vh_sound_usb_support_cpu_suspend
__tracepoint_android_vh_syscall_prctl_finished __tracepoint_android_vh_syscall_prctl_finished
__tracepoint_android_vh_ufs_abort_success_ctrl
__tracepoint_android_vh_ufs_compl_rsp_check_done
__tracepoint_android_vh_ufs_err_check_ctrl
__tracepoint_android_vh_ufs_err_handler
__tracepoint_android_vh_ufs_err_print_ctrl
__tracepoint_android_vh_ufs_perf_huristic_ctrl
__tracepoint_android_vh_ufs_send_command __tracepoint_android_vh_ufs_send_command
__tracepoint_android_vh_ufs_send_command_post_change
__tracepoint_android_vh_ufs_send_tm_command __tracepoint_android_vh_ufs_send_tm_command
__tracepoint_cpu_frequency __tracepoint_cpu_frequency
__tracepoint_gpu_mem_total __tracepoint_gpu_mem_total

View File

@ -499,6 +499,13 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_cold_or_pageout_abort);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_compact_finished); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_compact_finished);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_wakeup_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_wakeup_bypass);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_skip_swapcache); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_skip_swapcache);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_perf_huristic_ctrl);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_command_post_change);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_abort_success_ctrl);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_compl_rsp_check_done);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_err_handler);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_err_check_ctrl);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_err_print_ctrl);
/* /*
* For type visibility * For type visibility
*/ */

View File

@ -145,10 +145,7 @@ enum {
UFSHCD_STATE_EH_SCHEDULED_NON_FATAL, UFSHCD_STATE_EH_SCHEDULED_NON_FATAL,
}; };
/* UFSHCD error handling flags */
enum {
UFSHCD_EH_IN_PROGRESS = (1 << 0),
};
/* UFSHCD UIC layer error flags */ /* UFSHCD UIC layer error flags */
enum { enum {
@ -161,12 +158,6 @@ enum {
UFSHCD_UIC_PA_GENERIC_ERROR = (1 << 6), /* Generic PA error */ UFSHCD_UIC_PA_GENERIC_ERROR = (1 << 6), /* Generic PA error */
}; };
#define ufshcd_set_eh_in_progress(h) \
((h)->eh_flags |= UFSHCD_EH_IN_PROGRESS)
#define ufshcd_eh_in_progress(h) \
((h)->eh_flags & UFSHCD_EH_IN_PROGRESS)
#define ufshcd_clear_eh_in_progress(h) \
((h)->eh_flags &= ~UFSHCD_EH_IN_PROGRESS)
struct ufs_pm_lvl_states ufs_pm_lvl_states[] = { struct ufs_pm_lvl_states ufs_pm_lvl_states[] = {
{UFS_ACTIVE_PWR_MODE, UIC_LINK_ACTIVE_STATE}, {UFS_ACTIVE_PWR_MODE, UIC_LINK_ACTIVE_STATE},
@ -2105,6 +2096,7 @@ void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag)
} }
/* Make sure that doorbell is committed immediately */ /* Make sure that doorbell is committed immediately */
wmb(); wmb();
trace_android_vh_ufs_send_command_post_change(hba, lrbp);
} }
/** /**
@ -2770,7 +2762,9 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
} }
/* Make sure descriptors are ready before ringing the doorbell */ /* Make sure descriptors are ready before ringing the doorbell */
wmb(); wmb();
trace_android_vh_ufs_perf_huristic_ctrl(hba, lrbp, &err);
if (err)
goto out;
ufshcd_send_command(hba, tag); ufshcd_send_command(hba, tag);
out: out:
up_read(&hba->clk_scaling_lock); up_read(&hba->clk_scaling_lock);
@ -5203,7 +5197,7 @@ static irqreturn_t ufshcd_uic_cmd_compl(struct ufs_hba *hba, u32 intr_status)
} }
/* Release the resources allocated for processing a SCSI command. */ /* Release the resources allocated for processing a SCSI command. */
static void ufshcd_release_scsi_cmd(struct ufs_hba *hba, void ufshcd_release_scsi_cmd(struct ufs_hba *hba,
struct ufshcd_lrb *lrbp) struct ufshcd_lrb *lrbp)
{ {
struct scsi_cmnd *cmd = lrbp->cmd; struct scsi_cmnd *cmd = lrbp->cmd;
@ -5214,6 +5208,7 @@ static void ufshcd_release_scsi_cmd(struct ufs_hba *hba,
ufshcd_release(hba); ufshcd_release(hba);
ufshcd_clk_scaling_update_busy(hba); ufshcd_clk_scaling_update_busy(hba);
} }
EXPORT_SYMBOL_GPL(ufshcd_release_scsi_cmd);
/** /**
* __ufshcd_transfer_req_compl - handle SCSI and query command completion * __ufshcd_transfer_req_compl - handle SCSI and query command completion
@ -5234,9 +5229,13 @@ static void __ufshcd_transfer_req_compl(struct ufs_hba *hba,
lrbp->compl_time_stamp = ktime_get(); lrbp->compl_time_stamp = ktime_get();
cmd = lrbp->cmd; cmd = lrbp->cmd;
if (cmd) { if (cmd) {
bool done = false;
if (unlikely(ufshcd_should_inform_monitor(hba, lrbp))) if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
ufshcd_update_monitor(hba, lrbp); ufshcd_update_monitor(hba, lrbp);
trace_android_vh_ufs_compl_command(hba, lrbp); trace_android_vh_ufs_compl_command(hba, lrbp);
trace_android_vh_ufs_compl_rsp_check_done(hba, lrbp, &done);
if (done)
return;
ufshcd_add_command_trace(hba, index, "complete"); ufshcd_add_command_trace(hba, index, "complete");
cmd->result = ufshcd_transfer_rsp_status(hba, lrbp); cmd->result = ufshcd_transfer_rsp_status(hba, lrbp);
ufshcd_release_scsi_cmd(hba, lrbp); ufshcd_release_scsi_cmd(hba, lrbp);
@ -5803,11 +5802,13 @@ static void ufshcd_exception_event_handler(struct work_struct *work)
} }
/* Complete requests that have door-bell cleared */ /* Complete requests that have door-bell cleared */
static void ufshcd_complete_requests(struct ufs_hba *hba) void ufshcd_complete_requests(struct ufs_hba *hba)
{ {
ufshcd_trc_handler(hba, false); ufshcd_trc_handler(hba, false);
ufshcd_tmc_handler(hba); ufshcd_tmc_handler(hba);
} }
EXPORT_SYMBOL_GPL(ufshcd_complete_requests);
/** /**
* ufshcd_quirk_dl_nac_errors - This function checks if error handling is * ufshcd_quirk_dl_nac_errors - This function checks if error handling is
@ -5921,7 +5922,7 @@ static void ufshcd_clk_scaling_suspend(struct ufs_hba *hba, bool suspend)
} }
} }
static void ufshcd_err_handling_prepare(struct ufs_hba *hba) void ufshcd_err_handling_prepare(struct ufs_hba *hba)
{ {
pm_runtime_get_sync(hba->dev); pm_runtime_get_sync(hba->dev);
if (pm_runtime_status_suspended(hba->dev) || hba->is_sys_suspended) { if (pm_runtime_status_suspended(hba->dev) || hba->is_sys_suspended) {
@ -5956,8 +5957,9 @@ static void ufshcd_err_handling_prepare(struct ufs_hba *hba)
up_write(&hba->clk_scaling_lock); up_write(&hba->clk_scaling_lock);
cancel_work_sync(&hba->eeh_work); cancel_work_sync(&hba->eeh_work);
} }
EXPORT_SYMBOL_GPL(ufshcd_err_handling_prepare);
static void ufshcd_err_handling_unprepare(struct ufs_hba *hba) void ufshcd_err_handling_unprepare(struct ufs_hba *hba)
{ {
ufshcd_scsi_unblock_requests(hba); ufshcd_scsi_unblock_requests(hba);
ufshcd_release(hba); ufshcd_release(hba);
@ -5965,6 +5967,7 @@ static void ufshcd_err_handling_unprepare(struct ufs_hba *hba)
ufshcd_clk_scaling_suspend(hba, false); ufshcd_clk_scaling_suspend(hba, false);
pm_runtime_put(hba->dev); pm_runtime_put(hba->dev);
} }
EXPORT_SYMBOL_GPL(ufshcd_err_handling_unprepare);
static inline bool ufshcd_err_handling_should_stop(struct ufs_hba *hba) static inline bool ufshcd_err_handling_should_stop(struct ufs_hba *hba)
{ {
@ -6037,10 +6040,16 @@ static void ufshcd_err_handler(struct work_struct *work)
bool err_tm = false; bool err_tm = false;
int err = 0, pmc_err; int err = 0, pmc_err;
int tag; int tag;
bool err_handled = false;
bool needs_reset = false, needs_restore = false; bool needs_reset = false, needs_restore = false;
hba = container_of(work, struct ufs_hba, eh_work); hba = container_of(work, struct ufs_hba, eh_work);
trace_android_vh_ufs_err_handler(hba, &err_handled);
if (err_handled)
return;
down(&hba->host_sem); down(&hba->host_sem);
spin_lock_irqsave(hba->host->host_lock, flags); spin_lock_irqsave(hba->host->host_lock, flags);
if (ufshcd_err_handling_should_stop(hba)) { if (ufshcd_err_handling_should_stop(hba)) {
@ -6346,14 +6355,16 @@ static irqreturn_t ufshcd_check_errors(struct ufs_hba *hba, u32 intr_status)
* update the transfer error masks to sticky bits, let's do this * update the transfer error masks to sticky bits, let's do this
* irrespective of current ufshcd_state. * irrespective of current ufshcd_state.
*/ */
bool skip = false;
hba->saved_err |= hba->errors; hba->saved_err |= hba->errors;
hba->saved_uic_err |= hba->uic_error; hba->saved_uic_err |= hba->uic_error;
trace_android_vh_ufs_err_print_ctrl(hba, &skip);
/* dump controller state before resetting */ /* dump controller state before resetting */
if ((hba->saved_err & if (!skip &&((hba->saved_err &
(INT_FATAL_ERRORS | UFSHCD_UIC_HIBERN8_MASK)) || (INT_FATAL_ERRORS | UFSHCD_UIC_HIBERN8_MASK)) ||
(hba->saved_uic_err && (hba->saved_uic_err &&
(hba->saved_uic_err != UFSHCD_UIC_PA_GENERIC_ERROR))) { (hba->saved_uic_err != UFSHCD_UIC_PA_GENERIC_ERROR)))) {
dev_err(hba->dev, "%s: saved_err 0x%x saved_uic_err 0x%x\n", dev_err(hba->dev, "%s: saved_err 0x%x saved_uic_err 0x%x\n",
__func__, hba->saved_err, __func__, hba->saved_err,
hba->saved_uic_err); hba->saved_uic_err);
@ -6418,6 +6429,7 @@ static irqreturn_t ufshcd_tmc_handler(struct ufs_hba *hba)
static irqreturn_t ufshcd_sl_intr(struct ufs_hba *hba, u32 intr_status) static irqreturn_t ufshcd_sl_intr(struct ufs_hba *hba, u32 intr_status)
{ {
irqreturn_t retval = IRQ_NONE; irqreturn_t retval = IRQ_NONE;
bool err_check = false;
if (intr_status & UFSHCD_UIC_MASK) if (intr_status & UFSHCD_UIC_MASK)
retval |= ufshcd_uic_cmd_compl(hba, intr_status); retval |= ufshcd_uic_cmd_compl(hba, intr_status);
@ -6428,9 +6440,14 @@ static irqreturn_t ufshcd_sl_intr(struct ufs_hba *hba, u32 intr_status)
if (intr_status & UTP_TASK_REQ_COMPL) if (intr_status & UTP_TASK_REQ_COMPL)
retval |= ufshcd_tmc_handler(hba); retval |= ufshcd_tmc_handler(hba);
if (intr_status & UTP_TRANSFER_REQ_COMPL) if (intr_status & UTP_TRANSFER_REQ_COMPL) {
retval |= ufshcd_trc_handler(hba, ufshcd_has_utrlcnr(hba)); retval |= ufshcd_trc_handler(hba, ufshcd_has_utrlcnr(hba));
trace_android_vh_ufs_err_check_ctrl(hba, &err_check);
if (err_check)
ufshcd_check_errors(hba, hba->errors);
}
return retval; return retval;
} }
@ -7048,8 +7065,10 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
outstanding = __test_and_clear_bit(tag, &hba->outstanding_reqs); outstanding = __test_and_clear_bit(tag, &hba->outstanding_reqs);
spin_unlock_irqrestore(host->host_lock, flags); spin_unlock_irqrestore(host->host_lock, flags);
if (outstanding) if (outstanding) {
ufshcd_release_scsi_cmd(hba, lrbp); ufshcd_release_scsi_cmd(hba, lrbp);
trace_android_vh_ufs_abort_success_ctrl(hba, lrbp);
}
err = SUCCESS; err = SUCCESS;

View File

@ -82,6 +82,19 @@ enum ufs_event_type {
UFS_EVT_CNT, UFS_EVT_CNT,
}; };
/* UFSHCD error handling flags */
enum {
UFSHCD_EH_IN_PROGRESS = (1 << 0),
};
#define ufshcd_set_eh_in_progress(h) \
((h)->eh_flags |= UFSHCD_EH_IN_PROGRESS)
#define ufshcd_eh_in_progress(h) \
((h)->eh_flags & UFSHCD_EH_IN_PROGRESS)
#define ufshcd_clear_eh_in_progress(h) \
((h)->eh_flags &= ~UFSHCD_EH_IN_PROGRESS)
/** /**
* struct uic_command - UIC command structure * struct uic_command - UIC command structure
* @command: UIC command * @command: UIC command
@ -1048,6 +1061,12 @@ int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask,
void ufshcd_parse_dev_ref_clk_freq(struct ufs_hba *hba, struct clk *refclk); void ufshcd_parse_dev_ref_clk_freq(struct ufs_hba *hba, struct clk *refclk);
void ufshcd_update_evt_hist(struct ufs_hba *hba, u32 id, u32 val); void ufshcd_update_evt_hist(struct ufs_hba *hba, u32 id, u32 val);
void ufshcd_hba_stop(struct ufs_hba *hba); void ufshcd_hba_stop(struct ufs_hba *hba);
void ufshcd_complete_requests(struct ufs_hba *hba);
void ufshcd_release_scsi_cmd(struct ufs_hba *hba,
struct ufshcd_lrb *lrbp);
void ufshcd_err_handling_prepare(struct ufs_hba *hba);
void ufshcd_err_handling_unprepare(struct ufs_hba *hba);
static inline void check_upiu_size(void) static inline void check_upiu_size(void)
{ {

View File

@ -75,6 +75,40 @@ DECLARE_HOOK(android_vh_ufs_update_sdev,
DECLARE_HOOK(android_vh_ufs_clock_scaling, DECLARE_HOOK(android_vh_ufs_clock_scaling,
TP_PROTO(struct ufs_hba *hba, bool *force_out, bool *force_scaling, bool *scale_up), TP_PROTO(struct ufs_hba *hba, bool *force_out, bool *force_scaling, bool *scale_up),
TP_ARGS(hba, force_out, force_scaling, scale_up)); TP_ARGS(hba, force_out, force_scaling, scale_up));
DECLARE_HOOK(android_vh_ufs_send_command_post_change,
TP_PROTO(struct ufs_hba *hba, struct ufshcd_lrb *lrbp),
TP_ARGS(hba, lrbp));
DECLARE_HOOK(android_vh_ufs_perf_huristic_ctrl,
TP_PROTO(struct ufs_hba *hba,
struct ufshcd_lrb *lrbp, int *err),
TP_ARGS(hba, lrbp, err));
DECLARE_HOOK(android_vh_ufs_abort_success_ctrl,
TP_PROTO(struct ufs_hba *hba,
struct ufshcd_lrb *lrbp),
TP_ARGS(hba, lrbp));
DECLARE_HOOK(android_vh_ufs_err_handler,
TP_PROTO(struct ufs_hba *hba,
bool *err_handled),
TP_ARGS(hba, err_handled));
DECLARE_HOOK(android_vh_ufs_compl_rsp_check_done,
TP_PROTO(struct ufs_hba *hba,
struct ufshcd_lrb *lrbp, bool *done),
TP_ARGS(hba, lrbp, done));
DECLARE_HOOK(android_vh_ufs_err_print_ctrl,
TP_PROTO(struct ufs_hba *hba,
bool *skip),
TP_ARGS(hba, skip));
DECLARE_HOOK(android_vh_ufs_err_check_ctrl,
TP_PROTO(struct ufs_hba *hba,
bool *err_check),
TP_ARGS(hba, err_check));
#endif /* _TRACE_HOOK_UFSHCD_H */ #endif /* _TRACE_HOOK_UFSHCD_H */
/* This part must be outside protection */ /* This part must be outside protection */
#include <trace/define_trace.h> #include <trace/define_trace.h>