Rev 3343 | Rev 3618 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3343 | Rev 3607 | ||
---|---|---|---|
Line 279... | Line 279... | ||
279 | * |
279 | * |
280 | * @return Zero on failure, non-zero on success. |
280 | * @return Zero on failure, non-zero on success. |
281 | */ |
281 | */ |
282 | int ofw_memmap(memmap_t *map) |
282 | int ofw_memmap(memmap_t *map) |
283 | { |
283 | { |
284 | unsigned int ac = ofw_get_address_cells(ofw_memory); |
284 | unsigned int ac = ofw_get_address_cells(ofw_memory) / |
- | 285 | (sizeof(uintptr_t) / sizeof(uint32_t)); |
|
285 | unsigned int sc = ofw_get_size_cells(ofw_memory); |
286 | unsigned int sc = ofw_get_size_cells(ofw_memory) / |
- | 287 | (sizeof(uintptr_t) / sizeof(uint32_t)); |
|
- | 288 | printf("address cells: %d, size cells: %d. ", ac, sc); |
|
286 | 289 | ||
287 | uint32_t buf[((ac + sc) * MEMMAP_MAX_RECORDS)]; |
290 | uintptr_t buf[((ac + sc) * MEMMAP_MAX_RECORDS)]; |
288 | int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(buf)); |
291 | int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(buf)); |
289 | if (ret <= 0) /* ret is the number of written bytes */ |
292 | if (ret <= 0) /* ret is the number of written bytes */ |
290 | return false; |
293 | return false; |
291 | 294 | ||
292 | int pos; |
295 | int pos; |
293 | map->total = 0; |
296 | map->total = 0; |
294 | map->count = 0; |
297 | map->count = 0; |
295 | for (pos = 0; (pos < ret / sizeof(uint32_t)) && |
298 | for (pos = 0; (pos < ret / sizeof(uintptr_t)) && |
296 | (map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) { |
299 | (map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) { |
297 | void * start = (void *) ((uintptr_t) buf[pos + ac - 1]); |
300 | void *start = (void *) (buf[pos + ac - 1]); |
298 | unsigned int size = buf[pos + ac + sc - 1]; |
301 | unsigned int size = buf[pos + ac + sc - 1]; |
- | 302 | ||
299 | 303 | /* |
|
- | 304 | * This is a hot fix of the issue which occurs on machines where there are |
|
- | 305 | * holes in the physical memory (such as SunBlade 1500). Should we detect a |
|
- | 306 | * hole in the physical memory, we will ignore any memory detected behind |
|
- | 307 | * the hole and pretend the hole does not exist. |
|
- | 308 | */ |
|
- | 309 | if ((map->count > 0) && |
|
- | 310 | (map->zones[map->count - 1].start + map->zones[map->count - 1].size |
|
- | 311 | < start)) |
|
- | 312 | break; |
|
- | 313 | ||
300 | if (size > 0) { |
314 | if (size > 0) { |
301 | map->zones[map->count].start = start; |
315 | map->zones[map->count].start = start; |
302 | map->zones[map->count].size = size; |
316 | map->zones[map->count].size = size; |
303 | map->count++; |
317 | map->count++; |
304 | map->total += size; |
318 | map->total += size; |
Line 306... | Line 320... | ||
306 | } |
320 | } |
307 | 321 | ||
308 | return true; |
322 | return true; |
309 | } |
323 | } |
310 | 324 | ||
311 | - | ||
312 | int ofw_screen(screen_t *screen) |
325 | int ofw_screen(screen_t *screen) |
313 | { |
326 | { |
314 | char device_name[BUF_SIZE]; |
327 | char device_name[BUF_SIZE]; |
315 | uint32_t virtaddr; |
328 | uint32_t virtaddr; |
316 | 329 |