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 24struct pll_limits; 25struct i2c_bus; 26 27enum 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 38class Port { 39public: 40 Port(port_index index, 41 const char* baseName); 42virtual ~Port(); 43 44virtual uint32 Type() const = 0; 45 const char* PortName() const 46 { return fPortName; } 47 48 port_index PortIndex() const 49 { return fPortIndex; } 50 51virtual bool IsConnected() = 0; 52 53virtual status_t SetPipe(Pipe* pipe); 54 ::Pipe* GetPipe() 55 { return fPipe; }; 56 57virtual status_t Power(bool enabled); 58 59 bool HasEDID(); 60virtual status_t GetEDID(edid1_info* edid, 61 bool forceRead = false); 62virtual status_t SetupI2c(struct i2c_bus *bus); 63virtual status_t SetupI2cFallback(struct i2c_bus *bus); 64 65virtual status_t GetPLLLimits(pll_limits& limits); 66 67virtual status_t SetDisplayMode(display_mode* mode, 68 uint32 colorMode) { return B_ERROR; }; 69 70virtual pipe_index PipePreference(); 71 72protected: 73 void _SetName(const char* name); 74 75static status_t _GetI2CSignals(void* cookie, int* _clock, 76 int* _data); 77static 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); 92static 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 104private: 105virtual addr_t _DDCRegister() = 0; 106virtual addr_t _PortRegister() = 0; 107 108 port_index fPortIndex; 109 char* fPortName; 110}; 111 112 113class AnalogPort : public Port { 114public: 115 AnalogPort(); 116 117virtual uint32 Type() const 118 { return INTEL_PORT_TYPE_ANALOG; } 119 120virtual bool IsConnected(); 121 122virtual status_t SetDisplayMode(display_mode* mode, 123 uint32 colorMode); 124 125protected: 126virtual addr_t _DDCRegister(); 127virtual addr_t _PortRegister(); 128}; 129 130 131class LVDSPort : public Port { 132public: 133 LVDSPort(); 134 135virtual uint32 Type() const 136 { return INTEL_PORT_TYPE_LVDS; } 137 138virtual bool IsConnected(); 139 140virtual status_t SetDisplayMode(display_mode* mode, 141 uint32 colorMode); 142 143virtual pipe_index PipePreference(); 144 145protected: 146virtual addr_t _DDCRegister(); 147virtual addr_t _PortRegister(); 148}; 149 150 151class DigitalPort : public Port { 152public: 153 DigitalPort( 154 port_index index = INTEL_PORT_B, 155 const char* baseName = "DVI"); 156 157virtual uint32 Type() const 158 { return INTEL_PORT_TYPE_DVI; } 159 160virtual bool IsConnected(); 161 162virtual status_t SetDisplayMode(display_mode* mode, 163 uint32 colorMode); 164 165protected: 166virtual addr_t _DDCRegister(); 167virtual addr_t _PortRegister(); 168}; 169 170 171class HDMIPort : public DigitalPort { 172public: 173 HDMIPort(port_index index); 174 175virtual uint32 Type() const 176 { return INTEL_PORT_TYPE_HDMI; } 177 178virtual bool IsConnected(); 179 180protected: 181virtual addr_t _PortRegister(); 182}; 183 184 185class DisplayPort : public Port { 186public: 187 DisplayPort(port_index index, 188 const char* baseName = "DisplayPort"); 189 190virtual uint32 Type() const 191 { return INTEL_PORT_TYPE_DP; } 192 193virtual status_t SetPipe(Pipe* pipe); 194virtual status_t SetupI2c(i2c_bus *bus); 195 196virtual bool IsConnected(); 197 198virtual status_t SetDisplayMode(display_mode* mode, 199 uint32 colorMode); 200 201virtual pipe_index PipePreference(); 202 203protected: 204virtual addr_t _DDCRegister(); 205virtual addr_t _PortRegister(); 206 207private: 208 status_t _SetPortLinkGen4(const display_timing& timing); 209 status_t _SetPortLinkGen6(const display_timing& timing); 210}; 211 212 213class EmbeddedDisplayPort : public DisplayPort { 214public: 215 EmbeddedDisplayPort(); 216 217virtual uint32 Type() const 218 { return INTEL_PORT_TYPE_eDP; } 219 220virtual bool IsConnected(); 221}; 222 223 224class DigitalDisplayInterface : public Port { 225public: 226 DigitalDisplayInterface( 227 port_index index = INTEL_PORT_A, 228 const char* baseName = "Digital Display Interface"); 229 230virtual uint32 Type() const 231 { return INTEL_PORT_TYPE_DVI; } 232 233virtual status_t Power(bool enabled); 234 235virtual status_t SetPipe(Pipe* pipe); 236virtual status_t SetupI2c(i2c_bus *bus); 237virtual status_t SetupI2cFallback(struct i2c_bus *bus); 238 239virtual bool IsConnected(); 240 241virtual status_t SetDisplayMode(display_mode* mode, 242 uint32 colorMode); 243 244protected: 245virtual addr_t _DDCRegister(); 246virtual addr_t _PortRegister(); 247private: 248 uint8 fMaxLanes; 249 250 status_t _SetPortLinkGen8(const display_timing& timing, 251 uint32 pllSel); 252}; 253 254 255#endif // INTEL_PORTS_H 256