sifive_u.c (dc144fe13d336caac2f03b57f1df738e84f984ec) sifive_u.c (8590f53661ec678fd3aa97b4da212b0c00056c2e)
1/*
2 * QEMU RISC-V Board Compatible with SiFive Freedom U SDK
3 *
4 * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu
5 * Copyright (c) 2017 SiFive, Inc.
6 * Copyright (c) 2019 Bin Meng <bmeng.cn@gmail.com>
7 *
8 * Provides a board compatible with the SiFive Freedom U SDK:

--- 364 unchanged lines hidden (view full) ---

373static void sifive_u_machine_init(MachineState *machine)
374{
375 const struct MemmapEntry *memmap = sifive_u_memmap;
376 SiFiveUState *s = RISCV_U_MACHINE(machine);
377 MemoryRegion *system_memory = get_system_memory();
378 MemoryRegion *main_mem = g_new(MemoryRegion, 1);
379 MemoryRegion *flash0 = g_new(MemoryRegion, 1);
380 target_ulong start_addr = memmap[SIFIVE_U_DRAM].base;
1/*
2 * QEMU RISC-V Board Compatible with SiFive Freedom U SDK
3 *
4 * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu
5 * Copyright (c) 2017 SiFive, Inc.
6 * Copyright (c) 2019 Bin Meng <bmeng.cn@gmail.com>
7 *
8 * Provides a board compatible with the SiFive Freedom U SDK:

--- 364 unchanged lines hidden (view full) ---

373static void sifive_u_machine_init(MachineState *machine)
374{
375 const struct MemmapEntry *memmap = sifive_u_memmap;
376 SiFiveUState *s = RISCV_U_MACHINE(machine);
377 MemoryRegion *system_memory = get_system_memory();
378 MemoryRegion *main_mem = g_new(MemoryRegion, 1);
379 MemoryRegion *flash0 = g_new(MemoryRegion, 1);
380 target_ulong start_addr = memmap[SIFIVE_U_DRAM].base;
381 uint32_t start_addr_hi32 = 0x00000000;
381 int i;
382 uint32_t fdt_load_addr;
383 uint64_t kernel_entry;
384
385 /* Initialize SoC */
386 object_initialize_child(OBJECT(machine), "soc", &s->soc, TYPE_RISCV_U_SOC);
387 object_property_set_uint(OBJECT(&s->soc), "serial", s->serial,
388 &error_abort);

--- 66 unchanged lines hidden (view full) ---

455 * if kernel argument is not set.
456 */
457 kernel_entry = 0;
458 }
459
460 /* Compute the fdt load address in dram */
461 fdt_load_addr = riscv_load_fdt(memmap[SIFIVE_U_DRAM].base,
462 machine->ram_size, s->fdt);
382 int i;
383 uint32_t fdt_load_addr;
384 uint64_t kernel_entry;
385
386 /* Initialize SoC */
387 object_initialize_child(OBJECT(machine), "soc", &s->soc, TYPE_RISCV_U_SOC);
388 object_property_set_uint(OBJECT(&s->soc), "serial", s->serial,
389 &error_abort);

--- 66 unchanged lines hidden (view full) ---

456 * if kernel argument is not set.
457 */
458 kernel_entry = 0;
459 }
460
461 /* Compute the fdt load address in dram */
462 fdt_load_addr = riscv_load_fdt(memmap[SIFIVE_U_DRAM].base,
463 machine->ram_size, s->fdt);
464 #if defined(TARGET_RISCV64)
465 start_addr_hi32 = start_addr >> 32;
466 #endif
463
464 /* reset vector */
465 uint32_t reset_vec[11] = {
466 s->msel, /* MSEL pin state */
467 0x00000297, /* 1: auipc t0, %pcrel_hi(fw_dyn) */
468 0x02828613, /* addi a2, t0, %pcrel_lo(1b) */
469 0xf1402573, /* csrr a0, mhartid */
470#if defined(TARGET_RISCV32)
471 0x0202a583, /* lw a1, 32(t0) */
472 0x0182a283, /* lw t0, 24(t0) */
473#elif defined(TARGET_RISCV64)
474 0x0202b583, /* ld a1, 32(t0) */
475 0x0182b283, /* ld t0, 24(t0) */
476#endif
477 0x00028067, /* jr t0 */
478 start_addr, /* start: .dword */
467
468 /* reset vector */
469 uint32_t reset_vec[11] = {
470 s->msel, /* MSEL pin state */
471 0x00000297, /* 1: auipc t0, %pcrel_hi(fw_dyn) */
472 0x02828613, /* addi a2, t0, %pcrel_lo(1b) */
473 0xf1402573, /* csrr a0, mhartid */
474#if defined(TARGET_RISCV32)
475 0x0202a583, /* lw a1, 32(t0) */
476 0x0182a283, /* lw t0, 24(t0) */
477#elif defined(TARGET_RISCV64)
478 0x0202b583, /* ld a1, 32(t0) */
479 0x0182b283, /* ld t0, 24(t0) */
480#endif
481 0x00028067, /* jr t0 */
482 start_addr, /* start: .dword */
479 0x00000000,
483 start_addr_hi32,
480 fdt_load_addr, /* fdt_laddr: .dword */
481 0x00000000,
482 /* fw_dyn: */
483 };
484
485 /* copy in the reset vector in little_endian byte order */
486 for (i = 0; i < ARRAY_SIZE(reset_vec); i++) {
487 reset_vec[i] = cpu_to_le32(reset_vec[i]);

--- 274 unchanged lines hidden ---
484 fdt_load_addr, /* fdt_laddr: .dword */
485 0x00000000,
486 /* fw_dyn: */
487 };
488
489 /* copy in the reset vector in little_endian byte order */
490 for (i = 0; i < ARRAY_SIZE(reset_vec); i++) {
491 reset_vec[i] = cpu_to_le32(reset_vec[i]);

--- 274 unchanged lines hidden ---