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 		u8 size:2;
58 		u8 range:2;
59 		u8 output_mode:2;
60 	} olut;
61 
62 	struct {
63 		bool visible;
64 		u32 handle;
65 		u64 offset:40;
66 		u8  format;
67 		u8  kind:7;
68 		u8  layout:1;
69 		u8  blockh:4;
70 		u16 blocks:12;
71 		u32 pitch:20;
72 		u16 x;
73 		u16 y;
74 		u16 w;
75 		u16 h;
76 	} core;
77 
78 	struct {
79 		bool visible;
80 		u32 handle;
81 		u64 offset:40;
82 		u8  layout:2;
83 		u8  format:8;
84 	} curs;
85 
86 	struct {
87 		u8  depth;
88 		u8  cpp;
89 		u16 x;
90 		u16 y;
91 		u16 w;
92 		u16 h;
93 	} base;
94 
95 	struct {
96 		u8 cpp;
97 	} ovly;
98 
99 	struct {
100 		bool enable:1;
101 		u8 bits:2;
102 		u8 mode:4;
103 	} dither;
104 
105 	struct {
106 		struct {
107 			u16 cos:12;
108 			u16 sin:12;
109 		} sat;
110 	} procamp;
111 
112 	struct {
113 		u8 nhsync:1;
114 		u8 nvsync:1;
115 		u8 depth:4;
116 	} or;
117 
118 	union nv50_head_atom_mask {
119 		struct {
120 			bool olut:1;
121 			bool core:1;
122 			bool curs:1;
123 			bool view:1;
124 			bool mode:1;
125 			bool base:1;
126 			bool ovly:1;
127 			bool dither:1;
128 			bool procamp:1;
129 			bool or:1;
130 		};
131 		u16 mask;
132 	} set, clr;
133 };
134 
135 static inline struct nv50_head_atom *
nv50_head_atom_get(struct drm_atomic_state * state,struct drm_crtc * crtc)136 nv50_head_atom_get(struct drm_atomic_state *state, struct drm_crtc *crtc)
137 {
138 	struct drm_crtc_state *statec = drm_atomic_get_crtc_state(state, crtc);
139 	if (IS_ERR(statec))
140 		return (void *)statec;
141 	return nv50_head_atom(statec);
142 }
143 
144 #define nv50_wndw_atom(p) container_of((p), struct nv50_wndw_atom, state)
145 
146 struct nv50_wndw_atom {
147 	struct drm_plane_state state;
148 
149 	struct drm_property_blob *ilut;
150 	bool visible;
151 
152 	struct {
153 		u32  handle;
154 		u16  offset:12;
155 		bool awaken:1;
156 	} ntfy;
157 
158 	struct {
159 		u32 handle;
160 		u16 offset:12;
161 		u32 acquire;
162 		u32 release;
163 	} sema;
164 
165 	struct {
166 		u32 handle;
167 		struct {
168 			u64 offset:40;
169 			u8  buffer:1;
170 			u8  enable:2;
171 			u8  mode:4;
172 			u8  size:2;
173 			u8  range:2;
174 			u8  output_mode:2;
175 		} i;
176 	} xlut;
177 
178 	struct {
179 		u8  mode:2;
180 		u8  interval:4;
181 
182 		u8  colorspace:2;
183 		u8  format;
184 		u8  kind:7;
185 		u8  layout:1;
186 		u8  blockh:4;
187 		u16 blocks[3];
188 		u32 pitch[3];
189 		u16 w;
190 		u16 h;
191 
192 		u32 handle[6];
193 		u64 offset[6];
194 	} image;
195 
196 	struct {
197 		u16 sx;
198 		u16 sy;
199 		u16 sw;
200 		u16 sh;
201 		u16 dw;
202 		u16 dh;
203 	} scale;
204 
205 	struct {
206 		u16 x;
207 		u16 y;
208 	} point;
209 
210 	union nv50_wndw_atom_mask {
211 		struct {
212 			bool ntfy:1;
213 			bool sema:1;
214 			bool xlut:1;
215 			bool image:1;
216 			bool scale:1;
217 			bool point:1;
218 		};
219 		u8 mask;
220 	} set, clr;
221 };
222 #endif
223