static int fb_of_reserve_fixup(struct device_node *root, void *context) { struct fb_info *info = context; if (!info->enabled) return 0; of_add_reserve_entry((unsigned long)info->screen_base, (unsigned long)info->screen_base + info->screen_size); return 0; }
static int __do_bootm_linux(struct image_data *data, int swap) { unsigned long kernel; unsigned long initrd_start = 0, initrd_size = 0, initrd_end = 0; struct memory_bank *bank; unsigned long load_address; if (data->os_res) { load_address = data->os_res->start; } else if (data->os_address != UIMAGE_INVALID_ADDRESS) { load_address = data->os_address; } else { bank = list_first_entry(&memory_banks, struct memory_bank, list); load_address = bank->start + SZ_32K; if (bootm_verbose(data)) printf("no os load address, defaulting to 0x%08lx\n", load_address); } if (!data->os_res && data->os) { data->os_res = uimage_load_to_sdram(data->os, data->os_num, load_address); if (!data->os_res) return -ENOMEM; } if (!data->os_res) { data->os_res = file_to_sdram(data->os_file, load_address); if (!data->os_res) return -ENOMEM; } kernel = data->os_res->start + data->os_entry; initrd_start = data->initrd_address; if (data->initrd_file && initrd_start == UIMAGE_INVALID_ADDRESS) { initrd_start = data->os_res->start + SZ_8M; if (bootm_verbose(data)) { printf("no initrd load address, defaulting to 0x%08lx\n", initrd_start); } } if (data->initrd) { data->initrd_res = uimage_load_to_sdram(data->initrd, data->initrd_num, initrd_start); if (!data->initrd_res) return -ENOMEM; } else if (data->initrd_file) { data->initrd_res = file_to_sdram(data->initrd_file, initrd_start); if (!data->initrd_res) return -ENOMEM; } if (data->initrd_res) { initrd_start = data->initrd_res->start; initrd_end = data->initrd_res->end; initrd_size = resource_size(data->initrd_res); } if (IS_ENABLED(CONFIG_OFTREE) && data->of_root_node) { of_add_initrd(data->of_root_node, initrd_start, initrd_end); if (initrd_end) of_add_reserve_entry(initrd_start, initrd_end); data->oftree = of_get_fixed_tree(data->of_root_node); fdt_add_reserve_map(data->oftree); of_print_cmdline(data->of_root_node); if (bootm_verbose(data) > 1) of_print_nodes(data->of_root_node, 0); } if (bootm_verbose(data)) { printf("\nStarting kernel at 0x%08lx", kernel); if (initrd_size) printf(", initrd at 0x%08lx", initrd_start); if (data->oftree) printf(", oftree at 0x%p", data->oftree); printf("...\n"); } start_linux((void *)kernel, swap, initrd_start, initrd_size, data->oftree); reset_cpu(0); return -ERESTARTSYS; }