mirror of https://github.com/xemu-project/xemu.git
mcf_uart: convert to memory API
Signed-off-by: Benoît Canet <benoit.canet@gmail.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
653fa85c9a
commit
aa6e4986b8
11
hw/mcf.h
11
hw/mcf.h
|
@ -5,11 +5,14 @@
|
||||||
struct MemoryRegion;
|
struct MemoryRegion;
|
||||||
|
|
||||||
/* mcf_uart.c */
|
/* mcf_uart.c */
|
||||||
uint32_t mcf_uart_read(void *opaque, target_phys_addr_t addr);
|
uint64_t mcf_uart_read(void *opaque, target_phys_addr_t addr,
|
||||||
void mcf_uart_write(void *opaque, target_phys_addr_t addr, uint32_t val);
|
unsigned size);
|
||||||
|
void mcf_uart_write(void *opaque, target_phys_addr_t addr,
|
||||||
|
uint64_t val, unsigned size);
|
||||||
void *mcf_uart_init(qemu_irq irq, CharDriverState *chr);
|
void *mcf_uart_init(qemu_irq irq, CharDriverState *chr);
|
||||||
void mcf_uart_mm_init(target_phys_addr_t base, qemu_irq irq,
|
void mcf_uart_mm_init(struct MemoryRegion *sysmem,
|
||||||
CharDriverState *chr);
|
target_phys_addr_t base,
|
||||||
|
qemu_irq irq, CharDriverState *chr);
|
||||||
|
|
||||||
/* mcf_intc.c */
|
/* mcf_intc.c */
|
||||||
qemu_irq *mcf_intc_init(target_phys_addr_t base, CPUState *env);
|
qemu_irq *mcf_intc_init(target_phys_addr_t base, CPUState *env);
|
||||||
|
|
25
hw/mcf5206.c
25
hw/mcf5206.c
|
@ -263,16 +263,17 @@ static void m5206_mbar_reset(m5206_mbar_state *s)
|
||||||
s->par = 0;
|
s->par = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t m5206_mbar_read(m5206_mbar_state *s, uint32_t offset)
|
static uint64_t m5206_mbar_read(m5206_mbar_state *s,
|
||||||
|
uint64_t offset, unsigned size)
|
||||||
{
|
{
|
||||||
if (offset >= 0x100 && offset < 0x120) {
|
if (offset >= 0x100 && offset < 0x120) {
|
||||||
return m5206_timer_read(s->timer[0], offset - 0x100);
|
return m5206_timer_read(s->timer[0], offset - 0x100);
|
||||||
} else if (offset >= 0x120 && offset < 0x140) {
|
} else if (offset >= 0x120 && offset < 0x140) {
|
||||||
return m5206_timer_read(s->timer[1], offset - 0x120);
|
return m5206_timer_read(s->timer[1], offset - 0x120);
|
||||||
} else if (offset >= 0x140 && offset < 0x160) {
|
} else if (offset >= 0x140 && offset < 0x160) {
|
||||||
return mcf_uart_read(s->uart[0], offset - 0x140);
|
return mcf_uart_read(s->uart[0], offset - 0x140, size);
|
||||||
} else if (offset >= 0x180 && offset < 0x1a0) {
|
} else if (offset >= 0x180 && offset < 0x1a0) {
|
||||||
return mcf_uart_read(s->uart[1], offset - 0x180);
|
return mcf_uart_read(s->uart[1], offset - 0x180, size);
|
||||||
}
|
}
|
||||||
switch (offset) {
|
switch (offset) {
|
||||||
case 0x03: return s->scr;
|
case 0x03: return s->scr;
|
||||||
|
@ -301,7 +302,7 @@ static uint32_t m5206_mbar_read(m5206_mbar_state *s, uint32_t offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void m5206_mbar_write(m5206_mbar_state *s, uint32_t offset,
|
static void m5206_mbar_write(m5206_mbar_state *s, uint32_t offset,
|
||||||
uint32_t value)
|
uint64_t value, unsigned size)
|
||||||
{
|
{
|
||||||
if (offset >= 0x100 && offset < 0x120) {
|
if (offset >= 0x100 && offset < 0x120) {
|
||||||
m5206_timer_write(s->timer[0], offset - 0x100, value);
|
m5206_timer_write(s->timer[0], offset - 0x100, value);
|
||||||
|
@ -310,10 +311,10 @@ static void m5206_mbar_write(m5206_mbar_state *s, uint32_t offset,
|
||||||
m5206_timer_write(s->timer[1], offset - 0x120, value);
|
m5206_timer_write(s->timer[1], offset - 0x120, value);
|
||||||
return;
|
return;
|
||||||
} else if (offset >= 0x140 && offset < 0x160) {
|
} else if (offset >= 0x140 && offset < 0x160) {
|
||||||
mcf_uart_write(s->uart[0], offset - 0x140, value);
|
mcf_uart_write(s->uart[0], offset - 0x140, value, size);
|
||||||
return;
|
return;
|
||||||
} else if (offset >= 0x180 && offset < 0x1a0) {
|
} else if (offset >= 0x180 && offset < 0x1a0) {
|
||||||
mcf_uart_write(s->uart[1], offset - 0x180, value);
|
mcf_uart_write(s->uart[1], offset - 0x180, value, size);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (offset) {
|
switch (offset) {
|
||||||
|
@ -387,7 +388,7 @@ static uint32_t m5206_mbar_readb(void *opaque, target_phys_addr_t offset)
|
||||||
}
|
}
|
||||||
return val & 0xff;
|
return val & 0xff;
|
||||||
}
|
}
|
||||||
return m5206_mbar_read(s, offset);
|
return m5206_mbar_read(s, offset, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t m5206_mbar_readw(void *opaque, target_phys_addr_t offset)
|
static uint32_t m5206_mbar_readw(void *opaque, target_phys_addr_t offset)
|
||||||
|
@ -411,7 +412,7 @@ static uint32_t m5206_mbar_readw(void *opaque, target_phys_addr_t offset)
|
||||||
val |= m5206_mbar_readb(opaque, offset + 1);
|
val |= m5206_mbar_readb(opaque, offset + 1);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
return m5206_mbar_read(s, offset);
|
return m5206_mbar_read(s, offset, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t m5206_mbar_readl(void *opaque, target_phys_addr_t offset)
|
static uint32_t m5206_mbar_readl(void *opaque, target_phys_addr_t offset)
|
||||||
|
@ -429,7 +430,7 @@ static uint32_t m5206_mbar_readl(void *opaque, target_phys_addr_t offset)
|
||||||
val |= m5206_mbar_readw(opaque, offset + 2);
|
val |= m5206_mbar_readw(opaque, offset + 2);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
return m5206_mbar_read(s, offset);
|
return m5206_mbar_read(s, offset, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void m5206_mbar_writew(void *opaque, target_phys_addr_t offset,
|
static void m5206_mbar_writew(void *opaque, target_phys_addr_t offset,
|
||||||
|
@ -458,7 +459,7 @@ static void m5206_mbar_writeb(void *opaque, target_phys_addr_t offset,
|
||||||
m5206_mbar_writew(opaque, offset & ~1, tmp);
|
m5206_mbar_writew(opaque, offset & ~1, tmp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m5206_mbar_write(s, offset, value);
|
m5206_mbar_write(s, offset, value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void m5206_mbar_writew(void *opaque, target_phys_addr_t offset,
|
static void m5206_mbar_writew(void *opaque, target_phys_addr_t offset,
|
||||||
|
@ -486,7 +487,7 @@ static void m5206_mbar_writew(void *opaque, target_phys_addr_t offset,
|
||||||
m5206_mbar_writeb(opaque, offset + 1, value & 0xff);
|
m5206_mbar_writeb(opaque, offset + 1, value & 0xff);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m5206_mbar_write(s, offset, value);
|
m5206_mbar_write(s, offset, value, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void m5206_mbar_writel(void *opaque, target_phys_addr_t offset,
|
static void m5206_mbar_writel(void *opaque, target_phys_addr_t offset,
|
||||||
|
@ -504,7 +505,7 @@ static void m5206_mbar_writel(void *opaque, target_phys_addr_t offset,
|
||||||
m5206_mbar_writew(opaque, offset + 2, value & 0xffff);
|
m5206_mbar_writew(opaque, offset + 2, value & 0xffff);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m5206_mbar_write(s, offset, value);
|
m5206_mbar_write(s, offset, value, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const MemoryRegionOps m5206_mbar_ops = {
|
static const MemoryRegionOps m5206_mbar_ops = {
|
||||||
|
|
|
@ -223,9 +223,9 @@ static void mcf5208evb_init(ram_addr_t ram_size,
|
||||||
/* Internal peripherals. */
|
/* Internal peripherals. */
|
||||||
pic = mcf_intc_init(0xfc048000, env);
|
pic = mcf_intc_init(0xfc048000, env);
|
||||||
|
|
||||||
mcf_uart_mm_init(0xfc060000, pic[26], serial_hds[0]);
|
mcf_uart_mm_init(address_space_mem, 0xfc060000, pic[26], serial_hds[0]);
|
||||||
mcf_uart_mm_init(0xfc064000, pic[27], serial_hds[1]);
|
mcf_uart_mm_init(address_space_mem, 0xfc064000, pic[27], serial_hds[1]);
|
||||||
mcf_uart_mm_init(0xfc068000, pic[28], serial_hds[2]);
|
mcf_uart_mm_init(address_space_mem, 0xfc068000, pic[28], serial_hds[2]);
|
||||||
|
|
||||||
mcf5208_sys_init(address_space_mem, pic);
|
mcf5208_sys_init(address_space_mem, pic);
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,10 @@
|
||||||
#include "hw.h"
|
#include "hw.h"
|
||||||
#include "mcf.h"
|
#include "mcf.h"
|
||||||
#include "qemu-char.h"
|
#include "qemu-char.h"
|
||||||
|
#include "exec-memory.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
MemoryRegion iomem;
|
||||||
uint8_t mr[2];
|
uint8_t mr[2];
|
||||||
uint8_t sr;
|
uint8_t sr;
|
||||||
uint8_t isr;
|
uint8_t isr;
|
||||||
|
@ -64,7 +66,8 @@ static void mcf_uart_update(mcf_uart_state *s)
|
||||||
qemu_set_irq(s->irq, (s->isr & s->imr) != 0);
|
qemu_set_irq(s->irq, (s->isr & s->imr) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t mcf_uart_read(void *opaque, target_phys_addr_t addr)
|
uint64_t mcf_uart_read(void *opaque, target_phys_addr_t addr,
|
||||||
|
unsigned size)
|
||||||
{
|
{
|
||||||
mcf_uart_state *s = (mcf_uart_state *)opaque;
|
mcf_uart_state *s = (mcf_uart_state *)opaque;
|
||||||
switch (addr & 0x3f) {
|
switch (addr & 0x3f) {
|
||||||
|
@ -182,7 +185,8 @@ static void mcf_do_command(mcf_uart_state *s, uint8_t cmd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mcf_uart_write(void *opaque, target_phys_addr_t addr, uint32_t val)
|
void mcf_uart_write(void *opaque, target_phys_addr_t addr,
|
||||||
|
uint64_t val, unsigned size)
|
||||||
{
|
{
|
||||||
mcf_uart_state *s = (mcf_uart_state *)opaque;
|
mcf_uart_state *s = (mcf_uart_state *)opaque;
|
||||||
switch (addr & 0x3f) {
|
switch (addr & 0x3f) {
|
||||||
|
@ -283,28 +287,20 @@ void *mcf_uart_init(qemu_irq irq, CharDriverState *chr)
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const MemoryRegionOps mcf_uart_ops = {
|
||||||
static CPUReadMemoryFunc * const mcf_uart_readfn[] = {
|
.read = mcf_uart_read,
|
||||||
mcf_uart_read,
|
.write = mcf_uart_write,
|
||||||
mcf_uart_read,
|
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||||
mcf_uart_read
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static CPUWriteMemoryFunc * const mcf_uart_writefn[] = {
|
void mcf_uart_mm_init(MemoryRegion *sysmem,
|
||||||
mcf_uart_write,
|
target_phys_addr_t base,
|
||||||
mcf_uart_write,
|
qemu_irq irq,
|
||||||
mcf_uart_write
|
|
||||||
};
|
|
||||||
|
|
||||||
void mcf_uart_mm_init(target_phys_addr_t base, qemu_irq irq,
|
|
||||||
CharDriverState *chr)
|
CharDriverState *chr)
|
||||||
{
|
{
|
||||||
mcf_uart_state *s;
|
mcf_uart_state *s;
|
||||||
int iomemtype;
|
|
||||||
|
|
||||||
s = mcf_uart_init(irq, chr);
|
s = mcf_uart_init(irq, chr);
|
||||||
iomemtype = cpu_register_io_memory(mcf_uart_readfn,
|
memory_region_init_io(&s->iomem, &mcf_uart_ops, s, "uart", 0x40);
|
||||||
mcf_uart_writefn, s,
|
memory_region_add_subregion(sysmem, base, &s->iomem);
|
||||||
DEVICE_NATIVE_ENDIAN);
|
|
||||||
cpu_register_physical_memory(base, 0x40, iomemtype);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue