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-08 05:24:08 +07: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-11 05:28:03 +07:00
|
|
|
#include <acpi/button.h>
|
2019-04-05 18:00:06 +07:00
|
|
|
#include <linux/acpi.h>
|
2009-02-04 17:05:41 +07: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-08 05:24:08 +07: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 15:04:11 +07:00
|
|
|
#include <linux/slab.h>
|
2016-01-12 02:09:20 +07:00
|
|
|
#include <linux/vga_switcheroo.h>
|
2019-04-05 18:00:06 +07:00
|
|
|
|
2015-01-23 07:50:32 +07:00
|
|
|
#include <drm/drm_atomic_helper.h>
|
2012-10-03 00:01:07 +07:00
|
|
|
#include <drm/drm_crtc.h>
|
|
|
|
#include <drm/drm_edid.h>
|
|
|
|
#include <drm/i915_drm.h>
|
2019-04-05 18:00:06 +07: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-08 05:24:08 +07:00
|
|
|
#include "i915_drv.h"
|
2019-04-05 18:00:06 +07:00
|
|
|
#include "intel_connector.h"
|
|
|
|
#include "intel_drv.h"
|
2019-04-05 18:00:22 +07:00
|
|
|
#include "intel_lvds.h"
|
2019-04-05 18:00:14 +07:00
|
|
|
#include "intel_panel.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-08 05:24:08 +07:00
|
|
|
|
2009-06-22 14:31:25 +07:00
|
|
|
/* Private structure for the integrated LVDS support */
|
2016-08-10 18:07:31 +07: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 18:51:43 +07:00
|
|
|
struct intel_lvds_encoder {
|
2010-08-04 19:50:23 +07:00
|
|
|
struct intel_encoder base;
|
2010-09-12 23:34:41 +07:00
|
|
|
|
2012-11-26 23:22:10 +07: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 20:33:26 +07:00
|
|
|
i915_reg_t reg;
|
2014-07-04 23:38:36 +07:00
|
|
|
u32 a3_power;
|
2010-09-12 23:34:41 +07:00
|
|
|
|
2016-08-10 18:07:31 +07:00
|
|
|
struct intel_lvds_pps init_pps;
|
|
|
|
u32 init_lvds_val;
|
|
|
|
|
2018-10-10 04:09:16 +07:00
|
|
|
struct intel_connector *attached_connector;
|
2009-06-22 14:31:25 +07:00
|
|
|
};
|
|
|
|
|
2012-10-19 18:51:43 +07:00
|
|
|
static struct intel_lvds_encoder *to_lvds_encoder(struct drm_encoder *encoder)
|
2010-08-04 19:50:23 +07:00
|
|
|
{
|
2012-10-19 18:51:43 +07:00
|
|
|
return container_of(encoder, struct intel_lvds_encoder, base.base);
|
2010-08-04 19:50:23 +07:00
|
|
|
}
|
|
|
|
|
2018-05-15 01:28:27 +07:00
|
|
|
bool intel_lvds_port_enabled(struct drm_i915_private *dev_priv,
|
|
|
|
i915_reg_t lvds_reg, enum pipe *pipe)
|
|
|
|
{
|
|
|
|
u32 val;
|
|
|
|
|
|
|
|
val = I915_READ(lvds_reg);
|
|
|
|
|
|
|
|
/* asserts want to know the pipe even if the port is disabled */
|
|
|
|
if (HAS_PCH_CPT(dev_priv))
|
|
|
|
*pipe = (val & LVDS_PIPE_SEL_MASK_CPT) >> LVDS_PIPE_SEL_SHIFT_CPT;
|
|
|
|
else
|
|
|
|
*pipe = (val & LVDS_PIPE_SEL_MASK) >> LVDS_PIPE_SEL_SHIFT;
|
|
|
|
|
|
|
|
return val & LVDS_PORT_EN;
|
|
|
|
}
|
|
|
|
|
2012-07-03 02:09:00 +07:00
|
|
|
static bool intel_lvds_get_hw_state(struct intel_encoder *encoder,
|
|
|
|
enum pipe *pipe)
|
|
|
|
{
|
2018-05-15 01:28:27 +07:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
2012-09-11 19:12:25 +07:00
|
|
|
struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
|
2019-01-14 21:21:24 +07:00
|
|
|
intel_wakeref_t wakeref;
|
2016-02-12 23:55:21 +07:00
|
|
|
bool ret;
|
2012-07-03 02:09:00 +07:00
|
|
|
|
2019-01-14 21:21:24 +07:00
|
|
|
wakeref = intel_display_power_get_if_enabled(dev_priv,
|
|
|
|
encoder->power_domain);
|
|
|
|
if (!wakeref)
|
2014-07-04 23:38:35 +07:00
|
|
|
return false;
|
|
|
|
|
2018-05-15 01:28:27 +07:00
|
|
|
ret = intel_lvds_port_enabled(dev_priv, lvds_encoder->reg, pipe);
|
2016-02-12 23:55:21 +07:00
|
|
|
|
2019-01-14 21:21:24 +07:00
|
|
|
intel_display_power_put(dev_priv, encoder->power_domain, wakeref);
|
2016-02-12 23:55:21 +07:00
|
|
|
|
|
|
|
return ret;
|
2012-07-03 02:09:00 +07:00
|
|
|
}
|
|
|
|
|
2013-05-15 07:08:26 +07:00
|
|
|
static void intel_lvds_get_config(struct intel_encoder *encoder,
|
2015-01-15 19:55:21 +07:00
|
|
|
struct intel_crtc_state *pipe_config)
|
2013-05-15 07:08:26 +07:00
|
|
|
{
|
2016-11-16 15:55:40 +07:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
2015-09-19 00:03:45 +07:00
|
|
|
struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
|
|
|
|
u32 tmp, flags = 0;
|
2013-05-15 07:08:26 +07:00
|
|
|
|
2017-10-28 02:31:23 +07:00
|
|
|
pipe_config->output_types |= BIT(INTEL_OUTPUT_LVDS);
|
|
|
|
|
2015-09-19 00:03:45 +07:00
|
|
|
tmp = I915_READ(lvds_encoder->reg);
|
2013-05-15 07:08:26 +07: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 19:55:22 +07:00
|
|
|
pipe_config->base.adjusted_mode.flags |= flags;
|
2013-07-11 18:35:40 +07:00
|
|
|
|
2016-11-16 15:55:40 +07:00
|
|
|
if (INTEL_GEN(dev_priv) < 5)
|
2016-04-29 19:34:02 +07:00
|
|
|
pipe_config->gmch_pfit.lvds_border_bits =
|
|
|
|
tmp & LVDS_BORDER_ENABLE;
|
|
|
|
|
2014-07-10 03:35:53 +07:00
|
|
|
/* gen2/3 store dither state in pfit control, needs to match */
|
2016-11-16 15:55:40 +07:00
|
|
|
if (INTEL_GEN(dev_priv) < 4) {
|
2014-07-10 03:35:53 +07:00
|
|
|
tmp = I915_READ(PFIT_CONTROL);
|
|
|
|
|
|
|
|
pipe_config->gmch_pfit.control |= tmp & PANEL_8TO6_DITHER_ENABLE;
|
|
|
|
}
|
|
|
|
|
2016-02-18 02:41:09 +07:00
|
|
|
pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
|
2013-05-15 07:08:26 +07:00
|
|
|
}
|
|
|
|
|
2016-08-10 18:07:31 +07: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));
|
2019-03-15 20:56:19 +07:00
|
|
|
pps->port = REG_FIELD_GET(PANEL_PORT_SELECT_MASK, val);
|
|
|
|
pps->t1_t2 = REG_FIELD_GET(PANEL_POWER_UP_DELAY_MASK, val);
|
|
|
|
pps->t5 = REG_FIELD_GET(PANEL_LIGHT_ON_DELAY_MASK, val);
|
2016-08-10 18:07:31 +07:00
|
|
|
|
|
|
|
val = I915_READ(PP_OFF_DELAYS(0));
|
2019-03-15 20:56:19 +07:00
|
|
|
pps->t3 = REG_FIELD_GET(PANEL_POWER_DOWN_DELAY_MASK, val);
|
|
|
|
pps->tx = REG_FIELD_GET(PANEL_LIGHT_OFF_DELAY_MASK, val);
|
2016-08-10 18:07:31 +07:00
|
|
|
|
|
|
|
val = I915_READ(PP_DIVISOR(0));
|
2019-03-15 20:56:19 +07:00
|
|
|
pps->divider = REG_FIELD_GET(PP_REFERENCE_DIVIDER_MASK, val);
|
|
|
|
val = REG_FIELD_GET(PANEL_POWER_CYCLE_DELAY_MASK, val);
|
2016-08-10 18:07:31 +07:00
|
|
|
/*
|
|
|
|
* 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;
|
|
|
|
|
2018-02-10 04:58:46 +07:00
|
|
|
if (INTEL_GEN(dev_priv) <= 4 &&
|
2016-08-10 18:07:31 +07:00
|
|
|
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);
|
|
|
|
|
2019-03-15 20:56:19 +07:00
|
|
|
I915_WRITE(PP_ON_DELAYS(0),
|
|
|
|
REG_FIELD_PREP(PANEL_PORT_SELECT_MASK, pps->port) |
|
|
|
|
REG_FIELD_PREP(PANEL_POWER_UP_DELAY_MASK, pps->t1_t2) |
|
|
|
|
REG_FIELD_PREP(PANEL_LIGHT_ON_DELAY_MASK, pps->t5));
|
2016-08-10 18:07:31 +07:00
|
|
|
|
2019-03-15 20:56:19 +07:00
|
|
|
I915_WRITE(PP_OFF_DELAYS(0),
|
|
|
|
REG_FIELD_PREP(PANEL_POWER_DOWN_DELAY_MASK, pps->t3) |
|
|
|
|
REG_FIELD_PREP(PANEL_LIGHT_OFF_DELAY_MASK, pps->tx));
|
|
|
|
|
|
|
|
I915_WRITE(PP_DIVISOR(0),
|
|
|
|
REG_FIELD_PREP(PP_REFERENCE_DIVIDER_MASK, pps->divider) |
|
|
|
|
REG_FIELD_PREP(PANEL_POWER_CYCLE_DELAY_MASK,
|
|
|
|
DIV_ROUND_UP(pps->t4, 1000) + 1));
|
2016-08-10 18:07:31 +07:00
|
|
|
}
|
|
|
|
|
2016-08-09 22:04:04 +07:00
|
|
|
static void intel_pre_enable_lvds(struct intel_encoder *encoder,
|
2017-08-18 20:49:58 +07:00
|
|
|
const struct intel_crtc_state *pipe_config,
|
|
|
|
const struct drm_connector_state *conn_state)
|
2012-11-26 23:22:12 +07:00
|
|
|
{
|
|
|
|
struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
|
2016-08-09 22:04:11 +07: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-17 02:42:39 +07:00
|
|
|
int pipe = crtc->pipe;
|
2012-11-26 23:22:12 +07:00
|
|
|
u32 temp;
|
|
|
|
|
2016-08-09 22:04:11 +07:00
|
|
|
if (HAS_PCH_SPLIT(dev_priv)) {
|
2013-06-17 02:42:39 +07:00
|
|
|
assert_fdi_rx_pll_disabled(dev_priv, pipe);
|
|
|
|
assert_shared_dpll_disabled(dev_priv,
|
2016-08-09 22:04:11 +07:00
|
|
|
pipe_config->shared_dpll);
|
2013-06-17 02:42:39 +07:00
|
|
|
} else {
|
|
|
|
assert_pll_disabled(dev_priv, pipe);
|
|
|
|
}
|
|
|
|
|
2016-08-10 18:07:31 +07:00
|
|
|
intel_lvds_pps_init_hw(dev_priv, &lvds_encoder->init_pps);
|
|
|
|
|
|
|
|
temp = lvds_encoder->init_lvds_val;
|
2012-11-26 23:22:12 +07:00
|
|
|
temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP;
|
2012-11-26 23:22:13 +07:00
|
|
|
|
2016-08-09 22:04:11 +07:00
|
|
|
if (HAS_PCH_CPT(dev_priv)) {
|
2018-05-15 01:28:27 +07:00
|
|
|
temp &= ~LVDS_PIPE_SEL_MASK_CPT;
|
|
|
|
temp |= LVDS_PIPE_SEL_CPT(pipe);
|
2012-11-26 23:22:12 +07:00
|
|
|
} else {
|
2018-05-15 01:28:27 +07:00
|
|
|
temp &= ~LVDS_PIPE_SEL_MASK;
|
|
|
|
temp |= LVDS_PIPE_SEL(pipe);
|
2012-11-26 23:22:12 +07:00
|
|
|
}
|
2012-11-26 23:22:13 +07:00
|
|
|
|
2012-11-26 23:22:12 +07:00
|
|
|
/* set the corresponsding LVDS_BORDER bit */
|
2013-05-08 04:34:16 +07:00
|
|
|
temp &= ~LVDS_BORDER_ENABLE;
|
2016-08-09 22:04:11 +07:00
|
|
|
temp |= pipe_config->gmch_pfit.lvds_border_bits;
|
2018-02-14 16:29:09 +07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Set the B0-B3 data pairs corresponding to whether we're going to
|
2012-11-26 23:22:12 +07:00
|
|
|
* 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);
|
|
|
|
|
2018-02-14 16:29:09 +07:00
|
|
|
/*
|
|
|
|
* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP)
|
2012-11-26 23:22:12 +07:00
|
|
|
* appropriately here, but we need to look more thoroughly into how
|
2014-07-04 23:38:36 +07:00
|
|
|
* panels behave in the two modes. For now, let's just maintain the
|
|
|
|
* value we got from the BIOS.
|
2012-11-26 23:22:12 +07:00
|
|
|
*/
|
2016-07-02 21:36:05 +07:00
|
|
|
temp &= ~LVDS_A3_POWER_MASK;
|
|
|
|
temp |= lvds_encoder->a3_power;
|
2012-11-26 23:22:13 +07:00
|
|
|
|
2018-02-14 16:29:09 +07:00
|
|
|
/*
|
|
|
|
* Set the dithering flag on LVDS as needed, note that there is no
|
2012-11-26 23:22:13 +07:00
|
|
|
* special lvds dither control bit on pch-split platforms, dithering is
|
2018-02-14 16:29:09 +07:00
|
|
|
* only controlled through the PIPECONF reg.
|
|
|
|
*/
|
drm/i915: replace IS_GEN<N> with IS_GEN(..., N)
Define IS_GEN() similarly to our IS_GEN_RANGE(). but use gen instead of
gen_mask to do the comparison. Now callers can pass then gen as a parameter,
so we don't require one macro for each gen.
The following spatch was used to convert the users of these macros:
@@
expression e;
@@
(
- IS_GEN2(e)
+ IS_GEN(e, 2)
|
- IS_GEN3(e)
+ IS_GEN(e, 3)
|
- IS_GEN4(e)
+ IS_GEN(e, 4)
|
- IS_GEN5(e)
+ IS_GEN(e, 5)
|
- IS_GEN6(e)
+ IS_GEN(e, 6)
|
- IS_GEN7(e)
+ IS_GEN(e, 7)
|
- IS_GEN8(e)
+ IS_GEN(e, 8)
|
- IS_GEN9(e)
+ IS_GEN(e, 9)
|
- IS_GEN10(e)
+ IS_GEN(e, 10)
|
- IS_GEN11(e)
+ IS_GEN(e, 11)
)
v2: use IS_GEN rather than GT_GEN and compare to info.gen rather than
using the bitmask
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181212181044.15886-2-lucas.demarchi@intel.com
2018-12-13 01:10:43 +07:00
|
|
|
if (IS_GEN(dev_priv, 4)) {
|
2018-02-14 16:29:09 +07:00
|
|
|
/*
|
|
|
|
* Bspec wording suggests that LVDS port dithering only exists
|
|
|
|
* for 18bpp panels.
|
|
|
|
*/
|
2016-08-09 22:04:11 +07:00
|
|
|
if (pipe_config->dither && pipe_config->pipe_bpp == 18)
|
2012-11-26 23:22:12 +07:00
|
|
|
temp |= LVDS_ENABLE_DITHER;
|
|
|
|
else
|
|
|
|
temp &= ~LVDS_ENABLE_DITHER;
|
|
|
|
}
|
|
|
|
temp &= ~(LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY);
|
2013-09-03 01:13:39 +07:00
|
|
|
if (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC)
|
2012-11-26 23:22:12 +07:00
|
|
|
temp |= LVDS_HSYNC_POLARITY;
|
2013-09-03 01:13:39 +07:00
|
|
|
if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC)
|
2012-11-26 23:22:12 +07:00
|
|
|
temp |= LVDS_VSYNC_POLARITY;
|
|
|
|
|
|
|
|
I915_WRITE(lvds_encoder->reg, temp);
|
|
|
|
}
|
|
|
|
|
2018-02-14 16:29:09 +07: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-08 05:24:08 +07:00
|
|
|
* Sets the power state for the panel.
|
|
|
|
*/
|
2016-08-09 22:04:04 +07:00
|
|
|
static void intel_enable_lvds(struct intel_encoder *encoder,
|
2017-08-18 20:49:58 +07:00
|
|
|
const struct intel_crtc_state *pipe_config,
|
|
|
|
const 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-08 05:24:08 +07:00
|
|
|
{
|
2012-06-30 20:31:28 +07:00
|
|
|
struct drm_device *dev = encoder->base.dev;
|
2012-10-19 18:51:43 +07:00
|
|
|
struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
|
2016-07-04 17:34:36 +07: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-08 05:24:08 +07:00
|
|
|
|
2012-09-11 19:12:25 +07:00
|
|
|
I915_WRITE(lvds_encoder->reg, I915_READ(lvds_encoder->reg) | LVDS_PORT_EN);
|
2010-09-13 07:16:10 +07:00
|
|
|
|
2016-08-10 18:07:30 +07:00
|
|
|
I915_WRITE(PP_CONTROL(0), I915_READ(PP_CONTROL(0)) | PANEL_POWER_ON);
|
2012-09-11 19:12:25 +07:00
|
|
|
POSTING_READ(lvds_encoder->reg);
|
2018-04-19 23:07:00 +07:00
|
|
|
|
2019-03-26 04:49:39 +07:00
|
|
|
if (intel_wait_for_register(&dev_priv->uncore,
|
|
|
|
PP_STATUS(0), PP_ON, PP_ON, 5000))
|
2011-08-07 00:30:45 +07:00
|
|
|
DRM_ERROR("timed out waiting for panel to power on\n");
|
2010-12-06 02:21:18 +07:00
|
|
|
|
2017-06-12 17:21:13 +07:00
|
|
|
intel_panel_enable_backlight(pipe_config, conn_state);
|
2010-12-06 02:21:18 +07:00
|
|
|
}
|
|
|
|
|
2016-08-09 22:04:04 +07:00
|
|
|
static void intel_disable_lvds(struct intel_encoder *encoder,
|
2017-08-18 20:49:58 +07:00
|
|
|
const struct intel_crtc_state *old_crtc_state,
|
|
|
|
const struct drm_connector_state *old_conn_state)
|
2010-12-06 02:21:18 +07:00
|
|
|
{
|
2012-10-19 18:51:43 +07:00
|
|
|
struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
|
2016-08-09 22:04:11 +07:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
2010-12-06 02:21:18 +07:00
|
|
|
|
2016-08-10 18:07:30 +07:00
|
|
|
I915_WRITE(PP_CONTROL(0), I915_READ(PP_CONTROL(0)) & ~PANEL_POWER_ON);
|
2019-03-26 04:49:39 +07:00
|
|
|
if (intel_wait_for_register(&dev_priv->uncore,
|
|
|
|
PP_STATUS(0), PP_ON, 0, 1000))
|
2011-08-07 00:30:45 +07:00
|
|
|
DRM_ERROR("timed out waiting for panel to power off\n");
|
2010-12-06 02:21:18 +07:00
|
|
|
|
2012-09-11 19:12:25 +07: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-08 05:24:08 +07:00
|
|
|
}
|
|
|
|
|
2016-08-09 22:04:04 +07:00
|
|
|
static void gmch_disable_lvds(struct intel_encoder *encoder,
|
2017-08-18 20:49:58 +07:00
|
|
|
const struct intel_crtc_state *old_crtc_state,
|
|
|
|
const struct drm_connector_state *old_conn_state)
|
2016-08-09 22:04:04 +07:00
|
|
|
|
2015-07-02 21:42:46 +07:00
|
|
|
{
|
2017-06-12 17:21:13 +07:00
|
|
|
intel_panel_disable_backlight(old_conn_state);
|
2015-07-02 21:42:46 +07:00
|
|
|
|
2016-08-09 22:04:04 +07:00
|
|
|
intel_disable_lvds(encoder, old_crtc_state, old_conn_state);
|
2015-07-02 21:42:46 +07:00
|
|
|
}
|
|
|
|
|
2016-08-09 22:04:04 +07:00
|
|
|
static void pch_disable_lvds(struct intel_encoder *encoder,
|
2017-08-18 20:49:58 +07:00
|
|
|
const struct intel_crtc_state *old_crtc_state,
|
|
|
|
const struct drm_connector_state *old_conn_state)
|
2015-07-02 21:42:46 +07:00
|
|
|
{
|
2017-06-12 17:21:13 +07:00
|
|
|
intel_panel_disable_backlight(old_conn_state);
|
2015-07-02 21:42:46 +07:00
|
|
|
}
|
|
|
|
|
2016-08-09 22:04:04 +07:00
|
|
|
static void pch_post_disable_lvds(struct intel_encoder *encoder,
|
2017-08-18 20:49:58 +07:00
|
|
|
const struct intel_crtc_state *old_crtc_state,
|
|
|
|
const struct drm_connector_state *old_conn_state)
|
2015-07-02 21:42:46 +07:00
|
|
|
{
|
2016-08-09 22:04:04 +07:00
|
|
|
intel_disable_lvds(encoder, old_crtc_state, old_conn_state);
|
2015-07-02 21:42:46 +07:00
|
|
|
}
|
|
|
|
|
2013-11-28 22:29:18 +07: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-08 05:24:08 +07:00
|
|
|
{
|
2012-10-19 18:51:50 +07:00
|
|
|
struct intel_connector *intel_connector = to_intel_connector(connector);
|
|
|
|
struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
|
2015-08-18 18:37:00 +07: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-08 05:24:08 +07:00
|
|
|
|
2018-05-24 19:54:03 +07:00
|
|
|
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
|
|
|
return MODE_NO_DBLESCAN;
|
2010-09-12 23:34:41 +07:00
|
|
|
if (mode->hdisplay > fixed_mode->hdisplay)
|
|
|
|
return MODE_PANEL;
|
|
|
|
if (mode->vdisplay > fixed_mode->vdisplay)
|
|
|
|
return MODE_PANEL;
|
2015-08-18 18:37:00 +07: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-08 05:24:08 +07:00
|
|
|
|
|
|
|
return MODE_OK;
|
|
|
|
}
|
|
|
|
|
2019-01-16 03:08:00 +07:00
|
|
|
static int intel_lvds_compute_config(struct intel_encoder *intel_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-08 05:24:08 +07:00
|
|
|
{
|
2016-10-13 17:02:53 +07:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
|
2013-03-27 06:44:52 +07:00
|
|
|
struct intel_lvds_encoder *lvds_encoder =
|
|
|
|
to_lvds_encoder(&intel_encoder->base);
|
2012-10-26 16:03:59 +07:00
|
|
|
struct intel_connector *intel_connector =
|
2018-10-10 04:09:16 +07:00
|
|
|
lvds_encoder->attached_connector;
|
2015-01-15 19:55:22 +07:00
|
|
|
struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
|
2015-03-20 21:18:14 +07: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-27 06:44:58 +07: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-08 05:24:08 +07:00
|
|
|
|
|
|
|
/* Should never happen!! */
|
2016-10-13 17:02:53 +07:00
|
|
|
if (INTEL_GEN(dev_priv) < 4 && intel_crtc->pipe == 0) {
|
2009-06-29 05:42:17 +07:00
|
|
|
DRM_ERROR("Can't support LVDS on pipe A\n");
|
2019-01-16 03:08:00 +07:00
|
|
|
return -EINVAL;
|
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-08 05:24:08 +07:00
|
|
|
}
|
|
|
|
|
2014-07-04 23:38:36 +07: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-27 06:44:58 +07: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-21 06:00:16 +07: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-27 06:44:58 +07: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 22:54:44 +07:00
|
|
|
|
2018-10-12 13:23:07 +07:00
|
|
|
pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
|
|
|
|
|
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-08 05:24:08 +07:00
|
|
|
/*
|
2010-07-17 19:38:43 +07: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-08 05:24:08 +07: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 16:03:59 +07:00
|
|
|
intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
|
2012-10-19 18:51:50 +07:00
|
|
|
adjusted_mode);
|
2010-08-07 17:01:28 +07:00
|
|
|
|
2018-05-24 19:54:03 +07:00
|
|
|
if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
2019-01-16 03:08:00 +07:00
|
|
|
return -EINVAL;
|
2018-05-24 19:54:03 +07:00
|
|
|
|
2016-10-13 17:02:53 +07:00
|
|
|
if (HAS_PCH_SPLIT(dev_priv)) {
|
2013-03-27 06:44:55 +07:00
|
|
|
pipe_config->has_pch_encoder = true;
|
|
|
|
|
2013-04-26 02:55:02 +07:00
|
|
|
intel_pch_panel_fitting(intel_crtc, pipe_config,
|
2017-05-01 20:37:55 +07:00
|
|
|
conn_state->scaling_mode);
|
2013-04-26 02:55:01 +07:00
|
|
|
} else {
|
|
|
|
intel_gmch_panel_fitting(intel_crtc, pipe_config,
|
2017-05-01 20:37:55 +07: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-08 05:24:08 +07:00
|
|
|
|
2013-07-12 13:07:30 +07:00
|
|
|
}
|
2012-04-16 00:53:19 +07: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-08 05:24:08 +07: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.
|
|
|
|
*/
|
|
|
|
|
2019-01-16 03:08:00 +07: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-08 05:24:08 +07:00
|
|
|
}
|
|
|
|
|
2010-09-10 05:51:02 +07:00
|
|
|
static enum drm_connector_status
|
2010-09-14 17:07:23 +07: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-08 05:24:08 +07:00
|
|
|
{
|
2011-03-24 20:26:43 +07: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-08 05:24:08 +07:00
|
|
|
}
|
|
|
|
|
2018-02-14 16:29:09 +07: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-08 05:24:08 +07: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)
|
|
|
|
{
|
2018-10-10 04:09:16 +07:00
|
|
|
struct intel_connector *intel_connector = to_intel_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-08 05:24:08 +07:00
|
|
|
struct drm_device *dev = connector->dev;
|
2010-09-12 23:34:41 +07: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-08 05:24:08 +07:00
|
|
|
|
2012-10-19 18:51:52 +07:00
|
|
|
/* use cached edid if we have one */
|
2018-10-10 04:09:16 +07:00
|
|
|
if (!IS_ERR_OR_NULL(intel_connector->edid))
|
|
|
|
return drm_add_edid_modes(connector, intel_connector->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-08 05:24:08 +07:00
|
|
|
|
2018-10-10 04:09:16 +07:00
|
|
|
mode = drm_mode_duplicate(dev, intel_connector->panel.fixed_mode);
|
2011-01-14 02:06:50 +07:00
|
|
|
if (mode == NULL)
|
2010-09-12 23:34:41 +07: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-08 05:24:08 +07:00
|
|
|
|
2010-09-12 23:34:41 +07: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-08 05:24:08 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
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 20:37:59 +07: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-08 05:24:08 +07:00
|
|
|
};
|
|
|
|
|
|
|
|
static const struct drm_connector_funcs intel_lvds_connector_funcs = {
|
|
|
|
.detect = intel_lvds_detect,
|
|
|
|
.fill_modes = drm_helper_probe_single_connector_modes,
|
2017-05-01 20:37:59 +07:00
|
|
|
.atomic_get_property = intel_digital_connector_atomic_get_property,
|
|
|
|
.atomic_set_property = intel_digital_connector_atomic_set_property,
|
2018-07-18 00:42:14 +07:00
|
|
|
.late_register = intel_connector_register,
|
|
|
|
.early_unregister = intel_connector_unregister,
|
2018-10-09 21:11:03 +07:00
|
|
|
.destroy = intel_connector_destroy,
|
2015-01-23 07:50:32 +07:00
|
|
|
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
|
2017-05-01 20:37:59 +07: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-08 05:24:08 +07:00
|
|
|
};
|
|
|
|
|
|
|
|
static const struct drm_encoder_funcs intel_lvds_enc_funcs = {
|
2010-08-04 19:50:23 +07: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-08 05:24:08 +07:00
|
|
|
};
|
|
|
|
|
2014-08-27 23:41:19 +07:00
|
|
|
static int intel_no_lvds_dmi_callback(const struct dmi_system_id *id)
|
2009-05-05 21:00:25 +07:00
|
|
|
{
|
2012-04-01 18:16:49 +07:00
|
|
|
DRM_INFO("Skipping LVDS initialization for %s\n", id->ident);
|
2009-05-05 21:00:25 +07: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-08 05:24:08 +07:00
|
|
|
|
2009-05-05 21:00:25 +07:00
|
|
|
/* These systems claim to have LVDS, but really don't */
|
2009-06-04 06:41:19 +07:00
|
|
|
static const struct dmi_system_id intel_no_lvds[] = {
|
2009-05-05 21:00:25 +07:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Apple Mac Mini (Core series)",
|
|
|
|
.matches = {
|
2009-06-15 02:31:58 +07:00
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Apple"),
|
2009-05-05 21:00:25 +07:00
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Apple Mac Mini (Core 2 series)",
|
|
|
|
.matches = {
|
2009-06-15 02:31:58 +07:00
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Apple"),
|
2009-05-05 21:00:25 +07: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-28 04:20:39 +07:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
2011-07-26 21:23:54 +07: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-28 04:20:39 +07:00
|
|
|
.ident = "AOpen Mini PC",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "AOpen"),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "i965GMx-IF"),
|
|
|
|
},
|
|
|
|
},
|
2009-07-14 03:26:48 +07: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 22:38:10 +07: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 22:42:52 +07: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-06 02:16:22 +07:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Aopen i945GTt-VFA",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"),
|
|
|
|
},
|
|
|
|
},
|
2010-03-29 22:53:12 +07: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 20:39:21 +07:00
|
|
|
{
|
2012-01-11 01:03:55 +07: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 20:39:21 +07: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-29 00:22:56 +07: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 20:21:53 +07:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
2013-04-17 01:00:28 +07:00
|
|
|
.ident = "Hewlett-Packard HP t5740",
|
2012-05-22 20:21:53 +07:00
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
2013-04-17 01:00:28 +07:00
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, " t5740"),
|
2012-05-22 20:21:53 +07:00
|
|
|
},
|
|
|
|
},
|
2012-02-09 21:35:21 +07:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Hewlett-Packard t5745",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
2012-05-02 00:37:57 +07:00
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "hp t5745"),
|
2012-02-09 21:35:21 +07:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Hewlett-Packard st5747",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
2012-05-02 00:37:57 +07:00
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "hp st5747"),
|
2012-02-09 21:35:21 +07:00
|
|
|
},
|
|
|
|
},
|
2012-03-08 00:36:35 +07: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 18:56:31 +07: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-19 03:07:01 +07: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 19:34:11 +07: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 23:13:42 +07: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-04 05:05:03 +07: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-04 05:05:05 +07:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Intel D525MW",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Intel"),
|
|
|
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "D525MW"),
|
|
|
|
},
|
|
|
|
},
|
2018-03-10 05:22:04 +07:00
|
|
|
{
|
|
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
|
|
.ident = "Radiant P845",
|
|
|
|
.matches = {
|
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Radiant Systems Inc"),
|
|
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "P845"),
|
|
|
|
},
|
|
|
|
},
|
2009-05-05 21:00:25 +07: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-08 05:24:08 +07:00
|
|
|
|
2012-11-26 23:22:09 +07: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 20:06:49 +07: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 23:22:09 +07: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 20:06:49 +07: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 23:22:09 +07:00
|
|
|
{ } /* terminating entry */
|
|
|
|
};
|
|
|
|
|
2019-03-19 03:26:52 +07:00
|
|
|
struct intel_encoder *intel_get_lvds_encoder(struct drm_i915_private *dev_priv)
|
2012-11-26 23:22:10 +07:00
|
|
|
{
|
2019-03-19 03:26:52 +07:00
|
|
|
struct intel_encoder *encoder;
|
2012-11-26 23:22:10 +07:00
|
|
|
|
2019-03-19 03:26:52 +07:00
|
|
|
for_each_intel_encoder(&dev_priv->drm, encoder) {
|
|
|
|
if (encoder->type == INTEL_OUTPUT_LVDS)
|
|
|
|
return encoder;
|
|
|
|
}
|
2012-11-26 23:22:10 +07:00
|
|
|
|
2016-06-21 15:51:47 +07:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2019-03-19 03:26:53 +07:00
|
|
|
bool intel_is_dual_link_lvds(struct drm_i915_private *dev_priv)
|
2016-06-21 15:51:47 +07:00
|
|
|
{
|
2019-03-19 03:26:53 +07:00
|
|
|
struct intel_encoder *encoder = intel_get_lvds_encoder(dev_priv);
|
2012-11-26 23:22:10 +07:00
|
|
|
|
2016-06-21 15:51:47 +07:00
|
|
|
return encoder && to_lvds_encoder(&encoder->base)->is_dual_link;
|
2012-11-26 23:22:10 +07:00
|
|
|
}
|
|
|
|
|
2012-09-11 19:12:25 +07:00
|
|
|
static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder)
|
2012-11-26 23:22:09 +07:00
|
|
|
{
|
2012-09-11 19:12:25 +07:00
|
|
|
struct drm_device *dev = lvds_encoder->base.base.dev;
|
2012-11-26 23:22:09 +07:00
|
|
|
unsigned int val;
|
2016-07-04 17:34:36 +07:00
|
|
|
struct drm_i915_private *dev_priv = to_i915(dev);
|
2012-11-26 23:22:09 +07:00
|
|
|
|
|
|
|
/* use the module option value if specified */
|
2017-09-20 02:38:44 +07:00
|
|
|
if (i915_modparams.lvds_channel_mode > 0)
|
|
|
|
return i915_modparams.lvds_channel_mode == 2;
|
2012-11-26 23:22:09 +07:00
|
|
|
|
2015-04-13 02:10:35 +07:00
|
|
|
/* single channel LVDS is limited to 112 MHz */
|
2018-10-10 04:09:16 +07:00
|
|
|
if (lvds_encoder->attached_connector->panel.fixed_mode->clock > 112999)
|
2015-04-13 02:10:35 +07:00
|
|
|
return true;
|
|
|
|
|
2012-11-26 23:22:09 +07:00
|
|
|
if (dmi_check_system(intel_dual_link_lvds))
|
|
|
|
return true;
|
|
|
|
|
2018-02-14 16:29:09 +07:00
|
|
|
/*
|
|
|
|
* BIOS should set the proper LVDS register value at boot, but
|
2012-11-26 23:22:10 +07:00
|
|
|
* 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 19:12:25 +07:00
|
|
|
val = I915_READ(lvds_encoder->reg);
|
2018-05-15 01:28:27 +07:00
|
|
|
if (HAS_PCH_CPT(dev_priv))
|
|
|
|
val &= ~(LVDS_DETECTED | LVDS_PIPE_SEL_MASK_CPT);
|
|
|
|
else
|
|
|
|
val &= ~(LVDS_DETECTED | LVDS_PIPE_SEL_MASK);
|
|
|
|
if (val == 0)
|
2013-05-10 06:03:18 +07:00
|
|
|
val = dev_priv->vbt.bios_lvds_val;
|
2012-11-26 23:22:10 +07:00
|
|
|
|
2012-11-26 23:22:09 +07:00
|
|
|
return (val & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP;
|
|
|
|
}
|
|
|
|
|
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-08 05:24:08 +07:00
|
|
|
/**
|
|
|
|
* intel_lvds_init - setup LVDS connectors on this device
|
2018-02-14 16:29:09 +07:00
|
|
|
* @dev_priv: i915 device
|
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-08 05:24:08 +07:00
|
|
|
*
|
|
|
|
* 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 21:21:44 +07: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-08 05:24:08 +07:00
|
|
|
{
|
2016-11-23 21:21:44 +07:00
|
|
|
struct drm_device *dev = &dev_priv->drm;
|
2012-10-19 18:51:43 +07:00
|
|
|
struct intel_lvds_encoder *lvds_encoder;
|
2010-03-26 01:11:14 +07:00
|
|
|
struct intel_encoder *intel_encoder;
|
2010-03-29 15:40:50 +07: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-08 05:24:08 +07:00
|
|
|
struct drm_connector *connector;
|
|
|
|
struct drm_encoder *encoder;
|
2012-10-19 18:51:50 +07:00
|
|
|
struct drm_display_mode *fixed_mode = NULL;
|
2014-02-11 15:56:36 +07:00
|
|
|
struct drm_display_mode *downclock_mode = NULL;
|
2012-10-19 18:51:52 +07:00
|
|
|
struct edid *edid;
|
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 20:33:26 +07: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-08 05:24:08 +07:00
|
|
|
u32 lvds;
|
2010-09-24 07:15:02 +07:00
|
|
|
u8 pin;
|
2017-05-01 20:37:56 +07: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-08 05:24:08 +07:00
|
|
|
|
2009-05-05 21:00:25 +07:00
|
|
|
/* Skip init on machines we know falsely report LVDS */
|
2018-05-18 22:01:38 +07:00
|
|
|
if (dmi_check_system(intel_no_lvds)) {
|
|
|
|
WARN(!dev_priv->vbt.int_lvds_support,
|
|
|
|
"Useless DMI match. Internal LVDS support disabled by VBT\n");
|
2013-06-07 03:22:47 +07:00
|
|
|
return;
|
2018-05-18 22:01:38 +07:00
|
|
|
}
|
2009-02-04 17:05:41 +07:00
|
|
|
|
2018-05-08 21:08:14 +07:00
|
|
|
if (!dev_priv->vbt.int_lvds_support) {
|
|
|
|
DRM_DEBUG_KMS("Internal LVDS support disabled by VBT\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-10-13 17:02:53 +07:00
|
|
|
if (HAS_PCH_SPLIT(dev_priv))
|
2015-09-19 00:03:45 +07:00
|
|
|
lvds_reg = PCH_LVDS;
|
|
|
|
else
|
|
|
|
lvds_reg = LVDS;
|
|
|
|
|
|
|
|
lvds = I915_READ(lvds_reg);
|
|
|
|
|
2016-10-13 17:02:53 +07:00
|
|
|
if (HAS_PCH_SPLIT(dev_priv)) {
|
2015-09-19 00:03:45 +07:00
|
|
|
if ((lvds & LVDS_DETECTED) == 0)
|
2013-06-07 03:22:47 +07:00
|
|
|
return;
|
2009-06-05 14:38:44 +07:00
|
|
|
}
|
|
|
|
|
2015-06-19 19:57:43 +07:00
|
|
|
pin = GMBUS_PIN_PANEL;
|
2016-03-16 17:43:30 +07:00
|
|
|
if (!intel_bios_is_lvds_present(dev_priv, &pin)) {
|
2015-09-19 00:03:45 +07:00
|
|
|
if ((lvds & LVDS_PORT_EN) == 0) {
|
2015-06-19 19:57:43 +07: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 17:18:32 +07:00
|
|
|
lvds_encoder = kzalloc(sizeof(*lvds_encoder), GFP_KERNEL);
|
2012-10-19 18:51:43 +07:00
|
|
|
if (!lvds_encoder)
|
2013-06-07 03:22:47 +07: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-08 05:24:08 +07:00
|
|
|
|
2018-10-10 04:09:16 +07:00
|
|
|
intel_connector = intel_connector_alloc();
|
|
|
|
if (!intel_connector) {
|
2015-04-10 14:59:10 +07:00
|
|
|
kfree(lvds_encoder);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-10-10 04:09:16 +07:00
|
|
|
lvds_encoder->attached_connector = intel_connector;
|
2012-10-19 18:51:47 +07:00
|
|
|
|
2012-10-19 18:51:43 +07:00
|
|
|
intel_encoder = &lvds_encoder->base;
|
2010-09-09 21:14:28 +07:00
|
|
|
encoder = &intel_encoder->base;
|
2010-08-04 19:50:23 +07:00
|
|
|
connector = &intel_connector->base;
|
2010-03-29 15:40:50 +07: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-08 05:24:08 +07:00
|
|
|
DRM_MODE_CONNECTOR_LVDS);
|
|
|
|
|
2010-09-09 21:14:28 +07:00
|
|
|
drm_encoder_init(dev, &intel_encoder->base, &intel_lvds_enc_funcs,
|
2016-05-28 00:59:24 +07: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-08 05:24:08 +07:00
|
|
|
|
2012-06-30 20:31:28 +07:00
|
|
|
intel_encoder->enable = intel_enable_lvds;
|
2013-06-05 18:34:30 +07:00
|
|
|
intel_encoder->pre_enable = intel_pre_enable_lvds;
|
2013-03-27 06:44:52 +07:00
|
|
|
intel_encoder->compute_config = intel_lvds_compute_config;
|
2015-07-02 21:42:46 +07: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-03 02:09:00 +07:00
|
|
|
intel_encoder->get_hw_state = intel_lvds_get_hw_state;
|
2013-05-15 07:08:26 +07:00
|
|
|
intel_encoder->get_config = intel_lvds_get_config;
|
2019-01-08 23:08:38 +07:00
|
|
|
intel_encoder->update_pipe = intel_panel_update_backlight;
|
2012-07-03 02:09:00 +07:00
|
|
|
intel_connector->get_hw_state = intel_connector_get_hw_state;
|
2012-06-30 20:31:28 +07:00
|
|
|
|
2010-09-09 22:20:55 +07: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-08 05:24:08 +07:00
|
|
|
|
2016-09-20 08:24:38 +07:00
|
|
|
intel_encoder->type = INTEL_OUTPUT_LVDS;
|
2017-02-22 13:34:27 +07:00
|
|
|
intel_encoder->power_domain = POWER_DOMAIN_PORT_OTHER;
|
2016-09-20 08:24:38 +07:00
|
|
|
intel_encoder->port = PORT_NONE;
|
2014-03-03 21:15:28 +07:00
|
|
|
intel_encoder->cloneable = 0;
|
2016-10-13 17:02:53 +07:00
|
|
|
if (HAS_PCH_SPLIT(dev_priv))
|
2011-09-03 02:54:37 +07:00
|
|
|
intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
|
drm/i915: replace IS_GEN<N> with IS_GEN(..., N)
Define IS_GEN() similarly to our IS_GEN_RANGE(). but use gen instead of
gen_mask to do the comparison. Now callers can pass then gen as a parameter,
so we don't require one macro for each gen.
The following spatch was used to convert the users of these macros:
@@
expression e;
@@
(
- IS_GEN2(e)
+ IS_GEN(e, 2)
|
- IS_GEN3(e)
+ IS_GEN(e, 3)
|
- IS_GEN4(e)
+ IS_GEN(e, 4)
|
- IS_GEN5(e)
+ IS_GEN(e, 5)
|
- IS_GEN6(e)
+ IS_GEN(e, 6)
|
- IS_GEN7(e)
+ IS_GEN(e, 7)
|
- IS_GEN8(e)
+ IS_GEN(e, 8)
|
- IS_GEN9(e)
+ IS_GEN(e, 9)
|
- IS_GEN10(e)
+ IS_GEN(e, 10)
|
- IS_GEN11(e)
+ IS_GEN(e, 11)
)
v2: use IS_GEN rather than GT_GEN and compare to info.gen rather than
using the bitmask
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181212181044.15886-2-lucas.demarchi@intel.com
2018-12-13 01:10:43 +07:00
|
|
|
else if (IS_GEN(dev_priv, 4))
|
2012-06-05 15:07:11 +07:00
|
|
|
intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
|
2011-09-03 02:54:37 +07: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-08 05:24:08 +07: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-19 00:03:45 +07:00
|
|
|
lvds_encoder->reg = lvds_reg;
|
2012-09-11 19:12:25 +07:00
|
|
|
|
2009-06-22 14:31:25 +07:00
|
|
|
/* create the scaling mode property */
|
2017-05-01 20:37:56 +07: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 20:37:55 +07:00
|
|
|
connector->state->scaling_mode = DRM_MODE_SCALE_ASPECT;
|
2016-08-10 18:07:31 +07: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-08 05:24:08 +07: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
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Attempt to get the fixed panel mode from DDC. Assume that the
|
|
|
|
* preferred mode is the right one.
|
|
|
|
*/
|
2014-03-22 05:22:35 +07:00
|
|
|
mutex_lock(&dev->mode_config.mutex);
|
2016-01-12 02:09:20 +07: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 18:51:52 +07:00
|
|
|
if (edid) {
|
|
|
|
if (drm_add_edid_modes(connector, edid)) {
|
2018-07-09 15:40:06 +07:00
|
|
|
drm_connector_update_edid_property(connector,
|
2012-10-19 18:51:52 +07:00
|
|
|
edid);
|
2010-11-09 06:20:52 +07:00
|
|
|
} else {
|
2012-10-19 18:51:52 +07:00
|
|
|
kfree(edid);
|
|
|
|
edid = ERR_PTR(-EINVAL);
|
2010-11-09 06:20:52 +07:00
|
|
|
}
|
2012-10-19 18:51:52 +07:00
|
|
|
} else {
|
|
|
|
edid = ERR_PTR(-ENOENT);
|
2010-11-09 06:20:52 +07:00
|
|
|
}
|
2018-10-10 04:09:16 +07:00
|
|
|
intel_connector->edid = edid;
|
2012-10-19 18:51:52 +07:00
|
|
|
|
2019-03-21 20:24:41 +07:00
|
|
|
fixed_mode = intel_panel_edid_fixed_mode(intel_connector);
|
|
|
|
if (fixed_mode)
|
|
|
|
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-08 05:24:08 +07:00
|
|
|
|
|
|
|
/* Failed to get EDID, what about VBT? */
|
2019-03-21 20:24:43 +07:00
|
|
|
fixed_mode = intel_panel_vbt_fixed_mode(intel_connector);
|
|
|
|
if (fixed_mode)
|
|
|
|
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-08 05:24:08 +07: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.
|
|
|
|
*/
|
2017-10-09 23:19:50 +07:00
|
|
|
fixed_mode = intel_encoder_current_mode(intel_encoder);
|
|
|
|
if (fixed_mode) {
|
|
|
|
DRM_DEBUG_KMS("using current (BIOS) mode: ");
|
|
|
|
drm_mode_debug_printmodeline(fixed_mode);
|
|
|
|
fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
|
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-08 05:24:08 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
/* If we still don't have a mode after all that, give up. */
|
2012-10-19 18:51:50 +07: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-08 05:24:08 +07:00
|
|
|
goto failed;
|
|
|
|
|
|
|
|
out:
|
2014-03-22 05:22:35 +07:00
|
|
|
mutex_unlock(&dev->mode_config.mutex);
|
|
|
|
|
Revert "drm/i915/edp: Allow alternate fixed mode for eDP if available."
This reverts commit dc911f5bd8aacfcf8aabd5c26c88e04c837a938e.
Per the report, no matter what display mode you select with xrandr, the
i915 driver will always select the alternate fixed mode. For the
reporter this means that the display will always run at 40Hz which is
quite annoying. This may be due to the mode comparison.
But there are some other potential issues. The choice of alt_fixed_mode
seems dubious. It's the first non-preferred mode, but there are no
guarantees that the only difference would be refresh rate. Similarly,
there may be more than one preferred mode in the probed modes list, and
the commit changes the preferred mode selection to choose the last one
on the list instead of the first.
(Note that the probed modes list is the raw, unfiltered, unsorted list
of modes from drm_add_edid_modes(), not the pretty result after a
drm_helper_probe_single_connector_modes() call.)
Finally, we already have eerily similar code in place to find the
downclock mode for DRRS that seems like could be reused here.
Back to the drawing board.
Note: This is a hand-crafted revert due to conflicts. If it fails to
backport, please just try reverting the original commit directly.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105469
Reported-by: Rune Petersen <rune@megahurts.dk>
Reported-by: Mark Spencer <n7u4722r35@ynzlx.anonbox.net>
Fixes: dc911f5bd8aa ("drm/i915/edp: Allow alternate fixed mode for eDP if available.")
Cc: Clint Taylor <clinton.a.taylor@intel.com>
Cc: David Weinehall <david.weinehall@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Jim Bride <jim.bride@linux.intel.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v4.14+
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180516080110.22770-1-jani.nikula@intel.com
2018-05-16 15:01:10 +07:00
|
|
|
intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
|
2016-06-24 20:00:13 +07:00
|
|
|
intel_panel_setup_backlight(connector, INVALID_PIPE);
|
2015-04-13 02:10:35 +07:00
|
|
|
|
2012-09-11 19:12:25 +07:00
|
|
|
lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder);
|
2012-11-26 23:22:10 +07:00
|
|
|
DRM_DEBUG_KMS("detected %s-link lvds configuration\n",
|
|
|
|
lvds_encoder->is_dual_link ? "dual" : "single");
|
|
|
|
|
2015-11-05 15:30:50 +07:00
|
|
|
lvds_encoder->a3_power = lvds & LVDS_A3_POWER_MASK;
|
2014-07-04 23:38:36 +07:00
|
|
|
|
2013-06-07 03:22:47 +07: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-08 05:24:08 +07:00
|
|
|
|
|
|
|
failed:
|
2014-03-22 05:22:35 +07:00
|
|
|
mutex_unlock(&dev->mode_config.mutex);
|
|
|
|
|
2009-07-20 12:48:04 +07: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-08 05:24:08 +07:00
|
|
|
drm_connector_cleanup(connector);
|
2009-11-17 16:19:23 +07:00
|
|
|
drm_encoder_cleanup(encoder);
|
2012-10-19 18:51:43 +07:00
|
|
|
kfree(lvds_encoder);
|
2018-10-10 04:09:16 +07:00
|
|
|
intel_connector_free(intel_connector);
|
2013-06-07 03:22:47 +07: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-08 05:24:08 +07:00
|
|
|
}
|