cpu.c revision 1.7 1 1.7 kiyohara /* $NetBSD: cpu.c,v 1.7 2011/06/12 07:07:17 kiyohara 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.5 junyoung #include <lib/libsa/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.1 sakamoto void
62 1.4 junyoung resetCPU1(void)
63 1.1 sakamoto {
64 1.1 sakamoto volatile unsigned long *CPU_control = (unsigned long *)0x7FFFF4F0;
65 1.3 sakamoto
66 1.1 sakamoto *CPU_control = CPU1_HRESET;
67 1.1 sakamoto }
68 1.1 sakamoto
69 1.1 sakamoto /*
70 1.1 sakamoto * Return state of CPU RESET register
71 1.1 sakamoto */
72 1.1 sakamoto unsigned long
73 1.4 junyoung cpuState(void)
74 1.1 sakamoto {
75 1.1 sakamoto volatile unsigned long *CPU_control = (unsigned long *)0x7FFFF4F0;
76 1.3 sakamoto
77 1.4 junyoung return *CPU_control;
78 1.1 sakamoto }
79 1.1 sakamoto
80 1.1 sakamoto /*
81 1.1 sakamoto * Start CPU #1
82 1.1 sakamoto */
83 1.1 sakamoto void
84 1.4 junyoung runCPU1(void *entry)
85 1.1 sakamoto {
86 1.1 sakamoto volatile unsigned long *CPU_control = (unsigned long *)0x7FFFF4F0;
87 1.1 sakamoto long *PEF_vector = (long *)0x3000;
88 1.1 sakamoto long *PEF_vector2 = (long *)0x3018;
89 1.3 sakamoto
90 1.1 sakamoto PEF_vector[0] = 0;
91 1.1 sakamoto PEF_vector[1] = 0;
92 1.1 sakamoto PEF_vector[2] = 0;
93 1.1 sakamoto PEF_vector[3] = 0;
94 1.1 sakamoto PEF_vector[0] = 0;
95 1.1 sakamoto PEF_vector2[0] = 0;
96 1.1 sakamoto *CPU_control = 0x80000000 | CPU1_HRESET;
97 1.1 sakamoto /* Give the other CPU a chance to find the zero value */
98 1.1 sakamoto delay(1000);
99 1.3 sakamoto PEF_vector[0] = (long)entry;
100 1.3 sakamoto PEF_vector[1] = (long)entry;
101 1.3 sakamoto PEF_vector[2] = (long)entry;
102 1.3 sakamoto PEF_vector[3] = (long)entry;
103 1.3 sakamoto PEF_vector[0] = (long)entry;
104 1.3 sakamoto PEF_vector2[0] = (long)entry;
105 1.1 sakamoto }
106 1.1 sakamoto
107 1.1 sakamoto /*
108 1.1 sakamoto * CPU #1 runs here
109 1.1 sakamoto */
110 1.1 sakamoto volatile int cpu_ctr = 0;
111 1.1 sakamoto
112 1.3 sakamoto void
113 1.4 junyoung cpu1(void)
114 1.1 sakamoto {
115 1.3 sakamoto while (1)
116 1.3 sakamoto cpu_ctr++;
117 1.1 sakamoto }
118 1.1 sakamoto
119 1.1 sakamoto volatile int CPU1_alive = 0;
120 1.1 sakamoto
121 1.1 sakamoto void
122 1.4 junyoung start_CPU1(void)
123 1.1 sakamoto {
124 1.1 sakamoto volatile long *key = (volatile long *)0x0080;
125 1.1 sakamoto
126 1.1 sakamoto CPU1_alive++;
127 1.1 sakamoto *key = 0;
128 1.1 sakamoto /* Wait for a kernel to load up a vector of where we should jump */
129 1.3 sakamoto while (*key == 0)
130 1.1 sakamoto delay(10);
131 1.3 sakamoto
132 1.3 sakamoto run(NULL, NULL, NULL, NULL, (void *)*key);
133 1.1 sakamoto }
134 1.1 sakamoto
135 1.1 sakamoto void
136 1.4 junyoung wait_for(volatile int *ptr)
137 1.1 sakamoto {
138 1.1 sakamoto int i;
139 1.1 sakamoto for (i = 0; i < 10; i++) {
140 1.1 sakamoto if (*ptr)
141 1.1 sakamoto return;
142 1.1 sakamoto delay(10);
143 1.1 sakamoto }
144 1.1 sakamoto printf("CPU #1 didn't start!\n");
145 1.1 sakamoto }
146