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