Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d7bfff08 authored by Sujeev Dias's avatar Sujeev Dias
Browse files

mhi: core: force a hardware reset if device failed to enter rddm



If device fail to enter ramdump mode (rddm) gracefully, trigger
a hardware reset to force rddm mode.

CRs-Fixed: 2373857
Change-Id: If1fd02ff6da882df6b2db858b410d76ac8b0f1a8
Signed-off-by: default avatarSujeev Dias <sdias@codeaurora.org>
parent 5e86830c
Loading
Loading
Loading
Loading
+24 −2
Original line number Diff line number Diff line
@@ -43,8 +43,10 @@ static int __mhi_download_rddm_in_panic(struct mhi_controller *mhi_cntrl)
	u32 rx_status;
	enum mhi_ee ee;
	struct image_info *rddm_image = mhi_cntrl->rddm_image;
	const u32 delayus = 100;
	const u32 delayus = 5000;
	u32 retry = (mhi_cntrl->timeout_ms * 1000) / delayus;
	const u32 rddm_timeout_us = 200000;
	int rddm_retry = rddm_timeout_us / delayus; /* time to enter rddm */
	void __iomem *base = mhi_cntrl->bhie;

	MHI_LOG("Entered with pm_state:%s dev_state:%s ee:%s\n",
@@ -98,7 +100,27 @@ static int __mhi_download_rddm_in_panic(struct mhi_controller *mhi_cntrl)
	MHI_LOG("Trigger device into RDDM mode\n");
	mhi_set_mhi_state(mhi_cntrl, MHI_STATE_SYS_ERR);

	MHI_LOG("Waiting for image download completion\n");
	MHI_LOG("Waiting for device to enter RDDM\n");
	while (rddm_retry--) {
		ee = mhi_get_exec_env(mhi_cntrl);
		if (ee == MHI_EE_RDDM)
			break;

		udelay(delayus);
	}

	if (rddm_retry <= 0) {
		/* This is a hardware reset, will force device to enter rddm */
		MHI_LOG(
			"Did not enter RDDM triggering host req. reset to force rddm\n");
		mhi_write_reg(mhi_cntrl, mhi_cntrl->regs,
			      MHI_SOC_RESET_REQ_OFFSET, MHI_SOC_RESET_REQ);
		udelay(delayus);
	}

	ee = mhi_get_exec_env(mhi_cntrl);
	MHI_LOG("Waiting for image download completion, current EE:%s\n",
		TO_MHI_EXEC_STR(ee));
	while (retry--) {
		ret = mhi_read_reg_field(mhi_cntrl, base, BHIE_RXVECSTATUS_OFFS,
					 BHIE_RXVECSTATUS_STATUS_BMSK,
+4 −0
Original line number Diff line number Diff line
@@ -125,6 +125,10 @@ extern struct bus_type mhi_bus_type;
#define MHIDATALIMIT_HIGHER_MHIDATALIMIT_HIGHER_MASK (0xFFFFFFFF)
#define MHIDATALIMIT_HIGHER_MHIDATALIMIT_HIGHER_SHIFT (0)

/* Host request register */
#define MHI_SOC_RESET_REQ_OFFSET (0xB0)
#define MHI_SOC_RESET_REQ BIT(0)

/* MHI misc capability registers */
#define MISC_OFFSET (0x24)
#define MISC_CAP_MASK (0xFFFFFFFF)