[PATCH] drm/i915: set LVDS connector status to unknown if the lid is closed

Andrei Paskevich andrei at tertium.org
Wed Aug 11 04:21:03 PDT 2010


On Wed, Aug 11, 2010 at 2:22 AM, Alex Deucher <alexdeucher at gmail.com> wrote:
> On Tue, Aug 10, 2010 at 7:16 PM, Andrei Paskevich <andrei at tertium.org> wrote:
>> Currently, the LVDS connector on i915-equipped laptops
>> is always reported as connected, regardless of the lid
>> state and presence of external monitors. This was done
>> because of too many BIOSes reporting lid status in
>> an unreliable way. However, in a quite usual setup of
>> a laptop attached to an external monitor, the only way
>> to obtain the monitor's resolution on boot is to disable
>> the LVDS via the boot command line, which is unfortunate
>> as one have to reboot to get the internal screen back.
>>
>
> This sounds like policy that should be handled in userspace.  One
> could argue that the LVDS panel is always connected so it should
> always report as connected.  Your desktop manager or whatever can
> decide what to light up based on what's connected and the current lid
> status.

This can certainly be handled in a desktop manager, as you propose.
The problem is that KMS code will choose the undesired resolution for
the console, well before a desktop manager is started.

I also agree that the LVDS panel is always connected in the proper
sense of the word. What I don't agree with is that every connected
output must be always turned on and configured for some common
resolution, which is almost never what I want (*). Yet the current DRM
implementation does exactly this, and Nouveau provides at least
a good workaround.

Andrei

(*) Except maybe for the case of laptop+beamer, but it is this case
that can and should be treated by one's desktop environment.

>
> Alex
>
>> The following patch implements the same scheme as in
>> the Nouveau driver: if the lid is reported as closed,
>> the LVDS connector status is set to unknown, and the
>> internal screen will be turned on only if there are
>> no other connected monitors. The ACPI lid status is
>> not checked if the "i915.ignorelid" parameter is set
>> to zero (to account for the buggy BIOSes), which is
>> the default value, so that the current behavior does
>> not change.
>>
>> The patch applies to the 2.6.35 kernel.
>>
>> Best regards,
>> Andrei
>>
>> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
>> index 423dc90..5206136 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.c
>> +++ b/drivers/gpu/drm/i915/i915_drv.c
>> @@ -45,6 +45,9 @@ module_param_named(fbpercrtc, i915_fbpercrtc, int, 0400);
>>  unsigned int i915_powersave = 1;
>>  module_param_named(powersave, i915_powersave, int, 0400);
>>
>> +unsigned int i915_ignorelid = 1;
>> +module_param_named(ignorelid, i915_ignorelid, int, 0400);
>> +
>>  unsigned int i915_lvds_downclock = 0;
>>  module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400);
>>
>> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
>> index 2e1744d..a03d344 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.h
>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>> @@ -815,6 +815,7 @@ extern struct drm_ioctl_desc i915_ioctls[];
>>  extern int i915_max_ioctl;
>>  extern unsigned int i915_fbpercrtc;
>>  extern unsigned int i915_powersave;
>> +extern unsigned int i915_ignorelid;
>>  extern unsigned int i915_lvds_downclock;
>>
>>  extern int i915_suspend(struct drm_device *dev, pm_message_t state);
>> diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
>> index 0eab8df..85a09c9 100644
>> --- a/drivers/gpu/drm/i915/intel_lvds.c
>> +++ b/drivers/gpu/drm/i915/intel_lvds.c
>> @@ -551,11 +551,8 @@ static enum drm_connector_status intel_lvds_detect(struct drm_connector *connect
>>        struct drm_device *dev = connector->dev;
>>        enum drm_connector_status status = connector_status_connected;
>>
>> -       /* ACPI lid methods were generally unreliable in this generation, so
>> -        * don't even bother.
>> -        */
>> -       if (IS_GEN2(dev) || IS_GEN3(dev))
>> -               return connector_status_connected;
>> +       if (!i915_ignorelid && !acpi_lid_open())
>> +               status = connector_status_unknown;
>>
>>        return status;
>>  }
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>>
>


More information about the dri-devel mailing list