Gerd Hoffmann | 77404b4 | 2017-11-15 14:43:10 +0100 | [diff] [blame] | 1 | #include "biosvar.h" // GET_BDA |
| 2 | #include "output.h" // dprintf |
| 3 | #include "string.h" // memset16_far |
| 4 | #include "bochsvga.h" // VBE_BOCHS_* |
| 5 | #include "hw/pci.h" // pci_config_readl |
| 6 | #include "hw/pci_regs.h" // PCI_BASE_ADDRESS_0 |
| 7 | #include "vgautil.h" // VBE_total_memory |
| 8 | |
| 9 | #define FRAMEBUFFER_WIDTH 1024 |
| 10 | #define FRAMEBUFFER_HEIGHT 768 |
| 11 | #define FRAMEBUFFER_BPP 4 |
| 12 | #define FRAMEBUFFER_STRIDE (FRAMEBUFFER_BPP * FRAMEBUFFER_WIDTH) |
| 13 | #define FRAMEBUFFER_SIZE (FRAMEBUFFER_STRIDE * FRAMEBUFFER_HEIGHT) |
| 14 | |
| 15 | int |
| 16 | bochs_display_setup(void) |
| 17 | { |
| 18 | dprintf(1, "bochs-display: setup called\n"); |
| 19 | |
| 20 | if (GET_GLOBAL(HaveRunInit)) |
| 21 | return 0; |
| 22 | |
| 23 | int bdf = GET_GLOBAL(VgaBDF); |
| 24 | if (bdf == 0) |
| 25 | return 0; |
| 26 | |
| 27 | u32 bar = pci_config_readl(bdf, PCI_BASE_ADDRESS_0); |
| 28 | u32 lfb_addr = bar & PCI_BASE_ADDRESS_MEM_MASK; |
| 29 | bar = pci_config_readl(bdf, PCI_BASE_ADDRESS_2); |
| 30 | u32 io_addr = bar & PCI_BASE_ADDRESS_IO_MASK; |
| 31 | dprintf(1, "bochs-display: bdf %02x:%02x.%x, bar 0 at 0x%x, bar 1 at 0x%x\n" |
| 32 | , pci_bdf_to_bus(bdf) , pci_bdf_to_dev(bdf), pci_bdf_to_fn(bdf), |
| 33 | lfb_addr, io_addr); |
| 34 | |
| 35 | u16 *dispi = (void*)(io_addr + 0x500); |
| 36 | u8 *vga = (void*)(io_addr + 0x400); |
| 37 | u16 id = readw(dispi + VBE_DISPI_INDEX_ID); |
| 38 | dprintf(1, "bochs-display: id is 0x%x, %s\n", id |
| 39 | , id == VBE_DISPI_ID5 ? "good" : "FAIL"); |
| 40 | if (id != VBE_DISPI_ID5) |
Gerd Hoffmann | 7bf9fff | 2018-06-15 08:18:45 +0200 | [diff] [blame^] | 41 | return -1; |
Gerd Hoffmann | 77404b4 | 2017-11-15 14:43:10 +0100 | [diff] [blame] | 42 | |
| 43 | dprintf(1, "bochs-display: using %dx%d, %d bpp (%d stride)\n" |
| 44 | , FRAMEBUFFER_WIDTH, FRAMEBUFFER_HEIGHT |
| 45 | , FRAMEBUFFER_BPP * 8, FRAMEBUFFER_STRIDE); |
| 46 | |
| 47 | cbvga_setup_modes(lfb_addr, FRAMEBUFFER_BPP * 8, |
| 48 | FRAMEBUFFER_WIDTH, FRAMEBUFFER_HEIGHT, |
| 49 | FRAMEBUFFER_STRIDE); |
| 50 | |
| 51 | writew(dispi + VBE_DISPI_INDEX_XRES, FRAMEBUFFER_WIDTH); |
| 52 | writew(dispi + VBE_DISPI_INDEX_YRES, FRAMEBUFFER_HEIGHT); |
| 53 | writew(dispi + VBE_DISPI_INDEX_BPP, FRAMEBUFFER_BPP * 8); |
| 54 | writew(dispi + VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED); |
| 55 | |
| 56 | writeb(vga, 0x20); /* unblank (for qemu -device VGA) */ |
| 57 | |
| 58 | return 0; |
| 59 | } |