hw/xtensa: extract xtensa_create_memory_regions
XTFPGA boards should populate core memory regions the same way sim machine does. Move xtensa_create_memory_regions implementation to a separate file and use it to create instruction and data memory regions on XTFPGA boards. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
This commit is contained in:
parent
29b39bc712
commit
e53fa62c17
@ -1,3 +1,4 @@
|
||||
obj-y += pic_cpu.o
|
||||
obj-y += sim.o
|
||||
obj-y += xtensa_memory.o
|
||||
obj-y += xtfpga.o
|
||||
|
@ -36,25 +36,7 @@
|
||||
#include "exec/memory.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "qemu/error-report.h"
|
||||
|
||||
static void xtensa_create_memory_regions(const XtensaMemory *memory,
|
||||
const char *name)
|
||||
{
|
||||
unsigned i;
|
||||
GString *num_name = g_string_new(NULL);
|
||||
|
||||
for (i = 0; i < memory->num; ++i) {
|
||||
MemoryRegion *m;
|
||||
|
||||
g_string_printf(num_name, "%s%u", name, i);
|
||||
m = g_new(MemoryRegion, 1);
|
||||
memory_region_init_ram(m, NULL, num_name->str,
|
||||
memory->location[i].size, &error_fatal);
|
||||
memory_region_add_subregion(get_system_memory(),
|
||||
memory->location[i].addr, m);
|
||||
}
|
||||
g_string_free(num_name, true);
|
||||
}
|
||||
#include "xtensa_memory.h"
|
||||
|
||||
static uint64_t translate_phys_addr(void *opaque, uint64_t addr)
|
||||
{
|
||||
@ -94,12 +76,18 @@ static void xtensa_sim_init(MachineState *machine)
|
||||
XtensaMemory sysram = env->config->sysram;
|
||||
|
||||
sysram.location[0].size = ram_size;
|
||||
xtensa_create_memory_regions(&env->config->instrom, "xtensa.instrom");
|
||||
xtensa_create_memory_regions(&env->config->instram, "xtensa.instram");
|
||||
xtensa_create_memory_regions(&env->config->datarom, "xtensa.datarom");
|
||||
xtensa_create_memory_regions(&env->config->dataram, "xtensa.dataram");
|
||||
xtensa_create_memory_regions(&env->config->sysrom, "xtensa.sysrom");
|
||||
xtensa_create_memory_regions(&sysram, "xtensa.sysram");
|
||||
xtensa_create_memory_regions(&env->config->instrom, "xtensa.instrom",
|
||||
get_system_memory());
|
||||
xtensa_create_memory_regions(&env->config->instram, "xtensa.instram",
|
||||
get_system_memory());
|
||||
xtensa_create_memory_regions(&env->config->datarom, "xtensa.datarom",
|
||||
get_system_memory());
|
||||
xtensa_create_memory_regions(&env->config->dataram, "xtensa.dataram",
|
||||
get_system_memory());
|
||||
xtensa_create_memory_regions(&env->config->sysrom, "xtensa.sysrom",
|
||||
get_system_memory());
|
||||
xtensa_create_memory_regions(&sysram, "xtensa.sysram",
|
||||
get_system_memory());
|
||||
}
|
||||
|
||||
if (serial_hds[0]) {
|
||||
|
55
hw/xtensa/xtensa_memory.c
Normal file
55
hw/xtensa/xtensa_memory.c
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Max Filippov, Open Source and Linux Lab.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the Open Source and Linux Lab nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu-common.h"
|
||||
#include "cpu.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "hw/boards.h"
|
||||
#include "exec/memory.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "xtensa_memory.h"
|
||||
|
||||
void xtensa_create_memory_regions(const XtensaMemory *memory,
|
||||
const char *name,
|
||||
MemoryRegion *super)
|
||||
{
|
||||
unsigned i;
|
||||
GString *num_name = g_string_new(NULL);
|
||||
|
||||
for (i = 0; i < memory->num; ++i) {
|
||||
MemoryRegion *m;
|
||||
|
||||
g_string_printf(num_name, "%s%u", name, i);
|
||||
m = g_new(MemoryRegion, 1);
|
||||
memory_region_init_ram(m, NULL, num_name->str,
|
||||
memory->location[i].size, &error_fatal);
|
||||
memory_region_add_subregion(super, memory->location[i].addr, m);
|
||||
}
|
||||
g_string_free(num_name, true);
|
||||
}
|
40
hw/xtensa/xtensa_memory.h
Normal file
40
hw/xtensa/xtensa_memory.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Max Filippov, Open Source and Linux Lab.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the Open Source and Linux Lab nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _XTENSA_MEMORY_H
|
||||
#define _XTENSA_MEMORY_H
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu-common.h"
|
||||
#include "cpu.h"
|
||||
#include "exec/memory.h"
|
||||
|
||||
void xtensa_create_memory_regions(const XtensaMemory *memory,
|
||||
const char *name,
|
||||
MemoryRegion *super);
|
||||
|
||||
#endif
|
@ -44,6 +44,7 @@
|
||||
#include "sysemu/device_tree.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "bootparam.h"
|
||||
#include "xtensa_memory.h"
|
||||
|
||||
typedef struct XtfpgaBoardDesc {
|
||||
hwaddr flash_base;
|
||||
@ -216,7 +217,7 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
|
||||
MemoryRegion *system_memory = get_system_memory();
|
||||
XtensaCPU *cpu = NULL;
|
||||
CPUXtensaState *env = NULL;
|
||||
MemoryRegion *ram, *rom, *system_io;
|
||||
MemoryRegion *system_io;
|
||||
DriveInfo *dinfo;
|
||||
pflash_t *flash = NULL;
|
||||
QemuOpts *machine_opts = qemu_get_machine_opts();
|
||||
@ -238,10 +239,21 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
|
||||
cpu_reset(CPU(cpu));
|
||||
}
|
||||
|
||||
ram = g_malloc(sizeof(*ram));
|
||||
memory_region_init_ram(ram, NULL, "xtfpga.dram", machine->ram_size,
|
||||
&error_fatal);
|
||||
memory_region_add_subregion(system_memory, 0, ram);
|
||||
if (env) {
|
||||
XtensaMemory sysram = env->config->sysram;
|
||||
|
||||
sysram.location[0].size = machine->ram_size;
|
||||
xtensa_create_memory_regions(&env->config->instrom, "xtensa.instrom",
|
||||
system_memory);
|
||||
xtensa_create_memory_regions(&env->config->instram, "xtensa.instram",
|
||||
system_memory);
|
||||
xtensa_create_memory_regions(&env->config->datarom, "xtensa.datarom",
|
||||
system_memory);
|
||||
xtensa_create_memory_regions(&env->config->dataram, "xtensa.dataram",
|
||||
system_memory);
|
||||
xtensa_create_memory_regions(&sysram, "xtensa.sysram",
|
||||
system_memory);
|
||||
}
|
||||
|
||||
system_io = g_malloc(sizeof(*system_io));
|
||||
memory_region_init_io(system_io, NULL, &xtfpga_io_ops, NULL, "xtfpga.io",
|
||||
@ -269,21 +281,24 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
|
||||
if (kernel_filename) {
|
||||
uint32_t entry_point = env->pc;
|
||||
size_t bp_size = 3 * get_tag_size(0); /* first/last and memory tags */
|
||||
uint32_t tagptr = 0xfe000000 + board->sram_size;
|
||||
uint32_t tagptr = env->config->sysrom.location[0].addr +
|
||||
board->sram_size;
|
||||
uint32_t cur_tagptr;
|
||||
BpMemInfo memory_location = {
|
||||
.type = tswap32(MEMORY_TYPE_CONVENTIONAL),
|
||||
.start = tswap32(0),
|
||||
.end = tswap32(machine->ram_size),
|
||||
.start = tswap32(env->config->sysram.location[0].addr),
|
||||
.end = tswap32(env->config->sysram.location[0].addr +
|
||||
machine->ram_size),
|
||||
};
|
||||
uint32_t lowmem_end = machine->ram_size < 0x08000000 ?
|
||||
machine->ram_size : 0x08000000;
|
||||
uint32_t cur_lowmem = QEMU_ALIGN_UP(lowmem_end / 2, 4096);
|
||||
|
||||
rom = g_malloc(sizeof(*rom));
|
||||
memory_region_init_ram(rom, NULL, "xtfpga.sram", board->sram_size,
|
||||
&error_fatal);
|
||||
memory_region_add_subregion(system_memory, 0xfe000000, rom);
|
||||
lowmem_end += env->config->sysram.location[0].addr;
|
||||
cur_lowmem += env->config->sysram.location[0].addr;
|
||||
|
||||
xtensa_create_memory_regions(&env->config->sysrom, "xtensa.sysrom",
|
||||
system_memory);
|
||||
|
||||
if (kernel_cmdline) {
|
||||
bp_size += get_tag_size(strlen(kernel_cmdline) + 1);
|
||||
@ -404,13 +419,20 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
|
||||
if (flash) {
|
||||
MemoryRegion *flash_mr = pflash_cfi01_get_memory(flash);
|
||||
MemoryRegion *flash_io = g_malloc(sizeof(*flash_io));
|
||||
uint32_t size = env->config->sysrom.location[0].size;
|
||||
|
||||
if (board->flash_size - board->flash_boot_base < size) {
|
||||
size = board->flash_size - board->flash_boot_base;
|
||||
}
|
||||
|
||||
memory_region_init_alias(flash_io, NULL, "xtfpga.flash",
|
||||
flash_mr, board->flash_boot_base,
|
||||
board->flash_size - board->flash_boot_base < 0x02000000 ?
|
||||
board->flash_size - board->flash_boot_base : 0x02000000);
|
||||
memory_region_add_subregion(system_memory, 0xfe000000,
|
||||
flash_io);
|
||||
flash_mr, board->flash_boot_base, size);
|
||||
memory_region_add_subregion(system_memory,
|
||||
env->config->sysrom.location[0].addr,
|
||||
flash_io);
|
||||
} else {
|
||||
xtensa_create_memory_regions(&env->config->sysrom, "xtensa.sysrom",
|
||||
system_memory);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user