Rev 1977 | Rev 2071 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1977 | Rev 2048 | ||
---|---|---|---|
Line 231... | Line 231... | ||
231 | 231 | ||
232 | return ofw_call("call-method", 7, 1, NULL, "map", ofw_mmu, mode, size, virt, |
232 | return ofw_call("call-method", 7, 1, NULL, "map", ofw_mmu, mode, size, virt, |
233 | phys_hi, phys_lo); |
233 | phys_hi, phys_lo); |
234 | } |
234 | } |
235 | 235 | ||
- | 236 | /** Save OpenFirmware physical memory map. |
|
- | 237 | * |
|
- | 238 | * @param map Memory map structure where the map will be saved. |
|
236 | 239 | * |
|
- | 240 | * @return Zero on failure, non-zero on success. |
|
- | 241 | */ |
|
237 | int ofw_memmap(memmap_t *map) |
242 | int ofw_memmap(memmap_t *map) |
238 | { |
243 | { |
239 | unsigned int ac = ofw_get_address_cells(ofw_memory); |
244 | unsigned int ac = ofw_get_address_cells(ofw_memory); |
240 | unsigned int sc = ofw_get_size_cells(ofw_memory); |
245 | unsigned int sc = ofw_get_size_cells(ofw_memory); |
241 | 246 | ||
242 | uint32_t buf[((ac+sc)*MEMMAP_MAX_RECORDS)]; |
247 | uint32_t buf[((ac + sc) * MEMMAP_MAX_RECORDS)]; |
243 | int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(buf)); |
248 | int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(buf)); |
244 | if (ret <= 0) /* ret is the number of written bytes */ |
249 | if (ret <= 0) /* ret is the number of written bytes */ |
245 | return false; |
250 | return false; |
246 | 251 | ||
247 | int pos; |
252 | int pos; |
248 | map->total = 0; |
253 | map->total = 0; |
249 | map->count = 0; |
254 | map->count = 0; |
250 | for (pos = 0; (pos < ret / sizeof(uint32_t)) && (map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) { |
255 | for (pos = 0; (pos < ret / sizeof(uint32_t)) && (map->count < |
- | 256 | MEMMAP_MAX_RECORDS); pos += ac + sc) { |
|
251 | void * start = (void *) ((uintptr_t) buf[pos + ac - 1]); |
257 | void * start = (void *) ((uintptr_t) buf[pos + ac - 1]); |
252 | unsigned int size = buf[pos + ac + sc - 1]; |
258 | unsigned int size = buf[pos + ac + sc - 1]; |
253 | 259 | ||
254 | if (size > 0) { |
260 | if (size > 0) { |
255 | map->zones[map->count].start = start; |
261 | map->zones[map->count].start = start; |