Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull intel and dp mst drm fixes from Dave Airlie: "Intel had a few more fixes lined up and no point me sitting on them, along with a DP MST fix from Rob for a race at undock + vt switch" * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: drm: fix fb-helper vs MST dangling connector ptrs (v2) drm/i915: BDW Fix Halo PCI IDs marked as ULT. drm/i915: Fix and clean BDW PCH identification drm/i915: Only fence tiled region of object. drm/i915: fix inconsistent brightness after resume drm/i915: Init PPGTT before context enable
This commit is contained in:
commit
c6591c8131
5 changed files with 49 additions and 26 deletions
|
@ -145,6 +145,31 @@ int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_fb_helper_add_one_connector);
|
EXPORT_SYMBOL(drm_fb_helper_add_one_connector);
|
||||||
|
|
||||||
|
static void remove_from_modeset(struct drm_mode_set *set,
|
||||||
|
struct drm_connector *connector)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < set->num_connectors; i++) {
|
||||||
|
if (set->connectors[i] == connector)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == set->num_connectors)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (j = i + 1; j < set->num_connectors; j++) {
|
||||||
|
set->connectors[j - 1] = set->connectors[j];
|
||||||
|
}
|
||||||
|
set->num_connectors--;
|
||||||
|
|
||||||
|
/* because i915 is pissy about this..
|
||||||
|
* TODO maybe need to makes sure we set it back to !=NULL somewhere?
|
||||||
|
*/
|
||||||
|
if (set->num_connectors == 0)
|
||||||
|
set->fb = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
|
int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
|
||||||
struct drm_connector *connector)
|
struct drm_connector *connector)
|
||||||
{
|
{
|
||||||
|
@ -167,6 +192,11 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
|
||||||
}
|
}
|
||||||
fb_helper->connector_count--;
|
fb_helper->connector_count--;
|
||||||
kfree(fb_helper_connector);
|
kfree(fb_helper_connector);
|
||||||
|
|
||||||
|
/* also cleanup dangling references to the connector: */
|
||||||
|
for (i = 0; i < fb_helper->crtc_count; i++)
|
||||||
|
remove_from_modeset(&fb_helper->crtc_info[i].mode_set, connector);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_fb_helper_remove_one_connector);
|
EXPORT_SYMBOL(drm_fb_helper_remove_one_connector);
|
||||||
|
|
|
@ -462,19 +462,13 @@ void intel_detect_pch(struct drm_device *dev)
|
||||||
} else if (id == INTEL_PCH_LPT_DEVICE_ID_TYPE) {
|
} else if (id == INTEL_PCH_LPT_DEVICE_ID_TYPE) {
|
||||||
dev_priv->pch_type = PCH_LPT;
|
dev_priv->pch_type = PCH_LPT;
|
||||||
DRM_DEBUG_KMS("Found LynxPoint PCH\n");
|
DRM_DEBUG_KMS("Found LynxPoint PCH\n");
|
||||||
WARN_ON(!IS_HASWELL(dev));
|
WARN_ON(!IS_HASWELL(dev) && !IS_BROADWELL(dev));
|
||||||
WARN_ON(IS_HSW_ULT(dev));
|
WARN_ON(IS_HSW_ULT(dev) || IS_BDW_ULT(dev));
|
||||||
} else if (IS_BROADWELL(dev)) {
|
|
||||||
dev_priv->pch_type = PCH_LPT;
|
|
||||||
dev_priv->pch_id =
|
|
||||||
INTEL_PCH_LPT_LP_DEVICE_ID_TYPE;
|
|
||||||
DRM_DEBUG_KMS("This is Broadwell, assuming "
|
|
||||||
"LynxPoint LP PCH\n");
|
|
||||||
} else if (id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE) {
|
} else if (id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE) {
|
||||||
dev_priv->pch_type = PCH_LPT;
|
dev_priv->pch_type = PCH_LPT;
|
||||||
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) && !IS_BROADWELL(dev));
|
||||||
WARN_ON(!IS_HSW_ULT(dev));
|
WARN_ON(!IS_HSW_ULT(dev) && !IS_BDW_ULT(dev));
|
||||||
} else if (id == INTEL_PCH_SPT_DEVICE_ID_TYPE) {
|
} else if (id == INTEL_PCH_SPT_DEVICE_ID_TYPE) {
|
||||||
dev_priv->pch_type = PCH_SPT;
|
dev_priv->pch_type = PCH_SPT;
|
||||||
DRM_DEBUG_KMS("Found SunrisePoint PCH\n");
|
DRM_DEBUG_KMS("Found SunrisePoint PCH\n");
|
||||||
|
|
|
@ -2159,8 +2159,7 @@ struct drm_i915_cmd_table {
|
||||||
#define IS_HSW_EARLY_SDV(dev) (IS_HASWELL(dev) && \
|
#define IS_HSW_EARLY_SDV(dev) (IS_HASWELL(dev) && \
|
||||||
(INTEL_DEVID(dev) & 0xFF00) == 0x0C00)
|
(INTEL_DEVID(dev) & 0xFF00) == 0x0C00)
|
||||||
#define IS_BDW_ULT(dev) (IS_BROADWELL(dev) && \
|
#define IS_BDW_ULT(dev) (IS_BROADWELL(dev) && \
|
||||||
((INTEL_DEVID(dev) & 0xf) == 0x2 || \
|
((INTEL_DEVID(dev) & 0xf) == 0x6 || \
|
||||||
(INTEL_DEVID(dev) & 0xf) == 0x6 || \
|
|
||||||
(INTEL_DEVID(dev) & 0xf) == 0xe))
|
(INTEL_DEVID(dev) & 0xf) == 0xe))
|
||||||
#define IS_BDW_GT3(dev) (IS_BROADWELL(dev) && \
|
#define IS_BDW_GT3(dev) (IS_BROADWELL(dev) && \
|
||||||
(INTEL_DEVID(dev) & 0x00F0) == 0x0020)
|
(INTEL_DEVID(dev) & 0x00F0) == 0x0020)
|
||||||
|
|
|
@ -3148,6 +3148,13 @@ static void i965_write_fence_reg(struct drm_device *dev, int reg,
|
||||||
u32 size = i915_gem_obj_ggtt_size(obj);
|
u32 size = i915_gem_obj_ggtt_size(obj);
|
||||||
uint64_t val;
|
uint64_t val;
|
||||||
|
|
||||||
|
/* Adjust fence size to match tiled area */
|
||||||
|
if (obj->tiling_mode != I915_TILING_NONE) {
|
||||||
|
uint32_t row_size = obj->stride *
|
||||||
|
(obj->tiling_mode == I915_TILING_Y ? 32 : 8);
|
||||||
|
size = (size / row_size) * row_size;
|
||||||
|
}
|
||||||
|
|
||||||
val = (uint64_t)((i915_gem_obj_ggtt_offset(obj) + size - 4096) &
|
val = (uint64_t)((i915_gem_obj_ggtt_offset(obj) + size - 4096) &
|
||||||
0xfffff000) << 32;
|
0xfffff000) << 32;
|
||||||
val |= i915_gem_obj_ggtt_offset(obj) & 0xfffff000;
|
val |= i915_gem_obj_ggtt_offset(obj) & 0xfffff000;
|
||||||
|
@ -4884,13 +4891,12 @@ i915_gem_init_hw(struct drm_device *dev)
|
||||||
for (i = 0; i < NUM_L3_SLICES(dev); i++)
|
for (i = 0; i < NUM_L3_SLICES(dev); i++)
|
||||||
i915_gem_l3_remap(&dev_priv->ring[RCS], i);
|
i915_gem_l3_remap(&dev_priv->ring[RCS], i);
|
||||||
|
|
||||||
/*
|
ret = i915_ppgtt_init_hw(dev);
|
||||||
* XXX: Contexts should only be initialized once. Doing a switch to the
|
if (ret && ret != -EIO) {
|
||||||
* default context switch however is something we'd like to do after
|
DRM_ERROR("PPGTT enable failed %d\n", ret);
|
||||||
* reset or thaw (the latter may not actually be necessary for HW, but
|
i915_gem_cleanup_ringbuffer(dev);
|
||||||
* goes with our code better). Context switching requires rings (for
|
}
|
||||||
* the do_switch), but before enabling PPGTT. So don't move this.
|
|
||||||
*/
|
|
||||||
ret = i915_gem_context_enable(dev_priv);
|
ret = i915_gem_context_enable(dev_priv);
|
||||||
if (ret && ret != -EIO) {
|
if (ret && ret != -EIO) {
|
||||||
DRM_ERROR("Context enable failed %d\n", ret);
|
DRM_ERROR("Context enable failed %d\n", ret);
|
||||||
|
@ -4899,12 +4905,6 @@ i915_gem_init_hw(struct drm_device *dev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = i915_ppgtt_init_hw(dev);
|
|
||||||
if (ret && ret != -EIO) {
|
|
||||||
DRM_ERROR("PPGTT enable failed %d\n", ret);
|
|
||||||
i915_gem_cleanup_ringbuffer(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -962,7 +962,7 @@ void intel_panel_enable_backlight(struct intel_connector *connector)
|
||||||
|
|
||||||
WARN_ON(panel->backlight.max == 0);
|
WARN_ON(panel->backlight.max == 0);
|
||||||
|
|
||||||
if (panel->backlight.level == 0) {
|
if (panel->backlight.level <= panel->backlight.min) {
|
||||||
panel->backlight.level = panel->backlight.max;
|
panel->backlight.level = panel->backlight.max;
|
||||||
if (panel->backlight.device)
|
if (panel->backlight.device)
|
||||||
panel->backlight.device->props.brightness =
|
panel->backlight.device->props.brightness =
|
||||||
|
|
Loading…
Add table
Reference in a new issue