1 #ifndef __NV50_KMS_ATOM_H__
2 #define __NV50_KMS_ATOM_H__
3 #define nv50_atom(p) container_of((p), struct nv50_atom, state)
4 #include <drm/drm_atomic.h>
5 #include "crc.h"
6
7 struct nouveau_encoder;
8
9 struct nv50_atom {
10 struct drm_atomic_state state;
11
12 struct list_head outp;
13 bool lock_core;
14 bool flush_disable;
15 };
16
17 #define nv50_head_atom(p) container_of((p), struct nv50_head_atom, state)
18
19 struct nv50_head_atom {
20 struct drm_crtc_state state;
21
22 struct {
23 u32 mask;
24 u32 owned;
25 u32 olut;
26 } wndw;
27
28 struct {
29 u16 iW;
30 u16 iH;
31 u16 oW;
32 u16 oH;
33 } view;
34
35 struct nv50_head_mode {
36 bool interlace;
37 u32 clock;
38 struct {
39 u16 active;
40 u16 synce;
41 u16 blanke;
42 u16 blanks;
43 } h;
44 struct {
45 u32 active;
46 u16 synce;
47 u16 blanke;
48 u16 blanks;
49 u16 blank2s;
50 u16 blank2e;
51 u16 blankus;
52 } v;
53 } mode;
54
55 struct {
56 bool visible;
57 u32 handle;
58 u64 offset:40;
59 u8 buffer:1;
60 u8 mode:4;
61 u16 size:11;
62 u8 range:2;
63 u8 output_mode:2;
64 void (*load)(struct drm_color_lut *, int size, void __iomem *);
65 } olut;
66
67 struct {
68 bool visible;
69 u32 handle;
70 u64 offset:40;
71 u8 format;
72 u8 kind:7;
73 u8 layout:1;
74 u8 blockh:4;
75 u16 blocks:12;
76 u32 pitch:20;
77 u16 x;
78 u16 y;
79 u16 w;
80 u16 h;
81 } core;
82
83 struct {
84 bool visible;
85 u32 handle;
86 u64 offset:40;
87 u8 layout:2;
88 u8 format:8;
89 } curs;
90
91 struct {
92 u8 depth;
93 u8 cpp;
94 u16 x;
95 u16 y;
96 u16 w;
97 u16 h;
98 } base;
99
100 struct {
101 u8 cpp;
102 } ovly;
103
104 struct {
105 bool enable:1;
106 u8 bits:2;
107 u8 mode:4;
108 } dither;
109
110 struct {
111 struct {
112 u16 cos:12;
113 u16 sin:12;
114 } sat;
115 } procamp;
116
117 struct {
118 u8 nhsync:1;
119 u8 nvsync:1;
120 u8 depth:4;
121 u8 crc_raster:2;
122 u8 bpc;
123 } or;
124
125 struct nv50_crc_atom crc;
126
127 /* Currently only used for MST */
128 struct {
129 int pbn;
130 u8 tu:6;
131 } dp;
132
133 union nv50_head_atom_mask {
134 struct {
135 bool olut:1;
136 bool core:1;
137 bool curs:1;
138 bool view:1;
139 bool mode:1;
140 bool base:1;
141 bool ovly:1;
142 bool dither:1;
143 bool procamp:1;
144 bool crc:1;
145 bool or:1;
146 };
147 u16 mask;
148 } set, clr;
149 };
150
151 static inline struct nv50_head_atom *
nv50_head_atom_get(struct drm_atomic_state * state,struct drm_crtc * crtc)152 nv50_head_atom_get(struct drm_atomic_state *state, struct drm_crtc *crtc)
153 {
154 struct drm_crtc_state *statec = drm_atomic_get_crtc_state(state, crtc);
155 if (IS_ERR(statec))
156 return (void *)statec;
157 return nv50_head_atom(statec);
158 }
159
160 static inline struct drm_encoder *
nv50_head_atom_get_encoder(struct nv50_head_atom * atom)161 nv50_head_atom_get_encoder(struct nv50_head_atom *atom)
162 {
163 struct drm_encoder *encoder = NULL;
164
165 /* We only ever have a single encoder */
166 drm_for_each_encoder_mask(encoder, atom->state.crtc->dev,
167 atom->state.encoder_mask)
168 break;
169
170 return encoder;
171 }
172
173 #define nv50_wndw_atom(p) container_of((p), struct nv50_wndw_atom, state)
174
175 struct nv50_wndw_atom {
176 struct drm_plane_state state;
177
178 struct drm_property_blob *ilut;
179 bool visible;
180
181 struct {
182 u32 handle;
183 u16 offset:12;
184 bool awaken:1;
185 } ntfy;
186
187 struct {
188 u32 handle;
189 u16 offset:12;
190 u32 acquire;
191 u32 release;
192 } sema;
193
194 struct {
195 u32 handle;
196 struct {
197 u64 offset:40;
198 u8 buffer:1;
199 u8 enable:2;
200 u8 mode:4;
201 u16 size:11;
202 u8 range:2;
203 u8 output_mode:2;
204 void (*load)(struct drm_color_lut *, int size,
205 void __iomem *);
206 } i;
207 } xlut;
208
209 struct {
210 u32 matrix[12];
211 bool valid;
212 } csc;
213
214 struct {
215 u8 mode:2;
216 u8 interval:4;
217
218 u8 colorspace:2;
219 u8 format;
220 u8 kind:7;
221 u8 layout:1;
222 u8 blockh:4;
223 u16 blocks[3];
224 u32 pitch[3];
225 u16 w;
226 u16 h;
227
228 u32 handle[6];
229 u64 offset[6];
230 } image;
231
232 struct {
233 u16 sx;
234 u16 sy;
235 u16 sw;
236 u16 sh;
237 u16 dw;
238 u16 dh;
239 } scale;
240
241 struct {
242 u16 x;
243 u16 y;
244 } point;
245
246 struct {
247 u8 depth;
248 u8 k1;
249 u8 src_color:4;
250 u8 dst_color:4;
251 } blend;
252
253 union nv50_wndw_atom_mask {
254 struct {
255 bool ntfy:1;
256 bool sema:1;
257 bool xlut:1;
258 bool csc:1;
259 bool image:1;
260 bool scale:1;
261 bool point:1;
262 bool blend:1;
263 };
264 u8 mask;
265 } set, clr;
266 };
267 #endif
268