xref: /haiku/src/add-ons/accelerants/intel_extreme/Ports.h (revision fce7f3a748cd57bb62fcdd32c84bf013d88ea351)
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 <edid.h>
14 
15 #include "intel_extreme.h"
16 
17 #include "Pipes.h"
18 #include "pll.h"
19 
20 
21 #define MAX_PORTS	20	// a generous upper bound
22 
23 struct pll_limits;
24 
25 enum port_type {
26 	INTEL_PORT_TYPE_ANY,		// wildcard for lookup functions
27 	INTEL_PORT_TYPE_ANALOG,
28 	INTEL_PORT_TYPE_DVI,
29 	INTEL_PORT_TYPE_LVDS,
30 	INTEL_PORT_TYPE_DP,
31 	INTEL_PORT_TYPE_eDP,
32 	INTEL_PORT_TYPE_HDMI
33 };
34 
35 
36 class Port {
37 public:
38 									Port(port_index index,
39 										const char* baseName);
40 virtual								~Port();
41 
42 virtual	uint32						Type() const = 0;
43 		const char*					PortName() const
44 										{ return fPortName; }
45 
46 		port_index					PortIndex() const
47 										{ return fPortIndex; }
48 
49 virtual	bool						IsConnected() = 0;
50 
51 		status_t					SetPipe(Pipe* pipe);
52 		::Pipe*						GetPipe()
53 										{ return fPipe; };
54 
55 virtual	status_t					Power(bool enabled);
56 
57 		bool						HasEDID();
58 virtual	status_t					GetEDID(edid1_info* edid,
59 										bool forceRead = false);
60 
61 virtual	status_t					GetPLLLimits(pll_limits& limits);
62 
63 virtual status_t					SetDisplayMode(display_mode* mode,
64 										uint32 colorMode) { return B_ERROR; };
65 
66 virtual pipe_index					PipePreference();
67 //										{ return INTEL_PIPE_ANY; };
68 
69 protected:
70 		void						_SetName(const char* name);
71 
72 static	status_t					_GetI2CSignals(void* cookie, int* _clock,
73 										int* _data);
74 static	status_t					_SetI2CSignals(void* cookie, int clock,
75 										int data);
76 
77 		display_mode				fCurrentMode;
78 		Pipe*						fPipe;
79 
80 		status_t					fEDIDState;
81 		edid1_info					fEDIDInfo;
82 
83 private:
84 virtual	addr_t						_DDCRegister() = 0;
85 virtual addr_t						_PortRegister() = 0;
86 
87 		port_index					fPortIndex;
88 		char*						fPortName;
89 };
90 
91 
92 class AnalogPort : public Port {
93 public:
94 									AnalogPort();
95 
96 virtual	uint32						Type() const
97 										{ return INTEL_PORT_TYPE_ANALOG; }
98 
99 virtual	bool						IsConnected();
100 
101 virtual status_t					SetDisplayMode(display_mode* mode,
102 										uint32 colorMode);
103 
104 protected:
105 virtual	addr_t						_DDCRegister();
106 virtual addr_t						_PortRegister();
107 };
108 
109 
110 class LVDSPort : public Port {
111 public:
112 									LVDSPort();
113 
114 virtual	uint32						Type() const
115 										{ return INTEL_PORT_TYPE_LVDS; }
116 
117 virtual	bool						IsConnected();
118 
119 virtual status_t					SetDisplayMode(display_mode* mode,
120 										uint32 colorMode);
121 
122 virtual pipe_index					PipePreference();
123 
124 protected:
125 virtual	addr_t						_DDCRegister();
126 virtual addr_t						_PortRegister();
127 };
128 
129 
130 class DigitalPort : public Port {
131 public:
132 									DigitalPort(
133 										port_index index = INTEL_PORT_B,
134 										const char* baseName = "DVI");
135 
136 virtual	uint32						Type() const
137 										{ return INTEL_PORT_TYPE_DVI; }
138 
139 virtual	bool						IsConnected();
140 
141 virtual status_t					SetDisplayMode(display_mode* mode,
142 										uint32 colorMode);
143 
144 protected:
145 virtual	addr_t						_DDCRegister();
146 virtual addr_t						_PortRegister();
147 };
148 
149 
150 class HDMIPort : public DigitalPort {
151 public:
152 									HDMIPort(port_index index);
153 
154 virtual	uint32						Type() const
155 										{ return INTEL_PORT_TYPE_HDMI; }
156 
157 virtual	bool						IsConnected();
158 
159 protected:
160 virtual addr_t						_PortRegister();
161 };
162 
163 
164 class DisplayPort : public Port {
165 public:
166 									DisplayPort(port_index index,
167 										const char* baseName = "DisplayPort");
168 
169 virtual	uint32						Type() const
170 										{ return INTEL_PORT_TYPE_DP; }
171 
172 virtual	bool						IsConnected();
173 
174 virtual status_t					SetDisplayMode(display_mode* mode,
175 										uint32 colorMode);
176 
177 virtual pipe_index					PipePreference();
178 
179 protected:
180 virtual	addr_t						_DDCRegister();
181 virtual	addr_t						_PortRegister();
182 
183 private:
184 		status_t					_SetPortLinkGen4(const display_timing& timing);
185 		status_t					_SetPortLinkGen6(const display_timing& timing);
186 };
187 
188 
189 class EmbeddedDisplayPort : public DisplayPort {
190 public:
191 									EmbeddedDisplayPort();
192 
193 virtual	uint32						Type() const
194 										{ return INTEL_PORT_TYPE_eDP; }
195 
196 virtual	bool						IsConnected();
197 };
198 
199 
200 class DigitalDisplayInterface : public Port {
201 public:
202 									DigitalDisplayInterface(
203 										port_index index = INTEL_PORT_A,
204 										const char* baseName = "Digital Display Interface");
205 
206 virtual	uint32						Type() const
207 										{ return INTEL_PORT_TYPE_DVI; }
208 
209 virtual	status_t					Power(bool enabled);
210 
211 virtual	bool						IsConnected();
212 
213 virtual status_t					SetDisplayMode(display_mode* mode,
214 										uint32 colorMode);
215 
216 protected:
217 virtual	addr_t						_DDCRegister();
218 virtual addr_t						_PortRegister();
219 private:
220 		uint8						fMaxLanes;
221 
222 		status_t					_SetPortLinkGen8(const display_timing& timing,
223 										uint32 pllSel);
224 };
225 
226 
227 #endif // INTEL_PORTS_H
228