[Spice-devel] [PATCH qxl-win v3] display/driver: reimplement DrvAssertMode for Suspend+Hibernate (S3+S4) support

Yonit Halperin yhalperi at redhat.com
Thu Jul 7 07:16:06 PDT 2011


Hi,
I forgot some more things about this patch:

On 07/07/2011 05:00 PM, Yonit Halperin wrote:

>> +static BOOL AssertModeDisable(PDev *pdev)
>> +{
>> + DEBUG_PRINT((pdev, 3, "%s entry\n", __FUNCTION__));
>> + /* flush command ring and update all surfaces */
>> + WRITE_PORT_UCHAR(pdev->notify_cmd_port, 0);
>> + WRITE_PORT_UCHAR(pdev->notify_cursor_port, 0);
> don't think the above two IOs are needed. flush_surface will do the job.
>> + WRITE_PORT_UCHAR(pdev->flush_surfaces_port, 0);
>> + WRITE_PORT_UCHAR(pdev->destroy_all_surfaces_port, 0);
>> + /* move all surfaces from device to system memory */
>> + if (!MoveAllSurfacesToRam(pdev)) {
>> + return FALSE;
>> + }
If MoveAllSurfacesToRam we need to redo changes we done:
we either need to send surface create command for the surfaces that are 
still in the vram, or, we need to call destroy_all_surfaces_port only if 
MoveAllSurfacesToRam succeeds, and if MoveAllSurfacesToRam fails it 
needs to move all the surfaces it moved to RAM back to video ram

>> + /* Free release ring contents */
>> + ReleaseCacheDeviceMemoryResources(pdev);
>> + EmptyReleaseRing(pdev);
>> + /* Get the last free list onto the release ring */
>> + WRITE_PORT_UCHAR(pdev->flush_release_port, 0);
>> + DEBUG_PRINT((pdev, 4, "%s after FLUSH_RELEASE\n", __FUNCTION__));
>> + /* And release that. mspace allocators should be clean after. */
>> + EmptyReleaseRing(pdev);
>> + RemoveVRamSlot(pdev);
>> + DebugCountAliveSurfaces(pdev);
>> + DEBUG_PRINT((pdev, 4, "%s: [%d,%d] [%d,%d] [%d,%d] %lx\n",
>> __FUNCTION__,
>> + pdev->cmd_ring->prod, pdev->cmd_ring->cons,
>> + pdev->cursor_ring->prod, pdev->cursor_ring->cons,
>> + pdev->release_ring->prod, pdev->release_ring->cons,
>> + pdev->Res->free_outputs));
>> + DEBUG_PRINT((pdev, 4, "%s exit\n", __FUNCTION__));
>> + return TRUE;
>> +}
>> +
>> +static void AssertModeEnable(PDev *pdev)
>> +{
>> + InitResources(pdev);
>> + InitDeviceMemoryResources(pdev);
>> + DEBUG_PRINT((pdev, 3, "%s: [%d,%d] [%d,%d] [%d,%d] %lx\n",
>> __FUNCTION__,
>> + pdev->cmd_ring->prod, pdev->cmd_ring->cons,
>> + pdev->cursor_ring->prod, pdev->cursor_ring->cons,
>> + pdev->release_ring->prod, pdev->release_ring->cons,
>> + pdev->Res->free_outputs));
>> + EnableQXLPrimarySurface(pdev);
>> + CreateVRamSlot(pdev);
>> + DebugCountAliveSurfaces(pdev);
>> + MoveAllSurfacesToVideoRam(pdev);
>> + DebugCountAliveSurfaces(pdev);
>> }
>>
>> BOOL DrvAssertMode(DHPDEV in_pdev, BOOL enable)
>> {
>> PDev* pdev = (PDev*)in_pdev;
>> + BOOL ret = TRUE;
>>
>> DEBUG_PRINT((pdev, 1, "%s: 0x%lx %d\n", __FUNCTION__, pdev, enable));
>>
>> + if (pdev->enabled == enable) {
>> + DEBUG_PRINT((pdev, 1, "%s: called twice with same argument (%d)\n",
>> __FUNCTION__,
>> + enable));
>> + return TRUE;
>> + }
>> + pdev->enabled = enable;
>> if (enable) {
>> - InitResources(pdev);
>> - EnableQXLPrimarySurface(pdev);
>> - CreateVRamSlot(pdev);

>> + AssertModeEnable(pdev);
>> } else {
>> - DisableQXLPrimarySurface(pdev, 0);
>> - RemoveVRamSlot(pdev);
again, needs redo if AsserModeDiable fails
>> + ret = AssertModeDisable(pdev);

> I'm not sure about changing pdev->enabled if AssertModeDisable fails
> (which means part of the surfaces are still on the vram)
>> }
>> DEBUG_PRINT((pdev, 1, "%s: 0x%lx exit %d\n", __FUNCTION__, pdev,
>> enable));
>> - return TRUE;
>> + return ret;
>> }
>>
>> ULONG DrvGetModes(HANDLE driver, ULONG dev_modes_size, DEVMODEW
>> *dev_modes)
>> diff --git a/display/surface.c b/display/surface.c
>> index 8f7aae1..b8628fe 100644
>> --- a/display/surface.c
>> +++ b/display/surface.c
>> @@ -249,6 +249,7 @@ BOOL MoveSurfaceToVideoRam(PDev *pdev, UINT32
>> surface_id)
>> surface_info->phys_mem = phys_mem;
>> surface_info->draw_area.base_mem = base_mem;
>> surface = SurfaceCmd(pdev, QXL_SURFACE_CMD_CREATE, surface_id);
>> + surface->flags |= QXL_SURF_FLAG_KEEP_DATA;
>> surface->u.surface_create.format = surface_format;
>> surface->u.surface_create.width = cx;
>> surface->u.surface_create.height = cy;
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel



More information about the Spice-devel mailing list