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