diff options
Diffstat (limited to 'i915-vga-arbiter.patch')
-rw-r--r-- | i915-vga-arbiter.patch | 77 |
1 files changed, 54 insertions, 23 deletions
diff --git a/i915-vga-arbiter.patch b/i915-vga-arbiter.patch index a1050ce00cec..99cbba5b2083 100644 --- a/i915-vga-arbiter.patch +++ b/i915-vga-arbiter.patch @@ -1,8 +1,39 @@ -From c3466f73ee88a129b5955d4f2049e79688183e96 Mon Sep 17 00:00:00 2001 +From 5c6cb47c8c0fc681c215042b71d7e21814f7f5f5 Mon Sep 17 00:00:00 2001 From: Mark Weiman <mark.weiman@markzz.com> -Date: Thu, 22 Jun 2017 21:27:07 -0400 +Date: Sat, 29 Jul 2017 11:53:40 -0400 Subject: [PATCH] i915: Add module option to support VGA arbiter on HD devices + (4.12+) +This is an updated version of Alex Williamson's patch from: +https://lkml.org/lkml/2014/5/9/517 +I don't have i915 graphics, so this is completely untested. + +Original commit message follows: +--- +Commit 81b5c7bc found that the current VGA arbiter support in i915 +only works for ancient GMCH-based IGD devices and attempted to update +support for newer HD devices. Unfortunately newer devices cannot +completely opt-out of VGA arbitration like the old devices could. +The VGA I/O space cannot be disabled internally. The only way to +route VGA I/O elsewhere is by disabling I/O at the device PCI command +register. This means that with commit 81b5c7bc and multiple VGA +adapters, the VGA arbiter will report that multiple VGA devices are +participating in arbitration, Xorg will notice this and disable DRI. +Therefore, 81b5c7bc was reverted because DRI is more important than +being correct. + +There is however an actual need for i915 to correctly participate in +VGA arbitration; VGA device assignment. If we want to use VFIO to +assign a VGA device to a virtual machine, we need to be able to +access the VGA resources of that device. By adding an i915 module +option we can allow i915 to continue with its charade by default, but +also allow an easy path for users who require working VGA arbitration. +Hopefully Xorg can someday be taught to behave better with multiple +VGA devices. + +This also rolls in reverted commit 6e1b4fda, which corrected an +ordering issue with 81b5c7bc by delaying the disabling of VGA memory +until after vgacon->fbcon handoff. --- drivers/gpu/drm/i915/i915_drv.c | 22 +++++++++++++++++++--- drivers/gpu/drm/i915/i915_params.c | 5 +++++ @@ -12,10 +43,10 @@ Subject: [PATCH] i915: Add module option to support VGA arbiter on HD devices 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c -index edacd31ae1a1..c45b8c6e5883 100644 +index 6ac8d37e7ab8..7d77b2b9f8c3 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c -@@ -573,10 +573,20 @@ static int i915_load_modeset_init(struct drm_device *dev) +@@ -576,10 +576,20 @@ static int i915_load_modeset_init(struct drm_device *dev) * If we are a secondary display controller (!PCI_DISPLAY_CLASS_VGA), * then we do not take part in VGA arbitration and the * vga_client_register() fails with -ENODEV. @@ -39,7 +70,7 @@ index edacd31ae1a1..c45b8c6e5883 100644 intel_register_dsm_handler(); -@@ -619,6 +629,12 @@ static int i915_load_modeset_init(struct drm_device *dev) +@@ -621,6 +631,12 @@ static int i915_load_modeset_init(struct drm_device *dev) if (ret) goto cleanup_gem; @@ -53,7 +84,7 @@ index edacd31ae1a1..c45b8c6e5883 100644 intel_hpd_init(dev_priv); diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c -index 0e280fbd52f1..f47675d24bf8 100644 +index b6a7e363d076..5883c1f98e2d 100644 --- a/drivers/gpu/drm/i915/i915_params.c +++ b/drivers/gpu/drm/i915/i915_params.c @@ -51,6 +51,7 @@ struct i915_params i915 __read_mostly = { @@ -64,7 +95,7 @@ index 0e280fbd52f1..f47675d24bf8 100644 .use_mmio_flip = 0, .mmio_debug = 0, .verbose_state_checks = 1, -@@ -192,6 +193,10 @@ module_param_named_unsafe(enable_cmd_parser, i915.enable_cmd_parser, bool, 0400) +@@ -194,6 +195,10 @@ module_param_named_unsafe(enable_cmd_parser, i915.enable_cmd_parser, bool, 0400) MODULE_PARM_DESC(enable_cmd_parser, "Enable command parsing (true=enabled [default], false=disabled)"); @@ -76,22 +107,22 @@ index 0e280fbd52f1..f47675d24bf8 100644 MODULE_PARM_DESC(use_mmio_flip, "use MMIO flips (-1=never, 0=driver discretion [default], 1=always)"); diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h -index 8e433de04679..e3c294cdfebf 100644 +index 34148cc8637c..edc38206d360 100644 --- a/drivers/gpu/drm/i915/i915_params.h +++ b/drivers/gpu/drm/i915/i915_params.h -@@ -61,6 +61,7 @@ struct i915_params { - bool reset; - bool error_capture; - bool disable_display; -+ bool enable_hd_vgaarb; - bool verbose_state_checks; - bool nuclear_pageflip; - bool enable_dp_mst; +@@ -63,6 +63,7 @@ + func(bool, reset); \ + func(bool, error_capture); \ + func(bool, disable_display); \ ++ func(bool, enable_hd_vgaarb); \ + func(bool, verbose_state_checks); \ + func(bool, nuclear_pageflip); \ + func(bool, enable_dp_mst); \ diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c -index 5370dbec7a7d..f25eb8eea591 100644 +index 9106ea32b048..6e9ef6a760dc 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c -@@ -16525,6 +16525,37 @@ static void i915_disable_vga(struct drm_i915_private *dev_priv) +@@ -14839,6 +14839,37 @@ static void i915_disable_vga(struct drm_i915_private *dev_priv) POSTING_READ(vga_reg); } @@ -129,7 +160,7 @@ index 5370dbec7a7d..f25eb8eea591 100644 void intel_modeset_init_hw(struct drm_device *dev) { struct drm_i915_private *dev_priv = to_i915(dev); -@@ -16967,6 +16998,7 @@ void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv) +@@ -15291,6 +15322,7 @@ void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv) if (!(I915_READ(vga_reg) & VGA_DISP_DISABLE)) { DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n"); i915_disable_vga(dev_priv); @@ -137,7 +168,7 @@ index 5370dbec7a7d..f25eb8eea591 100644 } } -@@ -17296,6 +17328,8 @@ void intel_modeset_cleanup(struct drm_device *dev) +@@ -15648,6 +15680,8 @@ void intel_modeset_cleanup(struct drm_device *dev) { struct drm_i915_private *dev_priv = to_i915(dev); @@ -147,10 +178,10 @@ index 5370dbec7a7d..f25eb8eea591 100644 WARN_ON(!llist_empty(&dev_priv->atomic_helper.free_list)); diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h -index 344f238b283f..f70cab001517 100644 +index f630c7af5020..60b2b2036d3e 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h -@@ -1240,6 +1240,7 @@ int vlv_get_cck_clock(struct drm_i915_private *dev_priv, +@@ -1290,6 +1290,7 @@ int vlv_get_cck_clock_hpll(struct drm_i915_private *dev_priv, void lpt_disable_pch_transcoder(struct drm_i915_private *dev_priv); void lpt_disable_iclkip(struct drm_i915_private *dev_priv); extern const struct drm_plane_funcs intel_plane_funcs; @@ -159,5 +190,5 @@ index 344f238b283f..f70cab001517 100644 unsigned int intel_fb_xy_to_linear(int x, int y, const struct intel_plane_state *state, -- -2.13.1 +2.13.3 |