[Intel-gfx] [PATCH 2/2] drm/i915/lvds: Use i915.lvds_fixed_mode= as a last resort
Chris Wilson
chris at chris-wilson.co.uk
Sun Apr 17 08:43:33 CEST 2011
If we can find no other reliable source of panel configuration data,
turn to the user and see if they have a passed a mode line (ala video=)
through the i915.lvds_fixed_mode= string.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Oliver Seitz <info at vtnd.de>
Cc: Mike Isely <isely at isely.net>
Cc: Dave Airlied <airlied at linux.ie>
---
drivers/gpu/drm/i915/i915_drv.c | 4 +++
drivers/gpu/drm/i915/i915_drv.h | 3 +-
drivers/gpu/drm/i915/intel_lvds.c | 46 ++++++++++++++++++++++++++++---------
3 files changed, 41 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 16a2532..4a618f6 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -67,6 +67,10 @@ module_param_named(vbt_sdvo_panel_type, i915_vbt_sdvo_panel_type, int, 0600);
static bool i915_try_reset = true;
module_param_named(reset, i915_try_reset, bool, 0600);
+char *i915_lvds_fixed_mode;
+module_param_named(lvds_fixed_mode, i915_lvds_fixed_mode, charp, 0600);
+MODULE_PARM_DESC(lvds_fixed_mode, "specify the mode line for the LVDS panel to be used in the absence of any configuration data, using the video= format");
+
unsigned int i915_lvds_24bit = 0;
module_param_named(lvds_24bit, i915_lvds_24bit, int, 0600);
MODULE_PARM_DESC(lvds_24bit, "LVDS 24 bit pixel format: 0=leave untouched (default), 1=24 bit '2.0' format, 2=24 bit '2.1' format, 3=force older 18 bit format");
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 2112af3..c6cc4e2 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -977,12 +977,13 @@ extern unsigned int i915_fbpercrtc;
extern int i915_panel_ignore_lid;
extern unsigned int i915_powersave;
extern unsigned int i915_semaphores;
+extern char *i915_lvds_fixed_mode;
extern unsigned int i915_lvds_channels;
+extern unsigned int i915_lvds_24bit;
extern unsigned int i915_lvds_downclock;
extern unsigned int i915_panel_use_ssc;
extern int i915_vbt_sdvo_panel_type;
extern unsigned int i915_enable_rc6;
-extern unsigned int i915_lvds_24bit;
extern int i915_suspend(struct drm_device *dev, pm_message_t state);
extern int i915_resume(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index a562bd2..32b86ea 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -924,6 +924,11 @@ bool intel_lvds_init(struct drm_device *dev)
* if none of the above, no panel
* 4) make sure lid is open
* if closed, act like it's not there for now
+ *
+ * Finally, we allow the user to specify his own mode. We do this
+ * last because we want to prevent the user from damaging their
+ * hardware with a dangerous modeline. Though we may eventually
+ * be forced to add an override for truly broken machines.
*/
/*
@@ -982,19 +987,38 @@ bool intel_lvds_init(struct drm_device *dev)
*/
/* Ironlake: FIXME if still fail, not try pipe mode now */
- if (HAS_PCH_SPLIT(dev))
- goto failed;
+ if (!HAS_PCH_SPLIT(dev)) {
+ lvds = I915_READ(LVDS);
+ pipe = (lvds & LVDS_PIPEB_SELECT) ? 1 : 0;
+ crtc = intel_get_crtc_for_pipe(dev, pipe);
+
+ if (crtc && (lvds & LVDS_PORT_EN)) {
+ intel_lvds->fixed_mode = intel_crtc_mode_get(dev, crtc);
+ if (intel_lvds->fixed_mode) {
+ intel_lvds->fixed_mode->type |=
+ DRM_MODE_TYPE_PREFERRED;
+ goto out;
+ }
+ }
+ }
- lvds = I915_READ(LVDS);
- pipe = (lvds & LVDS_PIPEB_SELECT) ? 1 : 0;
- crtc = intel_get_crtc_for_pipe(dev, pipe);
+ /* No panel cnnfiguration data, and nothing already driving the panel
+ * at its preferred mode. Check to see if the user provided this vital
+ * bit of information...
+ */
+ if (i915_lvds_fixed_mode) {
+ struct drm_cmdline_mode mode;
- if (crtc && (lvds & LVDS_PORT_EN)) {
- intel_lvds->fixed_mode = intel_crtc_mode_get(dev, crtc);
- if (intel_lvds->fixed_mode) {
- intel_lvds->fixed_mode->type |=
- DRM_MODE_TYPE_PREFERRED;
- goto out;
+ if (drm_mode_parse_command_line_for_connector(i915_lvds_fixed_mode,
+ connector,
+ &mode)) {
+ intel_lvds->fixed_mode =
+ drm_mode_create_from_cmdline_mode(dev, &mode);
+ if (intel_lvds->fixed_mode) {
+ intel_lvds->fixed_mode->type |=
+ DRM_MODE_TYPE_PREFERRED;
+ goto out;
+ }
}
}
--
1.7.4.1
More information about the Intel-gfx
mailing list