[Intel-gfx] [PATCH] RFC hax: drm/i915: Kick out vga console

Paulo Zanoni przanoni at gmail.com
Mon Dec 16 21:07:14 CET 2013


2013/12/16 Daniel Vetter <daniel at ffwll.ch>:
> On Mon, Dec 16, 2013 at 05:19:25PM +0000, Chris Wilson wrote:
>> Touching the VGA resources on an IVB EFI machine causes hard hangs when
>> we then kick out the efifb. Ouch.

Please take a look at arch/x86/kernel/setup.c, at the end of function
setup_arch:

#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
        if (!efi_enabled(EFI_BOOT) || (efi_mem_type(0xa0000) !=
EFI_CONVENTIONAL_MEMORY))
                conswitchp = &vga_con;
#elif defined(CONFIG_DUMMY_CONSOLE)
        conswitchp = &dummy_con;
#endif
#endif

Shouldn't this code already be doing what you want on IVB? Perhaps we
could improve it to do what you want?

>>
>> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
>
> Like I've said on irc I think we want a select DUMMY_CONSOLE here, at
> least if none of the core developers objects. And we also need this (or
> something similar) to make Paulo happy, this should fix unclaimed register
> disasters due to vgacon accessing the dead vga ranges when unloading our
> driver on hsw while pc8/D3 is in effect.
>
> Paulo, can you please give this a spin - you need to make sure that
> CONFIG_DUMMY_CONSOLE is set though, so that needs some magic.

I teste the patch, it does the required magic to solve the remaining problem :)


> -Daniel
>
>> ---
>>  drivers/gpu/drm/i915/i915_dma.c  | 29 +++++++++++++++++++++++++++++
>>  drivers/video/console/dummycon.c |  1 +
>>  2 files changed, 30 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
>> index 6de3a43e3acf..837d1a69ca52 100644
>> --- a/drivers/gpu/drm/i915/i915_dma.c
>> +++ b/drivers/gpu/drm/i915/i915_dma.c
>> @@ -36,6 +36,8 @@
>>  #include "i915_drv.h"
>>  #include "i915_trace.h"
>>  #include <linux/pci.h>
>> +#include <linux/console.h>
>> +#include <linux/vt.h>
>>  #include <linux/vgaarb.h>
>>  #include <linux/acpi.h>
>>  #include <linux/pnp.h>
>> @@ -1444,6 +1446,27 @@ static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
>>  }
>>  #endif
>>
>> +static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
>> +{
>> +     int ret;
>> +
>> +#if !defined(CONFIG_VGA_CONSOLE)
>> +     return 0;
>> +#endif
>> +
>> +#if !defined(CONFIG_DUMMY_CONSOLE)
>> +     return -ENODEV;
>> +#endif
>> +
>> +     DRM_INFO("Replacing VGA console driver\n");
>> +
>> +     console_lock();
>> +     ret = do_take_over_console(&dummy_con, 0, MAX_NR_CONSOLES - 1, 1);
>> +     console_unlock();
>> +

What if the dummy console is already in place? Shouldn't we somehow
take a look at the conswitchip variable or something like that?
Otherwise doing module_reload many times will make us load dummy_con
many times, no?


>> +     return ret;
>> +}
>> +
>>  static void i915_dump_device_info(struct drm_i915_private *dev_priv)
>>  {
>>       const struct intel_device_info *info = dev_priv->info;
>> @@ -1557,6 +1580,12 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
>>               goto out_regs;
>>
>>       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
>> +             ret = i915_kick_out_vgacon(dev_priv);
>> +             if (ret) {
>> +                     DRM_ERROR("failed to remove conflicting VGA console\n");

(note: for some reason this patch doesn't apply directly on -nightly
due to differences on this chunk)


>> +                     goto out_gtt;
>> +             }
>> +
>>               ret = i915_kick_out_firmware_fb(dev_priv);
>>               if (ret) {
>>                       DRM_ERROR("failed to remove conflicting framebuffer drivers\n");
>> diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c
>> index b63860f7beab..40bec8d64b0a 100644
>> --- a/drivers/video/console/dummycon.c
>> +++ b/drivers/video/console/dummycon.c
>> @@ -77,3 +77,4 @@ const struct consw dummy_con = {
>>      .con_set_palette =       DUMMY,
>>      .con_scrolldelta =       DUMMY,
>>  };
>> +EXPORT_SYMBOL_GPL(dummy_con);
>> --
>> 1.8.5.1
>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> +41 (0) 79 365 57 48 - http://blog.ffwll.ch



-- 
Paulo Zanoni



More information about the Intel-gfx mailing list