From ed1d33f16fdee0ab9b4e21cd8b93fcf6008cb0c6 Mon Sep 17 00:00:00 2001 From: xiota <> Date: Thu, 30 Apr 2026 00:46:34 +0000 Subject: [PATCH] i915-vga-arbiter --- .../drm/i915/display/intel_display_driver.c | 24 ++++++++++-- .../drm/i915/display/intel_display_driver.h | 4 ++ .../drm/i915/display/intel_display_params.c | 3 ++ .../drm/i915/display/intel_display_params.h | 1 + drivers/gpu/drm/i915/display/intel_vga.c | 39 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_vga.h | 6 +++ drivers/gpu/drm/xe/Makefile | 1 + i | 0 8 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 i diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c index 268b1de45..98e1de0ff 100644 --- a/drivers/gpu/drm/i915/display/intel_display_driver.c +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c @@ -33,6 +33,7 @@ #include "intel_display_debugfs.h" #include "intel_display_driver.h" #include "intel_display_irq.h" +#include "intel_display_params.h" #include "intel_display_power.h" #include "intel_display_types.h" #include "intel_display_utils.h" @@ -208,9 +209,11 @@ int intel_display_driver_probe_noirq(struct intel_display *display) intel_bios_init(display); - ret = intel_vga_register(display); - if (ret) - goto cleanup_bios; + if (!display->params.enable_hd_vgaarb || !HAS_PCH_SPLIT(display)) { + ret = intel_vga_register(display); + if (ret) + goto cleanup_bios; + } intel_psr_dc5_dc6_wa_init(display); @@ -538,6 +541,14 @@ int intel_display_driver_probe(struct intel_display *display) intel_overlay_setup(display); +#ifndef VGA_ARBITER_BUILD_XE + /* + * Must do this after fbcon init so that + * vgacon_save_screen() works during the handover. + */ + intel_vga_disable_mem(display); +#endif /* VGA_ARBITER_BUILD_XE */ + /* Only enable hotplug handling once the fbdev is fully set up. */ intel_hpd_init(display); @@ -588,6 +599,10 @@ void intel_display_driver_remove(struct intel_display *display) if (!HAS_DISPLAY(display)) return; +#ifndef VGA_ARBITER_BUILD_XE + intel_vga_enable_mem(display); +#endif /* VGA_ARBITER_BUILD_XE */ + flush_workqueue(display->wq.flip); flush_workqueue(display->wq.modeset); flush_workqueue(display->wq.cleanup); @@ -618,6 +633,9 @@ void intel_display_driver_remove_noirq(struct intel_display *display) intel_unregister_dsm_handler(); /* flush any delayed tasks or pending work */ +#ifndef VGA_ARBITER_BUILD_XE + intel_vga_enable_mem(display); +#endif /* VGA_ARBITER_BUILD_XE */ flush_workqueue(display->wq.unordered); intel_hdcp_component_fini(display); diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h index 2966ff91b..939124c3b 100644 --- a/drivers/gpu/drm/i915/display/intel_display_driver.h +++ b/drivers/gpu/drm/i915/display/intel_display_driver.h @@ -13,6 +13,10 @@ struct drm_modeset_acquire_ctx; struct intel_display; struct pci_dev; +#ifndef VGA_ARBITER_BUILD_XE +extern void intel_vga_disable_mem(struct intel_display *display); +#endif /* VGA_ARBITER_BUILD_XE */ + bool intel_display_driver_probe_defer(struct pci_dev *pdev); void intel_display_driver_init_hw(struct intel_display *display); void intel_display_driver_early_probe(struct intel_display *display); diff --git a/drivers/gpu/drm/i915/display/intel_display_params.c b/drivers/gpu/drm/i915/display/intel_display_params.c index 2aed110c5..db4fbf207 100644 --- a/drivers/gpu/drm/i915/display/intel_display_params.c +++ b/drivers/gpu/drm/i915/display/intel_display_params.c @@ -102,6 +102,9 @@ intel_display_param_named_unsafe(force_reset_modeset_test, bool, 0400, intel_display_param_named(disable_display, bool, 0400, "Disable display (default: false)"); +intel_display_param_named(enable_hd_vgaarb, bool, 0400, + "Enable support for VGA arbitration on Intel HD IGD. (default: false)"); + intel_display_param_named(verbose_state_checks, bool, 0400, "Enable verbose logs (ie. WARN_ON()) in case of unexpected hw state conditions."); diff --git a/drivers/gpu/drm/i915/display/intel_display_params.h b/drivers/gpu/drm/i915/display/intel_display_params.h index b95ecf728..6e01bf1b0 100644 --- a/drivers/gpu/drm/i915/display/intel_display_params.h +++ b/drivers/gpu/drm/i915/display/intel_display_params.h @@ -41,6 +41,7 @@ struct drm_printer; param(bool, load_detect_test, false, 0600) \ param(bool, force_reset_modeset_test, false, 0600) \ param(bool, disable_display, false, 0400) \ + param(bool, enable_hd_vgaarb, false, 0400) \ param(bool, verbose_state_checks, true, 0400) \ param(bool, nuclear_pageflip, false, 0400) \ param(bool, enable_dp_mst, true, 0600) \ diff --git a/drivers/gpu/drm/i915/display/intel_vga.c b/drivers/gpu/drm/i915/display/intel_vga.c index c45c4bbc3..1fef50f2e 100644 --- a/drivers/gpu/drm/i915/display/intel_vga.c +++ b/drivers/gpu/drm/i915/display/intel_vga.c @@ -12,8 +12,16 @@ #include #include