1/* 2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * The contents of this file constitute Original Code as defined in and 7 * are subject to the Apple Public Source License Version 1.1 (the 8 * "License"). You may not use this file except in compliance with the 9 * License. Please obtain a copy of the License at 10 * http://www.apple.com/publicsource and read it before using this file. 11 * 12 * This Original Code and all software distributed under the License are 13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER 14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the 17 * License for the specific language governing rights and limitations 18 * under the License. 19 * 20 * @APPLE_LICENSE_HEADER_END@ 21 */ 22 23 void setupCursor(void); 24 void stopCursor( void ); 25 IOReturn doSetup( bool full ); 26 void findConsole(void); 27 IOReturn createSharedCursor( int shmemVersion, 28 int maxWidth, int maxHeight ); 29 IOReturn setBoundingRect( IOGBounds * bounds ); 30 IOReturn setUserRanges( void ); 31 IOReturn getConnectFlagsForDisplayMode( 32 IODisplayModeID mode, IOIndex connection, UInt32 * flags ); 33 34 static inline void StdFBDisplayCursor( IOFramebuffer * inst ); 35 static inline void StdFBRemoveCursor( IOFramebuffer * inst ); 36 static inline void RemoveCursor( IOFramebuffer * inst ); 37 static inline void DisplayCursor( IOFramebuffer * inst ); 38 static inline void SysHideCursor( IOFramebuffer * inst ); 39 static inline void SysShowCursor( IOFramebuffer * inst ); 40 static inline void CheckShield( IOFramebuffer * inst ); 41 inline IOOptionBits _setCursorImage( UInt32 frame ); 42 inline IOReturn _setCursorState( SInt32 x, SInt32 y, bool visible ); 43 static void cursorWork( OSObject * p0, IOInterruptEventSource * evtSrc, int intCount ); 44 45 static void StdFBDisplayCursor8P( 46 IOFramebuffer * inst, 47 StdFBShmem_t *shmem, 48 volatile unsigned char *vramPtr, 49 unsigned int cursStart, 50 unsigned int vramRow, 51 unsigned int cursRow, 52 int width, 53 int height ); 54 55 static void StdFBDisplayCursor8G( 56 IOFramebuffer * inst, 57 StdFBShmem_t *shmem, 58 volatile unsigned char *vramPtr, 59 unsigned int cursStart, 60 unsigned int vramRow, 61 unsigned int cursRow, 62 int width, 63 int height ); 64 65 static void StdFBDisplayCursor555( 66 IOFramebuffer * inst, 67 StdFBShmem_t *shmem, 68 volatile unsigned short *vramPtr, 69 unsigned int cursStart, 70 unsigned int vramRow, 71 unsigned int cursRow, 72 int width, 73 int height ); 74 75 static void StdFBDisplayCursor30Axxx( 76 IOFramebuffer * inst, 77 StdFBShmem_t *shmem, 78 volatile unsigned int *vramPtr, 79 unsigned int cursStart, 80 unsigned int vramRow, 81 unsigned int cursRow, 82 int width, 83 int height ); 84 85 static void StdFBDisplayCursor32Axxx( 86 IOFramebuffer * inst, 87 StdFBShmem_t *shmem, 88 volatile unsigned int *vramPtr, 89 unsigned int cursStart, 90 unsigned int vramRow, 91 unsigned int cursRow, 92 int width, 93 int height ); 94 95 static void StdFBRemoveCursor8( 96 IOFramebuffer * inst, 97 StdFBShmem_t *shmem, 98 volatile unsigned char *vramPtr, 99 unsigned int vramRow, 100 int width, 101 int height ); 102 static void StdFBRemoveCursor16( 103 IOFramebuffer * inst, 104 StdFBShmem_t *shmem, 105 volatile unsigned short *vramPtr, 106 unsigned int vramRow, 107 int width, 108 int height ); 109 110 static void StdFBRemoveCursor32( 111 IOFramebuffer * inst, 112 StdFBShmem_t *shmem, 113 volatile unsigned int *vramPtr, 114 unsigned int vramRow, 115 int width, 116 int height ); 117 118 static void deferredMoveCursor(IOFramebuffer * inst); 119 120 static void deferredCLUTSetInterrupt( OSObject * owner, 121 IOInterruptEventSource * evtSrc, int intCount ); 122 static void deferredSpeedChangeEvent( OSObject * owner, 123 IOInterruptEventSource * evtSrc, int intCount ); 124 125 static IOReturn pmSettingsChange(OSObject *target, const OSSymbol *type, 126 OSObject *val, uintptr_t refcon); 127 128 static void systemWork(OSObject * owner, 129 IOInterruptEventSource * evtSrc, int intCount); 130 static void controllerAsyncWork(OSObject * owner, 131 IOInterruptEventSource * evtSrc, int intCount); 132 static void startControllerThread(struct IOFBController * controller); 133 static void controllerDidWork(IOFBController * controller, IOOptionBits work); 134 static void startAsync(IOFBController * controller, uint32_t asyncWork); 135 static IOFBController * aliasController(IOFBController * controller); 136 static void serverAckTimeout(OSObject * owner, IOTimerEventSource * sender); 137 138 static uint32_t controllerState(IOFBController * controller); 139 140 static IOOptionBits checkPowerWork(IOFBController * controller, IOOptionBits state); 141 static IOOptionBits checkConnectionWork(IOFBController * controller, 142 IOOptionBits state ); 143 IOOptionBits checkPowerWork(IOOptionBits state); 144 145 void checkDeferredCLUTSet( void ); 146 void updateCursorForCLUTSet( void ); 147 IOReturn updateGammaTable( UInt32 channelCount, UInt32 dataCount, 148 UInt32 dataWidth, const void * data, bool immediate = false ); 149 150 static void dpInterruptProc(OSObject * target, void * ref); 151 static void dpInterrupt(OSObject * owner, IOTimerEventSource * sender); 152 void dpProcessInterrupt(void); 153 void dpUpdateConnect(void); 154 155 156 static void delayedEvent(thread_call_param_t p0, thread_call_param_t p1); 157 static void resetClamshell(uint32_t delay); 158 159 static void deferredVBLDisable(OSObject * owner, 160 IOInterruptEventSource * evtSrc, int intCount); 161 static void updateVBL(OSObject * owner, IOTimerEventSource * sender); 162 static void deferredCLUTSetTimer(OSObject * owner, IOTimerEventSource * sender); 163 static void handleVBL(IOFramebuffer * inst, void * ref); 164 165 static void writePrefs( OSObject * owner, IOTimerEventSource * sender ); 166 static void connectChangeInterrupt( IOFramebuffer * inst, void * ref ); 167 void setNextDependent( IOFramebuffer * dependent ); 168 IOFramebuffer * getNextDependent( void ); 169 void setCaptured( bool isCaptured ); 170 void setDimDisable( bool dimDisable ); 171 bool getDimDisable( void ); 172 IOReturn notifyServer( UInt8 state ); 173 IOReturn _extEntry(bool system, bool allowOffline, const char * where); 174 void _extExit(bool system, IOReturn result, const char * where); 175 bool getIsUsable(void); 176 void initFB(void); 177 IOReturn postOpen(void); 178 IOReturn postWake(void); 179 static void checkConnectionChange(IOFBController * controller ); 180 static void messageConnectionChange(IOFBController * controller ); 181 static IOReturn processConnectChange(IOFBController * controller, IOOptionBits mode); 182 IOReturn matchFramebuffer(void); 183 static IOReturn matchController(IOFBController * controller); 184 185 IOReturn extProcessConnectionChange(void); 186 IOReturn extEndConnectionChange(void); 187 IOReturn processConnectChange(IOOptionBits mode); 188 bool suspend(bool now); 189 bool updateOnline(void); 190 void displaysOnline(bool nowOnline); 191 192#if IOFB_DISABLEFB 193 static IODeviceMemory * _getApertureRange(IOFramebuffer * fb, IOPixelAperture aperture); 194#endif 195 196 static void startThread(bool highPri); 197 static void sleepWork( void * arg ); 198 static void clamshellWork( thread_call_param_t p0, thread_call_param_t p1 ); 199 void saveFramebuffer(void); 200 IOReturn restoreFramebuffer(IOIndex event); 201 202 IOReturn deliverDisplayModeDidChangeNotification( void ); 203 204 static IOReturn systemPowerChange( void * target, void * refCon, 205 UInt32 messageType, IOService * service, 206 void * messageArgument, vm_size_t argSize ); 207 static IOReturn agcMessage( void * target, void * refCon, 208 UInt32 messageType, IOService * service, 209 void * messageArgument, vm_size_t argSize ); 210 static IOReturn muxPowerMessage(UInt32 messageType); 211 212 static bool clamshellHandler( void * target, void * ref, 213 IOService * resourceService, IONotifier * notifier ); 214 static void readClamshellState(void); 215 216 static IOReturn probeAll( IOOptionBits options ); 217 218 IOReturn selectTransform( UInt64 newTransform, bool generateChange ); 219 void setTransform( UInt64 newTransform, bool generateChange ); 220 UInt64 getTransform( void ); 221 IOReturn checkMirrorSafe( UInt32 value, IOFramebuffer * other ); 222 void transformLocation(StdFBShmem_t * shmem, IOGPoint * cursorLoc, IOGPoint * transformLoc); 223 void transformCursor(StdFBShmem_t * shmem, IOIndex frame); 224 225 bool deepFramebuffer( IOPixelInformation * pixelInfo ); 226 bool validFramebuffer( IOPixelInformation * pixelInfo ); 227 IOIndex closestDepth(IODisplayModeID mode, IOPixelInformation * pixelInfo); 228 IOReturn setDisplayAttributes(OSObject * data); 229 IOReturn doSetDisplayMode(IODisplayModeID displayMode, IOIndex depth); 230 OSData * getConfigMode(IODisplayModeID mode, const OSSymbol * sym); 231 232 static void saveGammaTables(void); 233 234 // -- 235 236 static IOReturn extCreateSharedCursor(OSObject * target, void * reference, IOExternalMethodArguments * args); 237 static IOReturn extGetPixelInformation(OSObject * target, void * reference, IOExternalMethodArguments * args); 238 static IOReturn extGetCurrentDisplayMode(OSObject * target, void * reference, IOExternalMethodArguments * args); 239 static IOReturn extSetStartupDisplayMode(OSObject * target, void * reference, IOExternalMethodArguments * args); 240 static IOReturn extSetGammaTable(OSObject * target, void * reference, IOExternalMethodArguments * args); 241 static IOReturn extGetDisplayModeCount(OSObject * target, void * reference, IOExternalMethodArguments * args); 242 static IOReturn extGetDisplayModes(OSObject * target, void * reference, IOExternalMethodArguments * args); 243 static IOReturn extSetDisplayMode(OSObject * target, void * reference, IOExternalMethodArguments * args); 244 static IOReturn extGetInformationForDisplayMode(OSObject * target, void * reference, IOExternalMethodArguments * args); 245 246 static IOReturn extGetVRAMMapOffset(OSObject * target, void * reference, IOExternalMethodArguments * args); 247 static IOReturn extSetBounds(OSObject * target, void * reference, IOExternalMethodArguments * args); 248 249 static IOReturn extSetNewCursor(OSObject * target, void * reference, IOExternalMethodArguments * args); 250 static IOReturn extSetCursorVisible(OSObject * target, void * reference, IOExternalMethodArguments * args); 251 static IOReturn extSetCursorPosition(OSObject * target, void * reference, IOExternalMethodArguments * args); 252 static IOReturn extSetColorConvertTable(OSObject * target, void * reference, IOExternalMethodArguments * args); 253 static IOReturn extSetCLUTWithEntries(OSObject * target, void * reference, IOExternalMethodArguments * args); 254 static IOReturn extSetAttribute(OSObject * target, void * reference, IOExternalMethodArguments * args); 255 static IOReturn extGetAttribute(OSObject * target, void * reference, IOExternalMethodArguments * args); 256 IOReturn extSetMirrorOne(uint32_t value, IOFramebuffer * other); 257 static IOReturn extValidateDetailedTiming(OSObject * target, void * reference, IOExternalMethodArguments * args); 258 void serverAcknowledgeNotification(void); 259 static IOReturn extAcknowledgeNotification(OSObject * target, void * reference, IOExternalMethodArguments * args); 260 261 // -- 262 263 IOReturn extSetProperties( OSDictionary * dict ); 264 IOReturn extRegisterNotificationPort( 265 mach_port_t port, 266 UInt32 type, 267 UInt32 refCon ); 268 269public: 270 void fbLock( void ); 271 void fbUnlock( void ); 272 273 void displayOnline( IODisplay * display, SInt32 delta, uint32_t options ); 274 static void updateDisplaysPowerState(void); 275 static IOOptionBits clamshellState( void ); 276 static IOReturn setPreferences( IOService * props, OSDictionary * prefs ); 277 static OSObject * copyPreferences( void ); 278 OSObject * copyPreference( class IODisplay * display, const OSSymbol * key ); 279 bool getIntegerPreference( IODisplay * display, const OSSymbol * key, UInt32 * value ); 280 bool setPreference( class IODisplay * display, const OSSymbol * key, OSObject * value ); 281 bool setIntegerPreference( IODisplay * display, const OSSymbol * key, UInt32 value ); 282 void getTransformPrefs( IODisplay * display ); 283 284 bool getTimeOfVBL(AbsoluteTime * deadline, uint32_t frames); 285 bool isWakingFromHibernateGfxOn(void); 286 287 IOReturn getAttributeForConnectionParam(IOIndex connectIndex, 288 IOSelect attribute, uintptr_t * value); 289 IOReturn setAttributeForConnectionParam(IOIndex connectIndex, 290 IOSelect attribute, uintptr_t value); 291 292protected: 293 294 IOReturn stopDDC1SendCommand(IOIndex bus, IOI2CBusTiming * timing); 295 void waitForDDCDataLine(IOIndex bus, IOI2CBusTiming * timing, UInt32 waitTime); 296 297 IOReturn readDDCBlock(IOIndex bus, IOI2CBusTiming * timing, UInt8 deviceAddress, UInt8 startAddress, UInt8 * data); 298 IOReturn i2cReadDDCciData(IOIndex bus, IOI2CBusTiming * timing, UInt8 deviceAddress, UInt8 count, UInt8 *buffer); 299 IOReturn i2cReadData(IOIndex bus, IOI2CBusTiming * timing, UInt8 deviceAddress, UInt8 count, UInt8 * buffer); 300 IOReturn i2cWriteData(IOIndex bus, IOI2CBusTiming * timing, UInt8 deviceAddress, UInt8 count, UInt8 * buffer); 301 302 void i2cStart(IOIndex bus, IOI2CBusTiming * timing); 303 void i2cStop(IOIndex bus, IOI2CBusTiming * timing); 304 void i2cSendAck(IOIndex bus, IOI2CBusTiming * timing); 305 void i2cSendNack(IOIndex bus, IOI2CBusTiming * timing); 306 IOReturn i2cWaitForAck(IOIndex bus, IOI2CBusTiming * timing); 307 void i2cSendByte(IOIndex bus, IOI2CBusTiming * timing, UInt8 data); 308 IOReturn i2cReadByte(IOIndex bus, IOI2CBusTiming * timing, UInt8 *data); 309 IOReturn i2cWaitForBus(IOIndex bus, IOI2CBusTiming * timing); 310 IOReturn i2cRead(IOIndex bus, IOI2CBusTiming * timing, UInt8 deviceAddress, UInt8 numberOfBytes, UInt8 * data); 311 IOReturn i2cWrite(IOIndex bus, IOI2CBusTiming * timing, UInt8 deviceAddress, UInt8 numberOfBytes, UInt8 * data); 312 void i2cSend9Stops(IOIndex bus, IOI2CBusTiming * timing); 313 314 // retired: serverPendingAck, configPending, connectChange 315