Lines Matching refs:mhi_cntrl
22 int mhi_rddm_prepare(struct mhi_controller *mhi_cntrl, in mhi_rddm_prepare() argument
27 void __iomem *base = mhi_cntrl->bhie; in mhi_rddm_prepare()
28 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_rddm_prepare()
40 mhi_write_reg(mhi_cntrl, base, BHIE_RXVECADDR_HIGH_OFFS, in mhi_rddm_prepare()
43 mhi_write_reg(mhi_cntrl, base, BHIE_RXVECADDR_LOW_OFFS, in mhi_rddm_prepare()
46 mhi_write_reg(mhi_cntrl, base, BHIE_RXVECSIZE_OFFS, mhi_buf->len); in mhi_rddm_prepare()
49 ret = mhi_write_reg_field(mhi_cntrl, base, BHIE_RXVECDB_OFFS, in mhi_rddm_prepare()
63 static int __mhi_download_rddm_in_panic(struct mhi_controller *mhi_cntrl) in __mhi_download_rddm_in_panic() argument
69 u32 retry = (mhi_cntrl->timeout_ms * 1000) / delayus; in __mhi_download_rddm_in_panic()
72 void __iomem *base = mhi_cntrl->bhie; in __mhi_download_rddm_in_panic()
73 struct device *dev = &mhi_cntrl->mhi_dev->dev; in __mhi_download_rddm_in_panic()
76 to_mhi_pm_state_str(mhi_cntrl->pm_state), in __mhi_download_rddm_in_panic()
77 mhi_state_str(mhi_cntrl->dev_state), in __mhi_download_rddm_in_panic()
78 TO_MHI_EXEC_STR(mhi_cntrl->ee)); in __mhi_download_rddm_in_panic()
90 mhi_cntrl->pm_state = MHI_PM_LD_ERR_FATAL_DETECT; in __mhi_download_rddm_in_panic()
100 ee = mhi_get_exec_env(mhi_cntrl); in __mhi_download_rddm_in_panic()
106 mhi_set_mhi_state(mhi_cntrl, MHI_STATE_SYS_ERR); in __mhi_download_rddm_in_panic()
110 ee = mhi_get_exec_env(mhi_cntrl); in __mhi_download_rddm_in_panic()
121 mhi_soc_reset(mhi_cntrl); in __mhi_download_rddm_in_panic()
125 ee = mhi_get_exec_env(mhi_cntrl); in __mhi_download_rddm_in_panic()
133 ret = mhi_read_reg_field(mhi_cntrl, base, BHIE_RXVECSTATUS_OFFS, in __mhi_download_rddm_in_panic()
144 ee = mhi_get_exec_env(mhi_cntrl); in __mhi_download_rddm_in_panic()
145 ret = mhi_read_reg(mhi_cntrl, base, BHIE_RXVECSTATUS_OFFS, &rx_status); in __mhi_download_rddm_in_panic()
157 int mhi_download_rddm_image(struct mhi_controller *mhi_cntrl, bool in_panic) in mhi_download_rddm_image() argument
159 void __iomem *base = mhi_cntrl->bhie; in mhi_download_rddm_image()
160 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_download_rddm_image()
164 return __mhi_download_rddm_in_panic(mhi_cntrl); in mhi_download_rddm_image()
169 wait_event_timeout(mhi_cntrl->state_event, in mhi_download_rddm_image()
170 mhi_read_reg_field(mhi_cntrl, base, in mhi_download_rddm_image()
174 msecs_to_jiffies(mhi_cntrl->timeout_ms)); in mhi_download_rddm_image()
180 static int mhi_fw_load_bhie(struct mhi_controller *mhi_cntrl, in mhi_fw_load_bhie() argument
183 void __iomem *base = mhi_cntrl->bhie; in mhi_fw_load_bhie()
184 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_fw_load_bhie()
185 rwlock_t *pm_lock = &mhi_cntrl->pm_lock; in mhi_fw_load_bhie()
190 if (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) { in mhi_fw_load_bhie()
198 mhi_write_reg(mhi_cntrl, base, BHIE_TXVECADDR_HIGH_OFFS, in mhi_fw_load_bhie()
201 mhi_write_reg(mhi_cntrl, base, BHIE_TXVECADDR_LOW_OFFS, in mhi_fw_load_bhie()
204 mhi_write_reg(mhi_cntrl, base, BHIE_TXVECSIZE_OFFS, mhi_buf->len); in mhi_fw_load_bhie()
206 ret = mhi_write_reg_field(mhi_cntrl, base, BHIE_TXVECDB_OFFS, in mhi_fw_load_bhie()
214 ret = wait_event_timeout(mhi_cntrl->state_event, in mhi_fw_load_bhie()
215 MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) || in mhi_fw_load_bhie()
216 mhi_read_reg_field(mhi_cntrl, base, in mhi_fw_load_bhie()
220 msecs_to_jiffies(mhi_cntrl->timeout_ms)); in mhi_fw_load_bhie()
221 if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) || in mhi_fw_load_bhie()
228 static int mhi_fw_load_bhi(struct mhi_controller *mhi_cntrl, in mhi_fw_load_bhi() argument
234 void __iomem *base = mhi_cntrl->bhi; in mhi_fw_load_bhi()
235 rwlock_t *pm_lock = &mhi_cntrl->pm_lock; in mhi_fw_load_bhi()
236 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_fw_load_bhi()
249 if (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) { in mhi_fw_load_bhi()
257 mhi_write_reg(mhi_cntrl, base, BHI_STATUS, 0); in mhi_fw_load_bhi()
258 mhi_write_reg(mhi_cntrl, base, BHI_IMGADDR_HIGH, in mhi_fw_load_bhi()
260 mhi_write_reg(mhi_cntrl, base, BHI_IMGADDR_LOW, in mhi_fw_load_bhi()
262 mhi_write_reg(mhi_cntrl, base, BHI_IMGSIZE, size); in mhi_fw_load_bhi()
263 mhi_write_reg(mhi_cntrl, base, BHI_IMGTXDB, session_id); in mhi_fw_load_bhi()
267 ret = wait_event_timeout(mhi_cntrl->state_event, in mhi_fw_load_bhi()
268 MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) || in mhi_fw_load_bhi()
269 mhi_read_reg_field(mhi_cntrl, base, BHI_STATUS, in mhi_fw_load_bhi()
271 msecs_to_jiffies(mhi_cntrl->timeout_ms)); in mhi_fw_load_bhi()
272 if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) in mhi_fw_load_bhi()
278 if (MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) { in mhi_fw_load_bhi()
280 ret = mhi_read_reg(mhi_cntrl, base, in mhi_fw_load_bhi()
299 void mhi_free_bhie_table(struct mhi_controller *mhi_cntrl, in mhi_free_bhie_table() argument
306 dma_free_coherent(mhi_cntrl->cntrl_dev, mhi_buf->len, in mhi_free_bhie_table()
313 int mhi_alloc_bhie_table(struct mhi_controller *mhi_cntrl, in mhi_alloc_bhie_table() argument
317 size_t seg_size = mhi_cntrl->seg_len; in mhi_alloc_bhie_table()
343 mhi_buf->buf = dma_alloc_coherent(mhi_cntrl->cntrl_dev, in mhi_alloc_bhie_table()
358 dma_free_coherent(mhi_cntrl->cntrl_dev, mhi_buf->len, in mhi_alloc_bhie_table()
367 static void mhi_firmware_copy(struct mhi_controller *mhi_cntrl, in mhi_firmware_copy() argument
388 void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl) in mhi_fw_load_handler() argument
391 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_fw_load_handler()
400 if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) { in mhi_fw_load_handler()
406 ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_SERIALNU, in mhi_fw_load_handler()
407 &mhi_cntrl->serial_number); in mhi_fw_load_handler()
412 if (!MHI_FW_LOAD_CAPABLE(mhi_cntrl->ee)) in mhi_fw_load_handler()
415 fw_name = (mhi_cntrl->ee == MHI_EE_EDL) ? in mhi_fw_load_handler()
416 mhi_cntrl->edl_image : mhi_cntrl->fw_image; in mhi_fw_load_handler()
419 if (!fw_name && mhi_cntrl->fbc_download && in mhi_fw_load_handler()
420 mhi_cntrl->fw_data && mhi_cntrl->fw_sz) { in mhi_fw_load_handler()
421 if (!mhi_cntrl->sbl_size) { in mhi_fw_load_handler()
426 size = mhi_cntrl->sbl_size; in mhi_fw_load_handler()
427 fw_data = mhi_cntrl->fw_data; in mhi_fw_load_handler()
428 fw_sz = mhi_cntrl->fw_sz; in mhi_fw_load_handler()
432 if (!fw_name || (mhi_cntrl->fbc_download && (!mhi_cntrl->sbl_size || in mhi_fw_load_handler()
433 !mhi_cntrl->seg_len))) { in mhi_fw_load_handler()
445 size = (mhi_cntrl->fbc_download) ? mhi_cntrl->sbl_size : firmware->size; in mhi_fw_load_handler()
455 buf = dma_alloc_coherent(mhi_cntrl->cntrl_dev, size, &dma_addr, in mhi_fw_load_handler()
464 ret = mhi_fw_load_bhi(mhi_cntrl, dma_addr, size); in mhi_fw_load_handler()
465 dma_free_coherent(mhi_cntrl->cntrl_dev, size, buf, dma_addr); in mhi_fw_load_handler()
475 if (fw_name && fw_name == mhi_cntrl->edl_image) { in mhi_fw_load_handler()
480 write_lock_irq(&mhi_cntrl->pm_lock); in mhi_fw_load_handler()
481 mhi_cntrl->dev_state = MHI_STATE_RESET; in mhi_fw_load_handler()
482 write_unlock_irq(&mhi_cntrl->pm_lock); in mhi_fw_load_handler()
488 if (mhi_cntrl->fbc_download) { in mhi_fw_load_handler()
489 ret = mhi_alloc_bhie_table(mhi_cntrl, &mhi_cntrl->fbc_image, fw_sz); in mhi_fw_load_handler()
496 mhi_firmware_copy(mhi_cntrl, fw_data, fw_sz, mhi_cntrl->fbc_image); in mhi_fw_load_handler()
503 ret = mhi_ready_state_transition(mhi_cntrl); in mhi_fw_load_handler()
513 if (mhi_cntrl->fbc_download) { in mhi_fw_load_handler()
514 mhi_free_bhie_table(mhi_cntrl, mhi_cntrl->fbc_image); in mhi_fw_load_handler()
515 mhi_cntrl->fbc_image = NULL; in mhi_fw_load_handler()
519 write_lock_irq(&mhi_cntrl->pm_lock); in mhi_fw_load_handler()
520 new_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_FW_DL_ERR); in mhi_fw_load_handler()
521 write_unlock_irq(&mhi_cntrl->pm_lock); in mhi_fw_load_handler()
523 wake_up_all(&mhi_cntrl->state_event); in mhi_fw_load_handler()
526 int mhi_download_amss_image(struct mhi_controller *mhi_cntrl) in mhi_download_amss_image() argument
528 struct image_info *image_info = mhi_cntrl->fbc_image; in mhi_download_amss_image()
529 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_download_amss_image()
536 ret = mhi_fw_load_bhie(mhi_cntrl, in mhi_download_amss_image()
541 write_lock_irq(&mhi_cntrl->pm_lock); in mhi_download_amss_image()
542 new_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_FW_DL_ERR); in mhi_download_amss_image()
543 write_unlock_irq(&mhi_cntrl->pm_lock); in mhi_download_amss_image()
545 wake_up_all(&mhi_cntrl->state_event); in mhi_download_amss_image()