[CI v2 4/4] drm/xe: Initialise display before GT and tile init

Lucas De Marchi lucas.demarchi at intel.com
Fri Oct 18 17:40:11 UTC 2024


On Fri, Oct 18, 2024 at 07:06:31PM +0200, Maarten Lankhorst wrote:
>Display needs to be initialised first, because we need to preserve the

this is what xe_display_init_noaccel() was supposed to be doing, which
can't be done before xe_ttm_stolen_mgr_init().

It looks like recent commits violated those comments :(

         /* Allocate and map stolen after potential VRAM resize */                
         xe_ttm_stolen_mgr_init(xe);                                              
                                                                                  
         /*                                                                       
          * Now that GT is initialized (TTM in particular),                       
          * we can try to init display, and inherit the initial fb.               
          * This is the reason the first allocation needs to be done              
          * inside display.                                                       
          */                                                                      
         err = xe_display_init_noaccel(xe);

We will probably need a better way to guarantee we don't regress again.
The right order is tricky and we keep regressing when we change it :-/

I will give this series a try on my machine and report back.

thanks
Lucas De Marchi

>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 at linux.intel.com>
>---
> drivers/gpu/drm/xe/xe_device.c | 37 +++++++++++++++++++++-------------
> drivers/gpu/drm/xe/xe_gt.c     | 24 +++++++++++++++-------
> drivers/gpu/drm/xe/xe_gt.h     |  1 +
> 3 files changed, 41 insertions(+), 21 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
>index 76d8c6868d15e..34bf62a1bcf27 100644
>--- a/drivers/gpu/drm/xe/xe_device.c
>+++ b/drivers/gpu/drm/xe/xe_device.c
>@@ -683,21 +683,10 @@ 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 +694,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)
>@@ -736,12 +727,30 @@ 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 = devm_add_action_or_reset(xe->drm.dev, xe_driver_flr_fini, xe);
>+	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..3824ae24ecb1a 100644
>--- a/drivers/gpu/drm/xe/xe_gt.c
>+++ b/drivers/gpu/drm/xe/xe_gt.c
>@@ -542,6 +542,23 @@ 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 = 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);
>+
>+	xe_gt_topology_init(gt);
>+	xe_gt_mcr_init(gt);
>+	xe_gt_enable_host_l2_vram(gt);
>+
>+	xe_force_wake_put(gt_to_fw(gt), fw_ref);
>+	return 0;
>+}
> /*
>  * Initialize enough GT to be able to load GuC in order to obtain hwconfig and
>  * enable CTB communication.
>@@ -555,9 +572,6 @@ 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;
>@@ -566,10 +580,6 @@ int xe_gt_init_hwconfig(struct xe_gt *gt)
> 	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);
>-- 
>2.45.2
>


More information about the Intel-xe mailing list