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);
}
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;
if (!xe->info.probe_display)
return;
intel_display_driver_remove_nogem(display);
intel_display_driver_remove_noirq(display);
intel_opregion_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)
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_* */
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);
/* Early display init.. */
@ -162,38 +145,20 @@ int xe_display_init_noirq(struct xe_device *xe)
intel_display_device_info_runtime_init(display);
err = intel_display_driver_probe_noirq(display);
if (err) {
intel_opregion_cleanup(display);
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;
if (err)
goto err_opregion;
err = intel_display_driver_probe_nogem(display);
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)

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_init_nommio(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_early(struct xe_device *xe);
int xe_display_init(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_init_nommio(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_early(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) {}

View File

@ -752,10 +752,6 @@ int xe_device_probe(struct xe_device *xe)
return err;
xe->info.mem_region_mask = 1;
err = xe_display_init_nommio(xe);
if (err)
return err;
err = xe_set_dma_info(xe);
if (err)
return err;
@ -810,10 +806,6 @@ int xe_device_probe(struct xe_device *xe)
if (err)
return err;
err = xe_display_init_noirq(xe);
if (err)
return err;
err = probe_has_flat_ccs(xe);
if (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
* inside display.
*/
err = xe_display_init_noaccel(xe);
err = xe_display_init_early(xe);
if (err)
goto err;