summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2016-08-14 20:41:28 +1000
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2016-08-14 20:41:28 +1000
commitd4e7d7ac663fcb55f1b93575445fcbca372f17a7 (patch)
tree012b30bf8012a4ce71f46220f058f2c258e920eb
parenta0349607f72d1a3d177750be0fb6793011d71df2 (diff)
downloadQemuMacDrivers-d4e7d7ac663fcb55f1b93575445fcbca372f17a7.zip
QemuMacDrivers-d4e7d7ac663fcb55f1b93575445fcbca372f17a7.tar.gz
QemuMacDrivers-d4e7d7ac663fcb55f1b93575445fcbca372f17a7.tar.bz2
Add blanking support (GetSync/SetSync calls)
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r--[-rwxr-xr-x]QemuVGADriver/src/DriverQDCalls.c45
-rw-r--r--QemuVGADriver/src/QemuVga.c16
-rw-r--r--[-rwxr-xr-x]QemuVGADriver/src/QemuVga.h2
-rw-r--r--[-rwxr-xr-x]QemuVGADriver/src/VideoDriverPrivate.h1
-rw-r--r--builds/qemu_vga.ndrvbin14360 -> 14752 bytes
-rw-r--r--builds/qemu_vga_debugosi.ndrvbin16832 -> 17208 bytes
6 files changed, 62 insertions, 2 deletions
diff --git a/QemuVGADriver/src/DriverQDCalls.c b/QemuVGADriver/src/DriverQDCalls.c
index f33a76e..80f8d2c 100755..100644
--- a/QemuVGADriver/src/DriverQDCalls.c
+++ b/QemuVGADriver/src/DriverQDCalls.c
@@ -272,11 +272,39 @@ GraphicsCoreGetInterrupt(VDFlagRecord *flagRecord)
OSStatus
GraphicsCoreSetSync(VDSyncInfoRec *syncInfo)
{
+ UInt8 sync, mask;
+
Trace(GraphicsCoreSetSync);
CHECK_OPEN( controlErr );
- return paramErr;
+ sync = syncInfo->csMode;
+ mask = syncInfo->csFlags;
+
+ /* Unblank shortcut */
+ if (sync == 0 && mask == 0) {
+ sync = 0;
+ mask = kDPMSSyncMask;
+ }
+ /* Blank shortcut */
+ if (sync == 0xff && mask == 0xff) {
+ sync = 0x7;
+ mask = kDPMSSyncMask;
+ }
+
+ lprintf("SetSync req: sync=%x mask=%x\n", sync, mask);
+
+ /* Only care about the DPMS mode */
+ if ((mask & kDPMSSyncMask) == 0)
+ return noErr;
+
+ /* If any sync is disabled, blank */
+ if (sync & kDPMSSyncMask)
+ QemuVga_Blank(true);
+ else
+ QemuVga_Blank(false);
+
+ return noErr;
}
OSStatus
@@ -284,7 +312,20 @@ GraphicsCoreGetSync(VDSyncInfoRec *syncInfo)
{
Trace(GraphicsCoreGetSync);
- return paramErr;
+ if (syncInfo->csMode == 0xff) {
+ /* Return HW caps */
+ syncInfo->csMode = (1 << kDisableHorizontalSyncBit) |
+ (1 << kDisableVerticalSyncBit) |
+ (1 << kDisableCompositeSyncBit) |
+ (1 << kNoSeparateSyncControlBit);
+ } else if (syncInfo->csMode == 0x00){
+ syncInfo->csMode = GLOBAL.blanked ? kDPMSSyncMask : 0;
+ } else
+ return statusErr;
+
+ syncInfo->csFlags = 0;
+
+ return noErr;
}
OSStatus
diff --git a/QemuVGADriver/src/QemuVga.c b/QemuVGADriver/src/QemuVga.c
index a208ae0..4584242 100644
--- a/QemuVGADriver/src/QemuVga.c
+++ b/QemuVGADriver/src/QemuVga.c
@@ -364,3 +364,19 @@ OSStatus QemuVga_SetMode(UInt32 mode, UInt32 depth, UInt32 page)
return noErr;
}
+
+OSStatus QemuVga_Blank(Boolean blank)
+{
+ /* We use the AR Index VGA register which is a flip flop
+ * so we need to ensure we write twice. We use a non-existing
+ * index so that the second write is dropped.
+ */
+ if (blank) {
+ VgaWriteB(0x3c0, 0x1f);
+ VgaWriteB(0x3c0, 0x1f);
+ } else {
+ VgaWriteB(0x3c0, 0x3f);
+ VgaWriteB(0x3c0, 0x3f);
+ }
+ GLOBAL.blanked = blank;
+}
diff --git a/QemuVGADriver/src/QemuVga.h b/QemuVGADriver/src/QemuVga.h
index d7bf053..69e80fa 100755..100644
--- a/QemuVGADriver/src/QemuVga.h
+++ b/QemuVGADriver/src/QemuVga.h
@@ -66,4 +66,6 @@ extern OSStatus QemuVga_GetModePages(UInt32 index, UInt32 depth,
extern OSStatus QemuVga_GetModeInfo(UInt32 index, UInt32 *width, UInt32 *height);
extern OSStatus QemuVga_SetMode(UInt32 modeIndex, UInt32 depth, UInt32 page);
+extern OSStatus QemuVga_Blank(Boolean blank);
+
#endif
diff --git a/QemuVGADriver/src/VideoDriverPrivate.h b/QemuVGADriver/src/VideoDriverPrivate.h
index 65c161c..47a95a6 100755..100644
--- a/QemuVGADriver/src/VideoDriverPrivate.h
+++ b/QemuVGADriver/src/VideoDriverPrivate.h
@@ -68,6 +68,7 @@ struct DriverGlobal {
UInt32 numModes;
UInt32 curPage;
LogicalAddress curBaseAddress;
+ Boolean blanked;
};
typedef struct DriverGlobal DriverGlobal, *DriverGlobalPtr;
diff --git a/builds/qemu_vga.ndrv b/builds/qemu_vga.ndrv
index 930e9c2..6e02f74 100644
--- a/builds/qemu_vga.ndrv
+++ b/builds/qemu_vga.ndrv
Binary files differ
diff --git a/builds/qemu_vga_debugosi.ndrv b/builds/qemu_vga_debugosi.ndrv
index 3b86f5a..639a0c5 100644
--- a/builds/qemu_vga_debugosi.ndrv
+++ b/builds/qemu_vga_debugosi.ndrv
Binary files differ