[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 18/18] tcx: convert to memory API
From: |
Blue Swirl |
Subject: |
Re: [Qemu-devel] [PATCH 18/18] tcx: convert to memory API |
Date: |
Mon, 17 Oct 2011 19:13:13 +0000 |
On Mon, Oct 17, 2011 at 2:02 PM, Avi Kivity <address@hidden> wrote:
> Signed-off-by: Avi Kivity <address@hidden>
> ---
> hw/tcx.c | 152 ++++++++++++++++++++++++++++++++++---------------------------
> 1 files changed, 85 insertions(+), 67 deletions(-)
>
> diff --git a/hw/tcx.c b/hw/tcx.c
> index 309600d..cd24100 100644
> --- a/hw/tcx.c
> +++ b/hw/tcx.c
> @@ -40,7 +40,15 @@
> DisplayState *ds;
> uint8_t *vram;
> uint32_t *vram24, *cplane;
> - ram_addr_t vram_offset, vram24_offset, cplane_offset;
> + MemoryRegion vram_mem;
> + MemoryRegion vram_8bit;
> + MemoryRegion vram_24bit;
> + MemoryRegion vram_cplane;
> + MemoryRegion dac;
> + MemoryRegion tec;
> + MemoryRegion thc24;
> + MemoryRegion thc8;
> + ram_addr_t vram24_offset, cplane_offset;
> uint32_t vram_size;
> uint32_t palette[256];
> uint8_t r[256], g[256], b[256];
> @@ -56,7 +64,7 @@ static void tcx_set_dirty(TCXState *s)
> unsigned int i;
>
> for (i = 0; i < MAXX * MAXY; i += TARGET_PAGE_SIZE) {
> - cpu_physical_memory_set_dirty(s->vram_offset + i);
> + memory_region_set_dirty(&s->vram_mem, i);
> }
> }
>
> @@ -65,8 +73,8 @@ static void tcx24_set_dirty(TCXState *s)
> unsigned int i;
>
> for (i = 0; i < MAXX * MAXY * 4; i += TARGET_PAGE_SIZE) {
> - cpu_physical_memory_set_dirty(s->vram24_offset + i);
> - cpu_physical_memory_set_dirty(s->cplane_offset + i);
> + memory_region_set_dirty(&s->vram_mem, s->vram24_offset + i);
> + memory_region_set_dirty(&s->vram_mem, s->cplane_offset + i);
> }
> }
>
> @@ -174,16 +182,18 @@ static inline void tcx24_draw_line32(TCXState *s1,
> uint8_t *d,
> }
> }
>
> -static inline int check_dirty(ram_addr_t page, ram_addr_t page24,
> +static inline int check_dirty(TCXState *s, ram_addr_t page, ram_addr_t
> page24,
> ram_addr_t cpage)
> {
> int ret;
> unsigned int off;
>
> - ret = cpu_physical_memory_get_dirty(page, VGA_DIRTY_FLAG);
> + ret = memory_region_get_dirty(&s->vram_mem, page, DIRTY_MEMORY_VGA);
> for (off = 0; off < TARGET_PAGE_SIZE * 4; off += TARGET_PAGE_SIZE) {
> - ret |= cpu_physical_memory_get_dirty(page24 + off, VGA_DIRTY_FLAG);
> - ret |= cpu_physical_memory_get_dirty(cpage + off, VGA_DIRTY_FLAG);
> + ret |= memory_region_get_dirty(&s->vram_mem, page24 + off,
> + DIRTY_MEMORY_VGA);
> + ret |= memory_region_get_dirty(&s->vram_mem, cpage + off,
> + DIRTY_MEMORY_VGA);
Like memory_region_set_dirty(), this should be changed to take a range
so that the for loops and PAGE_SIZEs can be dropped.
> }
> return ret;
> }
> @@ -192,16 +202,17 @@ static inline void reset_dirty(TCXState *ts, ram_addr_t
> page_min,
> ram_addr_t page_max, ram_addr_t page24,
> ram_addr_t cpage)
> {
> - cpu_physical_memory_reset_dirty(page_min, page_max + TARGET_PAGE_SIZE,
> - VGA_DIRTY_FLAG);
> - page_min -= ts->vram_offset;
> - page_max -= ts->vram_offset;
> - cpu_physical_memory_reset_dirty(page24 + page_min * 4,
> - page24 + page_max * 4 + TARGET_PAGE_SIZE,
> - VGA_DIRTY_FLAG);
> - cpu_physical_memory_reset_dirty(cpage + page_min * 4,
> - cpage + page_max * 4 + TARGET_PAGE_SIZE,
> - VGA_DIRTY_FLAG);
> + memory_region_reset_dirty(&ts->vram_mem,
> + page_min, page_max + TARGET_PAGE_SIZE,
> + DIRTY_MEMORY_VGA);
> + memory_region_reset_dirty(&ts->vram_mem,
> + page24 + page_min * 4,
> + page24 + page_max * 4 + TARGET_PAGE_SIZE,
> + DIRTY_MEMORY_VGA);
> + memory_region_reset_dirty(&ts->vram_mem,
> + cpage + page_min * 4,
> + cpage + page_max * 4 + TARGET_PAGE_SIZE,
> + DIRTY_MEMORY_VGA);
> }
>
> /* Fixed line length 1024 allows us to do nice tricks not possible on
> @@ -216,7 +227,7 @@ static void tcx_update_display(void *opaque)
>
> if (ds_get_bits_per_pixel(ts->ds) == 0)
> return;
> - page = ts->vram_offset;
> + page = 0;
> y_start = -1;
> page_min = -1;
> page_max = 0;
> @@ -242,7 +253,7 @@ static void tcx_update_display(void *opaque)
> }
>
> for(y = 0; y < ts->height; y += 4, page += TARGET_PAGE_SIZE) {
> - if (cpu_physical_memory_get_dirty(page, VGA_DIRTY_FLAG)) {
> + if (memory_region_get_dirty(&ts->vram_mem, page, DIRTY_MEMORY_VGA)) {
> if (y_start < 0)
> y_start = y;
> if (page < page_min)
> @@ -279,8 +290,9 @@ static void tcx_update_display(void *opaque)
> }
> /* reset modified pages */
> if (page_max >= page_min) {
> - cpu_physical_memory_reset_dirty(page_min, page_max +
> TARGET_PAGE_SIZE,
> - VGA_DIRTY_FLAG);
> + memory_region_reset_dirty(&ts->vram_mem,
> + page_min, page_max + TARGET_PAGE_SIZE,
> + DIRTY_MEMORY_VGA);
> }
> }
>
> @@ -294,7 +306,7 @@ static void tcx24_update_display(void *opaque)
>
> if (ds_get_bits_per_pixel(ts->ds) != 32)
> return;
> - page = ts->vram_offset;
> + page = 0;
> page24 = ts->vram24_offset;
> cpage = ts->cplane_offset;
> y_start = -1;
> @@ -309,7 +321,7 @@ static void tcx24_update_display(void *opaque)
>
> for(y = 0; y < ts->height; y += 4, page += TARGET_PAGE_SIZE,
> page24 += TARGET_PAGE_SIZE, cpage += TARGET_PAGE_SIZE) {
> - if (check_dirty(page, page24, cpage)) {
> + if (check_dirty(ts, page, page24, cpage)) {
> if (y_start < 0)
> y_start = y;
> if (page < page_min)
> @@ -421,18 +433,20 @@ static void tcx_reset(DeviceState *d)
> s->r[255] = s->g[255] = s->b[255] = 255;
> update_palette_entries(s, 0, 256);
> memset(s->vram, 0, MAXX*MAXY);
> - cpu_physical_memory_reset_dirty(s->vram_offset, s->vram_offset +
> - MAXX * MAXY * (1 + 4 + 4),
> VGA_DIRTY_FLAG);
> + memory_region_reset_dirty(&s->vram_mem, 0, MAXX * MAXY * (1 + 4 + 4),
> + DIRTY_MEMORY_VGA);
> s->dac_index = 0;
> s->dac_state = 0;
> }
>
> -static uint32_t tcx_dac_readl(void *opaque, target_phys_addr_t addr)
> +static uint64_t tcx_dac_readl(void *opaque, target_phys_addr_t addr,
> + unsigned size)
> {
> return 0;
> }
>
> -static void tcx_dac_writel(void *opaque, target_phys_addr_t addr, uint32_t
> val)
> +static void tcx_dac_writel(void *opaque, target_phys_addr_t addr, uint64_t
> val,
> + unsigned size)
> {
> TCXState *s = opaque;
>
> @@ -468,77 +482,77 @@ static void tcx_dac_writel(void *opaque,
> target_phys_addr_t addr, uint32_t val)
> return;
> }
>
> -static CPUReadMemoryFunc * const tcx_dac_read[3] = {
> - NULL,
> - NULL,
> - tcx_dac_readl,
> +static const MemoryRegionOps tcx_dac_ops = {
> + .read = tcx_dac_readl,
> + .write = tcx_dac_writel,
> + .endianness = DEVICE_NATIVE_ENDIAN,
> + .valid = {
> + .min_access_size = 4,
> + .max_access_size = 4,
> + },
> };
>
> -static CPUWriteMemoryFunc * const tcx_dac_write[3] = {
> - NULL,
> - NULL,
> - tcx_dac_writel,
> -};
> -
> -static uint32_t tcx_dummy_readl(void *opaque, target_phys_addr_t addr)
> +static uint64_t dummy_readl(void *opaque, target_phys_addr_t addr,
> + unsigned size)
> {
> return 0;
> }
>
> -static void tcx_dummy_writel(void *opaque, target_phys_addr_t addr,
> - uint32_t val)
> +static void dummy_writel(void *opaque, target_phys_addr_t addr,
> + uint64_t val, unsigned size)
> {
> }
>
> -static CPUReadMemoryFunc * const tcx_dummy_read[3] = {
> - NULL,
> - NULL,
> - tcx_dummy_readl,
> -};
> -
> -static CPUWriteMemoryFunc * const tcx_dummy_write[3] = {
> - NULL,
> - NULL,
> - tcx_dummy_writel,
> +static const MemoryRegionOps dummy_ops = {
> + .read = dummy_readl,
> + .write = dummy_writel,
> + .endianness = DEVICE_NATIVE_ENDIAN,
> + .valid = {
> + .min_access_size = 4,
> + .max_access_size = 4,
> + },
> };
>
> static int tcx_init1(SysBusDevice *dev)
> {
> TCXState *s = FROM_SYSBUS(TCXState, dev);
> - int io_memory, dummy_memory;
> - ram_addr_t vram_offset;
> + ram_addr_t vram_offset = 0;
> int size;
> uint8_t *vram_base;
>
> - vram_offset = qemu_ram_alloc(NULL, "tcx.vram", s->vram_size * (1 + 4 +
> 4));
> - vram_base = qemu_get_ram_ptr(vram_offset);
> - s->vram_offset = vram_offset;
> + memory_region_init_ram(&s->vram_mem, NULL, "tcx.vram",
> + s->vram_size * (1 + 4 + 4));
> + vram_base = memory_region_get_ram_ptr(&s->vram_mem);
>
> /* 8-bit plane */
> s->vram = vram_base;
> size = s->vram_size;
> - sysbus_init_mmio(dev, size, s->vram_offset);
> + memory_region_init_alias(&s->vram_8bit, "tcx.vram.8bit",
> + &s->vram_mem, vram_offset, size);
> + sysbus_init_mmio_region(dev, &s->vram_8bit);
> vram_offset += size;
> vram_base += size;
>
> /* DAC */
> - io_memory = cpu_register_io_memory(tcx_dac_read, tcx_dac_write, s,
> - DEVICE_NATIVE_ENDIAN);
> - sysbus_init_mmio(dev, TCX_DAC_NREGS, io_memory);
> + memory_region_init_io(&s->dac, &tcx_dac_ops, s, "tcx.dac",
> TCX_DAC_NREGS);
> + sysbus_init_mmio_region(dev, &s->dac);
>
> /* TEC (dummy) */
> - dummy_memory = cpu_register_io_memory(tcx_dummy_read, tcx_dummy_write,
> - s, DEVICE_NATIVE_ENDIAN);
> - sysbus_init_mmio(dev, TCX_TEC_NREGS, dummy_memory);
> + memory_region_init_io(&s->tec, &dummy_ops, s, "tcx.tec", TCX_TEC_NREGS);
> + sysbus_init_mmio_region(dev, &s->tec);
> /* THC: NetBSD writes here even with 8-bit display: dummy */
> - sysbus_init_mmio(dev, TCX_THC_NREGS_24, dummy_memory);
> + memory_region_init_io(&s->thc24, &dummy_ops, s, "tcx.thc24",
> + TCX_THC_NREGS_24);
> + sysbus_init_mmio_region(dev, &s->thc24);
>
> if (s->depth == 24) {
> /* 24-bit plane */
> size = s->vram_size * 4;
> s->vram24 = (uint32_t *)vram_base;
> s->vram24_offset = vram_offset;
> - sysbus_init_mmio(dev, size, vram_offset);
> + memory_region_init_alias(&s->vram_24bit, "tcx.vram.24bit",
> + &s->vram_mem, vram_offset, size);
> + sysbus_init_mmio_region(dev, &s->vram_24bit);
> vram_offset += size;
> vram_base += size;
>
> @@ -546,14 +560,18 @@ static int tcx_init1(SysBusDevice *dev)
> size = s->vram_size * 4;
> s->cplane = (uint32_t *)vram_base;
> s->cplane_offset = vram_offset;
> - sysbus_init_mmio(dev, size, vram_offset);
> + memory_region_init_alias(&s->vram_cplane, "tcx.vram.cplane",
> + &s->vram_mem, vram_offset, size);
> + sysbus_init_mmio_region(dev, &s->vram_cplane);
>
> s->ds = graphic_console_init(tcx24_update_display,
> tcx24_invalidate_display,
> tcx24_screen_dump, NULL, s);
> } else {
> /* THC 8 bit (dummy) */
> - sysbus_init_mmio(dev, TCX_THC_NREGS_8, dummy_memory);
> + memory_region_init_io(&s->thc8, &dummy_ops, s, "tcx.thc8",
> + TCX_THC_NREGS_8);
> + sysbus_init_mmio_region(dev, &s->thc8);
>
> s->ds = graphic_console_init(tcx_update_display,
> tcx_invalidate_display,
> --
> 1.7.6.3
>
>
>
- [Qemu-devel] [PATCH 00/18] Memory API conversions, batch 12, Avi Kivity, 2011/10/17
- [Qemu-devel] [PATCH 01/18] ppc_oldworld: convert to memory API, Avi Kivity, 2011/10/17
- [Qemu-devel] [PATCH 02/18] ppc_prep: convert to memory API, Avi Kivity, 2011/10/17
- [Qemu-devel] [PATCH 06/18] ppcr500_mpc8544ds: convert to memory API, Avi Kivity, 2011/10/17
- [Qemu-devel] [PATCH 16/18] syborg: convert to memory API, Avi Kivity, 2011/10/17
- [Qemu-devel] [PATCH 18/18] tcx: convert to memory API, Avi Kivity, 2011/10/17
- Re: [Qemu-devel] [PATCH 18/18] tcx: convert to memory API,
Blue Swirl <=
[Qemu-devel] [PATCH 11/18] spapr: convert to memory API, Avi Kivity, 2011/10/17
[Qemu-devel] [PATCH 09/18] s390-virtio: convert to memory API, Avi Kivity, 2011/10/17
[Qemu-devel] [PATCH 03/18] pxa2xx: convert to memory API (part I), Avi Kivity, 2011/10/17
[Qemu-devel] [PATCH 04/18] pxa2xx: convert to memory API (part II), Avi Kivity, 2011/10/17
[Qemu-devel] [PATCH 12/18] spitz: convert to memory API, Avi Kivity, 2011/10/17
[Qemu-devel] [PATCH 08/18] realview: convert to memory API, Avi Kivity, 2011/10/17