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;
}