for in_s0ix to be set the activate function needs to call the pmops wrappers
that may help amdgpu_pm_ops contains other function pointers that may also be of interest Index: sys/dev/pci/drm/amd/amdgpu/amdgpu_drv.c =================================================================== RCS file: /cvs/src/sys/dev/pci/drm/amd/amdgpu/amdgpu_drv.c,v diff -u -p -r1.44 amdgpu_drv.c --- sys/dev/pci/drm/amd/amdgpu/amdgpu_drv.c 14 May 2024 04:55:42 -0000 1.44 +++ sys/dev/pci/drm/amd/amdgpu/amdgpu_drv.c 15 Aug 2024 03:45:44 -0000 @@ -2412,9 +2412,10 @@ static void amdgpu_pmops_complete(struct /* nothing to do */ } -static int amdgpu_pmops_suspend(struct device *dev) +#endif /* notyet */ + +static int amdgpu_pmops_suspend(struct drm_device *drm_dev) { - struct drm_device *drm_dev = dev_get_drvdata(dev); struct amdgpu_device *adev = drm_to_adev(drm_dev); adev->suspend_complete = false; @@ -2427,9 +2428,8 @@ static int amdgpu_pmops_suspend(struct d return amdgpu_device_suspend(drm_dev, true); } -static int amdgpu_pmops_suspend_noirq(struct device *dev) +static int amdgpu_pmops_suspend_noirq(struct drm_device *drm_dev) { - struct drm_device *drm_dev = dev_get_drvdata(dev); struct amdgpu_device *adev = drm_to_adev(drm_dev); adev->suspend_complete = true; @@ -2439,18 +2439,19 @@ static int amdgpu_pmops_suspend_noirq(st return 0; } -static int amdgpu_pmops_resume(struct device *dev) +static int amdgpu_pmops_resume(struct drm_device *drm_dev) { - struct drm_device *drm_dev = dev_get_drvdata(dev); struct amdgpu_device *adev = drm_to_adev(drm_dev); int r; if (!adev->in_s0ix && !adev->in_s3) return 0; +#ifdef notyet /* Avoids registers access if device is physically gone */ if (!pci_device_is_present(adev->pdev)) adev->no_hw_access = true; +#endif r = amdgpu_device_resume(drm_dev, true); if (amdgpu_acpi_is_s0ix_active(adev)) @@ -2460,6 +2461,8 @@ static int amdgpu_pmops_resume(struct de return r; } +#ifdef notyet + static int amdgpu_pmops_freeze(struct device *dev) { struct drm_device *drm_dev = dev_get_drvdata(dev); @@ -3672,14 +3675,15 @@ amdgpu_activate(struct device *self, int case DVACT_QUIESCE: rv = config_activate_children(self, act); amdgpu_device_prepare(dev); - amdgpu_device_suspend(dev, true); + amdgpu_pmops_suspend(dev); break; case DVACT_SUSPEND: + amdgpu_pmops_suspend_noirq(dev); break; case DVACT_RESUME: break; case DVACT_WAKEUP: - amdgpu_device_resume(dev, true); + amdgpu_pmops_resume(dev); rv = config_activate_children(self, act); break; }