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 strlcpy(ucode->filename, filename, OTX_CPT_UCODE_NAME_LENGTH); in set_ucode_filename()
141 strlcpy(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
298 ucode_hdr = (struct otx_cpt_ucode_hdr *) data; in process_tar_file()
306 ucode_size = ntohl(ucode_hdr->code_length) * 2; in process_tar_file()
310 return -EINVAL; in process_tar_file()
315 return -ENOMEM; in process_tar_file()
317 tar_info->ucode_ptr = data; in process_tar_file()
318 set_ucode_filename(&tar_info->ucode, filename); in process_tar_file()
319 memcpy(tar_info->ucode.ver_str, ucode_hdr->ver_str, in process_tar_file()
321 tar_info->ucode.ver_num = ucode_hdr->ver_num; in process_tar_file()
322 tar_info->ucode.type = ucode_type; in process_tar_file()
323 tar_info->ucode.size = ucode_size; in process_tar_file()
324 list_add_tail(&tar_info->list, &tar_arch->ucodes); in process_tar_file()
336 list_for_each_entry_safe(curr, temp, &tar_arch->ucodes, list) { in release_tar_archive()
337 list_del(&curr->list); in release_tar_archive()
341 if (tar_arch->fw) in release_tar_archive()
342 release_firmware(tar_arch->fw); in release_tar_archive()
352 list_for_each_entry(curr, &tar_arch->ucodes, list) { in get_uc_from_tar_archive()
353 if (!is_eng_type(curr->ucode.type, ucode_type)) in get_uc_from_tar_archive()
366 if (uc_found->ucode.ver_num.nn == OTX_CPT_SE_UC_TYPE2 || in get_uc_from_tar_archive()
367 (uc_found->ucode.ver_num.nn == OTX_CPT_SE_UC_TYPE3 in get_uc_from_tar_archive()
368 && curr->ucode.ver_num.nn == OTX_CPT_SE_UC_TYPE1)) in get_uc_from_tar_archive()
383 pr_debug("Tar archive pointer %p, size %ld\n", tar_arch->fw->data, in print_tar_dbg_info()
384 tar_arch->fw->size); in print_tar_dbg_info()
385 list_for_each_entry(curr, &tar_arch->ucodes, list) { in print_tar_dbg_info()
386 pr_debug("Ucode filename %s\n", curr->ucode.filename); in print_tar_dbg_info()
387 pr_debug("Ucode version string %s\n", curr->ucode.ver_str); in print_tar_dbg_info()
389 curr->ucode.ver_num.nn, curr->ucode.ver_num.xx, in print_tar_dbg_info()
390 curr->ucode.ver_num.yy, curr->ucode.ver_num.zz); in print_tar_dbg_info()
391 pr_debug("Ucode type (%d) %s\n", curr->ucode.type, in print_tar_dbg_info()
392 get_ucode_type_str(curr->ucode.type)); in print_tar_dbg_info()
393 pr_debug("Ucode size %d\n", curr->ucode.size); in print_tar_dbg_info()
394 pr_debug("Ucode ptr %p\n", curr->ucode_ptr); in print_tar_dbg_info()
412 INIT_LIST_HEAD(&tar_arch->ucodes); in load_tar_archive()
415 ret = request_firmware(&tar_arch->fw, tar_filename, dev); in load_tar_archive()
419 if (tar_arch->fw->size < TAR_BLOCK_LEN) { in load_tar_archive()
424 tar_size = tar_arch->fw->size; in load_tar_archive()
425 tar_blk = (struct tar_blk_t *) tar_arch->fw->data; in load_tar_archive()
426 if (strncmp(tar_blk->hdr.magic, TAR_MAGIC, TAR_MAGIC_LEN - 1)) { in load_tar_archive()
434 ret = kstrtouint(tar_blk->hdr.size, 8, &cur_size); in load_tar_archive()
445 if (tar_blk->hdr.typeflag == REGTYPE || in load_tar_archive()
446 tar_blk->hdr.typeflag == AREGTYPE) { in load_tar_archive()
448 tar_blk->hdr.name, in load_tar_archive()
449 &tar_arch->fw->data[tar_offs], in load_tar_archive()
465 if (is_mem_zero(&tar_arch->fw->data[tar_offs], in load_tar_archive()
470 tar_blk = (struct tar_blk_t *) &tar_arch->fw->data[tar_offs]; in load_tar_archive()
487 if (!eng_grp->engs[i].type) in find_engines_by_type()
490 if (eng_grp->engs[i].type == eng_type) in find_engines_by_type()
491 return &eng_grp->engs[i]; in find_engines_by_type()
498 return is_eng_type(ucode->type, eng_type); in otx_cpt_uc_supports_eng_type()
516 if (eng_grp->mirror.is_ena) { in print_ucode_info()
518 eng_grp->g->grp[eng_grp->mirror.idx].ucode[0].ver_str, in print_ucode_info()
519 eng_grp->mirror.idx); in print_ucode_info()
521 scnprintf(buf, size, "%s", eng_grp->ucode[0].ver_str); in print_ucode_info()
534 engs = &eng_grp->engs[i]; in print_engs_info()
535 if (!engs->type) in print_engs_info()
537 if (idx != -1 && idx != i) in print_engs_info()
540 if (eng_grp->mirror.is_ena) in print_engs_info()
542 &eng_grp->g->grp[eng_grp->mirror.idx], in print_engs_info()
543 engs->type); in print_engs_info()
544 if (i > 0 && idx == -1) { in print_engs_info()
546 scnprintf(buf+len, size-len, ", "); in print_engs_info()
550 scnprintf(buf+len, size-len, "%d %s ", mirrored_engs ? in print_engs_info()
551 engs->count + mirrored_engs->count : engs->count, in print_engs_info()
552 get_eng_type_str(engs->type)); in print_engs_info()
555 scnprintf(buf+len, size-len, in print_engs_info()
557 engs->count <= 0 ? engs->count + in print_engs_info()
558 mirrored_engs->count : mirrored_engs->count, in print_engs_info()
559 eng_grp->mirror.idx); in print_engs_info()
567 pr_debug("Ucode version string %s\n", ucode->ver_str); in print_ucode_dbg_info()
568 pr_debug("Ucode version %d.%d.%d.%d\n", ucode->ver_num.nn, in print_ucode_dbg_info()
569 ucode->ver_num.xx, ucode->ver_num.yy, ucode->ver_num.zz); in print_ucode_dbg_info()
570 pr_debug("Ucode type %s\n", get_ucode_type_str(ucode->type)); in print_ucode_dbg_info()
571 pr_debug("Ucode size %d\n", ucode->size); in print_ucode_dbg_info()
572 pr_debug("Ucode virt address %16.16llx\n", (u64)ucode->align_va); in print_ucode_dbg_info()
573 pr_debug("Ucode phys address %16.16llx\n", ucode->align_dma); in print_ucode_dbg_info()
605 eng_grps->avail.max_se_cnt, eng_grps->avail.max_ae_cnt); in print_dbg_info()
606 pr_debug("free SE %d\n", eng_grps->avail.se_cnt); in print_dbg_info()
607 pr_debug("free AE %d\n", eng_grps->avail.ae_cnt); in print_dbg_info()
610 grp = &eng_grps->grp[i]; in print_dbg_info()
611 pr_debug("engine_group%d, state %s\n", i, grp->is_enabled ? in print_dbg_info()
613 if (grp->is_enabled) { in print_dbg_info()
614 mirrored_grp = &eng_grps->grp[grp->mirror.idx]; in print_dbg_info()
616 grp->mirror.is_ena ? in print_dbg_info()
617 mirrored_grp->ucode[0].filename : in print_dbg_info()
618 grp->ucode[0].filename, in print_dbg_info()
619 grp->mirror.is_ena ? in print_dbg_info()
620 mirrored_grp->ucode[0].ver_str : in print_dbg_info()
621 grp->ucode[0].ver_str); in print_dbg_info()
625 engs = &grp->engs[j]; in print_dbg_info()
626 if (engs->type) { in print_dbg_info()
630 bitmap_to_arr32(mask, engs->bmap, in print_dbg_info()
631 eng_grps->engs_num); in print_dbg_info()
637 if (grp->is_enabled) { in print_dbg_info()
649 switch (engs->type) { in update_engines_avail_count()
651 avail->se_cnt += val; in update_engines_avail_count()
655 avail->ae_cnt += val; in update_engines_avail_count()
659 dev_err(dev, "Invalid engine type %d\n", engs->type); in update_engines_avail_count()
660 return -EINVAL; in update_engines_avail_count()
670 switch (engs->type) { in update_engines_offset()
672 engs->offset = 0; in update_engines_offset()
676 engs->offset = avail->max_se_cnt; in update_engines_offset()
680 dev_err(dev, "Invalid engine type %d\n", engs->type); in update_engines_offset()
681 return -EINVAL; in update_engines_offset()
692 if (!grp->engs[i].type) in release_engines()
695 if (grp->engs[i].count > 0) { in release_engines()
696 ret = update_engines_avail_count(dev, &grp->g->avail, in release_engines()
697 &grp->engs[i], in release_engines()
698 grp->engs[i].count); in release_engines()
703 grp->engs[i].type = 0; in release_engines()
704 grp->engs[i].count = 0; in release_engines()
705 grp->engs[i].offset = 0; in release_engines()
706 grp->engs[i].ucode = NULL; in release_engines()
707 bitmap_zero(grp->engs[i].bmap, grp->g->engs_num); in release_engines()
721 if (!grp->engs[i].type) { in do_reserve_engines()
722 engs = &grp->engs[i]; in do_reserve_engines()
728 return -ENOMEM; in do_reserve_engines()
730 engs->type = req_engs->type; in do_reserve_engines()
731 engs->count = req_engs->count; in do_reserve_engines()
733 ret = update_engines_offset(dev, &grp->g->avail, engs); in do_reserve_engines()
737 if (engs->count > 0) { in do_reserve_engines()
738 ret = update_engines_avail_count(dev, &grp->g->avail, engs, in do_reserve_engines()
739 -engs->count); in do_reserve_engines()
753 switch (req_eng->type) { in check_engines_availability()
755 avail_cnt = grp->g->avail.se_cnt; in check_engines_availability()
759 avail_cnt = grp->g->avail.ae_cnt; in check_engines_availability()
763 dev_err(dev, "Invalid engine type %d\n", req_eng->type); in check_engines_availability()
764 return -EINVAL; in check_engines_availability()
767 if (avail_cnt < req_eng->count) { in check_engines_availability()
770 get_eng_type_str(req_eng->type), in check_engines_availability()
771 avail_cnt, req_eng->count); in check_engines_availability()
772 return -EBUSY; in check_engines_availability()
810 mutex_lock(&eng_grp->g->lock); in eng_grp_info_show()
812 print_engs_info(eng_grp, engs_info, 2*OTX_CPT_UCODE_NAME_LENGTH, -1); in eng_grp_info_show()
820 mutex_unlock(&eng_grp->g->lock); in eng_grp_info_show()
827 eng_grp->info_attr.show = eng_grp_info_show; in create_sysfs_eng_grps_info()
828 eng_grp->info_attr.store = NULL; in create_sysfs_eng_grps_info()
829 eng_grp->info_attr.attr.name = eng_grp->sysfs_info_name; in create_sysfs_eng_grps_info()
830 eng_grp->info_attr.attr.mode = 0440; in create_sysfs_eng_grps_info()
831 sysfs_attr_init(&eng_grp->info_attr.attr); in create_sysfs_eng_grps_info()
832 return device_create_file(dev, &eng_grp->info_attr); in create_sysfs_eng_grps_info()
837 if (ucode->va) { in ucode_unload()
838 dma_free_coherent(dev, ucode->size + OTX_CPT_UCODE_ALIGNMENT, in ucode_unload()
839 ucode->va, ucode->dma); in ucode_unload()
840 ucode->va = NULL; in ucode_unload()
841 ucode->align_va = NULL; in ucode_unload()
842 ucode->dma = 0; in ucode_unload()
843 ucode->align_dma = 0; in ucode_unload()
844 ucode->size = 0; in ucode_unload()
847 memset(&ucode->ver_str, 0, OTX_CPT_UCODE_VER_STR_SZ); in ucode_unload()
848 memset(&ucode->ver_num, 0, sizeof(struct otx_cpt_ucode_ver_num)); in ucode_unload()
850 ucode->type = 0; in ucode_unload()
860 ucode->va = dma_alloc_coherent(dev, ucode->size + in copy_ucode_to_dma_mem()
862 &ucode->dma, GFP_KERNEL); in copy_ucode_to_dma_mem()
863 if (!ucode->va) { in copy_ucode_to_dma_mem()
865 return -ENOMEM; in copy_ucode_to_dma_mem()
867 ucode->align_va = PTR_ALIGN(ucode->va, OTX_CPT_UCODE_ALIGNMENT); in copy_ucode_to_dma_mem()
868 ucode->align_dma = PTR_ALIGN(ucode->dma, OTX_CPT_UCODE_ALIGNMENT); in copy_ucode_to_dma_mem()
870 memcpy((void *) ucode->align_va, (void *) ucode_data + in copy_ucode_to_dma_mem()
871 sizeof(struct otx_cpt_ucode_hdr), ucode->size); in copy_ucode_to_dma_mem()
873 /* Byte swap 64-bit */ in copy_ucode_to_dma_mem()
874 for (i = 0; i < (ucode->size / 8); i++) in copy_ucode_to_dma_mem()
875 ((__be64 *)ucode->align_va)[i] = in copy_ucode_to_dma_mem()
876 cpu_to_be64(((u64 *)ucode->align_va)[i]); in copy_ucode_to_dma_mem()
877 /* Ucode needs 16-bit swap */ in copy_ucode_to_dma_mem()
878 for (i = 0; i < (ucode->size / 2); i++) in copy_ucode_to_dma_mem()
879 ((__be16 *)ucode->align_va)[i] = in copy_ucode_to_dma_mem()
880 cpu_to_be16(((u16 *)ucode->align_va)[i]); in copy_ucode_to_dma_mem()
892 ret = request_firmware(&fw, ucode->filename, dev); in ucode_load()
896 ucode_hdr = (struct otx_cpt_ucode_hdr *) fw->data; in ucode_load()
897 memcpy(ucode->ver_str, ucode_hdr->ver_str, OTX_CPT_UCODE_VER_STR_SZ); in ucode_load()
898 ucode->ver_num = ucode_hdr->ver_num; in ucode_load()
899 ucode->size = ntohl(ucode_hdr->code_length) * 2; in ucode_load()
900 if (!ucode->size || (fw->size < round_up(ucode->size, 16) in ucode_load()
903 ret = -EINVAL; in ucode_load()
907 ret = get_ucode_type(ucode_hdr, &ucode->type); in ucode_load()
910 ucode->filename, ucode->type); in ucode_load()
914 ret = copy_ucode_to_dma_mem(dev, ucode, fw->data); in ucode_load()
948 ucode_unload(dev, &eng_grp->ucode[0]); in disable_eng_grp()
951 if (!eng_grp->engs[i].type) in disable_eng_grp()
954 eng_grp->engs[i].ucode = &eng_grp->ucode[0]; in disable_eng_grp()
966 src_grp->mirror.is_ena = false; in setup_eng_grp_mirroring()
967 src_grp->mirror.idx = 0; in setup_eng_grp_mirroring()
968 src_grp->mirror.ref_count++; in setup_eng_grp_mirroring()
971 dst_grp->mirror.is_ena = true; in setup_eng_grp_mirroring()
972 dst_grp->mirror.idx = src_grp->idx; in setup_eng_grp_mirroring()
973 dst_grp->mirror.ref_count = 0; in setup_eng_grp_mirroring()
980 if (!dst_grp->mirror.is_ena) in remove_eng_grp_mirroring()
983 src_grp = &dst_grp->g->grp[dst_grp->mirror.idx]; in remove_eng_grp_mirroring()
985 src_grp->mirror.ref_count--; in remove_eng_grp_mirroring()
986 dst_grp->mirror.is_ena = false; in remove_eng_grp_mirroring()
987 dst_grp->mirror.idx = 0; in remove_eng_grp_mirroring()
988 dst_grp->mirror.ref_count = 0; in remove_eng_grp_mirroring()
1017 engs[i].count -= mirrored_engs->count; in update_requested_engs()
1024 struct otx_cpt_eng_grps *eng_grps = grp->g; in find_mirrored_eng_grp()
1028 if (!eng_grps->grp[i].is_enabled) in find_mirrored_eng_grp()
1030 if (eng_grps->grp[i].ucode[0].type) in find_mirrored_eng_grp()
1032 if (grp->idx == i) in find_mirrored_eng_grp()
1034 if (!strncasecmp(eng_grps->grp[i].ucode[0].ver_str, in find_mirrored_eng_grp()
1035 grp->ucode[0].ver_str, in find_mirrored_eng_grp()
1037 return &eng_grps->grp[i]; in find_mirrored_eng_grp()
1049 if (!eng_grps->grp[i].is_enabled) in find_unused_eng_grp()
1050 return &eng_grps->grp[i]; in find_unused_eng_grp()
1064 engs = &eng_grp->engs[i]; in eng_grp_update_masks()
1065 if (!engs->type) in eng_grp_update_masks()
1067 if (engs->count <= 0) in eng_grp_update_masks()
1070 switch (engs->type) { in eng_grp_update_masks()
1072 max_cnt = eng_grp->g->avail.max_se_cnt; in eng_grp_update_masks()
1076 max_cnt = eng_grp->g->avail.max_ae_cnt; in eng_grp_update_masks()
1080 dev_err(dev, "Invalid engine type %d\n", engs->type); in eng_grp_update_masks()
1081 return -EINVAL; in eng_grp_update_masks()
1084 cnt = engs->count; in eng_grp_update_masks()
1085 WARN_ON(engs->offset + max_cnt > OTX_CPT_MAX_ENGINES); in eng_grp_update_masks()
1086 bitmap_zero(tmp_bmap.bits, eng_grp->g->engs_num); in eng_grp_update_masks()
1087 for (j = engs->offset; j < engs->offset + max_cnt; j++) { in eng_grp_update_masks()
1088 if (!eng_grp->g->eng_ref_cnt[j]) { in eng_grp_update_masks()
1090 cnt--; in eng_grp_update_masks()
1097 return -ENOSPC; in eng_grp_update_masks()
1099 bitmap_copy(engs->bmap, tmp_bmap.bits, eng_grp->g->engs_num); in eng_grp_update_masks()
1102 if (!eng_grp->mirror.is_ena) in eng_grp_update_masks()
1106 engs = &eng_grp->engs[i]; in eng_grp_update_masks()
1107 if (!engs->type) in eng_grp_update_masks()
1111 &eng_grp->g->grp[eng_grp->mirror.idx], in eng_grp_update_masks()
1112 engs->type); in eng_grp_update_masks()
1113 WARN_ON(!mirrored_engs && engs->count <= 0); in eng_grp_update_masks()
1117 bitmap_copy(tmp_bmap.bits, mirrored_engs->bmap, in eng_grp_update_masks()
1118 eng_grp->g->engs_num); in eng_grp_update_masks()
1119 if (engs->count < 0) { in eng_grp_update_masks()
1120 bit = find_first_bit(mirrored_engs->bmap, in eng_grp_update_masks()
1121 eng_grp->g->engs_num); in eng_grp_update_masks()
1122 bitmap_clear(tmp_bmap.bits, bit, -engs->count); in eng_grp_update_masks()
1124 bitmap_or(engs->bmap, engs->bmap, tmp_bmap.bits, in eng_grp_update_masks()
1125 eng_grp->g->engs_num); in eng_grp_update_masks()
1135 if (!eng_grp->is_enabled) in delete_engine_group()
1136 return -EINVAL; in delete_engine_group()
1138 if (eng_grp->mirror.ref_count) { in delete_engine_group()
1140 eng_grp->idx); in delete_engine_group()
1142 if (eng_grp->g->grp[i].mirror.is_ena && in delete_engine_group()
1143 eng_grp->g->grp[i].mirror.idx == eng_grp->idx) in delete_engine_group()
1147 return -EINVAL; in delete_engine_group()
1154 ret = disable_eng_grp(dev, eng_grp, eng_grp->g->obj); in delete_engine_group()
1163 device_remove_file(dev, &eng_grp->info_attr); in delete_engine_group()
1164 eng_grp->is_enabled = false; in delete_engine_group()
1177 if (!otx_cpt_uc_supports_eng_type(&eng_grp->ucode[0], in validate_1_ucode_scenario()
1181 eng_grp->ucode[0].filename, in validate_1_ucode_scenario()
1183 return -EINVAL; in validate_1_ucode_scenario()
1193 if (eng_grp->mirror.is_ena) in update_ucode_ptrs()
1194 ucode = &eng_grp->g->grp[eng_grp->mirror.idx].ucode[0]; in update_ucode_ptrs()
1196 ucode = &eng_grp->ucode[0]; in update_ucode_ptrs()
1197 WARN_ON(!eng_grp->engs[0].type); in update_ucode_ptrs()
1198 eng_grp->engs[0].ucode = ucode; in update_ucode_ptrs()
1213 return -EINVAL; in create_engine_group()
1220 return -EPERM; in create_engine_group()
1227 return -ENOSPC; in create_engine_group()
1234 eng_grp->ucode[i] = tar_info->ucode; in create_engine_group()
1235 ret = copy_ucode_to_dma_mem(dev, &eng_grp->ucode[i], in create_engine_group()
1236 tar_info->ucode_ptr); in create_engine_group()
1238 ret = ucode_load(dev, &eng_grp->ucode[i], in create_engine_group()
1281 ret = enable_eng_grp(eng_grp, eng_grps->obj); in create_engine_group()
1290 if (eng_grp->mirror.is_ena) in create_engine_group()
1291 ucode_unload(dev, &eng_grp->ucode[0]); in create_engine_group()
1293 eng_grp->is_enabled = true; in create_engine_group()
1294 if (eng_grp->mirror.is_ena) in create_engine_group()
1297 eng_grp->idx, mirrored_eng_grp->ucode[0].ver_str, in create_engine_group()
1298 mirrored_eng_grp->idx); in create_engine_group()
1301 eng_grp->idx, eng_grp->ucode[0].ver_str); in create_engine_group()
1308 ucode_unload(dev, &eng_grp->ucode[0]); in create_engine_group()
1321 int grp_idx = 0, ret = -EINVAL; in ucode_load_store()
1323 int del_grp_idx = -1; in ucode_load_store()
1327 return -EINVAL; in ucode_load_store()
1345 if (del_grp_idx != -1) in ucode_load_store()
1395 if (del_grp_idx == -1) { in ucode_load_store()
1412 ret = -EINVAL; in ucode_load_store()
1416 if (!eng_grps->grp[del_grp_idx].is_enabled) { in ucode_load_store()
1419 ret = -EINVAL; in ucode_load_store()
1427 mutex_lock(&eng_grps->lock); in ucode_load_store()
1429 if (eng_grps->is_rdonly) { in ucode_load_store()
1431 ret = -EACCES; in ucode_load_store()
1435 if (del_grp_idx == -1) in ucode_load_store()
1442 ret = delete_engine_group(dev, &eng_grps->grp[del_grp_idx]); in ucode_load_store()
1448 mutex_unlock(&eng_grps->lock); in ucode_load_store()
1466 mutex_lock(&eng_grps->lock); in otx_cpt_try_create_default_eng_grps()
1472 if (eng_grps->is_first_try) in otx_cpt_try_create_default_eng_grps()
1474 eng_grps->is_first_try = true; in otx_cpt_try_create_default_eng_grps()
1478 if (eng_grps->grp[i].is_enabled) in otx_cpt_try_create_default_eng_grps()
1488 dev_err(&pdev->dev, "Unknown PF type %d\n", pf_type); in otx_cpt_try_create_default_eng_grps()
1489 ret = -EINVAL; in otx_cpt_try_create_default_eng_grps()
1493 tar_arch = load_tar_archive(&pdev->dev, tar_filename); in otx_cpt_try_create_default_eng_grps()
1507 engs[0].count = eng_grps->avail.max_se_cnt; in otx_cpt_try_create_default_eng_grps()
1509 ret = create_engine_group(&pdev->dev, eng_grps, engs, 1, in otx_cpt_try_create_default_eng_grps()
1524 engs[0].count = eng_grps->avail.max_ae_cnt; in otx_cpt_try_create_default_eng_grps()
1526 ret = create_engine_group(&pdev->dev, eng_grps, engs, 1, in otx_cpt_try_create_default_eng_grps()
1532 print_dbg_info(&pdev->dev, eng_grps); in otx_cpt_try_create_default_eng_grps()
1536 mutex_unlock(&eng_grps->lock); in otx_cpt_try_create_default_eng_grps()
1543 mutex_lock(&eng_grps->lock); in otx_cpt_set_eng_grps_is_rdonly()
1545 eng_grps->is_rdonly = is_rdonly; in otx_cpt_set_eng_grps_is_rdonly()
1547 mutex_unlock(&eng_grps->lock); in otx_cpt_set_eng_grps_is_rdonly()
1557 writeq(0, cpt->reg_base + OTX_CPT_PF_GX_EN(grp)); in otx_cpt_disable_all_cores()
1561 reg = readq(cpt->reg_base + OTX_CPT_PF_EXEC_BUSY); in otx_cpt_disable_all_cores()
1564 reg = readq(cpt->reg_base + OTX_CPT_PF_EXEC_BUSY); in otx_cpt_disable_all_cores()
1565 if (timeout--) { in otx_cpt_disable_all_cores()
1566 dev_warn(&cpt->pdev->dev, "Cores still busy\n"); in otx_cpt_disable_all_cores()
1572 writeq(0, cpt->reg_base + OTX_CPT_PF_EXE_CTL); in otx_cpt_disable_all_cores()
1581 mutex_lock(&eng_grps->lock); in otx_cpt_cleanup_eng_grps()
1582 if (eng_grps->is_ucode_load_created) { in otx_cpt_cleanup_eng_grps()
1583 device_remove_file(&pdev->dev, in otx_cpt_cleanup_eng_grps()
1584 &eng_grps->ucode_load_attr); in otx_cpt_cleanup_eng_grps()
1585 eng_grps->is_ucode_load_created = false; in otx_cpt_cleanup_eng_grps()
1590 if (eng_grps->grp[i].mirror.is_ena) in otx_cpt_cleanup_eng_grps()
1591 delete_engine_group(&pdev->dev, &eng_grps->grp[i]); in otx_cpt_cleanup_eng_grps()
1595 delete_engine_group(&pdev->dev, &eng_grps->grp[i]); in otx_cpt_cleanup_eng_grps()
1599 grp = &eng_grps->grp[i]; in otx_cpt_cleanup_eng_grps()
1601 kfree(grp->engs[j].bmap); in otx_cpt_cleanup_eng_grps()
1602 grp->engs[j].bmap = NULL; in otx_cpt_cleanup_eng_grps()
1606 mutex_unlock(&eng_grps->lock); in otx_cpt_cleanup_eng_grps()
1615 mutex_init(&eng_grps->lock); in otx_cpt_init_eng_grps()
1616 eng_grps->obj = pci_get_drvdata(pdev); in otx_cpt_init_eng_grps()
1617 eng_grps->avail.se_cnt = eng_grps->avail.max_se_cnt; in otx_cpt_init_eng_grps()
1618 eng_grps->avail.ae_cnt = eng_grps->avail.max_ae_cnt; in otx_cpt_init_eng_grps()
1620 eng_grps->engs_num = eng_grps->avail.max_se_cnt + in otx_cpt_init_eng_grps()
1621 eng_grps->avail.max_ae_cnt; in otx_cpt_init_eng_grps()
1622 if (eng_grps->engs_num > OTX_CPT_MAX_ENGINES) { in otx_cpt_init_eng_grps()
1623 dev_err(&pdev->dev, in otx_cpt_init_eng_grps()
1625 eng_grps->engs_num, OTX_CPT_MAX_ENGINES); in otx_cpt_init_eng_grps()
1626 ret = -EINVAL; in otx_cpt_init_eng_grps()
1631 grp = &eng_grps->grp[i]; in otx_cpt_init_eng_grps()
1632 grp->g = eng_grps; in otx_cpt_init_eng_grps()
1633 grp->idx = i; in otx_cpt_init_eng_grps()
1635 snprintf(grp->sysfs_info_name, OTX_CPT_UCODE_NAME_LENGTH, in otx_cpt_init_eng_grps()
1638 grp->engs[j].bmap = in otx_cpt_init_eng_grps()
1639 kcalloc(BITS_TO_LONGS(eng_grps->engs_num), in otx_cpt_init_eng_grps()
1641 if (!grp->engs[j].bmap) { in otx_cpt_init_eng_grps()
1642 ret = -ENOMEM; in otx_cpt_init_eng_grps()
1651 eng_grps->eng_types_supported = 1 << OTX_CPT_SE_TYPES; in otx_cpt_init_eng_grps()
1656 eng_grps->eng_types_supported = 1 << OTX_CPT_AE_TYPES; in otx_cpt_init_eng_grps()
1660 dev_err(&pdev->dev, "Unknown PF type %d\n", pf_type); in otx_cpt_init_eng_grps()
1661 ret = -EINVAL; in otx_cpt_init_eng_grps()
1665 eng_grps->ucode_load_attr.show = NULL; in otx_cpt_init_eng_grps()
1666 eng_grps->ucode_load_attr.store = ucode_load_store; in otx_cpt_init_eng_grps()
1667 eng_grps->ucode_load_attr.attr.name = "ucode_load"; in otx_cpt_init_eng_grps()
1668 eng_grps->ucode_load_attr.attr.mode = 0220; in otx_cpt_init_eng_grps()
1669 sysfs_attr_init(&eng_grps->ucode_load_attr.attr); in otx_cpt_init_eng_grps()
1670 ret = device_create_file(&pdev->dev, in otx_cpt_init_eng_grps()
1671 &eng_grps->ucode_load_attr); in otx_cpt_init_eng_grps()
1674 eng_grps->is_ucode_load_created = true; in otx_cpt_init_eng_grps()
1676 print_dbg_info(&pdev->dev, eng_grps); in otx_cpt_init_eng_grps()