OSDN Git Service

drm/nouveau/fifo/gk104: take runlist target into account
authorAlexandre Courbot <acourbot@nvidia.com>
Tue, 1 Mar 2016 07:51:58 +0000 (16:51 +0900)
committerBen Skeggs <bskeggs@redhat.com>
Mon, 14 Mar 2016 00:13:31 +0000 (10:13 +1000)
Bits 28:29 of RUNLIST_BASE specify the memory target of the runlist. Set
it to 0x3 (SYS_MEM_NONCOHERENT) if the runlist object resides in system
memory.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c

index d6a88cf..cd0f08a 100644 (file)
@@ -55,6 +55,7 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, u32 engine)
        struct nvkm_device *device = subdev->device;
        struct nvkm_memory *cur;
        int nr = 0;
+       int target;
 
        mutex_lock(&subdev->mutex);
        cur = engn->runlist[engn->cur_runlist];
@@ -68,7 +69,10 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, u32 engine)
        }
        nvkm_done(cur);
 
-       nvkm_wr32(device, 0x002270, nvkm_memory_addr(cur) >> 12);
+       target = (nvkm_memory_target(cur) == NVKM_MEM_TARGET_HOST) ? 0x3 : 0x0;
+
+       nvkm_wr32(device, 0x002270, (nvkm_memory_addr(cur) >> 12) |
+                                   (target << 28));
        nvkm_wr32(device, 0x002274, (engine << 20) | nr);
 
        if (wait_event_timeout(engn->wait, !(nvkm_rd32(device, 0x002284 +