cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sysfs.c (21722B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* sysfs entries for device PM */
      3#include <linux/device.h>
      4#include <linux/kobject.h>
      5#include <linux/string.h>
      6#include <linux/export.h>
      7#include <linux/pm_qos.h>
      8#include <linux/pm_runtime.h>
      9#include <linux/pm_wakeup.h>
     10#include <linux/atomic.h>
     11#include <linux/jiffies.h>
     12#include "power.h"
     13
     14/*
     15 *	control - Report/change current runtime PM setting of the device
     16 *
     17 *	Runtime power management of a device can be blocked with the help of
     18 *	this attribute.  All devices have one of the following two values for
     19 *	the power/control file:
     20 *
     21 *	 + "auto\n" to allow the device to be power managed at run time;
     22 *	 + "on\n" to prevent the device from being power managed at run time;
     23 *
     24 *	The default for all devices is "auto", which means that devices may be
     25 *	subject to automatic power management, depending on their drivers.
     26 *	Changing this attribute to "on" prevents the driver from power managing
     27 *	the device at run time.  Doing that while the device is suspended causes
     28 *	it to be woken up.
     29 *
     30 *	wakeup - Report/change current wakeup option for device
     31 *
     32 *	Some devices support "wakeup" events, which are hardware signals
     33 *	used to activate devices from suspended or low power states.  Such
     34 *	devices have one of three values for the sysfs power/wakeup file:
     35 *
     36 *	 + "enabled\n" to issue the events;
     37 *	 + "disabled\n" not to do so; or
     38 *	 + "\n" for temporary or permanent inability to issue wakeup.
     39 *
     40 *	(For example, unconfigured USB devices can't issue wakeups.)
     41 *
     42 *	Familiar examples of devices that can issue wakeup events include
     43 *	keyboards and mice (both PS2 and USB styles), power buttons, modems,
     44 *	"Wake-On-LAN" Ethernet links, GPIO lines, and more.  Some events
     45 *	will wake the entire system from a suspend state; others may just
     46 *	wake up the device (if the system as a whole is already active).
     47 *	Some wakeup events use normal IRQ lines; other use special out
     48 *	of band signaling.
     49 *
     50 *	It is the responsibility of device drivers to enable (or disable)
     51 *	wakeup signaling as part of changing device power states, respecting
     52 *	the policy choices provided through the driver model.
     53 *
     54 *	Devices may not be able to generate wakeup events from all power
     55 *	states.  Also, the events may be ignored in some configurations;
     56 *	for example, they might need help from other devices that aren't
     57 *	active, or which may have wakeup disabled.  Some drivers rely on
     58 *	wakeup events internally (unless they are disabled), keeping
     59 *	their hardware in low power modes whenever they're unused.  This
     60 *	saves runtime power, without requiring system-wide sleep states.
     61 *
     62 *	async - Report/change current async suspend setting for the device
     63 *
     64 *	Asynchronous suspend and resume of the device during system-wide power
     65 *	state transitions can be enabled by writing "enabled" to this file.
     66 *	Analogously, if "disabled" is written to this file, the device will be
     67 *	suspended and resumed synchronously.
     68 *
     69 *	All devices have one of the following two values for power/async:
     70 *
     71 *	 + "enabled\n" to permit the asynchronous suspend/resume of the device;
     72 *	 + "disabled\n" to forbid it;
     73 *
     74 *	NOTE: It generally is unsafe to permit the asynchronous suspend/resume
     75 *	of a device unless it is certain that all of the PM dependencies of the
     76 *	device are known to the PM core.  However, for some devices this
     77 *	attribute is set to "enabled" by bus type code or device drivers and in
     78 *	that cases it should be safe to leave the default value.
     79 *
     80 *	autosuspend_delay_ms - Report/change a device's autosuspend_delay value
     81 *
     82 *	Some drivers don't want to carry out a runtime suspend as soon as a
     83 *	device becomes idle; they want it always to remain idle for some period
     84 *	of time before suspending it.  This period is the autosuspend_delay
     85 *	value (expressed in milliseconds) and it can be controlled by the user.
     86 *	If the value is negative then the device will never be runtime
     87 *	suspended.
     88 *
     89 *	NOTE: The autosuspend_delay_ms attribute and the autosuspend_delay
     90 *	value are used only if the driver calls pm_runtime_use_autosuspend().
     91 *
     92 *	wakeup_count - Report the number of wakeup events related to the device
     93 */
     94
     95const char power_group_name[] = "power";
     96EXPORT_SYMBOL_GPL(power_group_name);
     97
     98static const char ctrl_auto[] = "auto";
     99static const char ctrl_on[] = "on";
    100
    101static ssize_t control_show(struct device *dev, struct device_attribute *attr,
    102			    char *buf)
    103{
    104	return sysfs_emit(buf, "%s\n",
    105			  dev->power.runtime_auto ? ctrl_auto : ctrl_on);
    106}
    107
    108static ssize_t control_store(struct device * dev, struct device_attribute *attr,
    109			     const char * buf, size_t n)
    110{
    111	device_lock(dev);
    112	if (sysfs_streq(buf, ctrl_auto))
    113		pm_runtime_allow(dev);
    114	else if (sysfs_streq(buf, ctrl_on))
    115		pm_runtime_forbid(dev);
    116	else
    117		n = -EINVAL;
    118	device_unlock(dev);
    119	return n;
    120}
    121
    122static DEVICE_ATTR_RW(control);
    123
    124static ssize_t runtime_active_time_show(struct device *dev,
    125					struct device_attribute *attr,
    126					char *buf)
    127{
    128	u64 tmp = pm_runtime_active_time(dev);
    129
    130	do_div(tmp, NSEC_PER_MSEC);
    131
    132	return sysfs_emit(buf, "%llu\n", tmp);
    133}
    134
    135static DEVICE_ATTR_RO(runtime_active_time);
    136
    137static ssize_t runtime_suspended_time_show(struct device *dev,
    138					   struct device_attribute *attr,
    139					   char *buf)
    140{
    141	u64 tmp = pm_runtime_suspended_time(dev);
    142
    143	do_div(tmp, NSEC_PER_MSEC);
    144
    145	return sysfs_emit(buf, "%llu\n", tmp);
    146}
    147
    148static DEVICE_ATTR_RO(runtime_suspended_time);
    149
    150static ssize_t runtime_status_show(struct device *dev,
    151				   struct device_attribute *attr, char *buf)
    152{
    153	const char *output;
    154
    155	if (dev->power.runtime_error) {
    156		output = "error";
    157	} else if (dev->power.disable_depth) {
    158		output = "unsupported";
    159	} else {
    160		switch (dev->power.runtime_status) {
    161		case RPM_SUSPENDED:
    162			output = "suspended";
    163			break;
    164		case RPM_SUSPENDING:
    165			output = "suspending";
    166			break;
    167		case RPM_RESUMING:
    168			output = "resuming";
    169			break;
    170		case RPM_ACTIVE:
    171			output = "active";
    172			break;
    173		default:
    174			return -EIO;
    175		}
    176	}
    177	return sysfs_emit(buf, "%s\n", output);
    178}
    179
    180static DEVICE_ATTR_RO(runtime_status);
    181
    182static ssize_t autosuspend_delay_ms_show(struct device *dev,
    183					 struct device_attribute *attr,
    184					 char *buf)
    185{
    186	if (!dev->power.use_autosuspend)
    187		return -EIO;
    188
    189	return sysfs_emit(buf, "%d\n", dev->power.autosuspend_delay);
    190}
    191
    192static ssize_t autosuspend_delay_ms_store(struct device *dev,
    193		struct device_attribute *attr, const char *buf, size_t n)
    194{
    195	long delay;
    196
    197	if (!dev->power.use_autosuspend)
    198		return -EIO;
    199
    200	if (kstrtol(buf, 10, &delay) != 0 || delay != (int) delay)
    201		return -EINVAL;
    202
    203	device_lock(dev);
    204	pm_runtime_set_autosuspend_delay(dev, delay);
    205	device_unlock(dev);
    206	return n;
    207}
    208
    209static DEVICE_ATTR_RW(autosuspend_delay_ms);
    210
    211static ssize_t pm_qos_resume_latency_us_show(struct device *dev,
    212					     struct device_attribute *attr,
    213					     char *buf)
    214{
    215	s32 value = dev_pm_qos_requested_resume_latency(dev);
    216
    217	if (value == 0)
    218		return sysfs_emit(buf, "n/a\n");
    219	if (value == PM_QOS_RESUME_LATENCY_NO_CONSTRAINT)
    220		value = 0;
    221
    222	return sysfs_emit(buf, "%d\n", value);
    223}
    224
    225static ssize_t pm_qos_resume_latency_us_store(struct device *dev,
    226					      struct device_attribute *attr,
    227					      const char *buf, size_t n)
    228{
    229	s32 value;
    230	int ret;
    231
    232	if (!kstrtos32(buf, 0, &value)) {
    233		/*
    234		 * Prevent users from writing negative or "no constraint" values
    235		 * directly.
    236		 */
    237		if (value < 0 || value == PM_QOS_RESUME_LATENCY_NO_CONSTRAINT)
    238			return -EINVAL;
    239
    240		if (value == 0)
    241			value = PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
    242	} else if (sysfs_streq(buf, "n/a")) {
    243		value = 0;
    244	} else {
    245		return -EINVAL;
    246	}
    247
    248	ret = dev_pm_qos_update_request(dev->power.qos->resume_latency_req,
    249					value);
    250	return ret < 0 ? ret : n;
    251}
    252
    253static DEVICE_ATTR_RW(pm_qos_resume_latency_us);
    254
    255static ssize_t pm_qos_latency_tolerance_us_show(struct device *dev,
    256						struct device_attribute *attr,
    257						char *buf)
    258{
    259	s32 value = dev_pm_qos_get_user_latency_tolerance(dev);
    260
    261	if (value < 0)
    262		return sysfs_emit(buf, "%s\n", "auto");
    263	if (value == PM_QOS_LATENCY_ANY)
    264		return sysfs_emit(buf, "%s\n", "any");
    265
    266	return sysfs_emit(buf, "%d\n", value);
    267}
    268
    269static ssize_t pm_qos_latency_tolerance_us_store(struct device *dev,
    270						 struct device_attribute *attr,
    271						 const char *buf, size_t n)
    272{
    273	s32 value;
    274	int ret;
    275
    276	if (kstrtos32(buf, 0, &value) == 0) {
    277		/* Users can't write negative values directly */
    278		if (value < 0)
    279			return -EINVAL;
    280	} else {
    281		if (sysfs_streq(buf, "auto"))
    282			value = PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT;
    283		else if (sysfs_streq(buf, "any"))
    284			value = PM_QOS_LATENCY_ANY;
    285		else
    286			return -EINVAL;
    287	}
    288	ret = dev_pm_qos_update_user_latency_tolerance(dev, value);
    289	return ret < 0 ? ret : n;
    290}
    291
    292static DEVICE_ATTR_RW(pm_qos_latency_tolerance_us);
    293
    294static ssize_t pm_qos_no_power_off_show(struct device *dev,
    295					struct device_attribute *attr,
    296					char *buf)
    297{
    298	return sysfs_emit(buf, "%d\n", !!(dev_pm_qos_requested_flags(dev)
    299					  & PM_QOS_FLAG_NO_POWER_OFF));
    300}
    301
    302static ssize_t pm_qos_no_power_off_store(struct device *dev,
    303					 struct device_attribute *attr,
    304					 const char *buf, size_t n)
    305{
    306	int ret;
    307
    308	if (kstrtoint(buf, 0, &ret))
    309		return -EINVAL;
    310
    311	if (ret != 0 && ret != 1)
    312		return -EINVAL;
    313
    314	ret = dev_pm_qos_update_flags(dev, PM_QOS_FLAG_NO_POWER_OFF, ret);
    315	return ret < 0 ? ret : n;
    316}
    317
    318static DEVICE_ATTR_RW(pm_qos_no_power_off);
    319
    320#ifdef CONFIG_PM_SLEEP
    321static const char _enabled[] = "enabled";
    322static const char _disabled[] = "disabled";
    323
    324static ssize_t wakeup_show(struct device *dev, struct device_attribute *attr,
    325			   char *buf)
    326{
    327	return sysfs_emit(buf, "%s\n", device_can_wakeup(dev)
    328			  ? (device_may_wakeup(dev) ? _enabled : _disabled)
    329			  : "");
    330}
    331
    332static ssize_t wakeup_store(struct device *dev, struct device_attribute *attr,
    333			    const char *buf, size_t n)
    334{
    335	if (!device_can_wakeup(dev))
    336		return -EINVAL;
    337
    338	if (sysfs_streq(buf, _enabled))
    339		device_set_wakeup_enable(dev, 1);
    340	else if (sysfs_streq(buf, _disabled))
    341		device_set_wakeup_enable(dev, 0);
    342	else
    343		return -EINVAL;
    344	return n;
    345}
    346
    347static DEVICE_ATTR_RW(wakeup);
    348
    349static ssize_t wakeup_count_show(struct device *dev,
    350				 struct device_attribute *attr, char *buf)
    351{
    352	unsigned long count;
    353	bool enabled = false;
    354
    355	spin_lock_irq(&dev->power.lock);
    356	if (dev->power.wakeup) {
    357		count = dev->power.wakeup->wakeup_count;
    358		enabled = true;
    359	}
    360	spin_unlock_irq(&dev->power.lock);
    361
    362	if (!enabled)
    363		return sysfs_emit(buf, "\n");
    364	return sysfs_emit(buf, "%lu\n", count);
    365}
    366
    367static DEVICE_ATTR_RO(wakeup_count);
    368
    369static ssize_t wakeup_active_count_show(struct device *dev,
    370					struct device_attribute *attr,
    371					char *buf)
    372{
    373	unsigned long count;
    374	bool enabled = false;
    375
    376	spin_lock_irq(&dev->power.lock);
    377	if (dev->power.wakeup) {
    378		count = dev->power.wakeup->active_count;
    379		enabled = true;
    380	}
    381	spin_unlock_irq(&dev->power.lock);
    382
    383	if (!enabled)
    384		return sysfs_emit(buf, "\n");
    385	return sysfs_emit(buf, "%lu\n", count);
    386}
    387
    388static DEVICE_ATTR_RO(wakeup_active_count);
    389
    390static ssize_t wakeup_abort_count_show(struct device *dev,
    391				       struct device_attribute *attr,
    392				       char *buf)
    393{
    394	unsigned long count;
    395	bool enabled = false;
    396
    397	spin_lock_irq(&dev->power.lock);
    398	if (dev->power.wakeup) {
    399		count = dev->power.wakeup->wakeup_count;
    400		enabled = true;
    401	}
    402	spin_unlock_irq(&dev->power.lock);
    403
    404	if (!enabled)
    405		return sysfs_emit(buf, "\n");
    406	return sysfs_emit(buf, "%lu\n", count);
    407}
    408
    409static DEVICE_ATTR_RO(wakeup_abort_count);
    410
    411static ssize_t wakeup_expire_count_show(struct device *dev,
    412					struct device_attribute *attr,
    413					char *buf)
    414{
    415	unsigned long count;
    416	bool enabled = false;
    417
    418	spin_lock_irq(&dev->power.lock);
    419	if (dev->power.wakeup) {
    420		count = dev->power.wakeup->expire_count;
    421		enabled = true;
    422	}
    423	spin_unlock_irq(&dev->power.lock);
    424
    425	if (!enabled)
    426		return sysfs_emit(buf, "\n");
    427	return sysfs_emit(buf, "%lu\n", count);
    428}
    429
    430static DEVICE_ATTR_RO(wakeup_expire_count);
    431
    432static ssize_t wakeup_active_show(struct device *dev,
    433				  struct device_attribute *attr, char *buf)
    434{
    435	unsigned int active;
    436	bool enabled = false;
    437
    438	spin_lock_irq(&dev->power.lock);
    439	if (dev->power.wakeup) {
    440		active = dev->power.wakeup->active;
    441		enabled = true;
    442	}
    443	spin_unlock_irq(&dev->power.lock);
    444
    445	if (!enabled)
    446		return sysfs_emit(buf, "\n");
    447	return sysfs_emit(buf, "%u\n", active);
    448}
    449
    450static DEVICE_ATTR_RO(wakeup_active);
    451
    452static ssize_t wakeup_total_time_ms_show(struct device *dev,
    453					 struct device_attribute *attr,
    454					 char *buf)
    455{
    456	s64 msec;
    457	bool enabled = false;
    458
    459	spin_lock_irq(&dev->power.lock);
    460	if (dev->power.wakeup) {
    461		msec = ktime_to_ms(dev->power.wakeup->total_time);
    462		enabled = true;
    463	}
    464	spin_unlock_irq(&dev->power.lock);
    465
    466	if (!enabled)
    467		return sysfs_emit(buf, "\n");
    468	return sysfs_emit(buf, "%lld\n", msec);
    469}
    470
    471static DEVICE_ATTR_RO(wakeup_total_time_ms);
    472
    473static ssize_t wakeup_max_time_ms_show(struct device *dev,
    474				       struct device_attribute *attr, char *buf)
    475{
    476	s64 msec;
    477	bool enabled = false;
    478
    479	spin_lock_irq(&dev->power.lock);
    480	if (dev->power.wakeup) {
    481		msec = ktime_to_ms(dev->power.wakeup->max_time);
    482		enabled = true;
    483	}
    484	spin_unlock_irq(&dev->power.lock);
    485
    486	if (!enabled)
    487		return sysfs_emit(buf, "\n");
    488	return sysfs_emit(buf, "%lld\n", msec);
    489}
    490
    491static DEVICE_ATTR_RO(wakeup_max_time_ms);
    492
    493static ssize_t wakeup_last_time_ms_show(struct device *dev,
    494					struct device_attribute *attr,
    495					char *buf)
    496{
    497	s64 msec;
    498	bool enabled = false;
    499
    500	spin_lock_irq(&dev->power.lock);
    501	if (dev->power.wakeup) {
    502		msec = ktime_to_ms(dev->power.wakeup->last_time);
    503		enabled = true;
    504	}
    505	spin_unlock_irq(&dev->power.lock);
    506
    507	if (!enabled)
    508		return sysfs_emit(buf, "\n");
    509	return sysfs_emit(buf, "%lld\n", msec);
    510}
    511
    512static inline int dpm_sysfs_wakeup_change_owner(struct device *dev, kuid_t kuid,
    513						kgid_t kgid)
    514{
    515	if (dev->power.wakeup && dev->power.wakeup->dev)
    516		return device_change_owner(dev->power.wakeup->dev, kuid, kgid);
    517	return 0;
    518}
    519
    520static DEVICE_ATTR_RO(wakeup_last_time_ms);
    521
    522#ifdef CONFIG_PM_AUTOSLEEP
    523static ssize_t wakeup_prevent_sleep_time_ms_show(struct device *dev,
    524						 struct device_attribute *attr,
    525						 char *buf)
    526{
    527	s64 msec;
    528	bool enabled = false;
    529
    530	spin_lock_irq(&dev->power.lock);
    531	if (dev->power.wakeup) {
    532		msec = ktime_to_ms(dev->power.wakeup->prevent_sleep_time);
    533		enabled = true;
    534	}
    535	spin_unlock_irq(&dev->power.lock);
    536
    537	if (!enabled)
    538		return sysfs_emit(buf, "\n");
    539	return sysfs_emit(buf, "%lld\n", msec);
    540}
    541
    542static DEVICE_ATTR_RO(wakeup_prevent_sleep_time_ms);
    543#endif /* CONFIG_PM_AUTOSLEEP */
    544#else /* CONFIG_PM_SLEEP */
    545static inline int dpm_sysfs_wakeup_change_owner(struct device *dev, kuid_t kuid,
    546						kgid_t kgid)
    547{
    548	return 0;
    549}
    550#endif
    551
    552#ifdef CONFIG_PM_ADVANCED_DEBUG
    553static ssize_t runtime_usage_show(struct device *dev,
    554				  struct device_attribute *attr, char *buf)
    555{
    556	return sysfs_emit(buf, "%d\n", atomic_read(&dev->power.usage_count));
    557}
    558static DEVICE_ATTR_RO(runtime_usage);
    559
    560static ssize_t runtime_active_kids_show(struct device *dev,
    561					struct device_attribute *attr,
    562					char *buf)
    563{
    564	return sysfs_emit(buf, "%d\n", dev->power.ignore_children ?
    565			  0 : atomic_read(&dev->power.child_count));
    566}
    567static DEVICE_ATTR_RO(runtime_active_kids);
    568
    569static ssize_t runtime_enabled_show(struct device *dev,
    570				    struct device_attribute *attr, char *buf)
    571{
    572	const char *output;
    573
    574	if (dev->power.disable_depth && !dev->power.runtime_auto)
    575		output = "disabled & forbidden";
    576	else if (dev->power.disable_depth)
    577		output = "disabled";
    578	else if (!dev->power.runtime_auto)
    579		output = "forbidden";
    580	else
    581		output = "enabled";
    582
    583	return sysfs_emit(buf, "%s\n", output);
    584}
    585static DEVICE_ATTR_RO(runtime_enabled);
    586
    587#ifdef CONFIG_PM_SLEEP
    588static ssize_t async_show(struct device *dev, struct device_attribute *attr,
    589			  char *buf)
    590{
    591	return sysfs_emit(buf, "%s\n",
    592			  device_async_suspend_enabled(dev) ?
    593			  _enabled : _disabled);
    594}
    595
    596static ssize_t async_store(struct device *dev, struct device_attribute *attr,
    597			   const char *buf, size_t n)
    598{
    599	if (sysfs_streq(buf, _enabled))
    600		device_enable_async_suspend(dev);
    601	else if (sysfs_streq(buf, _disabled))
    602		device_disable_async_suspend(dev);
    603	else
    604		return -EINVAL;
    605	return n;
    606}
    607
    608static DEVICE_ATTR_RW(async);
    609
    610#endif /* CONFIG_PM_SLEEP */
    611#endif /* CONFIG_PM_ADVANCED_DEBUG */
    612
    613static struct attribute *power_attrs[] = {
    614#ifdef CONFIG_PM_ADVANCED_DEBUG
    615#ifdef CONFIG_PM_SLEEP
    616	&dev_attr_async.attr,
    617#endif
    618	&dev_attr_runtime_status.attr,
    619	&dev_attr_runtime_usage.attr,
    620	&dev_attr_runtime_active_kids.attr,
    621	&dev_attr_runtime_enabled.attr,
    622#endif /* CONFIG_PM_ADVANCED_DEBUG */
    623	NULL,
    624};
    625static const struct attribute_group pm_attr_group = {
    626	.name	= power_group_name,
    627	.attrs	= power_attrs,
    628};
    629
    630static struct attribute *wakeup_attrs[] = {
    631#ifdef CONFIG_PM_SLEEP
    632	&dev_attr_wakeup.attr,
    633	&dev_attr_wakeup_count.attr,
    634	&dev_attr_wakeup_active_count.attr,
    635	&dev_attr_wakeup_abort_count.attr,
    636	&dev_attr_wakeup_expire_count.attr,
    637	&dev_attr_wakeup_active.attr,
    638	&dev_attr_wakeup_total_time_ms.attr,
    639	&dev_attr_wakeup_max_time_ms.attr,
    640	&dev_attr_wakeup_last_time_ms.attr,
    641#ifdef CONFIG_PM_AUTOSLEEP
    642	&dev_attr_wakeup_prevent_sleep_time_ms.attr,
    643#endif
    644#endif
    645	NULL,
    646};
    647static const struct attribute_group pm_wakeup_attr_group = {
    648	.name	= power_group_name,
    649	.attrs	= wakeup_attrs,
    650};
    651
    652static struct attribute *runtime_attrs[] = {
    653#ifndef CONFIG_PM_ADVANCED_DEBUG
    654	&dev_attr_runtime_status.attr,
    655#endif
    656	&dev_attr_control.attr,
    657	&dev_attr_runtime_suspended_time.attr,
    658	&dev_attr_runtime_active_time.attr,
    659	&dev_attr_autosuspend_delay_ms.attr,
    660	NULL,
    661};
    662static const struct attribute_group pm_runtime_attr_group = {
    663	.name	= power_group_name,
    664	.attrs	= runtime_attrs,
    665};
    666
    667static struct attribute *pm_qos_resume_latency_attrs[] = {
    668	&dev_attr_pm_qos_resume_latency_us.attr,
    669	NULL,
    670};
    671static const struct attribute_group pm_qos_resume_latency_attr_group = {
    672	.name	= power_group_name,
    673	.attrs	= pm_qos_resume_latency_attrs,
    674};
    675
    676static struct attribute *pm_qos_latency_tolerance_attrs[] = {
    677	&dev_attr_pm_qos_latency_tolerance_us.attr,
    678	NULL,
    679};
    680static const struct attribute_group pm_qos_latency_tolerance_attr_group = {
    681	.name	= power_group_name,
    682	.attrs	= pm_qos_latency_tolerance_attrs,
    683};
    684
    685static struct attribute *pm_qos_flags_attrs[] = {
    686	&dev_attr_pm_qos_no_power_off.attr,
    687	NULL,
    688};
    689static const struct attribute_group pm_qos_flags_attr_group = {
    690	.name	= power_group_name,
    691	.attrs	= pm_qos_flags_attrs,
    692};
    693
    694int dpm_sysfs_add(struct device *dev)
    695{
    696	int rc;
    697
    698	/* No need to create PM sysfs if explicitly disabled. */
    699	if (device_pm_not_required(dev))
    700		return 0;
    701
    702	rc = sysfs_create_group(&dev->kobj, &pm_attr_group);
    703	if (rc)
    704		return rc;
    705
    706	if (!pm_runtime_has_no_callbacks(dev)) {
    707		rc = sysfs_merge_group(&dev->kobj, &pm_runtime_attr_group);
    708		if (rc)
    709			goto err_out;
    710	}
    711	if (device_can_wakeup(dev)) {
    712		rc = sysfs_merge_group(&dev->kobj, &pm_wakeup_attr_group);
    713		if (rc)
    714			goto err_runtime;
    715	}
    716	if (dev->power.set_latency_tolerance) {
    717		rc = sysfs_merge_group(&dev->kobj,
    718				       &pm_qos_latency_tolerance_attr_group);
    719		if (rc)
    720			goto err_wakeup;
    721	}
    722	rc = pm_wakeup_source_sysfs_add(dev);
    723	if (rc)
    724		goto err_latency;
    725	return 0;
    726
    727 err_latency:
    728	sysfs_unmerge_group(&dev->kobj, &pm_qos_latency_tolerance_attr_group);
    729 err_wakeup:
    730	sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group);
    731 err_runtime:
    732	sysfs_unmerge_group(&dev->kobj, &pm_runtime_attr_group);
    733 err_out:
    734	sysfs_remove_group(&dev->kobj, &pm_attr_group);
    735	return rc;
    736}
    737
    738int dpm_sysfs_change_owner(struct device *dev, kuid_t kuid, kgid_t kgid)
    739{
    740	int rc;
    741
    742	if (device_pm_not_required(dev))
    743		return 0;
    744
    745	rc = sysfs_group_change_owner(&dev->kobj, &pm_attr_group, kuid, kgid);
    746	if (rc)
    747		return rc;
    748
    749	if (!pm_runtime_has_no_callbacks(dev)) {
    750		rc = sysfs_group_change_owner(
    751			&dev->kobj, &pm_runtime_attr_group, kuid, kgid);
    752		if (rc)
    753			return rc;
    754	}
    755
    756	if (device_can_wakeup(dev)) {
    757		rc = sysfs_group_change_owner(&dev->kobj, &pm_wakeup_attr_group,
    758					      kuid, kgid);
    759		if (rc)
    760			return rc;
    761
    762		rc = dpm_sysfs_wakeup_change_owner(dev, kuid, kgid);
    763		if (rc)
    764			return rc;
    765	}
    766
    767	if (dev->power.set_latency_tolerance) {
    768		rc = sysfs_group_change_owner(
    769			&dev->kobj, &pm_qos_latency_tolerance_attr_group, kuid,
    770			kgid);
    771		if (rc)
    772			return rc;
    773	}
    774	return 0;
    775}
    776
    777int wakeup_sysfs_add(struct device *dev)
    778{
    779	int ret = sysfs_merge_group(&dev->kobj, &pm_wakeup_attr_group);
    780
    781	if (!ret)
    782		kobject_uevent(&dev->kobj, KOBJ_CHANGE);
    783
    784	return ret;
    785}
    786
    787void wakeup_sysfs_remove(struct device *dev)
    788{
    789	sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group);
    790	kobject_uevent(&dev->kobj, KOBJ_CHANGE);
    791}
    792
    793int pm_qos_sysfs_add_resume_latency(struct device *dev)
    794{
    795	return sysfs_merge_group(&dev->kobj, &pm_qos_resume_latency_attr_group);
    796}
    797
    798void pm_qos_sysfs_remove_resume_latency(struct device *dev)
    799{
    800	sysfs_unmerge_group(&dev->kobj, &pm_qos_resume_latency_attr_group);
    801}
    802
    803int pm_qos_sysfs_add_flags(struct device *dev)
    804{
    805	return sysfs_merge_group(&dev->kobj, &pm_qos_flags_attr_group);
    806}
    807
    808void pm_qos_sysfs_remove_flags(struct device *dev)
    809{
    810	sysfs_unmerge_group(&dev->kobj, &pm_qos_flags_attr_group);
    811}
    812
    813int pm_qos_sysfs_add_latency_tolerance(struct device *dev)
    814{
    815	return sysfs_merge_group(&dev->kobj,
    816				 &pm_qos_latency_tolerance_attr_group);
    817}
    818
    819void pm_qos_sysfs_remove_latency_tolerance(struct device *dev)
    820{
    821	sysfs_unmerge_group(&dev->kobj, &pm_qos_latency_tolerance_attr_group);
    822}
    823
    824void rpm_sysfs_remove(struct device *dev)
    825{
    826	sysfs_unmerge_group(&dev->kobj, &pm_runtime_attr_group);
    827}
    828
    829void dpm_sysfs_remove(struct device *dev)
    830{
    831	if (device_pm_not_required(dev))
    832		return;
    833	sysfs_unmerge_group(&dev->kobj, &pm_qos_latency_tolerance_attr_group);
    834	dev_pm_qos_constraints_destroy(dev);
    835	rpm_sysfs_remove(dev);
    836	sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group);
    837	sysfs_remove_group(&dev->kobj, &pm_attr_group);
    838}