[Spice-devel] [RFC PATCH qxl-wddm-dod 20/28] Adding ioctl operation for updating Vdagent state

Dmitry Fleytman dmitry at daynix.com
Mon Jul 18 06:34:01 UTC 2016


From: Sameeh Jubran <sameeh at daynix.com>

This patch adds a new ioctl to the driver which allows Vdagent
to update it's current state. This allowas the driver to know
when Vdgaent is running and when it is off.

Signed-off-by: Sameeh Jubran <sameeh at daynix.com>
Signed-off-by: Dmitry Fleytman <dmitry at daynix.com>
---
 qxldod/QxlDod.cpp            | 17 +++++++++++++++++
 qxldod/QxlDod.h              |  3 +++
 qxldod/include/qxl_windows.h |  4 ++++
 3 files changed, 24 insertions(+)

diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
index 74cd259..42c82e3 100755
--- a/qxldod/QxlDod.cpp
+++ b/qxldod/QxlDod.cpp
@@ -52,6 +52,7 @@ typedef struct _QXL_ESCAPE {
     union {
         QXLEscapeSetCustomDisplay custom_display;
         QXLHead monitor_config;
+        QXLEscapeVDAgentRunning vdagent_running;
     };
 }QXL_ESCAPE;
 
@@ -2927,6 +2928,7 @@ QxlDevice::QxlDevice(_In_ QxlDod* pQxlDod) : HwDeviceInterface(pQxlDod)
     m_FreeOutputs = 0;
     m_Pending = 0;
     m_type = QXL_DEVICE;
+    m_VDAgentRunning = FALSE;
 }
 
 QxlDevice::~QxlDevice(void)
@@ -4520,6 +4522,11 @@ void QxlDevice::SetMonitorConfig(QXLHead * monitor_config)
         m_monitor_config->heads[0].width, m_monitor_config->heads[0].height));
     AsyncIo(QXL_IO_MONITORS_CONFIG_ASYNC, 0);
 }
+void QxlDevice::SaveVDAgentState(QXLEscapeVDAgentRunning* vdagent_running)
+{
+    PAGED_CODE();
+    m_VDAgentRunning = (vdagent_running->running == 0) ? FALSE : TRUE;
+}
 
 NTSTATUS QxlDevice::Escape(_In_ CONST DXGKARG_ESCAPE* pEscape)
 {
@@ -4550,6 +4557,16 @@ NTSTATUS QxlDevice::Escape(_In_ CONST DXGKARG_ESCAPE* pEscape)
         status = STATUS_SUCCESS;
         break;
     }
+    case QXL_ESCAPE_VDAGENT_RUNNING: {
+        data_size += sizeof(QXLEscapeVDAgentRunning);
+        if (pEscape->PrivateDriverDataSize != data_size) {
+            status = STATUS_INVALID_BUFFER_SIZE;
+            break;
+    }
+        SaveVDAgentState(&pQXLEscape->vdagent_running);
+        status = STATUS_SUCCESS;
+        break;
+    }
     default:
         DbgPrint(TRACE_LEVEL_ERROR, ("%s: invalid Escape 0x%x\n", __FUNCTION__, pQXLEscape->ioctl));
         status = STATUS_INVALID_PARAMETER;
diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
index 9bc0bdb..6c5d0f8 100755
--- a/qxldod/QxlDod.h
+++ b/qxldod/QxlDod.h
@@ -551,8 +551,11 @@ private:
     NTSTATUS UpdateChildStatus(BOOLEAN connect);
     NTSTATUS SetCustomDisplay(QXLEscapeSetCustomDisplay* custom_display);
     void SetMonitorConfig(QXLHead* monitor_config);
+    void SaveVDAgentState(QXLEscapeVDAgentRunning* vdagent_running);
 
 private:
+    BOOLEAN m_VDAgentRunning;
+
     PUCHAR m_IoBase;
     BOOLEAN m_IoMapped;
     ULONG m_IoSize;
diff --git a/qxldod/include/qxl_windows.h b/qxldod/include/qxl_windows.h
index 1f97fb7..a7e108f 100755
--- a/qxldod/include/qxl_windows.h
+++ b/qxldod/include/qxl_windows.h
@@ -4,6 +4,7 @@
 enum {
     QXL_ESCAPE_SET_CUSTOM_DISPLAY = 0x10001,
     QXL_ESCAPE_MONITOR_CONFIG,
+    QXL_ESCAPE_VDAGENT_RUNNING
 };
 
 typedef struct QXLEscapeSetCustomDisplay {
@@ -12,4 +13,7 @@ typedef struct QXLEscapeSetCustomDisplay {
     uint32_t bpp;
 } QXLEscapeSetCustomDisplay;
 
+typedef struct QXLEscapeVDAgentRunning {
+    uint32_t running;
+} QXLEscapeVDAgentRunning;
 #endif /* _H_QXL_WINDOWS */
-- 
1.8.3.1



More information about the Spice-devel mailing list