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