Linux-libre 5.4.48-gnu
[librecmc/linux-libre.git] / drivers / gpu / drm / nouveau / dispnv50 / atom.h
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