Commit Graph

129 Commits

Author SHA1 Message Date
Yuri Benditovich
554e85328d Use DEV_RAM allocations for cursor commands
BZ#1540919 spice server crashes if live migration happens
immediately after login or after driver upgrade/downgrade
2018-03-09 07:56:29 +02:00
yuri.benditovich@daynix.com
454a66a25a qxl-wddm-dod: Support ETW for release version
Add ability to produce ETW (Event Tracing for Windows) to release
version of the driver to be able to record binary traces in case
of problem in customer environment for further analysis.
Logging of debug build is not changed.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-07-09 09:46:33 +01:00
yuri.benditovich@daynix.com
132ef96f84 qxl-wddm-dod: Correct format of printouts
Fixed wrong formats of printouts producing errors with WPP.
All fixed format strings were wrong mainly due to incorrect
format for pointers.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2017-07-09 09:45:56 +01:00
yuri.benditovich@daynix.com
d2e5bd8672 qxl-wddm-dod: Debug printouts of memory mapping
Print error case on proper level and fix typos.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-05-26 11:49:21 +01:00
yuri.benditovich@daynix.com
115477d9b3 qxl-wddm-dod: Prevent potential memory leak in class driver
In case the device initializes 4 memory bars, the driver maps
physical memory of bar 4 and never unmaps it. Fixing it by
immediate unmap of unused memory bars.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-05-26 11:49:19 +01:00
yuri.benditovich@daynix.com
9b55ed7041 qxl-wddm-dod: Fix unmapping of physical memory
https://bugzilla.redhat.com/show_bug.cgi?id=1454866
Due to wrong addresses passed to class driver, it never does
unmapping of physical memory, causing a leak of virtual address range.
On x86 systems the device fails to start due to failure to
map physical memory range after 10-50 cycles of disable-enable.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-05-26 11:49:11 +01:00
Frediano Ziglio
3f39e31a6f Synchronize display mode change and pushing drawables
Upon change of display mode the driver waits until all the
queued drawables pushed to the host or discarded. This eliminates
server warnings "rendering incorrect" in "get_drawable" when the
drawable command was created by guest driver just before change
of display mode and posted to the server during or after the change.

This patch and comments are heavily based on a patch sent by
Yuri Benditovich (with serialization code completely changed and
added generation to discard pending commands on old surface).

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-05-05 12:54:58 +01:00
Yuri Benditovich
42a911e2e9 Move code for discarding drawable to separate procedure
Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-05-05 11:23:16 +01:00
Frediano Ziglio
720e6955dd Use C++ style for allocations for m_ModeInfo field
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 15:49:22 +01:00
Frediano Ziglio
39f5106b30 Use C++ style for allocations for m_ModeNumbers field
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 15:49:21 +01:00
Frediano Ziglio
8fda115197 Make clear a QXLReleaseInfo structure is used
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 15:49:19 +01:00
Frediano Ziglio
076c9f2085 Fix indentation
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 15:49:17 +01:00
Frediano Ziglio
f013c0c5fc Remove unused UpdateArea method
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 15:49:15 +01:00
Frediano Ziglio
72d2105c92 Remove generation field from MemSlot
Not used beside during initialization of MemSlot itself

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2017-04-12 15:49:13 +01:00
Frediano Ziglio
06ef003435 Remove unused EmptyReleaseRing method
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 15:49:11 +01:00
Yuri Benditovich
decf2c9035 Avoid assert printout upon fallback of memory allocation
If the memory was requested from VRAM area but finally allocated
from DEVRAM, set memory space variable for correct verification
of allocated pointer

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-12 14:53:01 +01:00
Frediano Ziglio
54a719e14f Use DEVRAM if no more space is available in VRAM
Previous Windows drivers use mainly DEVRAM so in some environments
(like RHEV-M 4.0) VRAM is really limited.
This patch use DEVRAM as a fallback to avoid getting out of memory
conditions too earlier in such environments.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 11:07:06 +01:00
Frediano Ziglio
0214d5ceda Allocate commands on Bar0
This is required by Qemu for migration

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 09:19:01 +01:00
Frediano Ziglio
94770833a4 Use inline attribute for VA and PA
Don't use the old style _inline specifier.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 09:19:01 +01:00
Frediano Ziglio
8a8c6c41c0 Compute dynamically slot_id in PA and VA functions
This make easier to change allocation of memory using different
memory Bars.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 09:18:50 +01:00
Frediano Ziglio
53fb38c92f Use normal pointer for VA addresses
As VA addresses are used as pointers there's no need to handle
them as 64-bit integer (which make the code more complicated)

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 09:17:50 +01:00
Frediano Ziglio
6ec0533a7d Allocate m_MemSlots statically inside QxlDevice
There were always 2 slots used so make no sense to allocate
always dynamically.
Also in this way m_MainMemSlot and m_SurfaceMemSlot become
constant making the code slightly smaller.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 09:17:47 +01:00
Frediano Ziglio
7e0642c3f2 Remove m_NumMemSlots member
Only used once

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 09:17:46 +01:00
Frediano Ziglio
1b674d86e2 Compute automatically memory space in FreeMem
This make easier to change allocation of memory using different
memory Bars.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-12 09:17:39 +01:00
yuri.benditovich@daynix.com
8fb1b0a23e qxl-wddm-dod: Non-forced memory allocations with VSync
In case of VSync is active (for the driver this means it shall take
in account watchdog policy and ensure fast execution of PresentDisplayOnly
callback) allocate bitmaps for drawable objects using non-forced requests.
If immediate allocation is not possible, place entire bitmap into memory
chunk allocated from the OS.
If bitmap is allocated from device memory, but one of later
chunks can't be allocated, allocate this and further chunks from
OS memory. All these 'delayed' allocations placed into linked list
which root entry is part of QXLOutput structure.
>From separate thread, before sending drawable objects down, review
the list of delayed chunks and allocate device memory (forced) to
all of them.
The cost of solution is 2 pointers added to each drawable or cursor
object.
Cursor commands currently do not use them; in future we have an option
to offload also cursor commands.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-12 08:21:01 +01:00
yuri.benditovich@daynix.com
043f4f275a qxl-wddm-dod: Implement non-forced bitmap allocation
Preparation for non-forced allocations.
Update bitmap creation procedure to allocate device memory forced
or non-forced.
In forced case it works as before.
In non-forced case, if allocation fails, the procedure allocates
memory from OS pool for entire bitmap and copies source data to it.
Later, before sending command, memory will be allocated from device
memory and copied from intermediate location to new one.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-12 08:21:01 +01:00
yuri.benditovich@daynix.com
5c4f4adc7a qxl-wddm-dod: Dedicated procedure for bitmap creation
Move bitmap creation to dedicated procedure. Currently it
uses only forced allocations, as before. Later it will
be used from different flows, forced and non-forced.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-12 08:21:01 +01:00
yuri.benditovich@daynix.com
06a4f7a846 qxl-wddm-dod: Optimize allocation of memory chunks
Increased size of allocation to reduce number of allocation per
bitmap. Before change the procedure ignored 'alloc_size' parameter
and always allocated memory chunk according to 'size' parameter.
As a result, first chunk could be up to 64K and all following are
limited by line size. For example, for bitmap 1280x1024 there was
more than 1008 chunks allocated, for bitmap 128x1024 - 897 chunks.
We change the procedure to use chunk size up to 64K (similar to first
chunk). This reduces in described examples number of allocation from
1008 to 64 and from 897 to 8 respectively.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-12 08:21:01 +01:00
yuri.benditovich@daynix.com
9721a48dc9 qxl-wddm-dod: PutBytesAlign supports non-forced allocation
Preparation for offload of allocations from device's memory
to separate thread. Procedure PutBytesAlign is called to
allocate memory chunk from device memory and copy data to it.
With current commit the procedure (if called with non-NULL
linked list root entry parameter) can use non-forced allocation.
If such allocation fails, it allocates 'delayed' chunk from
OS memory and copies data to it. Later before sending drawable command
this chunk shall be processed, storage allocated from device memory
(forced) and data copied to it.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-12 08:20:58 +01:00
yuri.benditovich@daynix.com
6a01308788 qxl-wddm-dod: Prepare for failure to allocate memory
Preparation for further scenarios when memory allocation failure
can happen and we'll need to use fallback when possible.
Memory allocation can fail in following cases:
- when non-forced memory allocation used and the attempt to allocate
  the memory must be as fast as possible, without waits
- when forced memory allocation used, but the driver already received
  stop command and waits for thread termination. Note that in case
  the VSync control is enabled stop command may happen even after the video
  subsystem executes switch to VGA mode. In such case QEMU will not return
  previously allocated objects (assuming the QXL driver already disabled
  and ignoring callbacks from Spice server in VGA mode).

In case of forced memory allocation the allocation routine waits
unpredictable time until the request is satisfied. In current commit
we do not acquire m_MemLock mutex for all this time, but release it
when entering long wait to allow another caller to try allocating memory.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-12 08:20:54 +01:00
Frediano Ziglio
3437f04cea Pass 0 to level argument of KeInitializeMutex
As documented by Microsoft this reserved argument should be set
to 0.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-04-11 17:21:55 +01:00
yuri.benditovich@daynix.com
9460db8760 qxl-wddm-dod: Set VSync indication period to 200ms
Default indication period (13-17ms) from the driver to OS
increases total CPU consumption during presentation operations.
Reducing indication frequency to 200 ms reduces cost of this
feature. Till now we do not see any negative impact of this.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-03 10:15:44 +01:00
yuri.benditovich@daynix.com
223fe90a00 qxl-wddm-dod: Reduce amount of unnecessary printouts
Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-03 10:14:07 +01:00
yuri.benditovich@daynix.com
f86a615e52 qxl-wddm-dod: Debug warning on long wait on event
In release build this does not affect the code.
In debug build we will have a warning printout when waiting
on event is close to 2 seconds - this can be a cause of following
stop by OS. The printout contains name of related event variable.
There is one event (in offload thread) that long wait on it
does not affect any functionality, for it this warning is disabled.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-03 10:14:05 +01:00
yuri.benditovich@daynix.com
0987a61bff qxl-wddm-dod: Use rendering offload thread
Instead of sending drawable commands down from presentation
callback, collect drawables objects and pass them to dedicated
thread for processing. This reduce peak load of presentation
callback.

Signed-off-by: Javier Celaya <javier.celaya@flexvdi.com>
Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-03 10:14:01 +01:00
yuri.benditovich@daynix.com
7ca13f4f48 qxl-wddm-dod: Prepare system thread for rendering
Create rendering thread upon device start and terminate it upon
stop. The dedicated thread is normally pending for display commands
to be sent to the host. Currently only single NULL (termination)
command is placed to the ring where the thread consumes events from.

Signed-off-by: Javier Celaya <javier.celaya@flexvdi.com>
Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-03 10:13:54 +01:00
yuri.benditovich@daynix.com
db40bfd439 qxl-wddm-dod: Timer-based VSync interrupt indication
In case the driver supports VSync control feature, it
maintains timer for VSync interrupt indication.
In further commits this timer will be started upon
class driver request. The interrupt notification and
related DPC do not access device registers.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-02-22 16:38:28 +00:00
yuri.benditovich@daynix.com
a2b58d1557 qxl-wddm-dod: Simplify interrupt handling for rev4 device
Do not clear interrupt mask upon interrupt.
Instead clear pending interrupt status and write
QXL_IO_UPDATE_IRQ register (this drops interrupt level).
There are 3 advantages:
1. We do not need to wake the host to enable interrupt
mask in DPC procedure (1 wake per interrupt instead of 2)
2. The driver is not sensitive to failure when queues DPC, as
already queued DPC will process this interrupt when executed.
3. When we implement VSync interrupt simulation, we do not
need to touch registers neither when notify the OS nor when
process DPC related to this notification.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-02-22 16:38:28 +00:00
yuri.benditovich@daynix.com
58b3a7a75b qxl-wddm-dod: Fix video modes enumeration
When the video mode is changed and then the driver disabled and
enabled, it did not enumerate available video modes with lower
resolution than current one. All modes starting from 1024x768
should be available regardless what is current resolution
on driver startup

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-02-22 16:38:28 +00:00
yuri.benditovich@daynix.com
02c1ed6065 qxl-wddm-dod: Option to provide frequency data to the OS
Concentrate filling of signal info in single procedure.
Fill signal info with specific or default frequency data
according to the global flag of VSync support.
Note that the state of this flobal flag must be defined only
on driver startup (based on OS version or any other information
available at DriverEntry) and can't be changed later.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-02-22 16:38:28 +00:00
yuri.benditovich@daynix.com
72ed815334 qxl-wddm-dod: Return EDID data to the OS
Solves failure of HLK "Test for EDID requirements"
EDID contains capabilities and manufacturer data of
the emulated display device. Parsed EDID data presented
in the source file.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-02-22 16:38:28 +00:00
yuri.benditovich@daynix.com
9ae81b279d qxl-wddm-dod: Startup case when OS does not supply frame buffer address
https://bugzilla.redhat.com/show_bug.cgi?id=1417448
When the OS does not provide physical address of the frame buffer,
the driver retrieves it from allocated PCI resource for BAR0.
https://msdn.microsoft.com/en-us/library/hh451339(v=vs.85).aspx
In DxgkCbAcquirePostDisplayOwnership OS not always fills
the DXGK_DISPLAY_INFORMATION structure with valid data.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-02-07 11:01:08 +00:00
Yuri Benditovich
12efc9b81b qxl-wddm-dod: Use 32 bpp for fallback mode
The driver uses fallback mode when it does not receive
startup display information from the OS. This change
allows solution for https://bugzilla.redhat.com/show_bug.cgi?id=1417448
without fix in qemu for video mode switch from 32 bpp to 24 bpp.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-02-06 11:04:53 +00:00
Yuri Benditovich
12d9eec8cd qxl-wddm-dod: Allow easy modification of fallback setting
Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-02-06 11:04:52 +00:00
Yuri Benditovich
ec133ae0a6 qxl-wddm-dod: Discard meaningless copy of value
Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-02-06 11:04:52 +00:00
Frediano Ziglio
b621c297bd Do not take into account move operations for mapping
This is a follow up of 31ca5d035d
("Implements screen to screen move correctly").

As now we don't copy memory to implement moves there's no
reason to take into account these area for memory mappings
as memory is not accessed anymore.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2017-01-29 11:59:39 +00:00
Yuri Benditovich
53ca7ce4cd qxl-wddm-dod: Fix for screen not shown after driver disabled
https://bugzilla.redhat.com/show_bug.cgi?id=1411340
Do not set SupportNonVGA field for device rev.4 and higher.
Then the class driver will not call miniport's procedure
StopDeviceAndReleasePostDisplayOwnership upon PnP stop.
QXL device modes are not compatible with VGA ones; the
driver in this procedure returns display information related
to QXL mode which later used by BasicDisplay driver and causes
it to show the screen incorrectly or fail to show it at all.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-01-26 11:27:01 +00:00
Frediano Ziglio
31ca5d035d Implements screen to screen move correctly
Doing some fast check on Windows 8.1 you could note that
moving windows you got a weird effect were windows were a
bit misaligned.
As documented in DXGKARG_PRESENT_DISPLAYONLY page
NumMoves/pMoves fields point to an array of screen-to-screen
moves while our code implemented them as an image drawing
(the same implementation of dirty rects) causing the weird
effect mentioned.
This patch implement the moves using QXL_COPY_BITS operation
instead of a QXL_DRAW_COPY fixing the issue and avoiding sending
image to the server making the move/scroll operations on the
guest faster (and taking less bandwidth).
It seems that Windows 10 doesn't send the move commands but
instead send only dirty rects so you can't note this problem
using Windows 10.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Yuri Benditovich <yuri.benditovich@daynix.com>
2016-12-06 06:44:24 +00:00
Javier Celaya
a495c21748 Fix default mode pitch
Signed-off-by: Javier Celaya <javier.celaya@flexvdi.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-11-23 18:23:35 +00:00
Javier Celaya
1af6eb074c Remove unused code
Signed-off-by: Javier Celaya <javier.celaya@flexvdi.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2016-11-23 18:23:14 +00:00