xref: /xnu-10063.121.3/iokit/IOKit/IOPlatformExpert.h (revision 2c2f96dc2b9a4408a43d3150ae9c105355ca3daa) !
1 /*
2  * Copyright (c) 1998-2019 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  * Copyright (c) 1998 Apple Computer, Inc.  All rights reserved.
30  *
31  * HISTORY
32  *
33  */
34 
35 
36 #ifndef _IOKIT_IOPLATFORMEXPERT_H
37 #define _IOKIT_IOPLATFORMEXPERT_H
38 
39 #ifdef __cplusplus
40 #include <IOKit/IOLib.h>
41 #include <IOKit/IOService.h>
42 #include <IOKit/IOInterrupts.h>
43 #include <IOKit/IOInterruptController.h>
44 #include <libkern/c++/OSPtr.h>
45 
46 extern "C" {
47 #else
48 #include <kern/clock.h>
49 #endif
50 
51 #include <libkern/OSTypes.h>
52 
53 typedef enum {
54 	kCoprocessorVersionNone    =   0x00000000,
55 	kCoprocessorVersion1       =   0x00010000,
56 	kCoprocessorVersion2       =   0x00020000,
57 } coprocessor_type_t;
58 
59 
60 /*
61  * PEGetMachineName() and PEGetModelName() are inconsistent across
62  * architectures, and considered deprecated.
63  * PEGetTargetName() and PEGetProductName() instead.
64  */
65 extern boolean_t PEGetMachineName( char * name, int maxLength );
66 extern boolean_t PEGetModelName( char * name, int maxLength );
67 
68 extern boolean_t PEGetTargetName( char * name, int maxLength );
69 extern boolean_t PEGetProductName( char * name, int maxLength );
70 extern int PEGetPlatformEpoch( void );
71 
72 enum {
73 	kPEHaltCPU,
74 	kPERestartCPU,
75 	kPEHangCPU,
76 	kPEUPSDelayHaltCPU,
77 	kPEPanicRestartCPU,
78 	kPEPanicSync,
79 	kPEPagingOff,
80 	kPEPanicBegin,
81 	kPEPanicEnd,
82 	kPEPanicRestartCPUNoCallouts,
83 	kPEPanicDiagnosticsDone,
84 	kPEPanicDiagnosticsInProgress,
85 };
86 
87 /* Bitmask of details related to panic callouts */
88 #define kPanicDetailsForcePowerOff 0x1
89 
90 extern int (*PE_halt_restart)(unsigned int type);
91 extern int PEHaltRestart(unsigned int type);
92 
93 #ifdef XNU_KERNEL_PRIVATE
94 
95 extern int PEHaltRestartInternal(unsigned int type, uint32_t details);
96 
97 enum {
98 	kIOSystemShutdownNotificationStageProcessExit = 0,
99 	kIOSystemShutdownNotificationStageRootUnmount = 1,
100 	kIOSystemShutdownNotificationTerminateDEXTs   = 2,
101 };
102 extern void IOSystemShutdownNotification(int howto, int stage);
103 
104 extern uint32_t gEnforcePlatformActionSafety;
105 #endif /* XNU_KERNEL_PRIVATE */
106 
107 #ifdef KERNEL_PRIVATE
108 extern boolean_t IOPMRootDomainGetWillShutdown(void);
109 extern void PEInitiatePanic(void);
110 #endif /* KERNEL_PRIVATE */
111 
112 // Save the Panic Info.  Returns the number of bytes saved.
113 extern UInt32 PESavePanicInfo(UInt8 *buffer, UInt32 length);
114 extern void PESavePanicInfoAction(void *buffer, UInt32 offset, UInt32 length);
115 
116 /*
117  * SMC requires that all data is flushed in multiples of 16 bytes at 16 byte
118  * boundaries.
119  */
120 #define PANIC_FLUSH_BOUNDARY 16
121 
122 extern long PEGetGMTTimeOfDay( void );
123 extern void PESetGMTTimeOfDay( long secs );
124 extern void PEGetUTCTimeOfDay( clock_sec_t * secs, clock_usec_t * usecs );
125 extern void PESetUTCTimeOfDay( clock_sec_t secs, clock_usec_t usecs );
126 
127 /* unless it's a "well-known" property, these will read/write out the value as raw data */
128 
129 extern boolean_t PEWriteNVRAMBooleanProperty(const char *symbol, boolean_t value);
130 extern boolean_t PEWriteNVRAMProperty(const char *symbol, const void *value, const unsigned int len);
131 extern boolean_t PEWriteNVRAMPropertyWithCopy(const char *symbol, const void *value, const unsigned int len);
132 extern boolean_t PEReadNVRAMProperty(const char *symbol, void *value, unsigned int *len);
133 extern boolean_t PEReadNVRAMBooleanProperty(const char *symbol, boolean_t *value);
134 extern boolean_t PERemoveNVRAMProperty(const char *symbol);
135 extern boolean_t PESyncNVRAM(void);
136 
137 extern coprocessor_type_t PEGetCoprocessorVersion( void );
138 
139 #ifdef __cplusplus
140 } /* extern "C" */
141 
142 #define kIOPlatformMapperPresentKey "IOPlatformMapperPresent"
143 
144 
145 
146 
147 extern OSSymbol *               gPlatformInterruptControllerName;
148 
149 /*
150  * IOPlatformSleepAction
151  *
152  * Sleep is called after power management has finished all of the power plane
153  * driver power management notifications and state transitions and has
154  * committed to sleep, but before the other CPUs are powered off.
155  * The scheduler is still active.
156  */
157 extern const OSSymbol *gIOPlatformSleepActionKey;
158 
159 /*
160  * IOPlatformWakeAction
161  *
162  * Wake is called with the scheduler enabled, but before
163  * powering on other CPUs, so try to minimize work done in this path to speed
164  * up wake time.
165  */
166 extern const OSSymbol *gIOPlatformWakeActionKey;
167 
168 /*
169  * IOPlatformQuiesceAction
170  *
171  * Quiesce is called after all CPUs are off, scheduling is disabled,
172  * and the boot CPU is about to pull the plug.
173  * Mutexes and blocking are disallowed in this context and will panic.
174  * Do not pass this action to super() (incl. IOService, IOPlatformExpert)
175  */
176 extern const OSSymbol *gIOPlatformQuiesceActionKey;
177 
178 /*
179  * IOPlatformActiveAction
180  *
181  * Active is called very early in the wake path before enabling the scheduler
182  * on the boot CPU.
183  * Mutexes and blocking are disallowed in this context and will panic.
184  * Do not pass this action to super() (incl. IOService, IOPlatformExpert)
185  */
186 extern const OSSymbol *gIOPlatformActiveActionKey;
187 
188 /*
189  * IOPlatformHaltRestartAction
190  *
191  * Halt/Restart is called after the kernel finishes shutting down the
192  * system and is ready to power off or reboot.
193  *
194  * It is not guaranteed to be called in non-graceful shutdown scenarios.
195  */
196 extern const OSSymbol *gIOPlatformHaltRestartActionKey;
197 
198 /*
199  * IOPlatformPanicAction
200  *
201  * Panic is called when the system is panicking before it records a core file
202  * (if it is configured to do so)
203  *
204  * It can be called at any time, in any context, in any state.  Don't depend
205  * on anything being powered on in a useful state.
206  *
207  * Mutexes and blocking are disallowed in this context and will fail.
208  *
209  * If you hang or panic again in this callout, the panic log may not be recorded,
210  * leading to the loss of field reports about customer issues.
211  */
212 extern const OSSymbol *gIOPlatformPanicActionKey;
213 
214 class IORangeAllocator;
215 class IONVRAMController;
216 class IOPMrootDomain;
217 
218 class IOPlatformExpert : public IOService
219 {
220 	OSDeclareDefaultStructors(IOPlatformExpert);
221 
222 private:
223 	long _peBootROMType;
224 	long _peChipSetType;
225 	long _peMachineType;
226 
227 protected:
228 	IOPMrootDomain * root;
229 	int _pePMFeatures;
230 	int _pePrivPMFeatures;
231 	int _peNumBatteriesSupported;
232 	OSArray  * thePowerTree;
233 
234 	bool       searchingForAdditionalParents;
235 	OSNumber * multipleParentKeyValue;
236 	int        numInstancesRegistered;
237 
238 	struct ExpansionData { };
239 	ExpansionData *iope_reserved __unused;
240 
241 	virtual void setBootROMType(long peBootROMType);
242 	virtual void setChipSetType(long peChipSetType);
243 	virtual void setMachineType(long peMachineType);
244 
245 	virtual bool CheckSubTree(OSArray * inSubTree, IOService * theNub, IOService * theDevice, OSDictionary * theParent);
246 	virtual bool RegisterServiceInTree(IOService * theService, OSDictionary * theTreeNode, OSDictionary * theTreeParentNode, IOService * theProvider);
247 
248 	virtual void PMInstantiatePowerDomains( void );
249 
250 public:
251 	virtual bool attach( IOService * provider ) APPLE_KEXT_OVERRIDE;
252 	virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE;
253 	virtual bool configure( IOService * provider );
254 	virtual IOService * createNub( OSDictionary * from );
255 
256 	virtual bool compareNubName( const IOService * nub, OSString * name,
257 	    OSString ** matched = NULL ) const;
258 	bool compareNubName( const IOService * nub, OSString * name,
259 	    OSSharedPtr<OSString>& matched ) const;
260 	virtual IOReturn getNubResources( IOService * nub );
261 
262 	virtual long getBootROMType(void);
263 	virtual long getChipSetType(void);
264 	virtual long getMachineType(void);
265 
266 	/*
267 	 * getModelName() and getMachineName() are deprecated for direct
268 	 * use. Use getTargetName() and getProductName() instead.
269 	 */
270 	virtual bool getModelName( char * name, int maxLength );
271 	virtual bool getMachineName( char * name, int maxLength );
272 
273 	virtual int haltRestart(unsigned int type);
274 	virtual void sleepKernel(void);
275 
276 	virtual long getGMTTimeOfDay( void );
277 	virtual void setGMTTimeOfDay( long secs );
278 
279 	virtual IOReturn getConsoleInfo( PE_Video * consoleInfo );
280 	virtual IOReturn setConsoleInfo( PE_Video * consoleInfo, unsigned int op );
281 
282 	virtual void registerNVRAMController( IONVRAMController * nvram );
283 
284 	virtual IOReturn registerInterruptController(OSSymbol *name, IOInterruptController *interruptController);
285 	virtual LIBKERN_RETURNS_NOT_RETAINED IOInterruptController *
286 	lookUpInterruptController(OSSymbol *name);
287 
288 	virtual void setCPUInterruptProperties(IOService *service);
289 	virtual bool atInterruptLevel(void);
290 
291 	virtual IOReturn callPlatformFunction(const OSSymbol *functionName,
292 	    bool waitForFunction,
293 	    void *param1, void *param2,
294 	    void *param3, void *param4) APPLE_KEXT_OVERRIDE;
295 
296 	virtual IORangeAllocator * getPhysicalRangeAllocator(void);
297 
298 	virtual bool platformAdjustService(IOService *service);
299 
300 	virtual void PMRegisterDevice(IOService * theNub, IOService * theDevice);
301 	virtual void PMLog( const char *, unsigned long, unsigned long, unsigned long );
302 
303 	virtual bool hasPMFeature(unsigned long featureMask);
304 	virtual bool hasPrivPMFeature(unsigned long privFeatureMask);
305 	virtual int  numBatteriesSupported(void);
306 
307 	virtual IOByteCount savePanicInfo(UInt8 *buffer, IOByteCount length);
308 
309 	virtual OSString* createSystemSerialNumberString(OSData* myProperty);
310 
311 	virtual IOReturn deregisterInterruptController(OSSymbol *name);
312 
313 	virtual void getUTCTimeOfDay( clock_sec_t * secs, clock_nsec_t * nsecs );
314 	virtual void setUTCTimeOfDay( clock_sec_t secs, clock_nsec_t nsecs );
315 	void publishPlatformUUIDAndSerial( void );
316 	void publishNVRAM( void );
317 
318 	virtual bool getTargetName( char * name, int maxLength );
319 	virtual bool getProductName( char * name, int maxLength );
320 
321 	OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 0);
322 	OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 1);
323 	OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 2);
324 	OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 3);
325 	OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 4);
326 	OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 5);
327 	OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 6);
328 
329 	OSMetaClassDeclareReservedUnused(IOPlatformExpert, 7);
330 	OSMetaClassDeclareReservedUnused(IOPlatformExpert, 8);
331 	OSMetaClassDeclareReservedUnused(IOPlatformExpert, 9);
332 	OSMetaClassDeclareReservedUnused(IOPlatformExpert, 10);
333 	OSMetaClassDeclareReservedUnused(IOPlatformExpert, 11);
334 };
335 
336 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
337 
338 class IODTNVRAM;
339 
340 class IODTPlatformExpert : public IOPlatformExpert
341 {
342 	OSDeclareAbstractStructors(IODTPlatformExpert);
343 
344 private:
345 	IODTNVRAM *dtNVRAM;
346 
347 	struct ExpansionData { };
348 	ExpansionData *iodtpe_reserved;
349 
350 public:
351 	virtual IOService * probe(  IOService *     provider,
352 	    SInt32    *     score ) APPLE_KEXT_OVERRIDE;
353 	virtual bool configure( IOService * provider ) APPLE_KEXT_OVERRIDE;
354 
355 	virtual void processTopLevel( IORegistryEntry * root );
356 	virtual const char * deleteList( void ) = 0;
357 	virtual const char * excludeList( void ) = 0;
358 	virtual IOService * createNub( IORegistryEntry * from );
359 	virtual bool createNubs( IOService * parent, LIBKERN_CONSUMED OSIterator * iter );
360 
361 	virtual bool compareNubName( const IOService * nub, OSString * name,
362 	    OSString ** matched = NULL ) const APPLE_KEXT_OVERRIDE;
363 
364 	virtual IOReturn getNubResources( IOService * nub ) APPLE_KEXT_OVERRIDE;
365 
366 	/*
367 	 * getModelName() and getMachineName() are deprecated. Use
368 	 * getTargetName() and getProductName() instead.
369 	 */
370 	virtual bool getModelName( char * name, int maxLength ) APPLE_KEXT_OVERRIDE;
371 	virtual bool getMachineName( char * name, int maxLength ) APPLE_KEXT_OVERRIDE;
372 
373 	virtual bool getTargetName( char * name, int maxLength ) APPLE_KEXT_OVERRIDE;
374 	virtual bool getProductName( char * name, int maxLength ) APPLE_KEXT_OVERRIDE;
375 
376 	virtual void registerNVRAMController( IONVRAMController * nvram ) APPLE_KEXT_OVERRIDE;
377 
378 	virtual int haltRestart(unsigned int type) APPLE_KEXT_OVERRIDE;
379 
380 /* virtual */ IOReturn readXPRAM(IOByteCount offset, UInt8 * buffer,
381 	    IOByteCount length);
382 
383 /* virtual */ IOReturn writeXPRAM(IOByteCount offset, UInt8 * buffer,
384 	    IOByteCount length);
385 
386 	virtual IOReturn readNVRAMProperty(
387 		IORegistryEntry * entry,
388 		const OSSymbol ** name, OSData ** value );
389 
390 	IOReturn readNVRAMProperty(
391 		IORegistryEntry * entry,
392 		OSSharedPtr<const OSSymbol>& name, OSSharedPtr<OSData>& value );
393 
394 	virtual IOReturn writeNVRAMProperty(
395 		IORegistryEntry * entry,
396 		const OSSymbol * name, OSData * value );
397 
398 // This returns a dictionary describing all the NVRAM partitions.
399 // The keys will be the partitionIDs of the form "0x52,nvram".
400 // The values will be OSNumbers of the partition's byte count.
401 /* virtual */ OSDictionary *getNVRAMPartitions(void);
402 
403 /* virtual */ IOReturn readNVRAMPartition(const OSSymbol * partitionID,
404 	    IOByteCount offset, UInt8 * buffer,
405 	    IOByteCount length);
406 
407 /* virtual */ IOReturn writeNVRAMPartition(const OSSymbol * partitionID,
408 	    IOByteCount offset, UInt8 * buffer,
409 	    IOByteCount length);
410 
411 	virtual IOByteCount savePanicInfo(UInt8 *buffer, IOByteCount length) APPLE_KEXT_OVERRIDE;
412 	virtual OSString* createSystemSerialNumberString(OSData* myProperty) APPLE_KEXT_OVERRIDE;
413 
414 	OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 0);
415 	OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 1);
416 	OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 2);
417 	OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 3);
418 	OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 4);
419 	OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 5);
420 	OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 6);
421 	OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 7);
422 };
423 
424 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
425 
426 /* generic root nub of service tree */
427 
428 class IOPlatformExpertDevice : public IOService
429 {
430 	OSDeclareDefaultStructors(IOPlatformExpertDevice);
431 
432 private:
433 	IOWorkLoop *workLoop;
434 
435 	struct ExpansionData { };
436 	ExpansionData *ioped_reserved __unused;
437 
438 public:
439 	virtual bool init(void *dtRoot);
440 	virtual bool compareName( OSString * name, OSString ** matched = NULL ) const APPLE_KEXT_OVERRIDE;
441 
442 	virtual IOWorkLoop *getWorkLoop() const APPLE_KEXT_OVERRIDE;
443 	virtual IOReturn setProperties( OSObject * properties ) APPLE_KEXT_OVERRIDE;
444 
445 	virtual void free() APPLE_KEXT_OVERRIDE;
446 
447 	virtual IOReturn newUserClient( task_t owningTask, void * securityID,
448 	    UInt32 type, OSDictionary * properties,
449 	    IOUserClient ** handler) APPLE_KEXT_OVERRIDE;
450 
451 	bool startIOServiceMatching(void);
452 	void createNVRAM(void);
453 	void generatePlatformUUID(void);
454 	void configureDefaults(void);
455 
456 	OSMetaClassDeclareReservedUnused(IOPlatformExpertDevice, 0);
457 	OSMetaClassDeclareReservedUnused(IOPlatformExpertDevice, 1);
458 	OSMetaClassDeclareReservedUnused(IOPlatformExpertDevice, 2);
459 	OSMetaClassDeclareReservedUnused(IOPlatformExpertDevice, 3);
460 };
461 
462 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
463 
464 /* generic nub for motherboard devices */
465 
466 class IOPlatformDevice : public IOService
467 {
468 	OSDeclareDefaultStructors(IOPlatformDevice);
469 
470 	struct ExpansionData { };
471 	ExpansionData *iopd_reserved;
472 
473 public:
474 	virtual bool compareName( OSString * name, OSString ** matched = NULL ) const APPLE_KEXT_OVERRIDE;
475 	virtual IOService * matchLocation( IOService * client ) APPLE_KEXT_OVERRIDE;
476 	virtual IOReturn getResources( void ) APPLE_KEXT_OVERRIDE;
477 
478 	OSMetaClassDeclareReservedUnused(IOPlatformDevice, 0);
479 	OSMetaClassDeclareReservedUnused(IOPlatformDevice, 1);
480 	OSMetaClassDeclareReservedUnused(IOPlatformDevice, 2);
481 	OSMetaClassDeclareReservedUnused(IOPlatformDevice, 3);
482 };
483 
484 #endif /* __cplusplus */
485 
486 #endif /* ! _IOKIT_IOPLATFORMEXPERT_H */
487