提交 c9093354 编写于 作者: D Daniel Vetter

drm/i915: stop killing pfit on i9xx

Nowadays (i.e. with Valleyview) we also have edp on non-PCH_SPLIT
platforms, so just checking for LVDS is not good enough.

Secondly we have full pfit pipe config tracking, so we'll correctly
disable the pfit as part of the initial modeset.

For fastboot we need a bit of work here to correctly kill unsupported
configs (if e.g. the pfit is used on anything else than the built-in
panel). But since that's not yet supported we don't need to worry.
Reviewed-by: NMika Kuoppala <mika.kuoppala@intel.com>
Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
上级 3eff4faa
...@@ -8959,13 +8959,8 @@ static void intel_setup_outputs(struct drm_device *dev) ...@@ -8959,13 +8959,8 @@ static void intel_setup_outputs(struct drm_device *dev)
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_encoder *encoder; struct intel_encoder *encoder;
bool dpd_is_edp = false; bool dpd_is_edp = false;
bool has_lvds;
has_lvds = intel_lvds_init(dev); intel_lvds_init(dev);
if (!has_lvds && !HAS_PCH_SPLIT(dev)) {
/* disable the panel fitter on everything but LVDS */
I915_WRITE(PFIT_CONTROL, 0);
}
if (!IS_ULT(dev)) if (!IS_ULT(dev))
intel_crt_init(dev); intel_crt_init(dev);
......
...@@ -582,7 +582,7 @@ extern void intel_mark_busy(struct drm_device *dev); ...@@ -582,7 +582,7 @@ extern void intel_mark_busy(struct drm_device *dev);
extern void intel_mark_fb_busy(struct drm_i915_gem_object *obj, extern void intel_mark_fb_busy(struct drm_i915_gem_object *obj,
struct intel_ring_buffer *ring); struct intel_ring_buffer *ring);
extern void intel_mark_idle(struct drm_device *dev); extern void intel_mark_idle(struct drm_device *dev);
extern bool intel_lvds_init(struct drm_device *dev); extern void intel_lvds_init(struct drm_device *dev);
extern bool intel_is_dual_link_lvds(struct drm_device *dev); extern bool intel_is_dual_link_lvds(struct drm_device *dev);
extern void intel_dp_init(struct drm_device *dev, int output_reg, extern void intel_dp_init(struct drm_device *dev, int output_reg,
enum port port); enum port port);
......
...@@ -877,7 +877,7 @@ static bool intel_lvds_supported(struct drm_device *dev) ...@@ -877,7 +877,7 @@ static bool intel_lvds_supported(struct drm_device *dev)
* Create the connector, register the LVDS DDC bus, and try to figure out what * Create the connector, register the LVDS DDC bus, and try to figure out what
* modes we can display on the LVDS panel (if present). * modes we can display on the LVDS panel (if present).
*/ */
bool intel_lvds_init(struct drm_device *dev) void intel_lvds_init(struct drm_device *dev)
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_lvds_encoder *lvds_encoder; struct intel_lvds_encoder *lvds_encoder;
...@@ -895,35 +895,35 @@ bool intel_lvds_init(struct drm_device *dev) ...@@ -895,35 +895,35 @@ bool intel_lvds_init(struct drm_device *dev)
u8 pin; u8 pin;
if (!intel_lvds_supported(dev)) if (!intel_lvds_supported(dev))
return false; return;
/* Skip init on machines we know falsely report LVDS */ /* Skip init on machines we know falsely report LVDS */
if (dmi_check_system(intel_no_lvds)) if (dmi_check_system(intel_no_lvds))
return false; return;
pin = GMBUS_PORT_PANEL; pin = GMBUS_PORT_PANEL;
if (!lvds_is_present_in_vbt(dev, &pin)) { if (!lvds_is_present_in_vbt(dev, &pin)) {
DRM_DEBUG_KMS("LVDS is not present in VBT\n"); DRM_DEBUG_KMS("LVDS is not present in VBT\n");
return false; return;
} }
if (HAS_PCH_SPLIT(dev)) { if (HAS_PCH_SPLIT(dev)) {
if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0) if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0)
return false; return;
if (dev_priv->vbt.edp_support) { if (dev_priv->vbt.edp_support) {
DRM_DEBUG_KMS("disable LVDS for eDP support\n"); DRM_DEBUG_KMS("disable LVDS for eDP support\n");
return false; return;
} }
} }
lvds_encoder = kzalloc(sizeof(struct intel_lvds_encoder), GFP_KERNEL); lvds_encoder = kzalloc(sizeof(struct intel_lvds_encoder), GFP_KERNEL);
if (!lvds_encoder) if (!lvds_encoder)
return false; return;
lvds_connector = kzalloc(sizeof(struct intel_lvds_connector), GFP_KERNEL); lvds_connector = kzalloc(sizeof(struct intel_lvds_connector), GFP_KERNEL);
if (!lvds_connector) { if (!lvds_connector) {
kfree(lvds_encoder); kfree(lvds_encoder);
return false; return;
} }
lvds_encoder->attached_connector = lvds_connector; lvds_encoder->attached_connector = lvds_connector;
...@@ -1094,7 +1094,7 @@ bool intel_lvds_init(struct drm_device *dev) ...@@ -1094,7 +1094,7 @@ bool intel_lvds_init(struct drm_device *dev)
intel_panel_init(&intel_connector->panel, fixed_mode); intel_panel_init(&intel_connector->panel, fixed_mode);
intel_panel_setup_backlight(connector); intel_panel_setup_backlight(connector);
return true; return;
failed: failed:
DRM_DEBUG_KMS("No LVDS modes found, disabling.\n"); DRM_DEBUG_KMS("No LVDS modes found, disabling.\n");
...@@ -1104,5 +1104,5 @@ bool intel_lvds_init(struct drm_device *dev) ...@@ -1104,5 +1104,5 @@ bool intel_lvds_init(struct drm_device *dev)
drm_mode_destroy(dev, fixed_mode); drm_mode_destroy(dev, fixed_mode);
kfree(lvds_encoder); kfree(lvds_encoder);
kfree(lvds_connector); kfree(lvds_connector);
return false; return;
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册