Signed-off-by: Evgeny Voevodin <e.voevo...@samsung.com> --- hw/s5pc210.c | 26 +++++++++++++++++++++++++- 1 files changed, 25 insertions(+), 1 deletions(-)
diff --git a/hw/s5pc210.c b/hw/s5pc210.c index eabe3b1..90858e9 100644 --- a/hw/s5pc210.c +++ b/hw/s5pc210.c @@ -97,6 +97,12 @@ #define S5PC210_BASE_BOOT_ADDR S5PC210_DRAM0_BASE_ADDR +/* Secondary CPU startup code is in IROM memory */ +#define S5PC210_SMP_BOOT_ADDR S5PC210_IROM_BASE_ADDR + +/* Secondary CPU polling address to get loader start from */ +#define S5PC210_SECOND_CPU_BOOTREG 0x10020814 + static struct arm_boot_info s5pc210_binfo = { .loader_start = S5PC210_BASE_BOOT_ADDR, }; @@ -213,6 +219,8 @@ static void s5pc210_init(ram_addr_t ram_size, MemoryRegion *irom_alias_mem = g_new(MemoryRegion, 1); MemoryRegion *dram0_mem = g_new(MemoryRegion, 1); MemoryRegion *dram1_mem = NULL; + MemoryRegion *hack_mem = g_new(MemoryRegion, 1); + MemoryRegion *bootreg_mem = g_new(MemoryRegion, 1); S5pc210Irq *irqs; qemu_irq *irq_table; qemu_irq *irqp; @@ -225,9 +233,11 @@ static void s5pc210_init(ram_addr_t ram_size, switch (board_type) { case BOARD_S5PC210_NURI: s5pc210_binfo.board_id = MACH_NURI_ID; + s5pc210_binfo.smp_bootreg_addr = S5PC210_SECOND_CPU_BOOTREG; break; case BOARD_S5PC210_SMDKC210: s5pc210_binfo.board_id = MACH_SMDKC210_ID; + s5pc210_binfo.smp_bootreg_addr = S5PC210_SECOND_CPU_BOOTREG; break; default: break; @@ -353,6 +363,20 @@ static void s5pc210_init(ram_addr_t ram_size, memory_region_add_subregion(system_mem, S5PC210_DRAM0_BASE_ADDR, dram0_mem); + /* + * Secondary CPU startup code will be placed here. + */ + memory_region_init_ram(hack_mem, NULL, "s5pc210.hack", 0x1000); + memory_region_add_subregion(system_mem, S5PC210_SMP_BOOT_ADDR, + hack_mem); + + /* + * Hack: Map SECOND_CPU_BOOTREG, because it is in PMU USER5 register. + */ + memory_region_init_ram(bootreg_mem, NULL, "s5pc210.bootreg", 0x4); + memory_region_add_subregion(system_mem, S5PC210_SECOND_CPU_BOOTREG, + bootreg_mem); + /* CMU */ sysbus_create_simple("s5pc210.cmu", S5PC210_CMU_BASE_ADDR, NULL); @@ -429,7 +453,7 @@ static void s5pc210_init(ram_addr_t ram_size, s5pc210_binfo.kernel_filename = kernel_filename; s5pc210_binfo.initrd_filename = initrd_filename; s5pc210_binfo.kernel_cmdline = kernel_cmdline; - + s5pc210_binfo.smp_priv_base = S5PC210_SMP_PRIVATE_BASE_ADDR; arm_load_kernel(first_cpu, &s5pc210_binfo); } -- 1.7.4.1