Commit 1078f663ae65cb4e053b8cb7adff5908c4c7b8de
1 parent
0ac32c83
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
Showing
1 changed file
with
38 additions
and
6 deletions
hw/vga.c
... | ... | @@ -1129,14 +1129,14 @@ static void vga_draw_text(VGAState *s, int full_update) |
1129 | 1129 | |
1130 | 1130 | /* compute font data address (in plane 2) */ |
1131 | 1131 | v = s->sr[3]; |
1132 | - offset = (((v >> 5) & 1) | ((v >> 1) & 6)) * 8192 * 4 + 2; | |
1132 | + offset = (((v >> 4) & 1) | ((v << 1) & 6)) * 8192 * 4 + 2; | |
1133 | 1133 | if (offset != s->font_offsets[0]) { |
1134 | 1134 | s->font_offsets[0] = offset; |
1135 | 1135 | full_update = 1; |
1136 | 1136 | } |
1137 | 1137 | font_base[0] = s->vram_ptr + offset; |
1138 | 1138 | |
1139 | - offset = (((v >> 4) & 1) | ((v << 1) & 6)) * 8192 * 4 + 2; | |
1139 | + offset = (((v >> 5) & 1) | ((v >> 1) & 6)) * 8192 * 4 + 2; | |
1140 | 1140 | font_base[1] = s->vram_ptr + offset; |
1141 | 1141 | if (offset != s->font_offsets[1]) { |
1142 | 1142 | s->font_offsets[1] = offset; |
... | ... | @@ -1709,8 +1709,17 @@ static int vga_load(QEMUFile *f, void *opaque, int version_id) |
1709 | 1709 | return 0; |
1710 | 1710 | } |
1711 | 1711 | |
1712 | +static void vga_map(PCIDevice *pci_dev, int region_num, | |
1713 | + uint32_t addr, uint32_t size, int type) | |
1714 | +{ | |
1715 | + VGAState *s = &vga_state; | |
1716 | + | |
1717 | + cpu_register_physical_memory(addr, s->vram_size, s->vram_offset); | |
1718 | +} | |
1719 | + | |
1712 | 1720 | int vga_initialize(DisplayState *ds, uint8_t *vga_ram_base, |
1713 | - unsigned long vga_ram_offset, int vga_ram_size) | |
1721 | + unsigned long vga_ram_offset, int vga_ram_size, | |
1722 | + int is_pci) | |
1714 | 1723 | { |
1715 | 1724 | VGAState *s = &vga_state; |
1716 | 1725 | int i, j, v, b; |
... | ... | @@ -1782,13 +1791,36 @@ int vga_initialize(DisplayState *ds, uint8_t *vga_ram_base, |
1782 | 1791 | vga_io_memory = cpu_register_io_memory(0, vga_mem_read, vga_mem_write); |
1783 | 1792 | cpu_register_physical_memory(isa_mem_base + 0x000a0000, 0x20000, |
1784 | 1793 | vga_io_memory); |
1794 | + | |
1795 | + if (is_pci) { | |
1796 | + PCIDevice *d; | |
1797 | + uint8_t *pci_conf; | |
1798 | + | |
1799 | + d = pci_register_device("VGA", | |
1800 | + sizeof(PCIDevice), | |
1801 | + 0, -1, | |
1802 | + NULL, NULL); | |
1803 | + pci_conf = d->config; | |
1804 | + pci_conf[0x00] = 0x34; // dummy VGA (same as Bochs ID) | |
1805 | + pci_conf[0x01] = 0x12; | |
1806 | + pci_conf[0x02] = 0x11; | |
1807 | + pci_conf[0x03] = 0x11; | |
1808 | + pci_conf[0x0a] = 0x00; // VGA controller | |
1809 | + pci_conf[0x0b] = 0x03; | |
1810 | + pci_conf[0x0e] = 0x00; // header_type | |
1811 | + | |
1812 | + /* XXX: vga_ram_size must be a power of two */ | |
1813 | + pci_register_io_region(d, 0, vga_ram_size, | |
1814 | + PCI_ADDRESS_SPACE_MEM_PREFETCH, vga_map); | |
1815 | + } else { | |
1785 | 1816 | #ifdef CONFIG_BOCHS_VBE |
1786 | 1817 | #if defined (TARGET_I386) |
1787 | - /* XXX: use optimized standard vga accesses */ | |
1788 | - cpu_register_physical_memory(VBE_DISPI_LFB_PHYSICAL_ADDRESS, | |
1789 | - vga_ram_size, vga_ram_offset); | |
1818 | + /* XXX: use optimized standard vga accesses */ | |
1819 | + cpu_register_physical_memory(VBE_DISPI_LFB_PHYSICAL_ADDRESS, | |
1820 | + vga_ram_size, vga_ram_offset); | |
1790 | 1821 | #endif |
1791 | 1822 | #endif |
1823 | + } | |
1792 | 1824 | return 0; |
1793 | 1825 | } |
1794 | 1826 | ... | ... |