]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/xe/vf: Custom GuC initialization if VF
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Tue, 21 May 2024 09:25:18 +0000 (11:25 +0200)
committerMichal Wajdeczko <michal.wajdeczko@intel.com>
Wed, 22 May 2024 10:53:45 +0000 (12:53 +0200)
The GuC firmware is loaded and initialized by the PF driver. Make
sure VF drivers only perform permitted operations. For submission
initialization, use number of GuC context IDs from self config.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: John Harrison <John.C.Harrison@Intel.com>
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240521092518.624-3-michal.wajdeczko@intel.com
drivers/gpu/drm/xe/xe_gt_sriov_vf.c
drivers/gpu/drm/xe/xe_gt_sriov_vf.h
drivers/gpu/drm/xe/xe_guc.c

index 378dde5ad4f9b41239ce1f12c36a980815ee0f14..bab3858b423ebcd86f21f89c0726519cc544ef44 100644 (file)
@@ -408,6 +408,23 @@ int xe_gt_sriov_vf_query_config(struct xe_gt *gt)
        return 0;
 }
 
+/**
+ * xe_gt_sriov_vf_guc_ids - VF GuC context IDs configuration.
+ * @gt: the &xe_gt
+ *
+ * This function is for VF use only.
+ *
+ * Return: number of GuC context IDs assigned to VF.
+ */
+u16 xe_gt_sriov_vf_guc_ids(struct xe_gt *gt)
+{
+       xe_gt_assert(gt, IS_SRIOV_VF(gt_to_xe(gt)));
+       xe_gt_assert(gt, gt->sriov.vf.guc_version.major);
+       xe_gt_assert(gt, gt->sriov.vf.self_config.num_ctxs);
+
+       return gt->sriov.vf.self_config.num_ctxs;
+}
+
 static int relay_action_handshake(struct xe_gt *gt, u32 *major, u32 *minor)
 {
        u32 request[VF2PF_HANDSHAKE_REQUEST_MSG_LEN] = {
index 997cb7541036f930f7fee094c90e49a2d2412dd0..d6d37b193d17e2d2cb22c78408bf2ffa8e0b112b 100644 (file)
@@ -16,6 +16,8 @@ int xe_gt_sriov_vf_query_config(struct xe_gt *gt);
 int xe_gt_sriov_vf_connect(struct xe_gt *gt);
 int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt);
 
+u16 xe_gt_sriov_vf_guc_ids(struct xe_gt *gt);
+
 void xe_gt_sriov_vf_print_config(struct xe_gt *gt, struct drm_printer *p);
 void xe_gt_sriov_vf_print_runtime(struct xe_gt *gt, struct drm_printer *p);
 void xe_gt_sriov_vf_print_version(struct xe_gt *gt, struct drm_printer *p);
index 807ad53449e460a05f77245b0da44367e46c9f2e..cec709a908c3d316837bc154a55b2de8af980e35 100644 (file)
@@ -295,6 +295,23 @@ static int xe_guc_realloc_post_hwconfig(struct xe_guc *guc)
        return 0;
 }
 
+static int vf_guc_init(struct xe_guc *guc)
+{
+       int err;
+
+       xe_guc_comm_init_early(guc);
+
+       err = xe_guc_ct_init(&guc->ct);
+       if (err)
+               return err;
+
+       err = xe_guc_relay_init(&guc->relay);
+       if (err)
+               return err;
+
+       return 0;
+}
+
 int xe_guc_init(struct xe_guc *guc)
 {
        struct xe_device *xe = guc_to_xe(guc);
@@ -309,6 +326,13 @@ int xe_guc_init(struct xe_guc *guc)
        if (!xe_uc_fw_is_enabled(&guc->fw))
                return 0;
 
+       if (IS_SRIOV_VF(xe)) {
+               ret = vf_guc_init(guc);
+               if (ret)
+                       goto out;
+               return 0;
+       }
+
        ret = xe_guc_log_init(&guc->log);
        if (ret)
                goto out;
@@ -342,6 +366,19 @@ out:
        return ret;
 }
 
+static int vf_guc_init_post_hwconfig(struct xe_guc *guc)
+{
+       int err;
+
+       err = xe_guc_submit_init(guc, xe_gt_sriov_vf_guc_ids(guc_to_gt(guc)));
+       if (err)
+               return err;
+
+       /* XXX xe_guc_db_mgr_init not needed for now */
+
+       return 0;
+}
+
 /**
  * xe_guc_init_post_hwconfig - initialize GuC post hwconfig load
  * @guc: The GuC object
@@ -352,6 +389,9 @@ int xe_guc_init_post_hwconfig(struct xe_guc *guc)
 {
        int ret;
 
+       if (IS_SRIOV_VF(guc_to_xe(guc)))
+               return vf_guc_init_post_hwconfig(guc);
+
        ret = xe_guc_realloc_post_hwconfig(guc);
        if (ret)
                return ret;