[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