Home | History | Annotate | Line # | Download | only in dispnv50
      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 *
    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