source: mainline/kernel/arch/sparc64/src/cpu/sun4u/cpu.c

Last change on this file was bab75df6, checked in by Jiri Svoboda <jiri@…>, 7 years ago

Let kernel code get printf via the standard stdio header. Clean up unused includes.

  • Property mode set to 100644
File size: 4.9 KB
Line 
1/*
2 * Copyright (c) 2005 Jakub Jermar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup kernel_sparc64
30 * @{
31 */
32/** @file
33 */
34
35#include <arch/cpu_family.h>
36#include <cpu.h>
37#include <arch.h>
38#include <genarch/ofw/ofw_tree.h>
39#include <arch/drivers/tick.h>
40#include <stdio.h>
41#include <arch/cpu_node.h>
42
43/**
44 * Finds out the clock frequency of the current CPU.
45 *
46 * @param node node representing the current CPU in the OFW tree
47 * @return clock frequency if "node" is the current CPU and no error
48 * occurs, -1 if "node" is not the current CPU or on error
49 */
50static int find_cpu_frequency(ofw_tree_node_t *node)
51{
52 ofw_tree_property_t *prop;
53 uint32_t mid;
54
55 /* 'upa-portid' for US, 'portid' for US-III, 'cpuid' for US-IV */
56 prop = ofw_tree_getprop(node, "upa-portid");
57 if ((!prop) || (!prop->value))
58 prop = ofw_tree_getprop(node, "portid");
59 if ((!prop) || (!prop->value))
60 prop = ofw_tree_getprop(node, "cpuid");
61
62 if (prop && prop->value) {
63 mid = *((uint32_t *) prop->value);
64 if (mid == CPU->arch.mid) {
65 prop = ofw_tree_getprop(node, "clock-frequency");
66 if (prop && prop->value) {
67 return *((uint32_t *) prop->value);
68 }
69 }
70 }
71
72 return -1;
73}
74
75/** Perform sparc64 specific initialization of the processor structure for the
76 * current processor.
77 */
78void cpu_arch_init(void)
79{
80 ofw_tree_node_t *node;
81 uint32_t clock_frequency = 0;
82
83 CPU->arch.mid = read_mid();
84
85 /*
86 * Detect processor frequency.
87 */
88 if (is_us() || is_us_iii()) {
89 node = ofw_tree_find_child_by_device_type(cpus_parent(), "cpu");
90 while (node) {
91 int f = find_cpu_frequency(node);
92 if (f != -1)
93 clock_frequency = (uint32_t) f;
94 node = ofw_tree_find_peer_by_device_type(node, "cpu");
95 }
96 } else if (is_us_iv()) {
97 node = ofw_tree_find_child(cpus_parent(), "cmp");
98 while (node) {
99 int f;
100 f = find_cpu_frequency(
101 ofw_tree_find_child(node, "cpu@0"));
102 if (f != -1)
103 clock_frequency = (uint32_t) f;
104 f = find_cpu_frequency(
105 ofw_tree_find_child(node, "cpu@1"));
106 if (f != -1)
107 clock_frequency = (uint32_t) f;
108 node = ofw_tree_find_peer_by_name(node, "cmp");
109 }
110 }
111
112 CPU->arch.clock_frequency = clock_frequency;
113 tick_init();
114}
115
116/** Read version information from the current processor. */
117void cpu_identify(void)
118{
119 CPU->arch.ver.value = ver_read();
120}
121
122/** Print version information for a processor.
123 *
124 * This function is called by the bootstrap processor.
125 *
126 * @param m Processor structure of the CPU for which version information is to
127 * be printed.
128 */
129void cpu_print_report(cpu_t *m)
130{
131 const char *manuf;
132 const char *impl;
133
134 switch (m->arch.ver.manuf) {
135 case MANUF_FUJITSU:
136 manuf = "Fujitsu";
137 break;
138 case MANUF_ULTRASPARC:
139 manuf = "UltraSPARC";
140 break;
141 case MANUF_SUN:
142 manuf = "Sun";
143 break;
144 default:
145 manuf = "Unknown";
146 break;
147 }
148
149 switch (CPU->arch.ver.impl) {
150 case IMPL_ULTRASPARCI:
151 impl = "UltraSPARC I";
152 break;
153 case IMPL_ULTRASPARCII:
154 impl = "UltraSPARC II";
155 break;
156 case IMPL_ULTRASPARCII_I:
157 impl = "UltraSPARC IIi";
158 break;
159 case IMPL_ULTRASPARCII_E:
160 impl = "UltraSPARC IIe";
161 break;
162 case IMPL_ULTRASPARCIII:
163 impl = "UltraSPARC III";
164 break;
165 case IMPL_ULTRASPARCIII_PLUS:
166 impl = "UltraSPARC III+";
167 break;
168 case IMPL_ULTRASPARCIII_I:
169 impl = "UltraSPARC IIIi";
170 break;
171 case IMPL_ULTRASPARCIV:
172 impl = "UltraSPARC IV";
173 break;
174 case IMPL_ULTRASPARCIV_PLUS:
175 impl = "UltraSPARC IV+";
176 break;
177 case IMPL_SPARC64V:
178 impl = "SPARC 64V";
179 break;
180 default:
181 impl = "Unknown";
182 break;
183 }
184
185 printf("cpu%d: manuf=%s, impl=%s, mask=%d (%d MHz)\n", m->id, manuf,
186 impl, m->arch.ver.mask, m->arch.clock_frequency / 1000000);
187}
188
189/** @}
190 */
Note: See TracBrowser for help on using the repository browser.