1
0
mirror of https://aur.archlinux.org/linux-vfio.git synced 2024-12-26 16:44:09 +00:00
linux-vfio/i915-vga-arbiter.patch

187 lines
7.5 KiB
Diff
Raw Normal View History

2019-10-08 22:51:27 +00:00
From 48be7e32f897277d77359e37db452281dd8b3bf8 Mon Sep 17 00:00:00 2001
From: Mark Weiman <mark.weiman@markzz.com>
2019-10-08 22:51:27 +00:00
Date: Tue, 8 Oct 2019 18:48:25 -0400
2018-12-12 16:29:25 +00:00
Subject: [PATCH] i915: Add module option to support VGA arbiter on HD devices
2019-10-08 22:51:27 +00:00
(5.3)
2016-06-13 22:43:18 +00:00
2017-07-30 02:53:43 +00:00
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.
2016-06-13 22:43:18 +00:00
---
2019-10-08 22:51:27 +00:00
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
2020-06-14 01:17:39 +00:00
index 346846609f45..18be17cb56e3 100644
2019-10-08 22:51:27 +00:00
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
2020-06-14 01:17:39 +00:00
@@ -18753,6 +18753,7 @@ static void intel_hpd_poll_fini(struct drm_i915_private *i915)
/* part #1: call before irq uninstall */
void intel_modeset_driver_remove(struct drm_i915_private *i915)
{
+ intel_vga_enable_mem(i915);
2020-06-14 01:17:39 +00:00
flush_workqueue(i915->flip_wq);
flush_workqueue(i915->modeset_wq);
2020-06-14 01:17:39 +00:00
diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
index adb1225a3480..f39229c12938 100644
--- a/drivers/gpu/drm/i915/display/intel_display.h
+++ b/drivers/gpu/drm/i915/display/intel_display.h
@@ -503,6 +503,7 @@ int vlv_get_cck_clock_hpll(struct drm_i915_private *dev_priv,
void lpt_pch_enable(const struct intel_crtc_state *crtc_state);
void lpt_disable_pch_transcoder(struct drm_i915_private *dev_priv);
void lpt_disable_iclkip(struct drm_i915_private *dev_priv);
+extern void intel_vga_disable_mem(struct drm_i915_private *dev_priv);
void intel_init_display_hooks(struct drm_i915_private *dev_priv);
unsigned int intel_fb_xy_to_linear(int x, int y,
const struct intel_plane_state *state,
diff --git a/drivers/gpu/drm/i915/display/intel_vga.c b/drivers/gpu/drm/i915/display/intel_vga.c
2020-06-14 01:17:39 +00:00
index be333699c515..a76aa52cde76 100644
--- a/drivers/gpu/drm/i915/display/intel_vga.c
+++ b/drivers/gpu/drm/i915/display/intel_vga.c
2020-06-14 01:17:39 +00:00
@@ -41,6 +41,37 @@ void intel_vga_disable(struct drm_i915_private *dev_priv)
intel_de_posting_read(dev_priv, vga_reg);
2019-10-08 22:51:27 +00:00
}
+
+void intel_vga_enable_mem(struct drm_i915_private *dev_priv)
2019-10-08 22:51:27 +00:00
+{
+ struct pci_dev *pdev = dev_priv->drm.pdev;
+
+ /* Enable VGA memory on Intel HD */
+ if (i915_modparams.enable_hd_vgaarb && HAS_PCH_SPLIT(dev_priv)) {
+ vga_get_uninterruptible(pdev, VGA_RSRC_LEGACY_IO);
+ outb(inb(VGA_MSR_READ) | VGA_MSR_MEM_EN, VGA_MSR_WRITE);
+ vga_set_legacy_decoding(pdev, VGA_RSRC_LEGACY_IO |
+ VGA_RSRC_LEGACY_MEM |
+ VGA_RSRC_NORMAL_IO |
+ VGA_RSRC_NORMAL_MEM);
+ vga_put(pdev, VGA_RSRC_LEGACY_IO);
+ }
+}
+
+void intel_vga_disable_mem(struct drm_i915_private *dev_priv)
2019-10-08 22:51:27 +00:00
+{
+ struct pci_dev *pdev = dev_priv->drm.pdev;
+ /* Disable VGA memory on Intel HD */
+ if (i915_modparams.enable_hd_vgaarb && HAS_PCH_SPLIT(dev_priv)) {
+ vga_get_uninterruptible(pdev, VGA_RSRC_LEGACY_IO);
+ outb(inb(VGA_MSR_READ) & ~VGA_MSR_MEM_EN, VGA_MSR_WRITE);
+ vga_set_legacy_decoding(pdev, VGA_RSRC_LEGACY_IO |
+ VGA_RSRC_NORMAL_IO |
+ VGA_RSRC_NORMAL_MEM);
+ vga_put(pdev, VGA_RSRC_LEGACY_IO);
+ }
+}
+
void intel_vga_redisable_power_on(struct drm_i915_private *dev_priv)
2019-10-08 22:51:27 +00:00
{
2020-06-14 01:17:39 +00:00
i915_reg_t vga_reg = intel_vga_cntrl_reg(dev_priv);
@@ -49,6 +80,7 @@ void intel_vga_redisable_power_on(struct drm_i915_private *dev_priv)
drm_dbg_kms(&dev_priv->drm,
"Something enabled VGA plane, disabling it\n");
intel_vga_disable(dev_priv);
+ intel_vga_disable_mem(dev_priv);
2019-10-08 22:51:27 +00:00
}
}
diff --git a/drivers/gpu/drm/i915/display/intel_vga.h b/drivers/gpu/drm/i915/display/intel_vga.h
2020-06-14 01:17:39 +00:00
index ba5b55b917f0..7e2af7924e99 100644
--- a/drivers/gpu/drm/i915/display/intel_vga.h
+++ b/drivers/gpu/drm/i915/display/intel_vga.h
@@ -15,4 +15,8 @@ void intel_vga_redisable_power_on(struct drm_i915_private *i915);
int intel_vga_register(struct drm_i915_private *i915);
void intel_vga_unregister(struct drm_i915_private *i915);
2019-10-08 22:51:27 +00:00
+/* i915 vga arb patch */
+void intel_vga_enable_mem(struct drm_i915_private *i915);
+void intel_vga_disable_mem(struct drm_i915_private *i915);
2019-10-08 22:51:27 +00:00
+
#endif /* __INTEL_VGA_H__ */
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
2020-06-14 01:17:39 +00:00
index 81a4621853db..e2576468f040 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
2020-06-14 01:17:39 +00:00
@@ -232,9 +232,11 @@ static int i915_driver_modeset_probe_noirq(struct drm_i915_private *i915)
intel_bios_init(i915);
- ret = intel_vga_register(i915);
- if (ret)
2016-06-13 22:43:18 +00:00
- goto out;
+ if (!i915_modparams.enable_hd_vgaarb || !HAS_PCH_SPLIT(i915)) {
+ ret = intel_vga_register(i915);
+ if (ret)
2016-06-13 22:43:18 +00:00
+ goto out;
+ }
2020-06-14 01:17:39 +00:00
intel_power_domains_init_hw(i915, false);
2016-06-13 22:43:18 +00:00
2020-06-14 01:17:39 +00:00
@@ -276,6 +278,12 @@ static int i915_driver_modeset_probe(struct drm_i915_private *i915)
2016-06-13 22:43:18 +00:00
if (ret)
goto cleanup_gem;
+ /*
+ * Must do this after fbcon init so that
+ * vgacon_save_screen() works during the handover.
+ */
+ intel_vga_disable_mem(i915);
2016-06-13 22:43:18 +00:00
+
/* Only enable hotplug handling once the fbdev is fully set up. */
intel_hpd_init(i915);
2016-06-13 22:43:18 +00:00
diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c
2020-06-14 01:17:39 +00:00
index add00ec1f787..e4f49c63a397 100644
2016-06-13 22:43:18 +00:00
--- a/drivers/gpu/drm/i915/i915_params.c
+++ b/drivers/gpu/drm/i915/i915_params.c
2020-06-14 01:17:39 +00:00
@@ -121,6 +121,9 @@ i915_param_named_unsafe(invert_brightness, int, 0600,
2018-12-12 16:29:25 +00:00
i915_param_named(disable_display, bool, 0400,
"Disable display (default: false)");
2016-06-13 22:43:18 +00:00
2018-02-08 03:41:21 +00:00
+i915_param_named(enable_hd_vgaarb, bool, 0444,
2016-06-13 22:43:18 +00:00
+ "Enable support for VGA arbitration on Intel HD IGD. (default: false)");
+
2018-02-08 03:41:21 +00:00
i915_param_named(mmio_debug, int, 0600,
"Enable the MMIO debug code for the first N failures (default: off). "
"This may negatively affect performance.");
2016-06-13 22:43:18 +00:00
diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h
2020-06-14 01:17:39 +00:00
index 45323732f099..304987c4f9e8 100644
2016-06-13 22:43:18 +00:00
--- a/drivers/gpu/drm/i915/i915_params.h
+++ b/drivers/gpu/drm/i915/i915_params.h
2020-06-14 01:17:39 +00:00
@@ -70,6 +70,7 @@ struct drm_printer;
param(char *, force_probe, CONFIG_DRM_I915_FORCE_PROBE, 0400) \
param(unsigned long, fake_lmem_start, 0, 0400) \
2018-02-08 03:41:21 +00:00
/* leave bools at the end to not create holes */ \
2020-06-14 01:17:39 +00:00
+ param(bool, enable_hd_vgaarb, false, 0600) \
param(bool, enable_hangcheck, true, 0600) \
param(bool, load_detect_test, false, 0600) \
param(bool, force_reset_modeset_test, false, 0600) \
--
2020-02-26 22:05:24 +00:00
5.5.5