blob: 6a75f3787efcfd6aa0124517307efa535435473c [file] [log] [blame]
Gerd Hoffmann77404b42017-11-15 14:43:10 +01001#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
15int
16bochs_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 Hoffmann7bf9fff2018-06-15 08:18:45 +020041 return -1;
Gerd Hoffmann77404b42017-11-15 14:43:10 +010042
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}