void SVGA_SetMode(vgavmware_handle_t *dev, uint32 width, // IN uint32 height, // IN uint32 bpp) // IN { SVGA_WriteReg(dev, SVGA_REG_WIDTH, width); SVGA_WriteReg(dev, SVGA_REG_HEIGHT, height); SVGA_WriteReg(dev, SVGA_REG_BITS_PER_PIXEL, bpp); SVGA_WriteReg(dev, SVGA_REG_ENABLE, 1); dev->pitch = SVGA_ReadReg(dev, SVGA_REG_BYTES_PER_LINE); }
fs_node_t *vga_vmware_init(int width, int height, int bpp) { // Find the device and get it's BAR addresses fs_node_t *pci = 0; pci = pci_get_device(PCI_VENDOR_ID_VMWARE, PCI_DEVICE_ID_VMWARE_SVGA2); if (pci == 0) return 0; // Create new handle vgavmware_handle_t *dev; dev = (vgavmware_handle_t *)dev_alloc("vga", sizeof(vgavmware_handle_t)); // Fill universal fields dev->vga.set_mode = vga_vmware_set_mode; dev->vga.unset_mode = vga_vmware_unset_mode; dev->vga.fs.blocksize = 1; // Fill custom fields dev->vga.width = width; dev->vga.height = height; dev->vga.bpp = bpp; dev->pci = pci; //pci_enable_mem(dev->pci); dev->iobase = pci_get_bar_address(dev->pci, 0); dev->fb = pci_get_bar_address(dev->pci, 1); dev->vga.offset = (void *)dev->fb; dev->fifo = pci_get_bar_address(dev->pci, 2); // Negotiate device version dev->version = SVGA_ID_2; do { SVGA_WriteReg(dev, SVGA_REG_ID, dev->version); if (SVGA_ReadReg(dev, SVGA_REG_ID) == dev->version) break; else dev->version--; } while (dev->version >= SVGA_ID_0); assert(dev->version >= SVGA_ID_0); // Get FIFO size and FB size dev->fbsize = SVGA_ReadReg(dev, SVGA_REG_FB_SIZE); dev->fifosize = SVGA_ReadReg(dev, SVGA_REG_MEM_SIZE); assert(dev->fbsize >= 0x100000); //assert(dev->fifosize < 0x20000); kprintf(2, "found VMWare VGA device\n", 0); return (fs_node_t *)dev; }
void GMR_Define(uint32 gmrId, SVGAGuestMemDescriptor *descArray, uint32 numDescriptors) { PPN desc = GMR_AllocDescriptor(descArray, numDescriptors); /* * Define/undefine the GMR. Defining an empty GMR is equivalent to * undefining a GMR. */ SVGA_WriteReg(SVGA_REG_GMR_ID, gmrId); SVGA_WriteReg(SVGA_REG_GMR_DESCRIPTOR, desc); if (desc) { /* * Clobber the first page, to verify that the device reads our * descriptors synchronously when we write the GMR registers. */ Heap_DiscardPages(desc, 1); } }
void vga_vmware_unset_mode(vga_handle_t *dev) { SVGA_WriteReg((vgavmware_handle_t *)dev, SVGA_REG_ENABLE, 0); }