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>
|
||||
Douglas Gilbert <dougg@torque.net>
|
||||
Ed L. Cashin <ecashin@coraid.com>
|
||||
Erik Kaneda <erik.kaneda@intel.com> <erik.schmauss@intel.com>
|
||||
Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
Felipe W Damasio <felipewd@terra.com.br>
|
||||
Felix Kuhling <fxkuehl@gmx.de>
|
||||
@@ -209,6 +210,10 @@ Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
|
||||
Patrick Mochel <mochel@digitalimplant.org>
|
||||
Paul Burton <paulburton@kernel.org> <paul.burton@imgtec.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 Oruba <peter@oruba.de>
|
||||
Peter Oruba <peter.oruba@amd.com>
|
||||
@@ -217,6 +222,7 @@ Praveen BP <praveenbp@ti.com>
|
||||
Punit Agrawal <punitagrawal@gmail.com> <punit.agrawal@arm.com>
|
||||
Qais Yousef <qsyousef@gmail.com> <qais.yousef@imgtec.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>
|
||||
Ralf Baechle <ralf@linux-mips.org>
|
||||
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/
|
||||
Date: April 2005
|
||||
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
|
||||
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
|
||||
Date: April 2006
|
||||
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
|
||||
commands. An inactive TPM chip still contains all the state of
|
||||
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
|
||||
Date: June 2005
|
||||
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
|
||||
pending TPM command. Writing any value to cancel will call the
|
||||
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
|
||||
Date: April 2005
|
||||
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.
|
||||
|
||||
Example output:
|
||||
@@ -46,7 +46,7 @@ Description: The "caps" property contains TPM manufacturer and version info.
|
||||
What: /sys/class/tpm/tpmX/device/durations
|
||||
Date: March 2011
|
||||
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
|
||||
used to wait for a short, medium and long TPM command. All
|
||||
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
|
||||
Date: April 2006
|
||||
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,
|
||||
meaning that it should be visible to the OS. This property
|
||||
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
|
||||
Date: April 2006
|
||||
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
|
||||
ordinal has been executed successfully in the chip. A '0'
|
||||
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
|
||||
Date: April 2005
|
||||
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
|
||||
Configuration Registers in the TPM. Note that since these
|
||||
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
|
||||
Date: April 2005
|
||||
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
|
||||
key if possible. If the TPM has had ownership established and
|
||||
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
|
||||
Date: April 2006
|
||||
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
|
||||
been temporarily deactivated, usually until the next power
|
||||
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
|
||||
Date: March 2011
|
||||
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
|
||||
for the TPM's interface spec timeouts. The use of these
|
||||
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
|
||||
"[original]" or "[adjusted]" depending on whether the values
|
||||
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
|
||||
|
||||
Date: June 2018
|
||||
KernelVersion: 4.19
|
||||
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.
|
||||
|
||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/fan_dir
|
||||
|
||||
Date: December 2018
|
||||
KernelVersion: 5.0
|
||||
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||
@@ -30,7 +28,6 @@ Description: This file shows the system fans direction:
|
||||
The files are read only.
|
||||
|
||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/cpld3_version
|
||||
|
||||
Date: November 2018
|
||||
KernelVersion: 5.0
|
||||
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.
|
||||
|
||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/jtag_enable
|
||||
|
||||
Date: November 2018
|
||||
KernelVersion: 5.0
|
||||
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_system
|
||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/reset_voltmon_upgrade_fail
|
||||
|
||||
Date: November 2018
|
||||
KernelVersion: 5.0
|
||||
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.
|
||||
|
||||
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
|
||||
KernelVersion: 5.3
|
||||
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||
@@ -143,9 +144,65 @@ Description: These files show the system reset cause, as following:
|
||||
|
||||
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
|
||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/config1
|
||||
What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/config2
|
||||
Date: January 2020
|
||||
KernelVersion: 5.6
|
||||
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||
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
|
||||
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
|
||||
Date: September 2011
|
||||
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||
@@ -48,12 +55,15 @@ What: /sys/class/devfreq/.../trans_stat
|
||||
Date: October 2012
|
||||
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||
Description:
|
||||
This ABI shows the statistics of devfreq behavior on a
|
||||
specific device. It shows the time spent in each state and
|
||||
the number of transitions between states.
|
||||
This ABI shows or clears the statistics of devfreq behavior
|
||||
on a specific device. It shows the time spent in each state
|
||||
and the number of transitions between states.
|
||||
In order to activate this ABI, the devfreq target device
|
||||
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
|
||||
Date: September 2011
|
||||
|
@@ -196,6 +196,12 @@ Description:
|
||||
does not reflect it. Likewise, if one enables a deep state but a
|
||||
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
|
||||
Date: March 2014
|
||||
|
@@ -46,3 +46,13 @@ Description:
|
||||
* 0 - normal,
|
||||
* 1 - overboost,
|
||||
* 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:
|
||||
The /sys/power/suspend_stats/last_failed_step file contains
|
||||
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
|
||||
=========================================
|
||||
|
||||
|
||||
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".
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -18,12 +21,12 @@ brief explanation.
|
||||
|
||||
The dummy_nmi_callback() function is a "dummy" NMI handler that does
|
||||
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;
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -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
|
||||
with aggressive optimizing compilers.
|
||||
|
||||
Quick Quiz: Why might the rcu_dereference_sched() be necessary on Alpha,
|
||||
given that the code referenced by the pointer is read-only?
|
||||
Quick Quiz:
|
||||
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)
|
||||
{
|
||||
@@ -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-
|
||||
the call to set_nmi_callback(). On architectures that do not order
|
||||
writes, the rcu_assign_pointer() ensures that the NMI handler sees the
|
||||
initialized values.
|
||||
initialized values::
|
||||
|
||||
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.
|
||||
|
||||
One way to accomplish this is via synchronize_rcu(), perhaps as
|
||||
follows:
|
||||
follows::
|
||||
|
||||
unset_nmi_callback();
|
||||
synchronize_rcu();
|
||||
@@ -98,13 +102,12 @@ to free up the handler's data as soon as synchronize_rcu() returns.
|
||||
Important note: for this to work, the architecture in question must
|
||||
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
|
||||
that the code referenced by the pointer is read-only?
|
||||
|
||||
Answer: The caller to set_nmi_callback() might well have
|
||||
The caller to set_nmi_callback() might well have
|
||||
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
|
@@ -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
|
||||
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
|
||||
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
|
||||
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
|
||||
integers, which means that the rules governing handling of these indexes
|
||||
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
|
||||
described in the following sections.
|
||||
|
||||
.. _hash_tables:
|
||||
|
||||
Situation 1: Hash Tables
|
||||
------------------------
|
||||
|
||||
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
|
||||
as described in the listRCU.txt document. This approach also applies
|
||||
to other array-of-list situations, such as radix trees.
|
||||
|
||||
.. _static_arrays:
|
||||
|
||||
Situation 2: Static Arrays
|
||||
--------------------------
|
||||
|
||||
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,
|
||||
@@ -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
|
||||
as updates are rare.
|
||||
|
||||
Quick Quiz: Why is it so important that updates be rare when
|
||||
using seqlock?
|
||||
Quick Quiz:
|
||||
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
|
||||
to map from semaphore, message-queue, and shared-memory IDs to the data
|
||||
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.
|
||||
Note that rcu_assign_pointer() is used to update the ids->entries pointer,
|
||||
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)
|
||||
{
|
||||
@@ -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
|
||||
a non-existent entry. After acquiring "out->lock", the "out->deleted"
|
||||
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)
|
||||
{
|
||||
@@ -144,8 +154,10 @@ deleted, and, if not, the pointer is returned.
|
||||
return out;
|
||||
}
|
||||
|
||||
.. _answer_quick_quiz_seqlock:
|
||||
|
||||
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
|
||||
using seqlock is that frequent updates can livelock readers.
|
@@ -7,8 +7,13 @@ RCU concepts
|
||||
.. toctree::
|
||||
:maxdepth: 3
|
||||
|
||||
arrayRCU
|
||||
rcubarrier
|
||||
rcu_dereference
|
||||
whatisRCU
|
||||
rcu
|
||||
listRCU
|
||||
NMI-RCU
|
||||
UP
|
||||
|
||||
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
|
||||
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
|
||||
to the cic pointer, which means that the rcu_dereference() can be replaced
|
||||
by rcu_access_pointer() as follows:
|
||||
|
@@ -1,4 +1,7 @@
|
||||
.. _rcu_dereference_doc:
|
||||
|
||||
PROPER CARE AND FEEDING OF RETURN VALUES FROM rcu_dereference()
|
||||
===============================================================
|
||||
|
||||
Most of the time, you can use values from rcu_dereference() or one of
|
||||
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.
|
||||
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
|
||||
will complain. Worse yet, your code can see random memory-corruption
|
||||
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
|
||||
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
|
||||
trust it to carry dependencies through integer operations.
|
||||
There are a very few exceptions, namely that you can temporarily
|
||||
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
|
||||
must have alignment constraints, for example, this does
|
||||
-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.
|
||||
|
||||
It is important to cast the value back to pointer before
|
||||
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
|
||||
"(x-(uintptr_t)x)" for char* pointers. The compiler is within its
|
||||
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
|
||||
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
|
||||
(directly or indirectly) from rcu_dereference(), you may need to
|
||||
interact directly with the hardware to flush instruction caches.
|
||||
This issue arises on some systems when a newly JITed function is
|
||||
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,
|
||||
the following (quite strange) code is buggy:
|
||||
the following (quite strange) code is buggy::
|
||||
|
||||
int *p;
|
||||
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
|
||||
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
|
||||
explained, if the two pointers are equal, the compiler could
|
||||
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);
|
||||
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
|
||||
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);
|
||||
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:
|
||||
|
||||
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
|
||||
not be dereferencing it anyway. If the comparison is
|
||||
non-equal, the compiler is none the wiser. Therefore,
|
||||
it is safe to compare pointers from rcu_dereference()
|
||||
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
|
||||
cannot use anything it learned from the comparison
|
||||
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
|
||||
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
|
||||
this is safe is that even if misordering occurs, the
|
||||
misordering will not affect the accesses that follow
|
||||
the comparison. So exactly how long ago is "a long
|
||||
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.
|
||||
|
||||
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
|
||||
kernel's wide array of primitives that cause code to
|
||||
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
|
||||
on one rcu_dereference() or another, so you get proper
|
||||
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
|
||||
"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.
|
||||
That said, it is easy to get control dependencies wrong.
|
||||
Please see the "CONTROL DEPENDENCIES" section of
|
||||
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
|
||||
pointer. Note that the volatile cast in rcu_dereference()
|
||||
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
|
||||
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
|
||||
optimizations that take data collected from prior runs. Such
|
||||
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
|
||||
----------------------------------
|
||||
|
||||
Because updaters can run concurrently with RCU readers, RCU readers can
|
||||
see stale and/or inconsistent values. If RCU readers need fresh or
|
||||
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 {
|
||||
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?
|
||||
|
||||
Then one approach is to use locking, for example, as follows:
|
||||
Then one approach is to use locking, for example, as follows::
|
||||
|
||||
struct foo {
|
||||
int a;
|
||||
@@ -299,6 +303,7 @@ As always, use the right tool for the job!
|
||||
|
||||
|
||||
EXAMPLE WHERE THE COMPILER KNOWS TOO MUCH
|
||||
-----------------------------------------
|
||||
|
||||
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
|
||||
@@ -308,7 +313,7 @@ guarantees that RCU depends on. And the volatile cast in rcu_dereference()
|
||||
should prevent the compiler from guessing the value.
|
||||
|
||||
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 {
|
||||
int a;
|
||||
@@ -354,6 +359,7 @@ dereference the resulting pointer.
|
||||
|
||||
|
||||
WHICH MEMBER OF THE rcu_dereference() FAMILY SHOULD YOU USE?
|
||||
------------------------------------------------------------
|
||||
|
||||
First, please avoid using rcu_dereference_raw() and also please avoid
|
||||
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
|
||||
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,
|
||||
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
|
||||
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,
|
||||
lockdep_is_held(&my_lock) ||
|
||||
lockdep_is_held(&your_lock));
|
||||
|
||||
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,
|
||||
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
|
||||
-----------------------------------------
|
||||
|
||||
The sparse static-analysis tool checks for direct access to RCU-protected
|
||||
pointers, which can result in "interesting" bugs due to compiler
|
||||
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;
|
||||
do_something_with(p->a);
|
||||
do_something_else_with(p->b);
|
||||
|
||||
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_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.
|
||||
|
||||
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);
|
||||
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
|
||||
if a pointer not marked with "__rcu" is accessed using rcu_dereference()
|
||||
and friends. For example, ->rcu_protected_pointer might be declared as
|
||||
follows:
|
||||
follows::
|
||||
|
||||
struct foo __rcu *rcu_protected_pointer;
|
||||
|
@@ -1,4 +1,7 @@
|
||||
.. _rcu_barrier:
|
||||
|
||||
RCU and Unloadable Modules
|
||||
==========================
|
||||
|
||||
[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
|
||||
pre-existing readers have completed. An updater wishing to delete 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);
|
||||
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
|
||||
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
|
||||
context might then be as follows:
|
||||
context might then be as follows::
|
||||
|
||||
list_del_rcu(p);
|
||||
call_rcu(&p->rcu, p_callback);
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -49,6 +52,7 @@ IRQ context. The function p_callback() might be defined as follows:
|
||||
|
||||
|
||||
Unloading Modules That Use call_rcu()
|
||||
-------------------------------------
|
||||
|
||||
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()
|
||||
-------------
|
||||
|
||||
We instead need the rcu_barrier() primitive. Rather than waiting for
|
||||
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
|
||||
anywhere, rcu_barrier() is within its rights to return immediately,
|
||||
without waiting for a grace period to elapse.
|
||||
@@ -88,15 +93,15 @@ 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
|
||||
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
|
||||
srcu_struct_2(), then the following three lines of code will be required
|
||||
when unloading:
|
||||
srcu_struct_2, then the following three lines of code will be required
|
||||
when unloading::
|
||||
|
||||
1 rcu_barrier();
|
||||
2 srcu_barrier(&srcu_struct_1);
|
||||
3 srcu_barrier(&srcu_struct_2);
|
||||
|
||||
The rcutorture module makes use of rcu_barrier() in its exit function
|
||||
as follows:
|
||||
as follows::
|
||||
|
||||
1 static void
|
||||
2 rcu_torture_cleanup(void)
|
||||
@@ -176,9 +181,14 @@ for any pre-existing callbacks to complete.
|
||||
Then lines 55-62 print status and do operation-specific cleanup, and
|
||||
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?
|
||||
|
||||
:ref:`Answer to Quick Quiz #1 <answer_rcubarrier_quiz_1>`
|
||||
|
||||
Your module might have additional complications. For example, if your
|
||||
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
|
||||
@@ -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
|
||||
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- 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().
|
||||
|
||||
|
||||
Implementing rcu_barrier()
|
||||
--------------------------
|
||||
|
||||
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
|
||||
@@ -200,7 +211,7 @@ 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
|
||||
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)
|
||||
2 {
|
||||
@@ -226,7 +237,7 @@ This code was rewritten in 2008 and several times thereafter, but this
|
||||
still gives the general idea.
|
||||
|
||||
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)
|
||||
2 {
|
||||
@@ -248,7 +259,7 @@ the current CPU's queue.
|
||||
|
||||
The rcu_barrier_callback() function simply atomically decrements the
|
||||
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)
|
||||
2 {
|
||||
@@ -256,12 +267,17 @@ reaches zero, as follows:
|
||||
4 complete(&rcu_barrier_completion);
|
||||
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
|
||||
value one), but the other CPU's rcu_barrier_func() invocations
|
||||
are delayed for a full grace period? Couldn't this result in
|
||||
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
|
||||
to avoid disturbing idle CPUs (especially on battery-powered 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
|
||||
---------------------
|
||||
|
||||
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
|
||||
@@ -277,8 +294,12 @@ so that your module may be safely unloaded.
|
||||
|
||||
|
||||
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?
|
||||
|
||||
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
|
||||
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
|
||||
value one), but the other CPU's rcu_barrier_func() invocations
|
||||
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()
|
||||
and an rcu_read_unlock() after line 8 of this same function. If
|
||||
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
|
||||
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
|
||||
jiffies counter when this CPU last invoked rcu_try_advance_all_cbs()
|
||||
from rcu_needs_cpu() or last invoked rcu_accelerate_cbs() from
|
||||
rcu_prepare_for_idle(). The "Nonlazy posted:" indicates lazy-callback
|
||||
status, so that an "l" indicates that all callbacks were lazy at the start
|
||||
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).
|
||||
rcu_prepare_for_idle(). "dyntick_enabled: 1" indicates that dyntick-idle
|
||||
processing is enabled.
|
||||
|
||||
If the grace period ends just as the stall warning starts printing,
|
||||
there will be a spurious stall-warning message, which will include
|
||||
|
@@ -1,15 +1,18 @@
|
||||
.. _whatisrcu_doc:
|
||||
|
||||
What is RCU? -- "Read, Copy, Update"
|
||||
======================================
|
||||
|
||||
Please note that the "What is RCU?" LWN series is an excellent place
|
||||
to start learning about RCU:
|
||||
|
||||
1. What is RCU, Fundamentally? http://lwn.net/Articles/262464/
|
||||
2. What is RCU? Part 2: Usage http://lwn.net/Articles/263130/
|
||||
3. RCU part 3: the RCU API http://lwn.net/Articles/264090/
|
||||
4. The RCU API, 2010 Edition http://lwn.net/Articles/418853/
|
||||
2010 Big API Table http://lwn.net/Articles/419086/
|
||||
5. The RCU API, 2014 Edition http://lwn.net/Articles/609904/
|
||||
2014 Big API Table http://lwn.net/Articles/609973/
|
||||
| 1. What is RCU, Fundamentally? http://lwn.net/Articles/262464/
|
||||
| 2. What is RCU? Part 2: Usage http://lwn.net/Articles/263130/
|
||||
| 3. RCU part 3: the RCU API http://lwn.net/Articles/264090/
|
||||
| 4. The RCU API, 2010 Edition http://lwn.net/Articles/418853/
|
||||
| 2010 Big API Table http://lwn.net/Articles/419086/
|
||||
| 5. The RCU API, 2014 Edition http://lwn.net/Articles/609904/
|
||||
| 2014 Big API Table http://lwn.net/Articles/609973/
|
||||
|
||||
|
||||
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
|
||||
different paths, as follows:
|
||||
|
||||
1. RCU OVERVIEW
|
||||
2. WHAT IS RCU'S CORE API?
|
||||
3. WHAT ARE SOME EXAMPLE USES OF CORE RCU API?
|
||||
4. WHAT IF MY UPDATING THREAD CANNOT BLOCK?
|
||||
5. WHAT ARE SOME SIMPLE IMPLEMENTATIONS OF RCU?
|
||||
6. ANALOGY WITH READER-WRITER LOCKING
|
||||
7. FULL LIST OF RCU APIs
|
||||
8. ANSWERS TO QUICK QUIZZES
|
||||
:ref:`1. RCU OVERVIEW <1_whatisRCU>`
|
||||
|
||||
:ref:`2. WHAT IS RCU'S CORE API? <2_whatisRCU>`
|
||||
|
||||
:ref:`3. WHAT ARE SOME EXAMPLE USES OF CORE RCU API? <3_whatisRCU>`
|
||||
|
||||
:ref:`4. WHAT IF MY UPDATING THREAD CANNOT BLOCK? <4_whatisRCU>`
|
||||
|
||||
: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
|
||||
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
|
||||
never need this document anyway. ;-)
|
||||
|
||||
.. _1_whatisRCU:
|
||||
|
||||
1. RCU OVERVIEW
|
||||
----------------
|
||||
|
||||
The basic idea behind RCU is to split updates into "removal" and
|
||||
"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???
|
||||
Read on to learn about how RCU's API makes this easy.
|
||||
|
||||
.. _2_whatisRCU:
|
||||
|
||||
2. WHAT IS RCU'S CORE API?
|
||||
---------------------------
|
||||
|
||||
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.
|
||||
|
||||
rcu_read_lock()
|
||||
|
||||
^^^^^^^^^^^^^^^
|
||||
void rcu_read_lock(void);
|
||||
|
||||
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.
|
||||
|
||||
rcu_read_unlock()
|
||||
|
||||
^^^^^^^^^^^^^^^^^
|
||||
void rcu_read_unlock(void);
|
||||
|
||||
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.
|
||||
|
||||
synchronize_rcu()
|
||||
|
||||
^^^^^^^^^^^^^^^^^
|
||||
void synchronize_rcu(void);
|
||||
|
||||
Marks the end of updater code and the beginning of reclaimer
|
||||
code. It does this by blocking until all pre-existing RCU
|
||||
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.
|
||||
For example, consider the following sequence of events:
|
||||
For example, consider the following sequence of events::
|
||||
|
||||
CPU 0 CPU 1 CPU 2
|
||||
----------------- ------------------------- ---------------
|
||||
@@ -182,7 +196,7 @@ synchronize_rcu()
|
||||
any that begin after synchronize_rcu() is invoked.
|
||||
|
||||
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
|
||||
delays. For another thing, many RCU implementations process
|
||||
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.
|
||||
|
||||
rcu_assign_pointer()
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
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.
|
||||
(Compiler experts will no doubt disagree.)
|
||||
|
||||
@@ -231,7 +245,7 @@ rcu_assign_pointer()
|
||||
the _rcu list-manipulation primitives such as list_add_rcu().
|
||||
|
||||
rcu_dereference()
|
||||
|
||||
^^^^^^^^^^^^^^^^^
|
||||
typeof(p) rcu_dereference(p);
|
||||
|
||||
Like rcu_assign_pointer(), rcu_dereference() must be implemented
|
||||
@@ -248,13 +262,13 @@ rcu_dereference()
|
||||
|
||||
Common coding practice uses rcu_dereference() to copy an
|
||||
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);
|
||||
return p->data;
|
||||
|
||||
However, in this case, one could just as easily combine these
|
||||
into one statement:
|
||||
into one statement::
|
||||
|
||||
return rcu_dereference(head.next)->data;
|
||||
|
||||
@@ -266,8 +280,8 @@ rcu_dereference()
|
||||
unnecessary overhead on Alpha CPUs.
|
||||
|
||||
Note that the value returned by rcu_dereference() is valid
|
||||
only within the enclosing RCU read-side critical section [1].
|
||||
For example, the following is -not- legal:
|
||||
only within the enclosing RCU read-side critical section [1]_.
|
||||
For example, the following is **not** legal::
|
||||
|
||||
rcu_read_lock();
|
||||
p = rcu_dereference(head.next);
|
||||
@@ -290,9 +304,9 @@ rcu_dereference()
|
||||
at any time, including immediately after the rcu_dereference().
|
||||
And, again like rcu_assign_pointer(), rcu_dereference() is
|
||||
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
|
||||
protected by locks acquired by the update-side code. This variant
|
||||
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
|
||||
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
|
||||
lockdep expression can be added to its list of arguments.
|
||||
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
|
||||
reader, updater, and reclaimer.
|
||||
::
|
||||
|
||||
|
||||
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
|
||||
for specialized uses, but are relatively uncommon.
|
||||
|
||||
.. _3_whatisRCU:
|
||||
|
||||
3. WHAT ARE SOME EXAMPLE USES OF CORE RCU API?
|
||||
-----------------------------------------------
|
||||
|
||||
This section shows a simple use of the core RCU API to protect a
|
||||
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 {
|
||||
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:
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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,
|
||||
-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
|
||||
rcu_assign_pointer() primitives from interfering with each other.
|
||||
|
||||
o Use synchronize_rcu() -after- removing a data element from an
|
||||
RCU-protected data structure, but -before- reclaiming/freeing
|
||||
- Use synchronize_rcu() **after** removing a data element from an
|
||||
RCU-protected data structure, but **before** reclaiming/freeing
|
||||
the data element, in order to wait for the completion of all
|
||||
RCU read-side critical sections that might be referencing that
|
||||
data item.
|
||||
|
||||
See checklist.txt for additional rules to follow when using RCU.
|
||||
And again, more-typical uses of RCU may be found in listRCU.txt,
|
||||
arrayRCU.txt, and NMI-RCU.txt.
|
||||
And again, more-typical 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>`.
|
||||
|
||||
.. _4_whatisRCU:
|
||||
|
||||
4. WHAT IF MY UPDATING THREAD CANNOT BLOCK?
|
||||
--------------------------------------------
|
||||
|
||||
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
|
||||
long -- there might be other high-priority work to be done.
|
||||
|
||||
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 (*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 invocation might happen from either softirq or process context,
|
||||
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 {
|
||||
int a;
|
||||
@@ -490,7 +512,7 @@ have an rcu_head structure added, perhaps as follows:
|
||||
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
|
||||
@@ -520,7 +542,7 @@ The foo_update_a() function might then be written as follows:
|
||||
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)
|
||||
{
|
||||
@@ -544,7 +566,7 @@ namely foo_reclaim().
|
||||
The summary of advice is the same as for the previous section, except
|
||||
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
|
||||
function that will be invoked after the completion of all RCU
|
||||
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
|
||||
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);
|
||||
|
||||
Again, see checklist.txt for additional rules governing the use of RCU.
|
||||
|
||||
.. _5_whatisRCU:
|
||||
|
||||
5. WHAT ARE SOME SIMPLE IMPLEMENTATIONS OF RCU?
|
||||
------------------------------------------------
|
||||
|
||||
One of the nice things about RCU is that it has extremely simple "toy"
|
||||
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
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
This section presents a "toy" RCU implementation that is based on
|
||||
familiar locking primitives. Its overhead makes it a non-starter for
|
||||
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
|
||||
a good starting point.
|
||||
|
||||
It is extremely simple:
|
||||
It is extremely simple::
|
||||
|
||||
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
|
||||
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) \
|
||||
({ \
|
||||
@@ -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,
|
||||
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
|
||||
kernel? How could this deadlock be avoided?
|
||||
|
||||
:ref:`Answers to Quick Quiz <8_whatisRCU>`
|
||||
|
||||
5B. "TOY" EXAMPLE #2: CLASSIC RCU
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
This section presents a "toy" RCU implementation that is based on
|
||||
"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
|
||||
kernels. The definitions of rcu_dereference() and rcu_assign_pointer()
|
||||
are the same as those shown in the preceding section, so they are omitted.
|
||||
::
|
||||
|
||||
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
|
||||
"toy" implementation would restore the affinity upon completion rather
|
||||
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???
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
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
|
||||
to that data item, so we can safely reclaim it.
|
||||
|
||||
Quick Quiz #2: Give an example where Classic RCU's read-side
|
||||
overhead is -negative-.
|
||||
.. _quiz_2:
|
||||
|
||||
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
|
||||
PREEMPT_RT, where normal spinlocks can block???
|
||||
|
||||
:ref:`Answers to Quick Quiz <8_whatisRCU>`
|
||||
|
||||
.. _6_whatisRCU:
|
||||
|
||||
6. ANALOGY WITH READER-WRITER LOCKING
|
||||
--------------------------------------
|
||||
|
||||
Although RCU can be used in many different ways, a very common use of
|
||||
RCU is analogous to reader-writer locking. The following unified
|
||||
diff shows how closely related RCU and reader-writer locking can be.
|
||||
::
|
||||
|
||||
@@ -5,5 +5,5 @@ struct el {
|
||||
int data;
|
||||
@@ -762,7 +804,7 @@ diff shows how closely related RCU and reader-writer locking can be.
|
||||
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 {
|
||||
2 struct list_head list; 2 struct list_head list;
|
||||
@@ -774,6 +816,8 @@ Or, for those who prefer a side-by-side listing:
|
||||
8 rwlock_t listmutex; 8 spinlock_t listmutex;
|
||||
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;
|
||||
@@ -791,6 +835,8 @@ Or, for those who prefer a side-by-side listing:
|
||||
15 return 0; 15 return 0;
|
||||
16 } 16 }
|
||||
|
||||
::
|
||||
|
||||
1 int delete(long key) 1 int delete(long key)
|
||||
2 { 2 {
|
||||
3 struct el *p; 3 struct el *p;
|
||||
@@ -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
|
||||
be used in place of synchronize_rcu().
|
||||
|
||||
.. _7_whatisRCU:
|
||||
|
||||
7. FULL LIST OF RCU APIs
|
||||
-------------------------
|
||||
|
||||
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
|
||||
APIs, since there does not appear to be a way to categorize them
|
||||
in docbook. Here is the list, by category.
|
||||
|
||||
RCU list traversal:
|
||||
RCU list traversal::
|
||||
|
||||
list_entry_rcu
|
||||
list_entry_lockless
|
||||
list_first_entry_rcu
|
||||
list_next_rcu
|
||||
list_for_each_entry_rcu
|
||||
list_for_each_entry_continue_rcu
|
||||
list_for_each_entry_from_rcu
|
||||
list_first_or_null_rcu
|
||||
list_next_or_null_rcu
|
||||
hlist_first_rcu
|
||||
hlist_next_rcu
|
||||
hlist_pprev_rcu
|
||||
@@ -854,7 +905,7 @@ RCU list traversal:
|
||||
hlist_bl_first_rcu
|
||||
hlist_bl_for_each_entry_rcu
|
||||
|
||||
RCU pointer/list update:
|
||||
RCU pointer/list update::
|
||||
|
||||
rcu_assign_pointer
|
||||
list_add_rcu
|
||||
@@ -864,10 +915,12 @@ RCU pointer/list update:
|
||||
hlist_add_behind_rcu
|
||||
hlist_add_before_rcu
|
||||
hlist_add_head_rcu
|
||||
hlist_add_tail_rcu
|
||||
hlist_del_rcu
|
||||
hlist_del_init_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_rcu
|
||||
hlist_nulls_add_head_rcu
|
||||
@@ -876,7 +929,9 @@ RCU pointer/list update:
|
||||
hlist_bl_del_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_unlock synchronize_rcu
|
||||
@@ -885,7 +940,9 @@ RCU: Critical sections Grace period Barrier
|
||||
rcu_dereference_check kfree_rcu
|
||||
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_unlock_bh synchronize_rcu
|
||||
@@ -896,7 +953,9 @@ bh: Critical sections Grace period Barrier
|
||||
rcu_dereference_bh_protected
|
||||
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_unlock_sched synchronize_rcu
|
||||
@@ -910,7 +969,9 @@ sched: Critical sections Grace period Barrier
|
||||
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_unlock synchronize_srcu
|
||||
@@ -918,13 +979,14 @@ SRCU: Critical sections Grace period Barrier
|
||||
srcu_dereference_check
|
||||
srcu_read_lock_held
|
||||
|
||||
SRCU: Initialization/cleanup
|
||||
SRCU: Initialization/cleanup::
|
||||
|
||||
DEFINE_SRCU
|
||||
DEFINE_STATIC_SRCU
|
||||
init_srcu_struct
|
||||
cleanup_srcu_struct
|
||||
|
||||
All: lockdep-checked RCU-protected pointer access
|
||||
All: lockdep-checked RCU-protected pointer access::
|
||||
|
||||
rcu_access_pointer
|
||||
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
|
||||
the right tool for your job.
|
||||
|
||||
.. _8_whatisRCU:
|
||||
|
||||
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
|
||||
kernel? [Referring to the lock-based "toy" RCU
|
||||
algorithm.]
|
||||
|
||||
Answer: Consider the following sequence of events:
|
||||
Answer:
|
||||
Consider the following sequence of events:
|
||||
|
||||
1. CPU 0 acquires some unrelated lock, call it
|
||||
"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
|
||||
cannot be blocked by tasks executing synchronize_rcu().
|
||||
|
||||
Quick Quiz #2: Give an example where Classic RCU's read-side
|
||||
overhead is -negative-.
|
||||
:ref:`Back to Quick Quiz #1 <quiz_1>`
|
||||
|
||||
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
|
||||
code, but can be updated by irq-context code (for example,
|
||||
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
|
||||
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
|
||||
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
|
||||
read-side critical sections. It also permits
|
||||
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
|
||||
the human being went to???
|
||||
|
||||
:ref:`Back to Quick Quiz #3 <quiz_3>`
|
||||
|
||||
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
|
||||
ssdt-overlays
|
||||
cppc_sysfs
|
||||
fan_performance_states
|
||||
|
@@ -61,6 +61,8 @@ v1 is available under Documentation/admin-guide/cgroup-v1/.
|
||||
5-6. Device
|
||||
5-7. RDMA
|
||||
5-7-1. RDMA Interface Files
|
||||
5-8. HugeTLB
|
||||
5.8-1. HugeTLB Interface Files
|
||||
5-8. Misc
|
||||
5-8-1. perf_event
|
||||
5-N. Non-normative information
|
||||
@@ -2056,6 +2058,33 @@ RDMA Interface Files
|
||||
mlx4_0 hca_handle=1 hca_object=20
|
||||
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
|
||||
----
|
||||
|
@@ -511,7 +511,7 @@
|
||||
1 -- check protection requested by application.
|
||||
Default value is set via a kernel config option.
|
||||
Value can be changed at runtime via
|
||||
/selinux/checkreqprot.
|
||||
/sys/fs/selinux/checkreqprot.
|
||||
|
||||
cio_ignore= [S390]
|
||||
See Documentation/s390/common_io.rst for details.
|
||||
@@ -1165,10 +1165,10 @@
|
||||
|
||||
efi= [EFI]
|
||||
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
|
||||
runtime services mapping. 32-bit still uses this one by
|
||||
default.
|
||||
runtime services mapping. [Needs CONFIG_X86_UV=y]
|
||||
nochunk: disable reading files in "chunks" in the EFI
|
||||
boot stub, as chunking can cause problems with some
|
||||
firmware implementations.
|
||||
@@ -1180,6 +1180,10 @@
|
||||
claim. Specify efi=nosoftreserve to disable this
|
||||
reservation and treat the memory by its base type
|
||||
(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]
|
||||
Using this parameter you can use more than 50% of
|
||||
@@ -1245,7 +1249,8 @@
|
||||
0 -- permissive (log only, no denials).
|
||||
1 -- enforcing (deny and log).
|
||||
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]
|
||||
Disable Error Record Serialization Table (ERST)
|
||||
@@ -1933,10 +1938,32 @@
|
||||
<cpu number> begins at 0 and the maximum value is
|
||||
"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.
|
||||
|
||||
|
||||
|
||||
iucv= [HW,NET]
|
||||
|
||||
ivrs_ioapic [HW,X86_64]
|
||||
@@ -3978,6 +4005,19 @@
|
||||
test until boot completes in order to avoid
|
||||
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]
|
||||
Set number of RCU readers. The value -1 selects
|
||||
N, where N is the number of CPUs. A value
|
||||
@@ -4348,9 +4388,7 @@
|
||||
See security/selinux/Kconfig help text.
|
||||
0 -- disable.
|
||||
1 -- enable.
|
||||
Default value is set via kernel config option.
|
||||
If enabled at boot time, /selinux/disable can be used
|
||||
later to disable prior to initial policy load.
|
||||
Default value is 1.
|
||||
|
||||
apparmor= [APPARMOR] Disable or enable AppArmor at boot time
|
||||
Format: { "0" | "1" }
|
||||
|
@@ -506,6 +506,9 @@ object corresponding to it, as follows:
|
||||
``disable``
|
||||
Whether or not this idle state is disabled.
|
||||
|
||||
``default_status``
|
||||
The default status of this state, "enabled" or "disabled".
|
||||
|
||||
``latency``
|
||||
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
|
||||
|
||||
cpuidle
|
||||
intel_idle
|
||||
cpufreq
|
||||
intel_pstate
|
||||
intel_epb
|
||||
|
@@ -117,6 +117,8 @@ infrastructure:
|
||||
+------------------------------+---------+---------+
|
||||
| Name | bits | visible |
|
||||
+------------------------------+---------+---------+
|
||||
| RNDR | [63-60] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| TS | [55-52] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| FHM | [51-48] | y |
|
||||
@@ -200,6 +202,12 @@ infrastructure:
|
||||
+------------------------------+---------+---------+
|
||||
| Name | bits | visible |
|
||||
+------------------------------+---------+---------+
|
||||
| I8MM | [55-52] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| DGH | [51-48] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| BF16 | [47-44] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| SB | [39-36] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| FRINTTS | [35-32] | y |
|
||||
@@ -234,10 +242,18 @@ infrastructure:
|
||||
+------------------------------+---------+---------+
|
||||
| Name | bits | visible |
|
||||
+------------------------------+---------+---------+
|
||||
| F64MM | [59-56] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| F32MM | [55-52] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| I8MM | [47-44] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| SM4 | [43-40] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| SHA3 | [35-32] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| BF16 | [23-20] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| BitPerm | [19-16] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| AES | [7-4] | y |
|
||||
|
@@ -204,6 +204,37 @@ HWCAP2_FRINT
|
||||
|
||||
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
|
||||
-----------------------
|
||||
|
@@ -88,6 +88,8 @@ stable kernels.
|
||||
+----------------+-----------------+-----------------+-----------------------------+
|
||||
| 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 | #1349291 | N/A |
|
||||
|
@@ -10,6 +10,12 @@ PIT Timer required properties:
|
||||
- interrupts: Should contain interrupt for the PIT which is the IRQ line
|
||||
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:
|
||||
- compatible: Should be "atmel,at91rm9200-st", "syscon", "simple-mfd"
|
||||
- reg: Should contain registers location and length
|
||||
|
@@ -5,6 +5,7 @@ Each SATA controller should have its own node.
|
||||
|
||||
Required properties:
|
||||
- compatible : should be one or more of
|
||||
"brcm,bcm7216-ahci"
|
||||
"brcm,bcm7425-ahci"
|
||||
"brcm,bcm7445-ahci"
|
||||
"brcm,bcm-nsp-ahci"
|
||||
@@ -14,6 +15,12 @@ Required properties:
|
||||
- reg-names : "ahci" and "top-ctrl"
|
||||
- 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.
|
||||
|
||||
Example:
|
||||
|
@@ -10,6 +10,7 @@ Required properties:
|
||||
- compatible :
|
||||
- "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,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.
|
||||
The 1st region is eDMA control register's address and size.
|
||||
The 2nd and the 3rd regions are programmable channel multiplexing
|
||||
|
@@ -10,6 +10,9 @@ Required properties:
|
||||
"fsl,imx6q-sdma"
|
||||
"fsl,imx7d-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
|
||||
correct ROM script addresses needed for the driver to work without additional
|
||||
firmware.
|
||||
|
@@ -1,4 +1,4 @@
|
||||
* Ingenic JZ4780 DMA Controller
|
||||
* Ingenic XBurst DMA Controller
|
||||
|
||||
Required properties:
|
||||
|
||||
@@ -8,10 +8,12 @@ Required properties:
|
||||
* ingenic,jz4770-dma
|
||||
* ingenic,jz4780-dma
|
||||
* ingenic,x1000-dma
|
||||
* ingenic,x1830-dma
|
||||
- reg: Should contain the DMA channel registers location and length, followed
|
||||
by the DMA controller registers location and length.
|
||||
- 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 clients (see below).
|
||||
|
||||
|
@@ -30,6 +30,7 @@ Required Properties:
|
||||
- "renesas,dmac-r8a7794" (R-Car E2)
|
||||
- "renesas,dmac-r8a7795" (R-Car H3)
|
||||
- "renesas,dmac-r8a7796" (R-Car M3-W)
|
||||
- "renesas,dmac-r8a77961" (R-Car M3-W+)
|
||||
- "renesas,dmac-r8a77965" (R-Car M3-N)
|
||||
- "renesas,dmac-r8a77970" (R-Car V3M)
|
||||
- "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-g12a-gpio-intc" for G12A SoCs (S905D2, S905X2, S905Y2)
|
||||
"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.
|
||||
- interrupt-controller : Identifies the node as an interrupt controller.
|
||||
- #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
|
||||
- "brcm,bcm7425-sdhci"
|
||||
- "brcm,bcm7445-sdhci"
|
||||
- "brcm,bcm7216-sdhci"
|
||||
|
||||
Refer to clocks/clock-bindings.txt for generic clock consumer properties.
|
||||
|
||||
Example:
|
||||
|
||||
sdhci@f03e0100 {
|
||||
compatible = "brcm,bcm7425-sdhci";
|
||||
reg = <0xf03e0000 0x100>;
|
||||
interrupts = <0x0 0x26 0x0>;
|
||||
sdhci,auto-cmd12;
|
||||
clocks = <&sw_sdio>;
|
||||
sdhci@84b0000 {
|
||||
sd-uhs-sdr50;
|
||||
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;
|
||||
bus-width = <0x8>;
|
||||
compatible = "brcm,bcm7425-sdhci";
|
||||
reg = <0xf03e0200 0x100>;
|
||||
interrupts = <0x0 0x27 0x0>;
|
||||
sdhci,auto-cmd12;
|
||||
clocks = <sw_sdio>;
|
||||
mmc-hs200-1_8v;
|
||||
compatible = "brcm,bcm7216-sdhci",
|
||||
"brcm,bcm7445-sdhci",
|
||||
"brcm,sdhci-brcmstb";
|
||||
reg = <0x84b1000 0x260 0x84b1300 0x200>;
|
||||
reg-names = "host", "cfg";
|
||||
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,imx8mm-usdhc"
|
||||
"fsl,imx8mn-usdhc"
|
||||
"fsl,imx8mp-usdhc"
|
||||
"fsl,imx8qxp-usdhc"
|
||||
|
||||
Optional properties:
|
||||
|
@@ -23,7 +23,8 @@ Required properties:
|
||||
"renesas,sdhi-r8a7793" - SDHI IP on R8A7793 SoC
|
||||
"renesas,sdhi-r8a7794" - SDHI IP on R8A7794 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-r8a77970" - SDHI IP on R8A77970 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.
|
||||
|
||||
Required properties:
|
||||
- compatible: Must be "atmel,sama5d2-sdhci".
|
||||
- compatible: Must be "atmel,sama5d2-sdhci" or "microchip,sam9x60-sdhci".
|
||||
- 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:
|
||||
- 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
|
||||
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
|
||||
@@ -17,10 +22,12 @@ Optional properties:
|
||||
|
||||
Example:
|
||||
|
||||
sdmmc0: sdio-host@a0000000 {
|
||||
mmc0: sdio-host@a0000000 {
|
||||
compatible = "atmel,sama5d2-sdhci";
|
||||
reg = <0xa0000000 0x300>;
|
||||
interrupts = <31 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&sdmmc0_hclk>, <&sdmmc0_gclk>, <&main>;
|
||||
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,sdm845-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
|
||||
have the string "qcom,sdhci-msm-v4" without the SoC compatible string
|
||||
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:
|
||||
- compatible: Should be "ti,dra7-sdhci" for DRA7 and DRA72 controllers
|
||||
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
|
||||
(Not required for K2G).
|
||||
- pinctrl-names: Should be subset of "default", "hs", "sdr12", "sdr25", "sdr50",
|
||||
@@ -15,6 +17,13 @@ Required properties:
|
||||
"hs200_1_8v",
|
||||
- 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:
|
||||
mmc1: mmc@4809c000 {
|
||||
compatible = "ti,dra7-sdhci";
|
||||
@@ -22,4 +31,6 @@ Example:
|
||||
ti,hwmods = "mmc1";
|
||||
bus-width = <4>;
|
||||
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".
|
||||
- pinctrl-names : a pinctrl state named "default" must be defined.
|
||||
- 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.
|
||||
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.
|
||||
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 {
|
||||
compatible = "nuvoton,npcm750-pspi";
|
||||
reg = <0xf0200000 0x1000>;
|
||||
@@ -39,5 +30,6 @@ spi0: spi@f0200000 {
|
||||
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk NPCM7XX_CLK_APB5>;
|
||||
clock-names = "clk_apb5";
|
||||
resets = <&rstc NPCM7XX_RESET_IPSRST2 NPCM7XX_RESET_PSPI1>
|
||||
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
|
||||
|
||||
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
|
||||
- interrupts: Should contain spi interrupt
|
||||
- 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,r8a774a1-cmt0" for the 32-bit CMT0 device 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-cmt1" for the 48-bit CMT devices included in r8a774c0.
|
||||
- "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
|
||||
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
|
||||
|
||||
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)
|
||||
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
|
||||
-----------------
|
||||
|
||||
|
@@ -313,7 +313,6 @@ IOMAP
|
||||
devm_ioport_map()
|
||||
devm_ioport_unmap()
|
||||
devm_ioremap()
|
||||
devm_ioremap_nocache()
|
||||
devm_ioremap_uc()
|
||||
devm_ioremap_wc()
|
||||
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
|
||||
provide generic access to their resources. For example, a driver that would
|
||||
like to be accessible to slave devices via generic API call
|
||||
dma_request_slave_channel() must register itself at the end of the probe
|
||||
function like this::
|
||||
dma_request_chan() must register itself at the end of the probe function like
|
||||
this::
|
||||
|
||||
err = devm_acpi_dma_controller_register(dev, xlate_func, dw);
|
||||
/* Handle the error if it's not a case of !CONFIG_ACPI */
|
||||
@@ -112,15 +112,15 @@ could look like::
|
||||
}
|
||||
#endif
|
||||
|
||||
dma_request_slave_channel() will call xlate_func() for each registered DMA
|
||||
controller. In the xlate function the proper channel must be chosen based on
|
||||
dma_request_chan() will call xlate_func() for each registered DMA controller.
|
||||
In the xlate function the proper channel must be chosen based on
|
||||
information in struct acpi_dma_spec and the properties of the controller
|
||||
provided by struct acpi_dma.
|
||||
|
||||
Clients must call dma_request_slave_channel() with the string parameter that
|
||||
corresponds to a specific FixedDMA resource. By default "tx" means the first
|
||||
entry of the FixedDMA resource array, "rx" means the second entry. The table
|
||||
below shows a layout::
|
||||
Clients must call dma_request_chan() with the string parameter that corresponds
|
||||
to a specific FixedDMA resource. By default "tx" means the first entry of the
|
||||
FixedDMA resource array, "rx" means the second entry. The table below shows a
|
||||
layout::
|
||||
|
||||
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
|
||||
adm1026
|
||||
adm1031
|
||||
adm1177
|
||||
adm1275
|
||||
adm9240
|
||||
ads7828
|
||||
@@ -47,6 +48,7 @@ Hardware Monitoring Kernel Drivers
|
||||
da9055
|
||||
dell-smm-hwmon
|
||||
dme1737
|
||||
drivetemp
|
||||
ds1621
|
||||
ds620
|
||||
emc1403
|
||||
@@ -106,8 +108,10 @@ Hardware Monitoring Kernel Drivers
|
||||
max1619
|
||||
max1668
|
||||
max197
|
||||
max20730
|
||||
max20751
|
||||
max31722
|
||||
max31730
|
||||
max31785
|
||||
max31790
|
||||
max34440
|
||||
@@ -177,6 +181,7 @@ Hardware Monitoring Kernel Drivers
|
||||
wm831x
|
||||
wm8350
|
||||
xgene-hwmon
|
||||
xdpe12284
|
||||
zl6100
|
||||
|
||||
.. 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
|
||||
|
||||
* Maxim MAX20796
|
||||
|
||||
Prefix: 'max20796'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet:
|
||||
|
||||
Not published
|
||||
|
||||
* Generic PMBus devices
|
||||
|
||||
Prefix: 'pmbus'
|
||||
|
@@ -3,9 +3,10 @@ Kernel driver ucd9000
|
||||
|
||||
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: -
|
||||
|
||||
@@ -14,6 +15,7 @@ Supported chips:
|
||||
- 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/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/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
|
||||
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
|
||||
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,
|
||||
|
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;
|
||||
}
|
||||
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));
|
||||
|
||||
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.
|
||||
|
||||
|
||||
Details of Harder Fileds
|
||||
Details of Header Fields
|
||||
========================
|
||||
|
||||
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_nocache | -- | UC- | UC- |
|
||||
+------------------------+----------+--------------+------------------+
|
||||
| ioremap_wc | -- | -- | WC |
|
||||
+------------------------+----------+--------------+------------------+
|
||||
| ioremap_wt | -- | -- | WT |
|
||||
|
65
MAINTAINERS
65
MAINTAINERS
@@ -345,7 +345,7 @@ F: drivers/acpi/apei/
|
||||
|
||||
ACPI COMPONENT ARCHITECTURE (ACPICA)
|
||||
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>
|
||||
L: linux-acpi@vger.kernel.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: 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
|
||||
M: Stefan Popa <stefan.popa@analog.com>
|
||||
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
|
||||
S: Maintained
|
||||
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/rv1108*
|
||||
F: arch/arm/mach-rockchip/
|
||||
@@ -2694,6 +2704,14 @@ S: Maintained
|
||||
F: drivers/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
|
||||
M: Eddie James <eajames@linux.ibm.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@@ -7499,6 +7517,12 @@ S: Supported
|
||||
F: drivers/scsi/hisi_sas/
|
||||
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
|
||||
M: Zhou Wang <wangzhou1@hisilicon.com>
|
||||
L: linux-crypto@vger.kernel.org
|
||||
@@ -8382,6 +8406,14 @@ Q: https://patchwork.kernel.org/project/linux-dmaengine/list/
|
||||
S: Supported
|
||||
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
|
||||
M: Jacob Pan <jacob.jun.pan@linux.intel.com>
|
||||
M: Len Brown <lenb@kernel.org>
|
||||
@@ -8563,6 +8595,12 @@ S: Maintained
|
||||
F: arch/x86/include/asm/intel_telemetry.h
|
||||
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
|
||||
M: AceLan Kao <acelan.kao@canonical.com>
|
||||
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/pvclock-abi.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/kvmclock.c
|
||||
|
||||
@@ -11144,6 +11182,13 @@ S: Maintained
|
||||
F: Documentation/driver-api/serial/moxa-smartio.rst
|
||||
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
|
||||
M: Alexey Klimov <klimov.linux@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@@ -13146,6 +13191,11 @@ S: Maintained
|
||||
F: drivers/iio/chemical/pms7003.c
|
||||
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
|
||||
M: Guenter Roeck <linux@roeck-us.net>
|
||||
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
|
||||
F: fs/timerfd.c
|
||||
F: include/linux/timer*
|
||||
F: include/linux/time_namespace.h
|
||||
F: kernel/time_namespace.c
|
||||
F: kernel/time/*timer*
|
||||
|
||||
POWER MANAGEMENT CORE
|
||||
@@ -13673,6 +13725,14 @@ S: Maintained
|
||||
F: Documentation/devicetree/bindings/opp/qcom-nvmem-cpufreq.txt
|
||||
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
|
||||
M: Timur Tabi <timur@kernel.org>
|
||||
L: netdev@vger.kernel.org
|
||||
@@ -14820,6 +14880,7 @@ F: include/uapi/linux/selinux_netlink.h
|
||||
F: security/selinux/
|
||||
F: scripts/selinux/
|
||||
F: Documentation/admin-guide/LSM/SELinux.rst
|
||||
F: Documentation/ABI/obsolete/sysfs-selinux-disable
|
||||
|
||||
SENSABLE PHANTOM
|
||||
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);
|
||||
}
|
||||
|
||||
static inline void __iomem * ioremap_nocache(unsigned long offset,
|
||||
unsigned long size)
|
||||
{
|
||||
return ioremap(offset, size);
|
||||
}
|
||||
|
||||
#define ioremap_wc ioremap_nocache
|
||||
#define ioremap_uc ioremap_nocache
|
||||
#define ioremap_wc ioremap
|
||||
#define ioremap_uc ioremap
|
||||
|
||||
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_SUPPORTS_ATOMIC_RMW if ARC_HAS_LLSC
|
||||
select ARCH_32BIT_OFF_T
|
||||
select BUILDTIME_EXTABLE_SORT
|
||||
select BUILDTIME_TABLE_SORT
|
||||
select CLONE_BACKWARDS
|
||||
select COMMON_CLK
|
||||
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:
|
||||
|
||||
; Disable Interrupts from this point on
|
||||
; CONFIG_PREEMPT: This is a must for preempt_schedule_irq()
|
||||
; !CONFIG_PREEMPT: To ensure restore_regs is intr safe
|
||||
; CONFIG_PREEMPTION: This is a must for preempt_schedule_irq()
|
||||
; !CONFIG_PREEMPTION: To ensure restore_regs is intr safe
|
||||
IRQ_DISABLE r9
|
||||
|
||||
#ifdef CONFIG_PREEMPT
|
||||
#ifdef CONFIG_PREEMPTION
|
||||
|
||||
; Can't preempt if preemption disabled
|
||||
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_IPC_PARSE_VERSION
|
||||
select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
|
||||
select BUILDTIME_EXTABLE_SORT if MMU
|
||||
select BUILDTIME_TABLE_SORT if MMU
|
||||
select CLONE_BACKWARDS
|
||||
select CPU_PM if SUSPEND || CPU_IDLE
|
||||
select DCACHE_WORD_ACCESS if HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
|
@@ -10,6 +10,7 @@
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/io-64-nonatomic-lo-hi.h>
|
||||
#include <asm/barrier.h>
|
||||
#include <asm/cacheflush.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.
|
||||
*/
|
||||
#define gits_read_vpropbaser(c) __gic_readq_nonatomic(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 */
|
||||
|
||||
#define efi_call_early(f, ...) sys_table_arg->boottime->f(__VA_ARGS__)
|
||||
#define __efi_call_early(f, ...) f(__VA_ARGS__)
|
||||
#define efi_call_runtime(f, ...) sys_table_arg->runtime->f(__VA_ARGS__)
|
||||
#define efi_is_64bit() (false)
|
||||
#define efi_bs_call(func, ...) efi_system_table()->boottime->func(__VA_ARGS__)
|
||||
#define efi_rt_call(func, ...) efi_system_table()->runtime->func(__VA_ARGS__)
|
||||
#define efi_is_native() (true)
|
||||
|
||||
#define efi_table_attr(table, attr, instance) \
|
||||
((table##_t *)instance)->attr
|
||||
#define efi_table_attr(inst, attr) (inst->attr)
|
||||
|
||||
#define efi_call_proto(protocol, f, instance, ...) \
|
||||
((protocol##_t *)instance)->f(instance, ##__VA_ARGS__)
|
||||
#define efi_call_proto(inst, func, ...) inst->func(inst, ##__VA_ARGS__)
|
||||
|
||||
struct screen_info *alloc_screen_info(efi_system_table_t *sys_table_arg);
|
||||
void free_screen_info(efi_system_table_t *sys_table, struct screen_info *si);
|
||||
struct screen_info *alloc_screen_info(void);
|
||||
void free_screen_info(struct screen_info *si);
|
||||
|
||||
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
|
||||
* ioremap() Device n/a n/a
|
||||
* ioremap_nocache() Device n/a n/a
|
||||
* ioremap_cache() Normal Writeback Read allocate
|
||||
* ioremap_wc() 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"
|
||||
* - 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:
|
||||
* - reads can be repeated with no side effects
|
||||
* - repeated reads return the last value written
|
||||
|
@@ -10,7 +10,7 @@
|
||||
* to ensure that the maintenance completes in case we migrate to another
|
||||
* 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)
|
||||
#else
|
||||
#define __complete_pending_tlbi()
|
||||
|
@@ -52,6 +52,24 @@ static __always_inline long clock_gettime_fallback(
|
||||
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(
|
||||
clockid_t _clkid,
|
||||
struct __kernel_timespec *_ts)
|
||||
@@ -70,6 +88,24 @@ static __always_inline int clock_getres_fallback(
|
||||
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)
|
||||
{
|
||||
#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
|
||||
|
||||
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
|
||||
|
||||
|
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_ARM_ARCH_TIMER) += arch_timer.o
|
||||
obj-$(CONFIG_FUNCTION_TRACER) += entry-ftrace.o
|
||||
obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o insn.o
|
||||
obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o insn.o
|
||||
obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o insn.o patch.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_KEXEC) += machine_kexec.o relocate_kernel.o
|
||||
# Main staffs in KPROBES are in arch/arm/probes/ .
|
||||
|
@@ -211,7 +211,7 @@ __irq_svc:
|
||||
svc_entry
|
||||
irq_handler
|
||||
|
||||
#ifdef CONFIG_PREEMPT
|
||||
#ifdef CONFIG_PREEMPTION
|
||||
ldr r8, [tsk, #TI_PREEMPT] @ get preempt count
|
||||
ldr r0, [tsk, #TI_FLAGS] @ get flags
|
||||
teq r8, #0 @ if preempt count != 0
|
||||
@@ -226,7 +226,7 @@ ENDPROC(__irq_svc)
|
||||
|
||||
.ltorg
|
||||
|
||||
#ifdef CONFIG_PREEMPT
|
||||
#ifdef CONFIG_PREEMPTION
|
||||
svc_preempt:
|
||||
mov r8, lr
|
||||
1: bl preempt_schedule_irq @ irq en/disable is done inside
|
||||
|
@@ -22,6 +22,7 @@
|
||||
#include <asm/ftrace.h>
|
||||
#include <asm/insn.h>
|
||||
#include <asm/set_memory.h>
|
||||
#include <asm/patch.h>
|
||||
|
||||
#ifdef CONFIG_THUMB2_KERNEL
|
||||
#define NOP 0xf85deb04 /* pop.w {lr} */
|
||||
@@ -35,9 +36,7 @@ static int __ftrace_modify_code(void *data)
|
||||
{
|
||||
int *command = data;
|
||||
|
||||
set_kernel_text_rw();
|
||||
ftrace_modify_all_code(*command);
|
||||
set_kernel_text_ro();
|
||||
|
||||
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)
|
||||
{
|
||||
set_all_modules_text_rw();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ftrace_arch_code_modify_post_process(void)
|
||||
{
|
||||
set_all_modules_text_ro();
|
||||
/* Make sure any TLB misses during machine stop are cleared. */
|
||||
flush_tlb_all();
|
||||
return 0;
|
||||
@@ -97,10 +94,7 @@ static int ftrace_modify_code(unsigned long pc, unsigned long old,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (probe_kernel_write((void *)pc, &new, MCOUNT_INSN_SIZE))
|
||||
return -EPERM;
|
||||
|
||||
flush_icache_range(pc, pc + MCOUNT_INSN_SIZE);
|
||||
__patch_text((void *)pc, new);
|
||||
|
||||
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