Changeset 965dc18 in mainline for boot/genarch
- Timestamp:
- 2008-12-05T19:59:03Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 49093a4
- Parents:
- 0258e67
- Location:
- boot/genarch
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/genarch/balloc.h
r0258e67 r965dc18 32 32 #include <types.h> 33 33 34 #define BALLOC_MAX_SIZE (1 024* 1024)34 #define BALLOC_MAX_SIZE (128 * 1024) 35 35 36 36 typedef struct { -
boot/genarch/ofw.c
r0258e67 r965dc18 49 49 halt(); 50 50 51 if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) 51 if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, 52 sizeof(ofw_stdout)) <= 0) 52 53 ofw_stdout = 0; 53 54 … … 58 59 } 59 60 60 if (ofw_get_property(ofw_chosen, "mmu", &ofw_mmu, sizeof(ofw_mmu)) <= 0) { 61 if (ofw_get_property(ofw_chosen, "mmu", &ofw_mmu, 62 sizeof(ofw_mmu)) <= 0) { 61 63 puts("\r\nError: Unable to get mmu property, halted.\r\n"); 62 64 halt(); 63 65 } 64 if (ofw_get_property(ofw_chosen, "memory", &ofw_memory_prop, sizeof(ofw_memory_prop)) <= 0) { 66 if (ofw_get_property(ofw_chosen, "memory", &ofw_memory_prop, 67 sizeof(ofw_memory_prop)) <= 0) { 65 68 puts("\r\nError: Unable to get memory property, halted.\r\n"); 66 69 halt(); … … 82 85 /** Perform a call to OpenFirmware client interface. 83 86 * 84 * @param service String identifying the service requested. 85 * @param nargs Number of input arguments. 86 * @param nret Number of output arguments. This includes the return value. 87 * @param rets Buffer for output arguments or NULL. The buffer must accommodate nret - 1 items. 88 * 89 * @return Return value returned by the client interface. 87 * @param service String identifying the service requested. 88 * @param nargs Number of input arguments. 89 * @param nret Number of output arguments. This includes the return 90 * value. 91 * @param rets Buffer for output arguments or NULL. The buffer must 92 * accommodate nret - 1 items. 93 * 94 * @return Return value returned by the client interface. 90 95 */ 91 unsigned long ofw_call(const char *service, const int nargs, const int nret, ofw_arg_t *rets, ...) 96 unsigned long 97 ofw_call(const char *service, const int nargs, const int nret, ofw_arg_t *rets, 98 ...) 92 99 { 93 100 va_list list; … … 120 127 } 121 128 122 int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen) 129 int 130 ofw_get_property(const phandle device, const char *name, void *buf, 131 const int buflen) 123 132 { 124 133 return ofw_call("getprop", 4, 1, NULL, device, name, buf, buflen); … … 145 154 146 155 if (ofw_get_property(device, "#address-cells", &ret, sizeof(ret)) <= 0) 147 if (ofw_get_property(ofw_root, "#address-cells", &ret, sizeof(ret)) <= 0) 156 if (ofw_get_property(ofw_root, "#address-cells", &ret, 157 sizeof(ret)) <= 0) 148 158 ret = OFW_ADDRESS_CELLS; 149 159 … … 157 167 158 168 if (ofw_get_property(device, "#size-cells", &ret, sizeof(ret)) <= 0) 159 if (ofw_get_property(ofw_root, "#size-cells", &ret, sizeof(ret)) <= 0) 169 if (ofw_get_property(ofw_root, "#size-cells", &ret, 170 sizeof(ret)) <= 0) 160 171 ret = OFW_SIZE_CELLS; 161 172 … … 193 204 int shift; 194 205 195 if (ofw_call("call-method", 3, 5, result, "translate", ofw_mmu, virt) != 0) { 206 if (ofw_call("call-method", 3, 5, result, "translate", ofw_mmu, 207 virt) != 0) { 196 208 puts("Error: MMU method translate() failed, halting.\n"); 197 209 halt(); … … 213 225 ofw_arg_t retaddr; 214 226 215 if (ofw_call("call-method", 5, 2, &retaddr, "claim", ofw_mmu, 0, len, virt) != 0) { 227 if (ofw_call("call-method", 5, 2, &retaddr, "claim", ofw_mmu, 0, len, 228 virt) != 0) { 216 229 puts("Error: MMU method claim() failed, halting.\n"); 217 230 halt(); … … 270 283 } 271 284 272 return ofw_call("call-method", 7, 1, NULL, "map", ofw_mmu, mode, size, virt,273 phys_hi, phys_lo);285 return ofw_call("call-method", 7, 1, NULL, "map", ofw_mmu, mode, size, 286 virt, phys_hi, phys_lo); 274 287 } 275 288 … … 282 295 int ofw_memmap(memmap_t *map) 283 296 { 284 unsigned int ac = ofw_get_address_cells(ofw_memory); 285 unsigned int sc = ofw_get_size_cells(ofw_memory); 286 287 uint32_t buf[((ac + sc) * MEMMAP_MAX_RECORDS)]; 297 unsigned int ac = ofw_get_address_cells(ofw_memory) / 298 (sizeof(uintptr_t) / sizeof(uint32_t)); 299 unsigned int sc = ofw_get_size_cells(ofw_memory) / 300 (sizeof(uintptr_t) / sizeof(uint32_t)); 301 printf("address cells: %d, size cells: %d. ", ac, sc); 302 303 uintptr_t buf[((ac + sc) * MEMMAP_MAX_RECORDS)]; 288 304 int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(buf)); 289 305 if (ret <= 0) /* ret is the number of written bytes */ … … 293 309 map->total = 0; 294 310 map->count = 0; 295 for (pos = 0; (pos < ret / sizeof(uint 32_t)) &&311 for (pos = 0; (pos < ret / sizeof(uintptr_t)) && 296 312 (map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) { 297 void * start = (void *) ((uintptr_t)buf[pos + ac - 1]);313 void *start = (void *) (buf[pos + ac - 1]); 298 314 unsigned int size = buf[pos + ac + sc - 1]; 299 315 316 /* 317 * This is a hot fix of the issue which occurs on machines 318 * where there are holes in the physical memory (such as 319 * SunBlade 1500). Should we detect a hole in the physical 320 * memory, we will ignore any memory detected behind 321 * the hole and pretend the hole does not exist. 322 */ 323 if ((map->count > 0) && (map->zones[map->count - 1].start + 324 map->zones[map->count - 1].size < start)) 325 break; 326 300 327 if (size > 0) { 301 328 map->zones[map->count].start = start; … … 309 336 } 310 337 311 312 338 int ofw_screen(screen_t *screen) 313 339 { … … 315 341 uint32_t virtaddr; 316 342 317 if (ofw_get_property(ofw_aliases, "screen", device_name, sizeof(device_name)) <= 0) 343 if (ofw_get_property(ofw_aliases, "screen", device_name, 344 sizeof(device_name)) <= 0) 318 345 return false; 319 346 … … 322 349 return false; 323 350 324 if (ofw_get_property(device, "address", &virtaddr, sizeof(virtaddr)) <= 0) 351 if (ofw_get_property(device, "address", &virtaddr, 352 sizeof(virtaddr)) <= 0) 325 353 return false; 326 354 327 355 screen->addr = (void *) ((uintptr_t) virtaddr); 328 356 329 if (ofw_get_property(device, "width", &screen->width, sizeof(screen->width)) <= 0) 330 return false; 331 332 if (ofw_get_property(device, "height", &screen->height, sizeof(screen->height)) <= 0) 333 return false; 334 335 if (ofw_get_property(device, "depth", &screen->bpp, sizeof(screen->bpp)) <= 0) 336 return false; 337 338 if (ofw_get_property(device, "linebytes", &screen->scanline, sizeof(screen->scanline)) <= 0) 357 if (ofw_get_property(device, "width", &screen->width, 358 sizeof(screen->width)) <= 0) 359 return false; 360 361 if (ofw_get_property(device, "height", &screen->height, 362 sizeof(screen->height)) <= 0) 363 return false; 364 365 if (ofw_get_property(device, "depth", &screen->bpp, 366 sizeof(screen->bpp)) <= 0) 367 return false; 368 369 if (ofw_get_property(device, "linebytes", &screen->scanline, 370 sizeof(screen->scanline)) <= 0) 339 371 return false; 340 372 -
boot/genarch/ofw_tree.c
r0258e67 r965dc18 121 121 memcpy(current_node->da_name, &path[i], len); 122 122 current_node->da_name[len] = '\0'; 123 124 123 125 124 /* … … 220 219 { 221 220 ofw_tree_node_t *root; 221 phandle ssm_node; 222 ofw_tree_node_t *ssm; 222 223 223 224 root = ofw_tree_node_alloc(); 224 225 if (root) 225 226 ofw_tree_node_process(root, NULL, ofw_root); 227 228 /* 229 * The firmware client interface does not automatically include the 230 * "ssm" node in the list of children of "/". A nasty yet working 231 * solution is to explicitly stick "ssm" to the OFW tree. 232 */ 233 ssm_node = ofw_find_device("/ssm@0,0"); 234 if (ssm_node != -1) { 235 ssm = ofw_tree_node_alloc(); 236 if (ssm) { 237 ofw_tree_node_process( 238 ssm, root, ofw_find_device("/ssm@0,0")); 239 ssm->peer = root->child; 240 root->child = ssm; 241 } 242 } 226 243 227 244 return root;
Note:
See TracChangeset
for help on using the changeset viewer.
