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