- qxl: Remove the conflicting framebuffers earlier
- Split out some i915 code into the fb_helper to allow the above -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQRcEzekXsqa64kGDp7j7w1vZxhRxQUCXIlYNQAKCRDj7w1vZxhR xdsRAP0TnlDCQHcAY8U41jrWgSg2rNYNn/aT+PEXo7uoEy0AzwEAtv9tzk2309xn wNT0c8wJU7l190VD8ZuikwT/19Y+pgw= =3SKX -----END PGP SIGNATURE----- Merge tag 'drm-misc-next-fixes-2019-03-13' of git://anongit.freedesktop.org/drm/drm-misc into drm-next - qxl: Remove the conflicting framebuffers earlier - Split out some i915 code into the fb_helper to allow the above Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maxime Ripard <maxime.ripard@bootlin.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190313192158.k3qssf733khsqodn@flea
This commit is contained in:
commit
74cd45fa90
|
@ -757,39 +757,6 @@ static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(CONFIG_VGA_CONSOLE)
|
|
||||||
static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#elif !defined(CONFIG_DUMMY_CONSOLE)
|
|
||||||
static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
|
|
||||||
{
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
DRM_INFO("Replacing VGA console driver\n");
|
|
||||||
|
|
||||||
console_lock();
|
|
||||||
if (con_is_bound(&vga_con))
|
|
||||||
ret = do_take_over_console(&dummy_con, 0, MAX_NR_CONSOLES - 1, 1);
|
|
||||||
if (ret == 0) {
|
|
||||||
ret = do_unregister_con_driver(&vga_con);
|
|
||||||
|
|
||||||
/* Ignore "already unregistered". */
|
|
||||||
if (ret == -ENODEV)
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
console_unlock();
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void intel_init_dpio(struct drm_i915_private *dev_priv)
|
static void intel_init_dpio(struct drm_i915_private *dev_priv)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -1420,7 +1387,7 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
|
||||||
goto err_ggtt;
|
goto err_ggtt;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = i915_kick_out_vgacon(dev_priv);
|
ret = vga_remove_vgacon(pdev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
DRM_ERROR("failed to remove conflicting VGA console\n");
|
DRM_ERROR("failed to remove conflicting VGA console\n");
|
||||||
goto err_ggtt;
|
goto err_ggtt;
|
||||||
|
|
|
@ -79,6 +79,10 @@ qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto free_dev;
|
goto free_dev;
|
||||||
|
|
||||||
|
ret = drm_fb_helper_remove_conflicting_pci_framebuffers(pdev, 0, "qxl");
|
||||||
|
if (ret)
|
||||||
|
goto disable_pci;
|
||||||
|
|
||||||
ret = qxl_device_init(qdev, &qxl_driver, pdev);
|
ret = qxl_device_init(qdev, &qxl_driver, pdev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto disable_pci;
|
goto disable_pci;
|
||||||
|
@ -94,7 +98,6 @@ qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto modeset_cleanup;
|
goto modeset_cleanup;
|
||||||
|
|
||||||
drm_fb_helper_remove_conflicting_pci_framebuffers(pdev, 0, "qxl");
|
|
||||||
drm_fbdev_generic_setup(&qdev->ddev, 32);
|
drm_fbdev_generic_setup(&qdev->ddev, 32);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,8 @@
|
||||||
#include <linux/miscdevice.h>
|
#include <linux/miscdevice.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/screen_info.h>
|
#include <linux/screen_info.h>
|
||||||
|
#include <linux/vt.h>
|
||||||
|
#include <linux/console.h>
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
|
@ -168,6 +170,53 @@ void vga_set_default_device(struct pci_dev *pdev)
|
||||||
vga_default = pci_dev_get(pdev);
|
vga_default = pci_dev_get(pdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* vga_remove_vgacon - deactivete vga console
|
||||||
|
*
|
||||||
|
* Unbind and unregister vgacon in case pdev is the default vga
|
||||||
|
* device. Can be called by gpu drivers on initialization to make
|
||||||
|
* sure vga register access done by vgacon will not disturb the
|
||||||
|
* device.
|
||||||
|
*
|
||||||
|
* @pdev: pci device.
|
||||||
|
*/
|
||||||
|
#if !defined(CONFIG_VGA_CONSOLE)
|
||||||
|
int vga_remove_vgacon(struct pci_dev *pdev)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#elif !defined(CONFIG_DUMMY_CONSOLE)
|
||||||
|
int vga_remove_vgacon(struct pci_dev *pdev)
|
||||||
|
{
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
int vga_remove_vgacon(struct pci_dev *pdev)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (pdev != vga_default)
|
||||||
|
return 0;
|
||||||
|
vgaarb_info(&pdev->dev, "deactivate vga console\n");
|
||||||
|
|
||||||
|
console_lock();
|
||||||
|
if (con_is_bound(&vga_con))
|
||||||
|
ret = do_take_over_console(&dummy_con, 0,
|
||||||
|
MAX_NR_CONSOLES - 1, 1);
|
||||||
|
if (ret == 0) {
|
||||||
|
ret = do_unregister_con_driver(&vga_con);
|
||||||
|
|
||||||
|
/* Ignore "already unregistered". */
|
||||||
|
if (ret == -ENODEV)
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
console_unlock();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
EXPORT_SYMBOL(vga_remove_vgacon);
|
||||||
|
|
||||||
static inline void vga_irq_set_state(struct vga_device *vgadev, bool state)
|
static inline void vga_irq_set_state(struct vga_device *vgadev, bool state)
|
||||||
{
|
{
|
||||||
if (vgadev->irq_set_state)
|
if (vgadev->irq_set_state)
|
||||||
|
|
|
@ -36,6 +36,7 @@ struct drm_fb_helper;
|
||||||
#include <drm/drm_crtc.h>
|
#include <drm/drm_crtc.h>
|
||||||
#include <drm/drm_device.h>
|
#include <drm/drm_device.h>
|
||||||
#include <linux/kgdb.h>
|
#include <linux/kgdb.h>
|
||||||
|
#include <linux/vgaarb.h>
|
||||||
|
|
||||||
enum mode_set_atomic {
|
enum mode_set_atomic {
|
||||||
LEAVE_ATOMIC_MODE_SET,
|
LEAVE_ATOMIC_MODE_SET,
|
||||||
|
@ -642,11 +643,18 @@ drm_fb_helper_remove_conflicting_pci_framebuffers(struct pci_dev *pdev,
|
||||||
int resource_id,
|
int resource_id,
|
||||||
const char *name)
|
const char *name)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WARNING: Apparently we must kick fbdev drivers before vgacon,
|
||||||
|
* otherwise the vga fbdev driver falls over.
|
||||||
|
*/
|
||||||
#if IS_REACHABLE(CONFIG_FB)
|
#if IS_REACHABLE(CONFIG_FB)
|
||||||
return remove_conflicting_pci_framebuffers(pdev, resource_id, name);
|
ret = remove_conflicting_pci_framebuffers(pdev, resource_id, name);
|
||||||
#else
|
|
||||||
return 0;
|
|
||||||
#endif
|
#endif
|
||||||
|
if (ret == 0)
|
||||||
|
ret = vga_remove_vgacon(pdev);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -125,9 +125,11 @@ extern void vga_put(struct pci_dev *pdev, unsigned int rsrc);
|
||||||
#ifdef CONFIG_VGA_ARB
|
#ifdef CONFIG_VGA_ARB
|
||||||
extern struct pci_dev *vga_default_device(void);
|
extern struct pci_dev *vga_default_device(void);
|
||||||
extern void vga_set_default_device(struct pci_dev *pdev);
|
extern void vga_set_default_device(struct pci_dev *pdev);
|
||||||
|
extern int vga_remove_vgacon(struct pci_dev *pdev);
|
||||||
#else
|
#else
|
||||||
static inline struct pci_dev *vga_default_device(void) { return NULL; };
|
static inline struct pci_dev *vga_default_device(void) { return NULL; };
|
||||||
static inline void vga_set_default_device(struct pci_dev *pdev) { };
|
static inline void vga_set_default_device(struct pci_dev *pdev) { };
|
||||||
|
static inline int vga_remove_vgacon(struct pci_dev *pdev) { return 0; };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue