mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-09-04 06:37:59 +00:00
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:
parent
f595fe5f6a
commit
65e366ace5
@ -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)
|
||||
|
@ -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) {}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user