|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
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.
11: *
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
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * @OSF_FREE_COPYRIGHT@
24: */
25: /*
26: * @APPLE_FREE_COPYRIGHT@
27: */
28:
29: /*
30: MPPlugIn.h
31:
32: Herein we find all the global MP plugin stuff
33:
34: Lovingly crafted by Bill Angell using traditional methods
35:
36: */
37:
38:
39: /*
40: * External hook completion codes
41: *
42: * The MP plugin's external interrupt hook returns one of these codes
43: */
44:
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 */
48:
49:
50: /* ***********************************************************************
51: * Entry point jump table entry numbers
52: * *********************************************************************** */
53:
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 */
66:
67: #define kMPPlugInMaxCall 11 /* set MPPlugInMaxCall to the highest-numbered call */
68:
69:
70: /* ***********************************************************************
71: * MP Plug-In specification
72: *
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: * *********************************************************************** */
77:
78: #define kMPPlugInVersionID 1
79:
80: #define kSIGPUninitializedState 0
81: #define kSIGPResetState 1
82: #define kSIGPStoppedState 2
83: #define kSIGPOperatingState 3
84: #define kSIGPErrorState 4
85:
86: #define kSIGPnoErr 0
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
94:
95: #define kMPPlugInInstallFailed -4999
96: #define kMPPlugInInternalError -4998
97:
98: /*
99: * ***********************************************************************
100: * Signal processor request codes
101: * ***********************************************************************
102: */
103:
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 */
107:
108: /*
109: * ***********************************************************************
110: * Temporary debugging error codes (well, at least as temporary as the income tax)
111: * ***********************************************************************
112: */
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
128:
129:
130: /*
131: * ***********************************************************************
132: * Let's define some hardware stuff
133: * ***********************************************************************
134: */
135:
136: #define Bandit1 0xF2000000
137: #define PCI1AdrReg 0xF2800000
138: #define GrandCentral 0xF3000000
139: #define EtherNetROM 0xF3019000
140: #define HammerHead 0xF8000000
141: #define ArbConfig 0x0090
142: #define TwoCPU 0x02
143: #define WhoAmI 0x00B0
144: #define PriCPU 0x10
145: #define SecCPU 0x08
146: #define IntReg 0x00C0
147: #define SecInt 0x80
148:
149:
150: /*
151: * ***********************************************************************
152: * Let's define the flags for MPPInterface
153: * ***********************************************************************
154: */
155:
156: #define SpinTimeOut 30000000
157:
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 */
170: /* MPPIParm0 */
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 */
183:
184:
185:
186: #ifndef __ASSEMBLER__
187:
188: typedef unsigned char CPUState;
189: typedef unsigned int CPUNotification;
190:
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 */
201: };
202:
203: typedef struct MPPlugInSpec MPPlugInSpec;
204: typedef MPPlugInSpec *MPPlugInSpecPtr;
205:
206: struct MPEntryPts {
207: unsigned int EntAddr[kMPPlugInMaxCall+1]; /* Real addresses of all plugin entry points */
208: };
209:
210: typedef struct MPEntryPts MPEntryPts;
211:
212: struct SystemRegister {
213: unsigned int regno;
214: unsigned int contents;
215: };
216:
217: typedef struct SystemRegister SystemRegister;
218:
219: typedef struct FPRegs {
220: unsigned int lo;
221: unsigned int hi;
222: } FPRegs;
223:
224: struct BATregs {
225: unsigned int upper;
226: unsigned int lower;
227: };
228:
229: typedef struct BATregs BATregs;
230:
231:
232: #define kSysRegCount 16
233:
234: struct CPUStatusArea { /* 0000 This is CSAxxxxx for assembler */
235:
236: /*
237: * Note that this guy always has to be in one-to-one mapped area contiguously
238: */
239:
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 */
273:
274: unsigned int msr; /* 0300 */
275: unsigned int pc; /* 0304 */
276:
277: SystemRegister sysregs[kSysRegCount]; /* 0308 */
278:
279: unsigned int filler2[6]; /* 0388 Always pad up to 32-byte boundary */
280: /* 03A0 */
281: };
282:
283: typedef struct CPUStatusArea CPUStatusArea;
284: typedef CPUStatusArea *CPUStatusAreaPtr;
285:
286: extern CPUStatusArea CSA[NCPUS];
287:
288: struct SenseInfo {
289: CPUNotification notification;
290: CPUState state;
291: };
292:
293: typedef struct SenseInfo SenseInfo;
294: typedef SenseInfo *SenseInfoPtr;
295:
296:
297: struct MPPInterface {
298:
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) */
307: };
308:
309: typedef struct MPPInterface MPPInterface;
310: typedef MPPInterface *MPPInterfacePtr;
311:
312: extern MPPInterface MPPICPUs[];
313:
314:
315: /* ***********************************************************************
316: * Function prototypes and data areas
317: * *********************************************************************** */
318:
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);
324: #if 0
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);
334: #endif
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);
338:
339: extern void start_secondary (void);
340: extern void mp_intr (void);
341:
342:
343: extern MPPlugInSpec MPspec; /* An area for the MP interfaces */
344: extern MPEntryPts MPEntries; /* Real addresses of plugin routines */
345:
346: #endif /* ndef __ASSEMBLER */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.