162306a36Sopenharmony_ci#ifndef __NV50_KMS_HEAD_H__
262306a36Sopenharmony_ci#define __NV50_KMS_HEAD_H__
362306a36Sopenharmony_ci#define nv50_head(c) container_of((c), struct nv50_head, base.base)
462306a36Sopenharmony_ci#include <linux/workqueue.h>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include "disp.h"
762306a36Sopenharmony_ci#include "atom.h"
862306a36Sopenharmony_ci#include "crc.h"
962306a36Sopenharmony_ci#include "lut.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include "nouveau_crtc.h"
1262306a36Sopenharmony_ci#include "nouveau_encoder.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistruct nv50_head {
1562306a36Sopenharmony_ci	const struct nv50_head_func *func;
1662306a36Sopenharmony_ci	struct nouveau_crtc base;
1762306a36Sopenharmony_ci	struct nv50_crc crc;
1862306a36Sopenharmony_ci	struct nv50_lut olut;
1962306a36Sopenharmony_ci	struct nv50_msto *msto;
2062306a36Sopenharmony_ci};
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct nv50_head *nv50_head_create(struct drm_device *, int index);
2362306a36Sopenharmony_civoid nv50_head_flush_set(struct nv50_head *head, struct nv50_head_atom *asyh);
2462306a36Sopenharmony_civoid nv50_head_flush_set_wndw(struct nv50_head *head, struct nv50_head_atom *asyh);
2562306a36Sopenharmony_civoid nv50_head_flush_clr(struct nv50_head *head,
2662306a36Sopenharmony_ci			 struct nv50_head_atom *asyh, bool flush);
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistruct nv50_head_func {
2962306a36Sopenharmony_ci	int (*view)(struct nv50_head *, struct nv50_head_atom *);
3062306a36Sopenharmony_ci	int (*mode)(struct nv50_head *, struct nv50_head_atom *);
3162306a36Sopenharmony_ci	bool (*olut)(struct nv50_head *, struct nv50_head_atom *, int);
3262306a36Sopenharmony_ci	bool (*ilut_check)(int size);
3362306a36Sopenharmony_ci	bool olut_identity;
3462306a36Sopenharmony_ci	int  olut_size;
3562306a36Sopenharmony_ci	int (*olut_set)(struct nv50_head *, struct nv50_head_atom *);
3662306a36Sopenharmony_ci	int (*olut_clr)(struct nv50_head *);
3762306a36Sopenharmony_ci	void (*core_calc)(struct nv50_head *, struct nv50_head_atom *);
3862306a36Sopenharmony_ci	int (*core_set)(struct nv50_head *, struct nv50_head_atom *);
3962306a36Sopenharmony_ci	int (*core_clr)(struct nv50_head *);
4062306a36Sopenharmony_ci	int (*curs_layout)(struct nv50_head *, struct nv50_wndw_atom *,
4162306a36Sopenharmony_ci			   struct nv50_head_atom *);
4262306a36Sopenharmony_ci	int (*curs_format)(struct nv50_head *, struct nv50_wndw_atom *,
4362306a36Sopenharmony_ci			   struct nv50_head_atom *);
4462306a36Sopenharmony_ci	int (*curs_set)(struct nv50_head *, struct nv50_head_atom *);
4562306a36Sopenharmony_ci	int (*curs_clr)(struct nv50_head *);
4662306a36Sopenharmony_ci	int (*base)(struct nv50_head *, struct nv50_head_atom *);
4762306a36Sopenharmony_ci	int (*ovly)(struct nv50_head *, struct nv50_head_atom *);
4862306a36Sopenharmony_ci	int (*dither)(struct nv50_head *, struct nv50_head_atom *);
4962306a36Sopenharmony_ci	int (*procamp)(struct nv50_head *, struct nv50_head_atom *);
5062306a36Sopenharmony_ci	int (*or)(struct nv50_head *, struct nv50_head_atom *);
5162306a36Sopenharmony_ci	void (*static_wndw_map)(struct nv50_head *, struct nv50_head_atom *);
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ciextern const struct nv50_head_func head507d;
5562306a36Sopenharmony_ciint head507d_view(struct nv50_head *, struct nv50_head_atom *);
5662306a36Sopenharmony_ciint head507d_mode(struct nv50_head *, struct nv50_head_atom *);
5762306a36Sopenharmony_cibool head507d_olut(struct nv50_head *, struct nv50_head_atom *, int);
5862306a36Sopenharmony_civoid head507d_core_calc(struct nv50_head *, struct nv50_head_atom *);
5962306a36Sopenharmony_ciint head507d_core_clr(struct nv50_head *);
6062306a36Sopenharmony_ciint head507d_curs_layout(struct nv50_head *, struct nv50_wndw_atom *,
6162306a36Sopenharmony_ci			 struct nv50_head_atom *);
6262306a36Sopenharmony_ciint head507d_curs_format(struct nv50_head *, struct nv50_wndw_atom *,
6362306a36Sopenharmony_ci			 struct nv50_head_atom *);
6462306a36Sopenharmony_ciint head507d_base(struct nv50_head *, struct nv50_head_atom *);
6562306a36Sopenharmony_ciint head507d_ovly(struct nv50_head *, struct nv50_head_atom *);
6662306a36Sopenharmony_ciint head507d_dither(struct nv50_head *, struct nv50_head_atom *);
6762306a36Sopenharmony_ciint head507d_procamp(struct nv50_head *, struct nv50_head_atom *);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciextern const struct nv50_head_func head827d;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ciextern const struct nv50_head_func head907d;
7262306a36Sopenharmony_ciint head907d_view(struct nv50_head *, struct nv50_head_atom *);
7362306a36Sopenharmony_ciint head907d_mode(struct nv50_head *, struct nv50_head_atom *);
7462306a36Sopenharmony_cibool head907d_olut(struct nv50_head *, struct nv50_head_atom *, int);
7562306a36Sopenharmony_cibool head907d_ilut_check(int size);
7662306a36Sopenharmony_ciint head907d_olut_set(struct nv50_head *, struct nv50_head_atom *);
7762306a36Sopenharmony_ciint head907d_olut_clr(struct nv50_head *);
7862306a36Sopenharmony_ciint head907d_core_set(struct nv50_head *, struct nv50_head_atom *);
7962306a36Sopenharmony_ciint head907d_core_clr(struct nv50_head *);
8062306a36Sopenharmony_ciint head907d_curs_set(struct nv50_head *, struct nv50_head_atom *);
8162306a36Sopenharmony_ciint head907d_curs_clr(struct nv50_head *);
8262306a36Sopenharmony_ciint head907d_ovly(struct nv50_head *, struct nv50_head_atom *);
8362306a36Sopenharmony_ciint head907d_procamp(struct nv50_head *, struct nv50_head_atom *);
8462306a36Sopenharmony_ciint head907d_or(struct nv50_head *, struct nv50_head_atom *);
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ciextern const struct nv50_head_func head917d;
8762306a36Sopenharmony_ciint head917d_curs_layout(struct nv50_head *, struct nv50_wndw_atom *,
8862306a36Sopenharmony_ci			 struct nv50_head_atom *);
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ciextern const struct nv50_head_func headc37d;
9162306a36Sopenharmony_ciint headc37d_view(struct nv50_head *, struct nv50_head_atom *);
9262306a36Sopenharmony_ciint headc37d_curs_format(struct nv50_head *, struct nv50_wndw_atom *,
9362306a36Sopenharmony_ci			 struct nv50_head_atom *);
9462306a36Sopenharmony_ciint headc37d_curs_set(struct nv50_head *, struct nv50_head_atom *);
9562306a36Sopenharmony_ciint headc37d_curs_clr(struct nv50_head *);
9662306a36Sopenharmony_ciint headc37d_dither(struct nv50_head *, struct nv50_head_atom *);
9762306a36Sopenharmony_civoid headc37d_static_wndw_map(struct nv50_head *, struct nv50_head_atom *);
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ciextern const struct nv50_head_func headc57d;
10062306a36Sopenharmony_ci#endif
101