[Nouveau] [kernel PATCH] drm/nouveau: add NOUVEAU_GEM_RELOC_HILO

Marcin Slusarz marcin.slusarz at gmail.com
Wed Jan 12 12:43:49 PST 2011


add new relocation flag which allows to halving number of relocation
entries on >= nv50 cards

Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com>
---
 drivers/gpu/drm/nouveau/nouveau_gem.c |   22 +++++++++++++++-------
 include/drm/nouveau_drm.h             |    1 +
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index 9a1fdcf..2e21412 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -507,6 +507,7 @@ nouveau_gem_pushbuf_reloc_apply(struct drm_device *dev,
 		struct drm_nouveau_gem_pushbuf_bo *b;
 		struct nouveau_bo *nvbo;
 		uint32_t data;
+		uint32_t data2;
 
 		if (unlikely(r->bo_index > req->nr_buffers)) {
 			NV_ERROR(dev, "reloc bo index invalid\n");
@@ -544,17 +545,22 @@ nouveau_gem_pushbuf_reloc_apply(struct drm_device *dev,
 
 		if (r->flags & NOUVEAU_GEM_RELOC_LOW)
 			data = b->presumed.offset + r->data;
-		else
-		if (r->flags & NOUVEAU_GEM_RELOC_HIGH)
+		else if (r->flags & NOUVEAU_GEM_RELOC_HIGH)
 			data = (b->presumed.offset + r->data) >> 32;
-		else
+		else if (r->flags & NOUVEAU_GEM_RELOC_HILO) {
+			data = (b->presumed.offset + r->data) >> 32;
+			data2 = b->presumed.offset + r->data;
+		} else
 			data = r->data;
 
 		if (r->flags & NOUVEAU_GEM_RELOC_OR) {
-			if (b->presumed.domain == NOUVEAU_GEM_DOMAIN_GART)
-				data |= r->tor;
-			else
-				data |= r->vor;
+			if (b->presumed.domain == NOUVEAU_GEM_DOMAIN_GART) {
+				data  |= r->tor;
+				data2 |= r->tor;
+			} else {
+				data  |= r->vor;
+				data2 |= r->vor;
+			}
 		}
 
 		spin_lock(&nvbo->bo.lock);
@@ -566,6 +572,8 @@ nouveau_gem_pushbuf_reloc_apply(struct drm_device *dev,
 		}
 
 		nouveau_bo_wr32(nvbo, r->reloc_bo_offset >> 2, data);
+		if (r->flags & NOUVEAU_GEM_RELOC_HILO)
+			nouveau_bo_wr32(nvbo, (r->reloc_bo_offset >> 2) + 1, data2);
 	}
 
 	kfree(reloc);
diff --git a/include/drm/nouveau_drm.h b/include/drm/nouveau_drm.h
index bc5590b..126ea8a 100644
--- a/include/drm/nouveau_drm.h
+++ b/include/drm/nouveau_drm.h
@@ -137,6 +137,7 @@ struct drm_nouveau_gem_pushbuf_bo {
 #define NOUVEAU_GEM_RELOC_LOW  (1 << 0)
 #define NOUVEAU_GEM_RELOC_HIGH (1 << 1)
 #define NOUVEAU_GEM_RELOC_OR   (1 << 2)
+#define NOUVEAU_GEM_RELOC_HILO (1 << 3)
 #define NOUVEAU_GEM_MAX_RELOCS 1024
 struct drm_nouveau_gem_pushbuf_reloc {
 	uint32_t reloc_bo_index;
-- 
1.7.3.3



More information about the Nouveau mailing list