diff --git a/drivers/platform/msm/gsi/gsi.c b/drivers/platform/msm/gsi/gsi.c index 2c55c0711c75..552873bcb462 100644 --- a/drivers/platform/msm/gsi/gsi.c +++ b/drivers/platform/msm/gsi/gsi.c @@ -4490,6 +4490,45 @@ void gsi_get_inst_ram_offset_and_size(unsigned long *base_offset, } EXPORT_SYMBOL(gsi_get_inst_ram_offset_and_size); +/* + * Dumping the Debug registers for halt issue debugging. + */ +static void gsi_dump_halt_debug_reg(unsigned int chan_idx, unsigned int ee) +{ + uint32_t val; + enum gsi_chan_state curr_state = GSI_CHAN_STATE_NOT_ALLOCATED; + + GSIERR("DEBUG_PC_FOR_DEBUG = 0x%x\n", gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_DEBUG_PC_FOR_DEBUG_OFFS)); + + GSIERR("GSI_DEBUG_BUSY_REG 0x%x\n", + gsi_readl(gsi_ctx->base + GSI_EE_n_GSI_DEBUG_BUSY_REG_OFFS)); + + GSIERR("GSI_EE_n_CNTXT_GLOB_IRQ_EN_OFFS = 0x%x\n", + gsi_readl(gsi_ctx->base + + GSI_EE_n_CNTXT_GLOB_IRQ_EN_OFFS(gsi_ctx->per.ee))); + + GSIERR("GSI_EE_n_CNTXT_GLOB_IRQ_STTS_OFFS IRQ type = 0x%x\n", + gsi_readl(gsi_ctx->base + + GSI_EE_n_CNTXT_GLOB_IRQ_STTS_OFFS(gsi_ctx->per.ee))); + + GSIERR("GSI_EE_n_CNTXT_SCRATCH_0_OFFS = 0x%x\n", + gsi_readl(gsi_ctx->base + + GSI_EE_n_CNTXT_SCRATCH_0_OFFS(gsi_ctx->per.ee))); + + if (gsi_ctx->per.ver >= GSI_VER_2_9) + GSIERR("GSI_EE_n_GSI_CH_k_SCRATCH_4_OFFS = 0x%x\n", + gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_SCRATCH_4_OFFS(chan_idx, ee))); + + val = gsi_readl(gsi_ctx->base + + GSI_EE_n_GSI_CH_k_CNTXT_0_OFFS(chan_idx, ee)); + curr_state = (val & + GSI_EE_n_GSI_CH_k_CNTXT_0_CHSTATE_BMSK) >> + GSI_EE_n_GSI_CH_k_CNTXT_0_CHSTATE_SHFT; + GSIERR("Q6 channel [%d] state = %d\n", chan_idx, curr_state); +} + int gsi_halt_channel_ee(unsigned int chan_idx, unsigned int ee, int *code) { enum gsi_generic_ee_cmd_opcode op = GSI_GEN_EE_CMD_HALT_CHANNEL; @@ -4544,8 +4583,17 @@ int gsi_halt_channel_ee(unsigned int chan_idx, unsigned int ee, int *code) } if (gsi_ctx->scratch.word0.s.generic_ee_cmd_return_code == 0) { GSIERR("No response received\n"); - res = -GSI_STATUS_ERROR; - goto free_lock; + gsi_dump_halt_debug_reg(chan_idx, ee); + usleep_range(GSI_RESET_WA_MIN_SLEEP, GSI_RESET_WA_MAX_SLEEP); + GSIERR("Reading after usleep scratch 0 reg\n"); + gsi_ctx->scratch.word0.val = gsi_readl(gsi_ctx->base + + GSI_EE_n_CNTXT_SCRATCH_0_OFFS(gsi_ctx->per.ee)); + if (gsi_ctx->scratch.word0.s.generic_ee_cmd_return_code == 0) { + GSIERR("No response received second attempt\n"); + gsi_dump_halt_debug_reg(chan_idx, ee); + res = -GSI_STATUS_ERROR; + goto free_lock; + } } res = GSI_STATUS_SUCCESS; diff --git a/drivers/platform/msm/gsi/gsi_reg_v1.h b/drivers/platform/msm/gsi/gsi_reg_v1.h index b331863911e4..dc4403f0f9c4 100644 --- a/drivers/platform/msm/gsi/gsi_reg_v1.h +++ b/drivers/platform/msm/gsi/gsi_reg_v1.h @@ -1242,4 +1242,13 @@ #define GSI_V2_7_EE_n_GSI_HW_PARAM_2_GSI_IRAM_SIZE_THREE_N_HALF_KB_FVAL 0x4 #define GSI_V2_7_EE_n_GSI_HW_PARAM_2_GSI_IRAM_SIZE_FOUR_KB_FVAL 0x5 +#define GSI_EE_n_GSI_DEBUG_PC_FOR_DEBUG_OFFS \ + (GSI_GSI_REG_BASE_OFFS + 0x00001048) + +#define GSI_EE_n_GSI_DEBUG_BUSY_REG_OFFS \ + (GSI_GSI_REG_BASE_OFFS + 0x00001010) + +#define GSI_EE_n_GSI_CH_k_SCRATCH_4_OFFS(k, n) \ + (GSI_GSI_REG_BASE_OFFS + 0x0000f040 + 0x4000 * (n) + 0x80 * (k)) + #endif /* __GSI_REG_V1_H__ */ diff --git a/drivers/platform/msm/gsi/gsi_reg_v2.h b/drivers/platform/msm/gsi/gsi_reg_v2.h index defe28fac99c..11ce1c435969 100644 --- a/drivers/platform/msm/gsi/gsi_reg_v2.h +++ b/drivers/platform/msm/gsi/gsi_reg_v2.h @@ -1252,4 +1252,13 @@ #define GSI_GSI_MCS_PROFILING_MCS_IDLE_CNT_MSB_RMSK 0xffffffff #define GSI_GSI_MCS_PROFILING_MCS_IDLE_CNT_MSB_SHFT 0x0 +#define GSI_EE_n_GSI_DEBUG_PC_FOR_DEBUG_OFFS \ + (GSI_GSI_REG_BASE_OFFS + 0x00001048) + +#define GSI_EE_n_GSI_DEBUG_BUSY_REG_OFFS \ + (GSI_GSI_REG_BASE_OFFS + 0x00001010) + +#define GSI_EE_n_GSI_CH_k_SCRATCH_4_OFFS(k, n) \ + (GSI_GSI_REG_BASE_OFFS + 0x0000f040 + 0x4000 * (n) + 0x80 * (k)) + #endif /* __GSI_REG_V2_H__ */