Changeset 965dc18 in mainline for boot/genarch/ofw.c
- 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
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.