Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
To: intel-xe@lists.freedesktop.org
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Subject: [PATCH] drm/xe: Initialise display before GT and tile init
Date: Thu, 24 Oct 2024 17:15:19 +0200	[thread overview]
Message-ID: <20241024151519.136632-1-maarten.lankhorst@linux.intel.com> (raw)
In-Reply-To: <20241021103823.83948-1-maarten.lankhorst@linux.intel.com>

Display needs to be initialised first, because we need to preserve the
initial framebuffer. It will be overwritten by any allocation we do,
especially on discrete where the framebuffer is not in stolen memory.

On integrated even if we still recover the initial framebuffer after
allocating, it still shows up as temporary corruption on-screen.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
 drivers/gpu/drm/xe/xe_device.c      | 33 ++++++++++++++--------
 drivers/gpu/drm/xe/xe_gt.c          | 43 ++++++++++++++++++++++-------
 drivers/gpu/drm/xe/xe_gt.h          |  1 +
 drivers/gpu/drm/xe/xe_gt_sriov_vf.c |  1 -
 drivers/gpu/drm/xe/xe_guc.c         | 16 +++++------
 drivers/gpu/drm/xe/xe_guc_ct.c      | 24 ++++++++--------
 6 files changed, 76 insertions(+), 42 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index d145f1376069e..99f1122c0340e 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -683,20 +683,12 @@ int xe_device_probe(struct xe_device *xe)
 		err = xe_ggtt_init_early(tile->mem.ggtt);
 		if (err)
 			return err;
-		err = xe_memirq_init(&tile->memirq);
-		if (err)
-			return err;
-	}
-
-	for_each_gt(gt, xe, id) {
-		err = xe_gt_init_hwconfig(gt);
-		if (err)
-			return err;
 	}
 
 	err = xe_devcoredump_init(xe);
 	if (err)
 		return err;
+
 	err = devm_add_action_or_reset(xe->drm.dev, xe_driver_flr_fini, xe);
 	if (err)
 		return err;
@@ -705,9 +697,11 @@ int xe_device_probe(struct xe_device *xe)
 	if (err)
 		return err;
 
-	err = xe_irq_install(xe);
-	if (err)
-		goto err;
+	for_each_gt(gt, xe, id) {
+		err = xe_gt_init_mcr(gt);
+		if (err)
+			return err;
+	}
 
 	err = probe_has_flat_ccs(xe);
 	if (err)
@@ -740,12 +734,27 @@ int xe_device_probe(struct xe_device *xe)
 	if (err)
 		goto err;
 
+	/* Now we initialise the rest of GT and tiles, and enable interrupts. */
 	for_each_tile(tile, xe, id) {
+		err = xe_memirq_init(&tile->memirq);
+		if (err)
+			return err;
+
 		err = xe_tile_init(tile);
 		if (err)
 			goto err;
 	}
 
+	for_each_gt(gt, xe, id) {
+		err = xe_gt_init_hwconfig(gt);
+		if (err)
+			return err;
+	}
+
+	err = xe_irq_install(xe);
+	if (err)
+		goto err;
+
 	for_each_gt(gt, xe, id) {
 		last_gt = id;
 
diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
index 89e9d9d4db060..a0f125fba24fa 100644
--- a/drivers/gpu/drm/xe/xe_gt.c
+++ b/drivers/gpu/drm/xe/xe_gt.c
@@ -542,6 +542,34 @@ static int all_fw_domain_init(struct xe_gt *gt)
 	return err;
 }
 
+int xe_gt_init_mcr(struct xe_gt *gt)
+{
+	/* Init enough GT for display init to go through */
+	unsigned int fw_ref;
+	int err = 0;
+
+	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
+	if (!fw_ref)
+		return -ETIMEDOUT;
+
+	xe_gt_mcr_init_early(gt);
+	xe_pat_init(gt);
+
+	/* TODO: This is not ideal, we should ideally always initialise UC at the same time */
+	if (IS_SRIOV_VF(gt_to_xe(gt))) {
+		err = xe_uc_init(&gt->uc);
+		if (err)
+			goto out_fw;
+	}
+
+	xe_gt_topology_init(gt);
+	xe_gt_mcr_init(gt);
+	xe_gt_enable_host_l2_vram(gt);
+
+out_fw:
+	xe_force_wake_put(gt_to_fw(gt), fw_ref);
+	return err;
+}
 /*
  * Initialize enough GT to be able to load GuC in order to obtain hwconfig and
  * enable CTB communication.
@@ -555,21 +583,16 @@ int xe_gt_init_hwconfig(struct xe_gt *gt)
 	if (!fw_ref)
 		return -ETIMEDOUT;
 
-	xe_gt_mcr_init_early(gt);
-	xe_pat_init(gt);
-
-	err = xe_uc_init(&gt->uc);
-	if (err)
-		goto out_fw;
+	if (!IS_SRIOV_VF(gt_to_xe(gt))) {
+		err = xe_uc_init(&gt->uc);
+		if (err)
+			goto out_fw;
+	}
 
 	err = xe_uc_init_hwconfig(&gt->uc);
 	if (err)
 		goto out_fw;
 
-	xe_gt_topology_init(gt);
-	xe_gt_mcr_init(gt);
-	xe_gt_enable_host_l2_vram(gt);
-
 out_fw:
 	xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	return err;
diff --git a/drivers/gpu/drm/xe/xe_gt.h b/drivers/gpu/drm/xe/xe_gt.h
index 82b9b7f82fcab..58aa95fe0aa61 100644
--- a/drivers/gpu/drm/xe/xe_gt.h
+++ b/drivers/gpu/drm/xe/xe_gt.h
@@ -29,6 +29,7 @@ static inline bool xe_fault_inject_gt_reset(void)
 
 struct xe_gt *xe_gt_alloc(struct xe_tile *tile);
 int xe_gt_init_hwconfig(struct xe_gt *gt);
+int xe_gt_init_mcr(struct xe_gt *gt);
 int xe_gt_init_early(struct xe_gt *gt);
 int xe_gt_init(struct xe_gt *gt);
 void xe_gt_mmio_init(struct xe_gt *gt);
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
index d3baba50f0851..bc8ab6b47adf3 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
@@ -489,7 +489,6 @@ u16 xe_gt_sriov_vf_guc_ids(struct xe_gt *gt)
 u64 xe_gt_sriov_vf_lmem(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.lmem_size);
 
 	return gt->sriov.vf.self_config.lmem_size;
diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c
index 76437d42b8a1e..71d83ccecf8b3 100644
--- a/drivers/gpu/drm/xe/xe_guc.c
+++ b/drivers/gpu/drm/xe/xe_guc.c
@@ -313,6 +313,14 @@ static int vf_guc_init(struct xe_guc *guc)
 	if (err)
 		return err;
 
+	ret = xe_gt_sriov_vf_bootstrap(gt);
+	if (ret)
+		return ret;
+
+	ret = xe_gt_sriov_vf_query_config(gt);
+	if (ret)
+		return ret;
+
 	return 0;
 }
 
@@ -753,14 +761,6 @@ static int vf_guc_min_load_for_hwconfig(struct xe_guc *guc)
 	struct xe_gt *gt = guc_to_gt(guc);
 	int ret;
 
-	ret = xe_gt_sriov_vf_bootstrap(gt);
-	if (ret)
-		return ret;
-
-	ret = xe_gt_sriov_vf_query_config(gt);
-	if (ret)
-		return ret;
-
 	ret = xe_guc_hwconfig_init(guc);
 	if (ret)
 		return ret;
diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c
index c260d88409907..444771e7ba820 100644
--- a/drivers/gpu/drm/xe/xe_guc_ct.c
+++ b/drivers/gpu/drm/xe/xe_guc_ct.c
@@ -207,8 +207,6 @@ int xe_guc_ct_init(struct xe_guc_ct *ct)
 {
 	struct xe_device *xe = ct_to_xe(ct);
 	struct xe_gt *gt = ct_to_gt(ct);
-	struct xe_tile *tile = gt_to_tile(gt);
-	struct xe_bo *bo;
 	int err;
 
 	xe_gt_assert(gt, !(guc_ct_size() % PAGE_SIZE));
@@ -234,15 +232,6 @@ int xe_guc_ct_init(struct xe_guc_ct *ct)
 
 	primelockdep(ct);
 
-	bo = xe_managed_bo_create_pin_map(xe, tile, guc_ct_size(),
-					  XE_BO_FLAG_SYSTEM |
-					  XE_BO_FLAG_GGTT |
-					  XE_BO_FLAG_GGTT_INVALIDATE);
-	if (IS_ERR(bo))
-		return PTR_ERR(bo);
-
-	ct->bo = bo;
-
 	err = drmm_add_action_or_reset(&xe->drm, guc_ct_fini, ct);
 	if (err)
 		return err;
@@ -434,10 +423,23 @@ int xe_guc_ct_enable(struct xe_guc_ct *ct)
 {
 	struct xe_device *xe = ct_to_xe(ct);
 	struct xe_gt *gt = ct_to_gt(ct);
+	struct xe_tile *tile = gt_to_tile(gt);
 	int err;
 
 	xe_gt_assert(gt, !xe_guc_ct_enabled(ct));
 
+	if (!ct->bo) {
+		struct xe_bo *bo;
+
+		bo = xe_managed_bo_create_pin_map(xe, tile, guc_ct_size(),
+						XE_BO_FLAG_SYSTEM |
+						XE_BO_FLAG_GGTT |
+						XE_BO_FLAG_GGTT_INVALIDATE);
+		if (IS_ERR(bo))
+			return PTR_ERR(bo);
+		ct->bo = bo;
+	}
+
 	xe_map_memset(xe, &ct->bo->vmap, 0, 0, ct->bo->size);
 	guc_ct_ctb_h2g_init(xe, &ct->ctbs.h2g, &ct->bo->vmap);
 	guc_ct_ctb_g2h_init(xe, &ct->ctbs.g2h, &ct->bo->vmap);
-- 
2.45.2


  parent reply	other threads:[~2024-10-24 15:15 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-18 17:06 [CI v2 0/4] (CI) drm/xe: Fix initial framebuffer handover Maarten Lankhorst
2024-10-18 17:06 ` [CI v2 1/4] drm/xe: Remove double pageflip Maarten Lankhorst
2024-10-18 17:12   ` Lucas De Marchi
2024-10-18 17:06 ` [CI v2 2/4] drm/i915/display: Use async flip when available for initial plane config Maarten Lankhorst
2024-10-18 17:14   ` Lucas De Marchi
2024-10-18 17:06 ` [CI v2 3/4] drm/xe: Move suballocator init to after display init Maarten Lankhorst
2024-10-18 17:30   ` Lucas De Marchi
2024-10-18 17:06 ` [CI v2 4/4] drm/xe: Initialise display before GT and tile init Maarten Lankhorst
2024-10-18 17:40   ` Lucas De Marchi
2024-10-18 20:05   ` [CI v2.2] " Maarten Lankhorst
2024-10-21 10:38     ` [CI v2.3] " Maarten Lankhorst
2024-10-24 13:46       ` [PATCH] " Maarten Lankhorst
2024-10-24 15:15       ` Maarten Lankhorst [this message]
2024-10-25 10:14         ` Maarten Lankhorst
2024-10-25 13:04           ` Maarten Lankhorst
2024-10-18 18:08 ` ✓ CI.Patch_applied: success for (CI) drm/xe: Fix initial framebuffer handover Patchwork
2024-10-18 18:08 ` ✗ CI.checkpatch: warning " Patchwork
2024-10-18 18:10 ` ✓ CI.KUnit: success " Patchwork
2024-10-18 18:21 ` ✓ CI.Build: " Patchwork
2024-10-18 18:23 ` ✓ CI.Hooks: " Patchwork
2024-10-18 18:25 ` ✗ CI.checksparse: warning " Patchwork
2024-10-18 18:45 ` ✗ CI.BAT: failure " Patchwork
2024-10-18 21:25 ` ✓ CI.Patch_applied: success for (CI) drm/xe: Fix initial framebuffer handover. (rev2) Patchwork
2024-10-18 21:25 ` ✓ CI.checkpatch: " Patchwork
2024-10-18 21:27 ` ✓ CI.KUnit: " Patchwork
2024-10-18 21:38 ` ✓ CI.Build: " Patchwork
2024-10-18 21:40 ` ✓ CI.Hooks: " Patchwork
2024-10-18 21:42 ` ✗ CI.checksparse: warning " Patchwork
2024-10-18 22:04 ` ✗ CI.BAT: failure " Patchwork
2024-10-19 11:17 ` ✗ CI.FULL: failure for (CI) drm/xe: Fix initial framebuffer handover Patchwork
2024-10-19 14:41 ` ✗ CI.FULL: failure for (CI) drm/xe: Fix initial framebuffer handover. (rev2) Patchwork
2024-10-21 10:50 ` ✓ CI.Patch_applied: success for (CI) drm/xe: Fix initial framebuffer handover. (rev3) Patchwork
2024-10-21 10:50 ` ✓ CI.checkpatch: " Patchwork
2024-10-21 10:52 ` ✓ CI.KUnit: " Patchwork
2024-10-21 11:03 ` ✓ CI.Build: " Patchwork
2024-10-21 11:06 ` ✓ CI.Hooks: " Patchwork
2024-10-21 11:07 ` ✗ CI.checksparse: warning " Patchwork
2024-10-21 11:36 ` ✓ CI.BAT: success " Patchwork
2024-10-21 15:59 ` ✗ CI.FULL: failure " Patchwork
2024-10-25  1:30 ` ✓ CI.Patch_applied: success for (CI) drm/xe: Fix initial framebuffer handover. (rev5) Patchwork
2024-10-25  1:30 ` ✗ CI.checkpatch: warning " Patchwork
2024-10-25  1:31 ` ✗ CI.KUnit: failure " Patchwork
2024-10-25 11:29 ` ✓ CI.Patch_applied: success for (CI) drm/xe: Fix initial framebuffer handover. (rev6) Patchwork
2024-10-25 11:29 ` ✗ CI.checkpatch: warning " Patchwork
2024-10-25 11:30 ` ✓ CI.KUnit: success " Patchwork
2024-10-25 11:42 ` ✓ CI.Build: " Patchwork
2024-10-25 11:44 ` ✓ CI.Hooks: " Patchwork
2024-10-25 11:46 ` ✗ CI.checksparse: warning " Patchwork
2024-10-25 12:14 ` ✗ CI.BAT: failure " Patchwork
2024-10-25 13:11 ` ✓ CI.Patch_applied: success for (CI) drm/xe: Fix initial framebuffer handover. (rev7) Patchwork
2024-10-25 13:11 ` ✗ CI.checkpatch: warning " Patchwork
2024-10-25 13:13 ` ✓ CI.KUnit: success " Patchwork
2024-10-25 13:24 ` ✓ CI.Build: " Patchwork
2024-10-25 13:27 ` ✓ CI.Hooks: " Patchwork
2024-10-25 13:28 ` ✗ CI.checksparse: warning " Patchwork
2024-10-25 13:54 ` ✗ CI.BAT: failure " Patchwork
2024-10-26 23:39 ` ✗ CI.FULL: failure for (CI) drm/xe: Fix initial framebuffer handover. (rev6) Patchwork
2024-10-27  1:46 ` ✗ CI.FULL: failure for (CI) drm/xe: Fix initial framebuffer handover. (rev7) Patchwork
2024-10-29 11:40 ` Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241024151519.136632-1-maarten.lankhorst@linux.intel.com \
    --to=maarten.lankhorst@linux.intel.com \
    --cc=intel-xe@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox