xref: /linux/drivers/gpu/drm/nouveau/dispnv50/atom.h (revision 9b043680446067358913edc2e9dd71bf8ffae208)
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 
156 	if (IS_ERR(statec))
157 		return (void *)statec;
158 
159 	return nv50_head_atom(statec);
160 }
161 
162 static inline struct nv50_head_atom *
nv50_head_atom_get_new(struct drm_atomic_state * state,struct drm_crtc * crtc)163 nv50_head_atom_get_new(struct drm_atomic_state *state, struct drm_crtc *crtc)
164 {
165 	struct drm_crtc_state *statec = drm_atomic_get_new_crtc_state(state, crtc);
166 
167 	if (!statec)
168 		return NULL;
169 
170 	return nv50_head_atom(statec);
171 }
172 
173 static inline struct drm_encoder *
nv50_head_atom_get_encoder(struct nv50_head_atom * atom)174 nv50_head_atom_get_encoder(struct nv50_head_atom *atom)
175 {
176 	struct drm_encoder *encoder;
177 
178 	/* We only ever have a single encoder */
179 	drm_for_each_encoder_mask(encoder, atom->state.crtc->dev,
180 				  atom->state.encoder_mask)
181 		return encoder;
182 
183 	return NULL;
184 }
185 
186 #define nv50_wndw_atom(p) container_of((p), struct nv50_wndw_atom, state)
187 
188 struct nv50_wndw_atom {
189 	struct drm_plane_state state;
190 
191 	struct drm_property_blob *ilut;
192 	bool visible;
193 
194 	struct {
195 		u32  handle;
196 		u16  offset:12;
197 		bool awaken:1;
198 	} ntfy;
199 
200 	struct {
201 		u32 handle;
202 		u16 offset:12;
203 		u32 acquire;
204 		u32 release;
205 	} sema;
206 
207 	struct {
208 		u32 handle;
209 		struct {
210 			u64 offset:40;
211 			u8  buffer:1;
212 			u8  enable:2;
213 			u8  mode:4;
214 			u16 size:11;
215 			u8  range:2;
216 			u8  output_mode:2;
217 			void (*load)(struct drm_color_lut *, int size,
218 				     void __iomem *);
219 		} i;
220 	} xlut;
221 
222 	struct {
223 		u32 matrix[12];
224 		bool valid;
225 	} csc;
226 
227 	struct {
228 		u8  mode:2;
229 		u8  interval:4;
230 
231 		u8  colorspace:2;
232 		u8  format;
233 		u8  kind:7;
234 		u8  layout:1;
235 		u8  blockh:4;
236 		u16 blocks[3];
237 		u32 pitch[3];
238 		u16 w;
239 		u16 h;
240 
241 		u32 handle[6];
242 		u64 offset[6];
243 	} image;
244 
245 	struct {
246 		u16 sx;
247 		u16 sy;
248 		u16 sw;
249 		u16 sh;
250 		u16 dw;
251 		u16 dh;
252 	} scale;
253 
254 	struct {
255 		u16 x;
256 		u16 y;
257 	} point;
258 
259 	struct {
260 		u8 depth;
261 		u8 k1;
262 		u8 src_color:4;
263 		u8 dst_color:4;
264 	} blend;
265 
266 	union nv50_wndw_atom_mask {
267 		struct {
268 			bool ntfy:1;
269 			bool sema:1;
270 			bool xlut:1;
271 			bool csc:1;
272 			bool image:1;
273 			bool scale:1;
274 			bool point:1;
275 			bool blend:1;
276 		};
277 		u8 mask;
278 	} set, clr;
279 };
280 #endif
281