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

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

mhi: core: add support for dynamic execution environment (EE)



Some MHI based modems have different EE definitions than the
default EE value. Add devicetree support to parse device EE
definition.

CRs-Fixed: 2464900
Change-Id: I4ba14a6701d22b8aa11315f8ac245a7250b030ef
Signed-off-by: default avatarSujeev Dias <sdias@codeaurora.org>
parent ba53fbd3
Loading
Loading
Loading
Loading
+16 −0
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
	[MHI_EE_PTHRU] = "PASS THRU",
	[MHI_EE_PTHRU] = "PASS THRU",
	[MHI_EE_EDL] = "EDL",
	[MHI_EE_EDL] = "EDL",
	[MHI_EE_DISABLE_TRANSITION] = "DISABLE",
	[MHI_EE_DISABLE_TRANSITION] = "DISABLE",
	[MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
};
};


const char * const mhi_state_tran_str[MHI_ST_TRANSITION_MAX] = {
const char * const mhi_state_tran_str[MHI_ST_TRANSITION_MAX] = {
@@ -1062,6 +1063,8 @@ static int of_parse_dt(struct mhi_controller *mhi_cntrl,
		       struct device_node *of_node)
		       struct device_node *of_node)
{
{
	int ret;
	int ret;
	enum mhi_ee i;
	u32 *ee;


	/* parse MHI channel configuration */
	/* parse MHI channel configuration */
	ret = of_parse_ch_cfg(mhi_cntrl, of_node);
	ret = of_parse_ch_cfg(mhi_cntrl, of_node);
@@ -1089,6 +1092,19 @@ static int of_parse_dt(struct mhi_controller *mhi_cntrl,
	if (of_property_read_bool(of_node, "mhi,m2-no-db-access"))
	if (of_property_read_bool(of_node, "mhi,m2-no-db-access"))
		mhi_cntrl->db_access &= ~MHI_PM_M2;
		mhi_cntrl->db_access &= ~MHI_PM_M2;


	/* parse the device ee table */
	for (i = MHI_EE_PBL, ee = mhi_cntrl->ee_table; i < MHI_EE_MAX;
	     i++, ee++) {
		/* setup the default ee before checking for override */
		*ee = i;
		ret = of_property_match_string(of_node, "mhi,ee-names",
					       mhi_ee_str[i]);
		if (ret < 0)
			continue;

		of_property_read_u32_index(of_node, "mhi,ee", ret, ee);
	}

	return 0;
	return 0;


error_ev_cfg:
error_ev_cfg:
+16 −1
Original line number Original line Diff line number Diff line
@@ -182,12 +182,24 @@ void mhi_ring_chan_db(struct mhi_controller *mhi_cntrl,
				    db);
				    db);
}
}


static enum mhi_ee mhi_translate_dev_ee(struct mhi_controller *mhi_cntrl,
					u32 dev_ee)
{
	enum mhi_ee i;

	for (i = MHI_EE_PBL; i < MHI_EE_MAX; i++)
		if (mhi_cntrl->ee_table[i] == dev_ee)
			return i;

	return MHI_EE_NOT_SUPPORTED;
}

enum mhi_ee mhi_get_exec_env(struct mhi_controller *mhi_cntrl)
enum mhi_ee mhi_get_exec_env(struct mhi_controller *mhi_cntrl)
{
{
	u32 exec;
	u32 exec;
	int ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_EXECENV, &exec);
	int ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_EXECENV, &exec);


	return (ret) ? MHI_EE_MAX : exec;
	return (ret) ? MHI_EE_MAX : mhi_translate_dev_ee(mhi_cntrl, exec);
}
}


enum mhi_dev_state mhi_get_mhi_state(struct mhi_controller *mhi_cntrl)
enum mhi_dev_state mhi_get_mhi_state(struct mhi_controller *mhi_cntrl)
@@ -1160,6 +1172,9 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl,
			enum MHI_ST_TRANSITION st = MHI_ST_TRANSITION_MAX;
			enum MHI_ST_TRANSITION st = MHI_ST_TRANSITION_MAX;
			enum mhi_ee event = MHI_TRE_GET_EV_EXECENV(local_rp);
			enum mhi_ee event = MHI_TRE_GET_EV_EXECENV(local_rp);


			/* convert device ee to host ee */
			event = mhi_translate_dev_ee(mhi_cntrl, event);

			MHI_LOG("MHI EE received event:%s\n",
			MHI_LOG("MHI EE received event:%s\n",
				TO_MHI_EXEC_STR(event));
				TO_MHI_EXEC_STR(event));
			switch (event) {
			switch (event) {
+9 −7
Original line number Original line Diff line number Diff line
@@ -87,15 +87,16 @@ enum mhi_device_type {
 * @MHI_EE_EDL - device in emergency download mode
 * @MHI_EE_EDL - device in emergency download mode
 */
 */
enum mhi_ee {
enum mhi_ee {
	MHI_EE_PBL = 0x0,
	MHI_EE_PBL,
	MHI_EE_SBL = 0x1,
	MHI_EE_SBL,
	MHI_EE_AMSS = 0x2,
	MHI_EE_AMSS,
	MHI_EE_RDDM = 0x3,
	MHI_EE_RDDM,
	MHI_EE_WFW = 0x4,
	MHI_EE_WFW,
	MHI_EE_PTHRU = 0x5,
	MHI_EE_PTHRU,
	MHI_EE_EDL = 0x6,
	MHI_EE_EDL,
	MHI_EE_MAX_SUPPORTED = MHI_EE_EDL,
	MHI_EE_MAX_SUPPORTED = MHI_EE_EDL,
	MHI_EE_DISABLE_TRANSITION, /* local EE, not related to mhi spec */
	MHI_EE_DISABLE_TRANSITION, /* local EE, not related to mhi spec */
	MHI_EE_NOT_SUPPORTED,
	MHI_EE_MAX,
	MHI_EE_MAX,
};
};


@@ -244,6 +245,7 @@ struct mhi_controller {
	u32 pm_state;
	u32 pm_state;
	u32 db_access; /* db access only on these states */
	u32 db_access; /* db access only on these states */
	enum mhi_ee ee;
	enum mhi_ee ee;
	u32 ee_table[MHI_EE_MAX]; /* ee conversion from dev to host */
	enum mhi_dev_state dev_state;
	enum mhi_dev_state dev_state;
	bool wake_set;
	bool wake_set;
	atomic_t dev_wake;
	atomic_t dev_wake;