diff --git a/drivers/bus/mhi/controllers/mhi_qcom.c b/drivers/bus/mhi/controllers/mhi_qcom.c index 7479dcef64de..cd252739c3a2 100644 --- a/drivers/bus/mhi/controllers/mhi_qcom.c +++ b/drivers/bus/mhi/controllers/mhi_qcom.c @@ -403,6 +403,11 @@ static int mhi_force_suspend(struct mhi_controller *mhi_cntrl) MHI_CNTRL_LOG("Entered\n"); + if (debug_mode == MHI_DEBUG_NO_D3 || debug_mode == MHI_FWIMAGE_NO_D3) { + MHI_CNTRL_LOG("Exited due to debug mode:%d\n", debug_mode); + return ret; + } + mutex_lock(&mhi_cntrl->pm_mutex); for (; itr; itr--) { @@ -676,7 +681,7 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev) bool use_s1; u32 addr_win[2]; const char *iommu_dma_type; - int ret, i; + int ret, i, len; if (!of_node) return ERR_PTR(-ENODEV); @@ -752,14 +757,22 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev) if (ret) goto error_register; - for (i = 0; i < ARRAY_SIZE(firmware_table); i++) { + len = ARRAY_SIZE(firmware_table); + for (i = 0; i < len; i++) { firmware_info = firmware_table + i; - /* debug mode always use default */ - if (!debug_mode && mhi_cntrl->dev_id == firmware_info->dev_id) + if (mhi_cntrl->dev_id == firmware_info->dev_id) break; } + if (debug_mode) { + if (debug_mode <= MHI_DEBUG_D3) + firmware_info = firmware_table + (len - 1); + MHI_CNTRL_LOG("fw info: debug_mode:%d dev_id:%d image:%s\n", + debug_mode, firmware_info->dev_id, + firmware_info->fw_image); + } + mhi_cntrl->fw_image = firmware_info->fw_image; mhi_cntrl->edl_image = firmware_info->edl_image; diff --git a/drivers/bus/mhi/controllers/mhi_qcom.h b/drivers/bus/mhi/controllers/mhi_qcom.h index 325be120486c..3b5e74b912c4 100644 --- a/drivers/bus/mhi/controllers/mhi_qcom.h +++ b/drivers/bus/mhi/controllers/mhi_qcom.h @@ -33,6 +33,15 @@ extern const char * const mhi_ee_str[MHI_EE_MAX]; #define TO_MHI_EXEC_STR(ee) (ee >= MHI_EE_MAX ? "INVALID_EE" : mhi_ee_str[ee]) +enum mhi_debug_mode { + MHI_DEBUG_MODE_OFF, + MHI_DEBUG_NO_D3, /* use debug.mbn as fw image and skip first M3/D3 */ + MHI_DEBUG_D3, /* use debug.mbn as fw image and allow first M3/D3 */ + MHI_FWIMAGE_NO_D3, /* use fw image if found and skip first M3/D3 */ + MHI_FWIMAGE_D3, /* use fw image if found and allow first M3/D3 */ + MHI_DEBUG_MODE_MAX = MHI_FWIMAGE_D3, +}; + enum mhi_suspend_mode { MHI_ACTIVE_STATE, MHI_DEFAULT_SUSPEND,