Add cs42l43 PC focused SoundWire CODEC
Merge series from Charles Keepax <ckeepax@opensource.cirrus.com>: This patch chain adds support for the Cirrus Logic cs42l43 PC focused SoundWire CODEC.
This commit is contained in:
commit
ab4724302f
|
@ -82,7 +82,12 @@ Description:
|
||||||
whether it resides in persistent capacity, volatile capacity,
|
whether it resides in persistent capacity, volatile capacity,
|
||||||
or the LSA, is made permanently unavailable by whatever means
|
or the LSA, is made permanently unavailable by whatever means
|
||||||
is appropriate for the media type. This functionality requires
|
is appropriate for the media type. This functionality requires
|
||||||
the device to be not be actively decoding any HPA ranges.
|
the device to be disabled, that is, not actively decoding any
|
||||||
|
HPA ranges. This permits avoiding explicit global CPU cache
|
||||||
|
management, relying instead for it to be done when a region
|
||||||
|
transitions between software programmed and hardware committed
|
||||||
|
states. If this file is not present, then there is no hardware
|
||||||
|
support for the operation.
|
||||||
|
|
||||||
|
|
||||||
What /sys/bus/cxl/devices/memX/security/erase
|
What /sys/bus/cxl/devices/memX/security/erase
|
||||||
|
@ -92,7 +97,13 @@ Contact: linux-cxl@vger.kernel.org
|
||||||
Description:
|
Description:
|
||||||
(WO) Write a boolean 'true' string value to this attribute to
|
(WO) Write a boolean 'true' string value to this attribute to
|
||||||
secure erase user data by changing the media encryption keys for
|
secure erase user data by changing the media encryption keys for
|
||||||
all user data areas of the device.
|
all user data areas of the device. This functionality requires
|
||||||
|
the device to be disabled, that is, not actively decoding any
|
||||||
|
HPA ranges. This permits avoiding explicit global CPU cache
|
||||||
|
management, relying instead for it to be done when a region
|
||||||
|
transitions between software programmed and hardware committed
|
||||||
|
states. If this file is not present, then there is no hardware
|
||||||
|
support for the operation.
|
||||||
|
|
||||||
|
|
||||||
What: /sys/bus/cxl/devices/memX/firmware/
|
What: /sys/bus/cxl/devices/memX/firmware/
|
||||||
|
|
|
@ -513,17 +513,18 @@ Description: information about CPUs heterogeneity.
|
||||||
cpu_capacity: capacity of cpuX.
|
cpu_capacity: capacity of cpuX.
|
||||||
|
|
||||||
What: /sys/devices/system/cpu/vulnerabilities
|
What: /sys/devices/system/cpu/vulnerabilities
|
||||||
/sys/devices/system/cpu/vulnerabilities/meltdown
|
/sys/devices/system/cpu/vulnerabilities/gather_data_sampling
|
||||||
/sys/devices/system/cpu/vulnerabilities/spectre_v1
|
/sys/devices/system/cpu/vulnerabilities/itlb_multihit
|
||||||
/sys/devices/system/cpu/vulnerabilities/spectre_v2
|
|
||||||
/sys/devices/system/cpu/vulnerabilities/spec_store_bypass
|
|
||||||
/sys/devices/system/cpu/vulnerabilities/l1tf
|
/sys/devices/system/cpu/vulnerabilities/l1tf
|
||||||
/sys/devices/system/cpu/vulnerabilities/mds
|
/sys/devices/system/cpu/vulnerabilities/mds
|
||||||
/sys/devices/system/cpu/vulnerabilities/srbds
|
/sys/devices/system/cpu/vulnerabilities/meltdown
|
||||||
/sys/devices/system/cpu/vulnerabilities/tsx_async_abort
|
|
||||||
/sys/devices/system/cpu/vulnerabilities/itlb_multihit
|
|
||||||
/sys/devices/system/cpu/vulnerabilities/mmio_stale_data
|
/sys/devices/system/cpu/vulnerabilities/mmio_stale_data
|
||||||
/sys/devices/system/cpu/vulnerabilities/retbleed
|
/sys/devices/system/cpu/vulnerabilities/retbleed
|
||||||
|
/sys/devices/system/cpu/vulnerabilities/spec_store_bypass
|
||||||
|
/sys/devices/system/cpu/vulnerabilities/spectre_v1
|
||||||
|
/sys/devices/system/cpu/vulnerabilities/spectre_v2
|
||||||
|
/sys/devices/system/cpu/vulnerabilities/srbds
|
||||||
|
/sys/devices/system/cpu/vulnerabilities/tsx_async_abort
|
||||||
Date: January 2018
|
Date: January 2018
|
||||||
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
|
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
|
||||||
Description: Information about CPU vulnerabilities
|
Description: Information about CPU vulnerabilities
|
||||||
|
|
|
@ -2,7 +2,7 @@ What: /sys/devices/platform/hidma-*/chid
|
||||||
/sys/devices/platform/QCOM8061:*/chid
|
/sys/devices/platform/QCOM8061:*/chid
|
||||||
Date: Dec 2015
|
Date: Dec 2015
|
||||||
KernelVersion: 4.4
|
KernelVersion: 4.4
|
||||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
Contact: "Sinan Kaya <okaya@kernel.org>"
|
||||||
Description:
|
Description:
|
||||||
Contains the ID of the channel within the HIDMA instance.
|
Contains the ID of the channel within the HIDMA instance.
|
||||||
It is used to associate a given HIDMA channel with the
|
It is used to associate a given HIDMA channel with the
|
||||||
|
|
|
@ -2,7 +2,7 @@ What: /sys/devices/platform/hidma-mgmt*/chanops/chan*/priority
|
||||||
/sys/devices/platform/QCOM8060:*/chanops/chan*/priority
|
/sys/devices/platform/QCOM8060:*/chanops/chan*/priority
|
||||||
Date: Nov 2015
|
Date: Nov 2015
|
||||||
KernelVersion: 4.4
|
KernelVersion: 4.4
|
||||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
Contact: "Sinan Kaya <okaya@kernel.org>"
|
||||||
Description:
|
Description:
|
||||||
Contains either 0 or 1 and indicates if the DMA channel is a
|
Contains either 0 or 1 and indicates if the DMA channel is a
|
||||||
low priority (0) or high priority (1) channel.
|
low priority (0) or high priority (1) channel.
|
||||||
|
@ -11,7 +11,7 @@ What: /sys/devices/platform/hidma-mgmt*/chanops/chan*/weight
|
||||||
/sys/devices/platform/QCOM8060:*/chanops/chan*/weight
|
/sys/devices/platform/QCOM8060:*/chanops/chan*/weight
|
||||||
Date: Nov 2015
|
Date: Nov 2015
|
||||||
KernelVersion: 4.4
|
KernelVersion: 4.4
|
||||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
Contact: "Sinan Kaya <okaya@kernel.org>"
|
||||||
Description:
|
Description:
|
||||||
Contains 0..15 and indicates the weight of the channel among
|
Contains 0..15 and indicates the weight of the channel among
|
||||||
equal priority channels during round robin scheduling.
|
equal priority channels during round robin scheduling.
|
||||||
|
@ -20,7 +20,7 @@ What: /sys/devices/platform/hidma-mgmt*/chreset_timeout_cycles
|
||||||
/sys/devices/platform/QCOM8060:*/chreset_timeout_cycles
|
/sys/devices/platform/QCOM8060:*/chreset_timeout_cycles
|
||||||
Date: Nov 2015
|
Date: Nov 2015
|
||||||
KernelVersion: 4.4
|
KernelVersion: 4.4
|
||||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
Contact: "Sinan Kaya <okaya@kernel.org>"
|
||||||
Description:
|
Description:
|
||||||
Contains the platform specific cycle value to wait after a
|
Contains the platform specific cycle value to wait after a
|
||||||
reset command is issued. If the value is chosen too short,
|
reset command is issued. If the value is chosen too short,
|
||||||
|
@ -32,7 +32,7 @@ What: /sys/devices/platform/hidma-mgmt*/dma_channels
|
||||||
/sys/devices/platform/QCOM8060:*/dma_channels
|
/sys/devices/platform/QCOM8060:*/dma_channels
|
||||||
Date: Nov 2015
|
Date: Nov 2015
|
||||||
KernelVersion: 4.4
|
KernelVersion: 4.4
|
||||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
Contact: "Sinan Kaya <okaya@kernel.org>"
|
||||||
Description:
|
Description:
|
||||||
Contains the number of dma channels supported by one instance
|
Contains the number of dma channels supported by one instance
|
||||||
of HIDMA hardware. The value may change from chip to chip.
|
of HIDMA hardware. The value may change from chip to chip.
|
||||||
|
@ -41,7 +41,7 @@ What: /sys/devices/platform/hidma-mgmt*/hw_version_major
|
||||||
/sys/devices/platform/QCOM8060:*/hw_version_major
|
/sys/devices/platform/QCOM8060:*/hw_version_major
|
||||||
Date: Nov 2015
|
Date: Nov 2015
|
||||||
KernelVersion: 4.4
|
KernelVersion: 4.4
|
||||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
Contact: "Sinan Kaya <okaya@kernel.org>"
|
||||||
Description:
|
Description:
|
||||||
Version number major for the hardware.
|
Version number major for the hardware.
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ What: /sys/devices/platform/hidma-mgmt*/hw_version_minor
|
||||||
/sys/devices/platform/QCOM8060:*/hw_version_minor
|
/sys/devices/platform/QCOM8060:*/hw_version_minor
|
||||||
Date: Nov 2015
|
Date: Nov 2015
|
||||||
KernelVersion: 4.4
|
KernelVersion: 4.4
|
||||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
Contact: "Sinan Kaya <okaya@kernel.org>"
|
||||||
Description:
|
Description:
|
||||||
Version number minor for the hardware.
|
Version number minor for the hardware.
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ What: /sys/devices/platform/hidma-mgmt*/max_rd_xactions
|
||||||
/sys/devices/platform/QCOM8060:*/max_rd_xactions
|
/sys/devices/platform/QCOM8060:*/max_rd_xactions
|
||||||
Date: Nov 2015
|
Date: Nov 2015
|
||||||
KernelVersion: 4.4
|
KernelVersion: 4.4
|
||||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
Contact: "Sinan Kaya <okaya@kernel.org>"
|
||||||
Description:
|
Description:
|
||||||
Contains a value between 0 and 31. Maximum number of
|
Contains a value between 0 and 31. Maximum number of
|
||||||
read transactions that can be issued back to back.
|
read transactions that can be issued back to back.
|
||||||
|
@ -69,7 +69,7 @@ What: /sys/devices/platform/hidma-mgmt*/max_read_request
|
||||||
/sys/devices/platform/QCOM8060:*/max_read_request
|
/sys/devices/platform/QCOM8060:*/max_read_request
|
||||||
Date: Nov 2015
|
Date: Nov 2015
|
||||||
KernelVersion: 4.4
|
KernelVersion: 4.4
|
||||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
Contact: "Sinan Kaya <okaya@kernel.org>"
|
||||||
Description:
|
Description:
|
||||||
Size of each read request. The value needs to be a power
|
Size of each read request. The value needs to be a power
|
||||||
of two and can be between 128 and 1024.
|
of two and can be between 128 and 1024.
|
||||||
|
@ -78,7 +78,7 @@ What: /sys/devices/platform/hidma-mgmt*/max_wr_xactions
|
||||||
/sys/devices/platform/QCOM8060:*/max_wr_xactions
|
/sys/devices/platform/QCOM8060:*/max_wr_xactions
|
||||||
Date: Nov 2015
|
Date: Nov 2015
|
||||||
KernelVersion: 4.4
|
KernelVersion: 4.4
|
||||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
Contact: "Sinan Kaya <okaya@kernel.org>"
|
||||||
Description:
|
Description:
|
||||||
Contains a value between 0 and 31. Maximum number of
|
Contains a value between 0 and 31. Maximum number of
|
||||||
write transactions that can be issued back to back.
|
write transactions that can be issued back to back.
|
||||||
|
@ -91,7 +91,7 @@ What: /sys/devices/platform/hidma-mgmt*/max_write_request
|
||||||
/sys/devices/platform/QCOM8060:*/max_write_request
|
/sys/devices/platform/QCOM8060:*/max_write_request
|
||||||
Date: Nov 2015
|
Date: Nov 2015
|
||||||
KernelVersion: 4.4
|
KernelVersion: 4.4
|
||||||
Contact: "Sinan Kaya <okaya@codeaurora.org>"
|
Contact: "Sinan Kaya <okaya@kernel.org>"
|
||||||
Description:
|
Description:
|
||||||
Size of each write request. The value needs to be a power
|
Size of each write request. The value needs to be a power
|
||||||
of two and can be between 128 and 1024.
|
of two and can be between 128 and 1024.
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
GDS - Gather Data Sampling
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Gather Data Sampling is a hardware vulnerability which allows unprivileged
|
||||||
|
speculative access to data which was previously stored in vector registers.
|
||||||
|
|
||||||
|
Problem
|
||||||
|
-------
|
||||||
|
When a gather instruction performs loads from memory, different data elements
|
||||||
|
are merged into the destination vector register. However, when a gather
|
||||||
|
instruction that is transiently executed encounters a fault, stale data from
|
||||||
|
architectural or internal vector registers may get transiently forwarded to the
|
||||||
|
destination vector register instead. This will allow a malicious attacker to
|
||||||
|
infer stale data using typical side channel techniques like cache timing
|
||||||
|
attacks. GDS is a purely sampling-based attack.
|
||||||
|
|
||||||
|
The attacker uses gather instructions to infer the stale vector register data.
|
||||||
|
The victim does not need to do anything special other than use the vector
|
||||||
|
registers. The victim does not need to use gather instructions to be
|
||||||
|
vulnerable.
|
||||||
|
|
||||||
|
Because the buffers are shared between Hyper-Threads cross Hyper-Thread attacks
|
||||||
|
are possible.
|
||||||
|
|
||||||
|
Attack scenarios
|
||||||
|
----------------
|
||||||
|
Without mitigation, GDS can infer stale data across virtually all
|
||||||
|
permission boundaries:
|
||||||
|
|
||||||
|
Non-enclaves can infer SGX enclave data
|
||||||
|
Userspace can infer kernel data
|
||||||
|
Guests can infer data from hosts
|
||||||
|
Guest can infer guest from other guests
|
||||||
|
Users can infer data from other users
|
||||||
|
|
||||||
|
Because of this, it is important to ensure that the mitigation stays enabled in
|
||||||
|
lower-privilege contexts like guests and when running outside SGX enclaves.
|
||||||
|
|
||||||
|
The hardware enforces the mitigation for SGX. Likewise, VMMs should ensure
|
||||||
|
that guests are not allowed to disable the GDS mitigation. If a host erred and
|
||||||
|
allowed this, a guest could theoretically disable GDS mitigation, mount an
|
||||||
|
attack, and re-enable it.
|
||||||
|
|
||||||
|
Mitigation mechanism
|
||||||
|
--------------------
|
||||||
|
This issue is mitigated in microcode. The microcode defines the following new
|
||||||
|
bits:
|
||||||
|
|
||||||
|
================================ === ============================
|
||||||
|
IA32_ARCH_CAPABILITIES[GDS_CTRL] R/O Enumerates GDS vulnerability
|
||||||
|
and mitigation support.
|
||||||
|
IA32_ARCH_CAPABILITIES[GDS_NO] R/O Processor is not vulnerable.
|
||||||
|
IA32_MCU_OPT_CTRL[GDS_MITG_DIS] R/W Disables the mitigation
|
||||||
|
0 by default.
|
||||||
|
IA32_MCU_OPT_CTRL[GDS_MITG_LOCK] R/W Locks GDS_MITG_DIS=0. Writes
|
||||||
|
to GDS_MITG_DIS are ignored
|
||||||
|
Can't be cleared once set.
|
||||||
|
================================ === ============================
|
||||||
|
|
||||||
|
GDS can also be mitigated on systems that don't have updated microcode by
|
||||||
|
disabling AVX. This can be done by setting gather_data_sampling="force" or
|
||||||
|
"clearcpuid=avx" on the kernel command-line.
|
||||||
|
|
||||||
|
If used, these options will disable AVX use by turning off XSAVE YMM support.
|
||||||
|
However, the processor will still enumerate AVX support. Userspace that
|
||||||
|
does not follow proper AVX enumeration to check both AVX *and* XSAVE YMM
|
||||||
|
support will break.
|
||||||
|
|
||||||
|
Mitigation control on the kernel command line
|
||||||
|
---------------------------------------------
|
||||||
|
The mitigation can be disabled by setting "gather_data_sampling=off" or
|
||||||
|
"mitigations=off" on the kernel command line. Not specifying either will default
|
||||||
|
to the mitigation being enabled. Specifying "gather_data_sampling=force" will
|
||||||
|
use the microcode mitigation when available or disable AVX on affected systems
|
||||||
|
where the microcode hasn't been updated to include the mitigation.
|
||||||
|
|
||||||
|
GDS System Information
|
||||||
|
------------------------
|
||||||
|
The kernel provides vulnerability status information through sysfs. For
|
||||||
|
GDS this can be accessed by the following sysfs file:
|
||||||
|
|
||||||
|
/sys/devices/system/cpu/vulnerabilities/gather_data_sampling
|
||||||
|
|
||||||
|
The possible values contained in this file are:
|
||||||
|
|
||||||
|
============================== =============================================
|
||||||
|
Not affected Processor not vulnerable.
|
||||||
|
Vulnerable Processor vulnerable and mitigation disabled.
|
||||||
|
Vulnerable: No microcode Processor vulnerable and microcode is missing
|
||||||
|
mitigation.
|
||||||
|
Mitigation: AVX disabled,
|
||||||
|
no microcode Processor is vulnerable and microcode is missing
|
||||||
|
mitigation. AVX disabled as mitigation.
|
||||||
|
Mitigation: Microcode Processor is vulnerable and mitigation is in
|
||||||
|
effect.
|
||||||
|
Mitigation: Microcode (locked) Processor is vulnerable and mitigation is in
|
||||||
|
effect and cannot be disabled.
|
||||||
|
Unknown: Dependent on
|
||||||
|
hypervisor status Running on a virtual guest processor that is
|
||||||
|
affected but with no way to know if host
|
||||||
|
processor is mitigated or vulnerable.
|
||||||
|
============================== =============================================
|
||||||
|
|
||||||
|
GDS Default mitigation
|
||||||
|
----------------------
|
||||||
|
The updated microcode will enable the mitigation by default. The kernel's
|
||||||
|
default action is to leave the mitigation enabled.
|
|
@ -13,9 +13,11 @@ are configurable at compile, boot or run time.
|
||||||
l1tf
|
l1tf
|
||||||
mds
|
mds
|
||||||
tsx_async_abort
|
tsx_async_abort
|
||||||
multihit.rst
|
multihit
|
||||||
special-register-buffer-data-sampling.rst
|
special-register-buffer-data-sampling
|
||||||
core-scheduling.rst
|
core-scheduling
|
||||||
l1d_flush.rst
|
l1d_flush
|
||||||
processor_mmio_stale_data.rst
|
processor_mmio_stale_data
|
||||||
cross-thread-rsb.rst
|
cross-thread-rsb
|
||||||
|
srso
|
||||||
|
gather_data_sampling
|
||||||
|
|
|
@ -0,0 +1,150 @@
|
||||||
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
Speculative Return Stack Overflow (SRSO)
|
||||||
|
========================================
|
||||||
|
|
||||||
|
This is a mitigation for the speculative return stack overflow (SRSO)
|
||||||
|
vulnerability found on AMD processors. The mechanism is by now the well
|
||||||
|
known scenario of poisoning CPU functional units - the Branch Target
|
||||||
|
Buffer (BTB) and Return Address Predictor (RAP) in this case - and then
|
||||||
|
tricking the elevated privilege domain (the kernel) into leaking
|
||||||
|
sensitive data.
|
||||||
|
|
||||||
|
AMD CPUs predict RET instructions using a Return Address Predictor (aka
|
||||||
|
Return Address Stack/Return Stack Buffer). In some cases, a non-architectural
|
||||||
|
CALL instruction (i.e., an instruction predicted to be a CALL but is
|
||||||
|
not actually a CALL) can create an entry in the RAP which may be used
|
||||||
|
to predict the target of a subsequent RET instruction.
|
||||||
|
|
||||||
|
The specific circumstances that lead to this varies by microarchitecture
|
||||||
|
but the concern is that an attacker can mis-train the CPU BTB to predict
|
||||||
|
non-architectural CALL instructions in kernel space and use this to
|
||||||
|
control the speculative target of a subsequent kernel RET, potentially
|
||||||
|
leading to information disclosure via a speculative side-channel.
|
||||||
|
|
||||||
|
The issue is tracked under CVE-2023-20569.
|
||||||
|
|
||||||
|
Affected processors
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
AMD Zen, generations 1-4. That is, all families 0x17 and 0x19. Older
|
||||||
|
processors have not been investigated.
|
||||||
|
|
||||||
|
System information and options
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
First of all, it is required that the latest microcode be loaded for
|
||||||
|
mitigations to be effective.
|
||||||
|
|
||||||
|
The sysfs file showing SRSO mitigation status is:
|
||||||
|
|
||||||
|
/sys/devices/system/cpu/vulnerabilities/spec_rstack_overflow
|
||||||
|
|
||||||
|
The possible values in this file are:
|
||||||
|
|
||||||
|
* 'Not affected':
|
||||||
|
|
||||||
|
The processor is not vulnerable
|
||||||
|
|
||||||
|
* 'Vulnerable: no microcode':
|
||||||
|
|
||||||
|
The processor is vulnerable, no microcode extending IBPB
|
||||||
|
functionality to address the vulnerability has been applied.
|
||||||
|
|
||||||
|
* 'Mitigation: microcode':
|
||||||
|
|
||||||
|
Extended IBPB functionality microcode patch has been applied. It does
|
||||||
|
not address User->Kernel and Guest->Host transitions protection but it
|
||||||
|
does address User->User and VM->VM attack vectors.
|
||||||
|
|
||||||
|
Note that User->User mitigation is controlled by how the IBPB aspect in
|
||||||
|
the Spectre v2 mitigation is selected:
|
||||||
|
|
||||||
|
* conditional IBPB:
|
||||||
|
|
||||||
|
where each process can select whether it needs an IBPB issued
|
||||||
|
around it PR_SPEC_DISABLE/_ENABLE etc, see :doc:`spectre`
|
||||||
|
|
||||||
|
* strict:
|
||||||
|
|
||||||
|
i.e., always on - by supplying spectre_v2_user=on on the kernel
|
||||||
|
command line
|
||||||
|
|
||||||
|
(spec_rstack_overflow=microcode)
|
||||||
|
|
||||||
|
* 'Mitigation: safe RET':
|
||||||
|
|
||||||
|
Software-only mitigation. It complements the extended IBPB microcode
|
||||||
|
patch functionality by addressing User->Kernel and Guest->Host
|
||||||
|
transitions protection.
|
||||||
|
|
||||||
|
Selected by default or by spec_rstack_overflow=safe-ret
|
||||||
|
|
||||||
|
* 'Mitigation: IBPB':
|
||||||
|
|
||||||
|
Similar protection as "safe RET" above but employs an IBPB barrier on
|
||||||
|
privilege domain crossings (User->Kernel, Guest->Host).
|
||||||
|
|
||||||
|
(spec_rstack_overflow=ibpb)
|
||||||
|
|
||||||
|
* 'Mitigation: IBPB on VMEXIT':
|
||||||
|
|
||||||
|
Mitigation addressing the cloud provider scenario - the Guest->Host
|
||||||
|
transitions only.
|
||||||
|
|
||||||
|
(spec_rstack_overflow=ibpb-vmexit)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
In order to exploit vulnerability, an attacker needs to:
|
||||||
|
|
||||||
|
- gain local access on the machine
|
||||||
|
|
||||||
|
- break kASLR
|
||||||
|
|
||||||
|
- find gadgets in the running kernel in order to use them in the exploit
|
||||||
|
|
||||||
|
- potentially create and pin an additional workload on the sibling
|
||||||
|
thread, depending on the microarchitecture (not necessary on fam 0x19)
|
||||||
|
|
||||||
|
- run the exploit
|
||||||
|
|
||||||
|
Considering the performance implications of each mitigation type, the
|
||||||
|
default one is 'Mitigation: safe RET' which should take care of most
|
||||||
|
attack vectors, including the local User->Kernel one.
|
||||||
|
|
||||||
|
As always, the user is advised to keep her/his system up-to-date by
|
||||||
|
applying software updates regularly.
|
||||||
|
|
||||||
|
The default setting will be reevaluated when needed and especially when
|
||||||
|
new attack vectors appear.
|
||||||
|
|
||||||
|
As one can surmise, 'Mitigation: safe RET' does come at the cost of some
|
||||||
|
performance depending on the workload. If one trusts her/his userspace
|
||||||
|
and does not want to suffer the performance impact, one can always
|
||||||
|
disable the mitigation with spec_rstack_overflow=off.
|
||||||
|
|
||||||
|
Similarly, 'Mitigation: IBPB' is another full mitigation type employing
|
||||||
|
an indrect branch prediction barrier after having applied the required
|
||||||
|
microcode patch for one's system. This mitigation comes also at
|
||||||
|
a performance cost.
|
||||||
|
|
||||||
|
Mitigation: safe RET
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
The mitigation works by ensuring all RET instructions speculate to
|
||||||
|
a controlled location, similar to how speculation is controlled in the
|
||||||
|
retpoline sequence. To accomplish this, the __x86_return_thunk forces
|
||||||
|
the CPU to mispredict every function return using a 'safe return'
|
||||||
|
sequence.
|
||||||
|
|
||||||
|
To ensure the safety of this mitigation, the kernel must ensure that the
|
||||||
|
safe return sequence is itself free from attacker interference. In Zen3
|
||||||
|
and Zen4, this is accomplished by creating a BTB alias between the
|
||||||
|
untraining function srso_untrain_ret_alias() and the safe return
|
||||||
|
function srso_safe_ret_alias() which results in evicting a potentially
|
||||||
|
poisoned BTB entry and using that safe one for all function returns.
|
||||||
|
|
||||||
|
In older Zen1 and Zen2, this is accomplished using a reinterpretation
|
||||||
|
technique similar to Retbleed one: srso_untrain_ret() and
|
||||||
|
srso_safe_ret().
|
|
@ -624,3 +624,9 @@ Used to get the correct ranges:
|
||||||
* VMALLOC_START ~ VMALLOC_END : vmalloc() / ioremap() space.
|
* VMALLOC_START ~ VMALLOC_END : vmalloc() / ioremap() space.
|
||||||
* VMEMMAP_START ~ VMEMMAP_END : vmemmap space, used for struct page array.
|
* VMEMMAP_START ~ VMEMMAP_END : vmemmap space, used for struct page array.
|
||||||
* KERNEL_LINK_ADDR : start address of Kernel link and BPF
|
* KERNEL_LINK_ADDR : start address of Kernel link and BPF
|
||||||
|
|
||||||
|
va_kernel_pa_offset
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Indicates the offset between the kernel virtual and physical mappings.
|
||||||
|
Used to translate virtual to physical addresses.
|
||||||
|
|
|
@ -1623,6 +1623,26 @@
|
||||||
Format: off | on
|
Format: off | on
|
||||||
default: on
|
default: on
|
||||||
|
|
||||||
|
gather_data_sampling=
|
||||||
|
[X86,INTEL] Control the Gather Data Sampling (GDS)
|
||||||
|
mitigation.
|
||||||
|
|
||||||
|
Gather Data Sampling is a hardware vulnerability which
|
||||||
|
allows unprivileged speculative access to data which was
|
||||||
|
previously stored in vector registers.
|
||||||
|
|
||||||
|
This issue is mitigated by default in updated microcode.
|
||||||
|
The mitigation may have a performance impact but can be
|
||||||
|
disabled. On systems without the microcode mitigation
|
||||||
|
disabling AVX serves as a mitigation.
|
||||||
|
|
||||||
|
force: Disable AVX to mitigate systems without
|
||||||
|
microcode mitigation. No effect if the microcode
|
||||||
|
mitigation is present. Known to cause crashes in
|
||||||
|
userspace with buggy AVX enumeration.
|
||||||
|
|
||||||
|
off: Disable GDS mitigation.
|
||||||
|
|
||||||
gcov_persist= [GCOV] When non-zero (default), profiling data for
|
gcov_persist= [GCOV] When non-zero (default), profiling data for
|
||||||
kernel modules is saved and remains accessible via
|
kernel modules is saved and remains accessible via
|
||||||
debugfs, even when the module is unloaded/reloaded.
|
debugfs, even when the module is unloaded/reloaded.
|
||||||
|
@ -3273,24 +3293,25 @@
|
||||||
Disable all optional CPU mitigations. This
|
Disable all optional CPU mitigations. This
|
||||||
improves system performance, but it may also
|
improves system performance, but it may also
|
||||||
expose users to several CPU vulnerabilities.
|
expose users to several CPU vulnerabilities.
|
||||||
Equivalent to: nopti [X86,PPC]
|
Equivalent to: if nokaslr then kpti=0 [ARM64]
|
||||||
if nokaslr then kpti=0 [ARM64]
|
gather_data_sampling=off [X86]
|
||||||
nospectre_v1 [X86,PPC]
|
kvm.nx_huge_pages=off [X86]
|
||||||
nobp=0 [S390]
|
|
||||||
nospectre_v2 [X86,PPC,S390,ARM64]
|
|
||||||
spectre_v2_user=off [X86]
|
|
||||||
spec_store_bypass_disable=off [X86,PPC]
|
|
||||||
ssbd=force-off [ARM64]
|
|
||||||
nospectre_bhb [ARM64]
|
|
||||||
l1tf=off [X86]
|
l1tf=off [X86]
|
||||||
mds=off [X86]
|
mds=off [X86]
|
||||||
tsx_async_abort=off [X86]
|
mmio_stale_data=off [X86]
|
||||||
kvm.nx_huge_pages=off [X86]
|
|
||||||
srbds=off [X86,INTEL]
|
|
||||||
no_entry_flush [PPC]
|
no_entry_flush [PPC]
|
||||||
no_uaccess_flush [PPC]
|
no_uaccess_flush [PPC]
|
||||||
mmio_stale_data=off [X86]
|
nobp=0 [S390]
|
||||||
|
nopti [X86,PPC]
|
||||||
|
nospectre_bhb [ARM64]
|
||||||
|
nospectre_v1 [X86,PPC]
|
||||||
|
nospectre_v2 [X86,PPC,S390,ARM64]
|
||||||
retbleed=off [X86]
|
retbleed=off [X86]
|
||||||
|
spec_store_bypass_disable=off [X86,PPC]
|
||||||
|
spectre_v2_user=off [X86]
|
||||||
|
srbds=off [X86,INTEL]
|
||||||
|
ssbd=force-off [ARM64]
|
||||||
|
tsx_async_abort=off [X86]
|
||||||
|
|
||||||
Exceptions:
|
Exceptions:
|
||||||
This does not have any effect on
|
This does not have any effect on
|
||||||
|
@ -5875,6 +5896,17 @@
|
||||||
Not specifying this option is equivalent to
|
Not specifying this option is equivalent to
|
||||||
spectre_v2_user=auto.
|
spectre_v2_user=auto.
|
||||||
|
|
||||||
|
spec_rstack_overflow=
|
||||||
|
[X86] Control RAS overflow mitigation on AMD Zen CPUs
|
||||||
|
|
||||||
|
off - Disable mitigation
|
||||||
|
microcode - Enable microcode mitigation only
|
||||||
|
safe-ret - Enable sw-only safe RET mitigation (default)
|
||||||
|
ibpb - Enable mitigation by issuing IBPB on
|
||||||
|
kernel entry
|
||||||
|
ibpb-vmexit - Issue IBPB only on VMEXIT
|
||||||
|
(cloud-specific mitigation)
|
||||||
|
|
||||||
spec_store_bypass_disable=
|
spec_store_bypass_disable=
|
||||||
[HW] Control Speculative Store Bypass (SSB) Disable mitigation
|
[HW] Control Speculative Store Bypass (SSB) Disable mitigation
|
||||||
(Speculative Store Bypass vulnerability)
|
(Speculative Store Bypass vulnerability)
|
||||||
|
|
|
@ -216,7 +216,6 @@ properties:
|
||||||
description: Whether to enable burnout current for EXT1.
|
description: Whether to enable burnout current for EXT1.
|
||||||
|
|
||||||
adi,ext1-burnout-current-nanoamp:
|
adi,ext1-burnout-current-nanoamp:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
description:
|
description:
|
||||||
Burnout current in nanoamps to be applied to EXT1.
|
Burnout current in nanoamps to be applied to EXT1.
|
||||||
enum: [0, 50, 500, 1000, 10000]
|
enum: [0, 50, 500, 1000, 10000]
|
||||||
|
@ -233,7 +232,6 @@ properties:
|
||||||
description: Whether to enable burnout current for EXT2.
|
description: Whether to enable burnout current for EXT2.
|
||||||
|
|
||||||
adi,ext2-burnout-current-nanoamp:
|
adi,ext2-burnout-current-nanoamp:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
description: Burnout current in nanoamps to be applied to EXT2.
|
description: Burnout current in nanoamps to be applied to EXT2.
|
||||||
enum: [0, 50, 500, 1000, 10000]
|
enum: [0, 50, 500, 1000, 10000]
|
||||||
default: 0
|
default: 0
|
||||||
|
@ -249,7 +247,6 @@ properties:
|
||||||
description: Whether to enable burnout current for VIOUT.
|
description: Whether to enable burnout current for VIOUT.
|
||||||
|
|
||||||
adi,viout-burnout-current-nanoamp:
|
adi,viout-burnout-current-nanoamp:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
description: Burnout current in nanoamps to be applied to VIOUT.
|
description: Burnout current in nanoamps to be applied to VIOUT.
|
||||||
enum: [0, 1000, 10000]
|
enum: [0, 1000, 10000]
|
||||||
default: 0
|
default: 0
|
||||||
|
|
|
@ -293,7 +293,7 @@ allOf:
|
||||||
patternProperties:
|
patternProperties:
|
||||||
"^mac@[0-1]$":
|
"^mac@[0-1]$":
|
||||||
type: object
|
type: object
|
||||||
additionalProperties: false
|
unevaluatedProperties: false
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: ethernet-controller.yaml#
|
- $ref: ethernet-controller.yaml#
|
||||||
description:
|
description:
|
||||||
|
@ -305,14 +305,9 @@ patternProperties:
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
phy-handle: true
|
|
||||||
|
|
||||||
phy-mode: true
|
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- reg
|
- reg
|
||||||
- compatible
|
- compatible
|
||||||
- phy-handle
|
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
|
|
|
@ -91,12 +91,18 @@ properties:
|
||||||
$ref: /schemas/types.yaml#/definitions/phandle
|
$ref: /schemas/types.yaml#/definitions/phandle
|
||||||
|
|
||||||
tx_delay:
|
tx_delay:
|
||||||
description: Delay value for TXD timing. Range value is 0~0x7F, 0x30 as default.
|
description: Delay value for TXD timing.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
minimum: 0
|
||||||
|
maximum: 0x7F
|
||||||
|
default: 0x30
|
||||||
|
|
||||||
rx_delay:
|
rx_delay:
|
||||||
description: Delay value for RXD timing. Range value is 0~0x7F, 0x10 as default.
|
description: Delay value for RXD timing.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
minimum: 0
|
||||||
|
maximum: 0x7F
|
||||||
|
default: 0x10
|
||||||
|
|
||||||
phy-supply:
|
phy-supply:
|
||||||
description: PHY regulator
|
description: PHY regulator
|
||||||
|
|
|
@ -16,13 +16,15 @@ properties:
|
||||||
- enum:
|
- enum:
|
||||||
- atmel,at91rm9200-usart
|
- atmel,at91rm9200-usart
|
||||||
- atmel,at91sam9260-usart
|
- atmel,at91sam9260-usart
|
||||||
- microchip,sam9x60-usart
|
|
||||||
- items:
|
- items:
|
||||||
- const: atmel,at91rm9200-dbgu
|
- const: atmel,at91rm9200-dbgu
|
||||||
- const: atmel,at91rm9200-usart
|
- const: atmel,at91rm9200-usart
|
||||||
- items:
|
- items:
|
||||||
- const: atmel,at91sam9260-dbgu
|
- const: atmel,at91sam9260-dbgu
|
||||||
- const: atmel,at91sam9260-usart
|
- const: atmel,at91sam9260-usart
|
||||||
|
- items:
|
||||||
|
- const: microchip,sam9x60-usart
|
||||||
|
- const: atmel,at91sam9260-usart
|
||||||
- items:
|
- items:
|
||||||
- const: microchip,sam9x60-dbgu
|
- const: microchip,sam9x60-dbgu
|
||||||
- const: microchip,sam9x60-usart
|
- const: microchip,sam9x60-usart
|
||||||
|
|
|
@ -0,0 +1,313 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/cirrus,cs42l43.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Cirrus Logic CS42L43 Audio CODEC
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- patches@opensource.cirrus.com
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The CS42L43 is an audio CODEC with integrated MIPI SoundWire interface
|
||||||
|
(Version 1.2.1 compliant), I2C, SPI, and I2S/TDM interfaces designed
|
||||||
|
for portable applications. It provides a high dynamic range, stereo
|
||||||
|
DAC for headphone output, two integrated Class D amplifiers for
|
||||||
|
loudspeakers, and two ADCs for wired headset microphone input or
|
||||||
|
stereo line input. PDM inputs are provided for digital microphones.
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: dai-common.yaml#
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- cirrus,cs42l43
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
vdd-p-supply:
|
||||||
|
description:
|
||||||
|
Power supply for the high voltage interface.
|
||||||
|
|
||||||
|
vdd-a-supply:
|
||||||
|
description:
|
||||||
|
Power supply for internal analog circuits.
|
||||||
|
|
||||||
|
vdd-d-supply:
|
||||||
|
description:
|
||||||
|
Power supply for internal digital circuits. Can be internally supplied.
|
||||||
|
|
||||||
|
vdd-io-supply:
|
||||||
|
description:
|
||||||
|
Power supply for external interface and internal digital logic.
|
||||||
|
|
||||||
|
vdd-cp-supply:
|
||||||
|
description:
|
||||||
|
Power supply for the amplifier 3 and 4 charge pump.
|
||||||
|
|
||||||
|
vdd-amp-supply:
|
||||||
|
description:
|
||||||
|
Power supply for amplifier 1 and 2.
|
||||||
|
|
||||||
|
reset-gpios:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupt-controller: true
|
||||||
|
|
||||||
|
"#interrupt-cells":
|
||||||
|
const: 2
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
"#sound-dai-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: Synchronous audio clock provided on mclk_in.
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
const: mclk
|
||||||
|
|
||||||
|
cirrus,bias-low:
|
||||||
|
type: boolean
|
||||||
|
description:
|
||||||
|
Select a 1.8V headset micbias rather than 2.8V.
|
||||||
|
|
||||||
|
cirrus,bias-sense-microamp:
|
||||||
|
description:
|
||||||
|
Current at which the headset micbias sense clamp will engage, 0 to
|
||||||
|
disable.
|
||||||
|
enum: [ 0, 14, 23, 41, 50, 60, 68, 86, 95 ]
|
||||||
|
default: 0
|
||||||
|
|
||||||
|
cirrus,bias-ramp-ms:
|
||||||
|
description:
|
||||||
|
Time in milliseconds the hardware allows for the headset micbias to
|
||||||
|
ramp up.
|
||||||
|
enum: [ 10, 40, 90, 170 ]
|
||||||
|
default: 170
|
||||||
|
|
||||||
|
cirrus,detect-us:
|
||||||
|
description:
|
||||||
|
Time in microseconds the type detection will run for. Long values will
|
||||||
|
cause more audible effects, but give more accurate detection.
|
||||||
|
enum: [ 20, 100, 1000, 10000, 50000, 75000, 100000, 200000 ]
|
||||||
|
default: 10000
|
||||||
|
|
||||||
|
cirrus,button-automute:
|
||||||
|
type: boolean
|
||||||
|
description:
|
||||||
|
Enable the hardware automuting of decimator 1 when a headset button is
|
||||||
|
pressed.
|
||||||
|
|
||||||
|
cirrus,buttons-ohms:
|
||||||
|
description:
|
||||||
|
Impedance in Ohms for each headset button, these should be listed in
|
||||||
|
ascending order.
|
||||||
|
minItems: 1
|
||||||
|
maxItems: 6
|
||||||
|
|
||||||
|
cirrus,tip-debounce-ms:
|
||||||
|
description:
|
||||||
|
Software debounce on tip sense triggering in milliseconds.
|
||||||
|
default: 0
|
||||||
|
|
||||||
|
cirrus,tip-invert:
|
||||||
|
type: boolean
|
||||||
|
description:
|
||||||
|
Indicates tip detect polarity, inverted implies open-circuit whilst the
|
||||||
|
jack is inserted.
|
||||||
|
|
||||||
|
cirrus,tip-disable-pullup:
|
||||||
|
type: boolean
|
||||||
|
description:
|
||||||
|
Indicates if the internal pullup on the tip detect should be disabled.
|
||||||
|
|
||||||
|
cirrus,tip-fall-db-ms:
|
||||||
|
description:
|
||||||
|
Time in milliseconds a falling edge on the tip detect should be hardware
|
||||||
|
debounced for. Note the falling edge is considered after the invert.
|
||||||
|
enum: [ 0, 125, 250, 500, 750, 1000, 1250, 1500 ]
|
||||||
|
default: 500
|
||||||
|
|
||||||
|
cirrus,tip-rise-db-ms:
|
||||||
|
description:
|
||||||
|
Time in milliseconds a rising edge on the tip detect should be hardware
|
||||||
|
debounced for. Note the rising edge is considered after the invert.
|
||||||
|
enum: [ 0, 125, 250, 500, 750, 1000, 1250, 1500 ]
|
||||||
|
default: 500
|
||||||
|
|
||||||
|
cirrus,use-ring-sense:
|
||||||
|
type: boolean
|
||||||
|
description:
|
||||||
|
Indicates if the ring sense should be used.
|
||||||
|
|
||||||
|
cirrus,ring-invert:
|
||||||
|
type: boolean
|
||||||
|
description:
|
||||||
|
Indicates ring detect polarity, inverted implies open-circuit whilst the
|
||||||
|
jack is inserted.
|
||||||
|
|
||||||
|
cirrus,ring-disable-pullup:
|
||||||
|
type: boolean
|
||||||
|
description:
|
||||||
|
Indicates if the internal pullup on the ring detect should be disabled.
|
||||||
|
|
||||||
|
cirrus,ring-fall-db-ms:
|
||||||
|
description:
|
||||||
|
Time in milliseconds a falling edge on the ring detect should be hardware
|
||||||
|
debounced for. Note the falling edge is considered after the invert.
|
||||||
|
enum: [ 0, 125, 250, 500, 750, 1000, 1250, 1500 ]
|
||||||
|
default: 500
|
||||||
|
|
||||||
|
cirrus,ring-rise-db-ms:
|
||||||
|
description:
|
||||||
|
Time in milliseconds a rising edge on the ring detect should be hardware
|
||||||
|
debounced for. Note the rising edge is considered after the invert.
|
||||||
|
enum: [ 0, 125, 250, 500, 750, 1000, 1250, 1500 ]
|
||||||
|
default: 500
|
||||||
|
|
||||||
|
pinctrl:
|
||||||
|
type: object
|
||||||
|
$ref: /schemas/pinctrl/pinctrl.yaml#
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
properties:
|
||||||
|
gpio-controller: true
|
||||||
|
|
||||||
|
"#gpio-cells":
|
||||||
|
const: 2
|
||||||
|
|
||||||
|
gpio-ranges:
|
||||||
|
items:
|
||||||
|
- description: A phandle to the CODEC pinctrl node
|
||||||
|
minimum: 0
|
||||||
|
- const: 0
|
||||||
|
- const: 0
|
||||||
|
- const: 3
|
||||||
|
|
||||||
|
patternProperties:
|
||||||
|
"-state$":
|
||||||
|
oneOf:
|
||||||
|
- $ref: "#/$defs/cirrus-cs42l43-state"
|
||||||
|
- patternProperties:
|
||||||
|
"-pins$":
|
||||||
|
$ref: "#/$defs/cirrus-cs42l43-state"
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
spi:
|
||||||
|
type: object
|
||||||
|
$ref: /schemas/spi/spi-controller.yaml#
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
|
$defs:
|
||||||
|
cirrus-cs42l43-state:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/pinctrl/pincfg-node.yaml#
|
||||||
|
- $ref: /schemas/pinctrl/pinmux-node.yaml#
|
||||||
|
|
||||||
|
oneOf:
|
||||||
|
- required: [ groups ]
|
||||||
|
- required: [ pins ]
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
properties:
|
||||||
|
groups:
|
||||||
|
enum: [ gpio1, gpio2, gpio3, asp, pdmout2, pdmout1, i2c, spi ]
|
||||||
|
|
||||||
|
pins:
|
||||||
|
enum: [ gpio1, gpio2, gpio3,
|
||||||
|
asp_dout, asp_fsync, asp_bclk,
|
||||||
|
pdmout2_clk, pdmout2_data, pdmout1_clk, pdmout1_data,
|
||||||
|
i2c_sda, i2c_scl,
|
||||||
|
spi_miso, spi_sck, spi_ssb ]
|
||||||
|
|
||||||
|
function:
|
||||||
|
enum: [ gpio, spdif, irq, mic-shutter, spk-shutter ]
|
||||||
|
|
||||||
|
drive-strength:
|
||||||
|
description: Set drive strength in mA
|
||||||
|
enum: [ 1, 2, 4, 8, 9, 10, 12, 16 ]
|
||||||
|
|
||||||
|
input-debounce:
|
||||||
|
description: Set input debounce in uS
|
||||||
|
enum: [ 0, 85 ]
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- vdd-p-supply
|
||||||
|
- vdd-a-supply
|
||||||
|
- vdd-io-supply
|
||||||
|
- vdd-cp-supply
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
|
||||||
|
i2c {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
cs42l43: codec@1a {
|
||||||
|
compatible = "cirrus,cs42l43";
|
||||||
|
reg = <0x1a>;
|
||||||
|
|
||||||
|
vdd-p-supply = <&vdd5v0>;
|
||||||
|
vdd-a-supply = <&vdd1v8>;
|
||||||
|
vdd-io-supply = <&vdd1v8>;
|
||||||
|
vdd-cp-supply = <&vdd1v8>;
|
||||||
|
vdd-amp-supply = <&vdd5v0>;
|
||||||
|
|
||||||
|
reset-gpios = <&gpio 0>;
|
||||||
|
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
interrupt-parent = <&gpio>;
|
||||||
|
interrupts = <56 IRQ_TYPE_LEVEL_LOW>;
|
||||||
|
|
||||||
|
#sound-dai-cells = <1>;
|
||||||
|
|
||||||
|
clocks = <&clks 0>;
|
||||||
|
clock-names = "mclk";
|
||||||
|
|
||||||
|
cs42l43_pins: pinctrl {
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
gpio-ranges = <&cs42l43_pins 0 0 3>;
|
||||||
|
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinsettings>;
|
||||||
|
|
||||||
|
pinsettings: default-state {
|
||||||
|
shutter-pins {
|
||||||
|
groups = "gpio3";
|
||||||
|
function = "mic-shutter";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
spi {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
cs-gpios = <&cs42l43_pins 1 0>;
|
||||||
|
|
||||||
|
sensor@0 {
|
||||||
|
compatible = "bosch,bme680";
|
||||||
|
reg = <0>;
|
||||||
|
spi-max-frequency = <1400000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -551,9 +551,8 @@ mutex or just to use i_size_read() instead.
|
||||||
Note: this does not protect the file->f_pos against concurrent modifications
|
Note: this does not protect the file->f_pos against concurrent modifications
|
||||||
since this is something the userspace has to take care about.
|
since this is something the userspace has to take care about.
|
||||||
|
|
||||||
->iterate() is called with i_rwsem exclusive.
|
->iterate_shared() is called with i_rwsem held for reading, and with the
|
||||||
|
file f_pos_lock held exclusively
|
||||||
->iterate_shared() is called with i_rwsem at least shared.
|
|
||||||
|
|
||||||
->fasync() is responsible for maintaining the FASYNC bit in filp->f_flags.
|
->fasync() is responsible for maintaining the FASYNC bit in filp->f_flags.
|
||||||
Most instances call fasync_helper(), which does that maintenance, so it's
|
Most instances call fasync_helper(), which does that maintenance, so it's
|
||||||
|
|
|
@ -537,7 +537,7 @@ vfs_readdir() is gone; switch to iterate_dir() instead
|
||||||
|
|
||||||
**mandatory**
|
**mandatory**
|
||||||
|
|
||||||
->readdir() is gone now; switch to ->iterate()
|
->readdir() is gone now; switch to ->iterate_shared()
|
||||||
|
|
||||||
**mandatory**
|
**mandatory**
|
||||||
|
|
||||||
|
@ -693,24 +693,19 @@ parallel now.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**recommended**
|
**mandatory**
|
||||||
|
|
||||||
->iterate_shared() is added; it's a parallel variant of ->iterate().
|
->iterate_shared() is added.
|
||||||
Exclusion on struct file level is still provided (as well as that
|
Exclusion on struct file level is still provided (as well as that
|
||||||
between it and lseek on the same struct file), but if your directory
|
between it and lseek on the same struct file), but if your directory
|
||||||
has been opened several times, you can get these called in parallel.
|
has been opened several times, you can get these called in parallel.
|
||||||
Exclusion between that method and all directory-modifying ones is
|
Exclusion between that method and all directory-modifying ones is
|
||||||
still provided, of course.
|
still provided, of course.
|
||||||
|
|
||||||
Often enough ->iterate() can serve as ->iterate_shared() without any
|
If you have any per-inode or per-dentry in-core data structures modified
|
||||||
changes - it is a read-only operation, after all. If you have any
|
by ->iterate_shared(), you might need something to serialize the access
|
||||||
per-inode or per-dentry in-core data structures modified by ->iterate(),
|
to them. If you do dcache pre-seeding, you'll need to switch to
|
||||||
you might need something to serialize the access to them. If you
|
d_alloc_parallel() for that; look for in-tree examples.
|
||||||
do dcache pre-seeding, you'll need to switch to d_alloc_parallel() for
|
|
||||||
that; look for in-tree examples.
|
|
||||||
|
|
||||||
Old method is only used if the new one is absent; eventually it will
|
|
||||||
be removed. Switch while you still can; the old one won't stay.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -930,9 +925,9 @@ should be done by looking at FMODE_LSEEK in file->f_mode.
|
||||||
filldir_t (readdir callbacks) calling conventions have changed. Instead of
|
filldir_t (readdir callbacks) calling conventions have changed. Instead of
|
||||||
returning 0 or -E... it returns bool now. false means "no more" (as -E... used
|
returning 0 or -E... it returns bool now. false means "no more" (as -E... used
|
||||||
to) and true - "keep going" (as 0 in old calling conventions). Rationale:
|
to) and true - "keep going" (as 0 in old calling conventions). Rationale:
|
||||||
callers never looked at specific -E... values anyway. ->iterate() and
|
callers never looked at specific -E... values anyway. -> iterate_shared()
|
||||||
->iterate_shared() instance require no changes at all, all filldir_t ones in
|
instances require no changes at all, all filldir_t ones in the tree
|
||||||
the tree converted.
|
converted.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
77
MAINTAINERS
77
MAINTAINERS
|
@ -2339,7 +2339,7 @@ F: drivers/phy/mediatek/
|
||||||
ARM/MICROCHIP (ARM64) SoC support
|
ARM/MICROCHIP (ARM64) SoC support
|
||||||
M: Conor Dooley <conor@kernel.org>
|
M: Conor Dooley <conor@kernel.org>
|
||||||
M: Nicolas Ferre <nicolas.ferre@microchip.com>
|
M: Nicolas Ferre <nicolas.ferre@microchip.com>
|
||||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
M: Claudiu Beznea <claudiu.beznea@tuxon.dev>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
T: git https://git.kernel.org/pub/scm/linux/kernel/git/at91/linux.git
|
T: git https://git.kernel.org/pub/scm/linux/kernel/git/at91/linux.git
|
||||||
|
@ -2348,7 +2348,7 @@ F: arch/arm64/boot/dts/microchip/
|
||||||
ARM/Microchip (AT91) SoC support
|
ARM/Microchip (AT91) SoC support
|
||||||
M: Nicolas Ferre <nicolas.ferre@microchip.com>
|
M: Nicolas Ferre <nicolas.ferre@microchip.com>
|
||||||
M: Alexandre Belloni <alexandre.belloni@bootlin.com>
|
M: Alexandre Belloni <alexandre.belloni@bootlin.com>
|
||||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
M: Claudiu Beznea <claudiu.beznea@tuxon.dev>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://www.linux4sam.org
|
W: http://www.linux4sam.org
|
||||||
|
@ -3250,7 +3250,7 @@ F: include/uapi/linux/atm*
|
||||||
|
|
||||||
ATMEL MACB ETHERNET DRIVER
|
ATMEL MACB ETHERNET DRIVER
|
||||||
M: Nicolas Ferre <nicolas.ferre@microchip.com>
|
M: Nicolas Ferre <nicolas.ferre@microchip.com>
|
||||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
M: Claudiu Beznea <claudiu.beznea@tuxon.dev>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/cadence/
|
F: drivers/net/ethernet/cadence/
|
||||||
|
|
||||||
|
@ -3262,9 +3262,8 @@ F: Documentation/devicetree/bindings/input/atmel,maxtouch.yaml
|
||||||
F: drivers/input/touchscreen/atmel_mxt_ts.c
|
F: drivers/input/touchscreen/atmel_mxt_ts.c
|
||||||
|
|
||||||
ATMEL WIRELESS DRIVER
|
ATMEL WIRELESS DRIVER
|
||||||
M: Simon Kelley <simon@thekelleys.org.uk>
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Orphan
|
||||||
W: http://www.thekelleys.org.uk/atmel
|
W: http://www.thekelleys.org.uk/atmel
|
||||||
W: http://atmelwlandriver.sourceforge.net/
|
W: http://atmelwlandriver.sourceforge.net/
|
||||||
F: drivers/net/wireless/atmel/atmel*
|
F: drivers/net/wireless/atmel/atmel*
|
||||||
|
@ -3394,7 +3393,7 @@ F: drivers/media/radio/radio-aztech*
|
||||||
B43 WIRELESS DRIVER
|
B43 WIRELESS DRIVER
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
L: b43-dev@lists.infradead.org
|
L: b43-dev@lists.infradead.org
|
||||||
S: Odd Fixes
|
S: Orphan
|
||||||
W: https://wireless.wiki.kernel.org/en/users/Drivers/b43
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/b43
|
||||||
F: drivers/net/wireless/broadcom/b43/
|
F: drivers/net/wireless/broadcom/b43/
|
||||||
|
|
||||||
|
@ -4887,7 +4886,11 @@ L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
L: patches@opensource.cirrus.com
|
L: patches@opensource.cirrus.com
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/sound/cirrus,cs*
|
F: Documentation/devicetree/bindings/sound/cirrus,cs*
|
||||||
|
F: drivers/mfd/cs42l43*
|
||||||
|
F: drivers/pinctrl/cirrus/pinctrl-cs42l43*
|
||||||
|
F: drivers/spi/spi-cs42l43*
|
||||||
F: include/dt-bindings/sound/cs*
|
F: include/dt-bindings/sound/cs*
|
||||||
|
F: include/linux/mfd/cs42l43*
|
||||||
F: include/sound/cs*
|
F: include/sound/cs*
|
||||||
F: sound/pci/hda/cs*
|
F: sound/pci/hda/cs*
|
||||||
F: sound/pci/hda/hda_cs_dsp_ctl.*
|
F: sound/pci/hda/hda_cs_dsp_ctl.*
|
||||||
|
@ -5462,8 +5465,7 @@ F: Documentation/devicetree/bindings/net/can/ctu,ctucanfd.yaml
|
||||||
F: drivers/net/can/ctucanfd/
|
F: drivers/net/can/ctucanfd/
|
||||||
|
|
||||||
CW1200 WLAN driver
|
CW1200 WLAN driver
|
||||||
M: Solomon Peachy <pizza@shaftnet.org>
|
S: Orphan
|
||||||
S: Maintained
|
|
||||||
F: drivers/net/wireless/st/cw1200/
|
F: drivers/net/wireless/st/cw1200/
|
||||||
|
|
||||||
CX18 VIDEO4LINUX DRIVER
|
CX18 VIDEO4LINUX DRIVER
|
||||||
|
@ -9377,7 +9379,6 @@ F: drivers/crypto/hisilicon/sgl.c
|
||||||
F: include/linux/hisi_acc_qm.h
|
F: include/linux/hisi_acc_qm.h
|
||||||
|
|
||||||
HISILICON ROCE DRIVER
|
HISILICON ROCE DRIVER
|
||||||
M: Haoyue Xu <xuhaoyue1@hisilicon.com>
|
|
||||||
M: Junxian Huang <huangjunxian6@hisilicon.com>
|
M: Junxian Huang <huangjunxian6@hisilicon.com>
|
||||||
L: linux-rdma@vger.kernel.org
|
L: linux-rdma@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -9662,6 +9663,7 @@ F: tools/hv/
|
||||||
|
|
||||||
HYPERBUS SUPPORT
|
HYPERBUS SUPPORT
|
||||||
M: Vignesh Raghavendra <vigneshr@ti.com>
|
M: Vignesh Raghavendra <vigneshr@ti.com>
|
||||||
|
R: Tudor Ambarus <tudor.ambarus@linaro.org>
|
||||||
L: linux-mtd@lists.infradead.org
|
L: linux-mtd@lists.infradead.org
|
||||||
S: Supported
|
S: Supported
|
||||||
Q: http://patchwork.ozlabs.org/project/linux-mtd/list/
|
Q: http://patchwork.ozlabs.org/project/linux-mtd/list/
|
||||||
|
@ -12491,6 +12493,7 @@ F: net/mctp/
|
||||||
|
|
||||||
MAPLE TREE
|
MAPLE TREE
|
||||||
M: Liam R. Howlett <Liam.Howlett@oracle.com>
|
M: Liam R. Howlett <Liam.Howlett@oracle.com>
|
||||||
|
L: maple-tree@lists.infradead.org
|
||||||
L: linux-mm@kvack.org
|
L: linux-mm@kvack.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/core-api/maple_tree.rst
|
F: Documentation/core-api/maple_tree.rst
|
||||||
|
@ -12602,18 +12605,14 @@ F: Documentation/devicetree/bindings/net/marvell,pp2.yaml
|
||||||
F: drivers/net/ethernet/marvell/mvpp2/
|
F: drivers/net/ethernet/marvell/mvpp2/
|
||||||
|
|
||||||
MARVELL MWIFIEX WIRELESS DRIVER
|
MARVELL MWIFIEX WIRELESS DRIVER
|
||||||
M: Amitkumar Karwar <amitkarwar@gmail.com>
|
M: Brian Norris <briannorris@chromium.org>
|
||||||
M: Ganapathi Bhat <ganapathi017@gmail.com>
|
|
||||||
M: Sharvari Harisangam <sharvari.harisangam@nxp.com>
|
|
||||||
M: Xinming Hu <huxinming820@gmail.com>
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Odd Fixes
|
||||||
F: drivers/net/wireless/marvell/mwifiex/
|
F: drivers/net/wireless/marvell/mwifiex/
|
||||||
|
|
||||||
MARVELL MWL8K WIRELESS DRIVER
|
MARVELL MWL8K WIRELESS DRIVER
|
||||||
M: Lennert Buytenhek <buytenh@wantstofly.org>
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Odd Fixes
|
S: Orphan
|
||||||
F: drivers/net/wireless/marvell/mwl8k.c
|
F: drivers/net/wireless/marvell/mwl8k.c
|
||||||
|
|
||||||
MARVELL NAND CONTROLLER DRIVER
|
MARVELL NAND CONTROLLER DRIVER
|
||||||
|
@ -13801,7 +13800,7 @@ F: Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml
|
||||||
F: drivers/spi/spi-at91-usart.c
|
F: drivers/spi/spi-at91-usart.c
|
||||||
|
|
||||||
MICROCHIP AUDIO ASOC DRIVERS
|
MICROCHIP AUDIO ASOC DRIVERS
|
||||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
M: Claudiu Beznea <claudiu.beznea@tuxon.dev>
|
||||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/devicetree/bindings/sound/atmel*
|
F: Documentation/devicetree/bindings/sound/atmel*
|
||||||
|
@ -13824,7 +13823,7 @@ S: Maintained
|
||||||
F: drivers/crypto/atmel-ecc.*
|
F: drivers/crypto/atmel-ecc.*
|
||||||
|
|
||||||
MICROCHIP EIC DRIVER
|
MICROCHIP EIC DRIVER
|
||||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
M: Claudiu Beznea <claudiu.beznea@tuxon.dev>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/devicetree/bindings/interrupt-controller/microchip,sama7g5-eic.yaml
|
F: Documentation/devicetree/bindings/interrupt-controller/microchip,sama7g5-eic.yaml
|
||||||
|
@ -13897,7 +13896,7 @@ F: drivers/video/fbdev/atmel_lcdfb.c
|
||||||
F: include/video/atmel_lcdc.h
|
F: include/video/atmel_lcdc.h
|
||||||
|
|
||||||
MICROCHIP MCP16502 PMIC DRIVER
|
MICROCHIP MCP16502 PMIC DRIVER
|
||||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
M: Claudiu Beznea <claudiu.beznea@tuxon.dev>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/devicetree/bindings/regulator/mcp16502-regulator.txt
|
F: Documentation/devicetree/bindings/regulator/mcp16502-regulator.txt
|
||||||
|
@ -13924,7 +13923,7 @@ F: Documentation/devicetree/bindings/mtd/atmel-nand.txt
|
||||||
F: drivers/mtd/nand/raw/atmel/*
|
F: drivers/mtd/nand/raw/atmel/*
|
||||||
|
|
||||||
MICROCHIP OTPC DRIVER
|
MICROCHIP OTPC DRIVER
|
||||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
M: Claudiu Beznea <claudiu.beznea@tuxon.dev>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml
|
F: Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml
|
||||||
|
@ -13963,7 +13962,7 @@ F: Documentation/devicetree/bindings/fpga/microchip,mpf-spi-fpga-mgr.yaml
|
||||||
F: drivers/fpga/microchip-spi.c
|
F: drivers/fpga/microchip-spi.c
|
||||||
|
|
||||||
MICROCHIP PWM DRIVER
|
MICROCHIP PWM DRIVER
|
||||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
M: Claudiu Beznea <claudiu.beznea@tuxon.dev>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
L: linux-pwm@vger.kernel.org
|
L: linux-pwm@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -13979,7 +13978,7 @@ F: drivers/iio/adc/at91-sama5d2_adc.c
|
||||||
F: include/dt-bindings/iio/adc/at91-sama5d2_adc.h
|
F: include/dt-bindings/iio/adc/at91-sama5d2_adc.h
|
||||||
|
|
||||||
MICROCHIP SAMA5D2-COMPATIBLE SHUTDOWN CONTROLLER
|
MICROCHIP SAMA5D2-COMPATIBLE SHUTDOWN CONTROLLER
|
||||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
M: Claudiu Beznea <claudiu.beznea@tuxon.dev>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/devicetree/bindings/power/reset/atmel,sama5d2-shdwc.yaml
|
F: Documentation/devicetree/bindings/power/reset/atmel,sama5d2-shdwc.yaml
|
||||||
F: drivers/power/reset/at91-sama5d2_shdwc.c
|
F: drivers/power/reset/at91-sama5d2_shdwc.c
|
||||||
|
@ -13996,7 +13995,7 @@ S: Supported
|
||||||
F: drivers/spi/spi-atmel.*
|
F: drivers/spi/spi-atmel.*
|
||||||
|
|
||||||
MICROCHIP SSC DRIVER
|
MICROCHIP SSC DRIVER
|
||||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
M: Claudiu Beznea <claudiu.beznea@tuxon.dev>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/devicetree/bindings/misc/atmel-ssc.txt
|
F: Documentation/devicetree/bindings/misc/atmel-ssc.txt
|
||||||
|
@ -14025,7 +14024,7 @@ F: drivers/usb/gadget/udc/atmel_usba_udc.*
|
||||||
|
|
||||||
MICROCHIP WILC1000 WIFI DRIVER
|
MICROCHIP WILC1000 WIFI DRIVER
|
||||||
M: Ajay Singh <ajay.kathat@microchip.com>
|
M: Ajay Singh <ajay.kathat@microchip.com>
|
||||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
M: Claudiu Beznea <claudiu.beznea@tuxon.dev>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/wireless/microchip/wilc1000/
|
F: drivers/net/wireless/microchip/wilc1000/
|
||||||
|
@ -16308,6 +16307,7 @@ F: drivers/pci/controller/dwc/pci-exynos.c
|
||||||
PCI DRIVER FOR SYNOPSYS DESIGNWARE
|
PCI DRIVER FOR SYNOPSYS DESIGNWARE
|
||||||
M: Jingoo Han <jingoohan1@gmail.com>
|
M: Jingoo Han <jingoohan1@gmail.com>
|
||||||
M: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
|
M: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
|
||||||
|
M: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
|
F: Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
|
||||||
|
@ -17459,6 +17459,7 @@ F: drivers/media/tuners/qt1010*
|
||||||
|
|
||||||
QUALCOMM ATH12K WIRELESS DRIVER
|
QUALCOMM ATH12K WIRELESS DRIVER
|
||||||
M: Kalle Valo <kvalo@kernel.org>
|
M: Kalle Valo <kvalo@kernel.org>
|
||||||
|
M: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||||
L: ath12k@lists.infradead.org
|
L: ath12k@lists.infradead.org
|
||||||
S: Supported
|
S: Supported
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
||||||
|
@ -17466,6 +17467,7 @@ F: drivers/net/wireless/ath/ath12k/
|
||||||
|
|
||||||
QUALCOMM ATHEROS ATH10K WIRELESS DRIVER
|
QUALCOMM ATHEROS ATH10K WIRELESS DRIVER
|
||||||
M: Kalle Valo <kvalo@kernel.org>
|
M: Kalle Valo <kvalo@kernel.org>
|
||||||
|
M: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||||
L: ath10k@lists.infradead.org
|
L: ath10k@lists.infradead.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath10k
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath10k
|
||||||
|
@ -17475,6 +17477,7 @@ F: drivers/net/wireless/ath/ath10k/
|
||||||
|
|
||||||
QUALCOMM ATHEROS ATH11K WIRELESS DRIVER
|
QUALCOMM ATHEROS ATH11K WIRELESS DRIVER
|
||||||
M: Kalle Valo <kvalo@kernel.org>
|
M: Kalle Valo <kvalo@kernel.org>
|
||||||
|
M: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||||
L: ath11k@lists.infradead.org
|
L: ath11k@lists.infradead.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath11k
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath11k
|
||||||
|
@ -17995,7 +17998,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.g
|
||||||
F: drivers/net/wireless/realtek/rtlwifi/
|
F: drivers/net/wireless/realtek/rtlwifi/
|
||||||
|
|
||||||
REALTEK WIRELESS DRIVER (rtw88)
|
REALTEK WIRELESS DRIVER (rtw88)
|
||||||
M: Yan-Hsuan Chuang <tony0620emma@gmail.com>
|
M: Ping-Ke Shih <pkshih@realtek.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/wireless/realtek/rtw88/
|
F: drivers/net/wireless/realtek/rtw88/
|
||||||
|
@ -18520,17 +18523,14 @@ RTL8180 WIRELESS DRIVER
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Orphan
|
S: Orphan
|
||||||
W: https://wireless.wiki.kernel.org/
|
W: https://wireless.wiki.kernel.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
|
||||||
F: drivers/net/wireless/realtek/rtl818x/rtl8180/
|
F: drivers/net/wireless/realtek/rtl818x/rtl8180/
|
||||||
|
|
||||||
RTL8187 WIRELESS DRIVER
|
RTL8187 WIRELESS DRIVER
|
||||||
M: Herton Ronaldo Krzesinski <herton@canonical.com>
|
M: Hin-Tak Leung <hintak.leung@gmail.com>
|
||||||
M: Hin-Tak Leung <htl10@users.sourceforge.net>
|
|
||||||
M: Larry Finger <Larry.Finger@lwfinger.net>
|
M: Larry Finger <Larry.Finger@lwfinger.net>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: https://wireless.wiki.kernel.org/
|
W: https://wireless.wiki.kernel.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
|
||||||
F: drivers/net/wireless/realtek/rtl818x/rtl8187/
|
F: drivers/net/wireless/realtek/rtl818x/rtl8187/
|
||||||
|
|
||||||
RTL8XXXU WIRELESS DRIVER (rtl8xxxu)
|
RTL8XXXU WIRELESS DRIVER (rtl8xxxu)
|
||||||
|
@ -20414,7 +20414,6 @@ F: drivers/pwm/pwm-stm32*
|
||||||
F: include/linux/*/stm32-*tim*
|
F: include/linux/*/stm32-*tim*
|
||||||
|
|
||||||
STMMAC ETHERNET DRIVER
|
STMMAC ETHERNET DRIVER
|
||||||
M: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
|
||||||
M: Alexandre Torgue <alexandre.torgue@foss.st.com>
|
M: Alexandre Torgue <alexandre.torgue@foss.st.com>
|
||||||
M: Jose Abreu <joabreu@synopsys.com>
|
M: Jose Abreu <joabreu@synopsys.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
@ -21691,11 +21690,14 @@ S: Orphan
|
||||||
F: drivers/net/ethernet/dec/tulip/
|
F: drivers/net/ethernet/dec/tulip/
|
||||||
|
|
||||||
TUN/TAP driver
|
TUN/TAP driver
|
||||||
M: Maxim Krasnyansky <maxk@qti.qualcomm.com>
|
M: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
|
||||||
|
M: Jason Wang <jasowang@redhat.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://vtun.sourceforge.net/tun
|
W: http://vtun.sourceforge.net/tun
|
||||||
F: Documentation/networking/tuntap.rst
|
F: Documentation/networking/tuntap.rst
|
||||||
F: arch/um/os-Linux/drivers/
|
F: arch/um/os-Linux/drivers/
|
||||||
|
F: drivers/net/tap.c
|
||||||
|
F: drivers/net/tun.c
|
||||||
|
|
||||||
TURBOCHANNEL SUBSYSTEM
|
TURBOCHANNEL SUBSYSTEM
|
||||||
M: "Maciej W. Rozycki" <macro@orcam.me.uk>
|
M: "Maciej W. Rozycki" <macro@orcam.me.uk>
|
||||||
|
@ -21918,9 +21920,8 @@ S: Maintained
|
||||||
F: drivers/usb/misc/apple-mfi-fastcharge.c
|
F: drivers/usb/misc/apple-mfi-fastcharge.c
|
||||||
|
|
||||||
USB AR5523 WIRELESS DRIVER
|
USB AR5523 WIRELESS DRIVER
|
||||||
M: Pontus Fuchs <pontus.fuchs@gmail.com>
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Orphan
|
||||||
F: drivers/net/wireless/ath/ar5523/
|
F: drivers/net/wireless/ath/ar5523/
|
||||||
|
|
||||||
USB ATTACHED SCSI
|
USB ATTACHED SCSI
|
||||||
|
@ -22197,9 +22198,8 @@ F: drivers/usb/gadget/legacy/webcam.c
|
||||||
F: include/uapi/linux/usb/g_uvc.h
|
F: include/uapi/linux/usb/g_uvc.h
|
||||||
|
|
||||||
USB WIRELESS RNDIS DRIVER (rndis_wlan)
|
USB WIRELESS RNDIS DRIVER (rndis_wlan)
|
||||||
M: Jussi Kivilinna <jussi.kivilinna@iki.fi>
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Orphan
|
||||||
F: drivers/net/wireless/legacy/rndis_wlan.c
|
F: drivers/net/wireless/legacy/rndis_wlan.c
|
||||||
|
|
||||||
USB XHCI DRIVER
|
USB XHCI DRIVER
|
||||||
|
@ -22974,7 +22974,7 @@ F: drivers/input/misc/wistron_btns.c
|
||||||
|
|
||||||
WL3501 WIRELESS PCMCIA CARD DRIVER
|
WL3501 WIRELESS PCMCIA CARD DRIVER
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Odd fixes
|
S: Orphan
|
||||||
F: drivers/net/wireless/legacy/wl3501*
|
F: drivers/net/wireless/legacy/wl3501*
|
||||||
|
|
||||||
WMI BINARY MOF DRIVER
|
WMI BINARY MOF DRIVER
|
||||||
|
@ -23545,11 +23545,8 @@ S: Maintained
|
||||||
F: mm/zbud.c
|
F: mm/zbud.c
|
||||||
|
|
||||||
ZD1211RW WIRELESS DRIVER
|
ZD1211RW WIRELESS DRIVER
|
||||||
M: Ulrich Kunitz <kune@deine-taler.de>
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
L: zd1211-devs@lists.sourceforge.net (subscribers-only)
|
S: Orphan
|
||||||
S: Maintained
|
|
||||||
W: http://zd1211.ath.cx/wiki/DriverRewrite
|
|
||||||
F: drivers/net/wireless/zydas/zd1211rw/
|
F: drivers/net/wireless/zydas/zd1211rw/
|
||||||
|
|
||||||
ZD1301 MEDIA DRIVER
|
ZD1301 MEDIA DRIVER
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -2,7 +2,7 @@
|
||||||
VERSION = 6
|
VERSION = 6
|
||||||
PATCHLEVEL = 5
|
PATCHLEVEL = 5
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc4
|
EXTRAVERSION = -rc6
|
||||||
NAME = Hurr durr I'ma ninja sloth
|
NAME = Hurr durr I'ma ninja sloth
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -47,12 +47,6 @@ unsigned long __get_wchan(struct task_struct *p);
|
||||||
|
|
||||||
#define ARCH_HAS_PREFETCH
|
#define ARCH_HAS_PREFETCH
|
||||||
#define ARCH_HAS_PREFETCHW
|
#define ARCH_HAS_PREFETCHW
|
||||||
#define ARCH_HAS_SPINLOCK_PREFETCH
|
|
||||||
|
|
||||||
#ifndef CONFIG_SMP
|
|
||||||
/* Nothing to prefetch. */
|
|
||||||
#define spin_lock_prefetch(lock) do { } while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern inline void prefetch(const void *ptr)
|
extern inline void prefetch(const void *ptr)
|
||||||
{
|
{
|
||||||
|
@ -64,11 +58,4 @@ extern inline void prefetchw(const void *ptr)
|
||||||
__builtin_prefetch(ptr, 1, 3);
|
__builtin_prefetch(ptr, 1, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
extern inline void spin_lock_prefetch(const void *ptr)
|
|
||||||
{
|
|
||||||
__builtin_prefetch(ptr, 1, 3);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __ASM_ALPHA_PROCESSOR_H */
|
#endif /* __ASM_ALPHA_PROCESSOR_H */
|
||||||
|
|
|
@ -385,8 +385,7 @@ setup_memory(void *kernel_end)
|
||||||
#endif /* CONFIG_BLK_DEV_INITRD */
|
#endif /* CONFIG_BLK_DEV_INITRD */
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init
|
int page_is_ram(unsigned long pfn)
|
||||||
page_is_ram(unsigned long pfn)
|
|
||||||
{
|
{
|
||||||
struct memclust_struct * cluster;
|
struct memclust_struct * cluster;
|
||||||
struct memdesc_struct * memdesc;
|
struct memdesc_struct * memdesc;
|
||||||
|
|
|
@ -172,7 +172,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart4: serial@200 {
|
uart4: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
interrupts = <13 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <13 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
dmas = <&dma0
|
dmas = <&dma0
|
||||||
|
@ -240,7 +240,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart5: serial@200 {
|
uart5: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
atmel,usart-mode = <AT91_USART_MODE_SERIAL>;
|
atmel,usart-mode = <AT91_USART_MODE_SERIAL>;
|
||||||
interrupts = <14 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <14 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
|
@ -370,7 +370,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart11: serial@200 {
|
uart11: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
interrupts = <32 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <32 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
dmas = <&dma0
|
dmas = <&dma0
|
||||||
|
@ -419,7 +419,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart12: serial@200 {
|
uart12: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
interrupts = <33 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <33 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
dmas = <&dma0
|
dmas = <&dma0
|
||||||
|
@ -576,7 +576,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart6: serial@200 {
|
uart6: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
interrupts = <9 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <9 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
dmas = <&dma0
|
dmas = <&dma0
|
||||||
|
@ -625,7 +625,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart7: serial@200 {
|
uart7: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
interrupts = <10 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <10 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
dmas = <&dma0
|
dmas = <&dma0
|
||||||
|
@ -674,7 +674,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart8: serial@200 {
|
uart8: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
interrupts = <11 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <11 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
dmas = <&dma0
|
dmas = <&dma0
|
||||||
|
@ -723,7 +723,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart0: serial@200 {
|
uart0: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
interrupts = <5 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <5 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
dmas = <&dma0
|
dmas = <&dma0
|
||||||
|
@ -791,7 +791,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart1: serial@200 {
|
uart1: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
interrupts = <6 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <6 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
dmas = <&dma0
|
dmas = <&dma0
|
||||||
|
@ -859,7 +859,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart2: serial@200 {
|
uart2: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
interrupts = <7 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <7 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
dmas = <&dma0
|
dmas = <&dma0
|
||||||
|
@ -927,7 +927,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart3: serial@200 {
|
uart3: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
interrupts = <8 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <8 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
dmas = <&dma0
|
dmas = <&dma0
|
||||||
|
@ -1050,7 +1050,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart9: serial@200 {
|
uart9: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
interrupts = <15 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <15 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
dmas = <&dma0
|
dmas = <&dma0
|
||||||
|
@ -1099,7 +1099,7 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
uart10: serial@200 {
|
uart10: serial@200 {
|
||||||
compatible = "microchip,sam9x60-dbgu", "microchip,sam9x60-usart", "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
|
compatible = "microchip,sam9x60-usart", "atmel,at91sam9260-usart";
|
||||||
reg = <0x200 0x200>;
|
reg = <0x200 0x200>;
|
||||||
interrupts = <16 IRQ_TYPE_LEVEL_HIGH 7>;
|
interrupts = <16 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||||
dmas = <&dma0
|
dmas = <&dma0
|
||||||
|
|
|
@ -161,7 +161,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
watchdog: watchdog@90060000 {
|
watchdog: watchdog@90060000 {
|
||||||
compatible = "arm,amba-primecell";
|
compatible = "arm,primecell";
|
||||||
reg = <0x90060000 0x1000>;
|
reg = <0x90060000 0x1000>;
|
||||||
interrupts = <3>;
|
interrupts = <3>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -60,6 +60,16 @@
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&cpu0 {
|
||||||
|
/* CPU rated to 800 MHz, not the default 1.2GHz. */
|
||||||
|
operating-points = <
|
||||||
|
/* kHz uV */
|
||||||
|
166666 850000
|
||||||
|
400000 900000
|
||||||
|
800000 1050000
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
|
||||||
&ecspi1 {
|
&ecspi1 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_ecspi1>;
|
pinctrl-0 = <&pinctrl_ecspi1>;
|
||||||
|
|
|
@ -552,7 +552,7 @@
|
||||||
reg = <0x020ca000 0x1000>;
|
reg = <0x020ca000 0x1000>;
|
||||||
interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&clks IMX6SLL_CLK_USBPHY2>;
|
clocks = <&clks IMX6SLL_CLK_USBPHY2>;
|
||||||
phy-reg_3p0-supply = <®_3p0>;
|
phy-3p0-supply = <®_3p0>;
|
||||||
fsl,anatop = <&anatop>;
|
fsl,anatop = <&anatop>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -105,5 +105,4 @@ void sharpsl_pm_led(int val);
|
||||||
#define MAX1111_ACIN_VOLT 6u
|
#define MAX1111_ACIN_VOLT 6u
|
||||||
int sharpsl_pm_pxa_read_max1111(int channel);
|
int sharpsl_pm_pxa_read_max1111(int channel);
|
||||||
|
|
||||||
void corgi_lcd_limit_intensity(int limit);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/apm-emulation.h>
|
#include <linux/apm-emulation.h>
|
||||||
|
#include <linux/spi/corgi_lcd.h>
|
||||||
|
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
|
|
|
@ -145,7 +145,7 @@
|
||||||
status = "okay";
|
status = "okay";
|
||||||
clock-frequency = <100000>;
|
clock-frequency = <100000>;
|
||||||
i2c-sda-falling-time-ns = <890>; /* hcnt */
|
i2c-sda-falling-time-ns = <890>; /* hcnt */
|
||||||
i2c-sdl-falling-time-ns = <890>; /* lcnt */
|
i2c-scl-falling-time-ns = <890>; /* lcnt */
|
||||||
|
|
||||||
pinctrl-names = "default", "gpio";
|
pinctrl-names = "default", "gpio";
|
||||||
pinctrl-0 = <&i2c1_pmx_func>;
|
pinctrl-0 = <&i2c1_pmx_func>;
|
||||||
|
|
|
@ -141,7 +141,7 @@
|
||||||
status = "okay";
|
status = "okay";
|
||||||
clock-frequency = <100000>;
|
clock-frequency = <100000>;
|
||||||
i2c-sda-falling-time-ns = <890>; /* hcnt */
|
i2c-sda-falling-time-ns = <890>; /* hcnt */
|
||||||
i2c-sdl-falling-time-ns = <890>; /* lcnt */
|
i2c-scl-falling-time-ns = <890>; /* lcnt */
|
||||||
|
|
||||||
adc@14 {
|
adc@14 {
|
||||||
compatible = "lltc,ltc2497";
|
compatible = "lltc,ltc2497";
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
../../../../arm/boot/dts/vexpress-v2m-rs1.dtsi
|
|
|
@ -141,7 +141,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&gpio1 {
|
&gpio1 {
|
||||||
gpio-line-names = "nINT_ETHPHY", "LED_RED", "WDOG_INT", "X_RTC_INT",
|
gpio-line-names = "", "LED_RED", "WDOG_INT", "X_RTC_INT",
|
||||||
"", "", "", "RESET_ETHPHY",
|
"", "", "", "RESET_ETHPHY",
|
||||||
"CAN_nINT", "CAN_EN", "nENABLE_FLATLINK", "",
|
"CAN_nINT", "CAN_EN", "nENABLE_FLATLINK", "",
|
||||||
"USB_OTG_VBUS_EN", "", "LED_GREEN", "LED_BLUE";
|
"USB_OTG_VBUS_EN", "", "LED_GREEN", "LED_BLUE";
|
||||||
|
|
|
@ -111,7 +111,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&gpio1 {
|
&gpio1 {
|
||||||
gpio-line-names = "nINT_ETHPHY", "", "WDOG_INT", "X_RTC_INT",
|
gpio-line-names = "", "", "WDOG_INT", "X_RTC_INT",
|
||||||
"", "", "", "RESET_ETHPHY",
|
"", "", "", "RESET_ETHPHY",
|
||||||
"", "", "nENABLE_FLATLINK";
|
"", "", "nENABLE_FLATLINK";
|
||||||
};
|
};
|
||||||
|
@ -210,7 +210,7 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
reg_vdd_gpu: buck3 {
|
reg_vdd_vpu: buck3 {
|
||||||
regulator-always-on;
|
regulator-always-on;
|
||||||
regulator-boot-on;
|
regulator-boot-on;
|
||||||
regulator-max-microvolt = <1000000>;
|
regulator-max-microvolt = <1000000>;
|
||||||
|
|
|
@ -567,6 +567,10 @@
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&disp_blk_ctrl {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
&pgc_mipi {
|
&pgc_mipi {
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
|
@ -628,6 +628,10 @@
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&disp_blk_ctrl {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
&pgc_mipi {
|
&pgc_mipi {
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
|
@ -358,7 +358,7 @@
|
||||||
MX8MN_IOMUXC_ENET_RXC_ENET1_RGMII_RXC 0x91
|
MX8MN_IOMUXC_ENET_RXC_ENET1_RGMII_RXC 0x91
|
||||||
MX8MN_IOMUXC_ENET_RX_CTL_ENET1_RGMII_RX_CTL 0x91
|
MX8MN_IOMUXC_ENET_RX_CTL_ENET1_RGMII_RX_CTL 0x91
|
||||||
MX8MN_IOMUXC_ENET_TX_CTL_ENET1_RGMII_TX_CTL 0x1f
|
MX8MN_IOMUXC_ENET_TX_CTL_ENET1_RGMII_TX_CTL 0x1f
|
||||||
MX8MN_IOMUXC_GPIO1_IO09_GPIO1_IO9 0x19
|
MX8MN_IOMUXC_GPIO1_IO09_GPIO1_IO9 0x159
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -772,7 +772,7 @@
|
||||||
<&clk IMX8MQ_SYS1_PLL_800M>,
|
<&clk IMX8MQ_SYS1_PLL_800M>,
|
||||||
<&clk IMX8MQ_VPU_PLL>;
|
<&clk IMX8MQ_VPU_PLL>;
|
||||||
assigned-clock-rates = <600000000>,
|
assigned-clock-rates = <600000000>,
|
||||||
<600000000>,
|
<300000000>,
|
||||||
<800000000>,
|
<800000000>,
|
||||||
<0>;
|
<0>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -223,20 +223,20 @@
|
||||||
<GIC_SPI 212 IRQ_TYPE_EDGE_RISING>,
|
<GIC_SPI 212 IRQ_TYPE_EDGE_RISING>,
|
||||||
<GIC_SPI 213 IRQ_TYPE_EDGE_RISING>;
|
<GIC_SPI 213 IRQ_TYPE_EDGE_RISING>;
|
||||||
interrupt-names = "tgia0", "tgib0", "tgic0", "tgid0",
|
interrupt-names = "tgia0", "tgib0", "tgic0", "tgid0",
|
||||||
"tgiv0", "tgie0", "tgif0",
|
"tciv0", "tgie0", "tgif0",
|
||||||
"tgia1", "tgib1", "tgiv1", "tgiu1",
|
"tgia1", "tgib1", "tciv1", "tciu1",
|
||||||
"tgia2", "tgib2", "tgiv2", "tgiu2",
|
"tgia2", "tgib2", "tciv2", "tciu2",
|
||||||
"tgia3", "tgib3", "tgic3", "tgid3",
|
"tgia3", "tgib3", "tgic3", "tgid3",
|
||||||
"tgiv3",
|
"tciv3",
|
||||||
"tgia4", "tgib4", "tgic4", "tgid4",
|
"tgia4", "tgib4", "tgic4", "tgid4",
|
||||||
"tgiv4",
|
"tciv4",
|
||||||
"tgiu5", "tgiv5", "tgiw5",
|
"tgiu5", "tgiv5", "tgiw5",
|
||||||
"tgia6", "tgib6", "tgic6", "tgid6",
|
"tgia6", "tgib6", "tgic6", "tgid6",
|
||||||
"tgiv6",
|
"tciv6",
|
||||||
"tgia7", "tgib7", "tgic7", "tgid7",
|
"tgia7", "tgib7", "tgic7", "tgid7",
|
||||||
"tgiv7",
|
"tciv7",
|
||||||
"tgia8", "tgib8", "tgic8", "tgid8",
|
"tgia8", "tgib8", "tgic8", "tgid8",
|
||||||
"tgiv8", "tgiu8";
|
"tciv8", "tciu8";
|
||||||
clocks = <&cpg CPG_MOD R9A07G044_MTU_X_MCK_MTU3>;
|
clocks = <&cpg CPG_MOD R9A07G044_MTU_X_MCK_MTU3>;
|
||||||
power-domains = <&cpg>;
|
power-domains = <&cpg>;
|
||||||
resets = <&cpg R9A07G044_MTU_X_PRESET_MTU3>;
|
resets = <&cpg R9A07G044_MTU_X_PRESET_MTU3>;
|
||||||
|
|
|
@ -223,20 +223,20 @@
|
||||||
<GIC_SPI 212 IRQ_TYPE_EDGE_RISING>,
|
<GIC_SPI 212 IRQ_TYPE_EDGE_RISING>,
|
||||||
<GIC_SPI 213 IRQ_TYPE_EDGE_RISING>;
|
<GIC_SPI 213 IRQ_TYPE_EDGE_RISING>;
|
||||||
interrupt-names = "tgia0", "tgib0", "tgic0", "tgid0",
|
interrupt-names = "tgia0", "tgib0", "tgic0", "tgid0",
|
||||||
"tgiv0", "tgie0", "tgif0",
|
"tciv0", "tgie0", "tgif0",
|
||||||
"tgia1", "tgib1", "tgiv1", "tgiu1",
|
"tgia1", "tgib1", "tciv1", "tciu1",
|
||||||
"tgia2", "tgib2", "tgiv2", "tgiu2",
|
"tgia2", "tgib2", "tciv2", "tciu2",
|
||||||
"tgia3", "tgib3", "tgic3", "tgid3",
|
"tgia3", "tgib3", "tgic3", "tgid3",
|
||||||
"tgiv3",
|
"tciv3",
|
||||||
"tgia4", "tgib4", "tgic4", "tgid4",
|
"tgia4", "tgib4", "tgic4", "tgid4",
|
||||||
"tgiv4",
|
"tciv4",
|
||||||
"tgiu5", "tgiv5", "tgiw5",
|
"tgiu5", "tgiv5", "tgiw5",
|
||||||
"tgia6", "tgib6", "tgic6", "tgid6",
|
"tgia6", "tgib6", "tgic6", "tgid6",
|
||||||
"tgiv6",
|
"tciv6",
|
||||||
"tgia7", "tgib7", "tgic7", "tgid7",
|
"tgia7", "tgib7", "tgic7", "tgid7",
|
||||||
"tgiv7",
|
"tciv7",
|
||||||
"tgia8", "tgib8", "tgic8", "tgid8",
|
"tgia8", "tgib8", "tgic8", "tgid8",
|
||||||
"tgiv8", "tgiu8";
|
"tciv8", "tciu8";
|
||||||
clocks = <&cpg CPG_MOD R9A07G054_MTU_X_MCK_MTU3>;
|
clocks = <&cpg CPG_MOD R9A07G054_MTU_X_MCK_MTU3>;
|
||||||
power-domains = <&cpg>;
|
power-domains = <&cpg>;
|
||||||
resets = <&cpg R9A07G054_MTU_X_PRESET_MTU3>;
|
resets = <&cpg R9A07G054_MTU_X_PRESET_MTU3>;
|
||||||
|
|
|
@ -31,6 +31,13 @@
|
||||||
.Lskip_hcrx_\@:
|
.Lskip_hcrx_\@:
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
/* Check if running in host at EL2 mode, i.e., (h)VHE. Jump to fail if not. */
|
||||||
|
.macro __check_hvhe fail, tmp
|
||||||
|
mrs \tmp, hcr_el2
|
||||||
|
and \tmp, \tmp, #HCR_E2H
|
||||||
|
cbz \tmp, \fail
|
||||||
|
.endm
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allow Non-secure EL1 and EL0 to access physical timer and counter.
|
* Allow Non-secure EL1 and EL0 to access physical timer and counter.
|
||||||
* This is not necessary for VHE, since the host kernel runs in EL2,
|
* This is not necessary for VHE, since the host kernel runs in EL2,
|
||||||
|
@ -43,9 +50,7 @@
|
||||||
*/
|
*/
|
||||||
.macro __init_el2_timers
|
.macro __init_el2_timers
|
||||||
mov x0, #3 // Enable EL1 physical timers
|
mov x0, #3 // Enable EL1 physical timers
|
||||||
mrs x1, hcr_el2
|
__check_hvhe .LnVHE_\@, x1
|
||||||
and x1, x1, #HCR_E2H
|
|
||||||
cbz x1, .LnVHE_\@
|
|
||||||
lsl x0, x0, #10
|
lsl x0, x0, #10
|
||||||
.LnVHE_\@:
|
.LnVHE_\@:
|
||||||
msr cnthctl_el2, x0
|
msr cnthctl_el2, x0
|
||||||
|
@ -139,15 +144,14 @@
|
||||||
|
|
||||||
/* Coprocessor traps */
|
/* Coprocessor traps */
|
||||||
.macro __init_el2_cptr
|
.macro __init_el2_cptr
|
||||||
mrs x1, hcr_el2
|
__check_hvhe .LnVHE_\@, x1
|
||||||
and x1, x1, #HCR_E2H
|
|
||||||
cbz x1, .LnVHE_\@
|
|
||||||
mov x0, #(CPACR_EL1_FPEN_EL1EN | CPACR_EL1_FPEN_EL0EN)
|
mov x0, #(CPACR_EL1_FPEN_EL1EN | CPACR_EL1_FPEN_EL0EN)
|
||||||
b .Lset_cptr_\@
|
msr cpacr_el1, x0
|
||||||
|
b .Lskip_set_cptr_\@
|
||||||
.LnVHE_\@:
|
.LnVHE_\@:
|
||||||
mov x0, #0x33ff
|
mov x0, #0x33ff
|
||||||
.Lset_cptr_\@:
|
|
||||||
msr cptr_el2, x0 // Disable copro. traps to EL2
|
msr cptr_el2, x0 // Disable copro. traps to EL2
|
||||||
|
.Lskip_set_cptr_\@:
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/* Disable any fine grained traps */
|
/* Disable any fine grained traps */
|
||||||
|
@ -268,19 +272,19 @@
|
||||||
check_override id_aa64pfr0, ID_AA64PFR0_EL1_SVE_SHIFT, .Linit_sve_\@, .Lskip_sve_\@, x1, x2
|
check_override id_aa64pfr0, ID_AA64PFR0_EL1_SVE_SHIFT, .Linit_sve_\@, .Lskip_sve_\@, x1, x2
|
||||||
|
|
||||||
.Linit_sve_\@: /* SVE register access */
|
.Linit_sve_\@: /* SVE register access */
|
||||||
mrs x0, cptr_el2 // Disable SVE traps
|
__check_hvhe .Lcptr_nvhe_\@, x1
|
||||||
mrs x1, hcr_el2
|
|
||||||
and x1, x1, #HCR_E2H
|
|
||||||
cbz x1, .Lcptr_nvhe_\@
|
|
||||||
|
|
||||||
// VHE case
|
// (h)VHE case
|
||||||
|
mrs x0, cpacr_el1 // Disable SVE traps
|
||||||
orr x0, x0, #(CPACR_EL1_ZEN_EL1EN | CPACR_EL1_ZEN_EL0EN)
|
orr x0, x0, #(CPACR_EL1_ZEN_EL1EN | CPACR_EL1_ZEN_EL0EN)
|
||||||
b .Lset_cptr_\@
|
msr cpacr_el1, x0
|
||||||
|
b .Lskip_set_cptr_\@
|
||||||
|
|
||||||
.Lcptr_nvhe_\@: // nVHE case
|
.Lcptr_nvhe_\@: // nVHE case
|
||||||
|
mrs x0, cptr_el2 // Disable SVE traps
|
||||||
bic x0, x0, #CPTR_EL2_TZ
|
bic x0, x0, #CPTR_EL2_TZ
|
||||||
.Lset_cptr_\@:
|
|
||||||
msr cptr_el2, x0
|
msr cptr_el2, x0
|
||||||
|
.Lskip_set_cptr_\@:
|
||||||
isb
|
isb
|
||||||
mov x1, #ZCR_ELx_LEN_MASK // SVE: Enable full vector
|
mov x1, #ZCR_ELx_LEN_MASK // SVE: Enable full vector
|
||||||
msr_s SYS_ZCR_EL2, x1 // length for EL1.
|
msr_s SYS_ZCR_EL2, x1 // length for EL1.
|
||||||
|
@ -289,9 +293,19 @@
|
||||||
check_override id_aa64pfr1, ID_AA64PFR1_EL1_SME_SHIFT, .Linit_sme_\@, .Lskip_sme_\@, x1, x2
|
check_override id_aa64pfr1, ID_AA64PFR1_EL1_SME_SHIFT, .Linit_sme_\@, .Lskip_sme_\@, x1, x2
|
||||||
|
|
||||||
.Linit_sme_\@: /* SME register access and priority mapping */
|
.Linit_sme_\@: /* SME register access and priority mapping */
|
||||||
|
__check_hvhe .Lcptr_nvhe_sme_\@, x1
|
||||||
|
|
||||||
|
// (h)VHE case
|
||||||
|
mrs x0, cpacr_el1 // Disable SME traps
|
||||||
|
orr x0, x0, #(CPACR_EL1_SMEN_EL0EN | CPACR_EL1_SMEN_EL1EN)
|
||||||
|
msr cpacr_el1, x0
|
||||||
|
b .Lskip_set_cptr_sme_\@
|
||||||
|
|
||||||
|
.Lcptr_nvhe_sme_\@: // nVHE case
|
||||||
mrs x0, cptr_el2 // Disable SME traps
|
mrs x0, cptr_el2 // Disable SME traps
|
||||||
bic x0, x0, #CPTR_EL2_TSM
|
bic x0, x0, #CPTR_EL2_TSM
|
||||||
msr cptr_el2, x0
|
msr cptr_el2, x0
|
||||||
|
.Lskip_set_cptr_sme_\@:
|
||||||
isb
|
isb
|
||||||
|
|
||||||
mrs x1, sctlr_el2
|
mrs x1, sctlr_el2
|
||||||
|
|
|
@ -278,7 +278,7 @@ asmlinkage void __noreturn hyp_panic_bad_stack(void);
|
||||||
asmlinkage void kvm_unexpected_el2_exception(void);
|
asmlinkage void kvm_unexpected_el2_exception(void);
|
||||||
struct kvm_cpu_context;
|
struct kvm_cpu_context;
|
||||||
void handle_trap(struct kvm_cpu_context *host_ctxt);
|
void handle_trap(struct kvm_cpu_context *host_ctxt);
|
||||||
asmlinkage void __noreturn kvm_host_psci_cpu_entry(bool is_cpu_on);
|
asmlinkage void __noreturn __kvm_host_psci_cpu_entry(bool is_cpu_on);
|
||||||
void __noreturn __pkvm_init_finalise(void);
|
void __noreturn __pkvm_init_finalise(void);
|
||||||
void kvm_nvhe_prepare_backtrace(unsigned long fp, unsigned long pc);
|
void kvm_nvhe_prepare_backtrace(unsigned long fp, unsigned long pc);
|
||||||
void kvm_patch_vector_branch(struct alt_instr *alt,
|
void kvm_patch_vector_branch(struct alt_instr *alt,
|
||||||
|
|
|
@ -571,6 +571,14 @@ static inline bool vcpu_has_feature(struct kvm_vcpu *vcpu, int feature)
|
||||||
return test_bit(feature, vcpu->arch.features);
|
return test_bit(feature, vcpu->arch.features);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __always_inline void kvm_write_cptr_el2(u64 val)
|
||||||
|
{
|
||||||
|
if (has_vhe() || has_hvhe())
|
||||||
|
write_sysreg(val, cpacr_el1);
|
||||||
|
else
|
||||||
|
write_sysreg(val, cptr_el2);
|
||||||
|
}
|
||||||
|
|
||||||
static __always_inline u64 kvm_get_reset_cptr_el2(struct kvm_vcpu *vcpu)
|
static __always_inline u64 kvm_get_reset_cptr_el2(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
u64 val;
|
u64 val;
|
||||||
|
@ -578,8 +586,16 @@ static __always_inline u64 kvm_get_reset_cptr_el2(struct kvm_vcpu *vcpu)
|
||||||
if (has_vhe()) {
|
if (has_vhe()) {
|
||||||
val = (CPACR_EL1_FPEN_EL0EN | CPACR_EL1_FPEN_EL1EN |
|
val = (CPACR_EL1_FPEN_EL0EN | CPACR_EL1_FPEN_EL1EN |
|
||||||
CPACR_EL1_ZEN_EL1EN);
|
CPACR_EL1_ZEN_EL1EN);
|
||||||
|
if (cpus_have_final_cap(ARM64_SME))
|
||||||
|
val |= CPACR_EL1_SMEN_EL1EN;
|
||||||
} else if (has_hvhe()) {
|
} else if (has_hvhe()) {
|
||||||
val = (CPACR_EL1_FPEN_EL0EN | CPACR_EL1_FPEN_EL1EN);
|
val = (CPACR_EL1_FPEN_EL0EN | CPACR_EL1_FPEN_EL1EN);
|
||||||
|
|
||||||
|
if (!vcpu_has_sve(vcpu) ||
|
||||||
|
(vcpu->arch.fp_state != FP_STATE_GUEST_OWNED))
|
||||||
|
val |= CPACR_EL1_ZEN_EL1EN | CPACR_EL1_ZEN_EL0EN;
|
||||||
|
if (cpus_have_final_cap(ARM64_SME))
|
||||||
|
val |= CPACR_EL1_SMEN_EL1EN | CPACR_EL1_SMEN_EL0EN;
|
||||||
} else {
|
} else {
|
||||||
val = CPTR_NVHE_EL2_RES1;
|
val = CPTR_NVHE_EL2_RES1;
|
||||||
|
|
||||||
|
@ -597,9 +613,6 @@ static __always_inline void kvm_reset_cptr_el2(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
u64 val = kvm_get_reset_cptr_el2(vcpu);
|
u64 val = kvm_get_reset_cptr_el2(vcpu);
|
||||||
|
|
||||||
if (has_vhe() || has_hvhe())
|
kvm_write_cptr_el2(val);
|
||||||
write_sysreg(val, cpacr_el1);
|
|
||||||
else
|
|
||||||
write_sysreg(val, cptr_el2);
|
|
||||||
}
|
}
|
||||||
#endif /* __ARM64_KVM_EMULATE_H__ */
|
#endif /* __ARM64_KVM_EMULATE_H__ */
|
||||||
|
|
|
@ -359,14 +359,6 @@ static inline void prefetchw(const void *ptr)
|
||||||
asm volatile("prfm pstl1keep, %a0\n" : : "p" (ptr));
|
asm volatile("prfm pstl1keep, %a0\n" : : "p" (ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ARCH_HAS_SPINLOCK_PREFETCH
|
|
||||||
static inline void spin_lock_prefetch(const void *ptr)
|
|
||||||
{
|
|
||||||
asm volatile(ARM64_LSE_ATOMIC_INSN(
|
|
||||||
"prfm pstl1strm, %a0",
|
|
||||||
"nop") : : "p" (ptr));
|
|
||||||
}
|
|
||||||
|
|
||||||
extern unsigned long __ro_after_init signal_minsigstksz; /* sigframe size */
|
extern unsigned long __ro_after_init signal_minsigstksz; /* sigframe size */
|
||||||
extern void __init minsigstksz_setup(void);
|
extern void __init minsigstksz_setup(void);
|
||||||
|
|
||||||
|
|
|
@ -679,7 +679,7 @@ static void fpsimd_to_sve(struct task_struct *task)
|
||||||
void *sst = task->thread.sve_state;
|
void *sst = task->thread.sve_state;
|
||||||
struct user_fpsimd_state const *fst = &task->thread.uw.fpsimd_state;
|
struct user_fpsimd_state const *fst = &task->thread.uw.fpsimd_state;
|
||||||
|
|
||||||
if (!system_supports_sve())
|
if (!system_supports_sve() && !system_supports_sme())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vq = sve_vq_from_vl(thread_get_cur_vl(&task->thread));
|
vq = sve_vq_from_vl(thread_get_cur_vl(&task->thread));
|
||||||
|
@ -705,7 +705,7 @@ static void sve_to_fpsimd(struct task_struct *task)
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
__uint128_t const *p;
|
__uint128_t const *p;
|
||||||
|
|
||||||
if (!system_supports_sve())
|
if (!system_supports_sve() && !system_supports_sme())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vl = thread_get_cur_vl(&task->thread);
|
vl = thread_get_cur_vl(&task->thread);
|
||||||
|
@ -835,7 +835,8 @@ void sve_sync_from_fpsimd_zeropad(struct task_struct *task)
|
||||||
void *sst = task->thread.sve_state;
|
void *sst = task->thread.sve_state;
|
||||||
struct user_fpsimd_state const *fst = &task->thread.uw.fpsimd_state;
|
struct user_fpsimd_state const *fst = &task->thread.uw.fpsimd_state;
|
||||||
|
|
||||||
if (!test_tsk_thread_flag(task, TIF_SVE))
|
if (!test_tsk_thread_flag(task, TIF_SVE) &&
|
||||||
|
!thread_sm_enabled(&task->thread))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vq = sve_vq_from_vl(thread_get_cur_vl(&task->thread));
|
vq = sve_vq_from_vl(thread_get_cur_vl(&task->thread));
|
||||||
|
@ -909,7 +910,7 @@ int vec_set_vector_length(struct task_struct *task, enum vec_type type,
|
||||||
*/
|
*/
|
||||||
task->thread.svcr &= ~(SVCR_SM_MASK |
|
task->thread.svcr &= ~(SVCR_SM_MASK |
|
||||||
SVCR_ZA_MASK);
|
SVCR_ZA_MASK);
|
||||||
clear_thread_flag(TIF_SME);
|
clear_tsk_thread_flag(task, TIF_SME);
|
||||||
free_sme = true;
|
free_sme = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -932,11 +932,13 @@ static int sve_set_common(struct task_struct *target,
|
||||||
/*
|
/*
|
||||||
* Ensure target->thread.sve_state is up to date with target's
|
* Ensure target->thread.sve_state is up to date with target's
|
||||||
* FPSIMD regs, so that a short copyin leaves trailing
|
* FPSIMD regs, so that a short copyin leaves trailing
|
||||||
* registers unmodified. Always enable SVE even if going into
|
* registers unmodified. Only enable SVE if we are
|
||||||
* streaming mode.
|
* configuring normal SVE, a system with streaming SVE may not
|
||||||
|
* have normal SVE.
|
||||||
*/
|
*/
|
||||||
fpsimd_sync_to_sve(target);
|
fpsimd_sync_to_sve(target);
|
||||||
set_tsk_thread_flag(target, TIF_SVE);
|
if (type == ARM64_VEC_SVE)
|
||||||
|
set_tsk_thread_flag(target, TIF_SVE);
|
||||||
target->thread.fp_type = FP_STATE_SVE;
|
target->thread.fp_type = FP_STATE_SVE;
|
||||||
|
|
||||||
BUILD_BUG_ON(SVE_PT_SVE_OFFSET != sizeof(header));
|
BUILD_BUG_ON(SVE_PT_SVE_OFFSET != sizeof(header));
|
||||||
|
@ -1180,6 +1182,8 @@ static int zt_set(struct task_struct *target,
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
target->thread.svcr |= SVCR_ZA_MASK;
|
target->thread.svcr |= SVCR_ZA_MASK;
|
||||||
|
|
||||||
|
fpsimd_flush_task_state(target);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ DECLARE_KVM_NVHE_PER_CPU(struct kvm_cpu_context, kvm_hyp_ctxt);
|
||||||
|
|
||||||
static bool vgic_present, kvm_arm_initialised;
|
static bool vgic_present, kvm_arm_initialised;
|
||||||
|
|
||||||
static DEFINE_PER_CPU(unsigned char, kvm_arm_hardware_enabled);
|
static DEFINE_PER_CPU(unsigned char, kvm_hyp_initialized);
|
||||||
DEFINE_STATIC_KEY_FALSE(userspace_irqchip_in_use);
|
DEFINE_STATIC_KEY_FALSE(userspace_irqchip_in_use);
|
||||||
|
|
||||||
bool is_kvm_arm_initialised(void)
|
bool is_kvm_arm_initialised(void)
|
||||||
|
@ -1864,18 +1864,24 @@ static void cpu_hyp_reinit(void)
|
||||||
cpu_hyp_init_features();
|
cpu_hyp_init_features();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _kvm_arch_hardware_enable(void *discard)
|
static void cpu_hyp_init(void *discard)
|
||||||
{
|
{
|
||||||
if (!__this_cpu_read(kvm_arm_hardware_enabled)) {
|
if (!__this_cpu_read(kvm_hyp_initialized)) {
|
||||||
cpu_hyp_reinit();
|
cpu_hyp_reinit();
|
||||||
__this_cpu_write(kvm_arm_hardware_enabled, 1);
|
__this_cpu_write(kvm_hyp_initialized, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cpu_hyp_uninit(void *discard)
|
||||||
|
{
|
||||||
|
if (__this_cpu_read(kvm_hyp_initialized)) {
|
||||||
|
cpu_hyp_reset();
|
||||||
|
__this_cpu_write(kvm_hyp_initialized, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_hardware_enable(void)
|
int kvm_arch_hardware_enable(void)
|
||||||
{
|
{
|
||||||
int was_enabled;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Most calls to this function are made with migration
|
* Most calls to this function are made with migration
|
||||||
* disabled, but not with preemption disabled. The former is
|
* disabled, but not with preemption disabled. The former is
|
||||||
|
@ -1884,36 +1890,23 @@ int kvm_arch_hardware_enable(void)
|
||||||
*/
|
*/
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
|
||||||
was_enabled = __this_cpu_read(kvm_arm_hardware_enabled);
|
cpu_hyp_init(NULL);
|
||||||
_kvm_arch_hardware_enable(NULL);
|
|
||||||
|
|
||||||
if (!was_enabled) {
|
kvm_vgic_cpu_up();
|
||||||
kvm_vgic_cpu_up();
|
kvm_timer_cpu_up();
|
||||||
kvm_timer_cpu_up();
|
|
||||||
}
|
|
||||||
|
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _kvm_arch_hardware_disable(void *discard)
|
|
||||||
{
|
|
||||||
if (__this_cpu_read(kvm_arm_hardware_enabled)) {
|
|
||||||
cpu_hyp_reset();
|
|
||||||
__this_cpu_write(kvm_arm_hardware_enabled, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void kvm_arch_hardware_disable(void)
|
void kvm_arch_hardware_disable(void)
|
||||||
{
|
{
|
||||||
if (__this_cpu_read(kvm_arm_hardware_enabled)) {
|
kvm_timer_cpu_down();
|
||||||
kvm_timer_cpu_down();
|
kvm_vgic_cpu_down();
|
||||||
kvm_vgic_cpu_down();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_protected_kvm_enabled())
|
if (!is_protected_kvm_enabled())
|
||||||
_kvm_arch_hardware_disable(NULL);
|
cpu_hyp_uninit(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_PM
|
#ifdef CONFIG_CPU_PM
|
||||||
|
@ -1922,16 +1915,16 @@ static int hyp_init_cpu_pm_notifier(struct notifier_block *self,
|
||||||
void *v)
|
void *v)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* kvm_arm_hardware_enabled is left with its old value over
|
* kvm_hyp_initialized is left with its old value over
|
||||||
* PM_ENTER->PM_EXIT. It is used to indicate PM_EXIT should
|
* PM_ENTER->PM_EXIT. It is used to indicate PM_EXIT should
|
||||||
* re-enable hyp.
|
* re-enable hyp.
|
||||||
*/
|
*/
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case CPU_PM_ENTER:
|
case CPU_PM_ENTER:
|
||||||
if (__this_cpu_read(kvm_arm_hardware_enabled))
|
if (__this_cpu_read(kvm_hyp_initialized))
|
||||||
/*
|
/*
|
||||||
* don't update kvm_arm_hardware_enabled here
|
* don't update kvm_hyp_initialized here
|
||||||
* so that the hardware will be re-enabled
|
* so that the hyp will be re-enabled
|
||||||
* when we resume. See below.
|
* when we resume. See below.
|
||||||
*/
|
*/
|
||||||
cpu_hyp_reset();
|
cpu_hyp_reset();
|
||||||
|
@ -1939,8 +1932,8 @@ static int hyp_init_cpu_pm_notifier(struct notifier_block *self,
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
case CPU_PM_ENTER_FAILED:
|
case CPU_PM_ENTER_FAILED:
|
||||||
case CPU_PM_EXIT:
|
case CPU_PM_EXIT:
|
||||||
if (__this_cpu_read(kvm_arm_hardware_enabled))
|
if (__this_cpu_read(kvm_hyp_initialized))
|
||||||
/* The hardware was enabled before suspend. */
|
/* The hyp was enabled before suspend. */
|
||||||
cpu_hyp_reinit();
|
cpu_hyp_reinit();
|
||||||
|
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
|
@ -2021,7 +2014,7 @@ static int __init init_subsystems(void)
|
||||||
/*
|
/*
|
||||||
* Enable hardware so that subsystem initialisation can access EL2.
|
* Enable hardware so that subsystem initialisation can access EL2.
|
||||||
*/
|
*/
|
||||||
on_each_cpu(_kvm_arch_hardware_enable, NULL, 1);
|
on_each_cpu(cpu_hyp_init, NULL, 1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Register CPU lower-power notifier
|
* Register CPU lower-power notifier
|
||||||
|
@ -2059,7 +2052,7 @@ out:
|
||||||
hyp_cpu_pm_exit();
|
hyp_cpu_pm_exit();
|
||||||
|
|
||||||
if (err || !is_protected_kvm_enabled())
|
if (err || !is_protected_kvm_enabled())
|
||||||
on_each_cpu(_kvm_arch_hardware_disable, NULL, 1);
|
on_each_cpu(cpu_hyp_uninit, NULL, 1);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -2097,7 +2090,7 @@ static int __init do_pkvm_init(u32 hyp_va_bits)
|
||||||
* The stub hypercalls are now disabled, so set our local flag to
|
* The stub hypercalls are now disabled, so set our local flag to
|
||||||
* prevent a later re-init attempt in kvm_arch_hardware_enable().
|
* prevent a later re-init attempt in kvm_arch_hardware_enable().
|
||||||
*/
|
*/
|
||||||
__this_cpu_write(kvm_arm_hardware_enabled, 1);
|
__this_cpu_write(kvm_hyp_initialized, 1);
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -457,6 +457,7 @@ static bool handle_ampere1_tcr(struct kvm_vcpu *vcpu)
|
||||||
*/
|
*/
|
||||||
val &= ~(TCR_HD | TCR_HA);
|
val &= ~(TCR_HD | TCR_HA);
|
||||||
write_sysreg_el1(val, SYS_TCR);
|
write_sysreg_el1(val, SYS_TCR);
|
||||||
|
__kvm_skip_instr(vcpu);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -705,7 +705,20 @@ int hyp_ffa_init(void *pages)
|
||||||
if (res.a0 == FFA_RET_NOT_SUPPORTED)
|
if (res.a0 == FFA_RET_NOT_SUPPORTED)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (res.a0 != FFA_VERSION_1_0)
|
/*
|
||||||
|
* Firmware returns the maximum supported version of the FF-A
|
||||||
|
* implementation. Check that the returned version is
|
||||||
|
* backwards-compatible with the hyp according to the rules in DEN0077A
|
||||||
|
* v1.1 REL0 13.2.1.
|
||||||
|
*
|
||||||
|
* Of course, things are never simple when dealing with firmware. v1.1
|
||||||
|
* broke ABI with v1.0 on several structures, which is itself
|
||||||
|
* incompatible with the aforementioned versioning scheme. The
|
||||||
|
* expectation is that v1.x implementations that do not support the v1.0
|
||||||
|
* ABI return NOT_SUPPORTED rather than a version number, according to
|
||||||
|
* DEN0077A v1.1 REL0 18.6.4.
|
||||||
|
*/
|
||||||
|
if (FFA_MAJOR_VERSION(res.a0) != 1)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
arm_smccc_1_1_smc(FFA_ID_GET, 0, 0, 0, 0, 0, 0, 0, &res);
|
arm_smccc_1_1_smc(FFA_ID_GET, 0, 0, 0, 0, 0, 0, 0, &res);
|
||||||
|
|
|
@ -63,7 +63,7 @@ static void __activate_traps(struct kvm_vcpu *vcpu)
|
||||||
__activate_traps_fpsimd32(vcpu);
|
__activate_traps_fpsimd32(vcpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
write_sysreg(val, cptr_el2);
|
kvm_write_cptr_el2(val);
|
||||||
write_sysreg(__this_cpu_read(kvm_hyp_vector), vbar_el2);
|
write_sysreg(__this_cpu_read(kvm_hyp_vector), vbar_el2);
|
||||||
|
|
||||||
if (cpus_have_final_cap(ARM64_WORKAROUND_SPECULATIVE_AT)) {
|
if (cpus_have_final_cap(ARM64_WORKAROUND_SPECULATIVE_AT)) {
|
||||||
|
|
|
@ -634,7 +634,6 @@ ia64_imva (void *addr)
|
||||||
|
|
||||||
#define ARCH_HAS_PREFETCH
|
#define ARCH_HAS_PREFETCH
|
||||||
#define ARCH_HAS_PREFETCHW
|
#define ARCH_HAS_PREFETCHW
|
||||||
#define ARCH_HAS_SPINLOCK_PREFETCH
|
|
||||||
#define PREFETCH_STRIDE L1_CACHE_BYTES
|
#define PREFETCH_STRIDE L1_CACHE_BYTES
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -649,8 +648,6 @@ prefetchw (const void *x)
|
||||||
ia64_lfetch_excl(ia64_lfhint_none, x);
|
ia64_lfetch_excl(ia64_lfhint_none, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define spin_lock_prefetch(x) prefetchw(x)
|
|
||||||
|
|
||||||
extern unsigned long boot_option_idle_override;
|
extern unsigned long boot_option_idle_override;
|
||||||
|
|
||||||
enum idle_boot_override {IDLE_NO_OVERRIDE=0, IDLE_HALT, IDLE_FORCE_MWAIT,
|
enum idle_boot_override {IDLE_NO_OVERRIDE=0, IDLE_HALT, IDLE_FORCE_MWAIT,
|
||||||
|
|
|
@ -58,8 +58,6 @@
|
||||||
|
|
||||||
#define cpu_has_rixi (cpu_data[0].cputype != CPU_CAVIUM_OCTEON)
|
#define cpu_has_rixi (cpu_data[0].cputype != CPU_CAVIUM_OCTEON)
|
||||||
|
|
||||||
#define ARCH_HAS_SPINLOCK_PREFETCH 1
|
|
||||||
#define spin_lock_prefetch(x) prefetch(x)
|
|
||||||
#define PREFETCH_STRIDE 128
|
#define PREFETCH_STRIDE 128
|
||||||
|
|
||||||
#ifdef __OCTEON__
|
#ifdef __OCTEON__
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
config LIGHTWEIGHT_SPINLOCK_CHECK
|
config LIGHTWEIGHT_SPINLOCK_CHECK
|
||||||
bool "Enable lightweight spinlock checks"
|
bool "Enable lightweight spinlock checks"
|
||||||
depends on SMP && !DEBUG_SPINLOCK
|
depends on DEBUG_KERNEL && SMP && !DEBUG_SPINLOCK
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
Add checks with low performance impact to the spinlock functions
|
Add checks with low performance impact to the spinlock functions
|
||||||
|
|
|
@ -117,7 +117,7 @@ char *strchr(const char *s, int c)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int puts(const char *s)
|
static int puts(const char *s)
|
||||||
{
|
{
|
||||||
const char *nuline = s;
|
const char *nuline = s;
|
||||||
|
|
||||||
|
@ -172,7 +172,7 @@ static int print_num(unsigned long num, int base)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int printf(const char *fmt, ...)
|
static int printf(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -204,13 +204,13 @@ void abort(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef malloc
|
#undef malloc
|
||||||
void *malloc(size_t size)
|
static void *malloc(size_t size)
|
||||||
{
|
{
|
||||||
return malloc_gzip(size);
|
return malloc_gzip(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef free
|
#undef free
|
||||||
void free(void *ptr)
|
static void free(void *ptr)
|
||||||
{
|
{
|
||||||
return free_gzip(ptr);
|
return free_gzip(ptr);
|
||||||
}
|
}
|
||||||
|
@ -278,7 +278,7 @@ static void parse_elf(void *output)
|
||||||
free(phdrs);
|
free(phdrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long decompress_kernel(unsigned int started_wide,
|
asmlinkage unsigned long __visible decompress_kernel(unsigned int started_wide,
|
||||||
unsigned int command_line,
|
unsigned int command_line,
|
||||||
const unsigned int rd_start,
|
const unsigned int rd_start,
|
||||||
const unsigned int rd_end)
|
const unsigned int rd_end)
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
#define dma_outb outb
|
#define dma_outb outb
|
||||||
#define dma_inb inb
|
#define dma_inb inb
|
||||||
|
|
||||||
|
extern unsigned long pcxl_dma_start;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** DMA_CHUNK_SIZE is used by the SCSI mid-layer to break up
|
** DMA_CHUNK_SIZE is used by the SCSI mid-layer to break up
|
||||||
** (or rather not merge) DMAs into manageable chunks.
|
** (or rather not merge) DMAs into manageable chunks.
|
||||||
|
|
|
@ -12,6 +12,10 @@ extern void mcount(void);
|
||||||
extern unsigned long sys_call_table[];
|
extern unsigned long sys_call_table[];
|
||||||
|
|
||||||
extern unsigned long return_address(unsigned int);
|
extern unsigned long return_address(unsigned int);
|
||||||
|
struct ftrace_regs;
|
||||||
|
extern void ftrace_function_trampoline(unsigned long parent,
|
||||||
|
unsigned long self_addr, unsigned long org_sp_gr3,
|
||||||
|
struct ftrace_regs *fregs);
|
||||||
|
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
extern void ftrace_caller(void);
|
extern void ftrace_caller(void);
|
||||||
|
|
|
@ -7,8 +7,6 @@
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/spinlock_types.h>
|
#include <asm/spinlock_types.h>
|
||||||
|
|
||||||
#define SPINLOCK_BREAK_INSN 0x0000c006 /* break 6,6 */
|
|
||||||
|
|
||||||
static inline void arch_spin_val_check(int lock_val)
|
static inline void arch_spin_val_check(int lock_val)
|
||||||
{
|
{
|
||||||
if (IS_ENABLED(CONFIG_LIGHTWEIGHT_SPINLOCK_CHECK))
|
if (IS_ENABLED(CONFIG_LIGHTWEIGHT_SPINLOCK_CHECK))
|
||||||
|
|
|
@ -4,6 +4,10 @@
|
||||||
|
|
||||||
#define __ARCH_SPIN_LOCK_UNLOCKED_VAL 0x1a46
|
#define __ARCH_SPIN_LOCK_UNLOCKED_VAL 0x1a46
|
||||||
|
|
||||||
|
#define SPINLOCK_BREAK_INSN 0x0000c006 /* break 6,6 */
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
#ifdef CONFIG_PA20
|
#ifdef CONFIG_PA20
|
||||||
volatile unsigned int slock;
|
volatile unsigned int slock;
|
||||||
|
@ -27,6 +31,8 @@ typedef struct {
|
||||||
volatile unsigned int counter;
|
volatile unsigned int counter;
|
||||||
} arch_rwlock_t;
|
} arch_rwlock_t;
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#define __ARCH_RW_LOCK_UNLOCKED__ 0x01000000
|
#define __ARCH_RW_LOCK_UNLOCKED__ 0x01000000
|
||||||
#define __ARCH_RW_LOCK_UNLOCKED { .lock_mutex = __ARCH_SPIN_LOCK_UNLOCKED, \
|
#define __ARCH_RW_LOCK_UNLOCKED { .lock_mutex = __ARCH_SPIN_LOCK_UNLOCKED, \
|
||||||
.counter = __ARCH_RW_LOCK_UNLOCKED__ }
|
.counter = __ARCH_RW_LOCK_UNLOCKED__ }
|
||||||
|
|
|
@ -74,8 +74,8 @@
|
||||||
static DEFINE_SPINLOCK(pdc_lock);
|
static DEFINE_SPINLOCK(pdc_lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned long pdc_result[NUM_PDC_RESULT] __aligned(8);
|
static unsigned long pdc_result[NUM_PDC_RESULT] __aligned(8);
|
||||||
unsigned long pdc_result2[NUM_PDC_RESULT] __aligned(8);
|
static unsigned long pdc_result2[NUM_PDC_RESULT] __aligned(8);
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
#define WIDE_FIRMWARE 0x1
|
#define WIDE_FIRMWARE 0x1
|
||||||
|
@ -334,7 +334,7 @@ int __pdc_cpu_rendezvous(void)
|
||||||
/**
|
/**
|
||||||
* pdc_cpu_rendezvous_lock - Lock PDC while transitioning to rendezvous state
|
* pdc_cpu_rendezvous_lock - Lock PDC while transitioning to rendezvous state
|
||||||
*/
|
*/
|
||||||
void pdc_cpu_rendezvous_lock(void)
|
void pdc_cpu_rendezvous_lock(void) __acquires(&pdc_lock)
|
||||||
{
|
{
|
||||||
spin_lock(&pdc_lock);
|
spin_lock(&pdc_lock);
|
||||||
}
|
}
|
||||||
|
@ -342,7 +342,7 @@ void pdc_cpu_rendezvous_lock(void)
|
||||||
/**
|
/**
|
||||||
* pdc_cpu_rendezvous_unlock - Unlock PDC after reaching rendezvous state
|
* pdc_cpu_rendezvous_unlock - Unlock PDC after reaching rendezvous state
|
||||||
*/
|
*/
|
||||||
void pdc_cpu_rendezvous_unlock(void)
|
void pdc_cpu_rendezvous_unlock(void) __releases(&pdc_lock)
|
||||||
{
|
{
|
||||||
spin_unlock(&pdc_lock);
|
spin_unlock(&pdc_lock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,7 @@ static void __hot prepare_ftrace_return(unsigned long *parent,
|
||||||
|
|
||||||
static ftrace_func_t ftrace_func;
|
static ftrace_func_t ftrace_func;
|
||||||
|
|
||||||
void notrace __hot ftrace_function_trampoline(unsigned long parent,
|
asmlinkage void notrace __hot ftrace_function_trampoline(unsigned long parent,
|
||||||
unsigned long self_addr,
|
unsigned long self_addr,
|
||||||
unsigned long org_sp_gr3,
|
unsigned long org_sp_gr3,
|
||||||
struct ftrace_regs *fregs)
|
struct ftrace_regs *fregs)
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
|
#include <linux/libgcc.h>
|
||||||
|
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
EXPORT_SYMBOL(memset);
|
EXPORT_SYMBOL(memset);
|
||||||
|
@ -92,12 +93,6 @@ EXPORT_SYMBOL($$divI_12);
|
||||||
EXPORT_SYMBOL($$divI_14);
|
EXPORT_SYMBOL($$divI_14);
|
||||||
EXPORT_SYMBOL($$divI_15);
|
EXPORT_SYMBOL($$divI_15);
|
||||||
|
|
||||||
extern void __ashrdi3(void);
|
|
||||||
extern void __ashldi3(void);
|
|
||||||
extern void __lshrdi3(void);
|
|
||||||
extern void __muldi3(void);
|
|
||||||
extern void __ucmpdi2(void);
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(__ashrdi3);
|
EXPORT_SYMBOL(__ashrdi3);
|
||||||
EXPORT_SYMBOL(__ashldi3);
|
EXPORT_SYMBOL(__ashldi3);
|
||||||
EXPORT_SYMBOL(__lshrdi3);
|
EXPORT_SYMBOL(__lshrdi3);
|
||||||
|
|
|
@ -39,7 +39,7 @@ static struct proc_dir_entry * proc_gsc_root __read_mostly = NULL;
|
||||||
static unsigned long pcxl_used_bytes __read_mostly;
|
static unsigned long pcxl_used_bytes __read_mostly;
|
||||||
static unsigned long pcxl_used_pages __read_mostly;
|
static unsigned long pcxl_used_pages __read_mostly;
|
||||||
|
|
||||||
extern unsigned long pcxl_dma_start; /* Start of pcxl dma mapping area */
|
unsigned long pcxl_dma_start __ro_after_init; /* pcxl dma mapping area start */
|
||||||
static DEFINE_SPINLOCK(pcxl_res_lock);
|
static DEFINE_SPINLOCK(pcxl_res_lock);
|
||||||
static char *pcxl_res_map;
|
static char *pcxl_res_map;
|
||||||
static int pcxl_res_hint;
|
static int pcxl_res_hint;
|
||||||
|
@ -381,7 +381,7 @@ pcxl_dma_init(void)
|
||||||
pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL,
|
pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL,
|
||||||
get_order(pcxl_res_size));
|
get_order(pcxl_res_size));
|
||||||
memset(pcxl_res_map, 0, pcxl_res_size);
|
memset(pcxl_res_map, 0, pcxl_res_size);
|
||||||
proc_gsc_root = proc_mkdir("gsc", NULL);
|
proc_gsc_root = proc_mkdir("bus/gsc", NULL);
|
||||||
if (!proc_gsc_root)
|
if (!proc_gsc_root)
|
||||||
printk(KERN_WARNING
|
printk(KERN_WARNING
|
||||||
"pcxl_dma_init: Unable to create gsc /proc dir entry\n");
|
"pcxl_dma_init: Unable to create gsc /proc dir entry\n");
|
||||||
|
@ -417,14 +417,6 @@ void *arch_dma_alloc(struct device *dev, size_t size,
|
||||||
map_uncached_pages(vaddr, size, paddr);
|
map_uncached_pages(vaddr, size, paddr);
|
||||||
*dma_handle = (dma_addr_t) paddr;
|
*dma_handle = (dma_addr_t) paddr;
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* This probably isn't needed to support EISA cards.
|
|
||||||
** ISA cards will certainly only support 24-bit DMA addressing.
|
|
||||||
** Not clear if we can, want, or need to support ISA.
|
|
||||||
*/
|
|
||||||
if (!dev || *dev->coherent_dma_mask < 0xffffffff)
|
|
||||||
gfp |= GFP_DMA;
|
|
||||||
#endif
|
|
||||||
return (void *)vaddr;
|
return (void *)vaddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -354,10 +354,8 @@ static int __init pdt_initcall(void)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
kpdtd_task = kthread_run(pdt_mainloop, NULL, "kpdtd");
|
kpdtd_task = kthread_run(pdt_mainloop, NULL, "kpdtd");
|
||||||
if (IS_ERR(kpdtd_task))
|
|
||||||
return PTR_ERR(kpdtd_task);
|
|
||||||
|
|
||||||
return 0;
|
return PTR_ERR_OR_ZERO(kpdtd_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
late_initcall(pdt_initcall);
|
late_initcall(pdt_initcall);
|
||||||
|
|
|
@ -57,7 +57,7 @@ struct rdr_tbl_ent {
|
||||||
static int perf_processor_interface __read_mostly = UNKNOWN_INTF;
|
static int perf_processor_interface __read_mostly = UNKNOWN_INTF;
|
||||||
static int perf_enabled __read_mostly;
|
static int perf_enabled __read_mostly;
|
||||||
static DEFINE_SPINLOCK(perf_lock);
|
static DEFINE_SPINLOCK(perf_lock);
|
||||||
struct parisc_device *cpu_device __read_mostly;
|
static struct parisc_device *cpu_device __read_mostly;
|
||||||
|
|
||||||
/* RDRs to write for PCX-W */
|
/* RDRs to write for PCX-W */
|
||||||
static const int perf_rdrs_W[] =
|
static const int perf_rdrs_W[] =
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/pdc.h>
|
#include <asm/pdc.h>
|
||||||
|
#include <asm/smp.h>
|
||||||
#include <asm/pdcpat.h>
|
#include <asm/pdcpat.h>
|
||||||
#include <asm/irq.h> /* for struct irq_region */
|
#include <asm/irq.h> /* for struct irq_region */
|
||||||
#include <asm/parisc-device.h>
|
#include <asm/parisc-device.h>
|
||||||
|
|
|
@ -40,11 +40,6 @@
|
||||||
|
|
||||||
static char __initdata command_line[COMMAND_LINE_SIZE];
|
static char __initdata command_line[COMMAND_LINE_SIZE];
|
||||||
|
|
||||||
/* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */
|
|
||||||
struct proc_dir_entry * proc_runway_root __read_mostly = NULL;
|
|
||||||
struct proc_dir_entry * proc_gsc_root __read_mostly = NULL;
|
|
||||||
struct proc_dir_entry * proc_mckinley_root __read_mostly = NULL;
|
|
||||||
|
|
||||||
static void __init setup_cmdline(char **cmdline_p)
|
static void __init setup_cmdline(char **cmdline_p)
|
||||||
{
|
{
|
||||||
extern unsigned int boot_args[];
|
extern unsigned int boot_args[];
|
||||||
|
@ -196,48 +191,6 @@ const struct seq_operations cpuinfo_op = {
|
||||||
.show = show_cpuinfo
|
.show = show_cpuinfo
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init parisc_proc_mkdir(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
** Can't call proc_mkdir() until after proc_root_init() has been
|
|
||||||
** called by start_kernel(). In other words, this code can't
|
|
||||||
** live in arch/.../setup.c because start_parisc() calls
|
|
||||||
** start_kernel().
|
|
||||||
*/
|
|
||||||
switch (boot_cpu_data.cpu_type) {
|
|
||||||
case pcxl:
|
|
||||||
case pcxl2:
|
|
||||||
if (NULL == proc_gsc_root)
|
|
||||||
{
|
|
||||||
proc_gsc_root = proc_mkdir("bus/gsc", NULL);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case pcxt_:
|
|
||||||
case pcxu:
|
|
||||||
case pcxu_:
|
|
||||||
case pcxw:
|
|
||||||
case pcxw_:
|
|
||||||
case pcxw2:
|
|
||||||
if (NULL == proc_runway_root)
|
|
||||||
{
|
|
||||||
proc_runway_root = proc_mkdir("bus/runway", NULL);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case mako:
|
|
||||||
case mako2:
|
|
||||||
if (NULL == proc_mckinley_root)
|
|
||||||
{
|
|
||||||
proc_mckinley_root = proc_mkdir("bus/mckinley", NULL);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* FIXME: this was added to prevent the compiler
|
|
||||||
* complaining about missing pcx, pcxs and pcxt
|
|
||||||
* I'm assuming they have neither gsc nor runway */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct resource central_bus = {
|
static struct resource central_bus = {
|
||||||
.name = "Central Bus",
|
.name = "Central Bus",
|
||||||
.start = F_EXTEND(0xfff80000),
|
.start = F_EXTEND(0xfff80000),
|
||||||
|
@ -294,7 +247,6 @@ static int __init parisc_init(void)
|
||||||
{
|
{
|
||||||
u32 osid = (OS_ID_LINUX << 16);
|
u32 osid = (OS_ID_LINUX << 16);
|
||||||
|
|
||||||
parisc_proc_mkdir();
|
|
||||||
parisc_init_resources();
|
parisc_init_resources();
|
||||||
do_device_inventory(); /* probe for hardware */
|
do_device_inventory(); /* probe for hardware */
|
||||||
|
|
||||||
|
|
|
@ -423,7 +423,7 @@ static void check_syscallno_in_delay_branch(struct pt_regs *regs)
|
||||||
regs->gr[31] -= 8; /* delayed branching */
|
regs->gr[31] -= 8; /* delayed branching */
|
||||||
|
|
||||||
/* Get assembler opcode of code in delay branch */
|
/* Get assembler opcode of code in delay branch */
|
||||||
uaddr = (unsigned int *) ((regs->gr[31] & ~3) + 4);
|
uaddr = (u32 __user *) ((regs->gr[31] & ~3) + 4);
|
||||||
err = get_user(opcode, uaddr);
|
err = get_user(opcode, uaddr);
|
||||||
if (err)
|
if (err)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -27,17 +27,12 @@
|
||||||
#include <linux/elf-randomize.h>
|
#include <linux/elf-randomize.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Construct an artificial page offset for the mapping based on the virtual
|
* Construct an artificial page offset for the mapping based on the physical
|
||||||
* address of the kernel file mapping variable.
|
* address of the kernel file mapping variable.
|
||||||
* If filp is zero the calculated pgoff value aliases the memory of the given
|
|
||||||
* address. This is useful for io_uring where the mapping shall alias a kernel
|
|
||||||
* address and a userspace adress where both the kernel and the userspace
|
|
||||||
* access the same memory region.
|
|
||||||
*/
|
*/
|
||||||
#define GET_FILP_PGOFF(filp, addr) \
|
#define GET_FILP_PGOFF(filp) \
|
||||||
((filp ? (((unsigned long) filp->f_mapping) >> 8) \
|
(filp ? (((unsigned long) filp->f_mapping) >> 8) \
|
||||||
& ((SHM_COLOUR-1) >> PAGE_SHIFT) : 0UL) \
|
& ((SHM_COLOUR-1) >> PAGE_SHIFT) : 0UL)
|
||||||
+ (addr >> PAGE_SHIFT))
|
|
||||||
|
|
||||||
static unsigned long shared_align_offset(unsigned long filp_pgoff,
|
static unsigned long shared_align_offset(unsigned long filp_pgoff,
|
||||||
unsigned long pgoff)
|
unsigned long pgoff)
|
||||||
|
@ -117,7 +112,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp,
|
||||||
do_color_align = 0;
|
do_color_align = 0;
|
||||||
if (filp || (flags & MAP_SHARED))
|
if (filp || (flags & MAP_SHARED))
|
||||||
do_color_align = 1;
|
do_color_align = 1;
|
||||||
filp_pgoff = GET_FILP_PGOFF(filp, addr);
|
filp_pgoff = GET_FILP_PGOFF(filp);
|
||||||
|
|
||||||
if (flags & MAP_FIXED) {
|
if (flags & MAP_FIXED) {
|
||||||
/* Even MAP_FIXED mappings must reside within TASK_SIZE */
|
/* Even MAP_FIXED mappings must reside within TASK_SIZE */
|
||||||
|
|
|
@ -39,6 +39,7 @@ registers).
|
||||||
#include <asm/assembly.h>
|
#include <asm/assembly.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
|
#include <asm/spinlock_types.h>
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
|
@ -66,6 +67,16 @@ registers).
|
||||||
stw \reg1, 0(%sr2,\reg2)
|
stw \reg1, 0(%sr2,\reg2)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
/* raise exception if spinlock content is not zero or
|
||||||
|
* __ARCH_SPIN_LOCK_UNLOCKED_VAL */
|
||||||
|
.macro spinlock_check spin_val,tmpreg
|
||||||
|
#ifdef CONFIG_LIGHTWEIGHT_SPINLOCK_CHECK
|
||||||
|
ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, \tmpreg
|
||||||
|
andcm,= \spin_val, \tmpreg, %r0
|
||||||
|
.word SPINLOCK_BREAK_INSN
|
||||||
|
#endif
|
||||||
|
.endm
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
.import syscall_exit,code
|
.import syscall_exit,code
|
||||||
|
@ -508,7 +519,8 @@ lws_start:
|
||||||
|
|
||||||
lws_exit_noerror:
|
lws_exit_noerror:
|
||||||
lws_pagefault_enable %r1,%r21
|
lws_pagefault_enable %r1,%r21
|
||||||
stw,ma %r20, 0(%sr2,%r20)
|
ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, %r21
|
||||||
|
stw,ma %r21, 0(%sr2,%r20)
|
||||||
ssm PSW_SM_I, %r0
|
ssm PSW_SM_I, %r0
|
||||||
b lws_exit
|
b lws_exit
|
||||||
copy %r0, %r21
|
copy %r0, %r21
|
||||||
|
@ -521,7 +533,8 @@ lws_wouldblock:
|
||||||
|
|
||||||
lws_pagefault:
|
lws_pagefault:
|
||||||
lws_pagefault_enable %r1,%r21
|
lws_pagefault_enable %r1,%r21
|
||||||
stw,ma %r20, 0(%sr2,%r20)
|
ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, %r21
|
||||||
|
stw,ma %r21, 0(%sr2,%r20)
|
||||||
ssm PSW_SM_I, %r0
|
ssm PSW_SM_I, %r0
|
||||||
ldo 3(%r0),%r28
|
ldo 3(%r0),%r28
|
||||||
b lws_exit
|
b lws_exit
|
||||||
|
@ -619,6 +632,7 @@ lws_compare_and_swap:
|
||||||
|
|
||||||
/* Try to acquire the lock */
|
/* Try to acquire the lock */
|
||||||
LDCW 0(%sr2,%r20), %r28
|
LDCW 0(%sr2,%r20), %r28
|
||||||
|
spinlock_check %r28, %r21
|
||||||
comclr,<> %r0, %r28, %r0
|
comclr,<> %r0, %r28, %r0
|
||||||
b,n lws_wouldblock
|
b,n lws_wouldblock
|
||||||
|
|
||||||
|
@ -772,6 +786,7 @@ cas2_lock_start:
|
||||||
|
|
||||||
/* Try to acquire the lock */
|
/* Try to acquire the lock */
|
||||||
LDCW 0(%sr2,%r20), %r28
|
LDCW 0(%sr2,%r20), %r28
|
||||||
|
spinlock_check %r28, %r21
|
||||||
comclr,<> %r0, %r28, %r0
|
comclr,<> %r0, %r28, %r0
|
||||||
b,n lws_wouldblock
|
b,n lws_wouldblock
|
||||||
|
|
||||||
|
@ -1001,6 +1016,7 @@ atomic_xchg_start:
|
||||||
|
|
||||||
/* Try to acquire the lock */
|
/* Try to acquire the lock */
|
||||||
LDCW 0(%sr2,%r20), %r28
|
LDCW 0(%sr2,%r20), %r28
|
||||||
|
spinlock_check %r28, %r21
|
||||||
comclr,<> %r0, %r28, %r0
|
comclr,<> %r0, %r28, %r0
|
||||||
b,n lws_wouldblock
|
b,n lws_wouldblock
|
||||||
|
|
||||||
|
@ -1199,6 +1215,7 @@ atomic_store_start:
|
||||||
|
|
||||||
/* Try to acquire the lock */
|
/* Try to acquire the lock */
|
||||||
LDCW 0(%sr2,%r20), %r28
|
LDCW 0(%sr2,%r20), %r28
|
||||||
|
spinlock_check %r28, %r21
|
||||||
comclr,<> %r0, %r28, %r0
|
comclr,<> %r0, %r28, %r0
|
||||||
b,n lws_wouldblock
|
b,n lws_wouldblock
|
||||||
|
|
||||||
|
@ -1330,7 +1347,7 @@ ENTRY(lws_lock_start)
|
||||||
/* lws locks */
|
/* lws locks */
|
||||||
.rept 256
|
.rept 256
|
||||||
/* Keep locks aligned at 16-bytes */
|
/* Keep locks aligned at 16-bytes */
|
||||||
.word 1
|
.word __ARCH_SPIN_LOCK_UNLOCKED_VAL
|
||||||
.word 0
|
.word 0
|
||||||
.word 0
|
.word 0
|
||||||
.word 0
|
.word 0
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <linux/signal.h>
|
#include <linux/signal.h>
|
||||||
#include <linux/ratelimit.h>
|
#include <linux/ratelimit.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
#include <linux/sysctl.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
#include <asm/hardirq.h>
|
#include <asm/hardirq.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
|
@ -337,7 +338,7 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop)
|
||||||
: "r19", "r20", "r21", "r22", "r1" );
|
: "r19", "r20", "r21", "r22", "r1" );
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
unsigned long valh=(val>>32),vall=(val&0xffffffffl);
|
unsigned long valh = (val >> 32), vall = (val & 0xffffffffl);
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
" mtsp %4, %%sr1\n"
|
" mtsp %4, %%sr1\n"
|
||||||
" zdep %2, 29, 2, %%r19\n"
|
" zdep %2, 29, 2, %%r19\n"
|
||||||
|
@ -473,7 +474,7 @@ void handle_unaligned(struct pt_regs *regs)
|
||||||
case OPCODE_LDWA_I:
|
case OPCODE_LDWA_I:
|
||||||
case OPCODE_LDW_S:
|
case OPCODE_LDW_S:
|
||||||
case OPCODE_LDWA_S:
|
case OPCODE_LDWA_S:
|
||||||
ret = emulate_ldw(regs, R3(regs->iir),0);
|
ret = emulate_ldw(regs, R3(regs->iir), 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_STH:
|
case OPCODE_STH:
|
||||||
|
@ -482,7 +483,7 @@ void handle_unaligned(struct pt_regs *regs)
|
||||||
|
|
||||||
case OPCODE_STW:
|
case OPCODE_STW:
|
||||||
case OPCODE_STWA:
|
case OPCODE_STWA:
|
||||||
ret = emulate_stw(regs, R2(regs->iir),0);
|
ret = emulate_stw(regs, R2(regs->iir), 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
|
@ -490,12 +491,12 @@ void handle_unaligned(struct pt_regs *regs)
|
||||||
case OPCODE_LDDA_I:
|
case OPCODE_LDDA_I:
|
||||||
case OPCODE_LDD_S:
|
case OPCODE_LDD_S:
|
||||||
case OPCODE_LDDA_S:
|
case OPCODE_LDDA_S:
|
||||||
ret = emulate_ldd(regs, R3(regs->iir),0);
|
ret = emulate_ldd(regs, R3(regs->iir), 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_STD:
|
case OPCODE_STD:
|
||||||
case OPCODE_STDA:
|
case OPCODE_STDA:
|
||||||
ret = emulate_std(regs, R2(regs->iir),0);
|
ret = emulate_std(regs, R2(regs->iir), 0);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -503,24 +504,24 @@ void handle_unaligned(struct pt_regs *regs)
|
||||||
case OPCODE_FLDWS:
|
case OPCODE_FLDWS:
|
||||||
case OPCODE_FLDWXR:
|
case OPCODE_FLDWXR:
|
||||||
case OPCODE_FLDWSR:
|
case OPCODE_FLDWSR:
|
||||||
ret = emulate_ldw(regs,FR3(regs->iir),1);
|
ret = emulate_ldw(regs, FR3(regs->iir), 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_FLDDX:
|
case OPCODE_FLDDX:
|
||||||
case OPCODE_FLDDS:
|
case OPCODE_FLDDS:
|
||||||
ret = emulate_ldd(regs,R3(regs->iir),1);
|
ret = emulate_ldd(regs, R3(regs->iir), 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_FSTWX:
|
case OPCODE_FSTWX:
|
||||||
case OPCODE_FSTWS:
|
case OPCODE_FSTWS:
|
||||||
case OPCODE_FSTWXR:
|
case OPCODE_FSTWXR:
|
||||||
case OPCODE_FSTWSR:
|
case OPCODE_FSTWSR:
|
||||||
ret = emulate_stw(regs,FR3(regs->iir),1);
|
ret = emulate_stw(regs, FR3(regs->iir), 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_FSTDX:
|
case OPCODE_FSTDX:
|
||||||
case OPCODE_FSTDS:
|
case OPCODE_FSTDS:
|
||||||
ret = emulate_std(regs,R3(regs->iir),1);
|
ret = emulate_std(regs, R3(regs->iir), 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_LDCD_I:
|
case OPCODE_LDCD_I:
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/libgcc.h>
|
||||||
|
|
||||||
union ull_union {
|
union ull_union {
|
||||||
unsigned long long ull;
|
unsigned long long ull;
|
||||||
|
@ -9,7 +10,7 @@ union ull_union {
|
||||||
} ui;
|
} ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
int __ucmpdi2(unsigned long long a, unsigned long long b)
|
word_type __ucmpdi2(unsigned long long a, unsigned long long b)
|
||||||
{
|
{
|
||||||
union ull_union au = {.ull = a};
|
union ull_union au = {.ull = a};
|
||||||
union ull_union bu = {.ull = b};
|
union ull_union bu = {.ull = b};
|
||||||
|
|
|
@ -192,31 +192,31 @@ int fixup_exception(struct pt_regs *regs)
|
||||||
* For implementation see handle_interruption() in traps.c
|
* For implementation see handle_interruption() in traps.c
|
||||||
*/
|
*/
|
||||||
static const char * const trap_description[] = {
|
static const char * const trap_description[] = {
|
||||||
[1] "High-priority machine check (HPMC)",
|
[1] = "High-priority machine check (HPMC)",
|
||||||
[2] "Power failure interrupt",
|
[2] = "Power failure interrupt",
|
||||||
[3] "Recovery counter trap",
|
[3] = "Recovery counter trap",
|
||||||
[5] "Low-priority machine check",
|
[5] = "Low-priority machine check",
|
||||||
[6] "Instruction TLB miss fault",
|
[6] = "Instruction TLB miss fault",
|
||||||
[7] "Instruction access rights / protection trap",
|
[7] = "Instruction access rights / protection trap",
|
||||||
[8] "Illegal instruction trap",
|
[8] = "Illegal instruction trap",
|
||||||
[9] "Break instruction trap",
|
[9] = "Break instruction trap",
|
||||||
[10] "Privileged operation trap",
|
[10] = "Privileged operation trap",
|
||||||
[11] "Privileged register trap",
|
[11] = "Privileged register trap",
|
||||||
[12] "Overflow trap",
|
[12] = "Overflow trap",
|
||||||
[13] "Conditional trap",
|
[13] = "Conditional trap",
|
||||||
[14] "FP Assist Exception trap",
|
[14] = "FP Assist Exception trap",
|
||||||
[15] "Data TLB miss fault",
|
[15] = "Data TLB miss fault",
|
||||||
[16] "Non-access ITLB miss fault",
|
[16] = "Non-access ITLB miss fault",
|
||||||
[17] "Non-access DTLB miss fault",
|
[17] = "Non-access DTLB miss fault",
|
||||||
[18] "Data memory protection/unaligned access trap",
|
[18] = "Data memory protection/unaligned access trap",
|
||||||
[19] "Data memory break trap",
|
[19] = "Data memory break trap",
|
||||||
[20] "TLB dirty bit trap",
|
[20] = "TLB dirty bit trap",
|
||||||
[21] "Page reference trap",
|
[21] = "Page reference trap",
|
||||||
[22] "Assist emulation trap",
|
[22] = "Assist emulation trap",
|
||||||
[25] "Taken branch trap",
|
[25] = "Taken branch trap",
|
||||||
[26] "Data memory access rights trap",
|
[26] = "Data memory access rights trap",
|
||||||
[27] "Data memory protection ID trap",
|
[27] = "Data memory protection ID trap",
|
||||||
[28] "Unaligned data reference trap",
|
[28] = "Unaligned data reference trap",
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *trap_name(unsigned long code)
|
const char *trap_name(unsigned long code)
|
||||||
|
|
|
@ -19,9 +19,6 @@ void notrace set_fixmap(enum fixed_addresses idx, phys_addr_t phys)
|
||||||
pmd_t *pmd = pmd_offset(pud, vaddr);
|
pmd_t *pmd = pmd_offset(pud, vaddr);
|
||||||
pte_t *pte;
|
pte_t *pte;
|
||||||
|
|
||||||
if (pmd_none(*pmd))
|
|
||||||
pte = pte_alloc_kernel(pmd, vaddr);
|
|
||||||
|
|
||||||
pte = pte_offset_kernel(pmd, vaddr);
|
pte = pte_offset_kernel(pmd, vaddr);
|
||||||
set_pte_at(&init_mm, vaddr, pte, __mk_pte(phys, PAGE_KERNEL_RWX));
|
set_pte_at(&init_mm, vaddr, pte, __mk_pte(phys, PAGE_KERNEL_RWX));
|
||||||
flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE);
|
flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE);
|
||||||
|
|
|
@ -523,10 +523,6 @@ void mark_rodata_ro(void)
|
||||||
void *parisc_vmalloc_start __ro_after_init;
|
void *parisc_vmalloc_start __ro_after_init;
|
||||||
EXPORT_SYMBOL(parisc_vmalloc_start);
|
EXPORT_SYMBOL(parisc_vmalloc_start);
|
||||||
|
|
||||||
#ifdef CONFIG_PA11
|
|
||||||
unsigned long pcxl_dma_start __ro_after_init;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void __init mem_init(void)
|
void __init mem_init(void)
|
||||||
{
|
{
|
||||||
/* Do sanity checks on IPC (compat) structures */
|
/* Do sanity checks on IPC (compat) structures */
|
||||||
|
@ -669,6 +665,39 @@ static void __init gateway_init(void)
|
||||||
PAGE_SIZE, PAGE_GATEWAY, 1);
|
PAGE_SIZE, PAGE_GATEWAY, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __init fixmap_init(void)
|
||||||
|
{
|
||||||
|
unsigned long addr = FIXMAP_START;
|
||||||
|
unsigned long end = FIXMAP_START + FIXMAP_SIZE;
|
||||||
|
pgd_t *pgd = pgd_offset_k(addr);
|
||||||
|
p4d_t *p4d = p4d_offset(pgd, addr);
|
||||||
|
pud_t *pud = pud_offset(p4d, addr);
|
||||||
|
pmd_t *pmd;
|
||||||
|
|
||||||
|
BUILD_BUG_ON(FIXMAP_SIZE > PMD_SIZE);
|
||||||
|
|
||||||
|
#if CONFIG_PGTABLE_LEVELS == 3
|
||||||
|
if (pud_none(*pud)) {
|
||||||
|
pmd = memblock_alloc(PAGE_SIZE << PMD_TABLE_ORDER,
|
||||||
|
PAGE_SIZE << PMD_TABLE_ORDER);
|
||||||
|
if (!pmd)
|
||||||
|
panic("fixmap: pmd allocation failed.\n");
|
||||||
|
pud_populate(NULL, pud, pmd);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pmd = pmd_offset(pud, addr);
|
||||||
|
do {
|
||||||
|
pte_t *pte = memblock_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||||
|
if (!pte)
|
||||||
|
panic("fixmap: pte allocation failed.\n");
|
||||||
|
|
||||||
|
pmd_populate_kernel(&init_mm, pmd, pte);
|
||||||
|
|
||||||
|
addr += PAGE_SIZE;
|
||||||
|
} while (addr < end);
|
||||||
|
}
|
||||||
|
|
||||||
static void __init parisc_bootmem_free(void)
|
static void __init parisc_bootmem_free(void)
|
||||||
{
|
{
|
||||||
unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0, };
|
unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0, };
|
||||||
|
@ -683,6 +712,7 @@ void __init paging_init(void)
|
||||||
setup_bootmem();
|
setup_bootmem();
|
||||||
pagetable_init();
|
pagetable_init();
|
||||||
gateway_init();
|
gateway_init();
|
||||||
|
fixmap_init();
|
||||||
flush_cache_all_local(); /* start with known state */
|
flush_cache_all_local(); /* start with known state */
|
||||||
flush_tlb_all_local(NULL);
|
flush_tlb_all_local(NULL);
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
*/
|
*/
|
||||||
void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
|
void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
|
||||||
{
|
{
|
||||||
void __iomem *addr;
|
uintptr_t addr;
|
||||||
struct vm_struct *area;
|
struct vm_struct *area;
|
||||||
unsigned long offset, last_addr;
|
unsigned long offset, last_addr;
|
||||||
pgprot_t pgprot;
|
pgprot_t pgprot;
|
||||||
|
@ -79,10 +79,9 @@ void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
|
||||||
if (!area)
|
if (!area)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
addr = (void __iomem *) area->addr;
|
addr = (uintptr_t) area->addr;
|
||||||
if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size,
|
if (ioremap_page_range(addr, addr + size, phys_addr, pgprot)) {
|
||||||
phys_addr, pgprot)) {
|
vunmap(area->addr);
|
||||||
vunmap(addr);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -393,7 +393,6 @@ int validate_sp_size(unsigned long sp, struct task_struct *p,
|
||||||
*/
|
*/
|
||||||
#define ARCH_HAS_PREFETCH
|
#define ARCH_HAS_PREFETCH
|
||||||
#define ARCH_HAS_PREFETCHW
|
#define ARCH_HAS_PREFETCHW
|
||||||
#define ARCH_HAS_SPINLOCK_PREFETCH
|
|
||||||
|
|
||||||
static inline void prefetch(const void *x)
|
static inline void prefetch(const void *x)
|
||||||
{
|
{
|
||||||
|
@ -411,8 +410,6 @@ static inline void prefetchw(const void *x)
|
||||||
__asm__ __volatile__ ("dcbtst 0,%0" : : "r" (x));
|
__asm__ __volatile__ ("dcbtst 0,%0" : : "r" (x));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define spin_lock_prefetch(x) prefetchw(x)
|
|
||||||
|
|
||||||
/* asm stubs */
|
/* asm stubs */
|
||||||
extern unsigned long isa300_idle_stop_noloss(unsigned long psscr_val);
|
extern unsigned long isa300_idle_stop_noloss(unsigned long psscr_val);
|
||||||
extern unsigned long isa300_idle_stop_mayloss(unsigned long psscr_val);
|
extern unsigned long isa300_idle_stop_mayloss(unsigned long psscr_val);
|
||||||
|
|
|
@ -34,7 +34,7 @@ static inline long find_zero(unsigned long mask)
|
||||||
return leading_zero_bits >> 3;
|
return leading_zero_bits >> 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool has_zero(unsigned long val, unsigned long *data, const struct word_at_a_time *c)
|
static inline unsigned long has_zero(unsigned long val, unsigned long *data, const struct word_at_a_time *c)
|
||||||
{
|
{
|
||||||
unsigned long rhs = val | c->low_bits;
|
unsigned long rhs = val | c->low_bits;
|
||||||
*data = rhs;
|
*data = rhs;
|
||||||
|
|
|
@ -375,8 +375,7 @@ _GLOBAL(generic_secondary_smp_init)
|
||||||
beq 20f
|
beq 20f
|
||||||
|
|
||||||
/* start the specified thread */
|
/* start the specified thread */
|
||||||
LOAD_REG_ADDR(r5, fsl_secondary_thread_init)
|
LOAD_REG_ADDR(r5, DOTSYM(fsl_secondary_thread_init))
|
||||||
ld r4, 0(r5)
|
|
||||||
bl book3e_start_thread
|
bl book3e_start_thread
|
||||||
|
|
||||||
/* stop the current thread */
|
/* stop the current thread */
|
||||||
|
|
|
@ -33,6 +33,9 @@
|
||||||
* and then arrange for the ftrace function to be called.
|
* and then arrange for the ftrace function to be called.
|
||||||
*/
|
*/
|
||||||
.macro ftrace_regs_entry allregs
|
.macro ftrace_regs_entry allregs
|
||||||
|
/* Create a minimal stack frame for representing B */
|
||||||
|
PPC_STLU r1, -STACK_FRAME_MIN_SIZE(r1)
|
||||||
|
|
||||||
/* Create our stack frame + pt_regs */
|
/* Create our stack frame + pt_regs */
|
||||||
PPC_STLU r1,-SWITCH_FRAME_SIZE(r1)
|
PPC_STLU r1,-SWITCH_FRAME_SIZE(r1)
|
||||||
|
|
||||||
|
@ -42,7 +45,7 @@
|
||||||
|
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
/* Save the original return address in A's stack frame */
|
/* Save the original return address in A's stack frame */
|
||||||
std r0, LRSAVE+SWITCH_FRAME_SIZE(r1)
|
std r0, LRSAVE+SWITCH_FRAME_SIZE+STACK_FRAME_MIN_SIZE(r1)
|
||||||
/* Ok to continue? */
|
/* Ok to continue? */
|
||||||
lbz r3, PACA_FTRACE_ENABLED(r13)
|
lbz r3, PACA_FTRACE_ENABLED(r13)
|
||||||
cmpdi r3, 0
|
cmpdi r3, 0
|
||||||
|
@ -77,6 +80,8 @@
|
||||||
mflr r7
|
mflr r7
|
||||||
/* Save it as pt_regs->nip */
|
/* Save it as pt_regs->nip */
|
||||||
PPC_STL r7, _NIP(r1)
|
PPC_STL r7, _NIP(r1)
|
||||||
|
/* Also save it in B's stackframe header for proper unwind */
|
||||||
|
PPC_STL r7, LRSAVE+SWITCH_FRAME_SIZE(r1)
|
||||||
/* Save the read LR in pt_regs->link */
|
/* Save the read LR in pt_regs->link */
|
||||||
PPC_STL r0, _LINK(r1)
|
PPC_STL r0, _LINK(r1)
|
||||||
|
|
||||||
|
@ -142,7 +147,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Pop our stack frame */
|
/* Pop our stack frame */
|
||||||
addi r1, r1, SWITCH_FRAME_SIZE
|
addi r1, r1, SWITCH_FRAME_SIZE+STACK_FRAME_MIN_SIZE
|
||||||
|
|
||||||
#ifdef CONFIG_LIVEPATCH_64
|
#ifdef CONFIG_LIVEPATCH_64
|
||||||
/* Based on the cmpd above, if the NIP was altered handle livepatch */
|
/* Based on the cmpd above, if the NIP was altered handle livepatch */
|
||||||
|
|
|
@ -314,8 +314,7 @@ void __ref vmemmap_free(unsigned long start, unsigned long end,
|
||||||
start = ALIGN_DOWN(start, page_size);
|
start = ALIGN_DOWN(start, page_size);
|
||||||
if (altmap) {
|
if (altmap) {
|
||||||
alt_start = altmap->base_pfn;
|
alt_start = altmap->base_pfn;
|
||||||
alt_end = altmap->base_pfn + altmap->reserve +
|
alt_end = altmap->base_pfn + altmap->reserve + altmap->free;
|
||||||
altmap->free + altmap->alloc + altmap->align;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_debug("vmemmap_free %lx...%lx\n", start, end);
|
pr_debug("vmemmap_free %lx...%lx\n", start, end);
|
||||||
|
|
|
@ -180,7 +180,7 @@ static void wake_hw_thread(void *info)
|
||||||
unsigned long inia;
|
unsigned long inia;
|
||||||
int cpu = *(const int *)info;
|
int cpu = *(const int *)info;
|
||||||
|
|
||||||
inia = *(unsigned long *)fsl_secondary_thread_init;
|
inia = ppc_function_entry(fsl_secondary_thread_init);
|
||||||
book3e_start_thread(cpu_thread_in_core(cpu), inia);
|
book3e_start_thread(cpu_thread_in_core(cpu), inia);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
#include <linux/rtc.h>
|
#include <linux/rtc.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
|
|
||||||
|
#include <asm/early_ioremap.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
#include <asm/io.h>
|
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
#include <asm/nvram.h>
|
#include <asm/nvram.h>
|
||||||
|
@ -182,7 +182,7 @@ static int __init via_calibrate_decr(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
of_node_put(vias);
|
of_node_put(vias);
|
||||||
via = ioremap(rsrc.start, resource_size(&rsrc));
|
via = early_ioremap(rsrc.start, resource_size(&rsrc));
|
||||||
if (via == NULL) {
|
if (via == NULL) {
|
||||||
printk(KERN_ERR "Failed to map VIA for timer calibration !\n");
|
printk(KERN_ERR "Failed to map VIA for timer calibration !\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -207,7 +207,7 @@ static int __init via_calibrate_decr(void)
|
||||||
|
|
||||||
ppc_tb_freq = (dstart - dend) * 100 / 6;
|
ppc_tb_freq = (dstart - dend) * 100 / 6;
|
||||||
|
|
||||||
iounmap(via);
|
early_iounmap((void *)via, resource_size(&rsrc));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ typedef u64 phys_cpuid_t;
|
||||||
#define PHYS_CPUID_INVALID INVALID_HARTID
|
#define PHYS_CPUID_INVALID INVALID_HARTID
|
||||||
|
|
||||||
/* ACPI table mapping after acpi_permanent_mmap is set */
|
/* ACPI table mapping after acpi_permanent_mmap is set */
|
||||||
void *acpi_os_ioremap(acpi_physical_address phys, acpi_size size);
|
void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size);
|
||||||
#define acpi_os_ioremap acpi_os_ioremap
|
#define acpi_os_ioremap acpi_os_ioremap
|
||||||
|
|
||||||
#define acpi_strict 1 /* No out-of-spec workarounds on RISC-V */
|
#define acpi_strict 1 /* No out-of-spec workarounds on RISC-V */
|
||||||
|
|
|
@ -37,6 +37,10 @@ static inline void flush_dcache_page(struct page *page)
|
||||||
#define flush_icache_user_page(vma, pg, addr, len) \
|
#define flush_icache_user_page(vma, pg, addr, len) \
|
||||||
flush_icache_mm(vma->vm_mm, 0)
|
flush_icache_mm(vma->vm_mm, 0)
|
||||||
|
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
#define flush_cache_vmap(start, end) flush_tlb_kernel_range(start, end)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef CONFIG_SMP
|
#ifndef CONFIG_SMP
|
||||||
|
|
||||||
#define flush_icache_all() local_flush_icache_all()
|
#define flush_icache_all() local_flush_icache_all()
|
||||||
|
|
|
@ -101,9 +101,9 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)
|
||||||
* Relaxed I/O memory access primitives. These follow the Device memory
|
* Relaxed I/O memory access primitives. These follow the Device memory
|
||||||
* ordering rules but do not guarantee any ordering relative to Normal memory
|
* ordering rules but do not guarantee any ordering relative to Normal memory
|
||||||
* accesses. These are defined to order the indicated access (either a read or
|
* accesses. These are defined to order the indicated access (either a read or
|
||||||
* write) with all other I/O memory accesses. Since the platform specification
|
* write) with all other I/O memory accesses to the same peripheral. Since the
|
||||||
* defines that all I/O regions are strongly ordered on channel 2, no explicit
|
* platform specification defines that all I/O regions are strongly ordered on
|
||||||
* fences are required to enforce this ordering.
|
* channel 0, no explicit fences are required to enforce this ordering.
|
||||||
*/
|
*/
|
||||||
/* FIXME: These are now the same as asm-generic */
|
/* FIXME: These are now the same as asm-generic */
|
||||||
#define __io_rbr() do {} while (0)
|
#define __io_rbr() do {} while (0)
|
||||||
|
@ -125,14 +125,14 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* I/O memory access primitives. Reads are ordered relative to any
|
* I/O memory access primitives. Reads are ordered relative to any following
|
||||||
* following Normal memory access. Writes are ordered relative to any prior
|
* Normal memory read and delay() loop. Writes are ordered relative to any
|
||||||
* Normal memory access. The memory barriers here are necessary as RISC-V
|
* prior Normal memory write. The memory barriers here are necessary as RISC-V
|
||||||
* doesn't define any ordering between the memory space and the I/O space.
|
* doesn't define any ordering between the memory space and the I/O space.
|
||||||
*/
|
*/
|
||||||
#define __io_br() do {} while (0)
|
#define __io_br() do {} while (0)
|
||||||
#define __io_ar(v) __asm__ __volatile__ ("fence i,r" : : : "memory")
|
#define __io_ar(v) ({ __asm__ __volatile__ ("fence i,ir" : : : "memory"); })
|
||||||
#define __io_bw() __asm__ __volatile__ ("fence w,o" : : : "memory")
|
#define __io_bw() ({ __asm__ __volatile__ ("fence w,o" : : : "memory"); })
|
||||||
#define __io_aw() mmiowb_set_pending()
|
#define __io_aw() mmiowb_set_pending()
|
||||||
|
|
||||||
#define readb(c) ({ u8 __v; __io_br(); __v = readb_cpu(c); __io_ar(__v); __v; })
|
#define readb(c) ({ u8 __v; __io_br(); __v = readb_cpu(c); __io_ar(__v); __v; })
|
||||||
|
|
|
@ -188,6 +188,8 @@ extern struct pt_alloc_ops pt_ops __initdata;
|
||||||
#define PAGE_KERNEL_IO __pgprot(_PAGE_IOREMAP)
|
#define PAGE_KERNEL_IO __pgprot(_PAGE_IOREMAP)
|
||||||
|
|
||||||
extern pgd_t swapper_pg_dir[];
|
extern pgd_t swapper_pg_dir[];
|
||||||
|
extern pgd_t trampoline_pg_dir[];
|
||||||
|
extern pgd_t early_pg_dir[];
|
||||||
|
|
||||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||||
static inline int pmd_present(pmd_t pmd)
|
static inline int pmd_present(pmd_t pmd)
|
||||||
|
|
|
@ -3,12 +3,14 @@
|
||||||
|
|
||||||
#ifdef CONFIG_HAVE_ARCH_HUGE_VMAP
|
#ifdef CONFIG_HAVE_ARCH_HUGE_VMAP
|
||||||
|
|
||||||
|
extern bool pgtable_l4_enabled, pgtable_l5_enabled;
|
||||||
|
|
||||||
#define IOREMAP_MAX_ORDER (PUD_SHIFT)
|
#define IOREMAP_MAX_ORDER (PUD_SHIFT)
|
||||||
|
|
||||||
#define arch_vmap_pud_supported arch_vmap_pud_supported
|
#define arch_vmap_pud_supported arch_vmap_pud_supported
|
||||||
static inline bool arch_vmap_pud_supported(pgprot_t prot)
|
static inline bool arch_vmap_pud_supported(pgprot_t prot)
|
||||||
{
|
{
|
||||||
return true;
|
return pgtable_l4_enabled || pgtable_l5_enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define arch_vmap_pmd_supported arch_vmap_pmd_supported
|
#define arch_vmap_pmd_supported arch_vmap_pmd_supported
|
||||||
|
|
|
@ -215,9 +215,9 @@ void __init __acpi_unmap_table(void __iomem *map, unsigned long size)
|
||||||
early_iounmap(map, size);
|
early_iounmap(map, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *acpi_os_ioremap(acpi_physical_address phys, acpi_size size)
|
void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size)
|
||||||
{
|
{
|
||||||
return memremap(phys, size, MEMREMAP_WB);
|
return (void __iomem *)memremap(phys, size, MEMREMAP_WB);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
|
|
|
@ -17,6 +17,11 @@
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
|
||||||
|
bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
|
||||||
|
{
|
||||||
|
return phys_id == cpuid_to_hartid_map(cpu);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns the hart ID of the given device tree node, or -ENODEV if the node
|
* Returns the hart ID of the given device tree node, or -ENODEV if the node
|
||||||
* isn't an enabled and valid RISC-V hart node.
|
* isn't an enabled and valid RISC-V hart node.
|
||||||
|
|
|
@ -18,4 +18,6 @@ void arch_crash_save_vmcoreinfo(void)
|
||||||
vmcoreinfo_append_str("NUMBER(MODULES_END)=0x%lx\n", MODULES_END);
|
vmcoreinfo_append_str("NUMBER(MODULES_END)=0x%lx\n", MODULES_END);
|
||||||
#endif
|
#endif
|
||||||
vmcoreinfo_append_str("NUMBER(KERNEL_LINK_ADDR)=0x%lx\n", KERNEL_LINK_ADDR);
|
vmcoreinfo_append_str("NUMBER(KERNEL_LINK_ADDR)=0x%lx\n", KERNEL_LINK_ADDR);
|
||||||
|
vmcoreinfo_append_str("NUMBER(va_kernel_pa_offset)=0x%lx\n",
|
||||||
|
kernel_map.va_kernel_pa_offset);
|
||||||
}
|
}
|
||||||
|
|
|
@ -281,7 +281,7 @@ static void *elf_kexec_load(struct kimage *image, char *kernel_buf,
|
||||||
kbuf.buffer = initrd;
|
kbuf.buffer = initrd;
|
||||||
kbuf.bufsz = kbuf.memsz = initrd_len;
|
kbuf.bufsz = kbuf.memsz = initrd_len;
|
||||||
kbuf.buf_align = PAGE_SIZE;
|
kbuf.buf_align = PAGE_SIZE;
|
||||||
kbuf.top_down = false;
|
kbuf.top_down = true;
|
||||||
kbuf.mem = KEXEC_BUF_MEM_UNKNOWN;
|
kbuf.mem = KEXEC_BUF_MEM_UNKNOWN;
|
||||||
ret = kexec_add_buffer(&kbuf);
|
ret = kexec_add_buffer(&kbuf);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -425,6 +425,7 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
|
||||||
* sym, instead of searching the whole relsec.
|
* sym, instead of searching the whole relsec.
|
||||||
*/
|
*/
|
||||||
case R_RISCV_PCREL_HI20:
|
case R_RISCV_PCREL_HI20:
|
||||||
|
case R_RISCV_CALL_PLT:
|
||||||
case R_RISCV_CALL:
|
case R_RISCV_CALL:
|
||||||
*(u64 *)loc = CLEAN_IMM(UITYPE, *(u64 *)loc) |
|
*(u64 *)loc = CLEAN_IMM(UITYPE, *(u64 *)loc) |
|
||||||
ENCODE_UJTYPE_IMM(val - addr);
|
ENCODE_UJTYPE_IMM(val - addr);
|
||||||
|
|
|
@ -61,11 +61,6 @@ int riscv_hartid_to_cpuid(unsigned long hartid)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
|
|
||||||
{
|
|
||||||
return phys_id == cpuid_to_hartid_map(cpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ipi_stop(void)
|
static void ipi_stop(void)
|
||||||
{
|
{
|
||||||
set_cpu_online(smp_processor_id(), false);
|
set_cpu_online(smp_processor_id(), false);
|
||||||
|
|
|
@ -26,12 +26,13 @@
|
||||||
#include <linux/kfence.h>
|
#include <linux/kfence.h>
|
||||||
|
|
||||||
#include <asm/fixmap.h>
|
#include <asm/fixmap.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/io.h>
|
||||||
|
#include <asm/numa.h>
|
||||||
|
#include <asm/pgtable.h>
|
||||||
|
#include <asm/ptdump.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
#include <asm/soc.h>
|
#include <asm/soc.h>
|
||||||
#include <asm/io.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/ptdump.h>
|
|
||||||
#include <asm/numa.h>
|
|
||||||
|
|
||||||
#include "../kernel/head.h"
|
#include "../kernel/head.h"
|
||||||
|
|
||||||
|
@ -214,8 +215,13 @@ static void __init setup_bootmem(void)
|
||||||
memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start);
|
memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start);
|
||||||
|
|
||||||
phys_ram_end = memblock_end_of_DRAM();
|
phys_ram_end = memblock_end_of_DRAM();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure we align the start of the memory on a PMD boundary so that
|
||||||
|
* at worst, we map the linear mapping with PMD mappings.
|
||||||
|
*/
|
||||||
if (!IS_ENABLED(CONFIG_XIP_KERNEL))
|
if (!IS_ENABLED(CONFIG_XIP_KERNEL))
|
||||||
phys_ram_base = memblock_start_of_DRAM();
|
phys_ram_base = memblock_start_of_DRAM() & PMD_MASK;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In 64-bit, any use of __va/__pa before this point is wrong as we
|
* In 64-bit, any use of __va/__pa before this point is wrong as we
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
* region is not and then we have to go down to the PUD level.
|
* region is not and then we have to go down to the PUD level.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern pgd_t early_pg_dir[PTRS_PER_PGD];
|
|
||||||
pgd_t tmp_pg_dir[PTRS_PER_PGD] __page_aligned_bss;
|
pgd_t tmp_pg_dir[PTRS_PER_PGD] __page_aligned_bss;
|
||||||
p4d_t tmp_p4d[PTRS_PER_P4D] __page_aligned_bss;
|
p4d_t tmp_p4d[PTRS_PER_P4D] __page_aligned_bss;
|
||||||
pud_t tmp_pud[PTRS_PER_PUD] __page_aligned_bss;
|
pud_t tmp_pud[PTRS_PER_PUD] __page_aligned_bss;
|
||||||
|
|
|
@ -116,7 +116,6 @@ CONFIG_UNIX=y
|
||||||
CONFIG_UNIX_DIAG=m
|
CONFIG_UNIX_DIAG=m
|
||||||
CONFIG_XFRM_USER=m
|
CONFIG_XFRM_USER=m
|
||||||
CONFIG_NET_KEY=m
|
CONFIG_NET_KEY=m
|
||||||
CONFIG_NET_TC_SKB_EXT=y
|
|
||||||
CONFIG_SMC=m
|
CONFIG_SMC=m
|
||||||
CONFIG_SMC_DIAG=m
|
CONFIG_SMC_DIAG=m
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
|
@ -193,6 +192,7 @@ CONFIG_NFT_REJECT=m
|
||||||
CONFIG_NFT_COMPAT=m
|
CONFIG_NFT_COMPAT=m
|
||||||
CONFIG_NFT_HASH=m
|
CONFIG_NFT_HASH=m
|
||||||
CONFIG_NFT_FIB_INET=m
|
CONFIG_NFT_FIB_INET=m
|
||||||
|
CONFIG_NETFILTER_XTABLES_COMPAT=y
|
||||||
CONFIG_NETFILTER_XT_SET=m
|
CONFIG_NETFILTER_XT_SET=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
|
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||||
|
@ -379,6 +379,7 @@ CONFIG_NET_ACT_SIMP=m
|
||||||
CONFIG_NET_ACT_SKBEDIT=m
|
CONFIG_NET_ACT_SKBEDIT=m
|
||||||
CONFIG_NET_ACT_CSUM=m
|
CONFIG_NET_ACT_CSUM=m
|
||||||
CONFIG_NET_ACT_GATE=m
|
CONFIG_NET_ACT_GATE=m
|
||||||
|
CONFIG_NET_TC_SKB_EXT=y
|
||||||
CONFIG_DNS_RESOLVER=y
|
CONFIG_DNS_RESOLVER=y
|
||||||
CONFIG_OPENVSWITCH=m
|
CONFIG_OPENVSWITCH=m
|
||||||
CONFIG_VSOCKETS=m
|
CONFIG_VSOCKETS=m
|
||||||
|
@ -395,6 +396,7 @@ CONFIG_HOTPLUG_PCI=y
|
||||||
CONFIG_HOTPLUG_PCI_S390=y
|
CONFIG_HOTPLUG_PCI_S390=y
|
||||||
CONFIG_DEVTMPFS=y
|
CONFIG_DEVTMPFS=y
|
||||||
CONFIG_DEVTMPFS_SAFE=y
|
CONFIG_DEVTMPFS_SAFE=y
|
||||||
|
# CONFIG_FW_LOADER is not set
|
||||||
CONFIG_CONNECTOR=y
|
CONFIG_CONNECTOR=y
|
||||||
CONFIG_ZRAM=y
|
CONFIG_ZRAM=y
|
||||||
CONFIG_BLK_DEV_LOOP=m
|
CONFIG_BLK_DEV_LOOP=m
|
||||||
|
@ -502,7 +504,6 @@ CONFIG_NLMON=m
|
||||||
# CONFIG_NET_VENDOR_GOOGLE is not set
|
# CONFIG_NET_VENDOR_GOOGLE is not set
|
||||||
# CONFIG_NET_VENDOR_HUAWEI is not set
|
# CONFIG_NET_VENDOR_HUAWEI is not set
|
||||||
# CONFIG_NET_VENDOR_INTEL is not set
|
# CONFIG_NET_VENDOR_INTEL is not set
|
||||||
# CONFIG_NET_VENDOR_WANGXUN is not set
|
|
||||||
# CONFIG_NET_VENDOR_LITEX is not set
|
# CONFIG_NET_VENDOR_LITEX is not set
|
||||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||||
CONFIG_MLX4_EN=m
|
CONFIG_MLX4_EN=m
|
||||||
|
@ -542,6 +543,7 @@ CONFIG_MLX5_CORE_EN=y
|
||||||
# CONFIG_NET_VENDOR_TI is not set
|
# CONFIG_NET_VENDOR_TI is not set
|
||||||
# CONFIG_NET_VENDOR_VERTEXCOM is not set
|
# CONFIG_NET_VENDOR_VERTEXCOM is not set
|
||||||
# CONFIG_NET_VENDOR_VIA is not set
|
# CONFIG_NET_VENDOR_VIA is not set
|
||||||
|
# CONFIG_NET_VENDOR_WANGXUN is not set
|
||||||
# CONFIG_NET_VENDOR_WIZNET is not set
|
# CONFIG_NET_VENDOR_WIZNET is not set
|
||||||
# CONFIG_NET_VENDOR_XILINX is not set
|
# CONFIG_NET_VENDOR_XILINX is not set
|
||||||
CONFIG_PPP=m
|
CONFIG_PPP=m
|
||||||
|
@ -646,7 +648,6 @@ CONFIG_TMPFS=y
|
||||||
CONFIG_TMPFS_POSIX_ACL=y
|
CONFIG_TMPFS_POSIX_ACL=y
|
||||||
CONFIG_TMPFS_INODE64=y
|
CONFIG_TMPFS_INODE64=y
|
||||||
CONFIG_HUGETLBFS=y
|
CONFIG_HUGETLBFS=y
|
||||||
CONFIG_CONFIGFS_FS=m
|
|
||||||
CONFIG_ECRYPT_FS=m
|
CONFIG_ECRYPT_FS=m
|
||||||
CONFIG_CRAMFS=m
|
CONFIG_CRAMFS=m
|
||||||
CONFIG_SQUASHFS=m
|
CONFIG_SQUASHFS=m
|
||||||
|
@ -690,7 +691,6 @@ CONFIG_HARDENED_USERCOPY=y
|
||||||
CONFIG_FORTIFY_SOURCE=y
|
CONFIG_FORTIFY_SOURCE=y
|
||||||
CONFIG_SECURITY_SELINUX=y
|
CONFIG_SECURITY_SELINUX=y
|
||||||
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
|
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
|
||||||
CONFIG_SECURITY_SELINUX_DISABLE=y
|
|
||||||
CONFIG_SECURITY_LOCKDOWN_LSM=y
|
CONFIG_SECURITY_LOCKDOWN_LSM=y
|
||||||
CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y
|
CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y
|
||||||
CONFIG_SECURITY_LANDLOCK=y
|
CONFIG_SECURITY_LANDLOCK=y
|
||||||
|
@ -744,7 +744,6 @@ CONFIG_CRYPTO_MD4=m
|
||||||
CONFIG_CRYPTO_MD5=y
|
CONFIG_CRYPTO_MD5=y
|
||||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||||
CONFIG_CRYPTO_RMD160=m
|
CONFIG_CRYPTO_RMD160=m
|
||||||
CONFIG_CRYPTO_SHA3=m
|
|
||||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||||
CONFIG_CRYPTO_VMAC=m
|
CONFIG_CRYPTO_VMAC=m
|
||||||
CONFIG_CRYPTO_WP512=m
|
CONFIG_CRYPTO_WP512=m
|
||||||
|
@ -844,6 +843,7 @@ CONFIG_PREEMPT_TRACER=y
|
||||||
CONFIG_SCHED_TRACER=y
|
CONFIG_SCHED_TRACER=y
|
||||||
CONFIG_FTRACE_SYSCALLS=y
|
CONFIG_FTRACE_SYSCALLS=y
|
||||||
CONFIG_BLK_DEV_IO_TRACE=y
|
CONFIG_BLK_DEV_IO_TRACE=y
|
||||||
|
CONFIG_USER_EVENTS=y
|
||||||
CONFIG_HIST_TRIGGERS=y
|
CONFIG_HIST_TRIGGERS=y
|
||||||
CONFIG_FTRACE_STARTUP_TEST=y
|
CONFIG_FTRACE_STARTUP_TEST=y
|
||||||
# CONFIG_EVENT_TRACE_STARTUP_TEST is not set
|
# CONFIG_EVENT_TRACE_STARTUP_TEST is not set
|
||||||
|
@ -866,6 +866,7 @@ CONFIG_FAIL_MAKE_REQUEST=y
|
||||||
CONFIG_FAIL_IO_TIMEOUT=y
|
CONFIG_FAIL_IO_TIMEOUT=y
|
||||||
CONFIG_FAIL_FUTEX=y
|
CONFIG_FAIL_FUTEX=y
|
||||||
CONFIG_FAULT_INJECTION_DEBUG_FS=y
|
CONFIG_FAULT_INJECTION_DEBUG_FS=y
|
||||||
|
CONFIG_FAULT_INJECTION_CONFIGFS=y
|
||||||
CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
|
CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
|
||||||
CONFIG_LKDTM=m
|
CONFIG_LKDTM=m
|
||||||
CONFIG_TEST_MIN_HEAP=y
|
CONFIG_TEST_MIN_HEAP=y
|
||||||
|
|
|
@ -107,7 +107,6 @@ CONFIG_UNIX=y
|
||||||
CONFIG_UNIX_DIAG=m
|
CONFIG_UNIX_DIAG=m
|
||||||
CONFIG_XFRM_USER=m
|
CONFIG_XFRM_USER=m
|
||||||
CONFIG_NET_KEY=m
|
CONFIG_NET_KEY=m
|
||||||
CONFIG_NET_TC_SKB_EXT=y
|
|
||||||
CONFIG_SMC=m
|
CONFIG_SMC=m
|
||||||
CONFIG_SMC_DIAG=m
|
CONFIG_SMC_DIAG=m
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
|
@ -184,6 +183,7 @@ CONFIG_NFT_REJECT=m
|
||||||
CONFIG_NFT_COMPAT=m
|
CONFIG_NFT_COMPAT=m
|
||||||
CONFIG_NFT_HASH=m
|
CONFIG_NFT_HASH=m
|
||||||
CONFIG_NFT_FIB_INET=m
|
CONFIG_NFT_FIB_INET=m
|
||||||
|
CONFIG_NETFILTER_XTABLES_COMPAT=y
|
||||||
CONFIG_NETFILTER_XT_SET=m
|
CONFIG_NETFILTER_XT_SET=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
|
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
|
||||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||||
|
@ -369,6 +369,7 @@ CONFIG_NET_ACT_SIMP=m
|
||||||
CONFIG_NET_ACT_SKBEDIT=m
|
CONFIG_NET_ACT_SKBEDIT=m
|
||||||
CONFIG_NET_ACT_CSUM=m
|
CONFIG_NET_ACT_CSUM=m
|
||||||
CONFIG_NET_ACT_GATE=m
|
CONFIG_NET_ACT_GATE=m
|
||||||
|
CONFIG_NET_TC_SKB_EXT=y
|
||||||
CONFIG_DNS_RESOLVER=y
|
CONFIG_DNS_RESOLVER=y
|
||||||
CONFIG_OPENVSWITCH=m
|
CONFIG_OPENVSWITCH=m
|
||||||
CONFIG_VSOCKETS=m
|
CONFIG_VSOCKETS=m
|
||||||
|
@ -385,6 +386,7 @@ CONFIG_HOTPLUG_PCI_S390=y
|
||||||
CONFIG_UEVENT_HELPER=y
|
CONFIG_UEVENT_HELPER=y
|
||||||
CONFIG_DEVTMPFS=y
|
CONFIG_DEVTMPFS=y
|
||||||
CONFIG_DEVTMPFS_SAFE=y
|
CONFIG_DEVTMPFS_SAFE=y
|
||||||
|
# CONFIG_FW_LOADER is not set
|
||||||
CONFIG_CONNECTOR=y
|
CONFIG_CONNECTOR=y
|
||||||
CONFIG_ZRAM=y
|
CONFIG_ZRAM=y
|
||||||
CONFIG_BLK_DEV_LOOP=m
|
CONFIG_BLK_DEV_LOOP=m
|
||||||
|
@ -492,7 +494,6 @@ CONFIG_NLMON=m
|
||||||
# CONFIG_NET_VENDOR_GOOGLE is not set
|
# CONFIG_NET_VENDOR_GOOGLE is not set
|
||||||
# CONFIG_NET_VENDOR_HUAWEI is not set
|
# CONFIG_NET_VENDOR_HUAWEI is not set
|
||||||
# CONFIG_NET_VENDOR_INTEL is not set
|
# CONFIG_NET_VENDOR_INTEL is not set
|
||||||
# CONFIG_NET_VENDOR_WANGXUN is not set
|
|
||||||
# CONFIG_NET_VENDOR_LITEX is not set
|
# CONFIG_NET_VENDOR_LITEX is not set
|
||||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||||
CONFIG_MLX4_EN=m
|
CONFIG_MLX4_EN=m
|
||||||
|
@ -532,6 +533,7 @@ CONFIG_MLX5_CORE_EN=y
|
||||||
# CONFIG_NET_VENDOR_TI is not set
|
# CONFIG_NET_VENDOR_TI is not set
|
||||||
# CONFIG_NET_VENDOR_VERTEXCOM is not set
|
# CONFIG_NET_VENDOR_VERTEXCOM is not set
|
||||||
# CONFIG_NET_VENDOR_VIA is not set
|
# CONFIG_NET_VENDOR_VIA is not set
|
||||||
|
# CONFIG_NET_VENDOR_WANGXUN is not set
|
||||||
# CONFIG_NET_VENDOR_WIZNET is not set
|
# CONFIG_NET_VENDOR_WIZNET is not set
|
||||||
# CONFIG_NET_VENDOR_XILINX is not set
|
# CONFIG_NET_VENDOR_XILINX is not set
|
||||||
CONFIG_PPP=m
|
CONFIG_PPP=m
|
||||||
|
@ -673,7 +675,6 @@ CONFIG_SECURITY=y
|
||||||
CONFIG_SECURITY_NETWORK=y
|
CONFIG_SECURITY_NETWORK=y
|
||||||
CONFIG_SECURITY_SELINUX=y
|
CONFIG_SECURITY_SELINUX=y
|
||||||
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
|
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
|
||||||
CONFIG_SECURITY_SELINUX_DISABLE=y
|
|
||||||
CONFIG_SECURITY_LOCKDOWN_LSM=y
|
CONFIG_SECURITY_LOCKDOWN_LSM=y
|
||||||
CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y
|
CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y
|
||||||
CONFIG_SECURITY_LANDLOCK=y
|
CONFIG_SECURITY_LANDLOCK=y
|
||||||
|
@ -729,7 +730,6 @@ CONFIG_CRYPTO_MD4=m
|
||||||
CONFIG_CRYPTO_MD5=y
|
CONFIG_CRYPTO_MD5=y
|
||||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||||
CONFIG_CRYPTO_RMD160=m
|
CONFIG_CRYPTO_RMD160=m
|
||||||
CONFIG_CRYPTO_SHA3=m
|
|
||||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||||
CONFIG_CRYPTO_VMAC=m
|
CONFIG_CRYPTO_VMAC=m
|
||||||
CONFIG_CRYPTO_WP512=m
|
CONFIG_CRYPTO_WP512=m
|
||||||
|
@ -793,6 +793,7 @@ CONFIG_STACK_TRACER=y
|
||||||
CONFIG_SCHED_TRACER=y
|
CONFIG_SCHED_TRACER=y
|
||||||
CONFIG_FTRACE_SYSCALLS=y
|
CONFIG_FTRACE_SYSCALLS=y
|
||||||
CONFIG_BLK_DEV_IO_TRACE=y
|
CONFIG_BLK_DEV_IO_TRACE=y
|
||||||
|
CONFIG_USER_EVENTS=y
|
||||||
CONFIG_HIST_TRIGGERS=y
|
CONFIG_HIST_TRIGGERS=y
|
||||||
CONFIG_SAMPLES=y
|
CONFIG_SAMPLES=y
|
||||||
CONFIG_SAMPLE_TRACE_PRINTK=m
|
CONFIG_SAMPLE_TRACE_PRINTK=m
|
||||||
|
|
|
@ -53,7 +53,6 @@ CONFIG_ZFCP=y
|
||||||
# CONFIG_HVC_IUCV is not set
|
# CONFIG_HVC_IUCV is not set
|
||||||
# CONFIG_HW_RANDOM_S390 is not set
|
# CONFIG_HW_RANDOM_S390 is not set
|
||||||
# CONFIG_HMC_DRV is not set
|
# CONFIG_HMC_DRV is not set
|
||||||
# CONFIG_S390_UV_UAPI is not set
|
|
||||||
# CONFIG_S390_TAPE is not set
|
# CONFIG_S390_TAPE is not set
|
||||||
# CONFIG_VMCP is not set
|
# CONFIG_VMCP is not set
|
||||||
# CONFIG_MONWRITER is not set
|
# CONFIG_MONWRITER is not set
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#ifndef _UAPI_S390_PTRACE_H
|
#ifndef _UAPI_S390_PTRACE_H
|
||||||
#define _UAPI_S390_PTRACE_H
|
#define _UAPI_S390_PTRACE_H
|
||||||
|
|
||||||
|
#include <linux/const.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offsets in the user_regs_struct. They are used for the ptrace
|
* Offsets in the user_regs_struct. They are used for the ptrace
|
||||||
* system call and in entry.S
|
* system call and in entry.S
|
||||||
|
|
|
@ -459,9 +459,9 @@ static int sthyi_update_cache(u64 *rc)
|
||||||
*
|
*
|
||||||
* Fills the destination with system information returned by the STHYI
|
* Fills the destination with system information returned by the STHYI
|
||||||
* instruction. The data is generated by emulation or execution of STHYI,
|
* instruction. The data is generated by emulation or execution of STHYI,
|
||||||
* if available. The return value is the condition code that would be
|
* if available. The return value is either a negative error value or
|
||||||
* returned, the rc parameter is the return code which is passed in
|
* the condition code that would be returned, the rc parameter is the
|
||||||
* register R2 + 1.
|
* return code which is passed in register R2 + 1.
|
||||||
*/
|
*/
|
||||||
int sthyi_fill(void *dst, u64 *rc)
|
int sthyi_fill(void *dst, u64 *rc)
|
||||||
{
|
{
|
||||||
|
|
|
@ -389,8 +389,8 @@ static int handle_partial_execution(struct kvm_vcpu *vcpu)
|
||||||
*/
|
*/
|
||||||
int handle_sthyi(struct kvm_vcpu *vcpu)
|
int handle_sthyi(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
int reg1, reg2, r = 0;
|
int reg1, reg2, cc = 0, r = 0;
|
||||||
u64 code, addr, cc = 0, rc = 0;
|
u64 code, addr, rc = 0;
|
||||||
struct sthyi_sctns *sctns = NULL;
|
struct sthyi_sctns *sctns = NULL;
|
||||||
|
|
||||||
if (!test_kvm_facility(vcpu->kvm, 74))
|
if (!test_kvm_facility(vcpu->kvm, 74))
|
||||||
|
@ -421,7 +421,10 @@ int handle_sthyi(struct kvm_vcpu *vcpu)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
cc = sthyi_fill(sctns, &rc);
|
cc = sthyi_fill(sctns, &rc);
|
||||||
|
if (cc < 0) {
|
||||||
|
free_page((unsigned long)sctns);
|
||||||
|
return cc;
|
||||||
|
}
|
||||||
out:
|
out:
|
||||||
if (!cc) {
|
if (!cc) {
|
||||||
if (kvm_s390_pv_cpu_is_protected(vcpu)) {
|
if (kvm_s390_pv_cpu_is_protected(vcpu)) {
|
||||||
|
|
|
@ -763,6 +763,8 @@ void __init vmem_map_init(void)
|
||||||
if (static_key_enabled(&cpu_has_bear))
|
if (static_key_enabled(&cpu_has_bear))
|
||||||
set_memory_nx(0, 1);
|
set_memory_nx(0, 1);
|
||||||
set_memory_nx(PAGE_SIZE, 1);
|
set_memory_nx(PAGE_SIZE, 1);
|
||||||
|
if (debug_pagealloc_enabled())
|
||||||
|
set_memory_4k(0, ident_map_size >> PAGE_SHIFT);
|
||||||
|
|
||||||
pr_info("Write protected kernel read-only data: %luk\n",
|
pr_info("Write protected kernel read-only data: %luk\n",
|
||||||
(unsigned long)(__end_rodata - _stext) >> 10);
|
(unsigned long)(__end_rodata - _stext) >> 10);
|
||||||
|
|
|
@ -213,7 +213,6 @@ unsigned long __get_wchan(struct task_struct *task);
|
||||||
*/
|
*/
|
||||||
#define ARCH_HAS_PREFETCH
|
#define ARCH_HAS_PREFETCH
|
||||||
#define ARCH_HAS_PREFETCHW
|
#define ARCH_HAS_PREFETCHW
|
||||||
#define ARCH_HAS_SPINLOCK_PREFETCH
|
|
||||||
|
|
||||||
static inline void prefetch(const void *x)
|
static inline void prefetch(const void *x)
|
||||||
{
|
{
|
||||||
|
@ -239,8 +238,6 @@ static inline void prefetchw(const void *x)
|
||||||
: "r" (x));
|
: "r" (x));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define spin_lock_prefetch(x) prefetchw(x)
|
|
||||||
|
|
||||||
#define HAVE_ARCH_PICK_MMAP_LAYOUT
|
#define HAVE_ARCH_PICK_MMAP_LAYOUT
|
||||||
|
|
||||||
int do_mathemu(struct pt_regs *regs, struct fpustate *f, bool illegal_insn_trap);
|
int do_mathemu(struct pt_regs *regs, struct fpustate *f, bool illegal_insn_trap);
|
||||||
|
|
|
@ -2593,6 +2593,13 @@ config CPU_IBRS_ENTRY
|
||||||
This mitigates both spectre_v2 and retbleed at great cost to
|
This mitigates both spectre_v2 and retbleed at great cost to
|
||||||
performance.
|
performance.
|
||||||
|
|
||||||
|
config CPU_SRSO
|
||||||
|
bool "Mitigate speculative RAS overflow on AMD"
|
||||||
|
depends on CPU_SUP_AMD && X86_64 && RETHUNK
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
Enable the SRSO mitigation needed on AMD Zen1-4 machines.
|
||||||
|
|
||||||
config SLS
|
config SLS
|
||||||
bool "Mitigate Straight-Line-Speculation"
|
bool "Mitigate Straight-Line-Speculation"
|
||||||
depends on CC_HAS_SLS && X86_64
|
depends on CC_HAS_SLS && X86_64
|
||||||
|
@ -2603,6 +2610,25 @@ config SLS
|
||||||
against straight line speculation. The kernel image might be slightly
|
against straight line speculation. The kernel image might be slightly
|
||||||
larger.
|
larger.
|
||||||
|
|
||||||
|
config GDS_FORCE_MITIGATION
|
||||||
|
bool "Force GDS Mitigation"
|
||||||
|
depends on CPU_SUP_INTEL
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
Gather Data Sampling (GDS) is a hardware vulnerability which allows
|
||||||
|
unprivileged speculative access to data which was previously stored in
|
||||||
|
vector registers.
|
||||||
|
|
||||||
|
This option is equivalent to setting gather_data_sampling=force on the
|
||||||
|
command line. The microcode mitigation is used if present, otherwise
|
||||||
|
AVX is disabled as a mitigation. On affected systems that are missing
|
||||||
|
the microcode any userspace code that unconditionally uses AVX will
|
||||||
|
break with this option set.
|
||||||
|
|
||||||
|
Setting this option on systems not vulnerable to GDS has no effect.
|
||||||
|
|
||||||
|
If in doubt, say N.
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
config ARCH_HAS_ADD_PAGES
|
config ARCH_HAS_ADD_PAGES
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue