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 release_firmware(tar_arch->fw); in release_tar_archive()
358 list_for_each_entry(curr, &tar_arch->ucodes, list) { in get_uc_from_tar_archive()
359 if (!is_eng_type(curr->ucode.type, ucode_type)) in get_uc_from_tar_archive()
372 if (uc_found->ucode.ver_num.nn == OTX_CPT_SE_UC_TYPE2 || in get_uc_from_tar_archive()
373 (uc_found->ucode.ver_num.nn == OTX_CPT_SE_UC_TYPE3 in get_uc_from_tar_archive()
374 && curr->ucode.ver_num.nn == OTX_CPT_SE_UC_TYPE1)) in get_uc_from_tar_archive()
389 pr_debug("Tar archive pointer %p, size %ld\n", tar_arch->fw->data, in print_tar_dbg_info()
390 tar_arch->fw->size); in print_tar_dbg_info()
391 list_for_each_entry(curr, &tar_arch->ucodes, list) { in print_tar_dbg_info()
392 pr_debug("Ucode filename %s\n", curr->ucode.filename); in print_tar_dbg_info()
393 pr_debug("Ucode version string %s\n", curr->ucode.ver_str); in print_tar_dbg_info()
395 curr->ucode.ver_num.nn, curr->ucode.ver_num.xx, in print_tar_dbg_info()
396 curr->ucode.ver_num.yy, curr->ucode.ver_num.zz); in print_tar_dbg_info()
397 pr_debug("Ucode type (%d) %s\n", curr->ucode.type, in print_tar_dbg_info()
398 get_ucode_type_str(curr->ucode.type)); in print_tar_dbg_info()
399 pr_debug("Ucode size %d\n", curr->ucode.size); in print_tar_dbg_info()
400 pr_debug("Ucode ptr %p\n", curr->ucode_ptr); in print_tar_dbg_info()
418 INIT_LIST_HEAD(&tar_arch->ucodes); in load_tar_archive()
421 ret = request_firmware(&tar_arch->fw, tar_filename, dev); in load_tar_archive()
425 if (tar_arch->fw->size < TAR_BLOCK_LEN) { in load_tar_archive()
430 tar_size = tar_arch->fw->size; in load_tar_archive()
431 tar_blk = (struct tar_blk_t *) tar_arch->fw->data; in load_tar_archive()
432 if (strncmp(tar_blk->hdr.magic, TAR_MAGIC, TAR_MAGIC_LEN - 1)) { in load_tar_archive()
440 ret = kstrtouint(tar_blk->hdr.size, 8, &cur_size); in load_tar_archive()
451 if (tar_blk->hdr.typeflag == REGTYPE || in load_tar_archive()
452 tar_blk->hdr.typeflag == AREGTYPE) { in load_tar_archive()
454 tar_blk->hdr.name, in load_tar_archive()
455 &tar_arch->fw->data[tar_offs], in load_tar_archive()
471 if (is_mem_zero(&tar_arch->fw->data[tar_offs], in load_tar_archive()
476 tar_blk = (struct tar_blk_t *) &tar_arch->fw->data[tar_offs]; in load_tar_archive()
493 if (!eng_grp->engs[i].type) in find_engines_by_type()
496 if (eng_grp->engs[i].type == eng_type) in find_engines_by_type()
497 return &eng_grp->engs[i]; in find_engines_by_type()
504 return is_eng_type(ucode->type, eng_type); in otx_cpt_uc_supports_eng_type()
522 if (eng_grp->mirror.is_ena) { in print_ucode_info()
524 eng_grp->g->grp[eng_grp->mirror.idx].ucode[0].ver_str, in print_ucode_info()
525 eng_grp->mirror.idx); in print_ucode_info()
527 scnprintf(buf, size, "%s", eng_grp->ucode[0].ver_str); in print_ucode_info()
540 engs = &eng_grp->engs[i]; in print_engs_info()
541 if (!engs->type) in print_engs_info()
543 if (idx != -1 && idx != i) in print_engs_info()
546 if (eng_grp->mirror.is_ena) in print_engs_info()
548 &eng_grp->g->grp[eng_grp->mirror.idx], in print_engs_info()
549 engs->type); in print_engs_info()
550 if (i > 0 && idx == -1) { in print_engs_info()
552 scnprintf(buf+len, size-len, ", "); in print_engs_info()
556 scnprintf(buf+len, size-len, "%d %s ", mirrored_engs ? in print_engs_info()
557 engs->count + mirrored_engs->count : engs->count, in print_engs_info()
558 get_eng_type_str(engs->type)); in print_engs_info()
561 scnprintf(buf+len, size-len, in print_engs_info()
563 engs->count <= 0 ? engs->count + in print_engs_info()
564 mirrored_engs->count : mirrored_engs->count, in print_engs_info()
565 eng_grp->mirror.idx); in print_engs_info()
573 pr_debug("Ucode version string %s\n", ucode->ver_str); in print_ucode_dbg_info()
574 pr_debug("Ucode version %d.%d.%d.%d\n", ucode->ver_num.nn, in print_ucode_dbg_info()
575 ucode->ver_num.xx, ucode->ver_num.yy, ucode->ver_num.zz); in print_ucode_dbg_info()
576 pr_debug("Ucode type %s\n", get_ucode_type_str(ucode->type)); in print_ucode_dbg_info()
577 pr_debug("Ucode size %d\n", ucode->size); in print_ucode_dbg_info()
578 pr_debug("Ucode virt address %16.16llx\n", (u64)ucode->align_va); in print_ucode_dbg_info()
579 pr_debug("Ucode phys address %16.16llx\n", ucode->align_dma); in print_ucode_dbg_info()
611 eng_grps->avail.max_se_cnt, eng_grps->avail.max_ae_cnt); in print_dbg_info()
612 pr_debug("free SE %d\n", eng_grps->avail.se_cnt); in print_dbg_info()
613 pr_debug("free AE %d\n", eng_grps->avail.ae_cnt); in print_dbg_info()
616 grp = &eng_grps->grp[i]; in print_dbg_info()
617 pr_debug("engine_group%d, state %s\n", i, grp->is_enabled ? in print_dbg_info()
619 if (grp->is_enabled) { in print_dbg_info()
620 mirrored_grp = &eng_grps->grp[grp->mirror.idx]; in print_dbg_info()
622 grp->mirror.is_ena ? in print_dbg_info()
623 mirrored_grp->ucode[0].filename : in print_dbg_info()
624 grp->ucode[0].filename, in print_dbg_info()
625 grp->mirror.is_ena ? in print_dbg_info()
626 mirrored_grp->ucode[0].ver_str : in print_dbg_info()
627 grp->ucode[0].ver_str); in print_dbg_info()
631 engs = &grp->engs[j]; in print_dbg_info()
632 if (engs->type) { in print_dbg_info()
636 bitmap_to_arr32(mask, engs->bmap, in print_dbg_info()
637 eng_grps->engs_num); in print_dbg_info()
643 if (grp->is_enabled) { in print_dbg_info()
655 switch (engs->type) { in update_engines_avail_count()
657 avail->se_cnt += val; in update_engines_avail_count()
661 avail->ae_cnt += val; in update_engines_avail_count()
665 dev_err(dev, "Invalid engine type %d\n", engs->type); in update_engines_avail_count()
666 return -EINVAL; in update_engines_avail_count()
676 switch (engs->type) { in update_engines_offset()
678 engs->offset = 0; in update_engines_offset()
682 engs->offset = avail->max_se_cnt; in update_engines_offset()
686 dev_err(dev, "Invalid engine type %d\n", engs->type); in update_engines_offset()
687 return -EINVAL; in update_engines_offset()
698 if (!grp->engs[i].type) in release_engines()
701 if (grp->engs[i].count > 0) { in release_engines()
702 ret = update_engines_avail_count(dev, &grp->g->avail, in release_engines()
703 &grp->engs[i], in release_engines()
704 grp->engs[i].count); in release_engines()
709 grp->engs[i].type = 0; in release_engines()
710 grp->engs[i].count = 0; in release_engines()
711 grp->engs[i].offset = 0; in release_engines()
712 grp->engs[i].ucode = NULL; in release_engines()
713 bitmap_zero(grp->engs[i].bmap, grp->g->engs_num); in release_engines()
727 if (!grp->engs[i].type) { in do_reserve_engines()
728 engs = &grp->engs[i]; in do_reserve_engines()
734 return -ENOMEM; in do_reserve_engines()
736 engs->type = req_engs->type; in do_reserve_engines()
737 engs->count = req_engs->count; in do_reserve_engines()
739 ret = update_engines_offset(dev, &grp->g->avail, engs); in do_reserve_engines()
743 if (engs->count > 0) { in do_reserve_engines()
744 ret = update_engines_avail_count(dev, &grp->g->avail, engs, in do_reserve_engines()
745 -engs->count); in do_reserve_engines()
759 switch (req_eng->type) { in check_engines_availability()
761 avail_cnt = grp->g->avail.se_cnt; in check_engines_availability()
765 avail_cnt = grp->g->avail.ae_cnt; in check_engines_availability()
769 dev_err(dev, "Invalid engine type %d\n", req_eng->type); in check_engines_availability()
770 return -EINVAL; in check_engines_availability()
773 if (avail_cnt < req_eng->count) { in check_engines_availability()
776 get_eng_type_str(req_eng->type), in check_engines_availability()
777 avail_cnt, req_eng->count); in check_engines_availability()
778 return -EBUSY; in check_engines_availability()
816 mutex_lock(&eng_grp->g->lock); in eng_grp_info_show()
818 print_engs_info(eng_grp, engs_info, 2*OTX_CPT_UCODE_NAME_LENGTH, -1); in eng_grp_info_show()
826 mutex_unlock(&eng_grp->g->lock); in eng_grp_info_show()
833 eng_grp->info_attr.show = eng_grp_info_show; in create_sysfs_eng_grps_info()
834 eng_grp->info_attr.store = NULL; in create_sysfs_eng_grps_info()
835 eng_grp->info_attr.attr.name = eng_grp->sysfs_info_name; in create_sysfs_eng_grps_info()
836 eng_grp->info_attr.attr.mode = 0440; in create_sysfs_eng_grps_info()
837 sysfs_attr_init(&eng_grp->info_attr.attr); in create_sysfs_eng_grps_info()
838 return device_create_file(dev, &eng_grp->info_attr); in create_sysfs_eng_grps_info()
843 if (ucode->va) { in ucode_unload()
844 dma_free_coherent(dev, ucode->size + OTX_CPT_UCODE_ALIGNMENT, in ucode_unload()
845 ucode->va, ucode->dma); in ucode_unload()
846 ucode->va = NULL; in ucode_unload()
847 ucode->align_va = NULL; in ucode_unload()
848 ucode->dma = 0; in ucode_unload()
849 ucode->align_dma = 0; in ucode_unload()
850 ucode->size = 0; in ucode_unload()
853 memset(&ucode->ver_str, 0, OTX_CPT_UCODE_VER_STR_SZ); in ucode_unload()
854 memset(&ucode->ver_num, 0, sizeof(struct otx_cpt_ucode_ver_num)); in ucode_unload()
856 ucode->type = 0; in ucode_unload()
866 ucode->va = dma_alloc_coherent(dev, ucode->size + in copy_ucode_to_dma_mem()
868 &ucode->dma, GFP_KERNEL); in copy_ucode_to_dma_mem()
869 if (!ucode->va) { in copy_ucode_to_dma_mem()
871 return -ENOMEM; in copy_ucode_to_dma_mem()
873 ucode->align_va = PTR_ALIGN(ucode->va, OTX_CPT_UCODE_ALIGNMENT); in copy_ucode_to_dma_mem()
874 ucode->align_dma = PTR_ALIGN(ucode->dma, OTX_CPT_UCODE_ALIGNMENT); in copy_ucode_to_dma_mem()
876 memcpy((void *) ucode->align_va, (void *) ucode_data + in copy_ucode_to_dma_mem()
877 sizeof(struct otx_cpt_ucode_hdr), ucode->size); in copy_ucode_to_dma_mem()
879 /* Byte swap 64-bit */ in copy_ucode_to_dma_mem()
880 for (i = 0; i < (ucode->size / 8); i++) in copy_ucode_to_dma_mem()
881 ((__be64 *)ucode->align_va)[i] = in copy_ucode_to_dma_mem()
882 cpu_to_be64(((u64 *)ucode->align_va)[i]); in copy_ucode_to_dma_mem()
883 /* Ucode needs 16-bit swap */ in copy_ucode_to_dma_mem()
884 for (i = 0; i < (ucode->size / 2); i++) in copy_ucode_to_dma_mem()
885 ((__be16 *)ucode->align_va)[i] = in copy_ucode_to_dma_mem()
886 cpu_to_be16(((u16 *)ucode->align_va)[i]); in copy_ucode_to_dma_mem()
899 ret = request_firmware(&fw, ucode->filename, dev); in ucode_load()
903 ucode_hdr = (struct otx_cpt_ucode_hdr *) fw->data; in ucode_load()
904 memcpy(ucode->ver_str, ucode_hdr->ver_str, OTX_CPT_UCODE_VER_STR_SZ); in ucode_load()
905 ucode->ver_num = ucode_hdr->ver_num; in ucode_load()
906 code_length = ntohl(ucode_hdr->code_length); in ucode_load()
909 ret = -EINVAL; in ucode_load()
912 ucode->size = code_length * 2; in ucode_load()
913 if (!ucode->size || (fw->size < round_up(ucode->size, 16) in ucode_load()
916 ret = -EINVAL; in ucode_load()
920 ret = get_ucode_type(ucode_hdr, &ucode->type); in ucode_load()
923 ucode->filename, ucode->type); in ucode_load()
927 ret = copy_ucode_to_dma_mem(dev, ucode, fw->data); in ucode_load()
961 ucode_unload(dev, &eng_grp->ucode[0]); in disable_eng_grp()
964 if (!eng_grp->engs[i].type) in disable_eng_grp()
967 eng_grp->engs[i].ucode = &eng_grp->ucode[0]; in disable_eng_grp()
979 src_grp->mirror.is_ena = false; in setup_eng_grp_mirroring()
980 src_grp->mirror.idx = 0; in setup_eng_grp_mirroring()
981 src_grp->mirror.ref_count++; in setup_eng_grp_mirroring()
984 dst_grp->mirror.is_ena = true; in setup_eng_grp_mirroring()
985 dst_grp->mirror.idx = src_grp->idx; in setup_eng_grp_mirroring()
986 dst_grp->mirror.ref_count = 0; in setup_eng_grp_mirroring()
993 if (!dst_grp->mirror.is_ena) in remove_eng_grp_mirroring()
996 src_grp = &dst_grp->g->grp[dst_grp->mirror.idx]; in remove_eng_grp_mirroring()
998 src_grp->mirror.ref_count--; in remove_eng_grp_mirroring()
999 dst_grp->mirror.is_ena = false; in remove_eng_grp_mirroring()
1000 dst_grp->mirror.idx = 0; in remove_eng_grp_mirroring()
1001 dst_grp->mirror.ref_count = 0; in remove_eng_grp_mirroring()
1030 engs[i].count -= mirrored_engs->count; in update_requested_engs()
1037 struct otx_cpt_eng_grps *eng_grps = grp->g; in find_mirrored_eng_grp()
1041 if (!eng_grps->grp[i].is_enabled) in find_mirrored_eng_grp()
1043 if (eng_grps->grp[i].ucode[0].type) in find_mirrored_eng_grp()
1045 if (grp->idx == i) in find_mirrored_eng_grp()
1047 if (!strncasecmp(eng_grps->grp[i].ucode[0].ver_str, in find_mirrored_eng_grp()
1048 grp->ucode[0].ver_str, in find_mirrored_eng_grp()
1050 return &eng_grps->grp[i]; in find_mirrored_eng_grp()
1062 if (!eng_grps->grp[i].is_enabled) in find_unused_eng_grp()
1063 return &eng_grps->grp[i]; in find_unused_eng_grp()
1077 engs = &eng_grp->engs[i]; in eng_grp_update_masks()
1078 if (!engs->type) in eng_grp_update_masks()
1080 if (engs->count <= 0) in eng_grp_update_masks()
1083 switch (engs->type) { in eng_grp_update_masks()
1085 max_cnt = eng_grp->g->avail.max_se_cnt; in eng_grp_update_masks()
1089 max_cnt = eng_grp->g->avail.max_ae_cnt; in eng_grp_update_masks()
1093 dev_err(dev, "Invalid engine type %d\n", engs->type); in eng_grp_update_masks()
1094 return -EINVAL; in eng_grp_update_masks()
1097 cnt = engs->count; in eng_grp_update_masks()
1098 WARN_ON(engs->offset + max_cnt > OTX_CPT_MAX_ENGINES); in eng_grp_update_masks()
1099 bitmap_zero(tmp_bmap.bits, eng_grp->g->engs_num); in eng_grp_update_masks()
1100 for (j = engs->offset; j < engs->offset + max_cnt; j++) { in eng_grp_update_masks()
1101 if (!eng_grp->g->eng_ref_cnt[j]) { in eng_grp_update_masks()
1103 cnt--; in eng_grp_update_masks()
1110 return -ENOSPC; in eng_grp_update_masks()
1112 bitmap_copy(engs->bmap, tmp_bmap.bits, eng_grp->g->engs_num); in eng_grp_update_masks()
1115 if (!eng_grp->mirror.is_ena) in eng_grp_update_masks()
1119 engs = &eng_grp->engs[i]; in eng_grp_update_masks()
1120 if (!engs->type) in eng_grp_update_masks()
1124 &eng_grp->g->grp[eng_grp->mirror.idx], in eng_grp_update_masks()
1125 engs->type); in eng_grp_update_masks()
1126 WARN_ON(!mirrored_engs && engs->count <= 0); in eng_grp_update_masks()
1130 bitmap_copy(tmp_bmap.bits, mirrored_engs->bmap, in eng_grp_update_masks()
1131 eng_grp->g->engs_num); in eng_grp_update_masks()
1132 if (engs->count < 0) { in eng_grp_update_masks()
1133 bit = find_first_bit(mirrored_engs->bmap, in eng_grp_update_masks()
1134 eng_grp->g->engs_num); in eng_grp_update_masks()
1135 bitmap_clear(tmp_bmap.bits, bit, -engs->count); in eng_grp_update_masks()
1137 bitmap_or(engs->bmap, engs->bmap, tmp_bmap.bits, in eng_grp_update_masks()
1138 eng_grp->g->engs_num); in eng_grp_update_masks()
1148 if (!eng_grp->is_enabled) in delete_engine_group()
1149 return -EINVAL; in delete_engine_group()
1151 if (eng_grp->mirror.ref_count) { in delete_engine_group()
1153 eng_grp->idx); in delete_engine_group()
1155 if (eng_grp->g->grp[i].mirror.is_ena && in delete_engine_group()
1156 eng_grp->g->grp[i].mirror.idx == eng_grp->idx) in delete_engine_group()
1160 return -EINVAL; in delete_engine_group()
1167 ret = disable_eng_grp(dev, eng_grp, eng_grp->g->obj); in delete_engine_group()
1176 device_remove_file(dev, &eng_grp->info_attr); in delete_engine_group()
1177 eng_grp->is_enabled = false; in delete_engine_group()
1190 if (!otx_cpt_uc_supports_eng_type(&eng_grp->ucode[0], in validate_1_ucode_scenario()
1194 eng_grp->ucode[0].filename, in validate_1_ucode_scenario()
1196 return -EINVAL; in validate_1_ucode_scenario()
1206 if (eng_grp->mirror.is_ena) in update_ucode_ptrs()
1207 ucode = &eng_grp->g->grp[eng_grp->mirror.idx].ucode[0]; in update_ucode_ptrs()
1209 ucode = &eng_grp->ucode[0]; in update_ucode_ptrs()
1210 WARN_ON(!eng_grp->engs[0].type); in update_ucode_ptrs()
1211 eng_grp->engs[0].ucode = ucode; in update_ucode_ptrs()
1226 return -EINVAL; in create_engine_group()
1233 return -EPERM; in create_engine_group()
1240 return -ENOSPC; in create_engine_group()
1247 eng_grp->ucode[i] = tar_info->ucode; in create_engine_group()
1248 ret = copy_ucode_to_dma_mem(dev, &eng_grp->ucode[i], in create_engine_group()
1249 tar_info->ucode_ptr); in create_engine_group()
1251 ret = ucode_load(dev, &eng_grp->ucode[i], in create_engine_group()
1294 ret = enable_eng_grp(eng_grp, eng_grps->obj); in create_engine_group()
1303 if (eng_grp->mirror.is_ena) in create_engine_group()
1304 ucode_unload(dev, &eng_grp->ucode[0]); in create_engine_group()
1306 eng_grp->is_enabled = true; in create_engine_group()
1307 if (eng_grp->mirror.is_ena) in create_engine_group()
1310 eng_grp->idx, mirrored_eng_grp->ucode[0].ver_str, in create_engine_group()
1311 mirrored_eng_grp->idx); in create_engine_group()
1314 eng_grp->idx, eng_grp->ucode[0].ver_str); in create_engine_group()
1321 ucode_unload(dev, &eng_grp->ucode[0]); in create_engine_group()
1334 int grp_idx = 0, ret = -EINVAL; in ucode_load_store()
1336 int del_grp_idx = -1; in ucode_load_store()
1340 return -EINVAL; in ucode_load_store()
1358 if (del_grp_idx != -1) in ucode_load_store()
1408 if (del_grp_idx == -1) { in ucode_load_store()
1425 ret = -EINVAL; in ucode_load_store()
1429 if (!eng_grps->grp[del_grp_idx].is_enabled) { in ucode_load_store()
1432 ret = -EINVAL; in ucode_load_store()
1440 mutex_lock(&eng_grps->lock); in ucode_load_store()
1442 if (eng_grps->is_rdonly) { in ucode_load_store()
1444 ret = -EACCES; in ucode_load_store()
1448 if (del_grp_idx == -1) in ucode_load_store()
1455 ret = delete_engine_group(dev, &eng_grps->grp[del_grp_idx]); in ucode_load_store()
1461 mutex_unlock(&eng_grps->lock); in ucode_load_store()
1479 mutex_lock(&eng_grps->lock); in otx_cpt_try_create_default_eng_grps()
1485 if (eng_grps->is_first_try) in otx_cpt_try_create_default_eng_grps()
1487 eng_grps->is_first_try = true; in otx_cpt_try_create_default_eng_grps()
1491 if (eng_grps->grp[i].is_enabled) in otx_cpt_try_create_default_eng_grps()
1501 dev_err(&pdev->dev, "Unknown PF type %d\n", pf_type); in otx_cpt_try_create_default_eng_grps()
1502 ret = -EINVAL; in otx_cpt_try_create_default_eng_grps()
1506 tar_arch = load_tar_archive(&pdev->dev, tar_filename); in otx_cpt_try_create_default_eng_grps()
1520 engs[0].count = eng_grps->avail.max_se_cnt; in otx_cpt_try_create_default_eng_grps()
1522 ret = create_engine_group(&pdev->dev, eng_grps, engs, 1, in otx_cpt_try_create_default_eng_grps()
1537 engs[0].count = eng_grps->avail.max_ae_cnt; in otx_cpt_try_create_default_eng_grps()
1539 ret = create_engine_group(&pdev->dev, eng_grps, engs, 1, in otx_cpt_try_create_default_eng_grps()
1545 print_dbg_info(&pdev->dev, eng_grps); in otx_cpt_try_create_default_eng_grps()
1549 mutex_unlock(&eng_grps->lock); in otx_cpt_try_create_default_eng_grps()
1556 mutex_lock(&eng_grps->lock); in otx_cpt_set_eng_grps_is_rdonly()
1558 eng_grps->is_rdonly = is_rdonly; in otx_cpt_set_eng_grps_is_rdonly()
1560 mutex_unlock(&eng_grps->lock); in otx_cpt_set_eng_grps_is_rdonly()
1570 writeq(0, cpt->reg_base + OTX_CPT_PF_GX_EN(grp)); in otx_cpt_disable_all_cores()
1574 reg = readq(cpt->reg_base + OTX_CPT_PF_EXEC_BUSY); in otx_cpt_disable_all_cores()
1577 reg = readq(cpt->reg_base + OTX_CPT_PF_EXEC_BUSY); in otx_cpt_disable_all_cores()
1578 if (timeout--) { in otx_cpt_disable_all_cores()
1579 dev_warn(&cpt->pdev->dev, "Cores still busy\n"); in otx_cpt_disable_all_cores()
1585 writeq(0, cpt->reg_base + OTX_CPT_PF_EXE_CTL); in otx_cpt_disable_all_cores()
1594 mutex_lock(&eng_grps->lock); in otx_cpt_cleanup_eng_grps()
1595 if (eng_grps->is_ucode_load_created) { in otx_cpt_cleanup_eng_grps()
1596 device_remove_file(&pdev->dev, in otx_cpt_cleanup_eng_grps()
1597 &eng_grps->ucode_load_attr); in otx_cpt_cleanup_eng_grps()
1598 eng_grps->is_ucode_load_created = false; in otx_cpt_cleanup_eng_grps()
1603 if (eng_grps->grp[i].mirror.is_ena) in otx_cpt_cleanup_eng_grps()
1604 delete_engine_group(&pdev->dev, &eng_grps->grp[i]); in otx_cpt_cleanup_eng_grps()
1608 delete_engine_group(&pdev->dev, &eng_grps->grp[i]); in otx_cpt_cleanup_eng_grps()
1612 grp = &eng_grps->grp[i]; in otx_cpt_cleanup_eng_grps()
1614 kfree(grp->engs[j].bmap); in otx_cpt_cleanup_eng_grps()
1615 grp->engs[j].bmap = NULL; in otx_cpt_cleanup_eng_grps()
1619 mutex_unlock(&eng_grps->lock); in otx_cpt_cleanup_eng_grps()
1628 mutex_init(&eng_grps->lock); in otx_cpt_init_eng_grps()
1629 eng_grps->obj = pci_get_drvdata(pdev); in otx_cpt_init_eng_grps()
1630 eng_grps->avail.se_cnt = eng_grps->avail.max_se_cnt; in otx_cpt_init_eng_grps()
1631 eng_grps->avail.ae_cnt = eng_grps->avail.max_ae_cnt; in otx_cpt_init_eng_grps()
1633 eng_grps->engs_num = eng_grps->avail.max_se_cnt + in otx_cpt_init_eng_grps()
1634 eng_grps->avail.max_ae_cnt; in otx_cpt_init_eng_grps()
1635 if (eng_grps->engs_num > OTX_CPT_MAX_ENGINES) { in otx_cpt_init_eng_grps()
1636 dev_err(&pdev->dev, in otx_cpt_init_eng_grps()
1638 eng_grps->engs_num, OTX_CPT_MAX_ENGINES); in otx_cpt_init_eng_grps()
1639 ret = -EINVAL; in otx_cpt_init_eng_grps()
1644 grp = &eng_grps->grp[i]; in otx_cpt_init_eng_grps()
1645 grp->g = eng_grps; in otx_cpt_init_eng_grps()
1646 grp->idx = i; in otx_cpt_init_eng_grps()
1648 snprintf(grp->sysfs_info_name, OTX_CPT_UCODE_NAME_LENGTH, in otx_cpt_init_eng_grps()
1651 grp->engs[j].bmap = in otx_cpt_init_eng_grps()
1652 kcalloc(BITS_TO_LONGS(eng_grps->engs_num), in otx_cpt_init_eng_grps()
1654 if (!grp->engs[j].bmap) { in otx_cpt_init_eng_grps()
1655 ret = -ENOMEM; in otx_cpt_init_eng_grps()
1664 eng_grps->eng_types_supported = 1 << OTX_CPT_SE_TYPES; in otx_cpt_init_eng_grps()
1669 eng_grps->eng_types_supported = 1 << OTX_CPT_AE_TYPES; in otx_cpt_init_eng_grps()
1673 dev_err(&pdev->dev, "Unknown PF type %d\n", pf_type); in otx_cpt_init_eng_grps()
1674 ret = -EINVAL; in otx_cpt_init_eng_grps()
1678 eng_grps->ucode_load_attr.show = NULL; in otx_cpt_init_eng_grps()
1679 eng_grps->ucode_load_attr.store = ucode_load_store; in otx_cpt_init_eng_grps()
1680 eng_grps->ucode_load_attr.attr.name = "ucode_load"; in otx_cpt_init_eng_grps()
1681 eng_grps->ucode_load_attr.attr.mode = 0220; in otx_cpt_init_eng_grps()
1682 sysfs_attr_init(&eng_grps->ucode_load_attr.attr); in otx_cpt_init_eng_grps()
1683 ret = device_create_file(&pdev->dev, in otx_cpt_init_eng_grps()
1684 &eng_grps->ucode_load_attr); in otx_cpt_init_eng_grps()
1687 eng_grps->is_ucode_load_created = true; in otx_cpt_init_eng_grps()
1689 print_dbg_info(&pdev->dev, eng_grps); in otx_cpt_init_eng_grps()