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 *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 | ␊ |
106 | OSMetaClassDeclareReservedUnused(IOInterruptController, 0);␊ |
107 | OSMetaClassDeclareReservedUnused(IOInterruptController, 1);␊ |
108 | OSMetaClassDeclareReservedUnused(IOInterruptController, 2);␊ |
109 | OSMetaClassDeclareReservedUnused(IOInterruptController, 3);␊ |
110 | OSMetaClassDeclareReservedUnused(IOInterruptController, 4);␊ |
111 | OSMetaClassDeclareReservedUnused(IOInterruptController, 5);␊ |
112 | };␊ |
113 | ␊ |
114 | ␊ |
115 | class IOSharedInterruptController : public IOInterruptController␊ |
116 | {␊ |
117 | OSDeclareDefaultStructors(IOSharedInterruptController);␊ |
118 | ␊ |
119 | private:␊ |
120 | IOService *provider;␊ |
121 | int numVectors;␊ |
122 | int vectorsRegistered;␊ |
123 | int vectorsEnabled;␊ |
124 | volatile int controllerDisabled;␊ |
125 | bool sourceIsLevel;␊ |
126 | ␊ |
127 | struct ExpansionData { };␊ |
128 | ExpansionData *reserved;␊ |
129 | ␊ |
130 | public:␊ |
131 | virtual IOReturn initInterruptController(IOInterruptController *parentController, OSData *parentSource);␊ |
132 | ␊ |
133 | virtual IOReturn registerInterrupt(IOService *nub, int source,␊ |
134 | void *target,␊ |
135 | IOInterruptHandler handler,␊ |
136 | void *refCon);␊ |
137 | virtual IOReturn unregisterInterrupt(IOService *nub, int source);␊ |
138 | ␊ |
139 | virtual IOReturn getInterruptType(IOService *nub, int source,␊ |
140 | ␉␉␉␉ int *interruptType);␊ |
141 | ␊ |
142 | virtual IOReturn enableInterrupt(IOService *nub, int source);␊ |
143 | virtual IOReturn disableInterrupt(IOService *nub, int source);␊ |
144 | ␊ |
145 | virtual IOInterruptAction getInterruptHandlerAddress(void);␊ |
146 | virtual IOReturn handleInterrupt(void *refCon, IOService *nub, int source);␊ |
147 | ␊ |
148 | OSMetaClassDeclareReservedUnused(IOSharedInterruptController, 0);␊ |
149 | OSMetaClassDeclareReservedUnused(IOSharedInterruptController, 1);␊ |
150 | OSMetaClassDeclareReservedUnused(IOSharedInterruptController, 2);␊ |
151 | OSMetaClassDeclareReservedUnused(IOSharedInterruptController, 3);␊ |
152 | };␊ |
153 | ␊ |
154 | ␊ |
155 | #endif /* ! _IOKIT_IOINTERRUPTCONTROLLER_H */␊ |
156 | |