When qxl revision is 3, the vga driver is the one that is running. When
installing the driver the function VgaDevice::HWInit with displayInfo
structure that is zeroed out. The displayInfo should be intialized using
DxgkCbAcquirePostDisplayOwnership and thus it should be called before
calling HWInit.

Please note that we can't just move the call to 
"DxgkCbAcquirePostDisplayOwnership"
before calling HWInit as the m_Id isn't iniatilized for QxlDevice untill the 
call
to HWinit is over.

This patch fixies a bug similar to the one found here:
https://bugzilla.redhat.com/show_bug.cgi?id=1202267
However this one occurs when installing the driver.

Signed-off-by: Sameeh Jubran <sam...@daynix.com>
---
 qxldod/QxlDod.cpp | 68 +++++++++++++++++++++++++++----------------------------
 qxldod/QxlDod.h   |  2 ++
 2 files changed, 36 insertions(+), 34 deletions(-)

diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
index 5cfff78..6ef57b8 100755
--- a/qxldod/QxlDod.cpp
+++ b/qxldod/QxlDod.cpp
@@ -124,7 +124,6 @@ NTSTATUS QxlDod::StartDevice(_In_  DXGK_START_INFO*   
pDxgkStartInfo,
                          _Out_ ULONG*             pNumberOfViews,
                          _Out_ ULONG*             pNumberOfChildren)
 {
-    PHYSICAL_ADDRESS PhysicAddress;
     PAGED_CODE();
     QXL_ASSERT(pDxgkStartInfo != NULL);
     QXL_ASSERT(pDxgkInterface != NULL);
@@ -176,32 +175,6 @@ NTSTATUS QxlDod::StartDevice(_In_  DXGK_START_INFO*   
pDxgkStartInfo,
         return Status;
     }
 
-    PhysicAddress.QuadPart = m_CurrentModes[0].DispInfo.PhysicAddress.QuadPart;
-    if (m_pHWDevice->GetId() == 0)
-    {
-         Status = 
m_DxgkInterface.DxgkCbAcquirePostDisplayOwnership(m_DxgkInterface.DeviceHandle, 
&(m_CurrentModes[0].DispInfo));
-    }
-
-    if (!NT_SUCCESS(Status) )
-    {
-        DbgPrint(TRACE_LEVEL_ERROR, ("DxgkCbAcquirePostDisplayOwnership failed 
with status 0x%X Width = %d\n",
-                           Status, m_CurrentModes[0].DispInfo.Width));
-        return STATUS_UNSUCCESSFUL;
-    }
-
-    if (m_CurrentModes[0].DispInfo.Width == 0)
-    {
-        m_CurrentModes[0].DispInfo.Width = MIN_WIDTH_SIZE; 
-        m_CurrentModes[0].DispInfo.Height = MIN_HEIGHT_SIZE;
-        m_CurrentModes[0].DispInfo.Pitch = 
BPPFromPixelFormat(D3DDDIFMT_R8G8B8) / 8;
-        m_CurrentModes[0].DispInfo.ColorFormat = D3DDDIFMT_R8G8B8;
-        m_CurrentModes[0].DispInfo.TargetId = 0;
-        if (PhysicAddress.QuadPart != 0L) {
-             m_CurrentModes[0].DispInfo.PhysicAddress.QuadPart = 
PhysicAddress.QuadPart;
-        }
-
-    }
-
    *pNumberOfViews = MAX_VIEWS;
    *pNumberOfChildren = MAX_CHILDREN;
     m_Flags.DriverStarted = TRUE;
@@ -2488,12 +2461,6 @@ NTSTATUS 
VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
 
     m_CurrentMode = 0;
     DbgPrint(TRACE_LEVEL_INFORMATION, ("m_ModeInfo = 0x%p, m_ModeNumbers = 
0x%p\n", m_ModeInfo, m_ModeNumbers));
-    if (Width == 0 || Height == 0 || BitsPerPixel != VGA_BPP)
-    {
-        Width = MIN_WIDTH_SIZE;
-        Height = MIN_HEIGHT_SIZE;
-        BitsPerPixel = VGA_BPP;
-    }
     for (CurrentMode = 0, SuitableModeCount = 0;
          CurrentMode < ModeCount;
          CurrentMode++)
@@ -2621,7 +2588,7 @@ NTSTATUS VgaDevice::HWInit(PCM_RESOURCE_LIST pResList, 
DXGK_DISPLAY_INFORMATION*
 
     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
     UNREFERENCED_PARAMETER(pResList);
-    UNREFERENCED_PARAMETER(pDispInfo);
+    AcquireDisplayInfo(*(pDispInfo));
     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
     return GetModeList(pDispInfo);
 }
@@ -3391,6 +3358,7 @@ NTSTATUS QxlDevice::QxlInit(DXGK_DISPLAY_INFORMATION* 
pDispInfo)
     CreateMemSlots();
     InitDeviceMemoryResources();
     InitMonitorConfig();
+    Status = AcquireDisplayInfo(*(pDispInfo));
     return Status;
 }
 
@@ -4835,3 +4803,35 @@ UINT SpiceFromPixelFormat(D3DDDIFORMAT Format)
         default: QXL_LOG_ASSERTION1("Unknown D3DDDIFORMAT 0x%I64x", Format); 
return 0;
     }
 }
+
+NTSTATUS HwDeviceInterface::AcquireDisplayInfo(DXGK_DISPLAY_INFORMATION& 
DispInfo)
+{
+    NTSTATUS Status = STATUS_SUCCESS;
+    PHYSICAL_ADDRESS PhysicAddress;
+    if (GetId() == 0)
+    {
+        Status = m_pQxlDod->AcquireDisplayInfo(DispInfo);
+    }
+
+    if (!NT_SUCCESS(Status))
+    {
+        DbgPrint(TRACE_LEVEL_ERROR, ("DxgkCbAcquirePostDisplayOwnership failed 
with status 0x%X Width = %d\n",
+            Status, DispInfo.Width));
+        return STATUS_UNSUCCESSFUL;
+    }
+    PhysicAddress.QuadPart = DispInfo.PhysicAddress.QuadPart;
+
+    if (DispInfo.Width == 0)
+    {
+        DispInfo.Width = MIN_WIDTH_SIZE;
+        DispInfo.Height = MIN_HEIGHT_SIZE;
+        DispInfo.Pitch = BPPFromPixelFormat(D3DDDIFMT_R8G8B8) / 8;
+        DispInfo.ColorFormat = D3DDDIFMT_R8G8B8;
+        DispInfo.TargetId = 0;
+        if (PhysicAddress.QuadPart != 0L)
+        {
+            DispInfo.PhysicAddress.QuadPart = PhysicAddress.QuadPart;
+        }
+    }
+    return Status;
+}
diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
index bf16724..cd2032c 100755
--- a/qxldod/QxlDod.h
+++ b/qxldod/QxlDod.h
@@ -250,6 +250,7 @@ public:
     virtual NTSTATUS SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* 
pSetPointerShape) = 0;
     virtual NTSTATUS SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* 
pSetPointerPosition) = 0;
     virtual NTSTATUS Escape(_In_ CONST DXGKARG_ESCAPE* pEscap) = 0;
+    NTSTATUS AcquireDisplayInfo(DXGK_DISPLAY_INFORMATION& DispInfo);
     ULONG GetId(void) { return m_Id; }
 protected:
     virtual NTSTATUS GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo) = 0;
@@ -704,6 +705,7 @@ public:
                                  _In_                                     INT  
 PositionX,
                                  _In_                                     INT  
 PositionY);
     PDXGKRNL_INTERFACE GetDxgkInterface(void) { return &m_DxgkInterface;}
+    NTSTATUS AcquireDisplayInfo(DXGK_DISPLAY_INFORMATION& DispInfo) { return 
m_DxgkInterface.DxgkCbAcquirePostDisplayOwnership(m_DxgkInterface.DeviceHandle, 
&(DispInfo)); }
 private:
     VOID CleanUp(VOID);
     NTSTATUS CheckHardware();
-- 
2.7.4

_______________________________________________
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to