| .. | .. |
|---|
| 2 | 2 | #define __NV50_KMS_ATOM_H__ |
|---|
| 3 | 3 | #define nv50_atom(p) container_of((p), struct nv50_atom, state) |
|---|
| 4 | 4 | #include <drm/drm_atomic.h> |
|---|
| 5 | +#include "crc.h" |
|---|
| 6 | + |
|---|
| 7 | +struct nouveau_encoder; |
|---|
| 5 | 8 | |
|---|
| 6 | 9 | struct nv50_atom { |
|---|
| 7 | 10 | struct drm_atomic_state state; |
|---|
| .. | .. |
|---|
| 18 | 21 | |
|---|
| 19 | 22 | struct { |
|---|
| 20 | 23 | u32 mask; |
|---|
| 24 | + u32 owned; |
|---|
| 21 | 25 | u32 olut; |
|---|
| 22 | 26 | } wndw; |
|---|
| 23 | 27 | |
|---|
| .. | .. |
|---|
| 54 | 58 | u64 offset:40; |
|---|
| 55 | 59 | u8 buffer:1; |
|---|
| 56 | 60 | u8 mode:4; |
|---|
| 57 | | - u8 size:2; |
|---|
| 61 | + u16 size:11; |
|---|
| 58 | 62 | u8 range:2; |
|---|
| 59 | 63 | u8 output_mode:2; |
|---|
| 64 | + void (*load)(struct drm_color_lut *, int size, void __iomem *); |
|---|
| 60 | 65 | } olut; |
|---|
| 61 | 66 | |
|---|
| 62 | 67 | struct { |
|---|
| .. | .. |
|---|
| 113 | 118 | u8 nhsync:1; |
|---|
| 114 | 119 | u8 nvsync:1; |
|---|
| 115 | 120 | u8 depth:4; |
|---|
| 121 | + u8 crc_raster:2; |
|---|
| 122 | + u8 bpc; |
|---|
| 116 | 123 | } or; |
|---|
| 124 | + |
|---|
| 125 | + struct nv50_crc_atom crc; |
|---|
| 126 | + |
|---|
| 127 | + /* Currently only used for MST */ |
|---|
| 128 | + struct { |
|---|
| 129 | + int pbn; |
|---|
| 130 | + u8 tu:6; |
|---|
| 131 | + } dp; |
|---|
| 117 | 132 | |
|---|
| 118 | 133 | union nv50_head_atom_mask { |
|---|
| 119 | 134 | struct { |
|---|
| .. | .. |
|---|
| 126 | 141 | bool ovly:1; |
|---|
| 127 | 142 | bool dither:1; |
|---|
| 128 | 143 | bool procamp:1; |
|---|
| 144 | + bool crc:1; |
|---|
| 129 | 145 | bool or:1; |
|---|
| 130 | 146 | }; |
|---|
| 131 | 147 | u16 mask; |
|---|
| .. | .. |
|---|
| 139 | 155 | if (IS_ERR(statec)) |
|---|
| 140 | 156 | return (void *)statec; |
|---|
| 141 | 157 | return nv50_head_atom(statec); |
|---|
| 158 | +} |
|---|
| 159 | + |
|---|
| 160 | +static inline struct drm_encoder * |
|---|
| 161 | +nv50_head_atom_get_encoder(struct nv50_head_atom *atom) |
|---|
| 162 | +{ |
|---|
| 163 | + struct drm_encoder *encoder; |
|---|
| 164 | + |
|---|
| 165 | + /* We only ever have a single encoder */ |
|---|
| 166 | + drm_for_each_encoder_mask(encoder, atom->state.crtc->dev, |
|---|
| 167 | + atom->state.encoder_mask) |
|---|
| 168 | + return encoder; |
|---|
| 169 | + |
|---|
| 170 | + return NULL; |
|---|
| 142 | 171 | } |
|---|
| 143 | 172 | |
|---|
| 144 | 173 | #define nv50_wndw_atom(p) container_of((p), struct nv50_wndw_atom, state) |
|---|
| .. | .. |
|---|
| 169 | 198 | u8 buffer:1; |
|---|
| 170 | 199 | u8 enable:2; |
|---|
| 171 | 200 | u8 mode:4; |
|---|
| 172 | | - u8 size:2; |
|---|
| 201 | + u16 size:11; |
|---|
| 173 | 202 | u8 range:2; |
|---|
| 174 | 203 | u8 output_mode:2; |
|---|
| 204 | + void (*load)(struct drm_color_lut *, int size, |
|---|
| 205 | + void __iomem *); |
|---|
| 175 | 206 | } i; |
|---|
| 176 | 207 | } xlut; |
|---|
| 208 | + |
|---|
| 209 | + struct { |
|---|
| 210 | + u32 matrix[12]; |
|---|
| 211 | + bool valid; |
|---|
| 212 | + } csc; |
|---|
| 177 | 213 | |
|---|
| 178 | 214 | struct { |
|---|
| 179 | 215 | u8 mode:2; |
|---|
| .. | .. |
|---|
| 207 | 243 | u16 y; |
|---|
| 208 | 244 | } point; |
|---|
| 209 | 245 | |
|---|
| 246 | + struct { |
|---|
| 247 | + u8 depth; |
|---|
| 248 | + u8 k1; |
|---|
| 249 | + u8 src_color:4; |
|---|
| 250 | + u8 dst_color:4; |
|---|
| 251 | + } blend; |
|---|
| 252 | + |
|---|
| 210 | 253 | union nv50_wndw_atom_mask { |
|---|
| 211 | 254 | struct { |
|---|
| 212 | 255 | bool ntfy:1; |
|---|
| 213 | 256 | bool sema:1; |
|---|
| 214 | 257 | bool xlut:1; |
|---|
| 258 | + bool csc:1; |
|---|
| 215 | 259 | bool image:1; |
|---|
| 216 | 260 | bool scale:1; |
|---|
| 217 | 261 | bool point:1; |
|---|
| 262 | + bool blend:1; |
|---|
| 218 | 263 | }; |
|---|
| 219 | 264 | u8 mask; |
|---|
| 220 | 265 | } set, clr; |
|---|