268 lines
3.8 KiB
C
268 lines
3.8 KiB
C
|
#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
|