diff options
| -rw-r--r-- | linux-core/nouveau_buffer.c | 8 | ||||
| -rw-r--r-- | linux-core/nouveau_fence.c | 17 | ||||
| -rw-r--r-- | shared-core/nouveau_drv.h | 6 | ||||
| -rw-r--r-- | shared-core/nouveau_irq.c | 4 | 
4 files changed, 20 insertions, 15 deletions
| diff --git a/linux-core/nouveau_buffer.c b/linux-core/nouveau_buffer.c index 82093468..7683defb 100644 --- a/linux-core/nouveau_buffer.c +++ b/linux-core/nouveau_buffer.c @@ -55,7 +55,6 @@ nouveau_bo_fence_type(struct drm_buffer_object *bo,  		      uint32_t *fclass, uint32_t *type)  {  	*fclass = 0; -  	if (bo->mem.mask & (DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE))  		*type = 3;  	else @@ -167,7 +166,7 @@ nouveau_bo_move_m2mf(struct drm_buffer_object *bo, int evict, int no_wait,  		dchan->m2mf_dma_destin = dsth;  		BEGIN_RING(NvSubM2MF, -				NV_MEMORY_TO_MEMORY_FORMAT_SET_DMA_SOURCE, 2); +			   NV_MEMORY_TO_MEMORY_FORMAT_SET_DMA_SOURCE, 2);  		OUT_RING  (dchan->m2mf_dma_source);  		OUT_RING  (dchan->m2mf_dma_destin);  	} @@ -191,9 +190,8 @@ nouveau_bo_move_m2mf(struct drm_buffer_object *bo, int evict, int no_wait,  		page_count -= line_count;  	} -	return drm_bo_move_accel_cleanup(bo, evict, no_wait, 0, -			DRM_FENCE_TYPE_EXE, -			0, new_mem); +	return drm_bo_move_accel_cleanup(bo, evict, no_wait, dchan->chan->id, +					 DRM_FENCE_TYPE_EXE, 0, new_mem);  }  static int diff --git a/linux-core/nouveau_fence.c b/linux-core/nouveau_fence.c index e510aec7..f0e62861 100644 --- a/linux-core/nouveau_fence.c +++ b/linux-core/nouveau_fence.c @@ -54,13 +54,17 @@ nouveau_fence_emit(struct drm_device *dev, uint32_t class, uint32_t flags,  	DRM_DEBUG("class=%d, flags=0x%08x\n", class, flags); -	/* We can't emit fences on client channels */ -	if (chan != dchan->chan) -		return 0; - -	*breadcrumb  = ++dchan->next_sequence; +	/* We can't emit fences on client channels, update sequence number +	 * and userspace will emit the fence +	 */ +	*breadcrumb  = ++chan->next_sequence;  	*native_type = DRM_FENCE_TYPE_EXE; +	if (chan != dchan->chan) { +		DRM_DEBUG("user fence 0x%08x\n", *breadcrumb); +		return 0; +	} +	DRM_DEBUG("emit 0x%08x\n", *breadcrumb);  	BEGIN_RING(NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_SET_REF, 1);  	OUT_RING  (*breadcrumb);  	BEGIN_RING(NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1); @@ -83,10 +87,13 @@ nouveau_fence_perform_flush(struct drm_device *dev, uint32_t class)  	pending_types = fc->pending_flush |  			((fc->pending_exe_flush) ? DRM_FENCE_TYPE_EXE : 0); +	DRM_DEBUG("pending: 0x%08x 0x%08x\n", pending_types, +					      fc->pending_flush);  	if (pending_types) {  		uint32_t sequence = NV_READ(NV03_FIFO_REGS(class) + 0x48); +		DRM_DEBUG("got 0x%08x\n", sequence);  		drm_fence_handler(dev, class, sequence, pending_types, 0);  	}  } diff --git a/shared-core/nouveau_drv.h b/shared-core/nouveau_drv.h index d35d670d..b881bead 100644 --- a/shared-core/nouveau_drv.h +++ b/shared-core/nouveau_drv.h @@ -106,6 +106,9 @@ struct nouveau_channel  	/* mapping of the regs controling the fifo */  	drm_local_map_t *regs; +	/* Fencing */ +	uint32_t next_sequence; +  	/* DMA push buffer */  	struct nouveau_gpuobj_ref *pushbuf;  	struct mem_block          *pushbuf_mem; @@ -146,9 +149,6 @@ struct nouveau_drm_channel {  	/* Notifiers */  	uint32_t notify0_offset; -        /* Fences */ -        uint32_t next_sequence; -  	/* Buffer moves */  	uint32_t m2mf_dma_source;  	uint32_t m2mf_dma_destin; diff --git a/shared-core/nouveau_irq.c b/shared-core/nouveau_irq.c index e3fb62f4..1a52a584 100644 --- a/shared-core/nouveau_irq.c +++ b/shared-core/nouveau_irq.c @@ -115,7 +115,7 @@ nouveau_fifo_irq_handler(struct drm_device *dev)  		}  		if (status) { -			DRM_INFO("Unhandled PFIFO_INTR - 0x%8x\n", status); +			DRM_INFO("Unhandled PFIFO_INTR - 0x%08x\n", status);  			NV_WRITE(NV03_PFIFO_INTR_0, status);  		} @@ -395,7 +395,7 @@ nouveau_pgraph_irq_handler(struct drm_device *dev)  		}  		if (status) { -			DRM_INFO("Unhandled PGRAPH_INTR - 0x%8x\n", status); +			DRM_INFO("Unhandled PGRAPH_INTR - 0x%08x\n", status);  			NV_WRITE(NV03_PGRAPH_INTR, status);  		} | 
