g364fb: convert to memory API
Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
9eadff4a94
commit
82afb3a707
60
hw/g364fb.c
60
hw/g364fb.c
@ -36,7 +36,7 @@ do { fprintf(stderr, "g364 ERROR: " fmt , ## __VA_ARGS__);} while (0)
|
|||||||
typedef struct G364State {
|
typedef struct G364State {
|
||||||
/* hardware */
|
/* hardware */
|
||||||
uint8_t *vram;
|
uint8_t *vram;
|
||||||
ram_addr_t vram_offset;
|
MemoryRegion vram_region;
|
||||||
int vram_size;
|
int vram_size;
|
||||||
qemu_irq irq;
|
qemu_irq irq;
|
||||||
/* registers */
|
/* registers */
|
||||||
@ -68,16 +68,17 @@ typedef struct G364State {
|
|||||||
#define CTLA_FORCE_BLANK 0x00000400
|
#define CTLA_FORCE_BLANK 0x00000400
|
||||||
#define CTLA_NO_CURSOR 0x00800000
|
#define CTLA_NO_CURSOR 0x00800000
|
||||||
|
|
||||||
static inline int check_dirty(ram_addr_t page)
|
static inline int check_dirty(G364State *s, ram_addr_t page)
|
||||||
{
|
{
|
||||||
return cpu_physical_memory_get_dirty(page, VGA_DIRTY_FLAG);
|
return memory_region_get_dirty(&s->vram_region, page, DIRTY_MEMORY_VGA);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void reset_dirty(G364State *s,
|
static inline void reset_dirty(G364State *s,
|
||||||
ram_addr_t page_min, ram_addr_t page_max)
|
ram_addr_t page_min, ram_addr_t page_max)
|
||||||
{
|
{
|
||||||
cpu_physical_memory_reset_dirty(page_min, page_max + TARGET_PAGE_SIZE - 1,
|
memory_region_reset_dirty(&s->vram_region, page_min,
|
||||||
VGA_DIRTY_FLAG);
|
page_max + TARGET_PAGE_SIZE - 1,
|
||||||
|
DIRTY_MEMORY_VGA);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void g364fb_draw_graphic8(G364State *s)
|
static void g364fb_draw_graphic8(G364State *s)
|
||||||
@ -114,7 +115,7 @@ static void g364fb_draw_graphic8(G364State *s)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
page = s->vram_offset;
|
page = 0;
|
||||||
page_min = (ram_addr_t)-1;
|
page_min = (ram_addr_t)-1;
|
||||||
page_max = 0;
|
page_max = 0;
|
||||||
|
|
||||||
@ -135,7 +136,7 @@ static void g364fb_draw_graphic8(G364State *s)
|
|||||||
/* XXX: out of range in vram? */
|
/* XXX: out of range in vram? */
|
||||||
data_display = dd = ds_get_data(s->ds);
|
data_display = dd = ds_get_data(s->ds);
|
||||||
while (y < s->height) {
|
while (y < s->height) {
|
||||||
if (check_dirty(page)) {
|
if (check_dirty(s, page)) {
|
||||||
if (y < ymin)
|
if (y < ymin)
|
||||||
ymin = ymax = y;
|
ymin = ymax = y;
|
||||||
if (page_min == (ram_addr_t)-1)
|
if (page_min == (ram_addr_t)-1)
|
||||||
@ -275,7 +276,7 @@ static inline void g364fb_invalidate_display(void *opaque)
|
|||||||
|
|
||||||
s->blanked = 0;
|
s->blanked = 0;
|
||||||
for (i = 0; i < s->vram_size; i += TARGET_PAGE_SIZE) {
|
for (i = 0; i < s->vram_size; i += TARGET_PAGE_SIZE) {
|
||||||
cpu_physical_memory_set_dirty(s->vram_offset + i);
|
memory_region_set_dirty(&s->vram_region, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -411,7 +412,7 @@ static void g364_invalidate_cursor_position(G364State *s)
|
|||||||
end = (ymax + 1) * ds_get_linesize(s->ds);
|
end = (ymax + 1) * ds_get_linesize(s->ds);
|
||||||
|
|
||||||
for (i = start; i < end; i += TARGET_PAGE_SIZE) {
|
for (i = start; i < end; i += TARGET_PAGE_SIZE) {
|
||||||
cpu_physical_memory_set_dirty(s->vram_offset + i);
|
memory_region_set_dirty(&s->vram_region, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -522,16 +523,20 @@ static void g364fb_ctrl_writeb(void *opaque, target_phys_addr_t addr, uint32_t v
|
|||||||
g364fb_ctrl_writel(opaque, addr & ~0x3, val);
|
g364fb_ctrl_writel(opaque, addr & ~0x3, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CPUReadMemoryFunc * const g364fb_ctrl_read[3] = {
|
static const MemoryRegionOps g364fb_ctrl_ops = {
|
||||||
g364fb_ctrl_readb,
|
.old_mmio = {
|
||||||
g364fb_ctrl_readw,
|
.read = {
|
||||||
g364fb_ctrl_readl,
|
g364fb_ctrl_readb,
|
||||||
};
|
g364fb_ctrl_readw,
|
||||||
|
g364fb_ctrl_readl,
|
||||||
static CPUWriteMemoryFunc * const g364fb_ctrl_write[3] = {
|
},
|
||||||
g364fb_ctrl_writeb,
|
.write = {
|
||||||
g364fb_ctrl_writew,
|
g364fb_ctrl_writeb,
|
||||||
g364fb_ctrl_writel,
|
g364fb_ctrl_writew,
|
||||||
|
g364fb_ctrl_writel,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int g364fb_load(QEMUFile *f, void *opaque, int version_id)
|
static int g364fb_load(QEMUFile *f, void *opaque, int version_id)
|
||||||
@ -583,18 +588,19 @@ static void g364fb_save(QEMUFile *f, void *opaque)
|
|||||||
qemu_put_be32(f, s->height);
|
qemu_put_be32(f, s->height);
|
||||||
}
|
}
|
||||||
|
|
||||||
int g364fb_mm_init(target_phys_addr_t vram_base,
|
int g364fb_mm_init(MemoryRegion *system_memory,
|
||||||
|
target_phys_addr_t vram_base,
|
||||||
target_phys_addr_t ctrl_base, int it_shift,
|
target_phys_addr_t ctrl_base, int it_shift,
|
||||||
qemu_irq irq)
|
qemu_irq irq)
|
||||||
{
|
{
|
||||||
G364State *s;
|
G364State *s;
|
||||||
int io_ctrl;
|
MemoryRegion *io_ctrl = g_new(MemoryRegion, 1);
|
||||||
|
|
||||||
s = g_malloc0(sizeof(G364State));
|
s = g_malloc0(sizeof(G364State));
|
||||||
|
|
||||||
s->vram_size = 8 * 1024 * 1024;
|
s->vram_size = 8 * 1024 * 1024;
|
||||||
s->vram_offset = qemu_ram_alloc(NULL, "g364fb.vram", s->vram_size);
|
memory_region_init_ram(&s->vram_region, NULL, "g364fb.vram", s->vram_size);
|
||||||
s->vram = qemu_get_ram_ptr(s->vram_offset);
|
s->vram = memory_region_get_ram_ptr(&s->vram_region);
|
||||||
s->irq = irq;
|
s->irq = irq;
|
||||||
|
|
||||||
qemu_register_reset(g364fb_reset, s);
|
qemu_register_reset(g364fb_reset, s);
|
||||||
@ -605,11 +611,11 @@ int g364fb_mm_init(target_phys_addr_t vram_base,
|
|||||||
g364fb_invalidate_display,
|
g364fb_invalidate_display,
|
||||||
g364fb_screen_dump, NULL, s);
|
g364fb_screen_dump, NULL, s);
|
||||||
|
|
||||||
cpu_register_physical_memory(vram_base, s->vram_size, s->vram_offset);
|
memory_region_add_subregion(system_memory, vram_base, &s->vram_region);
|
||||||
|
|
||||||
io_ctrl = cpu_register_io_memory(g364fb_ctrl_read, g364fb_ctrl_write, s,
|
memory_region_init_io(io_ctrl, &g364fb_ctrl_ops, s,
|
||||||
DEVICE_NATIVE_ENDIAN);
|
"g364fb-ctrl", 0x200000);
|
||||||
cpu_register_physical_memory(ctrl_base, 0x200000, io_ctrl);
|
memory_region_add_subregion(system_memory, ctrl_base, io_ctrl);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
#define HW_MIPS_H
|
#define HW_MIPS_H
|
||||||
/* Definitions for mips board emulation. */
|
/* Definitions for mips board emulation. */
|
||||||
|
|
||||||
|
#include "memory.h"
|
||||||
|
|
||||||
/* gt64xxx.c */
|
/* gt64xxx.c */
|
||||||
PCIBus *gt64120_register(qemu_irq *pic);
|
PCIBus *gt64120_register(qemu_irq *pic);
|
||||||
|
|
||||||
@ -9,7 +11,7 @@ PCIBus *gt64120_register(qemu_irq *pic);
|
|||||||
PCIBus *bonito_init(qemu_irq *pic);
|
PCIBus *bonito_init(qemu_irq *pic);
|
||||||
|
|
||||||
/* g364fb.c */
|
/* g364fb.c */
|
||||||
int g364fb_mm_init(target_phys_addr_t vram_base,
|
int g364fb_mm_init(MemoryRegion *system_memory, target_phys_addr_t vram_base,
|
||||||
target_phys_addr_t ctrl_base, int it_shift,
|
target_phys_addr_t ctrl_base, int it_shift,
|
||||||
qemu_irq irq);
|
qemu_irq irq);
|
||||||
|
|
||||||
|
@ -195,7 +195,8 @@ void mips_jazz_init (ram_addr_t ram_size,
|
|||||||
/* Video card */
|
/* Video card */
|
||||||
switch (jazz_model) {
|
switch (jazz_model) {
|
||||||
case JAZZ_MAGNUM:
|
case JAZZ_MAGNUM:
|
||||||
g364fb_mm_init(0x40000000, 0x60000000, 0, rc4030[3]);
|
g364fb_mm_init(get_system_memory(), 0x40000000, 0x60000000, 0,
|
||||||
|
rc4030[3]);
|
||||||
break;
|
break;
|
||||||
case JAZZ_PICA61:
|
case JAZZ_PICA61:
|
||||||
isa_vga_mm_init(0x40000000, 0x60000000, 0, get_system_memory());
|
isa_vga_mm_init(0x40000000, 0x60000000, 0, get_system_memory());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user