From: Ben Skeggs Date: Tue, 8 May 2018 10:39:47 +0000 (+1000) Subject: drm/nouveau/kms/nv50-: separate blocklinear vs linear pitch X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=b05d873808c77fedd25130b0355acc0da1c11e19;p=openwrt%2Fstaging%2Fblogic.git drm/nouveau/kms/nv50-: separate blocklinear vs linear pitch Will be required to support Volta. Signed-off-by: Ben Skeggs --- diff --git a/drivers/gpu/drm/nouveau/dispnv50/atom.h b/drivers/gpu/drm/nouveau/dispnv50/atom.h index 3e9e8832d0dd..0409947bf196 100644 --- 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; diff --git a/drivers/gpu/drm/nouveau/dispnv50/base507c.c b/drivers/gpu/drm/nouveau/dispnv50/base507c.c index 5d664d75b645..d5e295ca2caa 100644 --- 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 *wndw, struct nv50_wndw_atom *asyw) 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); diff --git a/drivers/gpu/drm/nouveau/dispnv50/base827c.c b/drivers/gpu/drm/nouveau/dispnv50/base827c.c index d886858a5724..73646819a0d6 100644 --- 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 *wndw, struct nv50_wndw_atom *asyw) 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); } diff --git a/drivers/gpu/drm/nouveau/dispnv50/base907c.c b/drivers/gpu/drm/nouveau/dispnv50/base907c.c index 2643592ad827..8edc0598bda8 100644 --- 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 *wndw, struct nv50_wndw_atom *asyw) 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); } diff --git a/drivers/gpu/drm/nouveau/dispnv50/head507d.c b/drivers/gpu/drm/nouveau/dispnv50/head507d.c index 75575c33c5d6..8a8aa9b69ef8 100644 --- 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, struct nv50_head_atom *asyh) 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 *head, struct nv50_head_atom *asyh) 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; } diff --git a/drivers/gpu/drm/nouveau/dispnv50/head827d.c b/drivers/gpu/drm/nouveau/dispnv50/head827d.c index ddc143bac305..ae33e21790ee 100644 --- 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, struct nv50_head_atom *asyh) 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); diff --git a/drivers/gpu/drm/nouveau/dispnv50/head907d.c b/drivers/gpu/drm/nouveau/dispnv50/head907d.c index 0fa0159bfafb..a05dfccadcfa 100644 --- 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, struct nv50_head_atom *asyh) 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); diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndw.c b/drivers/gpu/drm/nouveau/dispnv50/wndw.c index fbaf8b7ed203..b96dc3d4dab5 100644 --- 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 nv50_wndw *wndw, bool modeset, 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]; }