Blob Blame History Raw
From: Ben Skeggs <bskeggs@redhat.com>
Date: Tue, 8 May 2018 20:39:47 +1000
Subject: drm/nouveau/kms/nv50-: separate blocklinear vs linear pitch
Git-commit: b05d873808c77fedd25130b0355acc0da1c11e19
Patch-mainline: v4.18-rc1
References: FATE#326289 FATE#326079 FATE#326049 FATE#322398 FATE#326166

Will be required to support Volta.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 drivers/gpu/drm/nouveau/dispnv50/atom.h     |    6 ++++--
 drivers/gpu/drm/nouveau/dispnv50/base507c.c |    5 +++--
 drivers/gpu/drm/nouveau/dispnv50/base827c.c |    5 +++--
 drivers/gpu/drm/nouveau/dispnv50/base907c.c |    5 +++--
 drivers/gpu/drm/nouveau/dispnv50/head507d.c |    8 +++++---
 drivers/gpu/drm/nouveau/dispnv50/head827d.c |    3 ++-
 drivers/gpu/drm/nouveau/dispnv50/head907d.c |    3 ++-
 drivers/gpu/drm/nouveau/dispnv50/wndw.c     |   10 ++++++----
 8 files changed, 28 insertions(+), 17 deletions(-)

--- a/drivers/gpu/drm/nouveau/dispnv50/atom.h
+++ b/drivers/gpu/drm/nouveau/dispnv50/atom.h
@@ -63,7 +63,8 @@ struct nv50_head_atom {
 		u8  format;
 		u8  kind:7;
 		u8  layout:1;
-		u8  block:4;
+		u8  blockh:4;
+		u16 blocks:12;
 		u32 pitch:20;
 		u16 x;
 		u16 y;
@@ -175,7 +176,8 @@ struct nv50_wndw_atom {
 		u8  format;
 		u8  kind:7;
 		u8  layout:1;
-		u8  block:4;
+		u8  blockh:4;
+		u16 blocks[3];
 		u32 pitch[3];
 		u16 w;
 		u16 h;
--- a/drivers/gpu/drm/nouveau/dispnv50/base507c.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/base507c.c
@@ -67,8 +67,9 @@ base507c_image_set(struct nv50_wndw *wnd
 		evo_data(push, 0x00000000);
 		evo_data(push, asyw->image.h << 16 | asyw->image.w);
 		evo_data(push, asyw->image.layout << 20 |
-			       asyw->image.pitch[0] |
-			       asyw->image.block);
+			       (asyw->image.pitch[0] >> 8) << 8 |
+			       asyw->image.blocks[0] << 8 |
+			       asyw->image.blockh);
 		evo_data(push, asyw->image.kind << 16 |
 			       asyw->image.format << 8);
 		evo_kick(push, &wndw->wndw);
--- a/drivers/gpu/drm/nouveau/dispnv50/base827c.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/base827c.c
@@ -36,8 +36,9 @@ base827c_image_set(struct nv50_wndw *wnd
 		evo_data(push, 0x00000000);
 		evo_data(push, asyw->image.h << 16 | asyw->image.w);
 		evo_data(push, asyw->image.layout << 20 |
-			       asyw->image.pitch[0] |
-			       asyw->image.block);
+			       (asyw->image.pitch[0] >> 8) << 8 |
+			       asyw->image.blocks[0] << 8 |
+			       asyw->image.blockh);
 		evo_data(push, asyw->image.format << 8);
 		evo_kick(push, &wndw->wndw);
 	}
--- a/drivers/gpu/drm/nouveau/dispnv50/base907c.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/base907c.c
@@ -36,8 +36,9 @@ base907c_image_set(struct nv50_wndw *wnd
 		evo_data(push, 0x00000000);
 		evo_data(push, asyw->image.h << 16 | asyw->image.w);
 		evo_data(push, asyw->image.layout << 24 |
-			       asyw->image.pitch[0] |
-			       asyw->image.block);
+			       (asyw->image.pitch[0] >> 8) << 8 |
+			       asyw->image.blocks[0] << 8 |
+			       asyw->image.blockh);
 		evo_data(push, asyw->image.format << 8);
 		evo_kick(push, &wndw->wndw);
 	}
--- a/drivers/gpu/drm/nouveau/dispnv50/head507d.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/head507d.c
@@ -151,8 +151,9 @@ head507d_core_set(struct nv50_head *head
 		evo_mthd(push, 0x0868 + head->base.index * 0x400, 4);
 		evo_data(push, asyh->core.h << 16 | asyh->core.w);
 		evo_data(push, asyh->core.layout << 20 |
-			       asyh->core.pitch >> 8 << 8 |
-			       asyh->core.block);
+			       (asyh->core.pitch >> 8) << 8 |
+			       asyh->core.blocks << 8 |
+			       asyh->core.blockh);
 		evo_data(push, asyh->core.kind << 16 |
 			       asyh->core.format << 8);
 		evo_data(push, asyh->core.handle);
@@ -196,7 +197,8 @@ head507d_core_calc(struct nv50_head *hea
 	asyh->core.format = 0xcf;
 	asyh->core.kind = 0;
 	asyh->core.layout = 1;
-	asyh->core.block = 0;
+	asyh->core.blockh = 0;
+	asyh->core.blocks = 0;
 	asyh->core.pitch = ALIGN(asyh->core.w, 64) * 4;
 }
 
--- a/drivers/gpu/drm/nouveau/dispnv50/head827d.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/head827d.c
@@ -64,7 +64,8 @@ head827d_core_set(struct nv50_head *head
 		evo_data(push, asyh->core.h << 16 | asyh->core.w);
 		evo_data(push, asyh->core.layout << 20 |
 			       (asyh->core.pitch >> 8) << 8 |
-			       asyh->core.block);
+			       asyh->core.blocks << 8 |
+			       asyh->core.blockh);
 		evo_data(push, asyh->core.format << 8);
 		evo_data(push, asyh->core.handle);
 		evo_mthd(push, 0x08c0 + head->base.index * 0x400, 1);
--- a/drivers/gpu/drm/nouveau/dispnv50/head907d.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/head907d.c
@@ -172,7 +172,8 @@ head907d_core_set(struct nv50_head *head
 		evo_data(push, asyh->core.h << 16 | asyh->core.w);
 		evo_data(push, asyh->core.layout << 24 |
 			       (asyh->core.pitch >> 8) << 8 |
-			       asyh->core.block);
+			       asyh->core.blocks << 8 |
+			       asyh->core.blockh);
 		evo_data(push, asyh->core.format << 8);
 		evo_data(push, asyh->core.handle);
 		evo_mthd(push, 0x04b0 + head->base.index * 0x300, 1);
--- a/drivers/gpu/drm/nouveau/dispnv50/wndw.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/wndw.c
@@ -225,13 +225,15 @@ nv50_wndw_atomic_check_acquire(struct nv
 		if (asyw->image.kind) {
 			asyw->image.layout = 0;
 			if (drm->client.device.info.chipset >= 0xc0)
-				asyw->image.block = fb->nvbo->mode >> 4;
+				asyw->image.blockh = fb->nvbo->mode >> 4;
 			else
-				asyw->image.block = fb->nvbo->mode;
-			asyw->image.pitch[0] = (fb->base.pitches[0] / 4) << 4;
+				asyw->image.blockh = fb->nvbo->mode;
+			asyw->image.blocks[0] = fb->base.pitches[0] / 64;
+			asyw->image.pitch[0] = 0;
 		} else {
 			asyw->image.layout = 1;
-			asyw->image.block  = 0;
+			asyw->image.blockh = 0;
+			asyw->image.blocks[0] = 0;
 			asyw->image.pitch[0] = fb->base.pitches[0];
 		}