[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(>->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