diff options
| -rw-r--r-- | linux-core/i915_drv.c | 6 | ||||
| -rw-r--r-- | linux-core/i915_fence.c | 2 | ||||
| -rw-r--r-- | shared-core/i915_dma.c | 8 | ||||
| -rw-r--r-- | shared-core/i915_drv.h | 3 | 
4 files changed, 12 insertions, 7 deletions
diff --git a/linux-core/i915_drv.c b/linux-core/i915_drv.c index 4c35b4c3..49437066 100644 --- a/linux-core/i915_drv.c +++ b/linux-core/i915_drv.c @@ -41,9 +41,9 @@ static struct pci_device_id pciidlist[] = {  #ifdef I915_HAVE_FENCE  static drm_fence_driver_t i915_fence_driver = {  	.num_classes = 1, -	.wrap_diff = (1 << 30), -	.flush_diff = (1 << 29), -	.sequence_mask = 0x7fffffffU, +	.wrap_diff = (1U << (BREADCRUMB_BITS - 1)), +	.flush_diff = (1U << (BREADCRUMB_BITS - 2)), +	.sequence_mask = BREADCRUMB_MASK,  	.lazy_capable = 1,  	.emit = i915_fence_emit_sequence,  	.poke_flush = i915_poke_flush, diff --git a/linux-core/i915_fence.c b/linux-core/i915_fence.c index 88daa57c..00873485 100644 --- a/linux-core/i915_fence.c +++ b/linux-core/i915_fence.c @@ -61,7 +61,7 @@ static void i915_perform_flush(drm_device_t * dev)  		 * First update fences with the current breadcrumb.  		 */ -		diff = sequence - fc->last_exe_flush; +		diff = (sequence - fc->last_exe_flush) & BREADCRUMB_MASK;  		if (diff < driver->wrap_diff && diff != 0) {  			drm_fence_handler(dev, 0, sequence, DRM_FENCE_TYPE_EXE);  		} diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index ebb184cc..dbc5f959 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -445,10 +445,12 @@ void i915_emit_breadcrumb(drm_device_t *dev)  	drm_i915_private_t *dev_priv = dev->dev_private;  	RING_LOCALS; -	dev_priv->sarea_priv->last_enqueue = ++dev_priv->counter; +	if (++dev_priv->counter > BREADCRUMB_MASK) { +		 dev_priv->counter = 1; +		 DRM_DEBUG("Breadcrumb counter wrapped around\n"); +	} -	if (dev_priv->counter > 0x7FFFFFFFUL) -		 dev_priv->sarea_priv->last_enqueue = dev_priv->counter = 1; +	dev_priv->sarea_priv->last_enqueue = dev_priv->counter;  	BEGIN_LP_RING(4);  	OUT_RING(CMD_STORE_DWORD_IDX); diff --git a/shared-core/i915_drv.h b/shared-core/i915_drv.h index 9deee8ec..e0432996 100644 --- a/shared-core/i915_drv.h +++ b/shared-core/i915_drv.h @@ -363,6 +363,9 @@ extern int i915_wait_ring(drm_device_t * dev, int n, const char *caller);  #define CMD_OP_DESTBUFFER_INFO	 ((0x3<<29)|(0x1d<<24)|(0x8e<<16)|1) +#define BREADCRUMB_BITS 31 +#define BREADCRUMB_MASK ((1U << BREADCRUMB_BITS) - 1) +  #define READ_BREADCRUMB(dev_priv)  (((volatile u32*)(dev_priv->hw_status_page))[5])  #define READ_HWSP(dev_priv, reg)  (((volatile u32*)(dev_priv->hw_status_page))[reg])  #endif  | 
