int reset_md(void) { CCCI_BUFF_T sys_msg; char buf = 1; CCCI_MSG_INF("ctl", "send reset modem request message\n"); /* prevent another reset modem action from wdt timeout IRQ during modem reset */ atomic_inc(&md_reset_on_going); if(atomic_read(&md_reset_on_going)>1){ CCCI_MSG_INF("ctl", "One reset flow is on-going \n"); return CCCI_MD_IN_RESET; } if(md_boot_stage == MD_BOOT_STAGE_2){ lock_md_sleep(&buf, sizeof(char)); } /* v1.3 20120601: mask CCIF IRQ to prevent md_boot_stage from updating by CCIF ISR */ md_boot_stage = MD_BOOT_STAGE_0; //ccci_disable(); ccci_mask(); //CCCI_INIT_MAILBOX(&sys_msg, CCCI_SYS_MSG_RESET_MD); wake_lock_timeout(&trm_wake_lock, 10*HZ); CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_RESET); ccci_system_message(&sys_msg); // CCCI_DEBUG("wait.....\n"); // schedule_timeout_interruptible(5*HZ); // boot_md(); return CCCI_SUCCESS; }
static void md_boot_up_timeout_func(unsigned long data __always_unused) { CCCI_BUFF_T sys_msg; CCCI_MSG_INF("ctl", "Time out! Notify Deamon\n"); CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_BOOT_TIMEOUT); ccci_system_message(&sys_msg); }
int ccci_send_run_time_data(void) { int ret=0; CCCI_BUFF_T buff; /* Set runtime data and echo start-boot command */ CCCI_MSG_INF("ctl", "set modem runtime\n"); ret = set_md_runtime(); if (ret != 0) { CCCI_MSG_INF("ctl", "fail to set MODEM runtime data\n"); return ret; } //printk("echo MD_INIT_START_BOOT\n"); CCCI_INIT_MAILBOX(&buff, MD_INIT_START_BOOT); buff.reserved = MD_INIT_CHK_ID; ccci_before_modem_start_boot(); ret = ccci_write(CCCI_CONTROL_TX, &buff); if (ret != 0) { CCCI_MSG_INF("ctl", "fail to write CCCI_CONTROL_TX\n"); return ret; } CCCI_MSG_INF("ctl", "wait for NORMAL_BOOT_ID\n"); //if (end) end(); //Notes:after load dsp_rom, dsp will write data back to dsp region, so set protect region at last //start_emi_mpu_protect(); enable_emi_mpu_protection(ccci_smem_phy, ccci_smem_size); //mod_timer(&md_boot_up_check_timer, jiffies+5*HZ); mod_timer(&md_boot_up_check_timer, jiffies+10*HZ); return ret; }
int send_stop_md_request(void) { CCCI_BUFF_T sys_msg; char buf = 1; CCCI_MSG_INF("ctl", "send stop modem request message\n"); /* prevent another reset modem action from wdt timeout IRQ during modem reset */ atomic_inc(&md_reset_on_going); if(atomic_read(&md_reset_on_going)>1){ CCCI_MSG_INF("ctl", "One stop flow is on-going \n"); return CCCI_MD_IN_RESET; } if(md_boot_stage == MD_BOOT_STAGE_2){ lock_md_sleep(&buf, sizeof(char)); } /* mask CCIF IRQ to prevent md_boot_stage from updating by CCIF LISR */ md_boot_stage = MD_BOOT_STAGE_0; /* v1.4 20120618: mask CCIF IRQ to prevent md_boot_stage from updating by CCIF ISR */ //CCCI_MSG_INF("ctl", "stop request: mask ccci irq\n"); ccci_mask(); CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_STOP_MD_REQUEST); ccci_system_message(&sys_msg); return CCCI_SUCCESS; }
int send_start_md_request(void) { CCCI_BUFF_T sys_msg; CCCI_MSG_INF("ctl", "send start modem request message\n"); CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_START_MD_REQUEST); ccci_system_message(&sys_msg); return CCCI_SUCCESS; }
void ccci_exception_info_passed(void) { #if defined(__MODEM_CCCI_EXIST__)&& !defined(__MODEM_CARD__) CCCI_BUFF_T *buff; qbm_gpd *p_first_gpd, *p_last_gpd; kal_uint32 gpd_num; // ensure in the exception state if(INT_QueryExceptionStatus() == KAL_FALSE) return; //- Already init in ccci_exception_handshake //- ccci_init(CCCI_CONTROL_CHANNEL, ccci_except_ack); //- ccci_init(CCCI_CONTROL_CHANNEL_ACK, ccci_except_ack); buff = CCCIDEV_GET_QBM_DATAPTR(ccci_except_polling_gpd_tx); CCCI_INIT_MAILBOX(buff, CCMSG_ID_EXCEPTION_PASS); ccci_debug_add_seq(buff, CCCI_DEBUG_ASSERT_BIT); // add ccci seq QBM_DES_SET_DATALEN(ccci_except_polling_gpd_tx, sizeof(CCCI_BUFF_T)); QBM_DES_SET_DATALEN(ccci_except_polling_gpd_tx->p_data_tbd, sizeof(CCCI_BUFF_T)); qbm_cal_set_checksum((kal_uint8 *)ccci_except_polling_gpd_tx); qbm_cal_set_checksum((kal_uint8 *)ccci_except_polling_gpd_tx->p_data_tbd); QBM_CACHE_FLUSH(ccci_except_polling_gpd_tx, sizeof(qbm_gpd)); QBM_CACHE_FLUSH(ccci_except_polling_gpd_tx->p_data_tbd, sizeof(qbm_gpd)); QBM_CACHE_FLUSH(buff, sizeof(CCCI_BUFF_T)); // TODO:Need to revise the API, shall use exception API (after channle reset flow is done) #ifdef SWITCH_TO_EXCEPTION_IO p_first_gpd = p_last_gpd = ccci_except_polling_gpd_tx; ccci_except_set_gpd(CCCI_CONTROL_CHANNEL, p_first_gpd, p_last_gpd); gpd_num = 0; do{ ccci_except_hif_st(CCCI_CONTROL_CHANNEL); ccci_except_poll_gpd(CCCI_CONTROL_CHANNEL, (void **)&p_first_gpd, (void **)&p_last_gpd, &gpd_num); }while(0 == gpd_num); ex_set_step_logging(EX_AUTO_STEP); //0x46 CCCIDEV_RST_CCCI_COMM_GPD_LIST(p_first_gpd, p_last_gpd); #else ccci_exception_info_write_result = ccci_polling_io(CCCI_CONTROL_CHANNEL, ccci_except_polling_gpd_tx, KAL_TRUE); CCCIDEV_RST_CCCI_COMM_GPD_LIST(ccci_except_polling_gpd_tx, ccci_except_polling_gpd_tx); #endif ccci_exception_state = CCCI_EXPT_INFO_PASS_ST; #endif #if defined (__CCCI_FS_IT__) cccifs_it_case(); #endif }
static int boot_md(void) { int ret=0; //struct image_info *pImg_info=NULL; if (md_boot_stage != MD_BOOT_STAGE_0) { CCCI_MSG_INF("ctl", "MD has boot up!\n"); return 0; } CCCI_MSG("booting up MODEM: start to load firmware...\n"); if(is_first_boot) { //if((ret = ccci_load_firmware(pImg_info)) <0) { if((ret = ccci_load_firmware(LOAD_MD_DSP)) <0) { CCCI_MSG_INF("ctl", "load firmware fail, so modem boot fail!\n"); return ret; } else { //when load firmware successfully, no need to load it again when reset modem is_first_boot = 0; CCCI_MSG_INF("ctl", "load firmware successful!\n"); } } else { CCCI_MSG_INF("ctl", "modem&dsp firmware already exist, not load again!\n"); } ret = ccci_register(CCCI_CONTROL_TX, NULL, NULL); if (ret != 0 && ret != CCCI_IN_USE) { CCCI_MSG_INF("ctl", "fail to register CCCI_CONTROL_TX\n"); return ret; } ret = ccci_register(CCCI_CONTROL_RX, ccci_md_ctrl_cb, NULL); if (ret != 0 && ret != CCCI_IN_USE) { CCCI_MSG_INF("ctl", "fail to register CCCI_CONTROL_RX\n"); ccci_unregister(CCCI_CONTROL_TX); return ret; } ret = ccci_register(CCCI_SYSTEM_TX, NULL, NULL); if (ret != 0 && ret != CCCI_IN_USE) { CCCI_MSG_INF("ctl", "fail to register CCCI_SYSTEM_TX\n"); } /* step 1: ungate modem */ ungate_md(); /* step 2: get start-boot command from control channel */ CCCI_MSG_INF("ctl", "wait MD_INIT_START_BOOT\n"); #if 0 time_out = jiffies + 6*HZ; do { if (md_boot_stage == MD_BOOT_STAGE_1) { CCCI_MSG_INF("ctl", "received MD_INIT_START_BOOT\n"); break; } yield(); if(time_after(jiffies, time_out)){ CCCI_MSG_INF("ctl", "wait MD_INIT_START_BOOT time out, try to reboot MD again\n"); CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_RESET_RETRY); ccci_system_message(&sys_msg); return ret; } } while (1); /* step 3: set runtime data and echo start-boot command */ CCCI_MSG_INF("ctl", "set modem runtime\n"); ret = set_md_runtime(); if (ret != 0) { CCCI_MSG("fail to set MODEM runtime data\n"); return ret; } //printk("echo MD_INIT_START_BOOT\n"); CCCI_BUFF_T buff; CCCI_INIT_MAILBOX(&buff, MD_INIT_START_BOOT); buff.reserved = MD_INIT_CHK_ID; ccci_before_modem_start_boot(); ret = ccci_write(CCCI_CONTROL_TX, &buff); if (ret != 0) { CCCI_MSG("fail to write CCCI_CONTROL_TX\n"); return ret; } CCCI_MSG_INF("ctl", "wait for NORMAL_BOOT_ID\n"); //if (end) end(); //Notes:after load dsp_rom, dsp will write data back to dsp region, so set protect region at last start_emi_mpu_protect(); #endif return ret; }
void ccci_md_ctrl_cb(CCCI_BUFF_T *buff, void *private_data) { int ret; CCCI_BUFF_T sys_msg; if (CCCI_MAILBOX_ID(buff) == MD_INIT_START_BOOT && buff->reserved == MD_INIT_CHK_ID && md_boot_stage == MD_BOOT_STAGE_0) { del_timer(&md_boot_up_check_timer); CCCI_MSG_INF("ctl", "receive MD_INIT_START_BOOT\n"); md_boot_stage = MD_BOOT_STAGE_1; //power on Audsys for DSP boot up AudSys_Power_On(TRUE); CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_BOOT_UP); ccci_system_message(&sys_msg); } else if (CCCI_MAILBOX_ID(buff) == NORMAL_BOOT_ID && md_boot_stage == MD_BOOT_STAGE_1) { del_timer(&md_boot_up_check_timer); CCCI_MSG_INF("ctl", "receive NORMAL_BOOT_ID\n"); ccci_after_modem_finish_boot(); md_boot_stage = MD_BOOT_STAGE_2; //if (is_first_boot) // is_first_boot = 0; wakeup_md_is_safe = 1; md_call_chain(&md_notifier,CCCI_MD_BOOTUP); CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_BOOT_READY); ccci_system_message(&sys_msg); //power off Audsys after DSP boot up ready AudSys_Power_On(FALSE); } else if (CCCI_MAILBOX_ID(buff) == MD_EX) { del_timer(&md_boot_up_check_timer); if (unlikely(buff->reserved != MD_EX_CHK_ID)) CCCI_MSG_INF("ctl", "receive invalid MD_EX\n"); else { md_boot_stage = MD_BOOT_STAGE_EXCEPTION; md_ex_flag = 1; atomic_set(&md_ex, 1); mod_timer(&md_ex_monitor,jiffies+5*HZ); CCCI_MSG_INF("ctl", "receive MD_EX\n"); ret = ccci_write(CCCI_CONTROL_TX, buff); if (ret != 0) { CCCI_MSG_INF("ctl", "fail to write CCCI_CONTROL_TX\n"); } md_call_chain(&md_notifier,CCCI_MD_EXCEPTION); CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_EXCEPTION); ccci_system_message(&sys_msg); } } else if (CCCI_MAILBOX_ID(buff) == MD_EX_REC_OK) { if (unlikely(buff->reserved != MD_EX_REC_OK_CHK_ID)) CCCI_MSG_INF("ctl", "receive invalid MD_EX_REC_OK\n"); else { atomic_set(&md_ex_ok, 1); mod_timer(&md_ex_monitor,jiffies); } } else if (CCCI_MAILBOX_ID(buff) == MD_INIT_START_BOOT && buff->reserved == MD_INIT_CHK_ID && !is_first_boot) { /* reset state and notify the user process md_init */ md_boot_stage = MD_BOOT_STAGE_0; CCCI_MSG_INF("ctl", "MD second bootup detected!\n"); CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_RESET); ccci_system_message(&sys_msg); } else if (CCCI_MAILBOX_ID(buff) == MD_EX_RESUME_CHK_ID) { md_emi_check(buff); } else if (CCCI_MAILBOX_ID(buff) == CCCI_DRV_VER_ERROR) { CCCI_MSG_INF("ctl", "AP CCCI driver version mis-match to MD!!\n"); } else { CCCI_MSG_INF("ctl", "receive unknow data from CCCI_CONTROL_RX = %d\n", CCCI_MAILBOX_ID(buff)); } }
int ccci_reset_request(int handle) { int i; CCCI_BUFF_T sys_msg; bool reset_ready = true; if (handle >= NR_CCCI_RESET_USER) { CCCI_MSG_INF("ctl", "reset_request: invalid handle:%d \n", handle); return CCCI_INVALID_PARAM; } if (reset_sta[handle].is_allocate == 0) { CCCI_MSG_INF("ctl", "reset_request: handle(%d) not alloc: alloc=%d \n", handle, reset_sta[handle].is_allocate); return CCCI_INVALID_PARAM; } CCCI_MSG_INF("ctl", "%s (%d) call reset request \n",current->comm,handle); down(&ccci_reset_mutex); reset_sta[handle].is_allocate = 0; reset_sta[handle].is_reset = 1; CCCI_MSG_INF("ctl", "Dump not ready list++++\n"); for (i = 0; i < NR_CCCI_RESET_USER; i++) { if (reset_sta[i].is_allocate && (reset_sta[i].is_reset == 0)) { reset_ready = false; CCCI_MSG_INF("ctl", " ==> %s\n", reset_sta[i].name); } } CCCI_MSG_INF("ctl", "Dump not ready list----\n"); up(&ccci_reset_mutex); if (reset_ready == false) return CCCI_RESET_NOT_READY; #if 0 atomic_inc(&md_reset_on_going); if(atomic_read(&md_reset_on_going)>1){ CCCI_MSG_INF("ctl", "One reset flow is on-going.\n"); return; } /* if all register users are ready to reset, reset modem */ CCCI_MSG_INF("ctl", "Reset by %s(%d).\n",current->comm,handle); md_call_chain(&md_notifier,CCCI_MD_RESET); ccci_disable(); gate_md(); ccci_reset(); ccci_enable(); /* reset state and notify the user process md_init */ // md_boot_stage = MD_BOOT_STAGE_0; boot_md(); for (i = 0; i < NR_CCCI_RESET_USER; i++) { reset_sta[i].is_reset = 0; } atomic_set(&md_reset_on_going, 0); #endif CCCI_MSG_INF("ctl", "Reset MD by %s(%d) \n", current->comm, handle); CCCI_INIT_MAILBOX(&sys_msg, CCCI_MD_MSG_RESET_REQUEST); ccci_system_message(&sys_msg); return CCCI_SUCCESS; }