2018-05-08 20:39:47 +10:00
# ifndef __NV50_KMS_ATOM_H__
# define __NV50_KMS_ATOM_H__
# define nv50_atom(p) container_of((p), struct nv50_atom, state)
# include <drm/drm_atomic.h>
struct nv50_atom {
struct drm_atomic_state state ;
struct list_head outp ;
bool lock_core ;
bool flush_disable ;
} ;
# define nv50_head_atom(p) container_of((p), struct nv50_head_atom, state)
struct nv50_head_atom {
struct drm_crtc_state state ;
2018-05-08 20:39:47 +10:00
struct {
u32 mask ;
u32 olut ;
} wndw ;
2018-05-08 20:39:47 +10:00
struct {
u16 iW ;
u16 iH ;
u16 oW ;
u16 oH ;
} view ;
struct nv50_head_mode {
bool interlace ;
u32 clock ;
struct {
u16 active ;
u16 synce ;
u16 blanke ;
u16 blanks ;
} h ;
struct {
u32 active ;
u16 synce ;
u16 blanke ;
u16 blanks ;
u16 blank2s ;
u16 blank2e ;
u16 blankus ;
} v ;
} mode ;
struct {
bool visible ;
u32 handle ;
u64 offset : 40 ;
2018-05-08 20:39:47 +10:00
u8 buffer : 1 ;
u8 mode : 4 ;
2018-12-11 14:50:02 +10:00
u16 size : 11 ;
2018-05-08 20:39:48 +10:00
u8 range : 2 ;
u8 output_mode : 2 ;
2018-12-11 14:50:02 +10:00
void ( * load ) ( struct drm_color_lut * , int size , void __iomem * ) ;
2018-05-08 20:39:47 +10:00
} olut ;
2018-05-08 20:39:47 +10:00
struct {
bool visible ;
u32 handle ;
u64 offset : 40 ;
u8 format ;
u8 kind : 7 ;
u8 layout : 1 ;
2018-05-08 20:39:47 +10:00
u8 blockh : 4 ;
u16 blocks : 12 ;
2018-05-08 20:39:47 +10:00
u32 pitch : 20 ;
u16 x ;
u16 y ;
u16 w ;
u16 h ;
} core ;
struct {
bool visible ;
u32 handle ;
u64 offset : 40 ;
2018-05-08 20:39:47 +10:00
u8 layout : 2 ;
2018-05-08 20:39:48 +10:00
u8 format : 8 ;
2018-05-08 20:39:47 +10:00
} curs ;
struct {
u8 depth ;
u8 cpp ;
u16 x ;
u16 y ;
u16 w ;
u16 h ;
} base ;
struct {
u8 cpp ;
} ovly ;
struct {
bool enable : 1 ;
u8 bits : 2 ;
u8 mode : 4 ;
} dither ;
struct {
struct {
u16 cos : 12 ;
u16 sin : 12 ;
} sat ;
} procamp ;
struct {
u8 nhsync : 1 ;
u8 nvsync : 1 ;
u8 depth : 4 ;
2019-11-15 16:07:19 -05:00
u8 bpc ;
2018-05-08 20:39:47 +10:00
} or ;
2019-02-01 19:20:04 -05:00
/* Currently only used for MST */
struct {
int pbn ;
u8 tu : 6 ;
} dp ;
2018-05-08 20:39:47 +10:00
union nv50_head_atom_mask {
2018-05-08 20:39:47 +10:00
struct {
2018-05-08 20:39:47 +10:00
bool olut : 1 ;
2018-05-08 20:39:47 +10:00
bool core : 1 ;
bool curs : 1 ;
bool view : 1 ;
bool mode : 1 ;
bool base : 1 ;
bool ovly : 1 ;
bool dither : 1 ;
bool procamp : 1 ;
bool or : 1 ;
} ;
u16 mask ;
2018-05-08 20:39:47 +10:00
} set , clr ;
2018-05-08 20:39:47 +10:00
} ;
static inline struct nv50_head_atom *
nv50_head_atom_get ( struct drm_atomic_state * state , struct drm_crtc * crtc )
{
struct drm_crtc_state * statec = drm_atomic_get_crtc_state ( state , crtc ) ;
if ( IS_ERR ( statec ) )
return ( void * ) statec ;
return nv50_head_atom ( statec ) ;
}
# define nv50_wndw_atom(p) container_of((p), struct nv50_wndw_atom, state)
struct nv50_wndw_atom {
struct drm_plane_state state ;
2018-05-08 20:39:47 +10:00
struct drm_property_blob * ilut ;
2018-05-08 20:39:47 +10:00
bool visible ;
2018-05-08 20:39:47 +10:00
struct {
u32 handle ;
u16 offset : 12 ;
bool awaken : 1 ;
} ntfy ;
struct {
u32 handle ;
u16 offset : 12 ;
u32 acquire ;
u32 release ;
} sema ;
struct {
2018-05-08 20:39:47 +10:00
u32 handle ;
struct {
u64 offset : 40 ;
u8 buffer : 1 ;
u8 enable : 2 ;
u8 mode : 4 ;
2018-12-11 14:50:02 +10:00
u16 size : 11 ;
2018-05-08 20:39:48 +10:00
u8 range : 2 ;
u8 output_mode : 2 ;
2018-12-11 14:50:02 +10:00
void ( * load ) ( struct drm_color_lut * , int size ,
void __iomem * ) ;
2018-05-08 20:39:47 +10:00
} i ;
} xlut ;
2018-05-08 20:39:47 +10:00
2019-06-11 22:40:36 -04:00
struct {
u32 matrix [ 12 ] ;
bool valid ;
} csc ;
2018-05-08 20:39:47 +10:00
struct {
u8 mode : 2 ;
u8 interval : 4 ;
2018-05-08 20:39:47 +10:00
u8 colorspace : 2 ;
2018-05-08 20:39:47 +10:00
u8 format ;
u8 kind : 7 ;
u8 layout : 1 ;
2018-05-08 20:39:47 +10:00
u8 blockh : 4 ;
u16 blocks [ 3 ] ;
2018-05-08 20:39:47 +10:00
u32 pitch [ 3 ] ;
2018-05-08 20:39:47 +10:00
u16 w ;
u16 h ;
2018-05-08 20:39:47 +10:00
u32 handle [ 6 ] ;
u64 offset [ 6 ] ;
2018-05-08 20:39:47 +10:00
} image ;
2018-05-08 20:39:47 +10:00
struct {
u16 sx ;
u16 sy ;
u16 sw ;
u16 sh ;
u16 dw ;
u16 dh ;
} scale ;
2018-05-08 20:39:47 +10:00
struct {
u16 x ;
u16 y ;
} point ;
2019-06-11 16:46:13 +10:00
struct {
u8 depth ;
2019-06-11 17:13:04 +10:00
u8 k1 ;
2019-06-12 17:37:23 +10:00
u8 src_color : 4 ;
u8 dst_color : 4 ;
2019-06-11 16:46:13 +10:00
} blend ;
2018-05-08 20:39:47 +10:00
union nv50_wndw_atom_mask {
2018-05-08 20:39:47 +10:00
struct {
bool ntfy : 1 ;
bool sema : 1 ;
2018-05-08 20:39:47 +10:00
bool xlut : 1 ;
2019-06-11 22:40:36 -04:00
bool csc : 1 ;
2018-05-08 20:39:47 +10:00
bool image : 1 ;
2018-05-08 20:39:47 +10:00
bool scale : 1 ;
2018-05-08 20:39:47 +10:00
bool point : 1 ;
2019-06-11 16:46:13 +10:00
bool blend : 1 ;
2018-05-08 20:39:47 +10:00
} ;
u8 mask ;
2018-05-08 20:39:47 +10:00
} set , clr ;
2018-05-08 20:39:47 +10:00
} ;
# endif