1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include "dmacnv50.h"
25#include "rootnv50.h"
26
27#include <core/client.h>
28
29#include <nvif/class.h>
30#include <nvif/cl507e.h>
31#include <nvif/unpack.h>
32
33int
34nv50_disp_ovly_new(const struct nv50_disp_dmac_func *func,
35 const struct nv50_disp_chan_mthd *mthd,
36 struct nv50_disp_root *root, int chid,
37 const struct nvkm_oclass *oclass, void *data, u32 size,
38 struct nvkm_object **pobject)
39{
40 union {
41 struct nv50_disp_overlay_channel_dma_v0 v0;
42 } *args = data;
43 struct nvkm_object *parent = oclass->parent;
44 struct nv50_disp *disp = root->disp;
45 int head, ret = -ENOSYS;
46 u64 push;
47
48 nvif_ioctl(parent, "create disp overlay channel dma size %d\n", size);
49 if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
50 nvif_ioctl(parent, "create disp overlay channel dma vers %d "
51 "pushbuf %016llx head %d\n",
52 args->v0.version, args->v0.pushbuf, args->v0.head);
53 if (args->v0.head > disp->base.head.nr)
54 return -EINVAL;
55 push = args->v0.pushbuf;
56 head = args->v0.head;
57 } else
58 return ret;
59
60 return nv50_disp_dmac_new_(func, mthd, root, chid + head,
61 head, push, oclass, pobject);
62}
63
64static const struct nv50_disp_mthd_list
65nv50_disp_ovly_mthd_base = {
66 .mthd = 0x0000,
67 .addr = 0x000000,
68 .data = {
69 { 0x0080, 0x000000 },
70 { 0x0084, 0x0009a0 },
71 { 0x0088, 0x0009c0 },
72 { 0x008c, 0x0009c8 },
73 { 0x0090, 0x6109b4 },
74 { 0x0094, 0x610970 },
75 { 0x00a0, 0x610998 },
76 { 0x00a4, 0x610964 },
77 { 0x00c0, 0x610958 },
78 { 0x00e0, 0x6109a8 },
79 { 0x00e4, 0x6109d0 },
80 { 0x00e8, 0x6109d8 },
81 { 0x0100, 0x61094c },
82 { 0x0104, 0x610984 },
83 { 0x0108, 0x61098c },
84 { 0x0800, 0x6109f8 },
85 { 0x0808, 0x610a08 },
86 { 0x080c, 0x610a10 },
87 { 0x0810, 0x610a00 },
88 {}
89 }
90};
91
92static const struct nv50_disp_chan_mthd
93nv50_disp_ovly_chan_mthd = {
94 .name = "Overlay",
95 .addr = 0x000540,
96 .prev = 0x000004,
97 .data = {
98 { "Global", 1, &nv50_disp_ovly_mthd_base },
99 {}
100 }
101};
102
103const struct nv50_disp_dmac_oclass
104nv50_disp_ovly_oclass = {
105 .base.oclass = NV50_DISP_OVERLAY_CHANNEL_DMA,
106 .base.minver = 0,
107 .base.maxver = 0,
108 .ctor = nv50_disp_ovly_new,
109 .func = &nv50_disp_dmac_func,
110 .mthd = &nv50_disp_ovly_chan_mthd,
111 .chid = 3,
112};
113