1b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs#ifndef __NVKM_DISP_OUTP_DP_H__
2b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs#define __NVKM_DISP_OUTP_DP_H__
3b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs
4b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs#include <subdev/bios.h>
5b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs#include <subdev/bios/dp.h>
6b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs
7b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs#include "outp.h"
8b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs
9b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggsstruct nvkm_output_dp {
10b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs	struct nvkm_output base;
11b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs
12b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs	struct nvbios_dpout info;
13b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs	u8 version;
14b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs
1579ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs	struct nvkm_notify irq;
16bb7ef1ec2e383d80acb9b0523a4692857b34ef1dBen Skeggs	bool present;
17bb7ef1ec2e383d80acb9b0523a4692857b34ef1dBen Skeggs	u8 dpcd[16];
1855f083c33feb7231c7574a64cd01b0477715a370Ben Skeggs
1955f083c33feb7231c7574a64cd01b0477715a370Ben Skeggs	struct {
2055f083c33feb7231c7574a64cd01b0477715a370Ben Skeggs		struct work_struct work;
2155f083c33feb7231c7574a64cd01b0477715a370Ben Skeggs		wait_queue_head_t wait;
2255f083c33feb7231c7574a64cd01b0477715a370Ben Skeggs		atomic_t done;
2355f083c33feb7231c7574a64cd01b0477715a370Ben Skeggs	} lt;
24b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs};
25b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs
26b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs#define nvkm_output_dp_create(p,e,c,b,i,d)                                     \
27b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs	nvkm_output_dp_create_((p), (e), (c), (b), (i), sizeof(**d), (void **)d)
28b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs#define nvkm_output_dp_destroy(d) ({                                           \
29b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs	struct nvkm_output_dp *_outp = (d);                                    \
30b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs	_nvkm_output_dp_dtor(nv_object(_outp));                                \
31b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs})
32b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs#define nvkm_output_dp_init(d) ({                                              \
33b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs	struct nvkm_output_dp *_outp = (d);                                    \
34b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs	_nvkm_output_dp_init(nv_object(_outp));                                \
35b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs})
36b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs#define nvkm_output_dp_fini(d,s) ({                                            \
37b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs	struct nvkm_output_dp *_outp = (d);                                    \
38b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs	_nvkm_output_dp_fini(nv_object(_outp), (s));                           \
39b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs})
40b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs
41b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggsint nvkm_output_dp_create_(struct nouveau_object *, struct nouveau_object *,
42b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs			   struct nouveau_oclass *, struct dcb_output *,
43b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs			   int, int, void **);
44b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs
45b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggsint  _nvkm_output_dp_ctor(struct nouveau_object *, struct nouveau_object *,
46b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs			  struct nouveau_oclass *, void *, u32,
47b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs			  struct nouveau_object **);
48b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggsvoid _nvkm_output_dp_dtor(struct nouveau_object *);
49b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggsint  _nvkm_output_dp_init(struct nouveau_object *);
50b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggsint  _nvkm_output_dp_fini(struct nouveau_object *, bool);
51b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs
52b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggsstruct nvkm_output_dp_impl {
53b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs	struct nvkm_output_impl base;
543b52a1f90639a88b3c76e4d42b60c34dd950cad3Ben Skeggs	int (*pattern)(struct nvkm_output_dp *, int);
551ecee1cda3a33029c32721b6f2c61bc3f371e3bdBen Skeggs	int (*lnk_pwr)(struct nvkm_output_dp *, int nr);
563b52a1f90639a88b3c76e4d42b60c34dd950cad3Ben Skeggs	int (*lnk_ctl)(struct nvkm_output_dp *, int nr, int bw, bool ef);
573b52a1f90639a88b3c76e4d42b60c34dd950cad3Ben Skeggs	int (*drv_ctl)(struct nvkm_output_dp *, int ln, int vs, int pe, int pc);
58b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs};
59b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs
6055f083c33feb7231c7574a64cd01b0477715a370Ben Skeggsint nvkm_output_dp_train(struct nvkm_output *, u32 rate, bool wait);
613b52a1f90639a88b3c76e4d42b60c34dd950cad3Ben Skeggs
62b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs#endif
63