xref: /haiku/src/add-ons/accelerants/intel_extreme/Ports.h (revision ab3c8bea07449c2305e9b9ad10421e316ce1d453)
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;
45 		const char*					PortName() const
46 										{ return fPortName; }
47 
48 		port_index					PortIndex() const
49 										{ return fPortIndex; }
50 
51 virtual	bool						IsConnected() = 0;
52 
53 virtual	status_t					SetPipe(Pipe* pipe);
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 
64 virtual	status_t					GetPLLLimits(pll_limits& limits);
65 
66 virtual status_t					SetDisplayMode(display_mode* mode,
67 										uint32 colorMode) { return B_ERROR; };
68 
69 virtual pipe_index					PipePreference();
70 
71 protected:
72 		void						_SetName(const char* name);
73 
74 static	status_t					_GetI2CSignals(void* cookie, int* _clock,
75 										int* _data);
76 static	status_t					_SetI2CSignals(void* cookie, int clock,
77 										int data);
78 
79 		display_mode				fCurrentMode;
80 		Pipe*						fPipe;
81 
82 		status_t					fEDIDState;
83 		edid1_info					fEDIDInfo;
84 
85 private:
86 virtual	addr_t						_DDCRegister() = 0;
87 virtual addr_t						_PortRegister() = 0;
88 
89 		port_index					fPortIndex;
90 		char*						fPortName;
91 };
92 
93 
94 class AnalogPort : public Port {
95 public:
96 									AnalogPort();
97 
98 virtual	uint32						Type() const
99 										{ return INTEL_PORT_TYPE_ANALOG; }
100 
101 virtual	bool						IsConnected();
102 
103 virtual status_t					SetDisplayMode(display_mode* mode,
104 										uint32 colorMode);
105 
106 protected:
107 virtual	addr_t						_DDCRegister();
108 virtual addr_t						_PortRegister();
109 };
110 
111 
112 class LVDSPort : public Port {
113 public:
114 									LVDSPort();
115 
116 virtual	uint32						Type() const
117 										{ return INTEL_PORT_TYPE_LVDS; }
118 
119 virtual	bool						IsConnected();
120 
121 virtual status_t					SetDisplayMode(display_mode* mode,
122 										uint32 colorMode);
123 
124 virtual pipe_index					PipePreference();
125 
126 protected:
127 virtual	addr_t						_DDCRegister();
128 virtual addr_t						_PortRegister();
129 };
130 
131 
132 class DigitalPort : public Port {
133 public:
134 									DigitalPort(
135 										port_index index = INTEL_PORT_B,
136 										const char* baseName = "DVI");
137 
138 virtual	uint32						Type() const
139 										{ return INTEL_PORT_TYPE_DVI; }
140 
141 virtual	bool						IsConnected();
142 
143 virtual status_t					SetDisplayMode(display_mode* mode,
144 										uint32 colorMode);
145 
146 protected:
147 virtual	addr_t						_DDCRegister();
148 virtual addr_t						_PortRegister();
149 };
150 
151 
152 class HDMIPort : public DigitalPort {
153 public:
154 									HDMIPort(port_index index);
155 
156 virtual	uint32						Type() const
157 										{ return INTEL_PORT_TYPE_HDMI; }
158 
159 virtual	bool						IsConnected();
160 
161 protected:
162 virtual addr_t						_PortRegister();
163 };
164 
165 
166 class DisplayPort : public Port {
167 public:
168 									DisplayPort(port_index index,
169 										const char* baseName = "DisplayPort");
170 
171 virtual	uint32						Type() const
172 										{ return INTEL_PORT_TYPE_DP; }
173 
174 virtual	status_t					SetPipe(Pipe* pipe);
175 
176 virtual	bool						IsConnected();
177 
178 virtual status_t					SetDisplayMode(display_mode* mode,
179 										uint32 colorMode);
180 
181 virtual pipe_index					PipePreference();
182 
183 protected:
184 virtual	addr_t						_DDCRegister();
185 virtual	addr_t						_PortRegister();
186 
187 private:
188 		status_t					_SetPortLinkGen4(const display_timing& timing);
189 		status_t					_SetPortLinkGen6(const display_timing& timing);
190 };
191 
192 
193 class EmbeddedDisplayPort : public DisplayPort {
194 public:
195 									EmbeddedDisplayPort();
196 
197 virtual	uint32						Type() const
198 										{ return INTEL_PORT_TYPE_eDP; }
199 
200 virtual	bool						IsConnected();
201 };
202 
203 
204 class DigitalDisplayInterface : public Port {
205 public:
206 									DigitalDisplayInterface(
207 										port_index index = INTEL_PORT_A,
208 										const char* baseName = "Digital Display Interface");
209 
210 virtual	uint32						Type() const
211 										{ return INTEL_PORT_TYPE_DVI; }
212 
213 virtual	status_t					Power(bool enabled);
214 
215 virtual	status_t					SetPipe(Pipe* pipe);
216 virtual	status_t					SetupI2c(i2c_bus *bus);
217 
218 virtual	bool						IsConnected();
219 
220 virtual status_t					SetDisplayMode(display_mode* mode,
221 										uint32 colorMode);
222 
223 protected:
224 virtual	addr_t						_DDCRegister();
225 virtual addr_t						_PortRegister();
226 private:
227 		uint8						fMaxLanes;
228 
229 		status_t					_SetPortLinkGen8(const display_timing& timing,
230 										uint32 pllSel);
231 
232 		ssize_t						_DpAuxTransfer(dp_aux_msg* message);
233 		ssize_t						_DpAuxTransfer(uint8* transmitBuffer, uint8 transmitSize,
234 										uint8* receiveBuffer, uint8 receiveSize);
235 		status_t					_DpAuxSendReceive(uint32 slave_address,
236 										const uint8 *writeBuffer, size_t writeLength,
237 										uint8 *readBuffer, size_t readLength);
238 static 	status_t					_DpAuxSendReceiveHook(const struct i2c_bus *bus,
239 										uint32 slave_address, const uint8 *writeBuffer,
240 										size_t writeLength, uint8 *readBuffer,
241 										size_t readLength);
242 };
243 
244 
245 #endif // INTEL_PORTS_H
246