TTM buffer object's virtual cookie may be an iomem cookie or a kernel
virtual address. These need to be handled separately.

Signed-off-by: Pekka Paalanen <[email protected]>
---
 drivers/gpu/drm/nouveau/nouveau_gem.c |   21 ++++++++++++++-------
 1 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c 
b/drivers/gpu/drm/nouveau/nouveau_gem.c
index 75cae79..6b150fc 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -408,7 +408,7 @@ nouveau_gem_pushbuf_reloc_apply(struct nouveau_channel 
*chan, int nr_bo,
                                struct drm_nouveau_gem_pushbuf_bo *bo,
                                int nr_relocs, uint64_t ptr_relocs,
                                int nr_dwords, int first_dword,
-                               uint32_t *pushbuf)
+                               uint32_t *pushbuf, bool is_iomem)
 {
        struct drm_nouveau_gem_pushbuf_reloc *reloc = NULL;
        struct drm_device *dev = chan->dev;
@@ -451,7 +451,11 @@ nouveau_gem_pushbuf_reloc_apply(struct nouveau_channel 
*chan, int nr_bo,
                                data |= r->vor;
                }
 
-               pushbuf[r->reloc_index] = data;
+               if (is_iomem)
+                       iowrite32_native(data, (void __force __iomem *)
+                                               &pushbuf[r->reloc_index]);
+               else
+                       pushbuf[r->reloc_index] = data;
        }
 
        kfree(reloc);
@@ -516,7 +520,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void 
*data,
                                                      bo, req->nr_relocs,
                                                      req->relocs,
                                                      req->nr_dwords, 0,
-                                                     pushbuf);
+                                                     pushbuf, false);
                if (ret)
                        goto out;
        }
@@ -669,6 +673,8 @@ nouveau_gem_ioctl_pushbuf_call(struct drm_device *dev, void 
*data,
 
        /* Apply any relocations that are required */
        if (do_reloc) {
+               void *pbvirt;
+               bool is_iomem;
                ret = ttm_bo_kmap(&pbbo->bo, 0, pbbo->bo.mem.num_pages,
                                  &pbbo->kmap);
                if (ret) {
@@ -676,17 +682,18 @@ nouveau_gem_ioctl_pushbuf_call(struct drm_device *dev, 
void *data,
                        goto out;
                }
 
+               pbvirt = ttm_kmap_obj_virtual(&pbbo->kmap, &is_iomem);
                ret = nouveau_gem_pushbuf_reloc_apply(chan, req->nr_buffers, bo,
                                                      req->nr_relocs,
                                                      req->relocs,
                                                      req->nr_dwords,
                                                      req->offset / 4,
-                                                     pbbo->kmap.virtual);
+                                                     pbvirt, is_iomem);
 
                if (!PUSHBUF_CAL) {
-                       uint32_t *pushbuf = pbbo->kmap.virtual + req->offset;
-
-                       pushbuf[req->nr_dwords - 2] = req->suffix0;
+                       nouveau_bo_wr32(pbbo,
+                                       req->offset / 4 + req->nr_dwords - 2,
+                                       req->suffix0);
                }
 
                ttm_bo_kunmap(&pbbo->kmap);
-- 
1.6.3.3

_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to