int q6usm_open_write(struct us_client *usc, uint32_t format) { int rc = 0; uint32_t int_format = INVALID_FORMAT; struct usm_stream_cmd_open_write open; pr_debug("%s: session[%d]", __func__, usc->session); if ((usc == NULL) || (usc->apr == NULL)) { pr_err("%s: APR handle NULL\n", __func__); return -EINVAL; } q6usm_add_hdr(usc, &open.hdr, sizeof(open), true); open.hdr.opcode = USM_STREAM_CMD_OPEN_WRITE; int_format = q6usm_ext2int_format(format); if (int_format == INVALID_FORMAT) { pr_err("%s: wrong format[%d]", __func__, format); return -EINVAL; } open.format = int_format; rc = apr_send_pkt(usc->apr, (uint32_t *) &open); if (rc < 0) { pr_err("%s:open failed op[0x%x]rc[%d]\n", \ __func__, open.hdr.opcode, rc); goto fail_cmd; } rc = wait_event_timeout(usc->cmd_wait, (atomic_read(&usc->cmd_state) == 0), Q6USM_TIMEOUT_JIFFIES); if (!rc) { rc = -ETIME; pr_err("%s:timeout. waited for OPEN_WRITR rc[%d]\n", __func__, rc); goto fail_cmd; } else rc = 0; fail_cmd: return rc; }
int q6usm_get_us_stream_param(int dir, struct us_client *usc, uint32_t module_id, uint32_t param_id, uint32_t buf_size) { int rc = 0; struct usm_stream_cmd_get_param cmd_get_param; struct us_port_data *port = NULL; if ((usc == NULL) || (usc->apr == NULL)) { pr_err("%s: APR handle NULL\n", __func__); return -EINVAL; } port = &usc->port[dir]; q6usm_add_hdr(usc, &cmd_get_param.hdr, (sizeof(cmd_get_param) - APR_HDR_SIZE), true); cmd_get_param.hdr.opcode = USM_STREAM_CMD_GET_PARAM; cmd_get_param.buf_size = buf_size; cmd_get_param.buf_addr_msw = upper_32_bits(port->param_phys); cmd_get_param.buf_addr_lsw = lower_32_bits(port->param_phys); cmd_get_param.mem_map_handle = *((uint32_t *)(port->param_buf_mem_handle)); cmd_get_param.module_id = module_id; cmd_get_param.param_id = param_id; cmd_get_param.hdr.token = 0; rc = apr_send_pkt(usc->apr, (uint32_t *) &cmd_get_param); if (rc < 0) { pr_err("%s:write op[0x%x];rc[%d]\n", __func__, cmd_get_param.hdr.opcode, rc); } rc = wait_event_timeout(usc->cmd_wait, (atomic_read(&usc->cmd_state) == 0), Q6USM_TIMEOUT_JIFFIES); if (!rc) { rc = -ETIME; pr_err("%s: CMD_GET_PARAM: timeout=%d\n", __func__, Q6USM_TIMEOUT_JIFFIES); } else rc = 0; return rc; }
int q6usm_open_read(struct us_client *usc, uint32_t format) { uint32_t int_format = INVALID_FORMAT; int rc = 0x00; struct usm_stream_cmd_open_read open; pr_debug("%s: session[%d]", __func__, usc->session); if ((usc == NULL) || (usc->apr == NULL)) { pr_err("%s: client or its apr is NULL\n", __func__); return -EINVAL; } q6usm_add_hdr(usc, &open.hdr, sizeof(open), true); open.hdr.opcode = USM_STREAM_CMD_OPEN_READ; open.src_endpoint = 0; open.pre_proc_top = 0; int_format = q6usm_ext2int_format(format); if (int_format == INVALID_FORMAT) return -EINVAL; open.uMode = STREAM_PRIORITY_NORMAL; open.format = int_format; rc = apr_send_pkt(usc->apr, (uint32_t *) &open); if (rc < 0) { pr_err("%s: open failed op[0x%x]rc[%d]\n", __func__, open.hdr.opcode, rc); goto fail_cmd; } rc = wait_event_timeout(usc->cmd_wait, (atomic_read(&usc->cmd_state) == 0), Q6USM_TIMEOUT_JIFFIES); if (!rc) { rc = -ETIME; pr_err("%s: timeout, waited for OPEN_READ rc[%d]\n", __func__, rc); goto fail_cmd; } else rc = 0; fail_cmd: return rc; }
int q6usm_cmd(struct us_client *usc, int cmd) { struct apr_hdr hdr; int rc = 0; atomic_t *state; if ((usc == NULL) || (usc->apr == NULL)) { pr_err("%s: APR handle NULL\n", __func__); return -EINVAL; } q6usm_add_hdr(usc, &hdr, (sizeof(hdr) - APR_HDR_SIZE), true); switch (cmd) { case CMD_CLOSE: hdr.opcode = USM_STREAM_CMD_CLOSE; state = &usc->cmd_state; break; default: pr_err("%s:Invalid format[%d]\n", __func__, cmd); goto fail_cmd; } pr_debug("%s:session[%d]opcode[0x%x] ", __func__, usc->session, hdr.opcode); rc = apr_send_pkt(usc->apr, (uint32_t *) &hdr); if (rc < 0) { pr_err("%s: Command 0x%x failed\n", __func__, hdr.opcode); goto fail_cmd; } rc = wait_event_timeout(usc->cmd_wait, (atomic_read(state) == 0), Q6USM_TIMEOUT_JIFFIES); if (!rc) { rc = -ETIME; pr_err("%s:timeout. waited for response opcode[0x%x]\n", __func__, hdr.opcode); } else rc = 0; fail_cmd: return rc; }
int q6usm_set_us_detection(struct us_client *usc, struct usm_session_cmd_detect_info *detect_info, uint16_t detect_info_size) { int rc = 0; if ((usc == NULL) || (detect_info_size == 0) || (detect_info == NULL)) { pr_err("%s: wrong input: usc=0x%p, inf_size=%d; info=0x%p", __func__, usc, detect_info_size, detect_info); return -EINVAL; } q6usm_add_hdr(usc, &detect_info->hdr, detect_info_size - APR_HDR_SIZE, true); detect_info->hdr.opcode = USM_SESSION_CMD_SIGNAL_DETECT_MODE; rc = apr_send_pkt(usc->apr, (uint32_t *)detect_info); if (rc < 0) { pr_err("%s:Comamnd signal detect failed\n", __func__); return -EINVAL; } rc = wait_event_timeout(usc->cmd_wait, (atomic_read(&usc->cmd_state) == 0), Q6USM_TIMEOUT_JIFFIES); if (!rc) { rc = -ETIME; pr_err("%s: CMD_SIGNAL_DETECT_MODE: timeout=%d\n", __func__, Q6USM_TIMEOUT_JIFFIES); } else rc = 0; return rc; }
int q6usm_run(struct us_client *usc, uint32_t flags, uint32_t msw_ts, uint32_t lsw_ts) { struct usm_stream_cmd_run run; int rc = 0; if ((usc == NULL) || (usc->apr == NULL)) { pr_err("%s: APR handle NULL\n", __func__); return -EINVAL; } q6usm_add_hdr(usc, &run.hdr, sizeof(run), true); run.hdr.opcode = USM_SESSION_CMD_RUN; run.flags = flags; run.msw_ts = msw_ts; run.lsw_ts = lsw_ts; rc = apr_send_pkt(usc->apr, (uint32_t *) &run); if (rc < 0) { pr_err("%s: Commmand run failed[%d]\n", __func__, rc); goto fail_cmd; } rc = wait_event_timeout(usc->cmd_wait, (atomic_read(&usc->cmd_state) == 0), Q6USM_TIMEOUT_JIFFIES); if (!rc) { rc = -ETIME; pr_err("%s: timeout. waited for run success rc[%d]\n", __func__, rc); } else rc = 0; fail_cmd: return rc; }
int q6usm_read(struct us_client *usc, uint32_t read_ind) { struct usm_stream_cmd_read read; struct us_port_data *port = NULL; int rc = 0; u32 read_counter = 0; u32 loop_ind = 0; if ((usc == NULL) || (usc->apr == NULL)) { pr_err("%s: APR handle NULL\n", __func__); return -EINVAL; } port = &usc->port[OUT]; if (read_ind > port->buf_cnt) { pr_err("%s: wrong read_ind[%d]\n", __func__, read_ind); return -EINVAL; } if (read_ind == port->cpu_buf) { pr_err("%s: no free region\n", __func__); return 0; } if (read_ind > port->cpu_buf) { read_counter = read_ind - port->cpu_buf; } else { read_counter = (port->buf_cnt - port->cpu_buf) + read_ind; } q6usm_add_hdr(usc, &read.hdr, (sizeof(read) - APR_HDR_SIZE), false); read.hdr.opcode = USM_DATA_CMD_READ; read.buf_size = port->buf_size; for (loop_ind = 0; loop_ind < read_counter; ++loop_ind) { u32 temp_cpu_buf = port->cpu_buf; read.buf_add = (uint32_t)(port->phys) + port->buf_size * (port->cpu_buf); read.uid = port->cpu_buf; read.hdr.token = port->cpu_buf; read.counter = 1; ++(port->cpu_buf); if (port->cpu_buf == port->buf_cnt) port->cpu_buf = 0; rc = apr_send_pkt(usc->apr, (uint32_t *) &read); if (rc < 0) { port->cpu_buf = temp_cpu_buf; pr_err("%s:read op[0x%x]rc[%d]\n", __func__, read.hdr.opcode, rc); break; } else rc = 0; } return rc; }
int q6usm_dec_cfg_blk(struct us_client *usc, struct us_encdec_cfg *us_cfg) { uint32_t int_format = INVALID_FORMAT; struct usm_stream_media_format_update dec_cfg_obj; struct usm_stream_media_format_update *dec_cfg = &dec_cfg_obj; int rc = 0; uint32_t total_cfg_size = sizeof(struct usm_stream_media_format_update); uint32_t round_params_size = 0; uint8_t is_allocated = 0; if ((usc == NULL) || (us_cfg == NULL)) { pr_err("%s: wrong input", __func__); return -EINVAL; } int_format = q6usm_ext2int_format(us_cfg->format_id); if (int_format == INVALID_FORMAT) { pr_err("%s: wrong input format[%d]", __func__, us_cfg->format_id); return -EINVAL; } round_params_size = ((us_cfg->params_size + 3)/4) * 4; if (round_params_size > USM_MAX_CFG_DATA_SIZE) { round_params_size -= USM_MAX_CFG_DATA_SIZE; total_cfg_size += round_params_size; dec_cfg = kzalloc(total_cfg_size, GFP_KERNEL); if (dec_cfg == NULL) { pr_err("%s:dec_cfg[%d] allocation failed\n", __func__, total_cfg_size); return -ENOMEM; } is_allocated = 1; } else { round_params_size = 0; } q6usm_add_hdr(usc, &dec_cfg->hdr, total_cfg_size - APR_HDR_SIZE, true); dec_cfg->hdr.opcode = USM_DATA_CMD_MEDIA_FORMAT_UPDATE; dec_cfg->format_id = int_format; dec_cfg->cfg_size = sizeof(struct usm_cfg_common) + USM_MAX_CFG_DATA_SIZE + round_params_size; memcpy(&(dec_cfg->cfg_common), &(us_cfg->cfg_common), sizeof(struct usm_cfg_common)); memcpy(dec_cfg->transp_data, us_cfg->params, us_cfg->params_size); pr_debug("%s: cfg_size[%d], params_size[%d]; parambytes[%d,%d,%d,%d]\n", __func__, dec_cfg->cfg_size, us_cfg->params_size, dec_cfg->transp_data[0], dec_cfg->transp_data[1], dec_cfg->transp_data[2], dec_cfg->transp_data[3] ); rc = apr_send_pkt(usc->apr, (uint32_t *) dec_cfg); if (rc < 0) { pr_err("%s:Comamnd open failed\n", __func__); rc = -EINVAL; goto fail_cmd; } rc = wait_event_timeout(usc->cmd_wait, (atomic_read(&usc->cmd_state) == 0), Q6USM_TIMEOUT_JIFFIES); if (!rc) { rc = -ETIME; pr_err("%s: timeout opcode[0x%x]\n", __func__, dec_cfg->hdr.opcode); } else rc = 0; fail_cmd: if (is_allocated == 1) kfree(dec_cfg); return rc; }
int q6usm_enc_cfg_blk(struct us_client *usc, struct us_encdec_cfg* us_cfg) { uint32_t int_format = INVALID_FORMAT; struct usm_stream_cmd_encdec_cfg_blk enc_cfg_obj; struct usm_stream_cmd_encdec_cfg_blk *enc_cfg = &enc_cfg_obj; int rc = 0; uint32_t total_cfg_size = sizeof(struct usm_stream_cmd_encdec_cfg_blk); uint32_t round_params_size = 0; uint8_t is_allocated = 0; if ((usc == NULL) || (us_cfg == NULL)) { pr_err("%s: wrong input", __func__); return -EINVAL; } int_format = q6usm_ext2int_format(us_cfg->format_id); if (int_format == INVALID_FORMAT) { pr_err("%s: wrong input format[%d]", __func__, us_cfg->format_id); return -EINVAL; } round_params_size = ((us_cfg->params_size + 3)/4) * 4; if (round_params_size > USM_MAX_CFG_DATA_SIZE) { round_params_size -= USM_MAX_CFG_DATA_SIZE; total_cfg_size += round_params_size; enc_cfg = kzalloc(total_cfg_size, GFP_KERNEL); if (enc_cfg == NULL) { pr_err("%s: enc_cfg[%d] allocation failed\n", __func__, total_cfg_size); return -ENOMEM; } is_allocated = 1; } else round_params_size = 0; q6usm_add_hdr(usc, &enc_cfg->hdr, total_cfg_size - APR_HDR_SIZE, true); enc_cfg->hdr.opcode = USM_STREAM_CMD_SET_ENC_PARAM; enc_cfg->param_id = USM_PARAM_ID_ENCDEC_ENC_CFG_BLK; enc_cfg->param_size = sizeof(struct usm_encode_cfg_blk)+ round_params_size; enc_cfg->enc_blk.frames_per_buf = 1; enc_cfg->enc_blk.format_id = int_format; enc_cfg->enc_blk.cfg_size = sizeof(struct usm_cfg_common)+ USM_MAX_CFG_DATA_SIZE + round_params_size; memcpy(&(enc_cfg->enc_blk.cfg_common), &(us_cfg->cfg_common), sizeof(struct usm_cfg_common)); memcpy(enc_cfg->enc_blk.transp_data, us_cfg->params, us_cfg->params_size); pr_debug("%s: cfg_size[%d], params_size[%d]\n", __func__, enc_cfg->enc_blk.cfg_size, us_cfg->params_size); pr_debug("%s: params[%d,%d,%d,%d, %d,%d,%d,%d]\n", __func__, enc_cfg->enc_blk.transp_data[0], enc_cfg->enc_blk.transp_data[1], enc_cfg->enc_blk.transp_data[2], enc_cfg->enc_blk.transp_data[3], enc_cfg->enc_blk.transp_data[4], enc_cfg->enc_blk.transp_data[5], enc_cfg->enc_blk.transp_data[6], enc_cfg->enc_blk.transp_data[7] ); pr_debug("%s: srate:%d, ch=%d, bps= %d; dmap:0x%x; dev_id=0x%x\n", __func__, enc_cfg->enc_blk.cfg_common.sample_rate, enc_cfg->enc_blk.cfg_common.ch_cfg, enc_cfg->enc_blk.cfg_common.bits_per_sample, enc_cfg->enc_blk.cfg_common.data_map, enc_cfg->enc_blk.cfg_common.dev_id); rc = apr_send_pkt(usc->apr, (uint32_t *) enc_cfg); if (rc < 0) { pr_err("%s:Comamnd open failed\n", __func__); rc = -EINVAL; goto fail_cmd; } rc = wait_event_timeout(usc->cmd_wait, (atomic_read(&usc->cmd_state) == 0), Q6USM_TIMEOUT_JIFFIES); if (!rc) { rc = -ETIME; pr_err("%s: timeout opcode[0x%x]\n", __func__, enc_cfg->hdr.opcode); } else rc = 0; fail_cmd: if (is_allocated == 1) kfree(enc_cfg); return rc; }
int q6usm_write(struct us_client *usc, uint32_t write_ind) { int rc = 0; struct usm_stream_cmd_write cmd_write; struct us_port_data *port = NULL; u32 current_dsp_buf = 0; if ((usc == NULL) || (usc->apr == NULL)) { pr_err("%s: APR handle NULL\n", __func__); return -EINVAL; } port = &usc->port[IN]; current_dsp_buf = port->dsp_buf; if (port->cpu_buf >= current_dsp_buf) { if ((write_ind <= port->cpu_buf) && (write_ind > current_dsp_buf)) { pr_err("%s: wrong w_ind[%d]; d_buf=%d; c_buf=%d\n", __func__, write_ind, current_dsp_buf, port->cpu_buf); return -EINVAL; } } else { if ((write_ind <= port->cpu_buf) || (write_ind > current_dsp_buf)) { pr_err("%s: wrong w_ind[%d]; d_buf=%d; c_buf=%d\n", __func__, write_ind, current_dsp_buf, port->cpu_buf); return -EINVAL; } } q6usm_add_hdr(usc, &cmd_write.hdr, (sizeof(cmd_write) - APR_HDR_SIZE), false); cmd_write.hdr.opcode = USM_DATA_CMD_WRITE; cmd_write.buf_size = port->buf_size; while (port->cpu_buf != write_ind) { u32 temp_cpu_buf = port->cpu_buf; cmd_write.buf_add = (uint32_t)(port->phys) + port->buf_size * (port->cpu_buf); cmd_write.uid = port->cpu_buf; cmd_write.hdr.token = port->cpu_buf; pr_debug("%s:buf addr[0x%x] size[%d] token[%d] uid[%d]\n", __func__, cmd_write.buf_add, cmd_write.buf_size, cmd_write.hdr.token, cmd_write.uid); pr_debug("%s: data=0x%p\n", __func__, port->data); ++(port->cpu_buf); if (port->cpu_buf == port->buf_cnt) port->cpu_buf = 0; rc = apr_send_pkt(usc->apr, (uint32_t *) &cmd_write); if (rc < 0) { port->cpu_buf = temp_cpu_buf; pr_err("%s:write op[0x%x];rc[%d];cpu_buf[%d]\n", __func__, cmd_write.hdr.opcode, rc, port->cpu_buf); break; } rc = 0; } pr_debug("%s:exit: rc=%d; write_ind=%d; cpu_buf=%d; dsp_buf=%d\n", __func__, rc, write_ind, port->cpu_buf, port->dsp_buf); return rc; }
int q6usm_write(struct us_client *usc, uint32_t write_ind) { int rc = 0; struct usm_stream_cmd_write cmd_write; struct us_port_data *port = NULL; u32 current_dsp_buf = 0; if ((usc == NULL) || (usc->apr == NULL)) { pr_err("%s: APR handle NULL\n", __func__); return -EINVAL; } port = &usc->port[IN]; current_dsp_buf = port->dsp_buf; /* free region, caused by new dsp_buf report from DSP, */ /* can be only extended */ if (port->cpu_buf >= current_dsp_buf) { /* 2 -part free region, including empty buffer */ if ((write_ind <= port->cpu_buf) && (write_ind > current_dsp_buf)) { pr_err("%s: wrong w_ind[%d]; d_buf=%d; c_buf=%d\n", __func__, write_ind, current_dsp_buf, port->cpu_buf); return -EINVAL; } } else { /* 1 -part free region */ if ((write_ind <= port->cpu_buf) || (write_ind > current_dsp_buf)) { pr_err("%s: wrong w_ind[%d]; d_buf=%d; c_buf=%d\n", __func__, write_ind, current_dsp_buf, port->cpu_buf); return -EINVAL; } } q6usm_add_hdr(usc, &cmd_write.hdr, (sizeof(cmd_write) - APR_HDR_SIZE), false); cmd_write.hdr.opcode = USM_DATA_CMD_WRITE; cmd_write.buf_size = port->buf_size; while (port->cpu_buf != write_ind) { u32 temp_cpu_buf = port->cpu_buf; cmd_write.buf_add = (uint32_t)(port->phys) + port->buf_size * (port->cpu_buf); cmd_write.uid = port->cpu_buf; cmd_write.hdr.token = port->cpu_buf; ++(port->cpu_buf); if (port->cpu_buf == port->buf_cnt) port->cpu_buf = 0; rc = apr_send_pkt(usc->apr, (uint32_t *) &cmd_write); if (rc < 0) { port->cpu_buf = temp_cpu_buf; pr_err("%s:write op[0x%x];rc[%d];cpu_buf[%d]\n", __func__, cmd_write.hdr.opcode, rc, port->cpu_buf); break; } rc = 0; } return rc; }
int q6usm_write(struct us_client *usc, uint32_t write_ind) { int rc = 0; struct usm_stream_cmd_write cmd_write; struct us_port_data *port = NULL; u32 current_dsp_buf = 0; if ((usc == NULL) || (usc->apr == NULL)) { pr_err("%s: APR handle NULL\n", __func__); return -EINVAL; } port = &usc->port[IN]; current_dsp_buf = port->dsp_buf; /* */ /* */ if (port->cpu_buf >= current_dsp_buf) { /* */ if ((write_ind <= port->cpu_buf) && (write_ind > current_dsp_buf)) { pr_err("%s: wrong w_ind[%d]; d_buf=%d; c_buf=%d\n", __func__, write_ind, current_dsp_buf, port->cpu_buf); return -EINVAL; } } else { /* */ if ((write_ind <= port->cpu_buf) || (write_ind > current_dsp_buf)) { pr_err("%s: wrong w_ind[%d]; d_buf=%d; c_buf=%d\n", __func__, write_ind, current_dsp_buf, port->cpu_buf); return -EINVAL; } } q6usm_add_hdr(usc, &cmd_write.hdr, (sizeof(cmd_write) - APR_HDR_SIZE), false); cmd_write.hdr.opcode = USM_DATA_CMD_WRITE; cmd_write.buf_size = port->buf_size; cmd_write.buf_addr_msw = 0; cmd_write.mem_map_handle = *((uint32_t *)(port->ext)); cmd_write.res0 = 0; cmd_write.res1 = 0; cmd_write.res2 = 0; while (port->cpu_buf != write_ind) { u32 temp_cpu_buf = port->cpu_buf; cmd_write.buf_addr_lsw = (uint32_t)(port->phys) + port->buf_size * (port->cpu_buf); cmd_write.seq_id = port->cpu_buf; cmd_write.hdr.token = port->cpu_buf; ++(port->cpu_buf); if (port->cpu_buf == port->buf_cnt) port->cpu_buf = 0; rc = apr_send_pkt(usc->apr, (uint32_t *) &cmd_write); if (rc < 0) { port->cpu_buf = temp_cpu_buf; pr_err("%s:write op[0x%x];rc[%d];cpu_buf[%d]\n", __func__, cmd_write.hdr.opcode, rc, port->cpu_buf); break; } rc = 0; } return rc; }