Re: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-30 Thread Bhaumik Bhatt

Hi Carl,

On 2020-10-30 01:58, Carl Yin wrote:

Hi bbhatt:

On October 30, 2020 2:16 AM, bbhatt wrote:


On 2020-10-29 02:09, Carl Yin wrote:
> Hi bbhatt:
>
> On October 29, 2020 5:41 AM, bbhatt wrote:
>> On 2020-10-27 18:57, Carl Yin wrote:
>> > Hi bbhatt:
>> >
>> > On Wednesday, October 28, 2020 9:34 AM, bbhatt wrote:
>> >> Hi Carl,
>> >> On 2020-10-27 16:01, Hemant Kumar wrote:
>> >> > Hi Jeff,
>> >> >
>> >> > On 10/27/20 8:11 AM, Jeffrey Hugo wrote:
>> >> >> On 10/27/2020 3:43 AM, carl@quectel.com wrote:
>> >> >>> From: "carl.yin" 
>> >> >>>
>> >> >>> MHI wwan modems support download firmware to nand or emmc by
>> >> >>> firehose protocol, process as next:
>> >> >>> 1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG
>> >> >>> chan device 2. send EDL cmd via DIAG chan, then modem enter EE EDL
3.
>> >> >>> boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI
>> >> >>> interface 4. modem enter EE FP, and create mhi EDL chan device 5.
>> >> >>> user space tool download FW to modem via EDL chan by firehose
>> >> >>> protocol
>> >> >>>
>> >> >>> Signed-off-by: carl.yin 
>> >> >>> ---
>> >> >>>   drivers/bus/mhi/core/boot.c |  4 +++-
>> >> >>>   drivers/bus/mhi/core/init.c |  2 ++
>> >> >>>   drivers/bus/mhi/core/internal.h |  1 +
>> >> >>>   drivers/bus/mhi/core/main.c |  3 +++
>> >> >>>   drivers/bus/mhi/core/pm.c   | 16 +++-
>> >> >>>   include/linux/mhi.h |  4 +++-
>> >> >>>   6 files changed, 27 insertions(+), 3 deletions(-)
>> >> >>>
>> >> >>> diff --git a/drivers/bus/mhi/core/boot.c
>> >> >>> b/drivers/bus/mhi/core/boot.c index 24422f5..ab39ad6 100644
>> >> >>> --- a/drivers/bus/mhi/core/boot.c
>> >> >>> +++ b/drivers/bus/mhi/core/boot.c
>> >> >>> @@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct
>> >> >>> mhi_controller
>> >> >>> *mhi_cntrl)
>> >> >>>   return;
>> >> >>>   }
>> >> >>> -    if (mhi_cntrl->ee == MHI_EE_EDL)
>> >> >>> +    if (mhi_cntrl->ee == MHI_EE_EDL) {
>> >> >>> +    mhi_ready_state_transition(mhi_cntrl);
>> >> >>>   return;
>> >> >>> +    }
>> >> >>>   write_lock_irq(_cntrl->pm_lock);
>> >> >>>   mhi_cntrl->dev_state = MHI_STATE_RESET; diff --git
>> >> >>> a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c
>> >> >>> index
>> >> >>> ac4aa5c..9c2c2f3 100644
>> >> >>> --- a/drivers/bus/mhi/core/init.c
>> >> >>> +++ b/drivers/bus/mhi/core/init.c
>> >> >>> @@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] =
>> >> >>> {
>> >> >>>   [MHI_EE_WFW] = "WFW",
>> >> >>>   [MHI_EE_PTHRU] = "PASS THRU",
>> >> >>>   [MHI_EE_EDL] = "EDL",
>> >> >>> +    [MHI_EE_FP] = "FP",
>> >> >>>   [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
>> >> >>>   [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
>> >> >>>   };
>> >> >>> @@ -35,6 +36,7 @@ const char * const
>> >> >>> dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
>> >> >>>   [DEV_ST_TRANSITION_READY] = "READY",
>> >> >>>   [DEV_ST_TRANSITION_SBL] = "SBL",
>> >> >>>   [DEV_ST_TRANSITION_MISSION_MODE] =
"MISSION_MODE",
>> >> >>> +    [DEV_ST_TRANSITION_FP] = "FP",
>> >> Longer description here would be nice (FLASH PROGRAMMER).
>> > [carl.yin] yes, for SDX24 and SDX55 chip, 'FIREHOSE PROGRAMMER' is
>> > more better.
>> I agree with Jeff, should be generic.
>> >>
>> >> >>>   [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
>> >> >>>   [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
>> >> >>>   };
>> >> >>> diff --git a/drivers/bus/mhi/core/internal.h
>> >> >>> b/drivers/bus/mhi/core/internal.h index 4abf0cf..6ae897a
>> >> >>> 100644
>> >> >>> --- a/drivers/bus/mhi/core/internal.h
>> >> >>> +++ b/drivers/bus/mhi/core/internal.h
>> >> >>> @@ -386,6 +386,7 @@ enum dev_st_transition {
>> >> >>>   DEV_ST_TRANSITION_READY,
>> >> >>>   DEV_ST_TRANSITION_SBL,
>> >> >>>   DEV_ST_TRANSITION_MISSION_MODE,
>> >> >>> +    DEV_ST_TRANSITION_FP,
>> >> >>>   DEV_ST_TRANSITION_SYS_ERR,
>> >> >>>   DEV_ST_TRANSITION_DISABLE,
>> >> >>>   DEV_ST_TRANSITION_MAX,
>> >> >>> diff --git a/drivers/bus/mhi/core/main.c
>> >> >>> b/drivers/bus/mhi/core/main.c index 3950792..e307b58 100644
>> >> >>> --- a/drivers/bus/mhi/core/main.c
>> >> >>> +++ b/drivers/bus/mhi/core/main.c
>> >> >>> @@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct
>> >> >>> mhi_controller *mhi_cntrl,
>> >> >>>   case MHI_EE_SBL:
>> >> >>>   st = DEV_ST_TRANSITION_SBL;
>> >> >>>   break;
>> >> >>> +    case MHI_EE_FP:
>> >> >>> +    st = DEV_ST_TRANSITION_FP;
>> >> >>> +    break;
>> >> >>>   case MHI_EE_WFW:
>> >> >>>   case MHI_EE_AMSS:
>> >> >>>   st =
DEV_ST_TRANSITION_MISSION_MODE;
>> diff
>> >> --git
>> >> >>> a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index
>> >> >>> 3de7b16..3c95a5d 100644
>> >> >>> --- a/drivers/bus/mhi/core/pm.c
>> >> >>> +++ b/drivers/bus/mhi/core/pm.c
>> >> >>> @@ -563,7 +563,15 @@ static void
>> >> >>> 

RE: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-30 Thread 殷张成
Hi bbhatt:

On October 30, 2020 2:16 AM, bbhatt wrote:

> On 2020-10-29 02:09, Carl Yin wrote:
> > Hi bbhatt:
> >
> > On October 29, 2020 5:41 AM, bbhatt wrote:
> >> On 2020-10-27 18:57, Carl Yin wrote:
> >> > Hi bbhatt:
> >> >
> >> > On Wednesday, October 28, 2020 9:34 AM, bbhatt wrote:
> >> >> Hi Carl,
> >> >> On 2020-10-27 16:01, Hemant Kumar wrote:
> >> >> > Hi Jeff,
> >> >> >
> >> >> > On 10/27/20 8:11 AM, Jeffrey Hugo wrote:
> >> >> >> On 10/27/2020 3:43 AM, carl@quectel.com wrote:
> >> >> >>> From: "carl.yin" 
> >> >> >>>
> >> >> >>> MHI wwan modems support download firmware to nand or emmc by
> >> >> >>> firehose protocol, process as next:
> >> >> >>> 1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG
> >> >> >>> chan device 2. send EDL cmd via DIAG chan, then modem enter EE EDL
> 3.
> >> >> >>> boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI
> >> >> >>> interface 4. modem enter EE FP, and create mhi EDL chan device 5.
> >> >> >>> user space tool download FW to modem via EDL chan by firehose
> >> >> >>> protocol
> >> >> >>>
> >> >> >>> Signed-off-by: carl.yin 
> >> >> >>> ---
> >> >> >>>   drivers/bus/mhi/core/boot.c |  4 +++-
> >> >> >>>   drivers/bus/mhi/core/init.c |  2 ++
> >> >> >>>   drivers/bus/mhi/core/internal.h |  1 +
> >> >> >>>   drivers/bus/mhi/core/main.c |  3 +++
> >> >> >>>   drivers/bus/mhi/core/pm.c   | 16 +++-
> >> >> >>>   include/linux/mhi.h |  4 +++-
> >> >> >>>   6 files changed, 27 insertions(+), 3 deletions(-)
> >> >> >>>
> >> >> >>> diff --git a/drivers/bus/mhi/core/boot.c
> >> >> >>> b/drivers/bus/mhi/core/boot.c index 24422f5..ab39ad6 100644
> >> >> >>> --- a/drivers/bus/mhi/core/boot.c
> >> >> >>> +++ b/drivers/bus/mhi/core/boot.c
> >> >> >>> @@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct
> >> >> >>> mhi_controller
> >> >> >>> *mhi_cntrl)
> >> >> >>>   return;
> >> >> >>>   }
> >> >> >>> -    if (mhi_cntrl->ee == MHI_EE_EDL)
> >> >> >>> +    if (mhi_cntrl->ee == MHI_EE_EDL) {
> >> >> >>> +    mhi_ready_state_transition(mhi_cntrl);
> >> >> >>>   return;
> >> >> >>> +    }
> >> >> >>>   write_lock_irq(_cntrl->pm_lock);
> >> >> >>>   mhi_cntrl->dev_state = MHI_STATE_RESET; diff --git
> >> >> >>> a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c
> >> >> >>> index
> >> >> >>> ac4aa5c..9c2c2f3 100644
> >> >> >>> --- a/drivers/bus/mhi/core/init.c
> >> >> >>> +++ b/drivers/bus/mhi/core/init.c
> >> >> >>> @@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] =
> >> >> >>> {
> >> >> >>>   [MHI_EE_WFW] = "WFW",
> >> >> >>>   [MHI_EE_PTHRU] = "PASS THRU",
> >> >> >>>   [MHI_EE_EDL] = "EDL",
> >> >> >>> +    [MHI_EE_FP] = "FP",
> >> >> >>>   [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
> >> >> >>>   [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
> >> >> >>>   };
> >> >> >>> @@ -35,6 +36,7 @@ const char * const
> >> >> >>> dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
> >> >> >>>   [DEV_ST_TRANSITION_READY] = "READY",
> >> >> >>>   [DEV_ST_TRANSITION_SBL] = "SBL",
> >> >> >>>   [DEV_ST_TRANSITION_MISSION_MODE] =
> "MISSION_MODE",
> >> >> >>> +    [DEV_ST_TRANSITION_FP] = "FP",
> >> >> Longer description here would be nice (FLASH PROGRAMMER).
> >> > [carl.yin] yes, for SDX24 and SDX55 chip, 'FIREHOSE PROGRAMMER' is
> >> > more better.
> >> I agree with Jeff, should be generic.
> >> >>
> >> >> >>>   [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
> >> >> >>>   [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
> >> >> >>>   };
> >> >> >>> diff --git a/drivers/bus/mhi/core/internal.h
> >> >> >>> b/drivers/bus/mhi/core/internal.h index 4abf0cf..6ae897a
> >> >> >>> 100644
> >> >> >>> --- a/drivers/bus/mhi/core/internal.h
> >> >> >>> +++ b/drivers/bus/mhi/core/internal.h
> >> >> >>> @@ -386,6 +386,7 @@ enum dev_st_transition {
> >> >> >>>   DEV_ST_TRANSITION_READY,
> >> >> >>>   DEV_ST_TRANSITION_SBL,
> >> >> >>>   DEV_ST_TRANSITION_MISSION_MODE,
> >> >> >>> +    DEV_ST_TRANSITION_FP,
> >> >> >>>   DEV_ST_TRANSITION_SYS_ERR,
> >> >> >>>   DEV_ST_TRANSITION_DISABLE,
> >> >> >>>   DEV_ST_TRANSITION_MAX,
> >> >> >>> diff --git a/drivers/bus/mhi/core/main.c
> >> >> >>> b/drivers/bus/mhi/core/main.c index 3950792..e307b58 100644
> >> >> >>> --- a/drivers/bus/mhi/core/main.c
> >> >> >>> +++ b/drivers/bus/mhi/core/main.c
> >> >> >>> @@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct
> >> >> >>> mhi_controller *mhi_cntrl,
> >> >> >>>   case MHI_EE_SBL:
> >> >> >>>   st = DEV_ST_TRANSITION_SBL;
> >> >> >>>   break;
> >> >> >>> +    case MHI_EE_FP:
> >> >> >>> +    st = DEV_ST_TRANSITION_FP;
> >> >> >>> +    break;
> >> >> >>>   case MHI_EE_WFW:
> >> >> >>>   case MHI_EE_AMSS:
> >> >> >>>   st =
> DEV_ST_TRANSITION_MISSION_MODE;
> >> diff
> >> >> --git
> >> >> >>> a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c 

Re: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-29 Thread Bhaumik Bhatt

On 2020-10-29 02:26, Carl Yin wrote:

On October 28, 2020 7:02 AM, hemantk wrote:

Hi Jeff,

On 10/27/20 8:11 AM, Jeffrey Hugo wrote:
> On 10/27/2020 3:43 AM, carl@quectel.com wrote:
>> From: "carl.yin" 
>>
>> MHI wwan modems support download firmware to nand or emmc by firehose
>> protocol, process as next:
>> 1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG chan
>> device 2. send EDL cmd via DIAG chan, then modem enter EE EDL 3.
>> boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI interface
>> 4. modem enter EE FP, and create mhi EDL chan device 5. user space
>> tool download FW to modem via EDL chan by firehose protocol
>>
>> Signed-off-by: carl.yin 
>> ---
>>   drivers/bus/mhi/core/boot.c |  4 +++-
>>   drivers/bus/mhi/core/init.c |  2 ++
>>   drivers/bus/mhi/core/internal.h |  1 +
>>   drivers/bus/mhi/core/main.c |  3 +++
>>   drivers/bus/mhi/core/pm.c   | 16 +++-
>>   include/linux/mhi.h |  4 +++-
>>   6 files changed, 27 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/bus/mhi/core/boot.c
>> b/drivers/bus/mhi/core/boot.c index 24422f5..ab39ad6 100644
>> --- a/drivers/bus/mhi/core/boot.c
>> +++ b/drivers/bus/mhi/core/boot.c
>> @@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct mhi_controller
>> *mhi_cntrl)
>>   return;
>>   }
>> -    if (mhi_cntrl->ee == MHI_EE_EDL)
>> +    if (mhi_cntrl->ee == MHI_EE_EDL) {
>> +    mhi_ready_state_transition(mhi_cntrl);
>>   return;
>> +    }
>>   write_lock_irq(_cntrl->pm_lock);
>>   mhi_cntrl->dev_state = MHI_STATE_RESET; diff --git
>> a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index
>> ac4aa5c..9c2c2f3 100644
>> --- a/drivers/bus/mhi/core/init.c
>> +++ b/drivers/bus/mhi/core/init.c
>> @@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
>>   [MHI_EE_WFW] = "WFW",
>>   [MHI_EE_PTHRU] = "PASS THRU",
>>   [MHI_EE_EDL] = "EDL",
>> +    [MHI_EE_FP] = "FP",
>>   [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
>>   [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
>>   };
>> @@ -35,6 +36,7 @@ const char * const
>> dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
>>   [DEV_ST_TRANSITION_READY] = "READY",
>>   [DEV_ST_TRANSITION_SBL] = "SBL",
>>   [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
>> +    [DEV_ST_TRANSITION_FP] = "FP",
>>   [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
>>   [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
>>   };
>> diff --git a/drivers/bus/mhi/core/internal.h
>> b/drivers/bus/mhi/core/internal.h index 4abf0cf..6ae897a 100644
>> --- a/drivers/bus/mhi/core/internal.h
>> +++ b/drivers/bus/mhi/core/internal.h
>> @@ -386,6 +386,7 @@ enum dev_st_transition {
>>   DEV_ST_TRANSITION_READY,
>>   DEV_ST_TRANSITION_SBL,
>>   DEV_ST_TRANSITION_MISSION_MODE,
>> +    DEV_ST_TRANSITION_FP,
>>   DEV_ST_TRANSITION_SYS_ERR,
>>   DEV_ST_TRANSITION_DISABLE,
>>   DEV_ST_TRANSITION_MAX,
>> diff --git a/drivers/bus/mhi/core/main.c
>> b/drivers/bus/mhi/core/main.c index 3950792..e307b58 100644
>> --- a/drivers/bus/mhi/core/main.c
>> +++ b/drivers/bus/mhi/core/main.c
>> @@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct
>> mhi_controller *mhi_cntrl,
>>   case MHI_EE_SBL:
>>   st = DEV_ST_TRANSITION_SBL;
>>   break;
>> +    case MHI_EE_FP:
>> +    st = DEV_ST_TRANSITION_FP;
>> +    break;
>>   case MHI_EE_WFW:
>>   case MHI_EE_AMSS:
>>   st = DEV_ST_TRANSITION_MISSION_MODE; diff
--git
>> a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index
>> 3de7b16..3c95a5d 100644
>> --- a/drivers/bus/mhi/core/pm.c
>> +++ b/drivers/bus/mhi/core/pm.c
>> @@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct
>> mhi_controller *mhi_cntrl,
>>   }
>>   if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
>> -    mhi_ready_state_transition(mhi_cntrl);
>> +    if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
>> +    && mhi_get_mhi_state(mhi_cntrl) == MHI_STATE_RESET) {
>> +    write_lock_irq(_cntrl->pm_lock);
>> +    cur_state = mhi_tryset_pm_state(mhi_cntrl,
MHI_PM_POR);
>> +    write_unlock_irq(_cntrl->pm_lock);
>> +    mhi_queue_state_transition(mhi_cntrl,
>> DEV_ST_TRANSITION_PBL);
>> +    } else {
>> +    mhi_ready_state_transition(mhi_cntrl);
>> +    }
>>   } else {
>>   /* Move to disable state */
>>   write_lock_irq(_cntrl->pm_lock);
>> @@ -658,6 +666,12 @@ void mhi_pm_st_worker(struct work_struct *work)
>>   case DEV_ST_TRANSITION_MISSION_MODE:
>>   mhi_pm_mission_mode_transition(mhi_cntrl);
>>   break;
>> +    case DEV_ST_TRANSITION_FP:
>> +    write_lock_irq(_cntrl->pm_lock);
>> +    mhi_cntrl->ee = MHI_EE_FP;
>> +    write_unlock_irq(_cntrl->pm_lock);
>> +    mhi_create_devices(mhi_cntrl);
>> +    break;
>>    

Re: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-29 Thread Bhaumik Bhatt

On 2020-10-29 02:09, Carl Yin wrote:

Hi bbhatt:

On October 29, 2020 5:41 AM, bbhatt wrote:

On 2020-10-27 18:57, Carl Yin wrote:
> Hi bbhatt:
>
> On Wednesday, October 28, 2020 9:34 AM, bbhatt wrote:
>> Hi Carl,
>> On 2020-10-27 16:01, Hemant Kumar wrote:
>> > Hi Jeff,
>> >
>> > On 10/27/20 8:11 AM, Jeffrey Hugo wrote:
>> >> On 10/27/2020 3:43 AM, carl@quectel.com wrote:
>> >>> From: "carl.yin" 
>> >>>
>> >>> MHI wwan modems support download firmware to nand or emmc by
>> >>> firehose protocol, process as next:
>> >>> 1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG
>> >>> chan device 2. send EDL cmd via DIAG chan, then modem enter EE EDL 3.
>> >>> boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI
>> >>> interface 4. modem enter EE FP, and create mhi EDL chan device 5.
>> >>> user space tool download FW to modem via EDL chan by firehose
>> >>> protocol
>> >>>
>> >>> Signed-off-by: carl.yin 
>> >>> ---
>> >>>   drivers/bus/mhi/core/boot.c |  4 +++-
>> >>>   drivers/bus/mhi/core/init.c |  2 ++
>> >>>   drivers/bus/mhi/core/internal.h |  1 +
>> >>>   drivers/bus/mhi/core/main.c |  3 +++
>> >>>   drivers/bus/mhi/core/pm.c   | 16 +++-
>> >>>   include/linux/mhi.h |  4 +++-
>> >>>   6 files changed, 27 insertions(+), 3 deletions(-)
>> >>>
>> >>> diff --git a/drivers/bus/mhi/core/boot.c
>> >>> b/drivers/bus/mhi/core/boot.c index 24422f5..ab39ad6 100644
>> >>> --- a/drivers/bus/mhi/core/boot.c
>> >>> +++ b/drivers/bus/mhi/core/boot.c
>> >>> @@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct
>> >>> mhi_controller
>> >>> *mhi_cntrl)
>> >>>   return;
>> >>>   }
>> >>> -    if (mhi_cntrl->ee == MHI_EE_EDL)
>> >>> +    if (mhi_cntrl->ee == MHI_EE_EDL) {
>> >>> +    mhi_ready_state_transition(mhi_cntrl);
>> >>>   return;
>> >>> +    }
>> >>>   write_lock_irq(_cntrl->pm_lock);
>> >>>   mhi_cntrl->dev_state = MHI_STATE_RESET; diff --git
>> >>> a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index
>> >>> ac4aa5c..9c2c2f3 100644
>> >>> --- a/drivers/bus/mhi/core/init.c
>> >>> +++ b/drivers/bus/mhi/core/init.c
>> >>> @@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
>> >>>   [MHI_EE_WFW] = "WFW",
>> >>>   [MHI_EE_PTHRU] = "PASS THRU",
>> >>>   [MHI_EE_EDL] = "EDL",
>> >>> +    [MHI_EE_FP] = "FP",
>> >>>   [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
>> >>>   [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
>> >>>   };
>> >>> @@ -35,6 +36,7 @@ const char * const
>> >>> dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
>> >>>   [DEV_ST_TRANSITION_READY] = "READY",
>> >>>   [DEV_ST_TRANSITION_SBL] = "SBL",
>> >>>   [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
>> >>> +    [DEV_ST_TRANSITION_FP] = "FP",
>> Longer description here would be nice (FLASH PROGRAMMER).
> [carl.yin] yes, for SDX24 and SDX55 chip, 'FIREHOSE PROGRAMMER' is
> more better.
I agree with Jeff, should be generic.
>>
>> >>>   [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
>> >>>   [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
>> >>>   };
>> >>> diff --git a/drivers/bus/mhi/core/internal.h
>> >>> b/drivers/bus/mhi/core/internal.h index 4abf0cf..6ae897a 100644
>> >>> --- a/drivers/bus/mhi/core/internal.h
>> >>> +++ b/drivers/bus/mhi/core/internal.h
>> >>> @@ -386,6 +386,7 @@ enum dev_st_transition {
>> >>>   DEV_ST_TRANSITION_READY,
>> >>>   DEV_ST_TRANSITION_SBL,
>> >>>   DEV_ST_TRANSITION_MISSION_MODE,
>> >>> +    DEV_ST_TRANSITION_FP,
>> >>>   DEV_ST_TRANSITION_SYS_ERR,
>> >>>   DEV_ST_TRANSITION_DISABLE,
>> >>>   DEV_ST_TRANSITION_MAX,
>> >>> diff --git a/drivers/bus/mhi/core/main.c
>> >>> b/drivers/bus/mhi/core/main.c index 3950792..e307b58 100644
>> >>> --- a/drivers/bus/mhi/core/main.c
>> >>> +++ b/drivers/bus/mhi/core/main.c
>> >>> @@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct
>> >>> mhi_controller *mhi_cntrl,
>> >>>   case MHI_EE_SBL:
>> >>>   st = DEV_ST_TRANSITION_SBL;
>> >>>   break;
>> >>> +    case MHI_EE_FP:
>> >>> +    st = DEV_ST_TRANSITION_FP;
>> >>> +    break;
>> >>>   case MHI_EE_WFW:
>> >>>   case MHI_EE_AMSS:
>> >>>   st = DEV_ST_TRANSITION_MISSION_MODE;
diff
>> --git
>> >>> a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index
>> >>> 3de7b16..3c95a5d 100644
>> >>> --- a/drivers/bus/mhi/core/pm.c
>> >>> +++ b/drivers/bus/mhi/core/pm.c
>> >>> @@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct
>> >>> mhi_controller *mhi_cntrl,
>> >>>   }
>> >>>   if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
>> >>> -    mhi_ready_state_transition(mhi_cntrl);
>> >>> +    if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
>> >>> +    && mhi_get_mhi_state(mhi_cntrl) ==
MHI_STATE_RESET)
>> {
>> >>> +    write_lock_irq(_cntrl->pm_lock);
>> >>> +    cur_state = mhi_tryset_pm_state(mhi_cntrl,
>> MHI_PM_POR);
>> >>> + 

Re: 答复: 答复: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-29 Thread Jeffrey Hugo

On 10/28/2020 7:12 PM, Carl Yin(殷张成) wrote:

Hi Jeffery:

On Wednesday, October 28, 2020 10:24 PM, jhugo wrote:

On 10/27/2020 7:39 PM, Carl Yin(殷张成) wrote:

Hi Hemant and Jeffery:

On Wednesday, October 28, 2020 7:02 AM, hemantk wrote:

Hi Jeff,

On 10/27/20 8:11 AM, Jeffrey Hugo wrote:

On 10/27/2020 3:43 AM, carl@quectel.com wrote:

From: "carl.yin" 

MHI wwan modems support download firmware to nand or emmc by
firehose protocol, process as next:
1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG chan
device 2. send EDL cmd via DIAG chan, then modem enter EE EDL 3.
boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI
interface 4. modem enter EE FP, and create mhi EDL chan device 5.
user space tool download FW to modem via EDL chan by firehose
protocol

Signed-off-by: carl.yin 
---
    drivers/bus/mhi/core/boot.c |  4 +++-
    drivers/bus/mhi/core/init.c |  2 ++
    drivers/bus/mhi/core/internal.h |  1 +
    drivers/bus/mhi/core/main.c |  3 +++
    drivers/bus/mhi/core/pm.c   | 16 +++-
    include/linux/mhi.h |  4 +++-
    6 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/drivers/bus/mhi/core/boot.c
b/drivers/bus/mhi/core/boot.c index 24422f5..ab39ad6 100644
--- a/drivers/bus/mhi/core/boot.c
+++ b/drivers/bus/mhi/core/boot.c
@@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct mhi_controller
*mhi_cntrl)
    return;
    }
-    if (mhi_cntrl->ee == MHI_EE_EDL)
+    if (mhi_cntrl->ee == MHI_EE_EDL) {
+    mhi_ready_state_transition(mhi_cntrl);
    return;
+    }
    write_lock_irq(_cntrl->pm_lock);
    mhi_cntrl->dev_state = MHI_STATE_RESET; diff --git
a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index
ac4aa5c..9c2c2f3 100644
--- a/drivers/bus/mhi/core/init.c
+++ b/drivers/bus/mhi/core/init.c
@@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
    [MHI_EE_WFW] = "WFW",
    [MHI_EE_PTHRU] = "PASS THRU",
    [MHI_EE_EDL] = "EDL",
+    [MHI_EE_FP] = "FP",
    [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
    [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
    };
@@ -35,6 +36,7 @@ const char * const
dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
    [DEV_ST_TRANSITION_READY] = "READY",
    [DEV_ST_TRANSITION_SBL] = "SBL",
    [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
+    [DEV_ST_TRANSITION_FP] = "FP",
    [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
    [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
    };
diff --git a/drivers/bus/mhi/core/internal.h
b/drivers/bus/mhi/core/internal.h index 4abf0cf..6ae897a 100644
--- a/drivers/bus/mhi/core/internal.h
+++ b/drivers/bus/mhi/core/internal.h
@@ -386,6 +386,7 @@ enum dev_st_transition {
    DEV_ST_TRANSITION_READY,
    DEV_ST_TRANSITION_SBL,
    DEV_ST_TRANSITION_MISSION_MODE,
+    DEV_ST_TRANSITION_FP,
    DEV_ST_TRANSITION_SYS_ERR,
    DEV_ST_TRANSITION_DISABLE,
    DEV_ST_TRANSITION_MAX,
diff --git a/drivers/bus/mhi/core/main.c
b/drivers/bus/mhi/core/main.c index 3950792..e307b58 100644
--- a/drivers/bus/mhi/core/main.c
+++ b/drivers/bus/mhi/core/main.c
@@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct
mhi_controller *mhi_cntrl,
    case MHI_EE_SBL:
    st = DEV_ST_TRANSITION_SBL;
    break;
+    case MHI_EE_FP:
+    st = DEV_ST_TRANSITION_FP;
+    break;
    case MHI_EE_WFW:
    case MHI_EE_AMSS:
    st = DEV_ST_TRANSITION_MISSION_MODE;

diff

--git

a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index
3de7b16..3c95a5d 100644
--- a/drivers/bus/mhi/core/pm.c
+++ b/drivers/bus/mhi/core/pm.c
@@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct
mhi_controller *mhi_cntrl,
    }
    if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
-    mhi_ready_state_transition(mhi_cntrl);
+    if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
+    && mhi_get_mhi_state(mhi_cntrl) ==

MHI_STATE_RESET) {

+    write_lock_irq(_cntrl->pm_lock);
+    cur_state = mhi_tryset_pm_state(mhi_cntrl,

MHI_PM_POR);

+    write_unlock_irq(_cntrl->pm_lock);
+    mhi_queue_state_transition(mhi_cntrl,
DEV_ST_TRANSITION_PBL);
+    } else {
+    mhi_ready_state_transition(mhi_cntrl);
+    }
    } else {
    /* Move to disable state */
    write_lock_irq(_cntrl->pm_lock);
@@ -658,6 +666,12 @@ void mhi_pm_st_worker(struct work_struct
*work)
    case DEV_ST_TRANSITION_MISSION_MODE:
    mhi_pm_mission_mode_transition(mhi_cntrl);
    break;
+    case DEV_ST_TRANSITION_FP:
+    write_lock_irq(_cntrl->pm_lock);
+    mhi_cntrl->ee = MHI_EE_FP;
+    write_unlock_irq(_cntrl->pm_lock);
+    mhi_create_devices(mhi_cntrl);
+    break;
    case DEV_ST_TRANSITION_READY:
    mhi_ready_state_transition(mhi_cntrl);
     

RE: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-29 Thread 殷张成


On October 28, 2020 7:02 AM, hemantk wrote:
> Hi Jeff,
> 
> On 10/27/20 8:11 AM, Jeffrey Hugo wrote:
> > On 10/27/2020 3:43 AM, carl@quectel.com wrote:
> >> From: "carl.yin" 
> >>
> >> MHI wwan modems support download firmware to nand or emmc by firehose
> >> protocol, process as next:
> >> 1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG chan
> >> device 2. send EDL cmd via DIAG chan, then modem enter EE EDL 3.
> >> boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI interface
> >> 4. modem enter EE FP, and create mhi EDL chan device 5. user space
> >> tool download FW to modem via EDL chan by firehose protocol
> >>
> >> Signed-off-by: carl.yin 
> >> ---
> >>   drivers/bus/mhi/core/boot.c |  4 +++-
> >>   drivers/bus/mhi/core/init.c |  2 ++
> >>   drivers/bus/mhi/core/internal.h |  1 +
> >>   drivers/bus/mhi/core/main.c |  3 +++
> >>   drivers/bus/mhi/core/pm.c   | 16 +++-
> >>   include/linux/mhi.h |  4 +++-
> >>   6 files changed, 27 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/drivers/bus/mhi/core/boot.c
> >> b/drivers/bus/mhi/core/boot.c index 24422f5..ab39ad6 100644
> >> --- a/drivers/bus/mhi/core/boot.c
> >> +++ b/drivers/bus/mhi/core/boot.c
> >> @@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct mhi_controller
> >> *mhi_cntrl)
> >>   return;
> >>   }
> >> -    if (mhi_cntrl->ee == MHI_EE_EDL)
> >> +    if (mhi_cntrl->ee == MHI_EE_EDL) {
> >> +    mhi_ready_state_transition(mhi_cntrl);
> >>   return;
> >> +    }
> >>   write_lock_irq(_cntrl->pm_lock);
> >>   mhi_cntrl->dev_state = MHI_STATE_RESET; diff --git
> >> a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index
> >> ac4aa5c..9c2c2f3 100644
> >> --- a/drivers/bus/mhi/core/init.c
> >> +++ b/drivers/bus/mhi/core/init.c
> >> @@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
> >>   [MHI_EE_WFW] = "WFW",
> >>   [MHI_EE_PTHRU] = "PASS THRU",
> >>   [MHI_EE_EDL] = "EDL",
> >> +    [MHI_EE_FP] = "FP",
> >>   [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
> >>   [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
> >>   };
> >> @@ -35,6 +36,7 @@ const char * const
> >> dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
> >>   [DEV_ST_TRANSITION_READY] = "READY",
> >>   [DEV_ST_TRANSITION_SBL] = "SBL",
> >>   [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
> >> +    [DEV_ST_TRANSITION_FP] = "FP",
> >>   [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
> >>   [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
> >>   };
> >> diff --git a/drivers/bus/mhi/core/internal.h
> >> b/drivers/bus/mhi/core/internal.h index 4abf0cf..6ae897a 100644
> >> --- a/drivers/bus/mhi/core/internal.h
> >> +++ b/drivers/bus/mhi/core/internal.h
> >> @@ -386,6 +386,7 @@ enum dev_st_transition {
> >>   DEV_ST_TRANSITION_READY,
> >>   DEV_ST_TRANSITION_SBL,
> >>   DEV_ST_TRANSITION_MISSION_MODE,
> >> +    DEV_ST_TRANSITION_FP,
> >>   DEV_ST_TRANSITION_SYS_ERR,
> >>   DEV_ST_TRANSITION_DISABLE,
> >>   DEV_ST_TRANSITION_MAX,
> >> diff --git a/drivers/bus/mhi/core/main.c
> >> b/drivers/bus/mhi/core/main.c index 3950792..e307b58 100644
> >> --- a/drivers/bus/mhi/core/main.c
> >> +++ b/drivers/bus/mhi/core/main.c
> >> @@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct
> >> mhi_controller *mhi_cntrl,
> >>   case MHI_EE_SBL:
> >>   st = DEV_ST_TRANSITION_SBL;
> >>   break;
> >> +    case MHI_EE_FP:
> >> +    st = DEV_ST_TRANSITION_FP;
> >> +    break;
> >>   case MHI_EE_WFW:
> >>   case MHI_EE_AMSS:
> >>   st = DEV_ST_TRANSITION_MISSION_MODE; diff
> --git
> >> a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index
> >> 3de7b16..3c95a5d 100644
> >> --- a/drivers/bus/mhi/core/pm.c
> >> +++ b/drivers/bus/mhi/core/pm.c
> >> @@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct
> >> mhi_controller *mhi_cntrl,
> >>   }
> >>   if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
> >> -    mhi_ready_state_transition(mhi_cntrl);
> >> +    if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
> >> +    && mhi_get_mhi_state(mhi_cntrl) == MHI_STATE_RESET) {
> >> +    write_lock_irq(_cntrl->pm_lock);
> >> +    cur_state = mhi_tryset_pm_state(mhi_cntrl,
> MHI_PM_POR);
> >> +    write_unlock_irq(_cntrl->pm_lock);
> >> +    mhi_queue_state_transition(mhi_cntrl,
> >> DEV_ST_TRANSITION_PBL);
> >> +    } else {
> >> +    mhi_ready_state_transition(mhi_cntrl);
> >> +    }
> >>   } else {
> >>   /* Move to disable state */
> >>   write_lock_irq(_cntrl->pm_lock);
> >> @@ -658,6 +666,12 @@ void mhi_pm_st_worker(struct work_struct *work)
> >>   case DEV_ST_TRANSITION_MISSION_MODE:
> >>   mhi_pm_mission_mode_transition(mhi_cntrl);
> >>   break;
> >> +    case DEV_ST_TRANSITION_FP:
> >> +    

RE: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-29 Thread 殷张成
Hi bbhatt:

On October 29, 2020 5:41 AM, bbhatt wrote:
> On 2020-10-27 18:57, Carl Yin wrote:
> > Hi bbhatt:
> >
> > On Wednesday, October 28, 2020 9:34 AM, bbhatt wrote:
> >> Hi Carl,
> >> On 2020-10-27 16:01, Hemant Kumar wrote:
> >> > Hi Jeff,
> >> >
> >> > On 10/27/20 8:11 AM, Jeffrey Hugo wrote:
> >> >> On 10/27/2020 3:43 AM, carl@quectel.com wrote:
> >> >>> From: "carl.yin" 
> >> >>>
> >> >>> MHI wwan modems support download firmware to nand or emmc by
> >> >>> firehose protocol, process as next:
> >> >>> 1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG
> >> >>> chan device 2. send EDL cmd via DIAG chan, then modem enter EE EDL 3.
> >> >>> boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI
> >> >>> interface 4. modem enter EE FP, and create mhi EDL chan device 5.
> >> >>> user space tool download FW to modem via EDL chan by firehose
> >> >>> protocol
> >> >>>
> >> >>> Signed-off-by: carl.yin 
> >> >>> ---
> >> >>>   drivers/bus/mhi/core/boot.c |  4 +++-
> >> >>>   drivers/bus/mhi/core/init.c |  2 ++
> >> >>>   drivers/bus/mhi/core/internal.h |  1 +
> >> >>>   drivers/bus/mhi/core/main.c |  3 +++
> >> >>>   drivers/bus/mhi/core/pm.c   | 16 +++-
> >> >>>   include/linux/mhi.h |  4 +++-
> >> >>>   6 files changed, 27 insertions(+), 3 deletions(-)
> >> >>>
> >> >>> diff --git a/drivers/bus/mhi/core/boot.c
> >> >>> b/drivers/bus/mhi/core/boot.c index 24422f5..ab39ad6 100644
> >> >>> --- a/drivers/bus/mhi/core/boot.c
> >> >>> +++ b/drivers/bus/mhi/core/boot.c
> >> >>> @@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct
> >> >>> mhi_controller
> >> >>> *mhi_cntrl)
> >> >>>   return;
> >> >>>   }
> >> >>> -    if (mhi_cntrl->ee == MHI_EE_EDL)
> >> >>> +    if (mhi_cntrl->ee == MHI_EE_EDL) {
> >> >>> +    mhi_ready_state_transition(mhi_cntrl);
> >> >>>   return;
> >> >>> +    }
> >> >>>   write_lock_irq(_cntrl->pm_lock);
> >> >>>   mhi_cntrl->dev_state = MHI_STATE_RESET; diff --git
> >> >>> a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index
> >> >>> ac4aa5c..9c2c2f3 100644
> >> >>> --- a/drivers/bus/mhi/core/init.c
> >> >>> +++ b/drivers/bus/mhi/core/init.c
> >> >>> @@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
> >> >>>   [MHI_EE_WFW] = "WFW",
> >> >>>   [MHI_EE_PTHRU] = "PASS THRU",
> >> >>>   [MHI_EE_EDL] = "EDL",
> >> >>> +    [MHI_EE_FP] = "FP",
> >> >>>   [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
> >> >>>   [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
> >> >>>   };
> >> >>> @@ -35,6 +36,7 @@ const char * const
> >> >>> dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
> >> >>>   [DEV_ST_TRANSITION_READY] = "READY",
> >> >>>   [DEV_ST_TRANSITION_SBL] = "SBL",
> >> >>>   [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
> >> >>> +    [DEV_ST_TRANSITION_FP] = "FP",
> >> Longer description here would be nice (FLASH PROGRAMMER).
> > [carl.yin] yes, for SDX24 and SDX55 chip, 'FIREHOSE PROGRAMMER' is
> > more better.
> I agree with Jeff, should be generic.
> >>
> >> >>>   [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
> >> >>>   [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
> >> >>>   };
> >> >>> diff --git a/drivers/bus/mhi/core/internal.h
> >> >>> b/drivers/bus/mhi/core/internal.h index 4abf0cf..6ae897a 100644
> >> >>> --- a/drivers/bus/mhi/core/internal.h
> >> >>> +++ b/drivers/bus/mhi/core/internal.h
> >> >>> @@ -386,6 +386,7 @@ enum dev_st_transition {
> >> >>>   DEV_ST_TRANSITION_READY,
> >> >>>   DEV_ST_TRANSITION_SBL,
> >> >>>   DEV_ST_TRANSITION_MISSION_MODE,
> >> >>> +    DEV_ST_TRANSITION_FP,
> >> >>>   DEV_ST_TRANSITION_SYS_ERR,
> >> >>>   DEV_ST_TRANSITION_DISABLE,
> >> >>>   DEV_ST_TRANSITION_MAX,
> >> >>> diff --git a/drivers/bus/mhi/core/main.c
> >> >>> b/drivers/bus/mhi/core/main.c index 3950792..e307b58 100644
> >> >>> --- a/drivers/bus/mhi/core/main.c
> >> >>> +++ b/drivers/bus/mhi/core/main.c
> >> >>> @@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct
> >> >>> mhi_controller *mhi_cntrl,
> >> >>>   case MHI_EE_SBL:
> >> >>>   st = DEV_ST_TRANSITION_SBL;
> >> >>>   break;
> >> >>> +    case MHI_EE_FP:
> >> >>> +    st = DEV_ST_TRANSITION_FP;
> >> >>> +    break;
> >> >>>   case MHI_EE_WFW:
> >> >>>   case MHI_EE_AMSS:
> >> >>>   st = DEV_ST_TRANSITION_MISSION_MODE;
> diff
> >> --git
> >> >>> a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index
> >> >>> 3de7b16..3c95a5d 100644
> >> >>> --- a/drivers/bus/mhi/core/pm.c
> >> >>> +++ b/drivers/bus/mhi/core/pm.c
> >> >>> @@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct
> >> >>> mhi_controller *mhi_cntrl,
> >> >>>   }
> >> >>>   if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
> >> >>> -    mhi_ready_state_transition(mhi_cntrl);
> >> >>> +    if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
> >> >>> +    && 

答复: 答复: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-28 Thread 殷张成
Hi Jeffery:

On Wednesday, October 28, 2020 10:24 PM, jhugo wrote:
> On 10/27/2020 7:39 PM, Carl Yin(殷张成) wrote:
> > Hi Hemant and Jeffery:
> >
> > On Wednesday, October 28, 2020 7:02 AM, hemantk wrote:
> >> Hi Jeff,
> >>
> >> On 10/27/20 8:11 AM, Jeffrey Hugo wrote:
> >>> On 10/27/2020 3:43 AM, carl@quectel.com wrote:
>  From: "carl.yin" 
> 
>  MHI wwan modems support download firmware to nand or emmc by
>  firehose protocol, process as next:
>  1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG chan
>  device 2. send EDL cmd via DIAG chan, then modem enter EE EDL 3.
>  boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI
>  interface 4. modem enter EE FP, and create mhi EDL chan device 5.
>  user space tool download FW to modem via EDL chan by firehose
>  protocol
> 
>  Signed-off-by: carl.yin 
>  ---
>     drivers/bus/mhi/core/boot.c |  4 +++-
>     drivers/bus/mhi/core/init.c |  2 ++
>     drivers/bus/mhi/core/internal.h |  1 +
>     drivers/bus/mhi/core/main.c |  3 +++
>     drivers/bus/mhi/core/pm.c   | 16 +++-
>     include/linux/mhi.h |  4 +++-
>     6 files changed, 27 insertions(+), 3 deletions(-)
> 
>  diff --git a/drivers/bus/mhi/core/boot.c
>  b/drivers/bus/mhi/core/boot.c index 24422f5..ab39ad6 100644
>  --- a/drivers/bus/mhi/core/boot.c
>  +++ b/drivers/bus/mhi/core/boot.c
>  @@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct mhi_controller
>  *mhi_cntrl)
>     return;
>     }
>  -    if (mhi_cntrl->ee == MHI_EE_EDL)
>  +    if (mhi_cntrl->ee == MHI_EE_EDL) {
>  +    mhi_ready_state_transition(mhi_cntrl);
>     return;
>  +    }
>     write_lock_irq(_cntrl->pm_lock);
>     mhi_cntrl->dev_state = MHI_STATE_RESET; diff --git
>  a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index
>  ac4aa5c..9c2c2f3 100644
>  --- a/drivers/bus/mhi/core/init.c
>  +++ b/drivers/bus/mhi/core/init.c
>  @@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
>     [MHI_EE_WFW] = "WFW",
>     [MHI_EE_PTHRU] = "PASS THRU",
>     [MHI_EE_EDL] = "EDL",
>  +    [MHI_EE_FP] = "FP",
>     [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
>     [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
>     };
>  @@ -35,6 +36,7 @@ const char * const
>  dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
>     [DEV_ST_TRANSITION_READY] = "READY",
>     [DEV_ST_TRANSITION_SBL] = "SBL",
>     [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
>  +    [DEV_ST_TRANSITION_FP] = "FP",
>     [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
>     [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
>     };
>  diff --git a/drivers/bus/mhi/core/internal.h
>  b/drivers/bus/mhi/core/internal.h index 4abf0cf..6ae897a 100644
>  --- a/drivers/bus/mhi/core/internal.h
>  +++ b/drivers/bus/mhi/core/internal.h
>  @@ -386,6 +386,7 @@ enum dev_st_transition {
>     DEV_ST_TRANSITION_READY,
>     DEV_ST_TRANSITION_SBL,
>     DEV_ST_TRANSITION_MISSION_MODE,
>  +    DEV_ST_TRANSITION_FP,
>     DEV_ST_TRANSITION_SYS_ERR,
>     DEV_ST_TRANSITION_DISABLE,
>     DEV_ST_TRANSITION_MAX,
>  diff --git a/drivers/bus/mhi/core/main.c
>  b/drivers/bus/mhi/core/main.c index 3950792..e307b58 100644
>  --- a/drivers/bus/mhi/core/main.c
>  +++ b/drivers/bus/mhi/core/main.c
>  @@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct
>  mhi_controller *mhi_cntrl,
>     case MHI_EE_SBL:
>     st = DEV_ST_TRANSITION_SBL;
>     break;
>  +    case MHI_EE_FP:
>  +    st = DEV_ST_TRANSITION_FP;
>  +    break;
>     case MHI_EE_WFW:
>     case MHI_EE_AMSS:
>     st = DEV_ST_TRANSITION_MISSION_MODE;
> diff
> >> --git
>  a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index
>  3de7b16..3c95a5d 100644
>  --- a/drivers/bus/mhi/core/pm.c
>  +++ b/drivers/bus/mhi/core/pm.c
>  @@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct
>  mhi_controller *mhi_cntrl,
>     }
>     if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
>  -    mhi_ready_state_transition(mhi_cntrl);
>  +    if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
>  +    && mhi_get_mhi_state(mhi_cntrl) ==
> MHI_STATE_RESET) {
>  +    write_lock_irq(_cntrl->pm_lock);
>  +    cur_state = mhi_tryset_pm_state(mhi_cntrl,
> >> MHI_PM_POR);
>  +    write_unlock_irq(_cntrl->pm_lock);
>  +    mhi_queue_state_transition(mhi_cntrl,
>  DEV_ST_TRANSITION_PBL);
>  +    } else {
>  +    

Re: 答复: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-28 Thread Jeffrey Hugo

On 10/27/2020 7:39 PM, Carl Yin(殷张成) wrote:

Hi Hemant and Jeffery:

On Wednesday, October 28, 2020 7:02 AM, hemantk wrote:

Hi Jeff,

On 10/27/20 8:11 AM, Jeffrey Hugo wrote:

On 10/27/2020 3:43 AM, carl@quectel.com wrote:

From: "carl.yin" 

MHI wwan modems support download firmware to nand or emmc by firehose
protocol, process as next:
1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG chan
device 2. send EDL cmd via DIAG chan, then modem enter EE EDL 3.
boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI interface
4. modem enter EE FP, and create mhi EDL chan device 5. user space
tool download FW to modem via EDL chan by firehose protocol

Signed-off-by: carl.yin 
---
   drivers/bus/mhi/core/boot.c |  4 +++-
   drivers/bus/mhi/core/init.c |  2 ++
   drivers/bus/mhi/core/internal.h |  1 +
   drivers/bus/mhi/core/main.c |  3 +++
   drivers/bus/mhi/core/pm.c   | 16 +++-
   include/linux/mhi.h |  4 +++-
   6 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/drivers/bus/mhi/core/boot.c
b/drivers/bus/mhi/core/boot.c index 24422f5..ab39ad6 100644
--- a/drivers/bus/mhi/core/boot.c
+++ b/drivers/bus/mhi/core/boot.c
@@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct mhi_controller
*mhi_cntrl)
   return;
   }
-    if (mhi_cntrl->ee == MHI_EE_EDL)
+    if (mhi_cntrl->ee == MHI_EE_EDL) {
+    mhi_ready_state_transition(mhi_cntrl);
   return;
+    }
   write_lock_irq(_cntrl->pm_lock);
   mhi_cntrl->dev_state = MHI_STATE_RESET; diff --git
a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index
ac4aa5c..9c2c2f3 100644
--- a/drivers/bus/mhi/core/init.c
+++ b/drivers/bus/mhi/core/init.c
@@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
   [MHI_EE_WFW] = "WFW",
   [MHI_EE_PTHRU] = "PASS THRU",
   [MHI_EE_EDL] = "EDL",
+    [MHI_EE_FP] = "FP",
   [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
   [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
   };
@@ -35,6 +36,7 @@ const char * const
dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
   [DEV_ST_TRANSITION_READY] = "READY",
   [DEV_ST_TRANSITION_SBL] = "SBL",
   [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
+    [DEV_ST_TRANSITION_FP] = "FP",
   [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
   [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
   };
diff --git a/drivers/bus/mhi/core/internal.h
b/drivers/bus/mhi/core/internal.h index 4abf0cf..6ae897a 100644
--- a/drivers/bus/mhi/core/internal.h
+++ b/drivers/bus/mhi/core/internal.h
@@ -386,6 +386,7 @@ enum dev_st_transition {
   DEV_ST_TRANSITION_READY,
   DEV_ST_TRANSITION_SBL,
   DEV_ST_TRANSITION_MISSION_MODE,
+    DEV_ST_TRANSITION_FP,
   DEV_ST_TRANSITION_SYS_ERR,
   DEV_ST_TRANSITION_DISABLE,
   DEV_ST_TRANSITION_MAX,
diff --git a/drivers/bus/mhi/core/main.c
b/drivers/bus/mhi/core/main.c index 3950792..e307b58 100644
--- a/drivers/bus/mhi/core/main.c
+++ b/drivers/bus/mhi/core/main.c
@@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct
mhi_controller *mhi_cntrl,
   case MHI_EE_SBL:
   st = DEV_ST_TRANSITION_SBL;
   break;
+    case MHI_EE_FP:
+    st = DEV_ST_TRANSITION_FP;
+    break;
   case MHI_EE_WFW:
   case MHI_EE_AMSS:
   st = DEV_ST_TRANSITION_MISSION_MODE; diff

--git

a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index
3de7b16..3c95a5d 100644
--- a/drivers/bus/mhi/core/pm.c
+++ b/drivers/bus/mhi/core/pm.c
@@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct
mhi_controller *mhi_cntrl,
   }
   if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
-    mhi_ready_state_transition(mhi_cntrl);
+    if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
+    && mhi_get_mhi_state(mhi_cntrl) == MHI_STATE_RESET) {
+    write_lock_irq(_cntrl->pm_lock);
+    cur_state = mhi_tryset_pm_state(mhi_cntrl,

MHI_PM_POR);

+    write_unlock_irq(_cntrl->pm_lock);
+    mhi_queue_state_transition(mhi_cntrl,
DEV_ST_TRANSITION_PBL);
+    } else {
+    mhi_ready_state_transition(mhi_cntrl);
+    }
   } else {
   /* Move to disable state */
   write_lock_irq(_cntrl->pm_lock);
@@ -658,6 +666,12 @@ void mhi_pm_st_worker(struct work_struct *work)
   case DEV_ST_TRANSITION_MISSION_MODE:
   mhi_pm_mission_mode_transition(mhi_cntrl);
   break;
+    case DEV_ST_TRANSITION_FP:
+    write_lock_irq(_cntrl->pm_lock);
+    mhi_cntrl->ee = MHI_EE_FP;
+    write_unlock_irq(_cntrl->pm_lock);
+    mhi_create_devices(mhi_cntrl);
+    break;
   case DEV_ST_TRANSITION_READY:
   mhi_ready_state_transition(mhi_cntrl);
   break;
diff --git a/include/linux/mhi.h b/include/linux/mhi.h index
6e1122c..4620af8 100644
--- a/include/linux/mhi.h
+++ b/include/linux/mhi.h
@@ 

Re: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-28 Thread Jeffrey Hugo

On 10/27/2020 5:01 PM, Hemant Kumar wrote:

Hi Jeff,

On 10/27/20 8:11 AM, Jeffrey Hugo wrote:

On 10/27/2020 3:43 AM, carl@quectel.com wrote:

From: "carl.yin" 

MHI wwan modems support download firmware to nand or emmc
by firehose protocol, process as next:
1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG chan 
device

2. send EDL cmd via DIAG chan, then modem enter EE EDL
3. boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI interface
4. modem enter EE FP, and create mhi EDL chan device
5. user space tool download FW to modem via EDL chan by firehose 
protocol


Signed-off-by: carl.yin 
---
  drivers/bus/mhi/core/boot.c |  4 +++-
  drivers/bus/mhi/core/init.c |  2 ++
  drivers/bus/mhi/core/internal.h |  1 +
  drivers/bus/mhi/core/main.c |  3 +++
  drivers/bus/mhi/core/pm.c   | 16 +++-
  include/linux/mhi.h |  4 +++-
  6 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/drivers/bus/mhi/core/boot.c b/drivers/bus/mhi/core/boot.c
index 24422f5..ab39ad6 100644
--- a/drivers/bus/mhi/core/boot.c
+++ b/drivers/bus/mhi/core/boot.c
@@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct mhi_controller 
*mhi_cntrl)

  return;
  }
-    if (mhi_cntrl->ee == MHI_EE_EDL)
+    if (mhi_cntrl->ee == MHI_EE_EDL) {
+    mhi_ready_state_transition(mhi_cntrl);
  return;
+    }
  write_lock_irq(_cntrl->pm_lock);
  mhi_cntrl->dev_state = MHI_STATE_RESET;
diff --git a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c
index ac4aa5c..9c2c2f3 100644
--- a/drivers/bus/mhi/core/init.c
+++ b/drivers/bus/mhi/core/init.c
@@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
  [MHI_EE_WFW] = "WFW",
  [MHI_EE_PTHRU] = "PASS THRU",
  [MHI_EE_EDL] = "EDL",
+    [MHI_EE_FP] = "FP",
  [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
  [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
  };
@@ -35,6 +36,7 @@ const char * const 
dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {

  [DEV_ST_TRANSITION_READY] = "READY",
  [DEV_ST_TRANSITION_SBL] = "SBL",
  [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
+    [DEV_ST_TRANSITION_FP] = "FP",
  [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
  [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
  };
diff --git a/drivers/bus/mhi/core/internal.h 
b/drivers/bus/mhi/core/internal.h

index 4abf0cf..6ae897a 100644
--- a/drivers/bus/mhi/core/internal.h
+++ b/drivers/bus/mhi/core/internal.h
@@ -386,6 +386,7 @@ enum dev_st_transition {
  DEV_ST_TRANSITION_READY,
  DEV_ST_TRANSITION_SBL,
  DEV_ST_TRANSITION_MISSION_MODE,
+    DEV_ST_TRANSITION_FP,
  DEV_ST_TRANSITION_SYS_ERR,
  DEV_ST_TRANSITION_DISABLE,
  DEV_ST_TRANSITION_MAX,
diff --git a/drivers/bus/mhi/core/main.c b/drivers/bus/mhi/core/main.c
index 3950792..e307b58 100644
--- a/drivers/bus/mhi/core/main.c
+++ b/drivers/bus/mhi/core/main.c
@@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct 
mhi_controller *mhi_cntrl,

  case MHI_EE_SBL:
  st = DEV_ST_TRANSITION_SBL;
  break;
+    case MHI_EE_FP:
+    st = DEV_ST_TRANSITION_FP;
+    break;
  case MHI_EE_WFW:
  case MHI_EE_AMSS:
  st = DEV_ST_TRANSITION_MISSION_MODE;
diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c
index 3de7b16..3c95a5d 100644
--- a/drivers/bus/mhi/core/pm.c
+++ b/drivers/bus/mhi/core/pm.c
@@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct 
mhi_controller *mhi_cntrl,

  }
  if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
-    mhi_ready_state_transition(mhi_cntrl);
+    if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
+    && mhi_get_mhi_state(mhi_cntrl) == MHI_STATE_RESET) {
+    write_lock_irq(_cntrl->pm_lock);
+    cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_POR);
+    write_unlock_irq(_cntrl->pm_lock);
+    mhi_queue_state_transition(mhi_cntrl, 
DEV_ST_TRANSITION_PBL);

+    } else {
+    mhi_ready_state_transition(mhi_cntrl);
+    }
  } else {
  /* Move to disable state */
  write_lock_irq(_cntrl->pm_lock);
@@ -658,6 +666,12 @@ void mhi_pm_st_worker(struct work_struct *work)
  case DEV_ST_TRANSITION_MISSION_MODE:
  mhi_pm_mission_mode_transition(mhi_cntrl);
  break;
+    case DEV_ST_TRANSITION_FP:
+    write_lock_irq(_cntrl->pm_lock);
+    mhi_cntrl->ee = MHI_EE_FP;
+    write_unlock_irq(_cntrl->pm_lock);
+    mhi_create_devices(mhi_cntrl);
+    break;
  case DEV_ST_TRANSITION_READY:
  mhi_ready_state_transition(mhi_cntrl);
  break;
diff --git a/include/linux/mhi.h b/include/linux/mhi.h
index 6e1122c..4620af8 100644
--- a/include/linux/mhi.h
+++ b/include/linux/mhi.h
@@ -120,6 +120,7 @@ struct mhi_link_info {
   * @MHI_EE_WFW: WLAN firmware mode
   * @MHI_EE_PTHRU: Passthrough
   * 

答复: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-28 Thread 殷张成
Hi bbhatt:

On Wednesday, October 28, 2020 9:34 AM, bbhatt wrote:
> Hi Carl,
> On 2020-10-27 16:01, Hemant Kumar wrote:
> > Hi Jeff,
> >
> > On 10/27/20 8:11 AM, Jeffrey Hugo wrote:
> >> On 10/27/2020 3:43 AM, carl@quectel.com wrote:
> >>> From: "carl.yin" 
> >>>
> >>> MHI wwan modems support download firmware to nand or emmc by
> >>> firehose protocol, process as next:
> >>> 1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG chan
> >>> device 2. send EDL cmd via DIAG chan, then modem enter EE EDL 3.
> >>> boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI interface
> >>> 4. modem enter EE FP, and create mhi EDL chan device 5. user space
> >>> tool download FW to modem via EDL chan by firehose protocol
> >>>
> >>> Signed-off-by: carl.yin 
> >>> ---
> >>>   drivers/bus/mhi/core/boot.c |  4 +++-
> >>>   drivers/bus/mhi/core/init.c |  2 ++
> >>>   drivers/bus/mhi/core/internal.h |  1 +
> >>>   drivers/bus/mhi/core/main.c |  3 +++
> >>>   drivers/bus/mhi/core/pm.c   | 16 +++-
> >>>   include/linux/mhi.h |  4 +++-
> >>>   6 files changed, 27 insertions(+), 3 deletions(-)
> >>>
> >>> diff --git a/drivers/bus/mhi/core/boot.c
> >>> b/drivers/bus/mhi/core/boot.c index 24422f5..ab39ad6 100644
> >>> --- a/drivers/bus/mhi/core/boot.c
> >>> +++ b/drivers/bus/mhi/core/boot.c
> >>> @@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct mhi_controller
> >>> *mhi_cntrl)
> >>>   return;
> >>>   }
> >>> -    if (mhi_cntrl->ee == MHI_EE_EDL)
> >>> +    if (mhi_cntrl->ee == MHI_EE_EDL) {
> >>> +    mhi_ready_state_transition(mhi_cntrl);
> >>>   return;
> >>> +    }
> >>>   write_lock_irq(_cntrl->pm_lock);
> >>>   mhi_cntrl->dev_state = MHI_STATE_RESET; diff --git
> >>> a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index
> >>> ac4aa5c..9c2c2f3 100644
> >>> --- a/drivers/bus/mhi/core/init.c
> >>> +++ b/drivers/bus/mhi/core/init.c
> >>> @@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
> >>>   [MHI_EE_WFW] = "WFW",
> >>>   [MHI_EE_PTHRU] = "PASS THRU",
> >>>   [MHI_EE_EDL] = "EDL",
> >>> +    [MHI_EE_FP] = "FP",
> >>>   [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
> >>>   [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
> >>>   };
> >>> @@ -35,6 +36,7 @@ const char * const
> >>> dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
> >>>   [DEV_ST_TRANSITION_READY] = "READY",
> >>>   [DEV_ST_TRANSITION_SBL] = "SBL",
> >>>   [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
> >>> +    [DEV_ST_TRANSITION_FP] = "FP",
> Longer description here would be nice (FLASH PROGRAMMER).
[carl.yin] yes, for SDX24 and SDX55 chip, 'FIREHOSE PROGRAMMER' is more better.
> 
> >>>   [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
> >>>   [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
> >>>   };
> >>> diff --git a/drivers/bus/mhi/core/internal.h
> >>> b/drivers/bus/mhi/core/internal.h index 4abf0cf..6ae897a 100644
> >>> --- a/drivers/bus/mhi/core/internal.h
> >>> +++ b/drivers/bus/mhi/core/internal.h
> >>> @@ -386,6 +386,7 @@ enum dev_st_transition {
> >>>   DEV_ST_TRANSITION_READY,
> >>>   DEV_ST_TRANSITION_SBL,
> >>>   DEV_ST_TRANSITION_MISSION_MODE,
> >>> +    DEV_ST_TRANSITION_FP,
> >>>   DEV_ST_TRANSITION_SYS_ERR,
> >>>   DEV_ST_TRANSITION_DISABLE,
> >>>   DEV_ST_TRANSITION_MAX,
> >>> diff --git a/drivers/bus/mhi/core/main.c
> >>> b/drivers/bus/mhi/core/main.c index 3950792..e307b58 100644
> >>> --- a/drivers/bus/mhi/core/main.c
> >>> +++ b/drivers/bus/mhi/core/main.c
> >>> @@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct
> >>> mhi_controller *mhi_cntrl,
> >>>   case MHI_EE_SBL:
> >>>   st = DEV_ST_TRANSITION_SBL;
> >>>   break;
> >>> +    case MHI_EE_FP:
> >>> +    st = DEV_ST_TRANSITION_FP;
> >>> +    break;
> >>>   case MHI_EE_WFW:
> >>>   case MHI_EE_AMSS:
> >>>   st = DEV_ST_TRANSITION_MISSION_MODE; diff
> --git
> >>> a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index
> >>> 3de7b16..3c95a5d 100644
> >>> --- a/drivers/bus/mhi/core/pm.c
> >>> +++ b/drivers/bus/mhi/core/pm.c
> >>> @@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct
> >>> mhi_controller *mhi_cntrl,
> >>>   }
> >>>   if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
> >>> -    mhi_ready_state_transition(mhi_cntrl);
> >>> +    if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
> >>> +    && mhi_get_mhi_state(mhi_cntrl) == MHI_STATE_RESET)
> {
> >>> +    write_lock_irq(_cntrl->pm_lock);
> >>> +    cur_state = mhi_tryset_pm_state(mhi_cntrl,
> MHI_PM_POR);
> >>> +    write_unlock_irq(_cntrl->pm_lock);
> >>> +    mhi_queue_state_transition(mhi_cntrl,
> >>> DEV_ST_TRANSITION_PBL);
> >>> +    } else {
> >>> +    mhi_ready_state_transition(mhi_cntrl);
> >>> +    }
> >>>   } else {
> >>>   /* Move to disable state */
> 

答复: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-28 Thread 殷张成
Hi Hemant and Jeffery:

On Wednesday, October 28, 2020 7:02 AM, hemantk wrote:
> Hi Jeff,
> 
> On 10/27/20 8:11 AM, Jeffrey Hugo wrote:
> > On 10/27/2020 3:43 AM, carl@quectel.com wrote:
> >> From: "carl.yin" 
> >>
> >> MHI wwan modems support download firmware to nand or emmc by firehose
> >> protocol, process as next:
> >> 1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG chan
> >> device 2. send EDL cmd via DIAG chan, then modem enter EE EDL 3.
> >> boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI interface
> >> 4. modem enter EE FP, and create mhi EDL chan device 5. user space
> >> tool download FW to modem via EDL chan by firehose protocol
> >>
> >> Signed-off-by: carl.yin 
> >> ---
> >>   drivers/bus/mhi/core/boot.c |  4 +++-
> >>   drivers/bus/mhi/core/init.c |  2 ++
> >>   drivers/bus/mhi/core/internal.h |  1 +
> >>   drivers/bus/mhi/core/main.c |  3 +++
> >>   drivers/bus/mhi/core/pm.c   | 16 +++-
> >>   include/linux/mhi.h |  4 +++-
> >>   6 files changed, 27 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/drivers/bus/mhi/core/boot.c
> >> b/drivers/bus/mhi/core/boot.c index 24422f5..ab39ad6 100644
> >> --- a/drivers/bus/mhi/core/boot.c
> >> +++ b/drivers/bus/mhi/core/boot.c
> >> @@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct mhi_controller
> >> *mhi_cntrl)
> >>   return;
> >>   }
> >> -    if (mhi_cntrl->ee == MHI_EE_EDL)
> >> +    if (mhi_cntrl->ee == MHI_EE_EDL) {
> >> +    mhi_ready_state_transition(mhi_cntrl);
> >>   return;
> >> +    }
> >>   write_lock_irq(_cntrl->pm_lock);
> >>   mhi_cntrl->dev_state = MHI_STATE_RESET; diff --git
> >> a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index
> >> ac4aa5c..9c2c2f3 100644
> >> --- a/drivers/bus/mhi/core/init.c
> >> +++ b/drivers/bus/mhi/core/init.c
> >> @@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
> >>   [MHI_EE_WFW] = "WFW",
> >>   [MHI_EE_PTHRU] = "PASS THRU",
> >>   [MHI_EE_EDL] = "EDL",
> >> +    [MHI_EE_FP] = "FP",
> >>   [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
> >>   [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
> >>   };
> >> @@ -35,6 +36,7 @@ const char * const
> >> dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
> >>   [DEV_ST_TRANSITION_READY] = "READY",
> >>   [DEV_ST_TRANSITION_SBL] = "SBL",
> >>   [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
> >> +    [DEV_ST_TRANSITION_FP] = "FP",
> >>   [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
> >>   [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
> >>   };
> >> diff --git a/drivers/bus/mhi/core/internal.h
> >> b/drivers/bus/mhi/core/internal.h index 4abf0cf..6ae897a 100644
> >> --- a/drivers/bus/mhi/core/internal.h
> >> +++ b/drivers/bus/mhi/core/internal.h
> >> @@ -386,6 +386,7 @@ enum dev_st_transition {
> >>   DEV_ST_TRANSITION_READY,
> >>   DEV_ST_TRANSITION_SBL,
> >>   DEV_ST_TRANSITION_MISSION_MODE,
> >> +    DEV_ST_TRANSITION_FP,
> >>   DEV_ST_TRANSITION_SYS_ERR,
> >>   DEV_ST_TRANSITION_DISABLE,
> >>   DEV_ST_TRANSITION_MAX,
> >> diff --git a/drivers/bus/mhi/core/main.c
> >> b/drivers/bus/mhi/core/main.c index 3950792..e307b58 100644
> >> --- a/drivers/bus/mhi/core/main.c
> >> +++ b/drivers/bus/mhi/core/main.c
> >> @@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct
> >> mhi_controller *mhi_cntrl,
> >>   case MHI_EE_SBL:
> >>   st = DEV_ST_TRANSITION_SBL;
> >>   break;
> >> +    case MHI_EE_FP:
> >> +    st = DEV_ST_TRANSITION_FP;
> >> +    break;
> >>   case MHI_EE_WFW:
> >>   case MHI_EE_AMSS:
> >>   st = DEV_ST_TRANSITION_MISSION_MODE; diff
> --git
> >> a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index
> >> 3de7b16..3c95a5d 100644
> >> --- a/drivers/bus/mhi/core/pm.c
> >> +++ b/drivers/bus/mhi/core/pm.c
> >> @@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct
> >> mhi_controller *mhi_cntrl,
> >>   }
> >>   if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
> >> -    mhi_ready_state_transition(mhi_cntrl);
> >> +    if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
> >> +    && mhi_get_mhi_state(mhi_cntrl) == MHI_STATE_RESET) {
> >> +    write_lock_irq(_cntrl->pm_lock);
> >> +    cur_state = mhi_tryset_pm_state(mhi_cntrl,
> MHI_PM_POR);
> >> +    write_unlock_irq(_cntrl->pm_lock);
> >> +    mhi_queue_state_transition(mhi_cntrl,
> >> DEV_ST_TRANSITION_PBL);
> >> +    } else {
> >> +    mhi_ready_state_transition(mhi_cntrl);
> >> +    }
> >>   } else {
> >>   /* Move to disable state */
> >>   write_lock_irq(_cntrl->pm_lock);
> >> @@ -658,6 +666,12 @@ void mhi_pm_st_worker(struct work_struct *work)
> >>   case DEV_ST_TRANSITION_MISSION_MODE:
> >>   mhi_pm_mission_mode_transition(mhi_cntrl);
> >>   break;
> >> +    case 

Re: 答复: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-28 Thread Bhaumik Bhatt

On 2020-10-27 18:57, Carl Yin wrote:

Hi bbhatt:

On Wednesday, October 28, 2020 9:34 AM, bbhatt wrote:

Hi Carl,
On 2020-10-27 16:01, Hemant Kumar wrote:
> Hi Jeff,
>
> On 10/27/20 8:11 AM, Jeffrey Hugo wrote:
>> On 10/27/2020 3:43 AM, carl@quectel.com wrote:
>>> From: "carl.yin" 
>>>
>>> MHI wwan modems support download firmware to nand or emmc by
>>> firehose protocol, process as next:
>>> 1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG chan
>>> device 2. send EDL cmd via DIAG chan, then modem enter EE EDL 3.
>>> boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI interface
>>> 4. modem enter EE FP, and create mhi EDL chan device 5. user space
>>> tool download FW to modem via EDL chan by firehose protocol
>>>
>>> Signed-off-by: carl.yin 
>>> ---
>>>   drivers/bus/mhi/core/boot.c |  4 +++-
>>>   drivers/bus/mhi/core/init.c |  2 ++
>>>   drivers/bus/mhi/core/internal.h |  1 +
>>>   drivers/bus/mhi/core/main.c |  3 +++
>>>   drivers/bus/mhi/core/pm.c   | 16 +++-
>>>   include/linux/mhi.h |  4 +++-
>>>   6 files changed, 27 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/bus/mhi/core/boot.c
>>> b/drivers/bus/mhi/core/boot.c index 24422f5..ab39ad6 100644
>>> --- a/drivers/bus/mhi/core/boot.c
>>> +++ b/drivers/bus/mhi/core/boot.c
>>> @@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct mhi_controller
>>> *mhi_cntrl)
>>>   return;
>>>   }
>>> -    if (mhi_cntrl->ee == MHI_EE_EDL)
>>> +    if (mhi_cntrl->ee == MHI_EE_EDL) {
>>> +    mhi_ready_state_transition(mhi_cntrl);
>>>   return;
>>> +    }
>>>   write_lock_irq(_cntrl->pm_lock);
>>>   mhi_cntrl->dev_state = MHI_STATE_RESET; diff --git
>>> a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index
>>> ac4aa5c..9c2c2f3 100644
>>> --- a/drivers/bus/mhi/core/init.c
>>> +++ b/drivers/bus/mhi/core/init.c
>>> @@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
>>>   [MHI_EE_WFW] = "WFW",
>>>   [MHI_EE_PTHRU] = "PASS THRU",
>>>   [MHI_EE_EDL] = "EDL",
>>> +    [MHI_EE_FP] = "FP",
>>>   [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
>>>   [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
>>>   };
>>> @@ -35,6 +36,7 @@ const char * const
>>> dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
>>>   [DEV_ST_TRANSITION_READY] = "READY",
>>>   [DEV_ST_TRANSITION_SBL] = "SBL",
>>>   [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
>>> +    [DEV_ST_TRANSITION_FP] = "FP",
Longer description here would be nice (FLASH PROGRAMMER).
[carl.yin] yes, for SDX24 and SDX55 chip, 'FIREHOSE PROGRAMMER' is more 
better.

I agree with Jeff, should be generic.


>>>   [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
>>>   [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
>>>   };
>>> diff --git a/drivers/bus/mhi/core/internal.h
>>> b/drivers/bus/mhi/core/internal.h index 4abf0cf..6ae897a 100644
>>> --- a/drivers/bus/mhi/core/internal.h
>>> +++ b/drivers/bus/mhi/core/internal.h
>>> @@ -386,6 +386,7 @@ enum dev_st_transition {
>>>   DEV_ST_TRANSITION_READY,
>>>   DEV_ST_TRANSITION_SBL,
>>>   DEV_ST_TRANSITION_MISSION_MODE,
>>> +    DEV_ST_TRANSITION_FP,
>>>   DEV_ST_TRANSITION_SYS_ERR,
>>>   DEV_ST_TRANSITION_DISABLE,
>>>   DEV_ST_TRANSITION_MAX,
>>> diff --git a/drivers/bus/mhi/core/main.c
>>> b/drivers/bus/mhi/core/main.c index 3950792..e307b58 100644
>>> --- a/drivers/bus/mhi/core/main.c
>>> +++ b/drivers/bus/mhi/core/main.c
>>> @@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct
>>> mhi_controller *mhi_cntrl,
>>>   case MHI_EE_SBL:
>>>   st = DEV_ST_TRANSITION_SBL;
>>>   break;
>>> +    case MHI_EE_FP:
>>> +    st = DEV_ST_TRANSITION_FP;
>>> +    break;
>>>   case MHI_EE_WFW:
>>>   case MHI_EE_AMSS:
>>>   st = DEV_ST_TRANSITION_MISSION_MODE; diff
--git
>>> a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index
>>> 3de7b16..3c95a5d 100644
>>> --- a/drivers/bus/mhi/core/pm.c
>>> +++ b/drivers/bus/mhi/core/pm.c
>>> @@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct
>>> mhi_controller *mhi_cntrl,
>>>   }
>>>   if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
>>> -    mhi_ready_state_transition(mhi_cntrl);
>>> +    if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
>>> +    && mhi_get_mhi_state(mhi_cntrl) == MHI_STATE_RESET)
{
>>> +    write_lock_irq(_cntrl->pm_lock);
>>> +    cur_state = mhi_tryset_pm_state(mhi_cntrl,
MHI_PM_POR);
>>> +    write_unlock_irq(_cntrl->pm_lock);
>>> +    mhi_queue_state_transition(mhi_cntrl,
>>> DEV_ST_TRANSITION_PBL);
>>> +    } else {
>>> +    mhi_ready_state_transition(mhi_cntrl);
>>> +    }
>>>   } else {
>>>   /* Move to disable state */
>>>   write_lock_irq(_cntrl->pm_lock);
>>> @@ -658,6 +666,12 @@ void mhi_pm_st_worker(struct work_struct *work)
>>>   case 

Re: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-27 Thread Hemant Kumar

Hi Jeff,

On 10/27/20 8:11 AM, Jeffrey Hugo wrote:

On 10/27/2020 3:43 AM, carl@quectel.com wrote:

From: "carl.yin" 

MHI wwan modems support download firmware to nand or emmc
by firehose protocol, process as next:
1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG chan 
device

2. send EDL cmd via DIAG chan, then modem enter EE EDL
3. boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI interface
4. modem enter EE FP, and create mhi EDL chan device
5. user space tool download FW to modem via EDL chan by firehose protocol

Signed-off-by: carl.yin 
---
  drivers/bus/mhi/core/boot.c |  4 +++-
  drivers/bus/mhi/core/init.c |  2 ++
  drivers/bus/mhi/core/internal.h |  1 +
  drivers/bus/mhi/core/main.c |  3 +++
  drivers/bus/mhi/core/pm.c   | 16 +++-
  include/linux/mhi.h |  4 +++-
  6 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/drivers/bus/mhi/core/boot.c b/drivers/bus/mhi/core/boot.c
index 24422f5..ab39ad6 100644
--- a/drivers/bus/mhi/core/boot.c
+++ b/drivers/bus/mhi/core/boot.c
@@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct mhi_controller 
*mhi_cntrl)

  return;
  }
-    if (mhi_cntrl->ee == MHI_EE_EDL)
+    if (mhi_cntrl->ee == MHI_EE_EDL) {
+    mhi_ready_state_transition(mhi_cntrl);
  return;
+    }
  write_lock_irq(_cntrl->pm_lock);
  mhi_cntrl->dev_state = MHI_STATE_RESET;
diff --git a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c
index ac4aa5c..9c2c2f3 100644
--- a/drivers/bus/mhi/core/init.c
+++ b/drivers/bus/mhi/core/init.c
@@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
  [MHI_EE_WFW] = "WFW",
  [MHI_EE_PTHRU] = "PASS THRU",
  [MHI_EE_EDL] = "EDL",
+    [MHI_EE_FP] = "FP",
  [MHI_EE_DISABLE_TRANSITION] = "DISABLE",
  [MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
  };
@@ -35,6 +36,7 @@ const char * const 
dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {

  [DEV_ST_TRANSITION_READY] = "READY",
  [DEV_ST_TRANSITION_SBL] = "SBL",
  [DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
+    [DEV_ST_TRANSITION_FP] = "FP",
  [DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
  [DEV_ST_TRANSITION_DISABLE] = "DISABLE",
  };
diff --git a/drivers/bus/mhi/core/internal.h 
b/drivers/bus/mhi/core/internal.h

index 4abf0cf..6ae897a 100644
--- a/drivers/bus/mhi/core/internal.h
+++ b/drivers/bus/mhi/core/internal.h
@@ -386,6 +386,7 @@ enum dev_st_transition {
  DEV_ST_TRANSITION_READY,
  DEV_ST_TRANSITION_SBL,
  DEV_ST_TRANSITION_MISSION_MODE,
+    DEV_ST_TRANSITION_FP,
  DEV_ST_TRANSITION_SYS_ERR,
  DEV_ST_TRANSITION_DISABLE,
  DEV_ST_TRANSITION_MAX,
diff --git a/drivers/bus/mhi/core/main.c b/drivers/bus/mhi/core/main.c
index 3950792..e307b58 100644
--- a/drivers/bus/mhi/core/main.c
+++ b/drivers/bus/mhi/core/main.c
@@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller 
*mhi_cntrl,

  case MHI_EE_SBL:
  st = DEV_ST_TRANSITION_SBL;
  break;
+    case MHI_EE_FP:
+    st = DEV_ST_TRANSITION_FP;
+    break;
  case MHI_EE_WFW:
  case MHI_EE_AMSS:
  st = DEV_ST_TRANSITION_MISSION_MODE;
diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c
index 3de7b16..3c95a5d 100644
--- a/drivers/bus/mhi/core/pm.c
+++ b/drivers/bus/mhi/core/pm.c
@@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct 
mhi_controller *mhi_cntrl,

  }
  if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
-    mhi_ready_state_transition(mhi_cntrl);
+    if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
+    && mhi_get_mhi_state(mhi_cntrl) == MHI_STATE_RESET) {
+    write_lock_irq(_cntrl->pm_lock);
+    cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_POR);
+    write_unlock_irq(_cntrl->pm_lock);
+    mhi_queue_state_transition(mhi_cntrl, 
DEV_ST_TRANSITION_PBL);

+    } else {
+    mhi_ready_state_transition(mhi_cntrl);
+    }
  } else {
  /* Move to disable state */
  write_lock_irq(_cntrl->pm_lock);
@@ -658,6 +666,12 @@ void mhi_pm_st_worker(struct work_struct *work)
  case DEV_ST_TRANSITION_MISSION_MODE:
  mhi_pm_mission_mode_transition(mhi_cntrl);
  break;
+    case DEV_ST_TRANSITION_FP:
+    write_lock_irq(_cntrl->pm_lock);
+    mhi_cntrl->ee = MHI_EE_FP;
+    write_unlock_irq(_cntrl->pm_lock);
+    mhi_create_devices(mhi_cntrl);
+    break;
  case DEV_ST_TRANSITION_READY:
  mhi_ready_state_transition(mhi_cntrl);
  break;
diff --git a/include/linux/mhi.h b/include/linux/mhi.h
index 6e1122c..4620af8 100644
--- a/include/linux/mhi.h
+++ b/include/linux/mhi.h
@@ -120,6 +120,7 @@ struct mhi_link_info {
   * @MHI_EE_WFW: WLAN firmware mode
   * @MHI_EE_PTHRU: Passthrough
   * @MHI_EE_EDL: Embedded downloader
+ * @MHI_EE_FP, 

Re: [PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-27 Thread Jeffrey Hugo

On 10/27/2020 3:43 AM, carl@quectel.com wrote:

From: "carl.yin" 

MHI wwan modems support download firmware to nand or emmc
by firehose protocol, process as next:
1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG chan device
2. send EDL cmd via DIAG chan, then modem enter EE EDL
3. boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI interface
4. modem enter EE FP, and create mhi EDL chan device
5. user space tool download FW to modem via EDL chan by firehose protocol

Signed-off-by: carl.yin 
---
  drivers/bus/mhi/core/boot.c |  4 +++-
  drivers/bus/mhi/core/init.c |  2 ++
  drivers/bus/mhi/core/internal.h |  1 +
  drivers/bus/mhi/core/main.c |  3 +++
  drivers/bus/mhi/core/pm.c   | 16 +++-
  include/linux/mhi.h |  4 +++-
  6 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/drivers/bus/mhi/core/boot.c b/drivers/bus/mhi/core/boot.c
index 24422f5..ab39ad6 100644
--- a/drivers/bus/mhi/core/boot.c
+++ b/drivers/bus/mhi/core/boot.c
@@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
return;
}
  
-	if (mhi_cntrl->ee == MHI_EE_EDL)

+   if (mhi_cntrl->ee == MHI_EE_EDL) {
+   mhi_ready_state_transition(mhi_cntrl);
return;
+   }
  
  	write_lock_irq(_cntrl->pm_lock);

mhi_cntrl->dev_state = MHI_STATE_RESET;
diff --git a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c
index ac4aa5c..9c2c2f3 100644
--- a/drivers/bus/mhi/core/init.c
+++ b/drivers/bus/mhi/core/init.c
@@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
[MHI_EE_WFW] = "WFW",
[MHI_EE_PTHRU] = "PASS THRU",
[MHI_EE_EDL] = "EDL",
+   [MHI_EE_FP] = "FP",
[MHI_EE_DISABLE_TRANSITION] = "DISABLE",
[MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
  };
@@ -35,6 +36,7 @@ const char * const dev_state_tran_str[DEV_ST_TRANSITION_MAX] 
= {
[DEV_ST_TRANSITION_READY] = "READY",
[DEV_ST_TRANSITION_SBL] = "SBL",
[DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
+   [DEV_ST_TRANSITION_FP] = "FP",
[DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
[DEV_ST_TRANSITION_DISABLE] = "DISABLE",
  };
diff --git a/drivers/bus/mhi/core/internal.h b/drivers/bus/mhi/core/internal.h
index 4abf0cf..6ae897a 100644
--- a/drivers/bus/mhi/core/internal.h
+++ b/drivers/bus/mhi/core/internal.h
@@ -386,6 +386,7 @@ enum dev_st_transition {
DEV_ST_TRANSITION_READY,
DEV_ST_TRANSITION_SBL,
DEV_ST_TRANSITION_MISSION_MODE,
+   DEV_ST_TRANSITION_FP,
DEV_ST_TRANSITION_SYS_ERR,
DEV_ST_TRANSITION_DISABLE,
DEV_ST_TRANSITION_MAX,
diff --git a/drivers/bus/mhi/core/main.c b/drivers/bus/mhi/core/main.c
index 3950792..e307b58 100644
--- a/drivers/bus/mhi/core/main.c
+++ b/drivers/bus/mhi/core/main.c
@@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller 
*mhi_cntrl,
case MHI_EE_SBL:
st = DEV_ST_TRANSITION_SBL;
break;
+   case MHI_EE_FP:
+   st = DEV_ST_TRANSITION_FP;
+   break;
case MHI_EE_WFW:
case MHI_EE_AMSS:
st = DEV_ST_TRANSITION_MISSION_MODE;
diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c
index 3de7b16..3c95a5d 100644
--- a/drivers/bus/mhi/core/pm.c
+++ b/drivers/bus/mhi/core/pm.c
@@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct 
mhi_controller *mhi_cntrl,
}
  
  	if (cur_state == MHI_PM_SYS_ERR_PROCESS) {

-   mhi_ready_state_transition(mhi_cntrl);
+   if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
+   && mhi_get_mhi_state(mhi_cntrl) == MHI_STATE_RESET) {
+   write_lock_irq(_cntrl->pm_lock);
+   cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_POR);
+   write_unlock_irq(_cntrl->pm_lock);
+   mhi_queue_state_transition(mhi_cntrl, 
DEV_ST_TRANSITION_PBL);
+   } else {
+   mhi_ready_state_transition(mhi_cntrl);
+   }
} else {
/* Move to disable state */
write_lock_irq(_cntrl->pm_lock);
@@ -658,6 +666,12 @@ void mhi_pm_st_worker(struct work_struct *work)
case DEV_ST_TRANSITION_MISSION_MODE:
mhi_pm_mission_mode_transition(mhi_cntrl);
break;
+   case DEV_ST_TRANSITION_FP:
+   write_lock_irq(_cntrl->pm_lock);
+   mhi_cntrl->ee = MHI_EE_FP;
+   write_unlock_irq(_cntrl->pm_lock);
+   mhi_create_devices(mhi_cntrl);
+   break;
case DEV_ST_TRANSITION_READY:

[PATCH] bus: mhi: core: Add support MHI EE FP for download firmware

2020-10-27 Thread carl . yin
From: "carl.yin" 

MHI wwan modems support download firmware to nand or emmc
by firehose protocol, process as next:
1. wwan modem normal bootup and enter EE AMSS, create mhi DIAG chan device
2. send EDL cmd via DIAG chan, then modem enter EE EDL
3. boot.c download 'firehose/prog_firehose_sdx55.mbn' via BHI interface
4. modem enter EE FP, and create mhi EDL chan device
5. user space tool download FW to modem via EDL chan by firehose protocol

Signed-off-by: carl.yin 
---
 drivers/bus/mhi/core/boot.c |  4 +++-
 drivers/bus/mhi/core/init.c |  2 ++
 drivers/bus/mhi/core/internal.h |  1 +
 drivers/bus/mhi/core/main.c |  3 +++
 drivers/bus/mhi/core/pm.c   | 16 +++-
 include/linux/mhi.h |  4 +++-
 6 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/drivers/bus/mhi/core/boot.c b/drivers/bus/mhi/core/boot.c
index 24422f5..ab39ad6 100644
--- a/drivers/bus/mhi/core/boot.c
+++ b/drivers/bus/mhi/core/boot.c
@@ -460,8 +460,10 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
return;
}
 
-   if (mhi_cntrl->ee == MHI_EE_EDL)
+   if (mhi_cntrl->ee == MHI_EE_EDL) {
+   mhi_ready_state_transition(mhi_cntrl);
return;
+   }
 
write_lock_irq(_cntrl->pm_lock);
mhi_cntrl->dev_state = MHI_STATE_RESET;
diff --git a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c
index ac4aa5c..9c2c2f3 100644
--- a/drivers/bus/mhi/core/init.c
+++ b/drivers/bus/mhi/core/init.c
@@ -26,6 +26,7 @@ const char * const mhi_ee_str[MHI_EE_MAX] = {
[MHI_EE_WFW] = "WFW",
[MHI_EE_PTHRU] = "PASS THRU",
[MHI_EE_EDL] = "EDL",
+   [MHI_EE_FP] = "FP",
[MHI_EE_DISABLE_TRANSITION] = "DISABLE",
[MHI_EE_NOT_SUPPORTED] = "NOT SUPPORTED",
 };
@@ -35,6 +36,7 @@ const char * const dev_state_tran_str[DEV_ST_TRANSITION_MAX] 
= {
[DEV_ST_TRANSITION_READY] = "READY",
[DEV_ST_TRANSITION_SBL] = "SBL",
[DEV_ST_TRANSITION_MISSION_MODE] = "MISSION_MODE",
+   [DEV_ST_TRANSITION_FP] = "FP",
[DEV_ST_TRANSITION_SYS_ERR] = "SYS_ERR",
[DEV_ST_TRANSITION_DISABLE] = "DISABLE",
 };
diff --git a/drivers/bus/mhi/core/internal.h b/drivers/bus/mhi/core/internal.h
index 4abf0cf..6ae897a 100644
--- a/drivers/bus/mhi/core/internal.h
+++ b/drivers/bus/mhi/core/internal.h
@@ -386,6 +386,7 @@ enum dev_st_transition {
DEV_ST_TRANSITION_READY,
DEV_ST_TRANSITION_SBL,
DEV_ST_TRANSITION_MISSION_MODE,
+   DEV_ST_TRANSITION_FP,
DEV_ST_TRANSITION_SYS_ERR,
DEV_ST_TRANSITION_DISABLE,
DEV_ST_TRANSITION_MAX,
diff --git a/drivers/bus/mhi/core/main.c b/drivers/bus/mhi/core/main.c
index 3950792..e307b58 100644
--- a/drivers/bus/mhi/core/main.c
+++ b/drivers/bus/mhi/core/main.c
@@ -782,6 +782,9 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller 
*mhi_cntrl,
case MHI_EE_SBL:
st = DEV_ST_TRANSITION_SBL;
break;
+   case MHI_EE_FP:
+   st = DEV_ST_TRANSITION_FP;
+   break;
case MHI_EE_WFW:
case MHI_EE_AMSS:
st = DEV_ST_TRANSITION_MISSION_MODE;
diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c
index 3de7b16..3c95a5d 100644
--- a/drivers/bus/mhi/core/pm.c
+++ b/drivers/bus/mhi/core/pm.c
@@ -563,7 +563,15 @@ static void mhi_pm_disable_transition(struct 
mhi_controller *mhi_cntrl,
}
 
if (cur_state == MHI_PM_SYS_ERR_PROCESS) {
-   mhi_ready_state_transition(mhi_cntrl);
+   if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL
+   && mhi_get_mhi_state(mhi_cntrl) == MHI_STATE_RESET) {
+   write_lock_irq(_cntrl->pm_lock);
+   cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_POR);
+   write_unlock_irq(_cntrl->pm_lock);
+   mhi_queue_state_transition(mhi_cntrl, 
DEV_ST_TRANSITION_PBL);
+   } else {
+   mhi_ready_state_transition(mhi_cntrl);
+   }
} else {
/* Move to disable state */
write_lock_irq(_cntrl->pm_lock);
@@ -658,6 +666,12 @@ void mhi_pm_st_worker(struct work_struct *work)
case DEV_ST_TRANSITION_MISSION_MODE:
mhi_pm_mission_mode_transition(mhi_cntrl);
break;
+   case DEV_ST_TRANSITION_FP:
+   write_lock_irq(_cntrl->pm_lock);
+   mhi_cntrl->ee = MHI_EE_FP;
+   write_unlock_irq(_cntrl->pm_lock);
+   mhi_create_devices(mhi_cntrl);
+   break;
case DEV_ST_TRANSITION_READY:
mhi_ready_state_transition(mhi_cntrl);
break;
diff --git