2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
20 * @APPLE_LICENSE_HEADER_END@
23 * @OSF_FREE_COPYRIGHT@
26 * @APPLE_FREE_COPYRIGHT@
32 Herein we find all the global MP plugin stuff
34 Lovingly crafted by Bill Angell using traditional methods
40 * External hook completion codes
42 * The MP plugin's external interrupt hook returns one of these codes
45 #define kMPVainInterrupt 0 /* Interruption in vain -- ignore it */
46 #define kMPIOInterruptPending 1 /* This is an I/O interruption -- handle it */
47 #define kMPSignalPending 2 /* This is a pending signal -- handle it */
50 /* ***********************************************************************
51 * Entry point jump table entry numbers
52 * *********************************************************************** */
54 #define kCountProcessors 0
55 #define kStartProcessor 1 /* ->cpu address, ->start address, ->pass-thru parm */
56 #define kResumeProcessor 2 /* ->cpu address */
57 #define kStopProcessor 3 /* ->cpu address */
58 #define kResetProcessor 4 /* ->cpu address */
59 #define kSignalProcessor 5 /* ->cpu address */
60 #define kStoreProcessorStatus 6 /* ->cpu address, ->status area address */
61 #define kSynchClock 7 /* ->cpu address */
62 #define kExternalHook 8 /* no parms */
63 #define kProcessorState 9 /* ->cpu address */
64 #define kRunSIGPRun 10 /* no parms */
65 #define kPhoneyFirmware 11 /* Dummy kernel for alternate processors */
67 #define kMPPlugInMaxCall 11 /* set MPPlugInMaxCall to the highest-numbered call */
70 /* ***********************************************************************
71 * MP Plug-In specification
73 * The address of this area is passed to the MP plugin by the initialization code. If the
74 * version ID and the installed hardware match the MP plugin, it returns its memory
75 * requirements and a table of offsets to its entry points.
76 * *********************************************************************** */
78 #define kMPPlugInVersionID 1
80 #define kSIGPUninitializedState 0
81 #define kSIGPResetState 1
82 #define kSIGPStoppedState 2
83 #define kSIGPOperatingState 3
84 #define kSIGPErrorState 4
87 #define kSIGPInvalidStateErr -3999
88 #define kSIGPInterfaceBusyErr -3998
89 #define kSIGPPrivilegeErr -3997
90 #define kSIGPNoPlugInErr -3996
91 #define kTimeBaseSynchronizationErr -3995
92 #define kSIGPTargetAddrErr -3994
93 #define kSIGPInvalidStatusErr -3993
95 #define kMPPlugInInstallFailed -4999
96 #define kMPPlugInInternalError -4998
99 * ***********************************************************************
100 * Signal processor request codes
101 * ***********************************************************************
104 #define SIGPast 0 /* Requests an ast on target processor */
105 #define SIGPptlb 1 /* Requests a total purge of the TLB */
106 #define SIGPkdb 2 /* Requests a KDB entry */
109 * ***********************************************************************
110 * Temporary debugging error codes (well, at least as temporary as the income tax)
111 * ***********************************************************************
113 #define kMPPHairyPalms -10002
114 #define kMPPOffline -10003
115 #define kMPPBadState -10004
116 #define kMPPInvalCPU -10005
117 #define kMPPCantLock -10006
118 #define kMPPNotReady -10007
119 #define kMPPNotStopped -10008
120 #define kMPPBadCPU -10009
121 #define kMPPOnly1CPU -10010
122 #define kMPPBadVers -10011
123 #define kMPPNotRunning -10012
124 #define kMPPTimeOut -10013
125 #define kMPPInitTO1 -10014
126 #define kMPPInitTO2 -10015
127 #define kMPPInitTO3 -10016
131 * ***********************************************************************
132 * Let's define some hardware stuff
133 * ***********************************************************************
136 #define Bandit1 0xF2000000
137 #define PCI1AdrReg 0xF2800000
138 #define GrandCentral 0xF3000000
139 #define EtherNetROM 0xF3019000
140 #define HammerHead 0xF8000000
141 #define ArbConfig 0x0090
143 #define WhoAmI 0x00B0
146 #define IntReg 0x00C0
151 * ***********************************************************************
152 * Let's define the flags for MPPInterface
153 * ***********************************************************************
156 #define SpinTimeOut 30000000
158 #define MPPICmsgp 0xc0000000 /* Message pending (busy + pass) */
159 #define MPPICBusy 0x80000000 /* Processor area busy, i.e., locked */
160 #define MPPICPass 0x40000000 /* Busy lock passed to receiving processor */
161 #define MPPICOnline 0x20000000 /* Processor is online */
162 #define MPPICReady 0x10000000 /* Processor is ready, i.e., started, not reset */
163 #define MPPICStop 0x08000000 /* Processor is stopped */
164 #define MPPICBset 0x000000FF /* Processor that owns busy, i.e., the ID of */
165 /* whomever set busy. When a busy is passed, */
166 /* this is the requestor of the function. */
167 #define MPPICfunc 0x0000FF00 /* Current function */
168 #define MPPICfIdle 0x00 /* No function pending */
169 #define MPPICfStrt 0x01 /* Start the processor, physical address in */
171 #define MPPICfResm 0x02 /* Resume a stopped processor */
172 #define MPPICfStop 0x03 /* Stop a processor */
173 #define MPPICfSigp 0x04 /* Signal a processor */
174 #define MPPICfStat 0x05 /* Store the processor machine state - */
175 /* physical address of response in MPPIParm0 */
176 #define MPPICfTBsy 0x06 /* Synchronize timebase - */
177 /* TB image in MPPIParm0 and MPPIParm1 */
178 #define MPPICfReset 0x07 /* Reset the processor */
179 #define MPPICfTBsy1 0x81 /* TB sync, phase 1 */
180 #define MPPICfTBsy2 0x82 /* TB sync, phase 2 */
181 #define MPPICSigp 0x80000000 /* Processor has signal pending (keep signal status when stopped) */
182 #define MPPICXRun 0x40000000 /* Explicit SIGP run call */
186 #ifndef __ASSEMBLER__
188 typedef unsigned char CPUState
;
189 typedef unsigned int CPUNotification
;
191 struct MPPlugInSpec
{ /* This is MPSxxxx for assembler */
192 unsigned int versionID
; /* Version ID, must match */
193 unsigned int *areaAddr
; /* Virtual address of area to be */
194 /* relocated to physical memory */
195 unsigned int areaSize
; /* Size of area to be relocated */
196 unsigned int *offsetTableAddr
; /* Virtual address of table of entry offsets */
197 unsigned int *baseAddr
; /* Common base area - used for debugging */
198 unsigned int *dataArea
; /* Pointer to the MP workarea - used for debugging */
199 unsigned int *CPUArea
; /* Pointer to the CPU workarea - used for debugging */
200 unsigned int *SIGPhandler
; /* Physical address of signal interrupt filter */
203 typedef struct MPPlugInSpec MPPlugInSpec
;
204 typedef MPPlugInSpec
*MPPlugInSpecPtr
;
207 unsigned int EntAddr
[kMPPlugInMaxCall
+1]; /* Real addresses of all plugin entry points */
210 typedef struct MPEntryPts MPEntryPts
;
212 struct SystemRegister
{
214 unsigned int contents
;
217 typedef struct SystemRegister SystemRegister
;
219 typedef struct FPRegs
{
229 typedef struct BATregs BATregs
;
232 #define kSysRegCount 16
234 struct CPUStatusArea
{ /* 0000 This is CSAxxxxx for assembler */
237 * Note that this guy always has to be in one-to-one mapped area contiguously
240 CPUState state
; /* 0000 */
241 unsigned char regsAreValid
; /* 0001 */
242 unsigned char filler
[2]; /* 0002 */
243 unsigned int gpr
[32]; /* 0004 */
244 FPRegs fpr
[32]; /* 0084 */
245 unsigned int cr
; /* 0184 */
246 unsigned int fpscr
; /* 0188 */
247 unsigned int xer
; /* 018C */
248 unsigned int lr
; /* 0190 */
249 unsigned int ctr
; /* 0194 */
250 unsigned int tbu
; /* 0198 This is rtcu on 601. */
251 unsigned int tbl
; /* 019C This is rtcl on 601. */
252 unsigned int pvr
; /* 01A0 */
253 BATregs ibat
[4]; /* 01A4 */
254 BATregs dbat
[4]; /* 01E4 */
255 unsigned int sdr1
; /* 0224 */
256 unsigned int sr
[16]; /* 0228 */
257 unsigned int dar
; /* 0268 */
258 unsigned int dsisr
; /* 026C */
259 unsigned int sprg
[4]; /* 0270 */
260 unsigned int srr0
; /* 0280 */
261 unsigned int srr1
; /* 0284 */
262 unsigned int dec
; /* 0288 */
263 unsigned int dabr
; /* 028C */
264 unsigned int iabr
; /* 0290 */
265 unsigned int ear
; /* 0294 */
266 unsigned int hid
[16]; /* 0298 */
267 unsigned int mmcr
[2]; /* 02D8 */
268 unsigned int pmc
[4]; /* 02E0 */
269 unsigned int pir
; /* 02F0 */
270 unsigned int sda
; /* 02F4 */
271 unsigned int sia
; /* 02F8 */
272 unsigned int mq
; /* 02FC */
274 unsigned int msr
; /* 0300 */
275 unsigned int pc
; /* 0304 */
277 SystemRegister sysregs
[kSysRegCount
]; /* 0308 */
279 unsigned int filler2
[6]; /* 0388 Always pad up to 32-byte boundary */
283 typedef struct CPUStatusArea CPUStatusArea
;
284 typedef CPUStatusArea
*CPUStatusAreaPtr
;
286 extern CPUStatusArea CSA
[NCPUS
];
289 CPUNotification notification
;
293 typedef struct SenseInfo SenseInfo
;
294 typedef SenseInfo
*SenseInfoPtr
;
297 struct MPPInterface
{
299 unsigned int MPPICStat
; /* Processor status (interlocked update for this one) */
300 unsigned int MPPICParm0
; /* SIGP parm 0 */
301 unsigned int MPPICParm1
; /* SIGP parm 1 */
302 unsigned int MPPICParm2
; /* SIGP parm 2 */
303 unsigned int MPPICspare0
; /* unused */
304 unsigned int MPPICspare1
; /* unused */
305 unsigned int MPPICParm0BU
; /* Parm 0 backed up here at 'rupt time for safe keeping */
306 unsigned int MPPICPriv
; /* Processor status (interlocked update for this one) */
309 typedef struct MPPInterface MPPInterface
;
310 typedef MPPInterface
*MPPInterfacePtr
;
312 extern MPPInterface MPPICPUs
[];
315 /* ***********************************************************************
316 * Function prototypes and data areas
317 * *********************************************************************** */
319 extern unsigned int MPgetProcCount (void);
320 extern unsigned int MPstart (unsigned int cpu
, unsigned int sadr
, unsigned int parm
);
321 extern unsigned int MPexternalHook (void);
322 extern unsigned int MPsignal (unsigned int cpu
, unsigned int SIGPparm
);
323 extern unsigned int MPstop (unsigned int cpu
);
325 extern unsigned int MPCPUAddress (void);
326 extern unsigned int MPresume (unsigned int cpu
);
327 extern unsigned int MPreset (unsigned int cpu
);
328 extern unsigned int MPSense (unsigned int cpu
, unsigned int *info
);
329 extern unsigned int MPstoreStatus (unsigned int cpu
, unsigned int *statusArea
);
330 extern unsigned int MPSetStatus (unsigned int cpu
, unsigned int *statusArea
);
331 extern unsigned int MPgetSignal (void);
332 extern unsigned int MPsyncTB (void);
333 extern unsigned int MPcheckPending (void);
335 extern int MPinstall (unsigned int physAddr
, unsigned int band1
, unsigned int hammerh
, unsigned int grandc
,
336 unsigned int pci1ar
, unsigned int enetr
);
337 extern unsigned int MPprobe (MPPlugInSpecPtr spec
, unsigned int hammerh
);
339 extern void start_secondary (void);
340 extern void mp_intr (void);
343 extern MPPlugInSpec MPspec
; /* An area for the MP interfaces */
344 extern MPEntryPts MPEntries
; /* Real addresses of plugin routines */
346 #endif /* ndef __ASSEMBLER */