1 /*
2 * Copyright 2011-2015, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * Michael Lotz, mmlr@mlotz.ch
7 * Alexander von Gluck IV, kallisti5@unixzen.com
8 */
9 #ifndef INTEL_PORTS_H
10 #define INTEL_PORTS_H
11
12
13 #include <dp.h>
14 #include <edid.h>
15
16 #include "intel_extreme.h"
17
18 #include "Pipes.h"
19 #include "pll.h"
20
21
22 #define MAX_PORTS 20 // a generous upper bound
23
24 struct pll_limits;
25 struct i2c_bus;
26
27 enum port_type {
28 INTEL_PORT_TYPE_ANY, // wildcard for lookup functions
29 INTEL_PORT_TYPE_ANALOG,
30 INTEL_PORT_TYPE_DVI,
31 INTEL_PORT_TYPE_LVDS,
32 INTEL_PORT_TYPE_DP,
33 INTEL_PORT_TYPE_eDP,
34 INTEL_PORT_TYPE_HDMI
35 };
36
37
38 class Port {
39 public:
40 Port(port_index index,
41 const char* baseName);
42 virtual ~Port();
43
44 virtual uint32 Type() const = 0;
PortName()45 const char* PortName() const
46 { return fPortName; }
47
PortIndex()48 port_index PortIndex() const
49 { return fPortIndex; }
50
51 virtual bool IsConnected() = 0;
52
53 virtual status_t SetPipe(Pipe* pipe);
GetPipe()54 ::Pipe* GetPipe()
55 { return fPipe; };
56
57 virtual status_t Power(bool enabled);
58
59 bool HasEDID();
60 virtual status_t GetEDID(edid1_info* edid,
61 bool forceRead = false);
62 virtual status_t SetupI2c(struct i2c_bus *bus);
63 virtual status_t SetupI2cFallback(struct i2c_bus *bus);
64
65 virtual status_t GetPLLLimits(pll_limits& limits);
66
SetDisplayMode(display_mode * mode,uint32 colorMode)67 virtual status_t SetDisplayMode(display_mode* mode,
68 uint32 colorMode) { return B_ERROR; };
69
70 virtual pipe_index PipePreference();
71
72 protected:
73 void _SetName(const char* name);
74
75 static status_t _GetI2CSignals(void* cookie, int* _clock,
76 int* _data);
77 static status_t _SetI2CSignals(void* cookie, int clock,
78 int data);
79 bool _IsPortInVBT(uint32* foundIndex = NULL);
80 bool _IsDisplayPortInVBT();
81 bool _IsHdmiInVBT();
82 bool _IsEDPPort();
83 addr_t _DDCPin();
84 status_t _SetupDpAuxI2c(struct i2c_bus *bus);
85
86 ssize_t _DpAuxTransfer(dp_aux_msg* message);
87 ssize_t _DpAuxTransfer(uint8* transmitBuffer, uint8 transmitSize,
88 uint8* receiveBuffer, uint8 receiveSize);
89 status_t _DpAuxSendReceive(uint32 slave_address,
90 const uint8 *writeBuffer, size_t writeLength,
91 uint8 *readBuffer, size_t readLength);
92 static status_t _DpAuxSendReceiveHook(const struct i2c_bus *bus,
93 uint32 slave_address, const uint8 *writeBuffer,
94 size_t writeLength, uint8 *readBuffer,
95 size_t readLength);
96 aux_channel _DpAuxChannel();
97
98 display_mode fCurrentMode;
99 Pipe* fPipe;
100
101 status_t fEDIDState;
102 edid1_info fEDIDInfo;
103
104 private:
105 virtual addr_t _DDCRegister() = 0;
106 virtual addr_t _PortRegister() = 0;
107
108 port_index fPortIndex;
109 char* fPortName;
110 };
111
112
113 class AnalogPort : public Port {
114 public:
115 AnalogPort();
116
Type()117 virtual uint32 Type() const
118 { return INTEL_PORT_TYPE_ANALOG; }
119
120 virtual bool IsConnected();
121
122 virtual status_t SetDisplayMode(display_mode* mode,
123 uint32 colorMode);
124
125 protected:
126 virtual addr_t _DDCRegister();
127 virtual addr_t _PortRegister();
128 };
129
130
131 class LVDSPort : public Port {
132 public:
133 LVDSPort();
134
Type()135 virtual uint32 Type() const
136 { return INTEL_PORT_TYPE_LVDS; }
137
138 virtual bool IsConnected();
139
140 virtual status_t SetDisplayMode(display_mode* mode,
141 uint32 colorMode);
142
143 virtual pipe_index PipePreference();
144
145 protected:
146 virtual addr_t _DDCRegister();
147 virtual addr_t _PortRegister();
148 };
149
150
151 class DigitalPort : public Port {
152 public:
153 DigitalPort(
154 port_index index = INTEL_PORT_B,
155 const char* baseName = "DVI");
156
Type()157 virtual uint32 Type() const
158 { return INTEL_PORT_TYPE_DVI; }
159
160 virtual bool IsConnected();
161
162 virtual status_t SetDisplayMode(display_mode* mode,
163 uint32 colorMode);
164
165 protected:
166 virtual addr_t _DDCRegister();
167 virtual addr_t _PortRegister();
168 };
169
170
171 class HDMIPort : public DigitalPort {
172 public:
173 HDMIPort(port_index index);
174
Type()175 virtual uint32 Type() const
176 { return INTEL_PORT_TYPE_HDMI; }
177
178 virtual bool IsConnected();
179
180 protected:
181 virtual addr_t _PortRegister();
182 };
183
184
185 class DisplayPort : public Port {
186 public:
187 DisplayPort(port_index index,
188 const char* baseName = "DisplayPort");
189
Type()190 virtual uint32 Type() const
191 { return INTEL_PORT_TYPE_DP; }
192
193 virtual status_t SetPipe(Pipe* pipe);
194 virtual status_t SetupI2c(i2c_bus *bus);
195
196 virtual bool IsConnected();
197
198 virtual status_t SetDisplayMode(display_mode* mode,
199 uint32 colorMode);
200
201 virtual pipe_index PipePreference();
202
203 protected:
204 virtual addr_t _DDCRegister();
205 virtual addr_t _PortRegister();
206
207 private:
208 status_t _SetPortLinkGen4(const display_timing& timing);
209 status_t _SetPortLinkGen6(const display_timing& timing);
210 };
211
212
213 class EmbeddedDisplayPort : public DisplayPort {
214 public:
215 EmbeddedDisplayPort();
216
Type()217 virtual uint32 Type() const
218 { return INTEL_PORT_TYPE_eDP; }
219
220 virtual bool IsConnected();
221 };
222
223
224 class DigitalDisplayInterface : public Port {
225 public:
226 DigitalDisplayInterface(
227 port_index index = INTEL_PORT_A,
228 const char* baseName = "Digital Display Interface");
229
Type()230 virtual uint32 Type() const
231 { return INTEL_PORT_TYPE_DVI; }
232
233 virtual status_t Power(bool enabled);
234
235 virtual status_t SetPipe(Pipe* pipe);
236 virtual status_t SetupI2c(i2c_bus *bus);
237 virtual status_t SetupI2cFallback(struct i2c_bus *bus);
238
239 virtual bool IsConnected();
240
241 virtual status_t SetDisplayMode(display_mode* mode,
242 uint32 colorMode);
243
244 protected:
245 virtual addr_t _DDCRegister();
246 virtual addr_t _PortRegister();
247 private:
248 uint8 fMaxLanes;
249
250 status_t _SetPortLinkGen8(const display_timing& timing,
251 uint32 pllSel);
252 };
253
254
255 #endif // INTEL_PORTS_H
256