hw/m68k/mcf5208: add support for reset

Add reset support for mcf5208.

Signed-off-by: Angelo Dureghello <angelo@kernel-space.org>
Reviewed-by: Thomas Huth <huth@tuxfamily.org>
Message-ID: <20240309093459.984565-1-angelo@kernel-space.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
Angelo Dureghello 2024-03-09 10:34:59 +01:00 committed by Philippe Mathieu-Daudé
parent bb829cdeff
commit d3c79c3974

View File

@ -40,6 +40,8 @@
#define PCSR_PRE_SHIFT 8
#define PCSR_PRE_MASK 0x0f00
#define RCR_SOFTRST 0x80
typedef struct {
MemoryRegion iomem;
qemu_irq irq;
@ -185,12 +187,50 @@ static const MemoryRegionOps m5208_sys_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
static void mcf5208_sys_init(MemoryRegion *address_space, qemu_irq *pic)
static uint64_t m5208_rcm_read(void *opaque, hwaddr addr,
unsigned size)
{
return 0;
}
static void m5208_rcm_write(void *opaque, hwaddr addr,
uint64_t value, unsigned size)
{
M68kCPU *cpu = opaque;
CPUState *cs = CPU(cpu);
switch (addr) {
case 0x0: /* RCR */
if (value & RCR_SOFTRST) {
cpu_reset(cs);
cpu->env.aregs[7] = ldl_phys(cs->as, 0);
cpu->env.pc = ldl_phys(cs->as, 4);
}
break;
default:
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIX "\n",
__func__, addr);
break;
}
}
static const MemoryRegionOps m5208_rcm_ops = {
.read = m5208_rcm_read,
.write = m5208_rcm_write,
.endianness = DEVICE_NATIVE_ENDIAN,
};
static void mcf5208_sys_init(MemoryRegion *address_space, qemu_irq *pic,
M68kCPU *cpu)
{
MemoryRegion *iomem = g_new(MemoryRegion, 1);
MemoryRegion *iomem_rcm = g_new(MemoryRegion, 1);
m5208_timer_state *s;
int i;
/* RCM */
memory_region_init_io(iomem_rcm, NULL, &m5208_rcm_ops, cpu,
"m5208-rcm", 0x00000080);
memory_region_add_subregion(address_space, 0xfc0a0000, iomem_rcm);
/* SDRAMC. */
memory_region_init_io(iomem, NULL, &m5208_sys_ops, NULL, "m5208-sys", 0x00004000);
memory_region_add_subregion(address_space, 0xfc0a8000, iomem);
@ -265,7 +305,7 @@ static void mcf5208evb_init(MachineState *machine)
mcf_uart_create_mmap(0xfc064000, pic[27], serial_hd(1));
mcf_uart_create_mmap(0xfc068000, pic[28], serial_hd(2));
mcf5208_sys_init(address_space_mem, pic);
mcf5208_sys_init(address_space_mem, pic, cpu);
mcf_fec_init(address_space_mem, 0xfc030000, pic + 36);