Commit b05d8738 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/kms/nv50-: separate blocklinear vs linear pitch

Will be required to support Volta.
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 119608a7
...@@ -63,7 +63,8 @@ struct nv50_head_atom { ...@@ -63,7 +63,8 @@ struct nv50_head_atom {
u8 format; u8 format;
u8 kind:7; u8 kind:7;
u8 layout:1; u8 layout:1;
u8 block:4; u8 blockh:4;
u16 blocks:12;
u32 pitch:20; u32 pitch:20;
u16 x; u16 x;
u16 y; u16 y;
...@@ -175,7 +176,8 @@ struct nv50_wndw_atom { ...@@ -175,7 +176,8 @@ struct nv50_wndw_atom {
u8 format; u8 format;
u8 kind:7; u8 kind:7;
u8 layout:1; u8 layout:1;
u8 block:4; u8 blockh:4;
u16 blocks[3];
u32 pitch[3]; u32 pitch[3];
u16 w; u16 w;
u16 h; u16 h;
......
...@@ -67,8 +67,9 @@ base507c_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw) ...@@ -67,8 +67,9 @@ base507c_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
evo_data(push, 0x00000000); evo_data(push, 0x00000000);
evo_data(push, asyw->image.h << 16 | asyw->image.w); evo_data(push, asyw->image.h << 16 | asyw->image.w);
evo_data(push, asyw->image.layout << 20 | evo_data(push, asyw->image.layout << 20 |
asyw->image.pitch[0] | (asyw->image.pitch[0] >> 8) << 8 |
asyw->image.block); asyw->image.blocks[0] << 8 |
asyw->image.blockh);
evo_data(push, asyw->image.kind << 16 | evo_data(push, asyw->image.kind << 16 |
asyw->image.format << 8); asyw->image.format << 8);
evo_kick(push, &wndw->wndw); evo_kick(push, &wndw->wndw);
......
...@@ -36,8 +36,9 @@ base827c_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw) ...@@ -36,8 +36,9 @@ base827c_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
evo_data(push, 0x00000000); evo_data(push, 0x00000000);
evo_data(push, asyw->image.h << 16 | asyw->image.w); evo_data(push, asyw->image.h << 16 | asyw->image.w);
evo_data(push, asyw->image.layout << 20 | evo_data(push, asyw->image.layout << 20 |
asyw->image.pitch[0] | (asyw->image.pitch[0] >> 8) << 8 |
asyw->image.block); asyw->image.blocks[0] << 8 |
asyw->image.blockh);
evo_data(push, asyw->image.format << 8); evo_data(push, asyw->image.format << 8);
evo_kick(push, &wndw->wndw); evo_kick(push, &wndw->wndw);
} }
......
...@@ -36,8 +36,9 @@ base907c_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw) ...@@ -36,8 +36,9 @@ base907c_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
evo_data(push, 0x00000000); evo_data(push, 0x00000000);
evo_data(push, asyw->image.h << 16 | asyw->image.w); evo_data(push, asyw->image.h << 16 | asyw->image.w);
evo_data(push, asyw->image.layout << 24 | evo_data(push, asyw->image.layout << 24 |
asyw->image.pitch[0] | (asyw->image.pitch[0] >> 8) << 8 |
asyw->image.block); asyw->image.blocks[0] << 8 |
asyw->image.blockh);
evo_data(push, asyw->image.format << 8); evo_data(push, asyw->image.format << 8);
evo_kick(push, &wndw->wndw); evo_kick(push, &wndw->wndw);
} }
......
...@@ -151,8 +151,9 @@ head507d_core_set(struct nv50_head *head, struct nv50_head_atom *asyh) ...@@ -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_mthd(push, 0x0868 + head->base.index * 0x400, 4);
evo_data(push, asyh->core.h << 16 | asyh->core.w); evo_data(push, asyh->core.h << 16 | asyh->core.w);
evo_data(push, asyh->core.layout << 20 | evo_data(push, asyh->core.layout << 20 |
asyh->core.pitch >> 8 << 8 | (asyh->core.pitch >> 8) << 8 |
asyh->core.block); asyh->core.blocks << 8 |
asyh->core.blockh);
evo_data(push, asyh->core.kind << 16 | evo_data(push, asyh->core.kind << 16 |
asyh->core.format << 8); asyh->core.format << 8);
evo_data(push, asyh->core.handle); evo_data(push, asyh->core.handle);
...@@ -196,7 +197,8 @@ head507d_core_calc(struct nv50_head *head, struct nv50_head_atom *asyh) ...@@ -196,7 +197,8 @@ head507d_core_calc(struct nv50_head *head, struct nv50_head_atom *asyh)
asyh->core.format = 0xcf; asyh->core.format = 0xcf;
asyh->core.kind = 0; asyh->core.kind = 0;
asyh->core.layout = 1; 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; asyh->core.pitch = ALIGN(asyh->core.w, 64) * 4;
} }
......
...@@ -64,7 +64,8 @@ head827d_core_set(struct nv50_head *head, struct nv50_head_atom *asyh) ...@@ -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.h << 16 | asyh->core.w);
evo_data(push, asyh->core.layout << 20 | evo_data(push, asyh->core.layout << 20 |
(asyh->core.pitch >> 8) << 8 | (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.format << 8);
evo_data(push, asyh->core.handle); evo_data(push, asyh->core.handle);
evo_mthd(push, 0x08c0 + head->base.index * 0x400, 1); evo_mthd(push, 0x08c0 + head->base.index * 0x400, 1);
......
...@@ -172,7 +172,8 @@ head907d_core_set(struct nv50_head *head, struct nv50_head_atom *asyh) ...@@ -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.h << 16 | asyh->core.w);
evo_data(push, asyh->core.layout << 24 | evo_data(push, asyh->core.layout << 24 |
(asyh->core.pitch >> 8) << 8 | (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.format << 8);
evo_data(push, asyh->core.handle); evo_data(push, asyh->core.handle);
evo_mthd(push, 0x04b0 + head->base.index * 0x300, 1); evo_mthd(push, 0x04b0 + head->base.index * 0x300, 1);
......
...@@ -225,13 +225,15 @@ nv50_wndw_atomic_check_acquire(struct nv50_wndw *wndw, bool modeset, ...@@ -225,13 +225,15 @@ nv50_wndw_atomic_check_acquire(struct nv50_wndw *wndw, bool modeset,
if (asyw->image.kind) { if (asyw->image.kind) {
asyw->image.layout = 0; asyw->image.layout = 0;
if (drm->client.device.info.chipset >= 0xc0) if (drm->client.device.info.chipset >= 0xc0)
asyw->image.block = fb->nvbo->mode >> 4; asyw->image.blockh = fb->nvbo->mode >> 4;
else else
asyw->image.block = fb->nvbo->mode; asyw->image.blockh = fb->nvbo->mode;
asyw->image.pitch[0] = (fb->base.pitches[0] / 4) << 4; asyw->image.blocks[0] = fb->base.pitches[0] / 64;
asyw->image.pitch[0] = 0;
} else { } else {
asyw->image.layout = 1; 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]; asyw->image.pitch[0] = fb->base.pitches[0];
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment