Merge b5f7ab6b1c
("Merge tag 'fs-dedupe-last-block-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux") into android-mainline
Baby steps in the 5.6-rc1 merge cycle to make things easier to review and debug. Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I005e68433be6b1d66bd56d7e1c8f44ab8e78bebe
This commit is contained in:
6
.mailmap
6
.mailmap
@@ -74,6 +74,7 @@ Dmitry Safonov <0x7f454c46@gmail.com> <dima@arista.com>
|
|||||||
Domen Puncer <domen@coderock.org>
|
Domen Puncer <domen@coderock.org>
|
||||||
Douglas Gilbert <dougg@torque.net>
|
Douglas Gilbert <dougg@torque.net>
|
||||||
Ed L. Cashin <ecashin@coraid.com>
|
Ed L. Cashin <ecashin@coraid.com>
|
||||||
|
Erik Kaneda <erik.kaneda@intel.com> <erik.schmauss@intel.com>
|
||||||
Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||||
Felipe W Damasio <felipewd@terra.com.br>
|
Felipe W Damasio <felipewd@terra.com.br>
|
||||||
Felix Kuhling <fxkuehl@gmx.de>
|
Felix Kuhling <fxkuehl@gmx.de>
|
||||||
@@ -209,6 +210,10 @@ Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
|
|||||||
Patrick Mochel <mochel@digitalimplant.org>
|
Patrick Mochel <mochel@digitalimplant.org>
|
||||||
Paul Burton <paulburton@kernel.org> <paul.burton@imgtec.com>
|
Paul Burton <paulburton@kernel.org> <paul.burton@imgtec.com>
|
||||||
Paul Burton <paulburton@kernel.org> <paul.burton@mips.com>
|
Paul Burton <paulburton@kernel.org> <paul.burton@mips.com>
|
||||||
|
Paul E. McKenney <paulmck@kernel.org> <paulmck@linux.ibm.com>
|
||||||
|
Paul E. McKenney <paulmck@kernel.org> <paulmck@linux.vnet.ibm.com>
|
||||||
|
Paul E. McKenney <paulmck@kernel.org> <paul.mckenney@linaro.org>
|
||||||
|
Paul E. McKenney <paulmck@kernel.org> <paulmck@us.ibm.com>
|
||||||
Peter A Jonsson <pj@ludd.ltu.se>
|
Peter A Jonsson <pj@ludd.ltu.se>
|
||||||
Peter Oruba <peter@oruba.de>
|
Peter Oruba <peter@oruba.de>
|
||||||
Peter Oruba <peter.oruba@amd.com>
|
Peter Oruba <peter.oruba@amd.com>
|
||||||
@@ -217,6 +222,7 @@ Praveen BP <praveenbp@ti.com>
|
|||||||
Punit Agrawal <punitagrawal@gmail.com> <punit.agrawal@arm.com>
|
Punit Agrawal <punitagrawal@gmail.com> <punit.agrawal@arm.com>
|
||||||
Qais Yousef <qsyousef@gmail.com> <qais.yousef@imgtec.com>
|
Qais Yousef <qsyousef@gmail.com> <qais.yousef@imgtec.com>
|
||||||
Quentin Perret <qperret@qperret.net> <quentin.perret@arm.com>
|
Quentin Perret <qperret@qperret.net> <quentin.perret@arm.com>
|
||||||
|
Rafael J. Wysocki <rjw@rjwysocki.net> <rjw@sisk.pl>
|
||||||
Rajesh Shah <rajesh.shah@intel.com>
|
Rajesh Shah <rajesh.shah@intel.com>
|
||||||
Ralf Baechle <ralf@linux-mips.org>
|
Ralf Baechle <ralf@linux-mips.org>
|
||||||
Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
||||||
|
26
Documentation/ABI/obsolete/sysfs-selinux-disable
Normal file
26
Documentation/ABI/obsolete/sysfs-selinux-disable
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
What: /sys/fs/selinux/disable
|
||||||
|
Date: April 2005 (predates git)
|
||||||
|
KernelVersion: 2.6.12-rc2 (predates git)
|
||||||
|
Contact: selinux@vger.kernel.org
|
||||||
|
Description:
|
||||||
|
|
||||||
|
The selinuxfs "disable" node allows SELinux to be disabled at runtime
|
||||||
|
prior to a policy being loaded into the kernel. If disabled via this
|
||||||
|
mechanism, SELinux will remain disabled until the system is rebooted.
|
||||||
|
|
||||||
|
The preferred method of disabling SELinux is via the "selinux=0" boot
|
||||||
|
parameter, but the selinuxfs "disable" node was created to make it
|
||||||
|
easier for systems with primitive bootloaders that did not allow for
|
||||||
|
easy modification of the kernel command line. Unfortunately, allowing
|
||||||
|
for SELinux to be disabled at runtime makes it difficult to secure the
|
||||||
|
kernel's LSM hooks using the "__ro_after_init" feature.
|
||||||
|
|
||||||
|
Thankfully, the need for the SELinux runtime disable appears to be
|
||||||
|
gone, the default Kconfig configuration disables this selinuxfs node,
|
||||||
|
and only one of the major distributions, Fedora, supports disabling
|
||||||
|
SELinux at runtime. Fedora is in the process of removing the
|
||||||
|
selinuxfs "disable" node and once that is complete we will start the
|
||||||
|
slow process of removing this code from the kernel.
|
||||||
|
|
||||||
|
More information on /sys/fs/selinux/disable can be found under the
|
||||||
|
CONFIG_SECURITY_SELINUX_DISABLE Kconfig option.
|
@@ -1,7 +1,7 @@
|
|||||||
What: /sys/class/tpm/tpmX/device/
|
What: /sys/class/tpm/tpmX/device/
|
||||||
Date: April 2005
|
Date: April 2005
|
||||||
KernelVersion: 2.6.12
|
KernelVersion: 2.6.12
|
||||||
Contact: tpmdd-devel@lists.sf.net
|
Contact: linux-integrity@vger.kernel.org
|
||||||
Description: The device/ directory under a specific TPM instance exposes
|
Description: The device/ directory under a specific TPM instance exposes
|
||||||
the properties of that TPM chip
|
the properties of that TPM chip
|
||||||
|
|
||||||
@@ -9,7 +9,7 @@ Description: The device/ directory under a specific TPM instance exposes
|
|||||||
What: /sys/class/tpm/tpmX/device/active
|
What: /sys/class/tpm/tpmX/device/active
|
||||||
Date: April 2006
|
Date: April 2006
|
||||||
KernelVersion: 2.6.17
|
KernelVersion: 2.6.17
|
||||||
Contact: tpmdd-devel@lists.sf.net
|
Contact: linux-integrity@vger.kernel.org
|
||||||
Description: The "active" property prints a '1' if the TPM chip is accepting
|
Description: The "active" property prints a '1' if the TPM chip is accepting
|
||||||
commands. An inactive TPM chip still contains all the state of
|
commands. An inactive TPM chip still contains all the state of
|
||||||
an active chip (Storage Root Key, NVRAM, etc), and can be
|
an active chip (Storage Root Key, NVRAM, etc), and can be
|
||||||
@@ -21,7 +21,7 @@ Description: The "active" property prints a '1' if the TPM chip is accepting
|
|||||||
What: /sys/class/tpm/tpmX/device/cancel
|
What: /sys/class/tpm/tpmX/device/cancel
|
||||||
Date: June 2005
|
Date: June 2005
|
||||||
KernelVersion: 2.6.13
|
KernelVersion: 2.6.13
|
||||||
Contact: tpmdd-devel@lists.sf.net
|
Contact: linux-integrity@vger.kernel.org
|
||||||
Description: The "cancel" property allows you to cancel the currently
|
Description: The "cancel" property allows you to cancel the currently
|
||||||
pending TPM command. Writing any value to cancel will call the
|
pending TPM command. Writing any value to cancel will call the
|
||||||
TPM vendor specific cancel operation.
|
TPM vendor specific cancel operation.
|
||||||
@@ -29,7 +29,7 @@ Description: The "cancel" property allows you to cancel the currently
|
|||||||
What: /sys/class/tpm/tpmX/device/caps
|
What: /sys/class/tpm/tpmX/device/caps
|
||||||
Date: April 2005
|
Date: April 2005
|
||||||
KernelVersion: 2.6.12
|
KernelVersion: 2.6.12
|
||||||
Contact: tpmdd-devel@lists.sf.net
|
Contact: linux-integrity@vger.kernel.org
|
||||||
Description: The "caps" property contains TPM manufacturer and version info.
|
Description: The "caps" property contains TPM manufacturer and version info.
|
||||||
|
|
||||||
Example output:
|
Example output:
|
||||||
@@ -46,7 +46,7 @@ Description: The "caps" property contains TPM manufacturer and version info.
|
|||||||
What: /sys/class/tpm/tpmX/device/durations
|
What: /sys/class/tpm/tpmX/device/durations
|
||||||
Date: March 2011
|
Date: March 2011
|
||||||
KernelVersion: 3.1
|
KernelVersion: 3.1
|
||||||
Contact: tpmdd-devel@lists.sf.net
|
Contact: linux-integrity@vger.kernel.org
|
||||||
Description: The "durations" property shows the 3 vendor-specific values
|
Description: The "durations" property shows the 3 vendor-specific values
|
||||||
used to wait for a short, medium and long TPM command. All
|
used to wait for a short, medium and long TPM command. All
|
||||||
TPM commands are categorized as short, medium or long in
|
TPM commands are categorized as short, medium or long in
|
||||||
@@ -69,7 +69,7 @@ Description: The "durations" property shows the 3 vendor-specific values
|
|||||||
What: /sys/class/tpm/tpmX/device/enabled
|
What: /sys/class/tpm/tpmX/device/enabled
|
||||||
Date: April 2006
|
Date: April 2006
|
||||||
KernelVersion: 2.6.17
|
KernelVersion: 2.6.17
|
||||||
Contact: tpmdd-devel@lists.sf.net
|
Contact: linux-integrity@vger.kernel.org
|
||||||
Description: The "enabled" property prints a '1' if the TPM chip is enabled,
|
Description: The "enabled" property prints a '1' if the TPM chip is enabled,
|
||||||
meaning that it should be visible to the OS. This property
|
meaning that it should be visible to the OS. This property
|
||||||
may be visible but produce a '0' after some operation that
|
may be visible but produce a '0' after some operation that
|
||||||
@@ -78,7 +78,7 @@ Description: The "enabled" property prints a '1' if the TPM chip is enabled,
|
|||||||
What: /sys/class/tpm/tpmX/device/owned
|
What: /sys/class/tpm/tpmX/device/owned
|
||||||
Date: April 2006
|
Date: April 2006
|
||||||
KernelVersion: 2.6.17
|
KernelVersion: 2.6.17
|
||||||
Contact: tpmdd-devel@lists.sf.net
|
Contact: linux-integrity@vger.kernel.org
|
||||||
Description: The "owned" property produces a '1' if the TPM_TakeOwnership
|
Description: The "owned" property produces a '1' if the TPM_TakeOwnership
|
||||||
ordinal has been executed successfully in the chip. A '0'
|
ordinal has been executed successfully in the chip. A '0'
|
||||||
indicates that ownership hasn't been taken.
|
indicates that ownership hasn't been taken.
|
||||||
@@ -86,7 +86,7 @@ Description: The "owned" property produces a '1' if the TPM_TakeOwnership
|
|||||||
What: /sys/class/tpm/tpmX/device/pcrs
|
What: /sys/class/tpm/tpmX/device/pcrs
|
||||||
Date: April 2005
|
Date: April 2005
|
||||||
KernelVersion: 2.6.12
|
KernelVersion: 2.6.12
|
||||||
Contact: tpmdd-devel@lists.sf.net
|
Contact: linux-integrity@vger.kernel.org
|
||||||
Description: The "pcrs" property will dump the current value of all Platform
|
Description: The "pcrs" property will dump the current value of all Platform
|
||||||
Configuration Registers in the TPM. Note that since these
|
Configuration Registers in the TPM. Note that since these
|
||||||
values may be constantly changing, the output is only valid
|
values may be constantly changing, the output is only valid
|
||||||
@@ -109,7 +109,7 @@ Description: The "pcrs" property will dump the current value of all Platform
|
|||||||
What: /sys/class/tpm/tpmX/device/pubek
|
What: /sys/class/tpm/tpmX/device/pubek
|
||||||
Date: April 2005
|
Date: April 2005
|
||||||
KernelVersion: 2.6.12
|
KernelVersion: 2.6.12
|
||||||
Contact: tpmdd-devel@lists.sf.net
|
Contact: linux-integrity@vger.kernel.org
|
||||||
Description: The "pubek" property will return the TPM's public endorsement
|
Description: The "pubek" property will return the TPM's public endorsement
|
||||||
key if possible. If the TPM has had ownership established and
|
key if possible. If the TPM has had ownership established and
|
||||||
is version 1.2, the pubek will not be available without the
|
is version 1.2, the pubek will not be available without the
|
||||||
@@ -161,7 +161,7 @@ Description: The "pubek" property will return the TPM's public endorsement
|
|||||||
What: /sys/class/tpm/tpmX/device/temp_deactivated
|
What: /sys/class/tpm/tpmX/device/temp_deactivated
|
||||||
Date: April 2006
|
Date: April 2006
|
||||||
KernelVersion: 2.6.17
|
KernelVersion: 2.6.17
|
||||||
Contact: tpmdd-devel@lists.sf.net
|
Contact: linux-integrity@vger.kernel.org
|
||||||
Description: The "temp_deactivated" property returns a '1' if the chip has
|
Description: The "temp_deactivated" property returns a '1' if the chip has
|
||||||
been temporarily deactivated, usually until the next power
|
been temporarily deactivated, usually until the next power
|
||||||
cycle. Whether a warm boot (reboot) will clear a TPM chip
|
cycle. Whether a warm boot (reboot) will clear a TPM chip
|
||||||
@@ -170,7 +170,7 @@ Description: The "temp_deactivated" property returns a '1' if the chip has
|
|||||||
What: /sys/class/tpm/tpmX/device/timeouts
|
What: /sys/class/tpm/tpmX/device/timeouts
|
||||||
Date: March 2011
|
Date: March 2011
|
||||||
KernelVersion: 3.1
|
KernelVersion: 3.1
|
||||||
Contact: tpmdd-devel@lists.sf.net
|
Contact: linux-integrity@vger.kernel.org
|
||||||
Description: The "timeouts" property shows the 4 vendor-specific values
|
Description: The "timeouts" property shows the 4 vendor-specific values
|
||||||
for the TPM's interface spec timeouts. The use of these
|
for the TPM's interface spec timeouts. The use of these
|
||||||
timeouts is defined by the TPM interface spec that the chip
|
timeouts is defined by the TPM interface spec that the chip
|
||||||
@@ -183,3 +183,14 @@ Description: The "timeouts" property shows the 4 vendor-specific values
|
|||||||
The four timeout values are shown in usecs, with a trailing
|
The four timeout values are shown in usecs, with a trailing
|
||||||
"[original]" or "[adjusted]" depending on whether the values
|
"[original]" or "[adjusted]" depending on whether the values
|
||||||
were scaled by the driver to be reported in usec from msecs.
|
were scaled by the driver to be reported in usec from msecs.
|
||||||
|
|
||||||
|
What: /sys/class/tpm/tpmX/tpm_version_major
|
||||||
|
Date: October 2019
|
||||||
|
KernelVersion: 5.5
|
||||||
|
Contact: linux-integrity@vger.kernel.org
|
||||||
|
Description: The "tpm_version_major" property shows the TCG spec major version
|
||||||
|
implemented by the TPM device.
|
||||||
|
|
||||||
|
Example output:
|
||||||
|
|
||||||
|
2
|
||||||
|
171
Documentation/ABI/stable/sysfs-driver-dma-idxd
Normal file
171
Documentation/ABI/stable/sysfs-driver-dma-idxd
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
What: sys/bus/dsa/devices/dsa<m>/cdev_major
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The major number that the character device driver assigned to
|
||||||
|
this device.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/errors
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The error information for this device.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/max_batch_size
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The largest number of work descriptors in a batch.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/max_work_queues_size
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The maximum work queue size supported by this device.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/max_engines
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The maximum number of engines supported by this device.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/max_groups
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The maximum number of groups can be created under this device.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/max_tokens
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The total number of bandwidth tokens supported by this device.
|
||||||
|
The bandwidth tokens represent resources within the DSA
|
||||||
|
implementation, and these resources are allocated by engines to
|
||||||
|
support operations.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/max_transfer_size
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The number of bytes to be read from the source address to
|
||||||
|
perform the operation. The maximum transfer size is dependent on
|
||||||
|
the workqueue the descriptor was submitted to.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/max_work_queues
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The maximum work queue number that this device supports.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/numa_node
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The numa node number for this device.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/op_cap
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The operation capability bit mask specify the operation types
|
||||||
|
supported by the this device.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/state
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The state information of this device. It can be either enabled
|
||||||
|
or disabled.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/group<m>.<n>
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The assigned group under this device.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/engine<m>.<n>
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The assigned engine under this device.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/wq<m>.<n>
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The assigned work queue under this device.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/configurable
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: To indicate if this device is configurable or not.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/dsa<m>/token_limit
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The maximum number of bandwidth tokens that may be in use at
|
||||||
|
one time by operations that access low bandwidth memory in the
|
||||||
|
device.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/wq<m>.<n>/group_id
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The group id that this work queue belongs to.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/wq<m>.<n>/size
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The work queue size for this work queue.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/wq<m>.<n>/type
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The type of this work queue, it can be "kernel" type for work
|
||||||
|
queue usages in the kernel space or "user" type for work queue
|
||||||
|
usages by applications in user space.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/wq<m>.<n>/cdev_minor
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The minor number assigned to this work queue by the character
|
||||||
|
device driver.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/wq<m>.<n>/mode
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The work queue mode type for this work queue.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/wq<m>.<n>/priority
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The priority value of this work queue, it is a vlue relative to
|
||||||
|
other work queue in the same group to control quality of service
|
||||||
|
for dispatching work from multiple workqueues in the same group.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/wq<m>.<n>/state
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The current state of the work queue.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/wq<m>.<n>/threshold
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The number of entries in this work queue that may be filled
|
||||||
|
via a limited portal.
|
||||||
|
|
||||||
|
What: sys/bus/dsa/devices/engine<m>.<n>/group_id
|
||||||
|
Date: Oct 25, 2019
|
||||||
|
KernelVersion: 5.6.0
|
||||||
|
Contact: dmaengine@vger.kernel.org
|
||||||
|
Description: The group that this engine belongs to.
|
@@ -1,5 +1,4 @@
|
|||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/asic_health
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/asic_health
|
||||||
|
|
||||||
Date: June 2018
|
Date: June 2018
|
||||||
KernelVersion: 4.19
|
KernelVersion: 4.19
|
||||||
Contact: Vadim Pasternak <vadimpmellanox.com>
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||||
@@ -19,7 +18,6 @@ Description: These files show with which CPLD versions have been burned
|
|||||||
The files are read only.
|
The files are read only.
|
||||||
|
|
||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/fan_dir
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/fan_dir
|
||||||
|
|
||||||
Date: December 2018
|
Date: December 2018
|
||||||
KernelVersion: 5.0
|
KernelVersion: 5.0
|
||||||
Contact: Vadim Pasternak <vadimpmellanox.com>
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||||
@@ -30,7 +28,6 @@ Description: This file shows the system fans direction:
|
|||||||
The files are read only.
|
The files are read only.
|
||||||
|
|
||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/cpld3_version
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/cpld3_version
|
||||||
|
|
||||||
Date: November 2018
|
Date: November 2018
|
||||||
KernelVersion: 5.0
|
KernelVersion: 5.0
|
||||||
Contact: Vadim Pasternak <vadimpmellanox.com>
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||||
@@ -40,7 +37,6 @@ Description: These files show with which CPLD versions have been burned
|
|||||||
The files are read only.
|
The files are read only.
|
||||||
|
|
||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/jtag_enable
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/jtag_enable
|
||||||
|
|
||||||
Date: November 2018
|
Date: November 2018
|
||||||
KernelVersion: 5.0
|
KernelVersion: 5.0
|
||||||
Contact: Vadim Pasternak <vadimpmellanox.com>
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||||
@@ -108,7 +104,6 @@ What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_comex_pwr_fail
|
|||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_from_comex
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_from_comex
|
||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_system
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_system
|
||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_voltmon_upgrade_fail
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_voltmon_upgrade_fail
|
||||||
|
|
||||||
Date: November 2018
|
Date: November 2018
|
||||||
KernelVersion: 5.0
|
KernelVersion: 5.0
|
||||||
Contact: Vadim Pasternak <vadimpmellanox.com>
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||||
@@ -130,6 +125,12 @@ Description: These files show with which CPLD versions have been burned
|
|||||||
|
|
||||||
The files are read only.
|
The files are read only.
|
||||||
|
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_comex_thermal
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_comex_wd
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_from_asic
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_reload_bios
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_sff_wd
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_swb_wd
|
||||||
Date: June 2019
|
Date: June 2019
|
||||||
KernelVersion: 5.3
|
KernelVersion: 5.3
|
||||||
Contact: Vadim Pasternak <vadimpmellanox.com>
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||||
@@ -143,9 +144,65 @@ Description: These files show the system reset cause, as following:
|
|||||||
|
|
||||||
The files are read only.
|
The files are read only.
|
||||||
|
|
||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_comex_thermal
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/config1
|
||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_comex_wd
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/config2
|
||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_from_asic
|
Date: January 2020
|
||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_reload_bios
|
KernelVersion: 5.6
|
||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_sff_wd
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_swb_wd
|
Description: These files show system static topology identification
|
||||||
|
like system's static I2C topology, number and type of FPGA
|
||||||
|
devices within the system and so on.
|
||||||
|
|
||||||
|
The files are read only.
|
||||||
|
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_ac_pwr_fail
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_platform
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_soc
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_sw_pwr_off
|
||||||
|
Date: January 2020
|
||||||
|
KernelVersion: 5.6
|
||||||
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||||
|
Description: These files show the system reset causes, as following: reset
|
||||||
|
due to AC power failure, reset invoked from software by
|
||||||
|
assertion reset signal through CPLD. reset caused by signal
|
||||||
|
asserted by SOC through ACPI register, reset invoked from
|
||||||
|
software by assertion power off signal through CPLD.
|
||||||
|
|
||||||
|
The files are read only.
|
||||||
|
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/pcie_asic_reset_dis
|
||||||
|
Date: January 2020
|
||||||
|
KernelVersion: 5.6
|
||||||
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||||
|
Description: This file allows to retain ASIC up during PCIe root complex
|
||||||
|
reset, when attribute is set 1.
|
||||||
|
|
||||||
|
The file is read/write.
|
||||||
|
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/vpd_wp
|
||||||
|
Date: January 2020
|
||||||
|
KernelVersion: 5.6
|
||||||
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||||
|
Description: This file allows to overwrite system VPD hardware wrtie
|
||||||
|
protection when attribute is set 1.
|
||||||
|
|
||||||
|
The file is read/write.
|
||||||
|
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/voltreg_update_status
|
||||||
|
Date: January 2020
|
||||||
|
KernelVersion: 5.6
|
||||||
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||||
|
Description: This file exposes the configuration update status of burnable
|
||||||
|
voltage regulator devices. The status values are as following:
|
||||||
|
0 - OK; 1 - CRC failure; 2 = I2C failure; 3 - in progress.
|
||||||
|
|
||||||
|
The file is read only.
|
||||||
|
|
||||||
|
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/ufm_version
|
||||||
|
Date: January 2020
|
||||||
|
KernelVersion: 5.6
|
||||||
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||||
|
Description: This file exposes the firmware version of burnable voltage
|
||||||
|
regulator devices.
|
||||||
|
|
||||||
|
The file is read only.
|
||||||
|
@@ -7,6 +7,13 @@ Description:
|
|||||||
The name of devfreq object denoted as ... is same as the
|
The name of devfreq object denoted as ... is same as the
|
||||||
name of device using devfreq.
|
name of device using devfreq.
|
||||||
|
|
||||||
|
What: /sys/class/devfreq/.../name
|
||||||
|
Date: November 2019
|
||||||
|
Contact: Chanwoo Choi <cw00.choi@samsung.com>
|
||||||
|
Description:
|
||||||
|
The /sys/class/devfreq/.../name shows the name of device
|
||||||
|
of the corresponding devfreq object.
|
||||||
|
|
||||||
What: /sys/class/devfreq/.../governor
|
What: /sys/class/devfreq/.../governor
|
||||||
Date: September 2011
|
Date: September 2011
|
||||||
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||||
@@ -48,12 +55,15 @@ What: /sys/class/devfreq/.../trans_stat
|
|||||||
Date: October 2012
|
Date: October 2012
|
||||||
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||||
Description:
|
Description:
|
||||||
This ABI shows the statistics of devfreq behavior on a
|
This ABI shows or clears the statistics of devfreq behavior
|
||||||
specific device. It shows the time spent in each state and
|
on a specific device. It shows the time spent in each state
|
||||||
the number of transitions between states.
|
and the number of transitions between states.
|
||||||
In order to activate this ABI, the devfreq target device
|
In order to activate this ABI, the devfreq target device
|
||||||
driver should provide the list of available frequencies
|
driver should provide the list of available frequencies
|
||||||
with its profile.
|
with its profile. If need to reset the statistics of devfreq
|
||||||
|
behavior on a specific device, enter 0(zero) to 'trans_stat'
|
||||||
|
as following:
|
||||||
|
echo 0 > /sys/class/devfreq/.../trans_stat
|
||||||
|
|
||||||
What: /sys/class/devfreq/.../userspace/set_freq
|
What: /sys/class/devfreq/.../userspace/set_freq
|
||||||
Date: September 2011
|
Date: September 2011
|
||||||
|
@@ -196,6 +196,12 @@ Description:
|
|||||||
does not reflect it. Likewise, if one enables a deep state but a
|
does not reflect it. Likewise, if one enables a deep state but a
|
||||||
lighter state still is disabled, then this has no effect.
|
lighter state still is disabled, then this has no effect.
|
||||||
|
|
||||||
|
What: /sys/devices/system/cpu/cpuX/cpuidle/stateN/default_status
|
||||||
|
Date: December 2019
|
||||||
|
KernelVersion: v5.6
|
||||||
|
Contact: Linux power management list <linux-pm@vger.kernel.org>
|
||||||
|
Description:
|
||||||
|
(RO) The default status of this state, "enabled" or "disabled".
|
||||||
|
|
||||||
What: /sys/devices/system/cpu/cpuX/cpuidle/stateN/residency
|
What: /sys/devices/system/cpu/cpuX/cpuidle/stateN/residency
|
||||||
Date: March 2014
|
Date: March 2014
|
||||||
|
@@ -46,3 +46,13 @@ Description:
|
|||||||
* 0 - normal,
|
* 0 - normal,
|
||||||
* 1 - overboost,
|
* 1 - overboost,
|
||||||
* 2 - silent
|
* 2 - silent
|
||||||
|
|
||||||
|
What: /sys/devices/platform/<platform>/throttle_thermal_policy
|
||||||
|
Date: Dec 2019
|
||||||
|
KernelVersion: 5.6
|
||||||
|
Contact: "Leonid Maksymchuk" <leonmaxx@gmail.com>
|
||||||
|
Description:
|
||||||
|
Throttle thermal policy mode:
|
||||||
|
* 0 - default,
|
||||||
|
* 1 - overboost,
|
||||||
|
* 2 - silent
|
||||||
|
@@ -407,3 +407,16 @@ Contact: Kalesh Singh <kaleshsingh96@gmail.com>
|
|||||||
Description:
|
Description:
|
||||||
The /sys/power/suspend_stats/last_failed_step file contains
|
The /sys/power/suspend_stats/last_failed_step file contains
|
||||||
the last failed step in the suspend/resume path.
|
the last failed step in the suspend/resume path.
|
||||||
|
|
||||||
|
What: /sys/power/sync_on_suspend
|
||||||
|
Date: October 2019
|
||||||
|
Contact: Jonas Meurer <jonas@freesources.org>
|
||||||
|
Description:
|
||||||
|
This file controls whether or not the kernel will sync()
|
||||||
|
filesystems during system suspend (after freezing user space
|
||||||
|
and before suspending devices).
|
||||||
|
|
||||||
|
Writing a "1" to this file enables the sync() and writing a "0"
|
||||||
|
disables it. Reads from the file return the current value.
|
||||||
|
The default is "1" if the build-time "SUSPEND_SKIP_SYNC" config
|
||||||
|
flag is unset, or "0" otherwise.
|
||||||
|
@@ -1,4 +1,7 @@
|
|||||||
|
.. _NMI_rcu_doc:
|
||||||
|
|
||||||
Using RCU to Protect Dynamic NMI Handlers
|
Using RCU to Protect Dynamic NMI Handlers
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
|
||||||
Although RCU is usually used to protect read-mostly data structures,
|
Although RCU is usually used to protect read-mostly data structures,
|
||||||
@@ -9,7 +12,7 @@ work in "arch/x86/oprofile/nmi_timer_int.c" and in
|
|||||||
"arch/x86/kernel/traps.c".
|
"arch/x86/kernel/traps.c".
|
||||||
|
|
||||||
The relevant pieces of code are listed below, each followed by a
|
The relevant pieces of code are listed below, each followed by a
|
||||||
brief explanation.
|
brief explanation::
|
||||||
|
|
||||||
static int dummy_nmi_callback(struct pt_regs *regs, int cpu)
|
static int dummy_nmi_callback(struct pt_regs *regs, int cpu)
|
||||||
{
|
{
|
||||||
@@ -18,12 +21,12 @@ brief explanation.
|
|||||||
|
|
||||||
The dummy_nmi_callback() function is a "dummy" NMI handler that does
|
The dummy_nmi_callback() function is a "dummy" NMI handler that does
|
||||||
nothing, but returns zero, thus saying that it did nothing, allowing
|
nothing, but returns zero, thus saying that it did nothing, allowing
|
||||||
the NMI handler to take the default machine-specific action.
|
the NMI handler to take the default machine-specific action::
|
||||||
|
|
||||||
static nmi_callback_t nmi_callback = dummy_nmi_callback;
|
static nmi_callback_t nmi_callback = dummy_nmi_callback;
|
||||||
|
|
||||||
This nmi_callback variable is a global function pointer to the current
|
This nmi_callback variable is a global function pointer to the current
|
||||||
NMI handler.
|
NMI handler::
|
||||||
|
|
||||||
void do_nmi(struct pt_regs * regs, long error_code)
|
void do_nmi(struct pt_regs * regs, long error_code)
|
||||||
{
|
{
|
||||||
@@ -53,11 +56,12 @@ anyway. However, in practice it is a good documentation aid, particularly
|
|||||||
for anyone attempting to do something similar on Alpha or on systems
|
for anyone attempting to do something similar on Alpha or on systems
|
||||||
with aggressive optimizing compilers.
|
with aggressive optimizing compilers.
|
||||||
|
|
||||||
Quick Quiz: Why might the rcu_dereference_sched() be necessary on Alpha,
|
Quick Quiz:
|
||||||
given that the code referenced by the pointer is read-only?
|
Why might the rcu_dereference_sched() be necessary on Alpha, given that the code referenced by the pointer is read-only?
|
||||||
|
|
||||||
|
:ref:`Answer to Quick Quiz <answer_quick_quiz_NMI>`
|
||||||
|
|
||||||
Back to the discussion of NMI and RCU...
|
Back to the discussion of NMI and RCU::
|
||||||
|
|
||||||
void set_nmi_callback(nmi_callback_t callback)
|
void set_nmi_callback(nmi_callback_t callback)
|
||||||
{
|
{
|
||||||
@@ -68,7 +72,7 @@ The set_nmi_callback() function registers an NMI handler. Note that any
|
|||||||
data that is to be used by the callback must be initialized up -before-
|
data that is to be used by the callback must be initialized up -before-
|
||||||
the call to set_nmi_callback(). On architectures that do not order
|
the call to set_nmi_callback(). On architectures that do not order
|
||||||
writes, the rcu_assign_pointer() ensures that the NMI handler sees the
|
writes, the rcu_assign_pointer() ensures that the NMI handler sees the
|
||||||
initialized values.
|
initialized values::
|
||||||
|
|
||||||
void unset_nmi_callback(void)
|
void unset_nmi_callback(void)
|
||||||
{
|
{
|
||||||
@@ -82,7 +86,7 @@ up any data structures used by the old NMI handler until execution
|
|||||||
of it completes on all other CPUs.
|
of it completes on all other CPUs.
|
||||||
|
|
||||||
One way to accomplish this is via synchronize_rcu(), perhaps as
|
One way to accomplish this is via synchronize_rcu(), perhaps as
|
||||||
follows:
|
follows::
|
||||||
|
|
||||||
unset_nmi_callback();
|
unset_nmi_callback();
|
||||||
synchronize_rcu();
|
synchronize_rcu();
|
||||||
@@ -98,24 +102,23 @@ to free up the handler's data as soon as synchronize_rcu() returns.
|
|||||||
Important note: for this to work, the architecture in question must
|
Important note: for this to work, the architecture in question must
|
||||||
invoke nmi_enter() and nmi_exit() on NMI entry and exit, respectively.
|
invoke nmi_enter() and nmi_exit() on NMI entry and exit, respectively.
|
||||||
|
|
||||||
|
.. _answer_quick_quiz_NMI:
|
||||||
|
|
||||||
Answer to Quick Quiz
|
Answer to Quick Quiz:
|
||||||
|
Why might the rcu_dereference_sched() be necessary on Alpha, given that the code referenced by the pointer is read-only?
|
||||||
|
|
||||||
Why might the rcu_dereference_sched() be necessary on Alpha, given
|
The caller to set_nmi_callback() might well have
|
||||||
that the code referenced by the pointer is read-only?
|
initialized some data that is to be used by the new NMI
|
||||||
|
handler. In this case, the rcu_dereference_sched() would
|
||||||
|
be needed, because otherwise a CPU that received an NMI
|
||||||
|
just after the new handler was set might see the pointer
|
||||||
|
to the new NMI handler, but the old pre-initialized
|
||||||
|
version of the handler's data.
|
||||||
|
|
||||||
Answer: The caller to set_nmi_callback() might well have
|
This same sad story can happen on other CPUs when using
|
||||||
initialized some data that is to be used by the new NMI
|
a compiler with aggressive pointer-value speculation
|
||||||
handler. In this case, the rcu_dereference_sched() would
|
optimizations.
|
||||||
be needed, because otherwise a CPU that received an NMI
|
|
||||||
just after the new handler was set might see the pointer
|
|
||||||
to the new NMI handler, but the old pre-initialized
|
|
||||||
version of the handler's data.
|
|
||||||
|
|
||||||
This same sad story can happen on other CPUs when using
|
More important, the rcu_dereference_sched() makes it
|
||||||
a compiler with aggressive pointer-value speculation
|
clear to someone reading the code that the pointer is
|
||||||
optimizations.
|
being protected by RCU-sched.
|
||||||
|
|
||||||
More important, the rcu_dereference_sched() makes it
|
|
||||||
clear to someone reading the code that the pointer is
|
|
||||||
being protected by RCU-sched.
|
|
@@ -1,19 +1,21 @@
|
|||||||
Using RCU to Protect Read-Mostly Arrays
|
.. _array_rcu_doc:
|
||||||
|
|
||||||
|
Using RCU to Protect Read-Mostly Arrays
|
||||||
|
=======================================
|
||||||
|
|
||||||
Although RCU is more commonly used to protect linked lists, it can
|
Although RCU is more commonly used to protect linked lists, it can
|
||||||
also be used to protect arrays. Three situations are as follows:
|
also be used to protect arrays. Three situations are as follows:
|
||||||
|
|
||||||
1. Hash Tables
|
1. :ref:`Hash Tables <hash_tables>`
|
||||||
|
|
||||||
2. Static Arrays
|
2. :ref:`Static Arrays <static_arrays>`
|
||||||
|
|
||||||
3. Resizeable Arrays
|
3. :ref:`Resizable Arrays <resizable_arrays>`
|
||||||
|
|
||||||
Each of these three situations involves an RCU-protected pointer to an
|
Each of these three situations involves an RCU-protected pointer to an
|
||||||
array that is separately indexed. It might be tempting to consider use
|
array that is separately indexed. It might be tempting to consider use
|
||||||
of RCU to instead protect the index into an array, however, this use
|
of RCU to instead protect the index into an array, however, this use
|
||||||
case is -not- supported. The problem with RCU-protected indexes into
|
case is **not** supported. The problem with RCU-protected indexes into
|
||||||
arrays is that compilers can play way too many optimization games with
|
arrays is that compilers can play way too many optimization games with
|
||||||
integers, which means that the rules governing handling of these indexes
|
integers, which means that the rules governing handling of these indexes
|
||||||
are far more trouble than they are worth. If RCU-protected indexes into
|
are far more trouble than they are worth. If RCU-protected indexes into
|
||||||
@@ -24,16 +26,20 @@ to be safely used.
|
|||||||
That aside, each of the three RCU-protected pointer situations are
|
That aside, each of the three RCU-protected pointer situations are
|
||||||
described in the following sections.
|
described in the following sections.
|
||||||
|
|
||||||
|
.. _hash_tables:
|
||||||
|
|
||||||
Situation 1: Hash Tables
|
Situation 1: Hash Tables
|
||||||
|
------------------------
|
||||||
|
|
||||||
Hash tables are often implemented as an array, where each array entry
|
Hash tables are often implemented as an array, where each array entry
|
||||||
has a linked-list hash chain. Each hash chain can be protected by RCU
|
has a linked-list hash chain. Each hash chain can be protected by RCU
|
||||||
as described in the listRCU.txt document. This approach also applies
|
as described in the listRCU.txt document. This approach also applies
|
||||||
to other array-of-list situations, such as radix trees.
|
to other array-of-list situations, such as radix trees.
|
||||||
|
|
||||||
|
.. _static_arrays:
|
||||||
|
|
||||||
Situation 2: Static Arrays
|
Situation 2: Static Arrays
|
||||||
|
--------------------------
|
||||||
|
|
||||||
Static arrays, where the data (rather than a pointer to the data) is
|
Static arrays, where the data (rather than a pointer to the data) is
|
||||||
located in each array element, and where the array is never resized,
|
located in each array element, and where the array is never resized,
|
||||||
@@ -41,13 +47,17 @@ have not been used with RCU. Rik van Riel recommends using seqlock in
|
|||||||
this situation, which would also have minimal read-side overhead as long
|
this situation, which would also have minimal read-side overhead as long
|
||||||
as updates are rare.
|
as updates are rare.
|
||||||
|
|
||||||
Quick Quiz: Why is it so important that updates be rare when
|
Quick Quiz:
|
||||||
using seqlock?
|
Why is it so important that updates be rare when using seqlock?
|
||||||
|
|
||||||
|
:ref:`Answer to Quick Quiz <answer_quick_quiz_seqlock>`
|
||||||
|
|
||||||
Situation 3: Resizeable Arrays
|
.. _resizable_arrays:
|
||||||
|
|
||||||
Use of RCU for resizeable arrays is demonstrated by the grow_ary()
|
Situation 3: Resizable Arrays
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Use of RCU for resizable arrays is demonstrated by the grow_ary()
|
||||||
function formerly used by the System V IPC code. The array is used
|
function formerly used by the System V IPC code. The array is used
|
||||||
to map from semaphore, message-queue, and shared-memory IDs to the data
|
to map from semaphore, message-queue, and shared-memory IDs to the data
|
||||||
structure that represents the corresponding IPC construct. The grow_ary()
|
structure that represents the corresponding IPC construct. The grow_ary()
|
||||||
@@ -60,7 +70,7 @@ the remainder of the new, updates the ids->entries pointer to point to
|
|||||||
the new array, and invokes ipc_rcu_putref() to free up the old array.
|
the new array, and invokes ipc_rcu_putref() to free up the old array.
|
||||||
Note that rcu_assign_pointer() is used to update the ids->entries pointer,
|
Note that rcu_assign_pointer() is used to update the ids->entries pointer,
|
||||||
which includes any memory barriers required on whatever architecture
|
which includes any memory barriers required on whatever architecture
|
||||||
you are running on.
|
you are running on::
|
||||||
|
|
||||||
static int grow_ary(struct ipc_ids* ids, int newsize)
|
static int grow_ary(struct ipc_ids* ids, int newsize)
|
||||||
{
|
{
|
||||||
@@ -112,7 +122,7 @@ a simple check suffices. The pointer to the structure corresponding
|
|||||||
to the desired IPC object is placed in "out", with NULL indicating
|
to the desired IPC object is placed in "out", with NULL indicating
|
||||||
a non-existent entry. After acquiring "out->lock", the "out->deleted"
|
a non-existent entry. After acquiring "out->lock", the "out->deleted"
|
||||||
flag indicates whether the IPC object is in the process of being
|
flag indicates whether the IPC object is in the process of being
|
||||||
deleted, and, if not, the pointer is returned.
|
deleted, and, if not, the pointer is returned::
|
||||||
|
|
||||||
struct kern_ipc_perm* ipc_lock(struct ipc_ids* ids, int id)
|
struct kern_ipc_perm* ipc_lock(struct ipc_ids* ids, int id)
|
||||||
{
|
{
|
||||||
@@ -144,8 +154,10 @@ deleted, and, if not, the pointer is returned.
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.. _answer_quick_quiz_seqlock:
|
||||||
|
|
||||||
Answer to Quick Quiz:
|
Answer to Quick Quiz:
|
||||||
|
Why is it so important that updates be rare when using seqlock?
|
||||||
|
|
||||||
The reason that it is important that updates be rare when
|
The reason that it is important that updates be rare when
|
||||||
using seqlock is that frequent updates can livelock readers.
|
using seqlock is that frequent updates can livelock readers.
|
@@ -7,8 +7,13 @@ RCU concepts
|
|||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 3
|
:maxdepth: 3
|
||||||
|
|
||||||
|
arrayRCU
|
||||||
|
rcubarrier
|
||||||
|
rcu_dereference
|
||||||
|
whatisRCU
|
||||||
rcu
|
rcu
|
||||||
listRCU
|
listRCU
|
||||||
|
NMI-RCU
|
||||||
UP
|
UP
|
||||||
|
|
||||||
Design/Memory-Ordering/Tree-RCU-Memory-Ordering
|
Design/Memory-Ordering/Tree-RCU-Memory-Ordering
|
||||||
|
@@ -99,7 +99,7 @@ With this change, the rcu_dereference() is always within an RCU
|
|||||||
read-side critical section, which again would have suppressed the
|
read-side critical section, which again would have suppressed the
|
||||||
above lockdep-RCU splat.
|
above lockdep-RCU splat.
|
||||||
|
|
||||||
But in this particular case, we don't actually deference the pointer
|
But in this particular case, we don't actually dereference the pointer
|
||||||
returned from rcu_dereference(). Instead, that pointer is just compared
|
returned from rcu_dereference(). Instead, that pointer is just compared
|
||||||
to the cic pointer, which means that the rcu_dereference() can be replaced
|
to the cic pointer, which means that the rcu_dereference() can be replaced
|
||||||
by rcu_access_pointer() as follows:
|
by rcu_access_pointer() as follows:
|
||||||
|
@@ -1,4 +1,7 @@
|
|||||||
|
.. _rcu_dereference_doc:
|
||||||
|
|
||||||
PROPER CARE AND FEEDING OF RETURN VALUES FROM rcu_dereference()
|
PROPER CARE AND FEEDING OF RETURN VALUES FROM rcu_dereference()
|
||||||
|
===============================================================
|
||||||
|
|
||||||
Most of the time, you can use values from rcu_dereference() or one of
|
Most of the time, you can use values from rcu_dereference() or one of
|
||||||
the similar primitives without worries. Dereferencing (prefix "*"),
|
the similar primitives without worries. Dereferencing (prefix "*"),
|
||||||
@@ -8,7 +11,7 @@ subtraction of constants, and casts all work quite naturally and safely.
|
|||||||
It is nevertheless possible to get into trouble with other operations.
|
It is nevertheless possible to get into trouble with other operations.
|
||||||
Follow these rules to keep your RCU code working properly:
|
Follow these rules to keep your RCU code working properly:
|
||||||
|
|
||||||
o You must use one of the rcu_dereference() family of primitives
|
- You must use one of the rcu_dereference() family of primitives
|
||||||
to load an RCU-protected pointer, otherwise CONFIG_PROVE_RCU
|
to load an RCU-protected pointer, otherwise CONFIG_PROVE_RCU
|
||||||
will complain. Worse yet, your code can see random memory-corruption
|
will complain. Worse yet, your code can see random memory-corruption
|
||||||
bugs due to games that compilers and DEC Alpha can play.
|
bugs due to games that compilers and DEC Alpha can play.
|
||||||
@@ -25,24 +28,24 @@ o You must use one of the rcu_dereference() family of primitives
|
|||||||
for an example where the compiler can in fact deduce the exact
|
for an example where the compiler can in fact deduce the exact
|
||||||
value of the pointer, and thus cause misordering.
|
value of the pointer, and thus cause misordering.
|
||||||
|
|
||||||
o You are only permitted to use rcu_dereference on pointer values.
|
- You are only permitted to use rcu_dereference on pointer values.
|
||||||
The compiler simply knows too much about integral values to
|
The compiler simply knows too much about integral values to
|
||||||
trust it to carry dependencies through integer operations.
|
trust it to carry dependencies through integer operations.
|
||||||
There are a very few exceptions, namely that you can temporarily
|
There are a very few exceptions, namely that you can temporarily
|
||||||
cast the pointer to uintptr_t in order to:
|
cast the pointer to uintptr_t in order to:
|
||||||
|
|
||||||
o Set bits and clear bits down in the must-be-zero low-order
|
- Set bits and clear bits down in the must-be-zero low-order
|
||||||
bits of that pointer. This clearly means that the pointer
|
bits of that pointer. This clearly means that the pointer
|
||||||
must have alignment constraints, for example, this does
|
must have alignment constraints, for example, this does
|
||||||
-not- work in general for char* pointers.
|
-not- work in general for char* pointers.
|
||||||
|
|
||||||
o XOR bits to translate pointers, as is done in some
|
- XOR bits to translate pointers, as is done in some
|
||||||
classic buddy-allocator algorithms.
|
classic buddy-allocator algorithms.
|
||||||
|
|
||||||
It is important to cast the value back to pointer before
|
It is important to cast the value back to pointer before
|
||||||
doing much of anything else with it.
|
doing much of anything else with it.
|
||||||
|
|
||||||
o Avoid cancellation when using the "+" and "-" infix arithmetic
|
- Avoid cancellation when using the "+" and "-" infix arithmetic
|
||||||
operators. For example, for a given variable "x", avoid
|
operators. For example, for a given variable "x", avoid
|
||||||
"(x-(uintptr_t)x)" for char* pointers. The compiler is within its
|
"(x-(uintptr_t)x)" for char* pointers. The compiler is within its
|
||||||
rights to substitute zero for this sort of expression, so that
|
rights to substitute zero for this sort of expression, so that
|
||||||
@@ -54,16 +57,16 @@ o Avoid cancellation when using the "+" and "-" infix arithmetic
|
|||||||
"p+a-b" is safe because its value still necessarily depends on
|
"p+a-b" is safe because its value still necessarily depends on
|
||||||
the rcu_dereference(), thus maintaining proper ordering.
|
the rcu_dereference(), thus maintaining proper ordering.
|
||||||
|
|
||||||
o If you are using RCU to protect JITed functions, so that the
|
- If you are using RCU to protect JITed functions, so that the
|
||||||
"()" function-invocation operator is applied to a value obtained
|
"()" function-invocation operator is applied to a value obtained
|
||||||
(directly or indirectly) from rcu_dereference(), you may need to
|
(directly or indirectly) from rcu_dereference(), you may need to
|
||||||
interact directly with the hardware to flush instruction caches.
|
interact directly with the hardware to flush instruction caches.
|
||||||
This issue arises on some systems when a newly JITed function is
|
This issue arises on some systems when a newly JITed function is
|
||||||
using the same memory that was used by an earlier JITed function.
|
using the same memory that was used by an earlier JITed function.
|
||||||
|
|
||||||
o Do not use the results from relational operators ("==", "!=",
|
- Do not use the results from relational operators ("==", "!=",
|
||||||
">", ">=", "<", or "<=") when dereferencing. For example,
|
">", ">=", "<", or "<=") when dereferencing. For example,
|
||||||
the following (quite strange) code is buggy:
|
the following (quite strange) code is buggy::
|
||||||
|
|
||||||
int *p;
|
int *p;
|
||||||
int *q;
|
int *q;
|
||||||
@@ -81,11 +84,11 @@ o Do not use the results from relational operators ("==", "!=",
|
|||||||
after such branches, but can speculate loads, which can again
|
after such branches, but can speculate loads, which can again
|
||||||
result in misordering bugs.
|
result in misordering bugs.
|
||||||
|
|
||||||
o Be very careful about comparing pointers obtained from
|
- Be very careful about comparing pointers obtained from
|
||||||
rcu_dereference() against non-NULL values. As Linus Torvalds
|
rcu_dereference() against non-NULL values. As Linus Torvalds
|
||||||
explained, if the two pointers are equal, the compiler could
|
explained, if the two pointers are equal, the compiler could
|
||||||
substitute the pointer you are comparing against for the pointer
|
substitute the pointer you are comparing against for the pointer
|
||||||
obtained from rcu_dereference(). For example:
|
obtained from rcu_dereference(). For example::
|
||||||
|
|
||||||
p = rcu_dereference(gp);
|
p = rcu_dereference(gp);
|
||||||
if (p == &default_struct)
|
if (p == &default_struct)
|
||||||
@@ -93,7 +96,7 @@ o Be very careful about comparing pointers obtained from
|
|||||||
|
|
||||||
Because the compiler now knows that the value of "p" is exactly
|
Because the compiler now knows that the value of "p" is exactly
|
||||||
the address of the variable "default_struct", it is free to
|
the address of the variable "default_struct", it is free to
|
||||||
transform this code into the following:
|
transform this code into the following::
|
||||||
|
|
||||||
p = rcu_dereference(gp);
|
p = rcu_dereference(gp);
|
||||||
if (p == &default_struct)
|
if (p == &default_struct)
|
||||||
@@ -105,14 +108,14 @@ o Be very careful about comparing pointers obtained from
|
|||||||
|
|
||||||
However, comparisons are OK in the following cases:
|
However, comparisons are OK in the following cases:
|
||||||
|
|
||||||
o The comparison was against the NULL pointer. If the
|
- The comparison was against the NULL pointer. If the
|
||||||
compiler knows that the pointer is NULL, you had better
|
compiler knows that the pointer is NULL, you had better
|
||||||
not be dereferencing it anyway. If the comparison is
|
not be dereferencing it anyway. If the comparison is
|
||||||
non-equal, the compiler is none the wiser. Therefore,
|
non-equal, the compiler is none the wiser. Therefore,
|
||||||
it is safe to compare pointers from rcu_dereference()
|
it is safe to compare pointers from rcu_dereference()
|
||||||
against NULL pointers.
|
against NULL pointers.
|
||||||
|
|
||||||
o The pointer is never dereferenced after being compared.
|
- The pointer is never dereferenced after being compared.
|
||||||
Since there are no subsequent dereferences, the compiler
|
Since there are no subsequent dereferences, the compiler
|
||||||
cannot use anything it learned from the comparison
|
cannot use anything it learned from the comparison
|
||||||
to reorder the non-existent subsequent dereferences.
|
to reorder the non-existent subsequent dereferences.
|
||||||
@@ -124,31 +127,31 @@ o Be very careful about comparing pointers obtained from
|
|||||||
dereferenced, rcu_access_pointer() should be used in place
|
dereferenced, rcu_access_pointer() should be used in place
|
||||||
of rcu_dereference().
|
of rcu_dereference().
|
||||||
|
|
||||||
o The comparison is against a pointer that references memory
|
- The comparison is against a pointer that references memory
|
||||||
that was initialized "a long time ago." The reason
|
that was initialized "a long time ago." The reason
|
||||||
this is safe is that even if misordering occurs, the
|
this is safe is that even if misordering occurs, the
|
||||||
misordering will not affect the accesses that follow
|
misordering will not affect the accesses that follow
|
||||||
the comparison. So exactly how long ago is "a long
|
the comparison. So exactly how long ago is "a long
|
||||||
time ago"? Here are some possibilities:
|
time ago"? Here are some possibilities:
|
||||||
|
|
||||||
o Compile time.
|
- Compile time.
|
||||||
|
|
||||||
o Boot time.
|
- Boot time.
|
||||||
|
|
||||||
o Module-init time for module code.
|
- Module-init time for module code.
|
||||||
|
|
||||||
o Prior to kthread creation for kthread code.
|
- Prior to kthread creation for kthread code.
|
||||||
|
|
||||||
o During some prior acquisition of the lock that
|
- During some prior acquisition of the lock that
|
||||||
we now hold.
|
we now hold.
|
||||||
|
|
||||||
o Before mod_timer() time for a timer handler.
|
- Before mod_timer() time for a timer handler.
|
||||||
|
|
||||||
There are many other possibilities involving the Linux
|
There are many other possibilities involving the Linux
|
||||||
kernel's wide array of primitives that cause code to
|
kernel's wide array of primitives that cause code to
|
||||||
be invoked at a later time.
|
be invoked at a later time.
|
||||||
|
|
||||||
o The pointer being compared against also came from
|
- The pointer being compared against also came from
|
||||||
rcu_dereference(). In this case, both pointers depend
|
rcu_dereference(). In this case, both pointers depend
|
||||||
on one rcu_dereference() or another, so you get proper
|
on one rcu_dereference() or another, so you get proper
|
||||||
ordering either way.
|
ordering either way.
|
||||||
@@ -159,13 +162,13 @@ o Be very careful about comparing pointers obtained from
|
|||||||
of such an RCU usage bug is shown in the section titled
|
of such an RCU usage bug is shown in the section titled
|
||||||
"EXAMPLE OF AMPLIFIED RCU-USAGE BUG".
|
"EXAMPLE OF AMPLIFIED RCU-USAGE BUG".
|
||||||
|
|
||||||
o All of the accesses following the comparison are stores,
|
- All of the accesses following the comparison are stores,
|
||||||
so that a control dependency preserves the needed ordering.
|
so that a control dependency preserves the needed ordering.
|
||||||
That said, it is easy to get control dependencies wrong.
|
That said, it is easy to get control dependencies wrong.
|
||||||
Please see the "CONTROL DEPENDENCIES" section of
|
Please see the "CONTROL DEPENDENCIES" section of
|
||||||
Documentation/memory-barriers.txt for more details.
|
Documentation/memory-barriers.txt for more details.
|
||||||
|
|
||||||
o The pointers are not equal -and- the compiler does
|
- The pointers are not equal -and- the compiler does
|
||||||
not have enough information to deduce the value of the
|
not have enough information to deduce the value of the
|
||||||
pointer. Note that the volatile cast in rcu_dereference()
|
pointer. Note that the volatile cast in rcu_dereference()
|
||||||
will normally prevent the compiler from knowing too much.
|
will normally prevent the compiler from knowing too much.
|
||||||
@@ -175,7 +178,7 @@ o Be very careful about comparing pointers obtained from
|
|||||||
comparison will provide exactly the information that the
|
comparison will provide exactly the information that the
|
||||||
compiler needs to deduce the value of the pointer.
|
compiler needs to deduce the value of the pointer.
|
||||||
|
|
||||||
o Disable any value-speculation optimizations that your compiler
|
- Disable any value-speculation optimizations that your compiler
|
||||||
might provide, especially if you are making use of feedback-based
|
might provide, especially if you are making use of feedback-based
|
||||||
optimizations that take data collected from prior runs. Such
|
optimizations that take data collected from prior runs. Such
|
||||||
value-speculation optimizations reorder operations by design.
|
value-speculation optimizations reorder operations by design.
|
||||||
@@ -188,11 +191,12 @@ o Disable any value-speculation optimizations that your compiler
|
|||||||
|
|
||||||
|
|
||||||
EXAMPLE OF AMPLIFIED RCU-USAGE BUG
|
EXAMPLE OF AMPLIFIED RCU-USAGE BUG
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
Because updaters can run concurrently with RCU readers, RCU readers can
|
Because updaters can run concurrently with RCU readers, RCU readers can
|
||||||
see stale and/or inconsistent values. If RCU readers need fresh or
|
see stale and/or inconsistent values. If RCU readers need fresh or
|
||||||
consistent values, which they sometimes do, they need to take proper
|
consistent values, which they sometimes do, they need to take proper
|
||||||
precautions. To see this, consider the following code fragment:
|
precautions. To see this, consider the following code fragment::
|
||||||
|
|
||||||
struct foo {
|
struct foo {
|
||||||
int a;
|
int a;
|
||||||
@@ -244,7 +248,7 @@ to some reordering from the compiler and CPUs is beside the point.
|
|||||||
|
|
||||||
But suppose that the reader needs a consistent view?
|
But suppose that the reader needs a consistent view?
|
||||||
|
|
||||||
Then one approach is to use locking, for example, as follows:
|
Then one approach is to use locking, for example, as follows::
|
||||||
|
|
||||||
struct foo {
|
struct foo {
|
||||||
int a;
|
int a;
|
||||||
@@ -299,6 +303,7 @@ As always, use the right tool for the job!
|
|||||||
|
|
||||||
|
|
||||||
EXAMPLE WHERE THE COMPILER KNOWS TOO MUCH
|
EXAMPLE WHERE THE COMPILER KNOWS TOO MUCH
|
||||||
|
-----------------------------------------
|
||||||
|
|
||||||
If a pointer obtained from rcu_dereference() compares not-equal to some
|
If a pointer obtained from rcu_dereference() compares not-equal to some
|
||||||
other pointer, the compiler normally has no clue what the value of the
|
other pointer, the compiler normally has no clue what the value of the
|
||||||
@@ -308,7 +313,7 @@ guarantees that RCU depends on. And the volatile cast in rcu_dereference()
|
|||||||
should prevent the compiler from guessing the value.
|
should prevent the compiler from guessing the value.
|
||||||
|
|
||||||
But without rcu_dereference(), the compiler knows more than you might
|
But without rcu_dereference(), the compiler knows more than you might
|
||||||
expect. Consider the following code fragment:
|
expect. Consider the following code fragment::
|
||||||
|
|
||||||
struct foo {
|
struct foo {
|
||||||
int a;
|
int a;
|
||||||
@@ -354,6 +359,7 @@ dereference the resulting pointer.
|
|||||||
|
|
||||||
|
|
||||||
WHICH MEMBER OF THE rcu_dereference() FAMILY SHOULD YOU USE?
|
WHICH MEMBER OF THE rcu_dereference() FAMILY SHOULD YOU USE?
|
||||||
|
------------------------------------------------------------
|
||||||
|
|
||||||
First, please avoid using rcu_dereference_raw() and also please avoid
|
First, please avoid using rcu_dereference_raw() and also please avoid
|
||||||
using rcu_dereference_check() and rcu_dereference_protected() with a
|
using rcu_dereference_check() and rcu_dereference_protected() with a
|
||||||
@@ -370,7 +376,7 @@ member of the rcu_dereference() to use in various situations:
|
|||||||
|
|
||||||
2. If the access might be within an RCU read-side critical section
|
2. If the access might be within an RCU read-side critical section
|
||||||
on the one hand, or protected by (say) my_lock on the other,
|
on the one hand, or protected by (say) my_lock on the other,
|
||||||
use rcu_dereference_check(), for example:
|
use rcu_dereference_check(), for example::
|
||||||
|
|
||||||
p1 = rcu_dereference_check(p->rcu_protected_pointer,
|
p1 = rcu_dereference_check(p->rcu_protected_pointer,
|
||||||
lockdep_is_held(&my_lock));
|
lockdep_is_held(&my_lock));
|
||||||
@@ -378,14 +384,14 @@ member of the rcu_dereference() to use in various situations:
|
|||||||
|
|
||||||
3. If the access might be within an RCU read-side critical section
|
3. If the access might be within an RCU read-side critical section
|
||||||
on the one hand, or protected by either my_lock or your_lock on
|
on the one hand, or protected by either my_lock or your_lock on
|
||||||
the other, again use rcu_dereference_check(), for example:
|
the other, again use rcu_dereference_check(), for example::
|
||||||
|
|
||||||
p1 = rcu_dereference_check(p->rcu_protected_pointer,
|
p1 = rcu_dereference_check(p->rcu_protected_pointer,
|
||||||
lockdep_is_held(&my_lock) ||
|
lockdep_is_held(&my_lock) ||
|
||||||
lockdep_is_held(&your_lock));
|
lockdep_is_held(&your_lock));
|
||||||
|
|
||||||
4. If the access is on the update side, so that it is always protected
|
4. If the access is on the update side, so that it is always protected
|
||||||
by my_lock, use rcu_dereference_protected():
|
by my_lock, use rcu_dereference_protected()::
|
||||||
|
|
||||||
p1 = rcu_dereference_protected(p->rcu_protected_pointer,
|
p1 = rcu_dereference_protected(p->rcu_protected_pointer,
|
||||||
lockdep_is_held(&my_lock));
|
lockdep_is_held(&my_lock));
|
||||||
@@ -410,18 +416,19 @@ member of the rcu_dereference() to use in various situations:
|
|||||||
|
|
||||||
|
|
||||||
SPARSE CHECKING OF RCU-PROTECTED POINTERS
|
SPARSE CHECKING OF RCU-PROTECTED POINTERS
|
||||||
|
-----------------------------------------
|
||||||
|
|
||||||
The sparse static-analysis tool checks for direct access to RCU-protected
|
The sparse static-analysis tool checks for direct access to RCU-protected
|
||||||
pointers, which can result in "interesting" bugs due to compiler
|
pointers, which can result in "interesting" bugs due to compiler
|
||||||
optimizations involving invented loads and perhaps also load tearing.
|
optimizations involving invented loads and perhaps also load tearing.
|
||||||
For example, suppose someone mistakenly does something like this:
|
For example, suppose someone mistakenly does something like this::
|
||||||
|
|
||||||
p = q->rcu_protected_pointer;
|
p = q->rcu_protected_pointer;
|
||||||
do_something_with(p->a);
|
do_something_with(p->a);
|
||||||
do_something_else_with(p->b);
|
do_something_else_with(p->b);
|
||||||
|
|
||||||
If register pressure is high, the compiler might optimize "p" out
|
If register pressure is high, the compiler might optimize "p" out
|
||||||
of existence, transforming the code to something like this:
|
of existence, transforming the code to something like this::
|
||||||
|
|
||||||
do_something_with(q->rcu_protected_pointer->a);
|
do_something_with(q->rcu_protected_pointer->a);
|
||||||
do_something_else_with(q->rcu_protected_pointer->b);
|
do_something_else_with(q->rcu_protected_pointer->b);
|
||||||
@@ -435,7 +442,7 @@ Load tearing could of course result in dereferencing a mashup of a pair
|
|||||||
of pointers, which also might fatally disappoint your code.
|
of pointers, which also might fatally disappoint your code.
|
||||||
|
|
||||||
These problems could have been avoided simply by making the code instead
|
These problems could have been avoided simply by making the code instead
|
||||||
read as follows:
|
read as follows::
|
||||||
|
|
||||||
p = rcu_dereference(q->rcu_protected_pointer);
|
p = rcu_dereference(q->rcu_protected_pointer);
|
||||||
do_something_with(p->a);
|
do_something_with(p->a);
|
||||||
@@ -448,7 +455,7 @@ or as a formal parameter, with "__rcu", which tells sparse to complain if
|
|||||||
this pointer is accessed directly. It will also cause sparse to complain
|
this pointer is accessed directly. It will also cause sparse to complain
|
||||||
if a pointer not marked with "__rcu" is accessed using rcu_dereference()
|
if a pointer not marked with "__rcu" is accessed using rcu_dereference()
|
||||||
and friends. For example, ->rcu_protected_pointer might be declared as
|
and friends. For example, ->rcu_protected_pointer might be declared as
|
||||||
follows:
|
follows::
|
||||||
|
|
||||||
struct foo __rcu *rcu_protected_pointer;
|
struct foo __rcu *rcu_protected_pointer;
|
||||||
|
|
@@ -1,4 +1,7 @@
|
|||||||
|
.. _rcu_barrier:
|
||||||
|
|
||||||
RCU and Unloadable Modules
|
RCU and Unloadable Modules
|
||||||
|
==========================
|
||||||
|
|
||||||
[Originally published in LWN Jan. 14, 2007: http://lwn.net/Articles/217484/]
|
[Originally published in LWN Jan. 14, 2007: http://lwn.net/Articles/217484/]
|
||||||
|
|
||||||
@@ -21,7 +24,7 @@ given that readers might well leave absolutely no trace of their
|
|||||||
presence? There is a synchronize_rcu() primitive that blocks until all
|
presence? There is a synchronize_rcu() primitive that blocks until all
|
||||||
pre-existing readers have completed. An updater wishing to delete an
|
pre-existing readers have completed. An updater wishing to delete an
|
||||||
element p from a linked list might do the following, while holding an
|
element p from a linked list might do the following, while holding an
|
||||||
appropriate lock, of course:
|
appropriate lock, of course::
|
||||||
|
|
||||||
list_del_rcu(p);
|
list_del_rcu(p);
|
||||||
synchronize_rcu();
|
synchronize_rcu();
|
||||||
@@ -32,13 +35,13 @@ primitive must be used instead. This primitive takes a pointer to an
|
|||||||
rcu_head struct placed within the RCU-protected data structure and
|
rcu_head struct placed within the RCU-protected data structure and
|
||||||
another pointer to a function that may be invoked later to free that
|
another pointer to a function that may be invoked later to free that
|
||||||
structure. Code to delete an element p from the linked list from IRQ
|
structure. Code to delete an element p from the linked list from IRQ
|
||||||
context might then be as follows:
|
context might then be as follows::
|
||||||
|
|
||||||
list_del_rcu(p);
|
list_del_rcu(p);
|
||||||
call_rcu(&p->rcu, p_callback);
|
call_rcu(&p->rcu, p_callback);
|
||||||
|
|
||||||
Since call_rcu() never blocks, this code can safely be used from within
|
Since call_rcu() never blocks, this code can safely be used from within
|
||||||
IRQ context. The function p_callback() might be defined as follows:
|
IRQ context. The function p_callback() might be defined as follows::
|
||||||
|
|
||||||
static void p_callback(struct rcu_head *rp)
|
static void p_callback(struct rcu_head *rp)
|
||||||
{
|
{
|
||||||
@@ -49,6 +52,7 @@ IRQ context. The function p_callback() might be defined as follows:
|
|||||||
|
|
||||||
|
|
||||||
Unloading Modules That Use call_rcu()
|
Unloading Modules That Use call_rcu()
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
But what if p_callback is defined in an unloadable module?
|
But what if p_callback is defined in an unloadable module?
|
||||||
|
|
||||||
@@ -69,10 +73,11 @@ in realtime kernels in order to avoid excessive scheduling latencies.
|
|||||||
|
|
||||||
|
|
||||||
rcu_barrier()
|
rcu_barrier()
|
||||||
|
-------------
|
||||||
|
|
||||||
We instead need the rcu_barrier() primitive. Rather than waiting for
|
We instead need the rcu_barrier() primitive. Rather than waiting for
|
||||||
a grace period to elapse, rcu_barrier() waits for all outstanding RCU
|
a grace period to elapse, rcu_barrier() waits for all outstanding RCU
|
||||||
callbacks to complete. Please note that rcu_barrier() does -not- imply
|
callbacks to complete. Please note that rcu_barrier() does **not** imply
|
||||||
synchronize_rcu(), in particular, if there are no RCU callbacks queued
|
synchronize_rcu(), in particular, if there are no RCU callbacks queued
|
||||||
anywhere, rcu_barrier() is within its rights to return immediately,
|
anywhere, rcu_barrier() is within its rights to return immediately,
|
||||||
without waiting for a grace period to elapse.
|
without waiting for a grace period to elapse.
|
||||||
@@ -88,79 +93,79 @@ must match the flavor of rcu_barrier() with that of call_rcu(). If your
|
|||||||
module uses multiple flavors of call_rcu(), then it must also use multiple
|
module uses multiple flavors of call_rcu(), then it must also use multiple
|
||||||
flavors of rcu_barrier() when unloading that module. For example, if
|
flavors of rcu_barrier() when unloading that module. For example, if
|
||||||
it uses call_rcu(), call_srcu() on srcu_struct_1, and call_srcu() on
|
it uses call_rcu(), call_srcu() on srcu_struct_1, and call_srcu() on
|
||||||
srcu_struct_2(), then the following three lines of code will be required
|
srcu_struct_2, then the following three lines of code will be required
|
||||||
when unloading:
|
when unloading::
|
||||||
|
|
||||||
1 rcu_barrier();
|
1 rcu_barrier();
|
||||||
2 srcu_barrier(&srcu_struct_1);
|
2 srcu_barrier(&srcu_struct_1);
|
||||||
3 srcu_barrier(&srcu_struct_2);
|
3 srcu_barrier(&srcu_struct_2);
|
||||||
|
|
||||||
The rcutorture module makes use of rcu_barrier() in its exit function
|
The rcutorture module makes use of rcu_barrier() in its exit function
|
||||||
as follows:
|
as follows::
|
||||||
|
|
||||||
1 static void
|
1 static void
|
||||||
2 rcu_torture_cleanup(void)
|
2 rcu_torture_cleanup(void)
|
||||||
3 {
|
3 {
|
||||||
4 int i;
|
4 int i;
|
||||||
5
|
5
|
||||||
6 fullstop = 1;
|
6 fullstop = 1;
|
||||||
7 if (shuffler_task != NULL) {
|
7 if (shuffler_task != NULL) {
|
||||||
8 VERBOSE_PRINTK_STRING("Stopping rcu_torture_shuffle task");
|
8 VERBOSE_PRINTK_STRING("Stopping rcu_torture_shuffle task");
|
||||||
9 kthread_stop(shuffler_task);
|
9 kthread_stop(shuffler_task);
|
||||||
10 }
|
10 }
|
||||||
11 shuffler_task = NULL;
|
11 shuffler_task = NULL;
|
||||||
12
|
12
|
||||||
13 if (writer_task != NULL) {
|
13 if (writer_task != NULL) {
|
||||||
14 VERBOSE_PRINTK_STRING("Stopping rcu_torture_writer task");
|
14 VERBOSE_PRINTK_STRING("Stopping rcu_torture_writer task");
|
||||||
15 kthread_stop(writer_task);
|
15 kthread_stop(writer_task);
|
||||||
16 }
|
16 }
|
||||||
17 writer_task = NULL;
|
17 writer_task = NULL;
|
||||||
18
|
18
|
||||||
19 if (reader_tasks != NULL) {
|
19 if (reader_tasks != NULL) {
|
||||||
20 for (i = 0; i < nrealreaders; i++) {
|
20 for (i = 0; i < nrealreaders; i++) {
|
||||||
21 if (reader_tasks[i] != NULL) {
|
21 if (reader_tasks[i] != NULL) {
|
||||||
22 VERBOSE_PRINTK_STRING(
|
22 VERBOSE_PRINTK_STRING(
|
||||||
23 "Stopping rcu_torture_reader task");
|
23 "Stopping rcu_torture_reader task");
|
||||||
24 kthread_stop(reader_tasks[i]);
|
24 kthread_stop(reader_tasks[i]);
|
||||||
25 }
|
25 }
|
||||||
26 reader_tasks[i] = NULL;
|
26 reader_tasks[i] = NULL;
|
||||||
27 }
|
27 }
|
||||||
28 kfree(reader_tasks);
|
28 kfree(reader_tasks);
|
||||||
29 reader_tasks = NULL;
|
29 reader_tasks = NULL;
|
||||||
30 }
|
30 }
|
||||||
31 rcu_torture_current = NULL;
|
31 rcu_torture_current = NULL;
|
||||||
32
|
32
|
||||||
33 if (fakewriter_tasks != NULL) {
|
33 if (fakewriter_tasks != NULL) {
|
||||||
34 for (i = 0; i < nfakewriters; i++) {
|
34 for (i = 0; i < nfakewriters; i++) {
|
||||||
35 if (fakewriter_tasks[i] != NULL) {
|
35 if (fakewriter_tasks[i] != NULL) {
|
||||||
36 VERBOSE_PRINTK_STRING(
|
36 VERBOSE_PRINTK_STRING(
|
||||||
37 "Stopping rcu_torture_fakewriter task");
|
37 "Stopping rcu_torture_fakewriter task");
|
||||||
38 kthread_stop(fakewriter_tasks[i]);
|
38 kthread_stop(fakewriter_tasks[i]);
|
||||||
39 }
|
39 }
|
||||||
40 fakewriter_tasks[i] = NULL;
|
40 fakewriter_tasks[i] = NULL;
|
||||||
41 }
|
41 }
|
||||||
42 kfree(fakewriter_tasks);
|
42 kfree(fakewriter_tasks);
|
||||||
43 fakewriter_tasks = NULL;
|
43 fakewriter_tasks = NULL;
|
||||||
44 }
|
44 }
|
||||||
45
|
45
|
||||||
46 if (stats_task != NULL) {
|
46 if (stats_task != NULL) {
|
||||||
47 VERBOSE_PRINTK_STRING("Stopping rcu_torture_stats task");
|
47 VERBOSE_PRINTK_STRING("Stopping rcu_torture_stats task");
|
||||||
48 kthread_stop(stats_task);
|
48 kthread_stop(stats_task);
|
||||||
49 }
|
49 }
|
||||||
50 stats_task = NULL;
|
50 stats_task = NULL;
|
||||||
51
|
51
|
||||||
52 /* Wait for all RCU callbacks to fire. */
|
52 /* Wait for all RCU callbacks to fire. */
|
||||||
53 rcu_barrier();
|
53 rcu_barrier();
|
||||||
54
|
54
|
||||||
55 rcu_torture_stats_print(); /* -After- the stats thread is stopped! */
|
55 rcu_torture_stats_print(); /* -After- the stats thread is stopped! */
|
||||||
56
|
56
|
||||||
57 if (cur_ops->cleanup != NULL)
|
57 if (cur_ops->cleanup != NULL)
|
||||||
58 cur_ops->cleanup();
|
58 cur_ops->cleanup();
|
||||||
59 if (atomic_read(&n_rcu_torture_error))
|
59 if (atomic_read(&n_rcu_torture_error))
|
||||||
60 rcu_torture_print_module_parms("End of test: FAILURE");
|
60 rcu_torture_print_module_parms("End of test: FAILURE");
|
||||||
61 else
|
61 else
|
||||||
62 rcu_torture_print_module_parms("End of test: SUCCESS");
|
62 rcu_torture_print_module_parms("End of test: SUCCESS");
|
||||||
63 }
|
63 }
|
||||||
|
|
||||||
Line 6 sets a global variable that prevents any RCU callbacks from
|
Line 6 sets a global variable that prevents any RCU callbacks from
|
||||||
re-posting themselves. This will not be necessary in most cases, since
|
re-posting themselves. This will not be necessary in most cases, since
|
||||||
@@ -176,9 +181,14 @@ for any pre-existing callbacks to complete.
|
|||||||
Then lines 55-62 print status and do operation-specific cleanup, and
|
Then lines 55-62 print status and do operation-specific cleanup, and
|
||||||
then return, permitting the module-unload operation to be completed.
|
then return, permitting the module-unload operation to be completed.
|
||||||
|
|
||||||
Quick Quiz #1: Is there any other situation where rcu_barrier() might
|
.. _rcubarrier_quiz_1:
|
||||||
|
|
||||||
|
Quick Quiz #1:
|
||||||
|
Is there any other situation where rcu_barrier() might
|
||||||
be required?
|
be required?
|
||||||
|
|
||||||
|
:ref:`Answer to Quick Quiz #1 <answer_rcubarrier_quiz_1>`
|
||||||
|
|
||||||
Your module might have additional complications. For example, if your
|
Your module might have additional complications. For example, if your
|
||||||
module invokes call_rcu() from timers, you will need to first cancel all
|
module invokes call_rcu() from timers, you will need to first cancel all
|
||||||
the timers, and only then invoke rcu_barrier() to wait for any remaining
|
the timers, and only then invoke rcu_barrier() to wait for any remaining
|
||||||
@@ -188,11 +198,12 @@ Of course, if you module uses call_rcu(), you will need to invoke
|
|||||||
rcu_barrier() before unloading. Similarly, if your module uses
|
rcu_barrier() before unloading. Similarly, if your module uses
|
||||||
call_srcu(), you will need to invoke srcu_barrier() before unloading,
|
call_srcu(), you will need to invoke srcu_barrier() before unloading,
|
||||||
and on the same srcu_struct structure. If your module uses call_rcu()
|
and on the same srcu_struct structure. If your module uses call_rcu()
|
||||||
-and- call_srcu(), then you will need to invoke rcu_barrier() -and-
|
**and** call_srcu(), then you will need to invoke rcu_barrier() **and**
|
||||||
srcu_barrier().
|
srcu_barrier().
|
||||||
|
|
||||||
|
|
||||||
Implementing rcu_barrier()
|
Implementing rcu_barrier()
|
||||||
|
--------------------------
|
||||||
|
|
||||||
Dipankar Sarma's implementation of rcu_barrier() makes use of the fact
|
Dipankar Sarma's implementation of rcu_barrier() makes use of the fact
|
||||||
that RCU callbacks are never reordered once queued on one of the per-CPU
|
that RCU callbacks are never reordered once queued on one of the per-CPU
|
||||||
@@ -200,19 +211,19 @@ queues. His implementation queues an RCU callback on each of the per-CPU
|
|||||||
callback queues, and then waits until they have all started executing, at
|
callback queues, and then waits until they have all started executing, at
|
||||||
which point, all earlier RCU callbacks are guaranteed to have completed.
|
which point, all earlier RCU callbacks are guaranteed to have completed.
|
||||||
|
|
||||||
The original code for rcu_barrier() was as follows:
|
The original code for rcu_barrier() was as follows::
|
||||||
|
|
||||||
1 void rcu_barrier(void)
|
1 void rcu_barrier(void)
|
||||||
2 {
|
2 {
|
||||||
3 BUG_ON(in_interrupt());
|
3 BUG_ON(in_interrupt());
|
||||||
4 /* Take cpucontrol mutex to protect against CPU hotplug */
|
4 /* Take cpucontrol mutex to protect against CPU hotplug */
|
||||||
5 mutex_lock(&rcu_barrier_mutex);
|
5 mutex_lock(&rcu_barrier_mutex);
|
||||||
6 init_completion(&rcu_barrier_completion);
|
6 init_completion(&rcu_barrier_completion);
|
||||||
7 atomic_set(&rcu_barrier_cpu_count, 0);
|
7 atomic_set(&rcu_barrier_cpu_count, 0);
|
||||||
8 on_each_cpu(rcu_barrier_func, NULL, 0, 1);
|
8 on_each_cpu(rcu_barrier_func, NULL, 0, 1);
|
||||||
9 wait_for_completion(&rcu_barrier_completion);
|
9 wait_for_completion(&rcu_barrier_completion);
|
||||||
10 mutex_unlock(&rcu_barrier_mutex);
|
10 mutex_unlock(&rcu_barrier_mutex);
|
||||||
11 }
|
11 }
|
||||||
|
|
||||||
Line 3 verifies that the caller is in process context, and lines 5 and 10
|
Line 3 verifies that the caller is in process context, and lines 5 and 10
|
||||||
use rcu_barrier_mutex to ensure that only one rcu_barrier() is using the
|
use rcu_barrier_mutex to ensure that only one rcu_barrier() is using the
|
||||||
@@ -226,18 +237,18 @@ This code was rewritten in 2008 and several times thereafter, but this
|
|||||||
still gives the general idea.
|
still gives the general idea.
|
||||||
|
|
||||||
The rcu_barrier_func() runs on each CPU, where it invokes call_rcu()
|
The rcu_barrier_func() runs on each CPU, where it invokes call_rcu()
|
||||||
to post an RCU callback, as follows:
|
to post an RCU callback, as follows::
|
||||||
|
|
||||||
1 static void rcu_barrier_func(void *notused)
|
1 static void rcu_barrier_func(void *notused)
|
||||||
2 {
|
2 {
|
||||||
3 int cpu = smp_processor_id();
|
3 int cpu = smp_processor_id();
|
||||||
4 struct rcu_data *rdp = &per_cpu(rcu_data, cpu);
|
4 struct rcu_data *rdp = &per_cpu(rcu_data, cpu);
|
||||||
5 struct rcu_head *head;
|
5 struct rcu_head *head;
|
||||||
6
|
6
|
||||||
7 head = &rdp->barrier;
|
7 head = &rdp->barrier;
|
||||||
8 atomic_inc(&rcu_barrier_cpu_count);
|
8 atomic_inc(&rcu_barrier_cpu_count);
|
||||||
9 call_rcu(head, rcu_barrier_callback);
|
9 call_rcu(head, rcu_barrier_callback);
|
||||||
10 }
|
10 }
|
||||||
|
|
||||||
Lines 3 and 4 locate RCU's internal per-CPU rcu_data structure,
|
Lines 3 and 4 locate RCU's internal per-CPU rcu_data structure,
|
||||||
which contains the struct rcu_head that needed for the later call to
|
which contains the struct rcu_head that needed for the later call to
|
||||||
@@ -248,20 +259,25 @@ the current CPU's queue.
|
|||||||
|
|
||||||
The rcu_barrier_callback() function simply atomically decrements the
|
The rcu_barrier_callback() function simply atomically decrements the
|
||||||
rcu_barrier_cpu_count variable and finalizes the completion when it
|
rcu_barrier_cpu_count variable and finalizes the completion when it
|
||||||
reaches zero, as follows:
|
reaches zero, as follows::
|
||||||
|
|
||||||
1 static void rcu_barrier_callback(struct rcu_head *notused)
|
1 static void rcu_barrier_callback(struct rcu_head *notused)
|
||||||
2 {
|
2 {
|
||||||
3 if (atomic_dec_and_test(&rcu_barrier_cpu_count))
|
3 if (atomic_dec_and_test(&rcu_barrier_cpu_count))
|
||||||
4 complete(&rcu_barrier_completion);
|
4 complete(&rcu_barrier_completion);
|
||||||
5 }
|
5 }
|
||||||
|
|
||||||
Quick Quiz #2: What happens if CPU 0's rcu_barrier_func() executes
|
.. _rcubarrier_quiz_2:
|
||||||
|
|
||||||
|
Quick Quiz #2:
|
||||||
|
What happens if CPU 0's rcu_barrier_func() executes
|
||||||
immediately (thus incrementing rcu_barrier_cpu_count to the
|
immediately (thus incrementing rcu_barrier_cpu_count to the
|
||||||
value one), but the other CPU's rcu_barrier_func() invocations
|
value one), but the other CPU's rcu_barrier_func() invocations
|
||||||
are delayed for a full grace period? Couldn't this result in
|
are delayed for a full grace period? Couldn't this result in
|
||||||
rcu_barrier() returning prematurely?
|
rcu_barrier() returning prematurely?
|
||||||
|
|
||||||
|
:ref:`Answer to Quick Quiz #2 <answer_rcubarrier_quiz_2>`
|
||||||
|
|
||||||
The current rcu_barrier() implementation is more complex, due to the need
|
The current rcu_barrier() implementation is more complex, due to the need
|
||||||
to avoid disturbing idle CPUs (especially on battery-powered systems)
|
to avoid disturbing idle CPUs (especially on battery-powered systems)
|
||||||
and the need to minimally disturb non-idle CPUs in real-time systems.
|
and the need to minimally disturb non-idle CPUs in real-time systems.
|
||||||
@@ -269,6 +285,7 @@ However, the code above illustrates the concepts.
|
|||||||
|
|
||||||
|
|
||||||
rcu_barrier() Summary
|
rcu_barrier() Summary
|
||||||
|
---------------------
|
||||||
|
|
||||||
The rcu_barrier() primitive has seen relatively little use, since most
|
The rcu_barrier() primitive has seen relatively little use, since most
|
||||||
code using RCU is in the core kernel rather than in modules. However, if
|
code using RCU is in the core kernel rather than in modules. However, if
|
||||||
@@ -277,8 +294,12 @@ so that your module may be safely unloaded.
|
|||||||
|
|
||||||
|
|
||||||
Answers to Quick Quizzes
|
Answers to Quick Quizzes
|
||||||
|
------------------------
|
||||||
|
|
||||||
Quick Quiz #1: Is there any other situation where rcu_barrier() might
|
.. _answer_rcubarrier_quiz_1:
|
||||||
|
|
||||||
|
Quick Quiz #1:
|
||||||
|
Is there any other situation where rcu_barrier() might
|
||||||
be required?
|
be required?
|
||||||
|
|
||||||
Answer: Interestingly enough, rcu_barrier() was not originally
|
Answer: Interestingly enough, rcu_barrier() was not originally
|
||||||
@@ -292,7 +313,12 @@ Answer: Interestingly enough, rcu_barrier() was not originally
|
|||||||
implementing rcutorture, and found that rcu_barrier() solves
|
implementing rcutorture, and found that rcu_barrier() solves
|
||||||
this problem as well.
|
this problem as well.
|
||||||
|
|
||||||
Quick Quiz #2: What happens if CPU 0's rcu_barrier_func() executes
|
:ref:`Back to Quick Quiz #1 <rcubarrier_quiz_1>`
|
||||||
|
|
||||||
|
.. _answer_rcubarrier_quiz_2:
|
||||||
|
|
||||||
|
Quick Quiz #2:
|
||||||
|
What happens if CPU 0's rcu_barrier_func() executes
|
||||||
immediately (thus incrementing rcu_barrier_cpu_count to the
|
immediately (thus incrementing rcu_barrier_cpu_count to the
|
||||||
value one), but the other CPU's rcu_barrier_func() invocations
|
value one), but the other CPU's rcu_barrier_func() invocations
|
||||||
are delayed for a full grace period? Couldn't this result in
|
are delayed for a full grace period? Couldn't this result in
|
||||||
@@ -323,3 +349,5 @@ Answer: This cannot happen. The reason is that on_each_cpu() has its last
|
|||||||
is to add an rcu_read_lock() before line 8 of rcu_barrier()
|
is to add an rcu_read_lock() before line 8 of rcu_barrier()
|
||||||
and an rcu_read_unlock() after line 8 of this same function. If
|
and an rcu_read_unlock() after line 8 of this same function. If
|
||||||
you can think of a better change, please let me know!
|
you can think of a better change, please let me know!
|
||||||
|
|
||||||
|
:ref:`Back to Quick Quiz #2 <rcubarrier_quiz_2>`
|
@@ -225,18 +225,13 @@ an estimate of the total number of RCU callbacks queued across all CPUs
|
|||||||
In kernels with CONFIG_RCU_FAST_NO_HZ, more information is printed
|
In kernels with CONFIG_RCU_FAST_NO_HZ, more information is printed
|
||||||
for each CPU:
|
for each CPU:
|
||||||
|
|
||||||
0: (64628 ticks this GP) idle=dd5/3fffffffffffffff/0 softirq=82/543 last_accelerate: a345/d342 Nonlazy posted: ..D
|
0: (64628 ticks this GP) idle=dd5/3fffffffffffffff/0 softirq=82/543 last_accelerate: a345/d342 dyntick_enabled: 1
|
||||||
|
|
||||||
The "last_accelerate:" prints the low-order 16 bits (in hex) of the
|
The "last_accelerate:" prints the low-order 16 bits (in hex) of the
|
||||||
jiffies counter when this CPU last invoked rcu_try_advance_all_cbs()
|
jiffies counter when this CPU last invoked rcu_try_advance_all_cbs()
|
||||||
from rcu_needs_cpu() or last invoked rcu_accelerate_cbs() from
|
from rcu_needs_cpu() or last invoked rcu_accelerate_cbs() from
|
||||||
rcu_prepare_for_idle(). The "Nonlazy posted:" indicates lazy-callback
|
rcu_prepare_for_idle(). "dyntick_enabled: 1" indicates that dyntick-idle
|
||||||
status, so that an "l" indicates that all callbacks were lazy at the start
|
processing is enabled.
|
||||||
of the last idle period and an "L" indicates that there are currently
|
|
||||||
no non-lazy callbacks (in both cases, "." is printed otherwise, as
|
|
||||||
shown above) and "D" indicates that dyntick-idle processing is enabled
|
|
||||||
("." is printed otherwise, for example, if disabled via the "nohz="
|
|
||||||
kernel boot parameter).
|
|
||||||
|
|
||||||
If the grace period ends just as the stall warning starts printing,
|
If the grace period ends just as the stall warning starts printing,
|
||||||
there will be a spurious stall-warning message, which will include
|
there will be a spurious stall-warning message, which will include
|
||||||
|
@@ -1,15 +1,18 @@
|
|||||||
|
.. _whatisrcu_doc:
|
||||||
|
|
||||||
What is RCU? -- "Read, Copy, Update"
|
What is RCU? -- "Read, Copy, Update"
|
||||||
|
======================================
|
||||||
|
|
||||||
Please note that the "What is RCU?" LWN series is an excellent place
|
Please note that the "What is RCU?" LWN series is an excellent place
|
||||||
to start learning about RCU:
|
to start learning about RCU:
|
||||||
|
|
||||||
1. What is RCU, Fundamentally? http://lwn.net/Articles/262464/
|
| 1. What is RCU, Fundamentally? http://lwn.net/Articles/262464/
|
||||||
2. What is RCU? Part 2: Usage http://lwn.net/Articles/263130/
|
| 2. What is RCU? Part 2: Usage http://lwn.net/Articles/263130/
|
||||||
3. RCU part 3: the RCU API http://lwn.net/Articles/264090/
|
| 3. RCU part 3: the RCU API http://lwn.net/Articles/264090/
|
||||||
4. The RCU API, 2010 Edition http://lwn.net/Articles/418853/
|
| 4. The RCU API, 2010 Edition http://lwn.net/Articles/418853/
|
||||||
2010 Big API Table http://lwn.net/Articles/419086/
|
| 2010 Big API Table http://lwn.net/Articles/419086/
|
||||||
5. The RCU API, 2014 Edition http://lwn.net/Articles/609904/
|
| 5. The RCU API, 2014 Edition http://lwn.net/Articles/609904/
|
||||||
2014 Big API Table http://lwn.net/Articles/609973/
|
| 2014 Big API Table http://lwn.net/Articles/609973/
|
||||||
|
|
||||||
|
|
||||||
What is RCU?
|
What is RCU?
|
||||||
@@ -24,14 +27,21 @@ the experience has been that different people must take different paths
|
|||||||
to arrive at an understanding of RCU. This document provides several
|
to arrive at an understanding of RCU. This document provides several
|
||||||
different paths, as follows:
|
different paths, as follows:
|
||||||
|
|
||||||
1. RCU OVERVIEW
|
:ref:`1. RCU OVERVIEW <1_whatisRCU>`
|
||||||
2. WHAT IS RCU'S CORE API?
|
|
||||||
3. WHAT ARE SOME EXAMPLE USES OF CORE RCU API?
|
:ref:`2. WHAT IS RCU'S CORE API? <2_whatisRCU>`
|
||||||
4. WHAT IF MY UPDATING THREAD CANNOT BLOCK?
|
|
||||||
5. WHAT ARE SOME SIMPLE IMPLEMENTATIONS OF RCU?
|
:ref:`3. WHAT ARE SOME EXAMPLE USES OF CORE RCU API? <3_whatisRCU>`
|
||||||
6. ANALOGY WITH READER-WRITER LOCKING
|
|
||||||
7. FULL LIST OF RCU APIs
|
:ref:`4. WHAT IF MY UPDATING THREAD CANNOT BLOCK? <4_whatisRCU>`
|
||||||
8. ANSWERS TO QUICK QUIZZES
|
|
||||||
|
:ref:`5. WHAT ARE SOME SIMPLE IMPLEMENTATIONS OF RCU? <5_whatisRCU>`
|
||||||
|
|
||||||
|
:ref:`6. ANALOGY WITH READER-WRITER LOCKING <6_whatisRCU>`
|
||||||
|
|
||||||
|
:ref:`7. FULL LIST OF RCU APIs <7_whatisRCU>`
|
||||||
|
|
||||||
|
:ref:`8. ANSWERS TO QUICK QUIZZES <8_whatisRCU>`
|
||||||
|
|
||||||
People who prefer starting with a conceptual overview should focus on
|
People who prefer starting with a conceptual overview should focus on
|
||||||
Section 1, though most readers will profit by reading this section at
|
Section 1, though most readers will profit by reading this section at
|
||||||
@@ -49,8 +59,10 @@ everything, feel free to read the whole thing -- but if you are really
|
|||||||
that type of person, you have perused the source code and will therefore
|
that type of person, you have perused the source code and will therefore
|
||||||
never need this document anyway. ;-)
|
never need this document anyway. ;-)
|
||||||
|
|
||||||
|
.. _1_whatisRCU:
|
||||||
|
|
||||||
1. RCU OVERVIEW
|
1. RCU OVERVIEW
|
||||||
|
----------------
|
||||||
|
|
||||||
The basic idea behind RCU is to split updates into "removal" and
|
The basic idea behind RCU is to split updates into "removal" and
|
||||||
"reclamation" phases. The removal phase removes references to data items
|
"reclamation" phases. The removal phase removes references to data items
|
||||||
@@ -116,8 +128,10 @@ So how the heck can a reclaimer tell when a reader is done, given
|
|||||||
that readers are not doing any sort of synchronization operations???
|
that readers are not doing any sort of synchronization operations???
|
||||||
Read on to learn about how RCU's API makes this easy.
|
Read on to learn about how RCU's API makes this easy.
|
||||||
|
|
||||||
|
.. _2_whatisRCU:
|
||||||
|
|
||||||
2. WHAT IS RCU'S CORE API?
|
2. WHAT IS RCU'S CORE API?
|
||||||
|
---------------------------
|
||||||
|
|
||||||
The core RCU API is quite small:
|
The core RCU API is quite small:
|
||||||
|
|
||||||
@@ -136,7 +150,7 @@ later. See the kernel docbook documentation for more info, or look directly
|
|||||||
at the function header comments.
|
at the function header comments.
|
||||||
|
|
||||||
rcu_read_lock()
|
rcu_read_lock()
|
||||||
|
^^^^^^^^^^^^^^^
|
||||||
void rcu_read_lock(void);
|
void rcu_read_lock(void);
|
||||||
|
|
||||||
Used by a reader to inform the reclaimer that the reader is
|
Used by a reader to inform the reclaimer that the reader is
|
||||||
@@ -150,7 +164,7 @@ rcu_read_lock()
|
|||||||
longer-term references to data structures.
|
longer-term references to data structures.
|
||||||
|
|
||||||
rcu_read_unlock()
|
rcu_read_unlock()
|
||||||
|
^^^^^^^^^^^^^^^^^
|
||||||
void rcu_read_unlock(void);
|
void rcu_read_unlock(void);
|
||||||
|
|
||||||
Used by a reader to inform the reclaimer that the reader is
|
Used by a reader to inform the reclaimer that the reader is
|
||||||
@@ -158,15 +172,15 @@ rcu_read_unlock()
|
|||||||
read-side critical sections may be nested and/or overlapping.
|
read-side critical sections may be nested and/or overlapping.
|
||||||
|
|
||||||
synchronize_rcu()
|
synchronize_rcu()
|
||||||
|
^^^^^^^^^^^^^^^^^
|
||||||
void synchronize_rcu(void);
|
void synchronize_rcu(void);
|
||||||
|
|
||||||
Marks the end of updater code and the beginning of reclaimer
|
Marks the end of updater code and the beginning of reclaimer
|
||||||
code. It does this by blocking until all pre-existing RCU
|
code. It does this by blocking until all pre-existing RCU
|
||||||
read-side critical sections on all CPUs have completed.
|
read-side critical sections on all CPUs have completed.
|
||||||
Note that synchronize_rcu() will -not- necessarily wait for
|
Note that synchronize_rcu() will **not** necessarily wait for
|
||||||
any subsequent RCU read-side critical sections to complete.
|
any subsequent RCU read-side critical sections to complete.
|
||||||
For example, consider the following sequence of events:
|
For example, consider the following sequence of events::
|
||||||
|
|
||||||
CPU 0 CPU 1 CPU 2
|
CPU 0 CPU 1 CPU 2
|
||||||
----------------- ------------------------- ---------------
|
----------------- ------------------------- ---------------
|
||||||
@@ -182,7 +196,7 @@ synchronize_rcu()
|
|||||||
any that begin after synchronize_rcu() is invoked.
|
any that begin after synchronize_rcu() is invoked.
|
||||||
|
|
||||||
Of course, synchronize_rcu() does not necessarily return
|
Of course, synchronize_rcu() does not necessarily return
|
||||||
-immediately- after the last pre-existing RCU read-side critical
|
**immediately** after the last pre-existing RCU read-side critical
|
||||||
section completes. For one thing, there might well be scheduling
|
section completes. For one thing, there might well be scheduling
|
||||||
delays. For another thing, many RCU implementations process
|
delays. For another thing, many RCU implementations process
|
||||||
requests in batches in order to improve efficiencies, which can
|
requests in batches in order to improve efficiencies, which can
|
||||||
@@ -211,10 +225,10 @@ synchronize_rcu()
|
|||||||
checklist.txt for some approaches to limiting the update rate.
|
checklist.txt for some approaches to limiting the update rate.
|
||||||
|
|
||||||
rcu_assign_pointer()
|
rcu_assign_pointer()
|
||||||
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
void rcu_assign_pointer(p, typeof(p) v);
|
void rcu_assign_pointer(p, typeof(p) v);
|
||||||
|
|
||||||
Yes, rcu_assign_pointer() -is- implemented as a macro, though it
|
Yes, rcu_assign_pointer() **is** implemented as a macro, though it
|
||||||
would be cool to be able to declare a function in this manner.
|
would be cool to be able to declare a function in this manner.
|
||||||
(Compiler experts will no doubt disagree.)
|
(Compiler experts will no doubt disagree.)
|
||||||
|
|
||||||
@@ -231,7 +245,7 @@ rcu_assign_pointer()
|
|||||||
the _rcu list-manipulation primitives such as list_add_rcu().
|
the _rcu list-manipulation primitives such as list_add_rcu().
|
||||||
|
|
||||||
rcu_dereference()
|
rcu_dereference()
|
||||||
|
^^^^^^^^^^^^^^^^^
|
||||||
typeof(p) rcu_dereference(p);
|
typeof(p) rcu_dereference(p);
|
||||||
|
|
||||||
Like rcu_assign_pointer(), rcu_dereference() must be implemented
|
Like rcu_assign_pointer(), rcu_dereference() must be implemented
|
||||||
@@ -248,13 +262,13 @@ rcu_dereference()
|
|||||||
|
|
||||||
Common coding practice uses rcu_dereference() to copy an
|
Common coding practice uses rcu_dereference() to copy an
|
||||||
RCU-protected pointer to a local variable, then dereferences
|
RCU-protected pointer to a local variable, then dereferences
|
||||||
this local variable, for example as follows:
|
this local variable, for example as follows::
|
||||||
|
|
||||||
p = rcu_dereference(head.next);
|
p = rcu_dereference(head.next);
|
||||||
return p->data;
|
return p->data;
|
||||||
|
|
||||||
However, in this case, one could just as easily combine these
|
However, in this case, one could just as easily combine these
|
||||||
into one statement:
|
into one statement::
|
||||||
|
|
||||||
return rcu_dereference(head.next)->data;
|
return rcu_dereference(head.next)->data;
|
||||||
|
|
||||||
@@ -266,8 +280,8 @@ rcu_dereference()
|
|||||||
unnecessary overhead on Alpha CPUs.
|
unnecessary overhead on Alpha CPUs.
|
||||||
|
|
||||||
Note that the value returned by rcu_dereference() is valid
|
Note that the value returned by rcu_dereference() is valid
|
||||||
only within the enclosing RCU read-side critical section [1].
|
only within the enclosing RCU read-side critical section [1]_.
|
||||||
For example, the following is -not- legal:
|
For example, the following is **not** legal::
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
p = rcu_dereference(head.next);
|
p = rcu_dereference(head.next);
|
||||||
@@ -290,9 +304,9 @@ rcu_dereference()
|
|||||||
at any time, including immediately after the rcu_dereference().
|
at any time, including immediately after the rcu_dereference().
|
||||||
And, again like rcu_assign_pointer(), rcu_dereference() is
|
And, again like rcu_assign_pointer(), rcu_dereference() is
|
||||||
typically used indirectly, via the _rcu list-manipulation
|
typically used indirectly, via the _rcu list-manipulation
|
||||||
primitives, such as list_for_each_entry_rcu() [2].
|
primitives, such as list_for_each_entry_rcu() [2]_.
|
||||||
|
|
||||||
[1] The variant rcu_dereference_protected() can be used outside
|
.. [1] The variant rcu_dereference_protected() can be used outside
|
||||||
of an RCU read-side critical section as long as the usage is
|
of an RCU read-side critical section as long as the usage is
|
||||||
protected by locks acquired by the update-side code. This variant
|
protected by locks acquired by the update-side code. This variant
|
||||||
avoids the lockdep warning that would happen when using (for
|
avoids the lockdep warning that would happen when using (for
|
||||||
@@ -305,7 +319,7 @@ rcu_dereference()
|
|||||||
a lockdep splat is emitted. See Documentation/RCU/Design/Requirements/Requirements.rst
|
a lockdep splat is emitted. See Documentation/RCU/Design/Requirements/Requirements.rst
|
||||||
and the API's code comments for more details and example usage.
|
and the API's code comments for more details and example usage.
|
||||||
|
|
||||||
[2] If the list_for_each_entry_rcu() instance might be used by
|
.. [2] If the list_for_each_entry_rcu() instance might be used by
|
||||||
update-side code as well as by RCU readers, then an additional
|
update-side code as well as by RCU readers, then an additional
|
||||||
lockdep expression can be added to its list of arguments.
|
lockdep expression can be added to its list of arguments.
|
||||||
For example, given an additional "lock_is_held(&mylock)" argument,
|
For example, given an additional "lock_is_held(&mylock)" argument,
|
||||||
@@ -315,6 +329,7 @@ rcu_dereference()
|
|||||||
|
|
||||||
The following diagram shows how each API communicates among the
|
The following diagram shows how each API communicates among the
|
||||||
reader, updater, and reclaimer.
|
reader, updater, and reclaimer.
|
||||||
|
::
|
||||||
|
|
||||||
|
|
||||||
rcu_assign_pointer()
|
rcu_assign_pointer()
|
||||||
@@ -375,12 +390,16 @@ c. RCU applied to scheduler and interrupt/NMI-handler tasks.
|
|||||||
Again, most uses will be of (a). The (b) and (c) cases are important
|
Again, most uses will be of (a). The (b) and (c) cases are important
|
||||||
for specialized uses, but are relatively uncommon.
|
for specialized uses, but are relatively uncommon.
|
||||||
|
|
||||||
|
.. _3_whatisRCU:
|
||||||
|
|
||||||
3. WHAT ARE SOME EXAMPLE USES OF CORE RCU API?
|
3. WHAT ARE SOME EXAMPLE USES OF CORE RCU API?
|
||||||
|
-----------------------------------------------
|
||||||
|
|
||||||
This section shows a simple use of the core RCU API to protect a
|
This section shows a simple use of the core RCU API to protect a
|
||||||
global pointer to a dynamically allocated structure. More-typical
|
global pointer to a dynamically allocated structure. More-typical
|
||||||
uses of RCU may be found in listRCU.txt, arrayRCU.txt, and NMI-RCU.txt.
|
uses of RCU may be found in :ref:`listRCU.rst <list_rcu_doc>`,
|
||||||
|
:ref:`arrayRCU.rst <array_rcu_doc>`, and :ref:`NMI-RCU.rst <NMI_rcu_doc>`.
|
||||||
|
::
|
||||||
|
|
||||||
struct foo {
|
struct foo {
|
||||||
int a;
|
int a;
|
||||||
@@ -440,40 +459,43 @@ uses of RCU may be found in listRCU.txt, arrayRCU.txt, and NMI-RCU.txt.
|
|||||||
|
|
||||||
So, to sum up:
|
So, to sum up:
|
||||||
|
|
||||||
o Use rcu_read_lock() and rcu_read_unlock() to guard RCU
|
- Use rcu_read_lock() and rcu_read_unlock() to guard RCU
|
||||||
read-side critical sections.
|
read-side critical sections.
|
||||||
|
|
||||||
o Within an RCU read-side critical section, use rcu_dereference()
|
- Within an RCU read-side critical section, use rcu_dereference()
|
||||||
to dereference RCU-protected pointers.
|
to dereference RCU-protected pointers.
|
||||||
|
|
||||||
o Use some solid scheme (such as locks or semaphores) to
|
- Use some solid scheme (such as locks or semaphores) to
|
||||||
keep concurrent updates from interfering with each other.
|
keep concurrent updates from interfering with each other.
|
||||||
|
|
||||||
o Use rcu_assign_pointer() to update an RCU-protected pointer.
|
- Use rcu_assign_pointer() to update an RCU-protected pointer.
|
||||||
This primitive protects concurrent readers from the updater,
|
This primitive protects concurrent readers from the updater,
|
||||||
-not- concurrent updates from each other! You therefore still
|
**not** concurrent updates from each other! You therefore still
|
||||||
need to use locking (or something similar) to keep concurrent
|
need to use locking (or something similar) to keep concurrent
|
||||||
rcu_assign_pointer() primitives from interfering with each other.
|
rcu_assign_pointer() primitives from interfering with each other.
|
||||||
|
|
||||||
o Use synchronize_rcu() -after- removing a data element from an
|
- Use synchronize_rcu() **after** removing a data element from an
|
||||||
RCU-protected data structure, but -before- reclaiming/freeing
|
RCU-protected data structure, but **before** reclaiming/freeing
|
||||||
the data element, in order to wait for the completion of all
|
the data element, in order to wait for the completion of all
|
||||||
RCU read-side critical sections that might be referencing that
|
RCU read-side critical sections that might be referencing that
|
||||||
data item.
|
data item.
|
||||||
|
|
||||||
See checklist.txt for additional rules to follow when using RCU.
|
See checklist.txt for additional rules to follow when using RCU.
|
||||||
And again, more-typical uses of RCU may be found in listRCU.txt,
|
And again, more-typical uses of RCU may be found in :ref:`listRCU.rst
|
||||||
arrayRCU.txt, and NMI-RCU.txt.
|
<list_rcu_doc>`, :ref:`arrayRCU.rst <array_rcu_doc>`, and :ref:`NMI-RCU.rst
|
||||||
|
<NMI_rcu_doc>`.
|
||||||
|
|
||||||
|
.. _4_whatisRCU:
|
||||||
|
|
||||||
4. WHAT IF MY UPDATING THREAD CANNOT BLOCK?
|
4. WHAT IF MY UPDATING THREAD CANNOT BLOCK?
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
In the example above, foo_update_a() blocks until a grace period elapses.
|
In the example above, foo_update_a() blocks until a grace period elapses.
|
||||||
This is quite simple, but in some cases one cannot afford to wait so
|
This is quite simple, but in some cases one cannot afford to wait so
|
||||||
long -- there might be other high-priority work to be done.
|
long -- there might be other high-priority work to be done.
|
||||||
|
|
||||||
In such cases, one uses call_rcu() rather than synchronize_rcu().
|
In such cases, one uses call_rcu() rather than synchronize_rcu().
|
||||||
The call_rcu() API is as follows:
|
The call_rcu() API is as follows::
|
||||||
|
|
||||||
void call_rcu(struct rcu_head * head,
|
void call_rcu(struct rcu_head * head,
|
||||||
void (*func)(struct rcu_head *head));
|
void (*func)(struct rcu_head *head));
|
||||||
@@ -481,7 +503,7 @@ The call_rcu() API is as follows:
|
|||||||
This function invokes func(head) after a grace period has elapsed.
|
This function invokes func(head) after a grace period has elapsed.
|
||||||
This invocation might happen from either softirq or process context,
|
This invocation might happen from either softirq or process context,
|
||||||
so the function is not permitted to block. The foo struct needs to
|
so the function is not permitted to block. The foo struct needs to
|
||||||
have an rcu_head structure added, perhaps as follows:
|
have an rcu_head structure added, perhaps as follows::
|
||||||
|
|
||||||
struct foo {
|
struct foo {
|
||||||
int a;
|
int a;
|
||||||
@@ -490,7 +512,7 @@ have an rcu_head structure added, perhaps as follows:
|
|||||||
struct rcu_head rcu;
|
struct rcu_head rcu;
|
||||||
};
|
};
|
||||||
|
|
||||||
The foo_update_a() function might then be written as follows:
|
The foo_update_a() function might then be written as follows::
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a new struct foo that is the same as the one currently
|
* Create a new struct foo that is the same as the one currently
|
||||||
@@ -520,7 +542,7 @@ The foo_update_a() function might then be written as follows:
|
|||||||
call_rcu(&old_fp->rcu, foo_reclaim);
|
call_rcu(&old_fp->rcu, foo_reclaim);
|
||||||
}
|
}
|
||||||
|
|
||||||
The foo_reclaim() function might appear as follows:
|
The foo_reclaim() function might appear as follows::
|
||||||
|
|
||||||
void foo_reclaim(struct rcu_head *rp)
|
void foo_reclaim(struct rcu_head *rp)
|
||||||
{
|
{
|
||||||
@@ -544,7 +566,7 @@ namely foo_reclaim().
|
|||||||
The summary of advice is the same as for the previous section, except
|
The summary of advice is the same as for the previous section, except
|
||||||
that we are now using call_rcu() rather than synchronize_rcu():
|
that we are now using call_rcu() rather than synchronize_rcu():
|
||||||
|
|
||||||
o Use call_rcu() -after- removing a data element from an
|
- Use call_rcu() **after** removing a data element from an
|
||||||
RCU-protected data structure in order to register a callback
|
RCU-protected data structure in order to register a callback
|
||||||
function that will be invoked after the completion of all RCU
|
function that will be invoked after the completion of all RCU
|
||||||
read-side critical sections that might be referencing that
|
read-side critical sections that might be referencing that
|
||||||
@@ -552,14 +574,16 @@ o Use call_rcu() -after- removing a data element from an
|
|||||||
|
|
||||||
If the callback for call_rcu() is not doing anything more than calling
|
If the callback for call_rcu() is not doing anything more than calling
|
||||||
kfree() on the structure, you can use kfree_rcu() instead of call_rcu()
|
kfree() on the structure, you can use kfree_rcu() instead of call_rcu()
|
||||||
to avoid having to write your own callback:
|
to avoid having to write your own callback::
|
||||||
|
|
||||||
kfree_rcu(old_fp, rcu);
|
kfree_rcu(old_fp, rcu);
|
||||||
|
|
||||||
Again, see checklist.txt for additional rules governing the use of RCU.
|
Again, see checklist.txt for additional rules governing the use of RCU.
|
||||||
|
|
||||||
|
.. _5_whatisRCU:
|
||||||
|
|
||||||
5. WHAT ARE SOME SIMPLE IMPLEMENTATIONS OF RCU?
|
5. WHAT ARE SOME SIMPLE IMPLEMENTATIONS OF RCU?
|
||||||
|
------------------------------------------------
|
||||||
|
|
||||||
One of the nice things about RCU is that it has extremely simple "toy"
|
One of the nice things about RCU is that it has extremely simple "toy"
|
||||||
implementations that are a good first step towards understanding the
|
implementations that are a good first step towards understanding the
|
||||||
@@ -579,7 +603,7 @@ more details on the current implementation as of early 2004.
|
|||||||
|
|
||||||
|
|
||||||
5A. "TOY" IMPLEMENTATION #1: LOCKING
|
5A. "TOY" IMPLEMENTATION #1: LOCKING
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
This section presents a "toy" RCU implementation that is based on
|
This section presents a "toy" RCU implementation that is based on
|
||||||
familiar locking primitives. Its overhead makes it a non-starter for
|
familiar locking primitives. Its overhead makes it a non-starter for
|
||||||
real-life use, as does its lack of scalability. It is also unsuitable
|
real-life use, as does its lack of scalability. It is also unsuitable
|
||||||
@@ -591,7 +615,7 @@ you allow nested rcu_read_lock() calls, you can deadlock.
|
|||||||
However, it is probably the easiest implementation to relate to, so is
|
However, it is probably the easiest implementation to relate to, so is
|
||||||
a good starting point.
|
a good starting point.
|
||||||
|
|
||||||
It is extremely simple:
|
It is extremely simple::
|
||||||
|
|
||||||
static DEFINE_RWLOCK(rcu_gp_mutex);
|
static DEFINE_RWLOCK(rcu_gp_mutex);
|
||||||
|
|
||||||
@@ -614,7 +638,7 @@ It is extremely simple:
|
|||||||
|
|
||||||
[You can ignore rcu_assign_pointer() and rcu_dereference() without missing
|
[You can ignore rcu_assign_pointer() and rcu_dereference() without missing
|
||||||
much. But here are simplified versions anyway. And whatever you do,
|
much. But here are simplified versions anyway. And whatever you do,
|
||||||
don't forget about them when submitting patches making use of RCU!]
|
don't forget about them when submitting patches making use of RCU!]::
|
||||||
|
|
||||||
#define rcu_assign_pointer(p, v) \
|
#define rcu_assign_pointer(p, v) \
|
||||||
({ \
|
({ \
|
||||||
@@ -647,18 +671,23 @@ that the only thing that can block rcu_read_lock() is a synchronize_rcu().
|
|||||||
But synchronize_rcu() does not acquire any locks while holding rcu_gp_mutex,
|
But synchronize_rcu() does not acquire any locks while holding rcu_gp_mutex,
|
||||||
so there can be no deadlock cycle.
|
so there can be no deadlock cycle.
|
||||||
|
|
||||||
Quick Quiz #1: Why is this argument naive? How could a deadlock
|
.. _quiz_1:
|
||||||
|
|
||||||
|
Quick Quiz #1:
|
||||||
|
Why is this argument naive? How could a deadlock
|
||||||
occur when using this algorithm in a real-world Linux
|
occur when using this algorithm in a real-world Linux
|
||||||
kernel? How could this deadlock be avoided?
|
kernel? How could this deadlock be avoided?
|
||||||
|
|
||||||
|
:ref:`Answers to Quick Quiz <8_whatisRCU>`
|
||||||
|
|
||||||
5B. "TOY" EXAMPLE #2: CLASSIC RCU
|
5B. "TOY" EXAMPLE #2: CLASSIC RCU
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
This section presents a "toy" RCU implementation that is based on
|
This section presents a "toy" RCU implementation that is based on
|
||||||
"classic RCU". It is also short on performance (but only for updates) and
|
"classic RCU". It is also short on performance (but only for updates) and
|
||||||
on features such as hotplug CPU and the ability to run in CONFIG_PREEMPT
|
on features such as hotplug CPU and the ability to run in CONFIG_PREEMPT
|
||||||
kernels. The definitions of rcu_dereference() and rcu_assign_pointer()
|
kernels. The definitions of rcu_dereference() and rcu_assign_pointer()
|
||||||
are the same as those shown in the preceding section, so they are omitted.
|
are the same as those shown in the preceding section, so they are omitted.
|
||||||
|
::
|
||||||
|
|
||||||
void rcu_read_lock(void) { }
|
void rcu_read_lock(void) { }
|
||||||
|
|
||||||
@@ -683,14 +712,14 @@ CPU in turn. The run_on() primitive can be implemented straightforwardly
|
|||||||
in terms of the sched_setaffinity() primitive. Of course, a somewhat less
|
in terms of the sched_setaffinity() primitive. Of course, a somewhat less
|
||||||
"toy" implementation would restore the affinity upon completion rather
|
"toy" implementation would restore the affinity upon completion rather
|
||||||
than just leaving all tasks running on the last CPU, but when I said
|
than just leaving all tasks running on the last CPU, but when I said
|
||||||
"toy", I meant -toy-!
|
"toy", I meant **toy**!
|
||||||
|
|
||||||
So how the heck is this supposed to work???
|
So how the heck is this supposed to work???
|
||||||
|
|
||||||
Remember that it is illegal to block while in an RCU read-side critical
|
Remember that it is illegal to block while in an RCU read-side critical
|
||||||
section. Therefore, if a given CPU executes a context switch, we know
|
section. Therefore, if a given CPU executes a context switch, we know
|
||||||
that it must have completed all preceding RCU read-side critical sections.
|
that it must have completed all preceding RCU read-side critical sections.
|
||||||
Once -all- CPUs have executed a context switch, then -all- preceding
|
Once **all** CPUs have executed a context switch, then **all** preceding
|
||||||
RCU read-side critical sections will have completed.
|
RCU read-side critical sections will have completed.
|
||||||
|
|
||||||
So, suppose that we remove a data item from its structure and then invoke
|
So, suppose that we remove a data item from its structure and then invoke
|
||||||
@@ -698,19 +727,32 @@ synchronize_rcu(). Once synchronize_rcu() returns, we are guaranteed
|
|||||||
that there are no RCU read-side critical sections holding a reference
|
that there are no RCU read-side critical sections holding a reference
|
||||||
to that data item, so we can safely reclaim it.
|
to that data item, so we can safely reclaim it.
|
||||||
|
|
||||||
Quick Quiz #2: Give an example where Classic RCU's read-side
|
.. _quiz_2:
|
||||||
overhead is -negative-.
|
|
||||||
|
|
||||||
Quick Quiz #3: If it is illegal to block in an RCU read-side
|
Quick Quiz #2:
|
||||||
|
Give an example where Classic RCU's read-side
|
||||||
|
overhead is **negative**.
|
||||||
|
|
||||||
|
:ref:`Answers to Quick Quiz <8_whatisRCU>`
|
||||||
|
|
||||||
|
.. _quiz_3:
|
||||||
|
|
||||||
|
Quick Quiz #3:
|
||||||
|
If it is illegal to block in an RCU read-side
|
||||||
critical section, what the heck do you do in
|
critical section, what the heck do you do in
|
||||||
PREEMPT_RT, where normal spinlocks can block???
|
PREEMPT_RT, where normal spinlocks can block???
|
||||||
|
|
||||||
|
:ref:`Answers to Quick Quiz <8_whatisRCU>`
|
||||||
|
|
||||||
|
.. _6_whatisRCU:
|
||||||
|
|
||||||
6. ANALOGY WITH READER-WRITER LOCKING
|
6. ANALOGY WITH READER-WRITER LOCKING
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
Although RCU can be used in many different ways, a very common use of
|
Although RCU can be used in many different ways, a very common use of
|
||||||
RCU is analogous to reader-writer locking. The following unified
|
RCU is analogous to reader-writer locking. The following unified
|
||||||
diff shows how closely related RCU and reader-writer locking can be.
|
diff shows how closely related RCU and reader-writer locking can be.
|
||||||
|
::
|
||||||
|
|
||||||
@@ -5,5 +5,5 @@ struct el {
|
@@ -5,5 +5,5 @@ struct el {
|
||||||
int data;
|
int data;
|
||||||
@@ -762,7 +804,7 @@ diff shows how closely related RCU and reader-writer locking can be.
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Or, for those who prefer a side-by-side listing:
|
Or, for those who prefer a side-by-side listing::
|
||||||
|
|
||||||
1 struct el { 1 struct el {
|
1 struct el { 1 struct el {
|
||||||
2 struct list_head list; 2 struct list_head list;
|
2 struct list_head list; 2 struct list_head list;
|
||||||
@@ -774,40 +816,44 @@ Or, for those who prefer a side-by-side listing:
|
|||||||
8 rwlock_t listmutex; 8 spinlock_t listmutex;
|
8 rwlock_t listmutex; 8 spinlock_t listmutex;
|
||||||
9 struct el head; 9 struct el head;
|
9 struct el head; 9 struct el head;
|
||||||
|
|
||||||
1 int search(long key, int *result) 1 int search(long key, int *result)
|
::
|
||||||
2 { 2 {
|
|
||||||
3 struct list_head *lp; 3 struct list_head *lp;
|
|
||||||
4 struct el *p; 4 struct el *p;
|
|
||||||
5 5
|
|
||||||
6 read_lock(&listmutex); 6 rcu_read_lock();
|
|
||||||
7 list_for_each_entry(p, head, lp) { 7 list_for_each_entry_rcu(p, head, lp) {
|
|
||||||
8 if (p->key == key) { 8 if (p->key == key) {
|
|
||||||
9 *result = p->data; 9 *result = p->data;
|
|
||||||
10 read_unlock(&listmutex); 10 rcu_read_unlock();
|
|
||||||
11 return 1; 11 return 1;
|
|
||||||
12 } 12 }
|
|
||||||
13 } 13 }
|
|
||||||
14 read_unlock(&listmutex); 14 rcu_read_unlock();
|
|
||||||
15 return 0; 15 return 0;
|
|
||||||
16 } 16 }
|
|
||||||
|
|
||||||
1 int delete(long key) 1 int delete(long key)
|
1 int search(long key, int *result) 1 int search(long key, int *result)
|
||||||
2 { 2 {
|
2 { 2 {
|
||||||
3 struct el *p; 3 struct el *p;
|
3 struct list_head *lp; 3 struct list_head *lp;
|
||||||
4 4
|
4 struct el *p; 4 struct el *p;
|
||||||
5 write_lock(&listmutex); 5 spin_lock(&listmutex);
|
5 5
|
||||||
6 list_for_each_entry(p, head, lp) { 6 list_for_each_entry(p, head, lp) {
|
6 read_lock(&listmutex); 6 rcu_read_lock();
|
||||||
7 if (p->key == key) { 7 if (p->key == key) {
|
7 list_for_each_entry(p, head, lp) { 7 list_for_each_entry_rcu(p, head, lp) {
|
||||||
8 list_del(&p->list); 8 list_del_rcu(&p->list);
|
8 if (p->key == key) { 8 if (p->key == key) {
|
||||||
9 write_unlock(&listmutex); 9 spin_unlock(&listmutex);
|
9 *result = p->data; 9 *result = p->data;
|
||||||
10 synchronize_rcu();
|
10 read_unlock(&listmutex); 10 rcu_read_unlock();
|
||||||
10 kfree(p); 11 kfree(p);
|
11 return 1; 11 return 1;
|
||||||
11 return 1; 12 return 1;
|
12 } 12 }
|
||||||
12 } 13 }
|
13 } 13 }
|
||||||
13 } 14 }
|
14 read_unlock(&listmutex); 14 rcu_read_unlock();
|
||||||
14 write_unlock(&listmutex); 15 spin_unlock(&listmutex);
|
15 return 0; 15 return 0;
|
||||||
15 return 0; 16 return 0;
|
16 } 16 }
|
||||||
16 } 17 }
|
|
||||||
|
::
|
||||||
|
|
||||||
|
1 int delete(long key) 1 int delete(long key)
|
||||||
|
2 { 2 {
|
||||||
|
3 struct el *p; 3 struct el *p;
|
||||||
|
4 4
|
||||||
|
5 write_lock(&listmutex); 5 spin_lock(&listmutex);
|
||||||
|
6 list_for_each_entry(p, head, lp) { 6 list_for_each_entry(p, head, lp) {
|
||||||
|
7 if (p->key == key) { 7 if (p->key == key) {
|
||||||
|
8 list_del(&p->list); 8 list_del_rcu(&p->list);
|
||||||
|
9 write_unlock(&listmutex); 9 spin_unlock(&listmutex);
|
||||||
|
10 synchronize_rcu();
|
||||||
|
10 kfree(p); 11 kfree(p);
|
||||||
|
11 return 1; 12 return 1;
|
||||||
|
12 } 13 }
|
||||||
|
13 } 14 }
|
||||||
|
14 write_unlock(&listmutex); 15 spin_unlock(&listmutex);
|
||||||
|
15 return 0; 16 return 0;
|
||||||
|
16 } 17 }
|
||||||
|
|
||||||
Either way, the differences are quite small. Read-side locking moves
|
Either way, the differences are quite small. Read-side locking moves
|
||||||
to rcu_read_lock() and rcu_read_unlock, update-side locking moves from
|
to rcu_read_lock() and rcu_read_unlock, update-side locking moves from
|
||||||
@@ -825,22 +871,27 @@ delete() can now block. If this is a problem, there is a callback-based
|
|||||||
mechanism that never blocks, namely call_rcu() or kfree_rcu(), that can
|
mechanism that never blocks, namely call_rcu() or kfree_rcu(), that can
|
||||||
be used in place of synchronize_rcu().
|
be used in place of synchronize_rcu().
|
||||||
|
|
||||||
|
.. _7_whatisRCU:
|
||||||
|
|
||||||
7. FULL LIST OF RCU APIs
|
7. FULL LIST OF RCU APIs
|
||||||
|
-------------------------
|
||||||
|
|
||||||
The RCU APIs are documented in docbook-format header comments in the
|
The RCU APIs are documented in docbook-format header comments in the
|
||||||
Linux-kernel source code, but it helps to have a full list of the
|
Linux-kernel source code, but it helps to have a full list of the
|
||||||
APIs, since there does not appear to be a way to categorize them
|
APIs, since there does not appear to be a way to categorize them
|
||||||
in docbook. Here is the list, by category.
|
in docbook. Here is the list, by category.
|
||||||
|
|
||||||
RCU list traversal:
|
RCU list traversal::
|
||||||
|
|
||||||
list_entry_rcu
|
list_entry_rcu
|
||||||
|
list_entry_lockless
|
||||||
list_first_entry_rcu
|
list_first_entry_rcu
|
||||||
list_next_rcu
|
list_next_rcu
|
||||||
list_for_each_entry_rcu
|
list_for_each_entry_rcu
|
||||||
list_for_each_entry_continue_rcu
|
list_for_each_entry_continue_rcu
|
||||||
list_for_each_entry_from_rcu
|
list_for_each_entry_from_rcu
|
||||||
|
list_first_or_null_rcu
|
||||||
|
list_next_or_null_rcu
|
||||||
hlist_first_rcu
|
hlist_first_rcu
|
||||||
hlist_next_rcu
|
hlist_next_rcu
|
||||||
hlist_pprev_rcu
|
hlist_pprev_rcu
|
||||||
@@ -854,7 +905,7 @@ RCU list traversal:
|
|||||||
hlist_bl_first_rcu
|
hlist_bl_first_rcu
|
||||||
hlist_bl_for_each_entry_rcu
|
hlist_bl_for_each_entry_rcu
|
||||||
|
|
||||||
RCU pointer/list update:
|
RCU pointer/list update::
|
||||||
|
|
||||||
rcu_assign_pointer
|
rcu_assign_pointer
|
||||||
list_add_rcu
|
list_add_rcu
|
||||||
@@ -864,10 +915,12 @@ RCU pointer/list update:
|
|||||||
hlist_add_behind_rcu
|
hlist_add_behind_rcu
|
||||||
hlist_add_before_rcu
|
hlist_add_before_rcu
|
||||||
hlist_add_head_rcu
|
hlist_add_head_rcu
|
||||||
|
hlist_add_tail_rcu
|
||||||
hlist_del_rcu
|
hlist_del_rcu
|
||||||
hlist_del_init_rcu
|
hlist_del_init_rcu
|
||||||
hlist_replace_rcu
|
hlist_replace_rcu
|
||||||
list_splice_init_rcu()
|
list_splice_init_rcu
|
||||||
|
list_splice_tail_init_rcu
|
||||||
hlist_nulls_del_init_rcu
|
hlist_nulls_del_init_rcu
|
||||||
hlist_nulls_del_rcu
|
hlist_nulls_del_rcu
|
||||||
hlist_nulls_add_head_rcu
|
hlist_nulls_add_head_rcu
|
||||||
@@ -876,7 +929,9 @@ RCU pointer/list update:
|
|||||||
hlist_bl_del_rcu
|
hlist_bl_del_rcu
|
||||||
hlist_bl_set_first_rcu
|
hlist_bl_set_first_rcu
|
||||||
|
|
||||||
RCU: Critical sections Grace period Barrier
|
RCU::
|
||||||
|
|
||||||
|
Critical sections Grace period Barrier
|
||||||
|
|
||||||
rcu_read_lock synchronize_net rcu_barrier
|
rcu_read_lock synchronize_net rcu_barrier
|
||||||
rcu_read_unlock synchronize_rcu
|
rcu_read_unlock synchronize_rcu
|
||||||
@@ -885,7 +940,9 @@ RCU: Critical sections Grace period Barrier
|
|||||||
rcu_dereference_check kfree_rcu
|
rcu_dereference_check kfree_rcu
|
||||||
rcu_dereference_protected
|
rcu_dereference_protected
|
||||||
|
|
||||||
bh: Critical sections Grace period Barrier
|
bh::
|
||||||
|
|
||||||
|
Critical sections Grace period Barrier
|
||||||
|
|
||||||
rcu_read_lock_bh call_rcu rcu_barrier
|
rcu_read_lock_bh call_rcu rcu_barrier
|
||||||
rcu_read_unlock_bh synchronize_rcu
|
rcu_read_unlock_bh synchronize_rcu
|
||||||
@@ -896,7 +953,9 @@ bh: Critical sections Grace period Barrier
|
|||||||
rcu_dereference_bh_protected
|
rcu_dereference_bh_protected
|
||||||
rcu_read_lock_bh_held
|
rcu_read_lock_bh_held
|
||||||
|
|
||||||
sched: Critical sections Grace period Barrier
|
sched::
|
||||||
|
|
||||||
|
Critical sections Grace period Barrier
|
||||||
|
|
||||||
rcu_read_lock_sched call_rcu rcu_barrier
|
rcu_read_lock_sched call_rcu rcu_barrier
|
||||||
rcu_read_unlock_sched synchronize_rcu
|
rcu_read_unlock_sched synchronize_rcu
|
||||||
@@ -910,7 +969,9 @@ sched: Critical sections Grace period Barrier
|
|||||||
rcu_read_lock_sched_held
|
rcu_read_lock_sched_held
|
||||||
|
|
||||||
|
|
||||||
SRCU: Critical sections Grace period Barrier
|
SRCU::
|
||||||
|
|
||||||
|
Critical sections Grace period Barrier
|
||||||
|
|
||||||
srcu_read_lock call_srcu srcu_barrier
|
srcu_read_lock call_srcu srcu_barrier
|
||||||
srcu_read_unlock synchronize_srcu
|
srcu_read_unlock synchronize_srcu
|
||||||
@@ -918,13 +979,14 @@ SRCU: Critical sections Grace period Barrier
|
|||||||
srcu_dereference_check
|
srcu_dereference_check
|
||||||
srcu_read_lock_held
|
srcu_read_lock_held
|
||||||
|
|
||||||
SRCU: Initialization/cleanup
|
SRCU: Initialization/cleanup::
|
||||||
|
|
||||||
DEFINE_SRCU
|
DEFINE_SRCU
|
||||||
DEFINE_STATIC_SRCU
|
DEFINE_STATIC_SRCU
|
||||||
init_srcu_struct
|
init_srcu_struct
|
||||||
cleanup_srcu_struct
|
cleanup_srcu_struct
|
||||||
|
|
||||||
All: lockdep-checked RCU-protected pointer access
|
All: lockdep-checked RCU-protected pointer access::
|
||||||
|
|
||||||
rcu_access_pointer
|
rcu_access_pointer
|
||||||
rcu_dereference_raw
|
rcu_dereference_raw
|
||||||
@@ -974,15 +1036,19 @@ g. Otherwise, use RCU.
|
|||||||
Of course, this all assumes that you have determined that RCU is in fact
|
Of course, this all assumes that you have determined that RCU is in fact
|
||||||
the right tool for your job.
|
the right tool for your job.
|
||||||
|
|
||||||
|
.. _8_whatisRCU:
|
||||||
|
|
||||||
8. ANSWERS TO QUICK QUIZZES
|
8. ANSWERS TO QUICK QUIZZES
|
||||||
|
----------------------------
|
||||||
|
|
||||||
Quick Quiz #1: Why is this argument naive? How could a deadlock
|
Quick Quiz #1:
|
||||||
|
Why is this argument naive? How could a deadlock
|
||||||
occur when using this algorithm in a real-world Linux
|
occur when using this algorithm in a real-world Linux
|
||||||
kernel? [Referring to the lock-based "toy" RCU
|
kernel? [Referring to the lock-based "toy" RCU
|
||||||
algorithm.]
|
algorithm.]
|
||||||
|
|
||||||
Answer: Consider the following sequence of events:
|
Answer:
|
||||||
|
Consider the following sequence of events:
|
||||||
|
|
||||||
1. CPU 0 acquires some unrelated lock, call it
|
1. CPU 0 acquires some unrelated lock, call it
|
||||||
"problematic_lock", disabling irq via
|
"problematic_lock", disabling irq via
|
||||||
@@ -1021,10 +1087,14 @@ Answer: Consider the following sequence of events:
|
|||||||
approach where tasks in RCU read-side critical sections
|
approach where tasks in RCU read-side critical sections
|
||||||
cannot be blocked by tasks executing synchronize_rcu().
|
cannot be blocked by tasks executing synchronize_rcu().
|
||||||
|
|
||||||
Quick Quiz #2: Give an example where Classic RCU's read-side
|
:ref:`Back to Quick Quiz #1 <quiz_1>`
|
||||||
overhead is -negative-.
|
|
||||||
|
|
||||||
Answer: Imagine a single-CPU system with a non-CONFIG_PREEMPT
|
Quick Quiz #2:
|
||||||
|
Give an example where Classic RCU's read-side
|
||||||
|
overhead is **negative**.
|
||||||
|
|
||||||
|
Answer:
|
||||||
|
Imagine a single-CPU system with a non-CONFIG_PREEMPT
|
||||||
kernel where a routing table is used by process-context
|
kernel where a routing table is used by process-context
|
||||||
code, but can be updated by irq-context code (for example,
|
code, but can be updated by irq-context code (for example,
|
||||||
by an "ICMP REDIRECT" packet). The usual way of handling
|
by an "ICMP REDIRECT" packet). The usual way of handling
|
||||||
@@ -1046,11 +1116,15 @@ Answer: Imagine a single-CPU system with a non-CONFIG_PREEMPT
|
|||||||
even the theoretical possibility of negative overhead for
|
even the theoretical possibility of negative overhead for
|
||||||
a synchronization primitive is a bit unexpected. ;-)
|
a synchronization primitive is a bit unexpected. ;-)
|
||||||
|
|
||||||
Quick Quiz #3: If it is illegal to block in an RCU read-side
|
:ref:`Back to Quick Quiz #2 <quiz_2>`
|
||||||
|
|
||||||
|
Quick Quiz #3:
|
||||||
|
If it is illegal to block in an RCU read-side
|
||||||
critical section, what the heck do you do in
|
critical section, what the heck do you do in
|
||||||
PREEMPT_RT, where normal spinlocks can block???
|
PREEMPT_RT, where normal spinlocks can block???
|
||||||
|
|
||||||
Answer: Just as PREEMPT_RT permits preemption of spinlock
|
Answer:
|
||||||
|
Just as PREEMPT_RT permits preemption of spinlock
|
||||||
critical sections, it permits preemption of RCU
|
critical sections, it permits preemption of RCU
|
||||||
read-side critical sections. It also permits
|
read-side critical sections. It also permits
|
||||||
spinlocks blocking while in RCU read-side critical
|
spinlocks blocking while in RCU read-side critical
|
||||||
@@ -1069,6 +1143,7 @@ Answer: Just as PREEMPT_RT permits preemption of spinlock
|
|||||||
Besides, how does the computer know what pizza parlor
|
Besides, how does the computer know what pizza parlor
|
||||||
the human being went to???
|
the human being went to???
|
||||||
|
|
||||||
|
:ref:`Back to Quick Quiz #3 <quiz_3>`
|
||||||
|
|
||||||
ACKNOWLEDGEMENTS
|
ACKNOWLEDGEMENTS
|
||||||
|
|
62
Documentation/admin-guide/acpi/fan_performance_states.rst
Normal file
62
Documentation/admin-guide/acpi/fan_performance_states.rst
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
===========================
|
||||||
|
ACPI Fan Performance States
|
||||||
|
===========================
|
||||||
|
|
||||||
|
When the optional _FPS object is present under an ACPI device representing a
|
||||||
|
fan (for example, PNP0C0B or INT3404), the ACPI fan driver creates additional
|
||||||
|
"state*" attributes in the sysfs directory of the ACPI device in question.
|
||||||
|
These attributes list properties of fan performance states.
|
||||||
|
|
||||||
|
For more information on _FPS refer to the ACPI specification at:
|
||||||
|
|
||||||
|
http://uefi.org/specifications
|
||||||
|
|
||||||
|
For instance, the contents of the INT3404 ACPI device sysfs directory
|
||||||
|
may look as follows::
|
||||||
|
|
||||||
|
$ ls -l /sys/bus/acpi/devices/INT3404:00/
|
||||||
|
total 0
|
||||||
|
...
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 20:38 state0
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 20:38 state1
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 20:38 state10
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 20:38 state11
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 20:38 state2
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 20:38 state3
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 20:38 state4
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 20:38 state5
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 20:38 state6
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 20:38 state7
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 20:38 state8
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 20:38 state9
|
||||||
|
-r--r--r-- 1 root root 4096 Dec 13 01:00 status
|
||||||
|
...
|
||||||
|
|
||||||
|
where each of the "state*" files represents one performance state of the fan
|
||||||
|
and contains a colon-separated list of 5 integer numbers (fields) with the
|
||||||
|
following interpretation::
|
||||||
|
|
||||||
|
control_percent:trip_point_index:speed_rpm:noise_level_mdb:power_mw
|
||||||
|
|
||||||
|
* ``control_percent``: The percent value to be used to set the fan speed to a
|
||||||
|
specific level using the _FSL object (0-100).
|
||||||
|
|
||||||
|
* ``trip_point_index``: The active cooling trip point number that corresponds
|
||||||
|
to this performance state (0-9).
|
||||||
|
|
||||||
|
* ``speed_rpm``: Speed of the fan in rotations per minute.
|
||||||
|
|
||||||
|
* ``noise_level_mdb``: Audible noise emitted by the fan in this state in
|
||||||
|
millidecibels.
|
||||||
|
|
||||||
|
* ``power_mw``: Power draw of the fan in this state in milliwatts.
|
||||||
|
|
||||||
|
For example::
|
||||||
|
|
||||||
|
$cat /sys/bus/acpi/devices/INT3404:00/state1
|
||||||
|
25:0:3200:12500:1250
|
||||||
|
|
||||||
|
When a given field is not populated or its value provided by the platform
|
||||||
|
firmware is invalid, the "not-defined" string is shown instead of the value.
|
@@ -12,3 +12,4 @@ the Linux ACPI support.
|
|||||||
dsdt-override
|
dsdt-override
|
||||||
ssdt-overlays
|
ssdt-overlays
|
||||||
cppc_sysfs
|
cppc_sysfs
|
||||||
|
fan_performance_states
|
||||||
|
@@ -61,6 +61,8 @@ v1 is available under Documentation/admin-guide/cgroup-v1/.
|
|||||||
5-6. Device
|
5-6. Device
|
||||||
5-7. RDMA
|
5-7. RDMA
|
||||||
5-7-1. RDMA Interface Files
|
5-7-1. RDMA Interface Files
|
||||||
|
5-8. HugeTLB
|
||||||
|
5.8-1. HugeTLB Interface Files
|
||||||
5-8. Misc
|
5-8. Misc
|
||||||
5-8-1. perf_event
|
5-8-1. perf_event
|
||||||
5-N. Non-normative information
|
5-N. Non-normative information
|
||||||
@@ -2056,6 +2058,33 @@ RDMA Interface Files
|
|||||||
mlx4_0 hca_handle=1 hca_object=20
|
mlx4_0 hca_handle=1 hca_object=20
|
||||||
ocrdma1 hca_handle=1 hca_object=23
|
ocrdma1 hca_handle=1 hca_object=23
|
||||||
|
|
||||||
|
HugeTLB
|
||||||
|
-------
|
||||||
|
|
||||||
|
The HugeTLB controller allows to limit the HugeTLB usage per control group and
|
||||||
|
enforces the controller limit during page fault.
|
||||||
|
|
||||||
|
HugeTLB Interface Files
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
hugetlb.<hugepagesize>.current
|
||||||
|
Show current usage for "hugepagesize" hugetlb. It exists for all
|
||||||
|
the cgroup except root.
|
||||||
|
|
||||||
|
hugetlb.<hugepagesize>.max
|
||||||
|
Set/show the hard limit of "hugepagesize" hugetlb usage.
|
||||||
|
The default value is "max". It exists for all the cgroup except root.
|
||||||
|
|
||||||
|
hugetlb.<hugepagesize>.events
|
||||||
|
A read-only flat-keyed file which exists on non-root cgroups.
|
||||||
|
|
||||||
|
max
|
||||||
|
The number of allocation failure due to HugeTLB limit
|
||||||
|
|
||||||
|
hugetlb.<hugepagesize>.events.local
|
||||||
|
Similar to hugetlb.<hugepagesize>.events but the fields in the file
|
||||||
|
are local to the cgroup i.e. not hierarchical. The file modified event
|
||||||
|
generated on this file reflects only the local events.
|
||||||
|
|
||||||
Misc
|
Misc
|
||||||
----
|
----
|
||||||
|
@@ -511,7 +511,7 @@
|
|||||||
1 -- check protection requested by application.
|
1 -- check protection requested by application.
|
||||||
Default value is set via a kernel config option.
|
Default value is set via a kernel config option.
|
||||||
Value can be changed at runtime via
|
Value can be changed at runtime via
|
||||||
/selinux/checkreqprot.
|
/sys/fs/selinux/checkreqprot.
|
||||||
|
|
||||||
cio_ignore= [S390]
|
cio_ignore= [S390]
|
||||||
See Documentation/s390/common_io.rst for details.
|
See Documentation/s390/common_io.rst for details.
|
||||||
@@ -1165,10 +1165,10 @@
|
|||||||
|
|
||||||
efi= [EFI]
|
efi= [EFI]
|
||||||
Format: { "old_map", "nochunk", "noruntime", "debug",
|
Format: { "old_map", "nochunk", "noruntime", "debug",
|
||||||
"nosoftreserve" }
|
"nosoftreserve", "disable_early_pci_dma",
|
||||||
|
"no_disable_early_pci_dma" }
|
||||||
old_map [X86-64]: switch to the old ioremap-based EFI
|
old_map [X86-64]: switch to the old ioremap-based EFI
|
||||||
runtime services mapping. 32-bit still uses this one by
|
runtime services mapping. [Needs CONFIG_X86_UV=y]
|
||||||
default.
|
|
||||||
nochunk: disable reading files in "chunks" in the EFI
|
nochunk: disable reading files in "chunks" in the EFI
|
||||||
boot stub, as chunking can cause problems with some
|
boot stub, as chunking can cause problems with some
|
||||||
firmware implementations.
|
firmware implementations.
|
||||||
@@ -1180,6 +1180,10 @@
|
|||||||
claim. Specify efi=nosoftreserve to disable this
|
claim. Specify efi=nosoftreserve to disable this
|
||||||
reservation and treat the memory by its base type
|
reservation and treat the memory by its base type
|
||||||
(i.e. EFI_CONVENTIONAL_MEMORY / "System RAM").
|
(i.e. EFI_CONVENTIONAL_MEMORY / "System RAM").
|
||||||
|
disable_early_pci_dma: Disable the busmaster bit on all
|
||||||
|
PCI bridges while in the EFI boot stub
|
||||||
|
no_disable_early_pci_dma: Leave the busmaster bit set
|
||||||
|
on all PCI bridges while in the EFI boot stub
|
||||||
|
|
||||||
efi_no_storage_paranoia [EFI; X86]
|
efi_no_storage_paranoia [EFI; X86]
|
||||||
Using this parameter you can use more than 50% of
|
Using this parameter you can use more than 50% of
|
||||||
@@ -1245,7 +1249,8 @@
|
|||||||
0 -- permissive (log only, no denials).
|
0 -- permissive (log only, no denials).
|
||||||
1 -- enforcing (deny and log).
|
1 -- enforcing (deny and log).
|
||||||
Default value is 0.
|
Default value is 0.
|
||||||
Value can be changed at runtime via /selinux/enforce.
|
Value can be changed at runtime via
|
||||||
|
/sys/fs/selinux/enforce.
|
||||||
|
|
||||||
erst_disable [ACPI]
|
erst_disable [ACPI]
|
||||||
Disable Error Record Serialization Table (ERST)
|
Disable Error Record Serialization Table (ERST)
|
||||||
@@ -1933,10 +1938,32 @@
|
|||||||
<cpu number> begins at 0 and the maximum value is
|
<cpu number> begins at 0 and the maximum value is
|
||||||
"number of CPUs in system - 1".
|
"number of CPUs in system - 1".
|
||||||
|
|
||||||
|
managed_irq
|
||||||
|
|
||||||
|
Isolate from being targeted by managed interrupts
|
||||||
|
which have an interrupt mask containing isolated
|
||||||
|
CPUs. The affinity of managed interrupts is
|
||||||
|
handled by the kernel and cannot be changed via
|
||||||
|
the /proc/irq/* interfaces.
|
||||||
|
|
||||||
|
This isolation is best effort and only effective
|
||||||
|
if the automatically assigned interrupt mask of a
|
||||||
|
device queue contains isolated and housekeeping
|
||||||
|
CPUs. If housekeeping CPUs are online then such
|
||||||
|
interrupts are directed to the housekeeping CPU
|
||||||
|
so that IO submitted on the housekeeping CPU
|
||||||
|
cannot disturb the isolated CPU.
|
||||||
|
|
||||||
|
If a queue's affinity mask contains only isolated
|
||||||
|
CPUs then this parameter has no effect on the
|
||||||
|
interrupt routing decision, though interrupts are
|
||||||
|
only delivered when tasks running on those
|
||||||
|
isolated CPUs submit IO. IO submitted on
|
||||||
|
housekeeping CPUs has no influence on those
|
||||||
|
queues.
|
||||||
|
|
||||||
The format of <cpu-list> is described above.
|
The format of <cpu-list> is described above.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
iucv= [HW,NET]
|
iucv= [HW,NET]
|
||||||
|
|
||||||
ivrs_ioapic [HW,X86_64]
|
ivrs_ioapic [HW,X86_64]
|
||||||
@@ -3978,6 +4005,19 @@
|
|||||||
test until boot completes in order to avoid
|
test until boot completes in order to avoid
|
||||||
interference.
|
interference.
|
||||||
|
|
||||||
|
rcuperf.kfree_rcu_test= [KNL]
|
||||||
|
Set to measure performance of kfree_rcu() flooding.
|
||||||
|
|
||||||
|
rcuperf.kfree_nthreads= [KNL]
|
||||||
|
The number of threads running loops of kfree_rcu().
|
||||||
|
|
||||||
|
rcuperf.kfree_alloc_num= [KNL]
|
||||||
|
Number of allocations and frees done in an iteration.
|
||||||
|
|
||||||
|
rcuperf.kfree_loops= [KNL]
|
||||||
|
Number of loops doing rcuperf.kfree_alloc_num number
|
||||||
|
of allocations and frees.
|
||||||
|
|
||||||
rcuperf.nreaders= [KNL]
|
rcuperf.nreaders= [KNL]
|
||||||
Set number of RCU readers. The value -1 selects
|
Set number of RCU readers. The value -1 selects
|
||||||
N, where N is the number of CPUs. A value
|
N, where N is the number of CPUs. A value
|
||||||
@@ -4348,9 +4388,7 @@
|
|||||||
See security/selinux/Kconfig help text.
|
See security/selinux/Kconfig help text.
|
||||||
0 -- disable.
|
0 -- disable.
|
||||||
1 -- enable.
|
1 -- enable.
|
||||||
Default value is set via kernel config option.
|
Default value is 1.
|
||||||
If enabled at boot time, /selinux/disable can be used
|
|
||||||
later to disable prior to initial policy load.
|
|
||||||
|
|
||||||
apparmor= [APPARMOR] Disable or enable AppArmor at boot time
|
apparmor= [APPARMOR] Disable or enable AppArmor at boot time
|
||||||
Format: { "0" | "1" }
|
Format: { "0" | "1" }
|
||||||
|
@@ -506,6 +506,9 @@ object corresponding to it, as follows:
|
|||||||
``disable``
|
``disable``
|
||||||
Whether or not this idle state is disabled.
|
Whether or not this idle state is disabled.
|
||||||
|
|
||||||
|
``default_status``
|
||||||
|
The default status of this state, "enabled" or "disabled".
|
||||||
|
|
||||||
``latency``
|
``latency``
|
||||||
Exit latency of the idle state in microseconds.
|
Exit latency of the idle state in microseconds.
|
||||||
|
|
||||||
|
246
Documentation/admin-guide/pm/intel_idle.rst
Normal file
246
Documentation/admin-guide/pm/intel_idle.rst
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
.. include:: <isonum.txt>
|
||||||
|
|
||||||
|
==============================================
|
||||||
|
``intel_idle`` CPU Idle Time Management Driver
|
||||||
|
==============================================
|
||||||
|
|
||||||
|
:Copyright: |copy| 2020 Intel Corporation
|
||||||
|
|
||||||
|
:Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||||
|
|
||||||
|
|
||||||
|
General Information
|
||||||
|
===================
|
||||||
|
|
||||||
|
``intel_idle`` is a part of the
|
||||||
|
:doc:`CPU idle time management subsystem <cpuidle>` in the Linux kernel
|
||||||
|
(``CPUIdle``). It is the default CPU idle time management driver for the
|
||||||
|
Nehalem and later generations of Intel processors, but the level of support for
|
||||||
|
a particular processor model in it depends on whether or not it recognizes that
|
||||||
|
processor model and may also depend on information coming from the platform
|
||||||
|
firmware. [To understand ``intel_idle`` it is necessary to know how ``CPUIdle``
|
||||||
|
works in general, so this is the time to get familiar with :doc:`cpuidle` if you
|
||||||
|
have not done that yet.]
|
||||||
|
|
||||||
|
``intel_idle`` uses the ``MWAIT`` instruction to inform the processor that the
|
||||||
|
logical CPU executing it is idle and so it may be possible to put some of the
|
||||||
|
processor's functional blocks into low-power states. That instruction takes two
|
||||||
|
arguments (passed in the ``EAX`` and ``ECX`` registers of the target CPU), the
|
||||||
|
first of which, referred to as a *hint*, can be used by the processor to
|
||||||
|
determine what can be done (for details refer to Intel Software Developer’s
|
||||||
|
Manual [1]_). Accordingly, ``intel_idle`` refuses to work with processors in
|
||||||
|
which the support for the ``MWAIT`` instruction has been disabled (for example,
|
||||||
|
via the platform firmware configuration menu) or which do not support that
|
||||||
|
instruction at all.
|
||||||
|
|
||||||
|
``intel_idle`` is not modular, so it cannot be unloaded, which means that the
|
||||||
|
only way to pass early-configuration-time parameters to it is via the kernel
|
||||||
|
command line.
|
||||||
|
|
||||||
|
|
||||||
|
.. _intel-idle-enumeration-of-states:
|
||||||
|
|
||||||
|
Enumeration of Idle States
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Each ``MWAIT`` hint value is interpreted by the processor as a license to
|
||||||
|
reconfigure itself in a certain way in order to save energy. The processor
|
||||||
|
configurations (with reduced power draw) resulting from that are referred to
|
||||||
|
as C-states (in the ACPI terminology) or idle states. The list of meaningful
|
||||||
|
``MWAIT`` hint values and idle states (i.e. low-power configurations of the
|
||||||
|
processor) corresponding to them depends on the processor model and it may also
|
||||||
|
depend on the configuration of the platform.
|
||||||
|
|
||||||
|
In order to create a list of available idle states required by the ``CPUIdle``
|
||||||
|
subsystem (see :ref:`idle-states-representation` in :doc:`cpuidle`),
|
||||||
|
``intel_idle`` can use two sources of information: static tables of idle states
|
||||||
|
for different processor models included in the driver itself and the ACPI tables
|
||||||
|
of the system. The former are always used if the processor model at hand is
|
||||||
|
recognized by ``intel_idle`` and the latter are used if that is required for
|
||||||
|
the given processor model (which is the case for all server processor models
|
||||||
|
recognized by ``intel_idle``) or if the processor model is not recognized.
|
||||||
|
|
||||||
|
If the ACPI tables are going to be used for building the list of available idle
|
||||||
|
states, ``intel_idle`` first looks for a ``_CST`` object under one of the ACPI
|
||||||
|
objects corresponding to the CPUs in the system (refer to the ACPI specification
|
||||||
|
[2]_ for the description of ``_CST`` and its output package). Because the
|
||||||
|
``CPUIdle`` subsystem expects that the list of idle states supplied by the
|
||||||
|
driver will be suitable for all of the CPUs handled by it and ``intel_idle`` is
|
||||||
|
registered as the ``CPUIdle`` driver for all of the CPUs in the system, the
|
||||||
|
driver looks for the first ``_CST`` object returning at least one valid idle
|
||||||
|
state description and such that all of the idle states included in its return
|
||||||
|
package are of the FFH (Functional Fixed Hardware) type, which means that the
|
||||||
|
``MWAIT`` instruction is expected to be used to tell the processor that it can
|
||||||
|
enter one of them. The return package of that ``_CST`` is then assumed to be
|
||||||
|
applicable to all of the other CPUs in the system and the idle state
|
||||||
|
descriptions extracted from it are stored in a preliminary list of idle states
|
||||||
|
coming from the ACPI tables. [This step is skipped if ``intel_idle`` is
|
||||||
|
configured to ignore the ACPI tables; see `below <intel-idle-parameters_>`_.]
|
||||||
|
|
||||||
|
Next, the first (index 0) entry in the list of available idle states is
|
||||||
|
initialized to represent a "polling idle state" (a pseudo-idle state in which
|
||||||
|
the target CPU continuously fetches and executes instructions), and the
|
||||||
|
subsequent (real) idle state entries are populated as follows.
|
||||||
|
|
||||||
|
If the processor model at hand is recognized by ``intel_idle``, there is a
|
||||||
|
(static) table of idle state descriptions for it in the driver. In that case,
|
||||||
|
the "internal" table is the primary source of information on idle states and the
|
||||||
|
information from it is copied to the final list of available idle states. If
|
||||||
|
using the ACPI tables for the enumeration of idle states is not required
|
||||||
|
(depending on the processor model), all of the listed idle state are enabled by
|
||||||
|
default (so all of them will be taken into consideration by ``CPUIdle``
|
||||||
|
governors during CPU idle state selection). Otherwise, some of the listed idle
|
||||||
|
states may not be enabled by default if there are no matching entries in the
|
||||||
|
preliminary list of idle states coming from the ACPI tables. In that case user
|
||||||
|
space still can enable them later (on a per-CPU basis) with the help of
|
||||||
|
the ``disable`` idle state attribute in ``sysfs`` (see
|
||||||
|
:ref:`idle-states-representation` in :doc:`cpuidle`). This basically means that
|
||||||
|
the idle states "known" to the driver may not be enabled by default if they have
|
||||||
|
not been exposed by the platform firmware (through the ACPI tables).
|
||||||
|
|
||||||
|
If the given processor model is not recognized by ``intel_idle``, but it
|
||||||
|
supports ``MWAIT``, the preliminary list of idle states coming from the ACPI
|
||||||
|
tables is used for building the final list that will be supplied to the
|
||||||
|
``CPUIdle`` core during driver registration. For each idle state in that list,
|
||||||
|
the description, ``MWAIT`` hint and exit latency are copied to the corresponding
|
||||||
|
entry in the final list of idle states. The name of the idle state represented
|
||||||
|
by it (to be returned by the ``name`` idle state attribute in ``sysfs``) is
|
||||||
|
"CX_ACPI", where X is the index of that idle state in the final list (note that
|
||||||
|
the minimum value of X is 1, because 0 is reserved for the "polling" state), and
|
||||||
|
its target residency is based on the exit latency value. Specifically, for
|
||||||
|
C1-type idle states the exit latency value is also used as the target residency
|
||||||
|
(for compatibility with the majority of the "internal" tables of idle states for
|
||||||
|
various processor models recognized by ``intel_idle``) and for the other idle
|
||||||
|
state types (C2 and C3) the target residency value is 3 times the exit latency
|
||||||
|
(again, that is because it reflects the target residency to exit latency ratio
|
||||||
|
in the majority of cases for the processor models recognized by ``intel_idle``).
|
||||||
|
All of the idle states in the final list are enabled by default in this case.
|
||||||
|
|
||||||
|
|
||||||
|
.. _intel-idle-initialization:
|
||||||
|
|
||||||
|
Initialization
|
||||||
|
==============
|
||||||
|
|
||||||
|
The initialization of ``intel_idle`` starts with checking if the kernel command
|
||||||
|
line options forbid the use of the ``MWAIT`` instruction. If that is the case,
|
||||||
|
an error code is returned right away.
|
||||||
|
|
||||||
|
The next step is to check whether or not the processor model is known to the
|
||||||
|
driver, which determines the idle states enumeration method (see
|
||||||
|
`above <intel-idle-enumeration-of-states_>`_), and whether or not the processor
|
||||||
|
supports ``MWAIT`` (the initialization fails if that is not the case). Then,
|
||||||
|
the ``MWAIT`` support in the processor is enumerated through ``CPUID`` and the
|
||||||
|
driver initialization fails if the level of support is not as expected (for
|
||||||
|
example, if the total number of ``MWAIT`` substates returned is 0).
|
||||||
|
|
||||||
|
Next, if the driver is not configured to ignore the ACPI tables (see
|
||||||
|
`below <intel-idle-parameters_>`_), the idle states information provided by the
|
||||||
|
platform firmware is extracted from them.
|
||||||
|
|
||||||
|
Then, ``CPUIdle`` device objects are allocated for all CPUs and the list of
|
||||||
|
available idle states is created as explained
|
||||||
|
`above <intel-idle-enumeration-of-states_>`_.
|
||||||
|
|
||||||
|
Finally, ``intel_idle`` is registered with the help of cpuidle_register_driver()
|
||||||
|
as the ``CPUIdle`` driver for all CPUs in the system and a CPU online callback
|
||||||
|
for configuring individual CPUs is registered via cpuhp_setup_state(), which
|
||||||
|
(among other things) causes the callback routine to be invoked for all of the
|
||||||
|
CPUs present in the system at that time (each CPU executes its own instance of
|
||||||
|
the callback routine). That routine registers a ``CPUIdle`` device for the CPU
|
||||||
|
running it (which enables the ``CPUIdle`` subsystem to operate that CPU) and
|
||||||
|
optionally performs some CPU-specific initialization actions that may be
|
||||||
|
required for the given processor model.
|
||||||
|
|
||||||
|
|
||||||
|
.. _intel-idle-parameters:
|
||||||
|
|
||||||
|
Kernel Command Line Options and Module Parameters
|
||||||
|
=================================================
|
||||||
|
|
||||||
|
The *x86* architecture support code recognizes three kernel command line
|
||||||
|
options related to CPU idle time management: ``idle=poll``, ``idle=halt``,
|
||||||
|
and ``idle=nomwait``. If any of them is present in the kernel command line, the
|
||||||
|
``MWAIT`` instruction is not allowed to be used, so the initialization of
|
||||||
|
``intel_idle`` will fail.
|
||||||
|
|
||||||
|
Apart from that there are two module parameters recognized by ``intel_idle``
|
||||||
|
itself that can be set via the kernel command line (they cannot be updated via
|
||||||
|
sysfs, so that is the only way to change their values).
|
||||||
|
|
||||||
|
The ``max_cstate`` parameter value is the maximum idle state index in the list
|
||||||
|
of idle states supplied to the ``CPUIdle`` core during the registration of the
|
||||||
|
driver. It is also the maximum number of regular (non-polling) idle states that
|
||||||
|
can be used by ``intel_idle``, so the enumeration of idle states is terminated
|
||||||
|
after finding that number of usable idle states (the other idle states that
|
||||||
|
potentially might have been used if ``max_cstate`` had been greater are not
|
||||||
|
taken into consideration at all). Setting ``max_cstate`` can prevent
|
||||||
|
``intel_idle`` from exposing idle states that are regarded as "too deep" for
|
||||||
|
some reason to the ``CPUIdle`` core, but it does so by making them effectively
|
||||||
|
invisible until the system is shut down and started again which may not always
|
||||||
|
be desirable. In practice, it is only really necessary to do that if the idle
|
||||||
|
states in question cannot be enabled during system startup, because in the
|
||||||
|
working state of the system the CPU power management quality of service (PM
|
||||||
|
QoS) feature can be used to prevent ``CPUIdle`` from touching those idle states
|
||||||
|
even if they have been enumerated (see :ref:`cpu-pm-qos` in :doc:`cpuidle`).
|
||||||
|
Setting ``max_cstate`` to 0 causes the ``intel_idle`` initialization to fail.
|
||||||
|
|
||||||
|
The ``noacpi`` module parameter (which is recognized by ``intel_idle`` if the
|
||||||
|
kernel has been configured with ACPI support), can be set to make the driver
|
||||||
|
ignore the system's ACPI tables entirely (it is unset by default).
|
||||||
|
|
||||||
|
|
||||||
|
.. _intel-idle-core-and-package-idle-states:
|
||||||
|
|
||||||
|
Core and Package Levels of Idle States
|
||||||
|
======================================
|
||||||
|
|
||||||
|
Typically, in a processor supporting the ``MWAIT`` instruction there are (at
|
||||||
|
least) two levels of idle states (or C-states). One level, referred to as
|
||||||
|
"core C-states", covers individual cores in the processor, whereas the other
|
||||||
|
level, referred to as "package C-states", covers the entire processor package
|
||||||
|
and it may also involve other components of the system (GPUs, memory
|
||||||
|
controllers, I/O hubs etc.).
|
||||||
|
|
||||||
|
Some of the ``MWAIT`` hint values allow the processor to use core C-states only
|
||||||
|
(most importantly, that is the case for the ``MWAIT`` hint value corresponding
|
||||||
|
to the ``C1`` idle state), but the majority of them give it a license to put
|
||||||
|
the target core (i.e. the core containing the logical CPU executing ``MWAIT``
|
||||||
|
with the given hint value) into a specific core C-state and then (if possible)
|
||||||
|
to enter a specific package C-state at the deeper level. For example, the
|
||||||
|
``MWAIT`` hint value representing the ``C3`` idle state allows the processor to
|
||||||
|
put the target core into the low-power state referred to as "core ``C3``" (or
|
||||||
|
``CC3``), which happens if all of the logical CPUs (SMT siblings) in that core
|
||||||
|
have executed ``MWAIT`` with the ``C3`` hint value (or with a hint value
|
||||||
|
representing a deeper idle state), and in addition to that (in the majority of
|
||||||
|
cases) it gives the processor a license to put the entire package (possibly
|
||||||
|
including some non-CPU components such as a GPU or a memory controller) into the
|
||||||
|
low-power state referred to as "package ``C3``" (or ``PC3``), which happens if
|
||||||
|
all of the cores have gone into the ``CC3`` state and (possibly) some additional
|
||||||
|
conditions are satisfied (for instance, if the GPU is covered by ``PC3``, it may
|
||||||
|
be required to be in a certain GPU-specific low-power state for ``PC3`` to be
|
||||||
|
reachable).
|
||||||
|
|
||||||
|
As a rule, there is no simple way to make the processor use core C-states only
|
||||||
|
if the conditions for entering the corresponding package C-states are met, so
|
||||||
|
the logical CPU executing ``MWAIT`` with a hint value that is not core-level
|
||||||
|
only (like for ``C1``) must always assume that this may cause the processor to
|
||||||
|
enter a package C-state. [That is why the exit latency and target residency
|
||||||
|
values corresponding to the majority of ``MWAIT`` hint values in the "internal"
|
||||||
|
tables of idle states in ``intel_idle`` reflect the properties of package
|
||||||
|
C-states.] If using package C-states is not desirable at all, either
|
||||||
|
:ref:`PM QoS <cpu-pm-qos>` or the ``max_cstate`` module parameter of
|
||||||
|
``intel_idle`` described `above <intel-idle-parameters_>`_ must be used to
|
||||||
|
restrict the range of permissible idle states to the ones with core-level only
|
||||||
|
``MWAIT`` hint values (like ``C1``).
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. [1] *Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B*,
|
||||||
|
https://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2b-manual.html
|
||||||
|
|
||||||
|
.. [2] *Advanced Configuration and Power Interface (ACPI) Specification*,
|
||||||
|
https://uefi.org/specifications
|
@@ -8,6 +8,7 @@ Working-State Power Management
|
|||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
cpuidle
|
cpuidle
|
||||||
|
intel_idle
|
||||||
cpufreq
|
cpufreq
|
||||||
intel_pstate
|
intel_pstate
|
||||||
intel_epb
|
intel_epb
|
||||||
|
@@ -117,6 +117,8 @@ infrastructure:
|
|||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
| Name | bits | visible |
|
| Name | bits | visible |
|
||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
|
| RNDR | [63-60] | y |
|
||||||
|
+------------------------------+---------+---------+
|
||||||
| TS | [55-52] | y |
|
| TS | [55-52] | y |
|
||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
| FHM | [51-48] | y |
|
| FHM | [51-48] | y |
|
||||||
@@ -200,6 +202,12 @@ infrastructure:
|
|||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
| Name | bits | visible |
|
| Name | bits | visible |
|
||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
|
| I8MM | [55-52] | y |
|
||||||
|
+------------------------------+---------+---------+
|
||||||
|
| DGH | [51-48] | y |
|
||||||
|
+------------------------------+---------+---------+
|
||||||
|
| BF16 | [47-44] | y |
|
||||||
|
+------------------------------+---------+---------+
|
||||||
| SB | [39-36] | y |
|
| SB | [39-36] | y |
|
||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
| FRINTTS | [35-32] | y |
|
| FRINTTS | [35-32] | y |
|
||||||
@@ -234,10 +242,18 @@ infrastructure:
|
|||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
| Name | bits | visible |
|
| Name | bits | visible |
|
||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
|
| F64MM | [59-56] | y |
|
||||||
|
+------------------------------+---------+---------+
|
||||||
|
| F32MM | [55-52] | y |
|
||||||
|
+------------------------------+---------+---------+
|
||||||
|
| I8MM | [47-44] | y |
|
||||||
|
+------------------------------+---------+---------+
|
||||||
| SM4 | [43-40] | y |
|
| SM4 | [43-40] | y |
|
||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
| SHA3 | [35-32] | y |
|
| SHA3 | [35-32] | y |
|
||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
|
| BF16 | [23-20] | y |
|
||||||
|
+------------------------------+---------+---------+
|
||||||
| BitPerm | [19-16] | y |
|
| BitPerm | [19-16] | y |
|
||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
| AES | [7-4] | y |
|
| AES | [7-4] | y |
|
||||||
|
@@ -204,6 +204,37 @@ HWCAP2_FRINT
|
|||||||
|
|
||||||
Functionality implied by ID_AA64ISAR1_EL1.FRINTTS == 0b0001.
|
Functionality implied by ID_AA64ISAR1_EL1.FRINTTS == 0b0001.
|
||||||
|
|
||||||
|
HWCAP2_SVEI8MM
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ZFR0_EL1.I8MM == 0b0001.
|
||||||
|
|
||||||
|
HWCAP2_SVEF32MM
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ZFR0_EL1.F32MM == 0b0001.
|
||||||
|
|
||||||
|
HWCAP2_SVEF64MM
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ZFR0_EL1.F64MM == 0b0001.
|
||||||
|
|
||||||
|
HWCAP2_SVEBF16
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ZFR0_EL1.BF16 == 0b0001.
|
||||||
|
|
||||||
|
HWCAP2_I8MM
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR1_EL1.I8MM == 0b0001.
|
||||||
|
|
||||||
|
HWCAP2_BF16
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR1_EL1.BF16 == 0b0001.
|
||||||
|
|
||||||
|
HWCAP2_DGH
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR1_EL1.DGH == 0b0001.
|
||||||
|
|
||||||
|
HWCAP2_RNG
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR0_EL1.RNDR == 0b0001.
|
||||||
|
|
||||||
4. Unused AT_HWCAP bits
|
4. Unused AT_HWCAP bits
|
||||||
-----------------------
|
-----------------------
|
||||||
|
@@ -88,6 +88,8 @@ stable kernels.
|
|||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| ARM | Cortex-A76 | #1463225 | ARM64_ERRATUM_1463225 |
|
| ARM | Cortex-A76 | #1463225 | ARM64_ERRATUM_1463225 |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
|
| ARM | Cortex-A55 | #1530923 | ARM64_ERRATUM_1530923 |
|
||||||
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| ARM | Neoverse-N1 | #1188873,1418040| ARM64_ERRATUM_1418040 |
|
| ARM | Neoverse-N1 | #1188873,1418040| ARM64_ERRATUM_1418040 |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| ARM | Neoverse-N1 | #1349291 | N/A |
|
| ARM | Neoverse-N1 | #1349291 | N/A |
|
||||||
|
@@ -10,6 +10,12 @@ PIT Timer required properties:
|
|||||||
- interrupts: Should contain interrupt for the PIT which is the IRQ line
|
- interrupts: Should contain interrupt for the PIT which is the IRQ line
|
||||||
shared across all System Controller members.
|
shared across all System Controller members.
|
||||||
|
|
||||||
|
PIT64B Timer required properties:
|
||||||
|
- compatible: Should be "microchip,sam9x60-pit64b"
|
||||||
|
- reg: Should contain registers location and length
|
||||||
|
- interrupts: Should contain interrupt for PIT64B timer
|
||||||
|
- clocks: Should contain the available clock sources for PIT64B timer.
|
||||||
|
|
||||||
System Timer (ST) required properties:
|
System Timer (ST) required properties:
|
||||||
- compatible: Should be "atmel,at91rm9200-st", "syscon", "simple-mfd"
|
- compatible: Should be "atmel,at91rm9200-st", "syscon", "simple-mfd"
|
||||||
- reg: Should contain registers location and length
|
- reg: Should contain registers location and length
|
||||||
|
@@ -5,6 +5,7 @@ Each SATA controller should have its own node.
|
|||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible : should be one or more of
|
- compatible : should be one or more of
|
||||||
|
"brcm,bcm7216-ahci"
|
||||||
"brcm,bcm7425-ahci"
|
"brcm,bcm7425-ahci"
|
||||||
"brcm,bcm7445-ahci"
|
"brcm,bcm7445-ahci"
|
||||||
"brcm,bcm-nsp-ahci"
|
"brcm,bcm-nsp-ahci"
|
||||||
@@ -14,6 +15,12 @@ Required properties:
|
|||||||
- reg-names : "ahci" and "top-ctrl"
|
- reg-names : "ahci" and "top-ctrl"
|
||||||
- interrupts : interrupt mapping for SATA IRQ
|
- interrupts : interrupt mapping for SATA IRQ
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
|
||||||
|
- reset: for "brcm,bcm7216-ahci" must be a valid reset phandle
|
||||||
|
pointing to the RESCAL reset controller provider node.
|
||||||
|
- reset-names: for "brcm,bcm7216-ahci", must be "rescal".
|
||||||
|
|
||||||
Also see ahci-platform.txt.
|
Also see ahci-platform.txt.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
@@ -10,6 +10,7 @@ Required properties:
|
|||||||
- compatible :
|
- compatible :
|
||||||
- "fsl,vf610-edma" for eDMA used similar to that on Vybrid vf610 SoC
|
- "fsl,vf610-edma" for eDMA used similar to that on Vybrid vf610 SoC
|
||||||
- "fsl,imx7ulp-edma" for eDMA2 used similar to that on i.mx7ulp
|
- "fsl,imx7ulp-edma" for eDMA2 used similar to that on i.mx7ulp
|
||||||
|
- "fsl,fsl,ls1028a-edma" for eDMA used similar to that on Vybrid vf610 SoC
|
||||||
- reg : Specifies base physical address(s) and size of the eDMA registers.
|
- reg : Specifies base physical address(s) and size of the eDMA registers.
|
||||||
The 1st region is eDMA control register's address and size.
|
The 1st region is eDMA control register's address and size.
|
||||||
The 2nd and the 3rd regions are programmable channel multiplexing
|
The 2nd and the 3rd regions are programmable channel multiplexing
|
||||||
|
@@ -10,6 +10,9 @@ Required properties:
|
|||||||
"fsl,imx6q-sdma"
|
"fsl,imx6q-sdma"
|
||||||
"fsl,imx7d-sdma"
|
"fsl,imx7d-sdma"
|
||||||
"fsl,imx8mq-sdma"
|
"fsl,imx8mq-sdma"
|
||||||
|
"fsl,imx8mm-sdma"
|
||||||
|
"fsl,imx8mn-sdma"
|
||||||
|
"fsl,imx8mp-sdma"
|
||||||
The -to variants should be preferred since they allow to determine the
|
The -to variants should be preferred since they allow to determine the
|
||||||
correct ROM script addresses needed for the driver to work without additional
|
correct ROM script addresses needed for the driver to work without additional
|
||||||
firmware.
|
firmware.
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
* Ingenic JZ4780 DMA Controller
|
* Ingenic XBurst DMA Controller
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
|
|
||||||
@@ -8,10 +8,12 @@ Required properties:
|
|||||||
* ingenic,jz4770-dma
|
* ingenic,jz4770-dma
|
||||||
* ingenic,jz4780-dma
|
* ingenic,jz4780-dma
|
||||||
* ingenic,x1000-dma
|
* ingenic,x1000-dma
|
||||||
|
* ingenic,x1830-dma
|
||||||
- reg: Should contain the DMA channel registers location and length, followed
|
- reg: Should contain the DMA channel registers location and length, followed
|
||||||
by the DMA controller registers location and length.
|
by the DMA controller registers location and length.
|
||||||
- interrupts: Should contain the interrupt specifier of the DMA controller.
|
- interrupts: Should contain the interrupt specifier of the DMA controller.
|
||||||
- clocks: Should contain a clock specifier for the JZ4780/X1000 PDMA clock.
|
- clocks: Should contain a clock specifier for the JZ4780/X1000/X1830 PDMA
|
||||||
|
clock.
|
||||||
- #dma-cells: Must be <2>. Number of integer cells in the dmas property of
|
- #dma-cells: Must be <2>. Number of integer cells in the dmas property of
|
||||||
DMA clients (see below).
|
DMA clients (see below).
|
||||||
|
|
||||||
|
@@ -30,6 +30,7 @@ Required Properties:
|
|||||||
- "renesas,dmac-r8a7794" (R-Car E2)
|
- "renesas,dmac-r8a7794" (R-Car E2)
|
||||||
- "renesas,dmac-r8a7795" (R-Car H3)
|
- "renesas,dmac-r8a7795" (R-Car H3)
|
||||||
- "renesas,dmac-r8a7796" (R-Car M3-W)
|
- "renesas,dmac-r8a7796" (R-Car M3-W)
|
||||||
|
- "renesas,dmac-r8a77961" (R-Car M3-W+)
|
||||||
- "renesas,dmac-r8a77965" (R-Car M3-N)
|
- "renesas,dmac-r8a77965" (R-Car M3-N)
|
||||||
- "renesas,dmac-r8a77970" (R-Car V3M)
|
- "renesas,dmac-r8a77970" (R-Car V3M)
|
||||||
- "renesas,dmac-r8a77980" (R-Car V3H)
|
- "renesas,dmac-r8a77980" (R-Car V3H)
|
||||||
|
184
Documentation/devicetree/bindings/dma/ti/k3-udma.yaml
Normal file
184
Documentation/devicetree/bindings/dma/ti/k3-udma.yaml
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/dma/ti/k3-udma.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Texas Instruments K3 NAVSS Unified DMA Device Tree Bindings
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Peter Ujfalusi <peter.ujfalusi@ti.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The UDMA-P is intended to perform similar (but significantly upgraded)
|
||||||
|
functions as the packet-oriented DMA used on previous SoC devices. The UDMA-P
|
||||||
|
module supports the transmission and reception of various packet types.
|
||||||
|
The UDMA-P architecture facilitates the segmentation and reassembly of SoC DMA
|
||||||
|
data structure compliant packets to/from smaller data blocks that are natively
|
||||||
|
compatible with the specific requirements of each connected peripheral.
|
||||||
|
Multiple Tx and Rx channels are provided within the DMA which allow multiple
|
||||||
|
segmentation or reassembly operations to be ongoing. The DMA controller
|
||||||
|
maintains state information for each of the channels which allows packet
|
||||||
|
segmentation and reassembly operations to be time division multiplexed between
|
||||||
|
channels in order to share the underlying DMA hardware. An external DMA
|
||||||
|
scheduler is used to control the ordering and rate at which this multiplexing
|
||||||
|
occurs for Transmit operations. The ordering and rate of Receive operations
|
||||||
|
is indirectly controlled by the order in which blocks are pushed into the DMA
|
||||||
|
on the Rx PSI-L interface.
|
||||||
|
|
||||||
|
The UDMA-P also supports acting as both a UTC and UDMA-C for its internal
|
||||||
|
channels. Channels in the UDMA-P can be configured to be either Packet-Based
|
||||||
|
or Third-Party channels on a channel by channel basis.
|
||||||
|
|
||||||
|
All transfers within NAVSS is done between PSI-L source and destination
|
||||||
|
threads.
|
||||||
|
The peripherals serviced by UDMA can be PSI-L native (sa2ul, cpsw, etc) or
|
||||||
|
legacy, non PSI-L native peripherals. In the later case a special, small PDMA
|
||||||
|
is tasked to act as a bridge between the PSI-L fabric and the legacy
|
||||||
|
peripheral.
|
||||||
|
|
||||||
|
PDMAs can be configured via UDMAP peer registers to match with the
|
||||||
|
configuration of the legacy peripheral.
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: "../dma-controller.yaml#"
|
||||||
|
|
||||||
|
properties:
|
||||||
|
"#dma-cells":
|
||||||
|
const: 1
|
||||||
|
description: |
|
||||||
|
The cell is the PSI-L thread ID of the remote (to UDMAP) end.
|
||||||
|
Valid ranges for thread ID depends on the data movement direction:
|
||||||
|
for source thread IDs (rx): 0 - 0x7fff
|
||||||
|
for destination thread IDs (tx): 0x8000 - 0xffff
|
||||||
|
|
||||||
|
Please refer to the device documentation for the PSI-L thread map and also
|
||||||
|
the PSI-L peripheral chapter for the correct thread ID.
|
||||||
|
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- ti,am654-navss-main-udmap
|
||||||
|
- ti,am654-navss-mcu-udmap
|
||||||
|
- ti,j721e-navss-main-udmap
|
||||||
|
- ti,j721e-navss-mcu-udmap
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 3
|
||||||
|
|
||||||
|
reg-names:
|
||||||
|
items:
|
||||||
|
- const: gcfg
|
||||||
|
- const: rchanrt
|
||||||
|
- const: tchanrt
|
||||||
|
|
||||||
|
msi-parent: true
|
||||||
|
|
||||||
|
ti,sci:
|
||||||
|
description: phandle to TI-SCI compatible System controller node
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/phandle
|
||||||
|
|
||||||
|
ti,sci-dev-id:
|
||||||
|
description: TI-SCI device id of UDMAP
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
|
||||||
|
ti,ringacc:
|
||||||
|
description: phandle to the ring accelerator node
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/phandle
|
||||||
|
|
||||||
|
ti,sci-rm-range-tchan:
|
||||||
|
description: |
|
||||||
|
Array of UDMA tchan resource subtypes for resource allocation for this
|
||||||
|
host
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||||
|
minItems: 1
|
||||||
|
# Should be enough
|
||||||
|
maxItems: 255
|
||||||
|
|
||||||
|
ti,sci-rm-range-rchan:
|
||||||
|
description: |
|
||||||
|
Array of UDMA rchan resource subtypes for resource allocation for this
|
||||||
|
host
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||||
|
minItems: 1
|
||||||
|
# Should be enough
|
||||||
|
maxItems: 255
|
||||||
|
|
||||||
|
ti,sci-rm-range-rflow:
|
||||||
|
description: |
|
||||||
|
Array of UDMA rflow resource subtypes for resource allocation for this
|
||||||
|
host
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||||
|
minItems: 1
|
||||||
|
# Should be enough
|
||||||
|
maxItems: 255
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- "#dma-cells"
|
||||||
|
- reg
|
||||||
|
- reg-names
|
||||||
|
- msi-parent
|
||||||
|
- ti,sci
|
||||||
|
- ti,sci-dev-id
|
||||||
|
- ti,ringacc
|
||||||
|
- ti,sci-rm-range-tchan
|
||||||
|
- ti,sci-rm-range-rchan
|
||||||
|
- ti,sci-rm-range-rflow
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |+
|
||||||
|
cbass_main {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
|
||||||
|
cbass_main_navss: navss@30800000 {
|
||||||
|
compatible = "simple-mfd";
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
dma-coherent;
|
||||||
|
dma-ranges;
|
||||||
|
ranges;
|
||||||
|
|
||||||
|
ti,sci-dev-id = <118>;
|
||||||
|
|
||||||
|
main_udmap: dma-controller@31150000 {
|
||||||
|
compatible = "ti,am654-navss-main-udmap";
|
||||||
|
reg = <0x0 0x31150000 0x0 0x100>,
|
||||||
|
<0x0 0x34000000 0x0 0x100000>,
|
||||||
|
<0x0 0x35000000 0x0 0x100000>;
|
||||||
|
reg-names = "gcfg", "rchanrt", "tchanrt";
|
||||||
|
#dma-cells = <1>;
|
||||||
|
|
||||||
|
ti,ringacc = <&ringacc>;
|
||||||
|
|
||||||
|
msi-parent = <&inta_main_udmass>;
|
||||||
|
|
||||||
|
ti,sci = <&dmsc>;
|
||||||
|
ti,sci-dev-id = <188>;
|
||||||
|
|
||||||
|
ti,sci-rm-range-tchan = <0x1>, /* TX_HCHAN */
|
||||||
|
<0x2>; /* TX_CHAN */
|
||||||
|
ti,sci-rm-range-rchan = <0x4>, /* RX_HCHAN */
|
||||||
|
<0x5>; /* RX_CHAN */
|
||||||
|
ti,sci-rm-range-rflow = <0x6>; /* GP RFLOW */
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mcasp0: mcasp@02B00000 {
|
||||||
|
dmas = <&main_udmap 0xc400>, <&main_udmap 0x4400>;
|
||||||
|
dma-names = "tx", "rx";
|
||||||
|
};
|
||||||
|
|
||||||
|
crypto: crypto@4E00000 {
|
||||||
|
compatible = "ti,sa2ul-crypto";
|
||||||
|
|
||||||
|
dmas = <&main_udmap 0xc000>, <&main_udmap 0x4000>, <&main_udmap 0x4001>;
|
||||||
|
dma-names = "tx", "rx1", "rx2";
|
||||||
|
};
|
||||||
|
};
|
68
Documentation/devicetree/bindings/gpio/sifive,gpio.yaml
Normal file
68
Documentation/devicetree/bindings/gpio/sifive,gpio.yaml
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/gpio/sifive,gpio.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: SiFive GPIO controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Yash Shah <yash.shah@sifive.com>
|
||||||
|
- Paul Walmsley <paul.walmsley@sifive.com>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
- const: sifive,fu540-c000-gpio
|
||||||
|
- const: sifive,gpio0
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
description:
|
||||||
|
interrupt mapping one per GPIO. Maximum 16 GPIOs.
|
||||||
|
minItems: 1
|
||||||
|
maxItems: 16
|
||||||
|
|
||||||
|
interrupt-controller: true
|
||||||
|
|
||||||
|
"#interrupt-cells":
|
||||||
|
const: 2
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
"#gpio-cells":
|
||||||
|
const: 2
|
||||||
|
|
||||||
|
gpio-controller: true
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- interrupt-controller
|
||||||
|
- "#interrupt-cells"
|
||||||
|
- clocks
|
||||||
|
- "#gpio-cells"
|
||||||
|
- gpio-controller
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/sifive-fu540-prci.h>
|
||||||
|
gpio@10060000 {
|
||||||
|
compatible = "sifive,fu540-c000-gpio", "sifive,gpio0";
|
||||||
|
interrupt-parent = <&plic>;
|
||||||
|
interrupts = <7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22>;
|
||||||
|
reg = <0x0 0x10060000 0x0 0x1000>;
|
||||||
|
clocks = <&tlclk PRCI_CLK_TLCLK>;
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
66
Documentation/devicetree/bindings/hwmon/adi,adm1177.yaml
Normal file
66
Documentation/devicetree/bindings/hwmon/adi,adm1177.yaml
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/hwmon/adi,adm1177.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Analog Devices ADM1177 Hot Swap Controller and Digital Power Monitor
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Michael Hennerich <michael.hennerich@analog.com>
|
||||||
|
- Beniamin Bia <beniamin.bia@analog.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Analog Devices ADM1177 Hot Swap Controller and Digital Power Monitor
|
||||||
|
https://www.analog.com/media/en/technical-documentation/data-sheets/ADM1177.pdf
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- adi,adm1177
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
avcc-supply:
|
||||||
|
description:
|
||||||
|
Phandle to the Avcc power supply
|
||||||
|
|
||||||
|
shunt-resistor-micro-ohms:
|
||||||
|
description:
|
||||||
|
The value of curent sense resistor in microohms. If not provided,
|
||||||
|
the current reading and overcurrent alert is disabled.
|
||||||
|
|
||||||
|
adi,shutdown-threshold-microamp:
|
||||||
|
description:
|
||||||
|
Specifies the current level at which an over current alert occurs.
|
||||||
|
If not provided, the overcurrent alert is configured to max ADC range
|
||||||
|
based on shunt-resistor-micro-ohms.
|
||||||
|
|
||||||
|
adi,vrange-high-enable:
|
||||||
|
description:
|
||||||
|
Specifies which internal voltage divider to be used. A 1 selects
|
||||||
|
a 7:2 voltage divider while a 0 selects a 14:1 voltage divider.
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
i2c0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
pwmon@5a {
|
||||||
|
compatible = "adi,adm1177";
|
||||||
|
reg = <0x5a>;
|
||||||
|
shunt-resistor-micro-ohms = <50000>; /* 50 mOhm */
|
||||||
|
adi,shutdown-threshold-microamp = <1059000>; /* 1.059 A */
|
||||||
|
adi,vrange-high-enable;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
...
|
@@ -0,0 +1,45 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
|
||||||
|
$id: http://devicetree.org/schemas/hwmon/pmbus/ti,ucd90320.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: UCD90320 power sequencer
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Jim Wright <wrightj@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The UCD90320 is a 32-rail PMBus/I2C addressable power-supply sequencer and
|
||||||
|
monitor. The 24 integrated ADC channels (AMONx) monitor the power supply
|
||||||
|
voltage, current, and temperature. Of the 84 GPIO pins, 8 can be used as
|
||||||
|
digital monitors (DMONx), 32 to enable the power supply (ENx), 24 for
|
||||||
|
margining (MARx), 16 for logical GPO, and 32 GPIs for cascading, and system
|
||||||
|
function.
|
||||||
|
|
||||||
|
http://focus.ti.com/lit/ds/symlink/ucd90320.pdf
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- ti,ucd90320
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
i2c {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
ucd90320@11 {
|
||||||
|
compatible = "ti,ucd90320";
|
||||||
|
reg = <0x11>;
|
||||||
|
};
|
||||||
|
};
|
@@ -17,6 +17,7 @@ Required properties:
|
|||||||
"amlogic,meson-axg-gpio-intc" for AXG SoCs (A113D, A113X)
|
"amlogic,meson-axg-gpio-intc" for AXG SoCs (A113D, A113X)
|
||||||
"amlogic,meson-g12a-gpio-intc" for G12A SoCs (S905D2, S905X2, S905Y2)
|
"amlogic,meson-g12a-gpio-intc" for G12A SoCs (S905D2, S905X2, S905Y2)
|
||||||
"amlogic,meson-sm1-gpio-intc" for SM1 SoCs (S905D3, S905X3, S905Y3)
|
"amlogic,meson-sm1-gpio-intc" for SM1 SoCs (S905D3, S905X3, S905Y3)
|
||||||
|
"amlogic,meson-a1-gpio-intc" for A1 SoCs (A113L)
|
||||||
- reg : Specifies base physical address and size of the registers.
|
- reg : Specifies base physical address and size of the registers.
|
||||||
- interrupt-controller : Identifies the node as an interrupt controller.
|
- interrupt-controller : Identifies the node as an interrupt controller.
|
||||||
- #interrupt-cells : Specifies the number of cells needed to encode an
|
- #interrupt-cells : Specifies the number of cells needed to encode an
|
||||||
|
@@ -0,0 +1,23 @@
|
|||||||
|
Aspeed AST25XX and AST26XX SCU Interrupt Controller
|
||||||
|
|
||||||
|
Required Properties:
|
||||||
|
- #interrupt-cells : must be 1
|
||||||
|
- compatible : must be "aspeed,ast2500-scu-ic",
|
||||||
|
"aspeed,ast2600-scu-ic0" or
|
||||||
|
"aspeed,ast2600-scu-ic1"
|
||||||
|
- interrupts : interrupt from the parent controller
|
||||||
|
- interrupt-controller : indicates that the controller receives and
|
||||||
|
fires new interrupts for child busses
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
syscon@1e6e2000 {
|
||||||
|
ranges = <0 0x1e6e2000 0x1a8>;
|
||||||
|
|
||||||
|
scu_ic: interrupt-controller@18 {
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
compatible = "aspeed,ast2500-scu-ic";
|
||||||
|
interrupts = <21>;
|
||||||
|
interrupt-controller;
|
||||||
|
};
|
||||||
|
};
|
@@ -0,0 +1,68 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/interrupt-controller/fsl,intmux.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Freescale INTMUX interrupt multiplexer
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Joakim Zhang <qiangqing.zhang@nxp.com>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: fsl,imx-intmux
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
minItems: 1
|
||||||
|
maxItems: 8
|
||||||
|
description: |
|
||||||
|
Should contain the parent interrupt lines (up to 8) used to multiplex
|
||||||
|
the input interrupts.
|
||||||
|
|
||||||
|
interrupt-controller: true
|
||||||
|
|
||||||
|
'#interrupt-cells':
|
||||||
|
const: 2
|
||||||
|
description: |
|
||||||
|
The 1st cell is hw interrupt number, the 2nd cell is channel index.
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
description: ipg clock.
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
const: ipg
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- interrupt-controller
|
||||||
|
- '#interrupt-cells'
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
interrupt-controller@37400000 {
|
||||||
|
compatible = "fsl,imx-intmux";
|
||||||
|
reg = <0x37400000 0x1000>;
|
||||||
|
interrupts = <0 16 4>,
|
||||||
|
<0 17 4>,
|
||||||
|
<0 18 4>,
|
||||||
|
<0 19 4>,
|
||||||
|
<0 20 4>,
|
||||||
|
<0 21 4>,
|
||||||
|
<0 22 4>,
|
||||||
|
<0 23 4>;
|
||||||
|
interrupt-controller;
|
||||||
|
interrupt-parent = <&gic>;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
clocks = <&clk>;
|
||||||
|
clock-names = "ipg";
|
||||||
|
};
|
@@ -0,0 +1,72 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/memory-controllers/fsl/imx8m-ddrc.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: i.MX8M DDR Controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Leonard Crestez <leonard.crestez@nxp.com>
|
||||||
|
|
||||||
|
description:
|
||||||
|
The DDRC block is integrated in i.MX8M for interfacing with DDR based
|
||||||
|
memories.
|
||||||
|
|
||||||
|
It supports switching between different frequencies at runtime but during
|
||||||
|
this process RAM itself becomes briefly inaccessible so actual frequency
|
||||||
|
switching is implemented by TF-A code which runs from a SRAM area.
|
||||||
|
|
||||||
|
The Linux driver for the DDRC doesn't even map registers (they're included
|
||||||
|
for the sake of "describing hardware"), it mostly just exposes firmware
|
||||||
|
capabilities through standard Linux mechanism like devfreq and OPP tables.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
- enum:
|
||||||
|
- fsl,imx8mn-ddrc
|
||||||
|
- fsl,imx8mm-ddrc
|
||||||
|
- fsl,imx8mq-ddrc
|
||||||
|
- const: fsl,imx8m-ddrc
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
description:
|
||||||
|
Base address and size of DDRC CTL area.
|
||||||
|
This is not currently mapped by the imx8m-ddrc driver.
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 4
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: core
|
||||||
|
- const: pll
|
||||||
|
- const: alt
|
||||||
|
- const: apb
|
||||||
|
|
||||||
|
operating-points-v2: true
|
||||||
|
opp-table: true
|
||||||
|
|
||||||
|
required:
|
||||||
|
- reg
|
||||||
|
- compatible
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/imx8mm-clock.h>
|
||||||
|
ddrc: memory-controller@3d400000 {
|
||||||
|
compatible = "fsl,imx8mm-ddrc", "fsl,imx8m-ddrc";
|
||||||
|
reg = <0x3d400000 0x400000>;
|
||||||
|
clock-names = "core", "pll", "alt", "apb";
|
||||||
|
clocks = <&clk IMX8MM_CLK_DRAM_CORE>,
|
||||||
|
<&clk IMX8MM_DRAM_PLL>,
|
||||||
|
<&clk IMX8MM_CLK_DRAM_ALT>,
|
||||||
|
<&clk IMX8MM_CLK_DRAM_APB>;
|
||||||
|
operating-points-v2 = <&ddrc_opp_table>;
|
||||||
|
};
|
@@ -11,28 +11,43 @@ Required properties:
|
|||||||
- compatible: should be one of the following
|
- compatible: should be one of the following
|
||||||
- "brcm,bcm7425-sdhci"
|
- "brcm,bcm7425-sdhci"
|
||||||
- "brcm,bcm7445-sdhci"
|
- "brcm,bcm7445-sdhci"
|
||||||
|
- "brcm,bcm7216-sdhci"
|
||||||
|
|
||||||
Refer to clocks/clock-bindings.txt for generic clock consumer properties.
|
Refer to clocks/clock-bindings.txt for generic clock consumer properties.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
sdhci@f03e0100 {
|
sdhci@84b0000 {
|
||||||
compatible = "brcm,bcm7425-sdhci";
|
|
||||||
reg = <0xf03e0000 0x100>;
|
|
||||||
interrupts = <0x0 0x26 0x0>;
|
|
||||||
sdhci,auto-cmd12;
|
|
||||||
clocks = <&sw_sdio>;
|
|
||||||
sd-uhs-sdr50;
|
sd-uhs-sdr50;
|
||||||
sd-uhs-ddr50;
|
sd-uhs-ddr50;
|
||||||
|
sd-uhs-sdr104;
|
||||||
|
sdhci,auto-cmd12;
|
||||||
|
compatible = "brcm,bcm7216-sdhci",
|
||||||
|
"brcm,bcm7445-sdhci",
|
||||||
|
"brcm,sdhci-brcmstb";
|
||||||
|
reg = <0x84b0000 0x260 0x84b0300 0x200>;
|
||||||
|
reg-names = "host", "cfg";
|
||||||
|
interrupts = <0x0 0x26 0x4>;
|
||||||
|
interrupt-names = "sdio0_0";
|
||||||
|
clocks = <&scmi_clk 245>;
|
||||||
|
clock-names = "sw_sdio";
|
||||||
};
|
};
|
||||||
|
|
||||||
sdhci@f03e0300 {
|
sdhci@84b1000 {
|
||||||
|
mmc-ddr-1_8v;
|
||||||
|
mmc-hs200-1_8v;
|
||||||
|
mmc-hs400-1_8v;
|
||||||
|
mmc-hs400-enhanced-strobe;
|
||||||
|
supports-cqe;
|
||||||
non-removable;
|
non-removable;
|
||||||
bus-width = <0x8>;
|
bus-width = <0x8>;
|
||||||
compatible = "brcm,bcm7425-sdhci";
|
compatible = "brcm,bcm7216-sdhci",
|
||||||
reg = <0xf03e0200 0x100>;
|
"brcm,bcm7445-sdhci",
|
||||||
interrupts = <0x0 0x27 0x0>;
|
"brcm,sdhci-brcmstb";
|
||||||
sdhci,auto-cmd12;
|
reg = <0x84b1000 0x260 0x84b1300 0x200>;
|
||||||
clocks = <sw_sdio>;
|
reg-names = "host", "cfg";
|
||||||
mmc-hs200-1_8v;
|
interrupts = <0x0 0x27 0x4>;
|
||||||
|
interrupt-names = "sdio1_0";
|
||||||
|
clocks = <&scmi_clk 245>;
|
||||||
|
clock-names = "sw_sdio";
|
||||||
};
|
};
|
||||||
|
@@ -21,6 +21,7 @@ Required properties:
|
|||||||
"fsl,imx8mq-usdhc"
|
"fsl,imx8mq-usdhc"
|
||||||
"fsl,imx8mm-usdhc"
|
"fsl,imx8mm-usdhc"
|
||||||
"fsl,imx8mn-usdhc"
|
"fsl,imx8mn-usdhc"
|
||||||
|
"fsl,imx8mp-usdhc"
|
||||||
"fsl,imx8qxp-usdhc"
|
"fsl,imx8qxp-usdhc"
|
||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
|
@@ -23,7 +23,8 @@ Required properties:
|
|||||||
"renesas,sdhi-r8a7793" - SDHI IP on R8A7793 SoC
|
"renesas,sdhi-r8a7793" - SDHI IP on R8A7793 SoC
|
||||||
"renesas,sdhi-r8a7794" - SDHI IP on R8A7794 SoC
|
"renesas,sdhi-r8a7794" - SDHI IP on R8A7794 SoC
|
||||||
"renesas,sdhi-r8a7795" - SDHI IP on R8A7795 SoC
|
"renesas,sdhi-r8a7795" - SDHI IP on R8A7795 SoC
|
||||||
"renesas,sdhi-r8a7796" - SDHI IP on R8A7796 SoC
|
"renesas,sdhi-r8a7796" - SDHI IP on R8A77960 SoC
|
||||||
|
"renesas,sdhi-r8a77961" - SDHI IP on R8A77961 SoC
|
||||||
"renesas,sdhi-r8a77965" - SDHI IP on R8A77965 SoC
|
"renesas,sdhi-r8a77965" - SDHI IP on R8A77965 SoC
|
||||||
"renesas,sdhi-r8a77970" - SDHI IP on R8A77970 SoC
|
"renesas,sdhi-r8a77970" - SDHI IP on R8A77970 SoC
|
||||||
"renesas,sdhi-r8a77980" - SDHI IP on R8A77980 SoC
|
"renesas,sdhi-r8a77980" - SDHI IP on R8A77980 SoC
|
||||||
|
@@ -1,49 +0,0 @@
|
|||||||
* Rockchip specific extensions to the Synopsys Designware Mobile
|
|
||||||
Storage Host Controller
|
|
||||||
|
|
||||||
The Synopsys designware mobile storage host controller is used to interface
|
|
||||||
a SoC with storage medium such as eMMC or SD/MMC cards. This file documents
|
|
||||||
differences between the core Synopsys dw mshc controller properties described
|
|
||||||
by synopsys-dw-mshc.txt and the properties used by the Rockchip specific
|
|
||||||
extensions to the Synopsys Designware Mobile Storage Host Controller.
|
|
||||||
|
|
||||||
Required Properties:
|
|
||||||
|
|
||||||
* compatible: should be
|
|
||||||
- "rockchip,rk2928-dw-mshc": for Rockchip RK2928 and following,
|
|
||||||
before RK3288
|
|
||||||
- "rockchip,rk3288-dw-mshc": for Rockchip RK3288
|
|
||||||
- "rockchip,rv1108-dw-mshc", "rockchip,rk3288-dw-mshc": for Rockchip RV1108
|
|
||||||
- "rockchip,px30-dw-mshc", "rockchip,rk3288-dw-mshc": for Rockchip PX30
|
|
||||||
- "rockchip,rk3036-dw-mshc", "rockchip,rk3288-dw-mshc": for Rockchip RK3036
|
|
||||||
- "rockchip,rk3228-dw-mshc", "rockchip,rk3288-dw-mshc": for Rockchip RK322x
|
|
||||||
- "rockchip,rk3328-dw-mshc", "rockchip,rk3288-dw-mshc": for Rockchip RK3328
|
|
||||||
- "rockchip,rk3368-dw-mshc", "rockchip,rk3288-dw-mshc": for Rockchip RK3368
|
|
||||||
- "rockchip,rk3399-dw-mshc", "rockchip,rk3288-dw-mshc": for Rockchip RK3399
|
|
||||||
|
|
||||||
Optional Properties:
|
|
||||||
* clocks: from common clock binding: if ciu-drive and ciu-sample are
|
|
||||||
specified in clock-names, should contain handles to these clocks.
|
|
||||||
|
|
||||||
* clock-names: Apart from the clock-names described in synopsys-dw-mshc.txt
|
|
||||||
two more clocks "ciu-drive" and "ciu-sample" are supported. They are used
|
|
||||||
to control the clock phases, "ciu-sample" is required for tuning high-
|
|
||||||
speed modes.
|
|
||||||
|
|
||||||
* rockchip,default-sample-phase: The default phase to set ciu-sample at
|
|
||||||
probing, low speeds or in case where all phases work at tuning time.
|
|
||||||
If not specified 0 deg will be used.
|
|
||||||
|
|
||||||
* rockchip,desired-num-phases: The desired number of times that the host
|
|
||||||
execute tuning when needed. If not specified, the host will do tuning
|
|
||||||
for 360 times, namely tuning for each degree.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
rkdwmmc0@12200000 {
|
|
||||||
compatible = "rockchip,rk3288-dw-mshc";
|
|
||||||
reg = <0x12200000 0x1000>;
|
|
||||||
interrupts = <0 75 0>;
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
};
|
|
125
Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.yaml
Normal file
125
Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.yaml
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/mmc/rockchip-dw-mshc.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Rockchip designware mobile storage host controller device tree bindings
|
||||||
|
|
||||||
|
description:
|
||||||
|
Rockchip uses the Synopsys designware mobile storage host controller
|
||||||
|
to interface a SoC with storage medium such as eMMC or SD/MMC cards.
|
||||||
|
This file documents the combined properties for the core Synopsys dw mshc
|
||||||
|
controller that are not already included in the synopsys-dw-mshc-common.yaml
|
||||||
|
file and the Rockchip specific extensions.
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: "synopsys-dw-mshc-common.yaml#"
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Heiko Stuebner <heiko@sntech.de>
|
||||||
|
|
||||||
|
# Everything else is described in the common file
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
# for Rockchip RK2928 and before RK3288
|
||||||
|
- const: rockchip,rk2928-dw-mshc
|
||||||
|
# for Rockchip RK3288
|
||||||
|
- const: rockchip,rk3288-dw-mshc
|
||||||
|
- items:
|
||||||
|
- enum:
|
||||||
|
# for Rockchip PX30
|
||||||
|
- rockchip,px30-dw-mshc
|
||||||
|
# for Rockchip RK3036
|
||||||
|
- rockchip,rk3036-dw-mshc
|
||||||
|
# for Rockchip RK322x
|
||||||
|
- rockchip,rk3228-dw-mshc
|
||||||
|
# for Rockchip RK3308
|
||||||
|
- rockchip,rk3308-dw-mshc
|
||||||
|
# for Rockchip RK3328
|
||||||
|
- rockchip,rk3328-dw-mshc
|
||||||
|
# for Rockchip RK3368
|
||||||
|
- rockchip,rk3368-dw-mshc
|
||||||
|
# for Rockchip RK3399
|
||||||
|
- rockchip,rk3399-dw-mshc
|
||||||
|
# for Rockchip RV1108
|
||||||
|
- rockchip,rv1108-dw-mshc
|
||||||
|
- const: rockchip,rk3288-dw-mshc
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
minItems: 2
|
||||||
|
maxItems: 4
|
||||||
|
description:
|
||||||
|
Handle to "biu" and "ciu" clocks for the bus interface unit clock and
|
||||||
|
the card interface unit clock. If "ciu-drive" and "ciu-sample" are
|
||||||
|
specified in clock-names, it should also contain
|
||||||
|
handles to these clocks.
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
minItems: 2
|
||||||
|
items:
|
||||||
|
- const: biu
|
||||||
|
- const: ciu
|
||||||
|
- const: ciu-drive
|
||||||
|
- const: ciu-sample
|
||||||
|
description:
|
||||||
|
Apart from the clock-names "biu" and "ciu" two more clocks
|
||||||
|
"ciu-drive" and "ciu-sample" are supported. They are used
|
||||||
|
to control the clock phases, "ciu-sample" is required for tuning
|
||||||
|
high speed modes.
|
||||||
|
|
||||||
|
rockchip,default-sample-phase:
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
minimum: 0
|
||||||
|
maximum: 360
|
||||||
|
default: 0
|
||||||
|
description:
|
||||||
|
The default phase to set "ciu-sample" at probing,
|
||||||
|
low speeds or in case where all phases work at tuning time.
|
||||||
|
If not specified 0 deg will be used.
|
||||||
|
|
||||||
|
rockchip,desired-num-phases:
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
minimum: 0
|
||||||
|
maximum: 360
|
||||||
|
default: 360
|
||||||
|
description:
|
||||||
|
The desired number of times that the host execute tuning when needed.
|
||||||
|
If not specified, the host will do tuning for 360 times,
|
||||||
|
namely tuning for each degree.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/rk3288-cru.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
sdmmc: mmc@ff0c0000 {
|
||||||
|
compatible = "rockchip,rk3288-dw-mshc";
|
||||||
|
reg = <0x0 0xff0c0000 0x0 0x4000>;
|
||||||
|
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>,
|
||||||
|
<&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
|
||||||
|
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
|
||||||
|
resets = <&cru SRST_MMC0>;
|
||||||
|
reset-names = "reset";
|
||||||
|
fifo-depth = <0x100>;
|
||||||
|
max-frequency = <150000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@@ -5,11 +5,16 @@ Documentation/devicetree/bindings/mmc/mmc.txt and the properties used by the
|
|||||||
sdhci-of-at91 driver.
|
sdhci-of-at91 driver.
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: Must be "atmel,sama5d2-sdhci".
|
- compatible: Must be "atmel,sama5d2-sdhci" or "microchip,sam9x60-sdhci".
|
||||||
- clocks: Phandlers to the clocks.
|
- clocks: Phandlers to the clocks.
|
||||||
- clock-names: Must be "hclock", "multclk", "baseclk";
|
- clock-names: Must be "hclock", "multclk", "baseclk" for
|
||||||
|
"atmel,sama5d2-sdhci".
|
||||||
|
Must be "hclock", "multclk" for "microchip,sam9x60-sdhci".
|
||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
|
- assigned-clocks: The same with "multclk".
|
||||||
|
- assigned-clock-rates The rate of "multclk" in order to not rely on the
|
||||||
|
gck configuration set by previous components.
|
||||||
- microchip,sdcal-inverted: when present, polarity on the SDCAL SoC pin is
|
- microchip,sdcal-inverted: when present, polarity on the SDCAL SoC pin is
|
||||||
inverted. The default polarity for this signal is described in the datasheet.
|
inverted. The default polarity for this signal is described in the datasheet.
|
||||||
For instance on SAMA5D2, the pin is usually tied to the GND with a resistor
|
For instance on SAMA5D2, the pin is usually tied to the GND with a resistor
|
||||||
@@ -17,10 +22,12 @@ Optional properties:
|
|||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
sdmmc0: sdio-host@a0000000 {
|
mmc0: sdio-host@a0000000 {
|
||||||
compatible = "atmel,sama5d2-sdhci";
|
compatible = "atmel,sama5d2-sdhci";
|
||||||
reg = <0xa0000000 0x300>;
|
reg = <0xa0000000 0x300>;
|
||||||
interrupts = <31 IRQ_TYPE_LEVEL_HIGH 0>;
|
interrupts = <31 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||||
clocks = <&sdmmc0_hclk>, <&sdmmc0_gclk>, <&main>;
|
clocks = <&sdmmc0_hclk>, <&sdmmc0_gclk>, <&main>;
|
||||||
clock-names = "hclock", "multclk", "baseclk";
|
clock-names = "hclock", "multclk", "baseclk";
|
||||||
|
assigned-clocks = <&sdmmc0_gclk>;
|
||||||
|
assigned-clock-rates = <480000000>;
|
||||||
};
|
};
|
||||||
|
@@ -19,6 +19,7 @@ Required properties:
|
|||||||
"qcom,msm8996-sdhci", "qcom,sdhci-msm-v4"
|
"qcom,msm8996-sdhci", "qcom,sdhci-msm-v4"
|
||||||
"qcom,sdm845-sdhci", "qcom,sdhci-msm-v5"
|
"qcom,sdm845-sdhci", "qcom,sdhci-msm-v5"
|
||||||
"qcom,qcs404-sdhci", "qcom,sdhci-msm-v5"
|
"qcom,qcs404-sdhci", "qcom,sdhci-msm-v5"
|
||||||
|
"qcom,sc7180-sdhci", "qcom,sdhci-msm-v5";
|
||||||
NOTE that some old device tree files may be floating around that only
|
NOTE that some old device tree files may be floating around that only
|
||||||
have the string "qcom,sdhci-msm-v4" without the SoC compatible string
|
have the string "qcom,sdhci-msm-v4" without the SoC compatible string
|
||||||
but doing that should be considered a deprecated practice.
|
but doing that should be considered a deprecated practice.
|
||||||
|
@@ -7,6 +7,8 @@ For UHS devices which require tuning, the device tree should have a "cpu_thermal
|
|||||||
Required properties:
|
Required properties:
|
||||||
- compatible: Should be "ti,dra7-sdhci" for DRA7 and DRA72 controllers
|
- compatible: Should be "ti,dra7-sdhci" for DRA7 and DRA72 controllers
|
||||||
Should be "ti,k2g-sdhci" for K2G
|
Should be "ti,k2g-sdhci" for K2G
|
||||||
|
Should be "ti,am335-sdhci" for am335x controllers
|
||||||
|
Should be "ti,am437-sdhci" for am437x controllers
|
||||||
- ti,hwmods: Must be "mmc<n>", <n> is controller instance starting 1
|
- ti,hwmods: Must be "mmc<n>", <n> is controller instance starting 1
|
||||||
(Not required for K2G).
|
(Not required for K2G).
|
||||||
- pinctrl-names: Should be subset of "default", "hs", "sdr12", "sdr25", "sdr50",
|
- pinctrl-names: Should be subset of "default", "hs", "sdr12", "sdr25", "sdr50",
|
||||||
@@ -15,6 +17,13 @@ Required properties:
|
|||||||
"hs200_1_8v",
|
"hs200_1_8v",
|
||||||
- pinctrl-<n> : Pinctrl states as described in bindings/pinctrl/pinctrl-bindings.txt
|
- pinctrl-<n> : Pinctrl states as described in bindings/pinctrl/pinctrl-bindings.txt
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
- dmas: List of DMA specifiers with the controller specific format as described
|
||||||
|
in the generic DMA client binding. A tx and rx specifier is required.
|
||||||
|
- dma-names: List of DMA request names. These strings correspond 1:1 with the
|
||||||
|
DMA specifiers listed in dmas. The string naming is to be "tx"
|
||||||
|
and "rx" for TX and RX DMA requests, respectively.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
mmc1: mmc@4809c000 {
|
mmc1: mmc@4809c000 {
|
||||||
compatible = "ti,dra7-sdhci";
|
compatible = "ti,dra7-sdhci";
|
||||||
@@ -22,4 +31,6 @@ Example:
|
|||||||
ti,hwmods = "mmc1";
|
ti,hwmods = "mmc1";
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
vmmc-supply = <&vmmc>; /* phandle to regulator node */
|
vmmc-supply = <&vmmc>; /* phandle to regulator node */
|
||||||
|
dmas = <&sdma 61 &sdma 62>;
|
||||||
|
dma-names = "tx", "rx";
|
||||||
};
|
};
|
||||||
|
@@ -0,0 +1,68 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/mmc/synopsys-dw-mshc-common.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Synopsys Designware Mobile Storage Host Controller Common Properties
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: "mmc-controller.yaml#"
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Ulf Hansson <ulf.hansson@linaro.org>
|
||||||
|
|
||||||
|
# Everything else is described in the common file
|
||||||
|
properties:
|
||||||
|
resets:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
const: reset
|
||||||
|
|
||||||
|
clock-frequency:
|
||||||
|
description:
|
||||||
|
Should be the frequency (in Hz) of the ciu clock. If this
|
||||||
|
is specified and the ciu clock is specified then we'll try to set the ciu
|
||||||
|
clock to this at probe time.
|
||||||
|
|
||||||
|
fifo-depth:
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
description:
|
||||||
|
The maximum size of the tx/rx fifo's. If this property is not
|
||||||
|
specified, the default value of the fifo size is determined from the
|
||||||
|
controller registers.
|
||||||
|
|
||||||
|
card-detect-delay:
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
- default: 0
|
||||||
|
description:
|
||||||
|
Delay in milli-seconds before detecting card after card
|
||||||
|
insert event. The default value is 0.
|
||||||
|
|
||||||
|
data-addr:
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
description:
|
||||||
|
Override fifo address with value provided by DT. The default FIFO reg
|
||||||
|
offset is assumed as 0x100 (version < 0x240A) and 0x200(version >= 0x240A)
|
||||||
|
by driver. If the controller does not follow this rule, please use
|
||||||
|
this property to set fifo address in device tree.
|
||||||
|
|
||||||
|
fifo-watermark-aligned:
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
description:
|
||||||
|
Data done irq is expected if data length is less than
|
||||||
|
watermark in PIO mode. But fifo watermark is requested to be aligned
|
||||||
|
with data length in some SoC so that TX/RX irq can be generated with
|
||||||
|
data done irq. Add this watermark quirk to mark this requirement and
|
||||||
|
force fifo watermark setting accordingly.
|
||||||
|
|
||||||
|
dmas:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
dma-names:
|
||||||
|
const: rx-tx
|
@@ -1,141 +0,0 @@
|
|||||||
* Synopsys Designware Mobile Storage Host Controller
|
|
||||||
|
|
||||||
The Synopsys designware mobile storage host controller is used to interface
|
|
||||||
a SoC with storage medium such as eMMC or SD/MMC cards. This file documents
|
|
||||||
differences between the core mmc properties described by mmc.txt and the
|
|
||||||
properties used by the Synopsys Designware Mobile Storage Host Controller.
|
|
||||||
|
|
||||||
Required Properties:
|
|
||||||
|
|
||||||
* compatible: should be
|
|
||||||
- snps,dw-mshc: for controllers compliant with synopsys dw-mshc.
|
|
||||||
* #address-cells: should be 1.
|
|
||||||
* #size-cells: should be 0.
|
|
||||||
|
|
||||||
# Slots (DEPRECATED): The slot specific information are contained within
|
|
||||||
child-nodes with each child-node representing a supported slot. There should
|
|
||||||
be atleast one child node representing a card slot. The name of the child node
|
|
||||||
representing the slot is recommended to be slot@n where n is the unique number
|
|
||||||
of the slot connected to the controller. The following are optional properties
|
|
||||||
which can be included in the slot child node.
|
|
||||||
|
|
||||||
* reg: specifies the physical slot number. The valid values of this
|
|
||||||
property is 0 to (num-slots -1), where num-slots is the value
|
|
||||||
specified by the num-slots property.
|
|
||||||
|
|
||||||
* bus-width: as documented in mmc core bindings.
|
|
||||||
|
|
||||||
* wp-gpios: specifies the write protect gpio line. The format of the
|
|
||||||
gpio specifier depends on the gpio controller. If a GPIO is not used
|
|
||||||
for write-protect, this property is optional.
|
|
||||||
|
|
||||||
* disable-wp: If the wp-gpios property isn't present then (by default)
|
|
||||||
we'd assume that the write protect is hooked up directly to the
|
|
||||||
controller's special purpose write protect line (accessible via
|
|
||||||
the WRTPRT register). However, it's possible that we simply don't
|
|
||||||
want write protect. In that case specify 'disable-wp'.
|
|
||||||
NOTE: This property is not required for slots known to always
|
|
||||||
connect to eMMC or SDIO cards.
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
|
|
||||||
* resets: phandle + reset specifier pair, intended to represent hardware
|
|
||||||
reset signal present internally in some host controller IC designs.
|
|
||||||
See Documentation/devicetree/bindings/reset/reset.txt for details.
|
|
||||||
|
|
||||||
* reset-names: request name for using "resets" property. Must be "reset".
|
|
||||||
(It will be used together with "resets" property.)
|
|
||||||
|
|
||||||
* clocks: from common clock binding: handle to biu and ciu clocks for the
|
|
||||||
bus interface unit clock and the card interface unit clock.
|
|
||||||
|
|
||||||
* clock-names: from common clock binding: Shall be "biu" and "ciu".
|
|
||||||
If the biu clock is missing we'll simply skip enabling it. If the
|
|
||||||
ciu clock is missing we'll just assume that the clock is running at
|
|
||||||
clock-frequency. It is an error to omit both the ciu clock and the
|
|
||||||
clock-frequency.
|
|
||||||
|
|
||||||
* clock-frequency: should be the frequency (in Hz) of the ciu clock. If this
|
|
||||||
is specified and the ciu clock is specified then we'll try to set the ciu
|
|
||||||
clock to this at probe time.
|
|
||||||
|
|
||||||
* fifo-depth: The maximum size of the tx/rx fifo's. If this property is not
|
|
||||||
specified, the default value of the fifo size is determined from the
|
|
||||||
controller registers.
|
|
||||||
|
|
||||||
* card-detect-delay: Delay in milli-seconds before detecting card after card
|
|
||||||
insert event. The default value is 0.
|
|
||||||
|
|
||||||
* data-addr: Override fifo address with value provided by DT. The default FIFO reg
|
|
||||||
offset is assumed as 0x100 (version < 0x240A) and 0x200(version >= 0x240A) by
|
|
||||||
driver. If the controller does not follow this rule, please use this property
|
|
||||||
to set fifo address in device tree.
|
|
||||||
|
|
||||||
* fifo-watermark-aligned: Data done irq is expected if data length is less than
|
|
||||||
watermark in PIO mode. But fifo watermark is requested to be aligned with data
|
|
||||||
length in some SoC so that TX/RX irq can be generated with data done irq. Add this
|
|
||||||
watermark quirk to mark this requirement and force fifo watermark setting
|
|
||||||
accordingly.
|
|
||||||
|
|
||||||
* vmmc-supply: The phandle to the regulator to use for vmmc. If this is
|
|
||||||
specified we'll defer probe until we can find this regulator.
|
|
||||||
|
|
||||||
* dmas: List of DMA specifiers with the controller specific format as described
|
|
||||||
in the generic DMA client binding. Refer to dma.txt for details.
|
|
||||||
|
|
||||||
* dma-names: request names for generic DMA client binding. Must be "rx-tx".
|
|
||||||
Refer to dma.txt for details.
|
|
||||||
|
|
||||||
Aliases:
|
|
||||||
|
|
||||||
- All the MSHC controller nodes should be represented in the aliases node using
|
|
||||||
the following format 'mshc{n}' where n is a unique number for the alias.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
The MSHC controller node can be split into two portions, SoC specific and
|
|
||||||
board specific portions as listed below.
|
|
||||||
|
|
||||||
dwmmc0@12200000 {
|
|
||||||
compatible = "snps,dw-mshc";
|
|
||||||
clocks = <&clock 351>, <&clock 132>;
|
|
||||||
clock-names = "biu", "ciu";
|
|
||||||
reg = <0x12200000 0x1000>;
|
|
||||||
interrupts = <0 75 0>;
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
data-addr = <0x200>;
|
|
||||||
fifo-watermark-aligned;
|
|
||||||
resets = <&rst 20>;
|
|
||||||
reset-names = "reset";
|
|
||||||
};
|
|
||||||
|
|
||||||
[board specific internal DMA resources]
|
|
||||||
|
|
||||||
dwmmc0@12200000 {
|
|
||||||
clock-frequency = <400000000>;
|
|
||||||
clock-freq-min-max = <400000 200000000>;
|
|
||||||
broken-cd;
|
|
||||||
fifo-depth = <0x80>;
|
|
||||||
card-detect-delay = <200>;
|
|
||||||
vmmc-supply = <&buck8>;
|
|
||||||
bus-width = <8>;
|
|
||||||
cap-mmc-highspeed;
|
|
||||||
cap-sd-highspeed;
|
|
||||||
};
|
|
||||||
|
|
||||||
[board specific generic DMA request binding]
|
|
||||||
|
|
||||||
dwmmc0@12200000 {
|
|
||||||
clock-frequency = <400000000>;
|
|
||||||
clock-freq-min-max = <400000 200000000>;
|
|
||||||
broken-cd;
|
|
||||||
fifo-depth = <0x80>;
|
|
||||||
card-detect-delay = <200>;
|
|
||||||
vmmc-supply = <&buck8>;
|
|
||||||
bus-width = <8>;
|
|
||||||
cap-mmc-highspeed;
|
|
||||||
cap-sd-highspeed;
|
|
||||||
dmas = <&pdma 12>;
|
|
||||||
dma-names = "rx-tx";
|
|
||||||
};
|
|
70
Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.yaml
Normal file
70
Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.yaml
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/mmc/synopsys-dw-mshc.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Synopsys Designware Mobile Storage Host Controller Binding
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: "synopsys-dw-mshc-common.yaml#"
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Ulf Hansson <ulf.hansson@linaro.org>
|
||||||
|
|
||||||
|
# Everything else is described in the common file
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: snps,dw-mshc
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
minItems: 2
|
||||||
|
maxItems: 2
|
||||||
|
description:
|
||||||
|
Handle to "biu" and "ciu" clocks for the
|
||||||
|
bus interface unit clock and the card interface unit clock.
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: biu
|
||||||
|
- const: ciu
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
mmc@12200000 {
|
||||||
|
compatible = "snps,dw-mshc";
|
||||||
|
reg = <0x12200000 0x1000>;
|
||||||
|
interrupts = <0 75 0>;
|
||||||
|
clocks = <&clock 351>, <&clock 132>;
|
||||||
|
clock-names = "biu", "ciu";
|
||||||
|
dmas = <&pdma 12>;
|
||||||
|
dma-names = "rx-tx";
|
||||||
|
resets = <&rst 20>;
|
||||||
|
reset-names = "reset";
|
||||||
|
vmmc-supply = <&buck8>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
broken-cd;
|
||||||
|
bus-width = <8>;
|
||||||
|
cap-mmc-highspeed;
|
||||||
|
cap-sd-highspeed;
|
||||||
|
card-detect-delay = <200>;
|
||||||
|
clock-freq-min-max = <400000 200000000>;
|
||||||
|
clock-frequency = <400000000>;
|
||||||
|
data-addr = <0x200>;
|
||||||
|
fifo-depth = <0x80>;
|
||||||
|
fifo-watermark-aligned;
|
||||||
|
};
|
130
Documentation/devicetree/bindings/power/avs/qcom,cpr.txt
Normal file
130
Documentation/devicetree/bindings/power/avs/qcom,cpr.txt
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
QCOM CPR (Core Power Reduction)
|
||||||
|
|
||||||
|
CPR (Core Power Reduction) is a technology to reduce core power on a CPU
|
||||||
|
or other device. Each OPP of a device corresponds to a "corner" that has
|
||||||
|
a range of valid voltages for a particular frequency. While the device is
|
||||||
|
running at a particular frequency, CPR monitors dynamic factors such as
|
||||||
|
temperature, etc. and suggests adjustments to the voltage to save power
|
||||||
|
and meet silicon characteristic requirements.
|
||||||
|
|
||||||
|
- compatible:
|
||||||
|
Usage: required
|
||||||
|
Value type: <string>
|
||||||
|
Definition: should be "qcom,qcs404-cpr", "qcom,cpr" for qcs404
|
||||||
|
|
||||||
|
- reg:
|
||||||
|
Usage: required
|
||||||
|
Value type: <prop-encoded-array>
|
||||||
|
Definition: base address and size of the rbcpr register region
|
||||||
|
|
||||||
|
- interrupts:
|
||||||
|
Usage: required
|
||||||
|
Value type: <prop-encoded-array>
|
||||||
|
Definition: should specify the CPR interrupt
|
||||||
|
|
||||||
|
- clocks:
|
||||||
|
Usage: required
|
||||||
|
Value type: <prop-encoded-array>
|
||||||
|
Definition: phandle to the reference clock
|
||||||
|
|
||||||
|
- clock-names:
|
||||||
|
Usage: required
|
||||||
|
Value type: <stringlist>
|
||||||
|
Definition: must be "ref"
|
||||||
|
|
||||||
|
- vdd-apc-supply:
|
||||||
|
Usage: required
|
||||||
|
Value type: <phandle>
|
||||||
|
Definition: phandle to the vdd-apc-supply regulator
|
||||||
|
|
||||||
|
- #power-domain-cells:
|
||||||
|
Usage: required
|
||||||
|
Value type: <u32>
|
||||||
|
Definition: should be 0
|
||||||
|
|
||||||
|
- operating-points-v2:
|
||||||
|
Usage: required
|
||||||
|
Value type: <phandle>
|
||||||
|
Definition: A phandle to the OPP table containing the
|
||||||
|
performance states supported by the CPR
|
||||||
|
power domain
|
||||||
|
|
||||||
|
- acc-syscon:
|
||||||
|
Usage: optional
|
||||||
|
Value type: <phandle>
|
||||||
|
Definition: phandle to syscon for writing ACC settings
|
||||||
|
|
||||||
|
- nvmem-cells:
|
||||||
|
Usage: required
|
||||||
|
Value type: <phandle>
|
||||||
|
Definition: phandle to nvmem cells containing the data
|
||||||
|
that makes up a fuse corner, for each fuse corner.
|
||||||
|
As well as the CPR fuse revision.
|
||||||
|
|
||||||
|
- nvmem-cell-names:
|
||||||
|
Usage: required
|
||||||
|
Value type: <stringlist>
|
||||||
|
Definition: should be "cpr_quotient_offset1", "cpr_quotient_offset2",
|
||||||
|
"cpr_quotient_offset3", "cpr_init_voltage1",
|
||||||
|
"cpr_init_voltage2", "cpr_init_voltage3", "cpr_quotient1",
|
||||||
|
"cpr_quotient2", "cpr_quotient3", "cpr_ring_osc1",
|
||||||
|
"cpr_ring_osc2", "cpr_ring_osc3", "cpr_fuse_revision"
|
||||||
|
for qcs404.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
cpr_opp_table: cpr-opp-table {
|
||||||
|
compatible = "operating-points-v2-qcom-level";
|
||||||
|
|
||||||
|
cpr_opp1: opp1 {
|
||||||
|
opp-level = <1>;
|
||||||
|
qcom,opp-fuse-level = <1>;
|
||||||
|
};
|
||||||
|
cpr_opp2: opp2 {
|
||||||
|
opp-level = <2>;
|
||||||
|
qcom,opp-fuse-level = <2>;
|
||||||
|
};
|
||||||
|
cpr_opp3: opp3 {
|
||||||
|
opp-level = <3>;
|
||||||
|
qcom,opp-fuse-level = <3>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
power-controller@b018000 {
|
||||||
|
compatible = "qcom,qcs404-cpr", "qcom,cpr";
|
||||||
|
reg = <0x0b018000 0x1000>;
|
||||||
|
interrupts = <0 15 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
clocks = <&xo_board>;
|
||||||
|
clock-names = "ref";
|
||||||
|
vdd-apc-supply = <&pms405_s3>;
|
||||||
|
#power-domain-cells = <0>;
|
||||||
|
operating-points-v2 = <&cpr_opp_table>;
|
||||||
|
acc-syscon = <&tcsr>;
|
||||||
|
|
||||||
|
nvmem-cells = <&cpr_efuse_quot_offset1>,
|
||||||
|
<&cpr_efuse_quot_offset2>,
|
||||||
|
<&cpr_efuse_quot_offset3>,
|
||||||
|
<&cpr_efuse_init_voltage1>,
|
||||||
|
<&cpr_efuse_init_voltage2>,
|
||||||
|
<&cpr_efuse_init_voltage3>,
|
||||||
|
<&cpr_efuse_quot1>,
|
||||||
|
<&cpr_efuse_quot2>,
|
||||||
|
<&cpr_efuse_quot3>,
|
||||||
|
<&cpr_efuse_ring1>,
|
||||||
|
<&cpr_efuse_ring2>,
|
||||||
|
<&cpr_efuse_ring3>,
|
||||||
|
<&cpr_efuse_revision>;
|
||||||
|
nvmem-cell-names = "cpr_quotient_offset1",
|
||||||
|
"cpr_quotient_offset2",
|
||||||
|
"cpr_quotient_offset3",
|
||||||
|
"cpr_init_voltage1",
|
||||||
|
"cpr_init_voltage2",
|
||||||
|
"cpr_init_voltage3",
|
||||||
|
"cpr_quotient1",
|
||||||
|
"cpr_quotient2",
|
||||||
|
"cpr_quotient3",
|
||||||
|
"cpr_ring_osc1",
|
||||||
|
"cpr_ring_osc2",
|
||||||
|
"cpr_ring_osc3",
|
||||||
|
"cpr_fuse_revision";
|
||||||
|
};
|
22
Documentation/devicetree/bindings/regulator/mp8859.txt
Normal file
22
Documentation/devicetree/bindings/regulator/mp8859.txt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
Monolithic Power Systems MP8859 voltage regulator
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible: "mps,mp8859";
|
||||||
|
- reg: I2C slave address.
|
||||||
|
|
||||||
|
Optional subnode for regulator: "mp8859_dcdc", using common regulator
|
||||||
|
bindings given in <Documentation/devicetree/bindings/regulator/regulator.txt>.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
mp8859: regulator@66 {
|
||||||
|
compatible = "mps,mp8859";
|
||||||
|
reg = <0x66>;
|
||||||
|
dc_12v: mp8859_dcdc {
|
||||||
|
regulator-name = "dc_12v";
|
||||||
|
regulator-min-microvolt = <12000000>;
|
||||||
|
regulator-max-microvolt = <12000000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
regulator-always-on;
|
||||||
|
};
|
||||||
|
};
|
121
Documentation/devicetree/bindings/regulator/mps,mpq7920.yaml
Normal file
121
Documentation/devicetree/bindings/regulator/mps,mpq7920.yaml
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/regulator/mps,mpq7920.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Monolithic Power System MPQ7920 PMIC
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Saravanan Sekar <sravanhome@gmail.com>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
$nodename:
|
||||||
|
pattern: "pmic@[0-9a-f]{1,2}"
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- mps,mpq7920
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
regulators:
|
||||||
|
type: object
|
||||||
|
allOf:
|
||||||
|
- $ref: regulator.yaml#
|
||||||
|
description: |
|
||||||
|
list of regulators provided by this controller, must be named
|
||||||
|
after their hardware counterparts BUCK[1-4], one LDORTC, and LDO[2-5]
|
||||||
|
|
||||||
|
properties:
|
||||||
|
mps,switch-freq:
|
||||||
|
allOf:
|
||||||
|
- $ref: "/schemas/types.yaml#/definitions/uint8"
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
default: 2
|
||||||
|
description: |
|
||||||
|
switching frequency must be one of following corresponding value
|
||||||
|
1.1MHz, 1.65MHz, 2.2MHz, 2.75MHz
|
||||||
|
|
||||||
|
patternProperties:
|
||||||
|
"^ldo[1-4]$":
|
||||||
|
type: object
|
||||||
|
allOf:
|
||||||
|
- $ref: regulator.yaml#
|
||||||
|
|
||||||
|
"^ldortc$":
|
||||||
|
type: object
|
||||||
|
allOf:
|
||||||
|
- $ref: regulator.yaml#
|
||||||
|
|
||||||
|
"^buck[1-4]$":
|
||||||
|
type: object
|
||||||
|
allOf:
|
||||||
|
- $ref: regulator.yaml#
|
||||||
|
|
||||||
|
properties:
|
||||||
|
mps,buck-softstart:
|
||||||
|
allOf:
|
||||||
|
- $ref: "/schemas/types.yaml#/definitions/uint8"
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
description: |
|
||||||
|
defines the soft start time of this buck, must be one of the following
|
||||||
|
corresponding values 150us, 300us, 610us, 920us
|
||||||
|
|
||||||
|
mps,buck-phase-delay:
|
||||||
|
allOf:
|
||||||
|
- $ref: "/schemas/types.yaml#/definitions/uint8"
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
description: |
|
||||||
|
defines the phase delay of this buck, must be one of the following
|
||||||
|
corresponding values 0deg, 90deg, 180deg, 270deg
|
||||||
|
|
||||||
|
mps,buck-ovp-disable:
|
||||||
|
type: boolean
|
||||||
|
description: |
|
||||||
|
disables over voltage protection of this buck
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- regulators
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
i2c {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
pmic@69 {
|
||||||
|
compatible = "mps,mpq7920";
|
||||||
|
reg = <0x69>;
|
||||||
|
|
||||||
|
regulators {
|
||||||
|
mps,switch-freq = /bits/ 8 <1>;
|
||||||
|
|
||||||
|
buck1 {
|
||||||
|
regulator-name = "buck1";
|
||||||
|
regulator-min-microvolt = <400000>;
|
||||||
|
regulator-max-microvolt = <3587500>;
|
||||||
|
regulator-min-microamp = <460000>;
|
||||||
|
regulator-max-microamp = <7600000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
mps,buck-ovp-disable;
|
||||||
|
mps,buck-phase-delay = /bits/ 8 <2>;
|
||||||
|
mps,buck-softstart = /bits/ 8 <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
ldo2 {
|
||||||
|
regulator-name = "ldo2";
|
||||||
|
regulator-min-microvolt = <650000>;
|
||||||
|
regulator-max-microvolt = <3587500>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
...
|
@@ -0,0 +1,107 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/regulator/rohm,bd71828-regulator.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: ROHM BD71828 Power Management Integrated Circuit regulators
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
This module is part of the ROHM BD71828 MFD device. For more details
|
||||||
|
see Documentation/devicetree/bindings/mfd/rohm,bd71828-pmic.yaml.
|
||||||
|
|
||||||
|
The regulator controller is represented as a sub-node of the PMIC node
|
||||||
|
on the device tree.
|
||||||
|
|
||||||
|
Regulator nodes should be named to BUCK_<number> and LDO_<number>.
|
||||||
|
The valid names for BD71828 regulator nodes are
|
||||||
|
BUCK1, BUCK2, BUCK3, BUCK4, BUCK5, BUCK6, BUCK7
|
||||||
|
LDO1, LDO2, LDO3, LDO4, LDO5, LDO6, LDO7
|
||||||
|
|
||||||
|
patternProperties:
|
||||||
|
"^LDO[1-7]$":
|
||||||
|
type: object
|
||||||
|
allOf:
|
||||||
|
- $ref: regulator.yaml#
|
||||||
|
description:
|
||||||
|
Properties for single LDO regulator.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
regulator-name:
|
||||||
|
pattern: "^ldo[1-7]$"
|
||||||
|
description:
|
||||||
|
should be "ldo1", ..., "ldo7"
|
||||||
|
|
||||||
|
"^BUCK[1-7]$":
|
||||||
|
type: object
|
||||||
|
allOf:
|
||||||
|
- $ref: regulator.yaml#
|
||||||
|
description:
|
||||||
|
Properties for single BUCK regulator.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
regulator-name:
|
||||||
|
pattern: "^buck[1-7]$"
|
||||||
|
description:
|
||||||
|
should be "buck1", ..., "buck7"
|
||||||
|
|
||||||
|
rohm,dvs-run-voltage:
|
||||||
|
allOf:
|
||||||
|
- $ref: "/schemas/types.yaml#/definitions/uint32"
|
||||||
|
- minimum: 0
|
||||||
|
maximum: 3300000
|
||||||
|
description:
|
||||||
|
PMIC default "RUN" state voltage in uV. See below table for
|
||||||
|
bucks which support this. 0 means disabled.
|
||||||
|
|
||||||
|
rohm,dvs-idle-voltage:
|
||||||
|
allOf:
|
||||||
|
- $ref: "/schemas/types.yaml#/definitions/uint32"
|
||||||
|
- minimum: 0
|
||||||
|
maximum: 3300000
|
||||||
|
description:
|
||||||
|
PMIC default "IDLE" state voltage in uV. See below table for
|
||||||
|
bucks which support this. 0 means disabled.
|
||||||
|
|
||||||
|
rohm,dvs-suspend-voltage:
|
||||||
|
allOf:
|
||||||
|
- $ref: "/schemas/types.yaml#/definitions/uint32"
|
||||||
|
- minimum: 0
|
||||||
|
maximum: 3300000
|
||||||
|
description:
|
||||||
|
PMIC default "SUSPEND" state voltage in uV. See below table for
|
||||||
|
bucks which support this. 0 means disabled.
|
||||||
|
|
||||||
|
rohm,dvs-lpsr-voltage:
|
||||||
|
allOf:
|
||||||
|
- $ref: "/schemas/types.yaml#/definitions/uint32"
|
||||||
|
- minimum: 0
|
||||||
|
maximum: 3300000
|
||||||
|
description:
|
||||||
|
PMIC default "LPSR" state voltage in uV. See below table for
|
||||||
|
bucks which support this. 0 means disabled.
|
||||||
|
|
||||||
|
# Supported default DVS states:
|
||||||
|
# buck | run | idle | suspend | lpsr
|
||||||
|
#--------------------------------------------------------------
|
||||||
|
# 1, 2, 6, and 7 | supported | supported | supported (*)
|
||||||
|
#--------------------------------------------------------------
|
||||||
|
# 3, 4, and 5 | supported (**)
|
||||||
|
#--------------------------------------------------------------
|
||||||
|
#
|
||||||
|
#(*) LPSR and SUSPEND states use same voltage but both states have own
|
||||||
|
# enable /
|
||||||
|
# disable settings. Voltage 0 can be specified for a state to make
|
||||||
|
# regulator disabled on that state.
|
||||||
|
#
|
||||||
|
#(**) All states use same voltage but have own enable / disable
|
||||||
|
# settings. Voltage 0 can be specified for a state to make
|
||||||
|
# regulator disabled on that state.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- regulator-name
|
||||||
|
additionalProperties: false
|
||||||
|
additionalProperties: false
|
@@ -1,18 +0,0 @@
|
|||||||
STM32 BOOSTER - Booster for ADC analog input switches
|
|
||||||
|
|
||||||
Some STM32 devices embed a 3.3V booster supplied by Vdda, that can be used
|
|
||||||
to supply ADC analog input switches.
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible: Should be one of:
|
|
||||||
"st,stm32h7-booster"
|
|
||||||
"st,stm32mp1-booster"
|
|
||||||
- st,syscfg: Phandle to system configuration controller.
|
|
||||||
- vdda-supply: Phandle to the vdda input analog voltage.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
booster: regulator-booster {
|
|
||||||
compatible = "st,stm32mp1-booster";
|
|
||||||
st,syscfg = <&syscfg>;
|
|
||||||
vdda-supply = <&vdda>;
|
|
||||||
};
|
|
@@ -0,0 +1,46 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/regulator/st,stm32-booster.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: STMicroelectronics STM32 booster for ADC analog input switches bindings
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Fabrice Gasnier <fabrice.gasnier@st.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Some STM32 devices embed a 3.3V booster supplied by Vdda, that can be used
|
||||||
|
to supply ADC analog input switches.
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: "regulator.yaml#"
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- st,stm32h7-booster
|
||||||
|
- st,stm32mp1-booster
|
||||||
|
|
||||||
|
st,syscfg:
|
||||||
|
allOf:
|
||||||
|
- $ref: "/schemas/types.yaml#/definitions/phandle-array"
|
||||||
|
description: phandle to system configuration controller.
|
||||||
|
|
||||||
|
vdda-supply:
|
||||||
|
description: phandle to the vdda input analog voltage.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- st,syscfg
|
||||||
|
- vdda-supply
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
regulator-booster {
|
||||||
|
compatible = "st,stm32mp1-booster";
|
||||||
|
st,syscfg = <&syscfg>;
|
||||||
|
vdda-supply = <&vdda>;
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@@ -1,20 +0,0 @@
|
|||||||
STM32 VREFBUF - Voltage reference buffer
|
|
||||||
|
|
||||||
Some STM32 devices embed a voltage reference buffer which can be used as
|
|
||||||
voltage reference for ADCs, DACs and also as voltage reference for external
|
|
||||||
components through the dedicated VREF+ pin.
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible: Must be "st,stm32-vrefbuf".
|
|
||||||
- reg: Offset and length of VREFBUF register set.
|
|
||||||
- clocks: Must contain an entry for peripheral clock.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
vrefbuf: regulator@58003c00 {
|
|
||||||
compatible = "st,stm32-vrefbuf";
|
|
||||||
reg = <0x58003C00 0x8>;
|
|
||||||
clocks = <&rcc VREF_CK>;
|
|
||||||
regulator-min-microvolt = <1500000>;
|
|
||||||
regulator-max-microvolt = <2500000>;
|
|
||||||
vdda-supply = <&vdda>;
|
|
||||||
};
|
|
@@ -0,0 +1,52 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/regulator/st,stm32-vrefbuf.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: STMicroelectronics STM32 Voltage reference buffer bindings
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Some STM32 devices embed a voltage reference buffer which can be used as
|
||||||
|
voltage reference for ADCs, DACs and also as voltage reference for external
|
||||||
|
components through the dedicated VREF+ pin.
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Fabrice Gasnier <fabrice.gasnier@st.com>
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: "regulator.yaml#"
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: st,stm32-vrefbuf
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
vdda-supply:
|
||||||
|
description: phandle to the vdda input analog voltage.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- clocks
|
||||||
|
- vdda-supply
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/stm32mp1-clks.h>
|
||||||
|
vrefbuf@50025000 {
|
||||||
|
compatible = "st,stm32-vrefbuf";
|
||||||
|
reg = <0x50025000 0x8>;
|
||||||
|
regulator-min-microvolt = <1500000>;
|
||||||
|
regulator-max-microvolt = <2500000>;
|
||||||
|
clocks = <&rcc VREF>;
|
||||||
|
vdda-supply = <&vdda>;
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
||||||
|
|
@@ -1,43 +0,0 @@
|
|||||||
STM32MP1 PWR Regulators
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
Available Regulators in STM32MP1 PWR block are:
|
|
||||||
- reg11 for regulator 1V1
|
|
||||||
- reg18 for regulator 1V8
|
|
||||||
- usb33 for the swtich USB3V3
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible: Must be "st,stm32mp1,pwr-reg"
|
|
||||||
- list of child nodes that specify the regulator reg11, reg18 or usb33
|
|
||||||
initialization data for defined regulators. The definition for each of
|
|
||||||
these nodes is defined using the standard binding for regulators found at
|
|
||||||
Documentation/devicetree/bindings/regulator/regulator.txt.
|
|
||||||
- vdd-supply: phandle to the parent supply/regulator node for vdd input
|
|
||||||
- vdd_3v3_usbfs-supply: phandle to the parent supply/regulator node for usb33
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
pwr_regulators: pwr@50001000 {
|
|
||||||
compatible = "st,stm32mp1,pwr-reg";
|
|
||||||
reg = <0x50001000 0x10>;
|
|
||||||
vdd-supply = <&vdd>;
|
|
||||||
vdd_3v3_usbfs-supply = <&vdd_usb>;
|
|
||||||
|
|
||||||
reg11: reg11 {
|
|
||||||
regulator-name = "reg11";
|
|
||||||
regulator-min-microvolt = <1100000>;
|
|
||||||
regulator-max-microvolt = <1100000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
reg18: reg18 {
|
|
||||||
regulator-name = "reg18";
|
|
||||||
regulator-min-microvolt = <1800000>;
|
|
||||||
regulator-max-microvolt = <1800000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
usb33: usb33 {
|
|
||||||
regulator-name = "usb33";
|
|
||||||
regulator-min-microvolt = <3300000>;
|
|
||||||
regulator-max-microvolt = <3300000>;
|
|
||||||
};
|
|
||||||
};
|
|
@@ -0,0 +1,64 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/regulator/st,stm32mp1-pwr-reg.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: STM32MP1 PWR voltage regulators
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Pascal Paillet <p.paillet@st.com>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: st,stm32mp1,pwr-reg
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
vdd-supply:
|
||||||
|
description: Input supply phandle(s) for vdd input
|
||||||
|
|
||||||
|
vdd_3v3_usbfs-supply:
|
||||||
|
description: Input supply phandle(s) for vdd_3v3_usbfs input
|
||||||
|
|
||||||
|
patternProperties:
|
||||||
|
"^(reg11|reg18|usb33)$":
|
||||||
|
type: object
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: "regulator.yaml#"
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
pwr@50001000 {
|
||||||
|
compatible = "st,stm32mp1,pwr-reg";
|
||||||
|
reg = <0x50001000 0x10>;
|
||||||
|
vdd-supply = <&vdd>;
|
||||||
|
vdd_3v3_usbfs-supply = <&vdd_usb>;
|
||||||
|
|
||||||
|
reg11 {
|
||||||
|
regulator-name = "reg11";
|
||||||
|
regulator-min-microvolt = <1100000>;
|
||||||
|
regulator-max-microvolt = <1100000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
reg18 {
|
||||||
|
regulator-name = "reg18";
|
||||||
|
regulator-min-microvolt = <1800000>;
|
||||||
|
regulator-max-microvolt = <1800000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb33 {
|
||||||
|
regulator-name = "usb33";
|
||||||
|
regulator-min-microvolt = <3300000>;
|
||||||
|
regulator-max-microvolt = <3300000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
...
|
59
Documentation/devicetree/bindings/soc/ti/k3-ringacc.txt
Normal file
59
Documentation/devicetree/bindings/soc/ti/k3-ringacc.txt
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
* Texas Instruments K3 NavigatorSS Ring Accelerator
|
||||||
|
|
||||||
|
The Ring Accelerator (RA) is a machine which converts read/write accesses
|
||||||
|
from/to a constant address into corresponding read/write accesses from/to a
|
||||||
|
circular data structure in memory. The RA eliminates the need for each DMA
|
||||||
|
controller which needs to access ring elements from having to know the current
|
||||||
|
state of the ring (base address, current offset). The DMA controller
|
||||||
|
performs a read or write access to a specific address range (which maps to the
|
||||||
|
source interface on the RA) and the RA replaces the address for the transaction
|
||||||
|
with a new address which corresponds to the head or tail element of the ring
|
||||||
|
(head for reads, tail for writes).
|
||||||
|
|
||||||
|
The Ring Accelerator is a hardware module that is responsible for accelerating
|
||||||
|
management of the packet queues. The K3 SoCs can have more than one RA instances
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible : Must be "ti,am654-navss-ringacc";
|
||||||
|
- reg : Should contain register location and length of the following
|
||||||
|
named register regions.
|
||||||
|
- reg-names : should be
|
||||||
|
"rt" - The RA Ring Real-time Control/Status Registers
|
||||||
|
"fifos" - The RA Queues Registers
|
||||||
|
"proxy_gcfg" - The RA Proxy Global Config Registers
|
||||||
|
"proxy_target" - The RA Proxy Datapath Registers
|
||||||
|
- ti,num-rings : Number of rings supported by RA
|
||||||
|
- ti,sci-rm-range-gp-rings : TI-SCI RM subtype for GP ring range
|
||||||
|
- ti,sci : phandle on TI-SCI compatible System controller node
|
||||||
|
- ti,sci-dev-id : TI-SCI device id of the ring accelerator
|
||||||
|
- msi-parent : phandle for "ti,sci-inta" interrupt controller
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
-- ti,dma-ring-reset-quirk : enable ringacc / udma ring state interoperability
|
||||||
|
issue software w/a
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
ringacc: ringacc@3c000000 {
|
||||||
|
compatible = "ti,am654-navss-ringacc";
|
||||||
|
reg = <0x0 0x3c000000 0x0 0x400000>,
|
||||||
|
<0x0 0x38000000 0x0 0x400000>,
|
||||||
|
<0x0 0x31120000 0x0 0x100>,
|
||||||
|
<0x0 0x33000000 0x0 0x40000>;
|
||||||
|
reg-names = "rt", "fifos",
|
||||||
|
"proxy_gcfg", "proxy_target";
|
||||||
|
ti,num-rings = <818>;
|
||||||
|
ti,sci-rm-range-gp-rings = <0x2>; /* GP ring range */
|
||||||
|
ti,dma-ring-reset-quirk;
|
||||||
|
ti,sci = <&dmsc>;
|
||||||
|
ti,sci-dev-id = <187>;
|
||||||
|
msi-parent = <&inta_main_udmass>;
|
||||||
|
};
|
||||||
|
|
||||||
|
client:
|
||||||
|
|
||||||
|
dma_ipx: dma_ipx@<addr> {
|
||||||
|
...
|
||||||
|
ti,ringacc = <&ringacc>;
|
||||||
|
...
|
||||||
|
}
|
@@ -12,6 +12,7 @@ Required properties:
|
|||||||
- clock-names: Should be "clk_apb5".
|
- clock-names: Should be "clk_apb5".
|
||||||
- pinctrl-names : a pinctrl state named "default" must be defined.
|
- pinctrl-names : a pinctrl state named "default" must be defined.
|
||||||
- pinctrl-0 : phandle referencing pin configuration of the device.
|
- pinctrl-0 : phandle referencing pin configuration of the device.
|
||||||
|
- resets : phandle to the reset control for this device.
|
||||||
- cs-gpios: Specifies the gpio pins to be used for chipselects.
|
- cs-gpios: Specifies the gpio pins to be used for chipselects.
|
||||||
See: Documentation/devicetree/bindings/spi/spi-bus.txt
|
See: Documentation/devicetree/bindings/spi/spi-bus.txt
|
||||||
|
|
||||||
@@ -19,16 +20,6 @@ Optional properties:
|
|||||||
- clock-frequency : Input clock frequency to the PSPI block in Hz.
|
- clock-frequency : Input clock frequency to the PSPI block in Hz.
|
||||||
Default is 25000000 Hz.
|
Default is 25000000 Hz.
|
||||||
|
|
||||||
Aliases:
|
|
||||||
- All the SPI controller nodes should be represented in the aliases node using
|
|
||||||
the following format 'spi{n}' withe the correct numbered in "aliases" node.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
aliases {
|
|
||||||
spi0 = &spi0;
|
|
||||||
};
|
|
||||||
|
|
||||||
spi0: spi@f0200000 {
|
spi0: spi@f0200000 {
|
||||||
compatible = "nuvoton,npcm750-pspi";
|
compatible = "nuvoton,npcm750-pspi";
|
||||||
reg = <0xf0200000 0x1000>;
|
reg = <0xf0200000 0x1000>;
|
||||||
@@ -39,5 +30,6 @@ spi0: spi@f0200000 {
|
|||||||
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&clk NPCM7XX_CLK_APB5>;
|
clocks = <&clk NPCM7XX_CLK_APB5>;
|
||||||
clock-names = "clk_apb5";
|
clock-names = "clk_apb5";
|
||||||
|
resets = <&rstc NPCM7XX_RESET_IPSRST2 NPCM7XX_RESET_PSPI1>
|
||||||
cs-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>;
|
cs-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>;
|
||||||
};
|
};
|
||||||
|
@@ -1,62 +0,0 @@
|
|||||||
STMicroelectronics STM32 SPI Controller
|
|
||||||
|
|
||||||
The STM32 SPI controller is used to communicate with external devices using
|
|
||||||
the Serial Peripheral Interface. It supports full-duplex, half-duplex and
|
|
||||||
simplex synchronous serial communication with external devices. It supports
|
|
||||||
from 4 to 32-bit data size. Although it can be configured as master or slave,
|
|
||||||
only master is supported by the driver.
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible: Should be one of:
|
|
||||||
"st,stm32h7-spi"
|
|
||||||
"st,stm32f4-spi"
|
|
||||||
- reg: Offset and length of the device's register set.
|
|
||||||
- interrupts: Must contain the interrupt id.
|
|
||||||
- clocks: Must contain an entry for spiclk (which feeds the internal clock
|
|
||||||
generator).
|
|
||||||
- #address-cells: Number of cells required to define a chip select address.
|
|
||||||
- #size-cells: Should be zero.
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- resets: Must contain the phandle to the reset controller.
|
|
||||||
- A pinctrl state named "default" may be defined to set pins in mode of
|
|
||||||
operation for SPI transfer.
|
|
||||||
- dmas: DMA specifiers for tx and rx dma. DMA fifo mode must be used. See the
|
|
||||||
STM32 DMA bindings, Documentation/devicetree/bindings/dma/stm32-dma.txt.
|
|
||||||
- dma-names: DMA request names should include "tx" and "rx" if present.
|
|
||||||
- cs-gpios: list of GPIO chip selects. See the SPI bus bindings,
|
|
||||||
Documentation/devicetree/bindings/spi/spi-bus.txt
|
|
||||||
|
|
||||||
|
|
||||||
Child nodes represent devices on the SPI bus
|
|
||||||
See ../spi/spi-bus.txt
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- st,spi-midi-ns: Only for STM32H7, (Master Inter-Data Idleness) minimum time
|
|
||||||
delay in nanoseconds inserted between two consecutive data
|
|
||||||
frames.
|
|
||||||
|
|
||||||
|
|
||||||
Example:
|
|
||||||
spi2: spi@40003800 {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
compatible = "st,stm32h7-spi";
|
|
||||||
reg = <0x40003800 0x400>;
|
|
||||||
interrupts = <36>;
|
|
||||||
clocks = <&rcc SPI2_CK>;
|
|
||||||
resets = <&rcc 1166>;
|
|
||||||
dmas = <&dmamux1 0 39 0x400 0x01>,
|
|
||||||
<&dmamux1 1 40 0x400 0x01>;
|
|
||||||
dma-names = "rx", "tx";
|
|
||||||
pinctrl-0 = <&spi2_pins_b>;
|
|
||||||
pinctrl-names = "default";
|
|
||||||
cs-gpios = <&gpioa 11 0>;
|
|
||||||
|
|
||||||
aardvark@0 {
|
|
||||||
compatible = "totalphase,aardvark";
|
|
||||||
reg = <0>;
|
|
||||||
spi-max-frequency = <4000000>;
|
|
||||||
st,spi-midi-ns = <4000>;
|
|
||||||
};
|
|
||||||
};
|
|
@@ -1,7 +1,7 @@
|
|||||||
Atmel SPI device
|
Atmel SPI device
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible : should be "atmel,at91rm9200-spi".
|
- compatible : should be "atmel,at91rm9200-spi" or "microchip,sam9x60-spi".
|
||||||
- reg: Address and length of the register set for the device
|
- reg: Address and length of the register set for the device
|
||||||
- interrupts: Should contain spi interrupt
|
- interrupts: Should contain spi interrupt
|
||||||
- cs-gpios: chipselects (optional for SPI controller version >= 2 with the
|
- cs-gpios: chipselects (optional for SPI controller version >= 2 with the
|
||||||
|
105
Documentation/devicetree/bindings/spi/st,stm32-spi.yaml
Normal file
105
Documentation/devicetree/bindings/spi/st,stm32-spi.yaml
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/spi/st,stm32-spi.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: STMicroelectronics STM32 SPI Controller bindings
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The STM32 SPI controller is used to communicate with external devices using
|
||||||
|
the Serial Peripheral Interface. It supports full-duplex, half-duplex and
|
||||||
|
simplex synchronous serial communication with external devices. It supports
|
||||||
|
from 4 to 32-bit data size.
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Erwan Leray <erwan.leray@st.com>
|
||||||
|
- Fabrice Gasnier <fabrice.gasnier@st.com>
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: "spi-controller.yaml#"
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
const: st,stm32f4-spi
|
||||||
|
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
st,spi-midi-ns: false
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- st,stm32f4-spi
|
||||||
|
- st,stm32h7-spi
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
resets:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
dmas:
|
||||||
|
description: |
|
||||||
|
DMA specifiers for tx and rx dma. DMA fifo mode must be used. See
|
||||||
|
the STM32 DMA bindings Documentation/devicetree/bindings/dma/stm32-dma.txt.
|
||||||
|
items:
|
||||||
|
- description: rx DMA channel
|
||||||
|
- description: tx DMA channel
|
||||||
|
|
||||||
|
dma-names:
|
||||||
|
items:
|
||||||
|
- const: rx
|
||||||
|
- const: tx
|
||||||
|
|
||||||
|
patternProperties:
|
||||||
|
"^[a-zA-Z][a-zA-Z0-9,+\\-._]{0,63}@[0-9a-f]+$":
|
||||||
|
type: object
|
||||||
|
# SPI slave nodes must be children of the SPI master node and can
|
||||||
|
# contain the following properties.
|
||||||
|
properties:
|
||||||
|
st,spi-midi-ns:
|
||||||
|
description: |
|
||||||
|
Only for STM32H7, (Master Inter-Data Idleness) minimum time
|
||||||
|
delay in nanoseconds inserted between two consecutive data frames.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- clocks
|
||||||
|
- interrupts
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
#include <dt-bindings/clock/stm32mp1-clks.h>
|
||||||
|
#include <dt-bindings/reset/stm32mp1-resets.h>
|
||||||
|
spi@4000b000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
compatible = "st,stm32h7-spi";
|
||||||
|
reg = <0x4000b000 0x400>;
|
||||||
|
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&rcc SPI2_K>;
|
||||||
|
resets = <&rcc SPI2_R>;
|
||||||
|
dmas = <&dmamux1 0 39 0x400 0x05>,
|
||||||
|
<&dmamux1 1 40 0x400 0x05>;
|
||||||
|
dma-names = "rx", "tx";
|
||||||
|
cs-gpios = <&gpioa 11 0>;
|
||||||
|
|
||||||
|
aardvark@0 {
|
||||||
|
compatible = "totalphase,aardvark";
|
||||||
|
reg = <0>;
|
||||||
|
spi-max-frequency = <4000000>;
|
||||||
|
st,spi-midi-ns = <4000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@@ -29,6 +29,8 @@ Required Properties:
|
|||||||
- "renesas,r8a77470-cmt1" for the 48-bit CMT1 device included in r8a77470.
|
- "renesas,r8a77470-cmt1" for the 48-bit CMT1 device included in r8a77470.
|
||||||
- "renesas,r8a774a1-cmt0" for the 32-bit CMT0 device included in r8a774a1.
|
- "renesas,r8a774a1-cmt0" for the 32-bit CMT0 device included in r8a774a1.
|
||||||
- "renesas,r8a774a1-cmt1" for the 48-bit CMT devices included in r8a774a1.
|
- "renesas,r8a774a1-cmt1" for the 48-bit CMT devices included in r8a774a1.
|
||||||
|
- "renesas,r8a774b1-cmt0" for the 32-bit CMT0 device included in r8a774b1.
|
||||||
|
- "renesas,r8a774b1-cmt1" for the 48-bit CMT devices included in r8a774b1.
|
||||||
- "renesas,r8a774c0-cmt0" for the 32-bit CMT0 device included in r8a774c0.
|
- "renesas,r8a774c0-cmt0" for the 32-bit CMT0 device included in r8a774c0.
|
||||||
- "renesas,r8a774c0-cmt1" for the 48-bit CMT devices included in r8a774c0.
|
- "renesas,r8a774c0-cmt1" for the 48-bit CMT devices included in r8a774c0.
|
||||||
- "renesas,r8a7790-cmt0" for the 32-bit CMT0 device included in r8a7790.
|
- "renesas,r8a7790-cmt0" for the 32-bit CMT0 device included in r8a7790.
|
||||||
|
@@ -151,6 +151,93 @@ The details of these operations are:
|
|||||||
Note that callbacks will always be invoked from the DMA
|
Note that callbacks will always be invoked from the DMA
|
||||||
engines tasklet, never from interrupt context.
|
engines tasklet, never from interrupt context.
|
||||||
|
|
||||||
|
Optional: per descriptor metadata
|
||||||
|
---------------------------------
|
||||||
|
DMAengine provides two ways for metadata support.
|
||||||
|
|
||||||
|
DESC_METADATA_CLIENT
|
||||||
|
|
||||||
|
The metadata buffer is allocated/provided by the client driver and it is
|
||||||
|
attached to the descriptor.
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
int dmaengine_desc_attach_metadata(struct dma_async_tx_descriptor *desc,
|
||||||
|
void *data, size_t len);
|
||||||
|
|
||||||
|
DESC_METADATA_ENGINE
|
||||||
|
|
||||||
|
The metadata buffer is allocated/managed by the DMA driver. The client
|
||||||
|
driver can ask for the pointer, maximum size and the currently used size of
|
||||||
|
the metadata and can directly update or read it.
|
||||||
|
|
||||||
|
Becasue the DMA driver manages the memory area containing the metadata,
|
||||||
|
clients must make sure that they do not try to access or get the pointer
|
||||||
|
after their transfer completion callback has run for the descriptor.
|
||||||
|
If no completion callback has been defined for the transfer, then the
|
||||||
|
metadata must not be accessed after issue_pending.
|
||||||
|
In other words: if the aim is to read back metadata after the transfer is
|
||||||
|
completed, then the client must use completion callback.
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
void *dmaengine_desc_get_metadata_ptr(struct dma_async_tx_descriptor *desc,
|
||||||
|
size_t *payload_len, size_t *max_len);
|
||||||
|
|
||||||
|
int dmaengine_desc_set_metadata_len(struct dma_async_tx_descriptor *desc,
|
||||||
|
size_t payload_len);
|
||||||
|
|
||||||
|
Client drivers can query if a given mode is supported with:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
bool dmaengine_is_metadata_mode_supported(struct dma_chan *chan,
|
||||||
|
enum dma_desc_metadata_mode mode);
|
||||||
|
|
||||||
|
Depending on the used mode client drivers must follow different flow.
|
||||||
|
|
||||||
|
DESC_METADATA_CLIENT
|
||||||
|
|
||||||
|
- DMA_MEM_TO_DEV / DEV_MEM_TO_MEM:
|
||||||
|
1. prepare the descriptor (dmaengine_prep_*)
|
||||||
|
construct the metadata in the client's buffer
|
||||||
|
2. use dmaengine_desc_attach_metadata() to attach the buffer to the
|
||||||
|
descriptor
|
||||||
|
3. submit the transfer
|
||||||
|
- DMA_DEV_TO_MEM:
|
||||||
|
1. prepare the descriptor (dmaengine_prep_*)
|
||||||
|
2. use dmaengine_desc_attach_metadata() to attach the buffer to the
|
||||||
|
descriptor
|
||||||
|
3. submit the transfer
|
||||||
|
4. when the transfer is completed, the metadata should be available in the
|
||||||
|
attached buffer
|
||||||
|
|
||||||
|
DESC_METADATA_ENGINE
|
||||||
|
|
||||||
|
- DMA_MEM_TO_DEV / DEV_MEM_TO_MEM:
|
||||||
|
1. prepare the descriptor (dmaengine_prep_*)
|
||||||
|
2. use dmaengine_desc_get_metadata_ptr() to get the pointer to the
|
||||||
|
engine's metadata area
|
||||||
|
3. update the metadata at the pointer
|
||||||
|
4. use dmaengine_desc_set_metadata_len() to tell the DMA engine the
|
||||||
|
amount of data the client has placed into the metadata buffer
|
||||||
|
5. submit the transfer
|
||||||
|
- DMA_DEV_TO_MEM:
|
||||||
|
1. prepare the descriptor (dmaengine_prep_*)
|
||||||
|
2. submit the transfer
|
||||||
|
3. on transfer completion, use dmaengine_desc_get_metadata_ptr() to get
|
||||||
|
the pointer to the engine's metadata area
|
||||||
|
4. read out the metadata from the pointer
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
When DESC_METADATA_ENGINE mode is used the metadata area for the descriptor
|
||||||
|
is no longer valid after the transfer has been completed (valid up to the
|
||||||
|
point when the completion callback returns if used).
|
||||||
|
|
||||||
|
Mixed use of DESC_METADATA_CLIENT / DESC_METADATA_ENGINE is not allowed,
|
||||||
|
client drivers must use either of the modes per descriptor.
|
||||||
|
|
||||||
4. Submit the transaction
|
4. Submit the transaction
|
||||||
|
|
||||||
Once the descriptor has been prepared and the callback information
|
Once the descriptor has been prepared and the callback information
|
||||||
|
@@ -247,6 +247,54 @@ after each transfer. In case of a ring buffer, they may loop
|
|||||||
(DMA_CYCLIC). Addresses pointing to a device's register (e.g. a FIFO)
|
(DMA_CYCLIC). Addresses pointing to a device's register (e.g. a FIFO)
|
||||||
are typically fixed.
|
are typically fixed.
|
||||||
|
|
||||||
|
Per descriptor metadata support
|
||||||
|
-------------------------------
|
||||||
|
Some data movement architecture (DMA controller and peripherals) uses metadata
|
||||||
|
associated with a transaction. The DMA controller role is to transfer the
|
||||||
|
payload and the metadata alongside.
|
||||||
|
The metadata itself is not used by the DMA engine itself, but it contains
|
||||||
|
parameters, keys, vectors, etc for peripheral or from the peripheral.
|
||||||
|
|
||||||
|
The DMAengine framework provides a generic ways to facilitate the metadata for
|
||||||
|
descriptors. Depending on the architecture the DMA driver can implement either
|
||||||
|
or both of the methods and it is up to the client driver to choose which one
|
||||||
|
to use.
|
||||||
|
|
||||||
|
- DESC_METADATA_CLIENT
|
||||||
|
|
||||||
|
The metadata buffer is allocated/provided by the client driver and it is
|
||||||
|
attached (via the dmaengine_desc_attach_metadata() helper to the descriptor.
|
||||||
|
|
||||||
|
From the DMA driver the following is expected for this mode:
|
||||||
|
- DMA_MEM_TO_DEV / DEV_MEM_TO_MEM
|
||||||
|
The data from the provided metadata buffer should be prepared for the DMA
|
||||||
|
controller to be sent alongside of the payload data. Either by copying to a
|
||||||
|
hardware descriptor, or highly coupled packet.
|
||||||
|
- DMA_DEV_TO_MEM
|
||||||
|
On transfer completion the DMA driver must copy the metadata to the client
|
||||||
|
provided metadata buffer before notifying the client about the completion.
|
||||||
|
After the transfer completion, DMA drivers must not touch the metadata
|
||||||
|
buffer provided by the client.
|
||||||
|
|
||||||
|
- DESC_METADATA_ENGINE
|
||||||
|
|
||||||
|
The metadata buffer is allocated/managed by the DMA driver. The client driver
|
||||||
|
can ask for the pointer, maximum size and the currently used size of the
|
||||||
|
metadata and can directly update or read it. dmaengine_desc_get_metadata_ptr()
|
||||||
|
and dmaengine_desc_set_metadata_len() is provided as helper functions.
|
||||||
|
|
||||||
|
From the DMA driver the following is expected for this mode:
|
||||||
|
- get_metadata_ptr
|
||||||
|
Should return a pointer for the metadata buffer, the maximum size of the
|
||||||
|
metadata buffer and the currently used / valid (if any) bytes in the buffer.
|
||||||
|
- set_metadata_len
|
||||||
|
It is called by the clients after it have placed the metadata to the buffer
|
||||||
|
to let the DMA driver know the number of valid bytes provided.
|
||||||
|
|
||||||
|
Note: since the client will ask for the metadata pointer in the completion
|
||||||
|
callback (in DMA_DEV_TO_MEM case) the DMA driver must ensure that the
|
||||||
|
descriptor is not freed up prior the callback is called.
|
||||||
|
|
||||||
Device operations
|
Device operations
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
@@ -313,7 +313,6 @@ IOMAP
|
|||||||
devm_ioport_map()
|
devm_ioport_map()
|
||||||
devm_ioport_unmap()
|
devm_ioport_unmap()
|
||||||
devm_ioremap()
|
devm_ioremap()
|
||||||
devm_ioremap_nocache()
|
|
||||||
devm_ioremap_uc()
|
devm_ioremap_uc()
|
||||||
devm_ioremap_wc()
|
devm_ioremap_wc()
|
||||||
devm_ioremap_resource() : checks resource, requests memory region, ioremaps
|
devm_ioremap_resource() : checks resource, requests memory region, ioremaps
|
||||||
|
@@ -71,8 +71,8 @@ DMA support
|
|||||||
DMA controllers enumerated via ACPI should be registered in the system to
|
DMA controllers enumerated via ACPI should be registered in the system to
|
||||||
provide generic access to their resources. For example, a driver that would
|
provide generic access to their resources. For example, a driver that would
|
||||||
like to be accessible to slave devices via generic API call
|
like to be accessible to slave devices via generic API call
|
||||||
dma_request_slave_channel() must register itself at the end of the probe
|
dma_request_chan() must register itself at the end of the probe function like
|
||||||
function like this::
|
this::
|
||||||
|
|
||||||
err = devm_acpi_dma_controller_register(dev, xlate_func, dw);
|
err = devm_acpi_dma_controller_register(dev, xlate_func, dw);
|
||||||
/* Handle the error if it's not a case of !CONFIG_ACPI */
|
/* Handle the error if it's not a case of !CONFIG_ACPI */
|
||||||
@@ -112,15 +112,15 @@ could look like::
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dma_request_slave_channel() will call xlate_func() for each registered DMA
|
dma_request_chan() will call xlate_func() for each registered DMA controller.
|
||||||
controller. In the xlate function the proper channel must be chosen based on
|
In the xlate function the proper channel must be chosen based on
|
||||||
information in struct acpi_dma_spec and the properties of the controller
|
information in struct acpi_dma_spec and the properties of the controller
|
||||||
provided by struct acpi_dma.
|
provided by struct acpi_dma.
|
||||||
|
|
||||||
Clients must call dma_request_slave_channel() with the string parameter that
|
Clients must call dma_request_chan() with the string parameter that corresponds
|
||||||
corresponds to a specific FixedDMA resource. By default "tx" means the first
|
to a specific FixedDMA resource. By default "tx" means the first entry of the
|
||||||
entry of the FixedDMA resource array, "rx" means the second entry. The table
|
FixedDMA resource array, "rx" means the second entry. The table below shows a
|
||||||
below shows a layout::
|
layout::
|
||||||
|
|
||||||
Device (I2C0)
|
Device (I2C0)
|
||||||
{
|
{
|
||||||
|
36
Documentation/hwmon/adm1177.rst
Normal file
36
Documentation/hwmon/adm1177.rst
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
Kernel driver adm1177
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Supported chips:
|
||||||
|
* Analog Devices ADM1177
|
||||||
|
Prefix: 'adm1177'
|
||||||
|
Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/ADM1177.pdf
|
||||||
|
|
||||||
|
Author: Beniamin Bia <beniamin.bia@analog.com>
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This driver supports hardware monitoring for Analog Devices ADM1177
|
||||||
|
Hot-Swap Controller and Digital Power Monitors with Soft Start Pin.
|
||||||
|
|
||||||
|
|
||||||
|
Usage Notes
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This driver does not auto-detect devices. You will have to instantiate the
|
||||||
|
devices explicitly. Please see Documentation/i2c/instantiating-devices for
|
||||||
|
details.
|
||||||
|
|
||||||
|
|
||||||
|
Sysfs entries
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The following attributes are supported. Current maxim attribute
|
||||||
|
is read-write, all other attributes are read-only.
|
||||||
|
|
||||||
|
in0_input Measured voltage in microvolts.
|
||||||
|
|
||||||
|
curr1_input Measured current in microamperes.
|
||||||
|
curr1_max_alarm Overcurrent alarm in microamperes.
|
52
Documentation/hwmon/drivetemp.rst
Normal file
52
Documentation/hwmon/drivetemp.rst
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
Kernel driver drivetemp
|
||||||
|
=======================
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
----------
|
||||||
|
|
||||||
|
ANS T13/1699-D
|
||||||
|
Information technology - AT Attachment 8 - ATA/ATAPI Command Set (ATA8-ACS)
|
||||||
|
|
||||||
|
ANS Project T10/BSR INCITS 513
|
||||||
|
Information technology - SCSI Primary Commands - 4 (SPC-4)
|
||||||
|
|
||||||
|
ANS Project INCITS 557
|
||||||
|
Information technology - SCSI / ATA Translation - 5 (SAT-5)
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This driver supports reporting the temperature of disk and solid state
|
||||||
|
drives with temperature sensors.
|
||||||
|
|
||||||
|
If supported, it uses the ATA SCT Command Transport feature to read
|
||||||
|
the current drive temperature and, if available, temperature limits
|
||||||
|
as well as historic minimum and maximum temperatures. If SCT Command
|
||||||
|
Transport is not supported, the driver uses SMART attributes to read
|
||||||
|
the drive temperature.
|
||||||
|
|
||||||
|
|
||||||
|
Sysfs entries
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Only the temp1_input attribute is always available. Other attributes are
|
||||||
|
available only if reported by the drive. All temperatures are reported in
|
||||||
|
milli-degrees Celsius.
|
||||||
|
|
||||||
|
======================= =====================================================
|
||||||
|
temp1_input Current drive temperature
|
||||||
|
temp1_lcrit Minimum temperature limit. Operating the device below
|
||||||
|
this temperature may cause physical damage to the
|
||||||
|
device.
|
||||||
|
temp1_min Minimum recommended continuous operating limit
|
||||||
|
temp1_max Maximum recommended continuous operating temperature
|
||||||
|
temp1_crit Maximum temperature limit. Operating the device above
|
||||||
|
this temperature may cause physical damage to the
|
||||||
|
device.
|
||||||
|
temp1_lowest Minimum temperature seen this power cycle
|
||||||
|
temp1_highest Maximum temperature seen this power cycle
|
||||||
|
======================= =====================================================
|
@@ -29,6 +29,7 @@ Hardware Monitoring Kernel Drivers
|
|||||||
adm1025
|
adm1025
|
||||||
adm1026
|
adm1026
|
||||||
adm1031
|
adm1031
|
||||||
|
adm1177
|
||||||
adm1275
|
adm1275
|
||||||
adm9240
|
adm9240
|
||||||
ads7828
|
ads7828
|
||||||
@@ -47,6 +48,7 @@ Hardware Monitoring Kernel Drivers
|
|||||||
da9055
|
da9055
|
||||||
dell-smm-hwmon
|
dell-smm-hwmon
|
||||||
dme1737
|
dme1737
|
||||||
|
drivetemp
|
||||||
ds1621
|
ds1621
|
||||||
ds620
|
ds620
|
||||||
emc1403
|
emc1403
|
||||||
@@ -106,8 +108,10 @@ Hardware Monitoring Kernel Drivers
|
|||||||
max1619
|
max1619
|
||||||
max1668
|
max1668
|
||||||
max197
|
max197
|
||||||
|
max20730
|
||||||
max20751
|
max20751
|
||||||
max31722
|
max31722
|
||||||
|
max31730
|
||||||
max31785
|
max31785
|
||||||
max31790
|
max31790
|
||||||
max34440
|
max34440
|
||||||
@@ -177,6 +181,7 @@ Hardware Monitoring Kernel Drivers
|
|||||||
wm831x
|
wm831x
|
||||||
wm8350
|
wm8350
|
||||||
xgene-hwmon
|
xgene-hwmon
|
||||||
|
xdpe12284
|
||||||
zl6100
|
zl6100
|
||||||
|
|
||||||
.. only:: subproject and html
|
.. only:: subproject and html
|
||||||
|
74
Documentation/hwmon/max20730.rst
Normal file
74
Documentation/hwmon/max20730.rst
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
.. SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
Kernel driver max20730
|
||||||
|
======================
|
||||||
|
|
||||||
|
Supported chips:
|
||||||
|
|
||||||
|
* Maxim MAX20730
|
||||||
|
|
||||||
|
Prefix: 'max20730'
|
||||||
|
|
||||||
|
Addresses scanned: -
|
||||||
|
|
||||||
|
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX20730.pdf
|
||||||
|
|
||||||
|
* Maxim MAX20734
|
||||||
|
|
||||||
|
Prefix: 'max20734'
|
||||||
|
|
||||||
|
Addresses scanned: -
|
||||||
|
|
||||||
|
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX20734.pdf
|
||||||
|
|
||||||
|
* Maxim MAX20743
|
||||||
|
|
||||||
|
Prefix: 'max20743'
|
||||||
|
|
||||||
|
Addresses scanned: -
|
||||||
|
|
||||||
|
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX20743.pdf
|
||||||
|
|
||||||
|
Author: Guenter Roeck <linux@roeck-us.net>
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This driver implements support for Maxim MAX20730, MAX20734, and MAX20743
|
||||||
|
Integrated, Step-Down Switching Regulators with PMBus support.
|
||||||
|
|
||||||
|
The driver is a client driver to the core PMBus driver.
|
||||||
|
Please see Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
|
||||||
|
|
||||||
|
|
||||||
|
Usage Notes
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This driver does not auto-detect devices. You will have to instantiate the
|
||||||
|
devices explicitly. Please see Documentation/i2c/instantiating-devices.rst for
|
||||||
|
details.
|
||||||
|
|
||||||
|
|
||||||
|
Sysfs entries
|
||||||
|
-------------
|
||||||
|
|
||||||
|
=================== ===== =======================================================
|
||||||
|
curr1_crit RW/RO Critical output current. Please see datasheet for
|
||||||
|
supported limits. Read-only if the chip is
|
||||||
|
write protected; read-write otherwise.
|
||||||
|
curr1_crit_alarm RO Output current critical alarm
|
||||||
|
curr1_input RO Output current
|
||||||
|
curr1_label RO 'iout1'
|
||||||
|
in1_alarm RO Input voltage alarm
|
||||||
|
in1_input RO Input voltage
|
||||||
|
in1_label RO 'vin'
|
||||||
|
in2_alarm RO Output voltage alarm
|
||||||
|
in2_input RO Output voltage
|
||||||
|
in2_label RO 'vout1'
|
||||||
|
temp1_crit RW/RO Critical temeperature. Supported values are 130 or 150
|
||||||
|
degrees C. Read-only if the chip is write protected;
|
||||||
|
read-write otherwise.
|
||||||
|
temp1_crit_alarm RO Temperature critical alarm
|
||||||
|
temp1_input RO Chip temperature
|
||||||
|
=================== ===== =======================================================
|
44
Documentation/hwmon/max31730.rst
Normal file
44
Documentation/hwmon/max31730.rst
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
Kernel driver max31790
|
||||||
|
======================
|
||||||
|
|
||||||
|
Supported chips:
|
||||||
|
|
||||||
|
* Maxim MAX31730
|
||||||
|
|
||||||
|
Prefix: 'max31730'
|
||||||
|
|
||||||
|
Addresses scanned: 0x1c, 0x1d, 0x1e, 0x1f, 0x4c, 0x4d, 0x4e, 0x4f
|
||||||
|
|
||||||
|
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX31730.pdf
|
||||||
|
|
||||||
|
Author: Guenter Roeck <linux@roeck-us.net>
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This driver implements support for Maxim MAX31730.
|
||||||
|
|
||||||
|
The MAX31730 temperature sensor monitors its own temperature and the
|
||||||
|
temperatures of three external diode-connected transistors. The operating
|
||||||
|
supply voltage is from 3.0V to 3.6V. Resistance cancellation compensates
|
||||||
|
for high series resistance in circuit-board traces and the external thermal
|
||||||
|
diode, while beta compensation corrects for temperature-measurement
|
||||||
|
errors due to low-beta sensing transistors.
|
||||||
|
|
||||||
|
|
||||||
|
Sysfs entries
|
||||||
|
-------------
|
||||||
|
|
||||||
|
=================== == =======================================================
|
||||||
|
temp[1-4]_enable RW Temperature enable/disable
|
||||||
|
Set to 0 to enable channel, 0 to disable
|
||||||
|
temp[1-4]_input RO Temperature input
|
||||||
|
temp[2-4]_fault RO Fault indicator for remote channels
|
||||||
|
temp[1-4]_max RW Maximum temperature
|
||||||
|
temp[1-4]_max_alarm RW Maximum temperature alarm
|
||||||
|
temp[1-4]_min RW Minimum temperature. Common for all channels.
|
||||||
|
Only temp1_min is writeable.
|
||||||
|
temp[1-4]_min_alarm RO Minimum temperature alarm
|
||||||
|
temp[2-4]_offset RW Temperature offset for remote channels
|
||||||
|
=================== == =======================================================
|
@@ -63,6 +63,16 @@ Supported chips:
|
|||||||
|
|
||||||
http://www.ti.com/lit/gpn/tps544c25
|
http://www.ti.com/lit/gpn/tps544c25
|
||||||
|
|
||||||
|
* Maxim MAX20796
|
||||||
|
|
||||||
|
Prefix: 'max20796'
|
||||||
|
|
||||||
|
Addresses scanned: -
|
||||||
|
|
||||||
|
Datasheet:
|
||||||
|
|
||||||
|
Not published
|
||||||
|
|
||||||
* Generic PMBus devices
|
* Generic PMBus devices
|
||||||
|
|
||||||
Prefix: 'pmbus'
|
Prefix: 'pmbus'
|
||||||
|
@@ -3,9 +3,10 @@ Kernel driver ucd9000
|
|||||||
|
|
||||||
Supported chips:
|
Supported chips:
|
||||||
|
|
||||||
* TI UCD90120, UCD90124, UCD90160, UCD9090, and UCD90910
|
* TI UCD90120, UCD90124, UCD90160, UCD90320, UCD9090, and UCD90910
|
||||||
|
|
||||||
Prefixes: 'ucd90120', 'ucd90124', 'ucd90160', 'ucd9090', 'ucd90910'
|
Prefixes: 'ucd90120', 'ucd90124', 'ucd90160', 'ucd90320', 'ucd9090',
|
||||||
|
'ucd90910'
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
@@ -14,6 +15,7 @@ Supported chips:
|
|||||||
- http://focus.ti.com/lit/ds/symlink/ucd90120.pdf
|
- http://focus.ti.com/lit/ds/symlink/ucd90120.pdf
|
||||||
- http://focus.ti.com/lit/ds/symlink/ucd90124.pdf
|
- http://focus.ti.com/lit/ds/symlink/ucd90124.pdf
|
||||||
- http://focus.ti.com/lit/ds/symlink/ucd90160.pdf
|
- http://focus.ti.com/lit/ds/symlink/ucd90160.pdf
|
||||||
|
- http://focus.ti.com/lit/ds/symlink/ucd90320.pdf
|
||||||
- http://focus.ti.com/lit/ds/symlink/ucd9090.pdf
|
- http://focus.ti.com/lit/ds/symlink/ucd9090.pdf
|
||||||
- http://focus.ti.com/lit/ds/symlink/ucd90910.pdf
|
- http://focus.ti.com/lit/ds/symlink/ucd90910.pdf
|
||||||
|
|
||||||
@@ -45,6 +47,12 @@ power-on reset signals, external interrupts, cascading, or other system
|
|||||||
functions. Twelve of these pins offer PWM functionality. Using these pins, the
|
functions. Twelve of these pins offer PWM functionality. Using these pins, the
|
||||||
UCD90160 offers support for margining, and general-purpose PWM functions.
|
UCD90160 offers support for margining, and general-purpose PWM functions.
|
||||||
|
|
||||||
|
The UCD90320 is a 32-rail PMBus/I2C addressable power-supply sequencer and
|
||||||
|
monitor. The 24 integrated ADC channels (AMONx) monitor the power supply
|
||||||
|
voltage, current, and temperature. Of the 84 GPIO pins, 8 can be used as
|
||||||
|
digital monitors (DMONx), 32 to enable the power supply (ENx), 24 for margining
|
||||||
|
(MARx), 16 for logical GPO, and 32 GPIs for cascading, and system function.
|
||||||
|
|
||||||
The UCD9090 is a 10-rail PMBus/I2C addressable power-supply sequencer and
|
The UCD9090 is a 10-rail PMBus/I2C addressable power-supply sequencer and
|
||||||
monitor. The device integrates a 12-bit ADC for monitoring up to 10 power-supply
|
monitor. The device integrates a 12-bit ADC for monitoring up to 10 power-supply
|
||||||
voltage inputs. Twenty-three GPIO pins can be used for power supply enables,
|
voltage inputs. Twenty-three GPIO pins can be used for power supply enables,
|
||||||
|
101
Documentation/hwmon/xdpe12284.rst
Normal file
101
Documentation/hwmon/xdpe12284.rst
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
Kernel driver xdpe122
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Supported chips:
|
||||||
|
|
||||||
|
* Infineon XDPE12254
|
||||||
|
|
||||||
|
Prefix: 'xdpe12254'
|
||||||
|
|
||||||
|
* Infineon XDPE12284
|
||||||
|
|
||||||
|
Prefix: 'xdpe12284'
|
||||||
|
|
||||||
|
Authors:
|
||||||
|
|
||||||
|
Vadim Pasternak <vadimp@mellanox.com>
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This driver implements support for Infineon Multi-phase XDPE122 family
|
||||||
|
dual loop voltage regulators.
|
||||||
|
The family includes XDPE12284 and XDPE12254 devices.
|
||||||
|
The devices from this family complaint with:
|
||||||
|
- Intel VR13 and VR13HC rev 1.3, IMVP8 rev 1.2 and IMPVP9 rev 1.3 DC-DC
|
||||||
|
converter specification.
|
||||||
|
- Intel SVID rev 1.9. protocol.
|
||||||
|
- PMBus rev 1.3 interface.
|
||||||
|
|
||||||
|
Devices support linear format for reading input voltage, input and output current,
|
||||||
|
input and output power and temperature.
|
||||||
|
Device supports VID format for reading output voltage. The below modes are
|
||||||
|
supported:
|
||||||
|
- VR12.0 mode, 5-mV DAC - 0x01.
|
||||||
|
- VR12.5 mode, 10-mV DAC - 0x02.
|
||||||
|
- IMVP9 mode, 5-mV DAC - 0x03.
|
||||||
|
- AMD mode 6.25mV - 0x10.
|
||||||
|
|
||||||
|
Devices support two pages for telemetry.
|
||||||
|
|
||||||
|
The driver provides for current: input, maximum and critical thresholds
|
||||||
|
and maximum and critical alarms. Critical thresholds and critical alarm are
|
||||||
|
supported only for current output.
|
||||||
|
The driver exports the following attributes for via the sysfs files, where
|
||||||
|
indexes 1, 2 are for "iin" and 3, 4 for "iout":
|
||||||
|
|
||||||
|
**curr[3-4]_crit**
|
||||||
|
|
||||||
|
**curr[3-4]_crit_alarm**
|
||||||
|
|
||||||
|
**curr[1-4]_input**
|
||||||
|
|
||||||
|
**curr[1-4]_label**
|
||||||
|
|
||||||
|
**curr[1-4]_max**
|
||||||
|
|
||||||
|
**curr[1-4]_max_alarm**
|
||||||
|
|
||||||
|
The driver provides for voltage: input, critical and low critical thresholds
|
||||||
|
and critical and low critical alarms.
|
||||||
|
The driver exports the following attributes for via the sysfs files, where
|
||||||
|
indexes 1, 2 are for "vin" and 3, 4 for "vout":
|
||||||
|
|
||||||
|
**in[1-4]_crit**
|
||||||
|
|
||||||
|
**in[1-4_crit_alarm**
|
||||||
|
|
||||||
|
**in[1-4]_input**
|
||||||
|
|
||||||
|
**in[1-4_label**
|
||||||
|
|
||||||
|
**in[1-4]_lcrit**
|
||||||
|
|
||||||
|
**in[1-41_lcrit_alarm**
|
||||||
|
|
||||||
|
The driver provides for power: input and alarms. Power alarm is supported only
|
||||||
|
for power input.
|
||||||
|
The driver exports the following attributes for via the sysfs files, where
|
||||||
|
indexes 1, 2 are for "pin" and 3, 4 for "pout":
|
||||||
|
|
||||||
|
**power[1-2]_alarm**
|
||||||
|
|
||||||
|
**power[1-4]_input**
|
||||||
|
|
||||||
|
**power[1-4]_label**
|
||||||
|
|
||||||
|
The driver provides for temperature: input, maximum and critical thresholds
|
||||||
|
and maximum and critical alarms.
|
||||||
|
The driver exports the following attributes for via the sysfs files:
|
||||||
|
|
||||||
|
**temp[1-2]_crit**
|
||||||
|
|
||||||
|
**temp[1-2]_crit_alarm**
|
||||||
|
|
||||||
|
**temp[1-2]_input**
|
||||||
|
|
||||||
|
**temp[1-2]_max**
|
||||||
|
|
||||||
|
**temp[1-2]_max_alarm**
|
@@ -1058,7 +1058,7 @@ and the allocation would be like below:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
chip->iobase_phys = pci_resource_start(pci, 0);
|
chip->iobase_phys = pci_resource_start(pci, 0);
|
||||||
chip->iobase_virt = ioremap_nocache(chip->iobase_phys,
|
chip->iobase_virt = ioremap(chip->iobase_phys,
|
||||||
pci_resource_len(pci, 0));
|
pci_resource_len(pci, 0));
|
||||||
|
|
||||||
and the corresponding destructor would be:
|
and the corresponding destructor would be:
|
||||||
|
@@ -251,7 +251,7 @@ setting fields in the header, you must make sure only to set fields
|
|||||||
supported by the protocol version in use.
|
supported by the protocol version in use.
|
||||||
|
|
||||||
|
|
||||||
Details of Harder Fileds
|
Details of Header Fields
|
||||||
========================
|
========================
|
||||||
|
|
||||||
For each field, some are information from the kernel to the bootloader
|
For each field, some are information from the kernel to the bootloader
|
||||||
|
@@ -44,8 +44,6 @@ address range to avoid any aliasing.
|
|||||||
+------------------------+----------+--------------+------------------+
|
+------------------------+----------+--------------+------------------+
|
||||||
| ioremap_uc | -- | UC | UC |
|
| ioremap_uc | -- | UC | UC |
|
||||||
+------------------------+----------+--------------+------------------+
|
+------------------------+----------+--------------+------------------+
|
||||||
| ioremap_nocache | -- | UC- | UC- |
|
|
||||||
+------------------------+----------+--------------+------------------+
|
|
||||||
| ioremap_wc | -- | -- | WC |
|
| ioremap_wc | -- | -- | WC |
|
||||||
+------------------------+----------+--------------+------------------+
|
+------------------------+----------+--------------+------------------+
|
||||||
| ioremap_wt | -- | -- | WT |
|
| ioremap_wt | -- | -- | WT |
|
||||||
|
73
MAINTAINERS
73
MAINTAINERS
@@ -345,7 +345,7 @@ F: drivers/acpi/apei/
|
|||||||
|
|
||||||
ACPI COMPONENT ARCHITECTURE (ACPICA)
|
ACPI COMPONENT ARCHITECTURE (ACPICA)
|
||||||
M: Robert Moore <robert.moore@intel.com>
|
M: Robert Moore <robert.moore@intel.com>
|
||||||
M: Erik Schmauss <erik.schmauss@intel.com>
|
M: Erik Kaneda <erik.kaneda@intel.com>
|
||||||
M: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
|
M: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
|
||||||
L: linux-acpi@vger.kernel.org
|
L: linux-acpi@vger.kernel.org
|
||||||
L: devel@acpica.org
|
L: devel@acpica.org
|
||||||
@@ -977,6 +977,15 @@ W: http://ez.analog.com/community/linux-device-drivers
|
|||||||
F: drivers/iio/imu/adis16460.c
|
F: drivers/iio/imu/adis16460.c
|
||||||
F: Documentation/devicetree/bindings/iio/imu/adi,adis16460.yaml
|
F: Documentation/devicetree/bindings/iio/imu/adi,adis16460.yaml
|
||||||
|
|
||||||
|
ANALOG DEVICES INC ADM1177 DRIVER
|
||||||
|
M: Beniamin Bia <beniamin.bia@analog.com>
|
||||||
|
M: Michael Hennerich <Michael.Hennerich@analog.com>
|
||||||
|
L: linux-hwmon@vger.kernel.org
|
||||||
|
W: http://ez.analog.com/community/linux-device-drivers
|
||||||
|
S: Supported
|
||||||
|
F: drivers/hwmon/adm1177.c
|
||||||
|
F: Documentation/devicetree/bindings/hwmon/adi,adm1177.yaml
|
||||||
|
|
||||||
ANALOG DEVICES INC ADP5061 DRIVER
|
ANALOG DEVICES INC ADP5061 DRIVER
|
||||||
M: Stefan Popa <stefan.popa@analog.com>
|
M: Stefan Popa <stefan.popa@analog.com>
|
||||||
L: linux-pm@vger.kernel.org
|
L: linux-pm@vger.kernel.org
|
||||||
@@ -2242,6 +2251,7 @@ L: linux-rockchip@lists.infradead.org
|
|||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/i2c/i2c-rk3x.txt
|
F: Documentation/devicetree/bindings/i2c/i2c-rk3x.txt
|
||||||
|
F: Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.yaml
|
||||||
F: arch/arm/boot/dts/rk3*
|
F: arch/arm/boot/dts/rk3*
|
||||||
F: arch/arm/boot/dts/rv1108*
|
F: arch/arm/boot/dts/rv1108*
|
||||||
F: arch/arm/mach-rockchip/
|
F: arch/arm/mach-rockchip/
|
||||||
@@ -2694,6 +2704,14 @@ S: Maintained
|
|||||||
F: drivers/pinctrl/aspeed/
|
F: drivers/pinctrl/aspeed/
|
||||||
F: Documentation/devicetree/bindings/pinctrl/aspeed,*
|
F: Documentation/devicetree/bindings/pinctrl/aspeed,*
|
||||||
|
|
||||||
|
ASPEED SCU INTERRUPT CONTROLLER DRIVER
|
||||||
|
M: Eddie James <eajames@linux.ibm.com>
|
||||||
|
L: linux-aspeed@lists.ozlabs.org (moderated for non-subscribers)
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2xxx-scu-ic.txt
|
||||||
|
F: drivers/irqchip/irq-aspeed-scu-ic.c
|
||||||
|
F: include/dt-bindings/interrupt-controller/aspeed-scu-ic.h
|
||||||
|
|
||||||
ASPEED VIDEO ENGINE DRIVER
|
ASPEED VIDEO ENGINE DRIVER
|
||||||
M: Eddie James <eajames@linux.ibm.com>
|
M: Eddie James <eajames@linux.ibm.com>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
@@ -7499,6 +7517,12 @@ S: Supported
|
|||||||
F: drivers/scsi/hisi_sas/
|
F: drivers/scsi/hisi_sas/
|
||||||
F: Documentation/devicetree/bindings/scsi/hisilicon-sas.txt
|
F: Documentation/devicetree/bindings/scsi/hisilicon-sas.txt
|
||||||
|
|
||||||
|
HISILICON V3XX SPI NOR FLASH Controller Driver
|
||||||
|
M: John Garry <john.garry@huawei.com>
|
||||||
|
W: http://www.hisilicon.com
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/spi/spi-hisi-sfc-v3xx.c
|
||||||
|
|
||||||
HISILICON QM AND ZIP Controller DRIVER
|
HISILICON QM AND ZIP Controller DRIVER
|
||||||
M: Zhou Wang <wangzhou1@hisilicon.com>
|
M: Zhou Wang <wangzhou1@hisilicon.com>
|
||||||
L: linux-crypto@vger.kernel.org
|
L: linux-crypto@vger.kernel.org
|
||||||
@@ -7842,10 +7866,10 @@ F: Documentation/devicetree/bindings/i3c/snps,dw-i3c-master.txt
|
|||||||
F: drivers/i3c/master/dw*
|
F: drivers/i3c/master/dw*
|
||||||
|
|
||||||
I3C DRIVER FOR CADENCE I3C MASTER IP
|
I3C DRIVER FOR CADENCE I3C MASTER IP
|
||||||
M: Przemysław Gaj <pgaj@cadence.com>
|
M: Przemysław Gaj <pgaj@cadence.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/i3c/cdns,i3c-master.txt
|
F: Documentation/devicetree/bindings/i3c/cdns,i3c-master.txt
|
||||||
F: drivers/i3c/master/i3c-master-cdns.c
|
F: drivers/i3c/master/i3c-master-cdns.c
|
||||||
|
|
||||||
IA64 (Itanium) PLATFORM
|
IA64 (Itanium) PLATFORM
|
||||||
M: Tony Luck <tony.luck@intel.com>
|
M: Tony Luck <tony.luck@intel.com>
|
||||||
@@ -8382,6 +8406,14 @@ Q: https://patchwork.kernel.org/project/linux-dmaengine/list/
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/dma/ioat*
|
F: drivers/dma/ioat*
|
||||||
|
|
||||||
|
INTEL IADX DRIVER
|
||||||
|
M: Dave Jiang <dave.jiang@intel.com>
|
||||||
|
L: dmaengine@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
F: drivers/dma/idxd/*
|
||||||
|
F: include/uapi/linux/idxd.h
|
||||||
|
F: include/linux/idxd.h
|
||||||
|
|
||||||
INTEL IDLE DRIVER
|
INTEL IDLE DRIVER
|
||||||
M: Jacob Pan <jacob.jun.pan@linux.intel.com>
|
M: Jacob Pan <jacob.jun.pan@linux.intel.com>
|
||||||
M: Len Brown <lenb@kernel.org>
|
M: Len Brown <lenb@kernel.org>
|
||||||
@@ -8563,6 +8595,12 @@ S: Maintained
|
|||||||
F: arch/x86/include/asm/intel_telemetry.h
|
F: arch/x86/include/asm/intel_telemetry.h
|
||||||
F: drivers/platform/x86/intel_telemetry*
|
F: drivers/platform/x86/intel_telemetry*
|
||||||
|
|
||||||
|
INTEL UNCORE FREQUENCY CONTROL
|
||||||
|
M: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
|
||||||
|
L: platform-driver-x86@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/platform/x86/intel-uncore-frequency.c
|
||||||
|
|
||||||
INTEL VIRTUAL BUTTON DRIVER
|
INTEL VIRTUAL BUTTON DRIVER
|
||||||
M: AceLan Kao <acelan.kao@canonical.com>
|
M: AceLan Kao <acelan.kao@canonical.com>
|
||||||
L: platform-driver-x86@vger.kernel.org
|
L: platform-driver-x86@vger.kernel.org
|
||||||
@@ -9133,7 +9171,7 @@ F: arch/x86/include/uapi/asm/svm.h
|
|||||||
F: arch/x86/include/asm/kvm*
|
F: arch/x86/include/asm/kvm*
|
||||||
F: arch/x86/include/asm/pvclock-abi.h
|
F: arch/x86/include/asm/pvclock-abi.h
|
||||||
F: arch/x86/include/asm/svm.h
|
F: arch/x86/include/asm/svm.h
|
||||||
F: arch/x86/include/asm/vmx.h
|
F: arch/x86/include/asm/vmx*.h
|
||||||
F: arch/x86/kernel/kvm.c
|
F: arch/x86/kernel/kvm.c
|
||||||
F: arch/x86/kernel/kvmclock.c
|
F: arch/x86/kernel/kvmclock.c
|
||||||
|
|
||||||
@@ -11144,6 +11182,13 @@ S: Maintained
|
|||||||
F: Documentation/driver-api/serial/moxa-smartio.rst
|
F: Documentation/driver-api/serial/moxa-smartio.rst
|
||||||
F: drivers/tty/mxser.*
|
F: drivers/tty/mxser.*
|
||||||
|
|
||||||
|
MONOLITHIC POWER SYSTEM PMIC DRIVER
|
||||||
|
M: Saravanan Sekar <sravanhome@gmail.com>
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/devicetree/bindings/regulator/mpq7920.yaml
|
||||||
|
F: drivers/regulator/mpq7920.c
|
||||||
|
F: drivers/regulator/mpq7920.h
|
||||||
|
|
||||||
MR800 AVERMEDIA USB FM RADIO DRIVER
|
MR800 AVERMEDIA USB FM RADIO DRIVER
|
||||||
M: Alexey Klimov <klimov.linux@gmail.com>
|
M: Alexey Klimov <klimov.linux@gmail.com>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
@@ -13146,6 +13191,11 @@ S: Maintained
|
|||||||
F: drivers/iio/chemical/pms7003.c
|
F: drivers/iio/chemical/pms7003.c
|
||||||
F: Documentation/devicetree/bindings/iio/chemical/plantower,pms7003.yaml
|
F: Documentation/devicetree/bindings/iio/chemical/plantower,pms7003.yaml
|
||||||
|
|
||||||
|
PLX DMA DRIVER
|
||||||
|
M: Logan Gunthorpe <logang@deltatee.com>
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/dma/plx_dma.c
|
||||||
|
|
||||||
PMBUS HARDWARE MONITORING DRIVERS
|
PMBUS HARDWARE MONITORING DRIVERS
|
||||||
M: Guenter Roeck <linux@roeck-us.net>
|
M: Guenter Roeck <linux@roeck-us.net>
|
||||||
L: linux-hwmon@vger.kernel.org
|
L: linux-hwmon@vger.kernel.org
|
||||||
@@ -13216,6 +13266,8 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: fs/timerfd.c
|
F: fs/timerfd.c
|
||||||
F: include/linux/timer*
|
F: include/linux/timer*
|
||||||
|
F: include/linux/time_namespace.h
|
||||||
|
F: kernel/time_namespace.c
|
||||||
F: kernel/time/*timer*
|
F: kernel/time/*timer*
|
||||||
|
|
||||||
POWER MANAGEMENT CORE
|
POWER MANAGEMENT CORE
|
||||||
@@ -13673,6 +13725,14 @@ S: Maintained
|
|||||||
F: Documentation/devicetree/bindings/opp/qcom-nvmem-cpufreq.txt
|
F: Documentation/devicetree/bindings/opp/qcom-nvmem-cpufreq.txt
|
||||||
F: drivers/cpufreq/qcom-cpufreq-nvmem.c
|
F: drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||||
|
|
||||||
|
QUALCOMM CORE POWER REDUCTION (CPR) AVS DRIVER
|
||||||
|
M: Niklas Cassel <nks@flawful.org>
|
||||||
|
L: linux-pm@vger.kernel.org
|
||||||
|
L: linux-arm-msm@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/devicetree/bindings/power/avs/qcom,cpr.txt
|
||||||
|
F: drivers/power/avs/qcom-cpr.c
|
||||||
|
|
||||||
QUALCOMM EMAC GIGABIT ETHERNET DRIVER
|
QUALCOMM EMAC GIGABIT ETHERNET DRIVER
|
||||||
M: Timur Tabi <timur@kernel.org>
|
M: Timur Tabi <timur@kernel.org>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
@@ -14820,6 +14880,7 @@ F: include/uapi/linux/selinux_netlink.h
|
|||||||
F: security/selinux/
|
F: security/selinux/
|
||||||
F: scripts/selinux/
|
F: scripts/selinux/
|
||||||
F: Documentation/admin-guide/LSM/SELinux.rst
|
F: Documentation/admin-guide/LSM/SELinux.rst
|
||||||
|
F: Documentation/ABI/obsolete/sysfs-selinux-disable
|
||||||
|
|
||||||
SENSABLE PHANTOM
|
SENSABLE PHANTOM
|
||||||
M: Jiri Slaby <jirislaby@gmail.com>
|
M: Jiri Slaby <jirislaby@gmail.com>
|
||||||
|
@@ -283,14 +283,8 @@ static inline void __iomem *ioremap(unsigned long port, unsigned long size)
|
|||||||
return IO_CONCAT(__IO_PREFIX,ioremap) (port, size);
|
return IO_CONCAT(__IO_PREFIX,ioremap) (port, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __iomem * ioremap_nocache(unsigned long offset,
|
#define ioremap_wc ioremap
|
||||||
unsigned long size)
|
#define ioremap_uc ioremap
|
||||||
{
|
|
||||||
return ioremap(offset, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ioremap_wc ioremap_nocache
|
|
||||||
#define ioremap_uc ioremap_nocache
|
|
||||||
|
|
||||||
static inline void iounmap(volatile void __iomem *addr)
|
static inline void iounmap(volatile void __iomem *addr)
|
||||||
{
|
{
|
||||||
|
4
arch/alpha/include/asm/vmalloc.h
Normal file
4
arch/alpha/include/asm/vmalloc.h
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#ifndef _ASM_ALPHA_VMALLOC_H
|
||||||
|
#define _ASM_ALPHA_VMALLOC_H
|
||||||
|
|
||||||
|
#endif /* _ASM_ALPHA_VMALLOC_H */
|
@@ -13,7 +13,7 @@ config ARC
|
|||||||
select ARCH_HAS_SYNC_DMA_FOR_DEVICE
|
select ARCH_HAS_SYNC_DMA_FOR_DEVICE
|
||||||
select ARCH_SUPPORTS_ATOMIC_RMW if ARC_HAS_LLSC
|
select ARCH_SUPPORTS_ATOMIC_RMW if ARC_HAS_LLSC
|
||||||
select ARCH_32BIT_OFF_T
|
select ARCH_32BIT_OFF_T
|
||||||
select BUILDTIME_EXTABLE_SORT
|
select BUILDTIME_TABLE_SORT
|
||||||
select CLONE_BACKWARDS
|
select CLONE_BACKWARDS
|
||||||
select COMMON_CLK
|
select COMMON_CLK
|
||||||
select DMA_DIRECT_REMAP
|
select DMA_DIRECT_REMAP
|
||||||
|
4
arch/arc/include/asm/vmalloc.h
Normal file
4
arch/arc/include/asm/vmalloc.h
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#ifndef _ASM_ARC_VMALLOC_H
|
||||||
|
#define _ASM_ARC_VMALLOC_H
|
||||||
|
|
||||||
|
#endif /* _ASM_ARC_VMALLOC_H */
|
@@ -337,11 +337,11 @@ resume_user_mode_begin:
|
|||||||
resume_kernel_mode:
|
resume_kernel_mode:
|
||||||
|
|
||||||
; Disable Interrupts from this point on
|
; Disable Interrupts from this point on
|
||||||
; CONFIG_PREEMPT: This is a must for preempt_schedule_irq()
|
; CONFIG_PREEMPTION: This is a must for preempt_schedule_irq()
|
||||||
; !CONFIG_PREEMPT: To ensure restore_regs is intr safe
|
; !CONFIG_PREEMPTION: To ensure restore_regs is intr safe
|
||||||
IRQ_DISABLE r9
|
IRQ_DISABLE r9
|
||||||
|
|
||||||
#ifdef CONFIG_PREEMPT
|
#ifdef CONFIG_PREEMPTION
|
||||||
|
|
||||||
; Can't preempt if preemption disabled
|
; Can't preempt if preemption disabled
|
||||||
GET_CURR_THR_INFO_FROM_SP r10
|
GET_CURR_THR_INFO_FROM_SP r10
|
||||||
|
@@ -36,7 +36,7 @@ config ARM
|
|||||||
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU
|
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU
|
||||||
select ARCH_WANT_IPC_PARSE_VERSION
|
select ARCH_WANT_IPC_PARSE_VERSION
|
||||||
select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
|
select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
|
||||||
select BUILDTIME_EXTABLE_SORT if MMU
|
select BUILDTIME_TABLE_SORT if MMU
|
||||||
select CLONE_BACKWARDS
|
select CLONE_BACKWARDS
|
||||||
select CPU_PM if SUSPEND || CPU_IDLE
|
select CPU_PM if SUSPEND || CPU_IDLE
|
||||||
select DCACHE_WORD_ACCESS if HAVE_EFFICIENT_UNALIGNED_ACCESS
|
select DCACHE_WORD_ACCESS if HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/io-64-nonatomic-lo-hi.h>
|
||||||
#include <asm/barrier.h>
|
#include <asm/barrier.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/cp15.h>
|
#include <asm/cp15.h>
|
||||||
@@ -327,6 +328,7 @@ static inline u64 __gic_readq_nonatomic(const volatile void __iomem *addr)
|
|||||||
/*
|
/*
|
||||||
* GITS_VPROPBASER - hi and lo bits may be accessed independently.
|
* GITS_VPROPBASER - hi and lo bits may be accessed independently.
|
||||||
*/
|
*/
|
||||||
|
#define gits_read_vpropbaser(c) __gic_readq_nonatomic(c)
|
||||||
#define gits_write_vpropbaser(v, c) __gic_writeq_nonatomic(v, c)
|
#define gits_write_vpropbaser(v, c) __gic_writeq_nonatomic(v, c)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -50,19 +50,16 @@ void efi_virtmap_unload(void);
|
|||||||
|
|
||||||
/* arch specific definitions used by the stub code */
|
/* arch specific definitions used by the stub code */
|
||||||
|
|
||||||
#define efi_call_early(f, ...) sys_table_arg->boottime->f(__VA_ARGS__)
|
#define efi_bs_call(func, ...) efi_system_table()->boottime->func(__VA_ARGS__)
|
||||||
#define __efi_call_early(f, ...) f(__VA_ARGS__)
|
#define efi_rt_call(func, ...) efi_system_table()->runtime->func(__VA_ARGS__)
|
||||||
#define efi_call_runtime(f, ...) sys_table_arg->runtime->f(__VA_ARGS__)
|
#define efi_is_native() (true)
|
||||||
#define efi_is_64bit() (false)
|
|
||||||
|
|
||||||
#define efi_table_attr(table, attr, instance) \
|
#define efi_table_attr(inst, attr) (inst->attr)
|
||||||
((table##_t *)instance)->attr
|
|
||||||
|
|
||||||
#define efi_call_proto(protocol, f, instance, ...) \
|
#define efi_call_proto(inst, func, ...) inst->func(inst, ##__VA_ARGS__)
|
||||||
((protocol##_t *)instance)->f(instance, ##__VA_ARGS__)
|
|
||||||
|
|
||||||
struct screen_info *alloc_screen_info(efi_system_table_t *sys_table_arg);
|
struct screen_info *alloc_screen_info(void);
|
||||||
void free_screen_info(efi_system_table_t *sys_table, struct screen_info *si);
|
void free_screen_info(struct screen_info *si);
|
||||||
|
|
||||||
static inline void efifb_setup_from_dmi(struct screen_info *si, const char *opt)
|
static inline void efifb_setup_from_dmi(struct screen_info *si, const char *opt)
|
||||||
{
|
{
|
||||||
|
@@ -356,7 +356,6 @@ static inline void memcpy_toio(volatile void __iomem *to, const void *from,
|
|||||||
*
|
*
|
||||||
* Function Memory type Cacheability Cache hint
|
* Function Memory type Cacheability Cache hint
|
||||||
* ioremap() Device n/a n/a
|
* ioremap() Device n/a n/a
|
||||||
* ioremap_nocache() Device n/a n/a
|
|
||||||
* ioremap_cache() Normal Writeback Read allocate
|
* ioremap_cache() Normal Writeback Read allocate
|
||||||
* ioremap_wc() Normal Non-cacheable n/a
|
* ioremap_wc() Normal Non-cacheable n/a
|
||||||
* ioremap_wt() Normal Non-cacheable n/a
|
* ioremap_wt() Normal Non-cacheable n/a
|
||||||
@@ -368,13 +367,6 @@ static inline void memcpy_toio(volatile void __iomem *to, const void *from,
|
|||||||
* - unaligned accesses are "unpredictable"
|
* - unaligned accesses are "unpredictable"
|
||||||
* - writes may be delayed before they hit the endpoint device
|
* - writes may be delayed before they hit the endpoint device
|
||||||
*
|
*
|
||||||
* ioremap_nocache() is the same as ioremap() as there are too many device
|
|
||||||
* drivers using this for device registers, and documentation which tells
|
|
||||||
* people to use it for such for this to be any different. This is not a
|
|
||||||
* safe fallback for memory-like mappings, or memory regions where the
|
|
||||||
* compiler may generate unaligned accesses - eg, via inlining its own
|
|
||||||
* memcpy.
|
|
||||||
*
|
|
||||||
* All normal memory mappings have the following properties:
|
* All normal memory mappings have the following properties:
|
||||||
* - reads can be repeated with no side effects
|
* - reads can be repeated with no side effects
|
||||||
* - repeated reads return the last value written
|
* - repeated reads return the last value written
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
* to ensure that the maintenance completes in case we migrate to another
|
* to ensure that the maintenance completes in case we migrate to another
|
||||||
* CPU.
|
* CPU.
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP) && defined(CONFIG_CPU_V7)
|
#if defined(CONFIG_PREEMPTION) && defined(CONFIG_SMP) && defined(CONFIG_CPU_V7)
|
||||||
#define __complete_pending_tlbi() dsb(ish)
|
#define __complete_pending_tlbi() dsb(ish)
|
||||||
#else
|
#else
|
||||||
#define __complete_pending_tlbi()
|
#define __complete_pending_tlbi()
|
||||||
|
@@ -52,6 +52,24 @@ static __always_inline long clock_gettime_fallback(
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __always_inline long clock_gettime32_fallback(
|
||||||
|
clockid_t _clkid,
|
||||||
|
struct old_timespec32 *_ts)
|
||||||
|
{
|
||||||
|
register struct old_timespec32 *ts asm("r1") = _ts;
|
||||||
|
register clockid_t clkid asm("r0") = _clkid;
|
||||||
|
register long ret asm ("r0");
|
||||||
|
register long nr asm("r7") = __NR_clock_gettime;
|
||||||
|
|
||||||
|
asm volatile(
|
||||||
|
" swi #0\n"
|
||||||
|
: "=r" (ret)
|
||||||
|
: "r" (clkid), "r" (ts), "r" (nr)
|
||||||
|
: "memory");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static __always_inline int clock_getres_fallback(
|
static __always_inline int clock_getres_fallback(
|
||||||
clockid_t _clkid,
|
clockid_t _clkid,
|
||||||
struct __kernel_timespec *_ts)
|
struct __kernel_timespec *_ts)
|
||||||
@@ -70,6 +88,24 @@ static __always_inline int clock_getres_fallback(
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __always_inline int clock_getres32_fallback(
|
||||||
|
clockid_t _clkid,
|
||||||
|
struct old_timespec32 *_ts)
|
||||||
|
{
|
||||||
|
register struct old_timespec32 *ts asm("r1") = _ts;
|
||||||
|
register clockid_t clkid asm("r0") = _clkid;
|
||||||
|
register long ret asm ("r0");
|
||||||
|
register long nr asm("r7") = __NR_clock_getres;
|
||||||
|
|
||||||
|
asm volatile(
|
||||||
|
" swi #0\n"
|
||||||
|
: "=r" (ret)
|
||||||
|
: "r" (clkid), "r" (ts), "r" (nr)
|
||||||
|
: "memory");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static __always_inline u64 __arch_get_hw_counter(int clock_mode)
|
static __always_inline u64 __arch_get_hw_counter(int clock_mode)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_ARM_ARCH_TIMER
|
#ifdef CONFIG_ARM_ARCH_TIMER
|
||||||
|
@@ -34,9 +34,9 @@ struct vdso_data *__arm_get_k_vdso_data(void)
|
|||||||
#define __arch_get_k_vdso_data __arm_get_k_vdso_data
|
#define __arch_get_k_vdso_data __arm_get_k_vdso_data
|
||||||
|
|
||||||
static __always_inline
|
static __always_inline
|
||||||
int __arm_update_vdso_data(void)
|
bool __arm_update_vdso_data(void)
|
||||||
{
|
{
|
||||||
return !cntvct_ok;
|
return cntvct_ok;
|
||||||
}
|
}
|
||||||
#define __arch_update_vdso_data __arm_update_vdso_data
|
#define __arch_update_vdso_data __arm_update_vdso_data
|
||||||
|
|
||||||
|
4
arch/arm/include/asm/vmalloc.h
Normal file
4
arch/arm/include/asm/vmalloc.h
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#ifndef _ASM_ARM_VMALLOC_H
|
||||||
|
#define _ASM_ARM_VMALLOC_H
|
||||||
|
|
||||||
|
#endif /* _ASM_ARM_VMALLOC_H */
|
@@ -53,8 +53,8 @@ obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o
|
|||||||
obj-$(CONFIG_HAVE_ARM_TWD) += smp_twd.o
|
obj-$(CONFIG_HAVE_ARM_TWD) += smp_twd.o
|
||||||
obj-$(CONFIG_ARM_ARCH_TIMER) += arch_timer.o
|
obj-$(CONFIG_ARM_ARCH_TIMER) += arch_timer.o
|
||||||
obj-$(CONFIG_FUNCTION_TRACER) += entry-ftrace.o
|
obj-$(CONFIG_FUNCTION_TRACER) += entry-ftrace.o
|
||||||
obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o insn.o
|
obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o insn.o patch.o
|
||||||
obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o insn.o
|
obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o insn.o patch.o
|
||||||
obj-$(CONFIG_JUMP_LABEL) += jump_label.o insn.o patch.o
|
obj-$(CONFIG_JUMP_LABEL) += jump_label.o insn.o patch.o
|
||||||
obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
|
obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
|
||||||
# Main staffs in KPROBES are in arch/arm/probes/ .
|
# Main staffs in KPROBES are in arch/arm/probes/ .
|
||||||
|
@@ -211,7 +211,7 @@ __irq_svc:
|
|||||||
svc_entry
|
svc_entry
|
||||||
irq_handler
|
irq_handler
|
||||||
|
|
||||||
#ifdef CONFIG_PREEMPT
|
#ifdef CONFIG_PREEMPTION
|
||||||
ldr r8, [tsk, #TI_PREEMPT] @ get preempt count
|
ldr r8, [tsk, #TI_PREEMPT] @ get preempt count
|
||||||
ldr r0, [tsk, #TI_FLAGS] @ get flags
|
ldr r0, [tsk, #TI_FLAGS] @ get flags
|
||||||
teq r8, #0 @ if preempt count != 0
|
teq r8, #0 @ if preempt count != 0
|
||||||
@@ -226,7 +226,7 @@ ENDPROC(__irq_svc)
|
|||||||
|
|
||||||
.ltorg
|
.ltorg
|
||||||
|
|
||||||
#ifdef CONFIG_PREEMPT
|
#ifdef CONFIG_PREEMPTION
|
||||||
svc_preempt:
|
svc_preempt:
|
||||||
mov r8, lr
|
mov r8, lr
|
||||||
1: bl preempt_schedule_irq @ irq en/disable is done inside
|
1: bl preempt_schedule_irq @ irq en/disable is done inside
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
#include <asm/ftrace.h>
|
#include <asm/ftrace.h>
|
||||||
#include <asm/insn.h>
|
#include <asm/insn.h>
|
||||||
#include <asm/set_memory.h>
|
#include <asm/set_memory.h>
|
||||||
|
#include <asm/patch.h>
|
||||||
|
|
||||||
#ifdef CONFIG_THUMB2_KERNEL
|
#ifdef CONFIG_THUMB2_KERNEL
|
||||||
#define NOP 0xf85deb04 /* pop.w {lr} */
|
#define NOP 0xf85deb04 /* pop.w {lr} */
|
||||||
@@ -35,9 +36,7 @@ static int __ftrace_modify_code(void *data)
|
|||||||
{
|
{
|
||||||
int *command = data;
|
int *command = data;
|
||||||
|
|
||||||
set_kernel_text_rw();
|
|
||||||
ftrace_modify_all_code(*command);
|
ftrace_modify_all_code(*command);
|
||||||
set_kernel_text_ro();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -59,13 +58,11 @@ static unsigned long adjust_address(struct dyn_ftrace *rec, unsigned long addr)
|
|||||||
|
|
||||||
int ftrace_arch_code_modify_prepare(void)
|
int ftrace_arch_code_modify_prepare(void)
|
||||||
{
|
{
|
||||||
set_all_modules_text_rw();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ftrace_arch_code_modify_post_process(void)
|
int ftrace_arch_code_modify_post_process(void)
|
||||||
{
|
{
|
||||||
set_all_modules_text_ro();
|
|
||||||
/* Make sure any TLB misses during machine stop are cleared. */
|
/* Make sure any TLB misses during machine stop are cleared. */
|
||||||
flush_tlb_all();
|
flush_tlb_all();
|
||||||
return 0;
|
return 0;
|
||||||
@@ -97,10 +94,7 @@ static int ftrace_modify_code(unsigned long pc, unsigned long old,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (probe_kernel_write((void *)pc, &new, MCOUNT_INSN_SIZE))
|
__patch_text((void *)pc, new);
|
||||||
return -EPERM;
|
|
||||||
|
|
||||||
flush_icache_range(pc, pc + MCOUNT_INSN_SIZE);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user