> > 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. > Minor typos intialized -> initialized iniatilized -> initialized untill -> until fixies -> fixes It's not clear to me the "However this one occurs when installing the driver." sentence. Do you mean that the bug refer to a problem similar but not occurring during installation? > Signed-off-by: Sameeh Jubran <sameeh@xxxxxxxxxx> > --- > 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)); In this function you don't call DxgkCbAcquirePostDisplayOwnership but QxlDod::AcquireDisplayInfo which calls DxgkCbAcquirePostDisplayOwnership. I would either change the message or rename QxlDod::AcquireDisplayInfo to QxlDod::DxgkCbAcquirePostDisplayOwnership. > + 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)); } you could use &DispInfo instead of &(DispInfo), feel free to ignore, just minor style. > private: > VOID CleanUp(VOID); > NTSTATUS CheckHardware(); Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel