Commit 9d6ed3c6 authored by Dave Airlie's avatar Dave Airlie

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
parents ec8a362f eedd10f4
...@@ -1616,22 +1616,6 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) ...@@ -1616,22 +1616,6 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
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) ...@@ -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 @@ ...@@ -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 @@ static struct i915_render_state *render_state_alloc(struct drm_device *dev) ...@@ -80,7 +80,7 @@ static struct i915_render_state *render_state_alloc(struct drm_device *dev)
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) ...@@ -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) ...@@ -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;
......
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