Merge tag 'drm-intel-fixes-2014-07-24' of git://anongit.freedesktop.org/drm-intel into drm-fixes
This time in time! Just 32bit-pae fix from Hugh, semaphores fun from Chris and a fix for runtime pm cherry-picked from next. Paulo is still working on a fix for runtime pm when X does cursor fun when the display is off, but that one isn't ready yet. * tag 'drm-intel-fixes-2014-07-24' of git://anongit.freedesktop.org/drm-intel: drm/i915: Simplify i915_gem_release_all_mmaps() drm/i915: fix freeze with blank screen booting highmem drm/i915: Reorder the semaphore deadlock check, again
This commit is contained in:
commit
9d6ed3c695
|
@ -1616,22 +1616,6 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void i915_gem_release_all_mmaps(struct drm_i915_private *dev_priv)
|
|
||||||
{
|
|
||||||
struct i915_vma *vma;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Only the global gtt is relevant for gtt memory mappings, so restrict
|
|
||||||
* list traversal to objects bound into the global address space. Note
|
|
||||||
* that the active list should be empty, but better safe than sorry.
|
|
||||||
*/
|
|
||||||
WARN_ON(!list_empty(&dev_priv->gtt.base.active_list));
|
|
||||||
list_for_each_entry(vma, &dev_priv->gtt.base.active_list, mm_list)
|
|
||||||
i915_gem_release_mmap(vma->obj);
|
|
||||||
list_for_each_entry(vma, &dev_priv->gtt.base.inactive_list, mm_list)
|
|
||||||
i915_gem_release_mmap(vma->obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* i915_gem_release_mmap - remove physical page mappings
|
* i915_gem_release_mmap - remove physical page mappings
|
||||||
* @obj: obj in question
|
* @obj: obj in question
|
||||||
|
@ -1657,6 +1641,15 @@ i915_gem_release_mmap(struct drm_i915_gem_object *obj)
|
||||||
obj->fault_mappable = false;
|
obj->fault_mappable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
i915_gem_release_all_mmaps(struct drm_i915_private *dev_priv)
|
||||||
|
{
|
||||||
|
struct drm_i915_gem_object *obj;
|
||||||
|
|
||||||
|
list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list)
|
||||||
|
i915_gem_release_mmap(obj);
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size, int tiling_mode)
|
i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size, int tiling_mode)
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
struct i915_render_state {
|
struct i915_render_state {
|
||||||
struct drm_i915_gem_object *obj;
|
struct drm_i915_gem_object *obj;
|
||||||
unsigned long ggtt_offset;
|
unsigned long ggtt_offset;
|
||||||
void *batch;
|
u32 *batch;
|
||||||
u32 size;
|
u32 size;
|
||||||
u32 len;
|
u32 len;
|
||||||
};
|
};
|
||||||
|
@ -80,7 +80,7 @@ free:
|
||||||
|
|
||||||
static void render_state_free(struct i915_render_state *so)
|
static void render_state_free(struct i915_render_state *so)
|
||||||
{
|
{
|
||||||
kunmap(so->batch);
|
kunmap(kmap_to_page(so->batch));
|
||||||
i915_gem_object_ggtt_unpin(so->obj);
|
i915_gem_object_ggtt_unpin(so->obj);
|
||||||
drm_gem_object_unreference(&so->obj->base);
|
drm_gem_object_unreference(&so->obj->base);
|
||||||
kfree(so);
|
kfree(so);
|
||||||
|
|
|
@ -2845,7 +2845,7 @@ static int semaphore_passed(struct intel_engine_cs *ring)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = ring->dev->dev_private;
|
struct drm_i915_private *dev_priv = ring->dev->dev_private;
|
||||||
struct intel_engine_cs *signaller;
|
struct intel_engine_cs *signaller;
|
||||||
u32 seqno, ctl;
|
u32 seqno;
|
||||||
|
|
||||||
ring->hangcheck.deadlock++;
|
ring->hangcheck.deadlock++;
|
||||||
|
|
||||||
|
@ -2857,15 +2857,12 @@ static int semaphore_passed(struct intel_engine_cs *ring)
|
||||||
if (signaller->hangcheck.deadlock >= I915_NUM_RINGS)
|
if (signaller->hangcheck.deadlock >= I915_NUM_RINGS)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* cursory check for an unkickable deadlock */
|
|
||||||
ctl = I915_READ_CTL(signaller);
|
|
||||||
if (ctl & RING_WAIT_SEMAPHORE && semaphore_passed(signaller) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (i915_seqno_passed(signaller->get_seqno(signaller, false), seqno))
|
if (i915_seqno_passed(signaller->get_seqno(signaller, false), seqno))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (signaller->hangcheck.deadlock)
|
/* cursory check for an unkickable deadlock */
|
||||||
|
if (I915_READ_CTL(signaller) & RING_WAIT_SEMAPHORE &&
|
||||||
|
semaphore_passed(signaller) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue