cpu.c revision 1.1 1 1.1 sakamoto /* $Id: cpu.c,v 1.1 1998/01/16 04:17:42 sakamoto Exp $ */
2 1.1 sakamoto
3 1.1 sakamoto /*
4 1.1 sakamoto * This file contains information proprietary to Be Inc.
5 1.1 sakamoto */
6 1.1 sakamoto
7 1.1 sakamoto /*-
8 1.1 sakamoto * Copyright (C) 1995-1997 Gary Thomas (gdt (at) linuxppc.org)
9 1.1 sakamoto * All rights reserved.
10 1.1 sakamoto *
11 1.1 sakamoto * Redistribution and use in source and binary forms, with or without
12 1.1 sakamoto * modification, are permitted provided that the following conditions
13 1.1 sakamoto * are met:
14 1.1 sakamoto * 1. Redistributions of source code must retain the above copyright
15 1.1 sakamoto * notice, this list of conditions and the following disclaimer.
16 1.1 sakamoto * 2. Redistributions in binary form must reproduce the above copyright
17 1.1 sakamoto * notice, this list of conditions and the following disclaimer in the
18 1.1 sakamoto * documentation and/or other materials provided with the distribution.
19 1.1 sakamoto * 3. All advertising materials mentioning features or use of this software
20 1.1 sakamoto * must display the following acknowledgement:
21 1.1 sakamoto * This product includes software developed by Gary Thomas.
22 1.1 sakamoto * 4. The name of the author may not be used to endorse or promote products
23 1.1 sakamoto * derived from this software without specific prior written permission.
24 1.1 sakamoto *
25 1.1 sakamoto * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
26 1.1 sakamoto * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
27 1.1 sakamoto * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
28 1.1 sakamoto * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
29 1.1 sakamoto * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30 1.1 sakamoto * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31 1.1 sakamoto * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32 1.1 sakamoto * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 1.1 sakamoto * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
34 1.1 sakamoto * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 1.1 sakamoto */
36 1.1 sakamoto
37 1.1 sakamoto /*
38 1.1 sakamoto * Return the ordinal of the CPU on which the code runs (0/1)
39 1.1 sakamoto */
40 1.1 sakamoto
41 1.1 sakamoto #define CPU1_HRESET 0x20000000
42 1.1 sakamoto
43 1.1 sakamoto int
44 1.1 sakamoto whichCPU()
45 1.1 sakamoto {
46 1.1 sakamoto volatile unsigned long *CPU_control = (unsigned long *)0x7FFFF3F0;
47 1.1 sakamoto if (*CPU_control & 0x02000000)
48 1.1 sakamoto {
49 1.1 sakamoto return (1);
50 1.1 sakamoto } else
51 1.1 sakamoto {
52 1.1 sakamoto return (0);
53 1.1 sakamoto }
54 1.1 sakamoto }
55 1.1 sakamoto
56 1.1 sakamoto /*
57 1.1 sakamoto * Force CPU #1 into Hard RESET state
58 1.1 sakamoto */
59 1.1 sakamoto
60 1.1 sakamoto void
61 1.1 sakamoto resetCPU1()
62 1.1 sakamoto {
63 1.1 sakamoto volatile unsigned long *CPU_control = (unsigned long *)0x7FFFF4F0;
64 1.1 sakamoto *CPU_control = CPU1_HRESET;
65 1.1 sakamoto }
66 1.1 sakamoto
67 1.1 sakamoto /*
68 1.1 sakamoto * Return state of CPU RESET register
69 1.1 sakamoto */
70 1.1 sakamoto unsigned long
71 1.1 sakamoto cpuState()
72 1.1 sakamoto {
73 1.1 sakamoto volatile unsigned long *CPU_control = (unsigned long *)0x7FFFF4F0;
74 1.1 sakamoto return (*CPU_control);
75 1.1 sakamoto }
76 1.1 sakamoto
77 1.1 sakamoto /*
78 1.1 sakamoto * Start CPU #1
79 1.1 sakamoto */
80 1.1 sakamoto void
81 1.1 sakamoto runCPU1(entry)
82 1.1 sakamoto long entry;
83 1.1 sakamoto {
84 1.1 sakamoto volatile unsigned long *CPU_control = (unsigned long *)0x7FFFF4F0;
85 1.1 sakamoto long *PEF_vector = (long *)0x3000;
86 1.1 sakamoto long *PEF_vector2 = (long *)0x3018;
87 1.1 sakamoto int i;
88 1.1 sakamoto PEF_vector[0] = 0;
89 1.1 sakamoto PEF_vector[1] = 0;
90 1.1 sakamoto PEF_vector[2] = 0;
91 1.1 sakamoto PEF_vector[3] = 0;
92 1.1 sakamoto PEF_vector[0] = 0;
93 1.1 sakamoto PEF_vector2[0] = 0;
94 1.1 sakamoto *CPU_control = 0x80000000 | CPU1_HRESET;
95 1.1 sakamoto /* Give the other CPU a chance to find the zero value */
96 1.1 sakamoto delay(1000);
97 1.1 sakamoto PEF_vector[0] = entry;
98 1.1 sakamoto PEF_vector[1] = entry;
99 1.1 sakamoto PEF_vector[2] = entry;
100 1.1 sakamoto PEF_vector[3] = entry;
101 1.1 sakamoto PEF_vector[0] = entry;
102 1.1 sakamoto PEF_vector2[0] = entry;
103 1.1 sakamoto }
104 1.1 sakamoto
105 1.1 sakamoto /*
106 1.1 sakamoto * CPU #1 runs here
107 1.1 sakamoto */
108 1.1 sakamoto volatile int cpu_ctr = 0;
109 1.1 sakamoto
110 1.1 sakamoto cpu1()
111 1.1 sakamoto {
112 1.1 sakamoto while(1) cpu_ctr++;
113 1.1 sakamoto }
114 1.1 sakamoto
115 1.1 sakamoto volatile int CPU1_alive = 0;
116 1.1 sakamoto
117 1.1 sakamoto void
118 1.1 sakamoto start_CPU1()
119 1.1 sakamoto {
120 1.1 sakamoto volatile long *key = (volatile long *)0x0080;
121 1.1 sakamoto
122 1.1 sakamoto CPU1_alive++;
123 1.1 sakamoto *key = 0;
124 1.1 sakamoto /* Wait for a kernel to load up a vector of where we should jump */
125 1.1 sakamoto while (*key == 0) {
126 1.1 sakamoto delay(10);
127 1.1 sakamoto }
128 1.1 sakamoto run(*key);
129 1.1 sakamoto }
130 1.1 sakamoto
131 1.1 sakamoto void
132 1.1 sakamoto wait_for(ptr)
133 1.1 sakamoto volatile long *ptr;
134 1.1 sakamoto {
135 1.1 sakamoto int i;
136 1.1 sakamoto for (i = 0; i < 10; i++) {
137 1.1 sakamoto if (*ptr)
138 1.1 sakamoto return;
139 1.1 sakamoto delay(10);
140 1.1 sakamoto }
141 1.1 sakamoto printf("CPU #1 didn't start!\n");
142 1.1 sakamoto }
143