]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
78f1ad6f BS |
2 | #ifndef __NVKM_DISP_IOR_H__ |
3 | #define __NVKM_DISP_IOR_H__ | |
4 | #include "priv.h" | |
7dc0bac4 | 5 | struct nvkm_i2c_aux; |
78f1ad6f BS |
6 | |
7 | struct nvkm_ior { | |
8 | const struct nvkm_ior_func *func; | |
9 | struct nvkm_disp *disp; | |
10 | enum nvkm_ior_type { | |
11 | DAC, | |
12 | SOR, | |
13 | PIOR, | |
14 | } type; | |
15 | int id; | |
16 | char name[8]; | |
17 | ||
18 | struct list_head head; | |
01a97637 BS |
19 | |
20 | struct nvkm_ior_state { | |
6c22ea37 | 21 | struct nvkm_outp *outp; |
29c0ca73 BS |
22 | unsigned rgdiv; |
23 | unsigned proto_evo:4; | |
01a97637 BS |
24 | enum nvkm_ior_proto { |
25 | CRT, | |
587f577e | 26 | TV, |
01a97637 BS |
27 | TMDS, |
28 | LVDS, | |
29 | DP, | |
30 | UNKNOWN | |
31 | } proto:3; | |
29c0ca73 BS |
32 | unsigned link:2; |
33 | unsigned head:4; | |
01a97637 | 34 | } arm, asy; |
75eefe95 BS |
35 | |
36 | /* Armed DP state. */ | |
37 | struct { | |
38 | bool mst; | |
39 | bool ef; | |
40 | u8 nr; | |
41 | u8 bw; | |
42 | } dp; | |
78f1ad6f BS |
43 | }; |
44 | ||
45 | struct nvkm_ior_func { | |
6c22ea37 BS |
46 | struct { |
47 | int (*get)(struct nvkm_outp *, int *link); | |
48 | void (*set)(struct nvkm_outp *, struct nvkm_ior *); | |
49 | } route; | |
50 | ||
29c0ca73 | 51 | void (*state)(struct nvkm_ior *, struct nvkm_ior_state *); |
9c5753bc BS |
52 | void (*power)(struct nvkm_ior *, bool normal, bool pu, |
53 | bool data, bool vsync, bool hsync); | |
0df18246 | 54 | int (*sense)(struct nvkm_ior *, u32 loadval); |
8d7ef84d BS |
55 | void (*clock)(struct nvkm_ior *); |
56 | void (*war_2)(struct nvkm_ior *); | |
0d93cd92 | 57 | void (*war_3)(struct nvkm_ior *); |
797b2fb8 BS |
58 | |
59 | struct { | |
60 | void (*ctrl)(struct nvkm_ior *, int head, bool enable, | |
61 | u8 max_ac_packet, u8 rekey, u8 *avi, u8 avi_size, | |
62 | u8 *vendor, u8 vendor_size); | |
63 | } hdmi; | |
33378104 BS |
64 | |
65 | struct { | |
66 | u8 lanes[4]; | |
7dc0bac4 | 67 | int (*links)(struct nvkm_ior *, struct nvkm_i2c_aux *); |
a3e81117 | 68 | void (*power)(struct nvkm_ior *, int nr); |
a1de2b52 | 69 | void (*pattern)(struct nvkm_ior *, int pattern); |
7d1fede0 BS |
70 | void (*drive)(struct nvkm_ior *, int ln, int pc, |
71 | int dc, int pe, int tx_pu); | |
e8ccc96d BS |
72 | void (*vcpi)(struct nvkm_ior *, int head, u8 slot, |
73 | u8 slot_nr, u16 pbn, u16 aligned); | |
409b9e54 | 74 | void (*audio)(struct nvkm_ior *, int head, bool enable); |
8d7ef84d BS |
75 | void (*audio_sym)(struct nvkm_ior *, int head, u16 h, u32 v); |
76 | void (*activesym)(struct nvkm_ior *, int head, | |
77 | u8 TU, u8 VTUa, u8 VTUf, u8 VTUi); | |
78 | void (*watermark)(struct nvkm_ior *, int head, u8 watermark); | |
33378104 | 79 | } dp; |
409b9e54 BS |
80 | |
81 | struct { | |
82 | void (*hpd)(struct nvkm_ior *, int head, bool present); | |
83 | void (*eld)(struct nvkm_ior *, u8 *data, u8 size); | |
84 | } hda; | |
78f1ad6f BS |
85 | }; |
86 | ||
87 | int nvkm_ior_new_(const struct nvkm_ior_func *func, struct nvkm_disp *, | |
88 | enum nvkm_ior_type type, int id); | |
89 | void nvkm_ior_del(struct nvkm_ior **); | |
90 | struct nvkm_ior *nvkm_ior_find(struct nvkm_disp *, enum nvkm_ior_type, int id); | |
91 | ||
9c5753bc BS |
92 | static inline u32 |
93 | nv50_ior_base(struct nvkm_ior *ior) | |
94 | { | |
95 | return ior->id * 0x800; | |
96 | } | |
97 | ||
98 | void nv50_dac_power(struct nvkm_ior *, bool, bool, bool, bool, bool); | |
0df18246 | 99 | int nv50_dac_sense(struct nvkm_ior *, u32); |
9c5753bc | 100 | |
9648da5a BS |
101 | void nv50_pior_depth(struct nvkm_ior *, struct nvkm_ior_state *, u32 ctrl); |
102 | ||
7dc0bac4 BS |
103 | static inline u32 |
104 | nv50_sor_link(struct nvkm_ior *ior) | |
105 | { | |
106 | return nv50_ior_base(ior) + ((ior->asy.link == 2) * 0x80); | |
107 | } | |
108 | ||
7df1bb87 | 109 | int nv50_sor_new_(const struct nvkm_ior_func *, struct nvkm_disp *, int id); |
29c0ca73 | 110 | void nv50_sor_state(struct nvkm_ior *, struct nvkm_ior_state *); |
9c5753bc | 111 | void nv50_sor_power(struct nvkm_ior *, bool, bool, bool, bool, bool); |
8d7ef84d | 112 | void nv50_sor_clock(struct nvkm_ior *); |
9c5753bc | 113 | |
29c0ca73 | 114 | void g94_sor_state(struct nvkm_ior *, struct nvkm_ior_state *); |
7dc0bac4 | 115 | int g94_sor_dp_links(struct nvkm_ior *, struct nvkm_i2c_aux *); |
a3e81117 | 116 | void g94_sor_dp_power(struct nvkm_ior *, int); |
a1de2b52 | 117 | void g94_sor_dp_pattern(struct nvkm_ior *, int); |
7d1fede0 | 118 | void g94_sor_dp_drive(struct nvkm_ior *, int, int, int, int, int); |
8d7ef84d BS |
119 | void g94_sor_dp_audio_sym(struct nvkm_ior *, int, u16, u32); |
120 | void g94_sor_dp_activesym(struct nvkm_ior *, int, u8, u8, u8, u8); | |
121 | void g94_sor_dp_watermark(struct nvkm_ior *, int, u8); | |
7dc0bac4 | 122 | |
409b9e54 BS |
123 | void gt215_sor_dp_audio(struct nvkm_ior *, int, bool); |
124 | ||
7df1bb87 | 125 | int gf119_sor_new_(const struct nvkm_ior_func *, struct nvkm_disp *, int id); |
29c0ca73 | 126 | void gf119_sor_state(struct nvkm_ior *, struct nvkm_ior_state *); |
8d7ef84d | 127 | void gf119_sor_clock(struct nvkm_ior *); |
7dc0bac4 | 128 | int gf119_sor_dp_links(struct nvkm_ior *, struct nvkm_i2c_aux *); |
a1de2b52 | 129 | void gf119_sor_dp_pattern(struct nvkm_ior *, int); |
7d1fede0 | 130 | void gf119_sor_dp_drive(struct nvkm_ior *, int, int, int, int, int); |
e8ccc96d | 131 | void gf119_sor_dp_vcpi(struct nvkm_ior *, int, u8, u8, u16, u16); |
409b9e54 | 132 | void gf119_sor_dp_audio(struct nvkm_ior *, int, bool); |
8d7ef84d BS |
133 | void gf119_sor_dp_audio_sym(struct nvkm_ior *, int, u16, u32); |
134 | void gf119_sor_dp_watermark(struct nvkm_ior *, int, u8); | |
a1de2b52 BS |
135 | |
136 | void gm107_sor_dp_pattern(struct nvkm_ior *, int); | |
29c0ca73 | 137 | |
797b2fb8 BS |
138 | void g84_hdmi_ctrl(struct nvkm_ior *, int, bool, u8, u8, u8 *, u8 , u8 *, u8); |
139 | void gt215_hdmi_ctrl(struct nvkm_ior *, int, bool, u8, u8, u8 *, u8 , u8 *, u8); | |
140 | void gf119_hdmi_ctrl(struct nvkm_ior *, int, bool, u8, u8, u8 *, u8 , u8 *, u8); | |
141 | void gk104_hdmi_ctrl(struct nvkm_ior *, int, bool, u8, u8, u8 *, u8 , u8 *, u8); | |
142 | ||
409b9e54 BS |
143 | void gt215_hda_hpd(struct nvkm_ior *, int, bool); |
144 | void gt215_hda_eld(struct nvkm_ior *, u8 *, u8); | |
145 | ||
146 | void gf119_hda_hpd(struct nvkm_ior *, int, bool); | |
147 | void gf119_hda_eld(struct nvkm_ior *, u8 *, u8); | |
148 | ||
78f1ad6f BS |
149 | #define IOR_MSG(i,l,f,a...) do { \ |
150 | struct nvkm_ior *_ior = (i); \ | |
151 | nvkm_##l(&_ior->disp->engine.subdev, "%s: "f, _ior->name, ##a); \ | |
152 | } while(0) | |
153 | #define IOR_WARN(i,f,a...) IOR_MSG((i), warn, f, ##a) | |
154 | #define IOR_DBG(i,f,a...) IOR_MSG((i), debug, f, ##a) | |
155 | ||
156 | int nv50_dac_new(struct nvkm_disp *, int); | |
b3c9c022 | 157 | int gf119_dac_new(struct nvkm_disp *, int); |
78f1ad6f BS |
158 | |
159 | int nv50_pior_new(struct nvkm_disp *, int); | |
160 | ||
161 | int nv50_sor_new(struct nvkm_disp *, int); | |
b3c9c022 | 162 | int g84_sor_new(struct nvkm_disp *, int); |
78f1ad6f | 163 | int g94_sor_new(struct nvkm_disp *, int); |
b3c9c022 BS |
164 | int mcp77_sor_new(struct nvkm_disp *, int); |
165 | int gt215_sor_new(struct nvkm_disp *, int); | |
166 | int mcp89_sor_new(struct nvkm_disp *, int); | |
78f1ad6f | 167 | int gf119_sor_new(struct nvkm_disp *, int); |
b3c9c022 | 168 | int gk104_sor_new(struct nvkm_disp *, int); |
78f1ad6f BS |
169 | int gm107_sor_new(struct nvkm_disp *, int); |
170 | int gm200_sor_new(struct nvkm_disp *, int); | |
171 | #endif |