From patchwork Wed Oct 28 16:51:20 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?5q2m55SwID0/SVNPLTIwMjItSlA/Qj9JQnNrUWoxVFRHa2JLRUk9Pz0=?= X-Patchwork-Id: 37142 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 824FE100813 for ; Thu, 29 Oct 2009 08:54:25 +1100 (EST) Received: from localhost ([127.0.0.1]:57072 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N3CQi-0004Dm-9q for incoming@patchwork.ozlabs.org; Wed, 28 Oct 2009 13:35:28 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1N3Bn5-0007Yz-B5 for qemu-devel@nongnu.org; Wed, 28 Oct 2009 12:54:31 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1N3Bmx-0007Ox-Jl for qemu-devel@nongnu.org; Wed, 28 Oct 2009 12:54:28 -0400 Received: from [199.232.76.173] (port=45983 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N3Bmx-0007OO-B7 for qemu-devel@nongnu.org; Wed, 28 Oct 2009 12:54:23 -0400 Received: from smtp-vip.mem.interq.net ([210.157.1.50]:34311 helo=smtp01.mem.internal-gmo) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1N3Bmw-0002l8-8m for qemu-devel@nongnu.org; Wed, 28 Oct 2009 12:54:22 -0400 Received: (from root@localhost) by smtp01.mem.internal-gmo (8.13.8/8.12.6) id n9SGs6bV018681 for qemu-devel@nongnu.org; Thu, 29 Oct 2009 01:54:06 +0900 (JST) Received: from YOUR-BD18D6DD63.m1.interq.or.jp (ntymns039132.ymns.nt.ftth.ppp.infoweb.ne.jp [121.92.167.132]) by smtp01.mem.internal-gmo with ESMTP id n9SGs5ZR018647 for ; (me101664 for with PLAIN) Thu, 29 Oct 2009 01:54:06 +0900 (JST) Message-Id: <200910281651.AA00169@YOUR-BD18D6DD63.m1.interq.or.jp> Date: Thu, 29 Oct 2009 01:51:20 +0900 To: qemu-devel From: "TAKEDA, toshiya" MIME-Version: 1.0 X-Mailer: AL-Mail32 Version 1.13 X-detected-operating-system: by monty-python.gnu.org: Solaris 10 (beta) Subject: [Qemu-devel] [PATCH v3 5/25] cirrus_vga: add NEC PC-9821 family interface X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org diff --git a/qemu/hw/cirrus_vga.c b/qemu/hw/cirrus_vga.c index 9dfe76a..e31dd75 100644 --- a/qemu/hw/cirrus_vga.c +++ b/qemu/hw/cirrus_vga.c @@ -2586,6 +2586,9 @@ static CPUWriteMemoryFunc * const cirrus_linear_bitblt_write[3] = { static void map_linear_vram(CirrusVGAState *s) { + if (!s->vga.vga_io_memory) + return; + if (!s->vga.map_addr && s->vga.lfb_addr && s->vga.lfb_end) { s->vga.map_addr = s->vga.lfb_addr; s->vga.map_end = s->vga.lfb_end; @@ -2619,6 +2622,9 @@ static void map_linear_vram(CirrusVGAState *s) static void unmap_linear_vram(CirrusVGAState *s) { + if (!s->vga.vga_io_memory) + return; + if (s->vga.map_addr && s->vga.lfb_addr && s->vga.lfb_end) s->vga.map_addr = s->vga.map_end = 0; @@ -3062,7 +3068,8 @@ static void cirrus_reset(void *opaque) s->cirrus_hidden_dac_data = 0; } -static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci) +static void cirrus_init_device(CirrusVGAState * s, + int device_id, int vram_size, int is_pci) { int i; static int inited; @@ -3094,6 +3101,21 @@ static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci) s->bustype = CIRRUS_BUSTYPE_ISA; } + s->real_vram_size = vram_size; + + /* XXX: s->vga.vram_size must be a power of two */ + s->cirrus_addr_mask = s->real_vram_size - 1; + s->linear_mmio_mask = s->real_vram_size - 256; + + s->vga.get_bpp = cirrus_get_bpp; + s->vga.get_offsets = cirrus_get_offsets; + s->vga.get_resolution = cirrus_get_resolution; + s->vga.cursor_invalidate = cirrus_cursor_invalidate; + s->vga.cursor_draw_line = cirrus_cursor_draw_line; +} + +static void cirrus_init_ioport(CirrusVGAState * s) +{ register_ioport_write(0x3c0, 16, 1, cirrus_vga_ioport_write, s); register_ioport_write(0x3b4, 2, 1, cirrus_vga_ioport_write, s); @@ -3126,20 +3148,15 @@ static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci) /* I/O handler for memory-mapped I/O */ s->cirrus_mmio_io_addr = cpu_register_io_memory(cirrus_mmio_read, cirrus_mmio_write, s); +} - s->real_vram_size = +static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci) +{ + int vram_size = (s->device_id == CIRRUS_ID_CLGD5446) ? 4096 * 1024 : 2048 * 1024; - /* XXX: s->vga.vram_size must be a power of two */ - s->cirrus_addr_mask = s->real_vram_size - 1; - s->linear_mmio_mask = s->real_vram_size - 256; - - s->vga.get_bpp = cirrus_get_bpp; - s->vga.get_offsets = cirrus_get_offsets; - s->vga.get_resolution = cirrus_get_resolution; - s->vga.cursor_invalidate = cirrus_cursor_invalidate; - s->vga.cursor_draw_line = cirrus_cursor_draw_line; - + cirrus_init_device(s, device_id, vram_size, is_pci); + cirrus_init_ioport(s); qemu_register_reset(cirrus_reset, s); cirrus_reset(s); } @@ -3254,6 +3271,106 @@ void pci_cirrus_vga_init(PCIBus *bus) pci_create_simple(bus, -1, "Cirrus VGA"); } +/*************************************** + * + * NEC PC-9821 + * + ***************************************/ + +uint32_t pc98_cirrus_vram_readb(void *opaque, target_phys_addr_t addr) +{ + return cirrus_vga_mem_readb(opaque, addr & 0xffff); +} + +uint32_t pc98_cirrus_vram_readw(void *opaque, target_phys_addr_t addr) +{ + return cirrus_vga_mem_readw(opaque, addr & 0xffff); +} + +uint32_t pc98_cirrus_vram_readl(void *opaque, target_phys_addr_t addr) +{ + return cirrus_vga_mem_readl(opaque, addr & 0xffff); +} + +void pc98_cirrus_vram_writeb(void *opaque, + target_phys_addr_t addr, uint32_t value) +{ + cirrus_vga_mem_writeb(opaque, addr & 0xffff, value); +} + +void pc98_cirrus_vram_writew(void *opaque, + target_phys_addr_t addr, uint32_t value) +{ + cirrus_vga_mem_writew(opaque, addr & 0xffff, value); +} + +void pc98_cirrus_vram_writel(void *opaque, + target_phys_addr_t addr, uint32_t value) +{ + cirrus_vga_mem_writel(opaque, addr & 0xffff, value); +} + +static uint32_t pc98_cirrus_vga_ioport_read(void *opaque, + target_phys_addr_t addr) +{ + addr = 0x300 | ((addr >> 8) & 0xf0) | (addr & 0x0f); + return cirrus_vga_ioport_read(opaque, addr); +} + +static void pc98_cirrus_vga_ioport_write(void *opaque, + target_phys_addr_t addr, uint32_t val) +{ + addr = 0x300 | ((addr >> 8) & 0xf0) | (addr & 0x0f); + cirrus_vga_ioport_write(opaque, addr, val); +} + +void *pc98_cirrus_vga_init(DisplayState *ds) +{ + CirrusVGAState *s; + + s = qemu_mallocz(sizeof(CirrusVGAState)); + + vga_common_init(&s->vga, PC98_CIRRUS_VRAM_SIZE); + cirrus_init_device(s, CIRRUS_ID_CLGD5430, PC98_CIRRUS_VRAM_SIZE, 0); + + register_ioport_write(0xca0, 16, 1, pc98_cirrus_vga_ioport_write, s); + register_ioport_write(0xda4, 2, 1, pc98_cirrus_vga_ioport_write, s); + register_ioport_write(0xdaa, 1, 1, pc98_cirrus_vga_ioport_write, s); + register_ioport_read(0xca0, 16, 1, pc98_cirrus_vga_ioport_read, s); + register_ioport_read(0xda4, 2, 1, pc98_cirrus_vga_ioport_read, s); + register_ioport_read(0xdaa, 1, 1, pc98_cirrus_vga_ioport_read, s); + + qemu_register_reset(cirrus_reset, s); + cirrus_reset(s); + + s->vga.ds = ds; + vmstate_register(0, &vmstate_cirrus_vga, s); + + return s; +} + +void pc98_cirrus_vga_invalidate_display_size(void *opaque) +{ + CirrusVGAState *s = opaque; + + s->vga.last_width = -1; + s->vga.last_height = -1; +} + +void pc98_cirrus_vga_update_display(void *opaque) +{ + CirrusVGAState *s = opaque; + + s->vga.update(&s->vga); +} + +void pc98_cirrus_vga_invalidate_display(void *opaque) +{ + CirrusVGAState *s = opaque; + + s->vga.invalidate(&s->vga); +} + static PCIDeviceInfo cirrus_vga_info = { .qdev.name = "Cirrus VGA", .qdev.size = sizeof(PCICirrusVGAState),