Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Cross-merge networking fixes after downstream PR. Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
537c2e91d3
1
.gitignore
vendored
1
.gitignore
vendored
@ -52,6 +52,7 @@
|
||||
*.xz
|
||||
*.zst
|
||||
Module.symvers
|
||||
dtbs-list
|
||||
modules.order
|
||||
|
||||
#
|
||||
|
2
.mailmap
2
.mailmap
@ -439,6 +439,8 @@ Mukesh Ojha <quic_mojha@quicinc.com> <mojha@codeaurora.org>
|
||||
Muna Sinada <quic_msinada@quicinc.com> <msinada@codeaurora.org>
|
||||
Murali Nalajala <quic_mnalajal@quicinc.com> <mnalajal@codeaurora.org>
|
||||
Mythri P K <mythripk@ti.com>
|
||||
Nadav Amit <nadav.amit@gmail.com> <namit@vmware.com>
|
||||
Nadav Amit <nadav.amit@gmail.com> <namit@cs.technion.ac.il>
|
||||
Nadia Yvette Chambers <nyc@holomorphy.com> William Lee Irwin III <wli@holomorphy.com>
|
||||
Naoya Horiguchi <naoya.horiguchi@nec.com> <n-horiguchi@ah.jp.nec.com>
|
||||
Nathan Chancellor <nathan@kernel.org> <natechancellor@gmail.com>
|
||||
|
5
CREDITS
5
CREDITS
@ -2960,6 +2960,11 @@ S: 2364 Old Trail Drive
|
||||
S: Reston, Virginia 20191
|
||||
S: USA
|
||||
|
||||
N: Sekhar Nori
|
||||
E: nori.sekhar@gmail.com
|
||||
D: Maintainer of Texas Instruments DaVinci machine support, contributor
|
||||
D: to device drivers relevant to that SoC family.
|
||||
|
||||
N: Fredrik Noring
|
||||
E: noring@nocrew.org
|
||||
W: http://www.lysator.liu.se/~noring/
|
||||
|
@ -28,5 +28,5 @@ Description:
|
||||
/label ... (r/o) descriptive, not necessarily unique
|
||||
/ngpio ... (r/o) number of GPIOs; numbered N to N + (ngpio - 1)
|
||||
|
||||
This ABI is deprecated and will be removed after 2020. It is
|
||||
replaced with the GPIO character device.
|
||||
This ABI is obsoleted by Documentation/ABI/testing/gpio-cdev and will be
|
||||
removed after 2020.
|
||||
|
@ -4,6 +4,14 @@ KernelVersion: 3.13
|
||||
Description: The purpose of this directory is to create and remove it.
|
||||
|
||||
A corresponding USB function instance is created/removed.
|
||||
There are no attributes here.
|
||||
|
||||
All parameters are set through FunctionFS.
|
||||
All attributes are read only:
|
||||
|
||||
============= ============================================
|
||||
ready 1 if the function is ready to be used, E.G.
|
||||
if userspace has written descriptors and
|
||||
strings to ep0, so the gadget can be
|
||||
enabled - 0 otherwise.
|
||||
============= ============================================
|
||||
|
||||
All other parameters are set through FunctionFS.
|
||||
|
@ -33,3 +33,37 @@ Description:
|
||||
device cannot clear poison from the address, -ENXIO is returned.
|
||||
The clear_poison attribute is only visible for devices
|
||||
supporting the capability.
|
||||
|
||||
What: /sys/kernel/debug/cxl/einj_types
|
||||
Date: January, 2024
|
||||
KernelVersion: v6.9
|
||||
Contact: linux-cxl@vger.kernel.org
|
||||
Description:
|
||||
(RO) Prints the CXL protocol error types made available by
|
||||
the platform in the format:
|
||||
|
||||
0x<error number> <error type>
|
||||
|
||||
The possible error types are (as of ACPI v6.5):
|
||||
|
||||
0x1000 CXL.cache Protocol Correctable
|
||||
0x2000 CXL.cache Protocol Uncorrectable non-fatal
|
||||
0x4000 CXL.cache Protocol Uncorrectable fatal
|
||||
0x8000 CXL.mem Protocol Correctable
|
||||
0x10000 CXL.mem Protocol Uncorrectable non-fatal
|
||||
0x20000 CXL.mem Protocol Uncorrectable fatal
|
||||
|
||||
The <error number> can be written to einj_inject to inject
|
||||
<error type> into a chosen dport.
|
||||
|
||||
What: /sys/kernel/debug/cxl/$dport_dev/einj_inject
|
||||
Date: January, 2024
|
||||
KernelVersion: v6.9
|
||||
Contact: linux-cxl@vger.kernel.org
|
||||
Description:
|
||||
(WO) Writing an integer to this file injects the corresponding
|
||||
CXL protocol error into $dport_dev ($dport_dev will be a device
|
||||
name from /sys/bus/pci/devices). The integer to type mapping for
|
||||
injection can be found by reading from einj_types. If the dport
|
||||
was enumerated in RCH mode, a CXL 1.1 error is injected, otherwise
|
||||
a CXL 2.0 error is injected.
|
||||
|
@ -81,3 +81,29 @@ Description: (RO) Read returns, for each Acceleration Engine (AE), the number
|
||||
<N>: Number of Compress and Verify (CnV) errors and type
|
||||
of the last CnV error detected by Acceleration
|
||||
Engine N.
|
||||
|
||||
What: /sys/kernel/debug/qat_<device>_<BDF>/heartbeat/inject_error
|
||||
Date: March 2024
|
||||
KernelVersion: 6.8
|
||||
Contact: qat-linux@intel.com
|
||||
Description: (WO) Write to inject an error that simulates an heartbeat
|
||||
failure. This is to be used for testing purposes.
|
||||
|
||||
After writing this file, the driver stops arbitration on a
|
||||
random engine and disables the fetching of heartbeat counters.
|
||||
If a workload is running on the device, a job submitted to the
|
||||
accelerator might not get a response and a read of the
|
||||
`heartbeat/status` attribute might report -1, i.e. device
|
||||
unresponsive.
|
||||
The error is unrecoverable thus the device must be restarted to
|
||||
restore its functionality.
|
||||
|
||||
This attribute is available only when the kernel is built with
|
||||
CONFIG_CRYPTO_DEV_QAT_ERROR_INJECTION=y.
|
||||
|
||||
A write of 1 enables error injection.
|
||||
|
||||
The following example shows how to enable error injection::
|
||||
|
||||
# cd /sys/kernel/debug/qat_<device>_<BDF>
|
||||
# echo 1 > heartbeat/inject_error
|
||||
|
@ -111,6 +111,28 @@ Description: QM debug registers(regs) read hardware register value. This
|
||||
node is used to show the change of the qm register values. This
|
||||
node can be help users to check the change of register values.
|
||||
|
||||
What: /sys/kernel/debug/hisi_hpre/<bdf>/qm/qm_state
|
||||
Date: Jan 2024
|
||||
Contact: linux-crypto@vger.kernel.org
|
||||
Description: Dump the state of the device.
|
||||
0: busy, 1: idle.
|
||||
Only available for PF, and take no other effect on HPRE.
|
||||
|
||||
What: /sys/kernel/debug/hisi_hpre/<bdf>/qm/dev_timeout
|
||||
Date: Feb 2024
|
||||
Contact: linux-crypto@vger.kernel.org
|
||||
Description: Set the wait time when stop queue fails. Available for both PF
|
||||
and VF, and take no other effect on HPRE.
|
||||
0: not wait(default), others value: wait dev_timeout * 20 microsecond.
|
||||
|
||||
What: /sys/kernel/debug/hisi_hpre/<bdf>/qm/dev_state
|
||||
Date: Feb 2024
|
||||
Contact: linux-crypto@vger.kernel.org
|
||||
Description: Dump the stop queue status of the QM. The default value is 0,
|
||||
if dev_timeout is set, when stop queue fails, the dev_state
|
||||
will return non-zero value. Available for both PF and VF,
|
||||
and take no other effect on HPRE.
|
||||
|
||||
What: /sys/kernel/debug/hisi_hpre/<bdf>/hpre_dfx/diff_regs
|
||||
Date: Mar 2022
|
||||
Contact: linux-crypto@vger.kernel.org
|
||||
|
@ -91,6 +91,28 @@ Description: QM debug registers(regs) read hardware register value. This
|
||||
node is used to show the change of the qm register values. This
|
||||
node can be help users to check the change of register values.
|
||||
|
||||
What: /sys/kernel/debug/hisi_sec2/<bdf>/qm/qm_state
|
||||
Date: Jan 2024
|
||||
Contact: linux-crypto@vger.kernel.org
|
||||
Description: Dump the state of the device.
|
||||
0: busy, 1: idle.
|
||||
Only available for PF, and take no other effect on SEC.
|
||||
|
||||
What: /sys/kernel/debug/hisi_sec2/<bdf>/qm/dev_timeout
|
||||
Date: Feb 2024
|
||||
Contact: linux-crypto@vger.kernel.org
|
||||
Description: Set the wait time when stop queue fails. Available for both PF
|
||||
and VF, and take no other effect on SEC.
|
||||
0: not wait(default), others value: wait dev_timeout * 20 microsecond.
|
||||
|
||||
What: /sys/kernel/debug/hisi_sec2/<bdf>/qm/dev_state
|
||||
Date: Feb 2024
|
||||
Contact: linux-crypto@vger.kernel.org
|
||||
Description: Dump the stop queue status of the QM. The default value is 0,
|
||||
if dev_timeout is set, when stop queue fails, the dev_state
|
||||
will return non-zero value. Available for both PF and VF,
|
||||
and take no other effect on SEC.
|
||||
|
||||
What: /sys/kernel/debug/hisi_sec2/<bdf>/sec_dfx/diff_regs
|
||||
Date: Mar 2022
|
||||
Contact: linux-crypto@vger.kernel.org
|
||||
|
@ -104,6 +104,28 @@ Description: QM debug registers(regs) read hardware register value. This
|
||||
node is used to show the change of the qm registers value. This
|
||||
node can be help users to check the change of register values.
|
||||
|
||||
What: /sys/kernel/debug/hisi_zip/<bdf>/qm/qm_state
|
||||
Date: Jan 2024
|
||||
Contact: linux-crypto@vger.kernel.org
|
||||
Description: Dump the state of the device.
|
||||
0: busy, 1: idle.
|
||||
Only available for PF, and take no other effect on ZIP.
|
||||
|
||||
What: /sys/kernel/debug/hisi_zip/<bdf>/qm/dev_timeout
|
||||
Date: Feb 2024
|
||||
Contact: linux-crypto@vger.kernel.org
|
||||
Description: Set the wait time when stop queue fails. Available for both PF
|
||||
and VF, and take no other effect on ZIP.
|
||||
0: not wait(default), others value: wait dev_timeout * 20 microsecond.
|
||||
|
||||
What: /sys/kernel/debug/hisi_zip/<bdf>/qm/dev_state
|
||||
Date: Feb 2024
|
||||
Contact: linux-crypto@vger.kernel.org
|
||||
Description: Dump the stop queue status of the QM. The default value is 0,
|
||||
if dev_timeout is set, when stop queue fails, the dev_state
|
||||
will return non-zero value. Available for both PF and VF,
|
||||
and take no other effect on ZIP.
|
||||
|
||||
What: /sys/kernel/debug/hisi_zip/<bdf>/zip_dfx/diff_regs
|
||||
Date: Mar 2022
|
||||
Contact: linux-crypto@vger.kernel.org
|
||||
|
276
Documentation/ABI/testing/debugfs-intel-iommu
Normal file
276
Documentation/ABI/testing/debugfs-intel-iommu
Normal file
@ -0,0 +1,276 @@
|
||||
What: /sys/kernel/debug/iommu/intel/iommu_regset
|
||||
Date: December 2023
|
||||
Contact: Jingqi Liu <Jingqi.liu@intel.com>
|
||||
Description:
|
||||
This file dumps all the register contents for each IOMMU device.
|
||||
|
||||
Example in Kabylake:
|
||||
|
||||
::
|
||||
|
||||
$ sudo cat /sys/kernel/debug/iommu/intel/iommu_regset
|
||||
|
||||
IOMMU: dmar0 Register Base Address: 26be37000
|
||||
|
||||
Name Offset Contents
|
||||
VER 0x00 0x0000000000000010
|
||||
GCMD 0x18 0x0000000000000000
|
||||
GSTS 0x1c 0x00000000c7000000
|
||||
FSTS 0x34 0x0000000000000000
|
||||
FECTL 0x38 0x0000000000000000
|
||||
|
||||
[...]
|
||||
|
||||
IOMMU: dmar1 Register Base Address: fed90000
|
||||
|
||||
Name Offset Contents
|
||||
VER 0x00 0x0000000000000010
|
||||
GCMD 0x18 0x0000000000000000
|
||||
GSTS 0x1c 0x00000000c7000000
|
||||
FSTS 0x34 0x0000000000000000
|
||||
FECTL 0x38 0x0000000000000000
|
||||
|
||||
[...]
|
||||
|
||||
IOMMU: dmar2 Register Base Address: fed91000
|
||||
|
||||
Name Offset Contents
|
||||
VER 0x00 0x0000000000000010
|
||||
GCMD 0x18 0x0000000000000000
|
||||
GSTS 0x1c 0x00000000c7000000
|
||||
FSTS 0x34 0x0000000000000000
|
||||
FECTL 0x38 0x0000000000000000
|
||||
|
||||
[...]
|
||||
|
||||
What: /sys/kernel/debug/iommu/intel/ir_translation_struct
|
||||
Date: December 2023
|
||||
Contact: Jingqi Liu <Jingqi.liu@intel.com>
|
||||
Description:
|
||||
This file dumps the table entries for Interrupt
|
||||
remapping and Interrupt posting.
|
||||
|
||||
Example in Kabylake:
|
||||
|
||||
::
|
||||
|
||||
$ sudo cat /sys/kernel/debug/iommu/intel/ir_translation_struct
|
||||
|
||||
Remapped Interrupt supported on IOMMU: dmar0
|
||||
IR table address:100900000
|
||||
|
||||
Entry SrcID DstID Vct IRTE_high IRTE_low
|
||||
0 00:0a.0 00000080 24 0000000000040050 000000800024000d
|
||||
1 00:0a.0 00000001 ef 0000000000040050 0000000100ef000d
|
||||
|
||||
Remapped Interrupt supported on IOMMU: dmar1
|
||||
IR table address:100300000
|
||||
Entry SrcID DstID Vct IRTE_high IRTE_low
|
||||
0 00:02.0 00000002 26 0000000000040010 000000020026000d
|
||||
|
||||
[...]
|
||||
|
||||
****
|
||||
|
||||
Posted Interrupt supported on IOMMU: dmar0
|
||||
IR table address:100900000
|
||||
Entry SrcID PDA_high PDA_low Vct IRTE_high IRTE_low
|
||||
|
||||
What: /sys/kernel/debug/iommu/intel/dmar_translation_struct
|
||||
Date: December 2023
|
||||
Contact: Jingqi Liu <Jingqi.liu@intel.com>
|
||||
Description:
|
||||
This file dumps Intel IOMMU DMA remapping tables, such
|
||||
as root table, context table, PASID directory and PASID
|
||||
table entries in debugfs. For legacy mode, it doesn't
|
||||
support PASID, and hence PASID field is defaulted to
|
||||
'-1' and other PASID related fields are invalid.
|
||||
|
||||
Example in Kabylake:
|
||||
|
||||
::
|
||||
|
||||
$ sudo cat /sys/kernel/debug/iommu/intel/dmar_translation_struct
|
||||
|
||||
IOMMU dmar1: Root Table Address: 0x103027000
|
||||
B.D.F Root_entry
|
||||
00:02.0 0x0000000000000000:0x000000010303e001
|
||||
|
||||
Context_entry
|
||||
0x0000000000000102:0x000000010303f005
|
||||
|
||||
PASID PASID_table_entry
|
||||
-1 0x0000000000000000:0x0000000000000000:0x0000000000000000
|
||||
|
||||
IOMMU dmar0: Root Table Address: 0x103028000
|
||||
B.D.F Root_entry
|
||||
00:0a.0 0x0000000000000000:0x00000001038a7001
|
||||
|
||||
Context_entry
|
||||
0x0000000000000000:0x0000000103220e7d
|
||||
|
||||
PASID PASID_table_entry
|
||||
0 0x0000000000000000:0x0000000000800002:0x00000001038a5089
|
||||
|
||||
[...]
|
||||
|
||||
What: /sys/kernel/debug/iommu/intel/invalidation_queue
|
||||
Date: December 2023
|
||||
Contact: Jingqi Liu <Jingqi.liu@intel.com>
|
||||
Description:
|
||||
This file exports invalidation queue internals of each
|
||||
IOMMU device.
|
||||
|
||||
Example in Kabylake:
|
||||
|
||||
::
|
||||
|
||||
$ sudo cat /sys/kernel/debug/iommu/intel/invalidation_queue
|
||||
|
||||
Invalidation queue on IOMMU: dmar0
|
||||
Base: 0x10022e000 Head: 20 Tail: 20
|
||||
Index qw0 qw1 qw2
|
||||
0 0000000000000014 0000000000000000 0000000000000000
|
||||
1 0000000200000025 0000000100059c04 0000000000000000
|
||||
2 0000000000000014 0000000000000000 0000000000000000
|
||||
|
||||
qw3 status
|
||||
0000000000000000 0000000000000000
|
||||
0000000000000000 0000000000000000
|
||||
0000000000000000 0000000000000000
|
||||
|
||||
[...]
|
||||
|
||||
Invalidation queue on IOMMU: dmar1
|
||||
Base: 0x10026e000 Head: 32 Tail: 32
|
||||
Index qw0 qw1 status
|
||||
0 0000000000000004 0000000000000000 0000000000000000
|
||||
1 0000000200000025 0000000100059804 0000000000000000
|
||||
2 0000000000000011 0000000000000000 0000000000000000
|
||||
|
||||
[...]
|
||||
|
||||
What: /sys/kernel/debug/iommu/intel/dmar_perf_latency
|
||||
Date: December 2023
|
||||
Contact: Jingqi Liu <Jingqi.liu@intel.com>
|
||||
Description:
|
||||
This file is used to control and show counts of
|
||||
execution time ranges for various types per DMAR.
|
||||
|
||||
Firstly, write a value to
|
||||
/sys/kernel/debug/iommu/intel/dmar_perf_latency
|
||||
to enable sampling.
|
||||
|
||||
The possible values are as follows:
|
||||
|
||||
* 0 - disable sampling all latency data
|
||||
|
||||
* 1 - enable sampling IOTLB invalidation latency data
|
||||
|
||||
* 2 - enable sampling devTLB invalidation latency data
|
||||
|
||||
* 3 - enable sampling intr entry cache invalidation latency data
|
||||
|
||||
Next, read /sys/kernel/debug/iommu/intel/dmar_perf_latency gives
|
||||
a snapshot of sampling result of all enabled monitors.
|
||||
|
||||
Examples in Kabylake:
|
||||
|
||||
::
|
||||
|
||||
1) Disable sampling all latency data:
|
||||
|
||||
$ sudo echo 0 > /sys/kernel/debug/iommu/intel/dmar_perf_latency
|
||||
|
||||
2) Enable sampling IOTLB invalidation latency data
|
||||
|
||||
$ sudo echo 1 > /sys/kernel/debug/iommu/intel/dmar_perf_latency
|
||||
|
||||
$ sudo cat /sys/kernel/debug/iommu/intel/dmar_perf_latency
|
||||
|
||||
IOMMU: dmar0 Register Base Address: 26be37000
|
||||
<0.1us 0.1us-1us 1us-10us 10us-100us 100us-1ms
|
||||
inv_iotlb 0 0 0 0 0
|
||||
|
||||
1ms-10ms >=10ms min(us) max(us) average(us)
|
||||
inv_iotlb 0 0 0 0 0
|
||||
|
||||
[...]
|
||||
|
||||
IOMMU: dmar2 Register Base Address: fed91000
|
||||
<0.1us 0.1us-1us 1us-10us 10us-100us 100us-1ms
|
||||
inv_iotlb 0 0 18 0 0
|
||||
|
||||
1ms-10ms >=10ms min(us) max(us) average(us)
|
||||
inv_iotlb 0 0 2 2 2
|
||||
|
||||
3) Enable sampling devTLB invalidation latency data
|
||||
|
||||
$ sudo echo 2 > /sys/kernel/debug/iommu/intel/dmar_perf_latency
|
||||
|
||||
$ sudo cat /sys/kernel/debug/iommu/intel/dmar_perf_latency
|
||||
|
||||
IOMMU: dmar0 Register Base Address: 26be37000
|
||||
<0.1us 0.1us-1us 1us-10us 10us-100us 100us-1ms
|
||||
inv_devtlb 0 0 0 0 0
|
||||
|
||||
>=10ms min(us) max(us) average(us)
|
||||
inv_devtlb 0 0 0 0
|
||||
|
||||
[...]
|
||||
|
||||
What: /sys/kernel/debug/iommu/intel/<bdf>/domain_translation_struct
|
||||
Date: December 2023
|
||||
Contact: Jingqi Liu <Jingqi.liu@intel.com>
|
||||
Description:
|
||||
This file dumps a specified page table of Intel IOMMU
|
||||
in legacy mode or scalable mode.
|
||||
|
||||
For a device that only supports legacy mode, dump its
|
||||
page table by the debugfs file in the debugfs device
|
||||
directory. e.g.
|
||||
/sys/kernel/debug/iommu/intel/0000:00:02.0/domain_translation_struct.
|
||||
|
||||
For a device that supports scalable mode, dump the
|
||||
page table of specified pasid by the debugfs file in
|
||||
the debugfs pasid directory. e.g.
|
||||
/sys/kernel/debug/iommu/intel/0000:00:02.0/1/domain_translation_struct.
|
||||
|
||||
Examples in Kabylake:
|
||||
|
||||
::
|
||||
|
||||
1) Dump the page table of device "0000:00:02.0" that only supports legacy mode.
|
||||
|
||||
$ sudo cat /sys/kernel/debug/iommu/intel/0000:00:02.0/domain_translation_struct
|
||||
|
||||
Device 0000:00:02.0 @0x1017f8000
|
||||
IOVA_PFN PML5E PML4E
|
||||
0x000000008d800 | 0x0000000000000000 0x00000001017f9003
|
||||
0x000000008d801 | 0x0000000000000000 0x00000001017f9003
|
||||
0x000000008d802 | 0x0000000000000000 0x00000001017f9003
|
||||
|
||||
PDPE PDE PTE
|
||||
0x00000001017fa003 0x00000001017fb003 0x000000008d800003
|
||||
0x00000001017fa003 0x00000001017fb003 0x000000008d801003
|
||||
0x00000001017fa003 0x00000001017fb003 0x000000008d802003
|
||||
|
||||
[...]
|
||||
|
||||
2) Dump the page table of device "0000:00:0a.0" with PASID "1" that
|
||||
supports scalable mode.
|
||||
|
||||
$ sudo cat /sys/kernel/debug/iommu/intel/0000:00:0a.0/1/domain_translation_struct
|
||||
|
||||
Device 0000:00:0a.0 with pasid 1 @0x10c112000
|
||||
IOVA_PFN PML5E PML4E
|
||||
0x0000000000000 | 0x0000000000000000 0x000000010df93003
|
||||
0x0000000000001 | 0x0000000000000000 0x000000010df93003
|
||||
0x0000000000002 | 0x0000000000000000 0x000000010df93003
|
||||
|
||||
PDPE PDE PTE
|
||||
0x0000000106ae6003 0x0000000104b38003 0x0000000147c00803
|
||||
0x0000000106ae6003 0x0000000104b38003 0x0000000147c01803
|
||||
0x0000000106ae6003 0x0000000104b38003 0x0000000147c02803
|
||||
|
||||
[...]
|
@ -6,8 +6,9 @@ Description:
|
||||
The character device files /dev/gpiochip* are the interface
|
||||
between GPIO chips and userspace.
|
||||
|
||||
The ioctl(2)-based ABI is defined and documented in
|
||||
[include/uapi]<linux/gpio.h>.
|
||||
The ioctl(2)-based ABI is defined in
|
||||
[include/uapi]<linux/gpio.h> and documented in
|
||||
Documentation/userspace-api/gpio/chardev.rst.
|
||||
|
||||
The following file operations are supported:
|
||||
|
||||
@ -17,8 +18,8 @@ Description:
|
||||
ioctl(2)
|
||||
Initiate various actions.
|
||||
|
||||
See the inline documentation in [include/uapi]<linux/gpio.h>
|
||||
for descriptions of all ioctls.
|
||||
See Documentation/userspace-api/gpio/chardev.rst
|
||||
for a description of all ioctls.
|
||||
|
||||
close(2)
|
||||
Stops and free up the I/O contexts that was associated
|
||||
|
@ -170,3 +170,90 @@ Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang (QUIC) <quic_t
|
||||
Description:
|
||||
(RW) Set/Get the MSR(mux select register) for the DSB subunit
|
||||
TPDM.
|
||||
|
||||
What: /sys/bus/coresight/devices/<tpdm-name>/cmb_mode
|
||||
Date: January 2024
|
||||
KernelVersion 6.9
|
||||
Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang (QUIC) <quic_taozha@quicinc.com>
|
||||
Description: (Write) Set the data collection mode of CMB tpdm. Continuous
|
||||
change creates CMB data set elements on every CMBCLK edge.
|
||||
Trace-on-change creates CMB data set elements only when a new
|
||||
data set element differs in value from the previous element
|
||||
in a CMB data set.
|
||||
|
||||
Accepts only one of the 2 values - 0 or 1.
|
||||
0 : Continuous CMB collection mode.
|
||||
1 : Trace-on-change CMB collection mode.
|
||||
|
||||
What: /sys/bus/coresight/devices/<tpdm-name>/cmb_trig_patt/xpr[0:1]
|
||||
Date: January 2024
|
||||
KernelVersion 6.9
|
||||
Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang (QUIC) <quic_taozha@quicinc.com>
|
||||
Description:
|
||||
(RW) Set/Get the value of the trigger pattern for the CMB
|
||||
subunit TPDM.
|
||||
|
||||
What: /sys/bus/coresight/devices/<tpdm-name>/cmb_trig_patt/xpmr[0:1]
|
||||
Date: January 2024
|
||||
KernelVersion 6.9
|
||||
Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang (QUIC) <quic_taozha@quicinc.com>
|
||||
Description:
|
||||
(RW) Set/Get the mask of the trigger pattern for the CMB
|
||||
subunit TPDM.
|
||||
|
||||
What: /sys/bus/coresight/devices/<tpdm-name>/dsb_patt/tpr[0:1]
|
||||
Date: January 2024
|
||||
KernelVersion 6.9
|
||||
Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang (QUIC) <quic_taozha@quicinc.com>
|
||||
Description:
|
||||
(RW) Set/Get the value of the pattern for the CMB subunit TPDM.
|
||||
|
||||
What: /sys/bus/coresight/devices/<tpdm-name>/dsb_patt/tpmr[0:1]
|
||||
Date: January 2024
|
||||
KernelVersion 6.9
|
||||
Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang (QUIC) <quic_taozha@quicinc.com>
|
||||
Description:
|
||||
(RW) Set/Get the mask of the pattern for the CMB subunit TPDM.
|
||||
|
||||
What: /sys/bus/coresight/devices/<tpdm-name>/cmb_patt/enable_ts
|
||||
Date: January 2024
|
||||
KernelVersion 6.9
|
||||
Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang (QUIC) <quic_taozha@quicinc.com>
|
||||
Description:
|
||||
(Write) Set the pattern timestamp of CMB tpdm. Read
|
||||
the pattern timestamp of CMB tpdm.
|
||||
|
||||
Accepts only one of the 2 values - 0 or 1.
|
||||
0 : Disable CMB pattern timestamp.
|
||||
1 : Enable CMB pattern timestamp.
|
||||
|
||||
What: /sys/bus/coresight/devices/<tpdm-name>/cmb_trig_ts
|
||||
Date: January 2024
|
||||
KernelVersion 6.9
|
||||
Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang (QUIC) <quic_taozha@quicinc.com>
|
||||
Description:
|
||||
(RW) Set/Get the trigger timestamp of the CMB for tpdm.
|
||||
|
||||
Accepts only one of the 2 values - 0 or 1.
|
||||
0 : Set the CMB trigger type to false
|
||||
1 : Set the CMB trigger type to true
|
||||
|
||||
What: /sys/bus/coresight/devices/<tpdm-name>/cmb_ts_all
|
||||
Date: January 2024
|
||||
KernelVersion 6.9
|
||||
Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang (QUIC) <quic_taozha@quicinc.com>
|
||||
Description:
|
||||
(RW) Read or write the status of timestamp upon all interface.
|
||||
Only value 0 and 1 can be written to this node. Set this node to 1 to requeset
|
||||
timestamp to all trace packet.
|
||||
Accepts only one of the 2 values - 0 or 1.
|
||||
0 : Disable the timestamp of all trace packets.
|
||||
1 : Enable the timestamp of all trace packets.
|
||||
|
||||
What: /sys/bus/coresight/devices/<tpdm-name>/cmb_msr/msr[0:31]
|
||||
Date: January 2024
|
||||
KernelVersion 6.9
|
||||
Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang (QUIC) <quic_taozha@quicinc.com>
|
||||
Description:
|
||||
(RW) Set/Get the MSR(mux select register) for the CMB subunit
|
||||
TPDM.
|
||||
|
@ -552,3 +552,37 @@ Description:
|
||||
attribute is only visible for devices supporting the
|
||||
capability. The retrieved errors are logged as kernel
|
||||
events when cxl_poison event tracing is enabled.
|
||||
|
||||
|
||||
What: /sys/bus/cxl/devices/regionZ/accessY/read_bandwidth
|
||||
/sys/bus/cxl/devices/regionZ/accessY/write_banwidth
|
||||
Date: Jan, 2024
|
||||
KernelVersion: v6.9
|
||||
Contact: linux-cxl@vger.kernel.org
|
||||
Description:
|
||||
(RO) The aggregated read or write bandwidth of the region. The
|
||||
number is the accumulated read or write bandwidth of all CXL memory
|
||||
devices that contributes to the region in MB/s. It is
|
||||
identical data that should appear in
|
||||
/sys/devices/system/node/nodeX/accessY/initiators/read_bandwidth or
|
||||
/sys/devices/system/node/nodeX/accessY/initiators/write_bandwidth.
|
||||
See Documentation/ABI/stable/sysfs-devices-node. access0 provides
|
||||
the number to the closest initiator and access1 provides the
|
||||
number to the closest CPU.
|
||||
|
||||
|
||||
What: /sys/bus/cxl/devices/regionZ/accessY/read_latency
|
||||
/sys/bus/cxl/devices/regionZ/accessY/write_latency
|
||||
Date: Jan, 2024
|
||||
KernelVersion: v6.9
|
||||
Contact: linux-cxl@vger.kernel.org
|
||||
Description:
|
||||
(RO) The read or write latency of the region. The number is
|
||||
the worst read or write latency of all CXL memory devices that
|
||||
contributes to the region in nanoseconds. It is identical data
|
||||
that should appear in
|
||||
/sys/devices/system/node/nodeX/accessY/initiators/read_latency or
|
||||
/sys/devices/system/node/nodeX/accessY/initiators/write_latency.
|
||||
See Documentation/ABI/stable/sysfs-devices-node. access0 provides
|
||||
the number to the closest initiator and access1 provides the
|
||||
number to the closest CPU.
|
||||
|
153
Documentation/ABI/testing/sysfs-bus-dax
Normal file
153
Documentation/ABI/testing/sysfs-bus-dax
Normal file
@ -0,0 +1,153 @@
|
||||
What: /sys/bus/dax/devices/daxX.Y/align
|
||||
Date: October, 2020
|
||||
KernelVersion: v5.10
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RW) Provides a way to specify an alignment for a dax device.
|
||||
Values allowed are constrained by the physical address ranges
|
||||
that back the dax device, and also by arch requirements.
|
||||
|
||||
What: /sys/bus/dax/devices/daxX.Y/mapping
|
||||
Date: October, 2020
|
||||
KernelVersion: v5.10
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(WO) Provides a way to allocate a mapping range under a dax
|
||||
device. Specified in the format <start>-<end>.
|
||||
|
||||
What: /sys/bus/dax/devices/daxX.Y/mapping[0..N]/start
|
||||
What: /sys/bus/dax/devices/daxX.Y/mapping[0..N]/end
|
||||
What: /sys/bus/dax/devices/daxX.Y/mapping[0..N]/page_offset
|
||||
Date: October, 2020
|
||||
KernelVersion: v5.10
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RO) A dax device may have multiple constituent discontiguous
|
||||
address ranges. These are represented by the different
|
||||
'mappingX' subdirectories. The 'start' attribute indicates the
|
||||
start physical address for the given range. The 'end' attribute
|
||||
indicates the end physical address for the given range. The
|
||||
'page_offset' attribute indicates the offset of the current
|
||||
range in the dax device.
|
||||
|
||||
What: /sys/bus/dax/devices/daxX.Y/resource
|
||||
Date: June, 2019
|
||||
KernelVersion: v5.3
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RO) The resource attribute indicates the starting physical
|
||||
address of a dax device. In case of a device with multiple
|
||||
constituent ranges, it indicates the starting address of the
|
||||
first range.
|
||||
|
||||
What: /sys/bus/dax/devices/daxX.Y/size
|
||||
Date: October, 2020
|
||||
KernelVersion: v5.10
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RW) The size attribute indicates the total size of a dax
|
||||
device. For creating subdivided dax devices, or for resizing
|
||||
an existing device, the new size can be written to this as
|
||||
part of the reconfiguration process.
|
||||
|
||||
What: /sys/bus/dax/devices/daxX.Y/numa_node
|
||||
Date: November, 2019
|
||||
KernelVersion: v5.5
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RO) If NUMA is enabled and the platform has affinitized the
|
||||
backing device for this dax device, emit the CPU node
|
||||
affinity for this device.
|
||||
|
||||
What: /sys/bus/dax/devices/daxX.Y/target_node
|
||||
Date: February, 2019
|
||||
KernelVersion: v5.1
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RO) The target-node attribute is the Linux numa-node that a
|
||||
device-dax instance may create when it is online. Prior to
|
||||
being online the device's 'numa_node' property reflects the
|
||||
closest online cpu node which is the typical expectation of a
|
||||
device 'numa_node'. Once it is online it becomes its own
|
||||
distinct numa node.
|
||||
|
||||
What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/available_size
|
||||
Date: October, 2020
|
||||
KernelVersion: v5.10
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RO) The available_size attribute tracks available dax region
|
||||
capacity. This only applies to volatile hmem devices, not pmem
|
||||
devices, since pmem devices are defined by nvdimm namespace
|
||||
boundaries.
|
||||
|
||||
What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/size
|
||||
Date: July, 2017
|
||||
KernelVersion: v5.1
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RO) The size attribute indicates the size of a given dax region
|
||||
in bytes.
|
||||
|
||||
What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/align
|
||||
Date: October, 2020
|
||||
KernelVersion: v5.10
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RO) The align attribute indicates alignment of the dax region.
|
||||
Changes on align may not always be valid, when say certain
|
||||
mappings were created with 2M and then we switch to 1G. This
|
||||
validates all ranges against the new value being attempted, post
|
||||
resizing.
|
||||
|
||||
What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/seed
|
||||
Date: October, 2020
|
||||
KernelVersion: v5.10
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RO) The seed device is a concept for dynamic dax regions to be
|
||||
able to split the region amongst multiple sub-instances. The
|
||||
seed device, similar to libnvdimm seed devices, is a device
|
||||
that starts with zero capacity allocated and unbound to a
|
||||
driver.
|
||||
|
||||
What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/create
|
||||
Date: October, 2020
|
||||
KernelVersion: v5.10
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RW) The create interface to the dax region provides a way to
|
||||
create a new unconfigured dax device under the given region, which
|
||||
can then be configured (with a size etc.) and then probed.
|
||||
|
||||
What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/delete
|
||||
Date: October, 2020
|
||||
KernelVersion: v5.10
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(WO) The delete interface for a dax region provides for deletion
|
||||
of any 0-sized and idle dax devices.
|
||||
|
||||
What: $(readlink -f /sys/bus/dax/devices/daxX.Y)/../dax_region/id
|
||||
Date: July, 2017
|
||||
KernelVersion: v5.1
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RO) The id attribute indicates the region id of a dax region.
|
||||
|
||||
What: /sys/bus/dax/devices/daxX.Y/memmap_on_memory
|
||||
Date: January, 2024
|
||||
KernelVersion: v6.8
|
||||
Contact: nvdimm@lists.linux.dev
|
||||
Description:
|
||||
(RW) Control the memmap_on_memory setting if the dax device
|
||||
were to be hotplugged as system memory. This determines whether
|
||||
the 'altmap' for the hotplugged memory will be placed on the
|
||||
device being hotplugged (memmap_on_memory=1) or if it will be
|
||||
placed on regular memory (memmap_on_memory=0). This attribute
|
||||
must be set before the device is handed over to the 'kmem'
|
||||
driver (i.e. hotplugged into system-ram). Additionally, this
|
||||
depends on CONFIG_MHP_MEMMAP_ON_MEMORY, and a globally enabled
|
||||
memmap_on_memory parameter for memory_hotplug. This is
|
||||
typically set on the kernel command line -
|
||||
memory_hotplug.memmap_on_memory set to 'true' or 'force'."
|
9
Documentation/ABI/testing/sysfs-bus-iio-adc-pac1934
Normal file
9
Documentation/ABI/testing/sysfs-bus-iio-adc-pac1934
Normal file
@ -0,0 +1,9 @@
|
||||
What: /sys/bus/iio/devices/iio:deviceX/in_shunt_resistorY
|
||||
KernelVersion: 6.7
|
||||
Contact: linux-iio@vger.kernel.org
|
||||
Description:
|
||||
The value of the shunt resistor may be known only at runtime
|
||||
and set by a client application. This attribute allows to
|
||||
set its value in micro-ohms. X is the IIO index of the device.
|
||||
Y is the channel number. The value is used to calculate
|
||||
current, power and accumulated energy.
|
@ -11,7 +11,7 @@ saw any problems).
|
||||
|
||||
What: /sys/bus/pci/devices/<dev>/aer_dev_correctable
|
||||
Date: July 2018
|
||||
KernelVersion: 4.19.0
|
||||
KernelVersion: 4.19.0
|
||||
Contact: linux-pci@vger.kernel.org, rajatja@google.com
|
||||
Description: List of correctable errors seen and reported by this
|
||||
PCI device using ERR_COR. Note that since multiple errors may
|
||||
@ -32,7 +32,7 @@ Description: List of correctable errors seen and reported by this
|
||||
|
||||
What: /sys/bus/pci/devices/<dev>/aer_dev_fatal
|
||||
Date: July 2018
|
||||
KernelVersion: 4.19.0
|
||||
KernelVersion: 4.19.0
|
||||
Contact: linux-pci@vger.kernel.org, rajatja@google.com
|
||||
Description: List of uncorrectable fatal errors seen and reported by this
|
||||
PCI device using ERR_FATAL. Note that since multiple errors may
|
||||
@ -62,7 +62,7 @@ Description: List of uncorrectable fatal errors seen and reported by this
|
||||
|
||||
What: /sys/bus/pci/devices/<dev>/aer_dev_nonfatal
|
||||
Date: July 2018
|
||||
KernelVersion: 4.19.0
|
||||
KernelVersion: 4.19.0
|
||||
Contact: linux-pci@vger.kernel.org, rajatja@google.com
|
||||
Description: List of uncorrectable nonfatal errors seen and reported by this
|
||||
PCI device using ERR_NONFATAL. Note that since multiple errors
|
||||
@ -100,20 +100,20 @@ collectors) that are AER capable. These indicate the number of error messages as
|
||||
device, so these counters include them and are thus cumulative of all the error
|
||||
messages on the PCI hierarchy originating at that root port.
|
||||
|
||||
What: /sys/bus/pci/devices/<dev>/aer_stats/aer_rootport_total_err_cor
|
||||
What: /sys/bus/pci/devices/<dev>/aer_rootport_total_err_cor
|
||||
Date: July 2018
|
||||
KernelVersion: 4.19.0
|
||||
KernelVersion: 4.19.0
|
||||
Contact: linux-pci@vger.kernel.org, rajatja@google.com
|
||||
Description: Total number of ERR_COR messages reported to rootport.
|
||||
|
||||
What: /sys/bus/pci/devices/<dev>/aer_stats/aer_rootport_total_err_fatal
|
||||
What: /sys/bus/pci/devices/<dev>/aer_rootport_total_err_fatal
|
||||
Date: July 2018
|
||||
KernelVersion: 4.19.0
|
||||
KernelVersion: 4.19.0
|
||||
Contact: linux-pci@vger.kernel.org, rajatja@google.com
|
||||
Description: Total number of ERR_FATAL messages reported to rootport.
|
||||
|
||||
What: /sys/bus/pci/devices/<dev>/aer_stats/aer_rootport_total_err_nonfatal
|
||||
What: /sys/bus/pci/devices/<dev>/aer_rootport_total_err_nonfatal
|
||||
Date: July 2018
|
||||
KernelVersion: 4.19.0
|
||||
KernelVersion: 4.19.0
|
||||
Contact: linux-pci@vger.kernel.org, rajatja@google.com
|
||||
Description: Total number of ERR_NONFATAL messages reported to rootport.
|
||||
|
8
Documentation/ABI/testing/sysfs-bus-pci-devices-avs
Normal file
8
Documentation/ABI/testing/sysfs-bus-pci-devices-avs
Normal file
@ -0,0 +1,8 @@
|
||||
What: /sys/devices/pci0000:00/<dev>/avs/fw_version
|
||||
Date: February 2024
|
||||
Contact: Cezary Rojewski <cezary.rojewski@intel.com>
|
||||
Description:
|
||||
Version of AudioDSP firmware ASoC avs driver is communicating
|
||||
with.
|
||||
|
||||
Format: %d.%d.%d.%d, type:major:minor:build.
|
@ -442,6 +442,16 @@ What: /sys/bus/usb/devices/usbX/descriptors
|
||||
Description:
|
||||
Contains the interface descriptors, in binary.
|
||||
|
||||
What: /sys/bus/usb/devices/usbX/bos_descriptors
|
||||
Date: March 2024
|
||||
Contact: Elbert Mai <code@elbertmai.com>
|
||||
Description:
|
||||
Binary file containing the cached binary device object store (BOS)
|
||||
of the device. This consists of the BOS descriptor followed by the
|
||||
set of device capability descriptors. All descriptors read from
|
||||
this file are in bus-endian format. Note that the kernel will not
|
||||
request the BOS from a device if its bcdUSB is less than 0x0201.
|
||||
|
||||
What: /sys/bus/usb/devices/usbX/idProduct
|
||||
Description:
|
||||
Product ID, in hexadecimal.
|
||||
|
@ -149,6 +149,15 @@ Description:
|
||||
|
||||
RW
|
||||
|
||||
What: /sys/class/hwmon/hwmonX/inY_fault
|
||||
Description:
|
||||
Reports a voltage hard failure (eg: shorted component)
|
||||
|
||||
- 1: Failed
|
||||
- 0: Ok
|
||||
|
||||
RO
|
||||
|
||||
What: /sys/class/hwmon/hwmonX/cpuY_vid
|
||||
Description:
|
||||
CPU core reference voltage.
|
||||
@ -968,6 +977,15 @@ Description:
|
||||
|
||||
RW
|
||||
|
||||
What: /sys/class/hwmon/hwmonX/humidityY_max_alarm
|
||||
Description:
|
||||
Maximum humidity detection
|
||||
|
||||
- 0: OK
|
||||
- 1: Maximum humidity detected
|
||||
|
||||
RO
|
||||
|
||||
What: /sys/class/hwmon/hwmonX/humidityY_max_hyst
|
||||
Description:
|
||||
Humidity hysteresis value for max limit.
|
||||
@ -987,6 +1005,15 @@ Description:
|
||||
|
||||
RW
|
||||
|
||||
What: /sys/class/hwmon/hwmonX/humidityY_min_alarm
|
||||
Description:
|
||||
Minimum humidity detection
|
||||
|
||||
- 0: OK
|
||||
- 1: Minimum humidity detected
|
||||
|
||||
RO
|
||||
|
||||
What: /sys/class/hwmon/hwmonX/humidityY_min_hyst
|
||||
Description:
|
||||
Humidity hysteresis value for min limit.
|
||||
|
@ -88,6 +88,8 @@ Description:
|
||||
speed of 10MBps of the named network device.
|
||||
Setting this value also immediately changes the LED state.
|
||||
|
||||
Present only if the named network device supports 10Mbps link speed.
|
||||
|
||||
What: /sys/class/leds/<led>/link_100
|
||||
Date: Jun 2023
|
||||
KernelVersion: 6.5
|
||||
@ -101,6 +103,8 @@ Description:
|
||||
speed of 100Mbps of the named network device.
|
||||
Setting this value also immediately changes the LED state.
|
||||
|
||||
Present only if the named network device supports 100Mbps link speed.
|
||||
|
||||
What: /sys/class/leds/<led>/link_1000
|
||||
Date: Jun 2023
|
||||
KernelVersion: 6.5
|
||||
@ -114,6 +118,8 @@ Description:
|
||||
speed of 1000Mbps of the named network device.
|
||||
Setting this value also immediately changes the LED state.
|
||||
|
||||
Present only if the named network device supports 1000Mbps link speed.
|
||||
|
||||
What: /sys/class/leds/<led>/link_2500
|
||||
Date: Nov 2023
|
||||
KernelVersion: 6.8
|
||||
@ -127,6 +133,8 @@ Description:
|
||||
speed of 2500Mbps of the named network device.
|
||||
Setting this value also immediately changes the LED state.
|
||||
|
||||
Present only if the named network device supports 2500Mbps link speed.
|
||||
|
||||
What: /sys/class/leds/<led>/link_5000
|
||||
Date: Nov 2023
|
||||
KernelVersion: 6.8
|
||||
@ -140,6 +148,8 @@ Description:
|
||||
speed of 5000Mbps of the named network device.
|
||||
Setting this value also immediately changes the LED state.
|
||||
|
||||
Present only if the named network device supports 5000Mbps link speed.
|
||||
|
||||
What: /sys/class/leds/<led>/link_10000
|
||||
Date: Nov 2023
|
||||
KernelVersion: 6.8
|
||||
@ -153,6 +163,8 @@ Description:
|
||||
speed of 10000Mbps of the named network device.
|
||||
Setting this value also immediately changes the LED state.
|
||||
|
||||
Present only if the named network device supports 10000Mbps link speed.
|
||||
|
||||
What: /sys/class/leds/<led>/half_duplex
|
||||
Date: Jun 2023
|
||||
KernelVersion: 6.5
|
||||
|
@ -1,11 +1,11 @@
|
||||
What: /sys/class/leds/<led>/ttyname
|
||||
What: /sys/class/leds/<tty_led>/ttyname
|
||||
Date: Dec 2020
|
||||
KernelVersion: 5.10
|
||||
Contact: linux-leds@vger.kernel.org
|
||||
Description:
|
||||
Specifies the tty device name of the triggering tty
|
||||
|
||||
What: /sys/class/leds/<led>/rx
|
||||
What: /sys/class/leds/<tty_led>/rx
|
||||
Date: February 2024
|
||||
KernelVersion: 6.8
|
||||
Description:
|
||||
@ -13,7 +13,7 @@ Description:
|
||||
If set to 0, the LED will not blink on reception.
|
||||
If set to 1 (default), the LED will blink on reception.
|
||||
|
||||
What: /sys/class/leds/<led>/tx
|
||||
What: /sys/class/leds/<tty_led>/tx
|
||||
Date: February 2024
|
||||
KernelVersion: 6.8
|
||||
Description:
|
||||
@ -21,7 +21,7 @@ Description:
|
||||
If set to 0, the LED will not blink on transmission.
|
||||
If set to 1 (default), the LED will blink on transmission.
|
||||
|
||||
What: /sys/class/leds/<led>/cts
|
||||
What: /sys/class/leds/<tty_led>/cts
|
||||
Date: February 2024
|
||||
KernelVersion: 6.8
|
||||
Description:
|
||||
@ -31,7 +31,7 @@ Description:
|
||||
If set to 0 (default), the LED will not evaluate CTS.
|
||||
If set to 1, the LED will evaluate CTS.
|
||||
|
||||
What: /sys/class/leds/<led>/dsr
|
||||
What: /sys/class/leds/<tty_led>/dsr
|
||||
Date: February 2024
|
||||
KernelVersion: 6.8
|
||||
Description:
|
||||
@ -41,7 +41,7 @@ Description:
|
||||
If set to 0 (default), the LED will not evaluate DSR.
|
||||
If set to 1, the LED will evaluate DSR.
|
||||
|
||||
What: /sys/class/leds/<led>/dcd
|
||||
What: /sys/class/leds/<tty_led>/dcd
|
||||
Date: February 2024
|
||||
KernelVersion: 6.8
|
||||
Description:
|
||||
@ -51,7 +51,7 @@ Description:
|
||||
If set to 0 (default), the LED will not evaluate CAR (DCD).
|
||||
If set to 1, the LED will evaluate CAR (DCD).
|
||||
|
||||
What: /sys/class/leds/<led>/rng
|
||||
What: /sys/class/leds/<tty_led>/rng
|
||||
Date: February 2024
|
||||
KernelVersion: 6.8
|
||||
Description:
|
||||
|
@ -19,3 +19,9 @@ Description:
|
||||
- none
|
||||
- host
|
||||
- device
|
||||
|
||||
What: /sys/class/usb_role/<switch>/connector
|
||||
Date: Feb 2024
|
||||
Contact: Heikki Krogerus <heikki.krogerus@linux.intel.com>
|
||||
Description:
|
||||
Optional symlink to the USB Type-C connector.
|
||||
|
@ -141,3 +141,23 @@ Description:
|
||||
64
|
||||
|
||||
This attribute is only available for qat_4xxx devices.
|
||||
|
||||
What: /sys/bus/pci/devices/<BDF>/qat/auto_reset
|
||||
Date: March 2024
|
||||
KernelVersion: 6.8
|
||||
Contact: qat-linux@intel.com
|
||||
Description: (RW) Reports the current state of the autoreset feature
|
||||
for a QAT device
|
||||
|
||||
Write to the attribute to enable or disable device auto reset.
|
||||
|
||||
Device auto reset is disabled by default.
|
||||
|
||||
The values are:
|
||||
|
||||
* 1/Yy/on: auto reset enabled. If the device encounters an
|
||||
unrecoverable error, it will be reset automatically.
|
||||
* 0/Nn/off: auto reset disabled. If the device encounters an
|
||||
unrecoverable error, it will not be reset.
|
||||
|
||||
This attribute is only available for qat_4xxx devices.
|
||||
|
@ -205,7 +205,7 @@ Description: Controls the idle timing of system, if there is no FS operation
|
||||
What: /sys/fs/f2fs/<disk>/discard_idle_interval
|
||||
Date: September 2018
|
||||
Contact: "Chao Yu" <yuchao0@huawei.com>
|
||||
Contact: "Sahitya Tummala" <stummala@codeaurora.org>
|
||||
Contact: "Sahitya Tummala" <quic_stummala@quicinc.com>
|
||||
Description: Controls the idle timing of discard thread given
|
||||
this time interval.
|
||||
Default is 5 secs.
|
||||
@ -213,7 +213,7 @@ Description: Controls the idle timing of discard thread given
|
||||
What: /sys/fs/f2fs/<disk>/gc_idle_interval
|
||||
Date: September 2018
|
||||
Contact: "Chao Yu" <yuchao0@huawei.com>
|
||||
Contact: "Sahitya Tummala" <stummala@codeaurora.org>
|
||||
Contact: "Sahitya Tummala" <quic_stummala@quicinc.com>
|
||||
Description: Controls the idle timing for gc path. Set to 5 seconds by default.
|
||||
|
||||
What: /sys/fs/f2fs/<disk>/iostat_enable
|
||||
@ -701,29 +701,31 @@ Description: Support configuring fault injection type, should be
|
||||
enabled with fault_injection option, fault type value
|
||||
is shown below, it supports single or combined type.
|
||||
|
||||
=================== ===========
|
||||
Type_Name Type_Value
|
||||
=================== ===========
|
||||
FAULT_KMALLOC 0x000000001
|
||||
FAULT_KVMALLOC 0x000000002
|
||||
FAULT_PAGE_ALLOC 0x000000004
|
||||
FAULT_PAGE_GET 0x000000008
|
||||
FAULT_ALLOC_BIO 0x000000010 (obsolete)
|
||||
FAULT_ALLOC_NID 0x000000020
|
||||
FAULT_ORPHAN 0x000000040
|
||||
FAULT_BLOCK 0x000000080
|
||||
FAULT_DIR_DEPTH 0x000000100
|
||||
FAULT_EVICT_INODE 0x000000200
|
||||
FAULT_TRUNCATE 0x000000400
|
||||
FAULT_READ_IO 0x000000800
|
||||
FAULT_CHECKPOINT 0x000001000
|
||||
FAULT_DISCARD 0x000002000
|
||||
FAULT_WRITE_IO 0x000004000
|
||||
FAULT_SLAB_ALLOC 0x000008000
|
||||
FAULT_DQUOT_INIT 0x000010000
|
||||
FAULT_LOCK_OP 0x000020000
|
||||
FAULT_BLKADDR 0x000040000
|
||||
=================== ===========
|
||||
=========================== ===========
|
||||
Type_Name Type_Value
|
||||
=========================== ===========
|
||||
FAULT_KMALLOC 0x000000001
|
||||
FAULT_KVMALLOC 0x000000002
|
||||
FAULT_PAGE_ALLOC 0x000000004
|
||||
FAULT_PAGE_GET 0x000000008
|
||||
FAULT_ALLOC_BIO 0x000000010 (obsolete)
|
||||
FAULT_ALLOC_NID 0x000000020
|
||||
FAULT_ORPHAN 0x000000040
|
||||
FAULT_BLOCK 0x000000080
|
||||
FAULT_DIR_DEPTH 0x000000100
|
||||
FAULT_EVICT_INODE 0x000000200
|
||||
FAULT_TRUNCATE 0x000000400
|
||||
FAULT_READ_IO 0x000000800
|
||||
FAULT_CHECKPOINT 0x000001000
|
||||
FAULT_DISCARD 0x000002000
|
||||
FAULT_WRITE_IO 0x000004000
|
||||
FAULT_SLAB_ALLOC 0x000008000
|
||||
FAULT_DQUOT_INIT 0x000010000
|
||||
FAULT_LOCK_OP 0x000020000
|
||||
FAULT_BLKADDR_VALIDITY 0x000040000
|
||||
FAULT_BLKADDR_CONSISTENCE 0x000080000
|
||||
FAULT_NO_SEGMENT 0x000100000
|
||||
=========================== ===========
|
||||
|
||||
What: /sys/fs/f2fs/<disk>/discard_io_aware_gran
|
||||
Date: January 2023
|
||||
|
11
Documentation/ABI/testing/sysfs-fs-virtiofs
Normal file
11
Documentation/ABI/testing/sysfs-fs-virtiofs
Normal file
@ -0,0 +1,11 @@
|
||||
What: /sys/fs/virtiofs/<n>/tag
|
||||
Date: Feb 2024
|
||||
Contact: virtio-fs@lists.linux.dev
|
||||
Description:
|
||||
[RO] The mount "tag" that can be used to mount this filesystem.
|
||||
|
||||
What: /sys/fs/virtiofs/<n>/device
|
||||
Date: Feb 2024
|
||||
Contact: virtio-fs@lists.linux.dev
|
||||
Description:
|
||||
Symlink to the virtio device that exports this filesystem.
|
@ -23,3 +23,9 @@ Date: Feb 2021
|
||||
Contact: Minchan Kim <minchan@kernel.org>
|
||||
Description:
|
||||
the number of pages CMA API failed to allocate
|
||||
|
||||
What: /sys/kernel/mm/cma/<cma-heap-name>/release_pages_success
|
||||
Date: Feb 2024
|
||||
Contact: Anshuman Khandual <anshuman.khandual@arm.com>
|
||||
Description:
|
||||
the number of pages CMA API succeeded to release
|
||||
|
@ -34,7 +34,9 @@ Description: Writing 'on' or 'off' to this file makes the kdamond starts or
|
||||
kdamond. Writing 'update_schemes_tried_bytes' to the file
|
||||
updates only '.../tried_regions/total_bytes' files of this
|
||||
kdamond. Writing 'clear_schemes_tried_regions' to the file
|
||||
removes contents of the 'tried_regions' directory.
|
||||
removes contents of the 'tried_regions' directory. Writing
|
||||
'update_schemes_effective_quotas' to the file updates
|
||||
'.../quotas/effective_bytes' files of this kdamond.
|
||||
|
||||
What: /sys/kernel/mm/damon/admin/kdamonds/<K>/pid
|
||||
Date: Mar 2022
|
||||
@ -208,6 +210,12 @@ Contact: SeongJae Park <sj@kernel.org>
|
||||
Description: Writing to and reading from this file sets and gets the size
|
||||
quota of the scheme in bytes.
|
||||
|
||||
What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/schemes/<S>/quotas/effective_bytes
|
||||
Date: Feb 2024
|
||||
Contact: SeongJae Park <sj@kernel.org>
|
||||
Description: Reading from this file gets the effective size quota of the
|
||||
scheme in bytes, which adjusted for the time quota and goals.
|
||||
|
||||
What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/schemes/<S>/quotas/reset_interval_ms
|
||||
Date: Mar 2022
|
||||
Contact: SeongJae Park <sj@kernel.org>
|
||||
@ -221,6 +229,12 @@ Description: Writing a number 'N' to this file creates the number of
|
||||
directories for setting automatic tuning of the scheme's
|
||||
aggressiveness named '0' to 'N-1' under the goals/ directory.
|
||||
|
||||
What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/schemes/<S>/quotas/goals/<G>/target_metric
|
||||
Date: Feb 2024
|
||||
Contact: SeongJae Park <sj@kernel.org>
|
||||
Description: Writing to and reading from this file sets and gets the quota
|
||||
auto-tuning goal metric.
|
||||
|
||||
What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/schemes/<S>/quotas/goals/<G>/target_value
|
||||
Date: Nov 2023
|
||||
Contact: SeongJae Park <sj@kernel.org>
|
||||
|
4
Documentation/ABI/testing/sysfs-kernel-mm-mempolicy
Normal file
4
Documentation/ABI/testing/sysfs-kernel-mm-mempolicy
Normal file
@ -0,0 +1,4 @@
|
||||
What: /sys/kernel/mm/mempolicy/
|
||||
Date: January 2024
|
||||
Contact: Linux memory management mailing list <linux-mm@kvack.org>
|
||||
Description: Interface for Mempolicy
|
@ -0,0 +1,25 @@
|
||||
What: /sys/kernel/mm/mempolicy/weighted_interleave/
|
||||
Date: January 2024
|
||||
Contact: Linux memory management mailing list <linux-mm@kvack.org>
|
||||
Description: Configuration Interface for the Weighted Interleave policy
|
||||
|
||||
What: /sys/kernel/mm/mempolicy/weighted_interleave/nodeN
|
||||
Date: January 2024
|
||||
Contact: Linux memory management mailing list <linux-mm@kvack.org>
|
||||
Description: Weight configuration interface for nodeN
|
||||
|
||||
The interleave weight for a memory node (N). These weights are
|
||||
utilized by tasks which have set their mempolicy to
|
||||
MPOL_WEIGHTED_INTERLEAVE.
|
||||
|
||||
These weights only affect new allocations, and changes at runtime
|
||||
will not cause migrations on already allocated pages.
|
||||
|
||||
The minimum weight for a node is always 1.
|
||||
|
||||
Minimum weight: 1
|
||||
Maximum weight: 255
|
||||
|
||||
Writing an empty string or `0` will reset the weight to the
|
||||
system default. The system default may be set by the kernel
|
||||
or drivers at boot or during hotplug events.
|
@ -28,7 +28,7 @@ Introduction
|
||||
high performance safe distributed caching (leases/oplocks), optional packet
|
||||
signing, large files, Unicode support and other internationalization
|
||||
improvements. Since both Samba server and this filesystem client support the
|
||||
CIFS Unix extensions, and the Linux client also suppors SMB3 POSIX extensions,
|
||||
CIFS Unix extensions, and the Linux client also supports SMB3 POSIX extensions,
|
||||
the combination can provide a reasonable alternative to other network and
|
||||
cluster file systems for fileserving in some Linux to Linux environments,
|
||||
not just in Linux to Windows (or Linux to Mac) environments.
|
||||
|
@ -34,6 +34,8 @@ Device Mapper
|
||||
switch
|
||||
thin-provisioning
|
||||
unstriped
|
||||
vdo-design
|
||||
vdo
|
||||
verity
|
||||
writecache
|
||||
zero
|
||||
|
633
Documentation/admin-guide/device-mapper/vdo-design.rst
Normal file
633
Documentation/admin-guide/device-mapper/vdo-design.rst
Normal file
@ -0,0 +1,633 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
================
|
||||
Design of dm-vdo
|
||||
================
|
||||
|
||||
The dm-vdo (virtual data optimizer) target provides inline deduplication,
|
||||
compression, zero-block elimination, and thin provisioning. A dm-vdo target
|
||||
can be backed by up to 256TB of storage, and can present a logical size of
|
||||
up to 4PB. This target was originally developed at Permabit Technology
|
||||
Corp. starting in 2009. It was first released in 2013 and has been used in
|
||||
production environments ever since. It was made open-source in 2017 after
|
||||
Permabit was acquired by Red Hat. This document describes the design of
|
||||
dm-vdo. For usage, see vdo.rst in the same directory as this file.
|
||||
|
||||
Because deduplication rates fall drastically as the block size increases, a
|
||||
vdo target has a maximum block size of 4K. However, it can achieve
|
||||
deduplication rates of 254:1, i.e. up to 254 copies of a given 4K block can
|
||||
reference a single 4K of actual storage. It can achieve compression rates
|
||||
of 14:1. All zero blocks consume no storage at all.
|
||||
|
||||
Theory of Operation
|
||||
===================
|
||||
|
||||
The design of dm-vdo is based on the idea that deduplication is a two-part
|
||||
problem. The first is to recognize duplicate data. The second is to avoid
|
||||
storing multiple copies of those duplicates. Therefore, dm-vdo has two main
|
||||
parts: a deduplication index (called UDS) that is used to discover
|
||||
duplicate data, and a data store with a reference counted block map that
|
||||
maps from logical block addresses to the actual storage location of the
|
||||
data.
|
||||
|
||||
Zones and Threading
|
||||
-------------------
|
||||
|
||||
Due to the complexity of data optimization, the number of metadata
|
||||
structures involved in a single write operation to a vdo target is larger
|
||||
than most other targets. Furthermore, because vdo must operate on small
|
||||
block sizes in order to achieve good deduplication rates, acceptable
|
||||
performance can only be achieved through parallelism. Therefore, vdo's
|
||||
design attempts to be lock-free.
|
||||
|
||||
Most of a vdo's main data structures are designed to be easily divided into
|
||||
"zones" such that any given bio must only access a single zone of any zoned
|
||||
structure. Safety with minimal locking is achieved by ensuring that during
|
||||
normal operation, each zone is assigned to a specific thread, and only that
|
||||
thread will access the portion of the data structure in that zone.
|
||||
Associated with each thread is a work queue. Each bio is associated with a
|
||||
request object (the "data_vio") which will be added to a work queue when
|
||||
the next phase of its operation requires access to the structures in the
|
||||
zone associated with that queue.
|
||||
|
||||
Another way of thinking about this arrangement is that the work queue for
|
||||
each zone has an implicit lock on the structures it manages for all its
|
||||
operations, because vdo guarantees that no other thread will alter those
|
||||
structures.
|
||||
|
||||
Although each structure is divided into zones, this division is not
|
||||
reflected in the on-disk representation of each data structure. Therefore,
|
||||
the number of zones for each structure, and hence the number of threads,
|
||||
can be reconfigured each time a vdo target is started.
|
||||
|
||||
The Deduplication Index
|
||||
-----------------------
|
||||
|
||||
In order to identify duplicate data efficiently, vdo was designed to
|
||||
leverage some common characteristics of duplicate data. From empirical
|
||||
observations, we gathered two key insights. The first is that in most data
|
||||
sets with significant amounts of duplicate data, the duplicates tend to
|
||||
have temporal locality. When a duplicate appears, it is more likely that
|
||||
other duplicates will be detected, and that those duplicates will have been
|
||||
written at about the same time. This is why the index keeps records in
|
||||
temporal order. The second insight is that new data is more likely to
|
||||
duplicate recent data than it is to duplicate older data and in general,
|
||||
there are diminishing returns to looking further back in time. Therefore,
|
||||
when the index is full, it should cull its oldest records to make space for
|
||||
new ones. Another important idea behind the design of the index is that the
|
||||
ultimate goal of deduplication is to reduce storage costs. Since there is a
|
||||
trade-off between the storage saved and the resources expended to achieve
|
||||
those savings, vdo does not attempt to find every last duplicate block. It
|
||||
is sufficient to find and eliminate most of the redundancy.
|
||||
|
||||
Each block of data is hashed to produce a 16-byte block name. An index
|
||||
record consists of this block name paired with the presumed location of
|
||||
that data on the underlying storage. However, it is not possible to
|
||||
guarantee that the index is accurate. In the most common case, this occurs
|
||||
because it is too costly to update the index when a block is over-written
|
||||
or discarded. Doing so would require either storing the block name along
|
||||
with the blocks, which is difficult to do efficiently in block-based
|
||||
storage, or reading and rehashing each block before overwriting it.
|
||||
Inaccuracy can also result from a hash collision where two different blocks
|
||||
have the same name. In practice, this is extremely unlikely, but because
|
||||
vdo does not use a cryptographic hash, a malicious workload could be
|
||||
constructed. Because of these inaccuracies, vdo treats the locations in the
|
||||
index as hints, and reads each indicated block to verify that it is indeed
|
||||
a duplicate before sharing the existing block with a new one.
|
||||
|
||||
Records are collected into groups called chapters. New records are added to
|
||||
the newest chapter, called the open chapter. This chapter is stored in a
|
||||
format optimized for adding and modifying records, and the content of the
|
||||
open chapter is not finalized until it runs out of space for new records.
|
||||
When the open chapter fills up, it is closed and a new open chapter is
|
||||
created to collect new records.
|
||||
|
||||
Closing a chapter converts it to a different format which is optimized for
|
||||
reading. The records are written to a series of record pages based on the
|
||||
order in which they were received. This means that records with temporal
|
||||
locality should be on a small number of pages, reducing the I/O required to
|
||||
retrieve them. The chapter also compiles an index that indicates which
|
||||
record page contains any given name. This index means that a request for a
|
||||
name can determine exactly which record page may contain that record,
|
||||
without having to load the entire chapter from storage. This index uses
|
||||
only a subset of the block name as its key, so it cannot guarantee that an
|
||||
index entry refers to the desired block name. It can only guarantee that if
|
||||
there is a record for this name, it will be on the indicated page. Closed
|
||||
chapters are read-only structures and their contents are never altered in
|
||||
any way.
|
||||
|
||||
Once enough records have been written to fill up all the available index
|
||||
space, the oldest chapter is removed to make space for new chapters. Any
|
||||
time a request finds a matching record in the index, that record is copied
|
||||
into the open chapter. This ensures that useful block names remain available
|
||||
in the index, while unreferenced block names are forgotten over time.
|
||||
|
||||
In order to find records in older chapters, the index also maintains a
|
||||
higher level structure called the volume index, which contains entries
|
||||
mapping each block name to the chapter containing its newest record. This
|
||||
mapping is updated as records for the block name are copied or updated,
|
||||
ensuring that only the newest record for a given block name can be found.
|
||||
An older record for a block name will no longer be found even though it has
|
||||
not been deleted from its chapter. Like the chapter index, the volume index
|
||||
uses only a subset of the block name as its key and can not definitively
|
||||
say that a record exists for a name. It can only say which chapter would
|
||||
contain the record if a record exists. The volume index is stored entirely
|
||||
in memory and is saved to storage only when the vdo target is shut down.
|
||||
|
||||
From the viewpoint of a request for a particular block name, it will first
|
||||
look up the name in the volume index. This search will either indicate that
|
||||
the name is new, or which chapter to search. If it returns a chapter, the
|
||||
request looks up its name in the chapter index. This will indicate either
|
||||
that the name is new, or which record page to search. Finally, if it is not
|
||||
new, the request will look for its name in the indicated record page.
|
||||
This process may require up to two page reads per request (one for the
|
||||
chapter index page and one for the request page). However, recently
|
||||
accessed pages are cached so that these page reads can be amortized across
|
||||
many block name requests.
|
||||
|
||||
The volume index and the chapter indexes are implemented using a
|
||||
memory-efficient structure called a delta index. Instead of storing the
|
||||
entire block name (the key) for each entry, the entries are sorted by name
|
||||
and only the difference between adjacent keys (the delta) is stored.
|
||||
Because we expect the hashes to be randomly distributed, the size of the
|
||||
deltas follows an exponential distribution. Because of this distribution,
|
||||
the deltas are expressed using a Huffman code to take up even less space.
|
||||
The entire sorted list of keys is called a delta list. This structure
|
||||
allows the index to use many fewer bytes per entry than a traditional hash
|
||||
table, but it is slightly more expensive to look up entries, because a
|
||||
request must read every entry in a delta list to add up the deltas in order
|
||||
to find the record it needs. The delta index reduces this lookup cost by
|
||||
splitting its key space into many sub-lists, each starting at a fixed key
|
||||
value, so that each individual list is short.
|
||||
|
||||
The default index size can hold 64 million records, corresponding to about
|
||||
256GB of data. This means that the index can identify duplicate data if the
|
||||
original data was written within the last 256GB of writes. This range is
|
||||
called the deduplication window. If new writes duplicate data that is older
|
||||
than that, the index will not be able to find it because the records of the
|
||||
older data have been removed. This means that if an application writes a
|
||||
200 GB file to a vdo target and then immediately writes it again, the two
|
||||
copies will deduplicate perfectly. Doing the same with a 500 GB file will
|
||||
result in no deduplication, because the beginning of the file will no
|
||||
longer be in the index by the time the second write begins (assuming there
|
||||
is no duplication within the file itself).
|
||||
|
||||
If an application anticipates a data workload that will see useful
|
||||
deduplication beyond the 256GB threshold, vdo can be configured to use a
|
||||
larger index with a correspondingly larger deduplication window. (This
|
||||
configuration can only be set when the target is created, not altered
|
||||
later. It is important to consider the expected workload for a vdo target
|
||||
before configuring it.) There are two ways to do this.
|
||||
|
||||
One way is to increase the memory size of the index, which also increases
|
||||
the amount of backing storage required. Doubling the size of the index will
|
||||
double the length of the deduplication window at the expense of doubling
|
||||
the storage size and the memory requirements.
|
||||
|
||||
The other option is to enable sparse indexing. Sparse indexing increases
|
||||
the deduplication window by a factor of 10, at the expense of also
|
||||
increasing the storage size by a factor of 10. However with sparse
|
||||
indexing, the memory requirements do not increase. The trade-off is
|
||||
slightly more computation per request and a slight decrease in the amount
|
||||
of deduplication detected. For most workloads with significant amounts of
|
||||
duplicate data, sparse indexing will detect 97-99% of the deduplication
|
||||
that a standard index will detect.
|
||||
|
||||
The vio and data_vio Structures
|
||||
-------------------------------
|
||||
|
||||
A vio (short for Vdo I/O) is conceptually similar to a bio, with additional
|
||||
fields and data to track vdo-specific information. A struct vio maintains a
|
||||
pointer to a bio but also tracks other fields specific to the operation of
|
||||
vdo. The vio is kept separate from its related bio because there are many
|
||||
circumstances where vdo completes the bio but must continue to do work
|
||||
related to deduplication or compression.
|
||||
|
||||
Metadata reads and writes, and other writes that originate within vdo, use
|
||||
a struct vio directly. Application reads and writes use a larger structure
|
||||
called a data_vio to track information about their progress. A struct
|
||||
data_vio contain a struct vio and also includes several other fields
|
||||
related to deduplication and other vdo features. The data_vio is the
|
||||
primary unit of application work in vdo. Each data_vio proceeds through a
|
||||
set of steps to handle the application data, after which it is reset and
|
||||
returned to a pool of data_vios for reuse.
|
||||
|
||||
There is a fixed pool of 2048 data_vios. This number was chosen to bound
|
||||
the amount of work that is required to recover from a crash. In addition,
|
||||
benchmarks have indicated that increasing the size of the pool does not
|
||||
significantly improve performance.
|
||||
|
||||
The Data Store
|
||||
--------------
|
||||
|
||||
The data store is implemented by three main data structures, all of which
|
||||
work in concert to reduce or amortize metadata updates across as many data
|
||||
writes as possible.
|
||||
|
||||
*The Slab Depot*
|
||||
|
||||
Most of the vdo volume belongs to the slab depot. The depot contains a
|
||||
collection of slabs. The slabs can be up to 32GB, and are divided into
|
||||
three sections. Most of a slab consists of a linear sequence of 4K blocks.
|
||||
These blocks are used either to store data, or to hold portions of the
|
||||
block map (see below). In addition to the data blocks, each slab has a set
|
||||
of reference counters, using 1 byte for each data block. Finally each slab
|
||||
has a journal.
|
||||
|
||||
Reference updates are written to the slab journal. Slab journal blocks are
|
||||
written out either when they are full, or when the recovery journal
|
||||
requests they do so in order to allow the main recovery journal (see below)
|
||||
to free up space. The slab journal is used both to ensure that the main
|
||||
recovery journal can regularly free up space, and also to amortize the cost
|
||||
of updating individual reference blocks. The reference counters are kept in
|
||||
memory and are written out, a block at a time in oldest-dirtied-order, only
|
||||
when there is a need to reclaim slab journal space. The write operations
|
||||
are performed in the background as needed so they do not add latency to
|
||||
particular I/O operations.
|
||||
|
||||
Each slab is independent of every other. They are assigned to "physical
|
||||
zones" in round-robin fashion. If there are P physical zones, then slab n
|
||||
is assigned to zone n mod P.
|
||||
|
||||
The slab depot maintains an additional small data structure, the "slab
|
||||
summary," which is used to reduce the amount of work needed to come back
|
||||
online after a crash. The slab summary maintains an entry for each slab
|
||||
indicating whether or not the slab has ever been used, whether all of its
|
||||
reference count updates have been persisted to storage, and approximately
|
||||
how full it is. During recovery, each physical zone will attempt to recover
|
||||
at least one slab, stopping whenever it has recovered a slab which has some
|
||||
free blocks. Once each zone has some space, or has determined that none is
|
||||
available, the target can resume normal operation in a degraded mode. Read
|
||||
and write requests can be serviced, perhaps with degraded performance,
|
||||
while the remainder of the dirty slabs are recovered.
|
||||
|
||||
*The Block Map*
|
||||
|
||||
The block map contains the logical to physical mapping. It can be thought
|
||||
of as an array with one entry per logical address. Each entry is 5 bytes,
|
||||
36 bits of which contain the physical block number which holds the data for
|
||||
the given logical address. The other 4 bits are used to indicate the nature
|
||||
of the mapping. Of the 16 possible states, one represents a logical address
|
||||
which is unmapped (i.e. it has never been written, or has been discarded),
|
||||
one represents an uncompressed block, and the other 14 states are used to
|
||||
indicate that the mapped data is compressed, and which of the compression
|
||||
slots in the compressed block contains the data for this logical address.
|
||||
|
||||
In practice, the array of mapping entries is divided into "block map
|
||||
pages," each of which fits in a single 4K block. Each block map page
|
||||
consists of a header and 812 mapping entries. Each mapping page is actually
|
||||
a leaf of a radix tree which consists of block map pages at each level.
|
||||
There are 60 radix trees which are assigned to "logical zones" in round
|
||||
robin fashion. (If there are L logical zones, tree n will belong to zone n
|
||||
mod L.) At each level, the trees are interleaved, so logical addresses
|
||||
0-811 belong to tree 0, logical addresses 812-1623 belong to tree 1, and so
|
||||
on. The interleaving is maintained all the way up to the 60 root nodes.
|
||||
Choosing 60 trees results in an evenly distributed number of trees per zone
|
||||
for a large number of possible logical zone counts. The storage for the 60
|
||||
tree roots is allocated at format time. All other block map pages are
|
||||
allocated out of the slabs as needed. This flexible allocation avoids the
|
||||
need to pre-allocate space for the entire set of logical mappings and also
|
||||
makes growing the logical size of a vdo relatively easy.
|
||||
|
||||
In operation, the block map maintains two caches. It is prohibitive to keep
|
||||
the entire leaf level of the trees in memory, so each logical zone
|
||||
maintains its own cache of leaf pages. The size of this cache is
|
||||
configurable at target start time. The second cache is allocated at start
|
||||
time, and is large enough to hold all the non-leaf pages of the entire
|
||||
block map. This cache is populated as pages are needed.
|
||||
|
||||
*The Recovery Journal*
|
||||
|
||||
The recovery journal is used to amortize updates across the block map and
|
||||
slab depot. Each write request causes an entry to be made in the journal.
|
||||
Entries are either "data remappings" or "block map remappings." For a data
|
||||
remapping, the journal records the logical address affected and its old and
|
||||
new physical mappings. For a block map remapping, the journal records the
|
||||
block map page number and the physical block allocated for it. Block map
|
||||
pages are never reclaimed or repurposed, so the old mapping is always 0.
|
||||
|
||||
Each journal entry is an intent record summarizing the metadata updates
|
||||
that are required for a data_vio. The recovery journal issues a flush
|
||||
before each journal block write to ensure that the physical data for the
|
||||
new block mappings in that block are stable on storage, and journal block
|
||||
writes are all issued with the FUA bit set to ensure the recovery journal
|
||||
entries themselves are stable. The journal entry and the data write it
|
||||
represents must be stable on disk before the other metadata structures may
|
||||
be updated to reflect the operation. These entries allow the vdo device to
|
||||
reconstruct the logical to physical mappings after an unexpected
|
||||
interruption such as a loss of power.
|
||||
|
||||
*Write Path*
|
||||
|
||||
All write I/O to vdo is asynchronous. Each bio will be acknowledged as soon
|
||||
as vdo has done enough work to guarantee that it can complete the write
|
||||
eventually. Generally, the data for acknowledged but unflushed write I/O
|
||||
can be treated as though it is cached in memory. If an application
|
||||
requires data to be stable on storage, it must issue a flush or write the
|
||||
data with the FUA bit set like any other asynchronous I/O. Shutting down
|
||||
the vdo target will also flush any remaining I/O.
|
||||
|
||||
Application write bios follow the steps outlined below.
|
||||
|
||||
1. A data_vio is obtained from the data_vio pool and associated with the
|
||||
application bio. If there are no data_vios available, the incoming bio
|
||||
will block until a data_vio is available. This provides back pressure
|
||||
to the application. The data_vio pool is protected by a spin lock.
|
||||
|
||||
The newly acquired data_vio is reset and the bio's data is copied into
|
||||
the data_vio if it is a write and the data is not all zeroes. The data
|
||||
must be copied because the application bio can be acknowledged before
|
||||
the data_vio processing is complete, which means later processing steps
|
||||
will no longer have access to the application bio. The application bio
|
||||
may also be smaller than 4K, in which case the data_vio will have
|
||||
already read the underlying block and the data is instead copied over
|
||||
the relevant portion of the larger block.
|
||||
|
||||
2. The data_vio places a claim (the "logical lock") on the logical address
|
||||
of the bio. It is vital to prevent simultaneous modifications of the
|
||||
same logical address, because deduplication involves sharing blocks.
|
||||
This claim is implemented as an entry in a hashtable where the key is
|
||||
the logical address and the value is a pointer to the data_vio
|
||||
currently handling that address.
|
||||
|
||||
If a data_vio looks in the hashtable and finds that another data_vio is
|
||||
already operating on that logical address, it waits until the previous
|
||||
operation finishes. It also sends a message to inform the current
|
||||
lock holder that it is waiting. Most notably, a new data_vio waiting
|
||||
for a logical lock will flush the previous lock holder out of the
|
||||
compression packer (step 8d) rather than allowing it to continue
|
||||
waiting to be packed.
|
||||
|
||||
This stage requires the data_vio to get an implicit lock on the
|
||||
appropriate logical zone to prevent concurrent modifications of the
|
||||
hashtable. This implicit locking is handled by the zone divisions
|
||||
described above.
|
||||
|
||||
3. The data_vio traverses the block map tree to ensure that all the
|
||||
necessary internal tree nodes have been allocated, by trying to find
|
||||
the leaf page for its logical address. If any interior tree page is
|
||||
missing, it is allocated at this time out of the same physical storage
|
||||
pool used to store application data.
|
||||
|
||||
a. If any page-node in the tree has not yet been allocated, it must be
|
||||
allocated before the write can continue. This step requires the
|
||||
data_vio to lock the page-node that needs to be allocated. This
|
||||
lock, like the logical block lock in step 2, is a hashtable entry
|
||||
that causes other data_vios to wait for the allocation process to
|
||||
complete.
|
||||
|
||||
The implicit logical zone lock is released while the allocation is
|
||||
happening, in order to allow other operations in the same logical
|
||||
zone to proceed. The details of allocation are the same as in
|
||||
step 4. Once a new node has been allocated, that node is added to
|
||||
the tree using a similar process to adding a new data block mapping.
|
||||
The data_vio journals the intent to add the new node to the block
|
||||
map tree (step 10), updates the reference count of the new block
|
||||
(step 11), and reacquires the implicit logical zone lock to add the
|
||||
new mapping to the parent tree node (step 12). Once the tree is
|
||||
updated, the data_vio proceeds down the tree. Any other data_vios
|
||||
waiting on this allocation also proceed.
|
||||
|
||||
b. In the steady-state case, the block map tree nodes will already be
|
||||
allocated, so the data_vio just traverses the tree until it finds
|
||||
the required leaf node. The location of the mapping (the "block map
|
||||
slot") is recorded in the data_vio so that later steps do not need
|
||||
to traverse the tree again. The data_vio then releases the implicit
|
||||
logical zone lock.
|
||||
|
||||
4. If the block is a zero block, skip to step 9. Otherwise, an attempt is
|
||||
made to allocate a free data block. This allocation ensures that the
|
||||
data_vio can write its data somewhere even if deduplication and
|
||||
compression are not possible. This stage gets an implicit lock on a
|
||||
physical zone to search for free space within that zone.
|
||||
|
||||
The data_vio will search each slab in a zone until it finds a free
|
||||
block or decides there are none. If the first zone has no free space,
|
||||
it will proceed to search the next physical zone by taking the implicit
|
||||
lock for that zone and releasing the previous one until it finds a
|
||||
free block or runs out of zones to search. The data_vio will acquire a
|
||||
struct pbn_lock (the "physical block lock") on the free block. The
|
||||
struct pbn_lock also has several fields to record the various kinds of
|
||||
claims that data_vios can have on physical blocks. The pbn_lock is
|
||||
added to a hashtable like the logical block locks in step 2. This
|
||||
hashtable is also covered by the implicit physical zone lock. The
|
||||
reference count of the free block is updated to prevent any other
|
||||
data_vio from considering it free. The reference counters are a
|
||||
sub-component of the slab and are thus also covered by the implicit
|
||||
physical zone lock.
|
||||
|
||||
5. If an allocation was obtained, the data_vio has all the resources it
|
||||
needs to complete the write. The application bio can safely be
|
||||
acknowledged at this point. The acknowledgment happens on a separate
|
||||
thread to prevent the application callback from blocking other data_vio
|
||||
operations.
|
||||
|
||||
If an allocation could not be obtained, the data_vio continues to
|
||||
attempt to deduplicate or compress the data, but the bio is not
|
||||
acknowledged because the vdo device may be out of space.
|
||||
|
||||
6. At this point vdo must determine where to store the application data.
|
||||
The data_vio's data is hashed and the hash (the "record name") is
|
||||
recorded in the data_vio.
|
||||
|
||||
7. The data_vio reserves or joins a struct hash_lock, which manages all of
|
||||
the data_vios currently writing the same data. Active hash locks are
|
||||
tracked in a hashtable similar to the way logical block locks are
|
||||
tracked in step 2. This hashtable is covered by the implicit lock on
|
||||
the hash zone.
|
||||
|
||||
If there is no existing hash lock for this data_vio's record_name, the
|
||||
data_vio obtains a hash lock from the pool, adds it to the hashtable,
|
||||
and sets itself as the new hash lock's "agent." The hash_lock pool is
|
||||
also covered by the implicit hash zone lock. The hash lock agent will
|
||||
do all the work to decide where the application data will be
|
||||
written. If a hash lock for the data_vio's record_name already exists,
|
||||
and the data_vio's data is the same as the agent's data, the new
|
||||
data_vio will wait for the agent to complete its work and then share
|
||||
its result.
|
||||
|
||||
In the rare case that a hash lock exists for the data_vio's hash but
|
||||
the data does not match the hash lock's agent, the data_vio skips to
|
||||
step 8h and attempts to write its data directly. This can happen if two
|
||||
different data blocks produce the same hash, for example.
|
||||
|
||||
8. The hash lock agent attempts to deduplicate or compress its data with
|
||||
the following steps.
|
||||
|
||||
a. The agent initializes and sends its embedded deduplication request
|
||||
(struct uds_request) to the deduplication index. This does not
|
||||
require the data_vio to get any locks because the index components
|
||||
manage their own locking. The data_vio waits until it either gets a
|
||||
response from the index or times out.
|
||||
|
||||
b. If the deduplication index returns advice, the data_vio attempts to
|
||||
obtain a physical block lock on the indicated physical address, in
|
||||
order to read the data and verify that it is the same as the
|
||||
data_vio's data, and that it can accept more references. If the
|
||||
physical address is already locked by another data_vio, the data at
|
||||
that address may soon be overwritten so it is not safe to use the
|
||||
address for deduplication.
|
||||
|
||||
c. If the data matches and the physical block can add references, the
|
||||
agent and any other data_vios waiting on it will record this
|
||||
physical block as their new physical address and proceed to step 9
|
||||
to record their new mapping. If there are more data_vios in the hash
|
||||
lock than there are references available, one of the remaining
|
||||
data_vios becomes the new agent and continues to step 8d as if no
|
||||
valid advice was returned.
|
||||
|
||||
d. If no usable duplicate block was found, the agent first checks that
|
||||
it has an allocated physical block (from step 3) that it can write
|
||||
to. If the agent does not have an allocation, some other data_vio in
|
||||
the hash lock that does have an allocation takes over as agent. If
|
||||
none of the data_vios have an allocated physical block, these writes
|
||||
are out of space, so they proceed to step 13 for cleanup.
|
||||
|
||||
e. The agent attempts to compress its data. If the data does not
|
||||
compress, the data_vio will continue to step 8h to write its data
|
||||
directly.
|
||||
|
||||
If the compressed size is small enough, the agent will release the
|
||||
implicit hash zone lock and go to the packer (struct packer) where
|
||||
it will be placed in a bin (struct packer_bin) along with other
|
||||
data_vios. All compression operations require the implicit lock on
|
||||
the packer zone.
|
||||
|
||||
The packer can combine up to 14 compressed blocks in a single 4k
|
||||
data block. Compression is only helpful if vdo can pack at least 2
|
||||
data_vios into a single data block. This means that a data_vio may
|
||||
wait in the packer for an arbitrarily long time for other data_vios
|
||||
to fill out the compressed block. There is a mechanism for vdo to
|
||||
evict waiting data_vios when continuing to wait would cause
|
||||
problems. Circumstances causing an eviction include an application
|
||||
flush, device shutdown, or a subsequent data_vio trying to overwrite
|
||||
the same logical block address. A data_vio may also be evicted from
|
||||
the packer if it cannot be paired with any other compressed block
|
||||
before more compressible blocks need to use its bin. An evicted
|
||||
data_vio will proceed to step 8h to write its data directly.
|
||||
|
||||
f. If the agent fills a packer bin, either because all 14 of its slots
|
||||
are used or because it has no remaining space, it is written out
|
||||
using the allocated physical block from one of its data_vios. Step
|
||||
8d has already ensured that an allocation is available.
|
||||
|
||||
g. Each data_vio sets the compressed block as its new physical address.
|
||||
The data_vio obtains an implicit lock on the physical zone and
|
||||
acquires the struct pbn_lock for the compressed block, which is
|
||||
modified to be a shared lock. Then it releases the implicit physical
|
||||
zone lock and proceeds to step 8i.
|
||||
|
||||
h. Any data_vio evicted from the packer will have an allocation from
|
||||
step 3. It will write its data to that allocated physical block.
|
||||
|
||||
i. After the data is written, if the data_vio is the agent of a hash
|
||||
lock, it will reacquire the implicit hash zone lock and share its
|
||||
physical address with as many other data_vios in the hash lock as
|
||||
possible. Each data_vio will then proceed to step 9 to record its
|
||||
new mapping.
|
||||
|
||||
j. If the agent actually wrote new data (whether compressed or not),
|
||||
the deduplication index is updated to reflect the location of the
|
||||
new data. The agent then releases the implicit hash zone lock.
|
||||
|
||||
9. The data_vio determines the previous mapping of the logical address.
|
||||
There is a cache for block map leaf pages (the "block map cache"),
|
||||
because there are usually too many block map leaf nodes to store
|
||||
entirely in memory. If the desired leaf page is not in the cache, the
|
||||
data_vio will reserve a slot in the cache and load the desired page
|
||||
into it, possibly evicting an older cached page. The data_vio then
|
||||
finds the current physical address for this logical address (the "old
|
||||
physical mapping"), if any, and records it. This step requires a lock
|
||||
on the block map cache structures, covered by the implicit logical zone
|
||||
lock.
|
||||
|
||||
10. The data_vio makes an entry in the recovery journal containing the
|
||||
logical block address, the old physical mapping, and the new physical
|
||||
mapping. Making this journal entry requires holding the implicit
|
||||
recovery journal lock. The data_vio will wait in the journal until all
|
||||
recovery blocks up to the one containing its entry have been written
|
||||
and flushed to ensure the transaction is stable on storage.
|
||||
|
||||
11. Once the recovery journal entry is stable, the data_vio makes two slab
|
||||
journal entries: an increment entry for the new mapping, and a
|
||||
decrement entry for the old mapping. These two operations each require
|
||||
holding a lock on the affected physical slab, covered by its implicit
|
||||
physical zone lock. For correctness during recovery, the slab journal
|
||||
entries in any given slab journal must be in the same order as the
|
||||
corresponding recovery journal entries. Therefore, if the two entries
|
||||
are in different zones, they are made concurrently, and if they are in
|
||||
the same zone, the increment is always made before the decrement in
|
||||
order to avoid underflow. After each slab journal entry is made in
|
||||
memory, the associated reference count is also updated in memory.
|
||||
|
||||
12. Once both of the reference count updates are done, the data_vio
|
||||
acquires the implicit logical zone lock and updates the
|
||||
logical-to-physical mapping in the block map to point to the new
|
||||
physical block. At this point the write operation is complete.
|
||||
|
||||
13. If the data_vio has a hash lock, it acquires the implicit hash zone
|
||||
lock and releases its hash lock to the pool.
|
||||
|
||||
The data_vio then acquires the implicit physical zone lock and releases
|
||||
the struct pbn_lock it holds for its allocated block. If it had an
|
||||
allocation that it did not use, it also sets the reference count for
|
||||
that block back to zero to free it for use by subsequent data_vios.
|
||||
|
||||
The data_vio then acquires the implicit logical zone lock and releases
|
||||
the logical block lock acquired in step 2.
|
||||
|
||||
The application bio is then acknowledged if it has not previously been
|
||||
acknowledged, and the data_vio is returned to the pool.
|
||||
|
||||
*Read Path*
|
||||
|
||||
An application read bio follows a much simpler set of steps. It does steps
|
||||
1 and 2 in the write path to obtain a data_vio and lock its logical
|
||||
address. If there is already a write data_vio in progress for that logical
|
||||
address that is guaranteed to complete, the read data_vio will copy the
|
||||
data from the write data_vio and return it. Otherwise, it will look up the
|
||||
logical-to-physical mapping by traversing the block map tree as in step 3,
|
||||
and then read and possibly decompress the indicated data at the indicated
|
||||
physical block address. A read data_vio will not allocate block map tree
|
||||
nodes if they are missing. If the interior block map nodes do not exist
|
||||
yet, the logical block map address must still be unmapped and the read
|
||||
data_vio will return all zeroes. A read data_vio handles cleanup and
|
||||
acknowledgment as in step 13, although it only needs to release the logical
|
||||
lock and return itself to the pool.
|
||||
|
||||
*Small Writes*
|
||||
|
||||
All storage within vdo is managed as 4KB blocks, but it can accept writes
|
||||
as small as 512 bytes. Processing a write that is smaller than 4K requires
|
||||
a read-modify-write operation that reads the relevant 4K block, copies the
|
||||
new data over the approriate sectors of the block, and then launches a
|
||||
write operation for the modified data block. The read and write stages of
|
||||
this operation are nearly identical to the normal read and write
|
||||
operations, and a single data_vio is used throughout this operation.
|
||||
|
||||
*Recovery*
|
||||
|
||||
When a vdo is restarted after a crash, it will attempt to recover from the
|
||||
recovery journal. During the pre-resume phase of the next start, the
|
||||
recovery journal is read. The increment portion of valid entries are played
|
||||
into the block map. Next, valid entries are played, in order as required,
|
||||
into the slab journals. Finally, each physical zone attempts to replay at
|
||||
least one slab journal to reconstruct the reference counts of one slab.
|
||||
Once each zone has some free space (or has determined that it has none),
|
||||
the vdo comes back online, while the remainder of the slab journals are
|
||||
used to reconstruct the rest of the reference counts in the background.
|
||||
|
||||
*Read-only Rebuild*
|
||||
|
||||
If a vdo encounters an unrecoverable error, it will enter read-only mode.
|
||||
This mode indicates that some previously acknowledged data may have been
|
||||
lost. The vdo may be instructed to rebuild as best it can in order to
|
||||
return to a writable state. However, this is never done automatically due
|
||||
to the possibility that data has been lost. During a read-only rebuild, the
|
||||
block map is recovered from the recovery journal as before. However, the
|
||||
reference counts are not rebuilt from the slab journals. Instead, the
|
||||
reference counts are zeroed, the entire block map is traversed, and the
|
||||
reference counts are updated from the block mappings. While this may lose
|
||||
some data, it ensures that the block map and reference counts are
|
||||
consistent with each other. This allows vdo to resume normal operation and
|
||||
accept further writes.
|
406
Documentation/admin-guide/device-mapper/vdo.rst
Normal file
406
Documentation/admin-guide/device-mapper/vdo.rst
Normal file
@ -0,0 +1,406 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
dm-vdo
|
||||
======
|
||||
|
||||
The dm-vdo (virtual data optimizer) device mapper target provides
|
||||
block-level deduplication, compression, and thin provisioning. As a device
|
||||
mapper target, it can add these features to the storage stack, compatible
|
||||
with any file system. The vdo target does not protect against data
|
||||
corruption, relying instead on integrity protection of the storage below
|
||||
it. It is strongly recommended that lvm be used to manage vdo volumes. See
|
||||
lvmvdo(7).
|
||||
|
||||
Userspace component
|
||||
===================
|
||||
|
||||
Formatting a vdo volume requires the use of the 'vdoformat' tool, available
|
||||
at:
|
||||
|
||||
https://github.com/dm-vdo/vdo/
|
||||
|
||||
In most cases, a vdo target will recover from a crash automatically the
|
||||
next time it is started. In cases where it encountered an unrecoverable
|
||||
error (either during normal operation or crash recovery) the target will
|
||||
enter or come up in read-only mode. Because read-only mode is indicative of
|
||||
data-loss, a positive action must be taken to bring vdo out of read-only
|
||||
mode. The 'vdoforcerebuild' tool, available from the same repo, is used to
|
||||
prepare a read-only vdo to exit read-only mode. After running this tool,
|
||||
the vdo target will rebuild its metadata the next time it is
|
||||
started. Although some data may be lost, the rebuilt vdo's metadata will be
|
||||
internally consistent and the target will be writable again.
|
||||
|
||||
The repo also contains additional userspace tools which can be used to
|
||||
inspect a vdo target's on-disk metadata. Fortunately, these tools are
|
||||
rarely needed except by dm-vdo developers.
|
||||
|
||||
Metadata requirements
|
||||
=====================
|
||||
|
||||
Each vdo volume reserves 3GB of space for metadata, or more depending on
|
||||
its configuration. It is helpful to check that the space saved by
|
||||
deduplication and compression is not cancelled out by the metadata
|
||||
requirements. An estimation of the space saved for a specific dataset can
|
||||
be computed with the vdo estimator tool, which is available at:
|
||||
|
||||
https://github.com/dm-vdo/vdoestimator/
|
||||
|
||||
Target interface
|
||||
================
|
||||
|
||||
Table line
|
||||
----------
|
||||
|
||||
::
|
||||
|
||||
<offset> <logical device size> vdo V4 <storage device>
|
||||
<storage device size> <minimum I/O size> <block map cache size>
|
||||
<block map era length> [optional arguments]
|
||||
|
||||
|
||||
Required parameters:
|
||||
|
||||
offset:
|
||||
The offset, in sectors, at which the vdo volume's logical
|
||||
space begins.
|
||||
|
||||
logical device size:
|
||||
The size of the device which the vdo volume will service,
|
||||
in sectors. Must match the current logical size of the vdo
|
||||
volume.
|
||||
|
||||
storage device:
|
||||
The device holding the vdo volume's data and metadata.
|
||||
|
||||
storage device size:
|
||||
The size of the device holding the vdo volume, as a number
|
||||
of 4096-byte blocks. Must match the current size of the vdo
|
||||
volume.
|
||||
|
||||
minimum I/O size:
|
||||
The minimum I/O size for this vdo volume to accept, in
|
||||
bytes. Valid values are 512 or 4096. The recommended value
|
||||
is 4096.
|
||||
|
||||
block map cache size:
|
||||
The size of the block map cache, as a number of 4096-byte
|
||||
blocks. The minimum and recommended value is 32768 blocks.
|
||||
If the logical thread count is non-zero, the cache size
|
||||
must be at least 4096 blocks per logical thread.
|
||||
|
||||
block map era length:
|
||||
The speed with which the block map cache writes out
|
||||
modified block map pages. A smaller era length is likely to
|
||||
reduce the amount of time spent rebuilding, at the cost of
|
||||
increased block map writes during normal operation. The
|
||||
maximum and recommended value is 16380; the minimum value
|
||||
is 1.
|
||||
|
||||
Optional parameters:
|
||||
--------------------
|
||||
Some or all of these parameters may be specified as <key> <value> pairs.
|
||||
|
||||
Thread related parameters:
|
||||
|
||||
Different categories of work are assigned to separate thread groups, and
|
||||
the number of threads in each group can be configured separately.
|
||||
|
||||
If <hash>, <logical>, and <physical> are all set to 0, the work handled by
|
||||
all three thread types will be handled by a single thread. If any of these
|
||||
values are non-zero, all of them must be non-zero.
|
||||
|
||||
ack:
|
||||
The number of threads used to complete bios. Since
|
||||
completing a bio calls an arbitrary completion function
|
||||
outside the vdo volume, threads of this type allow the vdo
|
||||
volume to continue processing requests even when bio
|
||||
completion is slow. The default is 1.
|
||||
|
||||
bio:
|
||||
The number of threads used to issue bios to the underlying
|
||||
storage. Threads of this type allow the vdo volume to
|
||||
continue processing requests even when bio submission is
|
||||
slow. The default is 4.
|
||||
|
||||
bioRotationInterval:
|
||||
The number of bios to enqueue on each bio thread before
|
||||
switching to the next thread. The value must be greater
|
||||
than 0 and not more than 1024; the default is 64.
|
||||
|
||||
cpu:
|
||||
The number of threads used to do CPU-intensive work, such
|
||||
as hashing and compression. The default is 1.
|
||||
|
||||
hash:
|
||||
The number of threads used to manage data comparisons for
|
||||
deduplication based on the hash value of data blocks. The
|
||||
default is 0.
|
||||
|
||||
logical:
|
||||
The number of threads used to manage caching and locking
|
||||
based on the logical address of incoming bios. The default
|
||||
is 0; the maximum is 60.
|
||||
|
||||
physical:
|
||||
The number of threads used to manage administration of the
|
||||
underlying storage device. At format time, a slab size for
|
||||
the vdo is chosen; the vdo storage device must be large
|
||||
enough to have at least 1 slab per physical thread. The
|
||||
default is 0; the maximum is 16.
|
||||
|
||||
Miscellaneous parameters:
|
||||
|
||||
maxDiscard:
|
||||
The maximum size of discard bio accepted, in 4096-byte
|
||||
blocks. I/O requests to a vdo volume are normally split
|
||||
into 4096-byte blocks, and processed up to 2048 at a time.
|
||||
However, discard requests to a vdo volume can be
|
||||
automatically split to a larger size, up to <maxDiscard>
|
||||
4096-byte blocks in a single bio, and are limited to 1500
|
||||
at a time. Increasing this value may provide better overall
|
||||
performance, at the cost of increased latency for the
|
||||
individual discard requests. The default and minimum is 1;
|
||||
the maximum is UINT_MAX / 4096.
|
||||
|
||||
deduplication:
|
||||
Whether deduplication is enabled. The default is 'on'; the
|
||||
acceptable values are 'on' and 'off'.
|
||||
|
||||
compression:
|
||||
Whether compression is enabled. The default is 'off'; the
|
||||
acceptable values are 'on' and 'off'.
|
||||
|
||||
Device modification
|
||||
-------------------
|
||||
|
||||
A modified table may be loaded into a running, non-suspended vdo volume.
|
||||
The modifications will take effect when the device is next resumed. The
|
||||
modifiable parameters are <logical device size>, <physical device size>,
|
||||
<maxDiscard>, <compression>, and <deduplication>.
|
||||
|
||||
If the logical device size or physical device size are changed, upon
|
||||
successful resume vdo will store the new values and require them on future
|
||||
startups. These two parameters may not be decreased. The logical device
|
||||
size may not exceed 4 PB. The physical device size must increase by at
|
||||
least 32832 4096-byte blocks if at all, and must not exceed the size of the
|
||||
underlying storage device. Additionally, when formatting the vdo device, a
|
||||
slab size is chosen: the physical device size may never increase above the
|
||||
size which provides 8192 slabs, and each increase must be large enough to
|
||||
add at least one new slab.
|
||||
|
||||
Examples:
|
||||
|
||||
Start a previously-formatted vdo volume with 1 GB logical space and 1 GB
|
||||
physical space, storing to /dev/dm-1 which has more than 1 GB of space.
|
||||
|
||||
::
|
||||
|
||||
dmsetup create vdo0 --table \
|
||||
"0 2097152 vdo V4 /dev/dm-1 262144 4096 32768 16380"
|
||||
|
||||
Grow the logical size to 4 GB.
|
||||
|
||||
::
|
||||
|
||||
dmsetup reload vdo0 --table \
|
||||
"0 8388608 vdo V4 /dev/dm-1 262144 4096 32768 16380"
|
||||
dmsetup resume vdo0
|
||||
|
||||
Grow the physical size to 2 GB.
|
||||
|
||||
::
|
||||
|
||||
dmsetup reload vdo0 --table \
|
||||
"0 8388608 vdo V4 /dev/dm-1 524288 4096 32768 16380"
|
||||
dmsetup resume vdo0
|
||||
|
||||
Grow the physical size by 1 GB more and increase max discard sectors.
|
||||
|
||||
::
|
||||
|
||||
dmsetup reload vdo0 --table \
|
||||
"0 10485760 vdo V4 /dev/dm-1 786432 4096 32768 16380 maxDiscard 8"
|
||||
dmsetup resume vdo0
|
||||
|
||||
Stop the vdo volume.
|
||||
|
||||
::
|
||||
|
||||
dmsetup remove vdo0
|
||||
|
||||
Start the vdo volume again. Note that the logical and physical device sizes
|
||||
must still match, but other parameters can change.
|
||||
|
||||
::
|
||||
|
||||
dmsetup create vdo1 --table \
|
||||
"0 10485760 vdo V4 /dev/dm-1 786432 512 65550 5000 hash 1 logical 3 physical 2"
|
||||
|
||||
Messages
|
||||
--------
|
||||
All vdo devices accept messages in the form:
|
||||
|
||||
::
|
||||
dmsetup message <target-name> 0 <message-name> <message-parameters>
|
||||
|
||||
The messages are:
|
||||
|
||||
stats:
|
||||
Outputs the current view of the vdo statistics. Mostly used
|
||||
by the vdostats userspace program to interpret the output
|
||||
buffer.
|
||||
|
||||
dump:
|
||||
Dumps many internal structures to the system log. This is
|
||||
not always safe to run, so it should only be used to debug
|
||||
a hung vdo. Optional parameters to specify structures to
|
||||
dump are:
|
||||
|
||||
viopool: The pool of I/O requests incoming bios
|
||||
pools: A synonym of 'viopool'
|
||||
vdo: Most of the structures managing on-disk data
|
||||
queues: Basic information about each vdo thread
|
||||
threads: A synonym of 'queues'
|
||||
default: Equivalent to 'queues vdo'
|
||||
all: All of the above.
|
||||
|
||||
dump-on-shutdown:
|
||||
Perform a default dump next time vdo shuts down.
|
||||
|
||||
|
||||
Status
|
||||
------
|
||||
|
||||
::
|
||||
|
||||
<device> <operating mode> <in recovery> <index state>
|
||||
<compression state> <physical blocks used> <total physical blocks>
|
||||
|
||||
device:
|
||||
The name of the vdo volume.
|
||||
|
||||
operating mode:
|
||||
The current operating mode of the vdo volume; values may be
|
||||
'normal', 'recovering' (the volume has detected an issue
|
||||
with its metadata and is attempting to repair itself), and
|
||||
'read-only' (an error has occurred that forces the vdo
|
||||
volume to only support read operations and not writes).
|
||||
|
||||
in recovery:
|
||||
Whether the vdo volume is currently in recovery mode;
|
||||
values may be 'recovering' or '-' which indicates not
|
||||
recovering.
|
||||
|
||||
index state:
|
||||
The current state of the deduplication index in the vdo
|
||||
volume; values may be 'closed', 'closing', 'error',
|
||||
'offline', 'online', 'opening', and 'unknown'.
|
||||
|
||||
compression state:
|
||||
The current state of compression in the vdo volume; values
|
||||
may be 'offline' and 'online'.
|
||||
|
||||
used physical blocks:
|
||||
The number of physical blocks in use by the vdo volume.
|
||||
|
||||
total physical blocks:
|
||||
The total number of physical blocks the vdo volume may use;
|
||||
the difference between this value and the
|
||||
<used physical blocks> is the number of blocks the vdo
|
||||
volume has left before being full.
|
||||
|
||||
Memory Requirements
|
||||
===================
|
||||
|
||||
A vdo target requires a fixed 38 MB of RAM along with the following amounts
|
||||
that scale with the target:
|
||||
|
||||
- 1.15 MB of RAM for each 1 MB of configured block map cache size. The
|
||||
block map cache requires a minimum of 150 MB.
|
||||
- 1.6 MB of RAM for each 1 TB of logical space.
|
||||
- 268 MB of RAM for each 1 TB of physical storage managed by the volume.
|
||||
|
||||
The deduplication index requires additional memory which scales with the
|
||||
size of the deduplication window. For dense indexes, the index requires 1
|
||||
GB of RAM per 1 TB of window. For sparse indexes, the index requires 1 GB
|
||||
of RAM per 10 TB of window. The index configuration is set when the target
|
||||
is formatted and may not be modified.
|
||||
|
||||
Module Parameters
|
||||
=================
|
||||
|
||||
The vdo driver has a numeric parameter 'log_level' which controls the
|
||||
verbosity of logging from the driver. The default setting is 6
|
||||
(LOGLEVEL_INFO and more severe messages).
|
||||
|
||||
Run-time Usage
|
||||
==============
|
||||
|
||||
When using dm-vdo, it is important to be aware of the ways in which its
|
||||
behavior differs from other storage targets.
|
||||
|
||||
- There is no guarantee that over-writes of existing blocks will succeed.
|
||||
Because the underlying storage may be multiply referenced, over-writing
|
||||
an existing block generally requires a vdo to have a free block
|
||||
available.
|
||||
|
||||
- When blocks are no longer in use, sending a discard request for those
|
||||
blocks lets the vdo release references for those blocks. If the vdo is
|
||||
thinly provisioned, discarding unused blocks is essential to prevent the
|
||||
target from running out of space. However, due to the sharing of
|
||||
duplicate blocks, no discard request for any given logical block is
|
||||
guaranteed to reclaim space.
|
||||
|
||||
- Assuming the underlying storage properly implements flush requests, vdo
|
||||
is resilient against crashes, however, unflushed writes may or may not
|
||||
persist after a crash.
|
||||
|
||||
- Each write to a vdo target entails a significant amount of processing.
|
||||
However, much of the work is paralellizable. Therefore, vdo targets
|
||||
achieve better throughput at higher I/O depths, and can support up 2048
|
||||
requests in parallel.
|
||||
|
||||
Tuning
|
||||
======
|
||||
|
||||
The vdo device has many options, and it can be difficult to make optimal
|
||||
choices without perfect knowledge of the workload. Additionally, most
|
||||
configuration options must be set when a vdo target is started, and cannot
|
||||
be changed without shutting it down completely; the configuration cannot be
|
||||
changed while the target is active. Ideally, tuning with simulated
|
||||
workloads should be performed before deploying vdo in production
|
||||
environments.
|
||||
|
||||
The most important value to adjust is the block map cache size. In order to
|
||||
service a request for any logical address, a vdo must load the portion of
|
||||
the block map which holds the relevant mapping. These mappings are cached.
|
||||
Performance will suffer when the working set does not fit in the cache. By
|
||||
default, a vdo allocates 128 MB of metadata cache in RAM to support
|
||||
efficient access to 100 GB of logical space at a time. It should be scaled
|
||||
up proportionally for larger working sets.
|
||||
|
||||
The logical and physical thread counts should also be adjusted. A logical
|
||||
thread controls a disjoint section of the block map, so additional logical
|
||||
threads increase parallelism and can increase throughput. Physical threads
|
||||
control a disjoint section of the data blocks, so additional physical
|
||||
threads can also increase throughput. However, excess threads can waste
|
||||
resources and increase contention.
|
||||
|
||||
Bio submission threads control the parallelism involved in sending I/O to
|
||||
the underlying storage; fewer threads mean there is more opportunity to
|
||||
reorder I/O requests for performance benefit, but also that each I/O
|
||||
request has to wait longer before being submitted.
|
||||
|
||||
Bio acknowledgment threads are used for finishing I/O requests. This is
|
||||
done on dedicated threads since the amount of work required to execute a
|
||||
bio's callback can not be controlled by the vdo itself. Usually one thread
|
||||
is sufficient but additional threads may be beneficial, particularly when
|
||||
bios have CPU-heavy callbacks.
|
||||
|
||||
CPU threads are used for hashing and for compression; in workloads with
|
||||
compression enabled, more threads may result in higher throughput.
|
||||
|
||||
Hash threads are used to sort active requests by hash and determine whether
|
||||
they should deduplicate; the most CPU intensive actions done by these
|
||||
threads are comparison of 4096-byte data blocks. In most cases, a single
|
||||
hash thread is sufficient.
|
@ -24,37 +24,4 @@ restrictions later on.
|
||||
As a remedy for such situations, the kernel configuration item
|
||||
CONFIG_DRM_LOAD_EDID_FIRMWARE was introduced. It allows to provide an
|
||||
individually prepared or corrected EDID data set in the /lib/firmware
|
||||
directory from where it is loaded via the firmware interface. The code
|
||||
(see drivers/gpu/drm/drm_edid_load.c) contains built-in data sets for
|
||||
commonly used screen resolutions (800x600, 1024x768, 1280x1024, 1600x1200,
|
||||
1680x1050, 1920x1080) as binary blobs, but the kernel source tree does
|
||||
not contain code to create these data. In order to elucidate the origin
|
||||
of the built-in binary EDID blobs and to facilitate the creation of
|
||||
individual data for a specific misbehaving monitor, commented sources
|
||||
and a Makefile environment are given here.
|
||||
|
||||
To create binary EDID and C source code files from the existing data
|
||||
material, simply type "make" in tools/edid/.
|
||||
|
||||
If you want to create your own EDID file, copy the file 1024x768.S,
|
||||
replace the settings with your own data and add a new target to the
|
||||
Makefile. Please note that the EDID data structure expects the timing
|
||||
values in a different way as compared to the standard X11 format.
|
||||
|
||||
X11:
|
||||
HTimings:
|
||||
hdisp hsyncstart hsyncend htotal
|
||||
VTimings:
|
||||
vdisp vsyncstart vsyncend vtotal
|
||||
|
||||
EDID::
|
||||
|
||||
#define XPIX hdisp
|
||||
#define XBLANK htotal-hdisp
|
||||
#define XOFFSET hsyncstart-hdisp
|
||||
#define XPULSE hsyncend-hsyncstart
|
||||
|
||||
#define YPIX vdisp
|
||||
#define YBLANK vtotal-vdisp
|
||||
#define YOFFSET vsyncstart-vdisp
|
||||
#define YPULSE vsyncend-vsyncstart
|
||||
directory from where it is loaded via the firmware interface.
|
||||
|
@ -3,6 +3,14 @@
|
||||
GPIO Testing Driver
|
||||
===================
|
||||
|
||||
.. note::
|
||||
|
||||
This module has been obsoleted by the more flexible gpio-sim.rst.
|
||||
New developments should use that API and existing developments are
|
||||
encouraged to migrate as soon as possible.
|
||||
This module will continue to be maintained but no new features will be
|
||||
added.
|
||||
|
||||
The GPIO Testing Driver (gpio-mockup) provides a way to create simulated GPIO
|
||||
chips for testing purposes. The lines exposed by these chips can be accessed
|
||||
using the standard GPIO character device interface as well as manipulated
|
||||
|
@ -1,16 +1,16 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
====
|
||||
gpio
|
||||
GPIO
|
||||
====
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
Character Device Userspace API <../../userspace-api/gpio/chardev>
|
||||
gpio-aggregator
|
||||
sysfs
|
||||
gpio-mockup
|
||||
gpio-sim
|
||||
Obsolete APIs <obsolete>
|
||||
|
||||
.. only:: subproject and html
|
||||
|
||||
|
13
Documentation/admin-guide/gpio/obsolete.rst
Normal file
13
Documentation/admin-guide/gpio/obsolete.rst
Normal file
@ -0,0 +1,13 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
==================
|
||||
Obsolete GPIO APIs
|
||||
==================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
Character Device Userspace API (v1) <../../userspace-api/gpio/chardev_v1>
|
||||
Sysfs Interface <../../userspace-api/gpio/sysfs>
|
||||
Mockup Testing Module <gpio-mockup>
|
||||
|
@ -65,11 +65,11 @@ Defines the beginning of the text section. In general, _stext indicates
|
||||
the kernel start address. Used to convert a virtual address from the
|
||||
direct kernel map to a physical address.
|
||||
|
||||
vmap_area_list
|
||||
--------------
|
||||
VMALLOC_START
|
||||
-------------
|
||||
|
||||
Stores the virtual area list. makedumpfile gets the vmalloc start value
|
||||
from this variable and its value is necessary for vmalloc translation.
|
||||
Stores the base address of vmalloc area. makedumpfile gets this value
|
||||
since is necessary for vmalloc translation.
|
||||
|
||||
mem_map
|
||||
-------
|
||||
|
@ -374,6 +374,11 @@
|
||||
selects a performance level in this range and appropriate
|
||||
to the current workload.
|
||||
|
||||
amd_prefcore=
|
||||
[X86]
|
||||
disable
|
||||
Disable amd-pstate preferred core.
|
||||
|
||||
amijoy.map= [HW,JOY] Amiga joystick support
|
||||
Map of devices attached to JOY0DAT and JOY1DAT
|
||||
Format: <a>,<b>
|
||||
@ -1168,16 +1173,10 @@
|
||||
panels may send no or incorrect EDID data sets.
|
||||
This parameter allows to specify an EDID data sets
|
||||
in the /lib/firmware directory that are used instead.
|
||||
Generic built-in EDID data sets are used, if one of
|
||||
edid/1024x768.bin, edid/1280x1024.bin,
|
||||
edid/1680x1050.bin, or edid/1920x1080.bin is given
|
||||
and no file with the same name exists. Details and
|
||||
instructions how to build your own EDID data are
|
||||
available in Documentation/admin-guide/edid.rst. An EDID
|
||||
data set will only be used for a particular connector,
|
||||
if its name and a colon are prepended to the EDID
|
||||
name. Each connector may use a unique EDID data
|
||||
set by separating the files with a comma. An EDID
|
||||
An EDID data set will only be used for a particular
|
||||
connector, if its name and a colon are prepended to
|
||||
the EDID name. Each connector may use a unique EDID
|
||||
data set by separating the files with a comma. An EDID
|
||||
data set with no connector name will be used for
|
||||
any connectors not explicitly specified.
|
||||
|
||||
@ -1573,12 +1572,28 @@
|
||||
The above will cause the "foo" tracing instance to trigger
|
||||
a snapshot at the end of boot up.
|
||||
|
||||
ftrace_dump_on_oops[=orig_cpu]
|
||||
ftrace_dump_on_oops[=2(orig_cpu) | =<instance>][,<instance> |
|
||||
,<instance>=2(orig_cpu)]
|
||||
[FTRACE] will dump the trace buffers on oops.
|
||||
If no parameter is passed, ftrace will dump
|
||||
buffers of all CPUs, but if you pass orig_cpu, it will
|
||||
dump only the buffer of the CPU that triggered the
|
||||
oops.
|
||||
If no parameter is passed, ftrace will dump global
|
||||
buffers of all CPUs, if you pass 2 or orig_cpu, it
|
||||
will dump only the buffer of the CPU that triggered
|
||||
the oops, or the specific instance will be dumped if
|
||||
its name is passed. Multiple instance dump is also
|
||||
supported, and instances are separated by commas. Each
|
||||
instance supports only dump on CPU that triggered the
|
||||
oops by passing 2 or orig_cpu to it.
|
||||
|
||||
ftrace_dump_on_oops=foo=orig_cpu
|
||||
|
||||
The above will dump only the buffer of "foo" instance
|
||||
on CPU that triggered the oops.
|
||||
|
||||
ftrace_dump_on_oops,foo,bar=orig_cpu
|
||||
|
||||
The above will dump global buffer on all CPUs, the
|
||||
buffer of "foo" instance on all CPUs and the buffer
|
||||
of "bar" instance on CPU that triggered the oops.
|
||||
|
||||
ftrace_filter=[function-list]
|
||||
[FTRACE] Limit the functions traced by the function
|
||||
@ -1760,6 +1775,17 @@
|
||||
(that will set all pages holding image data
|
||||
during restoration read-only).
|
||||
|
||||
hibernate.compressor= [HIBERNATION] Compression algorithm to be
|
||||
used with hibernation.
|
||||
Format: { lzo | lz4 }
|
||||
Default: lzo
|
||||
|
||||
lzo: Select LZO compression algorithm to
|
||||
compress/decompress hibernation image.
|
||||
|
||||
lz4: Select LZ4 compression algorithm to
|
||||
compress/decompress hibernation image.
|
||||
|
||||
highmem=nn[KMG] [KNL,BOOT,EARLY] forces the highmem zone to have an exact
|
||||
size of <nn>. This works even on boxes that have no
|
||||
highmem otherwise. This also works to reduce highmem
|
||||
@ -3771,10 +3797,6 @@
|
||||
no5lvl [X86-64,RISCV,EARLY] Disable 5-level paging mode. Forces
|
||||
kernel to use 4-level paging instead.
|
||||
|
||||
noaliencache [MM, NUMA, SLAB] Disables the allocation of alien
|
||||
caches in the slab allocator. Saves per-node memory,
|
||||
but will impact performance.
|
||||
|
||||
noalign [KNL,ARM]
|
||||
|
||||
noaltinstr [S390,EARLY] Disables alternative instructions
|
||||
@ -4205,6 +4227,7 @@
|
||||
bit 4: print ftrace buffer
|
||||
bit 5: print all printk messages in buffer
|
||||
bit 6: print all CPUs backtrace (if available in the arch)
|
||||
bit 7: print only tasks in uninterruptible (blocked) state
|
||||
*Be aware* that this option may print a _lot_ of lines,
|
||||
so there are risks of losing older messages in the log.
|
||||
Use this option carefully, maybe worth to setup a
|
||||
@ -5930,11 +5953,42 @@
|
||||
simeth= [IA-64]
|
||||
simscsi=
|
||||
|
||||
slram= [HW,MTD]
|
||||
slab_debug[=options[,slabs][;[options[,slabs]]...] [MM]
|
||||
Enabling slab_debug allows one to determine the
|
||||
culprit if slab objects become corrupted. Enabling
|
||||
slab_debug can create guard zones around objects and
|
||||
may poison objects when not in use. Also tracks the
|
||||
last alloc / free. For more information see
|
||||
Documentation/mm/slub.rst.
|
||||
(slub_debug legacy name also accepted for now)
|
||||
|
||||
slab_max_order= [MM]
|
||||
Determines the maximum allowed order for slabs.
|
||||
A high setting may cause OOMs due to memory
|
||||
fragmentation. For more information see
|
||||
Documentation/mm/slub.rst.
|
||||
(slub_max_order legacy name also accepted for now)
|
||||
|
||||
slab_merge [MM]
|
||||
Enable merging of slabs with similar size when the
|
||||
kernel is built without CONFIG_SLAB_MERGE_DEFAULT.
|
||||
(slub_merge legacy name also accepted for now)
|
||||
|
||||
slab_min_objects= [MM]
|
||||
The minimum number of objects per slab. SLUB will
|
||||
increase the slab order up to slab_max_order to
|
||||
generate a sufficiently large slab able to contain
|
||||
the number of objects indicated. The higher the number
|
||||
of objects the smaller the overhead of tracking slabs
|
||||
and the less frequently locks need to be acquired.
|
||||
For more information see Documentation/mm/slub.rst.
|
||||
(slub_min_objects legacy name also accepted for now)
|
||||
|
||||
slab_min_order= [MM]
|
||||
Determines the minimum page order for slabs. Must be
|
||||
lower or equal to slab_max_order. For more information see
|
||||
Documentation/mm/slub.rst.
|
||||
(slub_min_order legacy name also accepted for now)
|
||||
|
||||
slab_nomerge [MM]
|
||||
Disable merging of slabs with similar size. May be
|
||||
@ -5948,47 +6002,9 @@
|
||||
unchanged). Debug options disable merging on their
|
||||
own.
|
||||
For more information see Documentation/mm/slub.rst.
|
||||
(slub_nomerge legacy name also accepted for now)
|
||||
|
||||
slab_max_order= [MM, SLAB]
|
||||
Determines the maximum allowed order for slabs.
|
||||
A high setting may cause OOMs due to memory
|
||||
fragmentation. Defaults to 1 for systems with
|
||||
more than 32MB of RAM, 0 otherwise.
|
||||
|
||||
slub_debug[=options[,slabs][;[options[,slabs]]...] [MM, SLUB]
|
||||
Enabling slub_debug allows one to determine the
|
||||
culprit if slab objects become corrupted. Enabling
|
||||
slub_debug can create guard zones around objects and
|
||||
may poison objects when not in use. Also tracks the
|
||||
last alloc / free. For more information see
|
||||
Documentation/mm/slub.rst.
|
||||
|
||||
slub_max_order= [MM, SLUB]
|
||||
Determines the maximum allowed order for slabs.
|
||||
A high setting may cause OOMs due to memory
|
||||
fragmentation. For more information see
|
||||
Documentation/mm/slub.rst.
|
||||
|
||||
slub_min_objects= [MM, SLUB]
|
||||
The minimum number of objects per slab. SLUB will
|
||||
increase the slab order up to slub_max_order to
|
||||
generate a sufficiently large slab able to contain
|
||||
the number of objects indicated. The higher the number
|
||||
of objects the smaller the overhead of tracking slabs
|
||||
and the less frequently locks need to be acquired.
|
||||
For more information see Documentation/mm/slub.rst.
|
||||
|
||||
slub_min_order= [MM, SLUB]
|
||||
Determines the minimum page order for slabs. Must be
|
||||
lower than slub_max_order.
|
||||
For more information see Documentation/mm/slub.rst.
|
||||
|
||||
slub_merge [MM, SLUB]
|
||||
Same with slab_merge.
|
||||
|
||||
slub_nomerge [MM, SLUB]
|
||||
Same with slab_nomerge. This is supported for legacy.
|
||||
See slab_nomerge for more information.
|
||||
slram= [HW,MTD]
|
||||
|
||||
smart2= [HW]
|
||||
Format: <io1>[,<io2>[,...,<io8>]]
|
||||
|
@ -444,7 +444,9 @@ event code Key Notes
|
||||
|
||||
0x1008 0x07 FN+F8 IBM: toggle screen expand
|
||||
Lenovo: configure UltraNav,
|
||||
or toggle screen expand
|
||||
or toggle screen expand.
|
||||
On newer platforms (2024+)
|
||||
replaced by 0x131f (see below)
|
||||
|
||||
0x1009 0x08 FN+F9 -
|
||||
|
||||
@ -504,6 +506,9 @@ event code Key Notes
|
||||
|
||||
0x1019 0x18 unknown
|
||||
|
||||
0x131f ... FN+F8 Platform Mode change.
|
||||
Implemented in driver.
|
||||
|
||||
... ... ...
|
||||
|
||||
0x1020 0x1F unknown
|
||||
|
@ -49,6 +49,10 @@ Module parameters
|
||||
visl_dprintk_frame_start, visl_dprintk_nframes, but controls the dumping of
|
||||
buffer data through debugfs instead.
|
||||
|
||||
- tpg_verbose: Write extra information on each output frame to ease debugging
|
||||
the API. When set to true, the output frames are not stable for a given input
|
||||
as some information like pointers or queue status will be added to them.
|
||||
|
||||
What is the default use case for this driver?
|
||||
---------------------------------------------
|
||||
|
||||
@ -57,8 +61,12 @@ This assumes that a working client is run against visl and that the ftrace and
|
||||
OUTPUT buffer data is subsequently used to debug a work-in-progress
|
||||
implementation.
|
||||
|
||||
Information on reference frames, their timestamps, the status of the OUTPUT and
|
||||
CAPTURE queues and more can be read directly from the CAPTURE buffers.
|
||||
Even though no video decoding is actually done, the output frames can be used
|
||||
against a reference for a given input, except if tpg_verbose is set to true.
|
||||
|
||||
Depending on the tpg_verbose parameter value, information on reference frames,
|
||||
their timestamps, the status of the OUTPUT and CAPTURE queues and more can be
|
||||
read directly from the CAPTURE buffers.
|
||||
|
||||
Supported codecs
|
||||
----------------
|
||||
|
@ -60,7 +60,7 @@ all configurable using the following module options:
|
||||
- node_types:
|
||||
|
||||
which devices should each driver instance create. An array of
|
||||
hexadecimal values, one for each instance. The default is 0x1d3d.
|
||||
hexadecimal values, one for each instance. The default is 0xe1d3d.
|
||||
Each value is a bitmask with the following meaning:
|
||||
|
||||
- bit 0: Video Capture node
|
||||
|
@ -117,6 +117,33 @@ milliseconds.
|
||||
|
||||
1 second by default.
|
||||
|
||||
quota_mem_pressure_us
|
||||
---------------------
|
||||
|
||||
Desired level of memory pressure-stall time in microseconds.
|
||||
|
||||
While keeping the caps that set by other quotas, DAMON_RECLAIM automatically
|
||||
increases and decreases the effective level of the quota aiming this level of
|
||||
memory pressure is incurred. System-wide ``some`` memory PSI in microseconds
|
||||
per quota reset interval (``quota_reset_interval_ms``) is collected and
|
||||
compared to this value to see if the aim is satisfied. Value zero means
|
||||
disabling this auto-tuning feature.
|
||||
|
||||
Disabled by default.
|
||||
|
||||
quota_autotune_feedback
|
||||
-----------------------
|
||||
|
||||
User-specifiable feedback for auto-tuning of the effective quota.
|
||||
|
||||
While keeping the caps that set by other quotas, DAMON_RECLAIM automatically
|
||||
increases and decreases the effective level of the quota aiming receiving this
|
||||
feedback of value ``10,000`` from the user. DAMON_RECLAIM assumes the feedback
|
||||
value and the quota are positively proportional. Value zero means disabling
|
||||
this auto-tuning feature.
|
||||
|
||||
Disabled by default.
|
||||
|
||||
wmarks_interval
|
||||
---------------
|
||||
|
||||
|
@ -83,10 +83,10 @@ comma (",").
|
||||
│ │ │ │ │ │ │ │ sz/min,max
|
||||
│ │ │ │ │ │ │ │ nr_accesses/min,max
|
||||
│ │ │ │ │ │ │ │ age/min,max
|
||||
│ │ │ │ │ │ │ :ref:`quotas <sysfs_quotas>`/ms,bytes,reset_interval_ms
|
||||
│ │ │ │ │ │ │ :ref:`quotas <sysfs_quotas>`/ms,bytes,reset_interval_ms,effective_bytes
|
||||
│ │ │ │ │ │ │ │ weights/sz_permil,nr_accesses_permil,age_permil
|
||||
│ │ │ │ │ │ │ │ :ref:`goals <sysfs_schemes_quota_goals>`/nr_goals
|
||||
│ │ │ │ │ │ │ │ │ 0/target_value,current_value
|
||||
│ │ │ │ │ │ │ │ │ 0/target_metric,target_value,current_value
|
||||
│ │ │ │ │ │ │ :ref:`watermarks <sysfs_watermarks>`/metric,interval_us,high,mid,low
|
||||
│ │ │ │ │ │ │ :ref:`filters <sysfs_filters>`/nr_filters
|
||||
│ │ │ │ │ │ │ │ 0/type,matching,memcg_id
|
||||
@ -153,6 +153,9 @@ Users can write below commands for the kdamond to the ``state`` file.
|
||||
- ``clear_schemes_tried_regions``: Clear the DAMON-based operating scheme
|
||||
action tried regions directory for each DAMON-based operation scheme of the
|
||||
kdamond.
|
||||
- ``update_schemes_effective_bytes``: Update the contents of
|
||||
``effective_bytes`` files for each DAMON-based operation scheme of the
|
||||
kdamond. For more details, refer to :ref:`quotas directory <sysfs_quotas>`.
|
||||
|
||||
If the state is ``on``, reading ``pid`` shows the pid of the kdamond thread.
|
||||
|
||||
@ -180,19 +183,14 @@ In each context directory, two files (``avail_operations`` and ``operations``)
|
||||
and three directories (``monitoring_attrs``, ``targets``, and ``schemes``)
|
||||
exist.
|
||||
|
||||
DAMON supports multiple types of monitoring operations, including those for
|
||||
virtual address space and the physical address space. You can get the list of
|
||||
available monitoring operations set on the currently running kernel by reading
|
||||
DAMON supports multiple types of :ref:`monitoring operations
|
||||
<damon_design_configurable_operations_set>`, including those for virtual address
|
||||
space and the physical address space. You can get the list of available
|
||||
monitoring operations set on the currently running kernel by reading
|
||||
``avail_operations`` file. Based on the kernel configuration, the file will
|
||||
list some or all of below keywords.
|
||||
|
||||
- vaddr: Monitor virtual address spaces of specific processes
|
||||
- fvaddr: Monitor fixed virtual address ranges
|
||||
- paddr: Monitor the physical address space of the system
|
||||
|
||||
Please refer to :ref:`regions sysfs directory <sysfs_regions>` for detailed
|
||||
differences between the operations sets in terms of the monitoring target
|
||||
regions.
|
||||
list different available operation sets. Please refer to the :ref:`design
|
||||
<damon_operations_set>` for the list of all available operation sets and their
|
||||
brief explanations.
|
||||
|
||||
You can set and get what type of monitoring operations DAMON will use for the
|
||||
context by writing one of the keywords listed in ``avail_operations`` file and
|
||||
@ -247,17 +245,11 @@ process to the ``pid_target`` file.
|
||||
targets/<N>/regions
|
||||
-------------------
|
||||
|
||||
When ``vaddr`` monitoring operations set is being used (``vaddr`` is written to
|
||||
the ``contexts/<N>/operations`` file), DAMON automatically sets and updates the
|
||||
monitoring target regions so that entire memory mappings of target processes
|
||||
can be covered. However, users could want to set the initial monitoring region
|
||||
to specific address ranges.
|
||||
|
||||
In contrast, DAMON do not automatically sets and updates the monitoring target
|
||||
regions when ``fvaddr`` or ``paddr`` monitoring operations sets are being used
|
||||
(``fvaddr`` or ``paddr`` have written to the ``contexts/<N>/operations``).
|
||||
Therefore, users should set the monitoring target regions by themselves in the
|
||||
cases.
|
||||
In case of ``fvaddr`` or ``paddr`` monitoring operations sets, users are
|
||||
required to set the monitoring target address ranges. In case of ``vaddr``
|
||||
operations set, it is not mandatory, but users can optionally set the initial
|
||||
monitoring region to specific address ranges. Please refer to the :ref:`design
|
||||
<damon_design_vaddr_target_regions_construction>` for more details.
|
||||
|
||||
For such cases, users can explicitly set the initial monitoring target regions
|
||||
as they want, by writing proper values to the files under this directory.
|
||||
@ -302,27 +294,8 @@ In each scheme directory, five directories (``access_pattern``, ``quotas``,
|
||||
|
||||
The ``action`` file is for setting and getting the scheme's :ref:`action
|
||||
<damon_design_damos_action>`. The keywords that can be written to and read
|
||||
from the file and their meaning are as below.
|
||||
|
||||
Note that support of each action depends on the running DAMON operations set
|
||||
:ref:`implementation <sysfs_context>`.
|
||||
|
||||
- ``willneed``: Call ``madvise()`` for the region with ``MADV_WILLNEED``.
|
||||
Supported by ``vaddr`` and ``fvaddr`` operations set.
|
||||
- ``cold``: Call ``madvise()`` for the region with ``MADV_COLD``.
|
||||
Supported by ``vaddr`` and ``fvaddr`` operations set.
|
||||
- ``pageout``: Call ``madvise()`` for the region with ``MADV_PAGEOUT``.
|
||||
Supported by ``vaddr``, ``fvaddr`` and ``paddr`` operations set.
|
||||
- ``hugepage``: Call ``madvise()`` for the region with ``MADV_HUGEPAGE``.
|
||||
Supported by ``vaddr`` and ``fvaddr`` operations set.
|
||||
- ``nohugepage``: Call ``madvise()`` for the region with ``MADV_NOHUGEPAGE``.
|
||||
Supported by ``vaddr`` and ``fvaddr`` operations set.
|
||||
- ``lru_prio``: Prioritize the region on its LRU lists.
|
||||
Supported by ``paddr`` operations set.
|
||||
- ``lru_deprio``: Deprioritize the region on its LRU lists.
|
||||
Supported by ``paddr`` operations set.
|
||||
- ``stat``: Do nothing but count the statistics.
|
||||
Supported by all operations sets.
|
||||
from the file and their meaning are same to those of the list on
|
||||
:ref:`design doc <damon_design_damos_action>`.
|
||||
|
||||
The ``apply_interval_us`` file is for setting and getting the scheme's
|
||||
:ref:`apply_interval <damon_design_damos>` in microseconds.
|
||||
@ -350,8 +323,9 @@ schemes/<N>/quotas/
|
||||
The directory for the :ref:`quotas <damon_design_damos_quotas>` of the given
|
||||
DAMON-based operation scheme.
|
||||
|
||||
Under ``quotas`` directory, three files (``ms``, ``bytes``,
|
||||
``reset_interval_ms``) and two directores (``weights`` and ``goals``) exist.
|
||||
Under ``quotas`` directory, four files (``ms``, ``bytes``,
|
||||
``reset_interval_ms``, ``effective_bytes``) and two directores (``weights`` and
|
||||
``goals``) exist.
|
||||
|
||||
You can set the ``time quota`` in milliseconds, ``size quota`` in bytes, and
|
||||
``reset interval`` in milliseconds by writing the values to the three files,
|
||||
@ -359,7 +333,17 @@ respectively. Then, DAMON tries to use only up to ``time quota`` milliseconds
|
||||
for applying the ``action`` to memory regions of the ``access_pattern``, and to
|
||||
apply the action to only up to ``bytes`` bytes of memory regions within the
|
||||
``reset_interval_ms``. Setting both ``ms`` and ``bytes`` zero disables the
|
||||
quota limits.
|
||||
quota limits unless at least one :ref:`goal <sysfs_schemes_quota_goals>` is
|
||||
set.
|
||||
|
||||
The time quota is internally transformed to a size quota. Between the
|
||||
transformed size quota and user-specified size quota, smaller one is applied.
|
||||
Based on the user-specified :ref:`goal <sysfs_schemes_quota_goals>`, the
|
||||
effective size quota is further adjusted. Reading ``effective_bytes`` returns
|
||||
the current effective size quota. The file is not updated in real time, so
|
||||
users should ask DAMON sysfs interface to update the content of the file for
|
||||
the stats by writing a special keyword, ``update_schemes_effective_bytes`` to
|
||||
the relevant ``kdamonds/<N>/state`` file.
|
||||
|
||||
Under ``weights`` directory, three files (``sz_permil``,
|
||||
``nr_accesses_permil``, and ``age_permil``) exist.
|
||||
@ -382,11 +366,11 @@ number (``N``) to the file creates the number of child directories named ``0``
|
||||
to ``N-1``. Each directory represents each goal and current achievement.
|
||||
Among the multiple feedback, the best one is used.
|
||||
|
||||
Each goal directory contains two files, namely ``target_value`` and
|
||||
``current_value``. Users can set and get any number to those files to set the
|
||||
feedback. User space main workload's latency or throughput, system metrics
|
||||
like free memory ratio or memory pressure stall time (PSI) could be example
|
||||
metrics for the values. Note that users should write
|
||||
Each goal directory contains three files, namely ``target_metric``,
|
||||
``target_value`` and ``current_value``. Users can set and get the three
|
||||
parameters for the quota auto-tuning goals that specified on the :ref:`design
|
||||
doc <damon_design_damos_quotas_auto_tuning>` by writing to and reading from each
|
||||
of the files. Note that users should further write
|
||||
``commit_schemes_quota_goals`` to the ``state`` file of the :ref:`kdamond
|
||||
directory <sysfs_kdamond>` to pass the feedback to DAMON.
|
||||
|
||||
@ -579,11 +563,11 @@ monitoring results recording.
|
||||
While the monitoring is turned on, you could record the tracepoint events and
|
||||
show results using tracepoint supporting tools like ``perf``. For example::
|
||||
|
||||
# echo on > monitor_on
|
||||
# echo on > kdamonds/0/state
|
||||
# perf record -e damon:damon_aggregated &
|
||||
# sleep 5
|
||||
# kill 9 $(pidof perf)
|
||||
# echo off > monitor_on
|
||||
# echo off > kdamonds/0/state
|
||||
# perf script
|
||||
kdamond.0 46568 [027] 79357.842179: damon:damon_aggregated: target_id=0 nr_regions=11 122509119488-135708762112: 0 864
|
||||
[...]
|
||||
@ -628,9 +612,17 @@ debugfs Interface (DEPRECATED!)
|
||||
move, please report your usecase to damon@lists.linux.dev and
|
||||
linux-mm@kvack.org.
|
||||
|
||||
DAMON exports eight files, ``attrs``, ``target_ids``, ``init_regions``,
|
||||
``schemes``, ``monitor_on``, ``kdamond_pid``, ``mk_contexts`` and
|
||||
``rm_contexts`` under its debugfs directory, ``<debugfs>/damon/``.
|
||||
DAMON exports nine files, ``DEPRECATED``, ``attrs``, ``target_ids``,
|
||||
``init_regions``, ``schemes``, ``monitor_on_DEPRECATED``, ``kdamond_pid``,
|
||||
``mk_contexts`` and ``rm_contexts`` under its debugfs directory,
|
||||
``<debugfs>/damon/``.
|
||||
|
||||
|
||||
``DEPRECATED`` is a read-only file for the DAMON debugfs interface deprecation
|
||||
notice. Reading it returns the deprecation notice, as below::
|
||||
|
||||
# cat DEPRECATED
|
||||
DAMON debugfs interface is deprecated, so users should move to DAMON_SYSFS. If you cannot, please report your usecase to damon@lists.linux.dev and linux-mm@kvack.org.
|
||||
|
||||
|
||||
Attributes
|
||||
@ -755,19 +747,17 @@ Action
|
||||
~~~~~~
|
||||
|
||||
The ``<action>`` is a predefined integer for memory management :ref:`actions
|
||||
<damon_design_damos_action>`. The supported numbers and their meanings are as
|
||||
below.
|
||||
<damon_design_damos_action>`. The mapping between the ``<action>`` values and
|
||||
the memory management actions is as below. For the detailed meaning of the
|
||||
action and DAMON operations set supporting each action, please refer to the
|
||||
list on :ref:`design doc <damon_design_damos_action>`.
|
||||
|
||||
- 0: Call ``madvise()`` for the region with ``MADV_WILLNEED``. Ignored if
|
||||
``target`` is ``paddr``.
|
||||
- 1: Call ``madvise()`` for the region with ``MADV_COLD``. Ignored if
|
||||
``target`` is ``paddr``.
|
||||
- 2: Call ``madvise()`` for the region with ``MADV_PAGEOUT``.
|
||||
- 3: Call ``madvise()`` for the region with ``MADV_HUGEPAGE``. Ignored if
|
||||
``target`` is ``paddr``.
|
||||
- 4: Call ``madvise()`` for the region with ``MADV_NOHUGEPAGE``. Ignored if
|
||||
``target`` is ``paddr``.
|
||||
- 5: Do nothing but count the statistics
|
||||
- 0: ``willneed``
|
||||
- 1: ``cold``
|
||||
- 2: ``pageout``
|
||||
- 3: ``hugepage``
|
||||
- 4: ``nohugepage``
|
||||
- 5: ``stat``
|
||||
|
||||
Quota
|
||||
~~~~~
|
||||
@ -848,16 +838,16 @@ Turning On/Off
|
||||
|
||||
Setting the files as described above doesn't incur effect unless you explicitly
|
||||
start the monitoring. You can start, stop, and check the current status of the
|
||||
monitoring by writing to and reading from the ``monitor_on`` file. Writing
|
||||
``on`` to the file starts the monitoring of the targets with the attributes.
|
||||
Writing ``off`` to the file stops those. DAMON also stops if every target
|
||||
process is terminated. Below example commands turn on, off, and check the
|
||||
status of DAMON::
|
||||
monitoring by writing to and reading from the ``monitor_on_DEPRECATED`` file.
|
||||
Writing ``on`` to the file starts the monitoring of the targets with the
|
||||
attributes. Writing ``off`` to the file stops those. DAMON also stops if
|
||||
every target process is terminated. Below example commands turn on, off, and
|
||||
check the status of DAMON::
|
||||
|
||||
# cd <debugfs>/damon
|
||||
# echo on > monitor_on
|
||||
# echo off > monitor_on
|
||||
# cat monitor_on
|
||||
# echo on > monitor_on_DEPRECATED
|
||||
# echo off > monitor_on_DEPRECATED
|
||||
# cat monitor_on_DEPRECATED
|
||||
off
|
||||
|
||||
Please note that you cannot write to the above-mentioned debugfs files while
|
||||
@ -873,11 +863,11 @@ can get the pid of the thread by reading the ``kdamond_pid`` file. When the
|
||||
monitoring is turned off, reading the file returns ``none``. ::
|
||||
|
||||
# cd <debugfs>/damon
|
||||
# cat monitor_on
|
||||
# cat monitor_on_DEPRECATED
|
||||
off
|
||||
# cat kdamond_pid
|
||||
none
|
||||
# echo on > monitor_on
|
||||
# echo on > monitor_on_DEPRECATED
|
||||
# cat kdamond_pid
|
||||
18594
|
||||
|
||||
@ -907,5 +897,5 @@ directory by putting the name of the context to the ``rm_contexts`` file. ::
|
||||
# ls foo
|
||||
# ls: cannot access 'foo': No such file or directory
|
||||
|
||||
Note that ``mk_contexts``, ``rm_contexts``, and ``monitor_on`` files are in the
|
||||
root directory only.
|
||||
Note that ``mk_contexts``, ``rm_contexts``, and ``monitor_on_DEPRECATED`` files
|
||||
are in the root directory only.
|
||||
|
@ -250,6 +250,15 @@ MPOL_PREFERRED_MANY
|
||||
can fall back to all existing numa nodes. This is effectively
|
||||
MPOL_PREFERRED allowed for a mask rather than a single node.
|
||||
|
||||
MPOL_WEIGHTED_INTERLEAVE
|
||||
This mode operates the same as MPOL_INTERLEAVE, except that
|
||||
interleaving behavior is executed based on weights set in
|
||||
/sys/kernel/mm/mempolicy/weighted_interleave/
|
||||
|
||||
Weighted interleave allocates pages on nodes according to a
|
||||
weight. For example if nodes [0,1] are weighted [5,2], 5 pages
|
||||
will be allocated on node0 for every 2 pages allocated on node1.
|
||||
|
||||
NUMA memory policy supports the following optional mode flags:
|
||||
|
||||
MPOL_F_STATIC_NODES
|
||||
|
@ -37,9 +37,21 @@ Example usage of perf::
|
||||
hisi_pcie0_core0/rx_mwr_cnt/ [kernel PMU event]
|
||||
------------------------------------------
|
||||
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mwr_latency/
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mwr_cnt/
|
||||
$# perf stat -g -e hisi_pcie0_core0/rx_mwr_latency/ -e hisi_pcie0_core0/rx_mwr_cnt/
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mwr_latency,port=0xffff/
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mwr_cnt,port=0xffff/
|
||||
|
||||
The related events usually used to calculate the bandwidth, latency or others.
|
||||
They need to start and end counting at the same time, therefore related events
|
||||
are best used in the same event group to get the expected value. There are two
|
||||
ways to know if they are related events:
|
||||
|
||||
a) By event name, such as the latency events "xxx_latency, xxx_cnt" or
|
||||
bandwidth events "xxx_flux, xxx_time".
|
||||
b) By event type, such as "event=0xXXXX, event=0x1XXXX".
|
||||
|
||||
Example usage of perf group::
|
||||
|
||||
$# perf stat -e "{hisi_pcie0_core0/rx_mwr_latency,port=0xffff/,hisi_pcie0_core0/rx_mwr_cnt,port=0xffff/}"
|
||||
|
||||
The current driver does not support sampling. So "perf record" is unsupported.
|
||||
Also attach to a task is unsupported for PCIe PMU.
|
||||
@ -51,8 +63,12 @@ Filter options
|
||||
|
||||
PMU could only monitor the performance of traffic downstream target Root
|
||||
Ports or downstream target Endpoint. PCIe PMU driver support "port" and
|
||||
"bdf" interfaces for users, and these two interfaces aren't supported at the
|
||||
same time.
|
||||
"bdf" interfaces for users.
|
||||
Please notice that, one of these two interfaces must be set, and these two
|
||||
interfaces aren't supported at the same time. If they are both set, only
|
||||
"port" filter is valid.
|
||||
If "port" filter not being set or is set explicitly to zero (default), the
|
||||
"bdf" filter will be in effect, because "bdf=0" meaning 0000:000:00.0.
|
||||
|
||||
- port
|
||||
|
||||
@ -95,7 +111,7 @@ Filter options
|
||||
|
||||
Example usage of perf::
|
||||
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,trig_len=0x4,trig_mode=1/ sleep 5
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,trig_len=0x4,trig_mode=1/ sleep 5
|
||||
|
||||
3. Threshold filter
|
||||
|
||||
@ -109,7 +125,7 @@ Filter options
|
||||
|
||||
Example usage of perf::
|
||||
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,thr_len=0x4,thr_mode=1/ sleep 5
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,thr_len=0x4,thr_mode=1/ sleep 5
|
||||
|
||||
4. TLP Length filter
|
||||
|
||||
@ -127,4 +143,4 @@ Filter options
|
||||
|
||||
Example usage of perf::
|
||||
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,len_mode=0x1/ sleep 5
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,len_mode=0x1/ sleep 5
|
||||
|
@ -13,6 +13,7 @@ Performance monitor support
|
||||
imx-ddr
|
||||
qcom_l2_pmu
|
||||
qcom_l3_pmu
|
||||
starfive_starlink_pmu
|
||||
arm-ccn
|
||||
arm-cmn
|
||||
xgene-pmu
|
||||
|
46
Documentation/admin-guide/perf/starfive_starlink_pmu.rst
Normal file
46
Documentation/admin-guide/perf/starfive_starlink_pmu.rst
Normal file
@ -0,0 +1,46 @@
|
||||
================================================
|
||||
StarFive StarLink Performance Monitor Unit (PMU)
|
||||
================================================
|
||||
|
||||
StarFive StarLink Performance Monitor Unit (PMU) exists within the
|
||||
StarLink Coherent Network on Chip (CNoC) that connects multiple CPU
|
||||
clusters with an L3 memory system.
|
||||
|
||||
The uncore PMU supports overflow interrupt, up to 16 programmable 64bit
|
||||
event counters, and an independent 64bit cycle counter.
|
||||
The PMU can only be accessed via Memory Mapped I/O and are common to the
|
||||
cores connected to the same PMU.
|
||||
|
||||
Driver exposes supported PMU events in sysfs "events" directory under::
|
||||
|
||||
/sys/bus/event_source/devices/starfive_starlink_pmu/events/
|
||||
|
||||
Driver exposes cpu used to handle PMU events in sysfs "cpumask" directory
|
||||
under::
|
||||
|
||||
/sys/bus/event_source/devices/starfive_starlink_pmu/cpumask/
|
||||
|
||||
Driver describes the format of config (event ID) in sysfs "format" directory
|
||||
under::
|
||||
|
||||
/sys/bus/event_source/devices/starfive_starlink_pmu/format/
|
||||
|
||||
Example of perf usage::
|
||||
|
||||
$ perf list
|
||||
|
||||
starfive_starlink_pmu/cycles/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/read_hit/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/read_miss/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/read_request/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/release_request/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/write_hit/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/write_miss/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/write_request/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/writeback/ [Kernel PMU event]
|
||||
|
||||
|
||||
$ perf stat -a -e /starfive_starlink_pmu/cycles/ sleep 1
|
||||
|
||||
Sampling is not supported. As a result, "perf record" is not supported.
|
||||
Attaching to a task is not supported, only system-wide counting is supported.
|
@ -300,8 +300,8 @@ platforms. The AMD P-States mechanism is the more performance and energy
|
||||
efficiency frequency management method on AMD processors.
|
||||
|
||||
|
||||
AMD Pstate Driver Operation Modes
|
||||
=================================
|
||||
``amd-pstate`` Driver Operation Modes
|
||||
======================================
|
||||
|
||||
``amd_pstate`` CPPC has 3 operation modes: autonomous (active) mode,
|
||||
non-autonomous (passive) mode and guided autonomous (guided) mode.
|
||||
@ -353,6 +353,48 @@ is activated. In this mode, driver requests minimum and maximum performance
|
||||
level and the platform autonomously selects a performance level in this range
|
||||
and appropriate to the current workload.
|
||||
|
||||
``amd-pstate`` Preferred Core
|
||||
=================================
|
||||
|
||||
The core frequency is subjected to the process variation in semiconductors.
|
||||
Not all cores are able to reach the maximum frequency respecting the
|
||||
infrastructure limits. Consequently, AMD has redefined the concept of
|
||||
maximum frequency of a part. This means that a fraction of cores can reach
|
||||
maximum frequency. To find the best process scheduling policy for a given
|
||||
scenario, OS needs to know the core ordering informed by the platform through
|
||||
highest performance capability register of the CPPC interface.
|
||||
|
||||
``amd-pstate`` preferred core enables the scheduler to prefer scheduling on
|
||||
cores that can achieve a higher frequency with lower voltage. The preferred
|
||||
core rankings can dynamically change based on the workload, platform conditions,
|
||||
thermals and ageing.
|
||||
|
||||
The priority metric will be initialized by the ``amd-pstate`` driver. The ``amd-pstate``
|
||||
driver will also determine whether or not ``amd-pstate`` preferred core is
|
||||
supported by the platform.
|
||||
|
||||
``amd-pstate`` driver will provide an initial core ordering when the system boots.
|
||||
The platform uses the CPPC interfaces to communicate the core ranking to the
|
||||
operating system and scheduler to make sure that OS is choosing the cores
|
||||
with highest performance firstly for scheduling the process. When ``amd-pstate``
|
||||
driver receives a message with the highest performance change, it will
|
||||
update the core ranking and set the cpu's priority.
|
||||
|
||||
``amd-pstate`` Preferred Core Switch
|
||||
=====================================
|
||||
Kernel Parameters
|
||||
-----------------
|
||||
|
||||
``amd-pstate`` peferred core`` has two states: enable and disable.
|
||||
Enable/disable states can be chosen by different kernel parameters.
|
||||
Default enable ``amd-pstate`` preferred core.
|
||||
|
||||
``amd_prefcore=disable``
|
||||
|
||||
For systems that support ``amd-pstate`` preferred core, the core rankings will
|
||||
always be advertised by the platform. But OS can choose to ignore that via the
|
||||
kernel parameter ``amd_prefcore=disable``.
|
||||
|
||||
User Space Interface in ``sysfs`` - General
|
||||
===========================================
|
||||
|
||||
@ -385,6 +427,19 @@ control its functionality at the system level. They are located in the
|
||||
to the operation mode represented by that string - or to be
|
||||
unregistered in the "disable" case.
|
||||
|
||||
``prefcore``
|
||||
Preferred core state of the driver: "enabled" or "disabled".
|
||||
|
||||
"enabled"
|
||||
Enable the ``amd-pstate`` preferred core.
|
||||
|
||||
"disabled"
|
||||
Disable the ``amd-pstate`` preferred core
|
||||
|
||||
|
||||
This attribute is read-only to check the state of preferred core set
|
||||
by the kernel parameter.
|
||||
|
||||
``cpupower`` tool support for ``amd-pstate``
|
||||
===============================================
|
||||
|
||||
|
@ -31,7 +31,7 @@ The important bits (aka "TL;DR")
|
||||
Linux kernel regression tracking bot "regzbot" track the issue by specifying
|
||||
when the regression started like this::
|
||||
|
||||
#regzbot introduced v5.13..v5.14-rc1
|
||||
#regzbot introduced: v5.13..v5.14-rc1
|
||||
|
||||
|
||||
All the details on Linux kernel regressions relevant for users
|
||||
|
@ -296,12 +296,30 @@ kernel panic). This will output the contents of the ftrace buffers to
|
||||
the console. This is very useful for capturing traces that lead to
|
||||
crashes and outputting them to a serial console.
|
||||
|
||||
= ===================================================
|
||||
0 Disabled (default).
|
||||
1 Dump buffers of all CPUs.
|
||||
2 Dump the buffer of the CPU that triggered the oops.
|
||||
= ===================================================
|
||||
======================= ===========================================
|
||||
0 Disabled (default).
|
||||
1 Dump buffers of all CPUs.
|
||||
2(orig_cpu) Dump the buffer of the CPU that triggered the
|
||||
oops.
|
||||
<instance> Dump the specific instance buffer on all CPUs.
|
||||
<instance>=2(orig_cpu) Dump the specific instance buffer on the CPU
|
||||
that triggered the oops.
|
||||
======================= ===========================================
|
||||
|
||||
Multiple instance dump is also supported, and instances are separated
|
||||
by commas. If global buffer also needs to be dumped, please specify
|
||||
the dump mode (1/2/orig_cpu) first for global buffer.
|
||||
|
||||
So for example to dump "foo" and "bar" instance buffer on all CPUs,
|
||||
user can::
|
||||
|
||||
echo "foo,bar" > /proc/sys/kernel/ftrace_dump_on_oops
|
||||
|
||||
To dump global buffer and "foo" instance buffer on all
|
||||
CPUs along with the "bar" instance buffer on CPU that triggered the
|
||||
oops, user can::
|
||||
|
||||
echo "1,foo,bar=2" > /proc/sys/kernel/ftrace_dump_on_oops
|
||||
|
||||
ftrace_enabled, stack_tracer_enabled
|
||||
====================================
|
||||
@ -594,6 +612,9 @@ default (``MSGMNB``).
|
||||
``msgmni`` is the maximum number of IPC queues. 32000 by default
|
||||
(``MSGMNI``).
|
||||
|
||||
All of these parameters are set per ipc namespace. The maximum number of bytes
|
||||
in POSIX message queues is limited by ``RLIMIT_MSGQUEUE``. This limit is
|
||||
respected hierarchically in the each user namespace.
|
||||
|
||||
msg_next_id, sem_next_id, and shm_next_id (System V IPC)
|
||||
========================================================
|
||||
@ -850,6 +871,7 @@ bit 3 print locks info if ``CONFIG_LOCKDEP`` is on
|
||||
bit 4 print ftrace buffer
|
||||
bit 5 print all printk messages in buffer
|
||||
bit 6 print all CPUs backtrace (if available in the arch)
|
||||
bit 7 print only tasks in uninterruptible (blocked) state
|
||||
===== ============================================
|
||||
|
||||
So for example to print tasks and memory info on panic, user can::
|
||||
@ -1274,15 +1296,20 @@ are doing anyway :)
|
||||
shmall
|
||||
======
|
||||
|
||||
This parameter sets the total amount of shared memory pages that
|
||||
can be used system wide. Hence, ``shmall`` should always be at least
|
||||
``ceil(shmmax/PAGE_SIZE)``.
|
||||
This parameter sets the total amount of shared memory pages that can be used
|
||||
inside ipc namespace. The shared memory pages counting occurs for each ipc
|
||||
namespace separately and is not inherited. Hence, ``shmall`` should always be at
|
||||
least ``ceil(shmmax/PAGE_SIZE)``.
|
||||
|
||||
If you are not sure what the default ``PAGE_SIZE`` is on your Linux
|
||||
system, you can run the following command::
|
||||
|
||||
# getconf PAGE_SIZE
|
||||
|
||||
To reduce or disable the ability to allocate shared memory, you must create a
|
||||
new ipc namespace, set this parameter to the required value and prohibit the
|
||||
creation of a new ipc namespace in the current user namespace or cgroups can
|
||||
be used.
|
||||
|
||||
shmmax
|
||||
======
|
||||
|
@ -39,13 +39,13 @@ aspects, all of which might be essential in your present case.]*
|
||||
developers**, execute just the *preparations* and *segment 1*; while doing so,
|
||||
consider the newest Linux kernel you regularly use to be the 'working' kernel.
|
||||
In the following example that's assumed to be 6.0.13, which is why the sources
|
||||
of v6.0 will be used to prepare the .config file.
|
||||
of 6.0 will be used to prepare the .config file.
|
||||
|
||||
**In case you face a regression**, follow the steps at least till the end of
|
||||
*segment 2*. Then you can submit a preliminary report -- or continue with
|
||||
*segment 3*, which describes how to perform a bisection needed for a
|
||||
full-fledged regression report. In the following example 6.0.13 is assumed to be
|
||||
the 'working' kernel and 6.1.5 to be the first 'broken', which is why v6.0
|
||||
the 'working' kernel and 6.1.5 to be the first 'broken', which is why 6.0
|
||||
will be considered the 'good' release and used to prepare the .config file.
|
||||
|
||||
* **Preparations**: set up everything to build your own kernels::
|
||||
@ -99,7 +99,8 @@ will be considered the 'good' release and used to prepare the .config file.
|
||||
# * Note: on Arch Linux, its derivatives and a few other distributions
|
||||
# the following commands will do nothing at all or only part of the
|
||||
# job. See the step-by-step guide for further details.
|
||||
command -v installkernel && sudo make modules_install install
|
||||
sudo make modules_install
|
||||
command -v installkernel && sudo make install
|
||||
# * Check how much space your self-built kernel actually needs, which
|
||||
# enables you to make better estimates later:
|
||||
du -ch /boot/*$(make -s kernelrelease)* | tail -n 1
|
||||
@ -112,6 +113,7 @@ will be considered the 'good' release and used to prepare the .config file.
|
||||
# checking if the output of the next two commands matches:
|
||||
tail -n 1 ~/kernels-built
|
||||
uname -r
|
||||
cat /proc/sys/kernel/tainted
|
||||
|
||||
c) Check if the problem occurs with this kernel as well.
|
||||
|
||||
@ -230,9 +232,10 @@ developers are obliged to act upon.
|
||||
:ref:`Supplementary tasks: cleanup during and after following this guide.<introclosure_bissbs>`
|
||||
|
||||
The steps in each segment illustrate the important aspects of the process, while
|
||||
a comprehensive reference section holds additional details. The latter sometimes
|
||||
also outlines alternative approaches, pitfalls, as well as problems that might
|
||||
occur at the particular step -- and how to get things rolling again.
|
||||
a comprehensive reference section holds additional details for almost all of the
|
||||
steps. The reference section sometimes also outlines alternative approaches,
|
||||
pitfalls, as well as problems that might occur at the particular step -- and how
|
||||
to get things rolling again.
|
||||
|
||||
For further details on how to report Linux kernel issues or regressions check
|
||||
out Documentation/admin-guide/reporting-issues.rst, which works in conjunction
|
||||
@ -283,23 +286,23 @@ Preparations: set up everything to build your own kernels
|
||||
Do you follow this guide to verify if a bug is present in the code developers
|
||||
care for? Then consider the mainline release your 'working' kernel (the newest
|
||||
one you regularly use) is based on to be the 'good' version; if your 'working'
|
||||
kernel for example is '6.0.11', then your 'good' kernel is 'v6.0'.
|
||||
kernel for example is 6.0.11, then your 'good' kernel is 6.0.
|
||||
|
||||
In case you face a regression, it depends on the version range where the
|
||||
regression was introduced:
|
||||
|
||||
* Something which used to work in Linux 6.0 broke when switching to Linux
|
||||
6.1-rc1? Then henceforth regard 'v6.0' as the last known 'good' version
|
||||
and 'v6.1-rc1' as the first 'bad' one.
|
||||
6.1-rc1? Then henceforth regard 6.0 as the last known 'good' version
|
||||
and 6.1-rc1 as the first 'bad' one.
|
||||
|
||||
* Some function stopped working when updating from 6.0.11 to 6.1.4? Then for
|
||||
the time being consider 'v6.0' as the last 'good' version and 'v6.1.4' as
|
||||
the time being consider 6.0 as the last 'good' version and 6.1.4 as
|
||||
the 'bad' one. Note, at this point it is merely assumed that 6.0 is fine;
|
||||
this assumption will be checked in segment 2.
|
||||
|
||||
* A feature you used in 6.0.11 does not work at all or worse in 6.1.13? In
|
||||
that case you want to bisect within a stable/longterm series: consider
|
||||
'v6.0.11' as the last known 'good' version and 'v6.0.13' as the first 'bad'
|
||||
6.0.11 as the last known 'good' version and 6.0.13 as the first 'bad'
|
||||
one. Note, in this case you still want to compile and test a mainline kernel
|
||||
as explained in segment 1: the outcome will determine if you need to report
|
||||
your issue to the regular developers or the stable team.
|
||||
@ -349,7 +352,7 @@ Preparations: set up everything to build your own kernels
|
||||
internet connections.*
|
||||
|
||||
Execute the following command to retrieve a fresh mainline codebase while
|
||||
preparing things to add stable/longterm branches later::
|
||||
preparing things to add branches for stable/longterm series later::
|
||||
|
||||
git clone -o mainline --no-checkout \
|
||||
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ~/linux/
|
||||
@ -368,14 +371,19 @@ Preparations: set up everything to build your own kernels
|
||||
identifier using ``uname -r``.
|
||||
|
||||
Afterwards check out the source code for the version earlier established as
|
||||
'good' (in this example this is assumed to be 6.0) and create a .config file::
|
||||
'good'. In the following example command this is assumed to be 6.0; note that
|
||||
the version number in this and all later Git commands needs to be prefixed
|
||||
with a 'v'::
|
||||
|
||||
git checkout --detach v6.0
|
||||
|
||||
Now create a build configuration file::
|
||||
|
||||
make olddefconfig
|
||||
|
||||
The second command will try to locate the build configuration file for the
|
||||
running kernel and then adjust it for the needs of the kernel sources you
|
||||
checked out. While doing so, it will print a few lines you need to check.
|
||||
The kernel build scripts then will try to locate the build configuration file
|
||||
for the running kernel and then adjust it for the needs of the kernel sources
|
||||
you checked out. While doing so, it will print a few lines you need to check.
|
||||
|
||||
Look out for a line starting with '# using defaults found in'. It should be
|
||||
followed by a path to a file in '/boot/' that contains the release identifier
|
||||
@ -520,44 +528,32 @@ be a waste of time. [:ref:`details<introlatestcheck_bisref>`]
|
||||
|
||||
* Install your newly built kernel.
|
||||
|
||||
Before doing so, consider checking if there is still enough room for it::
|
||||
Before doing so, consider checking if there is still enough space for it::
|
||||
|
||||
df -h /boot/ /lib/modules/
|
||||
|
||||
150 MByte in /boot/ and 200 in /lib/modules/ usually suffice. Those are rough
|
||||
estimates assuming the worst case. How much your kernels actually require will
|
||||
be determined later.
|
||||
For now assume 150 MByte in /boot/ and 200 in /lib/modules/ will suffice; how
|
||||
much your kernels actually require will be determined later during this guide.
|
||||
|
||||
Now install the kernel, which will be saved in parallel to the kernels from
|
||||
your Linux distribution::
|
||||
Now install the kernel's modules and its image, which will be stored in
|
||||
parallel to the your Linux distribution's kernels::
|
||||
|
||||
command -v installkernel && sudo make modules_install install
|
||||
sudo make modules_install
|
||||
command -v installkernel && sudo make install
|
||||
|
||||
On many commodity Linux distributions this will take care of everything
|
||||
required to boot your kernel. You might want to ensure that's the case by
|
||||
checking if your boot loader's configuration was updated; furthermore ensure
|
||||
an initramfs (also known as initrd) exists, which on many distributions can be
|
||||
achieved by running ``ls -l /boot/init*$(make -s kernelrelease)*``. Those
|
||||
steps are recommended, as there are quite a few Linux distribution where above
|
||||
command is insufficient:
|
||||
The second command ideally will take care of three steps required at this
|
||||
point: copying the kernel's image to /boot/, generating an initramfs, and
|
||||
adding an entry for both to the boot loader's configuration.
|
||||
|
||||
* On Arch Linux, its derivatives, many immutable Linux distributions, and a
|
||||
few others the above command does nothing at, as they lack 'installkernel'
|
||||
executable.
|
||||
Sadly some distributions (among them Arch Linux, its derivatives, and many
|
||||
immutable Linux distributions) will perform none or only some of those tasks.
|
||||
You therefore want to check if all of them were taken care of and manually
|
||||
perform those that were not. The reference section provides further details on
|
||||
that; your distribution's documentation might help, too.
|
||||
|
||||
* Some distributions install the kernel, but don't add an entry for your
|
||||
kernel in your boot loader's configuration -- the kernel thus won't show up
|
||||
in the boot menu.
|
||||
|
||||
* Some distributions add a boot loader menu entry, but don't create an
|
||||
initramfs on installation -- in that case your kernel most likely will be
|
||||
unable to mount the root partition during bootup.
|
||||
|
||||
If any of that applies to you, see the reference section for further guidance.
|
||||
Once you figured out what to do, consider writing down the necessary
|
||||
installation steps: if you will build more kernels as described in
|
||||
segment 2 and 3, you will have to execute these commands every time that
|
||||
``command -v installkernel [...]`` comes up again.
|
||||
Once you figured out the steps needed at this point, consider writing them
|
||||
down: if you will build more kernels as described in segment 2 and 3, you will
|
||||
have to perform those again after executing ``command -v installkernel [...]``.
|
||||
|
||||
[:ref:`details<install_bisref>`]
|
||||
|
||||
@ -583,31 +579,40 @@ be a waste of time. [:ref:`details<introlatestcheck_bisref>`]
|
||||
Remember the identifier momentarily, as it will help you pick the right kernel
|
||||
from the boot menu upon restarting.
|
||||
|
||||
.. _recheckbroken_bissbs:
|
||||
|
||||
* Reboot into the kernel you just built and check if the feature that is
|
||||
expected to be broken really is.
|
||||
|
||||
Start by making sure the kernel you booted is the one you just built. When
|
||||
unsure, check if the output of these commands show the exact same release
|
||||
identifier::
|
||||
* Reboot into your newly built kernel. To ensure your actually started the one
|
||||
you just built, you might want to verify if the output of these commands
|
||||
matches::
|
||||
|
||||
tail -n 1 ~/kernels-built
|
||||
uname -r
|
||||
|
||||
Now verify if the feature that causes trouble works with your newly built
|
||||
kernel. If things work while investigating a regression, check the reference
|
||||
section for further details.
|
||||
.. _tainted_bissbs:
|
||||
|
||||
* Check if the kernel marked itself as 'tainted'::
|
||||
|
||||
cat /proc/sys/kernel/tainted
|
||||
|
||||
If that command does not return '0', check the reference section, as the cause
|
||||
for this might interfere with your testing.
|
||||
|
||||
[:ref:`details<tainted_bisref>`]
|
||||
|
||||
.. _recheckbroken_bissbs:
|
||||
|
||||
* Verify if your bug occurs with the newly built kernel. If it does not, check
|
||||
out the instructions in the reference section to ensure nothing went sideways
|
||||
during your tests.
|
||||
|
||||
[:ref:`details<recheckbroken_bisref>`]
|
||||
|
||||
.. _recheckstablebroken_bissbs:
|
||||
|
||||
* Are you facing a problem within a stable/longterm release, but failed to
|
||||
reproduce it with the mainline kernel you just built? Then check if the latest
|
||||
codebase for the particular series might already fix the problem. To do so,
|
||||
add the stable series Git branch for your 'good' kernel (again, this here is
|
||||
assumed to be 6.0) and check out the latest version::
|
||||
* Are you facing a problem within a stable/longterm series, but failed to
|
||||
reproduce it with the mainline kernel you just built? One that according to
|
||||
the `front page of kernel.org <https://kernel.org/>`_ is still supported? Then
|
||||
check if the latest codebase for the particular series might already fix the
|
||||
problem. To do so, add the stable series Git branch for your 'good' kernel
|
||||
(again, this here is assumed to be 6.0) and check out the latest version::
|
||||
|
||||
cd ~/linux/
|
||||
git remote set-branches --add stable linux-6.0.y
|
||||
@ -622,22 +627,26 @@ be a waste of time. [:ref:`details<introlatestcheck_bisref>`]
|
||||
make -j $(nproc --all)
|
||||
# * Check if the free space suffices holding another kernel:
|
||||
df -h /boot/ /lib/modules/
|
||||
command -v installkernel && sudo make modules_install install
|
||||
sudo make modules_install
|
||||
command -v installkernel && sudo make install
|
||||
make -s kernelrelease | tee -a ~/kernels-built
|
||||
reboot
|
||||
|
||||
Now verify if you booted the kernel you intended to start, to then check if
|
||||
everything works fine with this kernel::
|
||||
Confirm you booted the kernel you intended to start and check its tainted
|
||||
status::
|
||||
|
||||
tail -n 1 ~/kernels-built
|
||||
uname -r
|
||||
cat /proc/sys/kernel/tainted
|
||||
|
||||
Now verify if this kernel is showing the problem.
|
||||
|
||||
[:ref:`details<recheckstablebroken_bisref>`]
|
||||
|
||||
Do you follow this guide to verify if a problem is present in the code
|
||||
currently supported by Linux kernel developers? Then you are done at this
|
||||
point. If you later want to remove the kernel you just built, check out
|
||||
:ref:`Supplementary tasks: cleanup during and after following this guide.<introclosure_bissbs>`.
|
||||
:ref:`Supplementary tasks: cleanup during and after following this guide<introclosure_bissbs>`.
|
||||
|
||||
In case you face a regression, move on and execute at least the next segment
|
||||
as well.
|
||||
@ -670,12 +679,13 @@ otherwise would be a waste of time. [:ref:`details<introworkingcheck_bisref>`]
|
||||
make -j $(nproc --all)
|
||||
# * Check if the free space suffices holding another kernel:
|
||||
df -h /boot/ /lib/modules/
|
||||
command -v installkernel && sudo make modules_install install
|
||||
sudo make modules_install
|
||||
command -v installkernel && sudo make install
|
||||
make -s kernelrelease | tee -a ~/kernels-built
|
||||
reboot
|
||||
|
||||
When the system booted, you may want to verify once again that the
|
||||
kernel you started is the one you just built:
|
||||
kernel you started is the one you just built::
|
||||
|
||||
tail -n 1 ~/kernels-built
|
||||
uname -r
|
||||
@ -698,7 +708,7 @@ configuration created earlier this works a lot faster than many people assume:
|
||||
overall on average it will often just take about 10 to 15 minutes to compile
|
||||
each kernel on commodity x86 machines.
|
||||
|
||||
* In case your 'bad' version is a stable/longterm release (say v6.1.5), add its
|
||||
* In case your 'bad' version is a stable/longterm release (say 6.1.5), add its
|
||||
stable branch, unless you already did so earlier::
|
||||
|
||||
cd ~/linux/
|
||||
@ -727,7 +737,8 @@ each kernel on commodity x86 machines.
|
||||
make -j $(nproc --all)
|
||||
# * Check if the free space suffices holding another kernel:
|
||||
df -h /boot/ /lib/modules/
|
||||
command -v installkernel && sudo make modules_install install
|
||||
sudo make modules_install
|
||||
command -v installkernel && sudo make install
|
||||
make -s kernelrelease | tee -a ~/kernels-built
|
||||
reboot
|
||||
|
||||
@ -843,7 +854,8 @@ each kernel on commodity x86 machines.
|
||||
make -j $(nproc --all) &&
|
||||
# * Check if the free space suffices holding another kernel:
|
||||
df -h /boot/ /lib/modules/
|
||||
command -v installkernel && sudo make modules_install install
|
||||
sudo make modules_install
|
||||
command -v installkernel && sudo make install
|
||||
Make -s kernelrelease | tee -a ~/kernels-built
|
||||
reboot
|
||||
|
||||
@ -1126,12 +1138,12 @@ Git clone of Linus' mainline repository. There is nothing more to say about
|
||||
that -- but there are two alternatives ways to retrieve the sources that might
|
||||
work better for you:
|
||||
|
||||
* If you have an unreliable internet connection, consider
|
||||
:ref:`using a 'Git bundle'<sources_bundle_bisref>`.
|
||||
* If you have an unreliable internet connection, consider
|
||||
:ref:`using a 'Git bundle'<sources_bundle_bisref>`.
|
||||
|
||||
* If downloading the complete repository would take too long or requires too
|
||||
much storage space, consider :ref:`using a 'shallow
|
||||
clone'<sources_shallow_bisref>`.
|
||||
* If downloading the complete repository would take too long or requires too
|
||||
much storage space, consider :ref:`using a 'shallow
|
||||
clone'<sources_shallow_bisref>`.
|
||||
|
||||
.. _sources_bundle_bisref:
|
||||
|
||||
@ -1183,23 +1195,23 @@ branches as explained in the step-by-step guide.
|
||||
|
||||
Note, shallow clones have a few peculiar characteristics:
|
||||
|
||||
* For bisections the history needs to be deepened a few mainline versions
|
||||
farther than it seems necessary, as explained above already. That's because
|
||||
Git otherwise will be unable to revert or describe most of the commits within
|
||||
a range (say v6.1..v6.2), as they are internally based on earlier kernels
|
||||
releases (like v6.0-rc2 or 5.19-rc3).
|
||||
* For bisections the history needs to be deepened a few mainline versions
|
||||
farther than it seems necessary, as explained above already. That's because
|
||||
Git otherwise will be unable to revert or describe most of the commits within
|
||||
a range (say 6.1..6.2), as they are internally based on earlier kernels
|
||||
releases (like 6.0-rc2 or 5.19-rc3).
|
||||
|
||||
* This document in most places uses ``git fetch`` with ``--shallow-exclude=``
|
||||
to specify the earliest version you care about (or to be precise: its git
|
||||
tag). You alternatively can use the parameter ``--shallow-since=`` to specify
|
||||
an absolute (say ``'2023-07-15'``) or relative (``'12 months'``) date to
|
||||
define the depth of the history you want to download. When using them while
|
||||
bisecting mainline, ensure to deepen the history to at least 7 months before
|
||||
the release of the mainline release your 'good' kernel is based on.
|
||||
* This document in most places uses ``git fetch`` with ``--shallow-exclude=``
|
||||
to specify the earliest version you care about (or to be precise: its git
|
||||
tag). You alternatively can use the parameter ``--shallow-since=`` to specify
|
||||
an absolute (say ``'2023-07-15'``) or relative (``'12 months'``) date to
|
||||
define the depth of the history you want to download. When using them while
|
||||
bisecting mainline, ensure to deepen the history to at least 7 months before
|
||||
the release of the mainline release your 'good' kernel is based on.
|
||||
|
||||
* Be warned, when deepening your clone you might encounter an error like
|
||||
'fatal: error in object: unshallow cafecaca0c0dacafecaca0c0dacafecaca0c0da'.
|
||||
In that case run ``git repack -d`` and try again.
|
||||
* Be warned, when deepening your clone you might encounter an error like
|
||||
'fatal: error in object: unshallow cafecaca0c0dacafecaca0c0dacafecaca0c0da'.
|
||||
In that case run ``git repack -d`` and try again.
|
||||
|
||||
[:ref:`back to step-by-step guide <sources_bissbs>`]
|
||||
[:ref:`back to section intro <sources_bisref>`]
|
||||
@ -1223,23 +1235,23 @@ locate the right build configuration.*
|
||||
|
||||
Two things can easily go wrong when creating a .config file as advised:
|
||||
|
||||
* The oldconfig target will use a .config file from your build directory, if
|
||||
one is already present there (e.g. '~/linux/.config'). That's totally fine if
|
||||
that's what you intend (see next step), but in all other cases you want to
|
||||
delete it. This for example is important in case you followed this guide
|
||||
further, but due to problems come back here to redo the configuration from
|
||||
scratch.
|
||||
* The oldconfig target will use a .config file from your build directory, if
|
||||
one is already present there (e.g. '~/linux/.config'). That's totally fine if
|
||||
that's what you intend (see next step), but in all other cases you want to
|
||||
delete it. This for example is important in case you followed this guide
|
||||
further, but due to problems come back here to redo the configuration from
|
||||
scratch.
|
||||
|
||||
* Sometimes olddefconfig is unable to locate the .config file for your running
|
||||
kernel and will use defaults, as briefly outlined in the guide. In that case
|
||||
check if your distribution ships the configuration somewhere and manually put
|
||||
it in the right place (e.g. '~/linux/.config') if it does. On distributions
|
||||
where /proc/config.gz exists this can be achieved using this command::
|
||||
* Sometimes olddefconfig is unable to locate the .config file for your running
|
||||
kernel and will use defaults, as briefly outlined in the guide. In that case
|
||||
check if your distribution ships the configuration somewhere and manually put
|
||||
it in the right place (e.g. '~/linux/.config') if it does. On distributions
|
||||
where /proc/config.gz exists this can be achieved using this command::
|
||||
|
||||
zcat /proc/config.gz > .config
|
||||
zcat /proc/config.gz > .config
|
||||
|
||||
Once you put it there, run ``make olddefconfig`` again to adjust it to the
|
||||
needs of the kernel about to be built.
|
||||
Once you put it there, run ``make olddefconfig`` again to adjust it to the
|
||||
needs of the kernel about to be built.
|
||||
|
||||
Note, the olddefconfig target will set any undefined build options to their
|
||||
default value. If you prefer to set such configuration options manually, use
|
||||
@ -1252,7 +1264,7 @@ restrictions).
|
||||
|
||||
Occasionally odd things happen when trying to use a config file prepared for one
|
||||
kernel (say 6.1) on an older mainline release -- especially if it is much older
|
||||
(say v5.15). That's one of the reasons why the previous step in the guide told
|
||||
(say 5.15). That's one of the reasons why the previous step in the guide told
|
||||
you to boot the kernel where everything works. If you manually add a .config
|
||||
file you thus want to ensure it's from the working kernel and not from a one
|
||||
that shows the regression.
|
||||
@ -1381,16 +1393,16 @@ when following this guide on a few commodity distributions.
|
||||
|
||||
**Debian:**
|
||||
|
||||
* Remove a stale reference to a certificate file that would cause your build to
|
||||
fail::
|
||||
* Remove a stale reference to a certificate file that would cause your build to
|
||||
fail::
|
||||
|
||||
./scripts/config --set-str SYSTEM_TRUSTED_KEYS ''
|
||||
./scripts/config --set-str SYSTEM_TRUSTED_KEYS ''
|
||||
|
||||
Alternatively, download the needed certificate and make that configuration
|
||||
option point to it, as `the Debian handbook explains in more detail
|
||||
<https://debian-handbook.info/browse/stable/sect.kernel-compilation.html>`_
|
||||
-- or generate your own, as explained in
|
||||
Documentation/admin-guide/module-signing.rst.
|
||||
Alternatively, download the needed certificate and make that configuration
|
||||
option point to it, as `the Debian handbook explains in more detail
|
||||
<https://debian-handbook.info/browse/stable/sect.kernel-compilation.html>`_
|
||||
-- or generate your own, as explained in
|
||||
Documentation/admin-guide/module-signing.rst.
|
||||
|
||||
[:ref:`back to step-by-step guide <configmods_bissbs>`]
|
||||
|
||||
@ -1402,12 +1414,12 @@ Individual adjustments
|
||||
*If you want to influence the other aspects of the configuration, do so
|
||||
now.* [:ref:`... <configmods_bissbs>`]
|
||||
|
||||
You at this point can use a command like ``make menuconfig`` to enable or
|
||||
disable certain features using a text-based user interface; to use a graphical
|
||||
configuration utility, call the make target ``xconfig`` or ``gconfig`` instead.
|
||||
All of them require development libraries from toolkits they are based on
|
||||
(ncurses, Qt5, Gtk2); an error message will tell you if something required is
|
||||
missing.
|
||||
At this point you can use a command like ``make menuconfig`` or ``make nconfig``
|
||||
to enable or disable certain features using a text-based user interface; to use
|
||||
a graphical configuration utility, run ``make xconfig`` instead. Both of them
|
||||
require development libraries from toolkits they are rely on (ncurses
|
||||
respectively Qt5 or Qt6); an error message will tell you if something required
|
||||
is missing.
|
||||
|
||||
[:ref:`back to step-by-step guide <configmods_bissbs>`]
|
||||
|
||||
@ -1484,10 +1496,10 @@ highly recommended for these reasons:
|
||||
|
||||
.. _checkoutmaster_bisref:
|
||||
|
||||
Checkout the latest Linux codebase
|
||||
----------------------------------
|
||||
Check out the latest Linux codebase
|
||||
-----------------------------------
|
||||
|
||||
*Checkout the latest Linux codebase.*
|
||||
*Check out the latest Linux codebase.*
|
||||
[:ref:`... <introlatestcheck_bissbs>`]
|
||||
|
||||
In case you later want to recheck if an ever newer codebase might fix the
|
||||
@ -1515,7 +1527,7 @@ When a build error occurs, it might be caused by some aspect of your machine's
|
||||
setup that often can be fixed quickly; other times though the problem lies in
|
||||
the code and can only be fixed by a developer. A close examination of the
|
||||
failure messages coupled with some research on the internet will often tell you
|
||||
which of the two it is. To perform such a investigation, restart the build
|
||||
which of the two it is. To perform such investigation, restart the build
|
||||
process like this::
|
||||
|
||||
make V=1
|
||||
@ -1538,10 +1550,10 @@ often one of the hits will provide a solution for your problem, too. If you
|
||||
do not find anything that matches your problem, try again from a different angle
|
||||
by modifying your search terms or using another line from the error messages.
|
||||
|
||||
In the end, most trouble you are to run into has likely been encountered and
|
||||
In the end, most issues you run into have likely been encountered and
|
||||
reported by others already. That includes issues where the cause is not your
|
||||
system, but lies the code. If you run into one of those, you might thus find a
|
||||
solution (e.g. a patch) or workaround for your problem, too.
|
||||
system, but lies in the code. If you run into one of those, you might thus find a
|
||||
solution (e.g. a patch) or workaround for your issue, too.
|
||||
|
||||
Package your kernel up
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
@ -1551,11 +1563,11 @@ The step-by-step guide uses the default make targets (e.g. 'bzImage' and
|
||||
steps of the guide then install. You instead can also directly build everything
|
||||
and directly package it up by using one of the following targets:
|
||||
|
||||
* ``make -j $(nproc --all) bindeb-pkg`` to generate a deb package
|
||||
* ``make -j $(nproc --all) bindeb-pkg`` to generate a deb package
|
||||
|
||||
* ``make -j $(nproc --all) binrpm-pkg`` to generate a rpm package
|
||||
* ``make -j $(nproc --all) binrpm-pkg`` to generate a rpm package
|
||||
|
||||
* ``make -j $(nproc --all) tarbz2-pkg`` to generate a bz2 compressed tarball
|
||||
* ``make -j $(nproc --all) tarbz2-pkg`` to generate a bz2 compressed tarball
|
||||
|
||||
This is just a selection of available make targets for this purpose, see
|
||||
``make help`` for others. You can also use these targets after running
|
||||
@ -1580,39 +1592,38 @@ Put the kernel in place
|
||||
*Install the kernel you just built.* [:ref:`... <install_bissbs>`]
|
||||
|
||||
What you need to do after executing the command in the step-by-step guide
|
||||
depends on the existence and the implementation of an ``installkernel``
|
||||
executable. Many commodity Linux distributions ship such a kernel installer in
|
||||
'/sbin/' that does everything needed, hence there is nothing left for you
|
||||
except rebooting. But some distributions contain an installkernel that does
|
||||
only part of the job -- and a few lack it completely and leave all the work to
|
||||
you.
|
||||
depends on the existence and the implementation of ``/sbin/installkernel``
|
||||
executable on your distribution.
|
||||
|
||||
If ``installkernel`` is found, the kernel's build system will delegate the
|
||||
actual installation of your kernel's image and related files to this executable.
|
||||
On almost all Linux distributions it will store the image as '/boot/vmlinuz-
|
||||
<kernelrelease identifier>' and put a 'System.map-<kernelrelease
|
||||
identifier>' alongside it. Your kernel will thus be installed in parallel to any
|
||||
existing ones, unless you already have one with exactly the same release name.
|
||||
If installkernel is found, the kernel's build system will delegate the actual
|
||||
installation of your kernel image to this executable, which then performs some
|
||||
or all of these tasks:
|
||||
|
||||
Installkernel on many distributions will afterwards generate an 'initramfs'
|
||||
(often also called 'initrd'), which commodity distributions rely on for booting;
|
||||
hence be sure to keep the order of the two make targets used in the step-by-step
|
||||
guide, as things will go sideways if you install your kernel's image before its
|
||||
modules. Often installkernel will then add your kernel to the bootloader
|
||||
configuration, too. You have to take care of one or both of these tasks
|
||||
yourself, if your distributions installkernel doesn't handle them.
|
||||
* On almost all Linux distributions installkernel will store your kernel's
|
||||
image in /boot/, usually as '/boot/vmlinuz-<kernelrelease_id>'; often it will
|
||||
put a 'System.map-<kernelrelease_id>' alongside it.
|
||||
|
||||
A few distributions like Arch Linux and its derivatives totally lack an
|
||||
installkernel executable. On those just install the modules using the kernel's
|
||||
build system and then install the image and the System.map file manually::
|
||||
* On most distributions installkernel will then generate an 'initramfs'
|
||||
(sometimes also called 'initrd'), which usually are stored as
|
||||
'/boot/initramfs-<kernelrelease_id>.img' or
|
||||
'/boot/initrd-<kernelrelease_id>'. Commodity distributions rely on this file
|
||||
for booting, hence ensure to execute the make target 'modules_install' first,
|
||||
as your distribution's initramfs generator otherwise will be unable to find
|
||||
the modules that go into the image.
|
||||
|
||||
* On some distributions installkernel will then add an entry for your kernel
|
||||
to your bootloader's configuration.
|
||||
|
||||
You have to take care of some or all of the tasks yourself, if your
|
||||
distribution lacks a installkernel script or does only handle part of them.
|
||||
Consult the distribution's documentation for details. If in doubt, install the
|
||||
kernel manually::
|
||||
|
||||
sudo make modules_install
|
||||
sudo install -m 0600 $(make -s image_name) /boot/vmlinuz-$(make -s kernelrelease)
|
||||
sudo install -m 0600 System.map /boot/System.map-$(make -s kernelrelease)
|
||||
|
||||
If your distribution boots with the help of an initramfs, now generate one for
|
||||
your kernel using the tools your distribution provides for this process.
|
||||
Afterwards add your kernel to your bootloader configuration and reboot.
|
||||
Now generate your initramfs using the tools your distribution provides for this
|
||||
process. Afterwards add your kernel to your bootloader configuration and reboot.
|
||||
|
||||
[:ref:`back to step-by-step guide <install_bissbs>`]
|
||||
|
||||
@ -1637,20 +1648,39 @@ need to look in different places.
|
||||
|
||||
[:ref:`back to step-by-step guide <storagespace_bissbs>`]
|
||||
|
||||
.. _tainted_bisref:
|
||||
|
||||
Check if your newly built kernel considers itself 'tainted'
|
||||
-----------------------------------------------------------
|
||||
|
||||
*Check if the kernel marked itself as 'tainted'.*
|
||||
[:ref:`... <tainted_bissbs>`]
|
||||
|
||||
Linux marks itself as tainted when something happens that potentially leads to
|
||||
follow-up errors that look totally unrelated. That is why developers might
|
||||
ignore or react scantly to reports from tainted kernels -- unless of course the
|
||||
kernel set the flag right when the reported bug occurred.
|
||||
|
||||
That's why you want check why a kernel is tainted as explained in
|
||||
Documentation/admin-guide/tainted-kernels.rst; doing so is also in your own
|
||||
interest, as your testing might be flawed otherwise.
|
||||
|
||||
[:ref:`back to step-by-step guide <tainted_bissbs>`]
|
||||
|
||||
.. _recheckbroken_bisref:
|
||||
|
||||
Check the kernel built from the latest codebase
|
||||
-----------------------------------------------
|
||||
Check the kernel built from a recent mainline codebase
|
||||
------------------------------------------------------
|
||||
|
||||
*Reboot into the kernel you just built and check if the feature that regressed
|
||||
is really broken there.* [:ref:`... <recheckbroken_bissbs>`]
|
||||
*Verify if your bug occurs with the newly built kernel.*
|
||||
[:ref:`... <recheckbroken_bissbs>`]
|
||||
|
||||
There are a couple of reasons why the regression you face might not show up with
|
||||
your own kernel built from the latest codebase. These are the most frequent:
|
||||
There are a couple of reasons why your bug or regression might not show up with
|
||||
the kernel you built from the latest codebase. These are the most frequent:
|
||||
|
||||
* The cause for the regression was fixed meanwhile.
|
||||
* The bug was fixed meanwhile.
|
||||
|
||||
* The regression with the broken kernel was caused by a change in the build
|
||||
* What you suspected to be a regression was caused by a change in the build
|
||||
configuration the provider of your kernel carried out.
|
||||
|
||||
* Your problem might be a race condition that does not show up with your kernel;
|
||||
@ -1702,9 +1732,9 @@ it's possible that the thing that regressed might never have worked in vanilla
|
||||
builds of the 'good' version in the first place.
|
||||
|
||||
There is a third reason for those that noticed a regression between
|
||||
stable/longterm kernels of different series (e.g. v6.0.13..v6.1.5): it will
|
||||
stable/longterm kernels of different series (e.g. 6.0.13..6.1.5): it will
|
||||
ensure the kernel version you assumed to be 'good' earlier in the process (e.g.
|
||||
v6.0) actually is working.
|
||||
6.0) actually is working.
|
||||
|
||||
[:ref:`back to step-by-step guide <introworkingcheck_bissbs>`]
|
||||
|
||||
@ -1720,6 +1750,9 @@ In case the feature that broke with newer kernels does not work with your first
|
||||
self-built kernel, find and resolve the cause before moving on. There are a
|
||||
multitude of reasons why this might happen. Some ideas where to look:
|
||||
|
||||
* Check the taint status and the output of ``dmesg``, maybe something unrelated
|
||||
went wrong.
|
||||
|
||||
* Maybe localmodconfig did something odd and disabled the module required to
|
||||
test the feature? Then you might want to recreate a .config file based on the
|
||||
one from the last working kernel and skip trimming it down; manually disabling
|
||||
@ -1734,8 +1767,8 @@ multitude of reasons why this might happen. Some ideas where to look:
|
||||
|
||||
Note, if you found and fixed problems with the .config file, you want to use it
|
||||
to build another kernel from the latest codebase, as your earlier tests with
|
||||
mainline and the latest version from an affected stable/longterm series most
|
||||
likely has been flawed.
|
||||
mainline and the latest version from an affected stable/longterm series were most
|
||||
likely flawed.
|
||||
|
||||
[:ref:`back to step-by-step guide <recheckworking_bissbs>`]
|
||||
|
||||
@ -1748,8 +1781,8 @@ Start the bisection
|
||||
'good' and 'bad'.* [:ref:`... <bisectstart_bissbs>`]
|
||||
|
||||
This will start the bisection process; the last of the commands will make Git
|
||||
checkout a commit round about half-way between the 'good' and the 'bad' changes
|
||||
for your to test.
|
||||
check out a commit round about half-way between the 'good' and the 'bad' changes
|
||||
for you to test.
|
||||
|
||||
[:ref:`back to step-by-step guide <bisectstart_bissbs>`]
|
||||
|
||||
@ -1774,7 +1807,7 @@ There are two things worth of note here:
|
||||
* Those slightly odd looking version identifiers can happen during bisections,
|
||||
because the Linux kernel subsystems prepare their changes for a new mainline
|
||||
release (say 6.2) before its predecessor (e.g. 6.1) is finished. They thus
|
||||
base them on a somewhat earlier point like v6.1-rc1 or even v6.0 -- and then
|
||||
base them on a somewhat earlier point like 6.1-rc1 or even 6.0 -- and then
|
||||
get merged for 6.2 without rebasing nor squashing them once 6.1 is out. This
|
||||
leads to those slightly odd looking version identifiers coming up during
|
||||
bisections.
|
||||
@ -1790,7 +1823,7 @@ Bisection checkpoint
|
||||
[:ref:`... <bisecttest_bissbs>`]
|
||||
|
||||
Ensure what you tell Git is accurate: getting it wrong just one time will bring
|
||||
the rest of the bisection totally of course, hence all testing after that point
|
||||
the rest of the bisection totally off course, hence all testing after that point
|
||||
will be for nothing.
|
||||
|
||||
[:ref:`back to step-by-step guide <bisecttest_bissbs>`]
|
||||
@ -1811,7 +1844,7 @@ instead of testing ten or more kernels you might only have to build a few to
|
||||
resolve things.
|
||||
|
||||
The .config file is put aside, as there is a decent chance that developers might
|
||||
ask for it after you reported the regression.
|
||||
ask for it after you report the regression.
|
||||
|
||||
[:ref:`back to step-by-step guide <bisectlog_bissbs>`]
|
||||
|
||||
@ -1861,7 +1894,7 @@ simply remove its modules directory in /lib/modules/.
|
||||
|
||||
The other place is /boot/, where typically two up to five files will be placed
|
||||
during installation of a kernel. All of them usually contain the release name in
|
||||
their file name, but how many files and their exact name depends somewhat on
|
||||
their file name, but how many files and their exact names depend somewhat on
|
||||
your distribution's installkernel executable and its initramfs generator. On
|
||||
some distributions the ``kernel-install remove...`` command mentioned in the
|
||||
step-by-step guide will delete all of these files for you while also removing
|
||||
|
@ -317,6 +317,55 @@ HWCAP2_LRCPC3
|
||||
HWCAP2_LSE128
|
||||
Functionality implied by ID_AA64ISAR0_EL1.Atomic == 0b0011.
|
||||
|
||||
HWCAP2_FPMR
|
||||
Functionality implied by ID_AA64PFR2_EL1.FMR == 0b0001.
|
||||
|
||||
HWCAP2_LUT
|
||||
Functionality implied by ID_AA64ISAR2_EL1.LUT == 0b0001.
|
||||
|
||||
HWCAP2_FAMINMAX
|
||||
Functionality implied by ID_AA64ISAR3_EL1.FAMINMAX == 0b0001.
|
||||
|
||||
HWCAP2_F8CVT
|
||||
Functionality implied by ID_AA64FPFR0_EL1.F8CVT == 0b1.
|
||||
|
||||
HWCAP2_F8FMA
|
||||
Functionality implied by ID_AA64FPFR0_EL1.F8FMA == 0b1.
|
||||
|
||||
HWCAP2_F8DP4
|
||||
Functionality implied by ID_AA64FPFR0_EL1.F8DP4 == 0b1.
|
||||
|
||||
HWCAP2_F8DP2
|
||||
Functionality implied by ID_AA64FPFR0_EL1.F8DP2 == 0b1.
|
||||
|
||||
HWCAP2_F8E4M3
|
||||
Functionality implied by ID_AA64FPFR0_EL1.F8E4M3 == 0b1.
|
||||
|
||||
HWCAP2_F8E5M2
|
||||
Functionality implied by ID_AA64FPFR0_EL1.F8E5M2 == 0b1.
|
||||
|
||||
HWCAP2_SME_LUTV2
|
||||
Functionality implied by ID_AA64SMFR0_EL1.LUTv2 == 0b1.
|
||||
|
||||
HWCAP2_SME_F8F16
|
||||
Functionality implied by ID_AA64SMFR0_EL1.F8F16 == 0b1.
|
||||
|
||||
HWCAP2_SME_F8F32
|
||||
Functionality implied by ID_AA64SMFR0_EL1.F8F32 == 0b1.
|
||||
|
||||
HWCAP2_SME_SF8FMA
|
||||
Functionality implied by ID_AA64SMFR0_EL1.SF8FMA == 0b1.
|
||||
|
||||
HWCAP2_SME_SF8DP4
|
||||
Functionality implied by ID_AA64SMFR0_EL1.SF8DP4 == 0b1.
|
||||
|
||||
HWCAP2_SME_SF8DP2
|
||||
Functionality implied by ID_AA64SMFR0_EL1.SF8DP2 == 0b1.
|
||||
|
||||
HWCAP2_SME_SF8DP4
|
||||
Functionality implied by ID_AA64SMFR0_EL1.SF8DP4 == 0b1.
|
||||
|
||||
|
||||
4. Unused AT_HWCAP bits
|
||||
-----------------------
|
||||
|
||||
|
@ -35,8 +35,9 @@ can be triggered by Linux).
|
||||
For software workarounds that may adversely impact systems unaffected by
|
||||
the erratum in question, a Kconfig entry is added under "Kernel
|
||||
Features" -> "ARM errata workarounds via the alternatives framework".
|
||||
These are enabled by default and patched in at runtime when an affected
|
||||
CPU is detected. For less-intrusive workarounds, a Kconfig option is not
|
||||
With the exception of workarounds for errata deemed "rare" by Arm, these
|
||||
are enabled by default and patched in at runtime when an affected CPU is
|
||||
detected. For less-intrusive workarounds, a Kconfig option is not
|
||||
available and the code is structured (preferably with a comment) in such
|
||||
a way that the erratum will not be hit.
|
||||
|
||||
|
@ -75,7 +75,7 @@ model features for SME is included in Appendix A.
|
||||
2. Vector lengths
|
||||
------------------
|
||||
|
||||
SME defines a second vector length similar to the SVE vector length which is
|
||||
SME defines a second vector length similar to the SVE vector length which
|
||||
controls the size of the streaming mode SVE vectors and the ZA matrix array.
|
||||
The ZA matrix is square with each side having as many bytes as a streaming
|
||||
mode SVE vector.
|
||||
@ -238,12 +238,12 @@ prctl(PR_SME_SET_VL, unsigned long arg)
|
||||
bits of Z0..Z31 except for Z0 bits [127:0] .. Z31 bits [127:0] to become
|
||||
unspecified, including both streaming and non-streaming SVE state.
|
||||
Calling PR_SME_SET_VL with vl equal to the thread's current vector
|
||||
length, or calling PR_SME_SET_VL with the PR_SVE_SET_VL_ONEXEC flag,
|
||||
length, or calling PR_SME_SET_VL with the PR_SME_SET_VL_ONEXEC flag,
|
||||
does not constitute a change to the vector length for this purpose.
|
||||
|
||||
* Changing the vector length causes PSTATE.ZA and PSTATE.SM to be cleared.
|
||||
Calling PR_SME_SET_VL with vl equal to the thread's current vector
|
||||
length, or calling PR_SME_SET_VL with the PR_SVE_SET_VL_ONEXEC flag,
|
||||
length, or calling PR_SME_SET_VL with the PR_SME_SET_VL_ONEXEC flag,
|
||||
does not constitute a change to the vector length for this purpose.
|
||||
|
||||
|
||||
@ -379,9 +379,8 @@ The regset data starts with struct user_za_header, containing:
|
||||
/proc/sys/abi/sme_default_vector_length
|
||||
|
||||
Writing the text representation of an integer to this file sets the system
|
||||
default vector length to the specified value, unless the value is greater
|
||||
than the maximum vector length supported by the system in which case the
|
||||
default vector length is set to that maximum.
|
||||
default vector length to the specified value rounded to a supported value
|
||||
using the same rules as for setting vector length via PR_SME_SET_VL.
|
||||
|
||||
The result can be determined by reopening the file and reading its
|
||||
contents.
|
||||
|
@ -117,11 +117,6 @@ the SVE instruction set architecture.
|
||||
* The SVE registers are not used to pass arguments to or receive results from
|
||||
any syscall.
|
||||
|
||||
* In practice the affected registers/bits will be preserved or will be replaced
|
||||
with zeros on return from a syscall, but userspace should not make
|
||||
assumptions about this. The kernel behaviour may vary on a case-by-case
|
||||
basis.
|
||||
|
||||
* All other SVE state of a thread, including the currently configured vector
|
||||
length, the state of the PR_SVE_VL_INHERIT flag, and the deferred vector
|
||||
length (if any), is preserved across all syscalls, subject to the specific
|
||||
@ -428,9 +423,8 @@ The regset data starts with struct user_sve_header, containing:
|
||||
/proc/sys/abi/sve_default_vector_length
|
||||
|
||||
Writing the text representation of an integer to this file sets the system
|
||||
default vector length to the specified value, unless the value is greater
|
||||
than the maximum vector length supported by the system in which case the
|
||||
default vector length is set to that maximum.
|
||||
default vector length to the specified value rounded to a supported value
|
||||
using the same rules as for setting vector length via PR_SVE_SET_VL.
|
||||
|
||||
The result can be determined by reopening the file and reading its
|
||||
contents.
|
||||
|
@ -13,7 +13,8 @@ set of mailbox registers.
|
||||
|
||||
More details on the interface can be found in chapter
|
||||
"7 Host System Management Port (HSMP)" of the family/model PPR
|
||||
Eg: https://www.amd.com/system/files/TechDocs/55898_B1_pub_0.50.zip
|
||||
Eg: https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/programmer-references/55898_B1_pub_0_50.zip
|
||||
|
||||
|
||||
HSMP interface is supported on EPYC server CPU models only.
|
||||
|
||||
@ -97,8 +98,8 @@ what happened. The transaction returns 0 on success.
|
||||
|
||||
More details on the interface and message definitions can be found in chapter
|
||||
"7 Host System Management Port (HSMP)" of the respective family/model PPR
|
||||
eg: https://www.amd.com/system/files/TechDocs/55898_B1_pub_0.50.zip
|
||||
eg: https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/programmer-references/55898_B1_pub_0_50.zip
|
||||
|
||||
User space C-APIs are made available by linking against the esmi library,
|
||||
which is provided by the E-SMS project https://developer.amd.com/e-sms/.
|
||||
which is provided by the E-SMS project https://www.amd.com/en/developer/e-sms.html.
|
||||
See: https://github.com/amd/esmi_ib_library
|
||||
|
@ -169,7 +169,7 @@ Error reports
|
||||
A typical KASAN report looks like this::
|
||||
|
||||
==================================================================
|
||||
BUG: KASAN: slab-out-of-bounds in kmalloc_oob_right+0xa8/0xbc [test_kasan]
|
||||
BUG: KASAN: slab-out-of-bounds in kmalloc_oob_right+0xa8/0xbc [kasan_test]
|
||||
Write of size 1 at addr ffff8801f44ec37b by task insmod/2760
|
||||
|
||||
CPU: 1 PID: 2760 Comm: insmod Not tainted 4.19.0-rc3+ #698
|
||||
@ -179,8 +179,8 @@ A typical KASAN report looks like this::
|
||||
print_address_description+0x73/0x280
|
||||
kasan_report+0x144/0x187
|
||||
__asan_report_store1_noabort+0x17/0x20
|
||||
kmalloc_oob_right+0xa8/0xbc [test_kasan]
|
||||
kmalloc_tests_init+0x16/0x700 [test_kasan]
|
||||
kmalloc_oob_right+0xa8/0xbc [kasan_test]
|
||||
kmalloc_tests_init+0x16/0x700 [kasan_test]
|
||||
do_one_initcall+0xa5/0x3ae
|
||||
do_init_module+0x1b6/0x547
|
||||
load_module+0x75df/0x8070
|
||||
@ -200,8 +200,8 @@ A typical KASAN report looks like this::
|
||||
save_stack+0x43/0xd0
|
||||
kasan_kmalloc+0xa7/0xd0
|
||||
kmem_cache_alloc_trace+0xe1/0x1b0
|
||||
kmalloc_oob_right+0x56/0xbc [test_kasan]
|
||||
kmalloc_tests_init+0x16/0x700 [test_kasan]
|
||||
kmalloc_oob_right+0x56/0xbc [kasan_test]
|
||||
kmalloc_tests_init+0x16/0x700 [kasan_test]
|
||||
do_one_initcall+0xa5/0x3ae
|
||||
do_init_module+0x1b6/0x547
|
||||
load_module+0x75df/0x8070
|
||||
@ -531,15 +531,15 @@ When a test passes::
|
||||
|
||||
When a test fails due to a failed ``kmalloc``::
|
||||
|
||||
# kmalloc_large_oob_right: ASSERTION FAILED at lib/test_kasan.c:163
|
||||
# kmalloc_large_oob_right: ASSERTION FAILED at mm/kasan/kasan_test.c:245
|
||||
Expected ptr is not null, but is
|
||||
not ok 4 - kmalloc_large_oob_right
|
||||
not ok 5 - kmalloc_large_oob_right
|
||||
|
||||
When a test fails due to a missing KASAN report::
|
||||
|
||||
# kmalloc_double_kzfree: EXPECTATION FAILED at lib/test_kasan.c:974
|
||||
# kmalloc_double_kzfree: EXPECTATION FAILED at mm/kasan/kasan_test.c:709
|
||||
KASAN failure expected in "kfree_sensitive(ptr)", but none occurred
|
||||
not ok 44 - kmalloc_double_kzfree
|
||||
not ok 28 - kmalloc_double_kzfree
|
||||
|
||||
|
||||
At the end the cumulative status of all KASAN tests is printed. On success::
|
||||
@ -555,7 +555,7 @@ There are a few ways to run KUnit-compatible KASAN tests.
|
||||
1. Loadable module
|
||||
|
||||
With ``CONFIG_KUNIT`` enabled, KASAN-KUnit tests can be built as a loadable
|
||||
module and run by loading ``test_kasan.ko`` with ``insmod`` or ``modprobe``.
|
||||
module and run by loading ``kasan_test.ko`` with ``insmod`` or ``modprobe``.
|
||||
|
||||
2. Built-In
|
||||
|
||||
|
@ -64,9 +64,6 @@ override DTC_FLAGS := \
|
||||
-Wno-unique_unit_address \
|
||||
-Wunique_unit_address_if_enabled
|
||||
|
||||
# Disable undocumented compatible checks until warning free
|
||||
override DT_CHECKER_FLAGS ?=
|
||||
|
||||
$(obj)/processed-schema.json: $(DT_DOCS) $(src)/.yamllint check_dtschema_version FORCE
|
||||
$(call if_changed_rule,chkdt)
|
||||
|
||||
|
@ -1,26 +0,0 @@
|
||||
Mediatek hifsys controller
|
||||
============================
|
||||
|
||||
The Mediatek hifsys controller provides various clocks and reset
|
||||
outputs to the system.
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
- "mediatek,mt2701-hifsys", "syscon"
|
||||
- "mediatek,mt7622-hifsys", "syscon"
|
||||
- "mediatek,mt7623-hifsys", "mediatek,mt2701-hifsys", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
|
||||
The hifsys controller uses the common clk binding from
|
||||
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||
|
||||
Example:
|
||||
|
||||
hifsys: clock-controller@1a000000 {
|
||||
compatible = "mediatek,mt2701-hifsys", "syscon";
|
||||
reg = <0 0x1a000000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -1,25 +0,0 @@
|
||||
MediaTek PCIESYS controller
|
||||
============================
|
||||
|
||||
The MediaTek PCIESYS controller provides various clocks to the system.
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
- "mediatek,mt7622-pciesys", "syscon"
|
||||
- "mediatek,mt7629-pciesys", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
- #reset-cells: Must be 1
|
||||
|
||||
The PCIESYS controller uses the common clk binding from
|
||||
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||
|
||||
Example:
|
||||
|
||||
pciesys: pciesys@1a100800 {
|
||||
compatible = "mediatek,mt7622-pciesys", "syscon";
|
||||
reg = <0 0x1a100800 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -1,25 +0,0 @@
|
||||
MediaTek SSUSBSYS controller
|
||||
============================
|
||||
|
||||
The MediaTek SSUSBSYS controller provides various clocks to the system.
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
- "mediatek,mt7622-ssusbsys", "syscon"
|
||||
- "mediatek,mt7629-ssusbsys", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
- #reset-cells: Must be 1
|
||||
|
||||
The SSUSBSYS controller uses the common clk binding from
|
||||
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||
|
||||
Example:
|
||||
|
||||
ssusbsys: ssusbsys@1a000000 {
|
||||
compatible = "mediatek,mt7622-ssusbsys", "syscon";
|
||||
reg = <0 0x1a000000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -44,14 +44,21 @@ properties:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
qcom,dsb-element-size:
|
||||
qcom,dsb-element-bits:
|
||||
description:
|
||||
Specifies the DSB(Discrete Single Bit) element size supported by
|
||||
the monitor. The associated aggregator will read this size before it
|
||||
is enabled. DSB element size currently only supports 32-bit and 64-bit.
|
||||
$ref: /schemas/types.yaml#/definitions/uint8
|
||||
enum: [32, 64]
|
||||
|
||||
qcom,cmb-element-bits:
|
||||
description:
|
||||
Specifies the CMB(Continuous Multi-Bit) element size supported by
|
||||
the monitor. The associated aggregator will read this size before it
|
||||
is enabled. CMB element size currently only supports 8-bit, 32-bit
|
||||
and 64-bit.
|
||||
enum: [8, 32, 64]
|
||||
|
||||
qcom,dsb-msrs-num:
|
||||
description:
|
||||
Specifies the number of DSB(Discrete Single Bit) MSR(mux select register)
|
||||
@ -61,6 +68,15 @@ properties:
|
||||
minimum: 0
|
||||
maximum: 32
|
||||
|
||||
qcom,cmb-msrs-num:
|
||||
description:
|
||||
Specifies the number of CMB MSR(mux select register) registers supported
|
||||
by the monitor. If this property is not configured or set to 0, it means
|
||||
this TPDM doesn't support CMB MSR.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
minimum: 0
|
||||
maximum: 32
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
@ -94,7 +110,7 @@ examples:
|
||||
compatible = "qcom,coresight-tpdm", "arm,primecell";
|
||||
reg = <0x0684c000 0x1000>;
|
||||
|
||||
qcom,dsb-element-size = /bits/ 8 <32>;
|
||||
qcom,dsb-element-bits = <32>;
|
||||
qcom,dsb-msrs-num = <16>;
|
||||
|
||||
clocks = <&aoss_qmp>;
|
||||
@ -110,4 +126,22 @@ examples:
|
||||
};
|
||||
};
|
||||
|
||||
tpdm@6c29000 {
|
||||
compatible = "qcom,coresight-tpdm", "arm,primecell";
|
||||
reg = <0x06c29000 0x1000>;
|
||||
|
||||
qcom,cmb-element-bits = <64>;
|
||||
qcom,cmb-msrs-num = <32>;
|
||||
|
||||
clocks = <&aoss_qmp>;
|
||||
clock-names = "apb_pclk";
|
||||
|
||||
out-ports {
|
||||
port {
|
||||
tpdm_ipcc_out_funnel_center: endpoint {
|
||||
remote-endpoint = <&funnel_center_in_tpdm_ipcc>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
||||
|
@ -6,18 +6,6 @@ berlin SoCs are now Synaptics' SoCs now.
|
||||
|
||||
---------------------------------------------------------------
|
||||
|
||||
Work in progress statement:
|
||||
|
||||
Device tree files and bindings applying to Marvell Berlin SoCs and boards are
|
||||
considered "unstable". Any Marvell Berlin device tree binding may change at any
|
||||
time. Be sure to use a device tree binary and a kernel image generated from the
|
||||
same source tree.
|
||||
|
||||
Please refer to Documentation/devicetree/bindings/ABI.rst for a definition of a
|
||||
stable binding/ABI.
|
||||
|
||||
---------------------------------------------------------------
|
||||
|
||||
Boards with a SoC of the Marvell Berlin family, e.g. Armada 1500
|
||||
shall have the following properties:
|
||||
|
||||
|
@ -1,51 +0,0 @@
|
||||
MediaTek Serial ATA controller
|
||||
|
||||
Required properties:
|
||||
- compatible : Must be "mediatek,<chip>-ahci", "mediatek,mtk-ahci".
|
||||
When using "mediatek,mtk-ahci" compatible strings, you
|
||||
need SoC specific ones in addition, one of:
|
||||
- "mediatek,mt7622-ahci"
|
||||
- reg : Physical base addresses and length of register sets.
|
||||
- interrupts : Interrupt associated with the SATA device.
|
||||
- interrupt-names : Associated name must be: "hostc".
|
||||
- clocks : A list of phandle and clock specifier pairs, one for each
|
||||
entry in clock-names.
|
||||
- clock-names : Associated names must be: "ahb", "axi", "asic", "rbc", "pm".
|
||||
- phys : A phandle and PHY specifier pair for the PHY port.
|
||||
- phy-names : Associated name must be: "sata-phy".
|
||||
- ports-implemented : See ./ahci-platform.txt for details.
|
||||
|
||||
Optional properties:
|
||||
- power-domains : A phandle and power domain specifier pair to the power
|
||||
domain which is responsible for collapsing and restoring
|
||||
power to the peripheral.
|
||||
- resets : Must contain an entry for each entry in reset-names.
|
||||
See ../reset/reset.txt for details.
|
||||
- reset-names : Associated names must be: "axi", "sw", "reg".
|
||||
- mediatek,phy-mode : A phandle to the system controller, used to enable
|
||||
SATA function.
|
||||
|
||||
Example:
|
||||
|
||||
sata: sata@1a200000 {
|
||||
compatible = "mediatek,mt7622-ahci",
|
||||
"mediatek,mtk-ahci";
|
||||
reg = <0 0x1a200000 0 0x1100>;
|
||||
interrupts = <GIC_SPI 233 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "hostc";
|
||||
clocks = <&pciesys CLK_SATA_AHB_EN>,
|
||||
<&pciesys CLK_SATA_AXI_EN>,
|
||||
<&pciesys CLK_SATA_ASIC_EN>,
|
||||
<&pciesys CLK_SATA_RBC_EN>,
|
||||
<&pciesys CLK_SATA_PM_EN>;
|
||||
clock-names = "ahb", "axi", "asic", "rbc", "pm";
|
||||
phys = <&u3port1 PHY_TYPE_SATA>;
|
||||
phy-names = "sata-phy";
|
||||
ports-implemented = <0x1>;
|
||||
power-domains = <&scpsys MT7622_POWER_DOMAIN_HIF0>;
|
||||
resets = <&pciesys MT7622_SATA_AXI_BUS_RST>,
|
||||
<&pciesys MT7622_SATA_PHY_SW_RST>,
|
||||
<&pciesys MT7622_SATA_PHY_REG_RST>;
|
||||
reset-names = "axi", "sw", "reg";
|
||||
mediatek,phy-mode = <&pciesys>;
|
||||
};
|
@ -1,19 +0,0 @@
|
||||
Atmel AT91RM9200 CompactFlash
|
||||
|
||||
Required properties:
|
||||
- compatible : "atmel,at91rm9200-cf".
|
||||
- reg : should specify localbus address and size used.
|
||||
- gpios : specifies the gpio pins to control the CF device. Detect
|
||||
and reset gpio's are mandatory while irq and vcc gpio's are
|
||||
optional and may be set to 0 if not present.
|
||||
|
||||
Example:
|
||||
compact-flash@50000000 {
|
||||
compatible = "atmel,at91rm9200-cf";
|
||||
reg = <0x50000000 0x30000000>;
|
||||
gpios = <&pioC 13 0 /* irq */
|
||||
&pioC 15 0 /* detect */
|
||||
0 /* vcc */
|
||||
&pioC 5 0 /* reset */
|
||||
>;
|
||||
};
|
98
Documentation/devicetree/bindings/ata/mediatek,mtk-ahci.yaml
Normal file
98
Documentation/devicetree/bindings/ata/mediatek,mtk-ahci.yaml
Normal file
@ -0,0 +1,98 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/ata/mediatek,mtk-ahci.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek Serial ATA controller
|
||||
|
||||
maintainers:
|
||||
- Ryder Lee <ryder.lee@mediatek.com>
|
||||
|
||||
allOf:
|
||||
- $ref: ahci-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- mediatek,mt7622-ahci
|
||||
- const: mediatek,mtk-ahci
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
interrupt-names:
|
||||
const: hostc
|
||||
|
||||
clocks:
|
||||
maxItems: 5
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: ahb
|
||||
- const: axi
|
||||
- const: asic
|
||||
- const: rbc
|
||||
- const: pm
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
maxItems: 3
|
||||
|
||||
reset-names:
|
||||
items:
|
||||
- const: axi
|
||||
- const: sw
|
||||
- const: reg
|
||||
|
||||
mediatek,phy-mode:
|
||||
description: System controller phandle, used to enable SATA function
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
|
||||
required:
|
||||
- reg
|
||||
- interrupts
|
||||
- interrupt-names
|
||||
- clocks
|
||||
- clock-names
|
||||
- phys
|
||||
- phy-names
|
||||
- ports-implemented
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/mt7622-clk.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/phy/phy.h>
|
||||
#include <dt-bindings/power/mt7622-power.h>
|
||||
#include <dt-bindings/reset/mt7622-reset.h>
|
||||
|
||||
sata@1a200000 {
|
||||
compatible = "mediatek,mt7622-ahci", "mediatek,mtk-ahci";
|
||||
reg = <0x1a200000 0x1100>;
|
||||
interrupts = <GIC_SPI 233 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "hostc";
|
||||
clocks = <&pciesys CLK_SATA_AHB_EN>,
|
||||
<&pciesys CLK_SATA_AXI_EN>,
|
||||
<&pciesys CLK_SATA_ASIC_EN>,
|
||||
<&pciesys CLK_SATA_RBC_EN>,
|
||||
<&pciesys CLK_SATA_PM_EN>;
|
||||
clock-names = "ahb", "axi", "asic", "rbc", "pm";
|
||||
phys = <&u3port1 PHY_TYPE_SATA>;
|
||||
phy-names = "sata-phy";
|
||||
ports-implemented = <0x1>;
|
||||
power-domains = <&scpsys MT7622_POWER_DOMAIN_HIF0>;
|
||||
resets = <&pciesys MT7622_SATA_AXI_BUS_RST>,
|
||||
<&pciesys MT7622_SATA_PHY_SW_RST>,
|
||||
<&pciesys MT7622_SATA_PHY_REG_RST>;
|
||||
reset-names = "axi", "sw", "reg";
|
||||
mediatek,phy-mode = <&pciesys>;
|
||||
};
|
@ -39,6 +39,6 @@ additionalProperties: false
|
||||
examples:
|
||||
- |
|
||||
lcd@10008000 {
|
||||
compatible = "arm,versatile-lcd";
|
||||
reg = <0x10008000 0x1000>;
|
||||
compatible = "arm,versatile-lcd";
|
||||
reg = <0x10008000 0x1000>;
|
||||
};
|
||||
|
@ -0,0 +1,55 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/auxdisplay/gpio-7-segment.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: GPIO based LED segment display
|
||||
|
||||
maintainers:
|
||||
- Chris Packham <chris.packham@alliedtelesis.co.nz>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: gpio-7-segment
|
||||
|
||||
segment-gpios:
|
||||
description: |
|
||||
An array of GPIOs one per segment. The first GPIO corresponds to the A
|
||||
segment, the seventh GPIO corresponds to the G segment. Some LED blocks
|
||||
also have a decimal point which can be specified as an optional eighth
|
||||
segment.
|
||||
|
||||
-a-
|
||||
| |
|
||||
f b
|
||||
| |
|
||||
-g-
|
||||
| |
|
||||
e c
|
||||
| |
|
||||
-d- dp
|
||||
|
||||
minItems: 7
|
||||
maxItems: 8
|
||||
|
||||
required:
|
||||
- segment-gpios
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
led-7seg {
|
||||
compatible = "gpio-7-segment";
|
||||
segment-gpios = <&gpio 0 GPIO_ACTIVE_LOW>,
|
||||
<&gpio 1 GPIO_ACTIVE_LOW>,
|
||||
<&gpio 2 GPIO_ACTIVE_LOW>,
|
||||
<&gpio 3 GPIO_ACTIVE_LOW>,
|
||||
<&gpio 4 GPIO_ACTIVE_LOW>,
|
||||
<&gpio 5 GPIO_ACTIVE_LOW>,
|
||||
<&gpio 6 GPIO_ACTIVE_LOW>;
|
||||
};
|
@ -84,42 +84,44 @@ additionalProperties: false
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
auxdisplay {
|
||||
compatible = "hit,hd44780";
|
||||
display-controller {
|
||||
compatible = "hit,hd44780";
|
||||
|
||||
data-gpios = <&hc595 0 GPIO_ACTIVE_HIGH>,
|
||||
<&hc595 1 GPIO_ACTIVE_HIGH>,
|
||||
<&hc595 2 GPIO_ACTIVE_HIGH>,
|
||||
<&hc595 3 GPIO_ACTIVE_HIGH>;
|
||||
enable-gpios = <&hc595 4 GPIO_ACTIVE_HIGH>;
|
||||
rs-gpios = <&hc595 5 GPIO_ACTIVE_HIGH>;
|
||||
data-gpios = <&hc595 0 GPIO_ACTIVE_HIGH>,
|
||||
<&hc595 1 GPIO_ACTIVE_HIGH>,
|
||||
<&hc595 2 GPIO_ACTIVE_HIGH>,
|
||||
<&hc595 3 GPIO_ACTIVE_HIGH>;
|
||||
enable-gpios = <&hc595 4 GPIO_ACTIVE_HIGH>;
|
||||
rs-gpios = <&hc595 5 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
display-height-chars = <2>;
|
||||
display-width-chars = <16>;
|
||||
display-height-chars = <2>;
|
||||
display-width-chars = <16>;
|
||||
};
|
||||
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
pcf8574: pcf8574@27 {
|
||||
compatible = "nxp,pcf8574";
|
||||
reg = <0x27>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
};
|
||||
pcf8574: gpio-expander@27 {
|
||||
compatible = "nxp,pcf8574";
|
||||
reg = <0x27>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
};
|
||||
};
|
||||
hd44780 {
|
||||
compatible = "hit,hd44780";
|
||||
display-height-chars = <2>;
|
||||
display-width-chars = <16>;
|
||||
data-gpios = <&pcf8574 4 0>,
|
||||
<&pcf8574 5 0>,
|
||||
<&pcf8574 6 0>,
|
||||
<&pcf8574 7 0>;
|
||||
enable-gpios = <&pcf8574 2 0>;
|
||||
rs-gpios = <&pcf8574 0 0>;
|
||||
rw-gpios = <&pcf8574 1 0>;
|
||||
backlight-gpios = <&pcf8574 3 0>;
|
||||
|
||||
display-controller {
|
||||
compatible = "hit,hd44780";
|
||||
display-height-chars = <2>;
|
||||
display-width-chars = <16>;
|
||||
data-gpios = <&pcf8574 4 GPIO_ACTIVE_HIGH>,
|
||||
<&pcf8574 5 GPIO_ACTIVE_HIGH>,
|
||||
<&pcf8574 6 GPIO_ACTIVE_HIGH>,
|
||||
<&pcf8574 7 GPIO_ACTIVE_HIGH>;
|
||||
enable-gpios = <&pcf8574 2 GPIO_ACTIVE_HIGH>;
|
||||
rs-gpios = <&pcf8574 0 GPIO_ACTIVE_HIGH>;
|
||||
rw-gpios = <&pcf8574 1 GPIO_ACTIVE_HIGH>;
|
||||
backlight-gpios = <&pcf8574 3 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
@ -74,31 +74,31 @@ examples:
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
ht16k33: ht16k33@70 {
|
||||
compatible = "holtek,ht16k33";
|
||||
reg = <0x70>;
|
||||
refresh-rate-hz = <20>;
|
||||
interrupt-parent = <&gpio4>;
|
||||
interrupts = <5 (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_EDGE_RISING)>;
|
||||
debounce-delay-ms = <50>;
|
||||
linux,keymap = <MATRIX_KEY(2, 0, KEY_F6)>,
|
||||
<MATRIX_KEY(3, 0, KEY_F8)>,
|
||||
<MATRIX_KEY(4, 0, KEY_F10)>,
|
||||
<MATRIX_KEY(5, 0, KEY_F4)>,
|
||||
<MATRIX_KEY(6, 0, KEY_F2)>,
|
||||
<MATRIX_KEY(2, 1, KEY_F5)>,
|
||||
<MATRIX_KEY(3, 1, KEY_F7)>,
|
||||
<MATRIX_KEY(4, 1, KEY_F9)>,
|
||||
<MATRIX_KEY(5, 1, KEY_F3)>,
|
||||
<MATRIX_KEY(6, 1, KEY_F1)>;
|
||||
display-controller@70 {
|
||||
compatible = "holtek,ht16k33";
|
||||
reg = <0x70>;
|
||||
refresh-rate-hz = <20>;
|
||||
interrupt-parent = <&gpio4>;
|
||||
interrupts = <5 (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_EDGE_RISING)>;
|
||||
debounce-delay-ms = <50>;
|
||||
linux,keymap = <MATRIX_KEY(2, 0, KEY_F6)>,
|
||||
<MATRIX_KEY(3, 0, KEY_F8)>,
|
||||
<MATRIX_KEY(4, 0, KEY_F10)>,
|
||||
<MATRIX_KEY(5, 0, KEY_F4)>,
|
||||
<MATRIX_KEY(6, 0, KEY_F2)>,
|
||||
<MATRIX_KEY(2, 1, KEY_F5)>,
|
||||
<MATRIX_KEY(3, 1, KEY_F7)>,
|
||||
<MATRIX_KEY(4, 1, KEY_F9)>,
|
||||
<MATRIX_KEY(5, 1, KEY_F3)>,
|
||||
<MATRIX_KEY(6, 1, KEY_F1)>;
|
||||
|
||||
led {
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
function = LED_FUNCTION_BACKLIGHT;
|
||||
linux,default-trigger = "backlight";
|
||||
};
|
||||
led {
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
function = LED_FUNCTION_BACKLIGHT;
|
||||
linux,default-trigger = "backlight";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -50,6 +50,6 @@ additionalProperties: false
|
||||
examples:
|
||||
- |
|
||||
lcd: lcd@17fff000 {
|
||||
compatible = "img,boston-lcd";
|
||||
reg = <0x17fff000 0x8>;
|
||||
compatible = "img,boston-lcd";
|
||||
reg = <0x17fff000 0x8>;
|
||||
};
|
||||
|
@ -0,0 +1,44 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/auxdisplay/maxim,max6959.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MAX6958/6959 7-segment LED display controller
|
||||
|
||||
maintainers:
|
||||
- Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
|
||||
description:
|
||||
The Maxim MAX6958/6959 7-segment LED display controller provides
|
||||
an I2C interface to up to four 7-segment LED digits. The MAX6959,
|
||||
in comparison to MAX6958, adds input support. Type of the chip can
|
||||
be autodetected via specific register read, and hence the features
|
||||
may be enabled in the driver at run-time, in case they are requested
|
||||
via Device Tree. A given hardware is simple and does not provide
|
||||
any additional pins, such as reset or power enable.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: maxim,max6959
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
display-controller@38 {
|
||||
compatible = "maxim,max6959";
|
||||
reg = <0x38>;
|
||||
};
|
||||
};
|
@ -18,6 +18,7 @@ properties:
|
||||
- const: brcm,gisb-arb
|
||||
- items:
|
||||
- enum:
|
||||
- brcm,bcm74165-gisb-arb # for V7 new style 16nm chips
|
||||
- brcm,bcm7278-gisb-arb # for V7 28nm chips
|
||||
- brcm,bcm7435-gisb-arb # for newer 40nm chips
|
||||
- brcm,bcm7400-gisb-arb # for older 40nm chips and all 65nm chips
|
||||
|
@ -0,0 +1,50 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/mediatek,mt2701-hifsys.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek HIFSYS clock and reset controller
|
||||
|
||||
description:
|
||||
The MediaTek HIFSYS controller provides various clocks and reset outputs to
|
||||
the system.
|
||||
|
||||
maintainers:
|
||||
- Matthias Brugger <matthias.bgg@gmail.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- enum:
|
||||
- mediatek,mt2701-hifsys
|
||||
- mediatek,mt7622-hifsys
|
||||
- items:
|
||||
- enum:
|
||||
- mediatek,mt7623-hifsys
|
||||
- const: mediatek,mt2701-hifsys
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#clock-cells":
|
||||
const: 1
|
||||
description: The available clocks are defined in dt-bindings/clock/mt*-clk.h
|
||||
|
||||
"#reset-cells":
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- reg
|
||||
- "#clock-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
clock-controller@1a000000 {
|
||||
compatible = "mediatek,mt2701-hifsys";
|
||||
reg = <0x1a000000 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -0,0 +1,45 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/mediatek,mt7622-pciesys.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek PCIESYS clock and reset controller
|
||||
|
||||
description:
|
||||
The MediaTek PCIESYS controller provides various clocks to the system.
|
||||
|
||||
maintainers:
|
||||
- Matthias Brugger <matthias.bgg@gmail.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- mediatek,mt7622-pciesys
|
||||
- mediatek,mt7629-pciesys
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#clock-cells":
|
||||
const: 1
|
||||
description: The available clocks are defined in dt-bindings/clock/mt*-clk.h
|
||||
|
||||
"#reset-cells":
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- reg
|
||||
- "#clock-cells"
|
||||
- "#reset-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
clock-controller@1a100800 {
|
||||
compatible = "mediatek,mt7622-pciesys";
|
||||
reg = <0x1a100800 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -0,0 +1,45 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/mediatek,mt7622-ssusbsys.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek SSUSBSYS clock and reset controller
|
||||
|
||||
description:
|
||||
The MediaTek SSUSBSYS controller provides various clocks to the system.
|
||||
|
||||
maintainers:
|
||||
- Matthias Brugger <matthias.bgg@gmail.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- mediatek,mt7622-ssusbsys
|
||||
- mediatek,mt7629-ssusbsys
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#clock-cells":
|
||||
const: 1
|
||||
description: The available clocks are defined in dt-bindings/clock/mt*-clk.h
|
||||
|
||||
"#reset-cells":
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- reg
|
||||
- "#clock-cells"
|
||||
- "#reset-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
clock-controller@1a000000 {
|
||||
compatible = "mediatek,mt7622-ssusbsys";
|
||||
reg = <0x1a000000 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -0,0 +1,51 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/mobileye,eyeq5-clk.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Mobileye EyeQ5 clock controller
|
||||
|
||||
description:
|
||||
The EyeQ5 clock controller handles 10 read-only PLLs derived from the main
|
||||
crystal clock. It also exposes one divider clock, a child of one of the PLLs.
|
||||
Its registers live in a shared region called OLB.
|
||||
|
||||
maintainers:
|
||||
- Grégory Clement <gregory.clement@bootlin.com>
|
||||
- Théo Lebrun <theo.lebrun@bootlin.com>
|
||||
- Vladimir Kondratiev <vladimir.kondratiev@mobileye.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: mobileye,eyeq5-clk
|
||||
|
||||
reg:
|
||||
maxItems: 2
|
||||
|
||||
reg-names:
|
||||
items:
|
||||
- const: plls
|
||||
- const: ospi
|
||||
|
||||
"#clock-cells":
|
||||
const: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
description:
|
||||
Input parent clock to all PLLs. Expected to be the main crystal.
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: ref
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- reg-names
|
||||
- "#clock-cells"
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
additionalProperties: false
|
@ -53,6 +53,9 @@ properties:
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
vdd-gfx-supply:
|
||||
description: Regulator supply for the VDD_GFX pads
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
@ -74,6 +77,12 @@ required:
|
||||
- '#reset-cells'
|
||||
- '#power-domain-cells'
|
||||
|
||||
# Require that power-domains and vdd-gfx-supply are not both present
|
||||
not:
|
||||
required:
|
||||
- power-domains
|
||||
- vdd-gfx-supply
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
|
@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
title: Q6SSTOP clock Controller
|
||||
|
||||
maintainers:
|
||||
- Govind Singh <govinds@codeaurora.org>
|
||||
- Bjorn Andersson <andersson@kernel.org>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
@ -1,61 +0,0 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/qcom,sc7180-mss.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Modem Clock Controller on SC7180
|
||||
|
||||
maintainers:
|
||||
- Taniya Das <quic_tdas@quicinc.com>
|
||||
|
||||
description: |
|
||||
Qualcomm modem clock control module provides the clocks on SC7180.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,mss-sc7180.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,sc7180-mss
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: gcc_mss_mfab_axi clock from GCC
|
||||
- description: gcc_mss_nav_axi clock from GCC
|
||||
- description: gcc_mss_cfg_ahb clock from GCC
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: gcc_mss_mfab_axis
|
||||
- const: gcc_mss_nav_axi
|
||||
- const: cfg_ahb
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- '#clock-cells'
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,gcc-sc7180.h>
|
||||
clock-controller@41a8000 {
|
||||
compatible = "qcom,sc7180-mss";
|
||||
reg = <0x041a8000 0x8000>;
|
||||
clocks = <&gcc GCC_MSS_MFAB_AXIS_CLK>,
|
||||
<&gcc GCC_MSS_NAV_AXI_CLK>,
|
||||
<&gcc GCC_MSS_CFG_AHB_CLK>;
|
||||
clock-names = "gcc_mss_mfab_axis",
|
||||
"gcc_mss_nav_axi",
|
||||
"cfg_ahb";
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
...
|
@ -36,6 +36,8 @@ properties:
|
||||
- samsung,exynos850-cmu-aud
|
||||
- samsung,exynos850-cmu-cmgp
|
||||
- samsung,exynos850-cmu-core
|
||||
- samsung,exynos850-cmu-cpucl0
|
||||
- samsung,exynos850-cmu-cpucl1
|
||||
- samsung,exynos850-cmu-dpu
|
||||
- samsung,exynos850-cmu-g3d
|
||||
- samsung,exynos850-cmu-hsi
|
||||
@ -152,6 +154,46 @@ allOf:
|
||||
- const: dout_core_mmc_embd
|
||||
- const: dout_core_sss
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: samsung,exynos850-cmu-cpucl0
|
||||
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
items:
|
||||
- description: External reference clock (26 MHz)
|
||||
- description: CPUCL0 switch clock (from CMU_TOP)
|
||||
- description: CPUCL0 debug clock (from CMU_TOP)
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: oscclk
|
||||
- const: dout_cpucl0_switch
|
||||
- const: dout_cpucl0_dbg
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: samsung,exynos850-cmu-cpucl1
|
||||
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
items:
|
||||
- description: External reference clock (26 MHz)
|
||||
- description: CPUCL1 switch clock (from CMU_TOP)
|
||||
- description: CPUCL1 debug clock (from CMU_TOP)
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: oscclk
|
||||
- const: dout_cpucl1_switch
|
||||
- const: dout_cpucl1_dbg
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
|
@ -12,7 +12,7 @@ maintainers:
|
||||
|
||||
description: |
|
||||
FSD clock controller consist of several clock management unit
|
||||
(CMU), which generates clocks for various inteernal SoC blocks.
|
||||
(CMU), which generates clocks for various internal SoC blocks.
|
||||
The root clock comes from external OSC clock (24 MHz).
|
||||
|
||||
All available clocks are defined as preprocessor macros in
|
||||
|
@ -12,7 +12,11 @@ maintainers:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: atmel,at91sam9g46-aes
|
||||
oneOf:
|
||||
- const: atmel,at91sam9g46-aes
|
||||
- items:
|
||||
- const: microchip,sam9x7-aes
|
||||
- const: atmel,at91sam9g46-aes
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
@ -12,7 +12,11 @@ maintainers:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: atmel,at91sam9g46-sha
|
||||
oneOf:
|
||||
- const: atmel,at91sam9g46-sha
|
||||
- items:
|
||||
- const: microchip,sam9x7-sha
|
||||
- const: atmel,at91sam9g46-sha
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
@ -12,7 +12,11 @@ maintainers:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: atmel,at91sam9g46-tdes
|
||||
oneOf:
|
||||
- const: atmel,at91sam9g46-tdes
|
||||
- items:
|
||||
- const: microchip,sam9x7-tdes
|
||||
- const: atmel,at91sam9g46-tdes
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
@ -14,6 +14,7 @@ properties:
|
||||
items:
|
||||
- enum:
|
||||
- qcom,sa8775p-inline-crypto-engine
|
||||
- qcom,sc7180-inline-crypto-engine
|
||||
- qcom,sm8450-inline-crypto-engine
|
||||
- qcom,sm8550-inline-crypto-engine
|
||||
- qcom,sm8650-inline-crypto-engine
|
||||
|
@ -45,6 +45,7 @@ properties:
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,sc7280-qce
|
||||
- qcom,sm6350-qce
|
||||
- qcom,sm8250-qce
|
||||
- qcom,sm8350-qce
|
||||
- qcom,sm8450-qce
|
||||
|
@ -0,0 +1,63 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/atmel/atmel,hlcdc-display-controller.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Atmel's High LCD Controller (HLCDC)
|
||||
|
||||
maintainers:
|
||||
- Nicolas Ferre <nicolas.ferre@microchip.com>
|
||||
- Alexandre Belloni <alexandre.belloni@bootlin.com>
|
||||
- Claudiu Beznea <claudiu.beznea@tuxon.dev>
|
||||
|
||||
description:
|
||||
The LCD Controller (LCDC) consists of logic for transferring LCD image
|
||||
data from an external display buffer to a TFT LCD panel. The LCDC has one
|
||||
display input buffer per layer that fetches pixels through the single bus
|
||||
host interface and a look-up table to allow palletized display
|
||||
configurations.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: atmel,hlcdc-display-controller
|
||||
|
||||
'#address-cells':
|
||||
const: 1
|
||||
|
||||
'#size-cells':
|
||||
const: 0
|
||||
|
||||
port@0:
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
unevaluatedProperties: false
|
||||
description:
|
||||
Output endpoint of the controller, connecting the LCD panel signals.
|
||||
|
||||
properties:
|
||||
'#address-cells':
|
||||
const: 1
|
||||
|
||||
'#size-cells':
|
||||
const: 0
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
endpoint:
|
||||
$ref: /schemas/media/video-interfaces.yaml#
|
||||
unevaluatedProperties: false
|
||||
description:
|
||||
Endpoint connecting the LCD panel signals.
|
||||
|
||||
properties:
|
||||
bus-width:
|
||||
enum: [ 12, 16, 18, 24 ]
|
||||
|
||||
required:
|
||||
- '#address-cells'
|
||||
- '#size-cells'
|
||||
- compatible
|
||||
- port@0
|
||||
|
||||
additionalProperties: false
|
@ -1,75 +0,0 @@
|
||||
Device-Tree bindings for Atmel's HLCDC (High LCD Controller) DRM driver
|
||||
|
||||
The Atmel HLCDC Display Controller is subdevice of the HLCDC MFD device.
|
||||
See ../../mfd/atmel-hlcdc.txt for more details.
|
||||
|
||||
Required properties:
|
||||
- compatible: value should be "atmel,hlcdc-display-controller"
|
||||
- pinctrl-names: the pin control state names. Should contain "default".
|
||||
- pinctrl-0: should contain the default pinctrl states.
|
||||
- #address-cells: should be set to 1.
|
||||
- #size-cells: should be set to 0.
|
||||
|
||||
Required children nodes:
|
||||
Children nodes are encoding available output ports and their connections
|
||||
to external devices using the OF graph representation (see ../graph.txt).
|
||||
At least one port node is required.
|
||||
|
||||
Optional properties in grandchild nodes:
|
||||
Any endpoint grandchild node may specify a desired video interface
|
||||
according to ../../media/video-interfaces.txt, specifically
|
||||
- bus-width: recognized values are <12>, <16>, <18> and <24>, and
|
||||
override any output mode selection heuristic, forcing "rgb444",
|
||||
"rgb565", "rgb666" and "rgb888" respectively.
|
||||
|
||||
Example:
|
||||
|
||||
hlcdc: hlcdc@f0030000 {
|
||||
compatible = "atmel,sama5d3-hlcdc";
|
||||
reg = <0xf0030000 0x2000>;
|
||||
interrupts = <36 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&lcdc_clk>, <&lcdck>, <&clk32k>;
|
||||
clock-names = "periph_clk","sys_clk", "slow_clk";
|
||||
|
||||
hlcdc-display-controller {
|
||||
compatible = "atmel,hlcdc-display-controller";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_lcd_base &pinctrl_lcd_rgb888>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0>;
|
||||
|
||||
hlcdc_panel_output: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&panel_input>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
hlcdc_pwm: hlcdc-pwm {
|
||||
compatible = "atmel,hlcdc-pwm";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_lcd_pwm>;
|
||||
#pwm-cells = <3>;
|
||||
};
|
||||
};
|
||||
|
||||
Example 2: With a video interface override to force rgb565; as above
|
||||
but with these changes/additions:
|
||||
|
||||
&hlcdc {
|
||||
hlcdc-display-controller {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_lcd_base &pinctrl_lcd_rgb565>;
|
||||
|
||||
port@0 {
|
||||
hlcdc_panel_output: endpoint@0 {
|
||||
bus-width = <16>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
@ -0,0 +1,102 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/bridge/fsl,imx8mp-hdmi-tx.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Freescale i.MX8MP DWC HDMI TX Encoder
|
||||
|
||||
maintainers:
|
||||
- Lucas Stach <l.stach@pengutronix.de>
|
||||
|
||||
description:
|
||||
The i.MX8MP HDMI transmitter is a Synopsys DesignWare
|
||||
HDMI 2.0a TX controller IP.
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/display/bridge/synopsys,dw-hdmi.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- fsl,imx8mp-hdmi-tx
|
||||
|
||||
reg-io-width:
|
||||
const: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 4
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: iahb
|
||||
- const: isfr
|
||||
- const: cec
|
||||
- const: pix
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
ports:
|
||||
$ref: /schemas/graph.yaml#/properties/ports
|
||||
|
||||
properties:
|
||||
port@0:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description: Parallel RGB input port
|
||||
|
||||
port@1:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description: HDMI output port
|
||||
|
||||
required:
|
||||
- port@0
|
||||
- port@1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- interrupts
|
||||
- power-domains
|
||||
- ports
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/imx8mp-clock.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/power/imx8mp-power.h>
|
||||
|
||||
hdmi@32fd8000 {
|
||||
compatible = "fsl,imx8mp-hdmi-tx";
|
||||
reg = <0x32fd8000 0x7eff>;
|
||||
interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX8MP_CLK_HDMI_APB>,
|
||||
<&clk IMX8MP_CLK_HDMI_REF_266M>,
|
||||
<&clk IMX8MP_CLK_32K>,
|
||||
<&hdmi_tx_phy>;
|
||||
clock-names = "iahb", "isfr", "cec", "pix";
|
||||
power-domains = <&hdmi_blk_ctrl IMX8MP_HDMIBLK_PD_HDMI_TX>;
|
||||
reg-io-width = <1>;
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
|
||||
hdmi_tx_from_pvi: endpoint {
|
||||
remote-endpoint = <&pvi_to_hdmi_tx>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
hdmi_tx_out: endpoint {
|
||||
remote-endpoint = <&hdmi0_con>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
title: SN65DSI86 DSI to eDP bridge chip
|
||||
|
||||
maintainers:
|
||||
- Sandeep Panda <spanda@codeaurora.org>
|
||||
- Douglas Anderson <dianders@chromium.org>
|
||||
|
||||
description: |
|
||||
The Texas Instruments SN65DSI86 bridge takes MIPI DSI in and outputs eDP.
|
||||
|
@ -120,13 +120,19 @@ allOf:
|
||||
maxItems: 1
|
||||
clock-names:
|
||||
maxItems: 1
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
const: fsl,imx6sx-lcdif
|
||||
then:
|
||||
required:
|
||||
- power-domains
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- fsl,imx6sl-lcdif
|
||||
- fsl,imx6sx-lcdif
|
||||
- fsl,imx8mm-lcdif
|
||||
- fsl,imx8mn-lcdif
|
||||
- fsl,imx8mp-lcdif
|
||||
|
@ -0,0 +1,84 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/imx/fsl,imx8mp-hdmi-pvi.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Freescale i.MX8MP HDMI Parallel Video Interface
|
||||
|
||||
maintainers:
|
||||
- Lucas Stach <l.stach@pengutronix.de>
|
||||
|
||||
description:
|
||||
The HDMI parallel video interface is a timing and sync generator block in the
|
||||
i.MX8MP SoC, that sits between the video source and the HDMI TX controller.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: fsl,imx8mp-hdmi-pvi
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
ports:
|
||||
$ref: /schemas/graph.yaml#/properties/ports
|
||||
|
||||
properties:
|
||||
port@0:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description: Input from the LCDIF controller.
|
||||
|
||||
port@1:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description: Output to the HDMI TX controller.
|
||||
|
||||
required:
|
||||
- port@0
|
||||
- port@1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- power-domains
|
||||
- ports
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/power/imx8mp-power.h>
|
||||
|
||||
display-bridge@32fc4000 {
|
||||
compatible = "fsl,imx8mp-hdmi-pvi";
|
||||
reg = <0x32fc4000 0x44>;
|
||||
interrupt-parent = <&irqsteer_hdmi>;
|
||||
interrupts = <12 IRQ_TYPE_LEVEL_HIGH>;
|
||||
power-domains = <&hdmi_blk_ctrl IMX8MP_HDMIBLK_PD_PVI>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
pvi_from_lcdif3: endpoint {
|
||||
remote-endpoint = <&lcdif3_to_pvi>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
pvi_to_hdmi_tx: endpoint {
|
||||
remote-endpoint = <&hdmi_tx_from_pvi>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
@ -19,6 +19,7 @@ properties:
|
||||
- qcom,msm8916-dsi-ctrl
|
||||
- qcom,msm8953-dsi-ctrl
|
||||
- qcom,msm8974-dsi-ctrl
|
||||
- qcom,msm8976-dsi-ctrl
|
||||
- qcom,msm8996-dsi-ctrl
|
||||
- qcom,msm8998-dsi-ctrl
|
||||
- qcom,qcm2290-dsi-ctrl
|
||||
@ -248,6 +249,7 @@ allOf:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,msm8953-dsi-ctrl
|
||||
- qcom,msm8976-dsi-ctrl
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
|
@ -224,6 +224,7 @@ allOf:
|
||||
enum:
|
||||
- qcom,adreno-gmu-730.1
|
||||
- qcom,adreno-gmu-740.1
|
||||
- qcom,adreno-gmu-750.1
|
||||
then:
|
||||
properties:
|
||||
reg:
|
||||
|
@ -23,7 +23,7 @@ properties:
|
||||
The driver is parsing the compat string for Adreno to
|
||||
figure out the gpu-id and patch level.
|
||||
items:
|
||||
- pattern: '^qcom,adreno-[3-7][0-9][0-9]\.[0-9]$'
|
||||
- pattern: '^qcom,adreno-[3-7][0-9][0-9]\.[0-9]+$'
|
||||
- const: qcom,adreno
|
||||
- description: |
|
||||
The driver is parsing the compat string for Imageon to
|
||||
@ -127,7 +127,7 @@ allOf:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
pattern: '^qcom,adreno-[3-5][0-9][0-9]\.[0-9]$'
|
||||
pattern: '^qcom,adreno-[3-5][0-9][0-9]\.[0-9]+$'
|
||||
|
||||
then:
|
||||
properties:
|
||||
@ -203,7 +203,7 @@ allOf:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
pattern: '^qcom,adreno-[67][0-9][0-9]\.[0-9]$'
|
||||
pattern: '^qcom,adreno-[67][0-9][0-9]\.[0-9]+$'
|
||||
|
||||
then: # Starting with A6xx, the clocks are usually defined in the GMU node
|
||||
properties:
|
||||
|
@ -127,6 +127,7 @@ patternProperties:
|
||||
- qcom,dsi-phy-20nm
|
||||
- qcom,dsi-phy-28nm-8226
|
||||
- qcom,dsi-phy-28nm-hpm
|
||||
- qcom,dsi-phy-28nm-hpm-fam-b
|
||||
- qcom,dsi-phy-28nm-lp
|
||||
- qcom,hdmi-phy-8084
|
||||
- qcom,hdmi-phy-8660
|
||||
|
@ -13,7 +13,9 @@ $ref: /schemas/display/msm/dpu-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,sm8650-dpu
|
||||
enum:
|
||||
- qcom,sm8650-dpu
|
||||
- qcom,x1e80100-dpu
|
||||
|
||||
reg:
|
||||
items:
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user