Lines Matching +full:data +full:- +full:mirror

1 // SPDX-License-Identifier: GPL-2.0
25 /* tar header as defined in POSIX 1003.1-1990. */
64 if (eng_grp->g->engs_num > OTX_CPT_MAX_ENGINES) { in get_cores_bmap()
66 eng_grp->g->engs_num); in get_cores_bmap()
71 if (eng_grp->engs[i].type) { in get_cores_bmap()
73 eng_grp->engs[i].bmap, in get_cores_bmap()
74 eng_grp->g->engs_num); in get_cores_bmap()
75 bmap.size = eng_grp->g->engs_num; in get_cores_bmap()
82 eng_grp->idx); in get_cores_bmap()
94 return is_eng_type(eng_grps->eng_types_supported, eng_type); in dev_supports_eng_type()
100 strscpy(ucode->filename, filename, OTX_CPT_UCODE_NAME_LENGTH); in set_ucode_filename()
141 strscpy(tmp_ver_str, ucode_hdr->ver_str, OTX_CPT_UCODE_VER_STR_SZ); in get_ucode_type()
145 nn = ucode_hdr->ver_num.nn; in get_ucode_type()
146 if (strnstr(tmp_ver_str, "se-", OTX_CPT_UCODE_VER_STR_SZ) && in get_ucode_type()
157 return -EINVAL; in get_ucode_type()
160 return -EINVAL; in get_ucode_type()
182 bmap = get_cores_bmap(&cpt->pdev->dev, eng_grp); in cpt_set_ucode_base()
184 return -EINVAL; in cpt_set_ucode_base()
186 if (eng_grp->mirror.is_ena) in cpt_set_ucode_base()
188 eng_grp->g->grp[eng_grp->mirror.idx].ucode[0].align_dma; in cpt_set_ucode_base()
190 dma_addr = eng_grp->ucode[0].align_dma; in cpt_set_ucode_base()
197 if (!eng_grp->g->eng_ref_cnt[i]) in cpt_set_ucode_base()
198 writeq((u64) dma_addr, cpt->reg_base + in cpt_set_ucode_base()
212 bmap = get_cores_bmap(&cpt->pdev->dev, eng_grp); in cpt_detach_and_disable_cores()
214 return -EINVAL; in cpt_detach_and_disable_cores()
217 reg = readq(cpt->reg_base + OTX_CPT_PF_GX_EN(eng_grp->idx)); in cpt_detach_and_disable_cores()
220 eng_grp->g->eng_ref_cnt[i]--; in cpt_detach_and_disable_cores()
224 writeq(reg, cpt->reg_base + OTX_CPT_PF_GX_EN(eng_grp->idx)); in cpt_detach_and_disable_cores()
230 if (timeout-- < 0) in cpt_detach_and_disable_cores()
231 return -EBUSY; in cpt_detach_and_disable_cores()
233 reg = readq(cpt->reg_base + OTX_CPT_PF_EXEC_BUSY); in cpt_detach_and_disable_cores()
242 reg = readq(cpt->reg_base + OTX_CPT_PF_EXE_CTL); in cpt_detach_and_disable_cores()
244 if (!eng_grp->g->eng_ref_cnt[i]) in cpt_detach_and_disable_cores()
246 writeq(reg, cpt->reg_base + OTX_CPT_PF_EXE_CTL); in cpt_detach_and_disable_cores()
259 bmap = get_cores_bmap(&cpt->pdev->dev, eng_grp); in cpt_attach_and_enable_cores()
261 return -EINVAL; in cpt_attach_and_enable_cores()
264 reg = readq(cpt->reg_base + OTX_CPT_PF_GX_EN(eng_grp->idx)); in cpt_attach_and_enable_cores()
267 eng_grp->g->eng_ref_cnt[i]++; in cpt_attach_and_enable_cores()
271 writeq(reg, cpt->reg_base + OTX_CPT_PF_GX_EN(eng_grp->idx)); in cpt_attach_and_enable_cores()
274 reg = readq(cpt->reg_base + OTX_CPT_PF_EXE_CTL); in cpt_attach_and_enable_cores()
277 writeq(reg, cpt->reg_base + OTX_CPT_PF_EXE_CTL); in cpt_attach_and_enable_cores()
284 const u8 *data, u32 size) in process_tar_file() argument
299 ucode_hdr = (struct otx_cpt_ucode_hdr *) data; in process_tar_file()
307 code_length = ntohl(ucode_hdr->code_length); in process_tar_file()
310 return -EINVAL; in process_tar_file()
317 return -EINVAL; in process_tar_file()
322 return -ENOMEM; in process_tar_file()
324 tar_info->ucode_ptr = data; in process_tar_file()
325 set_ucode_filename(&tar_info->ucode, filename); in process_tar_file()
326 memcpy(tar_info->ucode.ver_str, ucode_hdr->ver_str, in process_tar_file()
328 tar_info->ucode.ver_num = ucode_hdr->ver_num; in process_tar_file()
329 tar_info->ucode.type = ucode_type; in process_tar_file()
330 tar_info->ucode.size = ucode_size; in process_tar_file()
331 list_add_tail(&tar_info->list, &tar_arch->ucodes); in process_tar_file()
343 list_for_each_entry_safe(curr, temp, &tar_arch->ucodes, list) { in release_tar_archive()
344 list_del(&curr->list); in release_tar_archive()
348 if (tar_arch->fw) in release_tar_archive()
349 release_firmware(tar_arch->fw); in release_tar_archive()
359 list_for_each_entry(curr, &tar_arch->ucodes, list) { in get_uc_from_tar_archive()
360 if (!is_eng_type(curr->ucode.type, ucode_type)) in get_uc_from_tar_archive()
373 if (uc_found->ucode.ver_num.nn == OTX_CPT_SE_UC_TYPE2 || in get_uc_from_tar_archive()
374 (uc_found->ucode.ver_num.nn == OTX_CPT_SE_UC_TYPE3 in get_uc_from_tar_archive()
375 && curr->ucode.ver_num.nn == OTX_CPT_SE_UC_TYPE1)) in get_uc_from_tar_archive()
390 pr_debug("Tar archive pointer %p, size %ld\n", tar_arch->fw->data, in print_tar_dbg_info()
391 tar_arch->fw->size); in print_tar_dbg_info()
392 list_for_each_entry(curr, &tar_arch->ucodes, list) { in print_tar_dbg_info()
393 pr_debug("Ucode filename %s\n", curr->ucode.filename); in print_tar_dbg_info()
394 pr_debug("Ucode version string %s\n", curr->ucode.ver_str); in print_tar_dbg_info()
396 curr->ucode.ver_num.nn, curr->ucode.ver_num.xx, in print_tar_dbg_info()
397 curr->ucode.ver_num.yy, curr->ucode.ver_num.zz); in print_tar_dbg_info()
398 pr_debug("Ucode type (%d) %s\n", curr->ucode.type, in print_tar_dbg_info()
399 get_ucode_type_str(curr->ucode.type)); in print_tar_dbg_info()
400 pr_debug("Ucode size %d\n", curr->ucode.size); in print_tar_dbg_info()
401 pr_debug("Ucode ptr %p\n", curr->ucode_ptr); in print_tar_dbg_info()
419 INIT_LIST_HEAD(&tar_arch->ucodes); in load_tar_archive()
422 ret = request_firmware(&tar_arch->fw, tar_filename, dev); in load_tar_archive()
426 if (tar_arch->fw->size < TAR_BLOCK_LEN) { in load_tar_archive()
431 tar_size = tar_arch->fw->size; in load_tar_archive()
432 tar_blk = (struct tar_blk_t *) tar_arch->fw->data; in load_tar_archive()
433 if (strncmp(tar_blk->hdr.magic, TAR_MAGIC, TAR_MAGIC_LEN - 1)) { in load_tar_archive()
441 ret = kstrtouint(tar_blk->hdr.size, 8, &cur_size); in load_tar_archive()
452 if (tar_blk->hdr.typeflag == REGTYPE || in load_tar_archive()
453 tar_blk->hdr.typeflag == AREGTYPE) { in load_tar_archive()
455 tar_blk->hdr.name, in load_tar_archive()
456 &tar_arch->fw->data[tar_offs], in load_tar_archive()
472 if (is_mem_zero(&tar_arch->fw->data[tar_offs], in load_tar_archive()
477 tar_blk = (struct tar_blk_t *) &tar_arch->fw->data[tar_offs]; in load_tar_archive()
494 if (!eng_grp->engs[i].type) in find_engines_by_type()
497 if (eng_grp->engs[i].type == eng_type) in find_engines_by_type()
498 return &eng_grp->engs[i]; in find_engines_by_type()
505 return is_eng_type(ucode->type, eng_type); in otx_cpt_uc_supports_eng_type()
523 if (eng_grp->mirror.is_ena) { in print_ucode_info()
525 eng_grp->g->grp[eng_grp->mirror.idx].ucode[0].ver_str, in print_ucode_info()
526 eng_grp->mirror.idx); in print_ucode_info()
528 scnprintf(buf, size, "%s", eng_grp->ucode[0].ver_str); in print_ucode_info()
541 engs = &eng_grp->engs[i]; in print_engs_info()
542 if (!engs->type) in print_engs_info()
544 if (idx != -1 && idx != i) in print_engs_info()
547 if (eng_grp->mirror.is_ena) in print_engs_info()
549 &eng_grp->g->grp[eng_grp->mirror.idx], in print_engs_info()
550 engs->type); in print_engs_info()
551 if (i > 0 && idx == -1) { in print_engs_info()
553 scnprintf(buf+len, size-len, ", "); in print_engs_info()
557 scnprintf(buf+len, size-len, "%d %s ", mirrored_engs ? in print_engs_info()
558 engs->count + mirrored_engs->count : engs->count, in print_engs_info()
559 get_eng_type_str(engs->type)); in print_engs_info()
562 scnprintf(buf+len, size-len, in print_engs_info()
564 engs->count <= 0 ? engs->count + in print_engs_info()
565 mirrored_engs->count : mirrored_engs->count, in print_engs_info()
566 eng_grp->mirror.idx); in print_engs_info()
574 pr_debug("Ucode version string %s\n", ucode->ver_str); in print_ucode_dbg_info()
575 pr_debug("Ucode version %d.%d.%d.%d\n", ucode->ver_num.nn, in print_ucode_dbg_info()
576 ucode->ver_num.xx, ucode->ver_num.yy, ucode->ver_num.zz); in print_ucode_dbg_info()
577 pr_debug("Ucode type %s\n", get_ucode_type_str(ucode->type)); in print_ucode_dbg_info()
578 pr_debug("Ucode size %d\n", ucode->size); in print_ucode_dbg_info()
579 pr_debug("Ucode virt address %16.16llx\n", (u64)ucode->align_va); in print_ucode_dbg_info()
580 pr_debug("Ucode phys address %16.16llx\n", ucode->align_dma); in print_ucode_dbg_info()
612 eng_grps->avail.max_se_cnt, eng_grps->avail.max_ae_cnt); in print_dbg_info()
613 pr_debug("free SE %d\n", eng_grps->avail.se_cnt); in print_dbg_info()
614 pr_debug("free AE %d\n", eng_grps->avail.ae_cnt); in print_dbg_info()
617 grp = &eng_grps->grp[i]; in print_dbg_info()
618 pr_debug("engine_group%d, state %s\n", i, grp->is_enabled ? in print_dbg_info()
620 if (grp->is_enabled) { in print_dbg_info()
621 mirrored_grp = &eng_grps->grp[grp->mirror.idx]; in print_dbg_info()
623 grp->mirror.is_ena ? in print_dbg_info()
624 mirrored_grp->ucode[0].filename : in print_dbg_info()
625 grp->ucode[0].filename, in print_dbg_info()
626 grp->mirror.is_ena ? in print_dbg_info()
627 mirrored_grp->ucode[0].ver_str : in print_dbg_info()
628 grp->ucode[0].ver_str); in print_dbg_info()
632 engs = &grp->engs[j]; in print_dbg_info()
633 if (engs->type) { in print_dbg_info()
637 bitmap_to_arr32(mask, engs->bmap, in print_dbg_info()
638 eng_grps->engs_num); in print_dbg_info()
644 if (grp->is_enabled) { in print_dbg_info()
656 switch (engs->type) { in update_engines_avail_count()
658 avail->se_cnt += val; in update_engines_avail_count()
662 avail->ae_cnt += val; in update_engines_avail_count()
666 dev_err(dev, "Invalid engine type %d\n", engs->type); in update_engines_avail_count()
667 return -EINVAL; in update_engines_avail_count()
677 switch (engs->type) { in update_engines_offset()
679 engs->offset = 0; in update_engines_offset()
683 engs->offset = avail->max_se_cnt; in update_engines_offset()
687 dev_err(dev, "Invalid engine type %d\n", engs->type); in update_engines_offset()
688 return -EINVAL; in update_engines_offset()
699 if (!grp->engs[i].type) in release_engines()
702 if (grp->engs[i].count > 0) { in release_engines()
703 ret = update_engines_avail_count(dev, &grp->g->avail, in release_engines()
704 &grp->engs[i], in release_engines()
705 grp->engs[i].count); in release_engines()
710 grp->engs[i].type = 0; in release_engines()
711 grp->engs[i].count = 0; in release_engines()
712 grp->engs[i].offset = 0; in release_engines()
713 grp->engs[i].ucode = NULL; in release_engines()
714 bitmap_zero(grp->engs[i].bmap, grp->g->engs_num); in release_engines()
728 if (!grp->engs[i].type) { in do_reserve_engines()
729 engs = &grp->engs[i]; in do_reserve_engines()
735 return -ENOMEM; in do_reserve_engines()
737 engs->type = req_engs->type; in do_reserve_engines()
738 engs->count = req_engs->count; in do_reserve_engines()
740 ret = update_engines_offset(dev, &grp->g->avail, engs); in do_reserve_engines()
744 if (engs->count > 0) { in do_reserve_engines()
745 ret = update_engines_avail_count(dev, &grp->g->avail, engs, in do_reserve_engines()
746 -engs->count); in do_reserve_engines()
760 switch (req_eng->type) { in check_engines_availability()
762 avail_cnt = grp->g->avail.se_cnt; in check_engines_availability()
766 avail_cnt = grp->g->avail.ae_cnt; in check_engines_availability()
770 dev_err(dev, "Invalid engine type %d\n", req_eng->type); in check_engines_availability()
771 return -EINVAL; in check_engines_availability()
774 if (avail_cnt < req_eng->count) { in check_engines_availability()
777 get_eng_type_str(req_eng->type), in check_engines_availability()
778 avail_cnt, req_eng->count); in check_engines_availability()
779 return -EBUSY; in check_engines_availability()
817 mutex_lock(&eng_grp->g->lock); in eng_grp_info_show()
819 print_engs_info(eng_grp, engs_info, 2*OTX_CPT_UCODE_NAME_LENGTH, -1); in eng_grp_info_show()
827 mutex_unlock(&eng_grp->g->lock); in eng_grp_info_show()
834 eng_grp->info_attr.show = eng_grp_info_show; in create_sysfs_eng_grps_info()
835 eng_grp->info_attr.store = NULL; in create_sysfs_eng_grps_info()
836 eng_grp->info_attr.attr.name = eng_grp->sysfs_info_name; in create_sysfs_eng_grps_info()
837 eng_grp->info_attr.attr.mode = 0440; in create_sysfs_eng_grps_info()
838 sysfs_attr_init(&eng_grp->info_attr.attr); in create_sysfs_eng_grps_info()
839 return device_create_file(dev, &eng_grp->info_attr); in create_sysfs_eng_grps_info()
844 if (ucode->va) { in ucode_unload()
845 dma_free_coherent(dev, ucode->size + OTX_CPT_UCODE_ALIGNMENT, in ucode_unload()
846 ucode->va, ucode->dma); in ucode_unload()
847 ucode->va = NULL; in ucode_unload()
848 ucode->align_va = NULL; in ucode_unload()
849 ucode->dma = 0; in ucode_unload()
850 ucode->align_dma = 0; in ucode_unload()
851 ucode->size = 0; in ucode_unload()
854 memset(&ucode->ver_str, 0, OTX_CPT_UCODE_VER_STR_SZ); in ucode_unload()
855 memset(&ucode->ver_num, 0, sizeof(struct otx_cpt_ucode_ver_num)); in ucode_unload()
857 ucode->type = 0; in ucode_unload()
867 ucode->va = dma_alloc_coherent(dev, ucode->size + in copy_ucode_to_dma_mem()
869 &ucode->dma, GFP_KERNEL); in copy_ucode_to_dma_mem()
870 if (!ucode->va) { in copy_ucode_to_dma_mem()
872 return -ENOMEM; in copy_ucode_to_dma_mem()
874 ucode->align_va = PTR_ALIGN(ucode->va, OTX_CPT_UCODE_ALIGNMENT); in copy_ucode_to_dma_mem()
875 ucode->align_dma = PTR_ALIGN(ucode->dma, OTX_CPT_UCODE_ALIGNMENT); in copy_ucode_to_dma_mem()
877 memcpy((void *) ucode->align_va, (void *) ucode_data + in copy_ucode_to_dma_mem()
878 sizeof(struct otx_cpt_ucode_hdr), ucode->size); in copy_ucode_to_dma_mem()
880 /* Byte swap 64-bit */ in copy_ucode_to_dma_mem()
881 for (i = 0; i < (ucode->size / 8); i++) in copy_ucode_to_dma_mem()
882 ((__be64 *)ucode->align_va)[i] = in copy_ucode_to_dma_mem()
883 cpu_to_be64(((u64 *)ucode->align_va)[i]); in copy_ucode_to_dma_mem()
884 /* Ucode needs 16-bit swap */ in copy_ucode_to_dma_mem()
885 for (i = 0; i < (ucode->size / 2); i++) in copy_ucode_to_dma_mem()
886 ((__be16 *)ucode->align_va)[i] = in copy_ucode_to_dma_mem()
887 cpu_to_be16(((u16 *)ucode->align_va)[i]); in copy_ucode_to_dma_mem()
900 ret = request_firmware(&fw, ucode->filename, dev); in ucode_load()
904 ucode_hdr = (struct otx_cpt_ucode_hdr *) fw->data; in ucode_load()
905 memcpy(ucode->ver_str, ucode_hdr->ver_str, OTX_CPT_UCODE_VER_STR_SZ); in ucode_load()
906 ucode->ver_num = ucode_hdr->ver_num; in ucode_load()
907 code_length = ntohl(ucode_hdr->code_length); in ucode_load()
910 ret = -EINVAL; in ucode_load()
913 ucode->size = code_length * 2; in ucode_load()
914 if (!ucode->size || (fw->size < round_up(ucode->size, 16) in ucode_load()
917 ret = -EINVAL; in ucode_load()
921 ret = get_ucode_type(ucode_hdr, &ucode->type); in ucode_load()
924 ucode->filename, ucode->type); in ucode_load()
928 ret = copy_ucode_to_dma_mem(dev, ucode, fw->data); in ucode_load()
962 ucode_unload(dev, &eng_grp->ucode[0]); in disable_eng_grp()
965 if (!eng_grp->engs[i].type) in disable_eng_grp()
968 eng_grp->engs[i].ucode = &eng_grp->ucode[0]; in disable_eng_grp()
980 src_grp->mirror.is_ena = false; in setup_eng_grp_mirroring()
981 src_grp->mirror.idx = 0; in setup_eng_grp_mirroring()
982 src_grp->mirror.ref_count++; in setup_eng_grp_mirroring()
985 dst_grp->mirror.is_ena = true; in setup_eng_grp_mirroring()
986 dst_grp->mirror.idx = src_grp->idx; in setup_eng_grp_mirroring()
987 dst_grp->mirror.ref_count = 0; in setup_eng_grp_mirroring()
994 if (!dst_grp->mirror.is_ena) in remove_eng_grp_mirroring()
997 src_grp = &dst_grp->g->grp[dst_grp->mirror.idx]; in remove_eng_grp_mirroring()
999 src_grp->mirror.ref_count--; in remove_eng_grp_mirroring()
1000 dst_grp->mirror.is_ena = false; in remove_eng_grp_mirroring()
1001 dst_grp->mirror.idx = 0; in remove_eng_grp_mirroring()
1002 dst_grp->mirror.ref_count = 0; in remove_eng_grp_mirroring()
1031 engs[i].count -= mirrored_engs->count; in update_requested_engs()
1038 struct otx_cpt_eng_grps *eng_grps = grp->g; in find_mirrored_eng_grp()
1042 if (!eng_grps->grp[i].is_enabled) in find_mirrored_eng_grp()
1044 if (eng_grps->grp[i].ucode[0].type) in find_mirrored_eng_grp()
1046 if (grp->idx == i) in find_mirrored_eng_grp()
1048 if (!strncasecmp(eng_grps->grp[i].ucode[0].ver_str, in find_mirrored_eng_grp()
1049 grp->ucode[0].ver_str, in find_mirrored_eng_grp()
1051 return &eng_grps->grp[i]; in find_mirrored_eng_grp()
1063 if (!eng_grps->grp[i].is_enabled) in find_unused_eng_grp()
1064 return &eng_grps->grp[i]; in find_unused_eng_grp()
1078 engs = &eng_grp->engs[i]; in eng_grp_update_masks()
1079 if (!engs->type) in eng_grp_update_masks()
1081 if (engs->count <= 0) in eng_grp_update_masks()
1084 switch (engs->type) { in eng_grp_update_masks()
1086 max_cnt = eng_grp->g->avail.max_se_cnt; in eng_grp_update_masks()
1090 max_cnt = eng_grp->g->avail.max_ae_cnt; in eng_grp_update_masks()
1094 dev_err(dev, "Invalid engine type %d\n", engs->type); in eng_grp_update_masks()
1095 return -EINVAL; in eng_grp_update_masks()
1098 cnt = engs->count; in eng_grp_update_masks()
1099 WARN_ON(engs->offset + max_cnt > OTX_CPT_MAX_ENGINES); in eng_grp_update_masks()
1100 bitmap_zero(tmp_bmap.bits, eng_grp->g->engs_num); in eng_grp_update_masks()
1101 for (j = engs->offset; j < engs->offset + max_cnt; j++) { in eng_grp_update_masks()
1102 if (!eng_grp->g->eng_ref_cnt[j]) { in eng_grp_update_masks()
1104 cnt--; in eng_grp_update_masks()
1111 return -ENOSPC; in eng_grp_update_masks()
1113 bitmap_copy(engs->bmap, tmp_bmap.bits, eng_grp->g->engs_num); in eng_grp_update_masks()
1116 if (!eng_grp->mirror.is_ena) in eng_grp_update_masks()
1120 engs = &eng_grp->engs[i]; in eng_grp_update_masks()
1121 if (!engs->type) in eng_grp_update_masks()
1125 &eng_grp->g->grp[eng_grp->mirror.idx], in eng_grp_update_masks()
1126 engs->type); in eng_grp_update_masks()
1127 WARN_ON(!mirrored_engs && engs->count <= 0); in eng_grp_update_masks()
1131 bitmap_copy(tmp_bmap.bits, mirrored_engs->bmap, in eng_grp_update_masks()
1132 eng_grp->g->engs_num); in eng_grp_update_masks()
1133 if (engs->count < 0) { in eng_grp_update_masks()
1134 bit = find_first_bit(mirrored_engs->bmap, in eng_grp_update_masks()
1135 eng_grp->g->engs_num); in eng_grp_update_masks()
1136 bitmap_clear(tmp_bmap.bits, bit, -engs->count); in eng_grp_update_masks()
1138 bitmap_or(engs->bmap, engs->bmap, tmp_bmap.bits, in eng_grp_update_masks()
1139 eng_grp->g->engs_num); in eng_grp_update_masks()
1149 if (!eng_grp->is_enabled) in delete_engine_group()
1150 return -EINVAL; in delete_engine_group()
1152 if (eng_grp->mirror.ref_count) { in delete_engine_group()
1154 eng_grp->idx); in delete_engine_group()
1156 if (eng_grp->g->grp[i].mirror.is_ena && in delete_engine_group()
1157 eng_grp->g->grp[i].mirror.idx == eng_grp->idx) in delete_engine_group()
1161 return -EINVAL; in delete_engine_group()
1168 ret = disable_eng_grp(dev, eng_grp, eng_grp->g->obj); in delete_engine_group()
1177 device_remove_file(dev, &eng_grp->info_attr); in delete_engine_group()
1178 eng_grp->is_enabled = false; in delete_engine_group()
1191 if (!otx_cpt_uc_supports_eng_type(&eng_grp->ucode[0], in validate_1_ucode_scenario()
1195 eng_grp->ucode[0].filename, in validate_1_ucode_scenario()
1197 return -EINVAL; in validate_1_ucode_scenario()
1207 if (eng_grp->mirror.is_ena) in update_ucode_ptrs()
1208 ucode = &eng_grp->g->grp[eng_grp->mirror.idx].ucode[0]; in update_ucode_ptrs()
1210 ucode = &eng_grp->ucode[0]; in update_ucode_ptrs()
1211 WARN_ON(!eng_grp->engs[0].type); in update_ucode_ptrs()
1212 eng_grp->engs[0].ucode = ucode; in update_ucode_ptrs()
1227 return -EINVAL; in create_engine_group()
1234 return -EPERM; in create_engine_group()
1241 return -ENOSPC; in create_engine_group()
1248 eng_grp->ucode[i] = tar_info->ucode; in create_engine_group()
1249 ret = copy_ucode_to_dma_mem(dev, &eng_grp->ucode[i], in create_engine_group()
1250 tar_info->ucode_ptr); in create_engine_group()
1252 ret = ucode_load(dev, &eng_grp->ucode[i], in create_engine_group()
1295 ret = enable_eng_grp(eng_grp, eng_grps->obj); in create_engine_group()
1304 if (eng_grp->mirror.is_ena) in create_engine_group()
1305 ucode_unload(dev, &eng_grp->ucode[0]); in create_engine_group()
1307 eng_grp->is_enabled = true; in create_engine_group()
1308 if (eng_grp->mirror.is_ena) in create_engine_group()
1311 eng_grp->idx, mirrored_eng_grp->ucode[0].ver_str, in create_engine_group()
1312 mirrored_eng_grp->idx); in create_engine_group()
1315 eng_grp->idx, eng_grp->ucode[0].ver_str); in create_engine_group()
1322 ucode_unload(dev, &eng_grp->ucode[0]); in create_engine_group()
1335 int grp_idx = 0, ret = -EINVAL; in ucode_load_store()
1337 int del_grp_idx = -1; in ucode_load_store()
1341 return -EINVAL; in ucode_load_store()
1359 if (del_grp_idx != -1) in ucode_load_store()
1409 if (del_grp_idx == -1) { in ucode_load_store()
1426 ret = -EINVAL; in ucode_load_store()
1430 if (!eng_grps->grp[del_grp_idx].is_enabled) { in ucode_load_store()
1433 ret = -EINVAL; in ucode_load_store()
1441 mutex_lock(&eng_grps->lock); in ucode_load_store()
1443 if (eng_grps->is_rdonly) { in ucode_load_store()
1445 ret = -EACCES; in ucode_load_store()
1449 if (del_grp_idx == -1) in ucode_load_store()
1456 ret = delete_engine_group(dev, &eng_grps->grp[del_grp_idx]); in ucode_load_store()
1462 mutex_unlock(&eng_grps->lock); in ucode_load_store()
1480 mutex_lock(&eng_grps->lock); in otx_cpt_try_create_default_eng_grps()
1486 if (eng_grps->is_first_try) in otx_cpt_try_create_default_eng_grps()
1488 eng_grps->is_first_try = true; in otx_cpt_try_create_default_eng_grps()
1492 if (eng_grps->grp[i].is_enabled) in otx_cpt_try_create_default_eng_grps()
1502 dev_err(&pdev->dev, "Unknown PF type %d\n", pf_type); in otx_cpt_try_create_default_eng_grps()
1503 ret = -EINVAL; in otx_cpt_try_create_default_eng_grps()
1507 tar_arch = load_tar_archive(&pdev->dev, tar_filename); in otx_cpt_try_create_default_eng_grps()
1521 engs[0].count = eng_grps->avail.max_se_cnt; in otx_cpt_try_create_default_eng_grps()
1523 ret = create_engine_group(&pdev->dev, eng_grps, engs, 1, in otx_cpt_try_create_default_eng_grps()
1538 engs[0].count = eng_grps->avail.max_ae_cnt; in otx_cpt_try_create_default_eng_grps()
1540 ret = create_engine_group(&pdev->dev, eng_grps, engs, 1, in otx_cpt_try_create_default_eng_grps()
1546 print_dbg_info(&pdev->dev, eng_grps); in otx_cpt_try_create_default_eng_grps()
1550 mutex_unlock(&eng_grps->lock); in otx_cpt_try_create_default_eng_grps()
1557 mutex_lock(&eng_grps->lock); in otx_cpt_set_eng_grps_is_rdonly()
1559 eng_grps->is_rdonly = is_rdonly; in otx_cpt_set_eng_grps_is_rdonly()
1561 mutex_unlock(&eng_grps->lock); in otx_cpt_set_eng_grps_is_rdonly()
1571 writeq(0, cpt->reg_base + OTX_CPT_PF_GX_EN(grp)); in otx_cpt_disable_all_cores()
1575 reg = readq(cpt->reg_base + OTX_CPT_PF_EXEC_BUSY); in otx_cpt_disable_all_cores()
1578 reg = readq(cpt->reg_base + OTX_CPT_PF_EXEC_BUSY); in otx_cpt_disable_all_cores()
1579 if (timeout--) { in otx_cpt_disable_all_cores()
1580 dev_warn(&cpt->pdev->dev, "Cores still busy\n"); in otx_cpt_disable_all_cores()
1586 writeq(0, cpt->reg_base + OTX_CPT_PF_EXE_CTL); in otx_cpt_disable_all_cores()
1595 mutex_lock(&eng_grps->lock); in otx_cpt_cleanup_eng_grps()
1596 if (eng_grps->is_ucode_load_created) { in otx_cpt_cleanup_eng_grps()
1597 device_remove_file(&pdev->dev, in otx_cpt_cleanup_eng_grps()
1598 &eng_grps->ucode_load_attr); in otx_cpt_cleanup_eng_grps()
1599 eng_grps->is_ucode_load_created = false; in otx_cpt_cleanup_eng_grps()
1604 if (eng_grps->grp[i].mirror.is_ena) in otx_cpt_cleanup_eng_grps()
1605 delete_engine_group(&pdev->dev, &eng_grps->grp[i]); in otx_cpt_cleanup_eng_grps()
1609 delete_engine_group(&pdev->dev, &eng_grps->grp[i]); in otx_cpt_cleanup_eng_grps()
1613 grp = &eng_grps->grp[i]; in otx_cpt_cleanup_eng_grps()
1615 kfree(grp->engs[j].bmap); in otx_cpt_cleanup_eng_grps()
1616 grp->engs[j].bmap = NULL; in otx_cpt_cleanup_eng_grps()
1620 mutex_unlock(&eng_grps->lock); in otx_cpt_cleanup_eng_grps()
1629 mutex_init(&eng_grps->lock); in otx_cpt_init_eng_grps()
1630 eng_grps->obj = pci_get_drvdata(pdev); in otx_cpt_init_eng_grps()
1631 eng_grps->avail.se_cnt = eng_grps->avail.max_se_cnt; in otx_cpt_init_eng_grps()
1632 eng_grps->avail.ae_cnt = eng_grps->avail.max_ae_cnt; in otx_cpt_init_eng_grps()
1634 eng_grps->engs_num = eng_grps->avail.max_se_cnt + in otx_cpt_init_eng_grps()
1635 eng_grps->avail.max_ae_cnt; in otx_cpt_init_eng_grps()
1636 if (eng_grps->engs_num > OTX_CPT_MAX_ENGINES) { in otx_cpt_init_eng_grps()
1637 dev_err(&pdev->dev, in otx_cpt_init_eng_grps()
1639 eng_grps->engs_num, OTX_CPT_MAX_ENGINES); in otx_cpt_init_eng_grps()
1640 ret = -EINVAL; in otx_cpt_init_eng_grps()
1645 grp = &eng_grps->grp[i]; in otx_cpt_init_eng_grps()
1646 grp->g = eng_grps; in otx_cpt_init_eng_grps()
1647 grp->idx = i; in otx_cpt_init_eng_grps()
1649 snprintf(grp->sysfs_info_name, OTX_CPT_UCODE_NAME_LENGTH, in otx_cpt_init_eng_grps()
1652 grp->engs[j].bmap = in otx_cpt_init_eng_grps()
1653 kcalloc(BITS_TO_LONGS(eng_grps->engs_num), in otx_cpt_init_eng_grps()
1655 if (!grp->engs[j].bmap) { in otx_cpt_init_eng_grps()
1656 ret = -ENOMEM; in otx_cpt_init_eng_grps()
1665 eng_grps->eng_types_supported = 1 << OTX_CPT_SE_TYPES; in otx_cpt_init_eng_grps()
1670 eng_grps->eng_types_supported = 1 << OTX_CPT_AE_TYPES; in otx_cpt_init_eng_grps()
1674 dev_err(&pdev->dev, "Unknown PF type %d\n", pf_type); in otx_cpt_init_eng_grps()
1675 ret = -EINVAL; in otx_cpt_init_eng_grps()
1679 eng_grps->ucode_load_attr.show = NULL; in otx_cpt_init_eng_grps()
1680 eng_grps->ucode_load_attr.store = ucode_load_store; in otx_cpt_init_eng_grps()
1681 eng_grps->ucode_load_attr.attr.name = "ucode_load"; in otx_cpt_init_eng_grps()
1682 eng_grps->ucode_load_attr.attr.mode = 0220; in otx_cpt_init_eng_grps()
1683 sysfs_attr_init(&eng_grps->ucode_load_attr.attr); in otx_cpt_init_eng_grps()
1684 ret = device_create_file(&pdev->dev, in otx_cpt_init_eng_grps()
1685 &eng_grps->ucode_load_attr); in otx_cpt_init_eng_grps()
1688 eng_grps->is_ucode_load_created = true; in otx_cpt_init_eng_grps()
1690 print_dbg_info(&pdev->dev, eng_grps); in otx_cpt_init_eng_grps()