On 2024/1/15 15:55, Parav Pandit wrote: > >> From: Chen, Jiqian <jiqian.c...@amd.com> >> Sent: Monday, January 15, 2024 1:18 PM >> >> On 2024/1/15 15:37, Parav Pandit wrote: >>> >>>> From: Chen, Jiqian <jiqian.c...@amd.com> >>>> Sent: Monday, January 15, 2024 1:03 PM >>>> >>>> On 2024/1/12 17:44, Parav Pandit wrote: >>>>> >>>>> >>>>>> From: Chen, Jiqian <jiqian.c...@amd.com> >>>>>> Sent: Friday, January 12, 2024 2:55 PM >>>>>> >>>>>> On 2024/1/12 16:47, Parav Pandit wrote: >>>>>>> >>>>>>> >>>>>>>> From: Chen, Jiqian <jiqian.c...@amd.com> >>>>>>>> Sent: Friday, January 12, 2024 1:55 PM >>>>>>>> >>>>>>>> >>>>>>>> On 2024/1/12 16:02, Parav Pandit wrote: >>>>>>>>> Hi Jiqian, >>>>>>>>> >>>>>>>>>> From: Chen, Jiqian <jiqian.c...@amd.com> >>>>>>>>>> Sent: Friday, January 12, 2024 1:11 PM >>>>>>>>> >>>>>>>>>> >>>>>>>>>> Hi all, >>>>>>>>>> Sorry to reply late. >>>>>>>>>> I don't know if you still remember this problem, let me briefly >>>>>>>>>> descript >>>>>> it. >>>>>>>>>> I am working to implement virtgpu S3 function on Xen. >>>>>>>>>> Currently on Xen, if we start a guest through qemu with >>>>>>>>>> enabling virtgpu, and then suspend and resume guest. We can >>>>>>>>>> find that the guest kernel comes back, but the display doesn't. >>>>>>>>>> It just shown a black >>>>>>>> screen. >>>>>>>>>> That is because during suspending, guest called into qemu and >>>>>>>>>> qemu destroyed all display resources and reset renderer. This >>>>>>>>>> made the display gone after guest resumed. >>>>>>>>>> So, I add a new command for virtio-gpu that when guest is >>>>>>>>>> suspending, it will notify qemu and set >>>>>>>>>> parameter(preserver_resource) to 1 and then qemu will preserve >>>>>>>>>> resources, and when resuming, guest will notify qemu to set >>>>>>>>>> parameter to 0, and then qemu will keep the normal actions. >>>>>>>>>> That can >>>>>> help guest's display come back. >>>>>>>>>> When I upstream above implementation, Parav and MST suggest me >>>> to >>>>>>>> use >>>>>>>>>> the PM capability to fix this problem instead of adding a new >>>>>>>>>> command or state bit. >>>>>>>>>> Now, I have tried the PM capability of virtio-gpu, it can't be >>>>>>>>>> used to solve this problem. >>>>>>>>>> The reason is: >>>>>>>>>> during guest suspending, it will write D3 state through PM cap, >>>>>>>>>> then I can save the resources of virtio-gpu on Qemu side(set >>>>>>>>>> preserver_resource to 1), but during the process of resuming, >>>>>>>>>> the state of PM cap will be cleared by qemu >>>>>>>>>> resetting(qemu_system_wakeup-> qemu_devices_reset-> >>>>>>>>>> virtio_vga_base_reset-> virtio_gpu_gl_reset), it causes that >>>>>>>>>> when guest reads state from PM cap, it will find the virtio-gpu >>>>>>>>>> has already been D0 state, >>>>>>>>> This behavior needs to be fixed. As the spec listed out, " This >>>>>>>>> 2-bit field is >>>>>>>> used both to determine the current power state of a Function" >>>>>>>> Do you mean it is wrong to reset PM cap when vritio_gpu reset in >>>>>>>> current qemu code? Why? >>>>>>> Because PM is implementing the support from D3->d0 transition and >>>>>>> if it >>>>>> device in D3, the device needs to respond that it is in D3 to match >>>>>> the PCI spec. >>>>>>> >>>>>>>> Shouldn't all device states, including PM registers, be reset >>>>>>>> during the process of virtio-gpu reset? >>>>>>> If No_Soft_Reset== 0, no device context to be preserved. >>>>>>> If No_Soft_Reset == 1, device to preserve minimal registers and >>>>>>> other >>>>>> things listed in pci spec. >>>>>>> >>>>>>>> >>>>>>>>> >>>>>>>>> So device needs to return D3 in the PowerState field. This is must. >>>>>>>> But current behavior is a kind of soft reset, I >>>>>>>> think(!PCI_PM_CTRL_NO_SOFT_RESET). The pm cap is reset by qemu >> is >>>>>>>> reasonable. >>>>>>> What you described is, you need to do No_Soft_Reset=1, so please >>>>>>> set the >>>>>> cap accordingly to achieve the restore. >>>>>>> >>>>>>> Also in your case the if the QEMU knows that it will have to >>>>>>> resume the >>>>>> device soon. >>>>>>> Hence, it can well prepare the gpu context before resuming the vcpus. >>>>>>> In such case, the extra register wouldn’t be necessary. >>>>>>> Having PM control register is anyway needed to drive the device >> properly. >>>>>> Even as you said, the reset behavior of PM in the current QEMU code >>>>>> is incorrect, and even if it is modified, it also cannot fix this >>>>>> problem with >> S3. >>>>> You meant D3? >>>>> >>>>>> Because there is twice device reset during resuming. >>>>>> First is when we trigger a resume command to qemu, qemu will reset >>>>>> device(qemu_system_wakeup-> qemu_devices_reset-> >>>>>> virtio_vga_base_reset-> virtio_gpu_gl_reset). >>>>> A device implementation that supports PM should not reset the device. >>>> Please fix it. >>>> Do you mean the devices_reset behavior of qemu shouldn't happen when >>>> a device has PM cap? >>> Right. Device reset should not happen on PM capable device that offers >> no_soft_reset==1. >> But current qemu code, no_soft_reset==0. >> > So please fix the qemu when you are adding the functionality of restoring the > device context on PM. My patch didn't add the functionality of restoring the device context on PM. Is no_soft_reset must set 1 when a device has PM cap? It should also be allowed for situations that are not equal to 1, right? There should be devices that has PM cap but no_soft_reset is 0 because that devices can't store and restore the device context on d3->d0 transition, like current qemu code. So the fix should be feasible for all situations that whether the no_soft_reset is 1 or not. If use PM cap, not every situation can solve current problem (display resources of GPU will be destroyed).
> >>> >>>> Or just the state of PM cap shouldn't be reset? >>>> >>>>> >>>>>> After the first time, then second time happens in guest kernel, >>>>>> virtio_device_restore-> virtio_reset_device. But the PM state >>>>>> changes >>>>>> (D3 to >>>>>> D0) happens between those two, so the display resources will be >>>>>> still destroyed by the second time of device reset. >>>>> The driver that understands that device supports PM, will skip the >>>>> reset >>>> steps. >>>> But it happens for now. >>> This should be enhanced in the guest driver. >>> >>>> In current qemu codes, the bit PCI_PM_CTRL_NO_SOFT_RESET of >>>> virtio-pci devices isn't set, is it a bug? It means the no_soft_reset==0. >>>> >>> It should be set when/if the device can store and restore the device context >> on d3->d0 transition. >> I don't know why it doesn't be set in current qemu code. > May be because QEMU is not restoring the context on PM commands. > >> What do you mean "the device can store and restore the device context on >> d3->d0 transition"? The real physical device or the simulated devices on qemu >> side? > Does not matter, whichever implementation of device is doing the PM should > set it. > In your case it is qemu. > >> How do I confirm it? > If you mean "I" means guest driver, it will just work as long as it refers to > the PM capabilities. > >> >>> >>>>> Hence the 2nd reset will also not occur. >>>>> Therefore, device state will be restored. >>>> >>>> -- >>>> Best regards, >>>> Jiqian Chen. >> >> -- >> Best regards, >> Jiqian Chen. -- Best regards, Jiqian Chen.