[PATCH v2 14/14] USB: Documentation for USB port power off mechanisms

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Lan Tianyu <tianyu.lan@xxxxxxxxx>

Describe the mechanisms for controlling port power policy and
discovering the port power state.

Signed-off-by: Lan Tianyu <tianyu.lan@xxxxxxxxx>
[sarah: wordsmithing]
Signed-off-by: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx>
[djbw: updates for device model, hotplug, and rework changes]
Signed-off-by: Dan Williams <dan.j.williams@xxxxxxxxx>
---
 Documentation/usb/power-management.txt |  208 ++++++++++++++++++++++++++++++++
 1 files changed, 208 insertions(+), 0 deletions(-)

diff --git a/Documentation/usb/power-management.txt b/Documentation/usb/power-management.txt
index 1392b61d6ebe..d683b2eebfd1 100644
--- a/Documentation/usb/power-management.txt
+++ b/Documentation/usb/power-management.txt
@@ -1,3 +1,4 @@
+
 			Power Management for USB
 
 		 Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>
@@ -5,6 +6,25 @@
 			    October 28, 2010
 
 
+	Contents:
+	---------
+	* What is Power Management?
+	* What is Remote Wakeup?
+	* When is a USB device idle?
+	* Forms of dynamic PM
+	* The user interface for dynamic PM
+	* Changing the default idle-delay time
+	* Warnings
+	* The driver interface for Power Management
+	* The driver interface for autosuspend and autoresume
+	* Other parts of the driver interface
+	* Mutual exclusion
+	* Interaction between dynamic PM and system PM
+	* xHCI hardware link PM
+	* USB Port Power Control
+	* User Interface for Port Power Control
+	* Suggested Userspace Port Power Policy
+
 
 	What is Power Management?
 	-------------------------
@@ -516,3 +536,191 @@ relevant attribute files is usb2_hardware_lpm.
 		driver will enable hardware LPM	for the device. You
 		can write y/Y/1 or n/N/0 to the file to	enable/disable
 		USB2 hardware LPM manually. This is for	test purpose mainly.
+
+
+	USB Port Power Control
+	----------------------
+
+In addition to suspending endpoint devices and enabling hardware
+controlled link power management, the USB subsystem also has the
+capability to disable power to individual ports.  Power is controlled
+through Set/ClearPortFeature(PORT_POWER) requests to a hub.  In the case
+of a root or platform-internal hub the host controller driver translates
+PORT_POWER requests into platform firmware (ACPI) method calls to set
+the port power state. For more background see the Linux Plumbers
+Conference 2012 slides [1] and video [2]:
+
+Upon receiving a ClearPortFeature(PORT_POWER) request a USB port is
+logically off, and may trigger the actual loss of VBUS to the port [3].
+The reason VBUS is not immediately lost is due to the fact that hubs are
+allowed to gang multiple ports into a shared power well causing power to
+remain until all ports in the gang are turned off.  In any event a
+logically off port will lose connection with its device, not respond
+to hotplug events, and not respond to remote wakeup events.
+
+WARNING: turning off a port may result in the inability to wake the
+system or hot add a device.  There are safeguards to prevent this, but
+please see "User Interface for Port Power Control" for details.
+
+As far as the effect on the device itself it is similar to what a device
+goes through during system suspend, i.e. the power session is lost.  Any
+USB device or driver that misbehaves with system suspend will be
+similarly affected by a port power cycle event.  For this reason the
+implementation shares the same device recovery path (and honors the same
+quirks) as the system resume path for the hub.
+
+[1]: http://dl.dropbox.com/u/96820575/sarah-sharp-lpt-port-power-off2-mini.pdf
+[2]: http://linuxplumbers.ubicast.tv/videos/usb-port-power-off-kerneluserspace-api/
+[3]: USB 3.1 Section 10.12
+
+
+	User Interface for Port Power Control
+	-------------------------------------
+
+The port power control mechanism uses the same dynamic PM mechanisms
+used for autosuspending USB devices.  A port device sits between the hub
+and the connected device in the device model.  For example:
+
+                                                   child device +
+                                              port device +     |
+                                       parent hub +       |     |
+                                                  v       v     v
+	/sys/devices/pci0000:00/0000:00:14.0/usb2/2-0:1.0/port1/2-1
+
+Per the dynamic PM rules the port will be held active as long as the
+child device is active, once the child goes idle several other
+constraints must be met before the port will be powered off.  Here are
+the files relative to the port device that affect the power state:
+
+	power/power_state:
+		This read-only file reflects the current
+		reason the port is being powered, or 'off' if port is
+		powered down:
+
+		'active': attached child device is actively using the
+			  port
+		'pm_qos_no_power_off': child inactive, pm qos flag keeps
+				       power enabled
+		'hotplug': child inactive, remaining powered to detect
+			   hotplug events
+		'wakeup enabled': child inactive, port kept powered to
+				  handle remote wakeup events
+		'persist disabled': child inactive, but child device
+				    will not cleanly recover from a
+				    suspend/resume cycle
+		'off': port power is off
+
+	power/runtime_status:
+		This file reflects whether the port is 'active' or
+		'suspended'.  Hubs are allowed to suspend with power
+		still enabled on their ports, so when this file returns
+		'suspended' one must look at power/power_state to see if
+		power is on.
+
+	power/pm_qos_no_power_off:
+		This writable flag is a global enable / disable for port
+		power management.  Once this file is set to '0' poweroff
+		may occur once all other constraints are met.  This
+		defaults to '1'.
+
+	power/control:
+		This file is writable and can be set to
+		'auto' (the default) to let the kernel power down the
+		device when it is idle, or 'on' to disable power
+		management and keep the port powered.
+
+	connect_type:
+		This writable file reflects the capability of the
+		connection to respond to hotplug events.  It returns one
+		of four values 'hotplug', 'hardwired', 'not used', and
+		'unknown'.  The default value is populated by platform
+		firmware, and for all but the 'hardwired' type hotplug
+		support is enabled.  One can write 'hardwired' to turn
+		off hotplug (allow the port to power down), or 'hotplug'
+		to keep the port powered.  The other types can not be
+		written to the file.
+
+		Details on the connection type:
+		"hotplug" refers to a port on the outside of a laptop
+		which is visible and connectable.
+
+		"hardwired" refers to a port that is not visible but
+		connectable. Examples are internal ports for USB
+		bluetooth that can be disconnected via an external
+		switch or a port with a hardwired USB camera.
+
+		"not used" refers to internal port that will never have
+		a device connected to it.  These may be empty internal
+		ports, or ports that are not physically
+		exposed on a platform.
+
+		"unknown" means platform does not provide information
+		for this port.
+
+		NOTE1: since we are relying on the BIOS to get this ACPI
+		information correct, the USB port descriptions may be
+		missing or wrong.
+
+		NOTE2: Take care in writing 'hardwired'.  Once power is
+		off this port will not respond to new connect events.
+
+	Once a child device is attached additional constraints are
+	applied before the port is allowed to poweroff.
+
+	<child>/power/control:
+		Must be 'auto', and the port will not
+		power down <child>/power/runtime_status
+		reflects the 'suspended' state.  Default
+		value is controlled by child device driver.
+
+	<child>/power/wakeup:
+		This controls whether the <child> device
+		is configured as a wakeup source for the
+		system.  When this file returns '1' wakeup is enabled
+		and the port will remain powered to receive remote
+		wakeup events.  Writing '0' to this file enables
+		poweroff.  Default value is controlled by child device
+		driver.
+
+		NOTE: Take care to have an alternate means of waking the
+		system when disabling a wakeup source, or be sure that
+		the system will not transition to a sleep state.
+
+	<child>/power/persist:
+		This defaults to '1' for most devices and indicates if
+		kernel can persist the device's configuration across a
+		power session loss (suspend / port-power event).  When
+		this value is '0' (quirky devices), port poweroff is
+		disabled.
+
+Summary of poweroff pre-requisite settings:
+
+	echo 0 > power/pm_qos_no_power_off
+	echo auto > power/control
+	echo hardwired > connect_type
+	echo auto > <child>/power/control
+	echo 0 > <child>/power/wakeup
+	echo 1 > <child>/power/persist
+
+	Suggested Userspace Port Power Policy
+	-------------------------------------
+
+As noted above userspace needs to be careful and deliberate about what
+ports are enabled for poweroff.
+
+The default configuration is that all ports start with
+power/pm_qos_no_power_off set to '1' causing no port power management to
+occur.
+
+Given good confidence in the platform firmware (ACPI _PLD record for the
+USB ports) userspace can blindly set all occurrences of
+portX/power/pm_qos_no_power_off to '0'.  Then port power management will
+only be enabled for those ports that firmware has marked as 'hardwired'.
+
+A more aggressive userspace policy would be to enable USB port power off
+for all ports (set portX/power/pm_qos_no_power_off to '0' and
+set portX/connect_type to 'hardwired') when some external factor indicates
+the user has stopped interacting with the system.  For example, a distro
+may want to enable power off all USB ports when the screen blanks, and
+re-power them when the screen becomes active.  Smart phones and tablets
+may want to power off USB ports when the user pushes the power button.

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux