Lines Matching +full:- +full:- +full:enable +full:- +full:fdt
4 * Copyright (c) 2006-2007 CodeSourcery.
12 #include "qemu/error-report.h"
16 #include "hw/arm/linux-boot-if.h"
29 #include "qemu/config-file.h"
57 if (arm_feature(&cpu->env, ARM_FEATURE_EL3) && info->secure_boot) { in arm_boot_address_space()
67 { 0x580000c0 }, /* ldr x0, arg ; Load the lower 32-bits of DTB */
71 { 0x58000084 }, /* ldr x4, entry ; Load the lower 32-bits of kernel entry */
73 { 0, FIXUP_ARGPTR_LO }, /* arg: .word @DTB Lower 32-bits */
74 { 0, FIXUP_ARGPTR_HI}, /* .word @DTB Higher 32-bits */
75 { 0, FIXUP_ENTRYPOINT_LO }, /* entry: .word @Kernel Entry Lower 32-bits */
76 { 0, FIXUP_ENTRYPOINT_HI }, /* .word @Kernel Entry Higher 32-bits */
80 /* A very small bootloader: call the board-setup code (if needed),
81 * set r0-r2, then jump to the kernel.
88 { 0xe51ff004 }, /* ldr pc, [pc, #-4] */
122 { 0xe5821000 }, /* str r1, [r2] - set GICC_CTLR.Enable */
124 { 0xe5821004 }, /* str r1, [r2, 4] - set GIC_PMR.Priority to 0xff */
193 fixupcontext[FIXUP_GIC_CPU_IF] = info->gic_cpu_if_addr; in default_write_secondary()
194 fixupcontext[FIXUP_BOOTREG] = info->smp_bootreg_addr; in default_write_secondary()
195 if (arm_feature(&cpu->env, ARM_FEATURE_V7)) { in default_write_secondary()
201 arm_write_bootloader("smpboot", as, info->smp_loader_start, in default_write_secondary()
233 0xe3800031, /* orr r0, #0x31 ;enable AW, FW, NS */ in arm_write_secure_board_setup_dummy_smc()
244 assert((mvbar_addr + sizeof(mvbar_blob) <= info->board_setup_addr) in arm_write_secure_board_setup_dummy_smc()
245 || (info->board_setup_addr + sizeof(board_setup_blob) <= mvbar_addr)); in arm_write_secure_board_setup_dummy_smc()
250 rom_add_blob_fixed_as("board-setup-mvbar", mvbar_blob, sizeof(mvbar_blob), in arm_write_secure_board_setup_dummy_smc()
256 rom_add_blob_fixed_as("board-setup", board_setup_blob, in arm_write_secure_board_setup_dummy_smc()
257 sizeof(board_setup_blob), info->board_setup_addr, as); in arm_write_secure_board_setup_dummy_smc()
266 address_space_stl_notdirty(as, info->smp_bootreg_addr, in default_reset_secondary()
268 cpu_set_pc(cs, info->smp_loader_start); in default_reset_secondary()
273 return info->dtb_filename || info->get_dtb; in have_dtb()
284 int initrd_size = info->initrd_size; in set_kernel_args()
285 hwaddr base = info->loader_start; in set_kernel_args()
299 WRITE_WORD(p, info->ram_size); in set_kernel_args()
300 WRITE_WORD(p, info->loader_start); in set_kernel_args()
305 WRITE_WORD(p, info->initrd_start); in set_kernel_args()
308 if (info->kernel_cmdline && *info->kernel_cmdline) { in set_kernel_args()
312 cmdline_size = strlen(info->kernel_cmdline); in set_kernel_args()
314 info->kernel_cmdline, cmdline_size + 1); in set_kernel_args()
320 if (info->atag_board) { in set_kernel_args()
325 atag_board_len = (info->atag_board(info, atag_board_buf) + 3) & ~3; in set_kernel_args()
342 int initrd_size = info->initrd_size; in set_kernel_args_old()
343 hwaddr base = info->loader_start; in set_kernel_args_old()
345 /* see linux/include/asm-arm/setup.h */ in set_kernel_args_old()
350 WRITE_WORD(p, info->ram_size / 4096); in set_kernel_args_old()
384 WRITE_WORD(p, info->initrd_start); in set_kernel_args_old()
404 s = info->kernel_cmdline; in set_kernel_args_old()
412 static int fdt_add_memory_node(void *fdt, uint32_t acells, hwaddr mem_base, in fdt_add_memory_node() argument
420 qemu_fdt_add_subnode(fdt, nodename); in fdt_add_memory_node()
421 qemu_fdt_setprop_string(fdt, nodename, "device_type", "memory"); in fdt_add_memory_node()
422 ret = qemu_fdt_setprop_sized_cells(fdt, nodename, "reg", acells, mem_base, in fdt_add_memory_node()
430 ret = qemu_fdt_setprop_cell(fdt, nodename, in fdt_add_memory_node()
431 "numa-node-id", numa_node_id); in fdt_add_memory_node()
438 static void fdt_add_psci_node(void *fdt, ARMCPU *armcpu) in fdt_add_psci_node() argument
449 "psci-conduit", in fdt_add_psci_node()
465 * A pre-existing /psci node might specify function ID values in fdt_add_psci_node()
469 rc = fdt_path_offset(fdt, "/psci"); in fdt_add_psci_node()
471 qemu_fdt_nop_node(fdt, "/psci"); in fdt_add_psci_node()
474 qemu_fdt_add_subnode(fdt, "/psci"); in fdt_add_psci_node()
475 if (armcpu->psci_version >= QEMU_PSCI_VERSION_0_2) { in fdt_add_psci_node()
476 if (armcpu->psci_version < QEMU_PSCI_VERSION_1_0) { in fdt_add_psci_node()
477 const char comp[] = "arm,psci-0.2\0arm,psci"; in fdt_add_psci_node()
478 qemu_fdt_setprop(fdt, "/psci", "compatible", comp, sizeof(comp)); in fdt_add_psci_node()
480 const char comp[] = "arm,psci-1.0\0arm,psci-0.2\0arm,psci"; in fdt_add_psci_node()
481 qemu_fdt_setprop(fdt, "/psci", "compatible", comp, sizeof(comp)); in fdt_add_psci_node()
485 if (arm_feature(&armcpu->env, ARM_FEATURE_AARCH64)) { in fdt_add_psci_node()
495 qemu_fdt_setprop_string(fdt, "/psci", "compatible", "arm,psci"); in fdt_add_psci_node()
508 qemu_fdt_setprop_string(fdt, "/psci", "method", psci_method); in fdt_add_psci_node()
510 qemu_fdt_setprop_cell(fdt, "/psci", "cpu_suspend", cpu_suspend_fn); in fdt_add_psci_node()
511 qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off", cpu_off_fn); in fdt_add_psci_node()
512 qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on", cpu_on_fn); in fdt_add_psci_node()
513 qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn); in fdt_add_psci_node()
520 void *fdt = NULL; in arm_load_dtb() local
528 if (binfo->dtb_filename) { in arm_load_dtb()
530 filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, binfo->dtb_filename); in arm_load_dtb()
532 fprintf(stderr, "Couldn't open dtb file %s\n", binfo->dtb_filename); in arm_load_dtb()
536 fdt = load_device_tree(filename, &size); in arm_load_dtb()
537 if (!fdt) { in arm_load_dtb()
544 fdt = binfo->get_dtb(binfo, &size); in arm_load_dtb()
545 if (!fdt) { in arm_load_dtb()
551 if (addr_limit > addr && size > (addr_limit - addr)) { in arm_load_dtb()
556 g_free(fdt); in arm_load_dtb()
560 acells = qemu_fdt_getprop_cell(fdt, "/", "#address-cells", in arm_load_dtb()
562 scells = qemu_fdt_getprop_cell(fdt, "/", "#size-cells", in arm_load_dtb()
565 fprintf(stderr, "dtb file invalid (#address-cells or #size-cells 0)\n"); in arm_load_dtb()
569 if (scells < 2 && binfo->ram_size >= 4 * GiB) { in arm_load_dtb()
578 /* nop all root nodes matching /memory or /memory@unit-address */ in arm_load_dtb()
579 node_path = qemu_fdt_node_unit_path(fdt, "memory", &err); in arm_load_dtb()
586 qemu_fdt_nop_node(fdt, node_path[n]); in arm_load_dtb()
601 if (ms->numa_state != NULL && ms->numa_state->num_nodes > 0) { in arm_load_dtb()
602 mem_base = binfo->loader_start; in arm_load_dtb()
603 for (i = 0; i < ms->numa_state->num_nodes; i++) { in arm_load_dtb()
604 mem_len = ms->numa_state->nodes[i].node_mem; in arm_load_dtb()
609 rc = fdt_add_memory_node(fdt, acells, mem_base, in arm_load_dtb()
620 rc = fdt_add_memory_node(fdt, acells, binfo->loader_start, in arm_load_dtb()
621 scells, binfo->ram_size, -1); in arm_load_dtb()
624 binfo->loader_start); in arm_load_dtb()
629 rc = fdt_path_offset(fdt, "/chosen"); in arm_load_dtb()
631 qemu_fdt_add_subnode(fdt, "/chosen"); in arm_load_dtb()
634 if (ms->kernel_cmdline && *ms->kernel_cmdline) { in arm_load_dtb()
635 rc = qemu_fdt_setprop_string(fdt, "/chosen", "bootargs", in arm_load_dtb()
636 ms->kernel_cmdline); in arm_load_dtb()
643 if (binfo->initrd_size) { in arm_load_dtb()
644 rc = qemu_fdt_setprop_sized_cells(fdt, "/chosen", "linux,initrd-start", in arm_load_dtb()
645 acells, binfo->initrd_start); in arm_load_dtb()
647 fprintf(stderr, "couldn't set /chosen/linux,initrd-start\n"); in arm_load_dtb()
651 rc = qemu_fdt_setprop_sized_cells(fdt, "/chosen", "linux,initrd-end", in arm_load_dtb()
653 binfo->initrd_start + in arm_load_dtb()
654 binfo->initrd_size); in arm_load_dtb()
656 fprintf(stderr, "couldn't set /chosen/linux,initrd-end\n"); in arm_load_dtb()
661 fdt_add_psci_node(fdt, cpu); in arm_load_dtb()
663 if (binfo->modify_dtb) { in arm_load_dtb()
664 binfo->modify_dtb(binfo, fdt); in arm_load_dtb()
670 rom_add_blob_fixed_as("dtb", fdt, size, addr, as); in arm_load_dtb()
674 if (fdt != ms->fdt) { in arm_load_dtb()
675 g_free(ms->fdt); in arm_load_dtb()
676 ms->fdt = fdt; in arm_load_dtb()
682 g_free(fdt); in arm_load_dtb()
683 return -1; in arm_load_dtb()
690 CPUARMState *env = &cpu->env; in do_cpu_reset()
691 const struct arm_boot_info *info = env->boot_info; in do_cpu_reset()
695 if (!info->is_linux) { in do_cpu_reset()
698 uint64_t entry = info->entry; in do_cpu_reset()
700 switch (info->endianness) { in do_cpu_reset()
702 env->cp15.sctlr_el[1] &= ~SCTLR_E0E; in do_cpu_reset()
704 env->cp15.sctlr_el[i] &= ~SCTLR_EE; in do_cpu_reset()
706 env->uncached_cpsr &= ~CPSR_E; in do_cpu_reset()
709 env->cp15.sctlr_el[1] |= SCTLR_E0E; in do_cpu_reset()
711 env->cp15.sctlr_el[i] |= SCTLR_EE; in do_cpu_reset()
713 env->uncached_cpsr |= CPSR_E; in do_cpu_reset()
716 env->cp15.sctlr_el[1] |= SCTLR_B; in do_cpu_reset()
728 * - AArch64 NS EL2 or NS EL1 in do_cpu_reset()
729 * - AArch32 Secure SVC (EL3) in do_cpu_reset()
730 * - AArch32 NS Hyp (EL2) in do_cpu_reset()
731 * - AArch32 NS SVC (EL1) in do_cpu_reset()
737 if (env->aarch64) { in do_cpu_reset()
742 assert(!info->secure_boot); in do_cpu_reset()
743 assert(!info->secure_board_setup); in do_cpu_reset()
746 (info->secure_boot || in do_cpu_reset()
747 (info->secure_board_setup && cs == first_cpu))) { in do_cpu_reset()
758 cpu_set_pc(cs, info->loader_start); in do_cpu_reset()
767 } else if (info->secondary_cpu_reset_hook) { in do_cpu_reset()
768 info->secondary_cpu_reset_hook(cpu, info); in do_cpu_reset()
785 if (albifc->arm_linux_init) { in do_arm_linux_init()
786 albifc->arm_linux_init(albif, info->secure_boot); in do_arm_linux_init()
807 load_elf_hdr(info->kernel_filename, &elf_header, &elf_is64, &err); in arm_load_elf()
814 return -1; in arm_load_elf()
819 info->endianness = elf_data_order == ELFDATA2MSB ? ARM_ENDIANNESS_BE8 in arm_load_elf()
825 info->endianness = ARM_ENDIANNESS_BE8; in arm_load_elf()
827 info->endianness = ARM_ENDIANNESS_BE32; in arm_load_elf()
828 /* In BE32, the CPU has a different view of the per-byte in arm_load_elf()
831 * the CPU's per-word byte-reversed view of the world. QEMU in arm_load_elf()
838 info->endianness = ARM_ENDIANNESS_LE; in arm_load_elf()
842 ret = load_elf_as(info->kernel_filename, NULL, NULL, NULL, in arm_load_elf()
848 info->kernel_filename, load_elf_strerror(ret)); in arm_load_elf()
872 return -1; in load_aarch64_image()
879 return -1; in load_aarch64_image()
883 /* check the arm64 magic header value -- very old kernels may not have it */ in load_aarch64_image()
890 * is only valid if the image_size is non-zero. in load_aarch64_image()
946 uint64_t ram_end = info->loader_start + info->ram_size; in arm_setup_direct_kernel_boot()
948 if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) { in arm_setup_direct_kernel_boot()
953 if (!info->write_board_setup) { in arm_setup_direct_kernel_boot()
965 * the DTB there like we do for images loaded with -bios or -pflash. in arm_setup_direct_kernel_boot()
967 if (image_low_addr > info->loader_start in arm_setup_direct_kernel_boot()
968 || image_high_addr < info->loader_start) { in arm_setup_direct_kernel_boot()
973 if (image_low_addr < info->loader_start) { in arm_setup_direct_kernel_boot()
976 info->dtb_start = info->loader_start; in arm_setup_direct_kernel_boot()
977 info->dtb_limit = image_low_addr; in arm_setup_direct_kernel_boot()
982 uint64_t loadaddr = info->loader_start + KERNEL_NOLOAD_ADDR; in arm_setup_direct_kernel_boot()
983 kernel_size = load_uimage_as(info->kernel_filename, &entry, &loadaddr, in arm_setup_direct_kernel_boot()
990 if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64) && kernel_size < 0) { in arm_setup_direct_kernel_boot()
991 kernel_size = load_aarch64_image(info->kernel_filename, in arm_setup_direct_kernel_boot()
992 info->loader_start, &entry, as); in arm_setup_direct_kernel_boot()
999 /* 32-bit ARM */ in arm_setup_direct_kernel_boot()
1000 entry = info->loader_start + KERNEL_LOAD_ADDR; in arm_setup_direct_kernel_boot()
1001 kernel_size = load_image_targphys_as(info->kernel_filename, entry, in arm_setup_direct_kernel_boot()
1002 ram_end - KERNEL_LOAD_ADDR, as); in arm_setup_direct_kernel_boot()
1010 error_report("could not load kernel '%s'", info->kernel_filename); in arm_setup_direct_kernel_boot()
1014 if (kernel_size > info->ram_size) { in arm_setup_direct_kernel_boot()
1017 info->kernel_filename, kernel_size, info->ram_size); in arm_setup_direct_kernel_boot()
1021 info->entry = entry; in arm_setup_direct_kernel_boot()
1035 * don't tell us their exact size (eg self-decompressing 32-bit kernels) in arm_setup_direct_kernel_boot()
1038 info->initrd_start = info->loader_start + in arm_setup_direct_kernel_boot()
1039 MIN(info->ram_size / 2, 128 * MiB); in arm_setup_direct_kernel_boot()
1041 info->initrd_start = MAX(info->initrd_start, image_high_addr); in arm_setup_direct_kernel_boot()
1043 info->initrd_start = TARGET_PAGE_ALIGN(info->initrd_start); in arm_setup_direct_kernel_boot()
1048 if (info->initrd_filename) { in arm_setup_direct_kernel_boot()
1050 if (info->initrd_start >= ram_end) { in arm_setup_direct_kernel_boot()
1055 initrd_size = load_ramdisk_as(info->initrd_filename, in arm_setup_direct_kernel_boot()
1056 info->initrd_start, in arm_setup_direct_kernel_boot()
1057 ram_end - info->initrd_start, as); in arm_setup_direct_kernel_boot()
1059 initrd_size = load_image_targphys_as(info->initrd_filename, in arm_setup_direct_kernel_boot()
1060 info->initrd_start, in arm_setup_direct_kernel_boot()
1061 ram_end - in arm_setup_direct_kernel_boot()
1062 info->initrd_start, in arm_setup_direct_kernel_boot()
1067 info->initrd_filename); in arm_setup_direct_kernel_boot()
1070 if (info->initrd_start + initrd_size > ram_end) { in arm_setup_direct_kernel_boot()
1073 info->initrd_filename); in arm_setup_direct_kernel_boot()
1079 info->initrd_size = initrd_size; in arm_setup_direct_kernel_boot()
1081 fixupcontext[FIXUP_BOARDID] = info->board_id; in arm_setup_direct_kernel_boot()
1082 fixupcontext[FIXUP_BOARD_SETUP] = info->board_setup_addr; in arm_setup_direct_kernel_boot()
1093 * Some AArch64 kernels on early bootup map the fdt region as in arm_setup_direct_kernel_boot()
1095 * [ ALIGN_DOWN(fdt, 2MB) ... ALIGN_DOWN(fdt, 2MB) + 2MB ] in arm_setup_direct_kernel_boot()
1109 info->dtb_start = QEMU_ALIGN_UP(info->initrd_start + initrd_size, in arm_setup_direct_kernel_boot()
1111 if (info->dtb_start >= ram_end) { in arm_setup_direct_kernel_boot()
1115 fixupcontext[FIXUP_ARGPTR_LO] = info->dtb_start; in arm_setup_direct_kernel_boot()
1116 fixupcontext[FIXUP_ARGPTR_HI] = info->dtb_start >> 32; in arm_setup_direct_kernel_boot()
1119 info->loader_start + KERNEL_ARGS_ADDR; in arm_setup_direct_kernel_boot()
1121 (info->loader_start + KERNEL_ARGS_ADDR) >> 32; in arm_setup_direct_kernel_boot()
1122 if (info->ram_size >= 4 * GiB) { in arm_setup_direct_kernel_boot()
1125 " using -dtb)"); in arm_setup_direct_kernel_boot()
1132 arm_write_bootloader("bootloader", as, info->loader_start, in arm_setup_direct_kernel_boot()
1135 if (info->write_board_setup) { in arm_setup_direct_kernel_boot()
1136 info->write_board_setup(cpu, info); in arm_setup_direct_kernel_boot()
1146 info->is_linux = is_linux; in arm_setup_direct_kernel_boot()
1149 ARM_CPU(cs)->env.boot_info = info; in arm_setup_direct_kernel_boot()
1163 info->dtb_start = info->loader_start; in arm_setup_firmware_boot()
1166 if (info->kernel_filename) { in arm_setup_firmware_boot()
1180 try_decompressing_kernel = arm_feature(&cpu->env, in arm_setup_firmware_boot()
1190 info->kernel_filename, in arm_setup_firmware_boot()
1194 info->initrd_filename, false); in arm_setup_firmware_boot()
1196 if (info->kernel_cmdline) { in arm_setup_firmware_boot()
1198 strlen(info->kernel_cmdline) + 1); in arm_setup_firmware_boot()
1200 info->kernel_cmdline); in arm_setup_firmware_boot()
1206 * same way as hardware. Leave env->boot_info NULL, so that in arm_setup_firmware_boot()
1216 CPUARMState *env = &cpu->env; in arm_load_kernel()
1235 assert(!(info->secure_board_setup && kvm_enabled())); in arm_load_kernel()
1236 info->kernel_filename = ms->kernel_filename; in arm_load_kernel()
1237 info->kernel_cmdline = ms->kernel_cmdline; in arm_load_kernel()
1238 info->initrd_filename = ms->initrd_filename; in arm_load_kernel()
1239 info->dtb_filename = ms->dtb; in arm_load_kernel()
1240 info->dtb_limit = 0; in arm_load_kernel()
1243 if (!info->kernel_filename || info->firmware_loaded) { in arm_load_kernel()
1264 assert(info->psci_conduit == QEMU_PSCI_CONDUIT_DISABLED || in arm_load_kernel()
1265 !info->secure_board_setup); in arm_load_kernel()
1276 if (info->is_linux && !info->secure_boot) { in arm_load_kernel()
1280 if ((info->psci_conduit == QEMU_PSCI_CONDUIT_HVC && boot_el >= 2) || in arm_load_kernel()
1281 (info->psci_conduit == QEMU_PSCI_CONDUIT_SMC && boot_el == 3)) { in arm_load_kernel()
1282 info->psci_conduit = QEMU_PSCI_CONDUIT_DISABLED; in arm_load_kernel()
1285 if (info->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED) { in arm_load_kernel()
1289 object_property_set_int(cpuobj, "psci-conduit", info->psci_conduit, in arm_load_kernel()
1292 * Secondary CPUs start in PSCI powered-down state. Like the in arm_load_kernel()
1297 object_property_set_bool(cpuobj, "start-powered-off", true, in arm_load_kernel()
1303 if (info->psci_conduit == QEMU_PSCI_CONDUIT_DISABLED && in arm_load_kernel()
1304 info->is_linux && nb_cpus > 1) { in arm_load_kernel()
1310 if (!info->secondary_cpu_reset_hook) { in arm_load_kernel()
1311 info->secondary_cpu_reset_hook = default_reset_secondary; in arm_load_kernel()
1313 if (!info->write_secondary_boot) { in arm_load_kernel()
1314 info->write_secondary_boot = default_write_secondary; in arm_load_kernel()
1316 info->write_secondary_boot(cpu, info); in arm_load_kernel()
1322 info->write_secondary_boot = NULL; in arm_load_kernel()
1323 info->secondary_cpu_reset_hook = NULL; in arm_load_kernel()
1328 * decided whether to enable PSCI and set the psci-conduit CPU properties. in arm_load_kernel()
1330 if (!info->skip_dtb_autoload && have_dtb(info)) { in arm_load_kernel()
1331 if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, in arm_load_kernel()