123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- #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>
- #include "crc.h"
- struct nouveau_encoder;
- 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;
- struct {
- u32 mask;
- u32 owned;
- u32 olut;
- } wndw;
- 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;
- u8 buffer:1;
- u8 mode:4;
- u16 size:11;
- u8 range:2;
- u8 output_mode:2;
- void (*load)(struct drm_color_lut *, int size, void __iomem *);
- } olut;
- struct {
- bool visible;
- u32 handle;
- u64 offset:40;
- u8 format;
- u8 kind:7;
- u8 layout:1;
- u8 blockh:4;
- u16 blocks:12;
- u32 pitch:20;
- u16 x;
- u16 y;
- u16 w;
- u16 h;
- } core;
- struct {
- bool visible;
- u32 handle;
- u64 offset:40;
- u8 layout:2;
- u8 format:8;
- } 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;
- u8 crc_raster:2;
- u8 bpc;
- } or;
- struct nv50_crc_atom crc;
- /* Currently only used for MST */
- struct {
- int pbn;
- u8 tu:6;
- } dp;
- union nv50_head_atom_mask {
- struct {
- bool olut:1;
- 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 crc:1;
- bool or:1;
- };
- u16 mask;
- } set, clr;
- };
- 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);
- }
- static inline struct drm_encoder *
- nv50_head_atom_get_encoder(struct nv50_head_atom *atom)
- {
- struct drm_encoder *encoder;
- /* We only ever have a single encoder */
- drm_for_each_encoder_mask(encoder, atom->state.crtc->dev,
- atom->state.encoder_mask)
- return encoder;
- return NULL;
- }
- #define nv50_wndw_atom(p) container_of((p), struct nv50_wndw_atom, state)
- struct nv50_wndw_atom {
- struct drm_plane_state state;
- struct drm_property_blob *ilut;
- bool visible;
- struct {
- u32 handle;
- u16 offset:12;
- bool awaken:1;
- } ntfy;
- struct {
- u32 handle;
- u16 offset:12;
- u32 acquire;
- u32 release;
- } sema;
- struct {
- u32 handle;
- struct {
- u64 offset:40;
- u8 buffer:1;
- u8 enable:2;
- u8 mode:4;
- u16 size:11;
- u8 range:2;
- u8 output_mode:2;
- void (*load)(struct drm_color_lut *, int size,
- void __iomem *);
- } i;
- } xlut;
- struct {
- u32 matrix[12];
- bool valid;
- } csc;
- struct {
- u8 mode:2;
- u8 interval:4;
- u8 colorspace:2;
- u8 format;
- u8 kind:7;
- u8 layout:1;
- u8 blockh:4;
- u16 blocks[3];
- u32 pitch[3];
- u16 w;
- u16 h;
- u32 handle[6];
- u64 offset[6];
- } image;
- struct {
- u16 sx;
- u16 sy;
- u16 sw;
- u16 sh;
- u16 dw;
- u16 dh;
- } scale;
- struct {
- u16 x;
- u16 y;
- } point;
- struct {
- u8 depth;
- u8 k1;
- u8 src_color:4;
- u8 dst_color:4;
- } blend;
- union nv50_wndw_atom_mask {
- struct {
- bool ntfy:1;
- bool sema:1;
- bool xlut:1;
- bool csc:1;
- bool image:1;
- bool scale:1;
- bool point:1;
- bool blend:1;
- };
- u8 mask;
- } set, clr;
- };
- #endif
|