diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2004-05-20 12:46:38 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2004-05-20 12:46:38 +0000 |
commit | 1078f663ae65cb4e053b8cb7adff5908c4c7b8de (patch) | |
tree | c5bdd9131e05398c64b2655694600f263a6cb65a /hw/vga.c | |
parent | 0ac32c837507260009d170af15f4ae9652a9ea97 (diff) |
dummy VGA PCI support - VGA font selection fix (Daniel Serpell)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@824 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw/vga.c')
-rw-r--r-- | hw/vga.c | 44 |
1 files changed, 38 insertions, 6 deletions
@@ -1129,14 +1129,14 @@ static void vga_draw_text(VGAState *s, int full_update) /* compute font data address (in plane 2) */ v = s->sr[3]; - offset = (((v >> 5) & 1) | ((v >> 1) & 6)) * 8192 * 4 + 2; + offset = (((v >> 4) & 1) | ((v << 1) & 6)) * 8192 * 4 + 2; if (offset != s->font_offsets[0]) { s->font_offsets[0] = offset; full_update = 1; } font_base[0] = s->vram_ptr + offset; - offset = (((v >> 4) & 1) | ((v << 1) & 6)) * 8192 * 4 + 2; + offset = (((v >> 5) & 1) | ((v >> 1) & 6)) * 8192 * 4 + 2; font_base[1] = s->vram_ptr + offset; if (offset != s->font_offsets[1]) { s->font_offsets[1] = offset; @@ -1709,8 +1709,17 @@ static int vga_load(QEMUFile *f, void *opaque, int version_id) return 0; } +static void vga_map(PCIDevice *pci_dev, int region_num, + uint32_t addr, uint32_t size, int type) +{ + VGAState *s = &vga_state; + + cpu_register_physical_memory(addr, s->vram_size, s->vram_offset); +} + int vga_initialize(DisplayState *ds, uint8_t *vga_ram_base, - unsigned long vga_ram_offset, int vga_ram_size) + unsigned long vga_ram_offset, int vga_ram_size, + int is_pci) { VGAState *s = &vga_state; int i, j, v, b; @@ -1782,13 +1791,36 @@ int vga_initialize(DisplayState *ds, uint8_t *vga_ram_base, vga_io_memory = cpu_register_io_memory(0, vga_mem_read, vga_mem_write); cpu_register_physical_memory(isa_mem_base + 0x000a0000, 0x20000, vga_io_memory); + + if (is_pci) { + PCIDevice *d; + uint8_t *pci_conf; + + d = pci_register_device("VGA", + sizeof(PCIDevice), + 0, -1, + NULL, NULL); + pci_conf = d->config; + pci_conf[0x00] = 0x34; // dummy VGA (same as Bochs ID) + pci_conf[0x01] = 0x12; + pci_conf[0x02] = 0x11; + pci_conf[0x03] = 0x11; + pci_conf[0x0a] = 0x00; // VGA controller + pci_conf[0x0b] = 0x03; + pci_conf[0x0e] = 0x00; // header_type + + /* XXX: vga_ram_size must be a power of two */ + pci_register_io_region(d, 0, vga_ram_size, + PCI_ADDRESS_SPACE_MEM_PREFETCH, vga_map); + } else { #ifdef CONFIG_BOCHS_VBE #if defined (TARGET_I386) - /* XXX: use optimized standard vga accesses */ - cpu_register_physical_memory(VBE_DISPI_LFB_PHYSICAL_ADDRESS, - vga_ram_size, vga_ram_offset); + /* XXX: use optimized standard vga accesses */ + cpu_register_physical_memory(VBE_DISPI_LFB_PHYSICAL_ADDRESS, + vga_ram_size, vga_ram_offset); #endif #endif + } return 0; } |