drm/nouveau/kms/gk104-gp1xx: Fix > 64x64 cursors
While we do handle the additional cursor sizes introduced in NVE4, it looks
like we accidentally broke this when converting over to use Nvidia's
display headers. Since we now use NVVAL in dispnv50/head907d.c in order to
format the value for the cursor layout and NVD9 only had one byte reserved
vs. the 2 bytes reserved in later generations, we end up accidentally
stripping the second bit in the cursor layout format parameter - causing us
to set the wrong cursor size.
This fixes that by adding our own curs_set hook for 917d which uses the
NV917D headers.
Cc: Martin Peres <martin.peres@free.fr>
Cc: Jeremy Cline <jcline@redhat.com>
Cc: Simon Ser <contact@emersion.fr>
Cc: <stable@vger.kernel.org> # v5.9+
Signed-off-by: Lyude Paul <lyude@redhat.com>
Fixes: ed0b86a90b
("drm/nouveau/kms/nv50-: use NVIDIA's headers for core head_curs_set()")
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
d3b2f0f792
commit
ba839b7598
|
@ -22,6 +22,7 @@
|
|||
#include "head.h"
|
||||
#include "core.h"
|
||||
|
||||
#include "nvif/push.h"
|
||||
#include <nvif/push507c.h>
|
||||
|
||||
#include <nvhw/class/cl917d.h>
|
||||
|
@ -73,6 +74,31 @@ head917d_base(struct nv50_head *head, struct nv50_head_atom *asyh)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
head917d_curs_set(struct nv50_head *head, struct nv50_head_atom *asyh)
|
||||
{
|
||||
struct nvif_push *push = nv50_disp(head->base.base.dev)->core->chan.push;
|
||||
const int i = head->base.index;
|
||||
int ret;
|
||||
|
||||
ret = PUSH_WAIT(push, 5);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
PUSH_MTHD(push, NV917D, HEAD_SET_CONTROL_CURSOR(i),
|
||||
NVDEF(NV917D, HEAD_SET_CONTROL_CURSOR, ENABLE, ENABLE) |
|
||||
NVVAL(NV917D, HEAD_SET_CONTROL_CURSOR, FORMAT, asyh->curs.format) |
|
||||
NVVAL(NV917D, HEAD_SET_CONTROL_CURSOR, SIZE, asyh->curs.layout) |
|
||||
NVVAL(NV917D, HEAD_SET_CONTROL_CURSOR, HOT_SPOT_X, 0) |
|
||||
NVVAL(NV917D, HEAD_SET_CONTROL_CURSOR, HOT_SPOT_Y, 0) |
|
||||
NVDEF(NV917D, HEAD_SET_CONTROL_CURSOR, COMPOSITION, ALPHA_BLEND),
|
||||
|
||||
HEAD_SET_OFFSET_CURSOR(i), asyh->curs.offset >> 8);
|
||||
|
||||
PUSH_MTHD(push, NV917D, HEAD_SET_CONTEXT_DMA_CURSOR(i), asyh->curs.handle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
head917d_curs_layout(struct nv50_head *head, struct nv50_wndw_atom *asyw,
|
||||
struct nv50_head_atom *asyh)
|
||||
|
@ -101,7 +127,7 @@ head917d = {
|
|||
.core_clr = head907d_core_clr,
|
||||
.curs_layout = head917d_curs_layout,
|
||||
.curs_format = head507d_curs_format,
|
||||
.curs_set = head907d_curs_set,
|
||||
.curs_set = head917d_curs_set,
|
||||
.curs_clr = head907d_curs_clr,
|
||||
.base = head917d_base,
|
||||
.ovly = head907d_ovly,
|
||||
|
|
|
@ -66,6 +66,10 @@
|
|||
#define NV917D_HEAD_SET_CONTROL_CURSOR_COMPOSITION_ALPHA_BLEND (0x00000000)
|
||||
#define NV917D_HEAD_SET_CONTROL_CURSOR_COMPOSITION_PREMULT_ALPHA_BLEND (0x00000001)
|
||||
#define NV917D_HEAD_SET_CONTROL_CURSOR_COMPOSITION_XOR (0x00000002)
|
||||
#define NV917D_HEAD_SET_OFFSET_CURSOR(a) (0x00000484 + (a)*0x00000300)
|
||||
#define NV917D_HEAD_SET_OFFSET_CURSOR_ORIGIN 31:0
|
||||
#define NV917D_HEAD_SET_CONTEXT_DMA_CURSOR(a) (0x0000048C + (a)*0x00000300)
|
||||
#define NV917D_HEAD_SET_CONTEXT_DMA_CURSOR_HANDLE 31:0
|
||||
#define NV917D_HEAD_SET_DITHER_CONTROL(a) (0x000004A0 + (a)*0x00000300)
|
||||
#define NV917D_HEAD_SET_DITHER_CONTROL_ENABLE 0:0
|
||||
#define NV917D_HEAD_SET_DITHER_CONTROL_ENABLE_DISABLE (0x00000000)
|
||||
|
|
Loading…
Reference in New Issue