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