Advertisement
Guest User

i915patch

a guest
May 27th, 2014
534
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.36 KB | None | 0 0
  1. Signed-off-by: Alex Williamson <[email protected]>
  2. Cc: Ville Syrjälä <[email protected]>
  3. Cc: Daniel Vetter <[email protected]>
  4. Cc: Dave Airlie <[email protected]>
  5. ---
  6. This should be a nop with the default module setting, so if there's
  7. any opportunity to get this into v3.15, it would be appreciated.
  8.  
  9. drivers/gpu/drm/i915/i915_dma.c | 22 +++++++++++++++++++---
  10. drivers/gpu/drm/i915/i915_drv.h | 1 +
  11. drivers/gpu/drm/i915/i915_params.c | 5 +++++
  12. drivers/gpu/drm/i915/intel_display.c | 30 ++++++++++++++++++++++++++++++
  13. drivers/gpu/drm/i915/intel_drv.h | 2 ++
  14. include/linux/vgaarb.h | 7 +++++++
  15. 6 files changed, 64 insertions(+), 3 deletions(-)
  16. diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
  17. index 96177ee..c0d0c03 100644
  18. --- a/drivers/gpu/drm/i915/i915_dma.c
  19. +++ b/drivers/gpu/drm/i915/i915_dma.c
  20. @@ -1306,10 +1306,20 @@ static int i915_load_modeset_init(struct drm_device *dev)
  21. * If we are a secondary display controller (!PCI_DISPLAY_CLASS_VGA),
  22. * then we do not take part in VGA arbitration and the
  23. * vga_client_register() fails with -ENODEV.
  24. + *
  25. + * NB. The set_decode callback here actually only works on GMCH
  26. + * devices, on newer HD devices we can only disable VGA MMIO space.
  27. + * Disabling VGA I/O space requires disabling I/O in the PCI command
  28. + * register. Nonetheless, we like to pretend that we participate in
  29. + * VGA arbitration and can dynamically disable VGA I/O space because
  30. + * this makes X happy, even though it's a complete lie.
  31. */
  32. - ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode);
  33. - if (ret && ret != -ENODEV)
  34. - goto out;
  35. + if (!i915.enable_hd_vgaarb || !HAS_PCH_SPLIT(dev)) {
  36. + ret = vga_client_register(dev->pdev, dev, NULL,
  37. + i915_vga_set_decode);
  38. + if (ret && ret != -ENODEV)
  39. + goto out;
  40. + }
  41.  
  42. intel_register_dsm_handler();
  43.  
  44. @@ -1369,6 +1379,12 @@ static int i915_load_modeset_init(struct drm_device *dev)
  45. */
  46. intel_fbdev_initial_config(dev);
  47.  
  48. + /*
  49. + * Must do this after fbcon init so that
  50. + * vgacon_save_screen() works during the handover.
  51. + */
  52. + i915_disable_vga_mem(dev);
  53. +
  54. /* Only enable hotplug handling once the fbdev is fully set up. */
  55. dev_priv->enable_hotplug_processing = true;
  56.  
  57. diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
  58. index ec82f6b..f3908f6 100644
  59. --- a/drivers/gpu/drm/i915/i915_drv.h
  60. +++ b/drivers/gpu/drm/i915/i915_drv.h
  61. @@ -2080,6 +2080,7 @@ struct i915_params {
  62. bool prefault_disable;
  63. bool reset;
  64. bool disable_display;
  65. + bool enable_hd_vgaarb;
  66. };
  67. extern struct i915_params i915 __read_mostly;
  68.  
  69. diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c
  70. index d1d7980..64d96c6 100644
  71. --- a/drivers/gpu/drm/i915/i915_params.c
  72. +++ b/drivers/gpu/drm/i915/i915_params.c
  73. @@ -47,6 +47,7 @@ struct i915_params i915 __read_mostly = {
  74. .invert_brightness = 0,
  75. .disable_display = 0,
  76. .enable_cmd_parser = 0,
  77. + .enable_hd_vgaarb = false,
  78. };
  79.  
  80. module_param_named(modeset, i915.modeset, int, 0400);
  81. @@ -152,3 +153,7 @@ MODULE_PARM_DESC(disable_display, "Disable display (default: false)");
  82. module_param_named(enable_cmd_parser, i915.enable_cmd_parser, int, 0600);
  83. MODULE_PARM_DESC(enable_cmd_parser,
  84. "Enable command parsing (1=enabled, 0=disabled [default])");
  85. +
  86. +module_param_named(enable_hd_vgaarb, i915.enable_hd_vgaarb, bool, 0444);
  87. +MODULE_PARM_DESC(enable_hd_vgaarb,
  88. + "Enable support for VGA arbitration on Intel HD IGD. (default: false)");
  89. diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
  90. index 69bcc42..2cd35ba 100644
  91. --- a/drivers/gpu/drm/i915/intel_display.c
  92. +++ b/drivers/gpu/drm/i915/intel_display.c
  93. @@ -11284,6 +11284,33 @@ static void i915_disable_vga(struct drm_device *dev)
  94. POSTING_READ(vga_reg);
  95. }
  96.  
  97. +static void i915_enable_vga_mem(struct drm_device *dev)
  98. +{
  99. + /* Enable VGA memory on Intel HD */
  100. + if (i915.enable_hd_vgaarb && HAS_PCH_SPLIT(dev)) {
  101. + vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO);
  102. + outb(inb(VGA_MSR_READ) | VGA_MSR_MEM_EN, VGA_MSR_WRITE);
  103. + vga_set_legacy_decoding(dev->pdev, VGA_RSRC_LEGACY_IO |
  104. + VGA_RSRC_LEGACY_MEM |
  105. + VGA_RSRC_NORMAL_IO |
  106. + VGA_RSRC_NORMAL_MEM);
  107. + vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
  108. + }
  109. +}
  110. +
  111. +void i915_disable_vga_mem(struct drm_device *dev)
  112. +{
  113. + /* Disable VGA memory on Intel HD */
  114. + if (i915.enable_hd_vgaarb && HAS_PCH_SPLIT(dev)) {
  115. + vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO);
  116. + outb(inb(VGA_MSR_READ) & ~VGA_MSR_MEM_EN, VGA_MSR_WRITE);
  117. + vga_set_legacy_decoding(dev->pdev, VGA_RSRC_LEGACY_IO |
  118. + VGA_RSRC_NORMAL_IO |
  119. + VGA_RSRC_NORMAL_MEM);
  120. + vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
  121. + }
  122. +}
  123. +
  124. void intel_modeset_init_hw(struct drm_device *dev)
  125. {
  126. intel_prepare_ddi(dev);
  127. @@ -11594,6 +11621,7 @@ void i915_redisable_vga_power_on(struct drm_device *dev)
  128. if (!(I915_READ(vga_reg) & VGA_DISP_DISABLE)) {
  129. DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n");
  130. i915_disable_vga(dev);
  131. + i915_disable_vga_mem(dev);
  132. }
  133. }
  134.  
  135. @@ -11848,6 +11876,8 @@ void intel_modeset_cleanup(struct drm_device *dev)
  136.  
  137. intel_disable_fbc(dev);
  138.  
  139. + i915_enable_vga_mem(dev);
  140. +
  141. intel_disable_gt_powersave(dev);
  142.  
  143. ironlake_teardown_rc6(dev);
  144. diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
  145. index 328b1a7..fbe5d360 100644
  146. --- a/drivers/gpu/drm/i915/intel_drv.h
  147. +++ b/drivers/gpu/drm/i915/intel_drv.h
  148. @@ -934,4 +934,6 @@ int intel_sprite_get_colorkey(struct drm_device *dev, void *data,
  149. /* intel_tv.c */
  150. void intel_tv_init(struct drm_device *dev);
  151.  
  152. +extern void i915_disable_vga_mem(struct drm_device *dev);
  153. +
  154. #endif /* __INTEL_DRV_H__ */
  155. diff --git a/include/linux/vgaarb.h b/include/linux/vgaarb.h
  156. index 2c02f3a..80cf817 100644
  157. --- a/include/linux/vgaarb.h
  158. +++ b/include/linux/vgaarb.h
  159. @@ -65,8 +65,15 @@ struct pci_dev;
  160. * out of the arbitration process (and can be safe to take
  161. * interrupts at any time.
  162. */
  163. +#if defined(CONFIG_VGA_ARB)
  164. extern void vga_set_legacy_decoding(struct pci_dev *pdev,
  165. unsigned int decodes);
  166. +#else
  167. +static inline void vga_set_legacy_decoding(struct pci_dev *pdev,
  168. + unsigned int decodes)
  169. +{
  170. +}
  171. +#endif
  172.  
  173. /**
  174. * vga_get - acquire & locks VGA resources
  175. --
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement