DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
/*
|
|
|
|
* Copyright © 2006-2007 Intel Corporation
|
|
|
|
* Copyright (c) 2006 Dave Airlie <airlied@linux.ie>
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
|
|
* to deal in the Software without restriction, including without limitation
|
|
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice (including the next
|
|
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
|
|
* Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
* DEALINGS IN THE SOFTWARE.
|
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* Eric Anholt <eric@anholt.net>
|
|
|
|
* Dave Airlie <airlied@linux.ie>
|
|
|
|
* Jesse Barnes <jesse.barnes@intel.com>
|
|
|
|
*/
|
|
|
|
|
2009-09-10 22:28:03 +00:00
|
|
|
#include <acpi/button.h>
|
2009-02-04 10:05:41 +00:00
|
|
|
#include <linux/dmi.h>
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
#include <linux/i2c.h>
|
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
percpu.h is included by sched.h and module.h and thus ends up being
included when building most .c files. percpu.h includes slab.h which
in turn includes gfp.h making everything defined by the two files
universally available and complicating inclusion dependencies.
percpu.h -> slab.h dependency is about to be removed. Prepare for
this change by updating users of gfp and slab facilities include those
headers directly instead of assuming availability. As this conversion
needs to touch large number of source files, the following script is
used as the basis of conversion.
http://userweb.kernel.org/~tj/misc/slabh-sweep.py
The script does the followings.
* Scan files for gfp and slab usages and update includes such that
only the necessary includes are there. ie. if only gfp is used,
gfp.h, if slab is used, slab.h.
* When the script inserts a new include, it looks at the include
blocks and try to put the new include such that its order conforms
to its surrounding. It's put in the include block which contains
core kernel includes, in the same order that the rest are ordered -
alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
doesn't seem to be any matching order.
* If the script can't find a place to put a new include (mostly
because the file doesn't have fitting include block), it prints out
an error message indicating which .h file needs to be added to the
file.
The conversion was done in the following steps.
1. The initial automatic conversion of all .c files updated slightly
over 4000 files, deleting around 700 includes and adding ~480 gfp.h
and ~3000 slab.h inclusions. The script emitted errors for ~400
files.
2. Each error was manually checked. Some didn't need the inclusion,
some needed manual addition while adding it to implementation .h or
embedding .c file was more appropriate for others. This step added
inclusions to around 150 files.
3. The script was run again and the output was compared to the edits
from #2 to make sure no file was left behind.
4. Several build tests were done and a couple of problems were fixed.
e.g. lib/decompress_*.c used malloc/free() wrappers around slab
APIs requiring slab.h to be added manually.
5. The script was run on all .h files but without automatically
editing them as sprinkling gfp.h and slab.h inclusions around .h
files could easily lead to inclusion dependency hell. Most gfp.h
inclusion directives were ignored as stuff from gfp.h was usually
wildly available and often used in preprocessor macros. Each
slab.h inclusion directive was examined and added manually as
necessary.
6. percpu.h was updated not to include slab.h.
7. Build test were done on the following configurations and failures
were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
distributed build env didn't work with gcov compiles) and a few
more options had to be turned off depending on archs to make things
build (like ipr on powerpc/64 which failed due to missing writeq).
* x86 and x86_64 UP and SMP allmodconfig and a custom test config.
* powerpc and powerpc64 SMP allmodconfig
* sparc and sparc64 SMP allmodconfig
* ia64 SMP allmodconfig
* s390 SMP allmodconfig
* alpha SMP allmodconfig
* um on x86_64 SMP allmodconfig
8. percpu.h modifications were reverted so that it could be applied as
a separate patch and serve as bisection point.
Given the fact that I had only a couple of failures from tests on step
6, I'm fairly confident about the coverage of this conversion patch.
If there is a breakage, it's likely to be something in one of the arch
headers which should be easily discoverable easily on most builds of
the specific arch.
Signed-off-by: Tejun Heo <tj@kernel.org>
Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
2010-03-24 08:04:11 +00:00
|
|
|
#include <linux/slab.h>
|
2016-01-11 19:09:20 +00:00
|
|
|
#include <linux/vga_switcheroo.h>
|
2012-10-02 17:01:07 +00:00
|
|
|
#include <drm/drmP.h>
|
2015-01-23 00:50:32 +00:00
|
|
|
#include <drm/drm_atomic_helper.h>
|
2012-10-02 17:01:07 +00:00
|
|
|
#include <drm/drm_crtc.h>
|
|
|
|
#include <drm/drm_edid.h>
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
#include "intel_drv.h"
|
2012-10-02 17:01:07 +00:00
|
|
|
#include <drm/i915_drm.h>
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
#include "i915_drv.h"
|
2009-06-26 01:46:18 +00:00
|
|
|
#include <linux/acpi.h>
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2009-06-22 07:31:25 +00:00
|
|
|
/* Private structure for the integrated LVDS support */
|
2012-10-19 11:51:44 +00:00
|
|
|
struct intel_lvds_connector {
|
|
|
|
struct intel_connector base;
|
2010-09-12 16:34:41 +00:00
|
|
|
|
2012-10-19 11:51:45 +00:00
|
|
|
struct notifier_block lid_notifier;
|
2012-10-19 11:51:44 +00:00
|
|
|
};
|
|
|
|
|
2016-08-10 11:07:31 +00:00
|
|
|
struct intel_lvds_pps {
|
|
|
|
/* 100us units */
|
|
|
|
int t1_t2;
|
|
|
|
int t3;
|
|
|
|
int t4;
|
|
|
|
int t5;
|
|
|
|
int tx;
|
|
|
|
|
|
|
|
int divider;
|
|
|
|
|
|
|
|
int port;
|
|
|
|
bool powerdown_on_reset;
|
|
|
|
};
|
|
|
|
|
2012-10-19 11:51:43 +00:00
|
|
|
struct intel_lvds_encoder {
|
2010-08-04 12:50:23 +00:00
|
|
|
struct intel_encoder base;
|
2010-09-12 16:34:41 +00:00
|
|
|
|
2012-11-26 16:22:10 +00:00
|
|
|
bool is_dual_link;
|
drm/i915: Type safe register read/write
Make I915_READ and I915_WRITE more type safe by wrapping the register
offset in a struct. This should eliminate most of the fumbles we've had
with misplaced parens.
This only takes care of normal mmio registers. We could extend the idea
to other register types and define each with its own struct. That way
you wouldn't be able to accidentally pass the wrong thing to a specific
register access function.
The gpio_reg setup is probably the ugliest thing left. But I figure I'd
just leave it for now, and wait for some divine inspiration to strike
before making it nice.
As for the generated code, it's actually a bit better sometimes. Eg.
looking at i915_irq_handler(), we can see the following change:
lea 0x70024(%rdx,%rax,1),%r9d
mov $0x1,%edx
- movslq %r9d,%r9
- mov %r9,%rsi
- mov %r9,-0x58(%rbp)
- callq *0xd8(%rbx)
+ mov %r9d,%esi
+ mov %r9d,-0x48(%rbp)
callq *0xd8(%rbx)
So previously gcc thought the register offset might be signed and
decided to sign extend it, just in case. The rest appears to be
mostly just minor shuffling of instructions.
v2: i915_mmio_reg_{offset,equal,valid}() helpers added
s/_REG/_MMIO/ in the register defines
mo more switch statements left to worry about
ring_emit stuff got sorted in a prep patch
cmd parser, lrc context and w/a batch buildup also in prep patch
vgpu stuff cleaned up and moved to a prep patch
all other unrelated changes split out
v3: Rebased due to BXT DSI/BLC, MOCS, etc.
v4: Rebased due to churn, s/i915_mmio_reg_t/i915_reg_t/
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1447853606-2751-1-git-send-email-ville.syrjala@linux.intel.com
2015-11-18 13:33:26 +00:00
|
|
|
i915_reg_t reg;
|
2014-07-04 16:38:36 +00:00
|
|
|
u32 a3_power;
|
2010-09-12 16:34:41 +00:00
|
|
|
|
2016-08-10 11:07:31 +00:00
|
|
|
struct intel_lvds_pps init_pps;
|
|
|
|
u32 init_lvds_val;
|
|
|
|
|
2012-10-19 11:51:47 +00:00
|
|
|
struct intel_lvds_connector *attached_connector;
|
2009-06-22 07:31:25 +00:00
|
|
|
};
|
|
|
|
|
2012-10-19 11:51:43 +00:00
|
|
|
static struct intel_lvds_encoder *to_lvds_encoder(struct drm_encoder *encoder)
|
2010-08-04 12:50:23 +00:00
|
|
|
{
|
2012-10-19 11:51:43 +00:00
|
|
|
return container_of(encoder, struct intel_lvds_encoder, base.base);
|
2010-08-04 12:50:23 +00:00
|
|
|
}
|
|
|
|
|
2012-10-19 11:51:44 +00:00
|
|
|
static struct intel_lvds_connector *to_lvds_connector(struct drm_connector *connector)
|
2010-09-12 16:34:41 +00:00
|
|
|
{
|
2012-10-19 11:51:44 +00:00
|
|
|
return container_of(connector, struct intel_lvds_connector, base.base);
|
2010-09-12 16:34:41 +00:00
|
|
|
}
|
|
|
|
|
2012-07-02 19:09:00 +00:00
|
|
|
static bool intel_lvds_get_hw_state(struct intel_encoder *encoder,
|
|
|
|
enum pipe *pipe)
|
|
|
|
{
|
|
|
|
struct drm_device *dev = encoder->base.dev;
|
2016-07-04 10:34:36 +00:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(dev);
|
2012-09-11 12:12:25 +00:00
|
|
|
struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
|
|
|
|
u32 tmp;
|
2016-02-12 16:55:21 +00:00
|
|
|
bool ret;
|
2012-07-02 19:09:00 +00:00
|
|
|
|
2017-02-22 06:34:27 +00:00
|
|
|
if (!intel_display_power_get_if_enabled(dev_priv,
|
|
|
|
encoder->power_domain))
|
2014-07-04 16:38:35 +00:00
|
|
|
return false;
|
|
|
|
|
2016-02-12 16:55:21 +00:00
|
|
|
ret = false;
|
|
|
|
|
2012-09-11 12:12:25 +00:00
|
|
|
tmp = I915_READ(lvds_encoder->reg);
|
2012-07-02 19:09:00 +00:00
|
|
|
|
|
|
|
if (!(tmp & LVDS_PORT_EN))
|
2016-02-12 16:55:21 +00:00
|
|
|
goto out;
|
2012-07-02 19:09:00 +00:00
|
|
|
|
2016-10-13 10:02:53 +00:00
|
|
|
if (HAS_PCH_CPT(dev_priv))
|
2012-07-02 19:09:00 +00:00
|
|
|
*pipe = PORT_TO_PIPE_CPT(tmp);
|
|
|
|
else
|
|
|
|
*pipe = PORT_TO_PIPE(tmp);
|
|
|
|
|
2016-02-12 16:55:21 +00:00
|
|
|
ret = true;
|
|
|
|
|
|
|
|
out:
|
2017-02-22 06:34:27 +00:00
|
|
|
intel_display_power_put(dev_priv, encoder->power_domain);
|
2016-02-12 16:55:21 +00:00
|
|
|
|
|
|
|
return ret;
|
2012-07-02 19:09:00 +00:00
|
|
|
}
|
|
|
|
|
2013-05-15 00:08:26 +00:00
|
|
|
static void intel_lvds_get_config(struct intel_encoder *encoder,
|
2015-01-15 12:55:21 +00:00
|
|
|
struct intel_crtc_state *pipe_config)
|
2013-05-15 00:08:26 +00:00
|
|
|
{
|
2016-11-16 08:55:40 +00:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
2015-09-18 17:03:45 +00:00
|
|
|
struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
|
|
|
|
u32 tmp, flags = 0;
|
2013-05-15 00:08:26 +00:00
|
|
|
|
2015-09-18 17:03:45 +00:00
|
|
|
tmp = I915_READ(lvds_encoder->reg);
|
2013-05-15 00:08:26 +00:00
|
|
|
if (tmp & LVDS_HSYNC_POLARITY)
|
|
|
|
flags |= DRM_MODE_FLAG_NHSYNC;
|
|
|
|
else
|
|
|
|
flags |= DRM_MODE_FLAG_PHSYNC;
|
|
|
|
if (tmp & LVDS_VSYNC_POLARITY)
|
|
|
|
flags |= DRM_MODE_FLAG_NVSYNC;
|
|
|
|
else
|
|
|
|
flags |= DRM_MODE_FLAG_PVSYNC;
|
|
|
|
|
2015-01-15 12:55:22 +00:00
|
|
|
pipe_config->base.adjusted_mode.flags |= flags;
|
2013-07-11 11:35:40 +00:00
|
|
|
|
2016-11-16 08:55:40 +00:00
|
|
|
if (INTEL_GEN(dev_priv) < 5)
|
2016-04-29 12:34:02 +00:00
|
|
|
pipe_config->gmch_pfit.lvds_border_bits =
|
|
|
|
tmp & LVDS_BORDER_ENABLE;
|
|
|
|
|
2014-07-09 20:35:53 +00:00
|
|
|
/* gen2/3 store dither state in pfit control, needs to match */
|
2016-11-16 08:55:40 +00:00
|
|
|
if (INTEL_GEN(dev_priv) < 4) {
|
2014-07-09 20:35:53 +00:00
|
|
|
tmp = I915_READ(PFIT_CONTROL);
|
|
|
|
|
|
|
|
pipe_config->gmch_pfit.control |= tmp & PANEL_8TO6_DITHER_ENABLE;
|
|
|
|
}
|
|
|
|
|
2016-02-17 19:41:09 +00:00
|
|
|
pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
|
2013-05-15 00:08:26 +00:00
|
|
|
}
|
|
|
|
|
2016-08-10 11:07:31 +00:00
|
|
|
static void intel_lvds_pps_get_hw_state(struct drm_i915_private *dev_priv,
|
|
|
|
struct intel_lvds_pps *pps)
|
|
|
|
{
|
|
|
|
u32 val;
|
|
|
|
|
|
|
|
pps->powerdown_on_reset = I915_READ(PP_CONTROL(0)) & PANEL_POWER_RESET;
|
|
|
|
|
|
|
|
val = I915_READ(PP_ON_DELAYS(0));
|
|
|
|
pps->port = (val & PANEL_PORT_SELECT_MASK) >>
|
|
|
|
PANEL_PORT_SELECT_SHIFT;
|
|
|
|
pps->t1_t2 = (val & PANEL_POWER_UP_DELAY_MASK) >>
|
|
|
|
PANEL_POWER_UP_DELAY_SHIFT;
|
|
|
|
pps->t5 = (val & PANEL_LIGHT_ON_DELAY_MASK) >>
|
|
|
|
PANEL_LIGHT_ON_DELAY_SHIFT;
|
|
|
|
|
|
|
|
val = I915_READ(PP_OFF_DELAYS(0));
|
|
|
|
pps->t3 = (val & PANEL_POWER_DOWN_DELAY_MASK) >>
|
|
|
|
PANEL_POWER_DOWN_DELAY_SHIFT;
|
|
|
|
pps->tx = (val & PANEL_LIGHT_OFF_DELAY_MASK) >>
|
|
|
|
PANEL_LIGHT_OFF_DELAY_SHIFT;
|
|
|
|
|
|
|
|
val = I915_READ(PP_DIVISOR(0));
|
|
|
|
pps->divider = (val & PP_REFERENCE_DIVIDER_MASK) >>
|
|
|
|
PP_REFERENCE_DIVIDER_SHIFT;
|
|
|
|
val = (val & PANEL_POWER_CYCLE_DELAY_MASK) >>
|
|
|
|
PANEL_POWER_CYCLE_DELAY_SHIFT;
|
|
|
|
/*
|
|
|
|
* Remove the BSpec specified +1 (100ms) offset that accounts for a
|
|
|
|
* too short power-cycle delay due to the asynchronous programming of
|
|
|
|
* the register.
|
|
|
|
*/
|
|
|
|
if (val)
|
|
|
|
val--;
|
|
|
|
/* Convert from 100ms to 100us units */
|
|
|
|
pps->t4 = val * 1000;
|
|
|
|
|
|
|
|
if (INTEL_INFO(dev_priv)->gen <= 4 &&
|
|
|
|
pps->t1_t2 == 0 && pps->t5 == 0 && pps->t3 == 0 && pps->tx == 0) {
|
|
|
|
DRM_DEBUG_KMS("Panel power timings uninitialized, "
|
|
|
|
"setting defaults\n");
|
|
|
|
/* Set T2 to 40ms and T5 to 200ms in 100 usec units */
|
|
|
|
pps->t1_t2 = 40 * 10;
|
|
|
|
pps->t5 = 200 * 10;
|
|
|
|
/* Set T3 to 35ms and Tx to 200ms in 100 usec units */
|
|
|
|
pps->t3 = 35 * 10;
|
|
|
|
pps->tx = 200 * 10;
|
|
|
|
}
|
|
|
|
|
|
|
|
DRM_DEBUG_DRIVER("LVDS PPS:t1+t2 %d t3 %d t4 %d t5 %d tx %d "
|
|
|
|
"divider %d port %d powerdown_on_reset %d\n",
|
|
|
|
pps->t1_t2, pps->t3, pps->t4, pps->t5, pps->tx,
|
|
|
|
pps->divider, pps->port, pps->powerdown_on_reset);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void intel_lvds_pps_init_hw(struct drm_i915_private *dev_priv,
|
|
|
|
struct intel_lvds_pps *pps)
|
|
|
|
{
|
|
|
|
u32 val;
|
|
|
|
|
|
|
|
val = I915_READ(PP_CONTROL(0));
|
|
|
|
WARN_ON((val & PANEL_UNLOCK_MASK) != PANEL_UNLOCK_REGS);
|
|
|
|
if (pps->powerdown_on_reset)
|
|
|
|
val |= PANEL_POWER_RESET;
|
|
|
|
I915_WRITE(PP_CONTROL(0), val);
|
|
|
|
|
|
|
|
I915_WRITE(PP_ON_DELAYS(0), (pps->port << PANEL_PORT_SELECT_SHIFT) |
|
|
|
|
(pps->t1_t2 << PANEL_POWER_UP_DELAY_SHIFT) |
|
|
|
|
(pps->t5 << PANEL_LIGHT_ON_DELAY_SHIFT));
|
|
|
|
I915_WRITE(PP_OFF_DELAYS(0), (pps->t3 << PANEL_POWER_DOWN_DELAY_SHIFT) |
|
|
|
|
(pps->tx << PANEL_LIGHT_OFF_DELAY_SHIFT));
|
|
|
|
|
|
|
|
val = pps->divider << PP_REFERENCE_DIVIDER_SHIFT;
|
|
|
|
val |= (DIV_ROUND_UP(pps->t4, 1000) + 1) <<
|
|
|
|
PANEL_POWER_CYCLE_DELAY_SHIFT;
|
|
|
|
I915_WRITE(PP_DIVISOR(0), val);
|
|
|
|
}
|
|
|
|
|
2016-08-09 15:04:04 +00:00
|
|
|
static void intel_pre_enable_lvds(struct intel_encoder *encoder,
|
|
|
|
struct intel_crtc_state *pipe_config,
|
|
|
|
struct drm_connector_state *conn_state)
|
2012-11-26 16:22:12 +00:00
|
|
|
{
|
|
|
|
struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
|
2016-08-09 15:04:11 +00:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
|
|
|
struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
|
|
|
|
const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
|
2013-06-16 19:42:39 +00:00
|
|
|
int pipe = crtc->pipe;
|
2012-11-26 16:22:12 +00:00
|
|
|
u32 temp;
|
|
|
|
|
2016-08-09 15:04:11 +00:00
|
|
|
if (HAS_PCH_SPLIT(dev_priv)) {
|
2013-06-16 19:42:39 +00:00
|
|
|
assert_fdi_rx_pll_disabled(dev_priv, pipe);
|
|
|
|
assert_shared_dpll_disabled(dev_priv,
|
2016-08-09 15:04:11 +00:00
|
|
|
pipe_config->shared_dpll);
|
2013-06-16 19:42:39 +00:00
|
|
|
} else {
|
|
|
|
assert_pll_disabled(dev_priv, pipe);
|
|
|
|
}
|
|
|
|
|
2016-08-10 11:07:31 +00:00
|
|
|
intel_lvds_pps_init_hw(dev_priv, &lvds_encoder->init_pps);
|
|
|
|
|
|
|
|
temp = lvds_encoder->init_lvds_val;
|
2012-11-26 16:22:12 +00:00
|
|
|
temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP;
|
2012-11-26 16:22:13 +00:00
|
|
|
|
2016-08-09 15:04:11 +00:00
|
|
|
if (HAS_PCH_CPT(dev_priv)) {
|
2012-11-26 16:22:13 +00:00
|
|
|
temp &= ~PORT_TRANS_SEL_MASK;
|
|
|
|
temp |= PORT_TRANS_SEL_CPT(pipe);
|
2012-11-26 16:22:12 +00:00
|
|
|
} else {
|
2012-11-26 16:22:13 +00:00
|
|
|
if (pipe == 1) {
|
|
|
|
temp |= LVDS_PIPEB_SELECT;
|
|
|
|
} else {
|
|
|
|
temp &= ~LVDS_PIPEB_SELECT;
|
|
|
|
}
|
2012-11-26 16:22:12 +00:00
|
|
|
}
|
2012-11-26 16:22:13 +00:00
|
|
|
|
2012-11-26 16:22:12 +00:00
|
|
|
/* set the corresponsding LVDS_BORDER bit */
|
2013-05-07 21:34:16 +00:00
|
|
|
temp &= ~LVDS_BORDER_ENABLE;
|
2016-08-09 15:04:11 +00:00
|
|
|
temp |= pipe_config->gmch_pfit.lvds_border_bits;
|
2012-11-26 16:22:12 +00:00
|
|
|
/* Set the B0-B3 data pairs corresponding to whether we're going to
|
|
|
|
* set the DPLLs for dual-channel mode or not.
|
|
|
|
*/
|
|
|
|
if (lvds_encoder->is_dual_link)
|
|
|
|
temp |= LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP;
|
|
|
|
else
|
|
|
|
temp &= ~(LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP);
|
|
|
|
|
|
|
|
/* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP)
|
|
|
|
* appropriately here, but we need to look more thoroughly into how
|
2014-07-04 16:38:36 +00:00
|
|
|
* panels behave in the two modes. For now, let's just maintain the
|
|
|
|
* value we got from the BIOS.
|
2012-11-26 16:22:12 +00:00
|
|
|
*/
|
2016-07-02 14:36:05 +00:00
|
|
|
temp &= ~LVDS_A3_POWER_MASK;
|
|
|
|
temp |= lvds_encoder->a3_power;
|
2012-11-26 16:22:13 +00:00
|
|
|
|
|
|
|
/* Set the dithering flag on LVDS as needed, note that there is no
|
|
|
|
* special lvds dither control bit on pch-split platforms, dithering is
|
|
|
|
* only controlled through the PIPECONF reg. */
|
2016-05-10 09:57:06 +00:00
|
|
|
if (IS_GEN4(dev_priv)) {
|
2013-04-25 15:54:44 +00:00
|
|
|
/* Bspec wording suggests that LVDS port dithering only exists
|
|
|
|
* for 18bpp panels. */
|
2016-08-09 15:04:11 +00:00
|
|
|
if (pipe_config->dither && pipe_config->pipe_bpp == 18)
|
2012-11-26 16:22:12 +00:00
|
|
|
temp |= LVDS_ENABLE_DITHER;
|
|
|
|
else
|
|
|
|
temp &= ~LVDS_ENABLE_DITHER;
|
|
|
|
}
|
|
|
|
temp &= ~(LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY);
|
2013-09-02 18:13:39 +00:00
|
|
|
if (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC)
|
2012-11-26 16:22:12 +00:00
|
|
|
temp |= LVDS_HSYNC_POLARITY;
|
2013-09-02 18:13:39 +00:00
|
|
|
if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC)
|
2012-11-26 16:22:12 +00:00
|
|
|
temp |= LVDS_VSYNC_POLARITY;
|
|
|
|
|
|
|
|
I915_WRITE(lvds_encoder->reg, temp);
|
|
|
|
}
|
|
|
|
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
/**
|
|
|
|
* Sets the power state for the panel.
|
|
|
|
*/
|
2016-08-09 15:04:04 +00:00
|
|
|
static void intel_enable_lvds(struct intel_encoder *encoder,
|
|
|
|
struct intel_crtc_state *pipe_config,
|
|
|
|
struct drm_connector_state *conn_state)
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
{
|
2012-06-30 13:31:28 +00:00
|
|
|
struct drm_device *dev = encoder->base.dev;
|
2012-10-19 11:51:43 +00:00
|
|
|
struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
|
2016-07-04 10:34:36 +00:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(dev);
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2012-09-11 12:12:25 +00:00
|
|
|
I915_WRITE(lvds_encoder->reg, I915_READ(lvds_encoder->reg) | LVDS_PORT_EN);
|
2010-09-13 00:16:10 +00:00
|
|
|
|
2016-08-10 11:07:30 +00:00
|
|
|
I915_WRITE(PP_CONTROL(0), I915_READ(PP_CONTROL(0)) | PANEL_POWER_ON);
|
2012-09-11 12:12:25 +00:00
|
|
|
POSTING_READ(lvds_encoder->reg);
|
2016-08-10 11:07:29 +00:00
|
|
|
if (intel_wait_for_register(dev_priv, PP_STATUS(0), PP_ON, PP_ON, 1000))
|
2011-08-06 17:30:45 +00:00
|
|
|
DRM_ERROR("timed out waiting for panel to power on\n");
|
2010-12-05 19:21:18 +00:00
|
|
|
|
2017-06-12 10:21:13 +00:00
|
|
|
intel_panel_enable_backlight(pipe_config, conn_state);
|
2010-12-05 19:21:18 +00:00
|
|
|
}
|
|
|
|
|
2016-08-09 15:04:04 +00:00
|
|
|
static void intel_disable_lvds(struct intel_encoder *encoder,
|
|
|
|
struct intel_crtc_state *old_crtc_state,
|
|
|
|
struct drm_connector_state *old_conn_state)
|
2010-12-05 19:21:18 +00:00
|
|
|
{
|
2012-10-19 11:51:43 +00:00
|
|
|
struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
|
2016-08-09 15:04:11 +00:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
2010-12-05 19:21:18 +00:00
|
|
|
|
2016-08-10 11:07:30 +00:00
|
|
|
I915_WRITE(PP_CONTROL(0), I915_READ(PP_CONTROL(0)) & ~PANEL_POWER_ON);
|
2016-08-10 11:07:29 +00:00
|
|
|
if (intel_wait_for_register(dev_priv, PP_STATUS(0), PP_ON, 0, 1000))
|
2011-08-06 17:30:45 +00:00
|
|
|
DRM_ERROR("timed out waiting for panel to power off\n");
|
2010-12-05 19:21:18 +00:00
|
|
|
|
2012-09-11 12:12:25 +00:00
|
|
|
I915_WRITE(lvds_encoder->reg, I915_READ(lvds_encoder->reg) & ~LVDS_PORT_EN);
|
|
|
|
POSTING_READ(lvds_encoder->reg);
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
}
|
|
|
|
|
2016-08-09 15:04:04 +00:00
|
|
|
static void gmch_disable_lvds(struct intel_encoder *encoder,
|
|
|
|
struct intel_crtc_state *old_crtc_state,
|
|
|
|
struct drm_connector_state *old_conn_state)
|
|
|
|
|
2015-07-02 14:42:46 +00:00
|
|
|
{
|
2017-06-12 10:21:13 +00:00
|
|
|
intel_panel_disable_backlight(old_conn_state);
|
2015-07-02 14:42:46 +00:00
|
|
|
|
2016-08-09 15:04:04 +00:00
|
|
|
intel_disable_lvds(encoder, old_crtc_state, old_conn_state);
|
2015-07-02 14:42:46 +00:00
|
|
|
}
|
|
|
|
|
2016-08-09 15:04:04 +00:00
|
|
|
static void pch_disable_lvds(struct intel_encoder *encoder,
|
|
|
|
struct intel_crtc_state *old_crtc_state,
|
|
|
|
struct drm_connector_state *old_conn_state)
|
2015-07-02 14:42:46 +00:00
|
|
|
{
|
2017-06-12 10:21:13 +00:00
|
|
|
intel_panel_disable_backlight(old_conn_state);
|
2015-07-02 14:42:46 +00:00
|
|
|
}
|
|
|
|
|
2016-08-09 15:04:04 +00:00
|
|
|
static void pch_post_disable_lvds(struct intel_encoder *encoder,
|
|
|
|
struct intel_crtc_state *old_crtc_state,
|
|
|
|
struct drm_connector_state *old_conn_state)
|
2015-07-02 14:42:46 +00:00
|
|
|
{
|
2016-08-09 15:04:04 +00:00
|
|
|
intel_disable_lvds(encoder, old_crtc_state, old_conn_state);
|
2015-07-02 14:42:46 +00:00
|
|
|
}
|
|
|
|
|
2013-11-28 15:29:18 +00:00
|
|
|
static enum drm_mode_status
|
|
|
|
intel_lvds_mode_valid(struct drm_connector *connector,
|
|
|
|
struct drm_display_mode *mode)
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
{
|
2012-10-19 11:51:50 +00:00
|
|
|
struct intel_connector *intel_connector = to_intel_connector(connector);
|
|
|
|
struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
|
2015-08-18 11:37:00 +00:00
|
|
|
int max_pixclk = to_i915(connector->dev)->max_dotclk_freq;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2010-09-12 16:34:41 +00:00
|
|
|
if (mode->hdisplay > fixed_mode->hdisplay)
|
|
|
|
return MODE_PANEL;
|
|
|
|
if (mode->vdisplay > fixed_mode->vdisplay)
|
|
|
|
return MODE_PANEL;
|
2015-08-18 11:37:00 +00:00
|
|
|
if (fixed_mode->clock > max_pixclk)
|
|
|
|
return MODE_CLOCK_HIGH;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
|
|
|
return MODE_OK;
|
|
|
|
}
|
|
|
|
|
2013-03-26 23:44:52 +00:00
|
|
|
static bool intel_lvds_compute_config(struct intel_encoder *intel_encoder,
|
2016-08-09 15:04:05 +00:00
|
|
|
struct intel_crtc_state *pipe_config,
|
|
|
|
struct drm_connector_state *conn_state)
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
{
|
2016-10-13 10:02:53 +00:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
|
2013-03-26 23:44:52 +00:00
|
|
|
struct intel_lvds_encoder *lvds_encoder =
|
|
|
|
to_lvds_encoder(&intel_encoder->base);
|
2012-10-26 09:03:59 +00:00
|
|
|
struct intel_connector *intel_connector =
|
|
|
|
&lvds_encoder->attached_connector->base;
|
2015-01-15 12:55:22 +00:00
|
|
|
struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
|
2015-03-20 14:18:14 +00:00
|
|
|
struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
|
drm/i915: precompute pipe bpp before touching the hw
The procedure has now 3 steps:
1. Compute the bpp that the plane will output, this is done in
pipe_config_set_bpp and stored into pipe_config->pipe_bpp. Also,
this function clamps the pipe_bpp to whatever limit the EDID of any
connected output specifies.
2. Adjust the pipe_bpp in the encoder and crtc functions, according to
whatever constraints there are.
3. Decide whether to use dither by comparing the stored plane bpp with
computed pipe_bpp.
There are a few slight functional changes in this patch:
- LVDS connector are now also going through the EDID clamping. But in
a 2nd change we now unconditionally force the lvds bpc value - this
shouldn't matter in reality when the panel setup is consistent, but
better safe than sorry.
- HDMI now forces the pipe_bpp to the selected value - I think that's
what we actually want, since otherwise at least the pixelclock
computations are wrong (I'm not sure whether the port would accept
e.g. 10 bpc when in 12bpc mode). Contrary to the old code, we pick
the next higher bpc value, since otherwise there's no way to make
use of the 12 bpc mode (since the next patch will remove the 12bpc
plane format, it doesn't exist).
Both of these changes are due to the removal of the
pipe_bpp = min(display_bpp, plane_bpp);
statement.
Another slight change is the reworking of the dp bpc code:
- For the mode_valid callback it's sufficient to only check whether
the mode would fit at the lowest bpc.
- The bandwidth computation code is a bit restructured: It now walks
all available bpp values in an outer loop and the codeblock that
computes derived values (once a good configuration is found) has been
moved out of the for loop maze. This is prep work to allow us to
successively fall back on bpc values, and also correctly support bpc
values != 8 or 6.
v2: Rebased on top of Paulo Zanoni's little refactoring to use more
drm dp helper functions.
v3: Rebased on top of Jani's eDP bpp fix and Ville's limited color
range work.
v4: Remove the INTEL_MODE_DP_FORCE_6BPC #define, no longer needed.
v5: Remove intel_crtc->bpp, too, and fix up the 12bpc check in the
hdmi code. Also fixup the bpp check in intel_dp.c, it'll get reworked
in a later patch though again.
v6: Fix spelling in a comment.
v7: Debug output improvements for the bpp computation.
v8: Fixup 6bpc lvds check - dual-link and 8bpc mode are different
things!
v9: Reinstate the fix to properly ignore the firmware edp bpp ... this
was lost in a rebase.
v10: Both g4x and vlv lack 12bpc pipes, so don't enforce that we have
that. Still unsure whether this is the way to go, but at least 6bpc
for a 8bpc hdmi output seems to work.
v11: And g4x/vlv also lack 12bpc hdmi support, so only support high
depth on DP. Adjust the code.
v12: Rebased.
v13: Split out the introduction of pipe_config->dither|pipe_bpp, as
requested from Jesse Barnes.
v14: Split out the special 6BPC handling for DP, as requested by Jesse
Barnes.
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-03-26 23:44:58 +00:00
|
|
|
unsigned int lvds_bpp;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
|
|
|
/* Should never happen!! */
|
2016-10-13 10:02:53 +00:00
|
|
|
if (INTEL_GEN(dev_priv) < 4 && intel_crtc->pipe == 0) {
|
2009-06-28 22:42:17 +00:00
|
|
|
DRM_ERROR("Can't support LVDS on pipe A\n");
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2014-07-04 16:38:36 +00:00
|
|
|
if (lvds_encoder->a3_power == LVDS_A3_POWER_UP)
|
drm/i915: precompute pipe bpp before touching the hw
The procedure has now 3 steps:
1. Compute the bpp that the plane will output, this is done in
pipe_config_set_bpp and stored into pipe_config->pipe_bpp. Also,
this function clamps the pipe_bpp to whatever limit the EDID of any
connected output specifies.
2. Adjust the pipe_bpp in the encoder and crtc functions, according to
whatever constraints there are.
3. Decide whether to use dither by comparing the stored plane bpp with
computed pipe_bpp.
There are a few slight functional changes in this patch:
- LVDS connector are now also going through the EDID clamping. But in
a 2nd change we now unconditionally force the lvds bpc value - this
shouldn't matter in reality when the panel setup is consistent, but
better safe than sorry.
- HDMI now forces the pipe_bpp to the selected value - I think that's
what we actually want, since otherwise at least the pixelclock
computations are wrong (I'm not sure whether the port would accept
e.g. 10 bpc when in 12bpc mode). Contrary to the old code, we pick
the next higher bpc value, since otherwise there's no way to make
use of the 12 bpc mode (since the next patch will remove the 12bpc
plane format, it doesn't exist).
Both of these changes are due to the removal of the
pipe_bpp = min(display_bpp, plane_bpp);
statement.
Another slight change is the reworking of the dp bpc code:
- For the mode_valid callback it's sufficient to only check whether
the mode would fit at the lowest bpc.
- The bandwidth computation code is a bit restructured: It now walks
all available bpp values in an outer loop and the codeblock that
computes derived values (once a good configuration is found) has been
moved out of the for loop maze. This is prep work to allow us to
successively fall back on bpc values, and also correctly support bpc
values != 8 or 6.
v2: Rebased on top of Paulo Zanoni's little refactoring to use more
drm dp helper functions.
v3: Rebased on top of Jani's eDP bpp fix and Ville's limited color
range work.
v4: Remove the INTEL_MODE_DP_FORCE_6BPC #define, no longer needed.
v5: Remove intel_crtc->bpp, too, and fix up the 12bpc check in the
hdmi code. Also fixup the bpp check in intel_dp.c, it'll get reworked
in a later patch though again.
v6: Fix spelling in a comment.
v7: Debug output improvements for the bpp computation.
v8: Fixup 6bpc lvds check - dual-link and 8bpc mode are different
things!
v9: Reinstate the fix to properly ignore the firmware edp bpp ... this
was lost in a rebase.
v10: Both g4x and vlv lack 12bpc pipes, so don't enforce that we have
that. Still unsure whether this is the way to go, but at least 6bpc
for a 8bpc hdmi output seems to work.
v11: And g4x/vlv also lack 12bpc hdmi support, so only support high
depth on DP. Adjust the code.
v12: Rebased.
v13: Split out the introduction of pipe_config->dither|pipe_bpp, as
requested from Jesse Barnes.
v14: Split out the special 6BPC handling for DP, as requested by Jesse
Barnes.
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-03-26 23:44:58 +00:00
|
|
|
lvds_bpp = 8*3;
|
|
|
|
else
|
|
|
|
lvds_bpp = 6*3;
|
|
|
|
|
drm/i915: implement fdi auto-dithering
So on a bunch of setups we only have 2 fdi lanes available, e.g. hsw
VGA or 3 pipes on ivb. And seemingly a lot of modes don't quite fit
into this, among them the default 1080p mode.
The solution is to dither down the pipe a bit so that everything fits,
which this patch implements.
But ports compute their state under the assumption that the bpp they
pick will be the one selected, e.g. the display port bw computations
won't work otherwise. Now we could adjust our code to again up-dither
to the computed DP link parameters, but that's pointless.
So instead when the pipe needs to adjust parameters we need to retry
the pipe_config computation at the encoder stage. Furthermore we need
to inform encoders that they should not increase bandwidth
requirements if possible. This is required for the hdmi code, which
prefers the pipe to up-dither to either of the two possible hdmi bpc
values.
LVDS has a similar requirement, although that's probably only
theoretical in nature: It's unlikely that we'll ever see an 8bpc
high-res lvds panel (which is required to hit the 2 fdi lane limit).
eDP is the only thing which could increase the pipe_bpp setting again,
even when in the retry-loop. This could hit the WARN. Two reasons for
not bothering:
- On many eDP panels we'll get a black screen if the bpp settings
don't match vbt. So failing the modeset is the right thing to do.
But since that also means it's the only way to light up the panel,
it should work. So we shouldn't be able to hit this WARN.
- There are still opens around the eDP panel handling, and maybe we
need additional tricks. Before that happens it's imo no use trying
to be too clever.
Worst case we just need to kill that WARN or maybe fail the compute
config stage if the eDP connector can't get the bpp setting it wants.
And since this can only happen with an fdi link in between and so for
pch eDP panels it's rather unlikely to blow up, if ever.
v2: Rebased on top of a bikeshed from Paulo.
v3: Improve commit message around eDP handling with the stuff
things with Imre.
Reviewed-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-02-20 23:00:16 +00:00
|
|
|
if (lvds_bpp != pipe_config->pipe_bpp && !pipe_config->bw_constrained) {
|
drm/i915: precompute pipe bpp before touching the hw
The procedure has now 3 steps:
1. Compute the bpp that the plane will output, this is done in
pipe_config_set_bpp and stored into pipe_config->pipe_bpp. Also,
this function clamps the pipe_bpp to whatever limit the EDID of any
connected output specifies.
2. Adjust the pipe_bpp in the encoder and crtc functions, according to
whatever constraints there are.
3. Decide whether to use dither by comparing the stored plane bpp with
computed pipe_bpp.
There are a few slight functional changes in this patch:
- LVDS connector are now also going through the EDID clamping. But in
a 2nd change we now unconditionally force the lvds bpc value - this
shouldn't matter in reality when the panel setup is consistent, but
better safe than sorry.
- HDMI now forces the pipe_bpp to the selected value - I think that's
what we actually want, since otherwise at least the pixelclock
computations are wrong (I'm not sure whether the port would accept
e.g. 10 bpc when in 12bpc mode). Contrary to the old code, we pick
the next higher bpc value, since otherwise there's no way to make
use of the 12 bpc mode (since the next patch will remove the 12bpc
plane format, it doesn't exist).
Both of these changes are due to the removal of the
pipe_bpp = min(display_bpp, plane_bpp);
statement.
Another slight change is the reworking of the dp bpc code:
- For the mode_valid callback it's sufficient to only check whether
the mode would fit at the lowest bpc.
- The bandwidth computation code is a bit restructured: It now walks
all available bpp values in an outer loop and the codeblock that
computes derived values (once a good configuration is found) has been
moved out of the for loop maze. This is prep work to allow us to
successively fall back on bpc values, and also correctly support bpc
values != 8 or 6.
v2: Rebased on top of Paulo Zanoni's little refactoring to use more
drm dp helper functions.
v3: Rebased on top of Jani's eDP bpp fix and Ville's limited color
range work.
v4: Remove the INTEL_MODE_DP_FORCE_6BPC #define, no longer needed.
v5: Remove intel_crtc->bpp, too, and fix up the 12bpc check in the
hdmi code. Also fixup the bpp check in intel_dp.c, it'll get reworked
in a later patch though again.
v6: Fix spelling in a comment.
v7: Debug output improvements for the bpp computation.
v8: Fixup 6bpc lvds check - dual-link and 8bpc mode are different
things!
v9: Reinstate the fix to properly ignore the firmware edp bpp ... this
was lost in a rebase.
v10: Both g4x and vlv lack 12bpc pipes, so don't enforce that we have
that. Still unsure whether this is the way to go, but at least 6bpc
for a 8bpc hdmi output seems to work.
v11: And g4x/vlv also lack 12bpc hdmi support, so only support high
depth on DP. Adjust the code.
v12: Rebased.
v13: Split out the introduction of pipe_config->dither|pipe_bpp, as
requested from Jesse Barnes.
v14: Split out the special 6BPC handling for DP, as requested by Jesse
Barnes.
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-03-26 23:44:58 +00:00
|
|
|
DRM_DEBUG_KMS("forcing display bpp (was %d) to LVDS (%d)\n",
|
|
|
|
pipe_config->pipe_bpp, lvds_bpp);
|
|
|
|
pipe_config->pipe_bpp = lvds_bpp;
|
|
|
|
}
|
2013-04-25 15:54:44 +00:00
|
|
|
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
/*
|
2010-07-17 12:38:43 +00:00
|
|
|
* We have timings from the BIOS for the panel, put them in
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
* to the adjusted mode. The CRTC will be set up for this mode,
|
|
|
|
* with the panel scaling set up to source from the H/VDisplay
|
|
|
|
* of the original mode.
|
|
|
|
*/
|
2012-10-26 09:03:59 +00:00
|
|
|
intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
|
2012-10-19 11:51:50 +00:00
|
|
|
adjusted_mode);
|
2010-08-07 10:01:28 +00:00
|
|
|
|
2016-10-13 10:02:53 +00:00
|
|
|
if (HAS_PCH_SPLIT(dev_priv)) {
|
2013-03-26 23:44:55 +00:00
|
|
|
pipe_config->has_pch_encoder = true;
|
|
|
|
|
2013-04-25 19:55:02 +00:00
|
|
|
intel_pch_panel_fitting(intel_crtc, pipe_config,
|
2017-05-01 13:37:55 +00:00
|
|
|
conn_state->scaling_mode);
|
2013-04-25 19:55:01 +00:00
|
|
|
} else {
|
|
|
|
intel_gmch_panel_fitting(intel_crtc, pipe_config,
|
2017-05-01 13:37:55 +00:00
|
|
|
conn_state->scaling_mode);
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2013-07-12 06:07:30 +00:00
|
|
|
}
|
2012-04-15 17:53:19 +00:00
|
|
|
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
/*
|
|
|
|
* XXX: It would be nice to support lower refresh rates on the
|
|
|
|
* panels to reduce power consumption, and perhaps match the
|
|
|
|
* user's requested refresh rate.
|
|
|
|
*/
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Detect the LVDS connection.
|
|
|
|
*
|
2009-09-10 22:28:04 +00:00
|
|
|
* Since LVDS doesn't have hotlug, we use the lid as a proxy. Open means
|
|
|
|
* connected and closed means disconnected. We also send hotplug events as
|
|
|
|
* needed, using lid status notification from the input layer.
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
*/
|
2010-09-09 22:51:02 +00:00
|
|
|
static enum drm_connector_status
|
2010-09-14 10:07:23 +00:00
|
|
|
intel_lvds_detect(struct drm_connector *connector, bool force)
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
{
|
2016-12-13 08:02:47 +00:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(connector->dev);
|
2011-03-24 13:26:43 +00:00
|
|
|
enum drm_connector_status status;
|
2009-09-10 22:28:04 +00:00
|
|
|
|
2013-07-20 19:27:08 +00:00
|
|
|
DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
|
2014-06-03 11:56:17 +00:00
|
|
|
connector->base.id, connector->name);
|
2013-07-20 19:27:08 +00:00
|
|
|
|
2016-12-13 08:02:47 +00:00
|
|
|
status = intel_panel_detect(dev_priv);
|
2011-02-12 10:29:38 +00:00
|
|
|
if (status != connector_status_unknown)
|
|
|
|
return status;
|
2011-01-16 19:37:30 +00:00
|
|
|
|
2011-03-24 13:26:43 +00:00
|
|
|
return connector_status_connected;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return the list of DDC modes if available, or the BIOS fixed mode otherwise.
|
|
|
|
*/
|
|
|
|
static int intel_lvds_get_modes(struct drm_connector *connector)
|
|
|
|
{
|
2012-10-19 11:51:47 +00:00
|
|
|
struct intel_lvds_connector *lvds_connector = to_lvds_connector(connector);
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
struct drm_device *dev = connector->dev;
|
2010-09-12 16:34:41 +00:00
|
|
|
struct drm_display_mode *mode;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2012-10-19 11:51:52 +00:00
|
|
|
/* use cached edid if we have one */
|
2012-11-21 16:14:04 +00:00
|
|
|
if (!IS_ERR_OR_NULL(lvds_connector->base.edid))
|
2012-10-19 11:51:52 +00:00
|
|
|
return drm_add_edid_modes(connector, lvds_connector->base.edid);
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2012-10-19 11:51:50 +00:00
|
|
|
mode = drm_mode_duplicate(dev, lvds_connector->base.panel.fixed_mode);
|
2011-01-13 19:06:50 +00:00
|
|
|
if (mode == NULL)
|
2010-09-12 16:34:41 +00:00
|
|
|
return 0;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2010-09-12 16:34:41 +00:00
|
|
|
drm_mode_probed_add(connector, mode);
|
|
|
|
return 1;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
}
|
|
|
|
|
2010-07-02 08:44:23 +00:00
|
|
|
static int intel_no_modeset_on_lid_dmi_callback(const struct dmi_system_id *id)
|
|
|
|
{
|
2012-04-01 11:16:49 +00:00
|
|
|
DRM_INFO("Skipping forced modeset for %s\n", id->ident);
|
2010-07-02 08:44:23 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The GPU hangs up on these systems if modeset is performed on LID open */
|
|
|
|
static const struct dmi_system_id intel_no_modeset_on_lid[] = {
|
|
|
|
{
|
|
|
|
.callback = intel_no_modeset_on_lid_dmi_callback,
|
|
|
|
.ident = "Toshiba Tecra A11",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "TECRA A11"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
{ } /* terminating entry */
|
|
|
|
};
|
|
|
|
|
2009-11-02 17:29:55 +00:00
|
|
|
/*
|
i915: ignore lid open event when resuming
i915 driver needs to do modeset when
1. system resumes from sleep
2. lid is opened
In PM_SUSPEND_MEM state, all the GPEs are cleared when system resumes,
thus it is the i915_resume code does the modeset rather than intel_lid_notify().
But in PM_SUSPEND_FREEZE state, this will be broken because
system is still responsive to the lid events.
1. When we close the lid in Freeze state, intel_lid_notify() sets modeset_on_lid.
2. When we reopen the lid, intel_lid_notify() will do a modeset,
before the system is resumed.
here is the error log,
[92146.548074] WARNING: at drivers/gpu/drm/i915/intel_display.c:1028 intel_wait_for_pipe_off+0x184/0x190 [i915]()
[92146.548076] Hardware name: VGN-Z540N
[92146.548078] pipe_off wait timed out
[92146.548167] Modules linked in: hid_generic usbhid hid snd_hda_codec_realtek snd_hda_intel snd_hda_codec parport_pc snd_hwdep ppdev snd_pcm_oss i915 snd_mixer_oss snd_pcm arc4 iwldvm snd_seq_dummy mac80211 snd_seq_oss snd_seq_midi fbcon tileblit font bitblit softcursor drm_kms_helper snd_rawmidi snd_seq_midi_event coretemp drm snd_seq kvm btusb bluetooth snd_timer iwlwifi pcmcia tpm_infineon i2c_algo_bit joydev snd_seq_device intel_agp cfg80211 snd intel_gtt yenta_socket pcmcia_rsrc sony_laptop agpgart microcode psmouse tpm_tis serio_raw mxm_wmi soundcore snd_page_alloc tpm acpi_cpufreq lpc_ich pcmcia_core tpm_bios mperf processor lp parport firewire_ohci firewire_core crc_itu_t sdhci_pci sdhci thermal e1000e
[92146.548173] Pid: 4304, comm: kworker/0:0 Tainted: G W 3.8.0-rc3-s0i3-v3-test+ #9
[92146.548175] Call Trace:
[92146.548189] [<c10378e2>] warn_slowpath_common+0x72/0xa0
[92146.548227] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548263] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548270] [<c10379b3>] warn_slowpath_fmt+0x33/0x40
[92146.548307] [<f86398b4>] intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548344] [<f86399c2>] intel_disable_pipe+0x102/0x190 [i915]
[92146.548380] [<f8639ea4>] ? intel_disable_plane+0x64/0x80 [i915]
[92146.548417] [<f8639f7c>] i9xx_crtc_disable+0xbc/0x150 [i915]
[92146.548456] [<f863ebee>] intel_crtc_update_dpms+0x5e/0x90 [i915]
[92146.548493] [<f86437cf>] intel_modeset_setup_hw_state+0x42f/0x8f0 [i915]
[92146.548535] [<f8645b0b>] intel_lid_notify+0x9b/0xc0 [i915]
[92146.548543] [<c15610d3>] notifier_call_chain+0x43/0x60
[92146.548550] [<c105d1e1>] __blocking_notifier_call_chain+0x41/0x80
[92146.548556] [<c105d23f>] blocking_notifier_call_chain+0x1f/0x30
[92146.548563] [<c131a684>] acpi_lid_send_state+0x78/0xa4
[92146.548569] [<c131aa9e>] acpi_button_notify+0x3b/0xf1
[92146.548577] [<c12df56a>] ? acpi_os_execute+0x17/0x19
[92146.548582] [<c12e591a>] ? acpi_ec_sync_query+0xa5/0xbc
[92146.548589] [<c12e2b82>] acpi_device_notify+0x16/0x18
[92146.548595] [<c12f4904>] acpi_ev_notify_dispatch+0x38/0x4f
[92146.548600] [<c12df0e8>] acpi_os_execute_deferred+0x20/0x2b
[92146.548607] [<c1051208>] process_one_work+0x128/0x3f0
[92146.548613] [<c1564f73>] ? common_interrupt+0x33/0x38
[92146.548618] [<c104f8c0>] ? wake_up_worker+0x30/0x30
[92146.548624] [<c12df0c8>] ? acpi_os_wait_events_complete+0x1e/0x1e
[92146.548629] [<c10524f9>] worker_thread+0x119/0x3b0
[92146.548634] [<c10523e0>] ? manage_workers+0x240/0x240
[92146.548640] [<c1056e84>] kthread+0x94/0xa0
[92146.548647] [<c1060000>] ? ftrace_raw_output_sched_stat_runtime+0x70/0xf0
[92146.548652] [<c15649b7>] ret_from_kernel_thread+0x1b/0x28
[92146.548658] [<c1056df0>] ? kthread_create_on_node+0xc0/0xc0
three different modeset flags are introduced in this patch
MODESET_ON_LID_OPEN: do modeset on next lid open event
MODESET_DONE: modeset already done
MODESET_SUSPENDED: suspended, only do modeset when system is resumed
In this way,
1. when lid is closed, MODESET_ON_LID_OPEN is set so that
we'll do modeset on next lid open event.
2. when lid is opened, MODESET_DONE is set
so that duplicate lid open events will be ignored.
3. when system suspends, MODESET_SUSPENDED is set.
In this case, we will not do modeset on any lid events.
Plus, locking mechanism is also introduced to avoid racing.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-02-05 07:41:53 +00:00
|
|
|
* Lid events. Note the use of 'modeset':
|
|
|
|
* - we set it to MODESET_ON_LID_OPEN on lid close,
|
|
|
|
* and set it to MODESET_DONE on open
|
2009-11-02 17:29:55 +00:00
|
|
|
* - we use it as a "only once" bit (ie we ignore
|
i915: ignore lid open event when resuming
i915 driver needs to do modeset when
1. system resumes from sleep
2. lid is opened
In PM_SUSPEND_MEM state, all the GPEs are cleared when system resumes,
thus it is the i915_resume code does the modeset rather than intel_lid_notify().
But in PM_SUSPEND_FREEZE state, this will be broken because
system is still responsive to the lid events.
1. When we close the lid in Freeze state, intel_lid_notify() sets modeset_on_lid.
2. When we reopen the lid, intel_lid_notify() will do a modeset,
before the system is resumed.
here is the error log,
[92146.548074] WARNING: at drivers/gpu/drm/i915/intel_display.c:1028 intel_wait_for_pipe_off+0x184/0x190 [i915]()
[92146.548076] Hardware name: VGN-Z540N
[92146.548078] pipe_off wait timed out
[92146.548167] Modules linked in: hid_generic usbhid hid snd_hda_codec_realtek snd_hda_intel snd_hda_codec parport_pc snd_hwdep ppdev snd_pcm_oss i915 snd_mixer_oss snd_pcm arc4 iwldvm snd_seq_dummy mac80211 snd_seq_oss snd_seq_midi fbcon tileblit font bitblit softcursor drm_kms_helper snd_rawmidi snd_seq_midi_event coretemp drm snd_seq kvm btusb bluetooth snd_timer iwlwifi pcmcia tpm_infineon i2c_algo_bit joydev snd_seq_device intel_agp cfg80211 snd intel_gtt yenta_socket pcmcia_rsrc sony_laptop agpgart microcode psmouse tpm_tis serio_raw mxm_wmi soundcore snd_page_alloc tpm acpi_cpufreq lpc_ich pcmcia_core tpm_bios mperf processor lp parport firewire_ohci firewire_core crc_itu_t sdhci_pci sdhci thermal e1000e
[92146.548173] Pid: 4304, comm: kworker/0:0 Tainted: G W 3.8.0-rc3-s0i3-v3-test+ #9
[92146.548175] Call Trace:
[92146.548189] [<c10378e2>] warn_slowpath_common+0x72/0xa0
[92146.548227] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548263] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548270] [<c10379b3>] warn_slowpath_fmt+0x33/0x40
[92146.548307] [<f86398b4>] intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548344] [<f86399c2>] intel_disable_pipe+0x102/0x190 [i915]
[92146.548380] [<f8639ea4>] ? intel_disable_plane+0x64/0x80 [i915]
[92146.548417] [<f8639f7c>] i9xx_crtc_disable+0xbc/0x150 [i915]
[92146.548456] [<f863ebee>] intel_crtc_update_dpms+0x5e/0x90 [i915]
[92146.548493] [<f86437cf>] intel_modeset_setup_hw_state+0x42f/0x8f0 [i915]
[92146.548535] [<f8645b0b>] intel_lid_notify+0x9b/0xc0 [i915]
[92146.548543] [<c15610d3>] notifier_call_chain+0x43/0x60
[92146.548550] [<c105d1e1>] __blocking_notifier_call_chain+0x41/0x80
[92146.548556] [<c105d23f>] blocking_notifier_call_chain+0x1f/0x30
[92146.548563] [<c131a684>] acpi_lid_send_state+0x78/0xa4
[92146.548569] [<c131aa9e>] acpi_button_notify+0x3b/0xf1
[92146.548577] [<c12df56a>] ? acpi_os_execute+0x17/0x19
[92146.548582] [<c12e591a>] ? acpi_ec_sync_query+0xa5/0xbc
[92146.548589] [<c12e2b82>] acpi_device_notify+0x16/0x18
[92146.548595] [<c12f4904>] acpi_ev_notify_dispatch+0x38/0x4f
[92146.548600] [<c12df0e8>] acpi_os_execute_deferred+0x20/0x2b
[92146.548607] [<c1051208>] process_one_work+0x128/0x3f0
[92146.548613] [<c1564f73>] ? common_interrupt+0x33/0x38
[92146.548618] [<c104f8c0>] ? wake_up_worker+0x30/0x30
[92146.548624] [<c12df0c8>] ? acpi_os_wait_events_complete+0x1e/0x1e
[92146.548629] [<c10524f9>] worker_thread+0x119/0x3b0
[92146.548634] [<c10523e0>] ? manage_workers+0x240/0x240
[92146.548640] [<c1056e84>] kthread+0x94/0xa0
[92146.548647] [<c1060000>] ? ftrace_raw_output_sched_stat_runtime+0x70/0xf0
[92146.548652] [<c15649b7>] ret_from_kernel_thread+0x1b/0x28
[92146.548658] [<c1056df0>] ? kthread_create_on_node+0xc0/0xc0
three different modeset flags are introduced in this patch
MODESET_ON_LID_OPEN: do modeset on next lid open event
MODESET_DONE: modeset already done
MODESET_SUSPENDED: suspended, only do modeset when system is resumed
In this way,
1. when lid is closed, MODESET_ON_LID_OPEN is set so that
we'll do modeset on next lid open event.
2. when lid is opened, MODESET_DONE is set
so that duplicate lid open events will be ignored.
3. when system suspends, MODESET_SUSPENDED is set.
In this case, we will not do modeset on any lid events.
Plus, locking mechanism is also introduced to avoid racing.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-02-05 07:41:53 +00:00
|
|
|
* duplicate events where it was already properly set)
|
|
|
|
* - the suspend/resume paths will set it to
|
|
|
|
* MODESET_SUSPENDED and ignore the lid open event,
|
|
|
|
* because they restore the mode ("lid open").
|
2009-11-02 17:29:55 +00:00
|
|
|
*/
|
2009-09-10 22:28:03 +00:00
|
|
|
static int intel_lid_notify(struct notifier_block *nb, unsigned long val,
|
|
|
|
void *unused)
|
|
|
|
{
|
2012-10-19 11:51:45 +00:00
|
|
|
struct intel_lvds_connector *lvds_connector =
|
|
|
|
container_of(nb, struct intel_lvds_connector, lid_notifier);
|
|
|
|
struct drm_connector *connector = &lvds_connector->base.base;
|
|
|
|
struct drm_device *dev = connector->dev;
|
2016-07-04 10:34:36 +00:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(dev);
|
2009-09-10 22:28:03 +00:00
|
|
|
|
2011-04-21 22:08:14 +00:00
|
|
|
if (dev->switch_power_state != DRM_SWITCH_POWER_ON)
|
|
|
|
return NOTIFY_OK;
|
|
|
|
|
i915: ignore lid open event when resuming
i915 driver needs to do modeset when
1. system resumes from sleep
2. lid is opened
In PM_SUSPEND_MEM state, all the GPEs are cleared when system resumes,
thus it is the i915_resume code does the modeset rather than intel_lid_notify().
But in PM_SUSPEND_FREEZE state, this will be broken because
system is still responsive to the lid events.
1. When we close the lid in Freeze state, intel_lid_notify() sets modeset_on_lid.
2. When we reopen the lid, intel_lid_notify() will do a modeset,
before the system is resumed.
here is the error log,
[92146.548074] WARNING: at drivers/gpu/drm/i915/intel_display.c:1028 intel_wait_for_pipe_off+0x184/0x190 [i915]()
[92146.548076] Hardware name: VGN-Z540N
[92146.548078] pipe_off wait timed out
[92146.548167] Modules linked in: hid_generic usbhid hid snd_hda_codec_realtek snd_hda_intel snd_hda_codec parport_pc snd_hwdep ppdev snd_pcm_oss i915 snd_mixer_oss snd_pcm arc4 iwldvm snd_seq_dummy mac80211 snd_seq_oss snd_seq_midi fbcon tileblit font bitblit softcursor drm_kms_helper snd_rawmidi snd_seq_midi_event coretemp drm snd_seq kvm btusb bluetooth snd_timer iwlwifi pcmcia tpm_infineon i2c_algo_bit joydev snd_seq_device intel_agp cfg80211 snd intel_gtt yenta_socket pcmcia_rsrc sony_laptop agpgart microcode psmouse tpm_tis serio_raw mxm_wmi soundcore snd_page_alloc tpm acpi_cpufreq lpc_ich pcmcia_core tpm_bios mperf processor lp parport firewire_ohci firewire_core crc_itu_t sdhci_pci sdhci thermal e1000e
[92146.548173] Pid: 4304, comm: kworker/0:0 Tainted: G W 3.8.0-rc3-s0i3-v3-test+ #9
[92146.548175] Call Trace:
[92146.548189] [<c10378e2>] warn_slowpath_common+0x72/0xa0
[92146.548227] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548263] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548270] [<c10379b3>] warn_slowpath_fmt+0x33/0x40
[92146.548307] [<f86398b4>] intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548344] [<f86399c2>] intel_disable_pipe+0x102/0x190 [i915]
[92146.548380] [<f8639ea4>] ? intel_disable_plane+0x64/0x80 [i915]
[92146.548417] [<f8639f7c>] i9xx_crtc_disable+0xbc/0x150 [i915]
[92146.548456] [<f863ebee>] intel_crtc_update_dpms+0x5e/0x90 [i915]
[92146.548493] [<f86437cf>] intel_modeset_setup_hw_state+0x42f/0x8f0 [i915]
[92146.548535] [<f8645b0b>] intel_lid_notify+0x9b/0xc0 [i915]
[92146.548543] [<c15610d3>] notifier_call_chain+0x43/0x60
[92146.548550] [<c105d1e1>] __blocking_notifier_call_chain+0x41/0x80
[92146.548556] [<c105d23f>] blocking_notifier_call_chain+0x1f/0x30
[92146.548563] [<c131a684>] acpi_lid_send_state+0x78/0xa4
[92146.548569] [<c131aa9e>] acpi_button_notify+0x3b/0xf1
[92146.548577] [<c12df56a>] ? acpi_os_execute+0x17/0x19
[92146.548582] [<c12e591a>] ? acpi_ec_sync_query+0xa5/0xbc
[92146.548589] [<c12e2b82>] acpi_device_notify+0x16/0x18
[92146.548595] [<c12f4904>] acpi_ev_notify_dispatch+0x38/0x4f
[92146.548600] [<c12df0e8>] acpi_os_execute_deferred+0x20/0x2b
[92146.548607] [<c1051208>] process_one_work+0x128/0x3f0
[92146.548613] [<c1564f73>] ? common_interrupt+0x33/0x38
[92146.548618] [<c104f8c0>] ? wake_up_worker+0x30/0x30
[92146.548624] [<c12df0c8>] ? acpi_os_wait_events_complete+0x1e/0x1e
[92146.548629] [<c10524f9>] worker_thread+0x119/0x3b0
[92146.548634] [<c10523e0>] ? manage_workers+0x240/0x240
[92146.548640] [<c1056e84>] kthread+0x94/0xa0
[92146.548647] [<c1060000>] ? ftrace_raw_output_sched_stat_runtime+0x70/0xf0
[92146.548652] [<c15649b7>] ret_from_kernel_thread+0x1b/0x28
[92146.548658] [<c1056df0>] ? kthread_create_on_node+0xc0/0xc0
three different modeset flags are introduced in this patch
MODESET_ON_LID_OPEN: do modeset on next lid open event
MODESET_DONE: modeset already done
MODESET_SUSPENDED: suspended, only do modeset when system is resumed
In this way,
1. when lid is closed, MODESET_ON_LID_OPEN is set so that
we'll do modeset on next lid open event.
2. when lid is opened, MODESET_DONE is set
so that duplicate lid open events will be ignored.
3. when system suspends, MODESET_SUSPENDED is set.
In this case, we will not do modeset on any lid events.
Plus, locking mechanism is also introduced to avoid racing.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-02-05 07:41:53 +00:00
|
|
|
mutex_lock(&dev_priv->modeset_restore_lock);
|
|
|
|
if (dev_priv->modeset_restore == MODESET_SUSPENDED)
|
|
|
|
goto exit;
|
drm/i915: Update LVDS connector status when receiving ACPI LID event
Dirk reports that nothing is displayed on LVDS when using ubuntu 9.1 after
close/reopen the LID. And I also reproduce this issue on another laptop.
After some tests and debug, it seems that it is related with that the
LVDS status is not updated in time in course of suspend/resume.
Now the LID state is used to check whether the LVDS is connected or
disconnected. And when the LID is closed, it means that the LVDS is
disconnected. When it is reopened, it means that the LVDS is connected.
At the same time on some distributions the LID event is also used to put
the system into suspend state. When the LID is closed, the system will enter
the suspend state. When the LID is reopened, the system will be resumed.
In such case when the LID is closed, user-space script will receive the LID
notification event and detect the LVDS as disconnected. Then the system will
enter the suspended state. When the LID is reopened, the system will be
resumed. As the LVDS status is not updated in course of resume, it will cause
that the LVDS connector is marked as unused and disabled. After the resume is
finished,user-space script will try to configure the display mode for LVDS.
But unfortunately as the LVDS status is not updated in time and it is still
marked as disconnected, the LVDS and its corresponding CRTC will be disabled
again in the function of drm_helper_disable_unused_functions after changing
mode for LVDS.
So we had better check and update the status of LVDS connector after receiving
the LID notication event. Then after the system is resumed from suspended
state, we can set the display mode for LVDS correctly.
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
Reported-by: Dirk Hohndel <hohndel@infradead.org>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
CC: stable@kernel.org
Signed-off-by: Eric Anholt <eric@anholt.net>
2009-12-11 01:26:11 +00:00
|
|
|
/*
|
|
|
|
* check and update the status of LVDS connector after receiving
|
|
|
|
* the LID nofication event.
|
|
|
|
*/
|
2012-10-19 11:51:45 +00:00
|
|
|
connector->status = connector->funcs->detect(connector, false);
|
2010-09-09 22:51:02 +00:00
|
|
|
|
2010-07-02 08:44:23 +00:00
|
|
|
/* Don't force modeset on machines where it causes a GPU lockup */
|
|
|
|
if (dmi_check_system(intel_no_modeset_on_lid))
|
i915: ignore lid open event when resuming
i915 driver needs to do modeset when
1. system resumes from sleep
2. lid is opened
In PM_SUSPEND_MEM state, all the GPEs are cleared when system resumes,
thus it is the i915_resume code does the modeset rather than intel_lid_notify().
But in PM_SUSPEND_FREEZE state, this will be broken because
system is still responsive to the lid events.
1. When we close the lid in Freeze state, intel_lid_notify() sets modeset_on_lid.
2. When we reopen the lid, intel_lid_notify() will do a modeset,
before the system is resumed.
here is the error log,
[92146.548074] WARNING: at drivers/gpu/drm/i915/intel_display.c:1028 intel_wait_for_pipe_off+0x184/0x190 [i915]()
[92146.548076] Hardware name: VGN-Z540N
[92146.548078] pipe_off wait timed out
[92146.548167] Modules linked in: hid_generic usbhid hid snd_hda_codec_realtek snd_hda_intel snd_hda_codec parport_pc snd_hwdep ppdev snd_pcm_oss i915 snd_mixer_oss snd_pcm arc4 iwldvm snd_seq_dummy mac80211 snd_seq_oss snd_seq_midi fbcon tileblit font bitblit softcursor drm_kms_helper snd_rawmidi snd_seq_midi_event coretemp drm snd_seq kvm btusb bluetooth snd_timer iwlwifi pcmcia tpm_infineon i2c_algo_bit joydev snd_seq_device intel_agp cfg80211 snd intel_gtt yenta_socket pcmcia_rsrc sony_laptop agpgart microcode psmouse tpm_tis serio_raw mxm_wmi soundcore snd_page_alloc tpm acpi_cpufreq lpc_ich pcmcia_core tpm_bios mperf processor lp parport firewire_ohci firewire_core crc_itu_t sdhci_pci sdhci thermal e1000e
[92146.548173] Pid: 4304, comm: kworker/0:0 Tainted: G W 3.8.0-rc3-s0i3-v3-test+ #9
[92146.548175] Call Trace:
[92146.548189] [<c10378e2>] warn_slowpath_common+0x72/0xa0
[92146.548227] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548263] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548270] [<c10379b3>] warn_slowpath_fmt+0x33/0x40
[92146.548307] [<f86398b4>] intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548344] [<f86399c2>] intel_disable_pipe+0x102/0x190 [i915]
[92146.548380] [<f8639ea4>] ? intel_disable_plane+0x64/0x80 [i915]
[92146.548417] [<f8639f7c>] i9xx_crtc_disable+0xbc/0x150 [i915]
[92146.548456] [<f863ebee>] intel_crtc_update_dpms+0x5e/0x90 [i915]
[92146.548493] [<f86437cf>] intel_modeset_setup_hw_state+0x42f/0x8f0 [i915]
[92146.548535] [<f8645b0b>] intel_lid_notify+0x9b/0xc0 [i915]
[92146.548543] [<c15610d3>] notifier_call_chain+0x43/0x60
[92146.548550] [<c105d1e1>] __blocking_notifier_call_chain+0x41/0x80
[92146.548556] [<c105d23f>] blocking_notifier_call_chain+0x1f/0x30
[92146.548563] [<c131a684>] acpi_lid_send_state+0x78/0xa4
[92146.548569] [<c131aa9e>] acpi_button_notify+0x3b/0xf1
[92146.548577] [<c12df56a>] ? acpi_os_execute+0x17/0x19
[92146.548582] [<c12e591a>] ? acpi_ec_sync_query+0xa5/0xbc
[92146.548589] [<c12e2b82>] acpi_device_notify+0x16/0x18
[92146.548595] [<c12f4904>] acpi_ev_notify_dispatch+0x38/0x4f
[92146.548600] [<c12df0e8>] acpi_os_execute_deferred+0x20/0x2b
[92146.548607] [<c1051208>] process_one_work+0x128/0x3f0
[92146.548613] [<c1564f73>] ? common_interrupt+0x33/0x38
[92146.548618] [<c104f8c0>] ? wake_up_worker+0x30/0x30
[92146.548624] [<c12df0c8>] ? acpi_os_wait_events_complete+0x1e/0x1e
[92146.548629] [<c10524f9>] worker_thread+0x119/0x3b0
[92146.548634] [<c10523e0>] ? manage_workers+0x240/0x240
[92146.548640] [<c1056e84>] kthread+0x94/0xa0
[92146.548647] [<c1060000>] ? ftrace_raw_output_sched_stat_runtime+0x70/0xf0
[92146.548652] [<c15649b7>] ret_from_kernel_thread+0x1b/0x28
[92146.548658] [<c1056df0>] ? kthread_create_on_node+0xc0/0xc0
three different modeset flags are introduced in this patch
MODESET_ON_LID_OPEN: do modeset on next lid open event
MODESET_DONE: modeset already done
MODESET_SUSPENDED: suspended, only do modeset when system is resumed
In this way,
1. when lid is closed, MODESET_ON_LID_OPEN is set so that
we'll do modeset on next lid open event.
2. when lid is opened, MODESET_DONE is set
so that duplicate lid open events will be ignored.
3. when system suspends, MODESET_SUSPENDED is set.
In this case, we will not do modeset on any lid events.
Plus, locking mechanism is also introduced to avoid racing.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-02-05 07:41:53 +00:00
|
|
|
goto exit;
|
2009-11-02 17:29:55 +00:00
|
|
|
if (!acpi_lid_open()) {
|
i915: ignore lid open event when resuming
i915 driver needs to do modeset when
1. system resumes from sleep
2. lid is opened
In PM_SUSPEND_MEM state, all the GPEs are cleared when system resumes,
thus it is the i915_resume code does the modeset rather than intel_lid_notify().
But in PM_SUSPEND_FREEZE state, this will be broken because
system is still responsive to the lid events.
1. When we close the lid in Freeze state, intel_lid_notify() sets modeset_on_lid.
2. When we reopen the lid, intel_lid_notify() will do a modeset,
before the system is resumed.
here is the error log,
[92146.548074] WARNING: at drivers/gpu/drm/i915/intel_display.c:1028 intel_wait_for_pipe_off+0x184/0x190 [i915]()
[92146.548076] Hardware name: VGN-Z540N
[92146.548078] pipe_off wait timed out
[92146.548167] Modules linked in: hid_generic usbhid hid snd_hda_codec_realtek snd_hda_intel snd_hda_codec parport_pc snd_hwdep ppdev snd_pcm_oss i915 snd_mixer_oss snd_pcm arc4 iwldvm snd_seq_dummy mac80211 snd_seq_oss snd_seq_midi fbcon tileblit font bitblit softcursor drm_kms_helper snd_rawmidi snd_seq_midi_event coretemp drm snd_seq kvm btusb bluetooth snd_timer iwlwifi pcmcia tpm_infineon i2c_algo_bit joydev snd_seq_device intel_agp cfg80211 snd intel_gtt yenta_socket pcmcia_rsrc sony_laptop agpgart microcode psmouse tpm_tis serio_raw mxm_wmi soundcore snd_page_alloc tpm acpi_cpufreq lpc_ich pcmcia_core tpm_bios mperf processor lp parport firewire_ohci firewire_core crc_itu_t sdhci_pci sdhci thermal e1000e
[92146.548173] Pid: 4304, comm: kworker/0:0 Tainted: G W 3.8.0-rc3-s0i3-v3-test+ #9
[92146.548175] Call Trace:
[92146.548189] [<c10378e2>] warn_slowpath_common+0x72/0xa0
[92146.548227] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548263] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548270] [<c10379b3>] warn_slowpath_fmt+0x33/0x40
[92146.548307] [<f86398b4>] intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548344] [<f86399c2>] intel_disable_pipe+0x102/0x190 [i915]
[92146.548380] [<f8639ea4>] ? intel_disable_plane+0x64/0x80 [i915]
[92146.548417] [<f8639f7c>] i9xx_crtc_disable+0xbc/0x150 [i915]
[92146.548456] [<f863ebee>] intel_crtc_update_dpms+0x5e/0x90 [i915]
[92146.548493] [<f86437cf>] intel_modeset_setup_hw_state+0x42f/0x8f0 [i915]
[92146.548535] [<f8645b0b>] intel_lid_notify+0x9b/0xc0 [i915]
[92146.548543] [<c15610d3>] notifier_call_chain+0x43/0x60
[92146.548550] [<c105d1e1>] __blocking_notifier_call_chain+0x41/0x80
[92146.548556] [<c105d23f>] blocking_notifier_call_chain+0x1f/0x30
[92146.548563] [<c131a684>] acpi_lid_send_state+0x78/0xa4
[92146.548569] [<c131aa9e>] acpi_button_notify+0x3b/0xf1
[92146.548577] [<c12df56a>] ? acpi_os_execute+0x17/0x19
[92146.548582] [<c12e591a>] ? acpi_ec_sync_query+0xa5/0xbc
[92146.548589] [<c12e2b82>] acpi_device_notify+0x16/0x18
[92146.548595] [<c12f4904>] acpi_ev_notify_dispatch+0x38/0x4f
[92146.548600] [<c12df0e8>] acpi_os_execute_deferred+0x20/0x2b
[92146.548607] [<c1051208>] process_one_work+0x128/0x3f0
[92146.548613] [<c1564f73>] ? common_interrupt+0x33/0x38
[92146.548618] [<c104f8c0>] ? wake_up_worker+0x30/0x30
[92146.548624] [<c12df0c8>] ? acpi_os_wait_events_complete+0x1e/0x1e
[92146.548629] [<c10524f9>] worker_thread+0x119/0x3b0
[92146.548634] [<c10523e0>] ? manage_workers+0x240/0x240
[92146.548640] [<c1056e84>] kthread+0x94/0xa0
[92146.548647] [<c1060000>] ? ftrace_raw_output_sched_stat_runtime+0x70/0xf0
[92146.548652] [<c15649b7>] ret_from_kernel_thread+0x1b/0x28
[92146.548658] [<c1056df0>] ? kthread_create_on_node+0xc0/0xc0
three different modeset flags are introduced in this patch
MODESET_ON_LID_OPEN: do modeset on next lid open event
MODESET_DONE: modeset already done
MODESET_SUSPENDED: suspended, only do modeset when system is resumed
In this way,
1. when lid is closed, MODESET_ON_LID_OPEN is set so that
we'll do modeset on next lid open event.
2. when lid is opened, MODESET_DONE is set
so that duplicate lid open events will be ignored.
3. when system suspends, MODESET_SUSPENDED is set.
In this case, we will not do modeset on any lid events.
Plus, locking mechanism is also introduced to avoid racing.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-02-05 07:41:53 +00:00
|
|
|
/* do modeset on next lid open event */
|
|
|
|
dev_priv->modeset_restore = MODESET_ON_LID_OPEN;
|
|
|
|
goto exit;
|
2009-09-14 17:58:48 +00:00
|
|
|
}
|
2009-09-10 22:28:03 +00:00
|
|
|
|
i915: ignore lid open event when resuming
i915 driver needs to do modeset when
1. system resumes from sleep
2. lid is opened
In PM_SUSPEND_MEM state, all the GPEs are cleared when system resumes,
thus it is the i915_resume code does the modeset rather than intel_lid_notify().
But in PM_SUSPEND_FREEZE state, this will be broken because
system is still responsive to the lid events.
1. When we close the lid in Freeze state, intel_lid_notify() sets modeset_on_lid.
2. When we reopen the lid, intel_lid_notify() will do a modeset,
before the system is resumed.
here is the error log,
[92146.548074] WARNING: at drivers/gpu/drm/i915/intel_display.c:1028 intel_wait_for_pipe_off+0x184/0x190 [i915]()
[92146.548076] Hardware name: VGN-Z540N
[92146.548078] pipe_off wait timed out
[92146.548167] Modules linked in: hid_generic usbhid hid snd_hda_codec_realtek snd_hda_intel snd_hda_codec parport_pc snd_hwdep ppdev snd_pcm_oss i915 snd_mixer_oss snd_pcm arc4 iwldvm snd_seq_dummy mac80211 snd_seq_oss snd_seq_midi fbcon tileblit font bitblit softcursor drm_kms_helper snd_rawmidi snd_seq_midi_event coretemp drm snd_seq kvm btusb bluetooth snd_timer iwlwifi pcmcia tpm_infineon i2c_algo_bit joydev snd_seq_device intel_agp cfg80211 snd intel_gtt yenta_socket pcmcia_rsrc sony_laptop agpgart microcode psmouse tpm_tis serio_raw mxm_wmi soundcore snd_page_alloc tpm acpi_cpufreq lpc_ich pcmcia_core tpm_bios mperf processor lp parport firewire_ohci firewire_core crc_itu_t sdhci_pci sdhci thermal e1000e
[92146.548173] Pid: 4304, comm: kworker/0:0 Tainted: G W 3.8.0-rc3-s0i3-v3-test+ #9
[92146.548175] Call Trace:
[92146.548189] [<c10378e2>] warn_slowpath_common+0x72/0xa0
[92146.548227] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548263] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548270] [<c10379b3>] warn_slowpath_fmt+0x33/0x40
[92146.548307] [<f86398b4>] intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548344] [<f86399c2>] intel_disable_pipe+0x102/0x190 [i915]
[92146.548380] [<f8639ea4>] ? intel_disable_plane+0x64/0x80 [i915]
[92146.548417] [<f8639f7c>] i9xx_crtc_disable+0xbc/0x150 [i915]
[92146.548456] [<f863ebee>] intel_crtc_update_dpms+0x5e/0x90 [i915]
[92146.548493] [<f86437cf>] intel_modeset_setup_hw_state+0x42f/0x8f0 [i915]
[92146.548535] [<f8645b0b>] intel_lid_notify+0x9b/0xc0 [i915]
[92146.548543] [<c15610d3>] notifier_call_chain+0x43/0x60
[92146.548550] [<c105d1e1>] __blocking_notifier_call_chain+0x41/0x80
[92146.548556] [<c105d23f>] blocking_notifier_call_chain+0x1f/0x30
[92146.548563] [<c131a684>] acpi_lid_send_state+0x78/0xa4
[92146.548569] [<c131aa9e>] acpi_button_notify+0x3b/0xf1
[92146.548577] [<c12df56a>] ? acpi_os_execute+0x17/0x19
[92146.548582] [<c12e591a>] ? acpi_ec_sync_query+0xa5/0xbc
[92146.548589] [<c12e2b82>] acpi_device_notify+0x16/0x18
[92146.548595] [<c12f4904>] acpi_ev_notify_dispatch+0x38/0x4f
[92146.548600] [<c12df0e8>] acpi_os_execute_deferred+0x20/0x2b
[92146.548607] [<c1051208>] process_one_work+0x128/0x3f0
[92146.548613] [<c1564f73>] ? common_interrupt+0x33/0x38
[92146.548618] [<c104f8c0>] ? wake_up_worker+0x30/0x30
[92146.548624] [<c12df0c8>] ? acpi_os_wait_events_complete+0x1e/0x1e
[92146.548629] [<c10524f9>] worker_thread+0x119/0x3b0
[92146.548634] [<c10523e0>] ? manage_workers+0x240/0x240
[92146.548640] [<c1056e84>] kthread+0x94/0xa0
[92146.548647] [<c1060000>] ? ftrace_raw_output_sched_stat_runtime+0x70/0xf0
[92146.548652] [<c15649b7>] ret_from_kernel_thread+0x1b/0x28
[92146.548658] [<c1056df0>] ? kthread_create_on_node+0xc0/0xc0
three different modeset flags are introduced in this patch
MODESET_ON_LID_OPEN: do modeset on next lid open event
MODESET_DONE: modeset already done
MODESET_SUSPENDED: suspended, only do modeset when system is resumed
In this way,
1. when lid is closed, MODESET_ON_LID_OPEN is set so that
we'll do modeset on next lid open event.
2. when lid is opened, MODESET_DONE is set
so that duplicate lid open events will be ignored.
3. when system suspends, MODESET_SUSPENDED is set.
In this case, we will not do modeset on any lid events.
Plus, locking mechanism is also introduced to avoid racing.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-02-05 07:41:53 +00:00
|
|
|
if (dev_priv->modeset_restore == MODESET_DONE)
|
|
|
|
goto exit;
|
2009-11-02 17:29:55 +00:00
|
|
|
|
2013-10-09 08:47:12 +00:00
|
|
|
/*
|
|
|
|
* Some old platform's BIOS love to wreak havoc while the lid is closed.
|
|
|
|
* We try to detect this here and undo any damage. The split for PCH
|
|
|
|
* platforms is rather conservative and a bit arbitrary expect that on
|
|
|
|
* those platforms VGA disabling requires actual legacy VGA I/O access,
|
|
|
|
* and as part of the cleanup in the hw state restore we also redisable
|
|
|
|
* the vga plane.
|
|
|
|
*/
|
2016-10-13 10:02:53 +00:00
|
|
|
if (!HAS_PCH_SPLIT(dev_priv))
|
2015-07-13 14:30:25 +00:00
|
|
|
intel_display_resume(dev);
|
2009-09-10 22:28:05 +00:00
|
|
|
|
i915: ignore lid open event when resuming
i915 driver needs to do modeset when
1. system resumes from sleep
2. lid is opened
In PM_SUSPEND_MEM state, all the GPEs are cleared when system resumes,
thus it is the i915_resume code does the modeset rather than intel_lid_notify().
But in PM_SUSPEND_FREEZE state, this will be broken because
system is still responsive to the lid events.
1. When we close the lid in Freeze state, intel_lid_notify() sets modeset_on_lid.
2. When we reopen the lid, intel_lid_notify() will do a modeset,
before the system is resumed.
here is the error log,
[92146.548074] WARNING: at drivers/gpu/drm/i915/intel_display.c:1028 intel_wait_for_pipe_off+0x184/0x190 [i915]()
[92146.548076] Hardware name: VGN-Z540N
[92146.548078] pipe_off wait timed out
[92146.548167] Modules linked in: hid_generic usbhid hid snd_hda_codec_realtek snd_hda_intel snd_hda_codec parport_pc snd_hwdep ppdev snd_pcm_oss i915 snd_mixer_oss snd_pcm arc4 iwldvm snd_seq_dummy mac80211 snd_seq_oss snd_seq_midi fbcon tileblit font bitblit softcursor drm_kms_helper snd_rawmidi snd_seq_midi_event coretemp drm snd_seq kvm btusb bluetooth snd_timer iwlwifi pcmcia tpm_infineon i2c_algo_bit joydev snd_seq_device intel_agp cfg80211 snd intel_gtt yenta_socket pcmcia_rsrc sony_laptop agpgart microcode psmouse tpm_tis serio_raw mxm_wmi soundcore snd_page_alloc tpm acpi_cpufreq lpc_ich pcmcia_core tpm_bios mperf processor lp parport firewire_ohci firewire_core crc_itu_t sdhci_pci sdhci thermal e1000e
[92146.548173] Pid: 4304, comm: kworker/0:0 Tainted: G W 3.8.0-rc3-s0i3-v3-test+ #9
[92146.548175] Call Trace:
[92146.548189] [<c10378e2>] warn_slowpath_common+0x72/0xa0
[92146.548227] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548263] [<f86398b4>] ? intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548270] [<c10379b3>] warn_slowpath_fmt+0x33/0x40
[92146.548307] [<f86398b4>] intel_wait_for_pipe_off+0x184/0x190 [i915]
[92146.548344] [<f86399c2>] intel_disable_pipe+0x102/0x190 [i915]
[92146.548380] [<f8639ea4>] ? intel_disable_plane+0x64/0x80 [i915]
[92146.548417] [<f8639f7c>] i9xx_crtc_disable+0xbc/0x150 [i915]
[92146.548456] [<f863ebee>] intel_crtc_update_dpms+0x5e/0x90 [i915]
[92146.548493] [<f86437cf>] intel_modeset_setup_hw_state+0x42f/0x8f0 [i915]
[92146.548535] [<f8645b0b>] intel_lid_notify+0x9b/0xc0 [i915]
[92146.548543] [<c15610d3>] notifier_call_chain+0x43/0x60
[92146.548550] [<c105d1e1>] __blocking_notifier_call_chain+0x41/0x80
[92146.548556] [<c105d23f>] blocking_notifier_call_chain+0x1f/0x30
[92146.548563] [<c131a684>] acpi_lid_send_state+0x78/0xa4
[92146.548569] [<c131aa9e>] acpi_button_notify+0x3b/0xf1
[92146.548577] [<c12df56a>] ? acpi_os_execute+0x17/0x19
[92146.548582] [<c12e591a>] ? acpi_ec_sync_query+0xa5/0xbc
[92146.548589] [<c12e2b82>] acpi_device_notify+0x16/0x18
[92146.548595] [<c12f4904>] acpi_ev_notify_dispatch+0x38/0x4f
[92146.548600] [<c12df0e8>] acpi_os_execute_deferred+0x20/0x2b
[92146.548607] [<c1051208>] process_one_work+0x128/0x3f0
[92146.548613] [<c1564f73>] ? common_interrupt+0x33/0x38
[92146.548618] [<c104f8c0>] ? wake_up_worker+0x30/0x30
[92146.548624] [<c12df0c8>] ? acpi_os_wait_events_complete+0x1e/0x1e
[92146.548629] [<c10524f9>] worker_thread+0x119/0x3b0
[92146.548634] [<c10523e0>] ? manage_workers+0x240/0x240
[92146.548640] [<c1056e84>] kthread+0x94/0xa0
[92146.548647] [<c1060000>] ? ftrace_raw_output_sched_stat_runtime+0x70/0xf0
[92146.548652] [<c15649b7>] ret_from_kernel_thread+0x1b/0x28
[92146.548658] [<c1056df0>] ? kthread_create_on_node+0xc0/0xc0
three different modeset flags are introduced in this patch
MODESET_ON_LID_OPEN: do modeset on next lid open event
MODESET_DONE: modeset already done
MODESET_SUSPENDED: suspended, only do modeset when system is resumed
In this way,
1. when lid is closed, MODESET_ON_LID_OPEN is set so that
we'll do modeset on next lid open event.
2. when lid is opened, MODESET_DONE is set
so that duplicate lid open events will be ignored.
3. when system suspends, MODESET_SUSPENDED is set.
In this case, we will not do modeset on any lid events.
Plus, locking mechanism is also introduced to avoid racing.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-02-05 07:41:53 +00:00
|
|
|
dev_priv->modeset_restore = MODESET_DONE;
|
|
|
|
|
|
|
|
exit:
|
|
|
|
mutex_unlock(&dev_priv->modeset_restore_lock);
|
2009-09-10 22:28:03 +00:00
|
|
|
return NOTIFY_OK;
|
|
|
|
}
|
|
|
|
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
/**
|
|
|
|
* intel_lvds_destroy - unregister and free LVDS structures
|
|
|
|
* @connector: connector to free
|
|
|
|
*
|
|
|
|
* Unregister the DDC bus for this connector then free the driver private
|
|
|
|
* structure.
|
|
|
|
*/
|
|
|
|
static void intel_lvds_destroy(struct drm_connector *connector)
|
|
|
|
{
|
2012-10-19 11:51:45 +00:00
|
|
|
struct intel_lvds_connector *lvds_connector =
|
|
|
|
to_lvds_connector(connector);
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2012-10-19 11:51:45 +00:00
|
|
|
if (lvds_connector->lid_notifier.notifier_call)
|
|
|
|
acpi_lid_notifier_unregister(&lvds_connector->lid_notifier);
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2012-10-19 11:51:52 +00:00
|
|
|
if (!IS_ERR_OR_NULL(lvds_connector->base.edid))
|
|
|
|
kfree(lvds_connector->base.edid);
|
|
|
|
|
2012-10-19 11:51:49 +00:00
|
|
|
intel_panel_fini(&lvds_connector->base.panel);
|
2011-08-12 10:11:33 +00:00
|
|
|
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
drm_connector_cleanup(connector);
|
|
|
|
kfree(connector);
|
|
|
|
}
|
|
|
|
|
|
|
|
static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs = {
|
|
|
|
.get_modes = intel_lvds_get_modes,
|
|
|
|
.mode_valid = intel_lvds_mode_valid,
|
2017-05-01 13:37:59 +00:00
|
|
|
.atomic_check = intel_digital_connector_atomic_check,
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static const struct drm_connector_funcs intel_lvds_connector_funcs = {
|
2015-08-05 10:37:06 +00:00
|
|
|
.dpms = drm_atomic_helper_connector_dpms,
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
.detect = intel_lvds_detect,
|
|
|
|
.fill_modes = drm_helper_probe_single_connector_modes,
|
2017-05-01 13:37:59 +00:00
|
|
|
.set_property = drm_atomic_helper_connector_set_property,
|
|
|
|
.atomic_get_property = intel_digital_connector_atomic_get_property,
|
|
|
|
.atomic_set_property = intel_digital_connector_atomic_set_property,
|
2016-06-24 13:00:15 +00:00
|
|
|
.late_register = intel_connector_register,
|
2016-06-17 10:40:33 +00:00
|
|
|
.early_unregister = intel_connector_unregister,
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
.destroy = intel_lvds_destroy,
|
2015-01-23 00:50:32 +00:00
|
|
|
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
|
2017-05-01 13:37:59 +00:00
|
|
|
.atomic_duplicate_state = intel_digital_connector_duplicate_state,
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static const struct drm_encoder_funcs intel_lvds_enc_funcs = {
|
2010-08-04 12:50:23 +00:00
|
|
|
.destroy = intel_encoder_destroy,
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
};
|
|
|
|
|
2014-08-27 16:41:19 +00:00
|
|
|
static int intel_no_lvds_dmi_callback(const struct dmi_system_id *id)
|
2009-05-05 14:00:25 +00:00
|
|
|
{
|
2012-04-01 11:16:49 +00:00
|
|
|
DRM_INFO("Skipping LVDS initialization for %s\n", id->ident);
|
2009-05-05 14:00:25 +00:00
|
|
|
return 1;
|
|
|
|
}
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2009-05-05 14:00:25 +00:00
|
|
|
/* These systems claim to have LVDS, but really don't */
|
2009-06-03 23:41:19 +00:00
|
|
|
static const struct dmi_system_id intel_no_lvds[] = {
|
2009-05-05 14:00:25 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Apple Mac Mini (Core series)",
|
|
|
|
.matches = {
|
2009-06-14 19:31:58 +00:00
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Apple"),
|
2009-05-05 14:00:25 +00:00
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Apple Mac Mini (Core 2 series)",
|
|
|
|
.matches = {
|
2009-06-14 19:31:58 +00:00
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Apple"),
|
2009-05-05 14:00:25 +00:00
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Macmini2,1"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "MSI IM-945GSE-A",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "MSI"),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "A9830IMS"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Dell Studio Hybrid",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Studio Hybrid 140g"),
|
|
|
|
},
|
|
|
|
},
|
2009-05-27 21:20:39 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
2011-07-26 14:23:54 +00:00
|
|
|
.ident = "Dell OptiPlex FX170",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex FX170"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
2009-05-27 21:20:39 +00:00
|
|
|
.ident = "AOpen Mini PC",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "AOpen"),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "i965GMx-IF"),
|
|
|
|
},
|
|
|
|
},
|
2009-07-13 20:26:48 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "AOpen Mini PC MP915",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
|
|
|
|
DMI_MATCH(DMI_BOARD_NAME, "i915GMx-F"),
|
|
|
|
},
|
|
|
|
},
|
2011-01-14 15:38:10 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "AOpen i915GMm-HFS",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
|
|
|
|
DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"),
|
|
|
|
},
|
|
|
|
},
|
2012-02-08 15:42:52 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "AOpen i45GMx-I",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
|
|
|
|
DMI_MATCH(DMI_BOARD_NAME, "i45GMx-I"),
|
|
|
|
},
|
|
|
|
},
|
2009-06-05 19:16:22 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Aopen i945GTt-VFA",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"),
|
|
|
|
},
|
|
|
|
},
|
2010-03-29 15:53:12 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Clientron U800",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Clientron"),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "U800"),
|
|
|
|
},
|
|
|
|
},
|
2011-06-04 13:39:21 +00:00
|
|
|
{
|
2012-01-10 18:03:55 +00:00
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Clientron E830",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Clientron"),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "E830"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
2011-06-04 13:39:21 +00:00
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Asus EeeBox PC EB1007",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "EB1007"),
|
|
|
|
},
|
|
|
|
},
|
2011-11-28 17:22:56 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Asus AT5NM10T-I",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
|
|
|
|
DMI_MATCH(DMI_BOARD_NAME, "AT5NM10T-I"),
|
|
|
|
},
|
|
|
|
},
|
2012-05-22 13:21:53 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
2013-04-16 18:00:28 +00:00
|
|
|
.ident = "Hewlett-Packard HP t5740",
|
2012-05-22 13:21:53 +00:00
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
2013-04-16 18:00:28 +00:00
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, " t5740"),
|
2012-05-22 13:21:53 +00:00
|
|
|
},
|
|
|
|
},
|
2012-02-09 14:35:21 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Hewlett-Packard t5745",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
2012-05-01 17:37:57 +00:00
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "hp t5745"),
|
2012-02-09 14:35:21 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Hewlett-Packard st5747",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
2012-05-01 17:37:57 +00:00
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "hp st5747"),
|
2012-02-09 14:35:21 +00:00
|
|
|
},
|
|
|
|
},
|
2012-03-07 17:36:35 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "MSI Wind Box DC500",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
|
|
|
|
DMI_MATCH(DMI_BOARD_NAME, "MS-7469"),
|
|
|
|
},
|
|
|
|
},
|
2012-08-24 11:56:31 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Gigabyte GA-D525TUD",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."),
|
|
|
|
DMI_MATCH(DMI_BOARD_NAME, "D525TUD"),
|
|
|
|
},
|
|
|
|
},
|
2012-10-18 20:07:01 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Supermicro X7SPA-H",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Supermicro"),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "X7SPA-H"),
|
|
|
|
},
|
|
|
|
},
|
2013-04-03 12:34:11 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Fujitsu Esprimo Q900",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Q900"),
|
|
|
|
},
|
|
|
|
},
|
2013-10-27 16:13:42 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Intel D410PT",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Intel"),
|
|
|
|
DMI_MATCH(DMI_BOARD_NAME, "D410PT"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Intel D425KT",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Intel"),
|
|
|
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "D425KT"),
|
|
|
|
},
|
|
|
|
},
|
2013-07-03 22:05:03 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Intel D510MO",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Intel"),
|
|
|
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "D510MO"),
|
|
|
|
},
|
|
|
|
},
|
2013-07-03 22:05:05 +00:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Intel D525MW",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Intel"),
|
|
|
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "D525MW"),
|
|
|
|
},
|
|
|
|
},
|
2009-05-05 14:00:25 +00:00
|
|
|
|
|
|
|
{ } /* terminating entry */
|
|
|
|
};
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2012-11-26 16:22:09 +00:00
|
|
|
static int intel_dual_link_lvds_callback(const struct dmi_system_id *id)
|
|
|
|
{
|
|
|
|
DRM_INFO("Forcing lvds to dual link mode on %s\n", id->ident);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const struct dmi_system_id intel_dual_link_lvds[] = {
|
|
|
|
{
|
|
|
|
.callback = intel_dual_link_lvds_callback,
|
drm/i915: Add missing MacBook Pro models with dual channel LVDS
Single channel LVDS maxes out at 112 MHz. The 15" pre-retina models
shipped with 1440x900 (106 MHz) by default or 1680x1050 (119 MHz)
as a BTO option, both versions used dual channel LVDS even though
the smaller one would have fit into a single channel.
Notes:
Bug report showing that the MacBookPro8,2 with 1440x900 uses dual
channel LVDS (this lead to it being hardcoded in intel_lvds.c by
Daniel Vetter with commit 618563e3945b9d0864154bab3c607865b557cecc):
https://bugzilla.kernel.org/show_bug.cgi?id=42842
If i915.lvds_channel_mode=2 is missing even though the machine needs
it, every other vertical line is white and consequently, only the left
half of the screen is visible (verified by myself on a MacBookPro9,1).
Forum posting concerning a MacBookPro6,2 with 1440x900, author is
using i915.lvds_channel_mode=2 on the kernel command line, proving
that the machine uses dual channels:
https://bbs.archlinux.org/viewtopic.php?id=185770
Chi Mei N154C6-L04 with 1440x900 is a replacement panel for all
MacBook Pro "A1286" models, and that model number encompasses the
MacBookPro6,2 / 8,2 / 9,1. Page 17 of the panel's datasheet shows it's
driven with dual channel LVDS:
http://www.ebay.com/itm/-/400690878560
http://www.everymac.com/ultimate-mac-lookup/?search_keywords=A1286
http://www.taopanel.com/chimei/datasheet/N154C6-L04.pdf
Those three 15" models, MacBookPro6,2 / 8,2 / 9,1, are the only ones
with i915 graphics and dual channel LVDS, so that list should be
complete. And the 8,2 is already in intel_lvds.c.
Possible motivation to use dual channel LVDS even on the 1440x900
models: Reduce the number of different parts, i.e. use identical logic
boards and display cabling on both versions and the only differing
component is the panel.
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Acked-by: Jani Nikula <jani.nikula@intel.com>
Cc: stable@vger.kernel.org
[Jani: included notes in the commit message for posterity]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
2015-05-04 13:06:49 +00:00
|
|
|
.ident = "Apple MacBook Pro 15\" (2010)",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro6,2"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.callback = intel_dual_link_lvds_callback,
|
|
|
|
.ident = "Apple MacBook Pro 15\" (2011)",
|
2012-11-26 16:22:09 +00:00
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro8,2"),
|
|
|
|
},
|
|
|
|
},
|
drm/i915: Add missing MacBook Pro models with dual channel LVDS
Single channel LVDS maxes out at 112 MHz. The 15" pre-retina models
shipped with 1440x900 (106 MHz) by default or 1680x1050 (119 MHz)
as a BTO option, both versions used dual channel LVDS even though
the smaller one would have fit into a single channel.
Notes:
Bug report showing that the MacBookPro8,2 with 1440x900 uses dual
channel LVDS (this lead to it being hardcoded in intel_lvds.c by
Daniel Vetter with commit 618563e3945b9d0864154bab3c607865b557cecc):
https://bugzilla.kernel.org/show_bug.cgi?id=42842
If i915.lvds_channel_mode=2 is missing even though the machine needs
it, every other vertical line is white and consequently, only the left
half of the screen is visible (verified by myself on a MacBookPro9,1).
Forum posting concerning a MacBookPro6,2 with 1440x900, author is
using i915.lvds_channel_mode=2 on the kernel command line, proving
that the machine uses dual channels:
https://bbs.archlinux.org/viewtopic.php?id=185770
Chi Mei N154C6-L04 with 1440x900 is a replacement panel for all
MacBook Pro "A1286" models, and that model number encompasses the
MacBookPro6,2 / 8,2 / 9,1. Page 17 of the panel's datasheet shows it's
driven with dual channel LVDS:
http://www.ebay.com/itm/-/400690878560
http://www.everymac.com/ultimate-mac-lookup/?search_keywords=A1286
http://www.taopanel.com/chimei/datasheet/N154C6-L04.pdf
Those three 15" models, MacBookPro6,2 / 8,2 / 9,1, are the only ones
with i915 graphics and dual channel LVDS, so that list should be
complete. And the 8,2 is already in intel_lvds.c.
Possible motivation to use dual channel LVDS even on the 1440x900
models: Reduce the number of different parts, i.e. use identical logic
boards and display cabling on both versions and the only differing
component is the panel.
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Acked-by: Jani Nikula <jani.nikula@intel.com>
Cc: stable@vger.kernel.org
[Jani: included notes in the commit message for posterity]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
2015-05-04 13:06:49 +00:00
|
|
|
{
|
|
|
|
.callback = intel_dual_link_lvds_callback,
|
|
|
|
.ident = "Apple MacBook Pro 15\" (2012)",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro9,1"),
|
|
|
|
},
|
|
|
|
},
|
2012-11-26 16:22:09 +00:00
|
|
|
{ } /* terminating entry */
|
|
|
|
};
|
|
|
|
|
2016-06-21 08:51:47 +00:00
|
|
|
struct intel_encoder *intel_get_lvds_encoder(struct drm_device *dev)
|
2012-11-26 16:22:10 +00:00
|
|
|
{
|
2016-06-21 08:51:47 +00:00
|
|
|
struct intel_encoder *intel_encoder;
|
2012-11-26 16:22:10 +00:00
|
|
|
|
2016-06-21 08:51:47 +00:00
|
|
|
for_each_intel_encoder(dev, intel_encoder)
|
|
|
|
if (intel_encoder->type == INTEL_OUTPUT_LVDS)
|
|
|
|
return intel_encoder;
|
2012-11-26 16:22:10 +00:00
|
|
|
|
2016-06-21 08:51:47 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool intel_is_dual_link_lvds(struct drm_device *dev)
|
|
|
|
{
|
|
|
|
struct intel_encoder *encoder = intel_get_lvds_encoder(dev);
|
2012-11-26 16:22:10 +00:00
|
|
|
|
2016-06-21 08:51:47 +00:00
|
|
|
return encoder && to_lvds_encoder(&encoder->base)->is_dual_link;
|
2012-11-26 16:22:10 +00:00
|
|
|
}
|
|
|
|
|
2012-09-11 12:12:25 +00:00
|
|
|
static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder)
|
2012-11-26 16:22:09 +00:00
|
|
|
{
|
2012-09-11 12:12:25 +00:00
|
|
|
struct drm_device *dev = lvds_encoder->base.base.dev;
|
2012-11-26 16:22:09 +00:00
|
|
|
unsigned int val;
|
2016-07-04 10:34:36 +00:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(dev);
|
2012-11-26 16:22:09 +00:00
|
|
|
|
|
|
|
/* use the module option value if specified */
|
2014-01-21 09:24:25 +00:00
|
|
|
if (i915.lvds_channel_mode > 0)
|
|
|
|
return i915.lvds_channel_mode == 2;
|
2012-11-26 16:22:09 +00:00
|
|
|
|
2015-04-12 19:10:35 +00:00
|
|
|
/* single channel LVDS is limited to 112 MHz */
|
|
|
|
if (lvds_encoder->attached_connector->base.panel.fixed_mode->clock
|
|
|
|
> 112999)
|
|
|
|
return true;
|
|
|
|
|
2012-11-26 16:22:09 +00:00
|
|
|
if (dmi_check_system(intel_dual_link_lvds))
|
|
|
|
return true;
|
|
|
|
|
2012-11-26 16:22:10 +00:00
|
|
|
/* BIOS should set the proper LVDS register value at boot, but
|
|
|
|
* in reality, it doesn't set the value when the lid is closed;
|
|
|
|
* we need to check "the value to be set" in VBT when LVDS
|
|
|
|
* register is uninitialized.
|
|
|
|
*/
|
2012-09-11 12:12:25 +00:00
|
|
|
val = I915_READ(lvds_encoder->reg);
|
2012-11-26 16:22:10 +00:00
|
|
|
if (!(val & ~(LVDS_PIPE_MASK | LVDS_DETECTED)))
|
2013-05-09 23:03:18 +00:00
|
|
|
val = dev_priv->vbt.bios_lvds_val;
|
2012-11-26 16:22:10 +00:00
|
|
|
|
2012-11-26 16:22:09 +00:00
|
|
|
return (val & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP;
|
|
|
|
}
|
|
|
|
|
2016-10-13 10:02:58 +00:00
|
|
|
static bool intel_lvds_supported(struct drm_i915_private *dev_priv)
|
2012-02-09 09:35:53 +00:00
|
|
|
{
|
|
|
|
/* With the introduction of the PCH we gained a dedicated
|
|
|
|
* LVDS presence pin, use it. */
|
2016-10-13 10:02:53 +00:00
|
|
|
if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv))
|
2012-02-09 09:35:53 +00:00
|
|
|
return true;
|
|
|
|
|
|
|
|
/* Otherwise LVDS was only attached to mobile products,
|
|
|
|
* except for the inglorious 830gm */
|
2016-10-13 10:02:58 +00:00
|
|
|
if (INTEL_GEN(dev_priv) <= 4 &&
|
|
|
|
IS_MOBILE(dev_priv) && !IS_I830(dev_priv))
|
2013-03-06 23:03:19 +00:00
|
|
|
return true;
|
|
|
|
|
|
|
|
return false;
|
2012-02-09 09:35:53 +00:00
|
|
|
}
|
|
|
|
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
/**
|
|
|
|
* intel_lvds_init - setup LVDS connectors on this device
|
|
|
|
* @dev: drm device
|
|
|
|
*
|
|
|
|
* Create the connector, register the LVDS DDC bus, and try to figure out what
|
|
|
|
* modes we can display on the LVDS panel (if present).
|
|
|
|
*/
|
2016-11-23 14:21:44 +00:00
|
|
|
void intel_lvds_init(struct drm_i915_private *dev_priv)
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
{
|
2016-11-23 14:21:44 +00:00
|
|
|
struct drm_device *dev = &dev_priv->drm;
|
2012-10-19 11:51:43 +00:00
|
|
|
struct intel_lvds_encoder *lvds_encoder;
|
2010-03-25 18:11:14 +00:00
|
|
|
struct intel_encoder *intel_encoder;
|
2012-10-19 11:51:44 +00:00
|
|
|
struct intel_lvds_connector *lvds_connector;
|
2010-03-29 08:40:50 +00:00
|
|
|
struct intel_connector *intel_connector;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
struct drm_connector *connector;
|
|
|
|
struct drm_encoder *encoder;
|
|
|
|
struct drm_display_mode *scan; /* *modes, *bios_mode; */
|
2012-10-19 11:51:50 +00:00
|
|
|
struct drm_display_mode *fixed_mode = NULL;
|
2014-02-11 08:56:36 +00:00
|
|
|
struct drm_display_mode *downclock_mode = NULL;
|
2012-10-19 11:51:52 +00:00
|
|
|
struct edid *edid;
|
2016-10-31 20:37:05 +00:00
|
|
|
struct intel_crtc *crtc;
|
drm/i915: Type safe register read/write
Make I915_READ and I915_WRITE more type safe by wrapping the register
offset in a struct. This should eliminate most of the fumbles we've had
with misplaced parens.
This only takes care of normal mmio registers. We could extend the idea
to other register types and define each with its own struct. That way
you wouldn't be able to accidentally pass the wrong thing to a specific
register access function.
The gpio_reg setup is probably the ugliest thing left. But I figure I'd
just leave it for now, and wait for some divine inspiration to strike
before making it nice.
As for the generated code, it's actually a bit better sometimes. Eg.
looking at i915_irq_handler(), we can see the following change:
lea 0x70024(%rdx,%rax,1),%r9d
mov $0x1,%edx
- movslq %r9d,%r9
- mov %r9,%rsi
- mov %r9,-0x58(%rbp)
- callq *0xd8(%rbx)
+ mov %r9d,%esi
+ mov %r9d,-0x48(%rbp)
callq *0xd8(%rbx)
So previously gcc thought the register offset might be signed and
decided to sign extend it, just in case. The rest appears to be
mostly just minor shuffling of instructions.
v2: i915_mmio_reg_{offset,equal,valid}() helpers added
s/_REG/_MMIO/ in the register defines
mo more switch statements left to worry about
ring_emit stuff got sorted in a prep patch
cmd parser, lrc context and w/a batch buildup also in prep patch
vgpu stuff cleaned up and moved to a prep patch
all other unrelated changes split out
v3: Rebased due to BXT DSI/BLC, MOCS, etc.
v4: Rebased due to churn, s/i915_mmio_reg_t/i915_reg_t/
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1447853606-2751-1-git-send-email-ville.syrjala@linux.intel.com
2015-11-18 13:33:26 +00:00
|
|
|
i915_reg_t lvds_reg;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
u32 lvds;
|
2010-09-24 00:15:02 +00:00
|
|
|
int pipe;
|
|
|
|
u8 pin;
|
2017-05-01 13:37:56 +00:00
|
|
|
u32 allowed_scalers;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2016-10-13 10:02:58 +00:00
|
|
|
if (!intel_lvds_supported(dev_priv))
|
2013-06-06 20:22:47 +00:00
|
|
|
return;
|
2012-02-09 09:35:53 +00:00
|
|
|
|
2009-05-05 14:00:25 +00:00
|
|
|
/* Skip init on machines we know falsely report LVDS */
|
|
|
|
if (dmi_check_system(intel_no_lvds))
|
2013-06-06 20:22:47 +00:00
|
|
|
return;
|
2009-02-04 10:05:41 +00:00
|
|
|
|
2016-10-13 10:02:53 +00:00
|
|
|
if (HAS_PCH_SPLIT(dev_priv))
|
2015-09-18 17:03:45 +00:00
|
|
|
lvds_reg = PCH_LVDS;
|
|
|
|
else
|
|
|
|
lvds_reg = LVDS;
|
|
|
|
|
|
|
|
lvds = I915_READ(lvds_reg);
|
|
|
|
|
2016-10-13 10:02:53 +00:00
|
|
|
if (HAS_PCH_SPLIT(dev_priv)) {
|
2015-09-18 17:03:45 +00:00
|
|
|
if ((lvds & LVDS_DETECTED) == 0)
|
2013-06-06 20:22:47 +00:00
|
|
|
return;
|
2016-03-24 15:50:20 +00:00
|
|
|
if (dev_priv->vbt.edp.support) {
|
2009-10-09 03:39:41 +00:00
|
|
|
DRM_DEBUG_KMS("disable LVDS for eDP support\n");
|
2013-06-06 20:22:47 +00:00
|
|
|
return;
|
2009-07-23 17:00:32 +00:00
|
|
|
}
|
2009-06-05 07:38:44 +00:00
|
|
|
}
|
|
|
|
|
2015-06-19 12:57:43 +00:00
|
|
|
pin = GMBUS_PIN_PANEL;
|
2016-03-16 10:43:30 +00:00
|
|
|
if (!intel_bios_is_lvds_present(dev_priv, &pin)) {
|
2015-09-18 17:03:45 +00:00
|
|
|
if ((lvds & LVDS_PORT_EN) == 0) {
|
2015-06-19 12:57:43 +00:00
|
|
|
DRM_DEBUG_KMS("LVDS is not present in VBT\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
DRM_DEBUG_KMS("LVDS is not present in VBT, but enabled anyway\n");
|
|
|
|
}
|
|
|
|
|
2013-09-19 10:18:32 +00:00
|
|
|
lvds_encoder = kzalloc(sizeof(*lvds_encoder), GFP_KERNEL);
|
2012-10-19 11:51:43 +00:00
|
|
|
if (!lvds_encoder)
|
2013-06-06 20:22:47 +00:00
|
|
|
return;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2013-09-19 10:18:32 +00:00
|
|
|
lvds_connector = kzalloc(sizeof(*lvds_connector), GFP_KERNEL);
|
2012-10-19 11:51:44 +00:00
|
|
|
if (!lvds_connector) {
|
2012-10-19 11:51:43 +00:00
|
|
|
kfree(lvds_encoder);
|
2013-06-06 20:22:47 +00:00
|
|
|
return;
|
2010-03-29 08:40:50 +00:00
|
|
|
}
|
|
|
|
|
2015-04-10 07:59:10 +00:00
|
|
|
if (intel_connector_init(&lvds_connector->base) < 0) {
|
|
|
|
kfree(lvds_connector);
|
|
|
|
kfree(lvds_encoder);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-10-19 11:51:47 +00:00
|
|
|
lvds_encoder->attached_connector = lvds_connector;
|
|
|
|
|
2012-10-19 11:51:43 +00:00
|
|
|
intel_encoder = &lvds_encoder->base;
|
2010-09-09 14:14:28 +00:00
|
|
|
encoder = &intel_encoder->base;
|
2012-10-19 11:51:44 +00:00
|
|
|
intel_connector = &lvds_connector->base;
|
2010-08-04 12:50:23 +00:00
|
|
|
connector = &intel_connector->base;
|
2010-03-29 08:40:50 +00:00
|
|
|
drm_connector_init(dev, &intel_connector->base, &intel_lvds_connector_funcs,
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
DRM_MODE_CONNECTOR_LVDS);
|
|
|
|
|
2010-09-09 14:14:28 +00:00
|
|
|
drm_encoder_init(dev, &intel_encoder->base, &intel_lvds_enc_funcs,
|
2016-05-27 17:59:24 +00:00
|
|
|
DRM_MODE_ENCODER_LVDS, "LVDS");
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2012-06-30 13:31:28 +00:00
|
|
|
intel_encoder->enable = intel_enable_lvds;
|
2013-06-05 11:34:30 +00:00
|
|
|
intel_encoder->pre_enable = intel_pre_enable_lvds;
|
2013-03-26 23:44:52 +00:00
|
|
|
intel_encoder->compute_config = intel_lvds_compute_config;
|
2015-07-02 14:42:46 +00:00
|
|
|
if (HAS_PCH_SPLIT(dev_priv)) {
|
|
|
|
intel_encoder->disable = pch_disable_lvds;
|
|
|
|
intel_encoder->post_disable = pch_post_disable_lvds;
|
|
|
|
} else {
|
|
|
|
intel_encoder->disable = gmch_disable_lvds;
|
|
|
|
}
|
2012-07-02 19:09:00 +00:00
|
|
|
intel_encoder->get_hw_state = intel_lvds_get_hw_state;
|
2013-05-15 00:08:26 +00:00
|
|
|
intel_encoder->get_config = intel_lvds_get_config;
|
2012-07-02 19:09:00 +00:00
|
|
|
intel_connector->get_hw_state = intel_connector_get_hw_state;
|
2012-06-30 13:31:28 +00:00
|
|
|
|
2010-09-09 15:20:55 +00:00
|
|
|
intel_connector_attach_encoder(intel_connector, intel_encoder);
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
2016-09-20 01:24:38 +00:00
|
|
|
intel_encoder->type = INTEL_OUTPUT_LVDS;
|
2017-02-22 06:34:27 +00:00
|
|
|
intel_encoder->power_domain = POWER_DOMAIN_PORT_OTHER;
|
2016-09-20 01:24:38 +00:00
|
|
|
intel_encoder->port = PORT_NONE;
|
2014-03-03 14:15:28 +00:00
|
|
|
intel_encoder->cloneable = 0;
|
2016-10-13 10:02:53 +00:00
|
|
|
if (HAS_PCH_SPLIT(dev_priv))
|
2011-09-02 19:54:37 +00:00
|
|
|
intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
|
2016-10-13 10:03:10 +00:00
|
|
|
else if (IS_GEN4(dev_priv))
|
2012-06-05 08:07:11 +00:00
|
|
|
intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
|
2011-09-02 19:54:37 +00:00
|
|
|
else
|
|
|
|
intel_encoder->crtc_mask = (1 << 1);
|
|
|
|
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
drm_connector_helper_add(connector, &intel_lvds_connector_helper_funcs);
|
|
|
|
connector->display_info.subpixel_order = SubPixelHorizontalRGB;
|
|
|
|
connector->interlace_allowed = false;
|
|
|
|
connector->doublescan_allowed = false;
|
|
|
|
|
2015-09-18 17:03:45 +00:00
|
|
|
lvds_encoder->reg = lvds_reg;
|
2012-09-11 12:12:25 +00:00
|
|
|
|
2009-06-22 07:31:25 +00:00
|
|
|
/* create the scaling mode property */
|
2017-05-01 13:37:56 +00:00
|
|
|
allowed_scalers = BIT(DRM_MODE_SCALE_ASPECT);
|
|
|
|
allowed_scalers |= BIT(DRM_MODE_SCALE_FULLSCREEN);
|
|
|
|
allowed_scalers |= BIT(DRM_MODE_SCALE_CENTER);
|
|
|
|
drm_connector_attach_scaling_mode_property(connector, allowed_scalers);
|
2017-05-01 13:37:55 +00:00
|
|
|
connector->state->scaling_mode = DRM_MODE_SCALE_ASPECT;
|
2016-08-10 11:07:31 +00:00
|
|
|
|
|
|
|
intel_lvds_pps_get_hw_state(dev_priv, &lvds_encoder->init_pps);
|
|
|
|
lvds_encoder->init_lvds_val = lvds;
|
|
|
|
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
/*
|
|
|
|
* LVDS discovery:
|
|
|
|
* 1) check for EDID on DDC
|
|
|
|
* 2) check for VBT data
|
|
|
|
* 3) check to see if LVDS is already on
|
|
|
|
* if none of the above, no panel
|
|
|
|
* 4) make sure lid is open
|
|
|
|
* if closed, act like it's not there for now
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Attempt to get the fixed panel mode from DDC. Assume that the
|
|
|
|
* preferred mode is the right one.
|
|
|
|
*/
|
2014-03-21 22:22:35 +00:00
|
|
|
mutex_lock(&dev->mode_config.mutex);
|
2016-01-11 19:09:20 +00:00
|
|
|
if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC)
|
|
|
|
edid = drm_get_edid_switcheroo(connector,
|
|
|
|
intel_gmbus_get_adapter(dev_priv, pin));
|
|
|
|
else
|
|
|
|
edid = drm_get_edid(connector,
|
|
|
|
intel_gmbus_get_adapter(dev_priv, pin));
|
2012-10-19 11:51:52 +00:00
|
|
|
if (edid) {
|
|
|
|
if (drm_add_edid_modes(connector, edid)) {
|
2010-11-08 23:20:52 +00:00
|
|
|
drm_mode_connector_update_edid_property(connector,
|
2012-10-19 11:51:52 +00:00
|
|
|
edid);
|
2010-11-08 23:20:52 +00:00
|
|
|
} else {
|
2012-10-19 11:51:52 +00:00
|
|
|
kfree(edid);
|
|
|
|
edid = ERR_PTR(-EINVAL);
|
2010-11-08 23:20:52 +00:00
|
|
|
}
|
2012-10-19 11:51:52 +00:00
|
|
|
} else {
|
|
|
|
edid = ERR_PTR(-ENOENT);
|
2010-11-08 23:20:52 +00:00
|
|
|
}
|
2012-10-19 11:51:52 +00:00
|
|
|
lvds_connector->base.edid = edid;
|
|
|
|
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
list_for_each_entry(scan, &connector->probed_modes, head) {
|
|
|
|
if (scan->type & DRM_MODE_TYPE_PREFERRED) {
|
2012-11-21 16:14:03 +00:00
|
|
|
DRM_DEBUG_KMS("using preferred mode from EDID: ");
|
|
|
|
drm_mode_debug_printmodeline(scan);
|
|
|
|
|
2012-10-19 11:51:50 +00:00
|
|
|
fixed_mode = drm_mode_duplicate(dev, scan);
|
2015-06-18 08:30:23 +00:00
|
|
|
if (fixed_mode)
|
2012-11-21 16:14:03 +00:00
|
|
|
goto out;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Failed to get EDID, what about VBT? */
|
2013-05-09 23:03:18 +00:00
|
|
|
if (dev_priv->vbt.lfp_lvds_vbt_mode) {
|
2012-11-21 16:14:03 +00:00
|
|
|
DRM_DEBUG_KMS("using mode from VBT: ");
|
2013-05-09 23:03:18 +00:00
|
|
|
drm_mode_debug_printmodeline(dev_priv->vbt.lfp_lvds_vbt_mode);
|
2012-11-21 16:14:03 +00:00
|
|
|
|
2013-05-09 23:03:18 +00:00
|
|
|
fixed_mode = drm_mode_duplicate(dev, dev_priv->vbt.lfp_lvds_vbt_mode);
|
2012-10-19 11:51:50 +00:00
|
|
|
if (fixed_mode) {
|
|
|
|
fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
|
2016-05-31 09:08:34 +00:00
|
|
|
connector->display_info.width_mm = fixed_mode->width_mm;
|
|
|
|
connector->display_info.height_mm = fixed_mode->height_mm;
|
2009-01-14 18:53:36 +00:00
|
|
|
goto out;
|
|
|
|
}
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If we didn't get EDID, try checking if the panel is already turned
|
|
|
|
* on. If so, assume that whatever is currently programmed is the
|
|
|
|
* correct mode.
|
|
|
|
*/
|
2009-06-05 07:38:44 +00:00
|
|
|
|
2009-12-03 22:14:42 +00:00
|
|
|
/* Ironlake: FIXME if still fail, not try pipe mode now */
|
2016-10-13 10:02:53 +00:00
|
|
|
if (HAS_PCH_SPLIT(dev_priv))
|
2009-06-05 07:38:44 +00:00
|
|
|
goto failed;
|
|
|
|
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
pipe = (lvds & LVDS_PIPEB_SELECT) ? 1 : 0;
|
2016-10-31 20:37:09 +00:00
|
|
|
crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
|
|
|
if (crtc && (lvds & LVDS_PORT_EN)) {
|
2016-10-31 20:37:05 +00:00
|
|
|
fixed_mode = intel_crtc_mode_get(dev, &crtc->base);
|
2012-10-19 11:51:50 +00:00
|
|
|
if (fixed_mode) {
|
2012-11-21 16:14:03 +00:00
|
|
|
DRM_DEBUG_KMS("using current (BIOS) mode: ");
|
|
|
|
drm_mode_debug_printmodeline(fixed_mode);
|
2012-10-19 11:51:50 +00:00
|
|
|
fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
|
2009-02-04 10:05:41 +00:00
|
|
|
goto out;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If we still don't have a mode after all that, give up. */
|
2012-10-19 11:51:50 +00:00
|
|
|
if (!fixed_mode)
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
goto failed;
|
|
|
|
|
|
|
|
out:
|
2014-03-21 22:22:35 +00:00
|
|
|
mutex_unlock(&dev->mode_config.mutex);
|
|
|
|
|
2015-04-12 19:10:35 +00:00
|
|
|
intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
|
2016-06-24 13:00:13 +00:00
|
|
|
intel_panel_setup_backlight(connector, INVALID_PIPE);
|
2015-04-12 19:10:35 +00:00
|
|
|
|
2012-09-11 12:12:25 +00:00
|
|
|
lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder);
|
2012-11-26 16:22:10 +00:00
|
|
|
DRM_DEBUG_KMS("detected %s-link lvds configuration\n",
|
|
|
|
lvds_encoder->is_dual_link ? "dual" : "single");
|
|
|
|
|
2015-11-05 08:30:50 +00:00
|
|
|
lvds_encoder->a3_power = lvds & LVDS_A3_POWER_MASK;
|
2014-07-04 16:38:36 +00:00
|
|
|
|
2012-10-19 11:51:45 +00:00
|
|
|
lvds_connector->lid_notifier.notifier_call = intel_lid_notify;
|
|
|
|
if (acpi_lid_notifier_register(&lvds_connector->lid_notifier)) {
|
2009-10-09 03:39:41 +00:00
|
|
|
DRM_DEBUG_KMS("lid notifier registration failed\n");
|
2012-10-19 11:51:45 +00:00
|
|
|
lvds_connector->lid_notifier.notifier_call = NULL;
|
2009-09-10 22:28:03 +00:00
|
|
|
}
|
2011-08-12 10:11:33 +00:00
|
|
|
|
2013-06-06 20:22:47 +00:00
|
|
|
return;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
|
|
|
|
failed:
|
2014-03-21 22:22:35 +00:00
|
|
|
mutex_unlock(&dev->mode_config.mutex);
|
|
|
|
|
2009-07-20 05:48:04 +00:00
|
|
|
DRM_DEBUG_KMS("No LVDS modes found, disabling.\n");
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
drm_connector_cleanup(connector);
|
2009-11-17 09:19:23 +00:00
|
|
|
drm_encoder_cleanup(encoder);
|
2012-10-19 11:51:43 +00:00
|
|
|
kfree(lvds_encoder);
|
2012-10-19 11:51:44 +00:00
|
|
|
kfree(lvds_connector);
|
2013-06-06 20:22:47 +00:00
|
|
|
return;
|
DRM: i915: add mode setting support
This commit adds i915 driver support for the DRM mode setting APIs.
Currently, VGA, LVDS, SDVO DVI & VGA, TV and DVO LVDS outputs are
supported. HDMI, DisplayPort and additional SDVO output support will
follow.
Support for the mode setting code is controlled by the new 'modeset'
module option. A new config option, CONFIG_DRM_I915_KMS controls the
default behavior, and whether a PCI ID list is built into the module for
use by user level module utilities.
Note that if mode setting is enabled, user level drivers that access
display registers directly or that don't use the kernel graphics memory
manager will likely corrupt kernel graphics memory, disrupt output
configuration (possibly leading to hangs and/or blank displays), and
prevent panic/oops messages from appearing. So use caution when
enabling this code; be sure your user level code supports the new
interfaces.
A new SysRq key, 'g', provides emergency support for switching back to
the kernel's framebuffer console; which is useful for testing.
Co-authors: Dave Airlie <airlied@linux.ie>, Hong Liu <hong.liu@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2008-11-07 22:24:08 +00:00
|
|
|
}
|