summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--linux-core/nouveau_buffer.c8
-rw-r--r--linux-core/nouveau_fence.c17
-rw-r--r--shared-core/nouveau_drv.h6
-rw-r--r--shared-core/nouveau_irq.c4
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);
}