source: mainline/kernel/arch/sparc64/src/cpu/cpu.c@ 2e915f2

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 2e915f2 was 2057572, checked in by Jakub Jermar <jakub@…>, 18 years ago

The Ultimate Solution To Illegal Virtual Aliases.
It is better to avoid them completely than to fight them.
Switch the sparc64 port to 16K pages. The TLBs and TSBs
continue to operate with 8K pages only. Page tables and
other generic parts operate with 16K pages.

Because the MMU doesn't support 16K directly, each 16K
page is emulated by a pair of 8K pages. With 16K pages,
illegal aliases cannot be created in 16K D-cache.

  • Property mode set to 100644
File size: 3.7 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 sparc64
30 * @{
31 */
32/** @file
33 */
34
35#include <cpu.h>
36#include <arch.h>
37#include <genarch/ofw/ofw_tree.h>
38#include <arch/drivers/tick.h>
39#include <print.h>
40
41/** Perform sparc64 specific initialization of the processor structure for the
42 * current processor.
43 */
44void cpu_arch_init(void)
45{
46 ofw_tree_node_t *node;
47 uint32_t mid;
48 uint32_t clock_frequency = 0;
49 upa_config_t upa_config;
50
51 upa_config.value = upa_config_read();
52 CPU->arch.mid = upa_config.mid;
53
54 /*
55 * Detect processor frequency.
56 */
57 node = ofw_tree_find_child_by_device_type(ofw_tree_lookup("/"), "cpu");
58 while (node) {
59 ofw_tree_property_t *prop;
60
61 prop = ofw_tree_getprop(node, "upa-portid");
62 if (prop && prop->value) {
63 mid = *((uint32_t *) prop->value);
64 if (mid == CPU->arch.mid) {
65 prop = ofw_tree_getprop(node,
66 "clock-frequency");
67 if (prop && prop->value)
68 clock_frequency = *((uint32_t *)
69 prop->value);
70 }
71 }
72 node = ofw_tree_find_peer_by_device_type(node, "cpu");
73 }
74
75 CPU->arch.clock_frequency = clock_frequency;
76 tick_init();
77}
78
79/** Read version information from the current processor. */
80void cpu_identify(void)
81{
82 CPU->arch.ver.value = ver_read();
83}
84
85/** Print version information for a processor.
86 *
87 * This function is called by the bootstrap processor.
88 *
89 * @param m Processor structure of the CPU for which version information is to
90 * be printed.
91 */
92void cpu_print_report(cpu_t *m)
93{
94 char *manuf, *impl;
95
96 switch (m->arch.ver.manuf) {
97 case MANUF_FUJITSU:
98 manuf = "Fujitsu";
99 break;
100 case MANUF_ULTRASPARC:
101 manuf = "UltraSPARC";
102 break;
103 case MANUF_SUN:
104 manuf = "Sun";
105 break;
106 default:
107 manuf = "Unknown";
108 break;
109 }
110
111 switch (CPU->arch.ver.impl) {
112 case IMPL_ULTRASPARCI:
113 impl = "UltraSPARC I";
114 break;
115 case IMPL_ULTRASPARCII:
116 impl = "UltraSPARC II";
117 break;
118 case IMPL_ULTRASPARCII_I:
119 impl = "UltraSPARC IIi";
120 break;
121 case IMPL_ULTRASPARCII_E:
122 impl = "UltraSPARC IIe";
123 break;
124 case IMPL_ULTRASPARCIII:
125 impl = "UltraSPARC III";
126 break;
127 case IMPL_ULTRASPARCIV_PLUS:
128 impl = "UltraSPARC IV+";
129 break;
130 case IMPL_SPARC64V:
131 impl = "SPARC 64V";
132 break;
133 default:
134 impl = "Unknown";
135 break;
136 }
137
138 printf("cpu%d: manuf=%s, impl=%s, mask=%d (%dMHz)\n", m->id, manuf,
139 impl, m->arch.ver.mask, m->arch.clock_frequency / 1000000);
140}
141
142/** @}
143 */
Note: See TracBrowser for help on using the repository browser.