summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2019-03-01 04:24:59 -0500
committerGerd Hoffmann <kraxel@redhat.com>2019-03-07 04:34:37 -0500
commitc6b38fbbde91ee7b072febe4b83022e4850f934f (patch)
tree3eb87bf904cdec191cb609f02b6f833a20d181db
parente552f0851070fe4975d610a99910be4e9bf5d7bd (diff)
drm: move i915_kick_out_vgacon to vgaarb
Also rename it to vga_remove_vgacon and add kerneldoc text. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/20190301092502.30948-2-kraxel@redhat.com
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c35
-rw-r--r--drivers/gpu/vga/vgaarb.c49
-rw-r--r--include/linux/vgaarb.h2
3 files changed, 52 insertions, 34 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 6630212f2faf..9df65d386d11 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -757,39 +757,6 @@ static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
757 return ret; 757 return ret;
758} 758}
759 759
760#if !defined(CONFIG_VGA_CONSOLE)
761static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
762{
763 return 0;
764}
765#elif !defined(CONFIG_DUMMY_CONSOLE)
766static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
767{
768 return -ENODEV;
769}
770#else
771static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
772{
773 int ret = 0;
774
775 DRM_INFO("Replacing VGA console driver\n");
776
777 console_lock();
778 if (con_is_bound(&vga_con))
779 ret = do_take_over_console(&dummy_con, 0, MAX_NR_CONSOLES - 1, 1);
780 if (ret == 0) {
781 ret = do_unregister_con_driver(&vga_con);
782
783 /* Ignore "already unregistered". */
784 if (ret == -ENODEV)
785 ret = 0;
786 }
787 console_unlock();
788
789 return ret;
790}
791#endif
792
793static void intel_init_dpio(struct drm_i915_private *dev_priv) 760static void intel_init_dpio(struct drm_i915_private *dev_priv)
794{ 761{
795 /* 762 /*
@@ -1420,7 +1387,7 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
1420 goto err_ggtt; 1387 goto err_ggtt;
1421 } 1388 }
1422 1389
1423 ret = i915_kick_out_vgacon(dev_priv); 1390 ret = vga_remove_vgacon(pdev);
1424 if (ret) { 1391 if (ret) {
1425 DRM_ERROR("failed to remove conflicting VGA console\n"); 1392 DRM_ERROR("failed to remove conflicting VGA console\n");
1426 goto err_ggtt; 1393 goto err_ggtt;
diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index dc8e039bfab5..f2f3ef8af271 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -48,6 +48,8 @@
48#include <linux/miscdevice.h> 48#include <linux/miscdevice.h>
49#include <linux/slab.h> 49#include <linux/slab.h>
50#include <linux/screen_info.h> 50#include <linux/screen_info.h>
51#include <linux/vt.h>
52#include <linux/console.h>
51 53
52#include <linux/uaccess.h> 54#include <linux/uaccess.h>
53 55
@@ -168,6 +170,53 @@ void vga_set_default_device(struct pci_dev *pdev)
168 vga_default = pci_dev_get(pdev); 170 vga_default = pci_dev_get(pdev);
169} 171}
170 172
173/**
174 * vga_remove_vgacon - deactivete vga console
175 *
176 * Unbind and unregister vgacon in case pdev is the default vga
177 * device. Can be called by gpu drivers on initialization to make
178 * sure vga register access done by vgacon will not disturb the
179 * device.
180 *
181 * @pdev: pci device.
182 */
183#if !defined(CONFIG_VGA_CONSOLE)
184int vga_remove_vgacon(struct pci_dev *pdev)
185{
186 return 0;
187}
188#elif !defined(CONFIG_DUMMY_CONSOLE)
189int vga_remove_vgacon(struct pci_dev *pdev)
190{
191 return -ENODEV;
192}
193#else
194int vga_remove_vgacon(struct pci_dev *pdev)
195{
196 int ret = 0;
197
198 if (pdev != vga_default)
199 return 0;
200 vgaarb_info(&pdev->dev, "deactivate vga console\n");
201
202 console_lock();
203 if (con_is_bound(&vga_con))
204 ret = do_take_over_console(&dummy_con, 0,
205 MAX_NR_CONSOLES - 1, 1);
206 if (ret == 0) {
207 ret = do_unregister_con_driver(&vga_con);
208
209 /* Ignore "already unregistered". */
210 if (ret == -ENODEV)
211 ret = 0;
212 }
213 console_unlock();
214
215 return ret;
216}
217#endif
218EXPORT_SYMBOL(vga_remove_vgacon);
219
171static inline void vga_irq_set_state(struct vga_device *vgadev, bool state) 220static inline void vga_irq_set_state(struct vga_device *vgadev, bool state)
172{ 221{
173 if (vgadev->irq_set_state) 222 if (vgadev->irq_set_state)
diff --git a/include/linux/vgaarb.h b/include/linux/vgaarb.h
index ee162e3e879b..553b34c8b5f7 100644
--- a/include/linux/vgaarb.h
+++ b/include/linux/vgaarb.h
@@ -125,9 +125,11 @@ extern void vga_put(struct pci_dev *pdev, unsigned int rsrc);
125#ifdef CONFIG_VGA_ARB 125#ifdef CONFIG_VGA_ARB
126extern struct pci_dev *vga_default_device(void); 126extern struct pci_dev *vga_default_device(void);
127extern void vga_set_default_device(struct pci_dev *pdev); 127extern void vga_set_default_device(struct pci_dev *pdev);
128extern int vga_remove_vgacon(struct pci_dev *pdev);
128#else 129#else
129static inline struct pci_dev *vga_default_device(void) { return NULL; }; 130static inline struct pci_dev *vga_default_device(void) { return NULL; };
130static inline void vga_set_default_device(struct pci_dev *pdev) { }; 131static inline void vga_set_default_device(struct pci_dev *pdev) { };
132static inline int vga_remove_vgacon(struct pci_dev *pdev) { return 0; };
131#endif 133#endif
132 134
133/* 135/*