1 /*
2  * Copyright (c) 1998-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 
36 #ifndef _IOKIT_IOINTERRUPTCONTROLLER_H
37 #define _IOKIT_IOINTERRUPTCONTROLLER_H
38 
39 #include <IOKit/IOLocks.h>
40 #include <IOKit/IOService.h>
41 #include <IOKit/IOInterrupts.h>
42 
43 
44 class IOSharedInterruptController;
45 
46 struct IOInterruptVector {
47 	volatile char               interruptActive;
48 	volatile char               interruptDisabledSoft;
49 	volatile char               interruptDisabledHard;
50 	volatile char               interruptRegistered;
51 	IOLock *                    interruptLock;
52 	IOService *                 nub;
53 	int                         source;
54 	void *                      target;
55 	IOInterruptHandler          handler;
56 	void *                      refCon;
57 	IOSharedInterruptController *sharedController;
58 };
59 
60 typedef struct IOInterruptVector IOInterruptVector;
61 
62 #if __LP64__
63 typedef int32_t IOInterruptVectorNumber;
64 #else
65 typedef long IOInterruptVectorNumber;
66 #endif
67 
68 class IOInterruptController : public IOService
69 {
70 	OSDeclareAbstractStructors(IOInterruptController);
71 
72 protected:
73 	IOInterruptVector *vectors;
74 	IOSimpleLock      *controllerLock;
75 
76 	struct ExpansionData { };
77 	ExpansionData *ioic_reserved;
78 
79 public:
80 	virtual IOReturn registerInterrupt(IOService *nub, int source,
81 	    void *target,
82 	    IOInterruptHandler handler,
83 	    void *refCon);
84 	virtual IOReturn unregisterInterrupt(IOService *nub, int source);
85 
86 	virtual IOReturn getInterruptType(IOService *nub, int source,
87 	    int *interruptType);
88 
89 	virtual IOReturn enableInterrupt(IOService *nub, int source);
90 	virtual IOReturn disableInterrupt(IOService *nub, int source);
91 	virtual IOReturn causeInterrupt(IOService *nub, int source);
92 
93 	virtual IOInterruptAction getInterruptHandlerAddress(void);
94 	virtual IOReturn handleInterrupt(void *refCon, IOService *nub,
95 	    int source);
96 
97 // Methods to be overridden for simplifed interrupt controller subclasses.
98 
99 	virtual bool vectorCanBeShared(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector);
100 	virtual void initVector(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector);
101 	virtual int  getVectorType(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector);
102 	virtual void disableVectorHard(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector);
103 	virtual void enableVector(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector);
104 	virtual void causeVector(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector);
105 	virtual void setCPUInterruptProperties(IOService *service);
106 
107 	virtual void sendIPI(unsigned int cpu_id, bool deferred);
108 	virtual void cancelDeferredIPI(unsigned int cpu_id);
109 
110 	OSMetaClassDeclareReservedUsedX86(IOInterruptController, 0);
111 	OSMetaClassDeclareReservedUsedX86(IOInterruptController, 1);
112 	OSMetaClassDeclareReservedUsedX86(IOInterruptController, 2);
113 	OSMetaClassDeclareReservedUnused(IOInterruptController, 3);
114 	OSMetaClassDeclareReservedUnused(IOInterruptController, 4);
115 	OSMetaClassDeclareReservedUnused(IOInterruptController, 5);
116 
117 public:
118 // Generic methods (not to be overriden).
119 
120 	void timeStampSpuriousInterrupt(void);
121 	void timeStampInterruptHandlerStart(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector);
122 	void timeStampInterruptHandlerEnd(IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector);
123 
124 private:
125 	void timeStampInterruptHandlerInternal(bool isStart, IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector);
126 };
127 
128 
129 class IOSharedInterruptController : public IOInterruptController
130 {
131 	OSDeclareDefaultStructors(IOSharedInterruptController);
132 
133 private:
134 	IOService         *provider;
135 	int               numVectors;
136 	int               vectorsRegistered;
137 	int               vectorsEnabled;
138 	volatile int      controllerDisabled;
139 	bool              sourceIsLevel;
140 
141 	struct ExpansionData { };
142 	ExpansionData *iosic_reserved __unused;
143 
144 public:
145 	virtual IOReturn initInterruptController(IOInterruptController *parentController, OSData *parentSource);
146 
147 	virtual IOReturn registerInterrupt(IOService *nub, int source,
148 	    void *target,
149 	    IOInterruptHandler handler,
150 	    void *refCon) APPLE_KEXT_OVERRIDE;
151 	virtual IOReturn unregisterInterrupt(IOService *nub, int source) APPLE_KEXT_OVERRIDE;
152 
153 	virtual IOReturn getInterruptType(IOService *nub, int source,
154 	    int *interruptType) APPLE_KEXT_OVERRIDE;
155 
156 	virtual IOReturn enableInterrupt(IOService *nub, int source) APPLE_KEXT_OVERRIDE;
157 	virtual IOReturn disableInterrupt(IOService *nub, int source) APPLE_KEXT_OVERRIDE;
158 
159 	virtual IOInterruptAction getInterruptHandlerAddress(void) APPLE_KEXT_OVERRIDE;
160 	virtual IOReturn handleInterrupt(void *refCon, IOService *nub, int source) APPLE_KEXT_OVERRIDE;
161 
162 	OSMetaClassDeclareReservedUnused(IOSharedInterruptController, 0);
163 	OSMetaClassDeclareReservedUnused(IOSharedInterruptController, 1);
164 	OSMetaClassDeclareReservedUnused(IOSharedInterruptController, 2);
165 	OSMetaClassDeclareReservedUnused(IOSharedInterruptController, 3);
166 };
167 
168 
169 #endif /* ! _IOKIT_IOINTERRUPTCONTROLLER_H */
170