/***************************************************************************** 函 数 名 : hifi_dsp_sync_cmd 功能描述 : Hifi MISC IOCTL同步命令处理函数 输入参数 : unsigned long arg : ioctl的入参 输出参数 : 无 返 回 值 : 成功:OK 失败:BUSY 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年3月18日 作 者 : 石旺来 00212991 修改内容 : 新生成函数 *****************************************************************************/ static int hifi_dsp_sync_cmd(unsigned long arg) { int ret = OK; struct misc_io_sync_param param; void *para_krn_in = NULL; unsigned int para_krn_size_in = 0; HIFI_CHN_CMD *cmd_para = NULL; void* para_addr_in = NULL; void* para_addr_out = NULL; struct recv_request *recv = NULL; IN_FUNCTION; if (copy_from_user(¶m,(void*) arg, sizeof(struct misc_io_sync_param))) { loge("copy_from_user fail.\n"); ret = ERROR; goto END; } logd("para_size_in=%d.\n", param.para_size_in); para_addr_in = INT_TO_ADDR(param.para_in_l ,param.para_in_h); para_addr_out = INT_TO_ADDR(param.para_out_l,param.para_out_h); /*获取arg入参*/ ret = hifi_dsp_get_input_param(param.para_size_in, para_addr_in, ¶_krn_size_in, ¶_krn_in); if (OK != ret) { loge("hifi_dsp_get_input_param fail: ret=%d.\n", ret); goto END; } /* add cmd id and sn */ cmd_para = (HIFI_CHN_CMD *)(para_krn_in+para_krn_size_in-SIZE_CMD_ID); cmd_para->cmd_type = HIFI_CHN_SYNC_CMD; cmd_para->sn = s_misc_data.sn; /*邮箱发送至HIFI, 同步*/ ret = hifi_misc_sync_write(para_krn_in, para_krn_size_in); if (OK != ret) { loge("hifi_misc_sync_write ret=%d.\n", ret); goto END; } /*将获得的rev_msg信息填充到出参arg*/ spin_lock_bh(&s_misc_data.recv_sync_lock); if (!list_empty(&recv_sync_work_queue_head)) { recv = list_entry(recv_sync_work_queue_head.next, struct recv_request, recv_node); ret = hifi_dsp_get_output_param(recv->rev_msg.mail_buff_len- SIZE_CMD_ID, recv->rev_msg.mail_buff, ¶m.para_size_out, para_addr_out); if (OK != ret) { loge("get_out ret=%d.\n", ret); } list_del(&recv->recv_node); kfree(recv->rev_msg.mail_buff); kfree(recv); recv = NULL; }
int hifi_get_dmesg(unsigned long arg) { int ret = OK; struct misc_io_dump_buf_param dump_info; void * dump_info_user_buf = NULL; unsigned int len = (unsigned int)(*g_om_data.dsp_log_cur_addr) - (DRV_DSP_UART_TO_MEM + DRV_DSP_UART_TO_MEM_RESERVE_SIZE); if (len > (DRV_DSP_UART_TO_MEM_SIZE - DRV_DSP_UART_TO_MEM_RESERVE_SIZE)) { loge("len is larger: %d.\n", len); return 0; } if (copy_from_user(&dump_info, (void*)arg, sizeof(struct misc_io_dump_buf_param))) { loge("copy_from_user fail.\n"); return 0; } g_om_data.dsp_log_addr = (char*)ioremap_wc(DRV_DSP_UART_TO_MEM, DRV_DSP_UART_TO_MEM_SIZE); if (NULL == g_om_data.dsp_log_addr) { loge("dsp log ioremap_wc Error.\n"); return 0; } s_dsp_dump_info[0].data_addr = g_om_data.dsp_log_addr + DRV_DSP_UART_TO_MEM_RESERVE_SIZE; dump_info_user_buf = INT_TO_ADDR(dump_info.user_buf_l, dump_info.user_buf_h); logi("get msg: len:%d from:%p to:%p.\n", len, s_dsp_dump_info[0].data_addr, dump_info_user_buf); ret = copy_to_user(dump_info_user_buf, s_dsp_dump_info[0].data_addr, len); if (OK != ret) { loge("copy_to_user fail, ret is %d.\n", ret); len -= ret; } if (0 == dump_info.buf_size) { *g_om_data.dsp_log_cur_addr = DRV_DSP_UART_TO_MEM + DRV_DSP_UART_TO_MEM_RESERVE_SIZE; memset(s_dsp_dump_info[0].data_addr, 0, s_dsp_dump_info[0].data_len); } if(g_om_data.dsp_log_addr) { iounmap(g_om_data.dsp_log_addr); g_om_data.dsp_log_addr = NULL; } return (int)len; }
/***************************************************************************** 函 数 名 : hifi_dsp_async_cmd 功能描述 : Hifi MISC IOCTL异步命令处理函数 输入参数 : unsigned long arg : ioctl的入参 输出参数 : 无 返 回 值 : 成功:OK 失败:BUSY 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年3月18日 作 者 : 石旺来 00212991 修改内容 : 新生成函数 *****************************************************************************/ static int hifi_dsp_async_cmd(unsigned long arg) { int ret = OK; struct misc_io_async_param param; void *para_krn_in = NULL; unsigned int para_krn_size_in = 0; HIFI_CHN_CMD *cmd_para = NULL; void* para_addr_in = NULL; IN_FUNCTION; if (copy_from_user(¶m,(void*) arg, sizeof(struct misc_io_async_param))) { loge("copy_from_user fail.\n"); ret = ERROR; goto END; } para_addr_in = INT_TO_ADDR(param.para_in_l,param.para_in_h); /*获取arg入参*/ ret = hifi_dsp_get_input_param(param.para_size_in, para_addr_in, ¶_krn_size_in, ¶_krn_in); if (OK != ret) { loge("get ret=%d.\n", ret); goto END; } /* add cmd id and sn */ cmd_para = (HIFI_CHN_CMD *)(para_krn_in+para_krn_size_in-SIZE_CMD_ID); cmd_para->cmd_type = HIFI_CHN_SYNC_CMD; cmd_para->sn = ACPU_TO_HIFI_ASYNC_CMD; /*邮箱发送至HIFI, 异步*/ ret = hifi_misc_async_write(para_krn_in, para_krn_size_in); if (OK != ret) { loge("async_write ret=%d.\n", ret); goto END; } END: hifi_dsp_get_input_param_free(¶_krn_in); OUT_FUNCTION; return ret; }