aboutsummaryrefslogtreecommitdiffstats
path: root/vmware
diff options
context:
space:
mode:
authorJaroslav Hensl <emulator@emulace.cz>2023-09-17 09:39:36 +0200
committerJaroslav Hensl <emulator@emulace.cz>2023-09-17 09:39:36 +0200
commitafcbef900e37e3d50d7fbd0a1af7b1de39140471 (patch)
tree1191e642e552ce27a413451fb168b358c5ad99b0 /vmware
parentacde242b61c662d3f234fc051f059fa58875f5fd (diff)
downloadvmdisp9x-afcbef900e37e3d50d7fbd0a1af7b1de39140471.tar.gz
SVGA-III (stubs)
Diffstat (limited to 'vmware')
-rw-r--r--vmware/pci.c19
-rw-r--r--vmware/pci.h1
-rw-r--r--vmware/svga.c95
-rw-r--r--vmware/svga.h9
-rw-r--r--vmware/svga_reg.h1
5 files changed, 110 insertions, 15 deletions
diff --git a/vmware/pci.c b/vmware/pci.c
index 07ff86b..502e76f 100644
--- a/vmware/pci.c
+++ b/vmware/pci.c
@@ -238,6 +238,25 @@ PCI_GetBARAddr(const PCIAddress FARP *addr, int index)
return bar & ~mask;
}
+/* from https://wiki.osdev.org/PCI#Address_and_size_of_the_BAR */
+uint32
+PCI_GetBARSize(const PCIAddress FARP *addr, int index)
+{
+ uint32 bar_size = 0;
+ uint32 bar_orig = PCI_ConfigRead32(addr, 16+4*index);
+ uint32 mask = (bar_orig & PCI_CONF_BAR_IO) ? 0x3 : 0xf;
+
+ PCI_ConfigWrite32(addr, 16+4*index, 0xFFFFFFFFUL);
+ bar_size = PCI_ConfigRead32(addr, 16+4*index);
+
+ /* restore original value */
+ PCI_ConfigWrite32(addr, 16+4*index, bar_orig);
+
+ bar_size &= ~mask;
+
+ return (~bar_size) + 1;
+}
+
uint32
PCI_GetSubsystem(const PCIAddress FARP *addr)
{
diff --git a/vmware/pci.h b/vmware/pci.h
index e62d059..5df646f 100644
--- a/vmware/pci.h
+++ b/vmware/pci.h
@@ -96,6 +96,7 @@ Bool PCI_ScanBus(PCIScanState FARP *state);
Bool PCI_FindDevice(uint16 vendorId, uint16 deviceId, PCIAddress FARP *addrOut);
void PCI_SetBAR(const PCIAddress FARP *addr, int index, uint32 value);
uint32 PCI_GetBARAddr(const PCIAddress FARP *addr, int index);
+uint32 PCI_GetBARSize(const PCIAddress FARP *addr, int index);
void PCI_SetMemEnable(const PCIAddress FARP *addr, Bool enable);
uint32 PCI_GetSubsystem(const PCIAddress FARP *addr);
diff --git a/vmware/svga.c b/vmware/svga.c
index 0f7b791..573a568 100644
--- a/vmware/svga.c
+++ b/vmware/svga.c
@@ -130,8 +130,17 @@ SVGA_Init(Bool enableFIFO, uint32 hwversion)
{
int vga_found = 0;
- if (PCI_FindDevice(PCI_VENDOR_ID_VMWARE, PCI_DEVICE_ID_VMWARE_SVGA2,
- &gSVGA.pciAddr)) {
+ if (PCI_FindDevice(PCI_VENDOR_ID_VMWARE, PCI_DEVICE_ID_VMWARE_SVGA3, &gSVGA.pciAddr)) {
+ gSVGA.vendorId = PCI_VENDOR_ID_VMWARE;
+ gSVGA.deviceId = PCI_DEVICE_ID_VMWARE_SVGA3;
+#ifndef VXD32
+ dbg_printf("PCI VMWare SVGA-III: %X:%X\n", gSVGA.vendorId, gSVGA.deviceId);
+#endif
+
+ vga_found = 1;
+ }
+
+ if (PCI_FindDevice(PCI_VENDOR_ID_VMWARE, PCI_DEVICE_ID_VMWARE_SVGA2, &gSVGA.pciAddr)) {
gSVGA.vendorId = PCI_VENDOR_ID_VMWARE;
gSVGA.deviceId = PCI_DEVICE_ID_VMWARE_SVGA2;
#ifndef VXD32
@@ -172,17 +181,40 @@ SVGA_Init(Bool enableFIFO, uint32 hwversion)
*/
PCI_SetMemEnable(&gSVGA.pciAddr, TRUE);
- if(gSVGA.deviceId == PCI_DEVICE_ID_VBOX_VGA) {
+
+ if(gSVGA.deviceId == PCI_DEVICE_ID_VBOX_VGA) { /* VBOX SVGA */
/* VBox SVGA have swapped IO and VRAM in PCI BAR */
gSVGA.fbPhy = PCI_GetBARAddr(&gSVGA.pciAddr, 0);
+ gSVGA.vramSize = PCI_GetBARSize(&gSVGA.pciAddr, 0);
gSVGA.ioBase = PCI_GetBARAddr(&gSVGA.pciAddr, 1);
+ gSVGA.fifoPhy = PCI_GetBARAddr(&gSVGA.pciAddr, 2);
+
} else {
- gSVGA.ioBase = PCI_GetBARAddr(&gSVGA.pciAddr, 0);
- gSVGA.fbPhy = PCI_GetBARAddr(&gSVGA.pciAddr, 1);
+ if(SVGA_IsSVGA3()) /* VMware SVGA2 */
+ {
+ gSVGA.rmmio_start = PCI_GetBARAddr(&gSVGA.pciAddr, 0);
+ gSVGA.rmmio_size = PCI_GetBARSize(&gSVGA.pciAddr, 0);
+
+ gSVGA.fbPhy = PCI_GetBARAddr(&gSVGA.pciAddr, 2);
+ gSVGA.vramSize = PCI_GetBARSize(&gSVGA.pciAddr, 2);
+
+ gSVGA.fifoPhy = 0;
+ gSVGA.ioBase = 0;
+ }
+ else /* VMware SVGA3 */
+ {
+ gSVGA.ioBase = PCI_GetBARAddr(&gSVGA.pciAddr, 0);
+
+ gSVGA.fbPhy = PCI_GetBARAddr(&gSVGA.pciAddr, 1);
+ gSVGA.vramSize = PCI_GetBARSize(&gSVGA.pciAddr, 1);
+
+ gSVGA.fifoPhy = PCI_GetBARAddr(&gSVGA.pciAddr, 2);
+ }
}
- gSVGA.fifoPhy = PCI_GetBARAddr(&gSVGA.pciAddr, 2);
+
dbg_printf(dbg_addr, gSVGA.ioBase, gSVGA.fbPhy, gSVGA.fifoPhy);
+ SVGA_MapIO();
#ifdef VXD32 /* version negotiation is done in PM32 driver now */
/*
@@ -196,7 +228,14 @@ SVGA_Init(Bool enableFIFO, uint32 hwversion)
if(hwversion == 0)
{
- hwversion = SVGA_VERSION_2;
+ if(gSVGA.deviceId == PCI_DEVICE_ID_VMWARE_SVGA3)
+ {
+ hwversion = SVGA_VERSION_3;
+ }
+ else
+ {
+ hwversion = SVGA_VERSION_2;
+ }
}
gSVGA.deviceVersionId = SVGA_MAKE_ID(hwversion);
@@ -226,9 +265,12 @@ SVGA_Init(Bool enableFIFO, uint32 hwversion)
* does not support the FIFO buffer at all.
*/
+/*
gSVGA.vramSize = SVGA_ReadReg(SVGA_REG_VRAM_SIZE);
gSVGA.fbSize = SVGA_ReadReg(SVGA_REG_FB_SIZE);
+*/
gSVGA.fifoSize = SVGA_ReadReg(SVGA_REG_MEM_SIZE);
+ gSVGA.fbSize = SVGA_ReadReg(SVGA_REG_FB_SIZE);
/*
* Sanity-check the FIFO and framebuffer sizes.
@@ -241,8 +283,11 @@ SVGA_Init(Bool enableFIFO, uint32 hwversion)
}
#endif
- if (gSVGA.fifoSize < 0x20000) {
- SVGA_Panic("FIFO size very small, probably incorrect.");
+ if(SVGA_IsSVGA3())
+ {
+ if (gSVGA.fifoSize < 0x20000) {
+ SVGA_Panic("FIFO size very small, probably incorrect.");
+ }
}
/*
@@ -279,9 +324,9 @@ SVGA_Init(Bool enableFIFO, uint32 hwversion)
Intr_SetMask(irq, TRUE);
}
#endif
- gSVGA.fifoLinear = 0;
+ /*gSVGA.fifoLinear = 0;
gSVGA.fifoSel = 0;
- gSVGA.fifoAct = 0;
+ gSGA.fifoAct = 0;*/
#ifdef VXD32
gSVGA.userFlags = 0;
@@ -309,6 +354,11 @@ SVGA_Init(Bool enableFIFO, uint32 hwversion)
return 0;
}
+Bool SVGA_IsSVGA3()
+{
+ return gSVGA.deviceId == PCI_DEVICE_ID_VMWARE_SVGA3;
+}
+
/*
*-----------------------------------------------------------------------------
*
@@ -533,8 +583,16 @@ SVGA_DefaultFaultHandler(int vector) // IN
uint32
SVGA_ReadReg(uint32 index) // IN
{
- outpd(gSVGA.ioBase + SVGA_INDEX_PORT, index);
- return inpd(gSVGA.ioBase + SVGA_VALUE_PORT);
+ if(SVGA_IsSVGA3())
+ {
+ return gSVGA.rmmio[index];
+ }
+ else
+ {
+ /* locking? */
+ outpd(gSVGA.ioBase + SVGA_INDEX_PORT, index);
+ return inpd(gSVGA.ioBase + SVGA_VALUE_PORT);
+ }
}
@@ -559,8 +617,15 @@ void
SVGA_WriteReg(uint32 index, // IN
uint32 value) // IN
{
- outpd(gSVGA.ioBase + SVGA_INDEX_PORT, index);
- outpd(gSVGA.ioBase + SVGA_VALUE_PORT, value);
+ if(SVGA_IsSVGA3())
+ {
+ gSVGA.rmmio[index] = value;
+ }
+ else
+ {
+ outpd(gSVGA.ioBase + SVGA_INDEX_PORT, index);
+ outpd(gSVGA.ioBase + SVGA_VALUE_PORT, value);
+ }
}
diff --git a/vmware/svga.h b/vmware/svga.h
index 8a62800..733f3af 100644
--- a/vmware/svga.h
+++ b/vmware/svga.h
@@ -93,6 +93,12 @@ typedef struct SVGADevice {
uint16 deviceId;
/* adapter in QEMU works only on 32bit */
uint32 userFlags;
+
+ /* SVGA3 */
+ uint32 rmmio_start;
+ uint32 rmmio_size;
+ uint32 rmmio_linear;
+ volatile uint32 FARP *rmmio;
#ifndef REALLY_TINY
volatile struct {
@@ -136,6 +142,9 @@ void SVGA_Disable(void);
void SVGA_Panic(const char *err);
void SVGA_DefaultFaultHandler(int vector);
+Bool SVGA_IsSVGA3();
+void SVGA_MapIO();
+
void SVGA_Flush(void);
uint32 SVGA_ReadReg(uint32 index);
diff --git a/vmware/svga_reg.h b/vmware/svga_reg.h
index 0c2e13e..ab904a7 100644
--- a/vmware/svga_reg.h
+++ b/vmware/svga_reg.h
@@ -45,6 +45,7 @@ typedef struct uint64 {
*/
#define PCI_VENDOR_ID_VMWARE 0x15AD
#define PCI_DEVICE_ID_VMWARE_SVGA2 0x0405
+#define PCI_DEVICE_ID_VMWARE_SVGA3 0x0406
#define PCI_VENDOR_ID_INNOTEK 0x80EE
#define PCI_DEVICE_ID_VBOX_VGA 0xBEEF