xref: /netbsd-src/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/atom.h (revision 1b592f33a70528671836bfa092de3e80d93631f4)
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