1/*
2 * Copyright (c) 2000 Apple Computer, 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) 1999 Apple Computer, Inc.  All rights reserved.
30 *
31 *  DRI: Josh de Cesare
32 *
33 */
34
35#ifndef _IOKIT_CPU_H
36#define _IOKIT_CPU_H
37
38extern "C" {
39#include <machine/machine_routines.h>
40#include <pexpert/pexpert.h>
41
42    typedef void (*ipi_handler_t) (void);
43}
44#include <IOKit/IOService.h>
45#include <IOKit/IOInterruptController.h>
46enum {
47    kIOCPUStateUnregistered = 0,
48    kIOCPUStateUninitalized,
49    kIOCPUStateStopped,
50    kIOCPUStateRunning,
51    kIOCPUStateCount
52};
53
54class IOCPUInterruptController;
55
56extern IOCPUInterruptController *gIOCPUInterruptController;
57
58class IOCPU:public IOService {
59    OSDeclareAbstractStructors(IOCPU);
60
61 private:
62    OSArray * _cpuGroup;
63    UInt32 _cpuNumber;
64    UInt32 _cpuState;
65
66 protected:
67     IOService * cpuNub;
68    processor_t machProcessor;
69    ipi_handler_t ipi_handler;
70
71    struct ExpansionData {
72    };
73    ExpansionData *reserved;
74
75    virtual void setCPUNumber(UInt32 cpuNumber);
76    virtual void setCPUState(UInt32 cpuState);
77
78 public:
79    static void initCPUs(void);
80
81    virtual bool start(IOService * provider);
82    virtual OSObject *getProperty(const OSSymbol * aKey) const;
83    virtual bool setProperty(const OSSymbol * aKey, OSObject * anObject);
84    virtual bool serializeProperties(OSSerialize * serialize) const;
85    virtual IOReturn setProperties(OSObject * properties);
86    virtual void initCPU(bool boot) = 0;
87    virtual void quiesceCPU(void) = 0;
88    virtual kern_return_t startCPU(vm_offset_t start_paddr, vm_offset_t arg_paddr) = 0;
89    virtual void haltCPU(void) = 0;
90    virtual void signalCPU(IOCPU * target);
91    virtual void enableCPUTimeBase(bool enable);
92
93    virtual UInt32 getCPUNumber(void);
94    virtual UInt32 getCPUState(void);
95    virtual OSArray *getCPUGroup(void);
96    virtual UInt32 getCPUGroupSize(void);
97    virtual processor_t getMachProcessor(void);
98
99    virtual const OSSymbol *getCPUName(void) = 0;
100
101     OSMetaClassDeclareReservedUnused(IOCPU, 0);
102     OSMetaClassDeclareReservedUnused(IOCPU, 1);
103     OSMetaClassDeclareReservedUnused(IOCPU, 2);
104     OSMetaClassDeclareReservedUnused(IOCPU, 3);
105     OSMetaClassDeclareReservedUnused(IOCPU, 4);
106     OSMetaClassDeclareReservedUnused(IOCPU, 5);
107     OSMetaClassDeclareReservedUnused(IOCPU, 6);
108     OSMetaClassDeclareReservedUnused(IOCPU, 7);
109};
110
111void IOCPUSleepKernel(void);
112extern "C" kern_return_t IOCPURunPlatformQuiesceActions(void);
113extern "C" kern_return_t IOCPURunPlatformActiveActions(void);
114
115class IOCPUInterruptController:public IOInterruptController {
116    OSDeclareDefaultStructors(IOCPUInterruptController);
117
118 private:
119    int enabledCPUs;
120
121 protected:
122    int numCPUs;
123    IOCPU **cpus;
124
125    struct ExpansionData {
126    };
127    ExpansionData *reserved;
128
129 public:
130     virtual IOReturn initCPUInterruptController(int sources);
131    virtual void registerCPUInterruptController(void);
132    virtual void setCPUInterruptProperties(IOService * service);
133    virtual void enableCPUInterrupt(IOCPU * cpu);
134
135    virtual IOReturn registerInterrupt(IOService * nub, int source, void *target, IOInterruptHandler handler, void *refCon);
136
137    virtual IOReturn getInterruptType(IOService * nub, int source, int *interruptType);
138
139    virtual IOReturn enableInterrupt(IOService * nub, int source);
140    virtual IOReturn disableInterrupt(IOService * nub, int source);
141    virtual IOReturn causeInterrupt(IOService * nub, int source);
142
143    virtual IOReturn handleInterrupt(void *refCon, IOService * nub, int source);
144
145     OSMetaClassDeclareReservedUnused(IOCPUInterruptController, 0);
146     OSMetaClassDeclareReservedUnused(IOCPUInterruptController, 1);
147     OSMetaClassDeclareReservedUnused(IOCPUInterruptController, 2);
148     OSMetaClassDeclareReservedUnused(IOCPUInterruptController, 3);
149     OSMetaClassDeclareReservedUnused(IOCPUInterruptController, 4);
150     OSMetaClassDeclareReservedUnused(IOCPUInterruptController, 5);
151};
152
153#endif                          /* ! _IOKIT_CPU_H */
154