Merge fecfd01539 ("Merge tag 'leds-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/pavel/linux-leds") into android-mainline
Steps on the way to 5.12-rc1 Resolves merge conflicts in: drivers/dma-buf/dma-heap.c drivers/dma-buf/heaps/cma_heap.c drivers/dma-buf/heaps/system_heap.c include/linux/dma-heap.h Cc: John Stultz <john.stultz@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ibb32dbdba5183c9e19f5d1e94016cc1ae9616173
This commit is contained in:
1
.mailmap
1
.mailmap
@@ -237,6 +237,7 @@ Maxime Ripard <mripard@kernel.org> <maxime.ripard@free-electrons.com>
|
|||||||
Mayuresh Janorkar <mayur@ti.com>
|
Mayuresh Janorkar <mayur@ti.com>
|
||||||
Michael Buesch <m@bues.ch>
|
Michael Buesch <m@bues.ch>
|
||||||
Michel Dänzer <michel@tungstengraphics.com>
|
Michel Dänzer <michel@tungstengraphics.com>
|
||||||
|
Miguel Ojeda <ojeda@kernel.org> <miguel.ojeda.sandonis@gmail.com>
|
||||||
Mike Rapoport <rppt@kernel.org> <mike@compulab.co.il>
|
Mike Rapoport <rppt@kernel.org> <mike@compulab.co.il>
|
||||||
Mike Rapoport <rppt@kernel.org> <mike.rapoport@gmail.com>
|
Mike Rapoport <rppt@kernel.org> <mike.rapoport@gmail.com>
|
||||||
Mike Rapoport <rppt@kernel.org> <rppt@linux.ibm.com>
|
Mike Rapoport <rppt@kernel.org> <rppt@linux.ibm.com>
|
||||||
|
|||||||
9
CREDITS
9
CREDITS
@@ -2841,14 +2841,11 @@ S: Subiaco, 6008
|
|||||||
S: Perth, Western Australia
|
S: Perth, Western Australia
|
||||||
S: Australia
|
S: Australia
|
||||||
|
|
||||||
N: Miguel Ojeda Sandonis
|
N: Miguel Ojeda
|
||||||
E: miguel.ojeda.sandonis@gmail.com
|
E: ojeda@kernel.org
|
||||||
W: http://miguelojeda.es
|
W: https://ojeda.dev
|
||||||
W: http://jair.lab.fi.uva.es/~migojed/
|
|
||||||
D: Author of the ks0108, cfag12864b and cfag12864bfb auxiliary display drivers.
|
D: Author of the ks0108, cfag12864b and cfag12864bfb auxiliary display drivers.
|
||||||
D: Maintainer of the auxiliary display drivers tree (drivers/auxdisplay/*)
|
D: Maintainer of the auxiliary display drivers tree (drivers/auxdisplay/*)
|
||||||
S: C/ Mieses 20, 9-B
|
|
||||||
S: Valladolid 47009
|
|
||||||
S: Spain
|
S: Spain
|
||||||
|
|
||||||
N: Peter Oruba
|
N: Peter Oruba
|
||||||
|
|||||||
@@ -13,21 +13,22 @@ What: /sys/devices/system/memory/memoryX/removable
|
|||||||
Date: June 2008
|
Date: June 2008
|
||||||
Contact: Badari Pulavarty <pbadari@us.ibm.com>
|
Contact: Badari Pulavarty <pbadari@us.ibm.com>
|
||||||
Description:
|
Description:
|
||||||
The file /sys/devices/system/memory/memoryX/removable
|
The file /sys/devices/system/memory/memoryX/removable is a
|
||||||
indicates whether this memory block is removable or not.
|
legacy interface used to indicated whether a memory block is
|
||||||
This is useful for a user-level agent to determine
|
likely to be offlineable or not. Newer kernel versions return
|
||||||
identify removable sections of the memory before attempting
|
"1" if and only if the kernel supports memory offlining.
|
||||||
potentially expensive hot-remove memory operation
|
|
||||||
Users: hotplug memory remove tools
|
Users: hotplug memory remove tools
|
||||||
http://www.ibm.com/developerworks/wikis/display/LinuxP/powerpc-utils
|
http://www.ibm.com/developerworks/wikis/display/LinuxP/powerpc-utils
|
||||||
|
lsmem/chmem part of util-linux
|
||||||
|
|
||||||
What: /sys/devices/system/memory/memoryX/phys_device
|
What: /sys/devices/system/memory/memoryX/phys_device
|
||||||
Date: September 2008
|
Date: September 2008
|
||||||
Contact: Badari Pulavarty <pbadari@us.ibm.com>
|
Contact: Badari Pulavarty <pbadari@us.ibm.com>
|
||||||
Description:
|
Description:
|
||||||
The file /sys/devices/system/memory/memoryX/phys_device
|
The file /sys/devices/system/memory/memoryX/phys_device
|
||||||
is read-only and is designed to show the name of physical
|
is read-only; it is a legacy interface only ever used on s390x
|
||||||
memory device. Implementation is currently incomplete.
|
to expose the covered storage increment.
|
||||||
|
Users: Legacy s390-tools lsmem/chmem
|
||||||
|
|
||||||
What: /sys/devices/system/memory/memoryX/phys_index
|
What: /sys/devices/system/memory/memoryX/phys_index
|
||||||
Date: September 2008
|
Date: September 2008
|
||||||
@@ -43,23 +44,25 @@ Date: September 2008
|
|||||||
Contact: Badari Pulavarty <pbadari@us.ibm.com>
|
Contact: Badari Pulavarty <pbadari@us.ibm.com>
|
||||||
Description:
|
Description:
|
||||||
The file /sys/devices/system/memory/memoryX/state
|
The file /sys/devices/system/memory/memoryX/state
|
||||||
is read-write. When read, its contents show the
|
is read-write. When read, it returns the online/offline
|
||||||
online/offline state of the memory section. When written,
|
state of the memory block. When written, root can toggle
|
||||||
root can toggle the the online/offline state of a removable
|
the online/offline state of a memory block using the following
|
||||||
memory section (see removable file description above)
|
commands::
|
||||||
using the following commands::
|
|
||||||
|
|
||||||
# echo online > /sys/devices/system/memory/memoryX/state
|
# echo online > /sys/devices/system/memory/memoryX/state
|
||||||
# echo offline > /sys/devices/system/memory/memoryX/state
|
# echo offline > /sys/devices/system/memory/memoryX/state
|
||||||
|
|
||||||
For example, if /sys/devices/system/memory/memory22/removable
|
On newer kernel versions, advanced states can be specified
|
||||||
contains a value of 1 and
|
when onlining to select a target zone: "online_movable"
|
||||||
/sys/devices/system/memory/memory22/state contains the
|
selects the movable zone. "online_kernel" selects the
|
||||||
string "online" the following command can be executed by
|
applicable kernel zone (DMA, DMA32, or Normal). However,
|
||||||
by root to offline that section::
|
after successfully setting one of the advanced states,
|
||||||
|
reading the file will return "online"; the zone information
|
||||||
# echo offline > /sys/devices/system/memory/memory22/state
|
can be obtained via "valid_zones" instead.
|
||||||
|
|
||||||
|
While onlining is unlikely to fail, there are no guarantees
|
||||||
|
that offlining will succeed. Offlining is more likely to
|
||||||
|
succeed if "valid_zones" indicates "Movable".
|
||||||
Users: hotplug memory remove tools
|
Users: hotplug memory remove tools
|
||||||
http://www.ibm.com/developerworks/wikis/display/LinuxP/powerpc-utils
|
http://www.ibm.com/developerworks/wikis/display/LinuxP/powerpc-utils
|
||||||
|
|
||||||
@@ -69,8 +72,19 @@ Date: July 2014
|
|||||||
Contact: Zhang Zhen <zhenzhang.zhang@huawei.com>
|
Contact: Zhang Zhen <zhenzhang.zhang@huawei.com>
|
||||||
Description:
|
Description:
|
||||||
The file /sys/devices/system/memory/memoryX/valid_zones is
|
The file /sys/devices/system/memory/memoryX/valid_zones is
|
||||||
read-only and is designed to show which zone this memory
|
read-only.
|
||||||
block can be onlined to.
|
|
||||||
|
For online memory blocks, it returns in which zone memory
|
||||||
|
provided by a memory block is managed. If multiple zones
|
||||||
|
apply (not applicable for hotplugged memory), "None" is returned
|
||||||
|
and the memory block cannot be offlined.
|
||||||
|
|
||||||
|
For offline memory blocks, it returns by which zone memory
|
||||||
|
provided by a memory block can be managed when onlining.
|
||||||
|
The first returned zone ("default") will be used when setting
|
||||||
|
the state of an offline memory block to "online". Only one of
|
||||||
|
the kernel zones (DMA, DMA32, Normal) is applicable for a single
|
||||||
|
memory block.
|
||||||
|
|
||||||
What: /sys/devices/system/memoryX/nodeY
|
What: /sys/devices/system/memoryX/nodeY
|
||||||
Date: October 2009
|
Date: October 2009
|
||||||
|
|||||||
41
Documentation/ABI/testing/sysfs-devices-xenbus
Normal file
41
Documentation/ABI/testing/sysfs-devices-xenbus
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
What: /sys/devices/*/xenbus/event_channels
|
||||||
|
Date: February 2021
|
||||||
|
Contact: Xen Developers mailing list <xen-devel@lists.xenproject.org>
|
||||||
|
Description:
|
||||||
|
Number of Xen event channels associated with a kernel based
|
||||||
|
paravirtualized device frontend or backend.
|
||||||
|
|
||||||
|
What: /sys/devices/*/xenbus/events
|
||||||
|
Date: February 2021
|
||||||
|
Contact: Xen Developers mailing list <xen-devel@lists.xenproject.org>
|
||||||
|
Description:
|
||||||
|
Total number of Xen events received for a Xen pv device
|
||||||
|
frontend or backend.
|
||||||
|
|
||||||
|
What: /sys/devices/*/xenbus/jiffies_eoi_delayed
|
||||||
|
Date: February 2021
|
||||||
|
Contact: Xen Developers mailing list <xen-devel@lists.xenproject.org>
|
||||||
|
Description:
|
||||||
|
Summed up time in jiffies the EOI of an interrupt for a Xen
|
||||||
|
pv device has been delayed in order to avoid stalls due to
|
||||||
|
event storms. This value rising is a first sign for a rogue
|
||||||
|
other end of the pv device.
|
||||||
|
|
||||||
|
What: /sys/devices/*/xenbus/spurious_events
|
||||||
|
Date: February 2021
|
||||||
|
Contact: Xen Developers mailing list <xen-devel@lists.xenproject.org>
|
||||||
|
Description:
|
||||||
|
Number of events received for a Xen pv device which did not
|
||||||
|
require any action. Too many spurious events in a row will
|
||||||
|
trigger delayed EOI processing.
|
||||||
|
|
||||||
|
What: /sys/devices/*/xenbus/spurious_threshold
|
||||||
|
Date: February 2021
|
||||||
|
Contact: Xen Developers mailing list <xen-devel@lists.xenproject.org>
|
||||||
|
Description:
|
||||||
|
Controls the tolerated number of subsequent spurious events
|
||||||
|
before delayed EOI processing is triggered for a Xen pv
|
||||||
|
device. Default is 1. This can be modified in case the other
|
||||||
|
end of the pv device is issuing spurious events on a regular
|
||||||
|
basis and is known not to be malicious on purpose. Raising
|
||||||
|
the value for such cases can improve pv device performance.
|
||||||
@@ -1,3 +1,46 @@
|
|||||||
|
What: /sys/firmware/acpi/fpdt/
|
||||||
|
Date: Jan 2021
|
||||||
|
Contact: Zhang Rui <rui.zhang@intel.com>
|
||||||
|
Description:
|
||||||
|
ACPI Firmware Performance Data Table (FPDT) provides
|
||||||
|
information for firmware performance data for system boot,
|
||||||
|
S3 suspend and S3 resume. This sysfs entry contains the
|
||||||
|
performance data retrieved from the FPDT.
|
||||||
|
|
||||||
|
boot:
|
||||||
|
firmware_start_ns: Timer value logged at the beginning
|
||||||
|
of firmware image execution. In nanoseconds.
|
||||||
|
bootloader_load_ns: Timer value logged just prior to
|
||||||
|
loading the OS boot loader into memory.
|
||||||
|
In nanoseconds.
|
||||||
|
bootloader_launch_ns: Timer value logged just prior to
|
||||||
|
launching the currently loaded OS boot loader
|
||||||
|
image. In nanoseconds.
|
||||||
|
exitbootservice_start_ns: Timer value logged at the
|
||||||
|
point when the OS loader calls the
|
||||||
|
ExitBootServices function for UEFI compatible
|
||||||
|
firmware. In nanoseconds.
|
||||||
|
exitbootservice_end_ns: Timer value logged at the point
|
||||||
|
just prior to the OS loader gaining control
|
||||||
|
back from the ExitBootServices function for
|
||||||
|
UEFI compatible firmware. In nanoseconds.
|
||||||
|
suspend:
|
||||||
|
suspend_start_ns: Timer value recorded at the previous
|
||||||
|
OS write to SLP_TYP upon entry to S3. In
|
||||||
|
nanoseconds.
|
||||||
|
suspend_end_ns: Timer value recorded at the previous
|
||||||
|
firmware write to SLP_TYP used to trigger
|
||||||
|
hardware entry to S3. In nanoseconds.
|
||||||
|
resume:
|
||||||
|
resume_count: A count of the number of S3 resume cycles
|
||||||
|
since the last full boot sequence.
|
||||||
|
resume_avg_ns: Average timer value of all resume cycles
|
||||||
|
logged since the last full boot sequence,
|
||||||
|
including the most recent resume. In nanoseconds.
|
||||||
|
resume_prev_ns: Timer recorded at the end of the previous
|
||||||
|
platform runtime firmware S3 resume, just prior to
|
||||||
|
handoff to the OS waking vector. In nanoseconds.
|
||||||
|
|
||||||
What: /sys/firmware/acpi/bgrt/
|
What: /sys/firmware/acpi/bgrt/
|
||||||
Date: January 2012
|
Date: January 2012
|
||||||
Contact: Matthew Garrett <mjg@redhat.com>
|
Contact: Matthew Garrett <mjg@redhat.com>
|
||||||
|
|||||||
@@ -5,13 +5,17 @@ Description: This file contains a space-separated list of profiles supported for
|
|||||||
|
|
||||||
Drivers must use the following standard profile-names:
|
Drivers must use the following standard profile-names:
|
||||||
|
|
||||||
============ ============================================
|
==================== ========================================
|
||||||
low-power Low power consumption
|
low-power Low power consumption
|
||||||
cool Cooler operation
|
cool Cooler operation
|
||||||
quiet Quieter operation
|
quiet Quieter operation
|
||||||
balanced Balance between low power consumption and performance
|
balanced Balance between low power consumption
|
||||||
|
and performance
|
||||||
|
balanced-performance Balance between performance and low
|
||||||
|
power consumption with a slight bias
|
||||||
|
towards performance
|
||||||
performance High performance operation
|
performance High performance operation
|
||||||
============ ============================================
|
==================== ========================================
|
||||||
|
|
||||||
Userspace may expect drivers to offer more than one of these
|
Userspace may expect drivers to offer more than one of these
|
||||||
standard profile names.
|
standard profile names.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ cfag12864b LCD Driver Documentation
|
|||||||
===================================
|
===================================
|
||||||
|
|
||||||
:License: GPLv2
|
:License: GPLv2
|
||||||
:Author & Maintainer: Miguel Ojeda Sandonis
|
:Author & Maintainer: Miguel Ojeda <ojeda@kernel.org>
|
||||||
:Date: 2006-10-27
|
:Date: 2006-10-27
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ks0108 LCD Controller Driver Documentation
|
|||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
:License: GPLv2
|
:License: GPLv2
|
||||||
:Author & Maintainer: Miguel Ojeda Sandonis
|
:Author & Maintainer: Miguel Ojeda <ojeda@kernel.org>
|
||||||
:Date: 2006-10-27
|
:Date: 2006-10-27
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5186,6 +5186,12 @@
|
|||||||
growing up) the main stack are reserved for no other
|
growing up) the main stack are reserved for no other
|
||||||
mapping. Default value is 256 pages.
|
mapping. Default value is 256 pages.
|
||||||
|
|
||||||
|
stack_depot_disable= [KNL]
|
||||||
|
Setting this to true through kernel command line will
|
||||||
|
disable the stack depot thereby saving the static memory
|
||||||
|
consumed by the stack hash table. By default this is set
|
||||||
|
to false.
|
||||||
|
|
||||||
stacktrace [FTRACE]
|
stacktrace [FTRACE]
|
||||||
Enabled the stack tracer on boot up.
|
Enabled the stack tracer on boot up.
|
||||||
|
|
||||||
|
|||||||
@@ -160,16 +160,16 @@ Under each memory block, you can see 5 files:
|
|||||||
|
|
||||||
"online_movable", "online", "offline" command
|
"online_movable", "online", "offline" command
|
||||||
which will be performed on all sections in the block.
|
which will be performed on all sections in the block.
|
||||||
``phys_device`` read-only: designed to show the name of physical memory
|
``phys_device`` read-only: legacy interface only ever used on s390x to
|
||||||
device. This is not well implemented now.
|
expose the covered storage increment.
|
||||||
``removable`` read-only: contains an integer value indicating
|
``removable`` read-only: legacy interface that indicated whether a memory
|
||||||
whether the memory block is removable or not
|
block was likely to be offlineable or not. Newer kernel
|
||||||
removable. A value of 1 indicates that the memory
|
versions return "1" if and only if the kernel supports
|
||||||
block is removable and a value of 0 indicates that
|
memory offlining.
|
||||||
it is not removable. A memory block is removable only if
|
``valid_zones`` read-only: designed to show by which zone memory provided by
|
||||||
every section in the block is removable.
|
a memory block is managed, and to show by which zone memory
|
||||||
``valid_zones`` read-only: designed to show which zones this memory block
|
provided by an offline memory block could be managed when
|
||||||
can be onlined to.
|
onlining.
|
||||||
|
|
||||||
The first column shows it`s default zone.
|
The first column shows it`s default zone.
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ whole; patches welcome!
|
|||||||
ubsan
|
ubsan
|
||||||
kmemleak
|
kmemleak
|
||||||
kcsan
|
kcsan
|
||||||
|
kfence
|
||||||
gdb-kernel-debugging
|
gdb-kernel-debugging
|
||||||
kgdb
|
kgdb
|
||||||
kselftest
|
kselftest
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ Boot parameters
|
|||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Hardware tag-based KASAN mode (see the section about various modes below) is
|
Hardware tag-based KASAN mode (see the section about various modes below) is
|
||||||
intended for use in production as a security mitigation. Therefore it supports
|
intended for use in production as a security mitigation. Therefore, it supports
|
||||||
boot parameters that allow to disable KASAN competely or otherwise control
|
boot parameters that allow to disable KASAN competely or otherwise control
|
||||||
particular KASAN features.
|
particular KASAN features.
|
||||||
|
|
||||||
@@ -165,7 +165,8 @@ particular KASAN features.
|
|||||||
traces collection (default: ``on``).
|
traces collection (default: ``on``).
|
||||||
|
|
||||||
- ``kasan.fault=report`` or ``=panic`` controls whether to only print a KASAN
|
- ``kasan.fault=report`` or ``=panic`` controls whether to only print a KASAN
|
||||||
report or also panic the kernel (default: ``report``).
|
report or also panic the kernel (default: ``report``). Note, that tag
|
||||||
|
checking gets disabled after the first reported bug.
|
||||||
|
|
||||||
For developers
|
For developers
|
||||||
~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
@@ -295,6 +296,9 @@ Note, that enabling CONFIG_KASAN_HW_TAGS always results in in-kernel TBI being
|
|||||||
enabled. Even when kasan.mode=off is provided, or when the hardware doesn't
|
enabled. Even when kasan.mode=off is provided, or when the hardware doesn't
|
||||||
support MTE (but supports TBI).
|
support MTE (but supports TBI).
|
||||||
|
|
||||||
|
Hardware tag-based KASAN only reports the first found bug. After that MTE tag
|
||||||
|
checking gets disabled.
|
||||||
|
|
||||||
What memory accesses are sanitised by KASAN?
|
What memory accesses are sanitised by KASAN?
|
||||||
--------------------------------------------
|
--------------------------------------------
|
||||||
|
|
||||||
|
|||||||
298
Documentation/dev-tools/kfence.rst
Normal file
298
Documentation/dev-tools/kfence.rst
Normal file
@@ -0,0 +1,298 @@
|
|||||||
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
.. Copyright (C) 2020, Google LLC.
|
||||||
|
|
||||||
|
Kernel Electric-Fence (KFENCE)
|
||||||
|
==============================
|
||||||
|
|
||||||
|
Kernel Electric-Fence (KFENCE) is a low-overhead sampling-based memory safety
|
||||||
|
error detector. KFENCE detects heap out-of-bounds access, use-after-free, and
|
||||||
|
invalid-free errors.
|
||||||
|
|
||||||
|
KFENCE is designed to be enabled in production kernels, and has near zero
|
||||||
|
performance overhead. Compared to KASAN, KFENCE trades performance for
|
||||||
|
precision. The main motivation behind KFENCE's design, is that with enough
|
||||||
|
total uptime KFENCE will detect bugs in code paths not typically exercised by
|
||||||
|
non-production test workloads. One way to quickly achieve a large enough total
|
||||||
|
uptime is when the tool is deployed across a large fleet of machines.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
|
||||||
|
To enable KFENCE, configure the kernel with::
|
||||||
|
|
||||||
|
CONFIG_KFENCE=y
|
||||||
|
|
||||||
|
To build a kernel with KFENCE support, but disabled by default (to enable, set
|
||||||
|
``kfence.sample_interval`` to non-zero value), configure the kernel with::
|
||||||
|
|
||||||
|
CONFIG_KFENCE=y
|
||||||
|
CONFIG_KFENCE_SAMPLE_INTERVAL=0
|
||||||
|
|
||||||
|
KFENCE provides several other configuration options to customize behaviour (see
|
||||||
|
the respective help text in ``lib/Kconfig.kfence`` for more info).
|
||||||
|
|
||||||
|
Tuning performance
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The most important parameter is KFENCE's sample interval, which can be set via
|
||||||
|
the kernel boot parameter ``kfence.sample_interval`` in milliseconds. The
|
||||||
|
sample interval determines the frequency with which heap allocations will be
|
||||||
|
guarded by KFENCE. The default is configurable via the Kconfig option
|
||||||
|
``CONFIG_KFENCE_SAMPLE_INTERVAL``. Setting ``kfence.sample_interval=0``
|
||||||
|
disables KFENCE.
|
||||||
|
|
||||||
|
The KFENCE memory pool is of fixed size, and if the pool is exhausted, no
|
||||||
|
further KFENCE allocations occur. With ``CONFIG_KFENCE_NUM_OBJECTS`` (default
|
||||||
|
255), the number of available guarded objects can be controlled. Each object
|
||||||
|
requires 2 pages, one for the object itself and the other one used as a guard
|
||||||
|
page; object pages are interleaved with guard pages, and every object page is
|
||||||
|
therefore surrounded by two guard pages.
|
||||||
|
|
||||||
|
The total memory dedicated to the KFENCE memory pool can be computed as::
|
||||||
|
|
||||||
|
( #objects + 1 ) * 2 * PAGE_SIZE
|
||||||
|
|
||||||
|
Using the default config, and assuming a page size of 4 KiB, results in
|
||||||
|
dedicating 2 MiB to the KFENCE memory pool.
|
||||||
|
|
||||||
|
Note: On architectures that support huge pages, KFENCE will ensure that the
|
||||||
|
pool is using pages of size ``PAGE_SIZE``. This will result in additional page
|
||||||
|
tables being allocated.
|
||||||
|
|
||||||
|
Error reports
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
A typical out-of-bounds access looks like this::
|
||||||
|
|
||||||
|
==================================================================
|
||||||
|
BUG: KFENCE: out-of-bounds read in test_out_of_bounds_read+0xa3/0x22b
|
||||||
|
|
||||||
|
Out-of-bounds read at 0xffffffffb672efff (1B left of kfence-#17):
|
||||||
|
test_out_of_bounds_read+0xa3/0x22b
|
||||||
|
kunit_try_run_case+0x51/0x85
|
||||||
|
kunit_generic_run_threadfn_adapter+0x16/0x30
|
||||||
|
kthread+0x137/0x160
|
||||||
|
ret_from_fork+0x22/0x30
|
||||||
|
|
||||||
|
kfence-#17 [0xffffffffb672f000-0xffffffffb672f01f, size=32, cache=kmalloc-32] allocated by task 507:
|
||||||
|
test_alloc+0xf3/0x25b
|
||||||
|
test_out_of_bounds_read+0x98/0x22b
|
||||||
|
kunit_try_run_case+0x51/0x85
|
||||||
|
kunit_generic_run_threadfn_adapter+0x16/0x30
|
||||||
|
kthread+0x137/0x160
|
||||||
|
ret_from_fork+0x22/0x30
|
||||||
|
|
||||||
|
CPU: 4 PID: 107 Comm: kunit_try_catch Not tainted 5.8.0-rc6+ #7
|
||||||
|
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1 04/01/2014
|
||||||
|
==================================================================
|
||||||
|
|
||||||
|
The header of the report provides a short summary of the function involved in
|
||||||
|
the access. It is followed by more detailed information about the access and
|
||||||
|
its origin. Note that, real kernel addresses are only shown when using the
|
||||||
|
kernel command line option ``no_hash_pointers``.
|
||||||
|
|
||||||
|
Use-after-free accesses are reported as::
|
||||||
|
|
||||||
|
==================================================================
|
||||||
|
BUG: KFENCE: use-after-free read in test_use_after_free_read+0xb3/0x143
|
||||||
|
|
||||||
|
Use-after-free read at 0xffffffffb673dfe0 (in kfence-#24):
|
||||||
|
test_use_after_free_read+0xb3/0x143
|
||||||
|
kunit_try_run_case+0x51/0x85
|
||||||
|
kunit_generic_run_threadfn_adapter+0x16/0x30
|
||||||
|
kthread+0x137/0x160
|
||||||
|
ret_from_fork+0x22/0x30
|
||||||
|
|
||||||
|
kfence-#24 [0xffffffffb673dfe0-0xffffffffb673dfff, size=32, cache=kmalloc-32] allocated by task 507:
|
||||||
|
test_alloc+0xf3/0x25b
|
||||||
|
test_use_after_free_read+0x76/0x143
|
||||||
|
kunit_try_run_case+0x51/0x85
|
||||||
|
kunit_generic_run_threadfn_adapter+0x16/0x30
|
||||||
|
kthread+0x137/0x160
|
||||||
|
ret_from_fork+0x22/0x30
|
||||||
|
|
||||||
|
freed by task 507:
|
||||||
|
test_use_after_free_read+0xa8/0x143
|
||||||
|
kunit_try_run_case+0x51/0x85
|
||||||
|
kunit_generic_run_threadfn_adapter+0x16/0x30
|
||||||
|
kthread+0x137/0x160
|
||||||
|
ret_from_fork+0x22/0x30
|
||||||
|
|
||||||
|
CPU: 4 PID: 109 Comm: kunit_try_catch Tainted: G W 5.8.0-rc6+ #7
|
||||||
|
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1 04/01/2014
|
||||||
|
==================================================================
|
||||||
|
|
||||||
|
KFENCE also reports on invalid frees, such as double-frees::
|
||||||
|
|
||||||
|
==================================================================
|
||||||
|
BUG: KFENCE: invalid free in test_double_free+0xdc/0x171
|
||||||
|
|
||||||
|
Invalid free of 0xffffffffb6741000:
|
||||||
|
test_double_free+0xdc/0x171
|
||||||
|
kunit_try_run_case+0x51/0x85
|
||||||
|
kunit_generic_run_threadfn_adapter+0x16/0x30
|
||||||
|
kthread+0x137/0x160
|
||||||
|
ret_from_fork+0x22/0x30
|
||||||
|
|
||||||
|
kfence-#26 [0xffffffffb6741000-0xffffffffb674101f, size=32, cache=kmalloc-32] allocated by task 507:
|
||||||
|
test_alloc+0xf3/0x25b
|
||||||
|
test_double_free+0x76/0x171
|
||||||
|
kunit_try_run_case+0x51/0x85
|
||||||
|
kunit_generic_run_threadfn_adapter+0x16/0x30
|
||||||
|
kthread+0x137/0x160
|
||||||
|
ret_from_fork+0x22/0x30
|
||||||
|
|
||||||
|
freed by task 507:
|
||||||
|
test_double_free+0xa8/0x171
|
||||||
|
kunit_try_run_case+0x51/0x85
|
||||||
|
kunit_generic_run_threadfn_adapter+0x16/0x30
|
||||||
|
kthread+0x137/0x160
|
||||||
|
ret_from_fork+0x22/0x30
|
||||||
|
|
||||||
|
CPU: 4 PID: 111 Comm: kunit_try_catch Tainted: G W 5.8.0-rc6+ #7
|
||||||
|
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1 04/01/2014
|
||||||
|
==================================================================
|
||||||
|
|
||||||
|
KFENCE also uses pattern-based redzones on the other side of an object's guard
|
||||||
|
page, to detect out-of-bounds writes on the unprotected side of the object.
|
||||||
|
These are reported on frees::
|
||||||
|
|
||||||
|
==================================================================
|
||||||
|
BUG: KFENCE: memory corruption in test_kmalloc_aligned_oob_write+0xef/0x184
|
||||||
|
|
||||||
|
Corrupted memory at 0xffffffffb6797ff9 [ 0xac . . . . . . ] (in kfence-#69):
|
||||||
|
test_kmalloc_aligned_oob_write+0xef/0x184
|
||||||
|
kunit_try_run_case+0x51/0x85
|
||||||
|
kunit_generic_run_threadfn_adapter+0x16/0x30
|
||||||
|
kthread+0x137/0x160
|
||||||
|
ret_from_fork+0x22/0x30
|
||||||
|
|
||||||
|
kfence-#69 [0xffffffffb6797fb0-0xffffffffb6797ff8, size=73, cache=kmalloc-96] allocated by task 507:
|
||||||
|
test_alloc+0xf3/0x25b
|
||||||
|
test_kmalloc_aligned_oob_write+0x57/0x184
|
||||||
|
kunit_try_run_case+0x51/0x85
|
||||||
|
kunit_generic_run_threadfn_adapter+0x16/0x30
|
||||||
|
kthread+0x137/0x160
|
||||||
|
ret_from_fork+0x22/0x30
|
||||||
|
|
||||||
|
CPU: 4 PID: 120 Comm: kunit_try_catch Tainted: G W 5.8.0-rc6+ #7
|
||||||
|
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1 04/01/2014
|
||||||
|
==================================================================
|
||||||
|
|
||||||
|
For such errors, the address where the corruption occurred as well as the
|
||||||
|
invalidly written bytes (offset from the address) are shown; in this
|
||||||
|
representation, '.' denote untouched bytes. In the example above ``0xac`` is
|
||||||
|
the value written to the invalid address at offset 0, and the remaining '.'
|
||||||
|
denote that no following bytes have been touched. Note that, real values are
|
||||||
|
only shown if the kernel was booted with ``no_hash_pointers``; to avoid
|
||||||
|
information disclosure otherwise, '!' is used instead to denote invalidly
|
||||||
|
written bytes.
|
||||||
|
|
||||||
|
And finally, KFENCE may also report on invalid accesses to any protected page
|
||||||
|
where it was not possible to determine an associated object, e.g. if adjacent
|
||||||
|
object pages had not yet been allocated::
|
||||||
|
|
||||||
|
==================================================================
|
||||||
|
BUG: KFENCE: invalid read in test_invalid_access+0x26/0xe0
|
||||||
|
|
||||||
|
Invalid read at 0xffffffffb670b00a:
|
||||||
|
test_invalid_access+0x26/0xe0
|
||||||
|
kunit_try_run_case+0x51/0x85
|
||||||
|
kunit_generic_run_threadfn_adapter+0x16/0x30
|
||||||
|
kthread+0x137/0x160
|
||||||
|
ret_from_fork+0x22/0x30
|
||||||
|
|
||||||
|
CPU: 4 PID: 124 Comm: kunit_try_catch Tainted: G W 5.8.0-rc6+ #7
|
||||||
|
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1 04/01/2014
|
||||||
|
==================================================================
|
||||||
|
|
||||||
|
DebugFS interface
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Some debugging information is exposed via debugfs:
|
||||||
|
|
||||||
|
* The file ``/sys/kernel/debug/kfence/stats`` provides runtime statistics.
|
||||||
|
|
||||||
|
* The file ``/sys/kernel/debug/kfence/objects`` provides a list of objects
|
||||||
|
allocated via KFENCE, including those already freed but protected.
|
||||||
|
|
||||||
|
Implementation Details
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Guarded allocations are set up based on the sample interval. After expiration
|
||||||
|
of the sample interval, the next allocation through the main allocator (SLAB or
|
||||||
|
SLUB) returns a guarded allocation from the KFENCE object pool (allocation
|
||||||
|
sizes up to PAGE_SIZE are supported). At this point, the timer is reset, and
|
||||||
|
the next allocation is set up after the expiration of the interval. To "gate" a
|
||||||
|
KFENCE allocation through the main allocator's fast-path without overhead,
|
||||||
|
KFENCE relies on static branches via the static keys infrastructure. The static
|
||||||
|
branch is toggled to redirect the allocation to KFENCE.
|
||||||
|
|
||||||
|
KFENCE objects each reside on a dedicated page, at either the left or right
|
||||||
|
page boundaries selected at random. The pages to the left and right of the
|
||||||
|
object page are "guard pages", whose attributes are changed to a protected
|
||||||
|
state, and cause page faults on any attempted access. Such page faults are then
|
||||||
|
intercepted by KFENCE, which handles the fault gracefully by reporting an
|
||||||
|
out-of-bounds access, and marking the page as accessible so that the faulting
|
||||||
|
code can (wrongly) continue executing (set ``panic_on_warn`` to panic instead).
|
||||||
|
|
||||||
|
To detect out-of-bounds writes to memory within the object's page itself,
|
||||||
|
KFENCE also uses pattern-based redzones. For each object page, a redzone is set
|
||||||
|
up for all non-object memory. For typical alignments, the redzone is only
|
||||||
|
required on the unguarded side of an object. Because KFENCE must honor the
|
||||||
|
cache's requested alignment, special alignments may result in unprotected gaps
|
||||||
|
on either side of an object, all of which are redzoned.
|
||||||
|
|
||||||
|
The following figure illustrates the page layout::
|
||||||
|
|
||||||
|
---+-----------+-----------+-----------+-----------+-----------+---
|
||||||
|
| xxxxxxxxx | O : | xxxxxxxxx | : O | xxxxxxxxx |
|
||||||
|
| xxxxxxxxx | B : | xxxxxxxxx | : B | xxxxxxxxx |
|
||||||
|
| x GUARD x | J : RED- | x GUARD x | RED- : J | x GUARD x |
|
||||||
|
| xxxxxxxxx | E : ZONE | xxxxxxxxx | ZONE : E | xxxxxxxxx |
|
||||||
|
| xxxxxxxxx | C : | xxxxxxxxx | : C | xxxxxxxxx |
|
||||||
|
| xxxxxxxxx | T : | xxxxxxxxx | : T | xxxxxxxxx |
|
||||||
|
---+-----------+-----------+-----------+-----------+-----------+---
|
||||||
|
|
||||||
|
Upon deallocation of a KFENCE object, the object's page is again protected and
|
||||||
|
the object is marked as freed. Any further access to the object causes a fault
|
||||||
|
and KFENCE reports a use-after-free access. Freed objects are inserted at the
|
||||||
|
tail of KFENCE's freelist, so that the least recently freed objects are reused
|
||||||
|
first, and the chances of detecting use-after-frees of recently freed objects
|
||||||
|
is increased.
|
||||||
|
|
||||||
|
Interface
|
||||||
|
---------
|
||||||
|
|
||||||
|
The following describes the functions which are used by allocators as well as
|
||||||
|
page handling code to set up and deal with KFENCE allocations.
|
||||||
|
|
||||||
|
.. kernel-doc:: include/linux/kfence.h
|
||||||
|
:functions: is_kfence_address
|
||||||
|
kfence_shutdown_cache
|
||||||
|
kfence_alloc kfence_free __kfence_free
|
||||||
|
kfence_ksize kfence_object_start
|
||||||
|
kfence_handle_page_fault
|
||||||
|
|
||||||
|
Related Tools
|
||||||
|
-------------
|
||||||
|
|
||||||
|
In userspace, a similar approach is taken by `GWP-ASan
|
||||||
|
<http://llvm.org/docs/GwpAsan.html>`_. GWP-ASan also relies on guard pages and
|
||||||
|
a sampling strategy to detect memory unsafety bugs at scale. KFENCE's design is
|
||||||
|
directly influenced by GWP-ASan, and can be seen as its kernel sibling. Another
|
||||||
|
similar but non-sampling approach, that also inspired the name "KFENCE", can be
|
||||||
|
found in the userspace `Electric Fence Malloc Debugger
|
||||||
|
<https://linux.die.net/man/3/efence>`_.
|
||||||
|
|
||||||
|
In the kernel, several tools exist to debug memory access errors, and in
|
||||||
|
particular KASAN can detect all bug classes that KFENCE can detect. While KASAN
|
||||||
|
is more precise, relying on compiler instrumentation, this comes at a
|
||||||
|
performance cost.
|
||||||
|
|
||||||
|
It is worth highlighting that KASAN and KFENCE are complementary, with
|
||||||
|
different target environments. For instance, KASAN is the better debugging-aid,
|
||||||
|
where test cases or reproducers exists: due to the lower chance to detect the
|
||||||
|
error, it would require more effort using KFENCE to debug. Deployments at scale
|
||||||
|
that cannot afford to enable KASAN, however, would benefit from using KFENCE to
|
||||||
|
discover bugs due to code paths not exercised by test cases or fuzzers.
|
||||||
@@ -78,10 +78,10 @@ $(obj)/processed-schema.json: $(DT_SCHEMA_FILES) check_dtschema_version FORCE
|
|||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
extra-$(CHECK_DT_BINDING) += processed-schema-examples.json
|
always-$(CHECK_DT_BINDING) += processed-schema-examples.json
|
||||||
extra-$(CHECK_DTBS) += processed-schema.json
|
always-$(CHECK_DTBS) += processed-schema.json
|
||||||
extra-$(CHECK_DT_BINDING) += $(patsubst $(src)/%.yaml,%.example.dts, $(DT_SCHEMA_FILES))
|
always-$(CHECK_DT_BINDING) += $(patsubst $(src)/%.yaml,%.example.dts, $(DT_SCHEMA_FILES))
|
||||||
extra-$(CHECK_DT_BINDING) += $(patsubst $(src)/%.yaml,%.example.dt.yaml, $(DT_SCHEMA_FILES))
|
always-$(CHECK_DT_BINDING) += $(patsubst $(src)/%.yaml,%.example.dt.yaml, $(DT_SCHEMA_FILES))
|
||||||
|
|
||||||
# Hack: avoid 'Argument list too long' error for 'make clean'. Remove most of
|
# Hack: avoid 'Argument list too long' error for 'make clean'. Remove most of
|
||||||
# build artifacts here before they are processed by scripts/Makefile.clean
|
# build artifacts here before they are processed by scripts/Makefile.clean
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ properties:
|
|||||||
|
|
||||||
dp-pwr-supply:
|
dp-pwr-supply:
|
||||||
description: Power supply for the DP_PWR pin
|
description: Power supply for the DP_PWR pin
|
||||||
maxItems: 1
|
|
||||||
|
|
||||||
port:
|
port:
|
||||||
$ref: /schemas/graph.yaml#/properties/port
|
$ref: /schemas/graph.yaml#/properties/port
|
||||||
|
|||||||
@@ -13,7 +13,10 @@ maintainers:
|
|||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
items:
|
items:
|
||||||
- const: sifive,fu540-c000-gpio
|
- enum:
|
||||||
|
- sifive,fu540-c000-gpio
|
||||||
|
- sifive,fu740-c000-gpio
|
||||||
|
- canaan,k210-gpiohs
|
||||||
- const: sifive,gpio0
|
- const: sifive,gpio0
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
@@ -21,9 +24,9 @@ properties:
|
|||||||
|
|
||||||
interrupts:
|
interrupts:
|
||||||
description:
|
description:
|
||||||
interrupt mapping one per GPIO. Maximum 16 GPIOs.
|
Interrupt mapping, one per GPIO. Maximum 32 GPIOs.
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 16
|
maxItems: 32
|
||||||
|
|
||||||
interrupt-controller: true
|
interrupt-controller: true
|
||||||
|
|
||||||
@@ -36,6 +39,14 @@ properties:
|
|||||||
"#gpio-cells":
|
"#gpio-cells":
|
||||||
const: 2
|
const: 2
|
||||||
|
|
||||||
|
ngpios:
|
||||||
|
description:
|
||||||
|
The number of GPIOs available on the controller implementation.
|
||||||
|
It is 16 for the SiFive SoCs and 32 for the Canaan K210.
|
||||||
|
minimum: 1
|
||||||
|
maximum: 32
|
||||||
|
default: 16
|
||||||
|
|
||||||
gpio-controller: true
|
gpio-controller: true
|
||||||
|
|
||||||
required:
|
required:
|
||||||
@@ -44,10 +55,20 @@ required:
|
|||||||
- interrupts
|
- interrupts
|
||||||
- interrupt-controller
|
- interrupt-controller
|
||||||
- "#interrupt-cells"
|
- "#interrupt-cells"
|
||||||
- clocks
|
|
||||||
- "#gpio-cells"
|
- "#gpio-cells"
|
||||||
- gpio-controller
|
- gpio-controller
|
||||||
|
|
||||||
|
if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
- sifive,fu540-c000-gpio
|
||||||
|
- sifive,fu740-c000-gpio
|
||||||
|
then:
|
||||||
|
required:
|
||||||
|
- clocks
|
||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
|
|||||||
@@ -8,10 +8,11 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
|||||||
title: SiFive Platform-Level Interrupt Controller (PLIC)
|
title: SiFive Platform-Level Interrupt Controller (PLIC)
|
||||||
|
|
||||||
description:
|
description:
|
||||||
SiFive SOCs include an implementation of the Platform-Level Interrupt Controller
|
SiFive SoCs and other RISC-V SoCs include an implementation of the
|
||||||
(PLIC) high-level specification in the RISC-V Privileged Architecture
|
Platform-Level Interrupt Controller (PLIC) high-level specification in
|
||||||
specification. The PLIC connects all external interrupts in the system to all
|
the RISC-V Privileged Architecture specification. The PLIC connects all
|
||||||
hart contexts in the system, via the external interrupt source in each hart.
|
external interrupts in the system to all hart contexts in the system, via
|
||||||
|
the external interrupt source in each hart.
|
||||||
|
|
||||||
A hart context is a privilege mode in a hardware execution thread. For example,
|
A hart context is a privilege mode in a hardware execution thread. For example,
|
||||||
in an 4 core system with 2-way SMT, you have 8 harts and probably at least two
|
in an 4 core system with 2-way SMT, you have 8 harts and probably at least two
|
||||||
@@ -42,7 +43,9 @@ maintainers:
|
|||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
items:
|
items:
|
||||||
- const: sifive,fu540-c000-plic
|
- enum:
|
||||||
|
- sifive,fu540-c000-plic
|
||||||
|
- canaan,k210-plic
|
||||||
- const: sifive,plic-1.0.0
|
- const: sifive,plic-1.0.0
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
|
|||||||
113
Documentation/devicetree/bindings/leds/leds-lgm.yaml
Normal file
113
Documentation/devicetree/bindings/leds/leds-lgm.yaml
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/leds/leds-lgm.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Intel Lightning Mountain (LGM) SoC LED Serial Shift Output (SSO) Controller driver
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Zhu, Yi Xin <Yixin.zhu@intel.com>
|
||||||
|
- Amireddy Mallikarjuna reddy <mallikarjunax.reddy@intel.com>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: intel,lgm-ssoled
|
||||||
|
|
||||||
|
gpio-controller: true
|
||||||
|
|
||||||
|
'#gpio-cells':
|
||||||
|
const: 2
|
||||||
|
|
||||||
|
ngpios:
|
||||||
|
minimum: 0
|
||||||
|
maximum: 32
|
||||||
|
description:
|
||||||
|
Number of GPIOs this controller provides.
|
||||||
|
|
||||||
|
intel,sso-update-rate-hz:
|
||||||
|
description:
|
||||||
|
Blink frequency for SOUTs in Hz.
|
||||||
|
|
||||||
|
led-controller:
|
||||||
|
type: object
|
||||||
|
description:
|
||||||
|
This sub-node must contain a sub-node for each leds.
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
patternProperties:
|
||||||
|
"^led@[0-23]$":
|
||||||
|
type: object
|
||||||
|
|
||||||
|
properties:
|
||||||
|
reg:
|
||||||
|
description: Index of the LED.
|
||||||
|
minimum: 0
|
||||||
|
maximum: 2
|
||||||
|
|
||||||
|
intel,sso-hw-trigger:
|
||||||
|
type: boolean
|
||||||
|
description: This property indicates Hardware driven/control LED.
|
||||||
|
|
||||||
|
intel,sso-hw-blink:
|
||||||
|
type: boolean
|
||||||
|
description: This property indicates Enable LED blink by Hardware.
|
||||||
|
|
||||||
|
intel,sso-blink-rate-hz:
|
||||||
|
description: LED HW blink frequency.
|
||||||
|
|
||||||
|
retain-state-suspended:
|
||||||
|
type: boolean
|
||||||
|
description: The suspend state of LED can be retained.
|
||||||
|
|
||||||
|
retain-state-shutdown:
|
||||||
|
type: boolean
|
||||||
|
description: Retain the state of the LED on shutdown.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
- "#gpio-cells"
|
||||||
|
- gpio-controller
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/intel,lgm-clk.h>
|
||||||
|
#include <dt-bindings/leds/common.h>
|
||||||
|
|
||||||
|
ssogpio: ssogpio@e0d40000 {
|
||||||
|
compatible = "intel,sso-led";
|
||||||
|
reg = <0xE0D40000 0x2E4>;
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
ngpios = <32>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinctrl_ledc>;
|
||||||
|
clocks = <&cgu0 LGM_GCLK_LEDC0>, <&afeclk>;
|
||||||
|
clock-names = "sso", "fpid";
|
||||||
|
intel,sso-update-rate-hz = <250000>;
|
||||||
|
|
||||||
|
led-controller {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
led@0 {
|
||||||
|
reg = <0>;
|
||||||
|
function = "gphy";
|
||||||
|
color = <LED_COLOR_ID_GREEN>;
|
||||||
|
led-gpio = <&ssogpio 0 0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
led@23 {
|
||||||
|
reg = <23>;
|
||||||
|
function = LED_FUNCTION_POWER;
|
||||||
|
color = <LED_COLOR_ID_GREEN>;
|
||||||
|
led-gpio = <&ssogpio 23 0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
109
Documentation/devicetree/bindings/mfd/canaan,k210-sysctl.yaml
Normal file
109
Documentation/devicetree/bindings/mfd/canaan,k210-sysctl.yaml
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/mfd/canaan,k210-sysctl.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Canaan Kendryte K210 System Controller Device Tree Bindings
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Damien Le Moal <damien.lemoal@wdc.com>
|
||||||
|
|
||||||
|
description:
|
||||||
|
Canaan Inc. Kendryte K210 SoC system controller which provides a
|
||||||
|
register map for controlling the clocks, reset signals and pin power
|
||||||
|
domains of the SoC.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
- const: canaan,k210-sysctl
|
||||||
|
- const: syscon
|
||||||
|
- const: simple-mfd
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 1
|
||||||
|
description:
|
||||||
|
System controller Advanced Power Bus (APB) interface clock source.
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: pclk
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clock-controller:
|
||||||
|
# Child node
|
||||||
|
type: object
|
||||||
|
$ref: "../clock/canaan,k210-clk.yaml"
|
||||||
|
description:
|
||||||
|
Clock controller for the SoC clocks. This child node definition
|
||||||
|
should follow the bindings specified in
|
||||||
|
Documentation/devicetree/bindings/clock/canaan,k210-clk.yaml.
|
||||||
|
|
||||||
|
reset-controller:
|
||||||
|
# Child node
|
||||||
|
type: object
|
||||||
|
$ref: "../reset/canaan,k210-rst.yaml"
|
||||||
|
description:
|
||||||
|
Reset controller for the SoC. This child node definition
|
||||||
|
should follow the bindings specified in
|
||||||
|
Documentation/devicetree/bindings/reset/canaan,k210-rst.yaml.
|
||||||
|
|
||||||
|
syscon-reboot:
|
||||||
|
# Child node
|
||||||
|
type: object
|
||||||
|
$ref: "../power/reset/syscon-reboot.yaml"
|
||||||
|
description:
|
||||||
|
Reboot method for the SoC. This child node definition
|
||||||
|
should follow the bindings specified in
|
||||||
|
Documentation/devicetree/bindings/power/reset/syscon-reboot.yaml.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- clocks
|
||||||
|
- reg
|
||||||
|
- clock-controller
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/k210-clk.h>
|
||||||
|
#include <dt-bindings/reset/k210-rst.h>
|
||||||
|
|
||||||
|
clocks {
|
||||||
|
in0: oscllator {
|
||||||
|
compatible = "fixed-clock";
|
||||||
|
#clock-cells = <0>;
|
||||||
|
clock-frequency = <26000000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
sysctl: syscon@50440000 {
|
||||||
|
compatible = "canaan,k210-sysctl",
|
||||||
|
"syscon", "simple-mfd";
|
||||||
|
reg = <0x50440000 0x100>;
|
||||||
|
clocks = <&sysclk K210_CLK_APB1>;
|
||||||
|
clock-names = "pclk";
|
||||||
|
|
||||||
|
sysclk: clock-controller {
|
||||||
|
#clock-cells = <1>;
|
||||||
|
compatible = "canaan,k210-clk";
|
||||||
|
clocks = <&in0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sysrst: reset-controller {
|
||||||
|
compatible = "canaan,k210-rst";
|
||||||
|
#reset-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
reboot: syscon-reboot {
|
||||||
|
compatible = "syscon-reboot";
|
||||||
|
regmap = <&sysctl>;
|
||||||
|
offset = <48>;
|
||||||
|
mask = <1>;
|
||||||
|
value = <1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
171
Documentation/devicetree/bindings/pinctrl/canaan,k210-fpioa.yaml
Normal file
171
Documentation/devicetree/bindings/pinctrl/canaan,k210-fpioa.yaml
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/pinctrl/canaan,k210-fpioa.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Canaan Kendryte K210 FPIOA Device Tree Bindings
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Damien Le Moal <damien.lemoal@wdc.com>
|
||||||
|
|
||||||
|
description:
|
||||||
|
The Canaan Kendryte K210 SoC Fully Programmable IO Array (FPIOA)
|
||||||
|
controller allows assiging any of 256 possible functions to any of
|
||||||
|
48 IO pins of the SoC. Pin function configuration is performed on
|
||||||
|
a per-pin basis.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: canaan,k210-fpioa
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
description:
|
||||||
|
Address and length of the register set for the FPIOA controller.
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: Controller reference clock source
|
||||||
|
- description: APB interface clock source
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: ref
|
||||||
|
- const: pclk
|
||||||
|
|
||||||
|
resets:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
canaan,k210-sysctl-power:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||||
|
description: |
|
||||||
|
phandle of the K210 system controller node and offset of its
|
||||||
|
power domain control register.
|
||||||
|
|
||||||
|
patternProperties:
|
||||||
|
'-pinmux$':
|
||||||
|
type: object
|
||||||
|
$ref: /schemas/pinctrl/pinmux-node.yaml
|
||||||
|
description:
|
||||||
|
FPIOA client devices use sub-nodes to define the desired pin
|
||||||
|
configuration. Client device sub-nodes use the pinux property
|
||||||
|
below.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
pinmux:
|
||||||
|
description:
|
||||||
|
List of IO pins alternate functions. The values for each IO
|
||||||
|
pin is a combination of an IO pin number (0 to 47) with the
|
||||||
|
desired function for the IO pin. Functions are defined as
|
||||||
|
macros in include/dt-bindings/pinctrl/k210-fpioa.h.
|
||||||
|
The K210_FPIOA(IO pin, function) macro is provided to
|
||||||
|
facilitate the combination of IO pin numbers and functions.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- pinmux
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
'-pins$':
|
||||||
|
type: object
|
||||||
|
$ref: /schemas/pinctrl/pincfg-node.yaml
|
||||||
|
description:
|
||||||
|
FPIOA client devices use sub-nodes to define the desired
|
||||||
|
configuration of pins. Client device sub-nodes use the
|
||||||
|
properties below.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
pins:
|
||||||
|
description:
|
||||||
|
List of IO pins affected by the properties specified in this
|
||||||
|
subnode. IO pins are identified using the pin names "IO_xx".
|
||||||
|
Pin configuration nodes can also define the power domain to
|
||||||
|
be used for the SoC pin groups A0 (IO pins 0-5),
|
||||||
|
A1 (IO pins 6-11), A2 (IO pins 12-17), B0 (IO pins 18-23),
|
||||||
|
B1 (IO pins 24-29), B2 (IO pins 30-35), B3 (IO pins 30-35),
|
||||||
|
C0 (IO pins 36-41) and C1 (IO pins 42-47) using the
|
||||||
|
power-source property.
|
||||||
|
items:
|
||||||
|
anyOf:
|
||||||
|
- pattern: "^(IO_([0-9]*))|(A[0-2])|(B[3-5])|(C[6-7])$"
|
||||||
|
- enum: [ IO_0, IO_1, IO_2, IO_3, IO_4, IO_5, IO_6, IO_7,
|
||||||
|
IO_8, IO_9, IO_10, IO_11, IO_12, IO_13, IO_14,
|
||||||
|
IO_15, IO_16, IO_17, IO_18, IO_19, IO_20, IO_21,
|
||||||
|
IO_22, IO_23, IO_24, IO_25, IO_26, IO_27, IO_28,
|
||||||
|
IO_29, IO_30, IO_31, IO_32, IO_33, IO_34, IO_35,
|
||||||
|
IO_36, IO_37, IO_38, IO_39, IO_40, IO_41, IO_42,
|
||||||
|
IO_43, IO_44, IO_45, IO_46, IO_47,
|
||||||
|
A0, A1, A2, B3, B4, B5, C6, C7 ]
|
||||||
|
bias-disable: true
|
||||||
|
|
||||||
|
bias-pull-down: true
|
||||||
|
|
||||||
|
bias-pull-up: true
|
||||||
|
|
||||||
|
drive-strength: true
|
||||||
|
|
||||||
|
drive-strength-microamp: true
|
||||||
|
|
||||||
|
input-enable: true
|
||||||
|
|
||||||
|
input-disable: true
|
||||||
|
|
||||||
|
input-schmitt-enable: true
|
||||||
|
|
||||||
|
input-schmitt-disable: true
|
||||||
|
|
||||||
|
input-polarity-invert:
|
||||||
|
description:
|
||||||
|
Enable or disable pin input polarity inversion.
|
||||||
|
|
||||||
|
output-enable: true
|
||||||
|
|
||||||
|
output-disable: true
|
||||||
|
|
||||||
|
output-high: true
|
||||||
|
|
||||||
|
output-low: true
|
||||||
|
|
||||||
|
output-polarity-invert:
|
||||||
|
description:
|
||||||
|
Enable or disable pin output polarity inversion.
|
||||||
|
|
||||||
|
slew-rate: true
|
||||||
|
|
||||||
|
power-source: true
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- clocks
|
||||||
|
- canaan,k210-sysctl-power
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/pinctrl/k210-fpioa.h>
|
||||||
|
#include <dt-bindings/clock/k210-clk.h>
|
||||||
|
#include <dt-bindings/reset/k210-rst.h>
|
||||||
|
|
||||||
|
fpioa: pinmux@502B0000 {
|
||||||
|
compatible = "canaan,k210-fpioa";
|
||||||
|
reg = <0x502B0000 0x100>;
|
||||||
|
clocks = <&sysclk K210_CLK_FPIOA>,
|
||||||
|
<&sysclk K210_CLK_APB0>;
|
||||||
|
clock-names = "ref", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_FPIOA>;
|
||||||
|
canaan,k210-sysctl-power = <&sysctl 108>;
|
||||||
|
pinctrl-0 = <&jtag_pinctrl>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
|
||||||
|
jtag_pinctrl: jtag-pinmux {
|
||||||
|
pinmux = <K210_FPIOA(0, K210_PCF_JTAG_TCLK)>,
|
||||||
|
<K210_FPIOA(1, K210_PCF_JTAG_TDI)>,
|
||||||
|
<K210_FPIOA(2, K210_PCF_JTAG_TMS)>,
|
||||||
|
<K210_FPIOA(3, K210_PCF_JTAG_TDO)>;
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -25,12 +25,15 @@ description:
|
|||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
items:
|
items:
|
||||||
- const: sifive,fu540-c000-pwm
|
- enum:
|
||||||
|
- sifive,fu540-c000-pwm
|
||||||
|
- sifive,fu740-c000-pwm
|
||||||
- const: sifive,pwm0
|
- const: sifive,pwm0
|
||||||
description:
|
description:
|
||||||
Should be "sifive,<chip>-pwm" and "sifive,pwm<version>". Supported
|
Should be "sifive,<chip>-pwm" and "sifive,pwm<version>". Supported
|
||||||
compatible strings are "sifive,fu540-c000-pwm" for the SiFive PWM v0
|
compatible strings are "sifive,fu540-c000-pwm" and
|
||||||
as integrated onto the SiFive FU540 chip, and "sifive,pwm0" for the
|
"sifive,fu740-c000-pwm" for the SiFive PWM v0 as integrated onto the
|
||||||
|
SiFive FU540 and FU740 chip respectively, and "sifive,pwm0" for the
|
||||||
SiFive PWM v0 IP block with no chip integration tweaks.
|
SiFive PWM v0 IP block with no chip integration tweaks.
|
||||||
Please refer to sifive-blocks-ip-versioning.txt for details.
|
Please refer to sifive-blocks-ip-versioning.txt for details.
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
ZTE ZX PWM controller
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible: Should be "zte,zx296718-pwm".
|
|
||||||
- reg: Physical base address and length of the controller's registers.
|
|
||||||
- clocks : The phandle and specifier referencing the controller's clocks.
|
|
||||||
- clock-names: "pclk" for PCLK, "wclk" for WCLK to the PWM controller. The
|
|
||||||
PCLK is for register access, while WCLK is the reference clock for
|
|
||||||
calculating period and duty cycles.
|
|
||||||
- #pwm-cells: Should be 3. See pwm.yaml in this directory for a description of
|
|
||||||
the cells format.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
pwm: pwm@1439000 {
|
|
||||||
compatible = "zte,zx296718-pwm";
|
|
||||||
reg = <0x1439000 0x1000>;
|
|
||||||
clocks = <&lsp1crm LSP1_PWM_PCLK>,
|
|
||||||
<&lsp1crm LSP1_PWM_WCLK>;
|
|
||||||
clock-names = "pclk", "wclk";
|
|
||||||
#pwm-cells = <3>;
|
|
||||||
};
|
|
||||||
40
Documentation/devicetree/bindings/reset/canaan,k210-rst.yaml
Normal file
40
Documentation/devicetree/bindings/reset/canaan,k210-rst.yaml
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/reset/canaan,k210-rst.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Canaan Kendryte K210 Reset Controller Device Tree Bindings
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Damien Le Moal <damien.lemoal@wdc.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Canaan Kendryte K210 reset controller driver which supports the SoC
|
||||||
|
system controller supplied reset registers for the various peripherals
|
||||||
|
of the SoC. The K210 reset controller node must be defined as a child
|
||||||
|
node of the K210 system controller node.
|
||||||
|
|
||||||
|
See also:
|
||||||
|
- dt-bindings/reset/k210-rst.h
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: canaan,k210-rst
|
||||||
|
|
||||||
|
'#reset-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- '#reset-cells'
|
||||||
|
- compatible
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/reset/k210-rst.h>
|
||||||
|
sysrst: reset-controller {
|
||||||
|
compatible = "canaan,k210-rst";
|
||||||
|
#reset-cells = <1>;
|
||||||
|
};
|
||||||
47
Documentation/devicetree/bindings/riscv/canaan.yaml
Normal file
47
Documentation/devicetree/bindings/riscv/canaan.yaml
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/riscv/canaan.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Canaan SoC-based boards
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Damien Le Moal <damien.lemoal@wdc.com>
|
||||||
|
|
||||||
|
description:
|
||||||
|
Canaan Kendryte K210 SoC-based boards
|
||||||
|
|
||||||
|
properties:
|
||||||
|
$nodename:
|
||||||
|
const: '/'
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- items:
|
||||||
|
- const: sipeed,maix-bit
|
||||||
|
- const: sipeed,maix-bitm
|
||||||
|
- const: canaan,kendryte-k210
|
||||||
|
|
||||||
|
- items:
|
||||||
|
- const: sipeed,maix-go
|
||||||
|
- const: canaan,kendryte-k210
|
||||||
|
|
||||||
|
- items:
|
||||||
|
- const: sipeed,maix-dock-m1
|
||||||
|
- const: sipeed,maix-dock-m1w
|
||||||
|
- const: canaan,kendryte-k210
|
||||||
|
|
||||||
|
- items:
|
||||||
|
- const: sipeed,maixduino
|
||||||
|
- const: canaan,kendryte-k210
|
||||||
|
|
||||||
|
- items:
|
||||||
|
- const: canaan,kendryte-kd233
|
||||||
|
- const: canaan,kendryte-k210
|
||||||
|
|
||||||
|
- items:
|
||||||
|
- const: canaan,kendryte-k210
|
||||||
|
|
||||||
|
additionalProperties: true
|
||||||
|
|
||||||
|
...
|
||||||
@@ -28,11 +28,18 @@ properties:
|
|||||||
- items:
|
- items:
|
||||||
- enum:
|
- enum:
|
||||||
- sifive,rocket0
|
- sifive,rocket0
|
||||||
|
- sifive,bullet0
|
||||||
- sifive,e5
|
- sifive,e5
|
||||||
|
- sifive,e7
|
||||||
- sifive,e51
|
- sifive,e51
|
||||||
|
- sifive,e71
|
||||||
- sifive,u54-mc
|
- sifive,u54-mc
|
||||||
|
- sifive,u74-mc
|
||||||
- sifive,u54
|
- sifive,u54
|
||||||
|
- sifive,u74
|
||||||
- sifive,u5
|
- sifive,u5
|
||||||
|
- sifive,u7
|
||||||
|
- canaan,k210
|
||||||
- const: riscv
|
- const: riscv
|
||||||
- const: riscv # Simulator only
|
- const: riscv # Simulator only
|
||||||
description:
|
description:
|
||||||
@@ -50,6 +57,7 @@ properties:
|
|||||||
- riscv,sv32
|
- riscv,sv32
|
||||||
- riscv,sv39
|
- riscv,sv39
|
||||||
- riscv,sv48
|
- riscv,sv48
|
||||||
|
- riscv,none
|
||||||
|
|
||||||
riscv,isa:
|
riscv,isa:
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ select:
|
|||||||
items:
|
items:
|
||||||
- enum:
|
- enum:
|
||||||
- sifive,fu540-c000-ccache
|
- sifive,fu540-c000-ccache
|
||||||
|
- sifive,fu740-c000-ccache
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
@@ -34,7 +35,9 @@ select:
|
|||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
items:
|
items:
|
||||||
- const: sifive,fu540-c000-ccache
|
- enum:
|
||||||
|
- sifive,fu540-c000-ccache
|
||||||
|
- sifive,fu740-c000-ccache
|
||||||
- const: cache
|
- const: cache
|
||||||
|
|
||||||
cache-block-size:
|
cache-block-size:
|
||||||
@@ -52,10 +55,13 @@ properties:
|
|||||||
cache-unified: true
|
cache-unified: true
|
||||||
|
|
||||||
interrupts:
|
interrupts:
|
||||||
description: |
|
|
||||||
Must contain entries for DirError, DataError and DataFail signals.
|
|
||||||
minItems: 3
|
minItems: 3
|
||||||
maxItems: 3
|
maxItems: 4
|
||||||
|
items:
|
||||||
|
- description: DirError interrupt
|
||||||
|
- description: DataError interrupt
|
||||||
|
- description: DataFail interrupt
|
||||||
|
- description: DirFail interrupt
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
@@ -68,6 +74,26 @@ properties:
|
|||||||
The reference to the reserved-memory for the L2 Loosely Integrated Memory region.
|
The reference to the reserved-memory for the L2 Loosely Integrated Memory region.
|
||||||
The reserved memory node should be defined as per the bindings in reserved-memory.txt.
|
The reserved memory node should be defined as per the bindings in reserved-memory.txt.
|
||||||
|
|
||||||
|
if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
const: sifive,fu540-c000-ccache
|
||||||
|
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
interrupts:
|
||||||
|
description: |
|
||||||
|
Must contain entries for DirError, DataError and DataFail signals.
|
||||||
|
maxItems: 3
|
||||||
|
|
||||||
|
else:
|
||||||
|
properties:
|
||||||
|
interrupts:
|
||||||
|
description: |
|
||||||
|
Must contain entries for DirError, DataError, DataFail, DirFail signals.
|
||||||
|
minItems: 4
|
||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
|
||||||
required:
|
required:
|
||||||
|
|||||||
@@ -17,12 +17,19 @@ properties:
|
|||||||
$nodename:
|
$nodename:
|
||||||
const: '/'
|
const: '/'
|
||||||
compatible:
|
compatible:
|
||||||
items:
|
oneOf:
|
||||||
|
- items:
|
||||||
- enum:
|
- enum:
|
||||||
- sifive,hifive-unleashed-a00
|
- sifive,hifive-unleashed-a00
|
||||||
- const: sifive,fu540-c000
|
- const: sifive,fu540-c000
|
||||||
- const: sifive,fu540
|
- const: sifive,fu540
|
||||||
|
|
||||||
|
- items:
|
||||||
|
- enum:
|
||||||
|
- sifive,hifive-unmatched-a00
|
||||||
|
- const: sifive,fu740-c000
|
||||||
|
- const: sifive,fu740
|
||||||
|
|
||||||
additionalProperties: true
|
additionalProperties: true
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ properties:
|
|||||||
- enum:
|
- enum:
|
||||||
- sifive,fu540-c000-uart
|
- sifive,fu540-c000-uart
|
||||||
- sifive,fu740-c000-uart
|
- sifive,fu740-c000-uart
|
||||||
|
- canaan,k210-uarths
|
||||||
- const: sifive,uart0
|
- const: sifive,uart0
|
||||||
|
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -23,15 +23,19 @@ description:
|
|||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
items:
|
items:
|
||||||
- const: sifive,fu540-c000-clint
|
- enum:
|
||||||
|
- sifive,fu540-c000-clint
|
||||||
|
- canaan,k210-clint
|
||||||
- const: sifive,clint0
|
- const: sifive,clint0
|
||||||
|
|
||||||
description:
|
description:
|
||||||
Should be "sifive,<chip>-clint" and "sifive,clint<version>".
|
Should be "<vendor>,<chip>-clint" and "sifive,clint<version>".
|
||||||
Supported compatible strings are -
|
Supported compatible strings are -
|
||||||
"sifive,fu540-c000-clint" for the SiFive CLINT v0 as integrated
|
"sifive,fu540-c000-clint" for the SiFive CLINT v0 as integrated
|
||||||
onto the SiFive FU540 chip, and "sifive,clint0" for the SiFive
|
onto the SiFive FU540 chip, "canaan,k210-clint" for the SiFive
|
||||||
CLINT v0 IP block with no chip integration tweaks.
|
CLINT v0 as integrated onto the Canaan Kendryte K210 chip, and
|
||||||
|
"sifive,clint0" for the SiFive CLINT v0 IP block with no chip
|
||||||
|
integration tweaks.
|
||||||
Please refer to sifive-blocks-ip-versioning.txt for details
|
Please refer to sifive-blocks-ip-versioning.txt for details
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ properties:
|
|||||||
interrupts:
|
interrupts:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
|
resets:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
items:
|
items:
|
||||||
|
|||||||
@@ -217,6 +217,12 @@ between the calls to start() and stop(), so holding a lock during that time
|
|||||||
is a reasonable thing to do. The seq_file code will also avoid taking any
|
is a reasonable thing to do. The seq_file code will also avoid taking any
|
||||||
other locks while the iterator is active.
|
other locks while the iterator is active.
|
||||||
|
|
||||||
|
The iterater value returned by start() or next() is guaranteed to be
|
||||||
|
passed to a subsequent next() or stop() call. This allows resources
|
||||||
|
such as locks that were taken to be reliably released. There is *no*
|
||||||
|
guarantee that the iterator will be passed to show(), though in practice
|
||||||
|
it often will be.
|
||||||
|
|
||||||
|
|
||||||
Formatted output
|
Formatted output
|
||||||
================
|
================
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ This document describes the Linux kernel Makefiles.
|
|||||||
--- 3.1 Goal definitions
|
--- 3.1 Goal definitions
|
||||||
--- 3.2 Built-in object goals - obj-y
|
--- 3.2 Built-in object goals - obj-y
|
||||||
--- 3.3 Loadable module goals - obj-m
|
--- 3.3 Loadable module goals - obj-m
|
||||||
--- 3.4 Objects which export symbols
|
--- 3.4 <deleted>
|
||||||
--- 3.5 Library file goals - lib-y
|
--- 3.5 Library file goals - lib-y
|
||||||
--- 3.6 Descending down in directories
|
--- 3.6 Descending down in directories
|
||||||
--- 3.7 Non-builtin vmlinux targets - extra-y
|
--- 3.7 Non-builtin vmlinux targets - extra-y
|
||||||
@@ -247,12 +247,6 @@ more details, with real examples.
|
|||||||
kbuild will build an ext2.o file for you out of the individual
|
kbuild will build an ext2.o file for you out of the individual
|
||||||
parts and then link this into built-in.a, as you would expect.
|
parts and then link this into built-in.a, as you would expect.
|
||||||
|
|
||||||
3.4 Objects which export symbols
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
No special notation is required in the makefiles for
|
|
||||||
modules exporting symbols.
|
|
||||||
|
|
||||||
3.5 Library file goals - lib-y
|
3.5 Library file goals - lib-y
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -4519,6 +4519,7 @@ KVM_GET_SUPPORTED_CPUID ioctl because some of them intersect with KVM feature
|
|||||||
leaves (0x40000000, 0x40000001).
|
leaves (0x40000000, 0x40000001).
|
||||||
|
|
||||||
Currently, the following list of CPUID leaves are returned:
|
Currently, the following list of CPUID leaves are returned:
|
||||||
|
|
||||||
- HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS
|
- HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS
|
||||||
- HYPERV_CPUID_INTERFACE
|
- HYPERV_CPUID_INTERFACE
|
||||||
- HYPERV_CPUID_VERSION
|
- HYPERV_CPUID_VERSION
|
||||||
@@ -4543,6 +4544,7 @@ userspace should not expect to get any particular value there.
|
|||||||
Note, vcpu version of KVM_GET_SUPPORTED_HV_CPUID is currently deprecated. Unlike
|
Note, vcpu version of KVM_GET_SUPPORTED_HV_CPUID is currently deprecated. Unlike
|
||||||
system ioctl which exposes all supported feature bits unconditionally, vcpu
|
system ioctl which exposes all supported feature bits unconditionally, vcpu
|
||||||
version has the following quirks:
|
version has the following quirks:
|
||||||
|
|
||||||
- HYPERV_CPUID_NESTED_FEATURES leaf and HV_X64_ENLIGHTENED_VMCS_RECOMMENDED
|
- HYPERV_CPUID_NESTED_FEATURES leaf and HV_X64_ENLIGHTENED_VMCS_RECOMMENDED
|
||||||
feature bit are only exposed when Enlightened VMCS was previously enabled
|
feature bit are only exposed when Enlightened VMCS was previously enabled
|
||||||
on the corresponding vCPU (KVM_CAP_HYPERV_ENLIGHTENED_VMCS).
|
on the corresponding vCPU (KVM_CAP_HYPERV_ENLIGHTENED_VMCS).
|
||||||
|
|||||||
51
MAINTAINERS
51
MAINTAINERS
@@ -261,6 +261,8 @@ ABI/API
|
|||||||
L: linux-api@vger.kernel.org
|
L: linux-api@vger.kernel.org
|
||||||
F: include/linux/syscalls.h
|
F: include/linux/syscalls.h
|
||||||
F: kernel/sys_ni.c
|
F: kernel/sys_ni.c
|
||||||
|
F: include/uapi/
|
||||||
|
F: arch/*/include/uapi/
|
||||||
|
|
||||||
ABIT UGURU 1,2 HARDWARE MONITOR DRIVER
|
ABIT UGURU 1,2 HARDWARE MONITOR DRIVER
|
||||||
M: Hans de Goede <hdegoede@redhat.com>
|
M: Hans de Goede <hdegoede@redhat.com>
|
||||||
@@ -2982,7 +2984,7 @@ F: include/uapi/linux/audit.h
|
|||||||
F: kernel/audit*
|
F: kernel/audit*
|
||||||
|
|
||||||
AUXILIARY DISPLAY DRIVERS
|
AUXILIARY DISPLAY DRIVERS
|
||||||
M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>
|
M: Miguel Ojeda <ojeda@kernel.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/auxdisplay/
|
F: drivers/auxdisplay/
|
||||||
F: include/linux/cfag12864b.h
|
F: include/linux/cfag12864b.h
|
||||||
@@ -3853,6 +3855,29 @@ W: https://github.com/Cascoda/ca8210-linux.git
|
|||||||
F: Documentation/devicetree/bindings/net/ieee802154/ca8210.txt
|
F: Documentation/devicetree/bindings/net/ieee802154/ca8210.txt
|
||||||
F: drivers/net/ieee802154/ca8210.c
|
F: drivers/net/ieee802154/ca8210.c
|
||||||
|
|
||||||
|
CANAAN/KENDRYTE K210 SOC FPIOA DRIVER
|
||||||
|
M: Damien Le Moal <damien.lemoal@wdc.com>
|
||||||
|
L: linux-riscv@lists.infradead.org
|
||||||
|
L: linux-gpio@vger.kernel.org (pinctrl driver)
|
||||||
|
F: Documentation/devicetree/bindings/pinctrl/canaan,k210-fpioa.yaml
|
||||||
|
F: drivers/pinctrl/pinctrl-k210.c
|
||||||
|
|
||||||
|
CANAAN/KENDRYTE K210 SOC RESET CONTROLLER DRIVER
|
||||||
|
M: Damien Le Moal <damien.lemoal@wdc.com>
|
||||||
|
L: linux-kernel@vger.kernel.org
|
||||||
|
L: linux-riscv@lists.infradead.org
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/devicetree/bindings/reset/canaan,k210-rst.yaml
|
||||||
|
F: drivers/reset/reset-k210.c
|
||||||
|
|
||||||
|
CANAAN/KENDRYTE K210 SOC SYSTEM CONTROLLER DRIVER
|
||||||
|
M: Damien Le Moal <damien.lemoal@wdc.com>
|
||||||
|
L: linux-riscv@lists.infradead.org
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/devicetree/bindings/mfd/canaan,k210-sysctl.yaml
|
||||||
|
F: drivers/soc/canaan/
|
||||||
|
F: include/soc/canaan/
|
||||||
|
|
||||||
CACHEFILES: FS-CACHE BACKEND FOR CACHING ON MOUNTED FILESYSTEMS
|
CACHEFILES: FS-CACHE BACKEND FOR CACHING ON MOUNTED FILESYSTEMS
|
||||||
M: David Howells <dhowells@redhat.com>
|
M: David Howells <dhowells@redhat.com>
|
||||||
L: linux-cachefs@redhat.com (moderated for non-subscribers)
|
L: linux-cachefs@redhat.com (moderated for non-subscribers)
|
||||||
@@ -4128,13 +4153,13 @@ F: scripts/extract-cert.c
|
|||||||
F: scripts/sign-file.c
|
F: scripts/sign-file.c
|
||||||
|
|
||||||
CFAG12864B LCD DRIVER
|
CFAG12864B LCD DRIVER
|
||||||
M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>
|
M: Miguel Ojeda <ojeda@kernel.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/auxdisplay/cfag12864b.c
|
F: drivers/auxdisplay/cfag12864b.c
|
||||||
F: include/linux/cfag12864b.h
|
F: include/linux/cfag12864b.h
|
||||||
|
|
||||||
CFAG12864BFB LCD FRAMEBUFFER DRIVER
|
CFAG12864BFB LCD FRAMEBUFFER DRIVER
|
||||||
M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>
|
M: Miguel Ojeda <ojeda@kernel.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/auxdisplay/cfag12864bfb.c
|
F: drivers/auxdisplay/cfag12864bfb.c
|
||||||
F: include/linux/cfag12864b.h
|
F: include/linux/cfag12864b.h
|
||||||
@@ -4304,7 +4329,7 @@ S: Supported
|
|||||||
F: drivers/infiniband/hw/usnic/
|
F: drivers/infiniband/hw/usnic/
|
||||||
|
|
||||||
CLANG-FORMAT FILE
|
CLANG-FORMAT FILE
|
||||||
M: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
|
M: Miguel Ojeda <ojeda@kernel.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: .clang-format
|
F: .clang-format
|
||||||
|
|
||||||
@@ -4319,8 +4344,6 @@ C: irc://chat.freenode.net/clangbuiltlinux
|
|||||||
F: Documentation/kbuild/llvm.rst
|
F: Documentation/kbuild/llvm.rst
|
||||||
F: include/linux/compiler-clang.h
|
F: include/linux/compiler-clang.h
|
||||||
F: scripts/clang-tools/
|
F: scripts/clang-tools/
|
||||||
F: scripts/clang-version.sh
|
|
||||||
F: scripts/lld-version.sh
|
|
||||||
K: \b(?i:clang|llvm)\b
|
K: \b(?i:clang|llvm)\b
|
||||||
|
|
||||||
CLEANCACHE API
|
CLEANCACHE API
|
||||||
@@ -4446,7 +4469,7 @@ S: Maintained
|
|||||||
F: drivers/platform/x86/compal-laptop.c
|
F: drivers/platform/x86/compal-laptop.c
|
||||||
|
|
||||||
COMPILER ATTRIBUTES
|
COMPILER ATTRIBUTES
|
||||||
M: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
|
M: Miguel Ojeda <ojeda@kernel.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: include/linux/compiler_attributes.h
|
F: include/linux/compiler_attributes.h
|
||||||
|
|
||||||
@@ -9876,6 +9899,18 @@ F: include/linux/keyctl.h
|
|||||||
F: include/uapi/linux/keyctl.h
|
F: include/uapi/linux/keyctl.h
|
||||||
F: security/keys/
|
F: security/keys/
|
||||||
|
|
||||||
|
KFENCE
|
||||||
|
M: Alexander Potapenko <glider@google.com>
|
||||||
|
M: Marco Elver <elver@google.com>
|
||||||
|
R: Dmitry Vyukov <dvyukov@google.com>
|
||||||
|
L: kasan-dev@googlegroups.com
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/dev-tools/kfence.rst
|
||||||
|
F: arch/*/include/asm/kfence.h
|
||||||
|
F: include/linux/kfence.h
|
||||||
|
F: lib/Kconfig.kfence
|
||||||
|
F: mm/kfence/
|
||||||
|
|
||||||
KFIFO
|
KFIFO
|
||||||
M: Stefani Seibold <stefani@seibold.net>
|
M: Stefani Seibold <stefani@seibold.net>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@@ -9936,7 +9971,7 @@ F: include/linux/kprobes.h
|
|||||||
F: kernel/kprobes.c
|
F: kernel/kprobes.c
|
||||||
|
|
||||||
KS0108 LCD CONTROLLER DRIVER
|
KS0108 LCD CONTROLLER DRIVER
|
||||||
M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>
|
M: Miguel Ojeda <ojeda@kernel.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/admin-guide/auxdisplay/ks0108.rst
|
F: Documentation/admin-guide/auxdisplay/ks0108.rst
|
||||||
F: drivers/auxdisplay/ks0108.c
|
F: drivers/auxdisplay/ks0108.c
|
||||||
|
|||||||
107
Makefile
107
Makefile
@@ -100,6 +100,36 @@ endif
|
|||||||
|
|
||||||
export quiet Q KBUILD_VERBOSE
|
export quiet Q KBUILD_VERBOSE
|
||||||
|
|
||||||
|
# Call a source code checker (by default, "sparse") as part of the
|
||||||
|
# C compilation.
|
||||||
|
#
|
||||||
|
# Use 'make C=1' to enable checking of only re-compiled files.
|
||||||
|
# Use 'make C=2' to enable checking of *all* source files, regardless
|
||||||
|
# of whether they are re-compiled or not.
|
||||||
|
#
|
||||||
|
# See the file "Documentation/dev-tools/sparse.rst" for more details,
|
||||||
|
# including where to get the "sparse" utility.
|
||||||
|
|
||||||
|
ifeq ("$(origin C)", "command line")
|
||||||
|
KBUILD_CHECKSRC = $(C)
|
||||||
|
endif
|
||||||
|
ifndef KBUILD_CHECKSRC
|
||||||
|
KBUILD_CHECKSRC = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
export KBUILD_CHECKSRC
|
||||||
|
|
||||||
|
# Use make M=dir or set the environment variable KBUILD_EXTMOD to specify the
|
||||||
|
# directory of external module to build. Setting M= takes precedence.
|
||||||
|
ifeq ("$(origin M)", "command line")
|
||||||
|
KBUILD_EXTMOD := $(M)
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(if $(word 2, $(KBUILD_EXTMOD)), \
|
||||||
|
$(error building multiple external modules is not supported))
|
||||||
|
|
||||||
|
export KBUILD_EXTMOD
|
||||||
|
|
||||||
# Kbuild will save output files in the current working directory.
|
# Kbuild will save output files in the current working directory.
|
||||||
# This does not need to match to the root of the kernel source tree.
|
# This does not need to match to the root of the kernel source tree.
|
||||||
#
|
#
|
||||||
@@ -145,7 +175,8 @@ else
|
|||||||
need-sub-make := 1
|
need-sub-make := 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
abs_srctree := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
|
this-makefile := $(lastword $(MAKEFILE_LIST))
|
||||||
|
abs_srctree := $(realpath $(dir $(this-makefile)))
|
||||||
|
|
||||||
ifneq ($(words $(subst :, ,$(abs_srctree))), 1)
|
ifneq ($(words $(subst :, ,$(abs_srctree))), 1)
|
||||||
$(error source directory cannot contain spaces or colons)
|
$(error source directory cannot contain spaces or colons)
|
||||||
@@ -160,8 +191,6 @@ MAKEFLAGS += --include-dir=$(abs_srctree)
|
|||||||
need-sub-make := 1
|
need-sub-make := 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
this-makefile := $(lastword $(MAKEFILE_LIST))
|
|
||||||
|
|
||||||
ifneq ($(filter 3.%,$(MAKE_VERSION)),)
|
ifneq ($(filter 3.%,$(MAKE_VERSION)),)
|
||||||
# 'MAKEFLAGS += -rR' does not immediately become effective for GNU Make 3.x
|
# 'MAKEFLAGS += -rR' does not immediately become effective for GNU Make 3.x
|
||||||
# We need to invoke sub-make to avoid implicit rules in the top Makefile.
|
# We need to invoke sub-make to avoid implicit rules in the top Makefile.
|
||||||
@@ -195,36 +224,6 @@ ifeq ($(need-sub-make),)
|
|||||||
# so that IDEs/editors are able to understand relative filenames.
|
# so that IDEs/editors are able to understand relative filenames.
|
||||||
MAKEFLAGS += --no-print-directory
|
MAKEFLAGS += --no-print-directory
|
||||||
|
|
||||||
# Call a source code checker (by default, "sparse") as part of the
|
|
||||||
# C compilation.
|
|
||||||
#
|
|
||||||
# Use 'make C=1' to enable checking of only re-compiled files.
|
|
||||||
# Use 'make C=2' to enable checking of *all* source files, regardless
|
|
||||||
# of whether they are re-compiled or not.
|
|
||||||
#
|
|
||||||
# See the file "Documentation/dev-tools/sparse.rst" for more details,
|
|
||||||
# including where to get the "sparse" utility.
|
|
||||||
|
|
||||||
ifeq ("$(origin C)", "command line")
|
|
||||||
KBUILD_CHECKSRC = $(C)
|
|
||||||
endif
|
|
||||||
ifndef KBUILD_CHECKSRC
|
|
||||||
KBUILD_CHECKSRC = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Use make M=dir or set the environment variable KBUILD_EXTMOD to specify the
|
|
||||||
# directory of external module to build. Setting M= takes precedence.
|
|
||||||
ifeq ("$(origin M)", "command line")
|
|
||||||
KBUILD_EXTMOD := $(M)
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(if $(word 2, $(KBUILD_EXTMOD)), \
|
|
||||||
$(error building multiple external modules is not supported))
|
|
||||||
|
|
||||||
export KBUILD_CHECKSRC KBUILD_EXTMOD
|
|
||||||
|
|
||||||
extmod-prefix = $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/)
|
|
||||||
|
|
||||||
ifeq ($(abs_srctree),$(abs_objtree))
|
ifeq ($(abs_srctree),$(abs_objtree))
|
||||||
# building in the source tree
|
# building in the source tree
|
||||||
srctree := .
|
srctree := .
|
||||||
@@ -257,7 +256,6 @@ export building_out_of_srctree srctree objtree VPATH
|
|||||||
# of make so .config is not included in this case either (for *config).
|
# of make so .config is not included in this case either (for *config).
|
||||||
|
|
||||||
version_h := include/generated/uapi/linux/version.h
|
version_h := include/generated/uapi/linux/version.h
|
||||||
old_version_h := include/linux/version.h
|
|
||||||
|
|
||||||
clean-targets := %clean mrproper cleandocs
|
clean-targets := %clean mrproper cleandocs
|
||||||
no-dot-config-targets := $(clean-targets) \
|
no-dot-config-targets := $(clean-targets) \
|
||||||
@@ -559,7 +557,13 @@ ifdef building_out_of_srctree
|
|||||||
{ echo "# this is build directory, ignore it"; echo "*"; } > .gitignore
|
{ echo "# this is build directory, ignore it"; echo "*"; } > .gitignore
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),)
|
# The expansion should be delayed until arch/$(SRCARCH)/Makefile is included.
|
||||||
|
# Some architectures define CROSS_COMPILE in arch/$(SRCARCH)/Makefile.
|
||||||
|
# CC_VERSION_TEXT is referenced from Kconfig (so it needs export),
|
||||||
|
# and from include/config/auto.conf.cmd to detect the compiler upgrade.
|
||||||
|
CC_VERSION_TEXT = $(shell $(CC) --version 2>/dev/null | head -n 1 | sed 's/\#//g')
|
||||||
|
|
||||||
|
ifneq ($(findstring clang,$(CC_VERSION_TEXT)),)
|
||||||
ifneq ($(CROSS_COMPILE),)
|
ifneq ($(CROSS_COMPILE),)
|
||||||
CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
|
CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
|
||||||
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit))
|
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit))
|
||||||
@@ -578,12 +582,6 @@ KBUILD_AFLAGS += $(CLANG_FLAGS)
|
|||||||
export CLANG_FLAGS
|
export CLANG_FLAGS
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# The expansion should be delayed until arch/$(SRCARCH)/Makefile is included.
|
|
||||||
# Some architectures define CROSS_COMPILE in arch/$(SRCARCH)/Makefile.
|
|
||||||
# CC_VERSION_TEXT is referenced from Kconfig (so it needs export),
|
|
||||||
# and from include/config/auto.conf.cmd to detect the compiler upgrade.
|
|
||||||
CC_VERSION_TEXT = $(shell $(CC) --version 2>/dev/null | head -n 1)
|
|
||||||
|
|
||||||
ifdef config-build
|
ifdef config-build
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
# *config targets only - make sure prerequisites are updated, and descend
|
# *config targets only - make sure prerequisites are updated, and descend
|
||||||
@@ -833,8 +831,10 @@ ifneq ($(LLVM_IAS),1)
|
|||||||
KBUILD_AFLAGS += -Wa,-gdwarf-2
|
KBUILD_AFLAGS += -Wa,-gdwarf-2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_DEBUG_INFO_DWARF4
|
ifndef CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT
|
||||||
DEBUG_CFLAGS += -gdwarf-4
|
dwarf-version-$(CONFIG_DEBUG_INFO_DWARF4) := 4
|
||||||
|
dwarf-version-$(CONFIG_DEBUG_INFO_DWARF5) := 5
|
||||||
|
DEBUG_CFLAGS += -gdwarf-$(dwarf-version-y)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_DEBUG_INFO_REDUCED
|
ifdef CONFIG_DEBUG_INFO_REDUCED
|
||||||
@@ -1073,7 +1073,7 @@ ifdef CONFIG_MODULE_COMPRESS
|
|||||||
mod_compress_cmd = $(KGZIP) -n -f
|
mod_compress_cmd = $(KGZIP) -n -f
|
||||||
endif # CONFIG_MODULE_COMPRESS_GZIP
|
endif # CONFIG_MODULE_COMPRESS_GZIP
|
||||||
ifdef CONFIG_MODULE_COMPRESS_XZ
|
ifdef CONFIG_MODULE_COMPRESS_XZ
|
||||||
mod_compress_cmd = $(XZ) -f
|
mod_compress_cmd = $(XZ) --lzma2=dict=2MiB -f
|
||||||
endif # CONFIG_MODULE_COMPRESS_XZ
|
endif # CONFIG_MODULE_COMPRESS_XZ
|
||||||
endif # CONFIG_MODULE_COMPRESS
|
endif # CONFIG_MODULE_COMPRESS
|
||||||
export mod_compress_cmd
|
export mod_compress_cmd
|
||||||
@@ -1125,6 +1125,7 @@ endif # CONFIG_BPF
|
|||||||
|
|
||||||
PHONY += prepare0
|
PHONY += prepare0
|
||||||
|
|
||||||
|
extmod-prefix = $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/)
|
||||||
export MODORDER := $(extmod-prefix)modules.order
|
export MODORDER := $(extmod-prefix)modules.order
|
||||||
export MODULES_NSDEPS := $(extmod-prefix)modules.nsdeps
|
export MODULES_NSDEPS := $(extmod-prefix)modules.nsdeps
|
||||||
|
|
||||||
@@ -1323,14 +1324,22 @@ define filechk_utsrelease.h
|
|||||||
endef
|
endef
|
||||||
|
|
||||||
define filechk_version.h
|
define filechk_version.h
|
||||||
|
if [ $(SUBLEVEL) -gt 255 ]; then \
|
||||||
echo \#define LINUX_VERSION_CODE $(shell \
|
echo \#define LINUX_VERSION_CODE $(shell \
|
||||||
expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \
|
expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 255); \
|
||||||
echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))'
|
else \
|
||||||
|
echo \#define LINUX_VERSION_CODE $(shell \
|
||||||
|
expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + $(SUBLEVEL)); \
|
||||||
|
fi; \
|
||||||
|
echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + \
|
||||||
|
((c) > 255 ? 255 : (c)))'; \
|
||||||
|
echo \#define LINUX_VERSION_MAJOR $(VERSION); \
|
||||||
|
echo \#define LINUX_VERSION_PATCHLEVEL $(PATCHLEVEL); \
|
||||||
|
echo \#define LINUX_VERSION_SUBLEVEL $(SUBLEVEL)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(version_h): FORCE
|
$(version_h): FORCE
|
||||||
$(call filechk,version.h)
|
$(call filechk,version.h)
|
||||||
$(Q)rm -f $(old_version_h)
|
|
||||||
|
|
||||||
include/generated/utsrelease.h: include/config/kernel.release FORCE
|
include/generated/utsrelease.h: include/config/kernel.release FORCE
|
||||||
$(call filechk,utsrelease.h)
|
$(call filechk,utsrelease.h)
|
||||||
@@ -1517,7 +1526,7 @@ endif # CONFIG_MODULES
|
|||||||
# Directories & files removed with 'make clean'
|
# Directories & files removed with 'make clean'
|
||||||
CLEAN_FILES += include/ksym vmlinux.symvers \
|
CLEAN_FILES += include/ksym vmlinux.symvers \
|
||||||
modules.builtin modules.builtin.modinfo modules.nsdeps \
|
modules.builtin modules.builtin.modinfo modules.nsdeps \
|
||||||
compile_commands.json
|
compile_commands.json .thinlto-cache
|
||||||
|
|
||||||
# Directories & files removed with 'make mrproper'
|
# Directories & files removed with 'make mrproper'
|
||||||
MRPROPER_FILES += include/config include/generated \
|
MRPROPER_FILES += include/config include/generated \
|
||||||
@@ -1531,7 +1540,7 @@ MRPROPER_FILES += include/config include/generated \
|
|||||||
*.spec
|
*.spec
|
||||||
|
|
||||||
# Directories & files removed with 'make distclean'
|
# Directories & files removed with 'make distclean'
|
||||||
DISTCLEAN_FILES += tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS .thinlto-cache
|
DISTCLEAN_FILES += tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS
|
||||||
|
|
||||||
# clean - Delete most, but leave enough to build external modules
|
# clean - Delete most, but leave enough to build external modules
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
|||||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||||
|
|
||||||
syscall := $(srctree)/$(src)/syscall.tbl
|
syscall := $(src)/syscall.tbl
|
||||||
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
||||||
systbl := $(srctree)/$(src)/syscalltbl.sh
|
systbl := $(srctree)/$(src)/syscalltbl.sh
|
||||||
|
|
||||||
@@ -21,18 +21,19 @@ quiet_cmd_systbl = SYSTBL $@
|
|||||||
'$(systbl_abi_$(basetarget))' \
|
'$(systbl_abi_$(basetarget))' \
|
||||||
'$(systbl_offset_$(basetarget))'
|
'$(systbl_offset_$(basetarget))'
|
||||||
|
|
||||||
$(uapi)/unistd_32.h: $(syscall) $(syshdr)
|
$(uapi)/unistd_32.h: $(syscall) $(syshdr) FORCE
|
||||||
$(call if_changed,syshdr)
|
$(call if_changed,syshdr)
|
||||||
|
|
||||||
$(kapi)/syscall_table.h: $(syscall) $(systbl)
|
$(kapi)/syscall_table.h: $(syscall) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
uapisyshdr-y += unistd_32.h
|
uapisyshdr-y += unistd_32.h
|
||||||
kapisyshdr-y += syscall_table.h
|
kapisyshdr-y += syscall_table.h
|
||||||
|
|
||||||
targets += $(uapisyshdr-y) $(kapisyshdr-y)
|
uapisyshdr-y := $(addprefix $(uapi)/, $(uapisyshdr-y))
|
||||||
|
kapisyshdr-y := $(addprefix $(kapi)/, $(kapisyshdr-y))
|
||||||
|
targets += $(addprefix ../../../../, $(uapisyshdr-y) $(kapisyshdr-y))
|
||||||
|
|
||||||
PHONY += all
|
PHONY += all
|
||||||
all: $(addprefix $(uapi)/,$(uapisyshdr-y))
|
all: $(uapisyshdr-y) $(kapisyshdr-y)
|
||||||
all: $(addprefix $(kapi)/,$(kapisyshdr-y))
|
|
||||||
@:
|
@:
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ uapi := $(gen)/uapi/asm
|
|||||||
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
||||||
sysnr := $(srctree)/$(src)/syscallnr.sh
|
sysnr := $(srctree)/$(src)/syscallnr.sh
|
||||||
systbl := $(srctree)/$(src)/syscalltbl.sh
|
systbl := $(srctree)/$(src)/syscalltbl.sh
|
||||||
syscall := $(srctree)/$(src)/syscall.tbl
|
syscall := $(src)/syscall.tbl
|
||||||
|
|
||||||
gen-y := $(gen)/calls-oabi.S
|
gen-y := $(gen)/calls-oabi.S
|
||||||
gen-y += $(gen)/calls-eabi.S
|
gen-y += $(gen)/calls-eabi.S
|
||||||
|
|||||||
@@ -140,6 +140,7 @@ config ARM64
|
|||||||
select HAVE_ARCH_KASAN if !(ARM64_16K_PAGES && ARM64_VA_BITS_48)
|
select HAVE_ARCH_KASAN if !(ARM64_16K_PAGES && ARM64_VA_BITS_48)
|
||||||
select HAVE_ARCH_KASAN_SW_TAGS if HAVE_ARCH_KASAN
|
select HAVE_ARCH_KASAN_SW_TAGS if HAVE_ARCH_KASAN
|
||||||
select HAVE_ARCH_KASAN_HW_TAGS if (HAVE_ARCH_KASAN && ARM64_MTE)
|
select HAVE_ARCH_KASAN_HW_TAGS if (HAVE_ARCH_KASAN && ARM64_MTE)
|
||||||
|
select HAVE_ARCH_KFENCE
|
||||||
select HAVE_ARCH_KGDB
|
select HAVE_ARCH_KGDB
|
||||||
select HAVE_ARCH_MMAP_RND_BITS
|
select HAVE_ARCH_MMAP_RND_BITS
|
||||||
select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT
|
select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT
|
||||||
@@ -998,6 +999,7 @@ config HOTPLUG_CPU
|
|||||||
# Common NUMA Features
|
# Common NUMA Features
|
||||||
config NUMA
|
config NUMA
|
||||||
bool "NUMA Memory Allocation and Scheduler Support"
|
bool "NUMA Memory Allocation and Scheduler Support"
|
||||||
|
select GENERIC_ARCH_NUMA
|
||||||
select ACPI_NUMA if ACPI
|
select ACPI_NUMA if ACPI
|
||||||
select OF_NUMA
|
select OF_NUMA
|
||||||
help
|
help
|
||||||
@@ -1485,7 +1487,7 @@ config ARM64_PTR_AUTH
|
|||||||
depends on (CC_HAS_SIGN_RETURN_ADDRESS || CC_HAS_BRANCH_PROT_PAC_RET) && AS_HAS_PAC
|
depends on (CC_HAS_SIGN_RETURN_ADDRESS || CC_HAS_BRANCH_PROT_PAC_RET) && AS_HAS_PAC
|
||||||
# Modern compilers insert a .note.gnu.property section note for PAC
|
# Modern compilers insert a .note.gnu.property section note for PAC
|
||||||
# which is only understood by binutils starting with version 2.33.1.
|
# which is only understood by binutils starting with version 2.33.1.
|
||||||
depends on LD_IS_LLD || LD_VERSION >= 233010000 || (CC_IS_GCC && GCC_VERSION < 90100)
|
depends on LD_IS_LLD || LD_VERSION >= 23301 || (CC_IS_GCC && GCC_VERSION < 90100)
|
||||||
depends on !CC_IS_CLANG || AS_HAS_CFI_NEGATE_RA_STATE
|
depends on !CC_IS_CLANG || AS_HAS_CFI_NEGATE_RA_STATE
|
||||||
depends on (!FUNCTION_GRAPH_TRACER || DYNAMIC_FTRACE_WITH_REGS)
|
depends on (!FUNCTION_GRAPH_TRACER || DYNAMIC_FTRACE_WITH_REGS)
|
||||||
help
|
help
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
#define __ASM_CACHE_H
|
#define __ASM_CACHE_H
|
||||||
|
|
||||||
#include <asm/cputype.h>
|
#include <asm/cputype.h>
|
||||||
#include <asm/mte-kasan.h>
|
|
||||||
|
|
||||||
#define CTR_L1IP_SHIFT 14
|
#define CTR_L1IP_SHIFT 14
|
||||||
#define CTR_L1IP_MASK 3
|
#define CTR_L1IP_MASK 3
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/memory.h>
|
#include <asm/memory.h>
|
||||||
|
#include <asm/mte-kasan.h>
|
||||||
#include <asm/pgtable-types.h>
|
#include <asm/pgtable-types.h>
|
||||||
|
|
||||||
#define arch_kasan_set_tag(addr, tag) __tag_set(addr, tag)
|
#define arch_kasan_set_tag(addr, tag) __tag_set(addr, tag)
|
||||||
|
|||||||
22
arch/arm64/include/asm/kfence.h
Normal file
22
arch/arm64/include/asm/kfence.h
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* arm64 KFENCE support.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020, Google LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ASM_KFENCE_H
|
||||||
|
#define __ASM_KFENCE_H
|
||||||
|
|
||||||
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
|
static inline bool arch_kfence_init_pool(void) { return true; }
|
||||||
|
|
||||||
|
static inline bool kfence_protect_page(unsigned long addr, bool protect)
|
||||||
|
{
|
||||||
|
set_memory_valid(addr, 1, !protect);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __ASM_KFENCE_H */
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#ifdef CONFIG_ARM64_MODULE_PLTS
|
#ifdef CONFIG_ARM64_MODULE_PLTS
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
.plt (NOLOAD) : { BYTE(0) }
|
.plt 0 (NOLOAD) : { BYTE(0) }
|
||||||
.init.plt (NOLOAD) : { BYTE(0) }
|
.init.plt 0 (NOLOAD) : { BYTE(0) }
|
||||||
.text.ftrace_trampoline (NOLOAD) : { BYTE(0) }
|
.text.ftrace_trampoline 0 (NOLOAD) : { BYTE(0) }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -11,4 +11,6 @@
|
|||||||
#define MTE_TAG_SIZE 4
|
#define MTE_TAG_SIZE 4
|
||||||
#define MTE_TAG_MASK GENMASK((MTE_TAG_SHIFT + (MTE_TAG_SIZE - 1)), MTE_TAG_SHIFT)
|
#define MTE_TAG_MASK GENMASK((MTE_TAG_SHIFT + (MTE_TAG_SIZE - 1)), MTE_TAG_SHIFT)
|
||||||
|
|
||||||
|
#define __MTE_PREAMBLE ARM64_ASM_PREAMBLE ".arch_extension memtag\n"
|
||||||
|
|
||||||
#endif /* __ASM_MTE_DEF_H */
|
#endif /* __ASM_MTE_DEF_H */
|
||||||
|
|||||||
@@ -11,12 +11,15 @@
|
|||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* The functions below are meant to be used only for the
|
|
||||||
* KASAN_HW_TAGS interface defined in asm/memory.h.
|
|
||||||
*/
|
|
||||||
#ifdef CONFIG_ARM64_MTE
|
#ifdef CONFIG_ARM64_MTE
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These functions are meant to be only used from KASAN runtime through
|
||||||
|
* the arch_*() interface defined in asm/memory.h.
|
||||||
|
* These functions don't include system_supports_mte() checks,
|
||||||
|
* as KASAN only calls them when MTE is supported and enabled.
|
||||||
|
*/
|
||||||
|
|
||||||
static inline u8 mte_get_ptr_tag(void *ptr)
|
static inline u8 mte_get_ptr_tag(void *ptr)
|
||||||
{
|
{
|
||||||
/* Note: The format of KASAN tags is 0xF<x> */
|
/* Note: The format of KASAN tags is 0xF<x> */
|
||||||
@@ -25,9 +28,54 @@ static inline u8 mte_get_ptr_tag(void *ptr)
|
|||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 mte_get_mem_tag(void *addr);
|
/* Get allocation tag for the address. */
|
||||||
u8 mte_get_random_tag(void);
|
static inline u8 mte_get_mem_tag(void *addr)
|
||||||
void *mte_set_mem_tag_range(void *addr, size_t size, u8 tag);
|
{
|
||||||
|
asm(__MTE_PREAMBLE "ldg %0, [%0]"
|
||||||
|
: "+r" (addr));
|
||||||
|
|
||||||
|
return mte_get_ptr_tag(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Generate a random tag. */
|
||||||
|
static inline u8 mte_get_random_tag(void)
|
||||||
|
{
|
||||||
|
void *addr;
|
||||||
|
|
||||||
|
asm(__MTE_PREAMBLE "irg %0, %0"
|
||||||
|
: "=r" (addr));
|
||||||
|
|
||||||
|
return mte_get_ptr_tag(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Assign allocation tags for a region of memory based on the pointer tag.
|
||||||
|
* Note: The address must be non-NULL and MTE_GRANULE_SIZE aligned and
|
||||||
|
* size must be non-zero and MTE_GRANULE_SIZE aligned.
|
||||||
|
*/
|
||||||
|
static inline void mte_set_mem_tag_range(void *addr, size_t size, u8 tag)
|
||||||
|
{
|
||||||
|
u64 curr, end;
|
||||||
|
|
||||||
|
if (!size)
|
||||||
|
return;
|
||||||
|
|
||||||
|
curr = (u64)__tag_set(addr, tag);
|
||||||
|
end = curr + size;
|
||||||
|
|
||||||
|
do {
|
||||||
|
/*
|
||||||
|
* 'asm volatile' is required to prevent the compiler to move
|
||||||
|
* the statement outside of the loop.
|
||||||
|
*/
|
||||||
|
asm volatile(__MTE_PREAMBLE "stg %0, [%0]"
|
||||||
|
:
|
||||||
|
: "r" (curr)
|
||||||
|
: "memory");
|
||||||
|
|
||||||
|
curr += MTE_GRANULE_SIZE;
|
||||||
|
} while (curr != end);
|
||||||
|
}
|
||||||
|
|
||||||
void mte_enable_kernel(void);
|
void mte_enable_kernel(void);
|
||||||
void mte_init_tags(u64 max_tag);
|
void mte_init_tags(u64 max_tag);
|
||||||
@@ -46,13 +94,14 @@ static inline u8 mte_get_mem_tag(void *addr)
|
|||||||
{
|
{
|
||||||
return 0xFF;
|
return 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u8 mte_get_random_tag(void)
|
static inline u8 mte_get_random_tag(void)
|
||||||
{
|
{
|
||||||
return 0xFF;
|
return 0xFF;
|
||||||
}
|
}
|
||||||
static inline void *mte_set_mem_tag_range(void *addr, size_t size, u8 tag)
|
|
||||||
|
static inline void mte_set_mem_tag_range(void *addr, size_t size, u8 tag)
|
||||||
{
|
{
|
||||||
return addr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void mte_enable_kernel(void)
|
static inline void mte_enable_kernel(void)
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
#include <asm/compiler.h>
|
#include <asm/compiler.h>
|
||||||
#include <asm/mte-def.h>
|
#include <asm/mte-def.h>
|
||||||
|
|
||||||
#define __MTE_PREAMBLE ARM64_ASM_PREAMBLE ".arch_extension memtag\n"
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <linux/bitfield.h>
|
#include <linux/bitfield.h>
|
||||||
|
|||||||
@@ -3,52 +3,6 @@
|
|||||||
#define __ASM_NUMA_H
|
#define __ASM_NUMA_H
|
||||||
|
|
||||||
#include <asm/topology.h>
|
#include <asm/topology.h>
|
||||||
|
#include <asm-generic/numa.h>
|
||||||
#ifdef CONFIG_NUMA
|
|
||||||
|
|
||||||
#define NR_NODE_MEMBLKS (MAX_NUMNODES * 2)
|
|
||||||
|
|
||||||
int __node_distance(int from, int to);
|
|
||||||
#define node_distance(a, b) __node_distance(a, b)
|
|
||||||
|
|
||||||
extern nodemask_t numa_nodes_parsed __initdata;
|
|
||||||
|
|
||||||
extern bool numa_off;
|
|
||||||
|
|
||||||
/* Mappings between node number and cpus on that node. */
|
|
||||||
extern cpumask_var_t node_to_cpumask_map[MAX_NUMNODES];
|
|
||||||
void numa_clear_node(unsigned int cpu);
|
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_PER_CPU_MAPS
|
|
||||||
const struct cpumask *cpumask_of_node(int node);
|
|
||||||
#else
|
|
||||||
/* Returns a pointer to the cpumask of CPUs on Node 'node'. */
|
|
||||||
static inline const struct cpumask *cpumask_of_node(int node)
|
|
||||||
{
|
|
||||||
if (node == NUMA_NO_NODE)
|
|
||||||
return cpu_all_mask;
|
|
||||||
|
|
||||||
return node_to_cpumask_map[node];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void __init arm64_numa_init(void);
|
|
||||||
int __init numa_add_memblk(int nodeid, u64 start, u64 end);
|
|
||||||
void __init numa_set_distance(int from, int to, int distance);
|
|
||||||
void __init numa_free_distance(void);
|
|
||||||
void __init early_map_cpu_to_node(unsigned int cpu, int nid);
|
|
||||||
void numa_store_cpu_info(unsigned int cpu);
|
|
||||||
void numa_add_cpu(unsigned int cpu);
|
|
||||||
void numa_remove_cpu(unsigned int cpu);
|
|
||||||
|
|
||||||
#else /* CONFIG_NUMA */
|
|
||||||
|
|
||||||
static inline void numa_store_cpu_info(unsigned int cpu) { }
|
|
||||||
static inline void numa_add_cpu(unsigned int cpu) { }
|
|
||||||
static inline void numa_remove_cpu(unsigned int cpu) { }
|
|
||||||
static inline void arm64_numa_init(void) { }
|
|
||||||
static inline void early_map_cpu_to_node(unsigned int cpu, int nid) { }
|
|
||||||
|
|
||||||
#endif /* CONFIG_NUMA */
|
|
||||||
|
|
||||||
#endif /* __ASM_NUMA_H */
|
#endif /* __ASM_NUMA_H */
|
||||||
|
|||||||
@@ -118,15 +118,3 @@ void __init acpi_numa_gicc_affinity_init(struct acpi_srat_gicc_affinity *pa)
|
|||||||
node_set(node, numa_nodes_parsed);
|
node_set(node, numa_nodes_parsed);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init arm64_acpi_numa_init(void)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = acpi_numa_init();
|
|
||||||
if (ret) {
|
|
||||||
pr_info("Failed to initialise from firmware\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return srat_disabled() ? -EINVAL : 0;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -837,6 +837,7 @@ SYM_FUNC_START_LOCAL(__primary_switch)
|
|||||||
|
|
||||||
tlbi vmalle1 // Remove any stale TLB entries
|
tlbi vmalle1 // Remove any stale TLB entries
|
||||||
dsb nsh
|
dsb nsh
|
||||||
|
isb
|
||||||
|
|
||||||
set_sctlr_el1 x19 // re-enable the MMU
|
set_sctlr_el1 x19 // re-enable the MMU
|
||||||
|
|
||||||
|
|||||||
@@ -75,9 +75,6 @@ SYM_CODE_END(el1_sync)
|
|||||||
|
|
||||||
// nVHE? No way! Give me the real thing!
|
// nVHE? No way! Give me the real thing!
|
||||||
SYM_CODE_START_LOCAL(mutate_to_vhe)
|
SYM_CODE_START_LOCAL(mutate_to_vhe)
|
||||||
// Be prepared to fail
|
|
||||||
mov_q x0, HVC_STUB_ERR
|
|
||||||
|
|
||||||
// Sanity check: MMU *must* be off
|
// Sanity check: MMU *must* be off
|
||||||
mrs x1, sctlr_el2
|
mrs x1, sctlr_el2
|
||||||
tbnz x1, #0, 1f
|
tbnz x1, #0, 1f
|
||||||
@@ -96,8 +93,11 @@ SYM_CODE_START_LOCAL(mutate_to_vhe)
|
|||||||
cmp x1, xzr
|
cmp x1, xzr
|
||||||
and x2, x2, x1
|
and x2, x2, x1
|
||||||
csinv x2, x2, xzr, ne
|
csinv x2, x2, xzr, ne
|
||||||
cbz x2, 1f
|
cbnz x2, 2f
|
||||||
|
|
||||||
|
1: mov_q x0, HVC_STUB_ERR
|
||||||
|
eret
|
||||||
|
2:
|
||||||
// Engage the VHE magic!
|
// Engage the VHE magic!
|
||||||
mov_q x0, HCR_HOST_VHE_FLAGS
|
mov_q x0, HCR_HOST_VHE_FLAGS
|
||||||
msr hcr_el2, x0
|
msr hcr_el2, x0
|
||||||
@@ -131,9 +131,28 @@ SYM_CODE_START_LOCAL(mutate_to_vhe)
|
|||||||
msr mair_el1, x0
|
msr mair_el1, x0
|
||||||
isb
|
isb
|
||||||
|
|
||||||
|
// Hack the exception return to stay at EL2
|
||||||
|
mrs x0, spsr_el1
|
||||||
|
and x0, x0, #~PSR_MODE_MASK
|
||||||
|
mov x1, #PSR_MODE_EL2h
|
||||||
|
orr x0, x0, x1
|
||||||
|
msr spsr_el1, x0
|
||||||
|
|
||||||
|
b enter_vhe
|
||||||
|
SYM_CODE_END(mutate_to_vhe)
|
||||||
|
|
||||||
|
// At the point where we reach enter_vhe(), we run with
|
||||||
|
// the MMU off (which is enforced by mutate_to_vhe()).
|
||||||
|
// We thus need to be in the idmap, or everything will
|
||||||
|
// explode when enabling the MMU.
|
||||||
|
|
||||||
|
.pushsection .idmap.text, "ax"
|
||||||
|
|
||||||
|
SYM_CODE_START_LOCAL(enter_vhe)
|
||||||
// Invalidate TLBs before enabling the MMU
|
// Invalidate TLBs before enabling the MMU
|
||||||
tlbi vmalle1
|
tlbi vmalle1
|
||||||
dsb nsh
|
dsb nsh
|
||||||
|
isb
|
||||||
|
|
||||||
// Enable the EL2 S1 MMU, as set up from EL1
|
// Enable the EL2 S1 MMU, as set up from EL1
|
||||||
mrs_s x0, SYS_SCTLR_EL12
|
mrs_s x0, SYS_SCTLR_EL12
|
||||||
@@ -143,17 +162,12 @@ SYM_CODE_START_LOCAL(mutate_to_vhe)
|
|||||||
mov_q x0, INIT_SCTLR_EL1_MMU_OFF
|
mov_q x0, INIT_SCTLR_EL1_MMU_OFF
|
||||||
msr_s SYS_SCTLR_EL12, x0
|
msr_s SYS_SCTLR_EL12, x0
|
||||||
|
|
||||||
// Hack the exception return to stay at EL2
|
|
||||||
mrs x0, spsr_el1
|
|
||||||
and x0, x0, #~PSR_MODE_MASK
|
|
||||||
mov x1, #PSR_MODE_EL2h
|
|
||||||
orr x0, x0, x1
|
|
||||||
msr spsr_el1, x0
|
|
||||||
|
|
||||||
mov x0, xzr
|
mov x0, xzr
|
||||||
|
|
||||||
1: eret
|
eret
|
||||||
SYM_CODE_END(mutate_to_vhe)
|
SYM_CODE_END(enter_vhe)
|
||||||
|
|
||||||
|
.popsection
|
||||||
|
|
||||||
.macro invalid_vector label
|
.macro invalid_vector label
|
||||||
SYM_CODE_START_LOCAL(\label)
|
SYM_CODE_START_LOCAL(\label)
|
||||||
|
|||||||
@@ -182,8 +182,10 @@ static int create_dtb(struct kimage *image,
|
|||||||
|
|
||||||
/* duplicate a device tree blob */
|
/* duplicate a device tree blob */
|
||||||
ret = fdt_open_into(initial_boot_params, buf, buf_size);
|
ret = fdt_open_into(initial_boot_params, buf, buf_size);
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
vfree(buf);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
ret = setup_dtb(image, initrd_load_addr, initrd_len,
|
ret = setup_dtb(image, initrd_load_addr, initrd_len,
|
||||||
cmdline, buf);
|
cmdline, buf);
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
#include <asm/barrier.h>
|
#include <asm/barrier.h>
|
||||||
#include <asm/cpufeature.h>
|
#include <asm/cpufeature.h>
|
||||||
#include <asm/mte.h>
|
#include <asm/mte.h>
|
||||||
#include <asm/mte-kasan.h>
|
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/sysreg.h>
|
#include <asm/sysreg.h>
|
||||||
|
|
||||||
@@ -88,51 +87,6 @@ int memcmp_pages(struct page *page1, struct page *page2)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 mte_get_mem_tag(void *addr)
|
|
||||||
{
|
|
||||||
if (!system_supports_mte())
|
|
||||||
return 0xFF;
|
|
||||||
|
|
||||||
asm(__MTE_PREAMBLE "ldg %0, [%0]"
|
|
||||||
: "+r" (addr));
|
|
||||||
|
|
||||||
return mte_get_ptr_tag(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
u8 mte_get_random_tag(void)
|
|
||||||
{
|
|
||||||
void *addr;
|
|
||||||
|
|
||||||
if (!system_supports_mte())
|
|
||||||
return 0xFF;
|
|
||||||
|
|
||||||
asm(__MTE_PREAMBLE "irg %0, %0"
|
|
||||||
: "+r" (addr));
|
|
||||||
|
|
||||||
return mte_get_ptr_tag(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *mte_set_mem_tag_range(void *addr, size_t size, u8 tag)
|
|
||||||
{
|
|
||||||
void *ptr = addr;
|
|
||||||
|
|
||||||
if ((!system_supports_mte()) || (size == 0))
|
|
||||||
return addr;
|
|
||||||
|
|
||||||
/* Make sure that size is MTE granule aligned. */
|
|
||||||
WARN_ON(size & (MTE_GRANULE_SIZE - 1));
|
|
||||||
|
|
||||||
/* Make sure that the address is MTE granule aligned. */
|
|
||||||
WARN_ON((u64)addr & (MTE_GRANULE_SIZE - 1));
|
|
||||||
|
|
||||||
tag = 0xF0 | tag;
|
|
||||||
ptr = (void *)__tag_set(ptr, tag);
|
|
||||||
|
|
||||||
mte_assign_mem_tag_range(ptr, size);
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mte_init_tags(u64 max_tag)
|
void mte_init_tags(u64 max_tag)
|
||||||
{
|
{
|
||||||
static bool gcr_kernel_excl_initialized;
|
static bool gcr_kernel_excl_initialized;
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ int arch_uprobe_analyze_insn(struct arch_uprobe *auprobe, struct mm_struct *mm,
|
|||||||
|
|
||||||
/* TODO: Currently we do not support AARCH32 instruction probing */
|
/* TODO: Currently we do not support AARCH32 instruction probing */
|
||||||
if (mm->context.flags & MMCF_AARCH32)
|
if (mm->context.flags & MMCF_AARCH32)
|
||||||
return -ENOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
else if (!IS_ALIGNED(addr, AARCH64_INSN_SIZE))
|
else if (!IS_ALIGNED(addr, AARCH64_INSN_SIZE))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
|||||||
@@ -1797,7 +1797,7 @@ int syscall_trace_enter(struct pt_regs *regs)
|
|||||||
|
|
||||||
if (flags & (_TIF_SYSCALL_EMU | _TIF_SYSCALL_TRACE)) {
|
if (flags & (_TIF_SYSCALL_EMU | _TIF_SYSCALL_TRACE)) {
|
||||||
tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER);
|
tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER);
|
||||||
if (!in_syscall(regs) || (flags & _TIF_SYSCALL_EMU))
|
if (flags & _TIF_SYSCALL_EMU)
|
||||||
return NO_SYSCALL;
|
return NO_SYSCALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ int notrace unwind_frame(struct task_struct *tsk, struct stackframe *frame)
|
|||||||
|
|
||||||
/* Terminal record; nothing to unwind */
|
/* Terminal record; nothing to unwind */
|
||||||
if (!fp)
|
if (!fp)
|
||||||
return -EINVAL;
|
return -ENOENT;
|
||||||
|
|
||||||
if (fp & 0xf)
|
if (fp & 0xf)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
|
|||||||
if (!ret)
|
if (!ret)
|
||||||
ret = -EOPNOTSUPP;
|
ret = -EOPNOTSUPP;
|
||||||
} else {
|
} else {
|
||||||
__cpu_suspend_exit();
|
RCU_NONIDLE(__cpu_suspend_exit());
|
||||||
}
|
}
|
||||||
|
|
||||||
unpause_graph_tracing();
|
unpause_graph_tracing();
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ el2_error:
|
|||||||
|
|
||||||
.macro invalid_vector label, target = __guest_exit_panic
|
.macro invalid_vector label, target = __guest_exit_panic
|
||||||
.align 2
|
.align 2
|
||||||
SYM_CODE_START(\label)
|
SYM_CODE_START_LOCAL(\label)
|
||||||
b \target
|
b \target
|
||||||
SYM_CODE_END(\label)
|
SYM_CODE_END(\label)
|
||||||
.endm
|
.endm
|
||||||
|
|||||||
@@ -149,19 +149,3 @@ SYM_FUNC_START(mte_restore_page_tags)
|
|||||||
|
|
||||||
ret
|
ret
|
||||||
SYM_FUNC_END(mte_restore_page_tags)
|
SYM_FUNC_END(mte_restore_page_tags)
|
||||||
|
|
||||||
/*
|
|
||||||
* Assign allocation tags for a region of memory based on the pointer tag
|
|
||||||
* x0 - source pointer
|
|
||||||
* x1 - size
|
|
||||||
*
|
|
||||||
* Note: The address must be non-NULL and MTE_GRANULE_SIZE aligned and
|
|
||||||
* size must be non-zero and MTE_GRANULE_SIZE aligned.
|
|
||||||
*/
|
|
||||||
SYM_FUNC_START(mte_assign_mem_tag_range)
|
|
||||||
1: stg x0, [x0]
|
|
||||||
add x0, x0, #MTE_GRANULE_SIZE
|
|
||||||
subs x1, x1, #MTE_GRANULE_SIZE
|
|
||||||
b.gt 1b
|
|
||||||
ret
|
|
||||||
SYM_FUNC_END(mte_assign_mem_tag_range)
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
|
|||||||
obj-$(CONFIG_PTDUMP_CORE) += ptdump.o
|
obj-$(CONFIG_PTDUMP_CORE) += ptdump.o
|
||||||
obj-$(CONFIG_PTDUMP_DEBUGFS) += ptdump_debugfs.o
|
obj-$(CONFIG_PTDUMP_DEBUGFS) += ptdump_debugfs.o
|
||||||
obj-$(CONFIG_TRANS_TABLE) += trans_pgd.o
|
obj-$(CONFIG_TRANS_TABLE) += trans_pgd.o
|
||||||
obj-$(CONFIG_NUMA) += numa.o
|
|
||||||
obj-$(CONFIG_DEBUG_VIRTUAL) += physaddr.o
|
obj-$(CONFIG_DEBUG_VIRTUAL) += physaddr.o
|
||||||
obj-$(CONFIG_ARM64_MTE) += mteswap.o
|
obj-$(CONFIG_ARM64_MTE) += mteswap.o
|
||||||
KASAN_SANITIZE_physaddr.o += n
|
KASAN_SANITIZE_physaddr.o += n
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
#include <linux/bitfield.h>
|
#include <linux/bitfield.h>
|
||||||
#include <linux/extable.h>
|
#include <linux/extable.h>
|
||||||
|
#include <linux/kfence.h>
|
||||||
#include <linux/signal.h>
|
#include <linux/signal.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/hardirq.h>
|
#include <linux/hardirq.h>
|
||||||
@@ -389,6 +390,9 @@ static void __do_kernel_fault(unsigned long addr, unsigned int esr,
|
|||||||
} else if (addr < PAGE_SIZE) {
|
} else if (addr < PAGE_SIZE) {
|
||||||
msg = "NULL pointer dereference";
|
msg = "NULL pointer dereference";
|
||||||
} else {
|
} else {
|
||||||
|
if (kfence_handle_page_fault(addr, esr & ESR_ELx_WNR, regs))
|
||||||
|
return;
|
||||||
|
|
||||||
msg = "paging request";
|
msg = "paging request";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -416,10 +416,10 @@ void __init bootmem_init(void)
|
|||||||
max_pfn = max_low_pfn = max;
|
max_pfn = max_low_pfn = max;
|
||||||
min_low_pfn = min;
|
min_low_pfn = min;
|
||||||
|
|
||||||
arm64_numa_init();
|
arch_numa_init();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* must be done after arm64_numa_init() which calls numa_init() to
|
* must be done after arch_numa_init() which calls numa_init() to
|
||||||
* initialize node_online_map that gets used in hugetlb_cma_reserve()
|
* initialize node_online_map that gets used in hugetlb_cma_reserve()
|
||||||
* while allocating required CMA size across online nodes.
|
* while allocating required CMA size across online nodes.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1444,16 +1444,19 @@ static void __remove_pgd_mapping(pgd_t *pgdir, unsigned long start, u64 size)
|
|||||||
free_empty_tables(start, end, PAGE_OFFSET, PAGE_END);
|
free_empty_tables(start, end, PAGE_OFFSET, PAGE_END);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool inside_linear_region(u64 start, u64 size)
|
struct range arch_get_mappable_range(void)
|
||||||
{
|
{
|
||||||
|
struct range mhp_range;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Linear mapping region is the range [PAGE_OFFSET..(PAGE_END - 1)]
|
* Linear mapping region is the range [PAGE_OFFSET..(PAGE_END - 1)]
|
||||||
* accommodating both its ends but excluding PAGE_END. Max physical
|
* accommodating both its ends but excluding PAGE_END. Max physical
|
||||||
* range which can be mapped inside this linear mapping range, must
|
* range which can be mapped inside this linear mapping range, must
|
||||||
* also be derived from its end points.
|
* also be derived from its end points.
|
||||||
*/
|
*/
|
||||||
return start >= __pa(_PAGE_OFFSET(vabits_actual)) &&
|
mhp_range.start = __pa(_PAGE_OFFSET(vabits_actual));
|
||||||
(start + size - 1) <= __pa(PAGE_END - 1);
|
mhp_range.end = __pa(PAGE_END - 1);
|
||||||
|
return mhp_range;
|
||||||
}
|
}
|
||||||
|
|
||||||
int arch_add_memory(int nid, u64 start, u64 size,
|
int arch_add_memory(int nid, u64 start, u64 size,
|
||||||
@@ -1461,12 +1464,14 @@ int arch_add_memory(int nid, u64 start, u64 size,
|
|||||||
{
|
{
|
||||||
int ret, flags = 0;
|
int ret, flags = 0;
|
||||||
|
|
||||||
if (!inside_linear_region(start, size)) {
|
VM_BUG_ON(!mhp_range_allowed(start, size, true));
|
||||||
pr_err("[%llx %llx] is outside linear mapping region\n", start, start + size);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rodata_full || debug_pagealloc_enabled())
|
/*
|
||||||
|
* KFENCE requires linear map to be mapped at page granularity, so that
|
||||||
|
* it is possible to protect/unprotect single pages in the KFENCE pool.
|
||||||
|
*/
|
||||||
|
if (rodata_full || debug_pagealloc_enabled() ||
|
||||||
|
IS_ENABLED(CONFIG_KFENCE))
|
||||||
flags = NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS;
|
flags = NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS;
|
||||||
|
|
||||||
__create_pgd_mapping(swapper_pg_dir, start, __phys_to_virt(start),
|
__create_pgd_mapping(swapper_pg_dir, start, __phys_to_virt(start),
|
||||||
|
|||||||
@@ -85,9 +85,3 @@ define archhelp
|
|||||||
echo ' install - Install compressed kernel image'
|
echo ' install - Install compressed kernel image'
|
||||||
echo '* unwcheck - Check vmlinux for invalid unwind info'
|
echo '* unwcheck - Check vmlinux for invalid unwind info'
|
||||||
endef
|
endef
|
||||||
|
|
||||||
archprepare: make_nr_irqs_h
|
|
||||||
PHONY += make_nr_irqs_h
|
|
||||||
|
|
||||||
make_nr_irqs_h:
|
|
||||||
$(Q)$(MAKE) $(build)=arch/ia64/kernel include/generated/nr-irqs.h
|
|
||||||
|
|||||||
@@ -14,7 +14,9 @@
|
|||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
#include <generated/nr-irqs.h>
|
#include <asm/native/irq.h>
|
||||||
|
|
||||||
|
#define NR_IRQS IA64_NATIVE_NR_IRQS
|
||||||
|
|
||||||
static __inline__ int
|
static __inline__ int
|
||||||
irq_canonicalize (int irq)
|
irq_canonicalize (int irq)
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
|
|
||||||
#if !defined(__ASSEMBLY__)
|
#if !defined(__ASSEMBLY__)
|
||||||
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/percpu.h>
|
||||||
|
#include <linux/threads.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
#include <asm/ptrace.h>
|
||||||
#include <asm/param.h>
|
|
||||||
#include <asm/sal.h>
|
|
||||||
#include <asm/processor.h>
|
|
||||||
#include <asm/mca_asm.h>
|
|
||||||
|
|
||||||
#define IA64_MCA_RENDEZ_TIMEOUT (20 * 1000) /* value in milliseconds - 20 seconds */
|
#define IA64_MCA_RENDEZ_TIMEOUT (20 * 1000) /* value in milliseconds - 20 seconds */
|
||||||
|
|
||||||
@@ -83,7 +80,7 @@ struct ia64_sal_os_state {
|
|||||||
/* common */
|
/* common */
|
||||||
unsigned long sal_ra; /* Return address in SAL, physical */
|
unsigned long sal_ra; /* Return address in SAL, physical */
|
||||||
unsigned long sal_gp; /* GP of the SAL - physical */
|
unsigned long sal_gp; /* GP of the SAL - physical */
|
||||||
pal_min_state_area_t *pal_min_state; /* from R17. physical in asm, virtual in C */
|
struct pal_min_state_area *pal_min_state; /* from R17. physical in asm, virtual in C */
|
||||||
/* Previous values of IA64_KR(CURRENT) and IA64_KR(CURRENT_STACK).
|
/* Previous values of IA64_KR(CURRENT) and IA64_KR(CURRENT_STACK).
|
||||||
* Note: if the MCA/INIT recovery code wants to resume to a new context
|
* Note: if the MCA/INIT recovery code wants to resume to a new context
|
||||||
* then it must change these values to reflect the new kernel stack.
|
* then it must change these values to reflect the new kernel stack.
|
||||||
|
|||||||
@@ -750,7 +750,7 @@ typedef union pal_mc_error_info_u {
|
|||||||
* for PAL.
|
* for PAL.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct pal_min_state_area_s {
|
struct pal_min_state_area {
|
||||||
u64 pmsa_nat_bits; /* nat bits for saved GRs */
|
u64 pmsa_nat_bits; /* nat bits for saved GRs */
|
||||||
u64 pmsa_gr[15]; /* GR1 - GR15 */
|
u64 pmsa_gr[15]; /* GR1 - GR15 */
|
||||||
u64 pmsa_bank0_gr[16]; /* GR16 - GR31 */
|
u64 pmsa_bank0_gr[16]; /* GR16 - GR31 */
|
||||||
@@ -766,7 +766,7 @@ typedef struct pal_min_state_area_s {
|
|||||||
u64 pmsa_xfs; /* previous ifs */
|
u64 pmsa_xfs; /* previous ifs */
|
||||||
u64 pmsa_br1; /* branch register 1 */
|
u64 pmsa_br1; /* branch register 1 */
|
||||||
u64 pmsa_reserved[70]; /* pal_min_state_area should total to 1KB */
|
u64 pmsa_reserved[70]; /* pal_min_state_area should total to 1KB */
|
||||||
} pal_min_state_area_t;
|
};
|
||||||
|
|
||||||
|
|
||||||
struct ia64_pal_retval {
|
struct ia64_pal_retval {
|
||||||
|
|||||||
@@ -385,7 +385,7 @@ typedef struct sal_processor_static_info {
|
|||||||
fr : 1,
|
fr : 1,
|
||||||
reserved : 58;
|
reserved : 58;
|
||||||
} valid;
|
} valid;
|
||||||
pal_min_state_area_t min_state_area;
|
struct pal_min_state_area min_state_area;
|
||||||
u64 br[8];
|
u64 br[8];
|
||||||
u64 cr[128];
|
u64 cr[128];
|
||||||
u64 ar[128];
|
u64 ar[128];
|
||||||
|
|||||||
@@ -47,8 +47,3 @@ CFLAGS_traps.o += -mfixed-range=f2-f5,f16-f31
|
|||||||
|
|
||||||
# The gate DSO image is built using a special linker script.
|
# The gate DSO image is built using a special linker script.
|
||||||
include $(src)/Makefile.gate
|
include $(src)/Makefile.gate
|
||||||
|
|
||||||
include/generated/nr-irqs.h: arch/$(SRCARCH)/kernel/nr-irqs.s FORCE
|
|
||||||
$(call filechk,offsets,__ASM_NR_IRQS_H__)
|
|
||||||
|
|
||||||
targets += nr-irqs.s
|
|
||||||
|
|||||||
@@ -245,23 +245,23 @@ void foo(void)
|
|||||||
BLANK();
|
BLANK();
|
||||||
|
|
||||||
DEFINE(IA64_PMSA_GR_OFFSET,
|
DEFINE(IA64_PMSA_GR_OFFSET,
|
||||||
offsetof (struct pal_min_state_area_s, pmsa_gr));
|
offsetof(struct pal_min_state_area, pmsa_gr));
|
||||||
DEFINE(IA64_PMSA_BANK1_GR_OFFSET,
|
DEFINE(IA64_PMSA_BANK1_GR_OFFSET,
|
||||||
offsetof (struct pal_min_state_area_s, pmsa_bank1_gr));
|
offsetof(struct pal_min_state_area, pmsa_bank1_gr));
|
||||||
DEFINE(IA64_PMSA_PR_OFFSET,
|
DEFINE(IA64_PMSA_PR_OFFSET,
|
||||||
offsetof (struct pal_min_state_area_s, pmsa_pr));
|
offsetof(struct pal_min_state_area, pmsa_pr));
|
||||||
DEFINE(IA64_PMSA_BR0_OFFSET,
|
DEFINE(IA64_PMSA_BR0_OFFSET,
|
||||||
offsetof (struct pal_min_state_area_s, pmsa_br0));
|
offsetof(struct pal_min_state_area, pmsa_br0));
|
||||||
DEFINE(IA64_PMSA_RSC_OFFSET,
|
DEFINE(IA64_PMSA_RSC_OFFSET,
|
||||||
offsetof (struct pal_min_state_area_s, pmsa_rsc));
|
offsetof(struct pal_min_state_area, pmsa_rsc));
|
||||||
DEFINE(IA64_PMSA_IIP_OFFSET,
|
DEFINE(IA64_PMSA_IIP_OFFSET,
|
||||||
offsetof (struct pal_min_state_area_s, pmsa_iip));
|
offsetof(struct pal_min_state_area, pmsa_iip));
|
||||||
DEFINE(IA64_PMSA_IPSR_OFFSET,
|
DEFINE(IA64_PMSA_IPSR_OFFSET,
|
||||||
offsetof (struct pal_min_state_area_s, pmsa_ipsr));
|
offsetof(struct pal_min_state_area, pmsa_ipsr));
|
||||||
DEFINE(IA64_PMSA_IFS_OFFSET,
|
DEFINE(IA64_PMSA_IFS_OFFSET,
|
||||||
offsetof (struct pal_min_state_area_s, pmsa_ifs));
|
offsetof(struct pal_min_state_area, pmsa_ifs));
|
||||||
DEFINE(IA64_PMSA_XIP_OFFSET,
|
DEFINE(IA64_PMSA_XIP_OFFSET,
|
||||||
offsetof (struct pal_min_state_area_s, pmsa_xip));
|
offsetof(struct pal_min_state_area, pmsa_xip));
|
||||||
BLANK();
|
BLANK();
|
||||||
|
|
||||||
/* used by fsys_gettimeofday in arch/ia64/kernel/fsys.S */
|
/* used by fsys_gettimeofday in arch/ia64/kernel/fsys.S */
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/kexec.h>
|
#include <linux/kexec.h>
|
||||||
#include <linux/elfcore.h>
|
#include <linux/elfcore.h>
|
||||||
|
#include <linux/reboot.h>
|
||||||
#include <linux/sysctl.h>
|
#include <linux/sysctl.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kdebug.h>
|
#include <linux/kdebug.h>
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
#include <asm/meminit.h>
|
#include <asm/meminit.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/mca.h>
|
#include <asm/mca.h>
|
||||||
|
#include <asm/sal.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
|
|||||||
@@ -97,6 +97,7 @@
|
|||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/sal.h>
|
#include <asm/sal.h>
|
||||||
#include <asm/mca.h>
|
#include <asm/mca.h>
|
||||||
|
#include <asm/mca_asm.h>
|
||||||
#include <asm/kexec.h>
|
#include <asm/kexec.h>
|
||||||
|
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
@@ -895,7 +896,7 @@ static void
|
|||||||
finish_pt_regs(struct pt_regs *regs, struct ia64_sal_os_state *sos,
|
finish_pt_regs(struct pt_regs *regs, struct ia64_sal_os_state *sos,
|
||||||
unsigned long *nat)
|
unsigned long *nat)
|
||||||
{
|
{
|
||||||
const pal_min_state_area_t *ms = sos->pal_min_state;
|
const struct pal_min_state_area *ms = sos->pal_min_state;
|
||||||
const u64 *bank;
|
const u64 *bank;
|
||||||
|
|
||||||
/* If ipsr.ic then use pmsa_{iip,ipsr,ifs}, else use
|
/* If ipsr.ic then use pmsa_{iip,ipsr,ifs}, else use
|
||||||
@@ -971,7 +972,7 @@ ia64_mca_modify_original_stack(struct pt_regs *regs,
|
|||||||
char *p;
|
char *p;
|
||||||
ia64_va va;
|
ia64_va va;
|
||||||
extern char ia64_leave_kernel[]; /* Need asm address, not function descriptor */
|
extern char ia64_leave_kernel[]; /* Need asm address, not function descriptor */
|
||||||
const pal_min_state_area_t *ms = sos->pal_min_state;
|
const struct pal_min_state_area *ms = sos->pal_min_state;
|
||||||
struct task_struct *previous_current;
|
struct task_struct *previous_current;
|
||||||
struct pt_regs *old_regs;
|
struct pt_regs *old_regs;
|
||||||
struct switch_stack *old_sw;
|
struct switch_stack *old_sw;
|
||||||
|
|||||||
@@ -496,7 +496,7 @@ recover_from_read_error(slidx_table_t *slidx,
|
|||||||
struct ia64_sal_os_state *sos)
|
struct ia64_sal_os_state *sos)
|
||||||
{
|
{
|
||||||
u64 target_identifier;
|
u64 target_identifier;
|
||||||
pal_min_state_area_t *pmsa;
|
struct pal_min_state_area *pmsa;
|
||||||
struct ia64_psr *psr1, *psr2;
|
struct ia64_psr *psr1, *psr2;
|
||||||
ia64_fptr_t *mca_hdlr_bh = (ia64_fptr_t*)mca_handler_bhhook;
|
ia64_fptr_t *mca_hdlr_bh = (ia64_fptr_t*)mca_handler_bhhook;
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0
|
|
||||||
/*
|
|
||||||
* calculate
|
|
||||||
* NR_IRQS = max(IA64_NATIVE_NR_IRQS, XEN_NR_IRQS, FOO_NR_IRQS...)
|
|
||||||
* depending on config.
|
|
||||||
* This must be calculated before processing asm-offset.c.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define ASM_OFFSETS_C 1
|
|
||||||
|
|
||||||
#include <linux/kbuild.h>
|
|
||||||
#include <linux/threads.h>
|
|
||||||
#include <asm/native/irq.h>
|
|
||||||
|
|
||||||
void foo(void)
|
|
||||||
{
|
|
||||||
union paravirt_nr_irqs_max {
|
|
||||||
char ia64_native_nr_irqs[IA64_NATIVE_NR_IRQS];
|
|
||||||
};
|
|
||||||
|
|
||||||
DEFINE(NR_IRQS, sizeof (union paravirt_nr_irqs_max));
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,7 @@ uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
|||||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||||
|
|
||||||
syscall := $(srctree)/$(src)/syscall.tbl
|
syscall := $(src)/syscall.tbl
|
||||||
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
||||||
systbl := $(srctree)/$(src)/syscalltbl.sh
|
systbl := $(srctree)/$(src)/syscalltbl.sh
|
||||||
|
|
||||||
@@ -22,19 +22,20 @@ quiet_cmd_systbl = SYSTBL $@
|
|||||||
'$(systbl_offset_$(basetarget))'
|
'$(systbl_offset_$(basetarget))'
|
||||||
|
|
||||||
syshdr_offset_unistd_64 := __NR_Linux
|
syshdr_offset_unistd_64 := __NR_Linux
|
||||||
$(uapi)/unistd_64.h: $(syscall) $(syshdr)
|
$(uapi)/unistd_64.h: $(syscall) $(syshdr) FORCE
|
||||||
$(call if_changed,syshdr)
|
$(call if_changed,syshdr)
|
||||||
|
|
||||||
systbl_offset_syscall_table := 1024
|
systbl_offset_syscall_table := 1024
|
||||||
$(kapi)/syscall_table.h: $(syscall) $(systbl)
|
$(kapi)/syscall_table.h: $(syscall) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
uapisyshdr-y += unistd_64.h
|
uapisyshdr-y += unistd_64.h
|
||||||
kapisyshdr-y += syscall_table.h
|
kapisyshdr-y += syscall_table.h
|
||||||
|
|
||||||
targets += $(uapisyshdr-y) $(kapisyshdr-y)
|
uapisyshdr-y := $(addprefix $(uapi)/, $(uapisyshdr-y))
|
||||||
|
kapisyshdr-y := $(addprefix $(kapi)/, $(kapisyshdr-y))
|
||||||
|
targets += $(addprefix ../../../../, $(uapisyshdr-y) $(kapisyshdr-y))
|
||||||
|
|
||||||
PHONY += all
|
PHONY += all
|
||||||
all: $(addprefix $(uapi)/,$(uapisyshdr-y))
|
all: $(uapisyshdr-y) $(kapisyshdr-y)
|
||||||
all: $(addprefix $(kapi)/,$(kapisyshdr-y))
|
|
||||||
@:
|
@:
|
||||||
|
|||||||
@@ -90,6 +90,10 @@ EXPORT_SYMBOL(clk_get);
|
|||||||
int clk_enable(struct clk *clk)
|
int clk_enable(struct clk *clk)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (!clk)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
spin_lock_irqsave(&clk_lock, flags);
|
spin_lock_irqsave(&clk_lock, flags);
|
||||||
if ((clk->enabled++ == 0) && clk->clk_ops)
|
if ((clk->enabled++ == 0) && clk->clk_ops)
|
||||||
clk->clk_ops->enable(clk);
|
clk->clk_ops->enable(clk);
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
|||||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||||
|
|
||||||
syscall := $(srctree)/$(src)/syscall.tbl
|
syscall := $(src)/syscall.tbl
|
||||||
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
||||||
systbl := $(srctree)/$(src)/syscalltbl.sh
|
systbl := $(srctree)/$(src)/syscalltbl.sh
|
||||||
|
|
||||||
@@ -21,18 +21,19 @@ quiet_cmd_systbl = SYSTBL $@
|
|||||||
'$(systbl_abi_$(basetarget))' \
|
'$(systbl_abi_$(basetarget))' \
|
||||||
'$(systbl_offset_$(basetarget))'
|
'$(systbl_offset_$(basetarget))'
|
||||||
|
|
||||||
$(uapi)/unistd_32.h: $(syscall) $(syshdr)
|
$(uapi)/unistd_32.h: $(syscall) $(syshdr) FORCE
|
||||||
$(call if_changed,syshdr)
|
$(call if_changed,syshdr)
|
||||||
|
|
||||||
$(kapi)/syscall_table.h: $(syscall) $(systbl)
|
$(kapi)/syscall_table.h: $(syscall) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
uapisyshdr-y += unistd_32.h
|
uapisyshdr-y += unistd_32.h
|
||||||
kapisyshdr-y += syscall_table.h
|
kapisyshdr-y += syscall_table.h
|
||||||
|
|
||||||
targets += $(uapisyshdr-y) $(kapisyshdr-y)
|
uapisyshdr-y := $(addprefix $(uapi)/, $(uapisyshdr-y))
|
||||||
|
kapisyshdr-y := $(addprefix $(kapi)/, $(kapisyshdr-y))
|
||||||
|
targets += $(addprefix ../../../../, $(uapisyshdr-y) $(kapisyshdr-y))
|
||||||
|
|
||||||
PHONY += all
|
PHONY += all
|
||||||
all: $(addprefix $(uapi)/,$(uapisyshdr-y))
|
all: $(uapisyshdr-y) $(kapisyshdr-y)
|
||||||
all: $(addprefix $(kapi)/,$(kapisyshdr-y))
|
|
||||||
@:
|
@:
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
|||||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||||
|
|
||||||
syscall := $(srctree)/$(src)/syscall.tbl
|
syscall := $(src)/syscall.tbl
|
||||||
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
||||||
systbl := $(srctree)/$(src)/syscalltbl.sh
|
systbl := $(srctree)/$(src)/syscalltbl.sh
|
||||||
|
|
||||||
@@ -21,18 +21,19 @@ quiet_cmd_systbl = SYSTBL $@
|
|||||||
'$(systbl_abi_$(basetarget))' \
|
'$(systbl_abi_$(basetarget))' \
|
||||||
'$(systbl_offset_$(basetarget))'
|
'$(systbl_offset_$(basetarget))'
|
||||||
|
|
||||||
$(uapi)/unistd_32.h: $(syscall) $(syshdr)
|
$(uapi)/unistd_32.h: $(syscall) $(syshdr) FORCE
|
||||||
$(call if_changed,syshdr)
|
$(call if_changed,syshdr)
|
||||||
|
|
||||||
$(kapi)/syscall_table.h: $(syscall) $(systbl)
|
$(kapi)/syscall_table.h: $(syscall) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
uapisyshdr-y += unistd_32.h
|
uapisyshdr-y += unistd_32.h
|
||||||
kapisyshdr-y += syscall_table.h
|
kapisyshdr-y += syscall_table.h
|
||||||
|
|
||||||
targets += $(uapisyshdr-y) $(kapisyshdr-y)
|
uapisyshdr-y := $(addprefix $(uapi)/, $(uapisyshdr-y))
|
||||||
|
kapisyshdr-y := $(addprefix $(kapi)/, $(kapisyshdr-y))
|
||||||
|
targets += $(addprefix ../../../../, $(uapisyshdr-y) $(kapisyshdr-y))
|
||||||
|
|
||||||
PHONY += all
|
PHONY += all
|
||||||
all: $(addprefix $(uapi)/,$(uapisyshdr-y))
|
all: $(uapisyshdr-y) $(kapisyshdr-y)
|
||||||
all: $(addprefix $(kapi)/,$(kapisyshdr-y))
|
|
||||||
@:
|
@:
|
||||||
|
|||||||
@@ -196,4 +196,4 @@ static int __init plat_dev_init(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
device_initcall(plat_dev_init);
|
arch_initcall(plat_dev_init);
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
static char bug64hit[] __initdata =
|
static char bug64hit[] __initdata =
|
||||||
"reliable operation impossible!\n%s";
|
"reliable operation impossible!\n%s";
|
||||||
static char nowar[] __initdata =
|
static char nowar[] __initdata =
|
||||||
"Please report to <linux-mips@linux-mips.org>.";
|
"Please report to <linux-mips@vger.kernel.org>.";
|
||||||
static char r4kwar[] __initdata =
|
static char r4kwar[] __initdata =
|
||||||
"Enable CPU_R4000_WORKAROUNDS to rectify.";
|
"Enable CPU_R4000_WORKAROUNDS to rectify.";
|
||||||
static char daddiwar[] __initdata =
|
static char daddiwar[] __initdata =
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
|||||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||||
|
|
||||||
syscalln32 := $(srctree)/$(src)/syscall_n32.tbl
|
syscalln32 := $(src)/syscall_n32.tbl
|
||||||
syscalln64 := $(srctree)/$(src)/syscall_n64.tbl
|
syscalln64 := $(src)/syscall_n64.tbl
|
||||||
syscallo32 := $(srctree)/$(src)/syscall_o32.tbl
|
syscallo32 := $(src)/syscall_o32.tbl
|
||||||
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
||||||
sysnr := $(srctree)/$(src)/syscallnr.sh
|
sysnr := $(srctree)/$(src)/syscallnr.sh
|
||||||
systbl := $(srctree)/$(src)/syscalltbl.sh
|
systbl := $(srctree)/$(src)/syscalltbl.sh
|
||||||
@@ -31,50 +31,50 @@ quiet_cmd_systbl = SYSTBL $@
|
|||||||
'$(systbl_offset_$(basetarget))'
|
'$(systbl_offset_$(basetarget))'
|
||||||
|
|
||||||
syshdr_offset_unistd_n32 := __NR_Linux
|
syshdr_offset_unistd_n32 := __NR_Linux
|
||||||
$(uapi)/unistd_n32.h: $(syscalln32) $(syshdr)
|
$(uapi)/unistd_n32.h: $(syscalln32) $(syshdr) FORCE
|
||||||
$(call if_changed,syshdr)
|
$(call if_changed,syshdr)
|
||||||
|
|
||||||
syshdr_offset_unistd_n64 := __NR_Linux
|
syshdr_offset_unistd_n64 := __NR_Linux
|
||||||
$(uapi)/unistd_n64.h: $(syscalln64) $(syshdr)
|
$(uapi)/unistd_n64.h: $(syscalln64) $(syshdr) FORCE
|
||||||
$(call if_changed,syshdr)
|
$(call if_changed,syshdr)
|
||||||
|
|
||||||
syshdr_offset_unistd_o32 := __NR_Linux
|
syshdr_offset_unistd_o32 := __NR_Linux
|
||||||
$(uapi)/unistd_o32.h: $(syscallo32) $(syshdr)
|
$(uapi)/unistd_o32.h: $(syscallo32) $(syshdr) FORCE
|
||||||
$(call if_changed,syshdr)
|
$(call if_changed,syshdr)
|
||||||
|
|
||||||
sysnr_pfx_unistd_nr_n32 := N32
|
sysnr_pfx_unistd_nr_n32 := N32
|
||||||
sysnr_offset_unistd_nr_n32 := 6000
|
sysnr_offset_unistd_nr_n32 := 6000
|
||||||
$(kapi)/unistd_nr_n32.h: $(syscalln32) $(sysnr)
|
$(kapi)/unistd_nr_n32.h: $(syscalln32) $(sysnr) FORCE
|
||||||
$(call if_changed,sysnr)
|
$(call if_changed,sysnr)
|
||||||
|
|
||||||
sysnr_pfx_unistd_nr_n64 := 64
|
sysnr_pfx_unistd_nr_n64 := 64
|
||||||
sysnr_offset_unistd_nr_n64 := 5000
|
sysnr_offset_unistd_nr_n64 := 5000
|
||||||
$(kapi)/unistd_nr_n64.h: $(syscalln64) $(sysnr)
|
$(kapi)/unistd_nr_n64.h: $(syscalln64) $(sysnr) FORCE
|
||||||
$(call if_changed,sysnr)
|
$(call if_changed,sysnr)
|
||||||
|
|
||||||
sysnr_pfx_unistd_nr_o32 := O32
|
sysnr_pfx_unistd_nr_o32 := O32
|
||||||
sysnr_offset_unistd_nr_o32 := 4000
|
sysnr_offset_unistd_nr_o32 := 4000
|
||||||
$(kapi)/unistd_nr_o32.h: $(syscallo32) $(sysnr)
|
$(kapi)/unistd_nr_o32.h: $(syscallo32) $(sysnr) FORCE
|
||||||
$(call if_changed,sysnr)
|
$(call if_changed,sysnr)
|
||||||
|
|
||||||
systbl_abi_syscall_table_32_o32 := 32_o32
|
systbl_abi_syscall_table_32_o32 := 32_o32
|
||||||
systbl_offset_syscall_table_32_o32 := 4000
|
systbl_offset_syscall_table_32_o32 := 4000
|
||||||
$(kapi)/syscall_table_32_o32.h: $(syscallo32) $(systbl)
|
$(kapi)/syscall_table_32_o32.h: $(syscallo32) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
systbl_abi_syscall_table_64_n32 := 64_n32
|
systbl_abi_syscall_table_64_n32 := 64_n32
|
||||||
systbl_offset_syscall_table_64_n32 := 6000
|
systbl_offset_syscall_table_64_n32 := 6000
|
||||||
$(kapi)/syscall_table_64_n32.h: $(syscalln32) $(systbl)
|
$(kapi)/syscall_table_64_n32.h: $(syscalln32) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
systbl_abi_syscall_table_64_n64 := 64_n64
|
systbl_abi_syscall_table_64_n64 := 64_n64
|
||||||
systbl_offset_syscall_table_64_n64 := 5000
|
systbl_offset_syscall_table_64_n64 := 5000
|
||||||
$(kapi)/syscall_table_64_n64.h: $(syscalln64) $(systbl)
|
$(kapi)/syscall_table_64_n64.h: $(syscalln64) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
systbl_abi_syscall_table_64_o32 := 64_o32
|
systbl_abi_syscall_table_64_o32 := 64_o32
|
||||||
systbl_offset_syscall_table_64_o32 := 4000
|
systbl_offset_syscall_table_64_o32 := 4000
|
||||||
$(kapi)/syscall_table_64_o32.h: $(syscallo32) $(systbl)
|
$(kapi)/syscall_table_64_o32.h: $(syscallo32) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
uapisyshdr-y += unistd_n32.h \
|
uapisyshdr-y += unistd_n32.h \
|
||||||
@@ -88,9 +88,10 @@ kapisyshdr-y += syscall_table_32_o32.h \
|
|||||||
unistd_nr_n64.h \
|
unistd_nr_n64.h \
|
||||||
unistd_nr_o32.h
|
unistd_nr_o32.h
|
||||||
|
|
||||||
targets += $(uapisyshdr-y) $(kapisyshdr-y)
|
uapisyshdr-y := $(addprefix $(uapi)/, $(uapisyshdr-y))
|
||||||
|
kapisyshdr-y := $(addprefix $(kapi)/, $(kapisyshdr-y))
|
||||||
|
targets += $(addprefix ../../../../, $(uapisyshdr-y) $(kapisyshdr-y))
|
||||||
|
|
||||||
PHONY += all
|
PHONY += all
|
||||||
all: $(addprefix $(uapi)/,$(uapisyshdr-y))
|
all: $(uapisyshdr-y) $(kapisyshdr-y)
|
||||||
all: $(addprefix $(kapi)/,$(kapisyshdr-y))
|
|
||||||
@:
|
@:
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ void __iomem *__pci_ioport_map(struct pci_dev *dev,
|
|||||||
sprintf(name, "%04x:%02x", pci_domain_nr(bus), bus->number);
|
sprintf(name, "%04x:%02x", pci_domain_nr(bus), bus->number);
|
||||||
printk(KERN_WARNING "io_map_base of root PCI bus %s unset. "
|
printk(KERN_WARNING "io_map_base of root PCI bus %s unset. "
|
||||||
"Trying to continue but you better\nfix this issue or "
|
"Trying to continue but you better\nfix this issue or "
|
||||||
"report it to linux-mips@linux-mips.org or your "
|
"report it to linux-mips@vger.kernel.org or your "
|
||||||
"vendor.\n", name);
|
"vendor.\n", name);
|
||||||
#ifdef CONFIG_PCI_DOMAINS
|
#ifdef CONFIG_PCI_DOMAINS
|
||||||
panic("To avoid data corruption io_map_base MUST be set with "
|
panic("To avoid data corruption io_map_base MUST be set with "
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ cflags-$(CONFIG_CPU_LOONGSON64) += -Wa,--trap
|
|||||||
# can't easily be used safely within the kbuild framework.
|
# can't easily be used safely within the kbuild framework.
|
||||||
#
|
#
|
||||||
ifeq ($(call cc-ifversion, -ge, 0409, y), y)
|
ifeq ($(call cc-ifversion, -ge, 0409, y), y)
|
||||||
ifeq ($(call ld-ifversion, -ge, 225000000, y), y)
|
ifeq ($(call ld-ifversion, -ge, 22500, y), y)
|
||||||
cflags-$(CONFIG_CPU_LOONGSON64) += \
|
cflags-$(CONFIG_CPU_LOONGSON64) += \
|
||||||
$(call cc-option,-march=loongson3a -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS64)
|
$(call cc-option,-march=loongson3a -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS64)
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -157,29 +157,31 @@ unsigned long _page_cachable_default;
|
|||||||
EXPORT_SYMBOL(_page_cachable_default);
|
EXPORT_SYMBOL(_page_cachable_default);
|
||||||
|
|
||||||
#define PM(p) __pgprot(_page_cachable_default | (p))
|
#define PM(p) __pgprot(_page_cachable_default | (p))
|
||||||
|
#define PVA(p) PM(_PAGE_VALID | _PAGE_ACCESSED | (p))
|
||||||
|
|
||||||
static inline void setup_protection_map(void)
|
static inline void setup_protection_map(void)
|
||||||
{
|
{
|
||||||
protection_map[0] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ);
|
protection_map[0] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ);
|
||||||
protection_map[1] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC);
|
protection_map[1] = PVA(_PAGE_PRESENT | _PAGE_NO_EXEC);
|
||||||
protection_map[2] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ);
|
protection_map[2] = PVA(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ);
|
||||||
protection_map[3] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC);
|
protection_map[3] = PVA(_PAGE_PRESENT | _PAGE_NO_EXEC);
|
||||||
protection_map[4] = PM(_PAGE_PRESENT);
|
protection_map[4] = PVA(_PAGE_PRESENT);
|
||||||
protection_map[5] = PM(_PAGE_PRESENT);
|
protection_map[5] = PVA(_PAGE_PRESENT);
|
||||||
protection_map[6] = PM(_PAGE_PRESENT);
|
protection_map[6] = PVA(_PAGE_PRESENT);
|
||||||
protection_map[7] = PM(_PAGE_PRESENT);
|
protection_map[7] = PVA(_PAGE_PRESENT);
|
||||||
|
|
||||||
protection_map[8] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ);
|
protection_map[8] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ);
|
||||||
protection_map[9] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC);
|
protection_map[9] = PVA(_PAGE_PRESENT | _PAGE_NO_EXEC);
|
||||||
protection_map[10] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE |
|
protection_map[10] = PVA(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE |
|
||||||
_PAGE_NO_READ);
|
_PAGE_NO_READ);
|
||||||
protection_map[11] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE);
|
protection_map[11] = PVA(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE);
|
||||||
protection_map[12] = PM(_PAGE_PRESENT);
|
protection_map[12] = PVA(_PAGE_PRESENT);
|
||||||
protection_map[13] = PM(_PAGE_PRESENT);
|
protection_map[13] = PVA(_PAGE_PRESENT);
|
||||||
protection_map[14] = PM(_PAGE_PRESENT | _PAGE_WRITE);
|
protection_map[14] = PVA(_PAGE_PRESENT);
|
||||||
protection_map[15] = PM(_PAGE_PRESENT | _PAGE_WRITE);
|
protection_map[15] = PVA(_PAGE_PRESENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef _PVA
|
||||||
#undef PM
|
#undef PM
|
||||||
|
|
||||||
void cpu_cache_init(void)
|
void cpu_cache_init(void)
|
||||||
|
|||||||
@@ -343,7 +343,7 @@ static void ip32_unknown_interrupt(void)
|
|||||||
printk("Register dump:\n");
|
printk("Register dump:\n");
|
||||||
show_regs(get_irq_regs());
|
show_regs(get_irq_regs());
|
||||||
|
|
||||||
printk("Please mail this report to linux-mips@linux-mips.org\n");
|
printk("Please mail this report to linux-mips@vger.kernel.org\n");
|
||||||
printk("Spinning...");
|
printk("Spinning...");
|
||||||
while(1) ;
|
while(1) ;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
# the lack of relocations. As such, we disable the VDSO for microMIPS builds.
|
# the lack of relocations. As such, we disable the VDSO for microMIPS builds.
|
||||||
|
|
||||||
config MIPS_LD_CAN_LINK_VDSO
|
config MIPS_LD_CAN_LINK_VDSO
|
||||||
def_bool LD_VERSION >= 225000000 || LD_IS_LLD
|
def_bool LD_VERSION >= 22500 || LD_IS_LLD
|
||||||
|
|
||||||
config MIPS_DISABLE_VDSO
|
config MIPS_DISABLE_VDSO
|
||||||
def_bool CPU_MICROMIPS || (!CPU_MIPSR6 && !MIPS_LD_CAN_LINK_VDSO)
|
def_bool CPU_MICROMIPS || (!CPU_MIPSR6 && !MIPS_LD_CAN_LINK_VDSO)
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ config PARISC
|
|||||||
select HAVE_KRETPROBES
|
select HAVE_KRETPROBES
|
||||||
select HAVE_DYNAMIC_FTRACE if $(cc-option,-fpatchable-function-entry=1,1)
|
select HAVE_DYNAMIC_FTRACE if $(cc-option,-fpatchable-function-entry=1,1)
|
||||||
select HAVE_FTRACE_MCOUNT_RECORD if HAVE_DYNAMIC_FTRACE
|
select HAVE_FTRACE_MCOUNT_RECORD if HAVE_DYNAMIC_FTRACE
|
||||||
|
select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY if DYNAMIC_FTRACE
|
||||||
select HAVE_KPROBES_ON_FTRACE
|
select HAVE_KPROBES_ON_FTRACE
|
||||||
select HAVE_DYNAMIC_FTRACE_WITH_REGS
|
select HAVE_DYNAMIC_FTRACE_WITH_REGS
|
||||||
select HAVE_SOFTIRQ_ON_OWN_STACK if IRQSTACKS
|
select HAVE_SOFTIRQ_ON_OWN_STACK if IRQSTACKS
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
|||||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||||
|
|
||||||
syscall := $(srctree)/$(src)/syscall.tbl
|
syscall := $(src)/syscall.tbl
|
||||||
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
||||||
systbl := $(srctree)/$(src)/syscalltbl.sh
|
systbl := $(srctree)/$(src)/syscalltbl.sh
|
||||||
|
|
||||||
@@ -22,24 +22,24 @@ quiet_cmd_systbl = SYSTBL $@
|
|||||||
'$(systbl_offset_$(basetarget))'
|
'$(systbl_offset_$(basetarget))'
|
||||||
|
|
||||||
syshdr_abis_unistd_32 := common,32
|
syshdr_abis_unistd_32 := common,32
|
||||||
$(uapi)/unistd_32.h: $(syscall) $(syshdr)
|
$(uapi)/unistd_32.h: $(syscall) $(syshdr) FORCE
|
||||||
$(call if_changed,syshdr)
|
$(call if_changed,syshdr)
|
||||||
|
|
||||||
syshdr_abis_unistd_64 := common,64
|
syshdr_abis_unistd_64 := common,64
|
||||||
$(uapi)/unistd_64.h: $(syscall) $(syshdr)
|
$(uapi)/unistd_64.h: $(syscall) $(syshdr) FORCE
|
||||||
$(call if_changed,syshdr)
|
$(call if_changed,syshdr)
|
||||||
|
|
||||||
systbl_abis_syscall_table_32 := common,32
|
systbl_abis_syscall_table_32 := common,32
|
||||||
$(kapi)/syscall_table_32.h: $(syscall) $(systbl)
|
$(kapi)/syscall_table_32.h: $(syscall) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
systbl_abis_syscall_table_64 := common,64
|
systbl_abis_syscall_table_64 := common,64
|
||||||
$(kapi)/syscall_table_64.h: $(syscall) $(systbl)
|
$(kapi)/syscall_table_64.h: $(syscall) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
systbl_abis_syscall_table_c32 := common,32
|
systbl_abis_syscall_table_c32 := common,32
|
||||||
systbl_abi_syscall_table_c32 := c32
|
systbl_abi_syscall_table_c32 := c32
|
||||||
$(kapi)/syscall_table_c32.h: $(syscall) $(systbl)
|
$(kapi)/syscall_table_c32.h: $(syscall) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
uapisyshdr-y += unistd_32.h unistd_64.h
|
uapisyshdr-y += unistd_32.h unistd_64.h
|
||||||
@@ -47,9 +47,10 @@ kapisyshdr-y += syscall_table_32.h \
|
|||||||
syscall_table_64.h \
|
syscall_table_64.h \
|
||||||
syscall_table_c32.h
|
syscall_table_c32.h
|
||||||
|
|
||||||
targets += $(uapisyshdr-y) $(kapisyshdr-y)
|
uapisyshdr-y := $(addprefix $(uapi)/, $(uapisyshdr-y))
|
||||||
|
kapisyshdr-y := $(addprefix $(kapi)/, $(kapisyshdr-y))
|
||||||
|
targets += $(addprefix ../../../../, $(uapisyshdr-y) $(kapisyshdr-y))
|
||||||
|
|
||||||
PHONY += all
|
PHONY += all
|
||||||
all: $(addprefix $(uapi)/,$(uapisyshdr-y))
|
all: $(uapisyshdr-y) $(kapisyshdr-y)
|
||||||
all: $(addprefix $(kapi)/,$(kapisyshdr-y))
|
|
||||||
@:
|
@:
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ UTS_MACHINE := $(subst $(space),,$(machine-y))
|
|||||||
ifdef CONFIG_PPC32
|
ifdef CONFIG_PPC32
|
||||||
KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
|
KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
|
||||||
else
|
else
|
||||||
ifeq ($(call ld-ifversion, -ge, 225000000, y),y)
|
ifeq ($(call ld-ifversion, -ge, 22500, y),y)
|
||||||
# Have the linker provide sfpr if possible.
|
# Have the linker provide sfpr if possible.
|
||||||
# There is a corresponding test in arch/powerpc/lib/Makefile
|
# There is a corresponding test in arch/powerpc/lib/Makefile
|
||||||
KBUILD_LDFLAGS_MODULE += --save-restore-funcs
|
KBUILD_LDFLAGS_MODULE += --save-restore-funcs
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
|||||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||||
|
|
||||||
syscall := $(srctree)/$(src)/syscall.tbl
|
syscall := $(src)/syscall.tbl
|
||||||
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
||||||
systbl := $(srctree)/$(src)/syscalltbl.sh
|
systbl := $(srctree)/$(src)/syscalltbl.sh
|
||||||
|
|
||||||
@@ -22,31 +22,31 @@ quiet_cmd_systbl = SYSTBL $@
|
|||||||
'$(systbl_offset_$(basetarget))'
|
'$(systbl_offset_$(basetarget))'
|
||||||
|
|
||||||
syshdr_abis_unistd_32 := common,nospu,32
|
syshdr_abis_unistd_32 := common,nospu,32
|
||||||
$(uapi)/unistd_32.h: $(syscall) $(syshdr)
|
$(uapi)/unistd_32.h: $(syscall) $(syshdr) FORCE
|
||||||
$(call if_changed,syshdr)
|
$(call if_changed,syshdr)
|
||||||
|
|
||||||
syshdr_abis_unistd_64 := common,nospu,64
|
syshdr_abis_unistd_64 := common,nospu,64
|
||||||
$(uapi)/unistd_64.h: $(syscall) $(syshdr)
|
$(uapi)/unistd_64.h: $(syscall) $(syshdr) FORCE
|
||||||
$(call if_changed,syshdr)
|
$(call if_changed,syshdr)
|
||||||
|
|
||||||
systbl_abis_syscall_table_32 := common,nospu,32
|
systbl_abis_syscall_table_32 := common,nospu,32
|
||||||
systbl_abi_syscall_table_32 := 32
|
systbl_abi_syscall_table_32 := 32
|
||||||
$(kapi)/syscall_table_32.h: $(syscall) $(systbl)
|
$(kapi)/syscall_table_32.h: $(syscall) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
systbl_abis_syscall_table_64 := common,nospu,64
|
systbl_abis_syscall_table_64 := common,nospu,64
|
||||||
systbl_abi_syscall_table_64 := 64
|
systbl_abi_syscall_table_64 := 64
|
||||||
$(kapi)/syscall_table_64.h: $(syscall) $(systbl)
|
$(kapi)/syscall_table_64.h: $(syscall) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
systbl_abis_syscall_table_c32 := common,nospu,32
|
systbl_abis_syscall_table_c32 := common,nospu,32
|
||||||
systbl_abi_syscall_table_c32 := c32
|
systbl_abi_syscall_table_c32 := c32
|
||||||
$(kapi)/syscall_table_c32.h: $(syscall) $(systbl)
|
$(kapi)/syscall_table_c32.h: $(syscall) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
systbl_abis_syscall_table_spu := common,spu
|
systbl_abis_syscall_table_spu := common,spu
|
||||||
systbl_abi_syscall_table_spu := spu
|
systbl_abi_syscall_table_spu := spu
|
||||||
$(kapi)/syscall_table_spu.h: $(syscall) $(systbl)
|
$(kapi)/syscall_table_spu.h: $(syscall) $(systbl) FORCE
|
||||||
$(call if_changed,systbl)
|
$(call if_changed,systbl)
|
||||||
|
|
||||||
uapisyshdr-y += unistd_32.h unistd_64.h
|
uapisyshdr-y += unistd_32.h unistd_64.h
|
||||||
@@ -55,9 +55,10 @@ kapisyshdr-y += syscall_table_32.h \
|
|||||||
syscall_table_c32.h \
|
syscall_table_c32.h \
|
||||||
syscall_table_spu.h
|
syscall_table_spu.h
|
||||||
|
|
||||||
targets += $(uapisyshdr-y) $(kapisyshdr-y)
|
uapisyshdr-y := $(addprefix $(uapi)/, $(uapisyshdr-y))
|
||||||
|
kapisyshdr-y := $(addprefix $(kapi)/, $(kapisyshdr-y))
|
||||||
|
targets += $(addprefix ../../../../, $(uapisyshdr-y) $(kapisyshdr-y))
|
||||||
|
|
||||||
PHONY += all
|
PHONY += all
|
||||||
all: $(addprefix $(uapi)/,$(uapisyshdr-y))
|
all: $(uapisyshdr-y) $(kapisyshdr-y)
|
||||||
all: $(addprefix $(kapi)/,$(kapisyshdr-y))
|
|
||||||
@:
|
@:
|
||||||
|
|||||||
@@ -591,7 +591,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_vcpu *vcpu,
|
|||||||
} else {
|
} else {
|
||||||
/* Call KVM generic code to do the slow-path check */
|
/* Call KVM generic code to do the slow-path check */
|
||||||
pfn = __gfn_to_pfn_memslot(memslot, gfn, false, NULL,
|
pfn = __gfn_to_pfn_memslot(memslot, gfn, false, NULL,
|
||||||
writing, &write_ok);
|
writing, &write_ok, NULL);
|
||||||
if (is_error_noslot_pfn(pfn))
|
if (is_error_noslot_pfn(pfn))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
page = NULL;
|
page = NULL;
|
||||||
|
|||||||
@@ -822,7 +822,7 @@ int kvmppc_book3s_instantiate_page(struct kvm_vcpu *vcpu,
|
|||||||
|
|
||||||
/* Call KVM generic code to do the slow-path check */
|
/* Call KVM generic code to do the slow-path check */
|
||||||
pfn = __gfn_to_pfn_memslot(memslot, gfn, false, NULL,
|
pfn = __gfn_to_pfn_memslot(memslot, gfn, false, NULL,
|
||||||
writing, upgrade_p);
|
writing, upgrade_p, NULL);
|
||||||
if (is_error_noslot_pfn(pfn))
|
if (is_error_noslot_pfn(pfn))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
page = NULL;
|
page = NULL;
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ obj-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o
|
|||||||
# 64-bit linker creates .sfpr on demand for final link (vmlinux),
|
# 64-bit linker creates .sfpr on demand for final link (vmlinux),
|
||||||
# so it is only needed for modules, and only for older linkers which
|
# so it is only needed for modules, and only for older linkers which
|
||||||
# do not support --save-restore-funcs
|
# do not support --save-restore-funcs
|
||||||
ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
|
ifeq ($(call ld-ifversion, -lt, 22500, y),y)
|
||||||
extra-$(CONFIG_PPC64) += crtsavres.o
|
extra-$(CONFIG_PPC64) += crtsavres.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ config RISCV
|
|||||||
select HAVE_ARCH_JUMP_LABEL
|
select HAVE_ARCH_JUMP_LABEL
|
||||||
select HAVE_ARCH_JUMP_LABEL_RELATIVE
|
select HAVE_ARCH_JUMP_LABEL_RELATIVE
|
||||||
select HAVE_ARCH_KASAN if MMU && 64BIT
|
select HAVE_ARCH_KASAN if MMU && 64BIT
|
||||||
|
select HAVE_ARCH_KASAN_VMALLOC if MMU && 64BIT
|
||||||
select HAVE_ARCH_KGDB
|
select HAVE_ARCH_KGDB
|
||||||
select HAVE_ARCH_KGDB_QXFER_PKT
|
select HAVE_ARCH_KGDB_QXFER_PKT
|
||||||
select HAVE_ARCH_MMAP_RND_BITS if MMU
|
select HAVE_ARCH_MMAP_RND_BITS if MMU
|
||||||
@@ -67,14 +68,19 @@ config RISCV
|
|||||||
select HAVE_DEBUG_KMEMLEAK
|
select HAVE_DEBUG_KMEMLEAK
|
||||||
select HAVE_DMA_CONTIGUOUS if MMU
|
select HAVE_DMA_CONTIGUOUS if MMU
|
||||||
select HAVE_EBPF_JIT if MMU
|
select HAVE_EBPF_JIT if MMU
|
||||||
|
select HAVE_FUNCTION_ERROR_INJECTION
|
||||||
select HAVE_FUTEX_CMPXCHG if FUTEX
|
select HAVE_FUTEX_CMPXCHG if FUTEX
|
||||||
select HAVE_GCC_PLUGINS
|
select HAVE_GCC_PLUGINS
|
||||||
select HAVE_GENERIC_VDSO if MMU && 64BIT
|
select HAVE_GENERIC_VDSO if MMU && 64BIT
|
||||||
select HAVE_IRQ_TIME_ACCOUNTING
|
select HAVE_IRQ_TIME_ACCOUNTING
|
||||||
|
select HAVE_KPROBES
|
||||||
|
select HAVE_KPROBES_ON_FTRACE
|
||||||
|
select HAVE_KRETPROBES
|
||||||
select HAVE_PCI
|
select HAVE_PCI
|
||||||
select HAVE_PERF_EVENTS
|
select HAVE_PERF_EVENTS
|
||||||
select HAVE_PERF_REGS
|
select HAVE_PERF_REGS
|
||||||
select HAVE_PERF_USER_STACK_DUMP
|
select HAVE_PERF_USER_STACK_DUMP
|
||||||
|
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||||
select HAVE_STACKPROTECTOR
|
select HAVE_STACKPROTECTOR
|
||||||
select HAVE_SYSCALL_TRACEPOINTS
|
select HAVE_SYSCALL_TRACEPOINTS
|
||||||
select IRQ_DOMAIN
|
select IRQ_DOMAIN
|
||||||
@@ -143,7 +149,7 @@ config PAGE_OFFSET
|
|||||||
default 0xffffffe000000000 if 64BIT && MAXPHYSMEM_128GB
|
default 0xffffffe000000000 if 64BIT && MAXPHYSMEM_128GB
|
||||||
|
|
||||||
config ARCH_FLATMEM_ENABLE
|
config ARCH_FLATMEM_ENABLE
|
||||||
def_bool y
|
def_bool !NUMA
|
||||||
|
|
||||||
config ARCH_SPARSEMEM_ENABLE
|
config ARCH_SPARSEMEM_ENABLE
|
||||||
def_bool y
|
def_bool y
|
||||||
@@ -156,6 +162,9 @@ config ARCH_SELECT_MEMORY_MODEL
|
|||||||
config ARCH_WANT_GENERAL_HUGETLB
|
config ARCH_WANT_GENERAL_HUGETLB
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
|
config ARCH_SUPPORTS_UPROBES
|
||||||
|
def_bool y
|
||||||
|
|
||||||
config SYS_SUPPORTS_HUGETLBFS
|
config SYS_SUPPORTS_HUGETLBFS
|
||||||
depends on MMU
|
depends on MMU
|
||||||
def_bool y
|
def_bool y
|
||||||
@@ -302,6 +311,35 @@ config TUNE_GENERIC
|
|||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
# Common NUMA Features
|
||||||
|
config NUMA
|
||||||
|
bool "NUMA Memory Allocation and Scheduler Support"
|
||||||
|
select GENERIC_ARCH_NUMA
|
||||||
|
select OF_NUMA
|
||||||
|
select ARCH_SUPPORTS_NUMA_BALANCING
|
||||||
|
help
|
||||||
|
Enable NUMA (Non-Uniform Memory Access) support.
|
||||||
|
|
||||||
|
The kernel will try to allocate memory used by a CPU on the
|
||||||
|
local memory of the CPU and add some more NUMA awareness to the kernel.
|
||||||
|
|
||||||
|
config NODES_SHIFT
|
||||||
|
int "Maximum NUMA Nodes (as a power of 2)"
|
||||||
|
range 1 10
|
||||||
|
default "2"
|
||||||
|
depends on NEED_MULTIPLE_NODES
|
||||||
|
help
|
||||||
|
Specify the maximum number of NUMA Nodes available on the target
|
||||||
|
system. Increases memory reserved to accommodate various tables.
|
||||||
|
|
||||||
|
config USE_PERCPU_NUMA_NODE_ID
|
||||||
|
def_bool y
|
||||||
|
depends on NUMA
|
||||||
|
|
||||||
|
config NEED_PER_CPU_EMBED_FIRST_CHUNK
|
||||||
|
def_bool y
|
||||||
|
depends on NUMA
|
||||||
|
|
||||||
config RISCV_ISA_C
|
config RISCV_ISA_C
|
||||||
bool "Emit compressed instructions when building Linux"
|
bool "Emit compressed instructions when building Linux"
|
||||||
default y
|
default y
|
||||||
@@ -416,11 +454,17 @@ config EFI
|
|||||||
allow the kernel to be booted as an EFI application. This
|
allow the kernel to be booted as an EFI application. This
|
||||||
is only useful on systems that have UEFI firmware.
|
is only useful on systems that have UEFI firmware.
|
||||||
|
|
||||||
|
config CC_HAVE_STACKPROTECTOR_TLS
|
||||||
|
def_bool $(cc-option,-mstack-protector-guard=tls -mstack-protector-guard-reg=tp -mstack-protector-guard-offset=0)
|
||||||
|
|
||||||
|
config STACKPROTECTOR_PER_TASK
|
||||||
|
def_bool y
|
||||||
|
depends on STACKPROTECTOR && CC_HAVE_STACKPROTECTOR_TLS
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
config BUILTIN_DTB
|
config BUILTIN_DTB
|
||||||
def_bool n
|
def_bool n
|
||||||
depends on RISCV_M_MODE
|
|
||||||
depends on OF
|
depends on OF
|
||||||
|
|
||||||
menu "Power management options"
|
menu "Power management options"
|
||||||
|
|||||||
@@ -22,30 +22,41 @@ config SOC_VIRT
|
|||||||
help
|
help
|
||||||
This enables support for QEMU Virt Machine.
|
This enables support for QEMU Virt Machine.
|
||||||
|
|
||||||
config SOC_KENDRYTE
|
config SOC_CANAAN
|
||||||
bool "Kendryte K210 SoC"
|
bool "Canaan Kendryte K210 SoC"
|
||||||
depends on !MMU
|
depends on !MMU
|
||||||
select CLINT_TIMER if RISCV_M_MODE
|
select CLINT_TIMER if RISCV_M_MODE
|
||||||
select SERIAL_SIFIVE if TTY
|
select SERIAL_SIFIVE if TTY
|
||||||
select SERIAL_SIFIVE_CONSOLE if TTY
|
select SERIAL_SIFIVE_CONSOLE if TTY
|
||||||
select SIFIVE_PLIC
|
select SIFIVE_PLIC
|
||||||
|
select ARCH_HAS_RESET_CONTROLLER
|
||||||
|
select PINCTRL
|
||||||
help
|
help
|
||||||
This enables support for Kendryte K210 SoC platform hardware.
|
This enables support for Canaan Kendryte K210 SoC platform hardware.
|
||||||
|
|
||||||
config SOC_KENDRYTE_K210_DTB
|
if SOC_CANAAN
|
||||||
def_bool y
|
|
||||||
depends on SOC_KENDRYTE_K210_DTB_BUILTIN
|
|
||||||
|
|
||||||
config SOC_KENDRYTE_K210_DTB_BUILTIN
|
config SOC_CANAAN_K210_DTB_BUILTIN
|
||||||
bool "Builtin device tree for the Kendryte K210"
|
bool "Builtin device tree for the Canaan Kendryte K210"
|
||||||
depends on SOC_KENDRYTE
|
depends on SOC_CANAAN
|
||||||
default y
|
default y
|
||||||
select OF
|
select OF
|
||||||
select BUILTIN_DTB
|
select BUILTIN_DTB
|
||||||
select SOC_KENDRYTE_K210_DTB
|
|
||||||
help
|
help
|
||||||
Builds a device tree for the Kendryte K210 into the Linux image.
|
Build a device tree for the Kendryte K210 into the Linux image.
|
||||||
This option should be selected if no bootloader is being used.
|
This option should be selected if no bootloader is being used.
|
||||||
If unsure, say Y.
|
If unsure, say Y.
|
||||||
|
|
||||||
|
config SOC_CANAAN_K210_DTB_SOURCE
|
||||||
|
string "Source file for the Canaan Kendryte K210 builtin DTB"
|
||||||
|
depends on SOC_CANAAN
|
||||||
|
depends on SOC_CANAAN_K210_DTB_BUILTIN
|
||||||
|
default "k210_generic"
|
||||||
|
help
|
||||||
|
Base name (without suffix, relative to arch/riscv/boot/dts/canaan)
|
||||||
|
for the DTS file that will be used to produce the DTB linked into the
|
||||||
|
kernel.
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ OBJCOPYFLAGS := -O binary
|
|||||||
LDFLAGS_vmlinux :=
|
LDFLAGS_vmlinux :=
|
||||||
ifeq ($(CONFIG_DYNAMIC_FTRACE),y)
|
ifeq ($(CONFIG_DYNAMIC_FTRACE),y)
|
||||||
LDFLAGS_vmlinux := --no-relax
|
LDFLAGS_vmlinux := --no-relax
|
||||||
|
KBUILD_CPPFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY
|
||||||
|
CC_FLAGS_FTRACE := -fpatchable-function-entry=8
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_64BIT)$(CONFIG_CMODEL_MEDLOW),yy)
|
ifeq ($(CONFIG_64BIT)$(CONFIG_CMODEL_MEDLOW),yy)
|
||||||
@@ -65,6 +67,16 @@ KBUILD_CFLAGS_MODULE += $(call cc-option,-mno-relax)
|
|||||||
# architectures. It's faster to have GCC emit only aligned accesses.
|
# architectures. It's faster to have GCC emit only aligned accesses.
|
||||||
KBUILD_CFLAGS += $(call cc-option,-mstrict-align)
|
KBUILD_CFLAGS += $(call cc-option,-mstrict-align)
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_STACKPROTECTOR_PER_TASK),y)
|
||||||
|
prepare: stack_protector_prepare
|
||||||
|
stack_protector_prepare: prepare0
|
||||||
|
$(eval KBUILD_CFLAGS += -mstack-protector-guard=tls \
|
||||||
|
-mstack-protector-guard-reg=tp \
|
||||||
|
-mstack-protector-guard-offset=$(shell \
|
||||||
|
awk '{if ($$2 == "TSK_STACK_CANARY") print $$3;}' \
|
||||||
|
include/generated/asm-offsets.h))
|
||||||
|
endif
|
||||||
|
|
||||||
# arch specific predefines for sparse
|
# arch specific predefines for sparse
|
||||||
CHECKFLAGS += -D__riscv -D__riscv_xlen=$(BITS)
|
CHECKFLAGS += -D__riscv -D__riscv_xlen=$(BITS)
|
||||||
|
|
||||||
@@ -83,7 +95,7 @@ PHONY += vdso_install
|
|||||||
vdso_install:
|
vdso_install:
|
||||||
$(Q)$(MAKE) $(build)=arch/riscv/kernel/vdso $@
|
$(Q)$(MAKE) $(build)=arch/riscv/kernel/vdso $@
|
||||||
|
|
||||||
ifeq ($(CONFIG_RISCV_M_MODE)$(CONFIG_SOC_KENDRYTE),yy)
|
ifeq ($(CONFIG_RISCV_M_MODE)$(CONFIG_SOC_CANAAN),yy)
|
||||||
KBUILD_IMAGE := $(boot)/loader.bin
|
KBUILD_IMAGE := $(boot)/loader.bin
|
||||||
else
|
else
|
||||||
KBUILD_IMAGE := $(boot)/Image.gz
|
KBUILD_IMAGE := $(boot)/Image.gz
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
subdir-y += sifive
|
subdir-y += sifive
|
||||||
subdir-y += kendryte
|
subdir-$(CONFIG_SOC_CANAAN_K210_DTB_BUILTIN) += canaan
|
||||||
|
|
||||||
obj-$(CONFIG_BUILTIN_DTB) := $(addsuffix /, $(subdir-y))
|
obj-$(CONFIG_BUILTIN_DTB) := $(addsuffix /, $(subdir-y))
|
||||||
|
|||||||
5
arch/riscv/boot/dts/canaan/Makefile
Normal file
5
arch/riscv/boot/dts/canaan/Makefile
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
ifneq ($(CONFIG_SOC_CANAAN_K210_DTB_SOURCE),"")
|
||||||
|
dtb-y += $(strip $(shell echo $(CONFIG_SOC_CANAAN_K210_DTB_SOURCE))).dtb
|
||||||
|
obj-$(CONFIG_SOC_CANAAN_K210_DTB_BUILTIN) += $(addsuffix .o, $(dtb-y))
|
||||||
|
endif
|
||||||
152
arch/riscv/boot/dts/canaan/canaan_kd233.dts
Normal file
152
arch/riscv/boot/dts/canaan/canaan_kd233.dts
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019-20 Sean Anderson <seanga2@gmail.com>
|
||||||
|
* Copyright (C) 2020 Western Digital Corporation or its affiliates.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
#include "k210.dtsi"
|
||||||
|
|
||||||
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
|
#include <dt-bindings/input/input.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "Kendryte KD233";
|
||||||
|
compatible = "canaan,kendryte-kd233", "canaan,kendryte-k210";
|
||||||
|
|
||||||
|
chosen {
|
||||||
|
bootargs = "earlycon console=ttySIF0";
|
||||||
|
stdout-path = "serial0:115200n8";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpio-leds {
|
||||||
|
compatible = "gpio-leds";
|
||||||
|
|
||||||
|
led0 {
|
||||||
|
gpios = <&gpio0 8 GPIO_ACTIVE_LOW>;
|
||||||
|
};
|
||||||
|
|
||||||
|
led1 {
|
||||||
|
gpios = <&gpio0 9 GPIO_ACTIVE_LOW>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
gpio-keys {
|
||||||
|
compatible = "gpio-keys";
|
||||||
|
|
||||||
|
key0 {
|
||||||
|
label = "KEY0";
|
||||||
|
linux,code = <BTN_0>;
|
||||||
|
gpios = <&gpio0 10 GPIO_ACTIVE_LOW>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&fpioa {
|
||||||
|
pinctrl-0 = <&jtag_pinctrl>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
jtag_pinctrl: jtag-pinmux {
|
||||||
|
pinmux = <K210_FPIOA(0, K210_PCF_JTAG_TCLK)>,
|
||||||
|
<K210_FPIOA(1, K210_PCF_JTAG_TDI)>,
|
||||||
|
<K210_FPIOA(2, K210_PCF_JTAG_TMS)>,
|
||||||
|
<K210_FPIOA(3, K210_PCF_JTAG_TDO)>;
|
||||||
|
};
|
||||||
|
|
||||||
|
uarths_pinctrl: uarths-pinmux {
|
||||||
|
pinmux = <K210_FPIOA(4, K210_PCF_UARTHS_RX)>,
|
||||||
|
<K210_FPIOA(5, K210_PCF_UARTHS_TX)>;
|
||||||
|
};
|
||||||
|
|
||||||
|
spi0_pinctrl: spi0-pinmux {
|
||||||
|
pinmux = <K210_FPIOA(6, K210_PCF_GPIOHS20)>, /* cs */
|
||||||
|
<K210_FPIOA(7, K210_PCF_SPI0_SCLK)>, /* wr */
|
||||||
|
<K210_FPIOA(8, K210_PCF_GPIOHS21)>; /* dc */
|
||||||
|
};
|
||||||
|
|
||||||
|
dvp_pinctrl: dvp-pinmux {
|
||||||
|
pinmux = <K210_FPIOA(9, K210_PCF_SCCB_SCLK)>,
|
||||||
|
<K210_FPIOA(10, K210_PCF_SCCB_SDA)>,
|
||||||
|
<K210_FPIOA(11, K210_PCF_DVP_RST)>,
|
||||||
|
<K210_FPIOA(12, K210_PCF_DVP_VSYNC)>,
|
||||||
|
<K210_FPIOA(13, K210_PCF_DVP_PWDN)>,
|
||||||
|
<K210_FPIOA(14, K210_PCF_DVP_XCLK)>,
|
||||||
|
<K210_FPIOA(15, K210_PCF_DVP_PCLK)>,
|
||||||
|
<K210_FPIOA(17, K210_PCF_DVP_HSYNC)>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpiohs_pinctrl: gpiohs-pinmux {
|
||||||
|
pinmux = <K210_FPIOA(16, K210_PCF_GPIOHS0)>,
|
||||||
|
<K210_FPIOA(20, K210_PCF_GPIOHS4)>, /* Rot. dip sw line 8 */
|
||||||
|
<K210_FPIOA(21, K210_PCF_GPIOHS5)>, /* Rot. dip sw line 4 */
|
||||||
|
<K210_FPIOA(22, K210_PCF_GPIOHS6)>, /* Rot. dip sw line 2 */
|
||||||
|
<K210_FPIOA(23, K210_PCF_GPIOHS7)>, /* Rot. dip sw line 1 */
|
||||||
|
<K210_FPIOA(24, K210_PCF_GPIOHS8)>,
|
||||||
|
<K210_FPIOA(25, K210_PCF_GPIOHS9)>,
|
||||||
|
<K210_FPIOA(26, K210_PCF_GPIOHS10)>;
|
||||||
|
};
|
||||||
|
|
||||||
|
spi1_pinctrl: spi1-pinmux {
|
||||||
|
pinmux = <K210_FPIOA(29, K210_PCF_SPI1_SCLK)>,
|
||||||
|
<K210_FPIOA(30, K210_PCF_SPI1_D0)>,
|
||||||
|
<K210_FPIOA(31, K210_PCF_SPI1_D1)>,
|
||||||
|
<K210_FPIOA(32, K210_PCF_GPIOHS16)>; /* cs */
|
||||||
|
};
|
||||||
|
|
||||||
|
i2s0_pinctrl: i2s0-pinmux {
|
||||||
|
pinmux = <K210_FPIOA(33, K210_PCF_I2S0_IN_D0)>,
|
||||||
|
<K210_FPIOA(34, K210_PCF_I2S0_WS)>,
|
||||||
|
<K210_FPIOA(35, K210_PCF_I2S0_SCLK)>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&uarths0 {
|
||||||
|
pinctrl-0 = <&uarths_pinctrl>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&gpio0 {
|
||||||
|
pinctrl-0 = <&gpiohs_pinctrl>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&i2s0 {
|
||||||
|
#sound-dai-cells = <1>;
|
||||||
|
pinctrl-0 = <&i2s0_pinctrl>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
};
|
||||||
|
|
||||||
|
&spi0 {
|
||||||
|
pinctrl-0 = <&spi0_pinctrl>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
num-cs = <1>;
|
||||||
|
cs-gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>;
|
||||||
|
|
||||||
|
panel@0 {
|
||||||
|
compatible = "ilitek,ili9341";
|
||||||
|
reg = <0>;
|
||||||
|
dc-gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>;
|
||||||
|
spi-max-frequency = <15000000>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&spi1 {
|
||||||
|
pinctrl-0 = <&spi1_pinctrl>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
num-cs = <1>;
|
||||||
|
cs-gpios = <&gpio0 16 GPIO_ACTIVE_LOW>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
slot@0 {
|
||||||
|
compatible = "mmc-spi-slot";
|
||||||
|
reg = <0>;
|
||||||
|
voltage-ranges = <3300 3300>;
|
||||||
|
spi-max-frequency = <25000000>;
|
||||||
|
broken-cd;
|
||||||
|
};
|
||||||
|
};
|
||||||
459
arch/riscv/boot/dts/canaan/k210.dtsi
Normal file
459
arch/riscv/boot/dts/canaan/k210.dtsi
Normal file
@@ -0,0 +1,459 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019-20 Sean Anderson <seanga2@gmail.com>
|
||||||
|
* Copyright (C) 2020 Western Digital Corporation or its affiliates.
|
||||||
|
*/
|
||||||
|
#include <dt-bindings/clock/k210-clk.h>
|
||||||
|
#include <dt-bindings/pinctrl/k210-fpioa.h>
|
||||||
|
#include <dt-bindings/reset/k210-rst.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
/*
|
||||||
|
* Although the K210 is a 64-bit CPU, the address bus is only 32-bits
|
||||||
|
* wide, and the upper half of all addresses is ignored.
|
||||||
|
*/
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "canaan,kendryte-k210";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &uarths0;
|
||||||
|
serial1 = &uart1;
|
||||||
|
serial2 = &uart2;
|
||||||
|
serial3 = &uart3;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The K210 has an sv39 MMU following the privileged specification v1.9.
|
||||||
|
* Since this is a non-ratified draft specification, the kernel does not
|
||||||
|
* support it and the K210 support enabled only for the !MMU case.
|
||||||
|
* Be consistent with this by setting the CPUs MMU type to "none".
|
||||||
|
*/
|
||||||
|
cpus {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
timebase-frequency = <7800000>;
|
||||||
|
cpu0: cpu@0 {
|
||||||
|
device_type = "cpu";
|
||||||
|
compatible = "canaan,k210", "riscv";
|
||||||
|
reg = <0>;
|
||||||
|
riscv,isa = "rv64imafdc";
|
||||||
|
mmu-type = "riscv,none";
|
||||||
|
i-cache-block-size = <64>;
|
||||||
|
i-cache-size = <0x8000>;
|
||||||
|
d-cache-block-size = <64>;
|
||||||
|
d-cache-size = <0x8000>;
|
||||||
|
cpu0_intc: interrupt-controller {
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
interrupt-controller;
|
||||||
|
compatible = "riscv,cpu-intc";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
cpu1: cpu@1 {
|
||||||
|
device_type = "cpu";
|
||||||
|
compatible = "canaan,k210", "riscv";
|
||||||
|
reg = <1>;
|
||||||
|
riscv,isa = "rv64imafdc";
|
||||||
|
mmu-type = "riscv,none";
|
||||||
|
i-cache-block-size = <64>;
|
||||||
|
i-cache-size = <0x8000>;
|
||||||
|
d-cache-block-size = <64>;
|
||||||
|
d-cache-size = <0x8000>;
|
||||||
|
cpu1_intc: interrupt-controller {
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
interrupt-controller;
|
||||||
|
compatible = "riscv,cpu-intc";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
sram: memory@80000000 {
|
||||||
|
device_type = "memory";
|
||||||
|
compatible = "canaan,k210-sram";
|
||||||
|
reg = <0x80000000 0x400000>,
|
||||||
|
<0x80400000 0x200000>,
|
||||||
|
<0x80600000 0x200000>;
|
||||||
|
reg-names = "sram0", "sram1", "aisram";
|
||||||
|
clocks = <&sysclk K210_CLK_SRAM0>,
|
||||||
|
<&sysclk K210_CLK_SRAM1>,
|
||||||
|
<&sysclk K210_CLK_AI>;
|
||||||
|
clock-names = "sram0", "sram1", "aisram";
|
||||||
|
};
|
||||||
|
|
||||||
|
clocks {
|
||||||
|
in0: oscillator {
|
||||||
|
compatible = "fixed-clock";
|
||||||
|
#clock-cells = <0>;
|
||||||
|
clock-frequency = <26000000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
soc {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "simple-bus";
|
||||||
|
ranges;
|
||||||
|
interrupt-parent = <&plic0>;
|
||||||
|
|
||||||
|
rom0: nvmem@1000 {
|
||||||
|
reg = <0x1000 0x1000>;
|
||||||
|
read-only;
|
||||||
|
};
|
||||||
|
|
||||||
|
clint0: timer@2000000 {
|
||||||
|
compatible = "canaan,k210-clint", "sifive,clint0";
|
||||||
|
reg = <0x2000000 0xC000>;
|
||||||
|
interrupts-extended = <&cpu0_intc 3 &cpu0_intc 7
|
||||||
|
&cpu1_intc 3 &cpu1_intc 7>;
|
||||||
|
};
|
||||||
|
|
||||||
|
plic0: interrupt-controller@c000000 {
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
#address-cells = <0>;
|
||||||
|
compatible = "canaan,k210-plic", "sifive,plic-1.0.0";
|
||||||
|
reg = <0xC000000 0x4000000>;
|
||||||
|
interrupt-controller;
|
||||||
|
interrupts-extended = <&cpu0_intc 11 &cpu1_intc 11>;
|
||||||
|
riscv,ndev = <65>;
|
||||||
|
};
|
||||||
|
|
||||||
|
uarths0: serial@38000000 {
|
||||||
|
compatible = "canaan,k210-uarths", "sifive,uart0";
|
||||||
|
reg = <0x38000000 0x1000>;
|
||||||
|
interrupts = <33>;
|
||||||
|
clocks = <&sysclk K210_CLK_CPU>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpio0: gpio-controller@38001000 {
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
compatible = "canaan,k210-gpiohs", "sifive,gpio0";
|
||||||
|
reg = <0x38001000 0x1000>;
|
||||||
|
interrupt-controller;
|
||||||
|
interrupts = <34 35 36 37 38 39 40 41
|
||||||
|
42 43 44 45 46 47 48 49
|
||||||
|
50 51 52 53 54 55 56 57
|
||||||
|
58 59 60 61 62 63 64 65>;
|
||||||
|
gpio-controller;
|
||||||
|
ngpios = <32>;
|
||||||
|
};
|
||||||
|
|
||||||
|
dmac0: dma-controller@50000000 {
|
||||||
|
compatible = "snps,axi-dma-1.01a";
|
||||||
|
reg = <0x50000000 0x1000>;
|
||||||
|
interrupts = <27 28 29 30 31 32>;
|
||||||
|
#dma-cells = <1>;
|
||||||
|
clocks = <&sysclk K210_CLK_DMA>, <&sysclk K210_CLK_DMA>;
|
||||||
|
clock-names = "core-clk", "cfgr-clk";
|
||||||
|
resets = <&sysrst K210_RST_DMA>;
|
||||||
|
dma-channels = <6>;
|
||||||
|
snps,dma-masters = <2>;
|
||||||
|
snps,priority = <0 1 2 3 4 5>;
|
||||||
|
snps,data-width = <5>;
|
||||||
|
snps,block-size = <0x200000 0x200000 0x200000
|
||||||
|
0x200000 0x200000 0x200000>;
|
||||||
|
snps,axi-max-burst-len = <256>;
|
||||||
|
};
|
||||||
|
|
||||||
|
apb0: bus@50200000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "simple-pm-bus";
|
||||||
|
ranges;
|
||||||
|
clocks = <&sysclk K210_CLK_APB0>;
|
||||||
|
|
||||||
|
gpio1: gpio@50200000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
compatible = "snps,dw-apb-gpio";
|
||||||
|
reg = <0x50200000 0x80>;
|
||||||
|
clocks = <&sysclk K210_CLK_APB0>,
|
||||||
|
<&sysclk K210_CLK_GPIO>;
|
||||||
|
clock-names = "bus", "db";
|
||||||
|
resets = <&sysrst K210_RST_GPIO>;
|
||||||
|
|
||||||
|
gpio1_0: gpio-port@0 {
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
compatible = "snps,dw-apb-gpio-port";
|
||||||
|
reg = <0>;
|
||||||
|
interrupt-controller;
|
||||||
|
interrupts = <23>;
|
||||||
|
gpio-controller;
|
||||||
|
ngpios = <8>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
uart1: serial@50210000 {
|
||||||
|
compatible = "snps,dw-apb-uart";
|
||||||
|
reg = <0x50210000 0x100>;
|
||||||
|
interrupts = <11>;
|
||||||
|
clocks = <&sysclk K210_CLK_UART1>,
|
||||||
|
<&sysclk K210_CLK_APB0>;
|
||||||
|
clock-names = "baudclk", "apb_pclk";
|
||||||
|
resets = <&sysrst K210_RST_UART1>;
|
||||||
|
reg-io-width = <4>;
|
||||||
|
reg-shift = <2>;
|
||||||
|
dcd-override;
|
||||||
|
dsr-override;
|
||||||
|
cts-override;
|
||||||
|
ri-override;
|
||||||
|
};
|
||||||
|
|
||||||
|
uart2: serial@50220000 {
|
||||||
|
compatible = "snps,dw-apb-uart";
|
||||||
|
reg = <0x50220000 0x100>;
|
||||||
|
interrupts = <12>;
|
||||||
|
clocks = <&sysclk K210_CLK_UART2>,
|
||||||
|
<&sysclk K210_CLK_APB0>;
|
||||||
|
clock-names = "baudclk", "apb_pclk";
|
||||||
|
resets = <&sysrst K210_RST_UART2>;
|
||||||
|
reg-io-width = <4>;
|
||||||
|
reg-shift = <2>;
|
||||||
|
dcd-override;
|
||||||
|
dsr-override;
|
||||||
|
cts-override;
|
||||||
|
ri-override;
|
||||||
|
};
|
||||||
|
|
||||||
|
uart3: serial@50230000 {
|
||||||
|
compatible = "snps,dw-apb-uart";
|
||||||
|
reg = <0x50230000 0x100>;
|
||||||
|
interrupts = <13>;
|
||||||
|
clocks = <&sysclk K210_CLK_UART3>,
|
||||||
|
<&sysclk K210_CLK_APB0>;
|
||||||
|
clock-names = "baudclk", "apb_pclk";
|
||||||
|
resets = <&sysrst K210_RST_UART3>;
|
||||||
|
reg-io-width = <4>;
|
||||||
|
reg-shift = <2>;
|
||||||
|
dcd-override;
|
||||||
|
dsr-override;
|
||||||
|
cts-override;
|
||||||
|
ri-override;
|
||||||
|
};
|
||||||
|
|
||||||
|
spi2: spi@50240000 {
|
||||||
|
compatible = "canaan,k210-spi";
|
||||||
|
spi-slave;
|
||||||
|
reg = <0x50240000 0x100>;
|
||||||
|
#address-cells = <0>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
interrupts = <3>;
|
||||||
|
clocks = <&sysclk K210_CLK_SPI2>,
|
||||||
|
<&sysclk K210_CLK_APB0>;
|
||||||
|
clock-names = "ssi_clk", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_SPI2>;
|
||||||
|
spi-max-frequency = <25000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
i2s0: i2s@50250000 {
|
||||||
|
compatible = "snps,designware-i2s";
|
||||||
|
reg = <0x50250000 0x200>;
|
||||||
|
interrupts = <5>;
|
||||||
|
clocks = <&sysclk K210_CLK_I2S0>;
|
||||||
|
clock-names = "i2sclk";
|
||||||
|
resets = <&sysrst K210_RST_I2S0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
i2s1: i2s@50260000 {
|
||||||
|
compatible = "snps,designware-i2s";
|
||||||
|
reg = <0x50260000 0x200>;
|
||||||
|
interrupts = <6>;
|
||||||
|
clocks = <&sysclk K210_CLK_I2S1>;
|
||||||
|
clock-names = "i2sclk";
|
||||||
|
resets = <&sysrst K210_RST_I2S1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
i2s2: i2s@50270000 {
|
||||||
|
compatible = "snps,designware-i2s";
|
||||||
|
reg = <0x50270000 0x200>;
|
||||||
|
interrupts = <7>;
|
||||||
|
clocks = <&sysclk K210_CLK_I2S2>;
|
||||||
|
clock-names = "i2sclk";
|
||||||
|
resets = <&sysrst K210_RST_I2S2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
i2c0: i2c@50280000 {
|
||||||
|
compatible = "snps,designware-i2c";
|
||||||
|
reg = <0x50280000 0x100>;
|
||||||
|
interrupts = <8>;
|
||||||
|
clocks = <&sysclk K210_CLK_I2C0>,
|
||||||
|
<&sysclk K210_CLK_APB0>;
|
||||||
|
clock-names = "ref", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_I2C0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
i2c1: i2c@50290000 {
|
||||||
|
compatible = "snps,designware-i2c";
|
||||||
|
reg = <0x50290000 0x100>;
|
||||||
|
interrupts = <9>;
|
||||||
|
clocks = <&sysclk K210_CLK_I2C1>,
|
||||||
|
<&sysclk K210_CLK_APB0>;
|
||||||
|
clock-names = "ref", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_I2C1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
i2c2: i2c@502a0000 {
|
||||||
|
compatible = "snps,designware-i2c";
|
||||||
|
reg = <0x502A0000 0x100>;
|
||||||
|
interrupts = <10>;
|
||||||
|
clocks = <&sysclk K210_CLK_I2C2>,
|
||||||
|
<&sysclk K210_CLK_APB0>;
|
||||||
|
clock-names = "ref", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_I2C2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
fpioa: pinmux@502b0000 {
|
||||||
|
compatible = "canaan,k210-fpioa";
|
||||||
|
reg = <0x502B0000 0x100>;
|
||||||
|
clocks = <&sysclk K210_CLK_FPIOA>,
|
||||||
|
<&sysclk K210_CLK_APB0>;
|
||||||
|
clock-names = "ref", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_FPIOA>;
|
||||||
|
canaan,k210-sysctl-power = <&sysctl 108>;
|
||||||
|
};
|
||||||
|
|
||||||
|
timer0: timer@502d0000 {
|
||||||
|
compatible = "snps,dw-apb-timer";
|
||||||
|
reg = <0x502D0000 0x100>;
|
||||||
|
interrupts = <14 15>;
|
||||||
|
clocks = <&sysclk K210_CLK_TIMER0>,
|
||||||
|
<&sysclk K210_CLK_APB0>;
|
||||||
|
clock-names = "timer", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_TIMER0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
timer1: timer@502e0000 {
|
||||||
|
compatible = "snps,dw-apb-timer";
|
||||||
|
reg = <0x502E0000 0x100>;
|
||||||
|
interrupts = <16 17>;
|
||||||
|
clocks = <&sysclk K210_CLK_TIMER1>,
|
||||||
|
<&sysclk K210_CLK_APB0>;
|
||||||
|
clock-names = "timer", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_TIMER1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
timer2: timer@502f0000 {
|
||||||
|
compatible = "snps,dw-apb-timer";
|
||||||
|
reg = <0x502F0000 0x100>;
|
||||||
|
interrupts = <18 19>;
|
||||||
|
clocks = <&sysclk K210_CLK_TIMER2>,
|
||||||
|
<&sysclk K210_CLK_APB0>;
|
||||||
|
clock-names = "timer", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_TIMER2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
apb1: bus@50400000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "simple-pm-bus";
|
||||||
|
ranges;
|
||||||
|
clocks = <&sysclk K210_CLK_APB1>;
|
||||||
|
|
||||||
|
wdt0: watchdog@50400000 {
|
||||||
|
compatible = "snps,dw-wdt";
|
||||||
|
reg = <0x50400000 0x100>;
|
||||||
|
interrupts = <21>;
|
||||||
|
clocks = <&sysclk K210_CLK_WDT0>,
|
||||||
|
<&sysclk K210_CLK_APB1>;
|
||||||
|
clock-names = "tclk", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_WDT0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
wdt1: watchdog@50410000 {
|
||||||
|
compatible = "snps,dw-wdt";
|
||||||
|
reg = <0x50410000 0x100>;
|
||||||
|
interrupts = <22>;
|
||||||
|
clocks = <&sysclk K210_CLK_WDT1>,
|
||||||
|
<&sysclk K210_CLK_APB1>;
|
||||||
|
clock-names = "tclk", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_WDT1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sysctl: syscon@50440000 {
|
||||||
|
compatible = "canaan,k210-sysctl",
|
||||||
|
"syscon", "simple-mfd";
|
||||||
|
reg = <0x50440000 0x100>;
|
||||||
|
clocks = <&sysclk K210_CLK_APB1>;
|
||||||
|
clock-names = "pclk";
|
||||||
|
|
||||||
|
sysclk: clock-controller {
|
||||||
|
#clock-cells = <1>;
|
||||||
|
compatible = "canaan,k210-clk";
|
||||||
|
clocks = <&in0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sysrst: reset-controller {
|
||||||
|
compatible = "canaan,k210-rst";
|
||||||
|
#reset-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
reboot: syscon-reboot {
|
||||||
|
compatible = "syscon-reboot";
|
||||||
|
regmap = <&sysctl>;
|
||||||
|
offset = <48>;
|
||||||
|
mask = <1>;
|
||||||
|
value = <1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
apb2: bus@52000000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "simple-pm-bus";
|
||||||
|
ranges;
|
||||||
|
clocks = <&sysclk K210_CLK_APB2>;
|
||||||
|
|
||||||
|
spi0: spi@52000000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
compatible = "canaan,k210-spi";
|
||||||
|
reg = <0x52000000 0x100>;
|
||||||
|
interrupts = <1>;
|
||||||
|
clocks = <&sysclk K210_CLK_SPI0>,
|
||||||
|
<&sysclk K210_CLK_APB2>;
|
||||||
|
clock-names = "ssi_clk", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_SPI0>;
|
||||||
|
reset-names = "spi";
|
||||||
|
spi-max-frequency = <25000000>;
|
||||||
|
num-cs = <4>;
|
||||||
|
reg-io-width = <4>;
|
||||||
|
};
|
||||||
|
|
||||||
|
spi1: spi@53000000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
compatible = "canaan,k210-spi";
|
||||||
|
reg = <0x53000000 0x100>;
|
||||||
|
interrupts = <2>;
|
||||||
|
clocks = <&sysclk K210_CLK_SPI1>,
|
||||||
|
<&sysclk K210_CLK_APB2>;
|
||||||
|
clock-names = "ssi_clk", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_SPI1>;
|
||||||
|
reset-names = "spi";
|
||||||
|
spi-max-frequency = <25000000>;
|
||||||
|
num-cs = <4>;
|
||||||
|
reg-io-width = <4>;
|
||||||
|
};
|
||||||
|
|
||||||
|
spi3: spi@54000000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
compatible = "snps,dwc-ssi-1.01a";
|
||||||
|
reg = <0x54000000 0x200>;
|
||||||
|
interrupts = <4>;
|
||||||
|
clocks = <&sysclk K210_CLK_SPI3>,
|
||||||
|
<&sysclk K210_CLK_APB2>;
|
||||||
|
clock-names = "ssi_clk", "pclk";
|
||||||
|
resets = <&sysrst K210_RST_SPI3>;
|
||||||
|
reset-names = "spi";
|
||||||
|
/* Could possibly go up to 200 MHz */
|
||||||
|
spi-max-frequency = <100000000>;
|
||||||
|
num-cs = <4>;
|
||||||
|
reg-io-width = <4>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user