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