aboutsummarylogtreecommitdiffstats
path: root/i915-vga-arbiter.patch
diff options
context:
space:
mode:
Diffstat (limited to 'i915-vga-arbiter.patch')
-rw-r--r--i915-vga-arbiter.patch77
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