amdxdna_pm.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2025, Advanced Micro Devices, Inc.
  4. */
  5. #include <drm/amdxdna_accel.h>
  6. #include <drm/drm_drv.h>
  7. #include <linux/pm_runtime.h>
  8. #include "amdxdna_pm.h"
  9. #define AMDXDNA_AUTOSUSPEND_DELAY 5000 /* milliseconds */
  10. int amdxdna_pm_suspend(struct device *dev)
  11. {
  12. struct amdxdna_dev *xdna = to_xdna_dev(dev_get_drvdata(dev));
  13. int ret = -EOPNOTSUPP;
  14. guard(mutex)(&xdna->dev_lock);
  15. if (xdna->dev_info->ops->suspend)
  16. ret = xdna->dev_info->ops->suspend(xdna);
  17. XDNA_DBG(xdna, "Suspend done ret %d", ret);
  18. return ret;
  19. }
  20. int amdxdna_pm_resume(struct device *dev)
  21. {
  22. struct amdxdna_dev *xdna = to_xdna_dev(dev_get_drvdata(dev));
  23. int ret = -EOPNOTSUPP;
  24. guard(mutex)(&xdna->dev_lock);
  25. if (xdna->dev_info->ops->resume)
  26. ret = xdna->dev_info->ops->resume(xdna);
  27. XDNA_DBG(xdna, "Resume done ret %d", ret);
  28. return ret;
  29. }
  30. int amdxdna_pm_resume_get(struct amdxdna_dev *xdna)
  31. {
  32. struct device *dev = xdna->ddev.dev;
  33. int ret;
  34. ret = pm_runtime_resume_and_get(dev);
  35. if (ret) {
  36. XDNA_ERR(xdna, "Resume failed: %d", ret);
  37. pm_runtime_set_suspended(dev);
  38. }
  39. return ret;
  40. }
  41. void amdxdna_pm_suspend_put(struct amdxdna_dev *xdna)
  42. {
  43. struct device *dev = xdna->ddev.dev;
  44. pm_runtime_put_autosuspend(dev);
  45. }
  46. void amdxdna_pm_init(struct amdxdna_dev *xdna)
  47. {
  48. struct device *dev = xdna->ddev.dev;
  49. pm_runtime_set_active(dev);
  50. pm_runtime_set_autosuspend_delay(dev, AMDXDNA_AUTOSUSPEND_DELAY);
  51. pm_runtime_use_autosuspend(dev);
  52. pm_runtime_allow(dev);
  53. pm_runtime_put_autosuspend(dev);
  54. }
  55. void amdxdna_pm_fini(struct amdxdna_dev *xdna)
  56. {
  57. struct device *dev = xdna->ddev.dev;
  58. pm_runtime_get_noresume(dev);
  59. pm_runtime_forbid(dev);
  60. }