提交 780d16b7 编写于 作者: A Alexander Graf

openpic: Convert subregions to memory api

The "openpic" controller is currently using one big region and does
subregion dispatching manually. Move this to the memory api.
Signed-off-by: NAlexander Graf <agraf@suse.de>
上级 a285f1ca
...@@ -79,6 +79,15 @@ enum { ...@@ -79,6 +79,15 @@ enum {
#define OPENPIC_IRQ_MBX0 (OPENPIC_IRQ_DBL0 + OPENPIC_MAX_DBL) /* First mailbox IRQ */ #define OPENPIC_IRQ_MBX0 (OPENPIC_IRQ_DBL0 + OPENPIC_MAX_DBL) /* First mailbox IRQ */
#endif #endif
#define OPENPIC_GLB_REG_START 0x0
#define OPENPIC_GLB_REG_SIZE 0x10F0
#define OPENPIC_TMR_REG_START 0x10F0
#define OPENPIC_TMR_REG_SIZE 0x220
#define OPENPIC_SRC_REG_START 0x10000
#define OPENPIC_SRC_REG_SIZE (MAX_SRC * 0x20)
#define OPENPIC_CPU_REG_START 0x20000
#define OPENPIC_CPU_REG_SIZE 0x100 + ((MAX_CPU - 1) * 0x1000)
/* MPIC */ /* MPIC */
#define MPIC_MAX_CPU 1 #define MPIC_MAX_CPU 1
#define MPIC_MAX_EXT 12 #define MPIC_MAX_EXT 12
...@@ -842,53 +851,39 @@ static uint64_t openpic_cpu_read(void *opaque, hwaddr addr, unsigned len) ...@@ -842,53 +851,39 @@ static uint64_t openpic_cpu_read(void *opaque, hwaddr addr, unsigned len)
return openpic_cpu_read_internal(opaque, addr, (addr & 0x1f000) >> 12); return openpic_cpu_read_internal(opaque, addr, (addr & 0x1f000) >> 12);
} }
static void openpic_write(void *opaque, hwaddr addr, uint64_t val, static const MemoryRegionOps openpic_glb_ops = {
unsigned len) .write = openpic_gbl_write,
{ .read = openpic_gbl_read,
openpic_t *opp = opaque; .endianness = DEVICE_LITTLE_ENDIAN,
.impl = {
DPRINTF("%s: offset %08x val: %08x\n", __func__, (int)addr, val); .min_access_size = 4,
if (addr < 0x1100) { .max_access_size = 4,
/* Global registers */ },
openpic_gbl_write(opp, addr, val, len); };
} else if (addr < 0x10000) {
/* Timers registers */
openpic_timer_write(opp, addr, val, len);
} else if (addr < 0x20000) {
/* Source registers */
openpic_src_write(opp, addr, val, len);
} else {
/* CPU registers */
openpic_cpu_write(opp, addr, val, len);
}
}
static uint64_t openpic_read(void *opaque, hwaddr addr, unsigned len)
{
openpic_t *opp = opaque;
uint32_t retval;
DPRINTF("%s: offset %08x\n", __func__, (int)addr); static const MemoryRegionOps openpic_tmr_ops = {
if (addr < 0x1100) { .write = openpic_timer_write,
/* Global registers */ .read = openpic_timer_read,
retval = openpic_gbl_read(opp, addr, len); .endianness = DEVICE_LITTLE_ENDIAN,
} else if (addr < 0x10000) { .impl = {
/* Timers registers */ .min_access_size = 4,
retval = openpic_timer_read(opp, addr, len); .max_access_size = 4,
} else if (addr < 0x20000) { },
/* Source registers */ };
retval = openpic_src_read(opp, addr, len);
} else {
/* CPU registers */
retval = openpic_cpu_read(opp, addr, len);
}
return retval; static const MemoryRegionOps openpic_cpu_ops = {
} .write = openpic_cpu_write,
.read = openpic_cpu_read,
.endianness = DEVICE_LITTLE_ENDIAN,
.impl = {
.min_access_size = 4,
.max_access_size = 4,
},
};
static const MemoryRegionOps openpic_ops = { static const MemoryRegionOps openpic_src_ops = {
.read = openpic_read, .write = openpic_src_write,
.write = openpic_write, .read = openpic_src_read,
.endianness = DEVICE_LITTLE_ENDIAN, .endianness = DEVICE_LITTLE_ENDIAN,
.impl = { .impl = {
.min_access_size = 4, .min_access_size = 4,
...@@ -1009,12 +1004,33 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, ...@@ -1009,12 +1004,33 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus,
{ {
openpic_t *opp; openpic_t *opp;
int i, m; int i, m;
struct {
const char *name;
MemoryRegionOps const *ops;
hwaddr start_addr;
ram_addr_t size;
} const list[] = {
{"glb", &openpic_glb_ops, OPENPIC_GLB_REG_START, OPENPIC_GLB_REG_SIZE},
{"tmr", &openpic_tmr_ops, OPENPIC_TMR_REG_START, OPENPIC_TMR_REG_SIZE},
{"src", &openpic_src_ops, OPENPIC_SRC_REG_START, OPENPIC_SRC_REG_SIZE},
{"cpu", &openpic_cpu_ops, OPENPIC_CPU_REG_START, OPENPIC_CPU_REG_SIZE},
};
/* XXX: for now, only one CPU is supported */ /* XXX: for now, only one CPU is supported */
if (nb_cpus != 1) if (nb_cpus != 1)
return NULL; return NULL;
opp = g_malloc0(sizeof(openpic_t)); opp = g_malloc0(sizeof(openpic_t));
memory_region_init_io(&opp->mem, &openpic_ops, opp, "openpic", 0x40000);
memory_region_init(&opp->mem, "openpic", 0x40000);
for (i = 0; i < ARRAY_SIZE(list); i++) {
memory_region_init_io(&opp->sub_io_mem[i], list[i].ops, opp,
list[i].name, list[i].size);
memory_region_add_subregion(&opp->mem, list[i].start_addr,
&opp->sub_io_mem[i]);
}
// isu_base &= 0xFFFC0000; // isu_base &= 0xFFFC0000;
opp->nb_cpus = nb_cpus; opp->nb_cpus = nb_cpus;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册