Lines Matching +full:version +full:- +full:minor

1 // SPDX-License-Identifier: MIT
3 * Copyright © 2023-2024 Intel Corporation
47 return ret > 0 ? -EPROTO : ret; in guc_action_vf_reset()
54 struct xe_guc *guc = &gt->uc.guc; in vf_reset_guc_state()
59 if (!err || err != -ETIMEDOUT) in vf_reset_guc_state()
61 } while (--retry); in vf_reset_guc_state()
69 * xe_gt_sriov_vf_reset - Reset GuC VF internal state.
79 return -ENODEV; in xe_gt_sriov_vf_reset()
86 u32 *branch, u32 *major, u32 *minor, u32 *patch) in guc_action_match_version() argument
107 return -EPROTO; in guc_action_match_version()
111 *minor = FIELD_GET(VF2GUC_MATCH_VERSION_RESPONSE_MSG_1_MINOR, response[1]); in guc_action_match_version()
117 static void vf_minimum_guc_version(struct xe_gt *gt, u32 *branch, u32 *major, u32 *minor) in vf_minimum_guc_version() argument
121 switch (xe->info.platform) { in vf_minimum_guc_version()
126 *minor = 1; in vf_minimum_guc_version()
132 *minor = 2; in vf_minimum_guc_version()
137 static void vf_wanted_guc_version(struct xe_gt *gt, u32 *branch, u32 *major, u32 *minor) in vf_wanted_guc_version() argument
140 return vf_minimum_guc_version(gt, branch, major, minor); in vf_wanted_guc_version()
145 struct xe_gt_sriov_vf_guc_version *guc_version = &gt->sriov.vf.guc_version; in vf_handshake_with_guc()
146 struct xe_guc *guc = &gt->uc.guc; in vf_handshake_with_guc()
148 u32 branch, major, minor, patch; in vf_handshake_with_guc() local
153 /* select wanted version - prefer previous (if any) */ in vf_handshake_with_guc()
154 if (guc_version->major || guc_version->minor) { in vf_handshake_with_guc()
155 wanted_branch = guc_version->branch; in vf_handshake_with_guc()
156 wanted_major = guc_version->major; in vf_handshake_with_guc()
157 wanted_minor = guc_version->minor; in vf_handshake_with_guc()
164 &branch, &major, &minor, &patch); in vf_handshake_with_guc()
168 /* we don't support interface version change */ in vf_handshake_with_guc()
169 if ((guc_version->major || guc_version->minor) && in vf_handshake_with_guc()
170 (guc_version->branch != branch || guc_version->major != major || in vf_handshake_with_guc()
171 guc_version->minor != minor)) { in vf_handshake_with_guc()
172 xe_gt_sriov_err(gt, "New GuC interface version detected: %u.%u.%u.%u\n", in vf_handshake_with_guc()
173 branch, major, minor, patch); in vf_handshake_with_guc()
174 xe_gt_sriov_info(gt, "Previously used version was: %u.%u.%u.%u\n", in vf_handshake_with_guc()
175 guc_version->branch, guc_version->major, in vf_handshake_with_guc()
176 guc_version->minor, guc_version->patch); in vf_handshake_with_guc()
177 err = -EREMCHG; in vf_handshake_with_guc()
183 err = -EPROTO; in vf_handshake_with_guc()
187 /* there's no fallback on major version. */ in vf_handshake_with_guc()
189 err = -ENOPKG; in vf_handshake_with_guc()
193 /* check against minimum version supported by us */ in vf_handshake_with_guc()
196 if (major < wanted_major || (major == wanted_major && minor < wanted_minor)) { in vf_handshake_with_guc()
197 err = -ENOKEY; in vf_handshake_with_guc()
201 xe_gt_sriov_dbg(gt, "using GuC interface version %u.%u.%u.%u\n", in vf_handshake_with_guc()
202 branch, major, minor, patch); in vf_handshake_with_guc()
204 guc_version->branch = branch; in vf_handshake_with_guc()
205 guc_version->major = major; in vf_handshake_with_guc()
206 guc_version->minor = minor; in vf_handshake_with_guc()
207 guc_version->patch = patch; in vf_handshake_with_guc()
211 xe_gt_sriov_err(gt, "Unsupported GuC version %u.%u.%u.%u (%pe)\n", in vf_handshake_with_guc()
212 branch, major, minor, patch, ERR_PTR(err)); in vf_handshake_with_guc()
214 xe_gt_sriov_err(gt, "Unable to confirm GuC version %u.%u (%pe)\n", in vf_handshake_with_guc()
217 /* try again with *any* just to query which version is supported */ in vf_handshake_with_guc()
220 &branch, &major, &minor, &patch)) in vf_handshake_with_guc()
221 xe_gt_sriov_notice(gt, "GuC reports interface version %u.%u.%u.%u\n", in vf_handshake_with_guc()
222 branch, major, minor, patch); in vf_handshake_with_guc()
227 * xe_gt_sriov_vf_bootstrap - Query and setup GuC ABI interface version.
240 return -ENODEV; in xe_gt_sriov_vf_bootstrap()
264 return ret > 0 ? -EPROTO : ret; in guc_action_vf_notify_resfix_done()
268 * xe_gt_sriov_vf_notify_resfix_done - Notify GuC about resource fixups apply completed.
276 struct xe_guc *guc = &gt->uc.guc; in xe_gt_sriov_vf_notify_resfix_done()
311 return -EPROTO; in guc_action_query_single_klv()
315 return -EOVERFLOW; in guc_action_query_single_klv()
317 return -ENODATA; in guc_action_query_single_klv()
363 * xe_gt_sriov_vf_gmdid - Query GMDID over MMIO.
373 struct xe_guc *guc = &gt->uc.guc; in xe_gt_sriov_vf_gmdid()
379 xe_gt_assert(gt, gt->sriov.vf.guc_version.major > 1 || gt->sriov.vf.guc_version.minor >= 2); in xe_gt_sriov_vf_gmdid()
394 struct xe_gt_sriov_vf_selfconfig *config = &gt->sriov.vf.self_config; in vf_get_ggtt_info()
395 struct xe_guc *guc = &gt->uc.guc; in vf_get_ggtt_info()
409 if (config->ggtt_size && config->ggtt_size != size) { in vf_get_ggtt_info()
411 size / SZ_1K, config->ggtt_size / SZ_1K); in vf_get_ggtt_info()
412 return -EREMCHG; in vf_get_ggtt_info()
415 xe_gt_sriov_dbg_verbose(gt, "GGTT %#llx-%#llx = %lluK\n", in vf_get_ggtt_info()
416 start, start + size - 1, size / SZ_1K); in vf_get_ggtt_info()
418 config->ggtt_base = start; in vf_get_ggtt_info()
419 config->ggtt_size = size; in vf_get_ggtt_info()
421 return config->ggtt_size ? 0 : -ENODATA; in vf_get_ggtt_info()
426 struct xe_gt_sriov_vf_selfconfig *config = &gt->sriov.vf.self_config; in vf_get_lmem_info()
427 struct xe_guc *guc = &gt->uc.guc; in vf_get_lmem_info()
438 if (config->lmem_size && config->lmem_size != size) { in vf_get_lmem_info()
440 size / SZ_1M, config->lmem_size / SZ_1M); in vf_get_lmem_info()
441 return -EREMCHG; in vf_get_lmem_info()
447 config->lmem_size = size; in vf_get_lmem_info()
449 return config->lmem_size ? 0 : -ENODATA; in vf_get_lmem_info()
454 struct xe_gt_sriov_vf_selfconfig *config = &gt->sriov.vf.self_config; in vf_get_submission_cfg()
455 struct xe_guc *guc = &gt->uc.guc; in vf_get_submission_cfg()
469 if (config->num_ctxs && config->num_ctxs != num_ctxs) { in vf_get_submission_cfg()
471 num_ctxs, config->num_ctxs); in vf_get_submission_cfg()
472 return -EREMCHG; in vf_get_submission_cfg()
474 if (config->num_dbs && config->num_dbs != num_dbs) { in vf_get_submission_cfg()
476 num_dbs, config->num_dbs); in vf_get_submission_cfg()
477 return -EREMCHG; in vf_get_submission_cfg()
482 config->num_ctxs = num_ctxs; in vf_get_submission_cfg()
483 config->num_dbs = num_dbs; in vf_get_submission_cfg()
485 return config->num_ctxs ? 0 : -ENODATA; in vf_get_submission_cfg()
493 gt->sriov.vf.runtime.gmdid = xe_gt_sriov_vf_gmdid(gt); in vf_cache_gmdid()
497 * xe_gt_sriov_vf_query_config - Query SR-IOV config data over MMIO.
530 * xe_gt_sriov_vf_guc_ids - VF GuC context IDs configuration.
540 xe_gt_assert(gt, gt->sriov.vf.guc_version.major); in xe_gt_sriov_vf_guc_ids()
541 xe_gt_assert(gt, gt->sriov.vf.self_config.num_ctxs); in xe_gt_sriov_vf_guc_ids()
543 return gt->sriov.vf.self_config.num_ctxs; in xe_gt_sriov_vf_guc_ids()
547 * xe_gt_sriov_vf_lmem - VF LMEM configuration.
557 xe_gt_assert(gt, gt->sriov.vf.guc_version.major); in xe_gt_sriov_vf_lmem()
558 xe_gt_assert(gt, gt->sriov.vf.self_config.lmem_size); in xe_gt_sriov_vf_lmem()
560 return gt->sriov.vf.self_config.lmem_size; in xe_gt_sriov_vf_lmem()
584 struct xe_gt_sriov_vf_selfconfig *config = &gt->sriov.vf.self_config; in vf_balloon_ggtt()
586 struct xe_ggtt *ggtt = tile->mem.ggtt; in vf_balloon_ggtt()
593 if (!config->ggtt_size) in vf_balloon_ggtt()
594 return -ENODATA; in vf_balloon_ggtt()
600 * |<------------ Total GGTT size ------------------>| in vf_balloon_ggtt()
602 * VF GGTT base -->|<- size ->| in vf_balloon_ggtt()
604 * +--------------------+----------+-----------------+ in vf_balloon_ggtt()
606 * +--------------------+----------+-----------------+ in vf_balloon_ggtt()
608 * |<--- balloon[0] --->|<-- VF -->|<-- balloon[1] ->| in vf_balloon_ggtt()
612 end = config->ggtt_base; in vf_balloon_ggtt()
614 tile->sriov.vf.ggtt_balloon[0] = vf_balloon_ggtt_node(ggtt, start, end); in vf_balloon_ggtt()
615 if (IS_ERR(tile->sriov.vf.ggtt_balloon[0])) in vf_balloon_ggtt()
616 return PTR_ERR(tile->sriov.vf.ggtt_balloon[0]); in vf_balloon_ggtt()
619 start = config->ggtt_base + config->ggtt_size; in vf_balloon_ggtt()
622 tile->sriov.vf.ggtt_balloon[1] = vf_balloon_ggtt_node(ggtt, start, end); in vf_balloon_ggtt()
623 if (IS_ERR(tile->sriov.vf.ggtt_balloon[1])) { in vf_balloon_ggtt()
624 xe_ggtt_node_remove_balloon(tile->sriov.vf.ggtt_balloon[0]); in vf_balloon_ggtt()
625 return PTR_ERR(tile->sriov.vf.ggtt_balloon[1]); in vf_balloon_ggtt()
637 xe_ggtt_node_remove_balloon(tile->sriov.vf.ggtt_balloon[1]); in deballoon_ggtt()
638 xe_ggtt_node_remove_balloon(tile->sriov.vf.ggtt_balloon[0]); in deballoon_ggtt()
642 * xe_gt_sriov_vf_prepare_ggtt - Prepare a VF's GGTT configuration.
662 return drmm_add_action_or_reset(&xe->drm, deballoon_ggtt, tile); in xe_gt_sriov_vf_prepare_ggtt()
665 static int relay_action_handshake(struct xe_gt *gt, u32 *major, u32 *minor) in relay_action_handshake() argument
672 FIELD_PREP(VF2PF_HANDSHAKE_REQUEST_MSG_1_MINOR, *minor), in relay_action_handshake()
679 ret = xe_guc_relay_send_to_pf(&gt->uc.guc.relay, in relay_action_handshake()
686 return -EPROTO; in relay_action_handshake()
689 return -EPROTO; in relay_action_handshake()
692 *minor = FIELD_GET(VF2PF_HANDSHAKE_RESPONSE_MSG_1_MINOR, response[1]); in relay_action_handshake()
697 static void vf_connect_pf(struct xe_gt *gt, u16 major, u16 minor) in vf_connect_pf() argument
701 gt->sriov.vf.pf_version.major = major; in vf_connect_pf()
702 gt->sriov.vf.pf_version.minor = minor; in vf_connect_pf()
714 u32 major = major_wanted, minor = minor_wanted; in vf_handshake_with_pf() local
717 err = relay_action_handshake(gt, &major, &minor); in vf_handshake_with_pf()
721 if (!major && !minor) { in vf_handshake_with_pf()
722 err = -ENODATA; in vf_handshake_with_pf()
726 xe_gt_sriov_dbg(gt, "using VF/PF ABI %u.%u\n", major, minor); in vf_handshake_with_pf()
727 vf_connect_pf(gt, major, minor); in vf_handshake_with_pf()
731 xe_gt_sriov_err(gt, "Unable to confirm VF/PF ABI version %u.%u (%pe)\n", in vf_handshake_with_pf()
732 major, minor, ERR_PTR(err)); in vf_handshake_with_pf()
738 * xe_gt_sriov_vf_connect - Establish connection with the PF driver.
756 xe_gt_sriov_err(gt, "Failed to get version info (%pe)\n", ERR_PTR(err)); in xe_gt_sriov_vf_connect()
761 * xe_gt_sriov_vf_migrated_event_handler - Start a VF migration recovery,
773 set_bit(gt->info.id, &xe->sriov.vf.migration.gt_flags); in xe_gt_sriov_vf_migrated_event_handler()
784 static bool vf_is_negotiated(struct xe_gt *gt, u16 major, u16 minor) in vf_is_negotiated() argument
788 return major == gt->sriov.vf.pf_version.major && in vf_is_negotiated()
789 minor <= gt->sriov.vf.pf_version.minor; in vf_is_negotiated()
794 struct vf_runtime_reg *regs = gt->sriov.vf.runtime.regs; in vf_prepare_runtime_info()
801 if (num_regs <= gt->sriov.vf.runtime.regs_size) { in vf_prepare_runtime_info()
803 gt->sriov.vf.runtime.num_regs = num_regs; in vf_prepare_runtime_info()
807 drmm_kfree(&xe->drm, regs); in vf_prepare_runtime_info()
808 gt->sriov.vf.runtime.regs = NULL; in vf_prepare_runtime_info()
809 gt->sriov.vf.runtime.num_regs = 0; in vf_prepare_runtime_info()
810 gt->sriov.vf.runtime.regs_size = 0; in vf_prepare_runtime_info()
813 regs = drmm_kcalloc(&xe->drm, regs_size, sizeof(*regs), GFP_KERNEL); in vf_prepare_runtime_info()
815 return -ENOMEM; in vf_prepare_runtime_info()
817 gt->sriov.vf.runtime.regs = regs; in vf_prepare_runtime_info()
818 gt->sriov.vf.runtime.num_regs = num_regs; in vf_prepare_runtime_info()
819 gt->sriov.vf.runtime.regs_size = regs_size; in vf_prepare_runtime_info()
827 u32 limit = (ARRAY_SIZE(response) - VF2PF_QUERY_RUNTIME_RESPONSE_MSG_MIN_LEN) / 2; in vf_query_runtime_info()
837 return -ENOPKG; in vf_query_runtime_info()
847 ret = xe_guc_relay_send_to_pf(&gt->uc.guc.relay, in vf_query_runtime_info()
854 ret = -EPROTO; in vf_query_runtime_info()
857 if (unlikely((ret - VF2PF_QUERY_RUNTIME_RESPONSE_MSG_MIN_LEN) % 2)) { in vf_query_runtime_info()
858 ret = -EPROTO; in vf_query_runtime_info()
862 num = (ret - VF2PF_QUERY_RUNTIME_RESPONSE_MSG_MIN_LEN) / 2; in vf_query_runtime_info()
870 ret = -EPROTO; in vf_query_runtime_info()
878 } else if (unlikely(start + num > gt->sriov.vf.runtime.num_regs)) { in vf_query_runtime_info()
879 ret = -EPROTO; in vf_query_runtime_info()
884 struct vf_runtime_reg *reg = &gt->sriov.vf.runtime.regs[start + i]; in vf_query_runtime_info()
886 reg->offset = response[VF2PF_QUERY_RUNTIME_RESPONSE_MSG_MIN_LEN + 2 * i]; in vf_query_runtime_info()
887 reg->value = response[VF2PF_QUERY_RUNTIME_RESPONSE_MSG_MIN_LEN + 2 * i + 1]; in vf_query_runtime_info()
904 struct vf_runtime_reg *vf_regs = gt->sriov.vf.runtime.regs; in vf_show_runtime_info()
905 unsigned int size = gt->sriov.vf.runtime.num_regs; in vf_show_runtime_info()
909 for (; size--; vf_regs++) in vf_show_runtime_info()
911 vf_regs->offset, vf_regs->value); in vf_show_runtime_info()
915 * xe_gt_sriov_vf_query_runtime - Query SR-IOV runtime data.
946 return (int)ra->offset - (int)rb->offset; in vf_runtime_reg_cmp()
951 struct xe_gt_sriov_vf_runtime *runtime = &gt->sriov.vf.runtime; in vf_lookup_reg()
956 return bsearch(&key, runtime->regs, runtime->num_regs, sizeof(key), in vf_lookup_reg()
961 * xe_gt_sriov_vf_read32 - Get a register value from the runtime data.
973 u32 addr = xe_mmio_adjusted_addr(&gt->mmio, reg.addr); in xe_gt_sriov_vf_read32()
977 xe_gt_assert(gt, gt->sriov.vf.pf_version.major); in xe_gt_sriov_vf_read32()
982 addr, gt->sriov.vf.runtime.gmdid); in xe_gt_sriov_vf_read32()
983 return gt->sriov.vf.runtime.gmdid; in xe_gt_sriov_vf_read32()
990 reg.addr, addr - reg.addr); in xe_gt_sriov_vf_read32()
994 xe_gt_sriov_dbg_verbose(gt, "runtime[%#x] = %#x\n", addr, rr->value); in xe_gt_sriov_vf_read32()
995 return rr->value; in xe_gt_sriov_vf_read32()
999 * xe_gt_sriov_vf_write32 - Handle a write to an inaccessible register.
1009 u32 addr = xe_mmio_adjusted_addr(&gt->mmio, reg.addr); in xe_gt_sriov_vf_write32()
1021 val, reg.addr, addr - reg.addr); in xe_gt_sriov_vf_write32()
1025 * xe_gt_sriov_vf_print_config - Print VF self config.
1033 struct xe_gt_sriov_vf_selfconfig *config = &gt->sriov.vf.self_config; in xe_gt_sriov_vf_print_config()
1039 drm_printf(p, "GGTT range:\t%#llx-%#llx\n", in xe_gt_sriov_vf_print_config()
1040 config->ggtt_base, in xe_gt_sriov_vf_print_config()
1041 config->ggtt_base + config->ggtt_size - 1); in xe_gt_sriov_vf_print_config()
1043 string_get_size(config->ggtt_size, 1, STRING_UNITS_2, buf, sizeof(buf)); in xe_gt_sriov_vf_print_config()
1044 drm_printf(p, "GGTT size:\t%llu (%s)\n", config->ggtt_size, buf); in xe_gt_sriov_vf_print_config()
1047 string_get_size(config->lmem_size, 1, STRING_UNITS_2, buf, sizeof(buf)); in xe_gt_sriov_vf_print_config()
1048 drm_printf(p, "LMEM size:\t%llu (%s)\n", config->lmem_size, buf); in xe_gt_sriov_vf_print_config()
1051 drm_printf(p, "GuC contexts:\t%u\n", config->num_ctxs); in xe_gt_sriov_vf_print_config()
1052 drm_printf(p, "GuC doorbells:\t%u\n", config->num_dbs); in xe_gt_sriov_vf_print_config()
1056 * xe_gt_sriov_vf_print_runtime - Print VF's runtime regs received from PF.
1064 struct vf_runtime_reg *vf_regs = gt->sriov.vf.runtime.regs; in xe_gt_sriov_vf_print_runtime()
1065 unsigned int size = gt->sriov.vf.runtime.num_regs; in xe_gt_sriov_vf_print_runtime()
1069 for (; size--; vf_regs++) in xe_gt_sriov_vf_print_runtime()
1070 drm_printf(p, "%#x = %#x\n", vf_regs->offset, vf_regs->value); in xe_gt_sriov_vf_print_runtime()
1074 * xe_gt_sriov_vf_print_version - Print VF ABI versions.
1082 struct xe_gt_sriov_vf_guc_version *guc_version = &gt->sriov.vf.guc_version; in xe_gt_sriov_vf_print_version()
1083 struct xe_gt_sriov_vf_relay_version *pf_version = &gt->sriov.vf.pf_version; in xe_gt_sriov_vf_print_version()
1084 u32 branch, major, minor; in xe_gt_sriov_vf_print_version() local
1090 vf_minimum_guc_version(gt, &branch, &major, &minor); in xe_gt_sriov_vf_print_version()
1091 drm_printf(p, "\tbase:\t%u.%u.%u.*\n", branch, major, minor); in xe_gt_sriov_vf_print_version()
1093 vf_wanted_guc_version(gt, &branch, &major, &minor); in xe_gt_sriov_vf_print_version()
1094 drm_printf(p, "\twanted:\t%u.%u.%u.*\n", branch, major, minor); in xe_gt_sriov_vf_print_version()
1097 guc_version->branch, guc_version->major, in xe_gt_sriov_vf_print_version()
1098 guc_version->minor, guc_version->patch); in xe_gt_sriov_vf_print_version()
1107 pf_version->major, pf_version->minor); in xe_gt_sriov_vf_print_version()