3 #include "kvm/virtio-pci-dev.h"
4 #include "kvm/framebuffer.h"
5 #include "kvm/kvm-cpu.h"
6 #include "kvm/ioport.h"
12 #include <linux/byteorder.h>
14 #include <linux/err.h>
15 #include <sys/types.h>
16 #include <sys/ioctl.h>
20 static bool vesa_pci_io_in(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size)
25 static bool vesa_pci_io_out(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size)
30 static struct ioport_operations vesa_io_ops = {
31 .io_in = vesa_pci_io_in,
32 .io_out = vesa_pci_io_out,
35 static struct pci_device_header vesa_pci_device = {
36 .vendor_id = cpu_to_le16(PCI_VENDOR_ID_REDHAT_QUMRANET),
37 .device_id = cpu_to_le16(PCI_DEVICE_ID_VESA),
38 .header_type = PCI_HEADER_TYPE_NORMAL,
41 .subsys_vendor_id = cpu_to_le16(PCI_SUBSYSTEM_VENDOR_ID_REDHAT_QUMRANET),
42 .subsys_id = cpu_to_le16(PCI_SUBSYSTEM_ID_VESA),
43 .bar[1] = cpu_to_le32(VESA_MEM_ADDR | PCI_BASE_ADDRESS_SPACE_MEMORY),
44 .bar_size[1] = VESA_MEM_SIZE,
47 static struct framebuffer vesafb;
49 struct framebuffer *vesa__init(struct kvm *kvm)
56 if (!kvm->cfg.vnc && !kvm->cfg.sdl)
59 r = irq__register_device(PCI_DEVICE_ID_VESA, &dev, &pin, &line);
63 r = ioport__register(kvm, IOPORT_EMPTY, &vesa_io_ops, IOPORT_SIZE, NULL);
67 vesa_pci_device.irq_pin = pin;
68 vesa_pci_device.irq_line = line;
69 vesa_base_addr = (u16)r;
70 vesa_pci_device.bar[0] = cpu_to_le32(vesa_base_addr | PCI_BASE_ADDRESS_SPACE_IO);
71 pci__register(&vesa_pci_device, dev);
73 mem = mmap(NULL, VESA_MEM_SIZE, PROT_RW, MAP_ANON_NORESERVE, -1, 0);
74 if (mem == MAP_FAILED)
77 kvm__register_mem(kvm, VESA_MEM_ADDR, VESA_MEM_SIZE, mem);
79 vesafb = (struct framebuffer) {
81 .height = VESA_HEIGHT,
84 .mem_addr = VESA_MEM_ADDR,
85 .mem_size = VESA_MEM_SIZE,
88 return fb__register(&vesafb);