Loading drivers/bus/mhi/controllers/mhi_qcom.c +26 −2 Original line number Diff line number Diff line Loading @@ -516,6 +516,22 @@ static int mhi_qcom_power_up(struct mhi_controller *mhi_cntrl) return ret; } static void mhi_qcom_fatal_worker(struct work_struct *work) { struct mhi_dev *mhi_dev = container_of(work, struct mhi_dev, fatal_worker); struct device *dev = &mhi_dev->pci_dev->dev; struct mhi_controller *mhi_cntrl = dev_get_drvdata(dev); int ret; mhi_power_down(mhi_cntrl, true); ret = mhi_qcom_power_up(mhi_cntrl); if (ret) MHI_ERR("Power up failure after SYS ERROR in PBL, ret:%d\n", ret); } static int mhi_runtime_get(struct mhi_controller *mhi_cntrl, void *priv) { struct mhi_dev *mhi_dev = priv; Loading Loading @@ -560,6 +576,10 @@ static void mhi_status_cb(struct mhi_controller *mhi_cntrl, pm_runtime_put(dev); mhi_arch_mission_mode_enter(mhi_cntrl); break; case MHI_CB_FATAL_ERROR: MHI_CNTRL_ERR("Perform power cycle due to SYS ERROR in PBL\n"); schedule_work(&mhi_dev->fatal_worker); break; default: MHI_CNTRL_LOG("Unhandled cb:0x%x\n", reason); } Loading Loading @@ -668,7 +688,7 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev) struct mhi_controller *mhi_cntrl; struct mhi_dev *mhi_dev; struct device_node *of_node = pci_dev->dev.of_node; const struct firmware_info *firmware_info; const struct firmware_info *firmware_info, *debug_info; bool use_bb; u64 addr_win[2]; int ret, i, len; Loading Loading @@ -761,8 +781,11 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev) } if (debug_mode) { debug_info = firmware_table + (len - 1); mhi_cntrl->fw_image_fallback = debug_info->fw_image; if (debug_mode <= MHI_DEBUG_D3) firmware_info = firmware_table + (len - 1); firmware_info = debug_info; MHI_CNTRL_LOG("fw info: debug_mode:%d dev_id:%d image:%s\n", debug_mode, firmware_info->dev_id, firmware_info->fw_image); Loading @@ -785,6 +808,7 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev) goto error_register; INIT_WORK(&mhi_cntrl->reg_write_work, mhi_reg_write_work); INIT_WORK(&mhi_dev->fatal_worker, mhi_qcom_fatal_worker); mhi_cntrl->reg_write_q = kcalloc(REG_WRITE_QUEUE_LEN, sizeof(*mhi_cntrl->reg_write_q), Loading drivers/bus/mhi/controllers/mhi_qcom.h +1 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ struct mhi_dev { dma_addr_t iova_start; dma_addr_t iova_stop; enum mhi_suspend_mode suspend_mode; struct work_struct fatal_worker; /* hardware info */ u32 serial_num; Loading drivers/bus/mhi/core/mhi_boot.c +15 −2 Original line number Diff line number Diff line Loading @@ -574,10 +574,23 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl) ret = request_firmware(&firmware, fw_name, mhi_cntrl->dev); if (ret) { MHI_CNTRL_ERR("Error loading firmware, ret:%d\n", ret); if (!mhi_cntrl->fw_image_fallback) { MHI_CNTRL_ERR("Error loading fw, ret:%d\n", ret); return; } /* re-try with fall back fw image */ ret = request_firmware(&firmware, mhi_cntrl->fw_image_fallback, mhi_cntrl->dev); if (ret) { MHI_CNTRL_ERR("Error loading fw_fb, ret:%d\n", ret); return; } mhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data, MHI_CB_FW_FALLBACK_IMG); } size = (mhi_cntrl->fbc_download) ? mhi_cntrl->sbl_size : firmware->size; /* the sbl size provided is maximum size, not necessarily image size */ Loading include/linux/mhi.h +2 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ enum MHI_CB { MHI_CB_EE_MISSION_MODE, MHI_CB_SYS_ERROR, MHI_CB_FATAL_ERROR, MHI_CB_FW_FALLBACK_IMG, }; /** Loading Loading @@ -290,6 +291,7 @@ struct mhi_controller { /* fw images */ const char *fw_image; const char *fw_image_fallback; const char *edl_image; /* mhi host manages downloading entire fbc images */ Loading Loading
drivers/bus/mhi/controllers/mhi_qcom.c +26 −2 Original line number Diff line number Diff line Loading @@ -516,6 +516,22 @@ static int mhi_qcom_power_up(struct mhi_controller *mhi_cntrl) return ret; } static void mhi_qcom_fatal_worker(struct work_struct *work) { struct mhi_dev *mhi_dev = container_of(work, struct mhi_dev, fatal_worker); struct device *dev = &mhi_dev->pci_dev->dev; struct mhi_controller *mhi_cntrl = dev_get_drvdata(dev); int ret; mhi_power_down(mhi_cntrl, true); ret = mhi_qcom_power_up(mhi_cntrl); if (ret) MHI_ERR("Power up failure after SYS ERROR in PBL, ret:%d\n", ret); } static int mhi_runtime_get(struct mhi_controller *mhi_cntrl, void *priv) { struct mhi_dev *mhi_dev = priv; Loading Loading @@ -560,6 +576,10 @@ static void mhi_status_cb(struct mhi_controller *mhi_cntrl, pm_runtime_put(dev); mhi_arch_mission_mode_enter(mhi_cntrl); break; case MHI_CB_FATAL_ERROR: MHI_CNTRL_ERR("Perform power cycle due to SYS ERROR in PBL\n"); schedule_work(&mhi_dev->fatal_worker); break; default: MHI_CNTRL_LOG("Unhandled cb:0x%x\n", reason); } Loading Loading @@ -668,7 +688,7 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev) struct mhi_controller *mhi_cntrl; struct mhi_dev *mhi_dev; struct device_node *of_node = pci_dev->dev.of_node; const struct firmware_info *firmware_info; const struct firmware_info *firmware_info, *debug_info; bool use_bb; u64 addr_win[2]; int ret, i, len; Loading Loading @@ -761,8 +781,11 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev) } if (debug_mode) { debug_info = firmware_table + (len - 1); mhi_cntrl->fw_image_fallback = debug_info->fw_image; if (debug_mode <= MHI_DEBUG_D3) firmware_info = firmware_table + (len - 1); firmware_info = debug_info; MHI_CNTRL_LOG("fw info: debug_mode:%d dev_id:%d image:%s\n", debug_mode, firmware_info->dev_id, firmware_info->fw_image); Loading @@ -785,6 +808,7 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev) goto error_register; INIT_WORK(&mhi_cntrl->reg_write_work, mhi_reg_write_work); INIT_WORK(&mhi_dev->fatal_worker, mhi_qcom_fatal_worker); mhi_cntrl->reg_write_q = kcalloc(REG_WRITE_QUEUE_LEN, sizeof(*mhi_cntrl->reg_write_q), Loading
drivers/bus/mhi/controllers/mhi_qcom.h +1 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ struct mhi_dev { dma_addr_t iova_start; dma_addr_t iova_stop; enum mhi_suspend_mode suspend_mode; struct work_struct fatal_worker; /* hardware info */ u32 serial_num; Loading
drivers/bus/mhi/core/mhi_boot.c +15 −2 Original line number Diff line number Diff line Loading @@ -574,10 +574,23 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl) ret = request_firmware(&firmware, fw_name, mhi_cntrl->dev); if (ret) { MHI_CNTRL_ERR("Error loading firmware, ret:%d\n", ret); if (!mhi_cntrl->fw_image_fallback) { MHI_CNTRL_ERR("Error loading fw, ret:%d\n", ret); return; } /* re-try with fall back fw image */ ret = request_firmware(&firmware, mhi_cntrl->fw_image_fallback, mhi_cntrl->dev); if (ret) { MHI_CNTRL_ERR("Error loading fw_fb, ret:%d\n", ret); return; } mhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data, MHI_CB_FW_FALLBACK_IMG); } size = (mhi_cntrl->fbc_download) ? mhi_cntrl->sbl_size : firmware->size; /* the sbl size provided is maximum size, not necessarily image size */ Loading
include/linux/mhi.h +2 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ enum MHI_CB { MHI_CB_EE_MISSION_MODE, MHI_CB_SYS_ERROR, MHI_CB_FATAL_ERROR, MHI_CB_FW_FALLBACK_IMG, }; /** Loading Loading @@ -290,6 +291,7 @@ struct mhi_controller { /* fw images */ const char *fw_image; const char *fw_image_fallback; const char *edl_image; /* mhi host manages downloading entire fbc images */ Loading