Commit 6d7c2a67 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-intel-fixes-2014-03-04' of ssh://git.freedesktop.org/git/drm-intel into drm-fixes

Small fixes all around, mostly stable material. Please pull.

* tag 'drm-intel-fixes-2014-03-04' of ssh://git.freedesktop.org/git/drm-intel:
  drm/i915: Reject >165MHz modes w/ DVI monitors
  drm/i915: fix assert_cursor on BDW
  drm/i915: vlv: reserve GT power context early
  drm/i915: fix pch pci device enumeration
  drm/i915: Resolving the memory region conflict for Stolen area
  drm/i915: use backlight legacy combination mode also for i915gm/i945gm
parents 878eaf61 6375b768
...@@ -403,7 +403,7 @@ MODULE_DEVICE_TABLE(pci, pciidlist); ...@@ -403,7 +403,7 @@ MODULE_DEVICE_TABLE(pci, pciidlist);
void intel_detect_pch(struct drm_device *dev) void intel_detect_pch(struct drm_device *dev)
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct pci_dev *pch; struct pci_dev *pch = NULL;
/* In all current cases, num_pipes is equivalent to the PCH_NOP setting /* In all current cases, num_pipes is equivalent to the PCH_NOP setting
* (which really amounts to a PCH but no South Display). * (which really amounts to a PCH but no South Display).
...@@ -424,12 +424,9 @@ void intel_detect_pch(struct drm_device *dev) ...@@ -424,12 +424,9 @@ void intel_detect_pch(struct drm_device *dev)
* all the ISA bridge devices and check for the first match, instead * all the ISA bridge devices and check for the first match, instead
* of only checking the first one. * of only checking the first one.
*/ */
pch = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, NULL); while ((pch = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, pch))) {
while (pch) {
struct pci_dev *curr = pch;
if (pch->vendor == PCI_VENDOR_ID_INTEL) { if (pch->vendor == PCI_VENDOR_ID_INTEL) {
unsigned short id; unsigned short id = pch->device & INTEL_PCH_DEVICE_ID_MASK;
id = pch->device & INTEL_PCH_DEVICE_ID_MASK;
dev_priv->pch_id = id; dev_priv->pch_id = id;
if (id == INTEL_PCH_IBX_DEVICE_ID_TYPE) { if (id == INTEL_PCH_IBX_DEVICE_ID_TYPE) {
...@@ -461,18 +458,16 @@ void intel_detect_pch(struct drm_device *dev) ...@@ -461,18 +458,16 @@ void intel_detect_pch(struct drm_device *dev)
DRM_DEBUG_KMS("Found LynxPoint LP PCH\n"); DRM_DEBUG_KMS("Found LynxPoint LP PCH\n");
WARN_ON(!IS_HASWELL(dev)); WARN_ON(!IS_HASWELL(dev));
WARN_ON(!IS_ULT(dev)); WARN_ON(!IS_ULT(dev));
} else { } else
goto check_next; continue;
}
pci_dev_put(pch);
break; break;
} }
check_next:
pch = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, curr);
pci_dev_put(curr);
} }
if (!pch) if (!pch)
DRM_DEBUG_KMS("No PCH found?\n"); DRM_DEBUG_KMS("No PCH found.\n");
pci_dev_put(pch);
} }
bool i915_semaphore_is_enabled(struct drm_device *dev) bool i915_semaphore_is_enabled(struct drm_device *dev)
......
...@@ -81,11 +81,24 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev) ...@@ -81,11 +81,24 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
*/ */
r = devm_request_mem_region(dev->dev, base, dev_priv->gtt.stolen_size, r = devm_request_mem_region(dev->dev, base, dev_priv->gtt.stolen_size,
"Graphics Stolen Memory"); "Graphics Stolen Memory");
if (r == NULL) {
/*
* One more attempt but this time requesting region from
* base + 1, as we have seen that this resolves the region
* conflict with the PCI Bus.
* This is a BIOS w/a: Some BIOS wrap stolen in the root
* PCI bus, but have an off-by-one error. Hence retry the
* reservation starting from 1 instead of 0.
*/
r = devm_request_mem_region(dev->dev, base + 1,
dev_priv->gtt.stolen_size - 1,
"Graphics Stolen Memory");
if (r == NULL) { if (r == NULL) {
DRM_ERROR("conflict detected with stolen region: [0x%08x - 0x%08x]\n", DRM_ERROR("conflict detected with stolen region: [0x%08x - 0x%08x]\n",
base, base + (uint32_t)dev_priv->gtt.stolen_size); base, base + (uint32_t)dev_priv->gtt.stolen_size);
base = 0; base = 0;
} }
}
return base; return base;
} }
......
...@@ -1092,12 +1092,12 @@ static void assert_cursor(struct drm_i915_private *dev_priv, ...@@ -1092,12 +1092,12 @@ static void assert_cursor(struct drm_i915_private *dev_priv,
struct drm_device *dev = dev_priv->dev; struct drm_device *dev = dev_priv->dev;
bool cur_state; bool cur_state;
if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) if (IS_845G(dev) || IS_I865G(dev))
cur_state = I915_READ(CURCNTR_IVB(pipe)) & CURSOR_MODE;
else if (IS_845G(dev) || IS_I865G(dev))
cur_state = I915_READ(_CURACNTR) & CURSOR_ENABLE; cur_state = I915_READ(_CURACNTR) & CURSOR_ENABLE;
else else if (INTEL_INFO(dev)->gen <= 6 || IS_VALLEYVIEW(dev))
cur_state = I915_READ(CURCNTR(pipe)) & CURSOR_MODE; cur_state = I915_READ(CURCNTR(pipe)) & CURSOR_MODE;
else
cur_state = I915_READ(CURCNTR_IVB(pipe)) & CURSOR_MODE;
WARN(cur_state != state, WARN(cur_state != state,
"cursor on pipe %c assertion failure (expected %s, current %s)\n", "cursor on pipe %c assertion failure (expected %s, current %s)\n",
......
...@@ -845,7 +845,7 @@ static int hdmi_portclock_limit(struct intel_hdmi *hdmi) ...@@ -845,7 +845,7 @@ static int hdmi_portclock_limit(struct intel_hdmi *hdmi)
{ {
struct drm_device *dev = intel_hdmi_to_dev(hdmi); struct drm_device *dev = intel_hdmi_to_dev(hdmi);
if (IS_G4X(dev)) if (!hdmi->has_hdmi_sink || IS_G4X(dev))
return 165000; return 165000;
else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8)
return 300000; return 300000;
...@@ -899,8 +899,8 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder, ...@@ -899,8 +899,8 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,
* outputs. We also need to check that the higher clock still fits * outputs. We also need to check that the higher clock still fits
* within limits. * within limits.
*/ */
if (pipe_config->pipe_bpp > 8*3 && clock_12bpc <= portclock_limit if (pipe_config->pipe_bpp > 8*3 && intel_hdmi->has_hdmi_sink &&
&& HAS_PCH_SPLIT(dev)) { clock_12bpc <= portclock_limit && HAS_PCH_SPLIT(dev)) {
DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n"); DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
desired_bpp = 12*3; desired_bpp = 12*3;
......
...@@ -698,7 +698,7 @@ static void i9xx_enable_backlight(struct intel_connector *connector) ...@@ -698,7 +698,7 @@ static void i9xx_enable_backlight(struct intel_connector *connector)
freq /= 0xff; freq /= 0xff;
ctl = freq << 17; ctl = freq << 17;
if (IS_GEN2(dev) && panel->backlight.combination_mode) if (panel->backlight.combination_mode)
ctl |= BLM_LEGACY_MODE; ctl |= BLM_LEGACY_MODE;
if (IS_PINEVIEW(dev) && panel->backlight.active_low_pwm) if (IS_PINEVIEW(dev) && panel->backlight.active_low_pwm)
ctl |= BLM_POLARITY_PNV; ctl |= BLM_POLARITY_PNV;
...@@ -979,7 +979,7 @@ static int i9xx_setup_backlight(struct intel_connector *connector) ...@@ -979,7 +979,7 @@ static int i9xx_setup_backlight(struct intel_connector *connector)
ctl = I915_READ(BLC_PWM_CTL); ctl = I915_READ(BLC_PWM_CTL);
if (IS_GEN2(dev)) if (IS_GEN2(dev) || IS_I915GM(dev) || IS_I945GM(dev))
panel->backlight.combination_mode = ctl & BLM_LEGACY_MODE; panel->backlight.combination_mode = ctl & BLM_LEGACY_MODE;
if (IS_PINEVIEW(dev)) if (IS_PINEVIEW(dev))
......
...@@ -3493,6 +3493,8 @@ static void valleyview_setup_pctx(struct drm_device *dev) ...@@ -3493,6 +3493,8 @@ static void valleyview_setup_pctx(struct drm_device *dev)
u32 pcbr; u32 pcbr;
int pctx_size = 24*1024; int pctx_size = 24*1024;
WARN_ON(!mutex_is_locked(&dev->struct_mutex));
pcbr = I915_READ(VLV_PCBR); pcbr = I915_READ(VLV_PCBR);
if (pcbr) { if (pcbr) {
/* BIOS set it up already, grab the pre-alloc'd space */ /* BIOS set it up already, grab the pre-alloc'd space */
...@@ -3542,8 +3544,6 @@ static void valleyview_enable_rps(struct drm_device *dev) ...@@ -3542,8 +3544,6 @@ static void valleyview_enable_rps(struct drm_device *dev)
I915_WRITE(GTFIFODBG, gtfifodbg); I915_WRITE(GTFIFODBG, gtfifodbg);
} }
valleyview_setup_pctx(dev);
/* If VLV, Forcewake all wells, else re-direct to regular path */ /* If VLV, Forcewake all wells, else re-direct to regular path */
gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL); gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL);
...@@ -4395,6 +4395,8 @@ void intel_enable_gt_powersave(struct drm_device *dev) ...@@ -4395,6 +4395,8 @@ void intel_enable_gt_powersave(struct drm_device *dev)
ironlake_enable_rc6(dev); ironlake_enable_rc6(dev);
intel_init_emon(dev); intel_init_emon(dev);
} else if (IS_GEN6(dev) || IS_GEN7(dev)) { } else if (IS_GEN6(dev) || IS_GEN7(dev)) {
if (IS_VALLEYVIEW(dev))
valleyview_setup_pctx(dev);
/* /*
* PCU communication is slow and this doesn't need to be * PCU communication is slow and this doesn't need to be
* done at any specific time, so do this out of our fast path * done at any specific time, so do this out of our fast path
......
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