drm/xe/display: Use a single early init call for display

Now that interrupts are disabled for xe_display_init_noaccel,
both xe_display_init_noirq and xe_display_init_noaccel run in the same
context.

This means that we can get rid of the 3 different init calls. Without
interrupts, nothing is touching display up to this point.
Unify those 3 early display calls into a single xe_display_init_early(),
this makes the init sequence cleaner, and display less tangled during
init.

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250121142850.4960-3-dev@lankhorst.se
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
This commit is contained in:
Maarten Lankhorst 2025-01-21 15:28:50 +01:00
parent f595fe5f6a
commit 65e366ace5
3 changed files with 22 additions and 69 deletions

View File

@ -101,19 +101,25 @@ int xe_display_create(struct xe_device *xe)
return drmm_add_action_or_reset(&xe->drm, display_destroy, NULL); return drmm_add_action_or_reset(&xe->drm, display_destroy, NULL);
} }
static void xe_display_fini_nommio(struct drm_device *dev, void *dummy) static void xe_display_fini_early(void *arg)
{ {
struct xe_device *xe = to_xe_device(dev); struct xe_device *xe = arg;
struct intel_display *display = &xe->display; struct intel_display *display = &xe->display;
if (!xe->info.probe_display) if (!xe->info.probe_display)
return; return;
intel_display_driver_remove_nogem(display);
intel_display_driver_remove_noirq(display);
intel_opregion_cleanup(display);
intel_power_domains_cleanup(display); intel_power_domains_cleanup(display);
} }
int xe_display_init_nommio(struct xe_device *xe) int xe_display_init_early(struct xe_device *xe)
{ {
struct intel_display *display = &xe->display;
int err;
if (!xe->info.probe_display) if (!xe->info.probe_display)
return 0; return 0;
@ -123,29 +129,6 @@ int xe_display_init_nommio(struct xe_device *xe)
/* This must be called before any calls to HAS_PCH_* */ /* This must be called before any calls to HAS_PCH_* */
intel_detect_pch(xe); intel_detect_pch(xe);
return drmm_add_action_or_reset(&xe->drm, xe_display_fini_nommio, xe);
}
static void xe_display_fini_noirq(void *arg)
{
struct xe_device *xe = arg;
struct intel_display *display = &xe->display;
if (!xe->info.probe_display)
return;
intel_display_driver_remove_noirq(display);
intel_opregion_cleanup(display);
}
int xe_display_init_noirq(struct xe_device *xe)
{
struct intel_display *display = &xe->display;
int err;
if (!xe->info.probe_display)
return 0;
intel_display_driver_early_probe(display); intel_display_driver_early_probe(display);
/* Early display init.. */ /* Early display init.. */
@ -162,38 +145,20 @@ int xe_display_init_noirq(struct xe_device *xe)
intel_display_device_info_runtime_init(display); intel_display_device_info_runtime_init(display);
err = intel_display_driver_probe_noirq(display); err = intel_display_driver_probe_noirq(display);
if (err) { if (err)
intel_opregion_cleanup(display); goto err_opregion;
return err;
}
return devm_add_action_or_reset(xe->drm.dev, xe_display_fini_noirq, xe);
}
static void xe_display_fini_noaccel(void *arg)
{
struct xe_device *xe = arg;
struct intel_display *display = &xe->display;
if (!xe->info.probe_display)
return;
intel_display_driver_remove_nogem(display);
}
int xe_display_init_noaccel(struct xe_device *xe)
{
struct intel_display *display = &xe->display;
int err;
if (!xe->info.probe_display)
return 0;
err = intel_display_driver_probe_nogem(display); err = intel_display_driver_probe_nogem(display);
if (err) if (err)
return err; goto err_noirq;
return devm_add_action_or_reset(xe->drm.dev, xe_display_fini_noaccel, xe); return devm_add_action_or_reset(xe->drm.dev, xe_display_fini_early, xe);
err_noirq:
intel_display_driver_remove_noirq(display);
intel_power_domains_cleanup(display);
err_opregion:
intel_opregion_cleanup(display);
return err;
} }
int xe_display_init(struct xe_device *xe) int xe_display_init(struct xe_device *xe)

View File

@ -20,9 +20,7 @@ int xe_display_create(struct xe_device *xe);
int xe_display_probe(struct xe_device *xe); int xe_display_probe(struct xe_device *xe);
int xe_display_init_nommio(struct xe_device *xe); int xe_display_init_early(struct xe_device *xe);
int xe_display_init_noirq(struct xe_device *xe);
int xe_display_init_noaccel(struct xe_device *xe);
int xe_display_init(struct xe_device *xe); int xe_display_init(struct xe_device *xe);
void xe_display_fini(struct xe_device *xe); void xe_display_fini(struct xe_device *xe);
@ -54,9 +52,7 @@ static inline int xe_display_create(struct xe_device *xe) { return 0; }
static inline int xe_display_probe(struct xe_device *xe) { return 0; } static inline int xe_display_probe(struct xe_device *xe) { return 0; }
static inline int xe_display_init_nommio(struct xe_device *xe) { return 0; } static inline int xe_display_init_early(struct xe_device *xe) { return 0; }
static inline int xe_display_init_noirq(struct xe_device *xe) { return 0; }
static inline int xe_display_init_noaccel(struct xe_device *xe) { return 0; }
static inline int xe_display_init(struct xe_device *xe) { return 0; } static inline int xe_display_init(struct xe_device *xe) { return 0; }
static inline void xe_display_fini(struct xe_device *xe) {} static inline void xe_display_fini(struct xe_device *xe) {}

View File

@ -752,10 +752,6 @@ int xe_device_probe(struct xe_device *xe)
return err; return err;
xe->info.mem_region_mask = 1; xe->info.mem_region_mask = 1;
err = xe_display_init_nommio(xe);
if (err)
return err;
err = xe_set_dma_info(xe); err = xe_set_dma_info(xe);
if (err) if (err)
return err; return err;
@ -810,10 +806,6 @@ int xe_device_probe(struct xe_device *xe)
if (err) if (err)
return err; return err;
err = xe_display_init_noirq(xe);
if (err)
return err;
err = probe_has_flat_ccs(xe); err = probe_has_flat_ccs(xe);
if (err) if (err)
goto err; goto err;
@ -837,7 +829,7 @@ int xe_device_probe(struct xe_device *xe)
* This is the reason the first allocation needs to be done * This is the reason the first allocation needs to be done
* inside display. * inside display.
*/ */
err = xe_display_init_noaccel(xe); err = xe_display_init_early(xe);
if (err) if (err)
goto err; goto err;