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