Lines Matching +full:data +full:- +full:out
1 // SPDX-License-Identifier: GPL-2.0
3 // tasdevice-fmw.c -- TASDEVICE firmware support
7 // Author: Shenghao Ding <shenghao-ding@ti.com>
44 /*should not include B0_P53_R44-R47 */
97 * receiver, games, audio-to-haptics, PMIC record, bypass mode, in tasdevice_add_config()
100 * ultrasonic application. In order to support these variable-numbers in tasdevice_add_config()
106 *status = -ENOMEM; in tasdevice_add_config()
107 goto out; in tasdevice_add_config()
110 if (tas_priv->rcabin.fw_hdr.binary_version_num >= 0x105) { in tasdevice_add_config()
112 *status = -EINVAL; in tasdevice_add_config()
113 dev_err(tas_priv->dev, "add conf: Out of boundary\n"); in tasdevice_add_config()
114 goto out; in tasdevice_add_config()
120 *status = -EINVAL; in tasdevice_add_config()
121 dev_err(tas_priv->dev, "add config: Out of boundary\n"); in tasdevice_add_config()
122 goto out; in tasdevice_add_config()
125 /* convert data[offset], data[offset + 1], data[offset + 2] and in tasdevice_add_config()
126 * data[offset + 3] into host in tasdevice_add_config()
128 cfg_info->nblocks = in tasdevice_add_config()
136 bk_da = cfg_info->blk_data = kcalloc(cfg_info->nblocks, in tasdevice_add_config()
139 *status = -ENOMEM; in tasdevice_add_config()
140 goto out; in tasdevice_add_config()
142 cfg_info->real_nblocks = 0; in tasdevice_add_config()
143 for (i = 0; i < cfg_info->nblocks; i++) { in tasdevice_add_config()
145 *status = -EINVAL; in tasdevice_add_config()
146 dev_err(tas_priv->dev, in tasdevice_add_config()
147 "%s: Out of boundary: i = %d nblocks = %u!\n", in tasdevice_add_config()
148 __func__, i, cfg_info->nblocks); in tasdevice_add_config()
153 *status = -ENOMEM; in tasdevice_add_config()
157 bk_da[i]->dev_idx = config_data[config_offset]; in tasdevice_add_config()
160 bk_da[i]->block_type = config_data[config_offset]; in tasdevice_add_config()
163 if (bk_da[i]->block_type == TASDEVICE_BIN_BLK_PRE_POWER_UP) { in tasdevice_add_config()
164 if (bk_da[i]->dev_idx == 0) in tasdevice_add_config()
165 cfg_info->active_dev = in tasdevice_add_config()
166 (1 << tas_priv->ndev) - 1; in tasdevice_add_config()
168 cfg_info->active_dev |= 1 << in tasdevice_add_config()
169 (bk_da[i]->dev_idx - 1); in tasdevice_add_config()
172 bk_da[i]->yram_checksum = in tasdevice_add_config()
175 bk_da[i]->block_size = in tasdevice_add_config()
179 bk_da[i]->n_subblks = in tasdevice_add_config()
184 if (config_offset + bk_da[i]->block_size > config_size) { in tasdevice_add_config()
185 *status = -EINVAL; in tasdevice_add_config()
186 dev_err(tas_priv->dev, in tasdevice_add_config()
187 "%s: Out of boundary: i = %d blks = %u!\n", in tasdevice_add_config()
188 __func__, i, cfg_info->nblocks); in tasdevice_add_config()
192 bk_da[i]->regdata = kmemdup(&config_data[config_offset], in tasdevice_add_config()
193 bk_da[i]->block_size, GFP_KERNEL); in tasdevice_add_config()
194 if (!bk_da[i]->regdata) { in tasdevice_add_config()
195 *status = -ENOMEM; in tasdevice_add_config()
196 goto out; in tasdevice_add_config()
199 config_offset += bk_da[i]->block_size; in tasdevice_add_config()
200 cfg_info->real_nblocks += 1; in tasdevice_add_config()
203 out: in tasdevice_add_config()
219 rca = &(tas_priv->rcabin); in tasdevice_rca_parser()
220 fw_hdr = &(rca->fw_hdr); in tasdevice_rca_parser()
221 if (!fmw || !fmw->data) { in tasdevice_rca_parser()
222 dev_err(tas_priv->dev, "Failed to read %s\n", in tasdevice_rca_parser()
223 tas_priv->rca_binaryname); in tasdevice_rca_parser()
224 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
225 ret = -EINVAL; in tasdevice_rca_parser()
226 goto out; in tasdevice_rca_parser()
228 buf = (unsigned char *)fmw->data; in tasdevice_rca_parser()
230 fw_hdr->img_sz = be32_to_cpup((__be32 *)&buf[offset]); in tasdevice_rca_parser()
232 if (fw_hdr->img_sz != fmw->size) { in tasdevice_rca_parser()
233 dev_err(tas_priv->dev, in tasdevice_rca_parser()
234 "File size not match, %d %u", (int)fmw->size, in tasdevice_rca_parser()
235 fw_hdr->img_sz); in tasdevice_rca_parser()
236 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
237 ret = -EINVAL; in tasdevice_rca_parser()
238 goto out; in tasdevice_rca_parser()
241 fw_hdr->checksum = be32_to_cpup((__be32 *)&buf[offset]); in tasdevice_rca_parser()
243 fw_hdr->binary_version_num = be32_to_cpup((__be32 *)&buf[offset]); in tasdevice_rca_parser()
244 if (fw_hdr->binary_version_num < 0x103) { in tasdevice_rca_parser()
245 dev_err(tas_priv->dev, "File version 0x%04x is too low", in tasdevice_rca_parser()
246 fw_hdr->binary_version_num); in tasdevice_rca_parser()
247 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
248 ret = -EINVAL; in tasdevice_rca_parser()
249 goto out; in tasdevice_rca_parser()
252 fw_hdr->drv_fw_version = be32_to_cpup((__be32 *)&buf[offset]); in tasdevice_rca_parser()
254 fw_hdr->plat_type = buf[offset]; in tasdevice_rca_parser()
256 fw_hdr->dev_family = buf[offset]; in tasdevice_rca_parser()
258 fw_hdr->reserve = buf[offset]; in tasdevice_rca_parser()
260 fw_hdr->ndev = buf[offset]; in tasdevice_rca_parser()
262 if (fw_hdr->ndev != tas_priv->ndev) { in tasdevice_rca_parser()
263 dev_err(tas_priv->dev, in tasdevice_rca_parser()
265 fw_hdr->ndev, tas_priv->ndev); in tasdevice_rca_parser()
266 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
267 ret = -EINVAL; in tasdevice_rca_parser()
268 goto out; in tasdevice_rca_parser()
270 if (offset + TASDEVICE_DEVICE_SUM > fw_hdr->img_sz) { in tasdevice_rca_parser()
271 dev_err(tas_priv->dev, "rca_ready: Out of boundary!\n"); in tasdevice_rca_parser()
272 ret = -EINVAL; in tasdevice_rca_parser()
273 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
274 goto out; in tasdevice_rca_parser()
278 fw_hdr->devs[i] = buf[offset]; in tasdevice_rca_parser()
280 fw_hdr->nconfig = be32_to_cpup((__be32 *)&buf[offset]); in tasdevice_rca_parser()
284 fw_hdr->config_size[i] = be32_to_cpup((__be32 *)&buf[offset]); in tasdevice_rca_parser()
286 total_config_sz += fw_hdr->config_size[i]; in tasdevice_rca_parser()
289 if (fw_hdr->img_sz - total_config_sz != (unsigned int)offset) { in tasdevice_rca_parser()
290 dev_err(tas_priv->dev, "Bin file error!\n"); in tasdevice_rca_parser()
291 ret = -EINVAL; in tasdevice_rca_parser()
292 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
293 goto out; in tasdevice_rca_parser()
296 cfg_info = kcalloc(fw_hdr->nconfig, sizeof(*cfg_info), GFP_KERNEL); in tasdevice_rca_parser()
298 ret = -ENOMEM; in tasdevice_rca_parser()
299 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
300 goto out; in tasdevice_rca_parser()
302 rca->cfg_info = cfg_info; in tasdevice_rca_parser()
303 rca->ncfgs = 0; in tasdevice_rca_parser()
304 for (i = 0; i < (int)fw_hdr->nconfig; i++) { in tasdevice_rca_parser()
305 rca->ncfgs += 1; in tasdevice_rca_parser()
307 fw_hdr->config_size[i], &ret); in tasdevice_rca_parser()
309 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
310 goto out; in tasdevice_rca_parser()
312 offset += (int)fw_hdr->config_size[i]; in tasdevice_rca_parser()
314 out: in tasdevice_rca_parser()
322 const unsigned char *data = fmw->data; in fw_parse_block_data_kernel() local
324 if (offset + 16 > fmw->size) { in fw_parse_block_data_kernel()
325 dev_err(tas_fmw->dev, "%s: File Size error\n", __func__); in fw_parse_block_data_kernel()
326 offset = -EINVAL; in fw_parse_block_data_kernel()
327 goto out; in fw_parse_block_data_kernel()
330 /* convert data[offset], data[offset + 1], data[offset + 2] and in fw_parse_block_data_kernel()
331 * data[offset + 3] into host in fw_parse_block_data_kernel()
333 block->type = be32_to_cpup((__be32 *)&data[offset]); in fw_parse_block_data_kernel()
336 block->is_pchksum_present = data[offset]; in fw_parse_block_data_kernel()
339 block->pchksum = data[offset]; in fw_parse_block_data_kernel()
342 block->is_ychksum_present = data[offset]; in fw_parse_block_data_kernel()
345 block->ychksum = data[offset]; in fw_parse_block_data_kernel()
348 block->blk_size = be32_to_cpup((__be32 *)&data[offset]); in fw_parse_block_data_kernel()
351 block->nr_subblocks = be32_to_cpup((__be32 *)&data[offset]); in fw_parse_block_data_kernel()
354 if (offset + block->blk_size > fmw->size) { in fw_parse_block_data_kernel()
355 dev_err(tas_fmw->dev, "%s: nSublocks error\n", __func__); in fw_parse_block_data_kernel()
356 offset = -EINVAL; in fw_parse_block_data_kernel()
357 goto out; in fw_parse_block_data_kernel()
360 block->data = kmemdup(&data[offset], block->blk_size, GFP_KERNEL); in fw_parse_block_data_kernel()
361 if (!block->data) { in fw_parse_block_data_kernel()
362 offset = -ENOMEM; in fw_parse_block_data_kernel()
363 goto out; in fw_parse_block_data_kernel()
365 offset += block->blk_size; in fw_parse_block_data_kernel()
367 out: in fw_parse_block_data_kernel()
375 const unsigned char *data = fmw->data; in fw_parse_data_kernel() local
379 if (offset + 4 > fmw->size) { in fw_parse_data_kernel()
380 dev_err(tas_fmw->dev, "%s: File Size error\n", __func__); in fw_parse_data_kernel()
381 offset = -EINVAL; in fw_parse_data_kernel()
382 goto out; in fw_parse_data_kernel()
384 img_data->nr_blk = be32_to_cpup((__be32 *)&data[offset]); in fw_parse_data_kernel()
387 img_data->dev_blks = kcalloc(img_data->nr_blk, in fw_parse_data_kernel()
389 if (!img_data->dev_blks) { in fw_parse_data_kernel()
390 offset = -ENOMEM; in fw_parse_data_kernel()
391 goto out; in fw_parse_data_kernel()
394 for (i = 0; i < img_data->nr_blk; i++) { in fw_parse_data_kernel()
395 blk = &(img_data->dev_blks[i]); in fw_parse_data_kernel()
398 offset = -EINVAL; in fw_parse_data_kernel()
403 out: in fw_parse_data_kernel()
414 for (i = 0; i < tas_fmw->nr_programs; i++) { in fw_parse_program_data_kernel()
415 program = &(tas_fmw->programs[i]); in fw_parse_program_data_kernel()
416 if (offset + 72 > fmw->size) { in fw_parse_program_data_kernel()
417 dev_err(tas_priv->dev, "%s: mpName error\n", __func__); in fw_parse_program_data_kernel()
418 offset = -EINVAL; in fw_parse_program_data_kernel()
419 goto out; in fw_parse_program_data_kernel()
424 offset = fw_parse_data_kernel(tas_fmw, &(program->dev_data), in fw_parse_program_data_kernel()
427 goto out; in fw_parse_program_data_kernel()
430 out: in fw_parse_program_data_kernel()
438 const unsigned char *data = fmw->data; in fw_parse_configuration_data_kernel() local
442 for (i = 0; i < tas_fmw->nr_configurations; i++) { in fw_parse_configuration_data_kernel()
443 config = &(tas_fmw->configs[i]); in fw_parse_configuration_data_kernel()
444 if (offset + 80 > fmw->size) { in fw_parse_configuration_data_kernel()
445 dev_err(tas_priv->dev, "%s: mpName error\n", __func__); in fw_parse_configuration_data_kernel()
446 offset = -EINVAL; in fw_parse_configuration_data_kernel()
447 goto out; in fw_parse_configuration_data_kernel()
449 memcpy(config->name, &data[offset], 64); in fw_parse_configuration_data_kernel()
453 offset = fw_parse_data_kernel(tas_fmw, &(config->dev_data), in fw_parse_configuration_data_kernel()
456 goto out; in fw_parse_configuration_data_kernel()
459 out: in fw_parse_configuration_data_kernel()
467 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in fw_parse_variable_header_kernel()
468 struct tasdevice_dspfw_hdr *fw_hdr = &(tas_fmw->fw_hdr); in fw_parse_variable_header_kernel()
471 const unsigned char *buf = fmw->data; in fw_parse_variable_header_kernel()
475 if (offset + 12 + 4 * TASDEVICE_MAXPROGRAM_NUM_KERNEL > fmw->size) { in fw_parse_variable_header_kernel()
476 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_variable_header_kernel()
477 offset = -EINVAL; in fw_parse_variable_header_kernel()
478 goto out; in fw_parse_variable_header_kernel()
480 fw_hdr->device_family = be16_to_cpup((__be16 *)&buf[offset]); in fw_parse_variable_header_kernel()
481 if (fw_hdr->device_family != 0) { in fw_parse_variable_header_kernel()
482 dev_err(tas_priv->dev, "%s:not TAS device\n", __func__); in fw_parse_variable_header_kernel()
483 offset = -EINVAL; in fw_parse_variable_header_kernel()
484 goto out; in fw_parse_variable_header_kernel()
487 fw_hdr->device = be16_to_cpup((__be16 *)&buf[offset]); in fw_parse_variable_header_kernel()
488 if (fw_hdr->device >= TASDEVICE_DSP_TAS_MAX_DEVICE || in fw_parse_variable_header_kernel()
489 fw_hdr->device == 6) { in fw_parse_variable_header_kernel()
490 dev_err(tas_priv->dev, "Unsupported dev %d\n", fw_hdr->device); in fw_parse_variable_header_kernel()
491 offset = -EINVAL; in fw_parse_variable_header_kernel()
492 goto out; in fw_parse_variable_header_kernel()
495 fw_hdr->ndev = deviceNumber[fw_hdr->device]; in fw_parse_variable_header_kernel()
497 if (fw_hdr->ndev != tas_priv->ndev) { in fw_parse_variable_header_kernel()
498 dev_err(tas_priv->dev, in fw_parse_variable_header_kernel()
500 __func__, fw_hdr->ndev, tas_priv->ndev); in fw_parse_variable_header_kernel()
501 offset = -EINVAL; in fw_parse_variable_header_kernel()
502 goto out; in fw_parse_variable_header_kernel()
505 tas_fmw->nr_programs = be32_to_cpup((__be32 *)&buf[offset]); in fw_parse_variable_header_kernel()
508 if (tas_fmw->nr_programs == 0 || tas_fmw->nr_programs > in fw_parse_variable_header_kernel()
510 dev_err(tas_priv->dev, "mnPrograms is invalid\n"); in fw_parse_variable_header_kernel()
511 offset = -EINVAL; in fw_parse_variable_header_kernel()
512 goto out; in fw_parse_variable_header_kernel()
515 tas_fmw->programs = kcalloc(tas_fmw->nr_programs, in fw_parse_variable_header_kernel()
517 if (!tas_fmw->programs) { in fw_parse_variable_header_kernel()
518 offset = -ENOMEM; in fw_parse_variable_header_kernel()
519 goto out; in fw_parse_variable_header_kernel()
522 for (i = 0; i < tas_fmw->nr_programs; i++) { in fw_parse_variable_header_kernel()
523 program = &(tas_fmw->programs[i]); in fw_parse_variable_header_kernel()
524 program->prog_size = be32_to_cpup((__be32 *)&buf[offset]); in fw_parse_variable_header_kernel()
529 offset += 4 * (TASDEVICE_MAXPROGRAM_NUM_KERNEL - tas_fmw->nr_programs); in fw_parse_variable_header_kernel()
531 tas_fmw->nr_configurations = be32_to_cpup((__be32 *)&buf[offset]); in fw_parse_variable_header_kernel()
538 max_confs = (fw_hdr->ndev >= 4) ? in fw_parse_variable_header_kernel()
541 if (tas_fmw->nr_configurations == 0 || in fw_parse_variable_header_kernel()
542 tas_fmw->nr_configurations > max_confs) { in fw_parse_variable_header_kernel()
543 dev_err(tas_priv->dev, "%s: Conf is invalid\n", __func__); in fw_parse_variable_header_kernel()
544 offset = -EINVAL; in fw_parse_variable_header_kernel()
545 goto out; in fw_parse_variable_header_kernel()
548 if (offset + 4 * max_confs > fmw->size) { in fw_parse_variable_header_kernel()
549 dev_err(tas_priv->dev, "%s: mpConfigurations err\n", __func__); in fw_parse_variable_header_kernel()
550 offset = -EINVAL; in fw_parse_variable_header_kernel()
551 goto out; in fw_parse_variable_header_kernel()
554 tas_fmw->configs = kcalloc(tas_fmw->nr_configurations, in fw_parse_variable_header_kernel()
556 if (!tas_fmw->configs) { in fw_parse_variable_header_kernel()
557 offset = -ENOMEM; in fw_parse_variable_header_kernel()
558 goto out; in fw_parse_variable_header_kernel()
561 for (i = 0; i < tas_fmw->nr_programs; i++) { in fw_parse_variable_header_kernel()
562 config = &(tas_fmw->configs[i]); in fw_parse_variable_header_kernel()
563 config->cfg_size = be32_to_cpup((__be32 *)&buf[offset]); in fw_parse_variable_header_kernel()
568 offset += 4 * (max_confs - tas_fmw->nr_programs); in fw_parse_variable_header_kernel()
570 out: in fw_parse_variable_header_kernel()
574 static int tasdevice_process_block(void *context, unsigned char *data, in tasdevice_process_block() argument
579 unsigned char subblk_typ = data[1]; in tasdevice_process_block()
585 chn = idx - 1; in tasdevice_process_block()
589 chnend = tas_priv->ndev; in tasdevice_process_block()
593 if (tas_priv->tasdevice[chn].is_loading == false) in tasdevice_process_block()
601 unsigned short len = be16_to_cpup((__be16 *)&data[2]); in tasdevice_process_block()
605 dev_err(tas_priv->dev, in tasdevice_process_block()
606 "process_block: Out of boundary\n"); in tasdevice_process_block()
613 TASDEVICE_REG(data[subblk_offset], in tasdevice_process_block()
614 data[subblk_offset + 1], in tasdevice_process_block()
615 data[subblk_offset + 2]), in tasdevice_process_block()
616 data[subblk_offset + 3]); in tasdevice_process_block()
619 dev_err(tas_priv->dev, in tasdevice_process_block()
627 unsigned short len = be16_to_cpup((__be16 *)&data[2]); in tasdevice_process_block()
631 dev_err(tas_priv->dev, in tasdevice_process_block()
632 "%s: BST Out of boundary\n", in tasdevice_process_block()
638 dev_err(tas_priv->dev, in tasdevice_process_block()
639 "%s:Bst-len(%u)not div by 4\n", in tasdevice_process_block()
645 TASDEVICE_REG(data[subblk_offset], in tasdevice_process_block()
646 data[subblk_offset + 1], in tasdevice_process_block()
647 data[subblk_offset + 2]), in tasdevice_process_block()
648 &(data[subblk_offset + 4]), len); in tasdevice_process_block()
651 dev_err(tas_priv->dev, in tasdevice_process_block()
662 dev_err(tas_priv->dev, in tasdevice_process_block()
663 "%s: delay Out of boundary\n", in tasdevice_process_block()
668 sleep_time = be16_to_cpup((__be16 *)&data[2]) * 1000; in tasdevice_process_block()
675 dev_err(tas_priv->dev, in tasdevice_process_block()
676 "%s: bit write Out of boundary\n", in tasdevice_process_block()
682 TASDEVICE_REG(data[subblk_offset + 2], in tasdevice_process_block()
683 data[subblk_offset + 3], in tasdevice_process_block()
684 data[subblk_offset + 4]), in tasdevice_process_block()
685 data[subblk_offset + 1], in tasdevice_process_block()
686 data[subblk_offset + 5]); in tasdevice_process_block()
689 dev_err(tas_priv->dev, in tasdevice_process_block()
700 tas_priv->tasdevice[chn].cur_prog = -1; in tasdevice_process_block()
701 tas_priv->tasdevice[chn].cur_conf = -1; in tasdevice_process_block()
703 tas_priv->tasdevice[chn].cur_conf = -1; in tasdevice_process_block()
714 struct tasdevice_rca *rca = &(tas_priv->rcabin); in tasdevice_select_cfg_blk()
715 struct tasdevice_config_info **cfg_info = rca->cfg_info; in tasdevice_select_cfg_blk()
719 if (conf_no >= rca->ncfgs || conf_no < 0 || !cfg_info) { in tasdevice_select_cfg_blk()
720 dev_err(tas_priv->dev, "conf_no should be not more than %u\n", in tasdevice_select_cfg_blk()
721 rca->ncfgs); in tasdevice_select_cfg_blk()
724 blk_data = cfg_info[conf_no]->blk_data; in tasdevice_select_cfg_blk()
726 for (j = 0; j < (int)cfg_info[conf_no]->real_nblocks; j++) { in tasdevice_select_cfg_blk()
730 dev_err(tas_priv->dev, in tasdevice_select_cfg_blk()
734 if (block_type != blk_data[j]->block_type) in tasdevice_select_cfg_blk()
737 for (k = 0; k < (int)blk_data[j]->n_subblks; k++) { in tasdevice_select_cfg_blk()
738 if (blk_data[j]->dev_idx) { in tasdevice_select_cfg_blk()
739 chn = blk_data[j]->dev_idx - 1; in tasdevice_select_cfg_blk()
740 chnend = blk_data[j]->dev_idx; in tasdevice_select_cfg_blk()
743 chnend = tas_priv->ndev; in tasdevice_select_cfg_blk()
746 tas_priv->tasdevice[chn].is_loading = true; in tasdevice_select_cfg_blk()
749 blk_data[j]->regdata + length, in tasdevice_select_cfg_blk()
750 blk_data[j]->dev_idx, in tasdevice_select_cfg_blk()
751 blk_data[j]->block_size - length); in tasdevice_select_cfg_blk()
753 if (blk_data[j]->block_size < length) { in tasdevice_select_cfg_blk()
754 dev_err(tas_priv->dev, in tasdevice_select_cfg_blk()
755 "%s: %u %u out of boundary\n", in tasdevice_select_cfg_blk()
757 blk_data[j]->block_size); in tasdevice_select_cfg_blk()
761 if (length != blk_data[j]->block_size) in tasdevice_select_cfg_blk()
762 dev_err(tas_priv->dev, "%s: %u %u size is not same\n", in tasdevice_select_cfg_blk()
763 __func__, length, blk_data[j]->block_size); in tasdevice_select_cfg_blk()
771 struct tasdevice_dspfw_hdr *fw_hdr = &(tasdevice->fmw->fw_hdr); in tasdevice_load_block_kernel()
772 struct tasdevice_fw_fixed_hdr *fw_fixed_hdr = &(fw_hdr->fixed_hdr); in tasdevice_load_block_kernel()
773 const unsigned int blk_size = block->blk_size; in tasdevice_load_block_kernel()
775 unsigned char *data = block->data; in tasdevice_load_block_kernel() local
778 if (fw_fixed_hdr->ppcver >= PPC3_VERSION_TAS2781) { in tasdevice_load_block_kernel()
779 switch (block->type) { in tasdevice_load_block_kernel()
820 dev_info(tasdevice->dev, in tasdevice_load_block_kernel()
822 __func__, block->type); in tasdevice_load_block_kernel()
825 } else if (fw_fixed_hdr->ppcver >= in tasdevice_load_block_kernel()
827 switch (block->type) { in tasdevice_load_block_kernel()
860 dev_info(tasdevice->dev, in tasdevice_load_block_kernel()
862 __func__, block->type); in tasdevice_load_block_kernel()
866 switch (block->type) { in tasdevice_load_block_kernel()
899 dev_info(tasdevice->dev, in tasdevice_load_block_kernel()
901 __func__, block->type); in tasdevice_load_block_kernel()
906 for (i = 0, length = 0; i < block->nr_subblocks; i++) { in tasdevice_load_block_kernel()
907 int rc = tasdevice_process_block(tasdevice, data + length, in tasdevice_load_block_kernel()
908 dev_idx, blk_size - length); in tasdevice_load_block_kernel()
910 dev_err(tasdevice->dev, in tasdevice_load_block_kernel()
917 dev_err(tasdevice->dev, "%s: %u %u out of boundary\n", in tasdevice_load_block_kernel()
930 const unsigned char *buf = fmw->data; in fw_parse_variable_hdr()
935 if (offset + len + 8 > fmw->size) { in fw_parse_variable_hdr()
936 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_variable_hdr()
937 offset = -EINVAL; in fw_parse_variable_hdr()
938 goto out; in fw_parse_variable_hdr()
943 fw_hdr->device_family = be32_to_cpup((__be32 *)&buf[offset]); in fw_parse_variable_hdr()
944 if (fw_hdr->device_family != 0) { in fw_parse_variable_hdr()
945 dev_err(tas_priv->dev, "%s: not TAS device\n", __func__); in fw_parse_variable_hdr()
946 offset = -EINVAL; in fw_parse_variable_hdr()
947 goto out; in fw_parse_variable_hdr()
951 fw_hdr->device = be32_to_cpup((__be32 *)&buf[offset]); in fw_parse_variable_hdr()
952 if (fw_hdr->device >= TASDEVICE_DSP_TAS_MAX_DEVICE || in fw_parse_variable_hdr()
953 fw_hdr->device == 6) { in fw_parse_variable_hdr()
954 dev_err(tas_priv->dev, "Unsupported dev %d\n", fw_hdr->device); in fw_parse_variable_hdr()
955 offset = -EINVAL; in fw_parse_variable_hdr()
956 goto out; in fw_parse_variable_hdr()
959 fw_hdr->ndev = deviceNumber[fw_hdr->device]; in fw_parse_variable_hdr()
961 out: in fw_parse_variable_hdr()
968 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in fw_parse_variable_header_git()
969 struct tasdevice_dspfw_hdr *fw_hdr = &(tas_fmw->fw_hdr); in fw_parse_variable_header_git()
973 goto out; in fw_parse_variable_header_git()
974 if (fw_hdr->ndev != tas_priv->ndev) { in fw_parse_variable_header_git()
975 dev_err(tas_priv->dev, in fw_parse_variable_header_git()
977 __func__, fw_hdr->ndev, tas_priv->ndev); in fw_parse_variable_header_git()
978 offset = -EINVAL; in fw_parse_variable_header_git()
981 out: in fw_parse_variable_header_git()
988 unsigned char *data = (unsigned char *)fmw->data; in fw_parse_block_data() local
991 if (offset + 8 > fmw->size) { in fw_parse_block_data()
992 dev_err(tas_fmw->dev, "%s: Type error\n", __func__); in fw_parse_block_data()
993 offset = -EINVAL; in fw_parse_block_data()
994 goto out; in fw_parse_block_data()
996 block->type = be32_to_cpup((__be32 *)&data[offset]); in fw_parse_block_data()
999 if (tas_fmw->fw_hdr.fixed_hdr.drv_ver >= PPC_DRIVER_CRCCHK) { in fw_parse_block_data()
1000 if (offset + 8 > fmw->size) { in fw_parse_block_data()
1001 dev_err(tas_fmw->dev, "PChkSumPresent error\n"); in fw_parse_block_data()
1002 offset = -EINVAL; in fw_parse_block_data()
1003 goto out; in fw_parse_block_data()
1005 block->is_pchksum_present = data[offset]; in fw_parse_block_data()
1008 block->pchksum = data[offset]; in fw_parse_block_data()
1011 block->is_ychksum_present = data[offset]; in fw_parse_block_data()
1014 block->ychksum = data[offset]; in fw_parse_block_data()
1017 block->is_pchksum_present = 0; in fw_parse_block_data()
1018 block->is_ychksum_present = 0; in fw_parse_block_data()
1021 block->nr_cmds = be32_to_cpup((__be32 *)&data[offset]); in fw_parse_block_data()
1024 n = block->nr_cmds * 4; in fw_parse_block_data()
1025 if (offset + n > fmw->size) { in fw_parse_block_data()
1026 dev_err(tas_fmw->dev, in fw_parse_block_data()
1028 __func__, (unsigned long)fmw->size, offset, n); in fw_parse_block_data()
1029 offset = -EINVAL; in fw_parse_block_data()
1030 goto out; in fw_parse_block_data()
1033 block->data = kmemdup(&data[offset], n, GFP_KERNEL); in fw_parse_block_data()
1034 if (!block->data) { in fw_parse_block_data()
1035 offset = -ENOMEM; in fw_parse_block_data()
1036 goto out; in fw_parse_block_data()
1040 out: in fw_parse_block_data()
1051 const unsigned char *data = (unsigned char *)fmw->data; in fw_parse_data() local
1056 if (offset + 64 > fmw->size) { in fw_parse_data()
1057 dev_err(tas_fmw->dev, "%s: Name error\n", __func__); in fw_parse_data()
1058 offset = -EINVAL; in fw_parse_data()
1059 goto out; in fw_parse_data()
1061 memcpy(img_data->name, &data[offset], 64); in fw_parse_data()
1064 n = strlen((char *)&data[offset]); in fw_parse_data()
1066 if (offset + n + 2 > fmw->size) { in fw_parse_data()
1067 dev_err(tas_fmw->dev, "%s: Description error\n", __func__); in fw_parse_data()
1068 offset = -EINVAL; in fw_parse_data()
1069 goto out; in fw_parse_data()
1072 img_data->nr_blk = be16_to_cpup((__be16 *)&data[offset]); in fw_parse_data()
1075 img_data->dev_blks = kcalloc(img_data->nr_blk, in fw_parse_data()
1077 if (!img_data->dev_blks) { in fw_parse_data()
1078 offset = -ENOMEM; in fw_parse_data()
1079 goto out; in fw_parse_data()
1081 for (i = 0; i < img_data->nr_blk; i++) { in fw_parse_data()
1082 blk = &(img_data->dev_blks[i]); in fw_parse_data()
1085 offset = -EINVAL; in fw_parse_data()
1086 goto out; in fw_parse_data()
1090 out: in fw_parse_data()
1100 unsigned char *buf = (unsigned char *)fmw->data; in fw_parse_program_data()
1104 if (offset + 2 > fmw->size) { in fw_parse_program_data()
1105 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_program_data()
1106 offset = -EINVAL; in fw_parse_program_data()
1107 goto out; in fw_parse_program_data()
1109 tas_fmw->nr_programs = be16_to_cpup((__be16 *)&buf[offset]); in fw_parse_program_data()
1112 if (tas_fmw->nr_programs == 0) { in fw_parse_program_data()
1113 /*Not error in calibration Data file, return directly*/ in fw_parse_program_data()
1114 dev_info(tas_priv->dev, "%s: No Programs data, maybe calbin\n", in fw_parse_program_data()
1116 goto out; in fw_parse_program_data()
1119 tas_fmw->programs = in fw_parse_program_data()
1120 kcalloc(tas_fmw->nr_programs, sizeof(struct tasdevice_prog), in fw_parse_program_data()
1122 if (!tas_fmw->programs) { in fw_parse_program_data()
1123 offset = -ENOMEM; in fw_parse_program_data()
1124 goto out; in fw_parse_program_data()
1126 for (i = 0; i < tas_fmw->nr_programs; i++) { in fw_parse_program_data()
1129 program = &(tas_fmw->programs[i]); in fw_parse_program_data()
1130 if (offset + 64 > fmw->size) { in fw_parse_program_data()
1131 dev_err(tas_priv->dev, "%s: mpName error\n", __func__); in fw_parse_program_data()
1132 offset = -EINVAL; in fw_parse_program_data()
1133 goto out; in fw_parse_program_data()
1140 if (offset + n > fmw->size) { in fw_parse_program_data()
1141 dev_err(tas_priv->dev, "Description err\n"); in fw_parse_program_data()
1142 offset = -EINVAL; in fw_parse_program_data()
1143 goto out; in fw_parse_program_data()
1148 offset = fw_parse_data(tas_fmw, &(program->dev_data), fmw, in fw_parse_program_data()
1151 goto out; in fw_parse_program_data()
1154 out: in fw_parse_program_data()
1166 unsigned char *data = (unsigned char *)fmw->data; in fw_parse_configuration_data() local
1171 if (offset + 2 > fmw->size) { in fw_parse_configuration_data()
1172 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_configuration_data()
1173 offset = -EINVAL; in fw_parse_configuration_data()
1174 goto out; in fw_parse_configuration_data()
1176 tas_fmw->nr_configurations = be16_to_cpup((__be16 *)&data[offset]); in fw_parse_configuration_data()
1179 if (tas_fmw->nr_configurations == 0) { in fw_parse_configuration_data()
1180 dev_err(tas_priv->dev, "%s: Conf is zero\n", __func__); in fw_parse_configuration_data()
1181 /*Not error for calibration Data file, return directly*/ in fw_parse_configuration_data()
1182 goto out; in fw_parse_configuration_data()
1184 tas_fmw->configs = kcalloc(tas_fmw->nr_configurations, in fw_parse_configuration_data()
1186 if (!tas_fmw->configs) { in fw_parse_configuration_data()
1187 offset = -ENOMEM; in fw_parse_configuration_data()
1188 goto out; in fw_parse_configuration_data()
1190 for (i = 0; i < tas_fmw->nr_configurations; i++) { in fw_parse_configuration_data()
1191 config = &(tas_fmw->configs[i]); in fw_parse_configuration_data()
1192 if (offset + 64 > fmw->size) { in fw_parse_configuration_data()
1193 dev_err(tas_priv->dev, "File Size err\n"); in fw_parse_configuration_data()
1194 offset = -EINVAL; in fw_parse_configuration_data()
1195 goto out; in fw_parse_configuration_data()
1197 memcpy(config->name, &data[offset], 64); in fw_parse_configuration_data()
1200 n = strlen((char *)&data[offset]); in fw_parse_configuration_data()
1202 if (offset + n > fmw->size) { in fw_parse_configuration_data()
1203 dev_err(tas_priv->dev, "Description err\n"); in fw_parse_configuration_data()
1204 offset = -EINVAL; in fw_parse_configuration_data()
1205 goto out; in fw_parse_configuration_data()
1210 offset = fw_parse_data(tas_fmw, &(config->dev_data), in fw_parse_configuration_data()
1213 goto out; in fw_parse_configuration_data()
1216 out: in fw_parse_configuration_data()
1229 cd->len = TAS2781_YRAM5_END_REG - reg + 1; in check_inpage_yram_rg()
1231 cd->len = len; in check_inpage_yram_rg()
1232 cd->offset = reg; in check_inpage_yram_rg()
1236 cd->offset = TAS2781_YRAM5_START_REG; in check_inpage_yram_rg()
1237 cd->len = len - TAS2781_YRAM5_START_REG + reg; in check_inpage_yram_rg()
1252 cd->offset = reg; in check_inpage_yram_bk1()
1253 cd->len = len; in check_inpage_yram_bk1()
1256 cd->offset = TAS2781_YRAM1_START_REG; in check_inpage_yram_bk1()
1257 cd->len = len - TAS2781_YRAM1_START_REG + reg; in check_inpage_yram_bk1()
1267 * true -- the registers are in the inpage yram
1268 * false -- the registers are NOT in the inpage yram
1297 cd->offset = reg; in check_inblock_yram_bk()
1298 cd->len = len; in check_inblock_yram_bk()
1301 if (reg + len - 1 >= TAS2781_YRAM2_START_REG) { in check_inblock_yram_bk()
1302 cd->offset = TAS2781_YRAM2_START_REG; in check_inblock_yram_bk()
1303 cd->len = reg + len - TAS2781_YRAM2_START_REG; in check_inblock_yram_bk()
1313 * true -- the registers are in the inblock yram
1314 * false -- the registers are NOT in the inblock yram
1352 if ((reg + len - 1) > 127) { in tasdev_multibytes_chksum()
1353 ret = -EINVAL; in tasdev_multibytes_chksum()
1354 dev_err(tasdevice->dev, "firmware error\n"); in tasdev_multibytes_chksum()
1372 dev_err(tasdevice->dev, "firmware error\n"); in tasdev_multibytes_chksum()
1373 ret = -EINVAL; in tasdev_multibytes_chksum()
1395 crc_chksum += crc8(tasdevice->crc8_lkp_tbl, &nBuf1[i], in tasdev_multibytes_chksum()
1433 dev_err(tasdevice->dev, in do_singlereg_checksum()
1436 tasdevice->tasdevice[chl].err_code |= ERROR_YRAM_CRCCHK; in do_singlereg_checksum()
1437 ret = -EAGAIN; in do_singlereg_checksum()
1441 ret = crc8(tasdevice->crc8_lkp_tbl, &val, 1, 0); in do_singlereg_checksum()
1452 dev->cur_prog = -1; in set_err_prg_cfg()
1454 dev->cur_conf = -1; in set_err_prg_cfg()
1476 if (ret != -EAGAIN) in tasdev_bytes_chksum()
1479 block->nr_retry--; in tasdev_bytes_chksum()
1480 if (block->nr_retry > 0) in tasdev_bytes_chksum()
1483 set_err_prg_cfg(block->type, &tas_priv->tasdevice[chn]); in tasdev_bytes_chksum()
1491 unsigned char page, unsigned char reg, unsigned char *data, in tasdev_multibytes_wr() argument
1499 TASDEVICE_REG(book, page, reg), data + 3, len); in tasdev_multibytes_wr()
1502 if (block->is_ychksum_present) in tasdev_multibytes_wr()
1507 TASDEVICE_REG(book, page, reg), data[3]); in tasdev_multibytes_wr()
1510 if (block->is_ychksum_present) in tasdev_multibytes_wr()
1512 page, reg, 1, data[3], crc_chksum); in tasdev_multibytes_wr()
1515 if (!block->is_ychksum_present || ret >= 0) { in tasdev_multibytes_wr()
1518 *nr_cmds += ((len - 2) / 4) + 1; in tasdev_multibytes_wr()
1534 dev_err(tas_priv->dev, "%s: Chn %d\n", __func__, chn); in tasdev_block_chksum()
1535 set_err_prg_cfg(block->type, &tas_priv->tasdevice[chn]); in tasdev_block_chksum()
1539 if ((nr_value & 0xff) != block->pchksum) { in tasdev_block_chksum()
1540 dev_err(tas_priv->dev, "%s: Blk PChkSum Chn %d ", __func__, in tasdev_block_chksum()
1542 dev_err(tas_priv->dev, "PChkSum = 0x%x, Reg = 0x%x\n", in tasdev_block_chksum()
1543 block->pchksum, (nr_value & 0xff)); in tasdev_block_chksum()
1544 tas_priv->tasdevice[chn].err_code |= ERROR_PRAM_CRCCHK; in tasdev_block_chksum()
1545 ret = -EAGAIN; in tasdev_block_chksum()
1546 block->nr_retry--; in tasdev_block_chksum()
1548 if (block->nr_retry <= 0) in tasdev_block_chksum()
1549 set_err_prg_cfg(block->type, in tasdev_block_chksum()
1550 &tas_priv->tasdevice[chn]); in tasdev_block_chksum()
1552 tas_priv->tasdevice[chn].err_code &= ~ERROR_PRAM_CRCCHK; in tasdev_block_chksum()
1564 unsigned char *data = block->data; in tasdev_load_blk() local
1572 while (block->nr_retry > 0) { in tasdev_load_blk()
1573 if (block->is_pchksum_present) { in tasdev_load_blk()
1580 if (block->is_ychksum_present) in tasdev_load_blk()
1585 while (nr_cmds < block->nr_cmds) { in tasdev_load_blk()
1586 data = block->data + nr_cmds * 4; in tasdev_load_blk()
1588 book = data[0]; in tasdev_load_blk()
1589 page = data[1]; in tasdev_load_blk()
1590 offset = data[2]; in tasdev_load_blk()
1591 val = data[3]; in tasdev_load_blk()
1601 if (block->is_ychksum_present) { in tasdev_load_blk()
1612 /*book -- data[0] page -- data[1]*/ in tasdev_load_blk()
1619 data += 4; in tasdev_load_blk()
1621 book = data[0]; in tasdev_load_blk()
1622 page = data[1]; in tasdev_load_blk()
1623 offset = data[2]; in tasdev_load_blk()
1625 block, chn, book, page, offset, data, in tasdev_load_blk()
1631 if (ret == -EAGAIN) { in tasdev_load_blk()
1632 if (block->nr_retry > 0) in tasdev_load_blk()
1637 if (block->is_pchksum_present) { in tasdev_load_blk()
1639 if (ret == -EAGAIN) { in tasdev_load_blk()
1640 if (block->nr_retry > 0) in tasdev_load_blk()
1646 if (block->is_ychksum_present) { in tasdev_load_blk()
1648 dev_err(tas_priv->dev, in tasdev_load_blk()
1650 block->ychksum, crc_chksum); in tasdev_load_blk()
1652 tas_priv->tasdevice[chn].err_code &= in tasdev_load_blk()
1672 switch (block->type) { in tasdevice_load_block()
1675 chnend = tas_priv->ndev; in tasdevice_load_block()
1702 dev_dbg(tas_priv->dev, "load blk: Other Type = 0x%02x\n", in tasdevice_load_block()
1703 block->type); in tasdevice_load_block()
1708 block->nr_retry = 6; in tasdevice_load_block()
1709 if (tas_priv->tasdevice[chn].is_loading == false) in tasdevice_load_block()
1713 dev_err(tas_priv->dev, "dev %d, Blk (%d) load error\n", in tasdevice_load_block()
1714 chn, block->type); in tasdevice_load_block()
1728 tas_priv->fw_parse_variable_header = in dspfw_default_callback()
1730 tas_priv->fw_parse_program_data = in dspfw_default_callback()
1732 tas_priv->fw_parse_configuration_data = in dspfw_default_callback()
1734 tas_priv->tasdevice_load_block = in dspfw_default_callback()
1739 tas_priv->fw_parse_variable_header = in dspfw_default_callback()
1741 tas_priv->fw_parse_program_data = in dspfw_default_callback()
1743 tas_priv->fw_parse_configuration_data = in dspfw_default_callback()
1745 tas_priv->tasdevice_load_block = in dspfw_default_callback()
1749 dev_err(tas_priv->dev, in dspfw_default_callback()
1752 dev_err(tas_priv->dev, " Current:0x%02x\n", in dspfw_default_callback()
1754 rc = -EINVAL; in dspfw_default_callback()
1759 dev_err(tas_priv->dev, in dspfw_default_callback()
1761 dev_err(tas_priv->dev, "current is 0x%02x\n", drv_ver); in dspfw_default_callback()
1762 rc = -EINVAL; in dspfw_default_callback()
1775 for (i = 0; i < dev_data->nr_blk; i++) { in load_calib_data()
1776 block = &(dev_data->dev_blks[i]); in load_calib_data()
1788 struct tasdevice_dspfw_hdr *fw_hdr = &(tas_fmw->fw_hdr); in fw_parse_header()
1789 struct tasdevice_fw_fixed_hdr *fw_fixed_hdr = &(fw_hdr->fixed_hdr); in fw_parse_header()
1791 const unsigned char *buf = (unsigned char *)fmw->data; in fw_parse_header()
1793 if (offset + 92 > fmw->size) { in fw_parse_header()
1794 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_header()
1795 offset = -EINVAL; in fw_parse_header()
1796 goto out; in fw_parse_header()
1799 dev_err(tas_priv->dev, "%s: Magic num NOT match\n", __func__); in fw_parse_header()
1800 offset = -EINVAL; in fw_parse_header()
1801 goto out; in fw_parse_header()
1805 /* Convert data[offset], data[offset + 1], data[offset + 2] and in fw_parse_header()
1806 * data[offset + 3] into host in fw_parse_header()
1808 fw_fixed_hdr->fwsize = be32_to_cpup((__be32 *)&buf[offset]); in fw_parse_header()
1810 if (fw_fixed_hdr->fwsize != fmw->size) { in fw_parse_header()
1811 dev_err(tas_priv->dev, "File size not match, %lu %u", in fw_parse_header()
1812 (unsigned long)fmw->size, fw_fixed_hdr->fwsize); in fw_parse_header()
1813 offset = -EINVAL; in fw_parse_header()
1814 goto out; in fw_parse_header()
1817 fw_fixed_hdr->ppcver = be32_to_cpup((__be32 *)&buf[offset]); in fw_parse_header()
1819 fw_fixed_hdr->drv_ver = be32_to_cpup((__be32 *)&buf[offset]); in fw_parse_header()
1822 out: in fw_parse_header()
1829 struct tasdevice_dspfw_hdr *fw_hdr = &(tas_fmw->fw_hdr); in fw_parse_variable_hdr_cal()
1833 goto out; in fw_parse_variable_hdr_cal()
1834 if (fw_hdr->ndev != 1) { in fw_parse_variable_hdr_cal()
1835 dev_err(tas_priv->dev, in fw_parse_variable_hdr_cal()
1837 __func__, fw_hdr->ndev); in fw_parse_variable_hdr_cal()
1838 offset = -EINVAL; in fw_parse_variable_hdr_cal()
1841 out: in fw_parse_variable_hdr_cal()
1845 /* When calibrated data parsing error occurs, DSP can still work with default
1846 * calibrated data, memory resource related to calibrated data will be
1853 unsigned char *data = (unsigned char *)fmw->data; in fw_parse_calibration_data() local
1856 if (offset + 2 > fmw->size) { in fw_parse_calibration_data()
1857 dev_err(tas_priv->dev, "%s: Calibrations error\n", __func__); in fw_parse_calibration_data()
1858 offset = -EINVAL; in fw_parse_calibration_data()
1859 goto out; in fw_parse_calibration_data()
1861 tas_fmw->nr_calibrations = be16_to_cpup((__be16 *)&data[offset]); in fw_parse_calibration_data()
1864 if (tas_fmw->nr_calibrations != 1) { in fw_parse_calibration_data()
1865 dev_err(tas_priv->dev, in fw_parse_calibration_data()
1867 __func__, tas_fmw->nr_calibrations); in fw_parse_calibration_data()
1868 goto out; in fw_parse_calibration_data()
1871 tas_fmw->calibrations = kcalloc(tas_fmw->nr_calibrations, in fw_parse_calibration_data()
1873 if (!tas_fmw->calibrations) { in fw_parse_calibration_data()
1874 offset = -ENOMEM; in fw_parse_calibration_data()
1875 goto out; in fw_parse_calibration_data()
1877 for (i = 0; i < tas_fmw->nr_calibrations; i++) { in fw_parse_calibration_data()
1878 if (offset + 64 > fmw->size) { in fw_parse_calibration_data()
1879 dev_err(tas_priv->dev, "Calibrations error\n"); in fw_parse_calibration_data()
1880 offset = -EINVAL; in fw_parse_calibration_data()
1881 goto out; in fw_parse_calibration_data()
1883 calibration = &(tas_fmw->calibrations[i]); in fw_parse_calibration_data()
1886 n = strlen((char *)&data[offset]); in fw_parse_calibration_data()
1889 if (offset + n > fmw->size) { in fw_parse_calibration_data()
1890 dev_err(tas_priv->dev, "Description err\n"); in fw_parse_calibration_data()
1891 offset = -EINVAL; in fw_parse_calibration_data()
1892 goto out; in fw_parse_calibration_data()
1896 offset = fw_parse_data(tas_fmw, &(calibration->dev_data), fmw, in fw_parse_calibration_data()
1899 goto out; in fw_parse_calibration_data()
1902 out: in fw_parse_calibration_data()
1910 struct tasdevice *tasdev = &(tas_priv->tasdevice[i]); in tas2781_load_calibration()
1917 ret = request_firmware(&fw_entry, file_name, tas_priv->dev); in tas2781_load_calibration()
1919 dev_err(tas_priv->dev, "%s: Request firmware %s failed\n", in tas2781_load_calibration()
1921 goto out; in tas2781_load_calibration()
1924 if (!fw_entry->size) { in tas2781_load_calibration()
1925 dev_err(tas_priv->dev, "%s: file read error: size = %lu\n", in tas2781_load_calibration()
1926 __func__, (unsigned long)fw_entry->size); in tas2781_load_calibration()
1927 ret = -EINVAL; in tas2781_load_calibration()
1928 goto out; in tas2781_load_calibration()
1930 fmw.size = fw_entry->size; in tas2781_load_calibration()
1931 fmw.data = fw_entry->data; in tas2781_load_calibration()
1933 tas_fmw = tasdev->cali_data_fmw = kzalloc(sizeof(struct tasdevice_fw), in tas2781_load_calibration()
1935 if (!tasdev->cali_data_fmw) { in tas2781_load_calibration()
1936 ret = -ENOMEM; in tas2781_load_calibration()
1937 goto out; in tas2781_load_calibration()
1939 tas_fmw->dev = tas_priv->dev; in tas2781_load_calibration()
1941 if (offset == -EINVAL) { in tas2781_load_calibration()
1942 dev_err(tas_priv->dev, "fw_parse_header EXIT!\n"); in tas2781_load_calibration()
1944 goto out; in tas2781_load_calibration()
1947 if (offset == -EINVAL) { in tas2781_load_calibration()
1948 dev_err(tas_priv->dev, in tas2781_load_calibration()
1951 goto out; in tas2781_load_calibration()
1955 dev_err(tas_priv->dev, "fw_parse_program_data EXIT!\n"); in tas2781_load_calibration()
1957 goto out; in tas2781_load_calibration()
1961 dev_err(tas_priv->dev, "fw_parse_configuration_data EXIT!\n"); in tas2781_load_calibration()
1963 goto out; in tas2781_load_calibration()
1967 dev_err(tas_priv->dev, "fw_parse_calibration_data EXIT!\n"); in tas2781_load_calibration()
1969 goto out; in tas2781_load_calibration()
1972 out: in tas2781_load_calibration()
1989 if (!fmw || !fmw->data) { in tasdevice_dspfw_ready()
1990 dev_err(tas_priv->dev, "%s: Failed to read firmware %s\n", in tasdevice_dspfw_ready()
1991 __func__, tas_priv->coef_binaryname); in tasdevice_dspfw_ready()
1992 ret = -EINVAL; in tasdevice_dspfw_ready()
1993 goto out; in tasdevice_dspfw_ready()
1996 tas_priv->fmw = kzalloc(sizeof(struct tasdevice_fw), GFP_KERNEL); in tasdevice_dspfw_ready()
1997 if (!tas_priv->fmw) { in tasdevice_dspfw_ready()
1998 ret = -ENOMEM; in tasdevice_dspfw_ready()
1999 goto out; in tasdevice_dspfw_ready()
2001 tas_fmw = tas_priv->fmw; in tasdevice_dspfw_ready()
2002 tas_fmw->dev = tas_priv->dev; in tasdevice_dspfw_ready()
2005 if (offset == -EINVAL) { in tasdevice_dspfw_ready()
2006 ret = -EINVAL; in tasdevice_dspfw_ready()
2007 goto out; in tasdevice_dspfw_ready()
2009 fw_fixed_hdr = &(tas_fmw->fw_hdr.fixed_hdr); in tasdevice_dspfw_ready()
2011 switch (fw_fixed_hdr->drv_ver) { in tasdevice_dspfw_ready()
2015 tas_priv->fw_parse_variable_header = in tasdevice_dspfw_ready()
2017 tas_priv->fw_parse_program_data = in tasdevice_dspfw_ready()
2019 tas_priv->fw_parse_configuration_data = in tasdevice_dspfw_ready()
2021 tas_priv->tasdevice_load_block = in tasdevice_dspfw_ready()
2026 tas_priv->fw_parse_variable_header = in tasdevice_dspfw_ready()
2028 tas_priv->fw_parse_program_data = in tasdevice_dspfw_ready()
2030 tas_priv->fw_parse_configuration_data = in tasdevice_dspfw_ready()
2032 tas_priv->tasdevice_load_block = in tasdevice_dspfw_ready()
2037 fw_fixed_hdr->drv_ver, fw_fixed_hdr->ppcver); in tasdevice_dspfw_ready()
2039 goto out; in tasdevice_dspfw_ready()
2043 offset = tas_priv->fw_parse_variable_header(tas_priv, fmw, offset); in tasdevice_dspfw_ready()
2046 goto out; in tasdevice_dspfw_ready()
2048 offset = tas_priv->fw_parse_program_data(tas_priv, tas_fmw, fmw, in tasdevice_dspfw_ready()
2052 goto out; in tasdevice_dspfw_ready()
2054 offset = tas_priv->fw_parse_configuration_data(tas_priv, in tasdevice_dspfw_ready()
2059 out: in tasdevice_dspfw_ready()
2069 ret = request_firmware(&fw_entry, tas_priv->coef_binaryname, in tasdevice_dsp_parser()
2070 tas_priv->dev); in tasdevice_dsp_parser()
2072 dev_err(tas_priv->dev, "%s: load %s error\n", __func__, in tasdevice_dsp_parser()
2073 tas_priv->coef_binaryname); in tasdevice_dsp_parser()
2074 goto out; in tasdevice_dsp_parser()
2081 out: in tasdevice_dsp_parser()
2094 if (!tas_fmw->calibrations) in tas2781_clear_calfirmware()
2095 goto out; in tas2781_clear_calfirmware()
2097 for (i = 0; i < tas_fmw->nr_calibrations; i++) { in tas2781_clear_calfirmware()
2098 calibration = &(tas_fmw->calibrations[i]); in tas2781_clear_calfirmware()
2102 im = &(calibration->dev_data); in tas2781_clear_calfirmware()
2104 if (!im->dev_blks) in tas2781_clear_calfirmware()
2107 for (blks = 0; blks < im->nr_blk; blks++) { in tas2781_clear_calfirmware()
2108 block = &(im->dev_blks[blks]); in tas2781_clear_calfirmware()
2111 kfree(block->data); in tas2781_clear_calfirmware()
2113 kfree(im->dev_blks); in tas2781_clear_calfirmware()
2115 kfree(tas_fmw->calibrations); in tas2781_clear_calfirmware()
2116 out: in tas2781_clear_calfirmware()
2129 for (i = 0; i < tas_priv->ndev; i++) { in tasdevice_calbin_remove()
2130 tasdev = &(tas_priv->tasdevice[i]); in tasdevice_calbin_remove()
2131 if (!tasdev->cali_data_fmw) in tasdevice_calbin_remove()
2133 tas2781_clear_calfirmware(tasdev->cali_data_fmw); in tasdevice_calbin_remove()
2134 tasdev->cali_data_fmw = NULL; in tasdevice_calbin_remove()
2142 struct tasdevice_rca *rca = &(tas_priv->rcabin); in tasdevice_config_info_remove()
2143 struct tasdevice_config_info **ci = rca->cfg_info; in tasdevice_config_info_remove()
2148 for (i = 0; i < rca->ncfgs; i++) { in tasdevice_config_info_remove()
2151 if (ci[i]->blk_data) { in tasdevice_config_info_remove()
2152 for (j = 0; j < (int)ci[i]->real_nblocks; j++) { in tasdevice_config_info_remove()
2153 if (!ci[i]->blk_data[j]) in tasdevice_config_info_remove()
2155 kfree(ci[i]->blk_data[j]->regdata); in tasdevice_config_info_remove()
2156 kfree(ci[i]->blk_data[j]); in tasdevice_config_info_remove()
2158 kfree(ci[i]->blk_data); in tasdevice_config_info_remove()
2173 for (i = 0; i < dev_data->nr_blk; i++) { in tasdevice_load_data()
2174 block = &(dev_data->dev_blks[i]); in tasdevice_load_data()
2175 ret = tas_priv->tasdevice_load_block(tas_priv, block); in tasdevice_load_data()
2187 struct tasdevice_rca *rca = &(tas_priv->rcabin); in tasdevice_select_tuningprm_cfg()
2188 struct tasdevice_config_info **cfg_info = rca->cfg_info; in tasdevice_select_tuningprm_cfg()
2189 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in tasdevice_select_tuningprm_cfg()
2196 dev_err(tas_priv->dev, "%s: Firmware is NULL\n", __func__); in tasdevice_select_tuningprm_cfg()
2197 goto out; in tasdevice_select_tuningprm_cfg()
2200 if (cfg_no >= tas_fmw->nr_configurations) { in tasdevice_select_tuningprm_cfg()
2201 dev_err(tas_priv->dev, in tasdevice_select_tuningprm_cfg()
2203 __func__, cfg_no, tas_fmw->nr_configurations); in tasdevice_select_tuningprm_cfg()
2204 goto out; in tasdevice_select_tuningprm_cfg()
2207 if (prm_no >= tas_fmw->nr_programs) { in tasdevice_select_tuningprm_cfg()
2208 dev_err(tas_priv->dev, in tasdevice_select_tuningprm_cfg()
2210 __func__, prm_no, tas_fmw->nr_programs); in tasdevice_select_tuningprm_cfg()
2211 goto out; in tasdevice_select_tuningprm_cfg()
2214 if (rca_conf_no >= rca->ncfgs || rca_conf_no < 0 || in tasdevice_select_tuningprm_cfg()
2216 dev_err(tas_priv->dev, in tasdevice_select_tuningprm_cfg()
2218 rca_conf_no, rca->ncfgs-1); in tasdevice_select_tuningprm_cfg()
2219 goto out; in tasdevice_select_tuningprm_cfg()
2222 conf = &(tas_fmw->configs[cfg_no]); in tasdevice_select_tuningprm_cfg()
2223 for (i = 0, prog_status = 0; i < tas_priv->ndev; i++) { in tasdevice_select_tuningprm_cfg()
2224 if (cfg_info[rca_conf_no]->active_dev & (1 << i)) { in tasdevice_select_tuningprm_cfg()
2225 if (tas_priv->tasdevice[i].cur_prog != prm_no in tasdevice_select_tuningprm_cfg()
2226 || tas_priv->force_fwload_status) { in tasdevice_select_tuningprm_cfg()
2227 tas_priv->tasdevice[i].cur_conf = -1; in tasdevice_select_tuningprm_cfg()
2228 tas_priv->tasdevice[i].is_loading = true; in tasdevice_select_tuningprm_cfg()
2232 tas_priv->tasdevice[i].is_loading = false; in tasdevice_select_tuningprm_cfg()
2233 tas_priv->tasdevice[i].is_loaderr = false; in tasdevice_select_tuningprm_cfg()
2237 program = &(tas_fmw->programs[prm_no]); in tasdevice_select_tuningprm_cfg()
2238 tasdevice_load_data(tas_priv, &(program->dev_data)); in tasdevice_select_tuningprm_cfg()
2239 for (i = 0; i < tas_priv->ndev; i++) { in tasdevice_select_tuningprm_cfg()
2240 if (tas_priv->tasdevice[i].is_loaderr == true) in tasdevice_select_tuningprm_cfg()
2242 else if (tas_priv->tasdevice[i].is_loaderr == false in tasdevice_select_tuningprm_cfg()
2243 && tas_priv->tasdevice[i].is_loading == true) { in tasdevice_select_tuningprm_cfg()
2245 tas_priv->tasdevice[i].cali_data_fmw; in tasdevice_select_tuningprm_cfg()
2249 *cal = cal_fmw->calibrations; in tasdevice_select_tuningprm_cfg()
2253 &(cal->dev_data)); in tasdevice_select_tuningprm_cfg()
2255 tas_priv->tasdevice[i].cur_prog = prm_no; in tasdevice_select_tuningprm_cfg()
2260 for (i = 0, status = 0; i < tas_priv->ndev; i++) { in tasdevice_select_tuningprm_cfg()
2261 if (tas_priv->tasdevice[i].cur_conf != cfg_no in tasdevice_select_tuningprm_cfg()
2262 && (cfg_info[rca_conf_no]->active_dev & (1 << i)) in tasdevice_select_tuningprm_cfg()
2263 && (tas_priv->tasdevice[i].is_loaderr == false)) { in tasdevice_select_tuningprm_cfg()
2265 tas_priv->tasdevice[i].is_loading = true; in tasdevice_select_tuningprm_cfg()
2267 tas_priv->tasdevice[i].is_loading = false; in tasdevice_select_tuningprm_cfg()
2272 tasdevice_load_data(tas_priv, &(conf->dev_data)); in tasdevice_select_tuningprm_cfg()
2273 for (i = 0; i < tas_priv->ndev; i++) { in tasdevice_select_tuningprm_cfg()
2274 if (tas_priv->tasdevice[i].is_loaderr == true) { in tasdevice_select_tuningprm_cfg()
2277 } else if (tas_priv->tasdevice[i].is_loaderr == false in tasdevice_select_tuningprm_cfg()
2278 && tas_priv->tasdevice[i].is_loading == true) in tasdevice_select_tuningprm_cfg()
2279 tas_priv->tasdevice[i].cur_conf = cfg_no; in tasdevice_select_tuningprm_cfg()
2282 dev_dbg(tas_priv->dev, "%s: Unneeded loading dsp conf %d\n", in tasdevice_select_tuningprm_cfg()
2285 status |= cfg_info[rca_conf_no]->active_dev; in tasdevice_select_tuningprm_cfg()
2287 out: in tasdevice_select_tuningprm_cfg()
2296 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in tasdevice_prmg_load()
2302 dev_err(tas_priv->dev, "%s: Firmware is NULL\n", __func__); in tasdevice_prmg_load()
2303 goto out; in tasdevice_prmg_load()
2306 if (prm_no >= tas_fmw->nr_programs) { in tasdevice_prmg_load()
2307 dev_err(tas_priv->dev, in tasdevice_prmg_load()
2309 __func__, prm_no, tas_fmw->nr_programs); in tasdevice_prmg_load()
2310 goto out; in tasdevice_prmg_load()
2313 for (i = 0, prog_status = 0; i < tas_priv->ndev; i++) { in tasdevice_prmg_load()
2314 if (tas_priv->tasdevice[i].cur_prog != prm_no) { in tasdevice_prmg_load()
2315 tas_priv->tasdevice[i].cur_conf = -1; in tasdevice_prmg_load()
2316 tas_priv->tasdevice[i].is_loading = true; in tasdevice_prmg_load()
2322 program = &(tas_fmw->programs[prm_no]); in tasdevice_prmg_load()
2323 tasdevice_load_data(tas_priv, &(program->dev_data)); in tasdevice_prmg_load()
2324 for (i = 0; i < tas_priv->ndev; i++) { in tasdevice_prmg_load()
2325 if (tas_priv->tasdevice[i].is_loaderr == true) in tasdevice_prmg_load()
2327 else if (tas_priv->tasdevice[i].is_loaderr == false in tasdevice_prmg_load()
2328 && tas_priv->tasdevice[i].is_loading == true) in tasdevice_prmg_load()
2329 tas_priv->tasdevice[i].cur_prog = prm_no; in tasdevice_prmg_load()
2333 out: in tasdevice_prmg_load()
2341 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in tasdevice_prmg_calibdata_load()
2347 dev_err(tas_priv->dev, "%s: Firmware is NULL\n", __func__); in tasdevice_prmg_calibdata_load()
2348 goto out; in tasdevice_prmg_calibdata_load()
2351 if (prm_no >= tas_fmw->nr_programs) { in tasdevice_prmg_calibdata_load()
2352 dev_err(tas_priv->dev, in tasdevice_prmg_calibdata_load()
2354 __func__, prm_no, tas_fmw->nr_programs); in tasdevice_prmg_calibdata_load()
2355 goto out; in tasdevice_prmg_calibdata_load()
2358 for (i = 0, prog_status = 0; i < tas_priv->ndev; i++) { in tasdevice_prmg_calibdata_load()
2359 if (tas_priv->tasdevice[i].cur_prog != prm_no) { in tasdevice_prmg_calibdata_load()
2360 tas_priv->tasdevice[i].cur_conf = -1; in tasdevice_prmg_calibdata_load()
2361 tas_priv->tasdevice[i].is_loading = true; in tasdevice_prmg_calibdata_load()
2364 tas_priv->tasdevice[i].is_loaderr = false; in tasdevice_prmg_calibdata_load()
2368 program = &(tas_fmw->programs[prm_no]); in tasdevice_prmg_calibdata_load()
2369 tasdevice_load_data(tas_priv, &(program->dev_data)); in tasdevice_prmg_calibdata_load()
2370 for (i = 0; i < tas_priv->ndev; i++) { in tasdevice_prmg_calibdata_load()
2371 if (tas_priv->tasdevice[i].is_loaderr == true) in tasdevice_prmg_calibdata_load()
2373 else if (tas_priv->tasdevice[i].is_loaderr == false in tasdevice_prmg_calibdata_load()
2374 && tas_priv->tasdevice[i].is_loading == true) { in tasdevice_prmg_calibdata_load()
2376 tas_priv->tasdevice[i].cali_data_fmw; in tasdevice_prmg_calibdata_load()
2380 cal_fmw->calibrations; in tasdevice_prmg_calibdata_load()
2384 &(cal->dev_data)); in tasdevice_prmg_calibdata_load()
2386 tas_priv->tasdevice[i].cur_prog = prm_no; in tasdevice_prmg_calibdata_load()
2391 out: in tasdevice_prmg_calibdata_load()
2400 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in tasdevice_tuning_switch()
2401 int profile_cfg_id = tas_priv->rcabin.profile_cfg_id; in tasdevice_tuning_switch()
2403 if (tas_priv->fw_state == TASDEVICE_DSP_FW_FAIL) { in tasdevice_tuning_switch()
2404 dev_err(tas_priv->dev, "DSP bin file not loaded\n"); in tasdevice_tuning_switch()
2409 if (tas_priv->cur_prog < tas_fmw->nr_programs) { in tasdevice_tuning_switch()
2411 profile_cfg_id = tas_priv->rcabin.profile_cfg_id; in tasdevice_tuning_switch()
2413 tas_priv->cur_prog, tas_priv->cur_conf, in tasdevice_tuning_switch()
2427 MODULE_AUTHOR("Shenghao Ding, TI, <shenghao-ding@ti.com>");