Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at nocache-cleanup 94 lines 1.9 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2025, Advanced Micro Devices, Inc. 4 */ 5 6#include <drm/amdxdna_accel.h> 7#include <drm/drm_drv.h> 8#include <linux/pm_runtime.h> 9 10#include "amdxdna_pm.h" 11 12#define AMDXDNA_AUTOSUSPEND_DELAY 5000 /* milliseconds */ 13 14int amdxdna_pm_suspend(struct device *dev) 15{ 16 struct amdxdna_dev *xdna = to_xdna_dev(dev_get_drvdata(dev)); 17 int ret = -EOPNOTSUPP; 18 bool rpm; 19 20 if (xdna->dev_info->ops->suspend) { 21 rpm = xdna->rpm_on; 22 xdna->rpm_on = false; 23 ret = xdna->dev_info->ops->suspend(xdna); 24 xdna->rpm_on = rpm; 25 } 26 27 XDNA_DBG(xdna, "Suspend done ret %d", ret); 28 return ret; 29} 30 31int amdxdna_pm_resume(struct device *dev) 32{ 33 struct amdxdna_dev *xdna = to_xdna_dev(dev_get_drvdata(dev)); 34 int ret = -EOPNOTSUPP; 35 bool rpm; 36 37 if (xdna->dev_info->ops->resume) { 38 rpm = xdna->rpm_on; 39 xdna->rpm_on = false; 40 ret = xdna->dev_info->ops->resume(xdna); 41 xdna->rpm_on = rpm; 42 } 43 44 XDNA_DBG(xdna, "Resume done ret %d", ret); 45 return ret; 46} 47 48int amdxdna_pm_resume_get(struct amdxdna_dev *xdna) 49{ 50 struct device *dev = xdna->ddev.dev; 51 int ret; 52 53 if (!xdna->rpm_on) 54 return 0; 55 56 ret = pm_runtime_resume_and_get(dev); 57 if (ret) { 58 XDNA_ERR(xdna, "Resume failed: %d", ret); 59 pm_runtime_set_suspended(dev); 60 } 61 62 return ret; 63} 64 65void amdxdna_pm_suspend_put(struct amdxdna_dev *xdna) 66{ 67 struct device *dev = xdna->ddev.dev; 68 69 if (!xdna->rpm_on) 70 return; 71 72 pm_runtime_put_autosuspend(dev); 73} 74 75void amdxdna_pm_init(struct amdxdna_dev *xdna) 76{ 77 struct device *dev = xdna->ddev.dev; 78 79 pm_runtime_set_active(dev); 80 pm_runtime_set_autosuspend_delay(dev, AMDXDNA_AUTOSUSPEND_DELAY); 81 pm_runtime_use_autosuspend(dev); 82 pm_runtime_allow(dev); 83 pm_runtime_put_autosuspend(dev); 84 xdna->rpm_on = true; 85} 86 87void amdxdna_pm_fini(struct amdxdna_dev *xdna) 88{ 89 struct device *dev = xdna->ddev.dev; 90 91 xdna->rpm_on = false; 92 pm_runtime_get_noresume(dev); 93 pm_runtime_forbid(dev); 94}