Commit 1078f663ae65cb4e053b8cb7adff5908c4c7b8de

Authored by bellard
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  
... ...