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 } or; 118 119 /* Currently only used for MST */ 120 struct { 121 int pbn; 122 u8 tu:6; 123 } dp; 124 125 union nv50_head_atom_mask { 126 struct { 127 bool olut:1; 128 bool core:1; 129 bool curs:1; 130 bool view:1; 131 bool mode:1; 132 bool base:1; 133 bool ovly:1; 134 bool dither:1; 135 bool procamp:1; 136 bool or:1; 137 }; 138 u16 mask; 139 } set, clr; 140 }; 141 142 static inline struct nv50_head_atom * 143 nv50_head_atom_get(struct drm_atomic_state *state, struct drm_crtc *crtc) 144 { 145 struct drm_crtc_state *statec = drm_atomic_get_crtc_state(state, crtc); 146 if (IS_ERR(statec)) 147 return (void *)statec; 148 return nv50_head_atom(statec); 149 } 150 151 #define nv50_wndw_atom(p) container_of((p), struct nv50_wndw_atom, state) 152 153 struct nv50_wndw_atom { 154 struct drm_plane_state state; 155 156 struct drm_property_blob *ilut; 157 bool visible; 158 159 struct { 160 u32 handle; 161 u16 offset:12; 162 bool awaken:1; 163 } ntfy; 164 165 struct { 166 u32 handle; 167 u16 offset:12; 168 u32 acquire; 169 u32 release; 170 } sema; 171 172 struct { 173 u32 handle; 174 struct { 175 u64 offset:40; 176 u8 buffer:1; 177 u8 enable:2; 178 u8 mode:4; 179 u16 size:11; 180 u8 range:2; 181 u8 output_mode:2; 182 void (*load)(struct drm_color_lut *, int size, 183 void __iomem *); 184 } i; 185 } xlut; 186 187 struct { 188 u8 mode:2; 189 u8 interval:4; 190 191 u8 colorspace:2; 192 u8 format; 193 u8 kind:7; 194 u8 layout:1; 195 u8 blockh:4; 196 u16 blocks[3]; 197 u32 pitch[3]; 198 u16 w; 199 u16 h; 200 201 u32 handle[6]; 202 u64 offset[6]; 203 } image; 204 205 struct { 206 u16 sx; 207 u16 sy; 208 u16 sw; 209 u16 sh; 210 u16 dw; 211 u16 dh; 212 } scale; 213 214 struct { 215 u16 x; 216 u16 y; 217 } point; 218 219 union nv50_wndw_atom_mask { 220 struct { 221 bool ntfy:1; 222 bool sema:1; 223 bool xlut:1; 224 bool image:1; 225 bool scale:1; 226 bool point:1; 227 }; 228 u8 mask; 229 } set, clr; 230 }; 231 #endif 232