Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 307119
b: refs/heads/master
c: 2911a35
h: refs/heads/master
i:
  307117: 5ee2c0d
  307115: 0b740ed
  307111: 6de5a8c
  307103: 8a9e7e1
v: v3
  • Loading branch information
Ben Widawsky authored and Daniel Vetter committed Apr 12, 2012
1 parent 0acc1ae commit f8b47ad
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 67 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9a5a53b3923d6e8cc4d3b352301059ac6b5c8f68
refs/heads/master: 2911a35b2e4eb87ec48d03aeb11f019e51ae3c0d
15 changes: 15 additions & 0 deletions trunk/drivers/gpu/drm/i915/i915_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,21 @@ void intel_detect_pch(struct drm_device *dev)
}
}

bool i915_semaphore_is_enabled(struct drm_device *dev)
{
if (INTEL_INFO(dev)->gen < 6)
return 0;

if (i915_semaphores >= 0)
return i915_semaphores;

/* Enable semaphores on SNB when IO remapping is off */
if (INTEL_INFO(dev)->gen == 6)
return !intel_iommu_enabled;

return 1;
}

void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv)
{
int count;
Expand Down
4 changes: 4 additions & 0 deletions trunk/drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include <linux/i2c-algo-bit.h>
#include <drm/intel-gtt.h>
#include <linux/backlight.h>
#include <linux/intel-iommu.h>

/* General customization:
*/
Expand Down Expand Up @@ -1230,6 +1231,8 @@ void i915_gem_lastclose(struct drm_device *dev);

int __must_check i915_mutex_lock_interruptible(struct drm_device *dev);
int __must_check i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj);
int i915_gem_object_sync(struct drm_i915_gem_object *obj,
struct intel_ring_buffer *to);
void i915_gem_object_move_to_active(struct drm_i915_gem_object *obj,
struct intel_ring_buffer *ring,
u32 seqno);
Expand Down Expand Up @@ -1439,6 +1442,7 @@ extern void gen6_set_rps(struct drm_device *dev, u8 val);
extern void intel_detect_pch(struct drm_device *dev);
extern int intel_trans_dp_port_sel(struct drm_crtc *crtc);

extern bool i915_semaphore_is_enabled(struct drm_device *dev);
extern void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv);
extern void __gen6_gt_force_wake_mt_get(struct drm_i915_private *dev_priv);
extern void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv);
Expand Down
51 changes: 44 additions & 7 deletions trunk/drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -1953,6 +1953,48 @@ i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj)
return 0;
}

int
i915_gem_object_sync(struct drm_i915_gem_object *obj,
struct intel_ring_buffer *to)
{
struct intel_ring_buffer *from = obj->ring;
u32 seqno;
int ret, idx;

if (from == NULL || to == from)
return 0;

if (!i915_semaphore_is_enabled(obj->base.dev))
return i915_gem_object_wait_rendering(obj);

idx = intel_ring_sync_index(from, to);

seqno = obj->last_rendering_seqno;
if (seqno <= from->sync_seqno[idx])
return 0;

if (seqno == from->outstanding_lazy_request) {
struct drm_i915_gem_request *request;

request = kzalloc(sizeof(*request), GFP_KERNEL);
if (request == NULL)
return -ENOMEM;

ret = i915_add_request(from, NULL, request);
if (ret) {
kfree(request);
return ret;
}

seqno = request->seqno;
}

from->sync_seqno[idx] = seqno;

return to->sync_to(to, from, seqno - 1);

}

static void i915_gem_object_finish_gtt(struct drm_i915_gem_object *obj)
{
u32 old_write_domain, old_read_domains;
Expand Down Expand Up @@ -2926,11 +2968,6 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
* Prepare buffer for display plane (scanout, cursors, etc).
* Can be called from an uninterruptible phase (modesetting) and allows
* any flushes to be pipelined (for pageflips).
*
* For the display plane, we want to be in the GTT but out of any write
* domains. So in many ways this looks like set_to_gtt_domain() apart from the
* ability to pipeline the waits, pinning and any additional subtleties
* that may differentiate the display plane from ordinary buffers.
*/
int
i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
Expand All @@ -2945,8 +2982,8 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
return ret;

if (pipelined != obj->ring) {
ret = i915_gem_object_wait_rendering(obj);
if (ret == -ERESTARTSYS)
ret = i915_gem_object_sync(obj, pipelined);
if (ret)
return ret;
}

Expand Down
60 changes: 1 addition & 59 deletions trunk/drivers/gpu/drm/i915/i915_gem_execbuffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -835,64 +835,6 @@ i915_gem_execbuffer_flush(struct drm_device *dev,
return 0;
}

static bool
intel_enable_semaphores(struct drm_device *dev)
{
if (INTEL_INFO(dev)->gen < 6)
return 0;

if (i915_semaphores >= 0)
return i915_semaphores;

/* Disable semaphores on SNB */
if (INTEL_INFO(dev)->gen == 6)
return 0;

return 1;
}

static int
i915_gem_execbuffer_sync_rings(struct drm_i915_gem_object *obj,
struct intel_ring_buffer *to)
{
struct intel_ring_buffer *from = obj->ring;
u32 seqno;
int ret, idx;

if (from == NULL || to == from)
return 0;

/* XXX gpu semaphores are implicated in various hard hangs on SNB */
if (!intel_enable_semaphores(obj->base.dev))
return i915_gem_object_wait_rendering(obj);

idx = intel_ring_sync_index(from, to);

seqno = obj->last_rendering_seqno;
if (seqno <= from->sync_seqno[idx])
return 0;

if (seqno == from->outstanding_lazy_request) {
struct drm_i915_gem_request *request;

request = kzalloc(sizeof(*request), GFP_KERNEL);
if (request == NULL)
return -ENOMEM;

ret = i915_add_request(from, NULL, request);
if (ret) {
kfree(request);
return ret;
}

seqno = request->seqno;
}

from->sync_seqno[idx] = seqno;

return to->sync_to(to, from, seqno - 1);
}

static int
i915_gem_execbuffer_wait_for_flips(struct intel_ring_buffer *ring, u32 flips)
{
Expand Down Expand Up @@ -954,7 +896,7 @@ i915_gem_execbuffer_move_to_gpu(struct intel_ring_buffer *ring,
}

list_for_each_entry(obj, objects, exec_list) {
ret = i915_gem_execbuffer_sync_rings(obj, ring);
ret = i915_gem_object_sync(obj, ring);
if (ret)
return ret;
}
Expand Down

0 comments on commit f8b47ad

Please sign in to comment.