Rev 3742 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3742 | Rev 3743 | ||
|---|---|---|---|
| Line 54... | Line 54... | ||
| 54 | char *timestamp = "\nBuilt on " TIMESTAMP; |
54 | char *timestamp = "\nBuilt on " TIMESTAMP; |
| 55 | #else |
55 | #else |
| 56 | char *timestamp = ""; |
56 | char *timestamp = ""; |
| 57 | #endif |
57 | #endif |
| 58 | 58 | ||
| 59 | /** UltraSPARC subarchitecture - 1 for US, 3 for US3 */ |
59 | /** UltraSPARC subarchitecture - 1 for US, 3 for US3, 0 for other */ |
| 60 | uint8_t subarchitecture; |
60 | uint8_t subarchitecture = 0; |
| 61 | 61 | ||
| 62 | /** |
62 | /** |
| 63 | * mask of the MID field inside the ICBUS_CONFIG register shifted by |
63 | * mask of the MID field inside the ICBUS_CONFIG register shifted by |
| 64 | * MID_SHIFT bits to the right |
64 | * MID_SHIFT bits to the right |
| 65 | */ |
65 | */ |
| Line 80... | Line 80... | ||
| 80 | #define LAST_US3_CPU 0x19 |
80 | #define LAST_US3_CPU 0x19 |
| 81 | 81 | ||
| 82 | /* UltraSPARC IIIi processor implementation code */ |
82 | /* UltraSPARC IIIi processor implementation code */ |
| 83 | #define US_IIIi_CODE 0x15 |
83 | #define US_IIIi_CODE 0x15 |
| 84 | 84 | ||
| - | 85 | /* max. length of the "compatible" property of the root node */ |
|
| - | 86 | #define COMPATIBLE_PROP_MAXLEN 64 |
|
| - | 87 | ||
| - | 88 | /* |
|
| - | 89 | * HelenOS bootloader will use these constants to distinguish particular |
|
| - | 90 | * UltraSPARC architectures |
|
| - | 91 | */ |
|
| - | 92 | #define COMPATIBLE_SUN4U 10 |
|
| - | 93 | #define COMPATIBLE_SUN4V 20 |
|
| - | 94 | ||
| - | 95 | /** US architecture. COMPATIBLE_SUN4U for sun4v, COMPATIBLE_SUN4V for sun4u */ |
|
| - | 96 | static uint8_t architecture; |
|
| - | 97 | ||
| 85 | /** |
98 | /** |
| - | 99 | * Detects the UltraSPARC architecture (sun4u and sun4v currently supported) |
|
| - | 100 | * by inspecting the property called "compatible" in the OBP root node. |
|
| - | 101 | */ |
|
| - | 102 | static void detect_architecture(void) |
|
| - | 103 | { |
|
| - | 104 | phandle root = ofw_find_device("/"); |
|
| - | 105 | char compatible[COMPATIBLE_PROP_MAXLEN]; |
|
| - | 106 | ||
| - | 107 | if (ofw_get_property(root, "compatible", compatible, |
|
| - | 108 | COMPATIBLE_PROP_MAXLEN) <= 0) { |
|
| - | 109 | printf("Unable to determine architecture, default: sun4u.\n"); |
|
| - | 110 | architecture = COMPATIBLE_SUN4U; |
|
| - | 111 | return; |
|
| - | 112 | } |
|
| - | 113 | ||
| - | 114 | if (strcmp(compatible, "sun4v") == 0) { |
|
| - | 115 | architecture = COMPATIBLE_SUN4V; |
|
| - | 116 | } else { |
|
| - | 117 | /* |
|
| - | 118 | * As not all sun4u machines have "sun4u" in their "compatible" |
|
| - | 119 | * OBP property (e.g. Serengeti's OBP "compatible" property is |
|
| - | 120 | * "SUNW,Serengeti"), we will by default fallback to sun4u if |
|
| - | 121 | * an unknown value of the "compatible" property is encountered. |
|
| - | 122 | */ |
|
| - | 123 | architecture = COMPATIBLE_SUN4U; |
|
| - | 124 | } |
|
| - | 125 | } |
|
| - | 126 | ||
| - | 127 | /** |
|
| - | 128 | * Detects the subarchitecture (US, US3) of the sun4u |
|
| 86 | * Sets the global variables "subarchitecture" and "mid_mask" to |
129 | * processor. Sets the global variables "subarchitecture" and "mid_mask" to |
| 87 | * correct values. |
130 | * correct values. |
| 88 | */ |
131 | */ |
| 89 | static void detect_subarchitecture(void) |
132 | static void detect_subarchitecture(void) |
| 90 | { |
133 | { |
| 91 | uint64_t v; |
134 | uint64_t v; |
| Line 104... | Line 147... | ||
| 104 | } else { |
147 | } else { |
| 105 | printf("\nThis CPU is not supported by HelenOS."); |
148 | printf("\nThis CPU is not supported by HelenOS."); |
| 106 | } |
149 | } |
| 107 | } |
150 | } |
| 108 | 151 | ||
| - | 152 | /** |
|
| - | 153 | * Performs sun4u-specific initialization. The components are expected |
|
| - | 154 | * to be already copied and boot allocator initialized. |
|
| - | 155 | */ |
|
| - | 156 | static void bootstrap_sun4u(void) |
|
| - | 157 | { |
|
| - | 158 | printf("\nCanonizing OpenFirmware device tree..."); |
|
| - | 159 | bootinfo.ofw_root = ofw_tree_build(); |
|
| - | 160 | printf("done.\n"); |
|
| - | 161 | ||
| - | 162 | detect_subarchitecture(); |
|
| - | 163 | ||
| - | 164 | #ifdef CONFIG_SMP |
|
| - | 165 | printf("\nChecking for secondary processors..."); |
|
| - | 166 | if (!ofw_cpu()) |
|
| - | 167 | printf("Error: unable to get CPU properties\n"); |
|
| - | 168 | printf("done.\n"); |
|
| - | 169 | #endif |
|
| - | 170 | ||
| - | 171 | setup_palette(); |
|
| - | 172 | } |
|
| - | 173 | ||
| - | 174 | /** |
|
| - | 175 | * Performs sun4v-specific initialization. The components are expected |
|
| - | 176 | * to be already copied and boot allocator initialized. |
|
| - | 177 | */ |
|
| - | 178 | static void bootstrap_sun4v(void) |
|
| - | 179 | { |
|
| - | 180 | } |
|
| - | 181 | ||
| 109 | void bootstrap(void) |
182 | void bootstrap(void) |
| 110 | { |
183 | { |
| 111 | void *base = (void *) KERNEL_VIRTUAL_ADDRESS; |
184 | void *base = (void *) KERNEL_VIRTUAL_ADDRESS; |
| 112 | void *balloc_base; |
185 | void *balloc_base; |
| 113 | unsigned int top = 0; |
186 | unsigned int top = 0; |
| 114 | int i, j; |
187 | int i, j; |
| 115 | 188 | ||
| 116 | version_print(); |
- | |
| 117 | - | ||
| 118 | detect_subarchitecture(); |
189 | detect_architecture(); |
| 119 | init_components(components); |
190 | init_components(components); |
| 120 | 191 | ||
| 121 | if (!ofw_get_physmem_start(&bootinfo.physmem_start)) { |
192 | if (!ofw_get_physmem_start(&bootinfo.physmem_start)) { |
| 122 | printf("Error: unable to get start of physical memory.\n"); |
193 | printf("Error: unable to get start of physical memory.\n"); |
| 123 | halt(); |
194 | halt(); |
| Line 254... | Line 325... | ||
| 254 | (void) ofw_claim_phys(bootinfo.physmem_start + balloc_base, |
325 | (void) ofw_claim_phys(bootinfo.physmem_start + balloc_base, |
| 255 | BALLOC_MAX_SIZE); |
326 | BALLOC_MAX_SIZE); |
| 256 | (void) ofw_map(balloc_base, balloc_base, BALLOC_MAX_SIZE, -1); |
327 | (void) ofw_map(balloc_base, balloc_base, BALLOC_MAX_SIZE, -1); |
| 257 | balloc_init(&bootinfo.ballocs, (uintptr_t)balloc_base); |
328 | balloc_init(&bootinfo.ballocs, (uintptr_t)balloc_base); |
| 258 | 329 | ||
| 259 | printf("\nCanonizing OpenFirmware device tree..."); |
330 | /* perform architecture-specific initialization */ |
| 260 | bootinfo.ofw_root = ofw_tree_build(); |
331 | if (architecture == COMPATIBLE_SUN4U) { |
| 261 | printf("done.\n"); |
332 | bootstrap_sun4u(); |
| 262 | - | ||
| 263 | #ifdef CONFIG_SMP |
- | |
| 264 | printf("\nChecking for secondary processors..."); |
333 | } else if (architecture == COMPATIBLE_SUN4V) { |
| 265 | if (!ofw_cpu()) |
334 | bootstrap_sun4v(); |
| 266 | printf("Error: unable to get CPU properties\n"); |
335 | } else { |
| 267 | printf("done.\n"); |
336 | printf("Unknown architecture.\n"); |
| 268 | #endif |
337 | halt(); |
| 269 | 338 | } |
|
| 270 | setup_palette(); |
- | |
| 271 | 339 | ||
| 272 | printf("\nBooting the kernel...\n"); |
340 | printf("\nBooting the kernel...\n"); |
| 273 | jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, |
341 | jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, |
| 274 | bootinfo.physmem_start | BSP_PROCESSOR, &bootinfo, |
342 | bootinfo.physmem_start | BSP_PROCESSOR, &bootinfo, |
| 275 | sizeof(bootinfo)); |
343 | sizeof(bootinfo)); |