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