18c2ecf20Sopenharmony_ci#ifndef __NV50_KMS_ATOM_H__
28c2ecf20Sopenharmony_ci#define __NV50_KMS_ATOM_H__
38c2ecf20Sopenharmony_ci#define nv50_atom(p) container_of((p), struct nv50_atom, state)
48c2ecf20Sopenharmony_ci#include <drm/drm_atomic.h>
58c2ecf20Sopenharmony_ci#include "crc.h"
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_cistruct nouveau_encoder;
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_cistruct nv50_atom {
108c2ecf20Sopenharmony_ci	struct drm_atomic_state state;
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci	struct list_head outp;
138c2ecf20Sopenharmony_ci	bool lock_core;
148c2ecf20Sopenharmony_ci	bool flush_disable;
158c2ecf20Sopenharmony_ci};
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#define nv50_head_atom(p) container_of((p), struct nv50_head_atom, state)
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_cistruct nv50_head_atom {
208c2ecf20Sopenharmony_ci	struct drm_crtc_state state;
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	struct {
238c2ecf20Sopenharmony_ci		u32 mask;
248c2ecf20Sopenharmony_ci		u32 owned;
258c2ecf20Sopenharmony_ci		u32 olut;
268c2ecf20Sopenharmony_ci	} wndw;
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci	struct {
298c2ecf20Sopenharmony_ci		u16 iW;
308c2ecf20Sopenharmony_ci		u16 iH;
318c2ecf20Sopenharmony_ci		u16 oW;
328c2ecf20Sopenharmony_ci		u16 oH;
338c2ecf20Sopenharmony_ci	} view;
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	struct nv50_head_mode {
368c2ecf20Sopenharmony_ci		bool interlace;
378c2ecf20Sopenharmony_ci		u32 clock;
388c2ecf20Sopenharmony_ci		struct {
398c2ecf20Sopenharmony_ci			u16 active;
408c2ecf20Sopenharmony_ci			u16 synce;
418c2ecf20Sopenharmony_ci			u16 blanke;
428c2ecf20Sopenharmony_ci			u16 blanks;
438c2ecf20Sopenharmony_ci		} h;
448c2ecf20Sopenharmony_ci		struct {
458c2ecf20Sopenharmony_ci			u32 active;
468c2ecf20Sopenharmony_ci			u16 synce;
478c2ecf20Sopenharmony_ci			u16 blanke;
488c2ecf20Sopenharmony_ci			u16 blanks;
498c2ecf20Sopenharmony_ci			u16 blank2s;
508c2ecf20Sopenharmony_ci			u16 blank2e;
518c2ecf20Sopenharmony_ci			u16 blankus;
528c2ecf20Sopenharmony_ci		} v;
538c2ecf20Sopenharmony_ci	} mode;
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	struct {
568c2ecf20Sopenharmony_ci		bool visible;
578c2ecf20Sopenharmony_ci		u32 handle;
588c2ecf20Sopenharmony_ci		u64 offset:40;
598c2ecf20Sopenharmony_ci		u8 buffer:1;
608c2ecf20Sopenharmony_ci		u8 mode:4;
618c2ecf20Sopenharmony_ci		u16 size:11;
628c2ecf20Sopenharmony_ci		u8 range:2;
638c2ecf20Sopenharmony_ci		u8 output_mode:2;
648c2ecf20Sopenharmony_ci		void (*load)(struct drm_color_lut *, int size, void __iomem *);
658c2ecf20Sopenharmony_ci	} olut;
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci	struct {
688c2ecf20Sopenharmony_ci		bool visible;
698c2ecf20Sopenharmony_ci		u32 handle;
708c2ecf20Sopenharmony_ci		u64 offset:40;
718c2ecf20Sopenharmony_ci		u8  format;
728c2ecf20Sopenharmony_ci		u8  kind:7;
738c2ecf20Sopenharmony_ci		u8  layout:1;
748c2ecf20Sopenharmony_ci		u8  blockh:4;
758c2ecf20Sopenharmony_ci		u16 blocks:12;
768c2ecf20Sopenharmony_ci		u32 pitch:20;
778c2ecf20Sopenharmony_ci		u16 x;
788c2ecf20Sopenharmony_ci		u16 y;
798c2ecf20Sopenharmony_ci		u16 w;
808c2ecf20Sopenharmony_ci		u16 h;
818c2ecf20Sopenharmony_ci	} core;
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	struct {
848c2ecf20Sopenharmony_ci		bool visible;
858c2ecf20Sopenharmony_ci		u32 handle;
868c2ecf20Sopenharmony_ci		u64 offset:40;
878c2ecf20Sopenharmony_ci		u8  layout:2;
888c2ecf20Sopenharmony_ci		u8  format:8;
898c2ecf20Sopenharmony_ci	} curs;
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci	struct {
928c2ecf20Sopenharmony_ci		u8  depth;
938c2ecf20Sopenharmony_ci		u8  cpp;
948c2ecf20Sopenharmony_ci		u16 x;
958c2ecf20Sopenharmony_ci		u16 y;
968c2ecf20Sopenharmony_ci		u16 w;
978c2ecf20Sopenharmony_ci		u16 h;
988c2ecf20Sopenharmony_ci	} base;
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci	struct {
1018c2ecf20Sopenharmony_ci		u8 cpp;
1028c2ecf20Sopenharmony_ci	} ovly;
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci	struct {
1058c2ecf20Sopenharmony_ci		bool enable:1;
1068c2ecf20Sopenharmony_ci		u8 bits:2;
1078c2ecf20Sopenharmony_ci		u8 mode:4;
1088c2ecf20Sopenharmony_ci	} dither;
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci	struct {
1118c2ecf20Sopenharmony_ci		struct {
1128c2ecf20Sopenharmony_ci			u16 cos:12;
1138c2ecf20Sopenharmony_ci			u16 sin:12;
1148c2ecf20Sopenharmony_ci		} sat;
1158c2ecf20Sopenharmony_ci	} procamp;
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci	struct {
1188c2ecf20Sopenharmony_ci		u8 nhsync:1;
1198c2ecf20Sopenharmony_ci		u8 nvsync:1;
1208c2ecf20Sopenharmony_ci		u8 depth:4;
1218c2ecf20Sopenharmony_ci		u8 crc_raster:2;
1228c2ecf20Sopenharmony_ci		u8 bpc;
1238c2ecf20Sopenharmony_ci	} or;
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	struct nv50_crc_atom crc;
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ci	/* Currently only used for MST */
1288c2ecf20Sopenharmony_ci	struct {
1298c2ecf20Sopenharmony_ci		int pbn;
1308c2ecf20Sopenharmony_ci		u8 tu:6;
1318c2ecf20Sopenharmony_ci	} dp;
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_ci	union nv50_head_atom_mask {
1348c2ecf20Sopenharmony_ci		struct {
1358c2ecf20Sopenharmony_ci			bool olut:1;
1368c2ecf20Sopenharmony_ci			bool core:1;
1378c2ecf20Sopenharmony_ci			bool curs:1;
1388c2ecf20Sopenharmony_ci			bool view:1;
1398c2ecf20Sopenharmony_ci			bool mode:1;
1408c2ecf20Sopenharmony_ci			bool base:1;
1418c2ecf20Sopenharmony_ci			bool ovly:1;
1428c2ecf20Sopenharmony_ci			bool dither:1;
1438c2ecf20Sopenharmony_ci			bool procamp:1;
1448c2ecf20Sopenharmony_ci			bool crc:1;
1458c2ecf20Sopenharmony_ci			bool or:1;
1468c2ecf20Sopenharmony_ci		};
1478c2ecf20Sopenharmony_ci		u16 mask;
1488c2ecf20Sopenharmony_ci	} set, clr;
1498c2ecf20Sopenharmony_ci};
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_cistatic inline struct nv50_head_atom *
1528c2ecf20Sopenharmony_cinv50_head_atom_get(struct drm_atomic_state *state, struct drm_crtc *crtc)
1538c2ecf20Sopenharmony_ci{
1548c2ecf20Sopenharmony_ci	struct drm_crtc_state *statec = drm_atomic_get_crtc_state(state, crtc);
1558c2ecf20Sopenharmony_ci	if (IS_ERR(statec))
1568c2ecf20Sopenharmony_ci		return (void *)statec;
1578c2ecf20Sopenharmony_ci	return nv50_head_atom(statec);
1588c2ecf20Sopenharmony_ci}
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_cistatic inline struct drm_encoder *
1618c2ecf20Sopenharmony_cinv50_head_atom_get_encoder(struct nv50_head_atom *atom)
1628c2ecf20Sopenharmony_ci{
1638c2ecf20Sopenharmony_ci	struct drm_encoder *encoder;
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ci	/* We only ever have a single encoder */
1668c2ecf20Sopenharmony_ci	drm_for_each_encoder_mask(encoder, atom->state.crtc->dev,
1678c2ecf20Sopenharmony_ci				  atom->state.encoder_mask)
1688c2ecf20Sopenharmony_ci		return encoder;
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ci	return NULL;
1718c2ecf20Sopenharmony_ci}
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci#define nv50_wndw_atom(p) container_of((p), struct nv50_wndw_atom, state)
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_cistruct nv50_wndw_atom {
1768c2ecf20Sopenharmony_ci	struct drm_plane_state state;
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci	struct drm_property_blob *ilut;
1798c2ecf20Sopenharmony_ci	bool visible;
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci	struct {
1828c2ecf20Sopenharmony_ci		u32  handle;
1838c2ecf20Sopenharmony_ci		u16  offset:12;
1848c2ecf20Sopenharmony_ci		bool awaken:1;
1858c2ecf20Sopenharmony_ci	} ntfy;
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ci	struct {
1888c2ecf20Sopenharmony_ci		u32 handle;
1898c2ecf20Sopenharmony_ci		u16 offset:12;
1908c2ecf20Sopenharmony_ci		u32 acquire;
1918c2ecf20Sopenharmony_ci		u32 release;
1928c2ecf20Sopenharmony_ci	} sema;
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_ci	struct {
1958c2ecf20Sopenharmony_ci		u32 handle;
1968c2ecf20Sopenharmony_ci		struct {
1978c2ecf20Sopenharmony_ci			u64 offset:40;
1988c2ecf20Sopenharmony_ci			u8  buffer:1;
1998c2ecf20Sopenharmony_ci			u8  enable:2;
2008c2ecf20Sopenharmony_ci			u8  mode:4;
2018c2ecf20Sopenharmony_ci			u16 size:11;
2028c2ecf20Sopenharmony_ci			u8  range:2;
2038c2ecf20Sopenharmony_ci			u8  output_mode:2;
2048c2ecf20Sopenharmony_ci			void (*load)(struct drm_color_lut *, int size,
2058c2ecf20Sopenharmony_ci				     void __iomem *);
2068c2ecf20Sopenharmony_ci		} i;
2078c2ecf20Sopenharmony_ci	} xlut;
2088c2ecf20Sopenharmony_ci
2098c2ecf20Sopenharmony_ci	struct {
2108c2ecf20Sopenharmony_ci		u32 matrix[12];
2118c2ecf20Sopenharmony_ci		bool valid;
2128c2ecf20Sopenharmony_ci	} csc;
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_ci	struct {
2158c2ecf20Sopenharmony_ci		u8  mode:2;
2168c2ecf20Sopenharmony_ci		u8  interval:4;
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci		u8  colorspace:2;
2198c2ecf20Sopenharmony_ci		u8  format;
2208c2ecf20Sopenharmony_ci		u8  kind:7;
2218c2ecf20Sopenharmony_ci		u8  layout:1;
2228c2ecf20Sopenharmony_ci		u8  blockh:4;
2238c2ecf20Sopenharmony_ci		u16 blocks[3];
2248c2ecf20Sopenharmony_ci		u32 pitch[3];
2258c2ecf20Sopenharmony_ci		u16 w;
2268c2ecf20Sopenharmony_ci		u16 h;
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_ci		u32 handle[6];
2298c2ecf20Sopenharmony_ci		u64 offset[6];
2308c2ecf20Sopenharmony_ci	} image;
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci	struct {
2338c2ecf20Sopenharmony_ci		u16 sx;
2348c2ecf20Sopenharmony_ci		u16 sy;
2358c2ecf20Sopenharmony_ci		u16 sw;
2368c2ecf20Sopenharmony_ci		u16 sh;
2378c2ecf20Sopenharmony_ci		u16 dw;
2388c2ecf20Sopenharmony_ci		u16 dh;
2398c2ecf20Sopenharmony_ci	} scale;
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ci	struct {
2428c2ecf20Sopenharmony_ci		u16 x;
2438c2ecf20Sopenharmony_ci		u16 y;
2448c2ecf20Sopenharmony_ci	} point;
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci	struct {
2478c2ecf20Sopenharmony_ci		u8 depth;
2488c2ecf20Sopenharmony_ci		u8 k1;
2498c2ecf20Sopenharmony_ci		u8 src_color:4;
2508c2ecf20Sopenharmony_ci		u8 dst_color:4;
2518c2ecf20Sopenharmony_ci	} blend;
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci	union nv50_wndw_atom_mask {
2548c2ecf20Sopenharmony_ci		struct {
2558c2ecf20Sopenharmony_ci			bool ntfy:1;
2568c2ecf20Sopenharmony_ci			bool sema:1;
2578c2ecf20Sopenharmony_ci			bool xlut:1;
2588c2ecf20Sopenharmony_ci			bool csc:1;
2598c2ecf20Sopenharmony_ci			bool image:1;
2608c2ecf20Sopenharmony_ci			bool scale:1;
2618c2ecf20Sopenharmony_ci			bool point:1;
2628c2ecf20Sopenharmony_ci			bool blend:1;
2638c2ecf20Sopenharmony_ci		};
2648c2ecf20Sopenharmony_ci		u8 mask;
2658c2ecf20Sopenharmony_ci	} set, clr;
2668c2ecf20Sopenharmony_ci};
2678c2ecf20Sopenharmony_ci#endif
268