Commit 9929c097 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-intel-fixes-2016-09-15' of git://anongit.freedesktop.org/drm-intel into drm-fixes

i915 fixes from Jani.

* tag 'drm-intel-fixes-2016-09-15' of git://anongit.freedesktop.org/drm-intel:
  drm/i915: Ignore OpRegion panel type except on select machines
  Revert "drm/i915/psr: Make idle_frames sensible again"
  drm/i915: Restore lost "Initialized i915" welcome message
parents 7eebfba5 ea54ff40
...@@ -1281,6 +1281,11 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1281,6 +1281,11 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent)
intel_runtime_pm_enable(dev_priv); intel_runtime_pm_enable(dev_priv);
/* Everything is in place, we can now relax! */
DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n",
driver.name, driver.major, driver.minor, driver.patchlevel,
driver.date, pci_name(pdev), dev_priv->drm.primary->index);
intel_runtime_pm_put(dev_priv); intel_runtime_pm_put(dev_priv);
return 0; return 0;
......
...@@ -1047,6 +1047,23 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv) ...@@ -1047,6 +1047,23 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
return err; return err;
} }
static int intel_use_opregion_panel_type_callback(const struct dmi_system_id *id)
{
DRM_INFO("Using panel type from OpRegion on %s\n", id->ident);
return 1;
}
static const struct dmi_system_id intel_use_opregion_panel_type[] = {
{
.callback = intel_use_opregion_panel_type_callback,
.ident = "Conrac GmbH IX45GM2",
.matches = {DMI_MATCH(DMI_SYS_VENDOR, "Conrac GmbH"),
DMI_MATCH(DMI_PRODUCT_NAME, "IX45GM2"),
},
},
{ }
};
int int
intel_opregion_get_panel_type(struct drm_i915_private *dev_priv) intel_opregion_get_panel_type(struct drm_i915_private *dev_priv)
{ {
...@@ -1072,6 +1089,16 @@ intel_opregion_get_panel_type(struct drm_i915_private *dev_priv) ...@@ -1072,6 +1089,16 @@ intel_opregion_get_panel_type(struct drm_i915_private *dev_priv)
return -ENODEV; return -ENODEV;
} }
/*
* So far we know that some machined must use it, others must not use it.
* There doesn't seem to be any way to determine which way to go, except
* via a quirk list :(
*/
if (!dmi_check_system(intel_use_opregion_panel_type)) {
DRM_DEBUG_KMS("Ignoring OpRegion panel type (%d)\n", ret - 1);
return -ENODEV;
}
/* /*
* FIXME On Dell XPS 13 9350 the OpRegion panel type (0) gives us * FIXME On Dell XPS 13 9350 the OpRegion panel type (0) gives us
* low vswing for eDP, whereas the VBT panel type (2) gives us normal * low vswing for eDP, whereas the VBT panel type (2) gives us normal
......
...@@ -255,14 +255,14 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp) ...@@ -255,14 +255,14 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp)
struct drm_i915_private *dev_priv = to_i915(dev); struct drm_i915_private *dev_priv = to_i915(dev);
uint32_t max_sleep_time = 0x1f; uint32_t max_sleep_time = 0x1f;
/* Lately it was identified that depending on panel idle frame count /*
* calculated at HW can be off by 1. So let's use what came * Let's respect VBT in case VBT asks a higher idle_frame value.
* from VBT + 1. * Let's use 6 as the minimum to cover all known cases including
* There are also other cases where panel demands at least 4 * the off-by-one issue that HW has in some cases. Also there are
* but VBT is not being set. To cover these 2 cases lets use * cases where sink should be able to train
* at least 5 when VBT isn't set to be on the safest side. * with the 5 or 6 idle patterns.
*/ */
uint32_t idle_frames = dev_priv->vbt.psr.idle_frames + 1; uint32_t idle_frames = max(6, dev_priv->vbt.psr.idle_frames);
uint32_t val = EDP_PSR_ENABLE; uint32_t val = EDP_PSR_ENABLE;
val |= max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT; val |= max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment