cpu.c revision 1.4 1 1.4 junyoung /* $NetBSD: cpu.c,v 1.4 2005/06/28 20:01:17 junyoung 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.3 sakamoto #include <stand.h>
38 1.3 sakamoto #include "boot.h"
39 1.3 sakamoto
40 1.1 sakamoto /*
41 1.1 sakamoto * Return the ordinal of the CPU on which the code runs (0/1)
42 1.1 sakamoto */
43 1.1 sakamoto
44 1.3 sakamoto #define CPU1_HRESET 0x20000000
45 1.4 junyoung
46 1.1 sakamoto int
47 1.4 junyoung whichCPU(void)
48 1.1 sakamoto {
49 1.1 sakamoto volatile unsigned long *CPU_control = (unsigned long *)0x7FFFF3F0;
50 1.3 sakamoto
51 1.3 sakamoto if (*CPU_control & 0x02000000) {
52 1.4 junyoung return 1;
53 1.3 sakamoto } else {
54 1.4 junyoung return 0;
55 1.1 sakamoto }
56 1.1 sakamoto }
57 1.1 sakamoto
58 1.1 sakamoto /*
59 1.1 sakamoto * Force CPU #1 into Hard RESET state
60 1.1 sakamoto */
61 1.4 junyoung
62 1.1 sakamoto void
63 1.4 junyoung resetCPU1(void)
64 1.1 sakamoto {
65 1.1 sakamoto volatile unsigned long *CPU_control = (unsigned long *)0x7FFFF4F0;
66 1.3 sakamoto
67 1.1 sakamoto *CPU_control = CPU1_HRESET;
68 1.1 sakamoto }
69 1.1 sakamoto
70 1.1 sakamoto /*
71 1.1 sakamoto * Return state of CPU RESET register
72 1.1 sakamoto */
73 1.1 sakamoto unsigned long
74 1.4 junyoung cpuState(void)
75 1.1 sakamoto {
76 1.1 sakamoto volatile unsigned long *CPU_control = (unsigned long *)0x7FFFF4F0;
77 1.3 sakamoto
78 1.4 junyoung return *CPU_control;
79 1.1 sakamoto }
80 1.1 sakamoto
81 1.1 sakamoto /*
82 1.1 sakamoto * Start CPU #1
83 1.1 sakamoto */
84 1.1 sakamoto void
85 1.4 junyoung runCPU1(void *entry)
86 1.1 sakamoto {
87 1.1 sakamoto volatile unsigned long *CPU_control = (unsigned long *)0x7FFFF4F0;
88 1.1 sakamoto long *PEF_vector = (long *)0x3000;
89 1.1 sakamoto long *PEF_vector2 = (long *)0x3018;
90 1.3 sakamoto
91 1.1 sakamoto PEF_vector[0] = 0;
92 1.1 sakamoto PEF_vector[1] = 0;
93 1.1 sakamoto PEF_vector[2] = 0;
94 1.1 sakamoto PEF_vector[3] = 0;
95 1.1 sakamoto PEF_vector[0] = 0;
96 1.1 sakamoto PEF_vector2[0] = 0;
97 1.1 sakamoto *CPU_control = 0x80000000 | CPU1_HRESET;
98 1.1 sakamoto /* Give the other CPU a chance to find the zero value */
99 1.1 sakamoto delay(1000);
100 1.3 sakamoto PEF_vector[0] = (long)entry;
101 1.3 sakamoto PEF_vector[1] = (long)entry;
102 1.3 sakamoto PEF_vector[2] = (long)entry;
103 1.3 sakamoto PEF_vector[3] = (long)entry;
104 1.3 sakamoto PEF_vector[0] = (long)entry;
105 1.3 sakamoto PEF_vector2[0] = (long)entry;
106 1.1 sakamoto }
107 1.1 sakamoto
108 1.1 sakamoto /*
109 1.1 sakamoto * CPU #1 runs here
110 1.1 sakamoto */
111 1.1 sakamoto volatile int cpu_ctr = 0;
112 1.1 sakamoto
113 1.3 sakamoto void
114 1.4 junyoung cpu1(void)
115 1.1 sakamoto {
116 1.3 sakamoto while (1)
117 1.3 sakamoto cpu_ctr++;
118 1.1 sakamoto }
119 1.1 sakamoto
120 1.1 sakamoto volatile int CPU1_alive = 0;
121 1.1 sakamoto
122 1.1 sakamoto void
123 1.4 junyoung start_CPU1(void)
124 1.1 sakamoto {
125 1.1 sakamoto volatile long *key = (volatile long *)0x0080;
126 1.1 sakamoto
127 1.1 sakamoto CPU1_alive++;
128 1.1 sakamoto *key = 0;
129 1.1 sakamoto /* Wait for a kernel to load up a vector of where we should jump */
130 1.3 sakamoto while (*key == 0)
131 1.1 sakamoto delay(10);
132 1.3 sakamoto
133 1.3 sakamoto run(NULL, NULL, NULL, NULL, (void *)*key);
134 1.1 sakamoto }
135 1.1 sakamoto
136 1.1 sakamoto void
137 1.4 junyoung wait_for(volatile int *ptr)
138 1.1 sakamoto {
139 1.1 sakamoto int i;
140 1.1 sakamoto for (i = 0; i < 10; i++) {
141 1.1 sakamoto if (*ptr)
142 1.1 sakamoto return;
143 1.1 sakamoto delay(10);
144 1.1 sakamoto }
145 1.1 sakamoto printf("CPU #1 didn't start!\n");
146 1.1 sakamoto }
147