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

1 // SPDX-License-Identifier: GPL-2.0
26 /* tar header as defined in POSIX 1003.1-1990. */
65 if (eng_grp->g->engs_num > OTX_CPT_MAX_ENGINES) { in get_cores_bmap()
67 eng_grp->g->engs_num); in get_cores_bmap()
72 if (eng_grp->engs[i].type) { in get_cores_bmap()
74 eng_grp->engs[i].bmap, in get_cores_bmap()
75 eng_grp->g->engs_num); in get_cores_bmap()
76 bmap.size = eng_grp->g->engs_num; in get_cores_bmap()
83 eng_grp->idx); in get_cores_bmap()
95 return is_eng_type(eng_grps->eng_types_supported, eng_type); in dev_supports_eng_type()
101 strscpy(ucode->filename, filename, OTX_CPT_UCODE_NAME_LENGTH); in set_ucode_filename()
142 strscpy(tmp_ver_str, ucode_hdr->ver_str, OTX_CPT_UCODE_VER_STR_SZ); in get_ucode_type()
146 nn = ucode_hdr->ver_num.nn; in get_ucode_type()
147 if (strnstr(tmp_ver_str, "se-", OTX_CPT_UCODE_VER_STR_SZ) && in get_ucode_type()
158 return -EINVAL; in get_ucode_type()
161 return -EINVAL; in get_ucode_type()
183 bmap = get_cores_bmap(&cpt->pdev->dev, eng_grp); in cpt_set_ucode_base()
185 return -EINVAL; in cpt_set_ucode_base()
187 if (eng_grp->mirror.is_ena) in cpt_set_ucode_base()
189 eng_grp->g->grp[eng_grp->mirror.idx].ucode[0].align_dma; in cpt_set_ucode_base()
191 dma_addr = eng_grp->ucode[0].align_dma; in cpt_set_ucode_base()
198 if (!eng_grp->g->eng_ref_cnt[i]) in cpt_set_ucode_base()
199 writeq((u64) dma_addr, cpt->reg_base + in cpt_set_ucode_base()
213 bmap = get_cores_bmap(&cpt->pdev->dev, eng_grp); in cpt_detach_and_disable_cores()
215 return -EINVAL; in cpt_detach_and_disable_cores()
218 reg = readq(cpt->reg_base + OTX_CPT_PF_GX_EN(eng_grp->idx)); in cpt_detach_and_disable_cores()
221 eng_grp->g->eng_ref_cnt[i]--; in cpt_detach_and_disable_cores()
225 writeq(reg, cpt->reg_base + OTX_CPT_PF_GX_EN(eng_grp->idx)); in cpt_detach_and_disable_cores()
231 if (timeout-- < 0) in cpt_detach_and_disable_cores()
232 return -EBUSY; in cpt_detach_and_disable_cores()
234 reg = readq(cpt->reg_base + OTX_CPT_PF_EXEC_BUSY); in cpt_detach_and_disable_cores()
243 reg = readq(cpt->reg_base + OTX_CPT_PF_EXE_CTL); in cpt_detach_and_disable_cores()
245 if (!eng_grp->g->eng_ref_cnt[i]) in cpt_detach_and_disable_cores()
247 writeq(reg, cpt->reg_base + OTX_CPT_PF_EXE_CTL); in cpt_detach_and_disable_cores()
260 bmap = get_cores_bmap(&cpt->pdev->dev, eng_grp); in cpt_attach_and_enable_cores()
262 return -EINVAL; in cpt_attach_and_enable_cores()
265 reg = readq(cpt->reg_base + OTX_CPT_PF_GX_EN(eng_grp->idx)); in cpt_attach_and_enable_cores()
268 eng_grp->g->eng_ref_cnt[i]++; in cpt_attach_and_enable_cores()
272 writeq(reg, cpt->reg_base + OTX_CPT_PF_GX_EN(eng_grp->idx)); in cpt_attach_and_enable_cores()
275 reg = readq(cpt->reg_base + OTX_CPT_PF_EXE_CTL); in cpt_attach_and_enable_cores()
278 writeq(reg, cpt->reg_base + OTX_CPT_PF_EXE_CTL); in cpt_attach_and_enable_cores()
285 const u8 *data, u32 size) in process_tar_file() argument
300 ucode_hdr = (struct otx_cpt_ucode_hdr *) data; in process_tar_file()
308 code_length = ntohl(ucode_hdr->code_length); in process_tar_file()
311 return -EINVAL; in process_tar_file()
318 return -EINVAL; in process_tar_file()
323 return -ENOMEM; in process_tar_file()
325 tar_info->ucode_ptr = data; in process_tar_file()
326 set_ucode_filename(&tar_info->ucode, filename); in process_tar_file()
327 memcpy(tar_info->ucode.ver_str, ucode_hdr->ver_str, in process_tar_file()
329 tar_info->ucode.ver_num = ucode_hdr->ver_num; in process_tar_file()
330 tar_info->ucode.type = ucode_type; in process_tar_file()
331 tar_info->ucode.size = ucode_size; in process_tar_file()
332 list_add_tail(&tar_info->list, &tar_arch->ucodes); in process_tar_file()
344 list_for_each_entry_safe(curr, temp, &tar_arch->ucodes, list) { in release_tar_archive()
345 list_del(&curr->list); 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()
512 if (eng_grp->mirror.is_ena) { in print_ucode_info()
514 eng_grp->g->grp[eng_grp->mirror.idx].ucode[0].ver_str, in print_ucode_info()
515 eng_grp->mirror.idx); in print_ucode_info()
517 scnprintf(buf, size, "%s", eng_grp->ucode[0].ver_str); in print_ucode_info()
530 engs = &eng_grp->engs[i]; in print_engs_info()
531 if (!engs->type) in print_engs_info()
533 if (idx != -1 && idx != i) in print_engs_info()
536 if (eng_grp->mirror.is_ena) in print_engs_info()
538 &eng_grp->g->grp[eng_grp->mirror.idx], in print_engs_info()
539 engs->type); in print_engs_info()
540 if (i > 0 && idx == -1) { in print_engs_info()
542 scnprintf(buf+len, size-len, ", "); in print_engs_info()
546 scnprintf(buf+len, size-len, "%d %s ", mirrored_engs ? in print_engs_info()
547 engs->count + mirrored_engs->count : engs->count, in print_engs_info()
548 get_eng_type_str(engs->type)); in print_engs_info()
551 scnprintf(buf+len, size-len, in print_engs_info()
553 engs->count <= 0 ? engs->count + in print_engs_info()
554 mirrored_engs->count : mirrored_engs->count, in print_engs_info()
555 eng_grp->mirror.idx); in print_engs_info()
563 pr_debug("Ucode version string %s\n", ucode->ver_str); in print_ucode_dbg_info()
564 pr_debug("Ucode version %d.%d.%d.%d\n", ucode->ver_num.nn, in print_ucode_dbg_info()
565 ucode->ver_num.xx, ucode->ver_num.yy, ucode->ver_num.zz); in print_ucode_dbg_info()
566 pr_debug("Ucode type %s\n", get_ucode_type_str(ucode->type)); in print_ucode_dbg_info()
567 pr_debug("Ucode size %d\n", ucode->size); in print_ucode_dbg_info()
568 pr_debug("Ucode virt address %16.16llx\n", (u64)ucode->align_va); in print_ucode_dbg_info()
569 pr_debug("Ucode phys address %16.16llx\n", ucode->align_dma); in print_ucode_dbg_info()
601 eng_grps->avail.max_se_cnt, eng_grps->avail.max_ae_cnt); in print_dbg_info()
602 pr_debug("free SE %d\n", eng_grps->avail.se_cnt); in print_dbg_info()
603 pr_debug("free AE %d\n", eng_grps->avail.ae_cnt); in print_dbg_info()
606 grp = &eng_grps->grp[i]; in print_dbg_info()
608 str_enabled_disabled(grp->is_enabled)); in print_dbg_info()
609 if (grp->is_enabled) { in print_dbg_info()
610 mirrored_grp = &eng_grps->grp[grp->mirror.idx]; in print_dbg_info()
612 grp->mirror.is_ena ? in print_dbg_info()
613 mirrored_grp->ucode[0].filename : in print_dbg_info()
614 grp->ucode[0].filename, in print_dbg_info()
615 grp->mirror.is_ena ? in print_dbg_info()
616 mirrored_grp->ucode[0].ver_str : in print_dbg_info()
617 grp->ucode[0].ver_str); in print_dbg_info()
621 engs = &grp->engs[j]; in print_dbg_info()
622 if (engs->type) { in print_dbg_info()
626 bitmap_to_arr32(mask, engs->bmap, in print_dbg_info()
627 eng_grps->engs_num); in print_dbg_info()
633 if (grp->is_enabled) { in print_dbg_info()
645 switch (engs->type) { in update_engines_avail_count()
647 avail->se_cnt += val; in update_engines_avail_count()
651 avail->ae_cnt += val; in update_engines_avail_count()
655 dev_err(dev, "Invalid engine type %d\n", engs->type); in update_engines_avail_count()
656 return -EINVAL; in update_engines_avail_count()
666 switch (engs->type) { in update_engines_offset()
668 engs->offset = 0; in update_engines_offset()
672 engs->offset = avail->max_se_cnt; in update_engines_offset()
676 dev_err(dev, "Invalid engine type %d\n", engs->type); in update_engines_offset()
677 return -EINVAL; in update_engines_offset()
688 if (!grp->engs[i].type) in release_engines()
691 if (grp->engs[i].count > 0) { in release_engines()
692 ret = update_engines_avail_count(dev, &grp->g->avail, in release_engines()
693 &grp->engs[i], in release_engines()
694 grp->engs[i].count); in release_engines()
699 grp->engs[i].type = 0; in release_engines()
700 grp->engs[i].count = 0; in release_engines()
701 grp->engs[i].offset = 0; in release_engines()
702 grp->engs[i].ucode = NULL; in release_engines()
703 bitmap_zero(grp->engs[i].bmap, grp->g->engs_num); in release_engines()
717 if (!grp->engs[i].type) { in do_reserve_engines()
718 engs = &grp->engs[i]; in do_reserve_engines()
724 return -ENOMEM; in do_reserve_engines()
726 engs->type = req_engs->type; in do_reserve_engines()
727 engs->count = req_engs->count; in do_reserve_engines()
729 ret = update_engines_offset(dev, &grp->g->avail, engs); in do_reserve_engines()
733 if (engs->count > 0) { in do_reserve_engines()
734 ret = update_engines_avail_count(dev, &grp->g->avail, engs, in do_reserve_engines()
735 -engs->count); in do_reserve_engines()
749 switch (req_eng->type) { in check_engines_availability()
751 avail_cnt = grp->g->avail.se_cnt; in check_engines_availability()
755 avail_cnt = grp->g->avail.ae_cnt; in check_engines_availability()
759 dev_err(dev, "Invalid engine type %d\n", req_eng->type); in check_engines_availability()
760 return -EINVAL; in check_engines_availability()
763 if (avail_cnt < req_eng->count) { in check_engines_availability()
766 get_eng_type_str(req_eng->type), in check_engines_availability()
767 avail_cnt, req_eng->count); in check_engines_availability()
768 return -EBUSY; in check_engines_availability()
806 mutex_lock(&eng_grp->g->lock); in eng_grp_info_show()
808 print_engs_info(eng_grp, engs_info, 2*OTX_CPT_UCODE_NAME_LENGTH, -1); in eng_grp_info_show()
816 mutex_unlock(&eng_grp->g->lock); in eng_grp_info_show()
823 eng_grp->info_attr.show = eng_grp_info_show; in create_sysfs_eng_grps_info()
824 eng_grp->info_attr.store = NULL; in create_sysfs_eng_grps_info()
825 eng_grp->info_attr.attr.name = eng_grp->sysfs_info_name; in create_sysfs_eng_grps_info()
826 eng_grp->info_attr.attr.mode = 0440; in create_sysfs_eng_grps_info()
827 sysfs_attr_init(&eng_grp->info_attr.attr); in create_sysfs_eng_grps_info()
828 return device_create_file(dev, &eng_grp->info_attr); in create_sysfs_eng_grps_info()
833 if (ucode->va) { in ucode_unload()
834 dma_free_coherent(dev, ucode->size + OTX_CPT_UCODE_ALIGNMENT, in ucode_unload()
835 ucode->va, ucode->dma); in ucode_unload()
836 ucode->va = NULL; in ucode_unload()
837 ucode->align_va = NULL; in ucode_unload()
838 ucode->dma = 0; in ucode_unload()
839 ucode->align_dma = 0; in ucode_unload()
840 ucode->size = 0; in ucode_unload()
843 memset(&ucode->ver_str, 0, OTX_CPT_UCODE_VER_STR_SZ); in ucode_unload()
844 memset(&ucode->ver_num, 0, sizeof(struct otx_cpt_ucode_ver_num)); in ucode_unload()
846 ucode->type = 0; in ucode_unload()
856 ucode->va = dma_alloc_coherent(dev, ucode->size + in copy_ucode_to_dma_mem()
858 &ucode->dma, GFP_KERNEL); in copy_ucode_to_dma_mem()
859 if (!ucode->va) { in copy_ucode_to_dma_mem()
861 return -ENOMEM; in copy_ucode_to_dma_mem()
863 ucode->align_va = PTR_ALIGN(ucode->va, OTX_CPT_UCODE_ALIGNMENT); in copy_ucode_to_dma_mem()
864 ucode->align_dma = PTR_ALIGN(ucode->dma, OTX_CPT_UCODE_ALIGNMENT); in copy_ucode_to_dma_mem()
866 memcpy((void *) ucode->align_va, (void *) ucode_data + in copy_ucode_to_dma_mem()
867 sizeof(struct otx_cpt_ucode_hdr), ucode->size); in copy_ucode_to_dma_mem()
869 /* Byte swap 64-bit */ in copy_ucode_to_dma_mem()
870 for (i = 0; i < (ucode->size / 8); i++) in copy_ucode_to_dma_mem()
871 ((__be64 *)ucode->align_va)[i] = in copy_ucode_to_dma_mem()
872 cpu_to_be64(((u64 *)ucode->align_va)[i]); in copy_ucode_to_dma_mem()
873 /* Ucode needs 16-bit swap */ in copy_ucode_to_dma_mem()
874 for (i = 0; i < (ucode->size / 2); i++) in copy_ucode_to_dma_mem()
875 ((__be16 *)ucode->align_va)[i] = in copy_ucode_to_dma_mem()
876 cpu_to_be16(((u16 *)ucode->align_va)[i]); in copy_ucode_to_dma_mem()
889 ret = request_firmware(&fw, ucode->filename, dev); in ucode_load()
893 ucode_hdr = (struct otx_cpt_ucode_hdr *) fw->data; in ucode_load()
894 memcpy(ucode->ver_str, ucode_hdr->ver_str, OTX_CPT_UCODE_VER_STR_SZ); in ucode_load()
895 ucode->ver_num = ucode_hdr->ver_num; in ucode_load()
896 code_length = ntohl(ucode_hdr->code_length); in ucode_load()
899 ret = -EINVAL; in ucode_load()
902 ucode->size = code_length * 2; in ucode_load()
903 if (!ucode->size || (fw->size < round_up(ucode->size, 16) in ucode_load()
906 ret = -EINVAL; in ucode_load()
910 ret = get_ucode_type(ucode_hdr, &ucode->type); in ucode_load()
913 ucode->filename, ucode->type); in ucode_load()
917 ret = copy_ucode_to_dma_mem(dev, ucode, fw->data); in ucode_load()
951 ucode_unload(dev, &eng_grp->ucode[0]); in disable_eng_grp()
954 if (!eng_grp->engs[i].type) in disable_eng_grp()
957 eng_grp->engs[i].ucode = &eng_grp->ucode[0]; in disable_eng_grp()
969 src_grp->mirror.is_ena = false; in setup_eng_grp_mirroring()
970 src_grp->mirror.idx = 0; in setup_eng_grp_mirroring()
971 src_grp->mirror.ref_count++; in setup_eng_grp_mirroring()
974 dst_grp->mirror.is_ena = true; in setup_eng_grp_mirroring()
975 dst_grp->mirror.idx = src_grp->idx; in setup_eng_grp_mirroring()
976 dst_grp->mirror.ref_count = 0; in setup_eng_grp_mirroring()
983 if (!dst_grp->mirror.is_ena) in remove_eng_grp_mirroring()
986 src_grp = &dst_grp->g->grp[dst_grp->mirror.idx]; in remove_eng_grp_mirroring()
988 src_grp->mirror.ref_count--; in remove_eng_grp_mirroring()
989 dst_grp->mirror.is_ena = false; in remove_eng_grp_mirroring()
990 dst_grp->mirror.idx = 0; in remove_eng_grp_mirroring()
991 dst_grp->mirror.ref_count = 0; in remove_eng_grp_mirroring()
1020 engs[i].count -= mirrored_engs->count; in update_requested_engs()
1027 struct otx_cpt_eng_grps *eng_grps = grp->g; in find_mirrored_eng_grp()
1031 if (!eng_grps->grp[i].is_enabled) in find_mirrored_eng_grp()
1033 if (eng_grps->grp[i].ucode[0].type) in find_mirrored_eng_grp()
1035 if (grp->idx == i) in find_mirrored_eng_grp()
1037 if (!strncasecmp(eng_grps->grp[i].ucode[0].ver_str, in find_mirrored_eng_grp()
1038 grp->ucode[0].ver_str, in find_mirrored_eng_grp()
1040 return &eng_grps->grp[i]; in find_mirrored_eng_grp()
1052 if (!eng_grps->grp[i].is_enabled) in find_unused_eng_grp()
1053 return &eng_grps->grp[i]; in find_unused_eng_grp()
1067 engs = &eng_grp->engs[i]; in eng_grp_update_masks()
1068 if (!engs->type) in eng_grp_update_masks()
1070 if (engs->count <= 0) in eng_grp_update_masks()
1073 switch (engs->type) { in eng_grp_update_masks()
1075 max_cnt = eng_grp->g->avail.max_se_cnt; in eng_grp_update_masks()
1079 max_cnt = eng_grp->g->avail.max_ae_cnt; in eng_grp_update_masks()
1083 dev_err(dev, "Invalid engine type %d\n", engs->type); in eng_grp_update_masks()
1084 return -EINVAL; in eng_grp_update_masks()
1087 cnt = engs->count; in eng_grp_update_masks()
1088 WARN_ON(engs->offset + max_cnt > OTX_CPT_MAX_ENGINES); in eng_grp_update_masks()
1089 bitmap_zero(tmp_bmap.bits, eng_grp->g->engs_num); in eng_grp_update_masks()
1090 for (j = engs->offset; j < engs->offset + max_cnt; j++) { in eng_grp_update_masks()
1091 if (!eng_grp->g->eng_ref_cnt[j]) { in eng_grp_update_masks()
1093 cnt--; in eng_grp_update_masks()
1100 return -ENOSPC; in eng_grp_update_masks()
1102 bitmap_copy(engs->bmap, tmp_bmap.bits, eng_grp->g->engs_num); in eng_grp_update_masks()
1105 if (!eng_grp->mirror.is_ena) in eng_grp_update_masks()
1109 engs = &eng_grp->engs[i]; in eng_grp_update_masks()
1110 if (!engs->type) in eng_grp_update_masks()
1114 &eng_grp->g->grp[eng_grp->mirror.idx], in eng_grp_update_masks()
1115 engs->type); in eng_grp_update_masks()
1116 WARN_ON(!mirrored_engs && engs->count <= 0); in eng_grp_update_masks()
1120 bitmap_copy(tmp_bmap.bits, mirrored_engs->bmap, in eng_grp_update_masks()
1121 eng_grp->g->engs_num); in eng_grp_update_masks()
1122 if (engs->count < 0) { in eng_grp_update_masks()
1123 bit = find_first_bit(mirrored_engs->bmap, in eng_grp_update_masks()
1124 eng_grp->g->engs_num); in eng_grp_update_masks()
1125 bitmap_clear(tmp_bmap.bits, bit, -engs->count); in eng_grp_update_masks()
1127 bitmap_or(engs->bmap, engs->bmap, tmp_bmap.bits, in eng_grp_update_masks()
1128 eng_grp->g->engs_num); in eng_grp_update_masks()
1138 if (!eng_grp->is_enabled) in delete_engine_group()
1139 return -EINVAL; in delete_engine_group()
1141 if (eng_grp->mirror.ref_count) { in delete_engine_group()
1143 eng_grp->idx); in delete_engine_group()
1145 if (eng_grp->g->grp[i].mirror.is_ena && in delete_engine_group()
1146 eng_grp->g->grp[i].mirror.idx == eng_grp->idx) in delete_engine_group()
1150 return -EINVAL; in delete_engine_group()
1157 ret = disable_eng_grp(dev, eng_grp, eng_grp->g->obj); in delete_engine_group()
1166 device_remove_file(dev, &eng_grp->info_attr); in delete_engine_group()
1167 eng_grp->is_enabled = false; in delete_engine_group()
1180 if (!otx_cpt_uc_supports_eng_type(&eng_grp->ucode[0], in validate_1_ucode_scenario()
1184 eng_grp->ucode[0].filename, in validate_1_ucode_scenario()
1186 return -EINVAL; in validate_1_ucode_scenario()
1196 if (eng_grp->mirror.is_ena) in update_ucode_ptrs()
1197 ucode = &eng_grp->g->grp[eng_grp->mirror.idx].ucode[0]; in update_ucode_ptrs()
1199 ucode = &eng_grp->ucode[0]; in update_ucode_ptrs()
1200 WARN_ON(!eng_grp->engs[0].type); in update_ucode_ptrs()
1201 eng_grp->engs[0].ucode = ucode; in update_ucode_ptrs()
1216 return -EINVAL; in create_engine_group()
1223 return -EPERM; in create_engine_group()
1230 return -ENOSPC; in create_engine_group()
1237 eng_grp->ucode[i] = tar_info->ucode; in create_engine_group()
1238 ret = copy_ucode_to_dma_mem(dev, &eng_grp->ucode[i], in create_engine_group()
1239 tar_info->ucode_ptr); in create_engine_group()
1241 ret = ucode_load(dev, &eng_grp->ucode[i], in create_engine_group()
1284 ret = enable_eng_grp(eng_grp, eng_grps->obj); in create_engine_group()
1293 if (eng_grp->mirror.is_ena) in create_engine_group()
1294 ucode_unload(dev, &eng_grp->ucode[0]); in create_engine_group()
1296 eng_grp->is_enabled = true; in create_engine_group()
1297 if (eng_grp->mirror.is_ena) in create_engine_group()
1300 eng_grp->idx, mirrored_eng_grp->ucode[0].ver_str, in create_engine_group()
1301 mirrored_eng_grp->idx); in create_engine_group()
1304 eng_grp->idx, eng_grp->ucode[0].ver_str); in create_engine_group()
1311 ucode_unload(dev, &eng_grp->ucode[0]); in create_engine_group()
1324 int grp_idx = 0, ret = -EINVAL; in ucode_load_store()
1326 int del_grp_idx = -1; in ucode_load_store()
1330 return -EINVAL; in ucode_load_store()
1348 if (del_grp_idx != -1) in ucode_load_store()
1398 if (del_grp_idx == -1) { in ucode_load_store()
1415 ret = -EINVAL; in ucode_load_store()
1419 if (!eng_grps->grp[del_grp_idx].is_enabled) { in ucode_load_store()
1422 ret = -EINVAL; in ucode_load_store()
1430 mutex_lock(&eng_grps->lock); in ucode_load_store()
1432 if (eng_grps->is_rdonly) { in ucode_load_store()
1434 ret = -EACCES; in ucode_load_store()
1438 if (del_grp_idx == -1) in ucode_load_store()
1445 ret = delete_engine_group(dev, &eng_grps->grp[del_grp_idx]); in ucode_load_store()
1451 mutex_unlock(&eng_grps->lock); in ucode_load_store()
1469 mutex_lock(&eng_grps->lock); in otx_cpt_try_create_default_eng_grps()
1475 if (eng_grps->is_first_try) in otx_cpt_try_create_default_eng_grps()
1477 eng_grps->is_first_try = true; in otx_cpt_try_create_default_eng_grps()
1481 if (eng_grps->grp[i].is_enabled) in otx_cpt_try_create_default_eng_grps()
1491 dev_err(&pdev->dev, "Unknown PF type %d\n", pf_type); in otx_cpt_try_create_default_eng_grps()
1492 ret = -EINVAL; in otx_cpt_try_create_default_eng_grps()
1496 tar_arch = load_tar_archive(&pdev->dev, tar_filename); in otx_cpt_try_create_default_eng_grps()
1510 engs[0].count = eng_grps->avail.max_se_cnt; in otx_cpt_try_create_default_eng_grps()
1512 ret = create_engine_group(&pdev->dev, eng_grps, engs, 1, in otx_cpt_try_create_default_eng_grps()
1527 engs[0].count = eng_grps->avail.max_ae_cnt; in otx_cpt_try_create_default_eng_grps()
1529 ret = create_engine_group(&pdev->dev, eng_grps, engs, 1, in otx_cpt_try_create_default_eng_grps()
1535 print_dbg_info(&pdev->dev, eng_grps); in otx_cpt_try_create_default_eng_grps()
1539 mutex_unlock(&eng_grps->lock); in otx_cpt_try_create_default_eng_grps()
1546 mutex_lock(&eng_grps->lock); in otx_cpt_set_eng_grps_is_rdonly()
1548 eng_grps->is_rdonly = is_rdonly; in otx_cpt_set_eng_grps_is_rdonly()
1550 mutex_unlock(&eng_grps->lock); in otx_cpt_set_eng_grps_is_rdonly()
1560 writeq(0, cpt->reg_base + OTX_CPT_PF_GX_EN(grp)); in otx_cpt_disable_all_cores()
1564 reg = readq(cpt->reg_base + OTX_CPT_PF_EXEC_BUSY); in otx_cpt_disable_all_cores()
1567 reg = readq(cpt->reg_base + OTX_CPT_PF_EXEC_BUSY); in otx_cpt_disable_all_cores()
1568 if (timeout--) { in otx_cpt_disable_all_cores()
1569 dev_warn(&cpt->pdev->dev, "Cores still busy\n"); in otx_cpt_disable_all_cores()
1575 writeq(0, cpt->reg_base + OTX_CPT_PF_EXE_CTL); in otx_cpt_disable_all_cores()
1584 mutex_lock(&eng_grps->lock); in otx_cpt_cleanup_eng_grps()
1585 if (eng_grps->is_ucode_load_created) { in otx_cpt_cleanup_eng_grps()
1586 device_remove_file(&pdev->dev, in otx_cpt_cleanup_eng_grps()
1587 &eng_grps->ucode_load_attr); in otx_cpt_cleanup_eng_grps()
1588 eng_grps->is_ucode_load_created = false; in otx_cpt_cleanup_eng_grps()
1593 if (eng_grps->grp[i].mirror.is_ena) in otx_cpt_cleanup_eng_grps()
1594 delete_engine_group(&pdev->dev, &eng_grps->grp[i]); in otx_cpt_cleanup_eng_grps()
1598 delete_engine_group(&pdev->dev, &eng_grps->grp[i]); in otx_cpt_cleanup_eng_grps()
1602 grp = &eng_grps->grp[i]; in otx_cpt_cleanup_eng_grps()
1604 kfree(grp->engs[j].bmap); in otx_cpt_cleanup_eng_grps()
1605 grp->engs[j].bmap = NULL; in otx_cpt_cleanup_eng_grps()
1609 mutex_unlock(&eng_grps->lock); in otx_cpt_cleanup_eng_grps()
1618 mutex_init(&eng_grps->lock); in otx_cpt_init_eng_grps()
1619 eng_grps->obj = pci_get_drvdata(pdev); in otx_cpt_init_eng_grps()
1620 eng_grps->avail.se_cnt = eng_grps->avail.max_se_cnt; in otx_cpt_init_eng_grps()
1621 eng_grps->avail.ae_cnt = eng_grps->avail.max_ae_cnt; in otx_cpt_init_eng_grps()
1623 eng_grps->engs_num = eng_grps->avail.max_se_cnt + in otx_cpt_init_eng_grps()
1624 eng_grps->avail.max_ae_cnt; in otx_cpt_init_eng_grps()
1625 if (eng_grps->engs_num > OTX_CPT_MAX_ENGINES) { in otx_cpt_init_eng_grps()
1626 dev_err(&pdev->dev, in otx_cpt_init_eng_grps()
1628 eng_grps->engs_num, OTX_CPT_MAX_ENGINES); in otx_cpt_init_eng_grps()
1629 ret = -EINVAL; in otx_cpt_init_eng_grps()
1634 grp = &eng_grps->grp[i]; in otx_cpt_init_eng_grps()
1635 grp->g = eng_grps; in otx_cpt_init_eng_grps()
1636 grp->idx = i; in otx_cpt_init_eng_grps()
1638 snprintf(grp->sysfs_info_name, OTX_CPT_UCODE_NAME_LENGTH, in otx_cpt_init_eng_grps()
1641 grp->engs[j].bmap = in otx_cpt_init_eng_grps()
1642 kcalloc(BITS_TO_LONGS(eng_grps->engs_num), in otx_cpt_init_eng_grps()
1644 if (!grp->engs[j].bmap) { in otx_cpt_init_eng_grps()
1645 ret = -ENOMEM; in otx_cpt_init_eng_grps()
1654 eng_grps->eng_types_supported = 1 << OTX_CPT_SE_TYPES; in otx_cpt_init_eng_grps()
1659 eng_grps->eng_types_supported = 1 << OTX_CPT_AE_TYPES; in otx_cpt_init_eng_grps()
1663 dev_err(&pdev->dev, "Unknown PF type %d\n", pf_type); in otx_cpt_init_eng_grps()
1664 ret = -EINVAL; in otx_cpt_init_eng_grps()
1668 eng_grps->ucode_load_attr.show = NULL; in otx_cpt_init_eng_grps()
1669 eng_grps->ucode_load_attr.store = ucode_load_store; in otx_cpt_init_eng_grps()
1670 eng_grps->ucode_load_attr.attr.name = "ucode_load"; in otx_cpt_init_eng_grps()
1671 eng_grps->ucode_load_attr.attr.mode = 0220; in otx_cpt_init_eng_grps()
1672 sysfs_attr_init(&eng_grps->ucode_load_attr.attr); in otx_cpt_init_eng_grps()
1673 ret = device_create_file(&pdev->dev, in otx_cpt_init_eng_grps()
1674 &eng_grps->ucode_load_attr); in otx_cpt_init_eng_grps()
1677 eng_grps->is_ucode_load_created = true; in otx_cpt_init_eng_grps()
1679 print_dbg_info(&pdev->dev, eng_grps); in otx_cpt_init_eng_grps()