Merge 54a728dc5e ("Merge tag 'sched-core-2021-06-28' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip") into android-mainline
A little step towards 5.14-rc1 Signed-off-by: Lee Jones <lee.jones@linaro.org> Change-Id: I2573a6df9f4e7b67194327ac6db6082a574d2809
This commit is contained in:
@@ -69,13 +69,15 @@ Compile the kernel with::
|
||||
CONFIG_TASK_DELAY_ACCT=y
|
||||
CONFIG_TASKSTATS=y
|
||||
|
||||
Delay accounting is enabled by default at boot up.
|
||||
To disable, add::
|
||||
Delay accounting is disabled by default at boot up.
|
||||
To enable, add::
|
||||
|
||||
nodelayacct
|
||||
delayacct
|
||||
|
||||
to the kernel boot options. The rest of the instructions
|
||||
below assume this has not been done.
|
||||
to the kernel boot options. The rest of the instructions below assume this has
|
||||
been done. Alternatively, use sysctl kernel.task_delayacct to switch the state
|
||||
at runtime. Note however that only tasks started after enabling it will have
|
||||
delayacct information.
|
||||
|
||||
After the system has booted up, use a utility
|
||||
similar to getdelays.c to access the delays
|
||||
|
||||
@@ -0,0 +1,223 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===============
|
||||
Core Scheduling
|
||||
===============
|
||||
Core scheduling support allows userspace to define groups of tasks that can
|
||||
share a core. These groups can be specified either for security usecases (one
|
||||
group of tasks don't trust another), or for performance usecases (some
|
||||
workloads may benefit from running on the same core as they don't need the same
|
||||
hardware resources of the shared core, or may prefer different cores if they
|
||||
do share hardware resource needs). This document only describes the security
|
||||
usecase.
|
||||
|
||||
Security usecase
|
||||
----------------
|
||||
A cross-HT attack involves the attacker and victim running on different Hyper
|
||||
Threads of the same core. MDS and L1TF are examples of such attacks. The only
|
||||
full mitigation of cross-HT attacks is to disable Hyper Threading (HT). Core
|
||||
scheduling is a scheduler feature that can mitigate some (not all) cross-HT
|
||||
attacks. It allows HT to be turned on safely by ensuring that only tasks in a
|
||||
user-designated trusted group can share a core. This increase in core sharing
|
||||
can also improve performance, however it is not guaranteed that performance
|
||||
will always improve, though that is seen to be the case with a number of real
|
||||
world workloads. In theory, core scheduling aims to perform at least as good as
|
||||
when Hyper Threading is disabled. In practice, this is mostly the case though
|
||||
not always: as synchronizing scheduling decisions across 2 or more CPUs in a
|
||||
core involves additional overhead - especially when the system is lightly
|
||||
loaded. When ``total_threads <= N_CPUS/2``, the extra overhead may cause core
|
||||
scheduling to perform more poorly compared to SMT-disabled, where N_CPUS is the
|
||||
total number of CPUs. Please measure the performance of your workloads always.
|
||||
|
||||
Usage
|
||||
-----
|
||||
Core scheduling support is enabled via the ``CONFIG_SCHED_CORE`` config option.
|
||||
Using this feature, userspace defines groups of tasks that can be co-scheduled
|
||||
on the same core. The core scheduler uses this information to make sure that
|
||||
tasks that are not in the same group never run simultaneously on a core, while
|
||||
doing its best to satisfy the system's scheduling requirements.
|
||||
|
||||
Core scheduling can be enabled via the ``PR_SCHED_CORE`` prctl interface.
|
||||
This interface provides support for the creation of core scheduling groups, as
|
||||
well as admission and removal of tasks from created groups::
|
||||
|
||||
#include <sys/prctl.h>
|
||||
|
||||
int prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
unsigned long arg4, unsigned long arg5);
|
||||
|
||||
option:
|
||||
``PR_SCHED_CORE``
|
||||
|
||||
arg2:
|
||||
Command for operation, must be one off:
|
||||
|
||||
- ``PR_SCHED_CORE_GET`` -- get core_sched cookie of ``pid``.
|
||||
- ``PR_SCHED_CORE_CREATE`` -- create a new unique cookie for ``pid``.
|
||||
- ``PR_SCHED_CORE_SHARE_TO`` -- push core_sched cookie to ``pid``.
|
||||
- ``PR_SCHED_CORE_SHARE_FROM`` -- pull core_sched cookie from ``pid``.
|
||||
|
||||
arg3:
|
||||
``pid`` of the task for which the operation applies.
|
||||
|
||||
arg4:
|
||||
``pid_type`` for which the operation applies. It is of type ``enum pid_type``.
|
||||
For example, if arg4 is ``PIDTYPE_TGID``, then the operation of this command
|
||||
will be performed for all tasks in the task group of ``pid``.
|
||||
|
||||
arg5:
|
||||
userspace pointer to an unsigned long for storing the cookie returned by
|
||||
``PR_SCHED_CORE_GET`` command. Should be 0 for all other commands.
|
||||
|
||||
In order for a process to push a cookie to, or pull a cookie from a process, it
|
||||
is required to have the ptrace access mode: `PTRACE_MODE_READ_REALCREDS` to the
|
||||
process.
|
||||
|
||||
Building hierarchies of tasks
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
The simplest way to build hierarchies of threads/processes which share a
|
||||
cookie and thus a core is to rely on the fact that the core-sched cookie is
|
||||
inherited across forks/clones and execs, thus setting a cookie for the
|
||||
'initial' script/executable/daemon will place every spawned child in the
|
||||
same core-sched group.
|
||||
|
||||
Cookie Transferral
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
Transferring a cookie between the current and other tasks is possible using
|
||||
PR_SCHED_CORE_SHARE_FROM and PR_SCHED_CORE_SHARE_TO to inherit a cookie from a
|
||||
specified task or a share a cookie with a task. In combination this allows a
|
||||
simple helper program to pull a cookie from a task in an existing core
|
||||
scheduling group and share it with already running tasks.
|
||||
|
||||
Design/Implementation
|
||||
---------------------
|
||||
Each task that is tagged is assigned a cookie internally in the kernel. As
|
||||
mentioned in `Usage`_, tasks with the same cookie value are assumed to trust
|
||||
each other and share a core.
|
||||
|
||||
The basic idea is that, every schedule event tries to select tasks for all the
|
||||
siblings of a core such that all the selected tasks running on a core are
|
||||
trusted (same cookie) at any point in time. Kernel threads are assumed trusted.
|
||||
The idle task is considered special, as it trusts everything and everything
|
||||
trusts it.
|
||||
|
||||
During a schedule() event on any sibling of a core, the highest priority task on
|
||||
the sibling's core is picked and assigned to the sibling calling schedule(), if
|
||||
the sibling has the task enqueued. For rest of the siblings in the core,
|
||||
highest priority task with the same cookie is selected if there is one runnable
|
||||
in their individual run queues. If a task with same cookie is not available,
|
||||
the idle task is selected. Idle task is globally trusted.
|
||||
|
||||
Once a task has been selected for all the siblings in the core, an IPI is sent to
|
||||
siblings for whom a new task was selected. Siblings on receiving the IPI will
|
||||
switch to the new task immediately. If an idle task is selected for a sibling,
|
||||
then the sibling is considered to be in a `forced idle` state. I.e., it may
|
||||
have tasks on its on runqueue to run, however it will still have to run idle.
|
||||
More on this in the next section.
|
||||
|
||||
Forced-idling of hyperthreads
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
The scheduler tries its best to find tasks that trust each other such that all
|
||||
tasks selected to be scheduled are of the highest priority in a core. However,
|
||||
it is possible that some runqueues had tasks that were incompatible with the
|
||||
highest priority ones in the core. Favoring security over fairness, one or more
|
||||
siblings could be forced to select a lower priority task if the highest
|
||||
priority task is not trusted with respect to the core wide highest priority
|
||||
task. If a sibling does not have a trusted task to run, it will be forced idle
|
||||
by the scheduler (idle thread is scheduled to run).
|
||||
|
||||
When the highest priority task is selected to run, a reschedule-IPI is sent to
|
||||
the sibling to force it into idle. This results in 4 cases which need to be
|
||||
considered depending on whether a VM or a regular usermode process was running
|
||||
on either HT::
|
||||
|
||||
HT1 (attack) HT2 (victim)
|
||||
A idle -> user space user space -> idle
|
||||
B idle -> user space guest -> idle
|
||||
C idle -> guest user space -> idle
|
||||
D idle -> guest guest -> idle
|
||||
|
||||
Note that for better performance, we do not wait for the destination CPU
|
||||
(victim) to enter idle mode. This is because the sending of the IPI would bring
|
||||
the destination CPU immediately into kernel mode from user space, or VMEXIT
|
||||
in the case of guests. At best, this would only leak some scheduler metadata
|
||||
which may not be worth protecting. It is also possible that the IPI is received
|
||||
too late on some architectures, but this has not been observed in the case of
|
||||
x86.
|
||||
|
||||
Trust model
|
||||
~~~~~~~~~~~
|
||||
Core scheduling maintains trust relationships amongst groups of tasks by
|
||||
assigning them a tag that is the same cookie value.
|
||||
When a system with core scheduling boots, all tasks are considered to trust
|
||||
each other. This is because the core scheduler does not have information about
|
||||
trust relationships until userspace uses the above mentioned interfaces, to
|
||||
communicate them. In other words, all tasks have a default cookie value of 0.
|
||||
and are considered system-wide trusted. The forced-idling of siblings running
|
||||
cookie-0 tasks is also avoided.
|
||||
|
||||
Once userspace uses the above mentioned interfaces to group sets of tasks, tasks
|
||||
within such groups are considered to trust each other, but do not trust those
|
||||
outside. Tasks outside the group also don't trust tasks within.
|
||||
|
||||
Limitations of core-scheduling
|
||||
------------------------------
|
||||
Core scheduling tries to guarantee that only trusted tasks run concurrently on a
|
||||
core. But there could be small window of time during which untrusted tasks run
|
||||
concurrently or kernel could be running concurrently with a task not trusted by
|
||||
kernel.
|
||||
|
||||
IPI processing delays
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
Core scheduling selects only trusted tasks to run together. IPI is used to notify
|
||||
the siblings to switch to the new task. But there could be hardware delays in
|
||||
receiving of the IPI on some arch (on x86, this has not been observed). This may
|
||||
cause an attacker task to start running on a CPU before its siblings receive the
|
||||
IPI. Even though cache is flushed on entry to user mode, victim tasks on siblings
|
||||
may populate data in the cache and micro architectural buffers after the attacker
|
||||
starts to run and this is a possibility for data leak.
|
||||
|
||||
Open cross-HT issues that core scheduling does not solve
|
||||
--------------------------------------------------------
|
||||
1. For MDS
|
||||
~~~~~~~~~~
|
||||
Core scheduling cannot protect against MDS attacks between an HT running in
|
||||
user mode and another running in kernel mode. Even though both HTs run tasks
|
||||
which trust each other, kernel memory is still considered untrusted. Such
|
||||
attacks are possible for any combination of sibling CPU modes (host or guest mode).
|
||||
|
||||
2. For L1TF
|
||||
~~~~~~~~~~~
|
||||
Core scheduling cannot protect against an L1TF guest attacker exploiting a
|
||||
guest or host victim. This is because the guest attacker can craft invalid
|
||||
PTEs which are not inverted due to a vulnerable guest kernel. The only
|
||||
solution is to disable EPT (Extended Page Tables).
|
||||
|
||||
For both MDS and L1TF, if the guest vCPU is configured to not trust each
|
||||
other (by tagging separately), then the guest to guest attacks would go away.
|
||||
Or it could be a system admin policy which considers guest to guest attacks as
|
||||
a guest problem.
|
||||
|
||||
Another approach to resolve these would be to make every untrusted task on the
|
||||
system to not trust every other untrusted task. While this could reduce
|
||||
parallelism of the untrusted tasks, it would still solve the above issues while
|
||||
allowing system processes (trusted tasks) to share a core.
|
||||
|
||||
3. Protecting the kernel (IRQ, syscall, VMEXIT)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Unfortunately, core scheduling does not protect kernel contexts running on
|
||||
sibling hyperthreads from one another. Prototypes of mitigations have been posted
|
||||
to LKML to solve this, but it is debatable whether such windows are practically
|
||||
exploitable, and whether the performance overhead of the prototypes are worth
|
||||
it (not to mention, the added code complexity).
|
||||
|
||||
Other Use cases
|
||||
---------------
|
||||
The main use case for Core scheduling is mitigating the cross-HT vulnerabilities
|
||||
with SMT enabled. There are other use cases where this feature could be used:
|
||||
|
||||
- Isolating tasks that needs a whole core: Examples include realtime tasks, tasks
|
||||
that uses SIMD instructions etc.
|
||||
- Gang scheduling: Requirements for a group of tasks that needs to be scheduled
|
||||
together could also be realized using core scheduling. One example is vCPUs of
|
||||
a VM.
|
||||
@@ -15,3 +15,4 @@ are configurable at compile, boot or run time.
|
||||
tsx_async_abort
|
||||
multihit.rst
|
||||
special-register-buffer-data-sampling.rst
|
||||
core-scheduling.rst
|
||||
|
||||
@@ -3253,7 +3253,7 @@
|
||||
|
||||
noclflush [BUGS=X86] Don't use the CLFLUSH instruction
|
||||
|
||||
nodelayacct [KNL] Disable per-task delay accounting
|
||||
delayacct [KNL] Enable per-task delay accounting
|
||||
|
||||
nodsp [SH] Disable hardware DSP at boot time.
|
||||
|
||||
|
||||
@@ -1088,6 +1088,13 @@ Model available). If your platform happens to meet the
|
||||
requirements for EAS but you do not want to use it, change
|
||||
this value to 0.
|
||||
|
||||
task_delayacct
|
||||
===============
|
||||
|
||||
Enables/disables task delay accounting (see
|
||||
:doc:`accounting/delay-accounting.rst`). Enabling this feature incurs
|
||||
a small amount of overhead in the scheduler but is useful for debugging
|
||||
and performance tuning. It is required by some tools such as iotop.
|
||||
|
||||
sched_schedstats
|
||||
================
|
||||
|
||||
@@ -30,6 +30,7 @@ properties:
|
||||
- st,stds75
|
||||
- st,stlm75
|
||||
- microchip,tcn75
|
||||
- ti,tmp1075
|
||||
- ti,tmp100
|
||||
- ti,tmp101
|
||||
- ti,tmp105
|
||||
|
||||
@@ -21,6 +21,7 @@ Required properties:
|
||||
compatible:
|
||||
"mediatek,mt6323" for PMIC MT6323
|
||||
"mediatek,mt6358" for PMIC MT6358
|
||||
"mediatek,mt6359" for PMIC MT6359
|
||||
"mediatek,mt6397" for PMIC MT6397
|
||||
|
||||
Optional subnodes:
|
||||
|
||||
@@ -21,6 +21,7 @@ properties:
|
||||
- brcm,bcm2711-emmc2
|
||||
- brcm,sdhci-iproc-cygnus
|
||||
- brcm,sdhci-iproc
|
||||
- brcm,bcm7211a0-sdhci
|
||||
|
||||
reg:
|
||||
minItems: 1
|
||||
|
||||
@@ -19,6 +19,7 @@ properties:
|
||||
- ingenic,jz4740-mmc
|
||||
- ingenic,jz4725b-mmc
|
||||
- ingenic,jz4760-mmc
|
||||
- ingenic,jz4775-mmc
|
||||
- ingenic,jz4780-mmc
|
||||
- ingenic,x1000-mmc
|
||||
- items:
|
||||
|
||||
@@ -220,6 +220,11 @@ properties:
|
||||
description:
|
||||
eMMC HS400 enhanced strobe mode is supported
|
||||
|
||||
no-mmc-hs400:
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description:
|
||||
All eMMC HS400 modes are not supported.
|
||||
|
||||
dsr:
|
||||
description:
|
||||
Value the card Driver Stage Register (DSR) should be programmed
|
||||
@@ -357,22 +362,6 @@ dependencies:
|
||||
additionalProperties: true
|
||||
|
||||
examples:
|
||||
- |
|
||||
mmc@ab000000 {
|
||||
compatible = "sdhci";
|
||||
reg = <0xab000000 0x200>;
|
||||
interrupts = <23>;
|
||||
bus-width = <4>;
|
||||
cd-gpios = <&gpio 69 0>;
|
||||
cd-inverted;
|
||||
wp-gpios = <&gpio 70 0>;
|
||||
max-frequency = <50000000>;
|
||||
keep-power-in-suspend;
|
||||
wakeup-source;
|
||||
mmc-pwrseq = <&sdhci0_pwrseq>;
|
||||
clk-phase-sd-hs = <63>, <72>;
|
||||
};
|
||||
|
||||
- |
|
||||
mmc3: mmc@1c12000 {
|
||||
#address-cells = <1>;
|
||||
@@ -385,9 +374,9 @@ examples:
|
||||
non-removable;
|
||||
mmc-pwrseq = <&sdhci0_pwrseq>;
|
||||
|
||||
brcmf: bcrmf@1 {
|
||||
brcmf: wifi@1 {
|
||||
reg = <1>;
|
||||
compatible = "brcm,bcm43xx-fmac";
|
||||
compatible = "brcm,bcm4329-fmac";
|
||||
interrupt-parent = <&pio>;
|
||||
interrupts = <10 8>;
|
||||
interrupt-names = "host-wake";
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
* Renesas Multi Media Card Interface (MMCIF) Controller
|
||||
|
||||
This file documents differences between the core properties in mmc.txt
|
||||
and the properties used by the MMCIF device.
|
||||
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: should be "renesas,mmcif-<soctype>", "renesas,sh-mmcif" as a
|
||||
fallback. Examples with <soctype> are:
|
||||
- "renesas,mmcif-r7s72100" for the MMCIF found in r7s72100 SoCs
|
||||
- "renesas,mmcif-r8a73a4" for the MMCIF found in r8a73a4 SoCs
|
||||
- "renesas,mmcif-r8a7740" for the MMCIF found in r8a7740 SoCs
|
||||
- "renesas,mmcif-r8a7742" for the MMCIF found in r8a7742 SoCs
|
||||
- "renesas,mmcif-r8a7743" for the MMCIF found in r8a7743 SoCs
|
||||
- "renesas,mmcif-r8a7744" for the MMCIF found in r8a7744 SoCs
|
||||
- "renesas,mmcif-r8a7745" for the MMCIF found in r8a7745 SoCs
|
||||
- "renesas,mmcif-r8a7778" for the MMCIF found in r8a7778 SoCs
|
||||
- "renesas,mmcif-r8a7790" for the MMCIF found in r8a7790 SoCs
|
||||
- "renesas,mmcif-r8a7791" for the MMCIF found in r8a7791 SoCs
|
||||
- "renesas,mmcif-r8a7793" for the MMCIF found in r8a7793 SoCs
|
||||
- "renesas,mmcif-r8a7794" for the MMCIF found in r8a7794 SoCs
|
||||
- "renesas,mmcif-sh73a0" for the MMCIF found in sh73a0 SoCs
|
||||
|
||||
- interrupts: Some SoCs have only 1 shared interrupt, while others have either
|
||||
2 or 3 individual interrupts (error, int, card detect). Below is the number
|
||||
of interrupts for each SoC:
|
||||
1: r8a73a4, r8a7742, r8a7743, r8a7744, r8a7745, r8a7778, r8a7790, r8a7791,
|
||||
r8a7793, r8a7794
|
||||
2: r8a7740, sh73a0
|
||||
3: r7s72100
|
||||
|
||||
- clocks: reference to the functional clock
|
||||
|
||||
- dmas: reference to the DMA channels, one per channel name listed in the
|
||||
dma-names property.
|
||||
- dma-names: must contain "tx" for the transmit DMA channel and "rx" for the
|
||||
receive DMA channel.
|
||||
- max-frequency: Maximum operating clock frequency, driver uses default clock
|
||||
frequency if it is not set.
|
||||
|
||||
|
||||
Example: R8A7790 (R-Car H2) MMCIF0
|
||||
|
||||
mmcif0: mmc@ee200000 {
|
||||
compatible = "renesas,mmcif-r8a7790", "renesas,sh-mmcif";
|
||||
reg = <0 0xee200000 0 0x80>;
|
||||
interrupts = <0 169 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&mstp3_clks R8A7790_CLK_MMCIF0>;
|
||||
dmas = <&dmac0 0xd1>, <&dmac0 0xd2>;
|
||||
dma-names = "tx", "rx";
|
||||
max-frequency = <97500000>;
|
||||
};
|
||||
@@ -0,0 +1,135 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/mmc/renesas,mmcif.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Renesas Multi Media Card Interface (MMCIF) Controller
|
||||
|
||||
maintainers:
|
||||
- Wolfram Sang <wsa+renesas@sang-engineering.com>
|
||||
|
||||
allOf:
|
||||
- $ref: "mmc-controller.yaml"
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- renesas,mmcif-r7s72100 # RZ/A1H
|
||||
- renesas,mmcif-r8a73a4 # R-Mobile APE6
|
||||
- renesas,mmcif-r8a7740 # R-Mobile A1
|
||||
- renesas,mmcif-r8a7742 # RZ/G1H
|
||||
- renesas,mmcif-r8a7743 # RZ/G1M
|
||||
- renesas,mmcif-r8a7744 # RZ/G1N
|
||||
- renesas,mmcif-r8a7745 # RZ/G1E
|
||||
- renesas,mmcif-r8a7778 # R-Car M1A
|
||||
- renesas,mmcif-r8a7790 # R-Car H2
|
||||
- renesas,mmcif-r8a7791 # R-Car M2-W
|
||||
- renesas,mmcif-r8a7793 # R-Car M2-N
|
||||
- renesas,mmcif-r8a7794 # R-Car E2
|
||||
- renesas,mmcif-sh73a0 # SH-Mobile AG5
|
||||
- const: renesas,sh-mmcif
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts: true
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
dmas:
|
||||
minItems: 2
|
||||
maxItems: 4
|
||||
description:
|
||||
Must contain a list of pairs of references to DMA specifiers, one for
|
||||
transmission, and one for reception.
|
||||
|
||||
dma-names:
|
||||
minItems: 2
|
||||
maxItems: 4
|
||||
items:
|
||||
enum:
|
||||
- tx
|
||||
- rx
|
||||
|
||||
max-frequency: true
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- power-domains
|
||||
|
||||
if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: renesas,mmcif-r7s72100
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
items:
|
||||
- description: Error interrupt
|
||||
- description: Normal operation interrupt
|
||||
- description: Card detection interrupt
|
||||
else:
|
||||
if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,mmcif-r8a7740
|
||||
- renesas,mmcif-sh73a0
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
items:
|
||||
- description: Error interrupt
|
||||
- description: Normal operation interrupt
|
||||
else:
|
||||
if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,mmcif-r8a73a4
|
||||
- renesas,mmcif-r8a7778
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
else:
|
||||
properties:
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
required:
|
||||
- resets
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/r8a7790-cpg-mssr.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/power/r8a7790-sysc.h>
|
||||
|
||||
mmcif0: mmc@ee200000 {
|
||||
compatible = "renesas,mmcif-r8a7790", "renesas,sh-mmcif";
|
||||
reg = <0xee200000 0x80>;
|
||||
interrupts = <GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&cpg CPG_MOD 315>;
|
||||
power-domains = <&sysc R8A7790_PD_ALWAYS_ON>;
|
||||
resets = <&cpg 315>;
|
||||
dmas = <&dmac0 0xd1>, <&dmac0 0xd2>, <&dmac1 0xd1>, <&dmac1 0xd2>;
|
||||
dma-names = "tx", "rx", "tx", "rx";
|
||||
max-frequency = <97500000>;
|
||||
};
|
||||
@@ -29,21 +29,15 @@ properties:
|
||||
- const: rockchip,rk3288-dw-mshc
|
||||
- items:
|
||||
- enum:
|
||||
# for Rockchip PX30
|
||||
- rockchip,px30-dw-mshc
|
||||
# for Rockchip RK3036
|
||||
- rockchip,rk1808-dw-mshc
|
||||
- rockchip,rk3036-dw-mshc
|
||||
# for Rockchip RK322x
|
||||
- rockchip,rk3228-dw-mshc
|
||||
# for Rockchip RK3308
|
||||
- rockchip,rk3308-dw-mshc
|
||||
# for Rockchip RK3328
|
||||
- rockchip,rk3328-dw-mshc
|
||||
# for Rockchip RK3368
|
||||
- rockchip,rk3368-dw-mshc
|
||||
# for Rockchip RK3399
|
||||
- rockchip,rk3399-dw-mshc
|
||||
# for Rockchip RV1108
|
||||
- rockchip,rk3568-dw-mshc
|
||||
- rockchip,rv1108-dw-mshc
|
||||
- const: rockchip,rk3288-dw-mshc
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@ properties:
|
||||
- const: ti,am654-sdhci-5.1
|
||||
- const: ti,j721e-sdhci-8bit
|
||||
- const: ti,j721e-sdhci-4bit
|
||||
- const: ti,j721e-sdhci-4bit
|
||||
- const: ti,am64-sdhci-8bit
|
||||
- const: ti,am64-sdhci-4bit
|
||||
- items:
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/regulator/max8893.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Regulator driver for MAX8893 PMIC from Maxim Integrated.
|
||||
|
||||
maintainers:
|
||||
- Sergey Larin <cerg2010cerg2010@mail.ru>
|
||||
|
||||
description: |
|
||||
The device has 5 LDO regulators and a single BUCK regulator.
|
||||
Programming is done through I2C bus.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: maxim,max8893
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
regulators:
|
||||
type: object
|
||||
|
||||
patternProperties:
|
||||
"^(ldo[1-5]|buck)$":
|
||||
$ref: "regulator.yaml#"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- regulators
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
pmic@3e {
|
||||
compatible = "maxim,max8893";
|
||||
reg = <0x3e>;
|
||||
|
||||
regulators {
|
||||
/* Front camera - s5k6aafx, back - m5mo */
|
||||
/* Numbers used to indicate the sequence */
|
||||
front_1_back_1: buck {
|
||||
regulator-name = "cam_isp_core_1v2";
|
||||
regulator-min-microvolt = <1200000>;
|
||||
regulator-max-microvolt = <1200000>;
|
||||
};
|
||||
|
||||
front_4_back_5: ldo1 {
|
||||
regulator-name = "vt_io_1v8,cam_isp_1v8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
};
|
||||
|
||||
front_3_back_4: ldo2 {
|
||||
regulator-name = "vt_core_1v5";
|
||||
regulator-min-microvolt = <1500000>;
|
||||
regulator-max-microvolt = <1500000>;
|
||||
};
|
||||
|
||||
front_5_back_6: ldo3 {
|
||||
regulator-name = "vt_cam_1v8,vt_sensor_io_1v8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
};
|
||||
|
||||
ldo4 {
|
||||
/* not used */
|
||||
};
|
||||
|
||||
back_7: ldo5 {
|
||||
regulator-name = "cam_sensor_io_1v8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
||||
@@ -0,0 +1,385 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/regulator/mt6359-regulator.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MT6359 Regulator from MediaTek Integrated
|
||||
|
||||
maintainers:
|
||||
- Hsin-Hsiung Wang <hsin-hsiung.wang@mediatek.com>
|
||||
|
||||
description: |
|
||||
List of regulators provided by this controller. It is named
|
||||
according to its regulator type, buck_<name> and ldo_<name>.
|
||||
MT6359 regulators node should be sub node of the MT6397 MFD node.
|
||||
|
||||
patternProperties:
|
||||
"^buck_v(s1|gpu11|modem|pu|core|s2|pa|proc2|proc1|core_sshub)$":
|
||||
type: object
|
||||
$ref: "regulator.yaml#"
|
||||
|
||||
properties:
|
||||
regulator-name:
|
||||
pattern: "^v(s1|gpu11|modem|pu|core|s2|pa|proc2|proc1|core_sshub)$"
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
"^ldo_v(ibr|rf12|usb|camio|efuse|xo22)$":
|
||||
type: object
|
||||
$ref: "regulator.yaml#"
|
||||
|
||||
properties:
|
||||
regulator-name:
|
||||
pattern: "^v(ibr|rf12|usb|camio|efuse|xo22)$"
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
"^ldo_v(rfck|emc|a12|a09|ufs|bbck)$":
|
||||
type: object
|
||||
$ref: "regulator.yaml#"
|
||||
|
||||
properties:
|
||||
regulator-name:
|
||||
pattern: "^v(rfck|emc|a12|a09|ufs|bbck)$"
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
"^ldo_vcn(18|13|33_1_bt|13_1_wifi|33_2_bt|33_2_wifi)$":
|
||||
type: object
|
||||
$ref: "regulator.yaml#"
|
||||
|
||||
properties:
|
||||
regulator-name:
|
||||
pattern: "^vcn(18|13|33_1_bt|13_1_wifi|33_2_bt|33_2_wifi)$"
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
"^ldo_vsram_(proc2|others|md|proc1|others_sshub)$":
|
||||
type: object
|
||||
$ref: "regulator.yaml#"
|
||||
|
||||
properties:
|
||||
regulator-name:
|
||||
pattern: "^vsram_(proc2|others|md|proc1|others_sshub)$"
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
"^ldo_v(fe|bif|io)28$":
|
||||
type: object
|
||||
$ref: "regulator.yaml#"
|
||||
|
||||
properties:
|
||||
regulator-name:
|
||||
pattern: "^v(fe|bif|io)28$"
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
"^ldo_v(aud|io|aux|rf|m)18$":
|
||||
type: object
|
||||
$ref: "regulator.yaml#"
|
||||
|
||||
properties:
|
||||
regulator-name:
|
||||
pattern: "^v(aud|io|aux|rf|m)18$"
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
"^ldo_vsim[12]$":
|
||||
type: object
|
||||
$ref: "regulator.yaml#"
|
||||
|
||||
properties:
|
||||
regulator-name:
|
||||
pattern: "^vsim[12]$"
|
||||
|
||||
required:
|
||||
- regulator-name
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
pmic {
|
||||
regulators {
|
||||
mt6359_vs1_buck_reg: buck_vs1 {
|
||||
regulator-name = "vs1";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <2200000>;
|
||||
regulator-enable-ramp-delay = <0>;
|
||||
regulator-always-on;
|
||||
};
|
||||
mt6359_vgpu11_buck_reg: buck_vgpu11 {
|
||||
regulator-name = "vgpu11";
|
||||
regulator-min-microvolt = <400000>;
|
||||
regulator-max-microvolt = <1193750>;
|
||||
regulator-ramp-delay = <5000>;
|
||||
regulator-enable-ramp-delay = <200>;
|
||||
regulator-allowed-modes = <0 1 2>;
|
||||
};
|
||||
mt6359_vmodem_buck_reg: buck_vmodem {
|
||||
regulator-name = "vmodem";
|
||||
regulator-min-microvolt = <400000>;
|
||||
regulator-max-microvolt = <1100000>;
|
||||
regulator-ramp-delay = <10760>;
|
||||
regulator-enable-ramp-delay = <200>;
|
||||
};
|
||||
mt6359_vpu_buck_reg: buck_vpu {
|
||||
regulator-name = "vpu";
|
||||
regulator-min-microvolt = <400000>;
|
||||
regulator-max-microvolt = <1193750>;
|
||||
regulator-ramp-delay = <5000>;
|
||||
regulator-enable-ramp-delay = <200>;
|
||||
regulator-allowed-modes = <0 1 2>;
|
||||
};
|
||||
mt6359_vcore_buck_reg: buck_vcore {
|
||||
regulator-name = "vcore";
|
||||
regulator-min-microvolt = <400000>;
|
||||
regulator-max-microvolt = <1300000>;
|
||||
regulator-ramp-delay = <5000>;
|
||||
regulator-enable-ramp-delay = <200>;
|
||||
regulator-allowed-modes = <0 1 2>;
|
||||
};
|
||||
mt6359_vs2_buck_reg: buck_vs2 {
|
||||
regulator-name = "vs2";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <1600000>;
|
||||
regulator-enable-ramp-delay = <0>;
|
||||
regulator-always-on;
|
||||
};
|
||||
mt6359_vpa_buck_reg: buck_vpa {
|
||||
regulator-name = "vpa";
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <3650000>;
|
||||
regulator-enable-ramp-delay = <300>;
|
||||
};
|
||||
mt6359_vproc2_buck_reg: buck_vproc2 {
|
||||
regulator-name = "vproc2";
|
||||
regulator-min-microvolt = <400000>;
|
||||
regulator-max-microvolt = <1193750>;
|
||||
regulator-ramp-delay = <7500>;
|
||||
regulator-enable-ramp-delay = <200>;
|
||||
regulator-allowed-modes = <0 1 2>;
|
||||
};
|
||||
mt6359_vproc1_buck_reg: buck_vproc1 {
|
||||
regulator-name = "vproc1";
|
||||
regulator-min-microvolt = <400000>;
|
||||
regulator-max-microvolt = <1193750>;
|
||||
regulator-ramp-delay = <7500>;
|
||||
regulator-enable-ramp-delay = <200>;
|
||||
regulator-allowed-modes = <0 1 2>;
|
||||
};
|
||||
mt6359_vcore_sshub_buck_reg: buck_vcore_sshub {
|
||||
regulator-name = "vcore_sshub";
|
||||
regulator-min-microvolt = <400000>;
|
||||
regulator-max-microvolt = <1193750>;
|
||||
};
|
||||
mt6359_vgpu11_sshub_buck_reg: buck_vgpu11_sshub {
|
||||
regulator-name = "vgpu11_sshub";
|
||||
regulator-min-microvolt = <400000>;
|
||||
regulator-max-microvolt = <1193750>;
|
||||
};
|
||||
mt6359_vaud18_ldo_reg: ldo_vaud18 {
|
||||
regulator-name = "vaud18";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-enable-ramp-delay = <240>;
|
||||
};
|
||||
mt6359_vsim1_ldo_reg: ldo_vsim1 {
|
||||
regulator-name = "vsim1";
|
||||
regulator-min-microvolt = <1700000>;
|
||||
regulator-max-microvolt = <3100000>;
|
||||
};
|
||||
mt6359_vibr_ldo_reg: ldo_vibr {
|
||||
regulator-name = "vibr";
|
||||
regulator-min-microvolt = <1200000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
mt6359_vrf12_ldo_reg: ldo_vrf12 {
|
||||
regulator-name = "vrf12";
|
||||
regulator-min-microvolt = <1100000>;
|
||||
regulator-max-microvolt = <1300000>;
|
||||
};
|
||||
mt6359_vusb_ldo_reg: ldo_vusb {
|
||||
regulator-name = "vusb";
|
||||
regulator-min-microvolt = <3000000>;
|
||||
regulator-max-microvolt = <3000000>;
|
||||
regulator-enable-ramp-delay = <960>;
|
||||
regulator-always-on;
|
||||
};
|
||||
mt6359_vsram_proc2_ldo_reg: ldo_vsram_proc2 {
|
||||
regulator-name = "vsram_proc2";
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1293750>;
|
||||
regulator-ramp-delay = <7500>;
|
||||
regulator-enable-ramp-delay = <240>;
|
||||
regulator-always-on;
|
||||
};
|
||||
mt6359_vio18_ldo_reg: ldo_vio18 {
|
||||
regulator-name = "vio18";
|
||||
regulator-min-microvolt = <1700000>;
|
||||
regulator-max-microvolt = <1900000>;
|
||||
regulator-enable-ramp-delay = <960>;
|
||||
regulator-always-on;
|
||||
};
|
||||
mt6359_vcamio_ldo_reg: ldo_vcamio {
|
||||
regulator-name = "vcamio";
|
||||
regulator-min-microvolt = <1700000>;
|
||||
regulator-max-microvolt = <1900000>;
|
||||
};
|
||||
mt6359_vcn18_ldo_reg: ldo_vcn18 {
|
||||
regulator-name = "vcn18";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-enable-ramp-delay = <240>;
|
||||
};
|
||||
mt6359_vfe28_ldo_reg: ldo_vfe28 {
|
||||
regulator-name = "vfe28";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
regulator-enable-ramp-delay = <120>;
|
||||
};
|
||||
mt6359_vcn13_ldo_reg: ldo_vcn13 {
|
||||
regulator-name = "vcn13";
|
||||
regulator-min-microvolt = <900000>;
|
||||
regulator-max-microvolt = <1300000>;
|
||||
};
|
||||
mt6359_vcn33_1_bt_ldo_reg: ldo_vcn33_1_bt {
|
||||
regulator-name = "vcn33_1_bt";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <3500000>;
|
||||
};
|
||||
mt6359_vcn33_1_wifi_ldo_reg: ldo_vcn33_1_wifi {
|
||||
regulator-name = "vcn33_1_wifi";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <3500000>;
|
||||
};
|
||||
mt6359_vaux18_ldo_reg: ldo_vaux18 {
|
||||
regulator-name = "vaux18";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-enable-ramp-delay = <240>;
|
||||
regulator-always-on;
|
||||
};
|
||||
mt6359_vsram_others_ldo_reg: ldo_vsram_others {
|
||||
regulator-name = "vsram_others";
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1293750>;
|
||||
regulator-ramp-delay = <5000>;
|
||||
regulator-enable-ramp-delay = <240>;
|
||||
};
|
||||
mt6359_vefuse_ldo_reg: ldo_vefuse {
|
||||
regulator-name = "vefuse";
|
||||
regulator-min-microvolt = <1700000>;
|
||||
regulator-max-microvolt = <2000000>;
|
||||
};
|
||||
mt6359_vxo22_ldo_reg: ldo_vxo22 {
|
||||
regulator-name = "vxo22";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <2200000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
mt6359_vrfck_ldo_reg: ldo_vrfck {
|
||||
regulator-name = "vrfck";
|
||||
regulator-min-microvolt = <1500000>;
|
||||
regulator-max-microvolt = <1700000>;
|
||||
};
|
||||
mt6359_vrfck_1_ldo_reg: ldo_vrfck_1 {
|
||||
regulator-name = "vrfck";
|
||||
regulator-min-microvolt = <1240000>;
|
||||
regulator-max-microvolt = <1600000>;
|
||||
};
|
||||
mt6359_vbif28_ldo_reg: ldo_vbif28 {
|
||||
regulator-name = "vbif28";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
regulator-enable-ramp-delay = <240>;
|
||||
};
|
||||
mt6359_vio28_ldo_reg: ldo_vio28 {
|
||||
regulator-name = "vio28";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
mt6359_vemc_ldo_reg: ldo_vemc {
|
||||
regulator-name = "vemc";
|
||||
regulator-min-microvolt = <2900000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
mt6359_vemc_1_ldo_reg: ldo_vemc_1 {
|
||||
regulator-name = "vemc";
|
||||
regulator-min-microvolt = <2500000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
mt6359_vcn33_2_bt_ldo_reg: ldo_vcn33_2_bt {
|
||||
regulator-name = "vcn33_2_bt";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <3500000>;
|
||||
};
|
||||
mt6359_vcn33_2_wifi_ldo_reg: ldo_vcn33_2_wifi {
|
||||
regulator-name = "vcn33_2_wifi";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <3500000>;
|
||||
};
|
||||
mt6359_va12_ldo_reg: ldo_va12 {
|
||||
regulator-name = "va12";
|
||||
regulator-min-microvolt = <1200000>;
|
||||
regulator-max-microvolt = <1300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
mt6359_va09_ldo_reg: ldo_va09 {
|
||||
regulator-name = "va09";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <1200000>;
|
||||
};
|
||||
mt6359_vrf18_ldo_reg: ldo_vrf18 {
|
||||
regulator-name = "vrf18";
|
||||
regulator-min-microvolt = <1700000>;
|
||||
regulator-max-microvolt = <1810000>;
|
||||
};
|
||||
mt6359_vsram_md_ldo_reg: ldo_vsram_md {
|
||||
regulator-name = "vsram_md";
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1293750>;
|
||||
regulator-ramp-delay = <10760>;
|
||||
regulator-enable-ramp-delay = <240>;
|
||||
};
|
||||
mt6359_vufs_ldo_reg: ldo_vufs {
|
||||
regulator-name = "vufs";
|
||||
regulator-min-microvolt = <1700000>;
|
||||
regulator-max-microvolt = <1900000>;
|
||||
};
|
||||
mt6359_vm18_ldo_reg: ldo_vm18 {
|
||||
regulator-name = "vm18";
|
||||
regulator-min-microvolt = <1700000>;
|
||||
regulator-max-microvolt = <1900000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
mt6359_vbbck_ldo_reg: ldo_vbbck {
|
||||
regulator-name = "vbbck";
|
||||
regulator-min-microvolt = <1100000>;
|
||||
regulator-max-microvolt = <1200000>;
|
||||
};
|
||||
mt6359_vsram_proc1_ldo_reg: ldo_vsram_proc1 {
|
||||
regulator-name = "vsram_proc1";
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1293750>;
|
||||
regulator-ramp-delay = <7500>;
|
||||
regulator-enable-ramp-delay = <240>;
|
||||
regulator-always-on;
|
||||
};
|
||||
mt6359_vsim2_ldo_reg: ldo_vsim2 {
|
||||
regulator-name = "vsim2";
|
||||
regulator-min-microvolt = <1700000>;
|
||||
regulator-max-microvolt = <3100000>;
|
||||
};
|
||||
mt6359_vsram_others_sshub_ldo: ldo_vsram_others_sshub {
|
||||
regulator-name = "vsram_others_sshub";
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1293750>;
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
||||
@@ -33,6 +33,9 @@ description: |
|
||||
|
||||
The names used for regulator nodes must match those supported by a given
|
||||
PMIC. Supported regulator node names are
|
||||
For PM6150, smps1 - smps5, ldo1 - ldo19
|
||||
For PM6150L, smps1 - smps8, ldo1 - ldo11, bob
|
||||
For PM7325, smps1 - smps8, ldo1 - ldo19
|
||||
For PM8005, smps1 - smps4
|
||||
For PM8009, smps1 - smps2, ldo1 - ldo7
|
||||
For PM8150, smps1 - smps10, ldo1 - ldo18
|
||||
@@ -41,15 +44,15 @@ description: |
|
||||
For PM8350C, smps1 - smps10, ldo1 - ldo13, bob
|
||||
For PM8998, smps1 - smps13, ldo1 - ldo28, lvs1 - lvs2
|
||||
For PMI8998, bob
|
||||
For PM6150, smps1 - smps5, ldo1 - ldo19
|
||||
For PM6150L, smps1 - smps8, ldo1 - ldo11, bob
|
||||
For PMX55, smps1 - smps7, ldo1 - ldo16
|
||||
For PM7325, smps1 - smps8, ldo1 - ldo19
|
||||
For PMR735A, smps1 - smps3, ldo1 - ldo7
|
||||
For PMX55, smps1 - smps7, ldo1 - ldo16
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,pm6150-rpmh-regulators
|
||||
- qcom,pm6150l-rpmh-regulators
|
||||
- qcom,pm7325-rpmh-regulators
|
||||
- qcom,pm8005-rpmh-regulators
|
||||
- qcom,pm8009-rpmh-regulators
|
||||
- qcom,pm8009-1-rpmh-regulators
|
||||
@@ -59,11 +62,9 @@ properties:
|
||||
- qcom,pm8350c-rpmh-regulators
|
||||
- qcom,pm8998-rpmh-regulators
|
||||
- qcom,pmi8998-rpmh-regulators
|
||||
- qcom,pm6150-rpmh-regulators
|
||||
- qcom,pm6150l-rpmh-regulators
|
||||
- qcom,pmx55-rpmh-regulators
|
||||
- qcom,pm7325-rpmh-regulators
|
||||
- qcom,pmm8155au-rpmh-regulators
|
||||
- qcom,pmr735a-rpmh-regulators
|
||||
- qcom,pmx55-rpmh-regulators
|
||||
|
||||
qcom,pmic-id:
|
||||
description: |
|
||||
|
||||
@@ -24,6 +24,10 @@ description:
|
||||
|
||||
For mp5496, s2
|
||||
|
||||
For pm8226, s1, s2, s3, s4, s5, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10,
|
||||
l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25,
|
||||
l26, l27, l28, lvs1
|
||||
|
||||
For pm8841, s1, s2, s3, s4, s5, s6, s7, s8
|
||||
|
||||
For pm8916, s1, s2, s3, s4, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11,
|
||||
@@ -68,6 +72,7 @@ properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,rpm-mp5496-regulators
|
||||
- qcom,rpm-pm8226-regulators
|
||||
- qcom,rpm-pm8841-regulators
|
||||
- qcom,rpm-pm8916-regulators
|
||||
- qcom,rpm-pm8941-regulators
|
||||
|
||||
@@ -117,6 +117,88 @@ properties:
|
||||
description: Enable over current protection.
|
||||
type: boolean
|
||||
|
||||
regulator-oc-protection-microamp:
|
||||
description: Set over current protection limit. This is a limit where
|
||||
hardware performs emergency shutdown. Zero can be passed to disable
|
||||
protection and value '1' indicates that protection should be enabled but
|
||||
limit setting can be omitted.
|
||||
|
||||
regulator-oc-error-microamp:
|
||||
description: Set over current error limit. This is a limit where part of
|
||||
the hardware propably is malfunctional and damage prevention is requested.
|
||||
Zero can be passed to disable error detection and value '1' indicates
|
||||
that detection should be enabled but limit setting can be omitted.
|
||||
|
||||
regulator-oc-warn-microamp:
|
||||
description: Set over current warning limit. This is a limit where hardware
|
||||
is assumed still to be functional but approaching limit where it gets
|
||||
damaged. Recovery actions should be initiated. Zero can be passed to
|
||||
disable detection and value '1' indicates that detection should
|
||||
be enabled but limit setting can be omitted.
|
||||
|
||||
regulator-ov-protection-microvolt:
|
||||
description: Set over voltage protection limit. This is a limit where
|
||||
hardware performs emergency shutdown. Zero can be passed to disable
|
||||
protection and value '1' indicates that protection should be enabled but
|
||||
limit setting can be omitted. Limit is given as microvolt offset from
|
||||
voltage set to regulator.
|
||||
|
||||
regulator-ov-error-microvolt:
|
||||
description: Set over voltage error limit. This is a limit where part of
|
||||
the hardware propably is malfunctional and damage prevention is requested
|
||||
Zero can be passed to disable error detection and value '1' indicates
|
||||
that detection should be enabled but limit setting can be omitted. Limit
|
||||
is given as microvolt offset from voltage set to regulator.
|
||||
|
||||
regulator-ov-warn-microvolt:
|
||||
description: Set over voltage warning limit. This is a limit where hardware
|
||||
is assumed still to be functional but approaching limit where it gets
|
||||
damaged. Recovery actions should be initiated. Zero can be passed to
|
||||
disable detection and value '1' indicates that detection should
|
||||
be enabled but limit setting can be omitted. Limit is given as microvolt
|
||||
offset from voltage set to regulator.
|
||||
|
||||
regulator-uv-protection-microvolt:
|
||||
description: Set over under voltage protection limit. This is a limit where
|
||||
hardware performs emergency shutdown. Zero can be passed to disable
|
||||
protection and value '1' indicates that protection should be enabled but
|
||||
limit setting can be omitted. Limit is given as microvolt offset from
|
||||
voltage set to regulator.
|
||||
|
||||
regulator-uv-error-microvolt:
|
||||
description: Set under voltage error limit. This is a limit where part of
|
||||
the hardware propably is malfunctional and damage prevention is requested
|
||||
Zero can be passed to disable error detection and value '1' indicates
|
||||
that detection should be enabled but limit setting can be omitted. Limit
|
||||
is given as microvolt offset from voltage set to regulator.
|
||||
|
||||
regulator-uv-warn-microvolt:
|
||||
description: Set over under voltage warning limit. This is a limit where
|
||||
hardware is assumed still to be functional but approaching limit where
|
||||
it gets damaged. Recovery actions should be initiated. Zero can be passed
|
||||
to disable detection and value '1' indicates that detection should
|
||||
be enabled but limit setting can be omitted. Limit is given as microvolt
|
||||
offset from voltage set to regulator.
|
||||
|
||||
regulator-temp-protection-kelvin:
|
||||
description: Set over temperature protection limit. This is a limit where
|
||||
hardware performs emergency shutdown. Zero can be passed to disable
|
||||
protection and value '1' indicates that protection should be enabled but
|
||||
limit setting can be omitted.
|
||||
|
||||
regulator-temp-error-kelvin:
|
||||
description: Set over temperature error limit. This is a limit where part of
|
||||
the hardware propably is malfunctional and damage prevention is requested
|
||||
Zero can be passed to disable error detection and value '1' indicates
|
||||
that detection should be enabled but limit setting can be omitted.
|
||||
|
||||
regulator-temp-warn-kelvin:
|
||||
description: Set over temperature warning limit. This is a limit where
|
||||
hardware is assumed still to be functional but approaching limit where it
|
||||
gets damaged. Recovery actions should be initiated. Zero can be passed to
|
||||
disable detection and value '1' indicates that detection should
|
||||
be enabled but limit setting can be omitted.
|
||||
|
||||
regulator-active-discharge:
|
||||
description: |
|
||||
tristate, enable/disable active discharge of regulators. The values are:
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/regulator/richtek,rt6160-regulator.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Richtek RT6160 BuckBoost converter
|
||||
|
||||
maintainers:
|
||||
- ChiYuan Huang <cy_huang@richtek.com>
|
||||
|
||||
description: |
|
||||
The RT6160 is a high-efficiency buck-boost converter that can provide
|
||||
up to 3A output current from 2025mV to 5200mV. And it support the wide
|
||||
input voltage range from 2200mV to 5500mV.
|
||||
|
||||
Datasheet is available at
|
||||
https://www.richtek.com/assets/product_file/RT6160A/DS6160A-00.pdf
|
||||
|
||||
allOf:
|
||||
- $ref: regulator.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- richtek,rt6160
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
enable-gpios:
|
||||
description: A connection of the 'enable' gpio line.
|
||||
maxItems: 1
|
||||
|
||||
richtek,vsel-active-low:
|
||||
description: |
|
||||
Used to indicate the 'vsel' pin active level. if not specified, use
|
||||
high active level as the default.
|
||||
type: boolean
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
rt6160@75 {
|
||||
compatible = "richtek,rt6160";
|
||||
reg = <0x75>;
|
||||
enable-gpios = <&gpio26 2 0>;
|
||||
regulator-name = "rt6160-buckboost";
|
||||
regulator-min-microvolt = <2025000>;
|
||||
regulator-max-microvolt = <5200000>;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,89 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/regulator/richtek,rt6245-regulator.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Richtek RT6245 High Current Voltage Regulator
|
||||
|
||||
maintainers:
|
||||
- ChiYuan Huang <cy_huang@richtek.com>
|
||||
|
||||
description: |
|
||||
The RT6245 is a high-performance, synchronous step-down converter
|
||||
that can deliver up to 14A output current with an input supply
|
||||
voltage range of 4.5V to 17V.
|
||||
|
||||
allOf:
|
||||
- $ref: regulator.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- richtek,rt6245
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
enable-gpios:
|
||||
description: |
|
||||
A connection of the chip 'enable' gpio line. If not provided,
|
||||
it will be treat as a default-on power.
|
||||
maxItems: 1
|
||||
|
||||
richtek,oc-level-select:
|
||||
$ref: "/schemas/types.yaml#/definitions/uint8"
|
||||
enum: [0, 1, 2, 3]
|
||||
description: |
|
||||
Over current level selection. Each respective value means the current
|
||||
limit 8A, 14A, 12A, 10A. If this property is missing then keep in
|
||||
in chip default.
|
||||
|
||||
richtek,ot-level-select:
|
||||
$ref: "/schemas/types.yaml#/definitions/uint8"
|
||||
enum: [0, 1, 2]
|
||||
description: |
|
||||
Over temperature level selection. Each respective value means the degree
|
||||
150'c, 130'c, 170'c. If this property is missing then keep in chip
|
||||
default.
|
||||
|
||||
richtek,pgdly-time-select:
|
||||
$ref: "/schemas/types.yaml#/definitions/uint8"
|
||||
enum: [0, 1, 2, 3]
|
||||
description: |
|
||||
Power good signal delay time selection. Each respective value means the
|
||||
delay time 0us, 10us, 20us, 40us. If this property is missing then keep
|
||||
in chip default.
|
||||
|
||||
|
||||
richtek,switch-freq-select:
|
||||
$ref: "/schemas/types.yaml#/definitions/uint8"
|
||||
enum: [0, 1, 2]
|
||||
description: |
|
||||
Buck switch frequency selection. Each respective value means 400KHz,
|
||||
800KHz, 1200KHz. If this property is missing then keep in chip default.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
rt6245@34 {
|
||||
compatible = "richtek,rt6245";
|
||||
status = "okay";
|
||||
reg = <0x34>;
|
||||
enable-gpios = <&gpio26 2 0>;
|
||||
|
||||
regulator-name = "rt6245-regulator";
|
||||
regulator-min-microvolt = <437500>;
|
||||
regulator-max-microvolt = <1387500>;
|
||||
regulator-boot-on;
|
||||
};
|
||||
};
|
||||
@@ -27,6 +27,12 @@ patternProperties:
|
||||
Properties for single regulator.
|
||||
$ref: "regulator.yaml#"
|
||||
|
||||
properties:
|
||||
rohm,ocw-fet-ron-micro-ohms:
|
||||
description: |
|
||||
External FET's ON-resistance. Required if VoutS1 OCP/OCW is
|
||||
to be set.
|
||||
|
||||
required:
|
||||
- regulator-name
|
||||
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
Renesas RZ/N1 SPI Controller
|
||||
|
||||
This controller is based on the Synopsys DW Synchronous Serial Interface and
|
||||
inherits all properties defined in snps,dw-apb-ssi.txt except for the
|
||||
compatible property.
|
||||
|
||||
Required properties:
|
||||
- compatible : The device specific string followed by the generic RZ/N1 string.
|
||||
Therefore it must be one of:
|
||||
"renesas,r9a06g032-spi", "renesas,rzn1-spi"
|
||||
"renesas,r9a06g033-spi", "renesas,rzn1-spi"
|
||||
@@ -67,6 +67,12 @@ properties:
|
||||
const: baikal,bt1-sys-ssi
|
||||
- description: Canaan Kendryte K210 SoS SPI Controller
|
||||
const: canaan,k210-spi
|
||||
- description: Renesas RZ/N1 SPI Controller
|
||||
items:
|
||||
- enum:
|
||||
- renesas,r9a06g032-spi # RZ/N1D
|
||||
- renesas,r9a06g033-spi # RZ/N1S
|
||||
- const: renesas,rzn1-spi # RZ/N1
|
||||
|
||||
reg:
|
||||
minItems: 1
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
Cadence SPI controller Device Tree Bindings
|
||||
-------------------------------------------
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "cdns,spi-r1p6" or "xlnx,zynq-spi-r1p6".
|
||||
- reg : Physical base address and size of SPI registers map.
|
||||
- interrupts : Property with a value describing the interrupt
|
||||
number.
|
||||
- clock-names : List of input clock names - "ref_clk", "pclk"
|
||||
(See clock bindings for details).
|
||||
- clocks : Clock phandles (see clock bindings for details).
|
||||
|
||||
Optional properties:
|
||||
- num-cs : Number of chip selects used.
|
||||
If a decoder is used, this will be the number of
|
||||
chip selects after the decoder.
|
||||
- is-decoded-cs : Flag to indicate whether decoder is used or not.
|
||||
|
||||
Example:
|
||||
|
||||
spi@e0007000 {
|
||||
compatible = "xlnx,zynq-spi-r1p6";
|
||||
clock-names = "ref_clk", "pclk";
|
||||
clocks = <&clkc 26>, <&clkc 35>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <0 49 4>;
|
||||
num-cs = <4>;
|
||||
is-decoded-cs = <0>;
|
||||
reg = <0xe0007000 0x1000>;
|
||||
} ;
|
||||
@@ -0,0 +1,66 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/spi/spi-cadence.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Cadence SPI controller Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Michal Simek <michal.simek@xilinx.com>
|
||||
|
||||
allOf:
|
||||
- $ref: "spi-controller.yaml#"
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- cdns,spi-r1p6
|
||||
- xlnx,zynq-spi-r1p6
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: ref_clk
|
||||
- const: pclk
|
||||
|
||||
clocks:
|
||||
maxItems: 2
|
||||
|
||||
num-cs:
|
||||
description: |
|
||||
Number of chip selects used. If a decoder is used,
|
||||
this will be the number of chip selects after the
|
||||
decoder.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
minimum: 1
|
||||
maximum: 4
|
||||
default: 4
|
||||
|
||||
is-decoded-cs:
|
||||
description: |
|
||||
Flag to indicate whether decoder is used or not.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [ 0, 1 ]
|
||||
default: 0
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
spi@e0007000 {
|
||||
compatible = "xlnx,zynq-spi-r1p6";
|
||||
clock-names = "ref_clk", "pclk";
|
||||
clocks = <&clkc 26>, <&clkc 35>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <0 49 4>;
|
||||
num-cs = <4>;
|
||||
is-decoded-cs = <0>;
|
||||
reg = <0xe0007000 0x1000>;
|
||||
};
|
||||
...
|
||||
@@ -114,8 +114,11 @@ patternProperties:
|
||||
Compatible of the SPI device.
|
||||
|
||||
reg:
|
||||
minimum: 0
|
||||
maximum: 256
|
||||
minItems: 1
|
||||
maxItems: 256
|
||||
items:
|
||||
minimum: 0
|
||||
maximum: 256
|
||||
description:
|
||||
Chip select used by the device.
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ properties:
|
||||
- rockchip,rk3328-spi
|
||||
- rockchip,rk3368-spi
|
||||
- rockchip,rk3399-spi
|
||||
- rockchip,rv1126-spi
|
||||
- const: rockchip,rk3066-spi
|
||||
|
||||
reg:
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
Xilinx SPI controller Device Tree Bindings
|
||||
-------------------------------------------------
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "xlnx,xps-spi-2.00.a", "xlnx,xps-spi-2.00.b" or "xlnx,axi-quad-spi-1.00.a"
|
||||
- reg : Physical base address and size of SPI registers map.
|
||||
- interrupts : Property with a value describing the interrupt
|
||||
number.
|
||||
|
||||
Optional properties:
|
||||
- xlnx,num-ss-bits : Number of chip selects used.
|
||||
- xlnx,num-transfer-bits : Number of bits per transfer. This will be 8 if not specified
|
||||
|
||||
Example:
|
||||
axi_quad_spi@41e00000 {
|
||||
compatible = "xlnx,xps-spi-2.00.a";
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <0 31 1>;
|
||||
reg = <0x41e00000 0x10000>;
|
||||
xlnx,num-ss-bits = <0x1>;
|
||||
xlnx,num-transfer-bits = <32>;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/spi/spi-xilinx.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Xilinx SPI controller Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Michal Simek <michal.simek@xilinx.com>
|
||||
|
||||
allOf:
|
||||
- $ref: "spi-controller.yaml#"
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- xlnx,xps-spi-2.00.a
|
||||
- xlnx,xps-spi-2.00.b
|
||||
- xlnx,axi-quad-spi-1.00.a
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
xlnx,num-ss-bits:
|
||||
description: Number of chip selects used.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
minimum: 1
|
||||
maximum: 32
|
||||
|
||||
xlnx,num-transfer-bits:
|
||||
description: Number of bits per transfer. This will be 8 if not specified.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [8, 16, 32]
|
||||
default: 8
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
spi0: spi@41e00000 {
|
||||
compatible = "xlnx,xps-spi-2.00.a";
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <0 31 1>;
|
||||
reg = <0x41e00000 0x10000>;
|
||||
xlnx,num-ss-bits = <0x1>;
|
||||
xlnx,num-transfer-bits = <32>;
|
||||
};
|
||||
...
|
||||
@@ -1,25 +0,0 @@
|
||||
Xilinx Zynq UltraScale+ MPSoC GQSPI controller Device Tree Bindings
|
||||
-------------------------------------------------------------------
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "xlnx,zynqmp-qspi-1.0".
|
||||
- reg : Physical base address and size of GQSPI registers map.
|
||||
- interrupts : Property with a value describing the interrupt
|
||||
number.
|
||||
- clock-names : List of input clock names - "ref_clk", "pclk"
|
||||
(See clock bindings for details).
|
||||
- clocks : Clock phandles (see clock bindings for details).
|
||||
|
||||
Optional properties:
|
||||
- num-cs : Number of chip selects used.
|
||||
|
||||
Example:
|
||||
qspi: spi@ff0f0000 {
|
||||
compatible = "xlnx,zynqmp-qspi-1.0";
|
||||
clock-names = "ref_clk", "pclk";
|
||||
clocks = <&misc_clk &misc_clk>;
|
||||
interrupts = <0 15 4>;
|
||||
interrupt-parent = <&gic>;
|
||||
num-cs = <1>;
|
||||
reg = <0x0 0xff0f0000 0x1000>,<0x0 0xc0000000 0x8000000>;
|
||||
};
|
||||
@@ -0,0 +1,51 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/spi/spi-zynqmp-qspi.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Xilinx Zynq UltraScale+ MPSoC GQSPI controller Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Michal Simek <michal.simek@xilinx.com>
|
||||
|
||||
allOf:
|
||||
- $ref: "spi-controller.yaml#"
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: xlnx,zynqmp-qspi-1.0
|
||||
|
||||
reg:
|
||||
maxItems: 2
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: ref_clk
|
||||
- const: pclk
|
||||
|
||||
clocks:
|
||||
maxItems: 2
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/xlnx-zynqmp-clk.h>
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
qspi: spi@ff0f0000 {
|
||||
compatible = "xlnx,zynqmp-qspi-1.0";
|
||||
clocks = <&zynqmp_clk QSPI_REF>, <&zynqmp_clk LPD_LSBUS>;
|
||||
clock-names = "ref_clk", "pclk";
|
||||
interrupts = <0 15 4>;
|
||||
interrupt-parent = <&gic>;
|
||||
reg = <0x0 0xff0f0000 0x0 0x1000>,
|
||||
<0x0 0xc0000000 0x0 0x8000000>;
|
||||
};
|
||||
};
|
||||
@@ -73,6 +73,8 @@ properties:
|
||||
- dallas,ds4510
|
||||
# Digital Thermometer and Thermostat
|
||||
- dallas,ds75
|
||||
# Delta Electronics DPS920AB 920W 54V Power Supply
|
||||
- delta,dps920ab
|
||||
# 1/4 Brick DC/DC Regulated Power Module
|
||||
- delta,q54sj108a2
|
||||
# Devantech SRF02 ultrasonic ranger in I2C mode
|
||||
@@ -103,6 +105,8 @@ properties:
|
||||
- fsl,mpl3115
|
||||
# MPR121: Proximity Capacitive Touch Sensor Controller
|
||||
- fsl,mpr121
|
||||
# Monolithic Power Systems Inc. multi-phase controller mp2888
|
||||
- mps,mp2888
|
||||
# Monolithic Power Systems Inc. multi-phase controller mp2975
|
||||
- mps,mp2975
|
||||
# G751: Digital Temperature Sensor and Thermal Watchdog with Two-Wire Interface
|
||||
|
||||
@@ -740,21 +740,15 @@ possible.
|
||||
5. thermal_emergency_poweroff
|
||||
=============================
|
||||
|
||||
On an event of critical trip temperature crossing. Thermal framework
|
||||
allows the system to shutdown gracefully by calling orderly_poweroff().
|
||||
In the event of a failure of orderly_poweroff() to shut down the system
|
||||
we are in danger of keeping the system alive at undesirably high
|
||||
temperatures. To mitigate this high risk scenario we program a work
|
||||
queue to fire after a pre-determined number of seconds to start
|
||||
an emergency shutdown of the device using the kernel_power_off()
|
||||
function. In case kernel_power_off() fails then finally
|
||||
emergency_restart() is called in the worst case.
|
||||
On an event of critical trip temperature crossing the thermal framework
|
||||
shuts down the system by calling hw_protection_shutdown(). The
|
||||
hw_protection_shutdown() first attempts to perform an orderly shutdown
|
||||
but accepts a delay after which it proceeds doing a forced power-off
|
||||
or as last resort an emergency_restart.
|
||||
|
||||
The delay should be carefully profiled so as to give adequate time for
|
||||
orderly_poweroff(). In case of failure of an orderly_poweroff() the
|
||||
emergency poweroff kicks in after the delay has elapsed and shuts down
|
||||
the system.
|
||||
orderly poweroff.
|
||||
|
||||
If set to 0 emergency poweroff will not be supported. So a carefully
|
||||
profiled non-zero positive value is a must for emergency poweroff to be
|
||||
triggered.
|
||||
If the delay is set to 0 emergency poweroff will not be supported. So a
|
||||
carefully profiled non-zero positive value is a must for emergency
|
||||
poweroff to be triggered.
|
||||
|
||||
@@ -20,7 +20,8 @@ Usage Notes
|
||||
-----------
|
||||
|
||||
This driver does not auto-detect devices. You will have to instantiate the
|
||||
devices explicitly. Please see :doc:`/i2c/instantiating-devices` for details.
|
||||
devices explicitly. Please see Documentation/i2c/instantiating-devices.rst
|
||||
for details.
|
||||
|
||||
|
||||
Sysfs entries
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
Kernel driver dps920ab
|
||||
========================
|
||||
|
||||
Supported chips:
|
||||
|
||||
* Delta DPS920AB
|
||||
|
||||
Prefix: 'dps920ab'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Authors:
|
||||
Robert Marko <robert.marko@sartura.hr>
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver implements support for Delta DPS920AB 920W 54V DC single output
|
||||
power supply with PMBus support.
|
||||
|
||||
The driver is a client driver to the core PMBus driver.
|
||||
Please see Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
|
||||
|
||||
|
||||
Usage Notes
|
||||
-----------
|
||||
|
||||
This driver does not auto-detect devices. You will have to instantiate the
|
||||
devices explicitly. Please see Documentation/i2c/instantiating-devices.rst for
|
||||
details.
|
||||
|
||||
|
||||
Sysfs entries
|
||||
-------------
|
||||
|
||||
======================= ======================================================
|
||||
curr1_label "iin"
|
||||
curr1_input Measured input current
|
||||
curr1_alarm Input current high alarm
|
||||
|
||||
curr2_label "iout1"
|
||||
curr2_input Measured output current
|
||||
curr2_max Maximum output current
|
||||
curr2_rated_max Maximum rated output current
|
||||
|
||||
in1_label "vin"
|
||||
in1_input Measured input voltage
|
||||
in1_alarm Input voltage alarm
|
||||
|
||||
in2_label "vout1"
|
||||
in2_input Measured output voltage
|
||||
in2_rated_min Minimum rated output voltage
|
||||
in2_rated_max Maximum rated output voltage
|
||||
in2_alarm Output voltage alarm
|
||||
|
||||
power1_label "pin"
|
||||
power1_input Measured input power
|
||||
power1_alarm Input power high alarm
|
||||
|
||||
power2_label "pout1"
|
||||
power2_input Measured output power
|
||||
power2_rated_max Maximum rated output power
|
||||
|
||||
temp[1-3]_input Measured temperature
|
||||
temp[1-3]_alarm Temperature alarm
|
||||
|
||||
fan1_alarm Fan 1 warning.
|
||||
fan1_fault Fan 1 fault.
|
||||
fan1_input Fan 1 speed in RPM.
|
||||
======================= ======================================================
|
||||
@@ -53,6 +53,7 @@ Hardware Monitoring Kernel Drivers
|
||||
da9055
|
||||
dell-smm-hwmon
|
||||
dme1737
|
||||
dps920ab
|
||||
drivetemp
|
||||
ds1621
|
||||
ds620
|
||||
@@ -137,6 +138,7 @@ Hardware Monitoring Kernel Drivers
|
||||
mcp3021
|
||||
menf21bmc
|
||||
mlxreg-fan
|
||||
mp2888
|
||||
mp2975
|
||||
nct6683
|
||||
nct6775
|
||||
@@ -150,6 +152,7 @@ Hardware Monitoring Kernel Drivers
|
||||
pc87360
|
||||
pc87427
|
||||
pcf8591
|
||||
pim4328
|
||||
pm6764tr
|
||||
pmbus
|
||||
powr1220
|
||||
@@ -164,6 +167,7 @@ Hardware Monitoring Kernel Drivers
|
||||
sht15
|
||||
sht21
|
||||
sht3x
|
||||
sht4x
|
||||
shtc1
|
||||
sis5595
|
||||
sl28cpld
|
||||
|
||||
@@ -19,7 +19,7 @@ Authors:
|
||||
Description
|
||||
-----------
|
||||
|
||||
The IR36021 is a dual‐loop digital multi‐phase buck controller designed for
|
||||
The IR36021 is a dual-loop digital multi-phase buck controller designed for
|
||||
point of load applications.
|
||||
|
||||
Usage Notes
|
||||
|
||||
@@ -93,9 +93,9 @@ Supported chips:
|
||||
|
||||
https://www.st.com/resource/en/datasheet/stlm75.pdf
|
||||
|
||||
* Texas Instruments TMP100, TMP101, TMP105, TMP112, TMP75, TMP75B, TMP75C, TMP175, TMP275
|
||||
* Texas Instruments TMP100, TMP101, TMP105, TMP112, TMP75, TMP75B, TMP75C, TMP175, TMP275, TMP1075
|
||||
|
||||
Prefixes: 'tmp100', 'tmp101', 'tmp105', 'tmp112', 'tmp175', 'tmp75', 'tmp75b', 'tmp75c', 'tmp275'
|
||||
Prefixes: 'tmp100', 'tmp101', 'tmp105', 'tmp112', 'tmp175', 'tmp75', 'tmp75b', 'tmp75c', 'tmp275', 'tmp1075'
|
||||
|
||||
Addresses scanned: none
|
||||
|
||||
@@ -119,6 +119,8 @@ Supported chips:
|
||||
|
||||
https://www.ti.com/product/tmp275
|
||||
|
||||
https://www.ti.com/product/TMP1075
|
||||
|
||||
* NXP LM75B, PCT2075
|
||||
|
||||
Prefix: 'lm75b', 'pct2075'
|
||||
|
||||
@@ -19,7 +19,7 @@ This driver supports hardware monitoring for Linear Technology LTC2992 power mon
|
||||
LTC2992 is a rail-to-rail system monitor that measures current,
|
||||
voltage, and power of two supplies.
|
||||
|
||||
Two ADCs simultaneously measure each supply’s current. A third ADC monitors
|
||||
Two ADCs simultaneously measure each supply's current. A third ADC monitors
|
||||
the input voltages and four auxiliary external voltages.
|
||||
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ Sysfs entries
|
||||
fan[1-12]_input RO fan tachometer speed in RPM
|
||||
fan[1-12]_fault RO fan experienced fault
|
||||
fan[1-6]_target RW desired fan speed in RPM
|
||||
pwm[1-6]_enable RW regulator mode, 0=disabled, 1=manual mode, 2=rpm mode
|
||||
pwm[1-6] RW fan target duty cycle (0-255)
|
||||
pwm[1-6]_enable RW regulator mode, 0=disabled (duty cycle=0%), 1=manual mode, 2=rpm mode
|
||||
pwm[1-6] RW read: current pwm duty cycle,
|
||||
write: target pwm duty cycle (0-255)
|
||||
================== === =======================================================
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
Kernel driver mp2888
|
||||
====================
|
||||
|
||||
Supported chips:
|
||||
|
||||
* MPS MP12254
|
||||
|
||||
Prefix: 'mp2888'
|
||||
|
||||
Author:
|
||||
|
||||
Vadim Pasternak <vadimp@nvidia.com>
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver implements support for Monolithic Power Systems, Inc. (MPS)
|
||||
vendor dual-loop, digital, multi-phase controller MP2888.
|
||||
|
||||
This device: supports:
|
||||
|
||||
- One power rail.
|
||||
- Programmable Multi-Phase up to 10 Phases.
|
||||
- PWM-VID Interface
|
||||
- One pages 0 for telemetry.
|
||||
- Programmable pins for PMBus Address.
|
||||
- Built-In EEPROM to Store Custom Configurations.
|
||||
|
||||
Device complaint with:
|
||||
|
||||
- PMBus rev 1.3 interface.
|
||||
|
||||
Device supports direct format for reading output current, output voltage,
|
||||
input and output power and temperature.
|
||||
Device supports linear format for reading input voltage and input power.
|
||||
|
||||
The driver provides the next attributes for the current:
|
||||
|
||||
- for current out input and maximum alarm;
|
||||
- for phase current: input and label.
|
||||
|
||||
The driver exports the following attributes via the 'sysfs' files, where:
|
||||
|
||||
- 'n' is number of configured phases (from 1 to 10);
|
||||
- index 1 for "iout";
|
||||
- indexes 2 ... 1 + n for phases.
|
||||
|
||||
**curr[1-{1+n}]_input**
|
||||
|
||||
**curr[1-{1+n}]_label**
|
||||
|
||||
**curr1_max**
|
||||
|
||||
**curr1_max_alarm**
|
||||
|
||||
The driver provides the next attributes for the voltage:
|
||||
|
||||
- for voltage in: input, low and high critical thresholds, low and high
|
||||
critical alarms;
|
||||
- for voltage out: input and high alarm;
|
||||
|
||||
The driver exports the following attributes via the 'sysfs' files, where
|
||||
|
||||
**in1_crit**
|
||||
|
||||
**in1_crit_alarm**
|
||||
|
||||
**in1_input**
|
||||
|
||||
**in1_label**
|
||||
|
||||
**in1_min**
|
||||
|
||||
**in1_min_alarm**
|
||||
|
||||
**in2_alarm**
|
||||
|
||||
**in2_input**
|
||||
|
||||
**in2_label**
|
||||
|
||||
The driver provides the next attributes for the power:
|
||||
|
||||
- for power in alarm and input.
|
||||
- for power out: cap, cap alarm an input.
|
||||
|
||||
The driver exports the following attributes via the 'sysfs' files, where
|
||||
- indexes 1 for "pin";
|
||||
- indexes 2 for "pout";
|
||||
|
||||
**power1_alarm**
|
||||
|
||||
**power1_input**
|
||||
|
||||
**power1_label**
|
||||
|
||||
**power2_input**
|
||||
|
||||
**power2_label**
|
||||
|
||||
**power2_max**
|
||||
|
||||
**power2_max_alarm**
|
||||
|
||||
The driver provides the next attributes for the temperature:
|
||||
|
||||
**temp1_input**
|
||||
|
||||
**temp1_max**
|
||||
|
||||
**temp1_max_alarm**
|
||||
@@ -0,0 +1,105 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
Kernel driver pim4328
|
||||
=====================
|
||||
|
||||
Supported chips:
|
||||
|
||||
* Flex PIM4328
|
||||
|
||||
Prefix: 'pim4328', 'bmr455'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet:
|
||||
|
||||
https://flexpowermodules.com/resources/fpm-techspec-pim4328
|
||||
|
||||
* Flex PIM4820
|
||||
|
||||
Prefixes: 'pim4820'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: https://flexpowermodules.com/resources/fpm-techspec-pim4820
|
||||
|
||||
* Flex PIM4006, PIM4106, PIM4206, PIM4306, PIM4406
|
||||
|
||||
Prefixes: 'pim4006', 'pim4106', 'pim4206', 'pim4306', 'pim4406'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: https://flexpowermodules.com/resources/fpm-techspec-pim4006
|
||||
|
||||
Author: Erik Rosen <erik.rosen@metormote.com>
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver supports hardware monitoring for Flex PIM4328 and
|
||||
compatible digital power interface modules.
|
||||
|
||||
The driver is a client driver to the core PMBus driver. Please see
|
||||
Documentation/hwmon/pmbus.rst and Documentation.hwmon/pmbus-core for details
|
||||
on PMBus client drivers.
|
||||
|
||||
|
||||
Usage Notes
|
||||
-----------
|
||||
|
||||
This driver does not auto-detect devices. You will have to instantiate the
|
||||
devices explicitly. Please see Documentation/i2c/instantiating-devices.rst for
|
||||
details.
|
||||
|
||||
|
||||
Platform data support
|
||||
---------------------
|
||||
|
||||
The driver supports standard PMBus driver platform data.
|
||||
|
||||
|
||||
Sysfs entries
|
||||
-------------
|
||||
|
||||
The following attributes are supported. All attributes are read-only.
|
||||
|
||||
======================= ========================================================
|
||||
in1_label "vin"
|
||||
in1_input Measured input voltage.
|
||||
in1_alarm Input voltage alarm.
|
||||
|
||||
in2_label "vin.0"
|
||||
in2_input Measured input voltage on input A.
|
||||
|
||||
PIM4328 and PIM4X06
|
||||
|
||||
in3_label "vin.1"
|
||||
in3_input Measured input voltage on input B.
|
||||
|
||||
PIM4328 and PIM4X06
|
||||
|
||||
in4_label "vcap"
|
||||
in4_input Measured voltage on holdup capacitor.
|
||||
|
||||
PIM4328
|
||||
|
||||
curr1_label "iin.0"
|
||||
curr1_input Measured input current on input A.
|
||||
|
||||
PIM4X06
|
||||
|
||||
curr2_label "iin.1"
|
||||
curr2_input Measured input current on input B.
|
||||
|
||||
PIM4X06
|
||||
|
||||
currX_label "iout1"
|
||||
currX_input Measured output current.
|
||||
currX_alarm Output current alarm.
|
||||
|
||||
X is 1 for PIM4820, 3 otherwise.
|
||||
|
||||
temp1_input Measured temperature.
|
||||
temp1_alarm High temperature alarm.
|
||||
======================= ========================================================
|
||||
@@ -20,7 +20,7 @@ Description:
|
||||
------------
|
||||
|
||||
This driver supports the STMicroelectronics PM6764TR chip. The PM6764TR is a high
|
||||
performance digital controller designed to power Intel’s VR12.5 processors and memories.
|
||||
performance digital controller designed to power Intel's VR12.5 processors and memories.
|
||||
|
||||
The device utilizes digital technology to implement all control and power management
|
||||
functions to provide maximum flexibility and performance. The NVM is embedded to store
|
||||
|
||||
@@ -289,12 +289,22 @@ PMBus driver platform data
|
||||
==========================
|
||||
|
||||
PMBus platform data is defined in include/linux/pmbus.h. Platform data
|
||||
currently only provides a flag field with a single bit used::
|
||||
currently provides a flags field with four bits used::
|
||||
|
||||
#define PMBUS_SKIP_STATUS_CHECK (1 << 0)
|
||||
#define PMBUS_SKIP_STATUS_CHECK BIT(0)
|
||||
|
||||
#define PMBUS_WRITE_PROTECTED BIT(1)
|
||||
|
||||
#define PMBUS_NO_CAPABILITY BIT(2)
|
||||
|
||||
#define PMBUS_READ_STATUS_AFTER_FAILED_CHECK BIT(3)
|
||||
|
||||
struct pmbus_platform_data {
|
||||
u32 flags; /* Device specific flags */
|
||||
|
||||
/* regulator support */
|
||||
int num_regulators;
|
||||
struct regulator_init_data *reg_init_data;
|
||||
};
|
||||
|
||||
|
||||
@@ -302,8 +312,9 @@ Flags
|
||||
-----
|
||||
|
||||
PMBUS_SKIP_STATUS_CHECK
|
||||
During register detection, skip checking the status register for
|
||||
communication or command errors.
|
||||
|
||||
During register detection, skip checking the status register for
|
||||
communication or command errors.
|
||||
|
||||
Some PMBus chips respond with valid data when trying to read an unsupported
|
||||
register. For such chips, checking the status register is mandatory when
|
||||
@@ -315,3 +326,26 @@ status register must be disabled.
|
||||
Some i2c controllers do not support single-byte commands (write commands with
|
||||
no data, i2c_smbus_write_byte()). With such controllers, clearing the status
|
||||
register is impossible, and the PMBUS_SKIP_STATUS_CHECK flag must be set.
|
||||
|
||||
PMBUS_WRITE_PROTECTED
|
||||
|
||||
Set if the chip is write protected and write protection is not determined
|
||||
by the standard WRITE_PROTECT command.
|
||||
|
||||
PMBUS_NO_CAPABILITY
|
||||
|
||||
Some PMBus chips don't respond with valid data when reading the CAPABILITY
|
||||
register. For such chips, this flag should be set so that the PMBus core
|
||||
driver doesn't use CAPABILITY to determine it's behavior.
|
||||
|
||||
PMBUS_READ_STATUS_AFTER_FAILED_CHECK
|
||||
|
||||
Read the STATUS register after each failed register check.
|
||||
|
||||
Some PMBus chips end up in an undefined state when trying to read an
|
||||
unsupported register. For such chips, it is necessary to reset the
|
||||
chip pmbus controller to a known state after a failed register check.
|
||||
This can be done by reading a known register. By setting this flag the
|
||||
driver will try to read the STATUS register after each failed
|
||||
register check. This read may fail, but it will put the chip into a
|
||||
known state.
|
||||
|
||||
@@ -3,15 +3,18 @@ Kernel driver pmbus
|
||||
|
||||
Supported chips:
|
||||
|
||||
* Ericsson BMR453, BMR454
|
||||
* Flex BMR310, BMR453, BMR454, BMR456, BMR457, BMR458, BMR480,
|
||||
BMR490, BMR491, BMR492
|
||||
|
||||
Prefixes: 'bmr453', 'bmr454'
|
||||
Prefixes: 'bmr310', 'bmr453', 'bmr454', 'bmr456', 'bmr457', 'bmr458', 'bmr480',
|
||||
'bmr490', 'bmr491', 'bmr492'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet:
|
||||
Datasheets:
|
||||
|
||||
https://flexpowermodules.com/products
|
||||
|
||||
http://archive.ericsson.net/service/internet/picov/get?DocNo=28701-EN/LZT146395
|
||||
|
||||
* ON Semiconductor ADP4000, NCP4200, NCP4208
|
||||
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
Kernel driver sht4x
|
||||
===================
|
||||
|
||||
Supported Chips:
|
||||
|
||||
* Sensirion SHT4X
|
||||
|
||||
Prefix: 'sht4x'
|
||||
|
||||
Addresses scanned: None
|
||||
|
||||
Datasheet:
|
||||
|
||||
English: https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/2_Humidity_Sensors/Datasheets/Sensirion_Humidity_Sensors_SHT4x_Datasheet.pdf
|
||||
|
||||
Author: Navin Sankar Velliangiri <navin@linumiz.com>
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver implements support for the Sensirion SHT4x chip, a humidity
|
||||
and temperature sensor. Temperature is measured in degree celsius, relative
|
||||
humidity is expressed as a percentage. In sysfs interface, all values are
|
||||
scaled by 1000, i.e. the value for 31.5 degrees celsius is 31500.
|
||||
|
||||
Usage Notes
|
||||
-----------
|
||||
|
||||
The device communicates with the I2C protocol. Sensors can have the I2C
|
||||
address 0x44. See Documentation/i2c/instantiating-devices.rst for methods
|
||||
to instantiate the device.
|
||||
|
||||
Sysfs entries
|
||||
-------------
|
||||
|
||||
=============== ============================================
|
||||
temp1_input Measured temperature in millidegrees Celcius
|
||||
humidity1_input Measured humidity in %H
|
||||
update_interval The minimum interval for polling the sensor,
|
||||
in milliseconds. Writable. Must be at least
|
||||
2000.
|
||||
============== =============================================
|
||||
@@ -3,87 +3,103 @@ Kernel driver zl6100
|
||||
|
||||
Supported chips:
|
||||
|
||||
* Intersil / Zilker Labs ZL2004
|
||||
* Renesas / Intersil / Zilker Labs ZL2004
|
||||
|
||||
Prefix: 'zl2004'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6847.pdf
|
||||
Datasheet: https://www.renesas.com/us/en/document/dst/zl2004-datasheet.pdf
|
||||
|
||||
* Intersil / Zilker Labs ZL2005
|
||||
* Renesas / Intersil / Zilker Labs ZL2005
|
||||
|
||||
Prefix: 'zl2005'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6848.pdf
|
||||
Datasheet: https://www.renesas.com/us/en/document/dst/zl2005-datasheet.pdf
|
||||
|
||||
* Intersil / Zilker Labs ZL2006
|
||||
* Renesas / Intersil / Zilker Labs ZL2006
|
||||
|
||||
Prefix: 'zl2006'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6850.pdf
|
||||
Datasheet: https://www.renesas.com/us/en/document/dst/zl2006-datasheet.pdf
|
||||
|
||||
* Intersil / Zilker Labs ZL2008
|
||||
* Renesas / Intersil / Zilker Labs ZL2008
|
||||
|
||||
Prefix: 'zl2008'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6859.pdf
|
||||
Datasheet: https://www.renesas.com/us/en/document/dst/zl2008-datasheet.pdf
|
||||
|
||||
* Intersil / Zilker Labs ZL2105
|
||||
* Renesas / Intersil / Zilker Labs ZL2105
|
||||
|
||||
Prefix: 'zl2105'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6851.pdf
|
||||
Datasheet: https://www.renesas.com/us/en/document/dst/zl2105-datasheet.pdf
|
||||
|
||||
* Intersil / Zilker Labs ZL2106
|
||||
* Renesas / Intersil / Zilker Labs ZL2106
|
||||
|
||||
Prefix: 'zl2106'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6852.pdf
|
||||
Datasheet: https://www.renesas.com/us/en/document/dst/zl2106-datasheet.pdf
|
||||
|
||||
* Intersil / Zilker Labs ZL6100
|
||||
* Renesas / Intersil / Zilker Labs ZL6100
|
||||
|
||||
Prefix: 'zl6100'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6876.pdf
|
||||
Datasheet: https://www.renesas.com/us/en/document/dst/zl6100-datasheet.pdf
|
||||
|
||||
* Intersil / Zilker Labs ZL6105
|
||||
* Renesas / Intersil / Zilker Labs ZL6105
|
||||
|
||||
Prefix: 'zl6105'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6906.pdf
|
||||
Datasheet: https://www.renesas.com/us/en/document/dst/zl6105-datasheet.pdf
|
||||
|
||||
* Intersil / Zilker Labs ZL9101M
|
||||
* Renesas / Intersil / Zilker Labs ZL8802
|
||||
|
||||
Prefix: 'zl8802'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: https://www.renesas.com/us/en/document/dst/zl8802-datasheet
|
||||
|
||||
* Renesas / Intersil / Zilker Labs ZL9101M
|
||||
|
||||
Prefix: 'zl9101'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: http://www.intersil.com/data/fn/fn7669.pdf
|
||||
Datasheet: https://www.renesas.com/us/en/document/dst/zl9101m-datasheet
|
||||
|
||||
* Intersil / Zilker Labs ZL9117M
|
||||
* Renesas / Intersil / Zilker Labs ZL9117M
|
||||
|
||||
Prefix: 'zl9117'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: http://www.intersil.com/data/fn/fn7914.pdf
|
||||
Datasheet: https://www.renesas.com/us/en/document/dst/zl9117m-datasheet
|
||||
|
||||
* Ericsson BMR450, BMR451
|
||||
* Renesas / Intersil / Zilker Labs ZLS1003, ZLS4009
|
||||
|
||||
Prefix: 'zls1003', zls4009
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: Not published
|
||||
|
||||
* Flex BMR450, BMR451
|
||||
|
||||
Prefix: 'bmr450', 'bmr451'
|
||||
|
||||
@@ -91,17 +107,39 @@ Supported chips:
|
||||
|
||||
Datasheet:
|
||||
|
||||
http://archive.ericsson.net/service/internet/picov/get?DocNo=28701-EN/LZT146401
|
||||
https://flexpowermodules.com/resources/fpm-techspec-bmr450-digital-pol-regulators-20a
|
||||
|
||||
* Ericsson BMR462, BMR463, BMR464
|
||||
* Flex BMR462, BMR463, BMR464
|
||||
|
||||
Prefixes: 'bmr462', 'bmr463', 'bmr464'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet:
|
||||
Datasheet: https://flexpowermodules.com/resources/fpm-techspec-bmr462
|
||||
|
||||
http://archive.ericsson.net/service/internet/picov/get?DocNo=28701-EN/LZT146256
|
||||
* Flex BMR465, BMR467
|
||||
|
||||
Prefixes: 'bmr465', 'bmr467'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: https://flexpowermodules.com/resources/fpm-techspec-bmr465-digital-pol
|
||||
|
||||
* Flex BMR466
|
||||
|
||||
Prefixes: 'bmr466'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: https://flexpowermodules.com/resources/fpm-techspec-bmr466-8x12
|
||||
|
||||
* Flex BMR469
|
||||
|
||||
Prefixes: 'bmr469'
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Datasheet: https://flexpowermodules.com/resources/fpm-techspec-bmr4696001
|
||||
|
||||
Author: Guenter Roeck <linux@roeck-us.net>
|
||||
|
||||
@@ -109,8 +147,8 @@ Author: Guenter Roeck <linux@roeck-us.net>
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver supports hardware monitoring for Intersil / Zilker Labs ZL6100 and
|
||||
compatible digital DC-DC controllers.
|
||||
This driver supports hardware monitoring for Renesas / Intersil / Zilker Labs
|
||||
ZL6100 and compatible digital DC-DC controllers.
|
||||
|
||||
The driver is a client driver to the core PMBus driver. Please see
|
||||
Documentation/hwmon/pmbus.rst and Documentation.hwmon/pmbus-core for details
|
||||
@@ -147,12 +185,12 @@ Module parameters
|
||||
delay
|
||||
-----
|
||||
|
||||
Intersil/Zilker Labs DC-DC controllers require a minimum interval between I2C
|
||||
bus accesses. According to Intersil, the minimum interval is 2 ms, though 1 ms
|
||||
appears to be sufficient and has not caused any problems in testing. The problem
|
||||
is known to affect all currently supported chips. For manual override, the
|
||||
driver provides a writeable module parameter, 'delay', which can be used to set
|
||||
the interval to a value between 0 and 65,535 microseconds.
|
||||
Renesas/Intersil/Zilker Labs DC-DC controllers require a minimum interval
|
||||
between I2C bus accesses. According to Intersil, the minimum interval is 2 ms,
|
||||
though 1 ms appears to be sufficient and has not caused any problems in testing.
|
||||
The problem is known to affect all currently supported chips. For manual override,
|
||||
the driver provides a writeable module parameter, 'delay', which can be used
|
||||
to set the interval to a value between 0 and 65,535 microseconds.
|
||||
|
||||
|
||||
Sysfs entries
|
||||
@@ -182,24 +220,32 @@ in2_crit Critical maximum VMON/VDRV voltage.
|
||||
in2_lcrit_alarm VMON/VDRV voltage critical low alarm.
|
||||
in2_crit_alarm VMON/VDRV voltage critical high alarm.
|
||||
|
||||
vmon attributes are supported on ZL2004, ZL9101M,
|
||||
and ZL9117M only.
|
||||
vmon attributes are supported on ZL2004, ZL8802,
|
||||
ZL9101M, ZL9117M and ZLS4009 only.
|
||||
|
||||
inX_label "vout1"
|
||||
inX_label "vout[12]"
|
||||
inX_input Measured output voltage.
|
||||
inX_lcrit Critical minimum output Voltage.
|
||||
inX_crit Critical maximum output voltage.
|
||||
inX_lcrit_alarm Critical output voltage critical low alarm.
|
||||
inX_crit_alarm Critical output voltage critical high alarm.
|
||||
|
||||
X is 3 for ZL2004, ZL9101M, and ZL9117M, 2 otherwise.
|
||||
X is 3 for ZL2004, ZL9101M, and ZL9117M,
|
||||
3, 4 for ZL8802 and 2 otherwise.
|
||||
|
||||
curr1_label "iout1"
|
||||
curr1_input Measured output current.
|
||||
curr1_lcrit Critical minimum output current.
|
||||
curr1_crit Critical maximum output current.
|
||||
curr1_lcrit_alarm Output current critical low alarm.
|
||||
curr1_crit_alarm Output current critical high alarm.
|
||||
curr1_label "iin"
|
||||
curr1_input Measured input current.
|
||||
|
||||
iin attributes are supported on ZL8802 only
|
||||
|
||||
currY_label "iout[12]"
|
||||
currY_input Measured output current.
|
||||
currY_lcrit Critical minimum output current.
|
||||
currY_crit Critical maximum output current.
|
||||
currY_lcrit_alarm Output current critical low alarm.
|
||||
currY_crit_alarm Output current critical high alarm.
|
||||
|
||||
Y is 2, 3 for ZL8802, 1 otherwise
|
||||
|
||||
temp[12]_input Measured temperature.
|
||||
temp[12]_min Minimum temperature.
|
||||
|
||||
@@ -453,9 +453,9 @@ There are simply four block conditions:
|
||||
Block condition matrix, Y means the row blocks the column, and N means otherwise.
|
||||
|
||||
+---+---+---+---+
|
||||
| | E | r | R |
|
||||
| | W | r | R |
|
||||
+---+---+---+---+
|
||||
| E | Y | Y | Y |
|
||||
| W | Y | Y | Y |
|
||||
+---+---+---+---+
|
||||
| r | Y | Y | N |
|
||||
+---+---+---+---+
|
||||
|
||||
@@ -284,8 +284,10 @@ whether the system exhibits asymmetric CPU capacities. Should that be the
|
||||
case:
|
||||
|
||||
- The sched_asym_cpucapacity static key will be enabled.
|
||||
- The SD_ASYM_CPUCAPACITY flag will be set at the lowest sched_domain level that
|
||||
spans all unique CPU capacity values.
|
||||
- The SD_ASYM_CPUCAPACITY_FULL flag will be set at the lowest sched_domain
|
||||
level that spans all unique CPU capacity values.
|
||||
- The SD_ASYM_CPUCAPACITY flag will be set for any sched_domain that spans
|
||||
CPUs with any range of asymmetry.
|
||||
|
||||
The sched_asym_cpucapacity static key is intended to guard sections of code that
|
||||
cater to asymmetric CPU capacity systems. Do note however that said key is
|
||||
|
||||
@@ -328,7 +328,7 @@ section lists these dependencies and provides hints as to how they can be met.
|
||||
|
||||
As mentioned in the introduction, EAS is only supported on platforms with
|
||||
asymmetric CPU topologies for now. This requirement is checked at run-time by
|
||||
looking for the presence of the SD_ASYM_CPUCAPACITY flag when the scheduling
|
||||
looking for the presence of the SD_ASYM_CPUCAPACITY_FULL flag when the scheduling
|
||||
domains are built.
|
||||
|
||||
See Documentation/scheduler/sched-capacity.rst for requirements to be met for this
|
||||
|
||||
@@ -2,43 +2,47 @@
|
||||
PXA2xx SPI on SSP driver HOWTO
|
||||
==============================
|
||||
|
||||
This a mini howto on the pxa2xx_spi driver. The driver turns a PXA2xx
|
||||
synchronous serial port into a SPI master controller
|
||||
This a mini HOWTO on the pxa2xx_spi driver. The driver turns a PXA2xx
|
||||
synchronous serial port into an SPI master controller
|
||||
(see Documentation/spi/spi-summary.rst). The driver has the following features
|
||||
|
||||
- Support for any PXA2xx SSP
|
||||
- Support for any PXA2xx and compatible SSP.
|
||||
- SSP PIO and SSP DMA data transfers.
|
||||
- External and Internal (SSPFRM) chip selects.
|
||||
- Per slave device (chip) configuration.
|
||||
- Full suspend, freeze, resume support.
|
||||
|
||||
The driver is built around a "spi_message" fifo serviced by workqueue and a
|
||||
tasklet. The workqueue, "pump_messages", drives message fifo and the tasklet
|
||||
(pump_transfer) is responsible for queuing SPI transactions and setting up and
|
||||
launching the dma/interrupt driven transfers.
|
||||
The driver is built around a &struct spi_message FIFO serviced by kernel
|
||||
thread. The kernel thread, spi_pump_messages(), drives message FIFO and
|
||||
is responsible for queuing SPI transactions and setting up and launching
|
||||
the DMA or interrupt driven transfers.
|
||||
|
||||
Declaring PXA2xx Master Controllers
|
||||
-----------------------------------
|
||||
Typically a SPI master is defined in the arch/.../mach-*/board-*.c as a
|
||||
"platform device". The master configuration is passed to the driver via a table
|
||||
found in include/linux/spi/pxa2xx_spi.h::
|
||||
Typically, for a legacy platform, an SPI master is defined in the
|
||||
arch/.../mach-*/board-*.c as a "platform device". The master configuration
|
||||
is passed to the driver via a table found in include/linux/spi/pxa2xx_spi.h::
|
||||
|
||||
struct pxa2xx_spi_controller {
|
||||
u16 num_chipselect;
|
||||
u8 enable_dma;
|
||||
...
|
||||
};
|
||||
|
||||
The "pxa2xx_spi_controller.num_chipselect" field is used to determine the number of
|
||||
slave device (chips) attached to this SPI master.
|
||||
|
||||
The "pxa2xx_spi_controller.enable_dma" field informs the driver that SSP DMA should
|
||||
be used. This caused the driver to acquire two DMA channels: rx_channel and
|
||||
tx_channel. The rx_channel has a higher DMA service priority the tx_channel.
|
||||
be used. This caused the driver to acquire two DMA channels: Rx channel and
|
||||
Tx channel. The Rx channel has a higher DMA service priority than the Tx channel.
|
||||
See the "PXA2xx Developer Manual" section "DMA Controller".
|
||||
|
||||
For the new platforms the description of the controller and peripheral devices
|
||||
comes from Device Tree or ACPI.
|
||||
|
||||
NSSP MASTER SAMPLE
|
||||
------------------
|
||||
Below is a sample configuration using the PXA255 NSSP::
|
||||
Below is a sample configuration using the PXA255 NSSP for a legacy platform::
|
||||
|
||||
static struct resource pxa_spi_nssp_resources[] = {
|
||||
[0] = {
|
||||
@@ -79,9 +83,10 @@ Below is a sample configuration using the PXA255 NSSP::
|
||||
|
||||
Declaring Slave Devices
|
||||
-----------------------
|
||||
Typically each SPI slave (chip) is defined in the arch/.../mach-*/board-*.c
|
||||
using the "spi_board_info" structure found in "linux/spi/spi.h". See
|
||||
"Documentation/spi/spi-summary.rst" for additional information.
|
||||
Typically, for a legacy platform, each SPI slave (chip) is defined in the
|
||||
arch/.../mach-*/board-*.c using the "spi_board_info" structure found in
|
||||
"linux/spi/spi.h". See "Documentation/spi/spi-summary.rst" for additional
|
||||
information.
|
||||
|
||||
Each slave device attached to the PXA must provide slave specific configuration
|
||||
information via the structure "pxa2xx_spi_chip" found in
|
||||
@@ -101,9 +106,9 @@ device. All fields are optional.
|
||||
};
|
||||
|
||||
The "pxa2xx_spi_chip.tx_threshold" and "pxa2xx_spi_chip.rx_threshold" fields are
|
||||
used to configure the SSP hardware fifo. These fields are critical to the
|
||||
used to configure the SSP hardware FIFO. These fields are critical to the
|
||||
performance of pxa2xx_spi driver and misconfiguration will result in rx
|
||||
fifo overruns (especially in PIO mode transfers). Good default values are::
|
||||
FIFO overruns (especially in PIO mode transfers). Good default values are::
|
||||
|
||||
.tx_threshold = 8,
|
||||
.rx_threshold = 8,
|
||||
@@ -118,7 +123,7 @@ use a value of 8. The driver will determine a reasonable default if
|
||||
dma_burst_size == 0.
|
||||
|
||||
The "pxa2xx_spi_chip.timeout" fields is used to efficiently handle
|
||||
trailing bytes in the SSP receiver fifo. The correct value for this field is
|
||||
trailing bytes in the SSP receiver FIFO. The correct value for this field is
|
||||
dependent on the SPI bus speed ("spi_board_info.max_speed_hz") and the specific
|
||||
slave device. Please note that the PXA2xx SSP 1 does not support trailing byte
|
||||
timeouts and must busy-wait any trailing bytes.
|
||||
@@ -131,19 +136,19 @@ testing.
|
||||
The "pxa2xx_spi_chip.cs_control" field is used to point to a board specific
|
||||
function for asserting/deasserting a slave device chip select. If the field is
|
||||
NULL, the pxa2xx_spi master controller driver assumes that the SSP port is
|
||||
configured to use SSPFRM instead.
|
||||
configured to use GPIO or SSPFRM instead.
|
||||
|
||||
NOTE: the SPI driver cannot control the chip select if SSPFRM is used, so the
|
||||
chipselect is dropped after each spi_transfer. Most devices need chip select
|
||||
asserted around the complete message. Use SSPFRM as a GPIO (through cs_control)
|
||||
asserted around the complete message. Use SSPFRM as a GPIO (through a descriptor)
|
||||
to accommodate these chips.
|
||||
|
||||
|
||||
NSSP SLAVE SAMPLE
|
||||
-----------------
|
||||
The pxa2xx_spi_chip structure is passed to the pxa2xx_spi driver in the
|
||||
"spi_board_info.controller_data" field. Below is a sample configuration using
|
||||
the PXA255 NSSP.
|
||||
For a legacy platform or in some other cases, the pxa2xx_spi_chip structure
|
||||
is passed to the pxa2xx_spi driver in the "spi_board_info.controller_data"
|
||||
field. Below is a sample configuration using the PXA255 NSSP.
|
||||
|
||||
::
|
||||
|
||||
@@ -212,7 +217,9 @@ DMA and PIO I/O Support
|
||||
-----------------------
|
||||
The pxa2xx_spi driver supports both DMA and interrupt driven PIO message
|
||||
transfers. The driver defaults to PIO mode and DMA transfers must be enabled
|
||||
by setting the "enable_dma" flag in the "pxa2xx_spi_controller" structure. The DMA
|
||||
by setting the "enable_dma" flag in the "pxa2xx_spi_controller" structure.
|
||||
For the newer platforms, that are known to support DMA, the driver will enable
|
||||
it automatically and try it first with a possible fallback to PIO. The DMA
|
||||
mode supports both coherent and stream based DMA mappings.
|
||||
|
||||
The following logic is used to determine the type of I/O to be used on
|
||||
@@ -236,5 +243,4 @@ a per "spi_transfer" basis::
|
||||
|
||||
THANKS TO
|
||||
---------
|
||||
|
||||
David Brownell and others for mentoring the development of this driver.
|
||||
|
||||
@@ -362,14 +362,11 @@ register_kprobe
|
||||
#include <linux/kprobes.h>
|
||||
int register_kprobe(struct kprobe *kp);
|
||||
|
||||
Sets a breakpoint at the address kp->addr. When the breakpoint is
|
||||
hit, Kprobes calls kp->pre_handler. After the probed instruction
|
||||
is single-stepped, Kprobe calls kp->post_handler. If a fault
|
||||
occurs during execution of kp->pre_handler or kp->post_handler,
|
||||
or during single-stepping of the probed instruction, Kprobes calls
|
||||
kp->fault_handler. Any or all handlers can be NULL. If kp->flags
|
||||
is set KPROBE_FLAG_DISABLED, that kp will be registered but disabled,
|
||||
so, its handlers aren't hit until calling enable_kprobe(kp).
|
||||
Sets a breakpoint at the address kp->addr. When the breakpoint is hit, Kprobes
|
||||
calls kp->pre_handler. After the probed instruction is single-stepped, Kprobe
|
||||
calls kp->post_handler. Any or all handlers can be NULL. If kp->flags is set
|
||||
KPROBE_FLAG_DISABLED, that kp will be registered but disabled, so, its handlers
|
||||
aren't hit until calling enable_kprobe(kp).
|
||||
|
||||
.. note::
|
||||
|
||||
@@ -415,17 +412,6 @@ User's post-handler (kp->post_handler)::
|
||||
p and regs are as described for the pre_handler. flags always seems
|
||||
to be zero.
|
||||
|
||||
User's fault-handler (kp->fault_handler)::
|
||||
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/ptrace.h>
|
||||
int fault_handler(struct kprobe *p, struct pt_regs *regs, int trapnr);
|
||||
|
||||
p and regs are as described for the pre_handler. trapnr is the
|
||||
architecture-specific trap number associated with the fault (e.g.,
|
||||
on i386, 13 for a general protection fault or 14 for a page fault).
|
||||
Returns 1 if it successfully handled the exception.
|
||||
|
||||
register_kretprobe
|
||||
------------------
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@ Summary of `HDIO_` ioctl calls
|
||||
November, 2004
|
||||
|
||||
This document attempts to describe the ioctl(2) calls supported by
|
||||
the HD/IDE layer. These are by-and-large implemented (as of Linux 2.6)
|
||||
in drivers/ide/ide.c and drivers/block/scsi_ioctl.c
|
||||
the HD/IDE layer. These are by-and-large implemented (as of Linux 5.11)
|
||||
drivers/ata/libata-scsi.c.
|
||||
|
||||
ioctl values are listed in <linux/hdreg.h>. As of this writing, they
|
||||
are as follows:
|
||||
@@ -17,50 +17,17 @@ are as follows:
|
||||
|
||||
======================= =======================================
|
||||
HDIO_GETGEO get device geometry
|
||||
HDIO_GET_UNMASKINTR get current unmask setting
|
||||
HDIO_GET_MULTCOUNT get current IDE blockmode setting
|
||||
HDIO_GET_QDMA get use-qdma flag
|
||||
HDIO_SET_XFER set transfer rate via proc
|
||||
HDIO_OBSOLETE_IDENTITY OBSOLETE, DO NOT USE
|
||||
HDIO_GET_KEEPSETTINGS get keep-settings-on-reset flag
|
||||
HDIO_GET_32BIT get current io_32bit setting
|
||||
HDIO_GET_NOWERR get ignore-write-error flag
|
||||
HDIO_GET_DMA get use-dma flag
|
||||
HDIO_GET_NICE get nice flags
|
||||
HDIO_GET_IDENTITY get IDE identification info
|
||||
HDIO_GET_WCACHE get write cache mode on|off
|
||||
HDIO_GET_ACOUSTIC get acoustic value
|
||||
HDIO_GET_ADDRESS get sector addressing mode
|
||||
HDIO_GET_BUSSTATE get the bus state of the hwif
|
||||
HDIO_TRISTATE_HWIF execute a channel tristate
|
||||
HDIO_DRIVE_RESET execute a device reset
|
||||
HDIO_DRIVE_TASKFILE execute raw taskfile
|
||||
HDIO_DRIVE_TASK execute task and special drive command
|
||||
HDIO_DRIVE_CMD execute a special drive command
|
||||
HDIO_DRIVE_CMD_AEB HDIO_DRIVE_TASK
|
||||
======================= =======================================
|
||||
|
||||
ioctls that pass non-pointer values:
|
||||
|
||||
======================= =======================================
|
||||
HDIO_SET_MULTCOUNT change IDE blockmode
|
||||
HDIO_SET_UNMASKINTR permit other irqs during I/O
|
||||
HDIO_SET_KEEPSETTINGS keep ioctl settings on reset
|
||||
HDIO_SET_32BIT change io_32bit flags
|
||||
HDIO_SET_NOWERR change ignore-write-error flag
|
||||
HDIO_SET_DMA change use-dma flag
|
||||
HDIO_SET_PIO_MODE reconfig interface to new speed
|
||||
HDIO_SCAN_HWIF register and (re)scan interface
|
||||
HDIO_SET_NICE set nice flags
|
||||
HDIO_UNREGISTER_HWIF unregister interface
|
||||
HDIO_SET_WCACHE change write cache enable-disable
|
||||
HDIO_SET_ACOUSTIC change acoustic behavior
|
||||
HDIO_SET_BUSSTATE set the bus state of the hwif
|
||||
HDIO_SET_QDMA change use-qdma flag
|
||||
HDIO_SET_ADDRESS change lba addressing modes
|
||||
|
||||
HDIO_SET_IDE_SCSI Set scsi emulation mode on/off
|
||||
HDIO_SET_SCSI_IDE not implemented yet
|
||||
======================= =======================================
|
||||
|
||||
|
||||
@@ -137,143 +104,6 @@ HDIO_GETGEO
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_GET_UNMASKINTR
|
||||
get current unmask setting
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
long val;
|
||||
|
||||
ioctl(fd, HDIO_GET_UNMASKINTR, &val);
|
||||
|
||||
inputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
The value of the drive's current unmask setting
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_SET_UNMASKINTR
|
||||
permit other irqs during I/O
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
unsigned long val;
|
||||
|
||||
ioctl(fd, HDIO_SET_UNMASKINTR, val);
|
||||
|
||||
inputs:
|
||||
New value for unmask flag
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error return:
|
||||
- EINVAL Called on a partition instead of the whole disk device
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- EINVAL value out of range [0 1]
|
||||
- EBUSY Controller busy
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_GET_MULTCOUNT
|
||||
get current IDE blockmode setting
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
long val;
|
||||
|
||||
ioctl(fd, HDIO_GET_MULTCOUNT, &val);
|
||||
|
||||
inputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
The value of the current IDE block mode setting. This
|
||||
controls how many sectors the drive will transfer per
|
||||
interrupt.
|
||||
|
||||
|
||||
|
||||
HDIO_SET_MULTCOUNT
|
||||
change IDE blockmode
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
int val;
|
||||
|
||||
ioctl(fd, HDIO_SET_MULTCOUNT, val);
|
||||
|
||||
inputs:
|
||||
New value for IDE block mode setting. This controls how many
|
||||
sectors the drive will transfer per interrupt.
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error return:
|
||||
- EINVAL Called on a partition instead of the whole disk device
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- EINVAL value out of range supported by disk.
|
||||
- EBUSY Controller busy or blockmode already set.
|
||||
- EIO Drive did not accept new block mode.
|
||||
|
||||
notes:
|
||||
Source code comments read::
|
||||
|
||||
This is tightly woven into the driver->do_special cannot
|
||||
touch. DON'T do it again until a total personality rewrite
|
||||
is committed.
|
||||
|
||||
If blockmode has already been set, this ioctl will fail with
|
||||
-EBUSY
|
||||
|
||||
|
||||
|
||||
HDIO_GET_QDMA
|
||||
get use-qdma flag
|
||||
|
||||
|
||||
Not implemented, as of 2.6.8.1
|
||||
|
||||
|
||||
|
||||
HDIO_SET_XFER
|
||||
set transfer rate via proc
|
||||
|
||||
|
||||
Not implemented, as of 2.6.8.1
|
||||
|
||||
|
||||
|
||||
HDIO_OBSOLETE_IDENTITY
|
||||
OBSOLETE, DO NOT USE
|
||||
|
||||
|
||||
Same as HDIO_GET_IDENTITY (see below), except that it only
|
||||
returns the first 142 bytes of drive identity information.
|
||||
|
||||
|
||||
|
||||
HDIO_GET_IDENTITY
|
||||
get IDE identification info
|
||||
|
||||
@@ -308,60 +138,6 @@ HDIO_GET_IDENTITY
|
||||
|
||||
|
||||
|
||||
HDIO_GET_KEEPSETTINGS
|
||||
get keep-settings-on-reset flag
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
long val;
|
||||
|
||||
ioctl(fd, HDIO_GET_KEEPSETTINGS, &val);
|
||||
|
||||
inputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
The value of the current "keep settings" flag
|
||||
|
||||
|
||||
|
||||
notes:
|
||||
When set, indicates that kernel should restore settings
|
||||
after a drive reset.
|
||||
|
||||
|
||||
|
||||
HDIO_SET_KEEPSETTINGS
|
||||
keep ioctl settings on reset
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
long val;
|
||||
|
||||
ioctl(fd, HDIO_SET_KEEPSETTINGS, val);
|
||||
|
||||
inputs:
|
||||
New value for keep_settings flag
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error return:
|
||||
- EINVAL Called on a partition instead of the whole disk device
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- EINVAL value out of range [0 1]
|
||||
- EBUSY Controller busy
|
||||
|
||||
|
||||
|
||||
HDIO_GET_32BIT
|
||||
get current io_32bit setting
|
||||
|
||||
@@ -387,288 +163,6 @@ HDIO_GET_32BIT
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_GET_NOWERR
|
||||
get ignore-write-error flag
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
long val;
|
||||
|
||||
ioctl(fd, HDIO_GET_NOWERR, &val);
|
||||
|
||||
inputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
The value of the current ignore-write-error flag
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_GET_DMA
|
||||
get use-dma flag
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
long val;
|
||||
|
||||
ioctl(fd, HDIO_GET_DMA, &val);
|
||||
|
||||
inputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
The value of the current use-dma flag
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_GET_NICE
|
||||
get nice flags
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
long nice;
|
||||
|
||||
ioctl(fd, HDIO_GET_NICE, &nice);
|
||||
|
||||
inputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
The drive's "nice" values.
|
||||
|
||||
|
||||
|
||||
notes:
|
||||
Per-drive flags which determine when the system will give more
|
||||
bandwidth to other devices sharing the same IDE bus.
|
||||
|
||||
See <linux/hdreg.h>, near symbol IDE_NICE_DSC_OVERLAP.
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_SET_NICE
|
||||
set nice flags
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
unsigned long nice;
|
||||
|
||||
...
|
||||
ioctl(fd, HDIO_SET_NICE, nice);
|
||||
|
||||
inputs:
|
||||
bitmask of nice flags.
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error returns:
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- EPERM Flags other than DSC_OVERLAP and NICE_1 set.
|
||||
- EPERM DSC_OVERLAP specified but not supported by drive
|
||||
|
||||
notes:
|
||||
This ioctl sets the DSC_OVERLAP and NICE_1 flags from values
|
||||
provided by the user.
|
||||
|
||||
Nice flags are listed in <linux/hdreg.h>, starting with
|
||||
IDE_NICE_DSC_OVERLAP. These values represent shifts.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_GET_WCACHE
|
||||
get write cache mode on|off
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
long val;
|
||||
|
||||
ioctl(fd, HDIO_GET_WCACHE, &val);
|
||||
|
||||
inputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
The value of the current write cache mode
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_GET_ACOUSTIC
|
||||
get acoustic value
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
long val;
|
||||
|
||||
ioctl(fd, HDIO_GET_ACOUSTIC, &val);
|
||||
|
||||
inputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
The value of the current acoustic settings
|
||||
|
||||
|
||||
|
||||
notes:
|
||||
See HDIO_SET_ACOUSTIC
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_GET_ADDRESS
|
||||
usage::
|
||||
|
||||
|
||||
long val;
|
||||
|
||||
ioctl(fd, HDIO_GET_ADDRESS, &val);
|
||||
|
||||
inputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
The value of the current addressing mode:
|
||||
|
||||
= ===================
|
||||
0 28-bit
|
||||
1 48-bit
|
||||
2 48-bit doing 28-bit
|
||||
3 64-bit
|
||||
= ===================
|
||||
|
||||
|
||||
|
||||
HDIO_GET_BUSSTATE
|
||||
get the bus state of the hwif
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
long state;
|
||||
|
||||
ioctl(fd, HDIO_SCAN_HWIF, &state);
|
||||
|
||||
inputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
Current power state of the IDE bus. One of BUSSTATE_OFF,
|
||||
BUSSTATE_ON, or BUSSTATE_TRISTATE
|
||||
|
||||
error returns:
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_SET_BUSSTATE
|
||||
set the bus state of the hwif
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
int state;
|
||||
|
||||
...
|
||||
ioctl(fd, HDIO_SCAN_HWIF, state);
|
||||
|
||||
inputs:
|
||||
Desired IDE power state. One of BUSSTATE_OFF, BUSSTATE_ON,
|
||||
or BUSSTATE_TRISTATE
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error returns:
|
||||
- EACCES Access denied: requires CAP_SYS_RAWIO
|
||||
- EOPNOTSUPP Hardware interface does not support bus power control
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_TRISTATE_HWIF
|
||||
execute a channel tristate
|
||||
|
||||
|
||||
Not implemented, as of 2.6.8.1. See HDIO_SET_BUSSTATE
|
||||
|
||||
|
||||
|
||||
HDIO_DRIVE_RESET
|
||||
execute a device reset
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
int args[3]
|
||||
|
||||
...
|
||||
ioctl(fd, HDIO_DRIVE_RESET, args);
|
||||
|
||||
inputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error returns:
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- ENXIO No such device: phy dead or ctl_addr == 0
|
||||
- EIO I/O error: reset timed out or hardware error
|
||||
|
||||
notes:
|
||||
|
||||
- Execute a reset on the device as soon as the current IO
|
||||
operation has completed.
|
||||
|
||||
- Executes an ATAPI soft reset if applicable, otherwise
|
||||
executes an ATA soft reset on the controller.
|
||||
|
||||
|
||||
|
||||
HDIO_DRIVE_TASKFILE
|
||||
execute raw taskfile
|
||||
|
||||
@@ -1026,14 +520,6 @@ HDIO_DRIVE_TASK
|
||||
|
||||
|
||||
|
||||
HDIO_DRIVE_CMD_AEB
|
||||
HDIO_DRIVE_TASK
|
||||
|
||||
|
||||
Not implemented, as of 2.6.8.1
|
||||
|
||||
|
||||
|
||||
HDIO_SET_32BIT
|
||||
change io_32bit flags
|
||||
|
||||
@@ -1059,284 +545,3 @@ HDIO_SET_32BIT
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- EINVAL value out of range [0 3]
|
||||
- EBUSY Controller busy
|
||||
|
||||
|
||||
|
||||
|
||||
HDIO_SET_NOWERR
|
||||
change ignore-write-error flag
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
int val;
|
||||
|
||||
ioctl(fd, HDIO_SET_NOWERR, val);
|
||||
|
||||
inputs:
|
||||
New value for ignore-write-error flag. Used for ignoring
|
||||
|
||||
|
||||
WRERR_STAT
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error return:
|
||||
- EINVAL Called on a partition instead of the whole disk device
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- EINVAL value out of range [0 1]
|
||||
- EBUSY Controller busy
|
||||
|
||||
|
||||
|
||||
HDIO_SET_DMA
|
||||
change use-dma flag
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
long val;
|
||||
|
||||
ioctl(fd, HDIO_SET_DMA, val);
|
||||
|
||||
inputs:
|
||||
New value for use-dma flag
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error return:
|
||||
- EINVAL Called on a partition instead of the whole disk device
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- EINVAL value out of range [0 1]
|
||||
- EBUSY Controller busy
|
||||
|
||||
|
||||
|
||||
HDIO_SET_PIO_MODE
|
||||
reconfig interface to new speed
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
long val;
|
||||
|
||||
ioctl(fd, HDIO_SET_PIO_MODE, val);
|
||||
|
||||
inputs:
|
||||
New interface speed.
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error return:
|
||||
- EINVAL Called on a partition instead of the whole disk device
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- EINVAL value out of range [0 255]
|
||||
- EBUSY Controller busy
|
||||
|
||||
|
||||
|
||||
HDIO_SCAN_HWIF
|
||||
register and (re)scan interface
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
int args[3]
|
||||
|
||||
...
|
||||
ioctl(fd, HDIO_SCAN_HWIF, args);
|
||||
|
||||
inputs:
|
||||
|
||||
======= =========================
|
||||
args[0] io address to probe
|
||||
|
||||
|
||||
args[1] control address to probe
|
||||
args[2] irq number
|
||||
======= =========================
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error returns:
|
||||
- EACCES Access denied: requires CAP_SYS_RAWIO
|
||||
- EIO Probe failed.
|
||||
|
||||
notes:
|
||||
This ioctl initializes the addresses and irq for a disk
|
||||
controller, probes for drives, and creates /proc/ide
|
||||
interfaces as appropriate.
|
||||
|
||||
|
||||
|
||||
HDIO_UNREGISTER_HWIF
|
||||
unregister interface
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
int index;
|
||||
|
||||
ioctl(fd, HDIO_UNREGISTER_HWIF, index);
|
||||
|
||||
inputs:
|
||||
index index of hardware interface to unregister
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error returns:
|
||||
- EACCES Access denied: requires CAP_SYS_RAWIO
|
||||
|
||||
notes:
|
||||
This ioctl removes a hardware interface from the kernel.
|
||||
|
||||
Currently (2.6.8) this ioctl silently fails if any drive on
|
||||
the interface is busy.
|
||||
|
||||
|
||||
|
||||
HDIO_SET_WCACHE
|
||||
change write cache enable-disable
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
int val;
|
||||
|
||||
ioctl(fd, HDIO_SET_WCACHE, val);
|
||||
|
||||
inputs:
|
||||
New value for write cache enable
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error return:
|
||||
- EINVAL Called on a partition instead of the whole disk device
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- EINVAL value out of range [0 1]
|
||||
- EBUSY Controller busy
|
||||
|
||||
|
||||
|
||||
HDIO_SET_ACOUSTIC
|
||||
change acoustic behavior
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
int val;
|
||||
|
||||
ioctl(fd, HDIO_SET_ACOUSTIC, val);
|
||||
|
||||
inputs:
|
||||
New value for drive acoustic settings
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error return:
|
||||
- EINVAL Called on a partition instead of the whole disk device
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- EINVAL value out of range [0 254]
|
||||
- EBUSY Controller busy
|
||||
|
||||
|
||||
|
||||
HDIO_SET_QDMA
|
||||
change use-qdma flag
|
||||
|
||||
|
||||
Not implemented, as of 2.6.8.1
|
||||
|
||||
|
||||
|
||||
HDIO_SET_ADDRESS
|
||||
change lba addressing modes
|
||||
|
||||
|
||||
usage::
|
||||
|
||||
int val;
|
||||
|
||||
ioctl(fd, HDIO_SET_ADDRESS, val);
|
||||
|
||||
inputs:
|
||||
New value for addressing mode
|
||||
|
||||
= ===================
|
||||
0 28-bit
|
||||
1 48-bit
|
||||
2 48-bit doing 28-bit
|
||||
= ===================
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error return:
|
||||
- EINVAL Called on a partition instead of the whole disk device
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- EINVAL value out of range [0 2]
|
||||
- EBUSY Controller busy
|
||||
- EIO Drive does not support lba48 mode.
|
||||
|
||||
|
||||
HDIO_SET_IDE_SCSI
|
||||
usage::
|
||||
|
||||
|
||||
long val;
|
||||
|
||||
ioctl(fd, HDIO_SET_IDE_SCSI, val);
|
||||
|
||||
inputs:
|
||||
New value for scsi emulation mode (?)
|
||||
|
||||
|
||||
|
||||
outputs:
|
||||
none
|
||||
|
||||
|
||||
|
||||
error return:
|
||||
- EINVAL Called on a partition instead of the whole disk device
|
||||
- EACCES Access denied: requires CAP_SYS_ADMIN
|
||||
- EINVAL value out of range [0 1]
|
||||
- EBUSY Controller busy
|
||||
|
||||
|
||||
|
||||
HDIO_SET_SCSI_IDE
|
||||
Not implemented, as of 2.6.8.1
|
||||
|
||||
+11
-16
@@ -5189,6 +5189,13 @@ W: https://linuxtv.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: drivers/media/platform/sti/delta
|
||||
|
||||
DELTA DPS920AB PSU DRIVER
|
||||
M: Robert Marko <robert.marko@sartura.hr>
|
||||
L: linux-hwmon@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/hwmon/dps920ab.rst
|
||||
F: drivers/hwmon/pmbus/dps920ab.c
|
||||
|
||||
DENALI NAND DRIVER
|
||||
L: linux-mtd@lists.infradead.org
|
||||
S: Orphan
|
||||
@@ -8771,22 +8778,6 @@ L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/i2c/busses/i2c-icy.c
|
||||
|
||||
IDE SUBSYSTEM
|
||||
M: "David S. Miller" <davem@davemloft.net>
|
||||
L: linux-ide@vger.kernel.org
|
||||
S: Maintained
|
||||
Q: http://patchwork.ozlabs.org/project/linux-ide/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide.git
|
||||
F: Documentation/ide/
|
||||
F: drivers/ide/
|
||||
F: include/linux/ide.h
|
||||
|
||||
IDE/ATAPI DRIVERS
|
||||
L: linux-ide@vger.kernel.org
|
||||
S: Orphan
|
||||
F: Documentation/cdrom/ide-cd.rst
|
||||
F: drivers/ide/ide-cd*
|
||||
|
||||
IDEAPAD LAPTOP EXTRAS DRIVER
|
||||
M: Ike Panhc <ike.pan@canonical.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
@@ -19590,6 +19581,10 @@ F: include/dt-bindings/regulator/
|
||||
F: include/linux/regulator/
|
||||
K: regulator_get_optional
|
||||
|
||||
VOLTAGE AND CURRENT REGULATOR IRQ HELPERS
|
||||
R: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
|
||||
F: drivers/regulator/irq_helpers.c
|
||||
|
||||
VRF
|
||||
M: David Ahern <dsahern@kernel.org>
|
||||
L: netdev@vger.kernel.org
|
||||
|
||||
@@ -25,19 +25,18 @@ CONFIG_PNP=y
|
||||
CONFIG_ISAPNP=y
|
||||
CONFIG_BLK_DEV_FD=y
|
||||
CONFIG_BLK_DEV_LOOP=m
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_ALI15X3=y
|
||||
CONFIG_BLK_DEV_CMD64X=y
|
||||
CONFIG_BLK_DEV_CY82C693=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_SCSI_AIC7XXX=m
|
||||
CONFIG_AIC7XXX_CMDS_PER_DEVICE=253
|
||||
# CONFIG_AIC7XXX_DEBUG_ENABLE is not set
|
||||
CONFIG_ATA=y
|
||||
# CONFIG_SATA_PMP is not set
|
||||
CONFIG_PATA_ALI=y
|
||||
CONFIG_PATA_CMD64X=y
|
||||
CONFIG_PATA_CYPRESS=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_NET_ETHERNET=y
|
||||
|
||||
@@ -26,11 +26,11 @@
|
||||
|
||||
#define ATOMIC64_INIT(i) { (i) }
|
||||
|
||||
#define atomic_read(v) READ_ONCE((v)->counter)
|
||||
#define atomic64_read(v) READ_ONCE((v)->counter)
|
||||
#define arch_atomic_read(v) READ_ONCE((v)->counter)
|
||||
#define arch_atomic64_read(v) READ_ONCE((v)->counter)
|
||||
|
||||
#define atomic_set(v,i) WRITE_ONCE((v)->counter, (i))
|
||||
#define atomic64_set(v,i) WRITE_ONCE((v)->counter, (i))
|
||||
#define arch_atomic_set(v,i) WRITE_ONCE((v)->counter, (i))
|
||||
#define arch_atomic64_set(v,i) WRITE_ONCE((v)->counter, (i))
|
||||
|
||||
/*
|
||||
* To get proper branch prediction for the main line, we must branch
|
||||
@@ -39,7 +39,7 @@
|
||||
*/
|
||||
|
||||
#define ATOMIC_OP(op, asm_op) \
|
||||
static __inline__ void atomic_##op(int i, atomic_t * v) \
|
||||
static __inline__ void arch_atomic_##op(int i, atomic_t * v) \
|
||||
{ \
|
||||
unsigned long temp; \
|
||||
__asm__ __volatile__( \
|
||||
@@ -55,7 +55,7 @@ static __inline__ void atomic_##op(int i, atomic_t * v) \
|
||||
} \
|
||||
|
||||
#define ATOMIC_OP_RETURN(op, asm_op) \
|
||||
static inline int atomic_##op##_return_relaxed(int i, atomic_t *v) \
|
||||
static inline int arch_atomic_##op##_return_relaxed(int i, atomic_t *v) \
|
||||
{ \
|
||||
long temp, result; \
|
||||
__asm__ __volatile__( \
|
||||
@@ -74,7 +74,7 @@ static inline int atomic_##op##_return_relaxed(int i, atomic_t *v) \
|
||||
}
|
||||
|
||||
#define ATOMIC_FETCH_OP(op, asm_op) \
|
||||
static inline int atomic_fetch_##op##_relaxed(int i, atomic_t *v) \
|
||||
static inline int arch_atomic_fetch_##op##_relaxed(int i, atomic_t *v) \
|
||||
{ \
|
||||
long temp, result; \
|
||||
__asm__ __volatile__( \
|
||||
@@ -92,7 +92,7 @@ static inline int atomic_fetch_##op##_relaxed(int i, atomic_t *v) \
|
||||
}
|
||||
|
||||
#define ATOMIC64_OP(op, asm_op) \
|
||||
static __inline__ void atomic64_##op(s64 i, atomic64_t * v) \
|
||||
static __inline__ void arch_atomic64_##op(s64 i, atomic64_t * v) \
|
||||
{ \
|
||||
s64 temp; \
|
||||
__asm__ __volatile__( \
|
||||
@@ -108,7 +108,8 @@ static __inline__ void atomic64_##op(s64 i, atomic64_t * v) \
|
||||
} \
|
||||
|
||||
#define ATOMIC64_OP_RETURN(op, asm_op) \
|
||||
static __inline__ s64 atomic64_##op##_return_relaxed(s64 i, atomic64_t * v) \
|
||||
static __inline__ s64 \
|
||||
arch_atomic64_##op##_return_relaxed(s64 i, atomic64_t * v) \
|
||||
{ \
|
||||
s64 temp, result; \
|
||||
__asm__ __volatile__( \
|
||||
@@ -127,7 +128,8 @@ static __inline__ s64 atomic64_##op##_return_relaxed(s64 i, atomic64_t * v) \
|
||||
}
|
||||
|
||||
#define ATOMIC64_FETCH_OP(op, asm_op) \
|
||||
static __inline__ s64 atomic64_fetch_##op##_relaxed(s64 i, atomic64_t * v) \
|
||||
static __inline__ s64 \
|
||||
arch_atomic64_fetch_##op##_relaxed(s64 i, atomic64_t * v) \
|
||||
{ \
|
||||
s64 temp, result; \
|
||||
__asm__ __volatile__( \
|
||||
@@ -155,18 +157,18 @@ static __inline__ s64 atomic64_fetch_##op##_relaxed(s64 i, atomic64_t * v) \
|
||||
ATOMIC_OPS(add)
|
||||
ATOMIC_OPS(sub)
|
||||
|
||||
#define atomic_add_return_relaxed atomic_add_return_relaxed
|
||||
#define atomic_sub_return_relaxed atomic_sub_return_relaxed
|
||||
#define atomic_fetch_add_relaxed atomic_fetch_add_relaxed
|
||||
#define atomic_fetch_sub_relaxed atomic_fetch_sub_relaxed
|
||||
#define arch_atomic_add_return_relaxed arch_atomic_add_return_relaxed
|
||||
#define arch_atomic_sub_return_relaxed arch_atomic_sub_return_relaxed
|
||||
#define arch_atomic_fetch_add_relaxed arch_atomic_fetch_add_relaxed
|
||||
#define arch_atomic_fetch_sub_relaxed arch_atomic_fetch_sub_relaxed
|
||||
|
||||
#define atomic64_add_return_relaxed atomic64_add_return_relaxed
|
||||
#define atomic64_sub_return_relaxed atomic64_sub_return_relaxed
|
||||
#define atomic64_fetch_add_relaxed atomic64_fetch_add_relaxed
|
||||
#define atomic64_fetch_sub_relaxed atomic64_fetch_sub_relaxed
|
||||
#define arch_atomic64_add_return_relaxed arch_atomic64_add_return_relaxed
|
||||
#define arch_atomic64_sub_return_relaxed arch_atomic64_sub_return_relaxed
|
||||
#define arch_atomic64_fetch_add_relaxed arch_atomic64_fetch_add_relaxed
|
||||
#define arch_atomic64_fetch_sub_relaxed arch_atomic64_fetch_sub_relaxed
|
||||
|
||||
#define atomic_andnot atomic_andnot
|
||||
#define atomic64_andnot atomic64_andnot
|
||||
#define arch_atomic_andnot arch_atomic_andnot
|
||||
#define arch_atomic64_andnot arch_atomic64_andnot
|
||||
|
||||
#undef ATOMIC_OPS
|
||||
#define ATOMIC_OPS(op, asm) \
|
||||
@@ -180,15 +182,15 @@ ATOMIC_OPS(andnot, bic)
|
||||
ATOMIC_OPS(or, bis)
|
||||
ATOMIC_OPS(xor, xor)
|
||||
|
||||
#define atomic_fetch_and_relaxed atomic_fetch_and_relaxed
|
||||
#define atomic_fetch_andnot_relaxed atomic_fetch_andnot_relaxed
|
||||
#define atomic_fetch_or_relaxed atomic_fetch_or_relaxed
|
||||
#define atomic_fetch_xor_relaxed atomic_fetch_xor_relaxed
|
||||
#define arch_atomic_fetch_and_relaxed arch_atomic_fetch_and_relaxed
|
||||
#define arch_atomic_fetch_andnot_relaxed arch_atomic_fetch_andnot_relaxed
|
||||
#define arch_atomic_fetch_or_relaxed arch_atomic_fetch_or_relaxed
|
||||
#define arch_atomic_fetch_xor_relaxed arch_atomic_fetch_xor_relaxed
|
||||
|
||||
#define atomic64_fetch_and_relaxed atomic64_fetch_and_relaxed
|
||||
#define atomic64_fetch_andnot_relaxed atomic64_fetch_andnot_relaxed
|
||||
#define atomic64_fetch_or_relaxed atomic64_fetch_or_relaxed
|
||||
#define atomic64_fetch_xor_relaxed atomic64_fetch_xor_relaxed
|
||||
#define arch_atomic64_fetch_and_relaxed arch_atomic64_fetch_and_relaxed
|
||||
#define arch_atomic64_fetch_andnot_relaxed arch_atomic64_fetch_andnot_relaxed
|
||||
#define arch_atomic64_fetch_or_relaxed arch_atomic64_fetch_or_relaxed
|
||||
#define arch_atomic64_fetch_xor_relaxed arch_atomic64_fetch_xor_relaxed
|
||||
|
||||
#undef ATOMIC_OPS
|
||||
#undef ATOMIC64_FETCH_OP
|
||||
@@ -198,14 +200,18 @@ ATOMIC_OPS(xor, xor)
|
||||
#undef ATOMIC_OP_RETURN
|
||||
#undef ATOMIC_OP
|
||||
|
||||
#define atomic64_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new))
|
||||
#define atomic64_xchg(v, new) (xchg(&((v)->counter), new))
|
||||
#define arch_atomic64_cmpxchg(v, old, new) \
|
||||
(arch_cmpxchg(&((v)->counter), old, new))
|
||||
#define arch_atomic64_xchg(v, new) \
|
||||
(arch_xchg(&((v)->counter), new))
|
||||
|
||||
#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new))
|
||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
|
||||
#define arch_atomic_cmpxchg(v, old, new) \
|
||||
(arch_cmpxchg(&((v)->counter), old, new))
|
||||
#define arch_atomic_xchg(v, new) \
|
||||
(arch_xchg(&((v)->counter), new))
|
||||
|
||||
/**
|
||||
* atomic_fetch_add_unless - add unless the number is a given value
|
||||
* arch_atomic_fetch_add_unless - add unless the number is a given value
|
||||
* @v: pointer of type atomic_t
|
||||
* @a: the amount to add to v...
|
||||
* @u: ...unless v is equal to u.
|
||||
@@ -213,7 +219,7 @@ ATOMIC_OPS(xor, xor)
|
||||
* Atomically adds @a to @v, so long as it was not @u.
|
||||
* Returns the old value of @v.
|
||||
*/
|
||||
static __inline__ int atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
||||
static __inline__ int arch_atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
||||
{
|
||||
int c, new, old;
|
||||
smp_mb();
|
||||
@@ -234,10 +240,10 @@ static __inline__ int atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
||||
smp_mb();
|
||||
return old;
|
||||
}
|
||||
#define atomic_fetch_add_unless atomic_fetch_add_unless
|
||||
#define arch_atomic_fetch_add_unless arch_atomic_fetch_add_unless
|
||||
|
||||
/**
|
||||
* atomic64_fetch_add_unless - add unless the number is a given value
|
||||
* arch_atomic64_fetch_add_unless - add unless the number is a given value
|
||||
* @v: pointer of type atomic64_t
|
||||
* @a: the amount to add to v...
|
||||
* @u: ...unless v is equal to u.
|
||||
@@ -245,7 +251,7 @@ static __inline__ int atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
||||
* Atomically adds @a to @v, so long as it was not @u.
|
||||
* Returns the old value of @v.
|
||||
*/
|
||||
static __inline__ s64 atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
|
||||
static __inline__ s64 arch_atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
|
||||
{
|
||||
s64 c, new, old;
|
||||
smp_mb();
|
||||
@@ -266,16 +272,16 @@ static __inline__ s64 atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
|
||||
smp_mb();
|
||||
return old;
|
||||
}
|
||||
#define atomic64_fetch_add_unless atomic64_fetch_add_unless
|
||||
#define arch_atomic64_fetch_add_unless arch_atomic64_fetch_add_unless
|
||||
|
||||
/*
|
||||
* atomic64_dec_if_positive - decrement by 1 if old value positive
|
||||
* arch_atomic64_dec_if_positive - decrement by 1 if old value positive
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
* The function returns the old value of *v minus 1, even if
|
||||
* the atomic variable, v, was not decremented.
|
||||
*/
|
||||
static inline s64 atomic64_dec_if_positive(atomic64_t *v)
|
||||
static inline s64 arch_atomic64_dec_if_positive(atomic64_t *v)
|
||||
{
|
||||
s64 old, tmp;
|
||||
smp_mb();
|
||||
@@ -295,6 +301,6 @@ static inline s64 atomic64_dec_if_positive(atomic64_t *v)
|
||||
smp_mb();
|
||||
return old - 1;
|
||||
}
|
||||
#define atomic64_dec_if_positive atomic64_dec_if_positive
|
||||
#define arch_atomic64_dec_if_positive arch_atomic64_dec_if_positive
|
||||
|
||||
#endif /* _ALPHA_ATOMIC_H */
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
sizeof(*(ptr))); \
|
||||
})
|
||||
|
||||
#define cmpxchg_local(ptr, o, n) \
|
||||
#define arch_cmpxchg_local(ptr, o, n) \
|
||||
({ \
|
||||
__typeof__(*(ptr)) _o_ = (o); \
|
||||
__typeof__(*(ptr)) _n_ = (n); \
|
||||
@@ -26,7 +26,7 @@
|
||||
sizeof(*(ptr))); \
|
||||
})
|
||||
|
||||
#define cmpxchg64_local(ptr, o, n) \
|
||||
#define arch_cmpxchg64_local(ptr, o, n) \
|
||||
({ \
|
||||
BUILD_BUG_ON(sizeof(*(ptr)) != 8); \
|
||||
cmpxchg_local((ptr), (o), (n)); \
|
||||
@@ -42,7 +42,7 @@
|
||||
* The leading and the trailing memory barriers guarantee that these
|
||||
* operations are fully ordered.
|
||||
*/
|
||||
#define xchg(ptr, x) \
|
||||
#define arch_xchg(ptr, x) \
|
||||
({ \
|
||||
__typeof__(*(ptr)) __ret; \
|
||||
__typeof__(*(ptr)) _x_ = (x); \
|
||||
@@ -53,7 +53,7 @@
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define cmpxchg(ptr, o, n) \
|
||||
#define arch_cmpxchg(ptr, o, n) \
|
||||
({ \
|
||||
__typeof__(*(ptr)) __ret; \
|
||||
__typeof__(*(ptr)) _o_ = (o); \
|
||||
@@ -65,10 +65,10 @@
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define cmpxchg64(ptr, o, n) \
|
||||
#define arch_cmpxchg64(ptr, o, n) \
|
||||
({ \
|
||||
BUILD_BUG_ON(sizeof(*(ptr)) != 8); \
|
||||
cmpxchg((ptr), (o), (n)); \
|
||||
arch_cmpxchg((ptr), (o), (n)); \
|
||||
})
|
||||
|
||||
#undef ____cmpxchg
|
||||
|
||||
@@ -380,7 +380,7 @@ get_wchan(struct task_struct *p)
|
||||
{
|
||||
unsigned long schedule_frame;
|
||||
unsigned long pc;
|
||||
if (!p || p == current || p->state == TASK_RUNNING)
|
||||
if (!p || p == current || task_is_running(p))
|
||||
return 0;
|
||||
/*
|
||||
* This one depends on the frame size of schedule(). Do a
|
||||
|
||||
@@ -166,7 +166,6 @@ smp_callin(void)
|
||||
DBGS(("smp_callin: commencing CPU %d current %p active_mm %p\n",
|
||||
cpuid, current, current->active_mm));
|
||||
|
||||
preempt_disable();
|
||||
cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,14 +14,14 @@
|
||||
#include <asm/barrier.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
#define atomic_read(v) READ_ONCE((v)->counter)
|
||||
#define arch_atomic_read(v) READ_ONCE((v)->counter)
|
||||
|
||||
#ifdef CONFIG_ARC_HAS_LLSC
|
||||
|
||||
#define atomic_set(v, i) WRITE_ONCE(((v)->counter), (i))
|
||||
#define arch_atomic_set(v, i) WRITE_ONCE(((v)->counter), (i))
|
||||
|
||||
#define ATOMIC_OP(op, c_op, asm_op) \
|
||||
static inline void atomic_##op(int i, atomic_t *v) \
|
||||
static inline void arch_atomic_##op(int i, atomic_t *v) \
|
||||
{ \
|
||||
unsigned int val; \
|
||||
\
|
||||
@@ -37,7 +37,7 @@ static inline void atomic_##op(int i, atomic_t *v) \
|
||||
} \
|
||||
|
||||
#define ATOMIC_OP_RETURN(op, c_op, asm_op) \
|
||||
static inline int atomic_##op##_return(int i, atomic_t *v) \
|
||||
static inline int arch_atomic_##op##_return(int i, atomic_t *v) \
|
||||
{ \
|
||||
unsigned int val; \
|
||||
\
|
||||
@@ -63,7 +63,7 @@ static inline int atomic_##op##_return(int i, atomic_t *v) \
|
||||
}
|
||||
|
||||
#define ATOMIC_FETCH_OP(op, c_op, asm_op) \
|
||||
static inline int atomic_fetch_##op(int i, atomic_t *v) \
|
||||
static inline int arch_atomic_fetch_##op(int i, atomic_t *v) \
|
||||
{ \
|
||||
unsigned int val, orig; \
|
||||
\
|
||||
@@ -94,11 +94,11 @@ static inline int atomic_fetch_##op(int i, atomic_t *v) \
|
||||
#ifndef CONFIG_SMP
|
||||
|
||||
/* violating atomic_xxx API locking protocol in UP for optimization sake */
|
||||
#define atomic_set(v, i) WRITE_ONCE(((v)->counter), (i))
|
||||
#define arch_atomic_set(v, i) WRITE_ONCE(((v)->counter), (i))
|
||||
|
||||
#else
|
||||
|
||||
static inline void atomic_set(atomic_t *v, int i)
|
||||
static inline void arch_atomic_set(atomic_t *v, int i)
|
||||
{
|
||||
/*
|
||||
* Independent of hardware support, all of the atomic_xxx() APIs need
|
||||
@@ -116,7 +116,7 @@ static inline void atomic_set(atomic_t *v, int i)
|
||||
atomic_ops_unlock(flags);
|
||||
}
|
||||
|
||||
#define atomic_set_release(v, i) atomic_set((v), (i))
|
||||
#define arch_atomic_set_release(v, i) arch_atomic_set((v), (i))
|
||||
|
||||
#endif
|
||||
|
||||
@@ -126,7 +126,7 @@ static inline void atomic_set(atomic_t *v, int i)
|
||||
*/
|
||||
|
||||
#define ATOMIC_OP(op, c_op, asm_op) \
|
||||
static inline void atomic_##op(int i, atomic_t *v) \
|
||||
static inline void arch_atomic_##op(int i, atomic_t *v) \
|
||||
{ \
|
||||
unsigned long flags; \
|
||||
\
|
||||
@@ -136,7 +136,7 @@ static inline void atomic_##op(int i, atomic_t *v) \
|
||||
}
|
||||
|
||||
#define ATOMIC_OP_RETURN(op, c_op, asm_op) \
|
||||
static inline int atomic_##op##_return(int i, atomic_t *v) \
|
||||
static inline int arch_atomic_##op##_return(int i, atomic_t *v) \
|
||||
{ \
|
||||
unsigned long flags; \
|
||||
unsigned long temp; \
|
||||
@@ -154,7 +154,7 @@ static inline int atomic_##op##_return(int i, atomic_t *v) \
|
||||
}
|
||||
|
||||
#define ATOMIC_FETCH_OP(op, c_op, asm_op) \
|
||||
static inline int atomic_fetch_##op(int i, atomic_t *v) \
|
||||
static inline int arch_atomic_fetch_##op(int i, atomic_t *v) \
|
||||
{ \
|
||||
unsigned long flags; \
|
||||
unsigned long orig; \
|
||||
@@ -180,9 +180,6 @@ static inline int atomic_fetch_##op(int i, atomic_t *v) \
|
||||
ATOMIC_OPS(add, +=, add)
|
||||
ATOMIC_OPS(sub, -=, sub)
|
||||
|
||||
#define atomic_andnot atomic_andnot
|
||||
#define atomic_fetch_andnot atomic_fetch_andnot
|
||||
|
||||
#undef ATOMIC_OPS
|
||||
#define ATOMIC_OPS(op, c_op, asm_op) \
|
||||
ATOMIC_OP(op, c_op, asm_op) \
|
||||
@@ -193,6 +190,9 @@ ATOMIC_OPS(andnot, &= ~, bic)
|
||||
ATOMIC_OPS(or, |=, or)
|
||||
ATOMIC_OPS(xor, ^=, xor)
|
||||
|
||||
#define arch_atomic_andnot arch_atomic_andnot
|
||||
#define arch_atomic_fetch_andnot arch_atomic_fetch_andnot
|
||||
|
||||
#undef ATOMIC_OPS
|
||||
#undef ATOMIC_FETCH_OP
|
||||
#undef ATOMIC_OP_RETURN
|
||||
@@ -220,7 +220,7 @@ typedef struct {
|
||||
|
||||
#define ATOMIC64_INIT(a) { (a) }
|
||||
|
||||
static inline s64 atomic64_read(const atomic64_t *v)
|
||||
static inline s64 arch_atomic64_read(const atomic64_t *v)
|
||||
{
|
||||
s64 val;
|
||||
|
||||
@@ -232,7 +232,7 @@ static inline s64 atomic64_read(const atomic64_t *v)
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline void atomic64_set(atomic64_t *v, s64 a)
|
||||
static inline void arch_atomic64_set(atomic64_t *v, s64 a)
|
||||
{
|
||||
/*
|
||||
* This could have been a simple assignment in "C" but would need
|
||||
@@ -253,7 +253,7 @@ static inline void atomic64_set(atomic64_t *v, s64 a)
|
||||
}
|
||||
|
||||
#define ATOMIC64_OP(op, op1, op2) \
|
||||
static inline void atomic64_##op(s64 a, atomic64_t *v) \
|
||||
static inline void arch_atomic64_##op(s64 a, atomic64_t *v) \
|
||||
{ \
|
||||
s64 val; \
|
||||
\
|
||||
@@ -270,7 +270,7 @@ static inline void atomic64_##op(s64 a, atomic64_t *v) \
|
||||
} \
|
||||
|
||||
#define ATOMIC64_OP_RETURN(op, op1, op2) \
|
||||
static inline s64 atomic64_##op##_return(s64 a, atomic64_t *v) \
|
||||
static inline s64 arch_atomic64_##op##_return(s64 a, atomic64_t *v) \
|
||||
{ \
|
||||
s64 val; \
|
||||
\
|
||||
@@ -293,7 +293,7 @@ static inline s64 atomic64_##op##_return(s64 a, atomic64_t *v) \
|
||||
}
|
||||
|
||||
#define ATOMIC64_FETCH_OP(op, op1, op2) \
|
||||
static inline s64 atomic64_fetch_##op(s64 a, atomic64_t *v) \
|
||||
static inline s64 arch_atomic64_fetch_##op(s64 a, atomic64_t *v) \
|
||||
{ \
|
||||
s64 val, orig; \
|
||||
\
|
||||
@@ -320,9 +320,6 @@ static inline s64 atomic64_fetch_##op(s64 a, atomic64_t *v) \
|
||||
ATOMIC64_OP_RETURN(op, op1, op2) \
|
||||
ATOMIC64_FETCH_OP(op, op1, op2)
|
||||
|
||||
#define atomic64_andnot atomic64_andnot
|
||||
#define atomic64_fetch_andnot atomic64_fetch_andnot
|
||||
|
||||
ATOMIC64_OPS(add, add.f, adc)
|
||||
ATOMIC64_OPS(sub, sub.f, sbc)
|
||||
ATOMIC64_OPS(and, and, and)
|
||||
@@ -330,13 +327,16 @@ ATOMIC64_OPS(andnot, bic, bic)
|
||||
ATOMIC64_OPS(or, or, or)
|
||||
ATOMIC64_OPS(xor, xor, xor)
|
||||
|
||||
#define arch_atomic64_andnot arch_atomic64_andnot
|
||||
#define arch_atomic64_fetch_andnot arch_atomic64_fetch_andnot
|
||||
|
||||
#undef ATOMIC64_OPS
|
||||
#undef ATOMIC64_FETCH_OP
|
||||
#undef ATOMIC64_OP_RETURN
|
||||
#undef ATOMIC64_OP
|
||||
|
||||
static inline s64
|
||||
atomic64_cmpxchg(atomic64_t *ptr, s64 expected, s64 new)
|
||||
arch_atomic64_cmpxchg(atomic64_t *ptr, s64 expected, s64 new)
|
||||
{
|
||||
s64 prev;
|
||||
|
||||
@@ -358,7 +358,7 @@ atomic64_cmpxchg(atomic64_t *ptr, s64 expected, s64 new)
|
||||
return prev;
|
||||
}
|
||||
|
||||
static inline s64 atomic64_xchg(atomic64_t *ptr, s64 new)
|
||||
static inline s64 arch_atomic64_xchg(atomic64_t *ptr, s64 new)
|
||||
{
|
||||
s64 prev;
|
||||
|
||||
@@ -379,14 +379,14 @@ static inline s64 atomic64_xchg(atomic64_t *ptr, s64 new)
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic64_dec_if_positive - decrement by 1 if old value positive
|
||||
* arch_atomic64_dec_if_positive - decrement by 1 if old value positive
|
||||
* @v: pointer of type atomic64_t
|
||||
*
|
||||
* The function returns the old value of *v minus 1, even if
|
||||
* the atomic variable, v, was not decremented.
|
||||
*/
|
||||
|
||||
static inline s64 atomic64_dec_if_positive(atomic64_t *v)
|
||||
static inline s64 arch_atomic64_dec_if_positive(atomic64_t *v)
|
||||
{
|
||||
s64 val;
|
||||
|
||||
@@ -408,10 +408,10 @@ static inline s64 atomic64_dec_if_positive(atomic64_t *v)
|
||||
|
||||
return val;
|
||||
}
|
||||
#define atomic64_dec_if_positive atomic64_dec_if_positive
|
||||
#define arch_atomic64_dec_if_positive arch_atomic64_dec_if_positive
|
||||
|
||||
/**
|
||||
* atomic64_fetch_add_unless - add unless the number is a given value
|
||||
* arch_atomic64_fetch_add_unless - add unless the number is a given value
|
||||
* @v: pointer of type atomic64_t
|
||||
* @a: the amount to add to v...
|
||||
* @u: ...unless v is equal to u.
|
||||
@@ -419,7 +419,7 @@ static inline s64 atomic64_dec_if_positive(atomic64_t *v)
|
||||
* Atomically adds @a to @v, if it was not @u.
|
||||
* Returns the old value of @v
|
||||
*/
|
||||
static inline s64 atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
|
||||
static inline s64 arch_atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
|
||||
{
|
||||
s64 old, temp;
|
||||
|
||||
@@ -443,7 +443,7 @@ static inline s64 atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
|
||||
|
||||
return old;
|
||||
}
|
||||
#define atomic64_fetch_add_unless atomic64_fetch_add_unless
|
||||
#define arch_atomic64_fetch_add_unless arch_atomic64_fetch_add_unless
|
||||
|
||||
#endif /* !CONFIG_GENERIC_ATOMIC64 */
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ __cmpxchg(volatile void *ptr, unsigned long expected, unsigned long new)
|
||||
|
||||
#endif
|
||||
|
||||
#define cmpxchg(ptr, o, n) ({ \
|
||||
#define arch_cmpxchg(ptr, o, n) ({ \
|
||||
(typeof(*(ptr)))__cmpxchg((ptr), \
|
||||
(unsigned long)(o), \
|
||||
(unsigned long)(n)); \
|
||||
@@ -75,7 +75,7 @@ __cmpxchg(volatile void *ptr, unsigned long expected, unsigned long new)
|
||||
* !LLSC: cmpxchg() has to use an external lock atomic_ops_lock to guarantee
|
||||
* semantics, and this lock also happens to be used by atomic_*()
|
||||
*/
|
||||
#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
|
||||
#define arch_atomic_cmpxchg(v, o, n) ((int)arch_cmpxchg(&((v)->counter), (o), (n)))
|
||||
|
||||
|
||||
/*
|
||||
@@ -123,7 +123,7 @@ static inline unsigned long __xchg(unsigned long val, volatile void *ptr,
|
||||
|
||||
#if !defined(CONFIG_ARC_HAS_LLSC) && defined(CONFIG_SMP)
|
||||
|
||||
#define xchg(ptr, with) \
|
||||
#define arch_xchg(ptr, with) \
|
||||
({ \
|
||||
unsigned long flags; \
|
||||
typeof(*(ptr)) old_val; \
|
||||
@@ -136,7 +136,7 @@ static inline unsigned long __xchg(unsigned long val, volatile void *ptr,
|
||||
|
||||
#else
|
||||
|
||||
#define xchg(ptr, with) _xchg(ptr, with)
|
||||
#define arch_xchg(ptr, with) _xchg(ptr, with)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -153,6 +153,6 @@ static inline unsigned long __xchg(unsigned long val, volatile void *ptr,
|
||||
* can't be clobbered by others. Thus no serialization required when
|
||||
* atomic_xchg is involved.
|
||||
*/
|
||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
|
||||
#define arch_atomic_xchg(v, new) (arch_xchg(&((v)->counter), new))
|
||||
|
||||
#endif
|
||||
|
||||
@@ -317,22 +317,6 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, unsigned long trapnr)
|
||||
* caused the fault.
|
||||
*/
|
||||
|
||||
/* We increment the nmissed count for accounting,
|
||||
* we can also use npre/npostfault count for accounting
|
||||
* these specific fault cases.
|
||||
*/
|
||||
kprobes_inc_nmissed_count(cur);
|
||||
|
||||
/*
|
||||
* We come here because instructions in the pre/post
|
||||
* handler caused the page_fault, this could happen
|
||||
* if handler tries to access user space by
|
||||
* copy_from_user(), get_user() etc. Let the
|
||||
* user-specified handler try to fix it first.
|
||||
*/
|
||||
if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* In case the user-specified fault handler returned zero,
|
||||
* try to fix up.
|
||||
|
||||
@@ -189,7 +189,6 @@ void start_kernel_secondary(void)
|
||||
pr_info("## CPU%u LIVE ##: Executing Code...\n", cpu);
|
||||
|
||||
local_irq_enable();
|
||||
preempt_disable();
|
||||
cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
|
||||
}
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ seed_unwind_frame_info(struct task_struct *tsk, struct pt_regs *regs,
|
||||
* is safe-kept and BLINK at a well known location in there
|
||||
*/
|
||||
|
||||
if (tsk->state == TASK_RUNNING)
|
||||
if (task_is_running(tsk))
|
||||
return -1;
|
||||
|
||||
frame_info->task = tsk;
|
||||
|
||||
@@ -64,7 +64,6 @@ CONFIG_PARIDE_ON26=m
|
||||
CONFIG_BLK_DEV_LOOP=m
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_NET_VENDOR_3COM=y
|
||||
|
||||
@@ -215,8 +215,6 @@ CONFIG_IIO=m
|
||||
CONFIG_AD5446=m
|
||||
CONFIG_EEPROM_AT24=m
|
||||
CONFIG_SENSORS_LIS3_SPI=m
|
||||
CONFIG_IDE=m
|
||||
CONFIG_BLK_DEV_IDECS=m
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=m
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
* strex/ldrex monitor on some implementations. The reason we can use it for
|
||||
* atomic_set() is the clrex or dummy strex done on every exception return.
|
||||
*/
|
||||
#define atomic_read(v) READ_ONCE((v)->counter)
|
||||
#define atomic_set(v,i) WRITE_ONCE(((v)->counter), (i))
|
||||
#define arch_atomic_read(v) READ_ONCE((v)->counter)
|
||||
#define arch_atomic_set(v,i) WRITE_ONCE(((v)->counter), (i))
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
*/
|
||||
|
||||
#define ATOMIC_OP(op, c_op, asm_op) \
|
||||
static inline void atomic_##op(int i, atomic_t *v) \
|
||||
static inline void arch_atomic_##op(int i, atomic_t *v) \
|
||||
{ \
|
||||
unsigned long tmp; \
|
||||
int result; \
|
||||
@@ -52,7 +52,7 @@ static inline void atomic_##op(int i, atomic_t *v) \
|
||||
} \
|
||||
|
||||
#define ATOMIC_OP_RETURN(op, c_op, asm_op) \
|
||||
static inline int atomic_##op##_return_relaxed(int i, atomic_t *v) \
|
||||
static inline int arch_atomic_##op##_return_relaxed(int i, atomic_t *v) \
|
||||
{ \
|
||||
unsigned long tmp; \
|
||||
int result; \
|
||||
@@ -73,7 +73,7 @@ static inline int atomic_##op##_return_relaxed(int i, atomic_t *v) \
|
||||
}
|
||||
|
||||
#define ATOMIC_FETCH_OP(op, c_op, asm_op) \
|
||||
static inline int atomic_fetch_##op##_relaxed(int i, atomic_t *v) \
|
||||
static inline int arch_atomic_fetch_##op##_relaxed(int i, atomic_t *v) \
|
||||
{ \
|
||||
unsigned long tmp; \
|
||||
int result, val; \
|
||||
@@ -93,17 +93,17 @@ static inline int atomic_fetch_##op##_relaxed(int i, atomic_t *v) \
|
||||
return result; \
|
||||
}
|
||||
|
||||
#define atomic_add_return_relaxed atomic_add_return_relaxed
|
||||
#define atomic_sub_return_relaxed atomic_sub_return_relaxed
|
||||
#define atomic_fetch_add_relaxed atomic_fetch_add_relaxed
|
||||
#define atomic_fetch_sub_relaxed atomic_fetch_sub_relaxed
|
||||
#define arch_atomic_add_return_relaxed arch_atomic_add_return_relaxed
|
||||
#define arch_atomic_sub_return_relaxed arch_atomic_sub_return_relaxed
|
||||
#define arch_atomic_fetch_add_relaxed arch_atomic_fetch_add_relaxed
|
||||
#define arch_atomic_fetch_sub_relaxed arch_atomic_fetch_sub_relaxed
|
||||
|
||||
#define atomic_fetch_and_relaxed atomic_fetch_and_relaxed
|
||||
#define atomic_fetch_andnot_relaxed atomic_fetch_andnot_relaxed
|
||||
#define atomic_fetch_or_relaxed atomic_fetch_or_relaxed
|
||||
#define atomic_fetch_xor_relaxed atomic_fetch_xor_relaxed
|
||||
#define arch_atomic_fetch_and_relaxed arch_atomic_fetch_and_relaxed
|
||||
#define arch_atomic_fetch_andnot_relaxed arch_atomic_fetch_andnot_relaxed
|
||||
#define arch_atomic_fetch_or_relaxed arch_atomic_fetch_or_relaxed
|
||||
#define arch_atomic_fetch_xor_relaxed arch_atomic_fetch_xor_relaxed
|
||||
|
||||
static inline int atomic_cmpxchg_relaxed(atomic_t *ptr, int old, int new)
|
||||
static inline int arch_atomic_cmpxchg_relaxed(atomic_t *ptr, int old, int new)
|
||||
{
|
||||
int oldval;
|
||||
unsigned long res;
|
||||
@@ -123,9 +123,9 @@ static inline int atomic_cmpxchg_relaxed(atomic_t *ptr, int old, int new)
|
||||
|
||||
return oldval;
|
||||
}
|
||||
#define atomic_cmpxchg_relaxed atomic_cmpxchg_relaxed
|
||||
#define arch_atomic_cmpxchg_relaxed arch_atomic_cmpxchg_relaxed
|
||||
|
||||
static inline int atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
||||
static inline int arch_atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
||||
{
|
||||
int oldval, newval;
|
||||
unsigned long tmp;
|
||||
@@ -151,7 +151,7 @@ static inline int atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
||||
|
||||
return oldval;
|
||||
}
|
||||
#define atomic_fetch_add_unless atomic_fetch_add_unless
|
||||
#define arch_atomic_fetch_add_unless arch_atomic_fetch_add_unless
|
||||
|
||||
#else /* ARM_ARCH_6 */
|
||||
|
||||
@@ -160,7 +160,7 @@ static inline int atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
||||
#endif
|
||||
|
||||
#define ATOMIC_OP(op, c_op, asm_op) \
|
||||
static inline void atomic_##op(int i, atomic_t *v) \
|
||||
static inline void arch_atomic_##op(int i, atomic_t *v) \
|
||||
{ \
|
||||
unsigned long flags; \
|
||||
\
|
||||
@@ -170,7 +170,7 @@ static inline void atomic_##op(int i, atomic_t *v) \
|
||||
} \
|
||||
|
||||
#define ATOMIC_OP_RETURN(op, c_op, asm_op) \
|
||||
static inline int atomic_##op##_return(int i, atomic_t *v) \
|
||||
static inline int arch_atomic_##op##_return(int i, atomic_t *v) \
|
||||
{ \
|
||||
unsigned long flags; \
|
||||
int val; \
|
||||
@@ -184,7 +184,7 @@ static inline int atomic_##op##_return(int i, atomic_t *v) \
|
||||
}
|
||||
|
||||
#define ATOMIC_FETCH_OP(op, c_op, asm_op) \
|
||||
static inline int atomic_fetch_##op(int i, atomic_t *v) \
|
||||
static inline int arch_atomic_fetch_##op(int i, atomic_t *v) \
|
||||
{ \
|
||||
unsigned long flags; \
|
||||
int val; \
|
||||
@@ -197,7 +197,7 @@ static inline int atomic_fetch_##op(int i, atomic_t *v) \
|
||||
return val; \
|
||||
}
|
||||
|
||||
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||
static inline int arch_atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||
{
|
||||
int ret;
|
||||
unsigned long flags;
|
||||
@@ -211,7 +211,7 @@ static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define atomic_fetch_andnot atomic_fetch_andnot
|
||||
#define arch_atomic_fetch_andnot arch_atomic_fetch_andnot
|
||||
|
||||
#endif /* __LINUX_ARM_ARCH__ */
|
||||
|
||||
@@ -223,7 +223,7 @@ static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||
ATOMIC_OPS(add, +=, add)
|
||||
ATOMIC_OPS(sub, -=, sub)
|
||||
|
||||
#define atomic_andnot atomic_andnot
|
||||
#define arch_atomic_andnot arch_atomic_andnot
|
||||
|
||||
#undef ATOMIC_OPS
|
||||
#define ATOMIC_OPS(op, c_op, asm_op) \
|
||||
@@ -240,7 +240,7 @@ ATOMIC_OPS(xor, ^=, eor)
|
||||
#undef ATOMIC_OP_RETURN
|
||||
#undef ATOMIC_OP
|
||||
|
||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
|
||||
#define arch_atomic_xchg(v, new) (arch_xchg(&((v)->counter), new))
|
||||
|
||||
#ifndef CONFIG_GENERIC_ATOMIC64
|
||||
typedef struct {
|
||||
@@ -250,7 +250,7 @@ typedef struct {
|
||||
#define ATOMIC64_INIT(i) { (i) }
|
||||
|
||||
#ifdef CONFIG_ARM_LPAE
|
||||
static inline s64 atomic64_read(const atomic64_t *v)
|
||||
static inline s64 arch_atomic64_read(const atomic64_t *v)
|
||||
{
|
||||
s64 result;
|
||||
|
||||
@@ -263,7 +263,7 @@ static inline s64 atomic64_read(const atomic64_t *v)
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline void atomic64_set(atomic64_t *v, s64 i)
|
||||
static inline void arch_atomic64_set(atomic64_t *v, s64 i)
|
||||
{
|
||||
__asm__ __volatile__("@ atomic64_set\n"
|
||||
" strd %2, %H2, [%1]"
|
||||
@@ -272,7 +272,7 @@ static inline void atomic64_set(atomic64_t *v, s64 i)
|
||||
);
|
||||
}
|
||||
#else
|
||||
static inline s64 atomic64_read(const atomic64_t *v)
|
||||
static inline s64 arch_atomic64_read(const atomic64_t *v)
|
||||
{
|
||||
s64 result;
|
||||
|
||||
@@ -285,7 +285,7 @@ static inline s64 atomic64_read(const atomic64_t *v)
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline void atomic64_set(atomic64_t *v, s64 i)
|
||||
static inline void arch_atomic64_set(atomic64_t *v, s64 i)
|
||||
{
|
||||
s64 tmp;
|
||||
|
||||
@@ -302,7 +302,7 @@ static inline void atomic64_set(atomic64_t *v, s64 i)
|
||||
#endif
|
||||
|
||||
#define ATOMIC64_OP(op, op1, op2) \
|
||||
static inline void atomic64_##op(s64 i, atomic64_t *v) \
|
||||
static inline void arch_atomic64_##op(s64 i, atomic64_t *v) \
|
||||
{ \
|
||||
s64 result; \
|
||||
unsigned long tmp; \
|
||||
@@ -322,7 +322,7 @@ static inline void atomic64_##op(s64 i, atomic64_t *v) \
|
||||
|
||||
#define ATOMIC64_OP_RETURN(op, op1, op2) \
|
||||
static inline s64 \
|
||||
atomic64_##op##_return_relaxed(s64 i, atomic64_t *v) \
|
||||
arch_atomic64_##op##_return_relaxed(s64 i, atomic64_t *v) \
|
||||
{ \
|
||||
s64 result; \
|
||||
unsigned long tmp; \
|
||||
@@ -345,7 +345,7 @@ atomic64_##op##_return_relaxed(s64 i, atomic64_t *v) \
|
||||
|
||||
#define ATOMIC64_FETCH_OP(op, op1, op2) \
|
||||
static inline s64 \
|
||||
atomic64_fetch_##op##_relaxed(s64 i, atomic64_t *v) \
|
||||
arch_atomic64_fetch_##op##_relaxed(s64 i, atomic64_t *v) \
|
||||
{ \
|
||||
s64 result, val; \
|
||||
unsigned long tmp; \
|
||||
@@ -374,34 +374,34 @@ atomic64_fetch_##op##_relaxed(s64 i, atomic64_t *v) \
|
||||
ATOMIC64_OPS(add, adds, adc)
|
||||
ATOMIC64_OPS(sub, subs, sbc)
|
||||
|
||||
#define atomic64_add_return_relaxed atomic64_add_return_relaxed
|
||||
#define atomic64_sub_return_relaxed atomic64_sub_return_relaxed
|
||||
#define atomic64_fetch_add_relaxed atomic64_fetch_add_relaxed
|
||||
#define atomic64_fetch_sub_relaxed atomic64_fetch_sub_relaxed
|
||||
#define arch_atomic64_add_return_relaxed arch_atomic64_add_return_relaxed
|
||||
#define arch_atomic64_sub_return_relaxed arch_atomic64_sub_return_relaxed
|
||||
#define arch_atomic64_fetch_add_relaxed arch_atomic64_fetch_add_relaxed
|
||||
#define arch_atomic64_fetch_sub_relaxed arch_atomic64_fetch_sub_relaxed
|
||||
|
||||
#undef ATOMIC64_OPS
|
||||
#define ATOMIC64_OPS(op, op1, op2) \
|
||||
ATOMIC64_OP(op, op1, op2) \
|
||||
ATOMIC64_FETCH_OP(op, op1, op2)
|
||||
|
||||
#define atomic64_andnot atomic64_andnot
|
||||
#define arch_atomic64_andnot arch_atomic64_andnot
|
||||
|
||||
ATOMIC64_OPS(and, and, and)
|
||||
ATOMIC64_OPS(andnot, bic, bic)
|
||||
ATOMIC64_OPS(or, orr, orr)
|
||||
ATOMIC64_OPS(xor, eor, eor)
|
||||
|
||||
#define atomic64_fetch_and_relaxed atomic64_fetch_and_relaxed
|
||||
#define atomic64_fetch_andnot_relaxed atomic64_fetch_andnot_relaxed
|
||||
#define atomic64_fetch_or_relaxed atomic64_fetch_or_relaxed
|
||||
#define atomic64_fetch_xor_relaxed atomic64_fetch_xor_relaxed
|
||||
#define arch_atomic64_fetch_and_relaxed arch_atomic64_fetch_and_relaxed
|
||||
#define arch_atomic64_fetch_andnot_relaxed arch_atomic64_fetch_andnot_relaxed
|
||||
#define arch_atomic64_fetch_or_relaxed arch_atomic64_fetch_or_relaxed
|
||||
#define arch_atomic64_fetch_xor_relaxed arch_atomic64_fetch_xor_relaxed
|
||||
|
||||
#undef ATOMIC64_OPS
|
||||
#undef ATOMIC64_FETCH_OP
|
||||
#undef ATOMIC64_OP_RETURN
|
||||
#undef ATOMIC64_OP
|
||||
|
||||
static inline s64 atomic64_cmpxchg_relaxed(atomic64_t *ptr, s64 old, s64 new)
|
||||
static inline s64 arch_atomic64_cmpxchg_relaxed(atomic64_t *ptr, s64 old, s64 new)
|
||||
{
|
||||
s64 oldval;
|
||||
unsigned long res;
|
||||
@@ -422,9 +422,9 @@ static inline s64 atomic64_cmpxchg_relaxed(atomic64_t *ptr, s64 old, s64 new)
|
||||
|
||||
return oldval;
|
||||
}
|
||||
#define atomic64_cmpxchg_relaxed atomic64_cmpxchg_relaxed
|
||||
#define arch_atomic64_cmpxchg_relaxed arch_atomic64_cmpxchg_relaxed
|
||||
|
||||
static inline s64 atomic64_xchg_relaxed(atomic64_t *ptr, s64 new)
|
||||
static inline s64 arch_atomic64_xchg_relaxed(atomic64_t *ptr, s64 new)
|
||||
{
|
||||
s64 result;
|
||||
unsigned long tmp;
|
||||
@@ -442,9 +442,9 @@ static inline s64 atomic64_xchg_relaxed(atomic64_t *ptr, s64 new)
|
||||
|
||||
return result;
|
||||
}
|
||||
#define atomic64_xchg_relaxed atomic64_xchg_relaxed
|
||||
#define arch_atomic64_xchg_relaxed arch_atomic64_xchg_relaxed
|
||||
|
||||
static inline s64 atomic64_dec_if_positive(atomic64_t *v)
|
||||
static inline s64 arch_atomic64_dec_if_positive(atomic64_t *v)
|
||||
{
|
||||
s64 result;
|
||||
unsigned long tmp;
|
||||
@@ -470,9 +470,9 @@ static inline s64 atomic64_dec_if_positive(atomic64_t *v)
|
||||
|
||||
return result;
|
||||
}
|
||||
#define atomic64_dec_if_positive atomic64_dec_if_positive
|
||||
#define arch_atomic64_dec_if_positive arch_atomic64_dec_if_positive
|
||||
|
||||
static inline s64 atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
|
||||
static inline s64 arch_atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
|
||||
{
|
||||
s64 oldval, newval;
|
||||
unsigned long tmp;
|
||||
@@ -500,7 +500,7 @@ static inline s64 atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
|
||||
|
||||
return oldval;
|
||||
}
|
||||
#define atomic64_fetch_add_unless atomic64_fetch_add_unless
|
||||
#define arch_atomic64_fetch_add_unless arch_atomic64_fetch_add_unless
|
||||
|
||||
#endif /* !CONFIG_GENERIC_ATOMIC64 */
|
||||
#endif
|
||||
|
||||
@@ -114,7 +114,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define xchg_relaxed(ptr, x) ({ \
|
||||
#define arch_xchg_relaxed(ptr, x) ({ \
|
||||
(__typeof__(*(ptr)))__xchg((unsigned long)(x), (ptr), \
|
||||
sizeof(*(ptr))); \
|
||||
})
|
||||
@@ -128,20 +128,20 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size
|
||||
#error "SMP is not supported on this platform"
|
||||
#endif
|
||||
|
||||
#define xchg xchg_relaxed
|
||||
#define arch_xchg arch_xchg_relaxed
|
||||
|
||||
/*
|
||||
* cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make
|
||||
* them available.
|
||||
*/
|
||||
#define cmpxchg_local(ptr, o, n) ({ \
|
||||
(__typeof(*ptr))__cmpxchg_local_generic((ptr), \
|
||||
#define arch_cmpxchg_local(ptr, o, n) ({ \
|
||||
(__typeof(*ptr))__generic_cmpxchg_local((ptr), \
|
||||
(unsigned long)(o), \
|
||||
(unsigned long)(n), \
|
||||
sizeof(*(ptr))); \
|
||||
})
|
||||
|
||||
#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))
|
||||
#define arch_cmpxchg64_local(ptr, o, n) __generic_cmpxchg64_local((ptr), (o), (n))
|
||||
|
||||
#include <asm-generic/cmpxchg.h>
|
||||
|
||||
@@ -207,7 +207,7 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
|
||||
return oldval;
|
||||
}
|
||||
|
||||
#define cmpxchg_relaxed(ptr,o,n) ({ \
|
||||
#define arch_cmpxchg_relaxed(ptr,o,n) ({ \
|
||||
(__typeof__(*(ptr)))__cmpxchg((ptr), \
|
||||
(unsigned long)(o), \
|
||||
(unsigned long)(n), \
|
||||
@@ -224,7 +224,7 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr,
|
||||
#ifdef CONFIG_CPU_V6 /* min ARCH == ARMv6 */
|
||||
case 1:
|
||||
case 2:
|
||||
ret = __cmpxchg_local_generic(ptr, old, new, size);
|
||||
ret = __generic_cmpxchg_local(ptr, old, new, size);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
@@ -234,7 +234,7 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define cmpxchg_local(ptr, o, n) ({ \
|
||||
#define arch_cmpxchg_local(ptr, o, n) ({ \
|
||||
(__typeof(*ptr))__cmpxchg_local((ptr), \
|
||||
(unsigned long)(o), \
|
||||
(unsigned long)(n), \
|
||||
@@ -266,13 +266,13 @@ static inline unsigned long long __cmpxchg64(unsigned long long *ptr,
|
||||
return oldval;
|
||||
}
|
||||
|
||||
#define cmpxchg64_relaxed(ptr, o, n) ({ \
|
||||
#define arch_cmpxchg64_relaxed(ptr, o, n) ({ \
|
||||
(__typeof__(*(ptr)))__cmpxchg64((ptr), \
|
||||
(unsigned long long)(o), \
|
||||
(unsigned long long)(n)); \
|
||||
})
|
||||
|
||||
#define cmpxchg64_local(ptr, o, n) cmpxchg64_relaxed((ptr), (o), (n))
|
||||
#define arch_cmpxchg64_local(ptr, o, n) arch_cmpxchg64_relaxed((ptr), (o), (n))
|
||||
|
||||
#endif /* __LINUX_ARM_ARCH__ >= 6 */
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#define sync_test_and_clear_bit(nr, p) _test_and_clear_bit(nr, p)
|
||||
#define sync_test_and_change_bit(nr, p) _test_and_change_bit(nr, p)
|
||||
#define sync_test_bit(nr, addr) test_bit(nr, addr)
|
||||
#define sync_cmpxchg cmpxchg
|
||||
#define arch_sync_cmpxchg arch_cmpxchg
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -288,7 +288,7 @@ unsigned long get_wchan(struct task_struct *p)
|
||||
struct stackframe frame;
|
||||
unsigned long stack_page;
|
||||
int count = 0;
|
||||
if (!p || p == current || p->state == TASK_RUNNING)
|
||||
if (!p || p == current || task_is_running(p))
|
||||
return 0;
|
||||
|
||||
frame.fp = thread_saved_fp(p);
|
||||
|
||||
@@ -436,7 +436,6 @@ asmlinkage void secondary_start_kernel(void)
|
||||
#endif
|
||||
pr_debug("CPU%u: Booted secondary processor\n", cpu);
|
||||
|
||||
preempt_disable();
|
||||
trace_hardirqs_off();
|
||||
|
||||
/*
|
||||
|
||||
@@ -348,29 +348,6 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, unsigned int fsr)
|
||||
reset_current_kprobe();
|
||||
}
|
||||
break;
|
||||
|
||||
case KPROBE_HIT_ACTIVE:
|
||||
case KPROBE_HIT_SSDONE:
|
||||
/*
|
||||
* We increment the nmissed count for accounting,
|
||||
* we can also use npre/npostfault count for accounting
|
||||
* these specific fault cases.
|
||||
*/
|
||||
kprobes_inc_nmissed_count(cur);
|
||||
|
||||
/*
|
||||
* We come here because instructions in the pre/post
|
||||
* handler caused the page_fault, this could happen
|
||||
* if handler tries to access user space by
|
||||
* copy_from_user(), get_user() etc. Let the
|
||||
* user-specified handler try to fix it.
|
||||
*/
|
||||
if (cur->fault_handler && cur->fault_handler(cur, regs, fsr))
|
||||
return 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -223,6 +223,4 @@ static __always_inline long arch_atomic64_dec_if_positive(atomic64_t *v)
|
||||
|
||||
#define arch_atomic64_dec_if_positive arch_atomic64_dec_if_positive
|
||||
|
||||
#define ARCH_ATOMIC
|
||||
|
||||
#endif /* __ASM_ATOMIC_H */
|
||||
|
||||
@@ -23,7 +23,7 @@ static inline void preempt_count_set(u64 pc)
|
||||
} while (0)
|
||||
|
||||
#define init_idle_preempt_count(p, cpu) do { \
|
||||
task_thread_info(p)->preempt_count = PREEMPT_ENABLED; \
|
||||
task_thread_info(p)->preempt_count = PREEMPT_DISABLED; \
|
||||
} while (0)
|
||||
|
||||
static inline void set_preempt_need_resched(void)
|
||||
|
||||
@@ -276,23 +276,6 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, unsigned int fsr)
|
||||
break;
|
||||
case KPROBE_HIT_ACTIVE:
|
||||
case KPROBE_HIT_SSDONE:
|
||||
/*
|
||||
* We increment the nmissed count for accounting,
|
||||
* we can also use npre/npostfault count for accounting
|
||||
* these specific fault cases.
|
||||
*/
|
||||
kprobes_inc_nmissed_count(cur);
|
||||
|
||||
/*
|
||||
* We come here because instructions in the pre/post
|
||||
* handler caused the page_fault, this could happen
|
||||
* if handler tries to access user space by
|
||||
* copy_from_user(), get_user() etc. Let the
|
||||
* user-specified handler try to fix it first.
|
||||
*/
|
||||
if (cur->fault_handler && cur->fault_handler(cur, regs, fsr))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* In case the user-specified fault handler returned
|
||||
* zero, try to fix up.
|
||||
|
||||
@@ -603,7 +603,7 @@ unsigned long get_wchan(struct task_struct *p)
|
||||
struct stackframe frame;
|
||||
unsigned long stack_page, ret = 0;
|
||||
int count = 0;
|
||||
if (!p || p == current || p->state == TASK_RUNNING)
|
||||
if (!p || p == current || task_is_running(p))
|
||||
return 0;
|
||||
|
||||
stack_page = (unsigned long)try_get_task_stack(p);
|
||||
|
||||
@@ -229,7 +229,6 @@ asmlinkage notrace void secondary_start_kernel(void)
|
||||
init_gic_priority_masking();
|
||||
|
||||
rcu_cpu_starting(cpu);
|
||||
preempt_disable();
|
||||
trace_hardirqs_off();
|
||||
|
||||
/*
|
||||
|
||||
@@ -20,8 +20,6 @@ if VIRTUALIZATION
|
||||
menuconfig KVM
|
||||
bool "Kernel-based Virtual Machine (KVM) support"
|
||||
depends on OF
|
||||
# for TASKSTATS/TASK_DELAY_ACCT:
|
||||
depends on NET && MULTIUSER
|
||||
select MMU_NOTIFIER
|
||||
select PREEMPT_NOTIFIERS
|
||||
select HAVE_KVM_CPU_RELAX_INTERCEPT
|
||||
@@ -38,8 +36,7 @@ menuconfig KVM
|
||||
select IRQ_BYPASS_MANAGER
|
||||
select HAVE_KVM_IRQ_BYPASS
|
||||
select HAVE_KVM_VCPU_RUN_PID_CHANGE
|
||||
select TASKSTATS
|
||||
select TASK_DELAY_ACCT
|
||||
select SCHED_INFO
|
||||
help
|
||||
Support hosting virtualized guest machines.
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ extern void __bad_xchg(void);
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define xchg_relaxed(ptr, x) \
|
||||
#define arch_xchg_relaxed(ptr, x) \
|
||||
(__xchg_relaxed((x), (ptr), sizeof(*(ptr))))
|
||||
|
||||
#define __cmpxchg_relaxed(ptr, old, new, size) \
|
||||
@@ -61,14 +61,14 @@ extern void __bad_xchg(void);
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define cmpxchg_relaxed(ptr, o, n) \
|
||||
#define arch_cmpxchg_relaxed(ptr, o, n) \
|
||||
(__cmpxchg_relaxed((ptr), (o), (n), sizeof(*(ptr))))
|
||||
|
||||
#define cmpxchg(ptr, o, n) \
|
||||
#define arch_cmpxchg(ptr, o, n) \
|
||||
({ \
|
||||
__typeof__(*(ptr)) __ret; \
|
||||
__smp_release_fence(); \
|
||||
__ret = cmpxchg_relaxed(ptr, o, n); \
|
||||
__ret = arch_cmpxchg_relaxed(ptr, o, n); \
|
||||
__smp_acquire_fence(); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
int main(void)
|
||||
{
|
||||
/* offsets into the task struct */
|
||||
DEFINE(TASK_STATE, offsetof(struct task_struct, state));
|
||||
DEFINE(TASK_THREAD_INFO, offsetof(struct task_struct, stack));
|
||||
DEFINE(TASK_FLAGS, offsetof(struct task_struct, flags));
|
||||
DEFINE(TASK_PTRACE, offsetof(struct task_struct, ptrace));
|
||||
|
||||
@@ -294,23 +294,6 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, unsigned int trapnr)
|
||||
break;
|
||||
case KPROBE_HIT_ACTIVE:
|
||||
case KPROBE_HIT_SSDONE:
|
||||
/*
|
||||
* We increment the nmissed count for accounting,
|
||||
* we can also use npre/npostfault count for accounting
|
||||
* these specific fault cases.
|
||||
*/
|
||||
kprobes_inc_nmissed_count(cur);
|
||||
|
||||
/*
|
||||
* We come here because instructions in the pre/post
|
||||
* handler caused the page_fault, this could happen
|
||||
* if handler tries to access user space by
|
||||
* copy_from_user(), get_user() etc. Let the
|
||||
* user-specified handler try to fix it first.
|
||||
*/
|
||||
if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* In case the user-specified fault handler returned
|
||||
* zero, try to fix up.
|
||||
|
||||
@@ -281,7 +281,6 @@ void csky_start_secondary(void)
|
||||
pr_info("CPU%u Online: %s...\n", cpu, __func__);
|
||||
|
||||
local_irq_enable();
|
||||
preempt_disable();
|
||||
cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
|
||||
}
|
||||
|
||||
|
||||
@@ -115,7 +115,7 @@ unsigned long get_wchan(struct task_struct *task)
|
||||
{
|
||||
unsigned long pc = 0;
|
||||
|
||||
if (likely(task && task != current && task->state != TASK_RUNNING))
|
||||
if (likely(task && task != current && !task_is_running(task)))
|
||||
walk_stackframe(task, NULL, save_wchan, &pc);
|
||||
return pc;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
generic-y += asm-offsets.h
|
||||
generic-y += cmpxchg.h
|
||||
generic-y += extable.h
|
||||
generic-y += kvm_para.h
|
||||
generic-y += mcs_spinlock.h
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __ARCH_H8300_ATOMIC__
|
||||
#define __ARCH_H8300_ATOMIC__
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/cmpxchg.h>
|
||||
#include <asm/irqflags.h>
|
||||
|
||||
/*
|
||||
* Atomic operations that C can't guarantee us. Useful for
|
||||
* resource counting etc..
|
||||
*/
|
||||
|
||||
#define atomic_read(v) READ_ONCE((v)->counter)
|
||||
#define atomic_set(v, i) WRITE_ONCE(((v)->counter), (i))
|
||||
|
||||
#define ATOMIC_OP_RETURN(op, c_op) \
|
||||
static inline int atomic_##op##_return(int i, atomic_t *v) \
|
||||
{ \
|
||||
h8300flags flags; \
|
||||
int ret; \
|
||||
\
|
||||
flags = arch_local_irq_save(); \
|
||||
ret = v->counter c_op i; \
|
||||
arch_local_irq_restore(flags); \
|
||||
return ret; \
|
||||
}
|
||||
|
||||
#define ATOMIC_FETCH_OP(op, c_op) \
|
||||
static inline int atomic_fetch_##op(int i, atomic_t *v) \
|
||||
{ \
|
||||
h8300flags flags; \
|
||||
int ret; \
|
||||
\
|
||||
flags = arch_local_irq_save(); \
|
||||
ret = v->counter; \
|
||||
v->counter c_op i; \
|
||||
arch_local_irq_restore(flags); \
|
||||
return ret; \
|
||||
}
|
||||
|
||||
#define ATOMIC_OP(op, c_op) \
|
||||
static inline void atomic_##op(int i, atomic_t *v) \
|
||||
{ \
|
||||
h8300flags flags; \
|
||||
\
|
||||
flags = arch_local_irq_save(); \
|
||||
v->counter c_op i; \
|
||||
arch_local_irq_restore(flags); \
|
||||
}
|
||||
|
||||
ATOMIC_OP_RETURN(add, +=)
|
||||
ATOMIC_OP_RETURN(sub, -=)
|
||||
|
||||
#define ATOMIC_OPS(op, c_op) \
|
||||
ATOMIC_OP(op, c_op) \
|
||||
ATOMIC_FETCH_OP(op, c_op)
|
||||
|
||||
ATOMIC_OPS(and, &=)
|
||||
ATOMIC_OPS(or, |=)
|
||||
ATOMIC_OPS(xor, ^=)
|
||||
ATOMIC_OPS(add, +=)
|
||||
ATOMIC_OPS(sub, -=)
|
||||
|
||||
#undef ATOMIC_OPS
|
||||
#undef ATOMIC_OP_RETURN
|
||||
#undef ATOMIC_OP
|
||||
|
||||
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||
{
|
||||
int ret;
|
||||
h8300flags flags;
|
||||
|
||||
flags = arch_local_irq_save();
|
||||
ret = v->counter;
|
||||
if (likely(ret == old))
|
||||
v->counter = new;
|
||||
arch_local_irq_restore(flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
||||
{
|
||||
int ret;
|
||||
h8300flags flags;
|
||||
|
||||
flags = arch_local_irq_save();
|
||||
ret = v->counter;
|
||||
if (ret != u)
|
||||
v->counter += a;
|
||||
arch_local_irq_restore(flags);
|
||||
return ret;
|
||||
}
|
||||
#define atomic_fetch_add_unless atomic_fetch_add_unless
|
||||
|
||||
#endif /* __ARCH_H8300_ATOMIC __ */
|
||||
@@ -1,66 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __ARCH_H8300_CMPXCHG__
|
||||
#define __ARCH_H8300_CMPXCHG__
|
||||
|
||||
#include <linux/irqflags.h>
|
||||
|
||||
#define xchg(ptr, x) \
|
||||
((__typeof__(*(ptr)))__xchg((unsigned long)(x), (ptr), \
|
||||
sizeof(*(ptr))))
|
||||
|
||||
struct __xchg_dummy { unsigned long a[100]; };
|
||||
#define __xg(x) ((volatile struct __xchg_dummy *)(x))
|
||||
|
||||
static inline unsigned long __xchg(unsigned long x,
|
||||
volatile void *ptr, int size)
|
||||
{
|
||||
unsigned long tmp, flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
switch (size) {
|
||||
case 1:
|
||||
__asm__ __volatile__
|
||||
("mov.b %2,%0\n\t"
|
||||
"mov.b %1,%2"
|
||||
: "=&r" (tmp) : "r" (x), "m" (*__xg(ptr)));
|
||||
break;
|
||||
case 2:
|
||||
__asm__ __volatile__
|
||||
("mov.w %2,%0\n\t"
|
||||
"mov.w %1,%2"
|
||||
: "=&r" (tmp) : "r" (x), "m" (*__xg(ptr)));
|
||||
break;
|
||||
case 4:
|
||||
__asm__ __volatile__
|
||||
("mov.l %2,%0\n\t"
|
||||
"mov.l %1,%2"
|
||||
: "=&r" (tmp) : "r" (x), "m" (*__xg(ptr)));
|
||||
break;
|
||||
default:
|
||||
tmp = 0;
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
#include <asm-generic/cmpxchg-local.h>
|
||||
|
||||
/*
|
||||
* cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make
|
||||
* them available.
|
||||
*/
|
||||
#define cmpxchg_local(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), \
|
||||
(unsigned long)(o), \
|
||||
(unsigned long)(n), \
|
||||
sizeof(*(ptr))))
|
||||
#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))
|
||||
|
||||
#ifndef CONFIG_SMP
|
||||
#include <asm-generic/cmpxchg.h>
|
||||
#endif
|
||||
|
||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
|
||||
|
||||
#endif /* __ARCH_H8300_CMPXCHG__ */
|
||||
@@ -21,7 +21,6 @@
|
||||
int main(void)
|
||||
{
|
||||
/* offsets into the task struct */
|
||||
OFFSET(TASK_STATE, task_struct, state);
|
||||
OFFSET(TASK_FLAGS, task_struct, flags);
|
||||
OFFSET(TASK_PTRACE, task_struct, ptrace);
|
||||
OFFSET(TASK_BLOCKED, task_struct, blocked);
|
||||
|
||||
@@ -134,7 +134,7 @@ unsigned long get_wchan(struct task_struct *p)
|
||||
unsigned long stack_page;
|
||||
int count = 0;
|
||||
|
||||
if (!p || p == current || p->state == TASK_RUNNING)
|
||||
if (!p || p == current || task_is_running(p))
|
||||
return 0;
|
||||
|
||||
stack_page = (unsigned long)p;
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
/* Normal writes in our arch don't clear lock reservations */
|
||||
|
||||
static inline void atomic_set(atomic_t *v, int new)
|
||||
static inline void arch_atomic_set(atomic_t *v, int new)
|
||||
{
|
||||
asm volatile(
|
||||
"1: r6 = memw_locked(%0);\n"
|
||||
@@ -26,26 +26,26 @@ static inline void atomic_set(atomic_t *v, int new)
|
||||
);
|
||||
}
|
||||
|
||||
#define atomic_set_release(v, i) atomic_set((v), (i))
|
||||
#define arch_atomic_set_release(v, i) arch_atomic_set((v), (i))
|
||||
|
||||
/**
|
||||
* atomic_read - reads a word, atomically
|
||||
* arch_atomic_read - reads a word, atomically
|
||||
* @v: pointer to atomic value
|
||||
*
|
||||
* Assumes all word reads on our architecture are atomic.
|
||||
*/
|
||||
#define atomic_read(v) READ_ONCE((v)->counter)
|
||||
#define arch_atomic_read(v) READ_ONCE((v)->counter)
|
||||
|
||||
/**
|
||||
* atomic_xchg - atomic
|
||||
* arch_atomic_xchg - atomic
|
||||
* @v: pointer to memory to change
|
||||
* @new: new value (technically passed in a register -- see xchg)
|
||||
*/
|
||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), (new)))
|
||||
#define arch_atomic_xchg(v, new) (arch_xchg(&((v)->counter), (new)))
|
||||
|
||||
|
||||
/**
|
||||
* atomic_cmpxchg - atomic compare-and-exchange values
|
||||
* arch_atomic_cmpxchg - atomic compare-and-exchange values
|
||||
* @v: pointer to value to change
|
||||
* @old: desired old value to match
|
||||
* @new: new value to put in
|
||||
@@ -61,7 +61,7 @@ static inline void atomic_set(atomic_t *v, int new)
|
||||
*
|
||||
* "old" is "expected" old val, __oldval is actual old value
|
||||
*/
|
||||
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||
static inline int arch_atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||
{
|
||||
int __oldval;
|
||||
|
||||
@@ -81,7 +81,7 @@ static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||
}
|
||||
|
||||
#define ATOMIC_OP(op) \
|
||||
static inline void atomic_##op(int i, atomic_t *v) \
|
||||
static inline void arch_atomic_##op(int i, atomic_t *v) \
|
||||
{ \
|
||||
int output; \
|
||||
\
|
||||
@@ -97,7 +97,7 @@ static inline void atomic_##op(int i, atomic_t *v) \
|
||||
} \
|
||||
|
||||
#define ATOMIC_OP_RETURN(op) \
|
||||
static inline int atomic_##op##_return(int i, atomic_t *v) \
|
||||
static inline int arch_atomic_##op##_return(int i, atomic_t *v) \
|
||||
{ \
|
||||
int output; \
|
||||
\
|
||||
@@ -114,7 +114,7 @@ static inline int atomic_##op##_return(int i, atomic_t *v) \
|
||||
}
|
||||
|
||||
#define ATOMIC_FETCH_OP(op) \
|
||||
static inline int atomic_fetch_##op(int i, atomic_t *v) \
|
||||
static inline int arch_atomic_fetch_##op(int i, atomic_t *v) \
|
||||
{ \
|
||||
int output, val; \
|
||||
\
|
||||
@@ -148,7 +148,7 @@ ATOMIC_OPS(xor)
|
||||
#undef ATOMIC_OP
|
||||
|
||||
/**
|
||||
* atomic_fetch_add_unless - add unless the number is a given value
|
||||
* arch_atomic_fetch_add_unless - add unless the number is a given value
|
||||
* @v: pointer to value
|
||||
* @a: amount to add
|
||||
* @u: unless value is equal to u
|
||||
@@ -157,7 +157,7 @@ ATOMIC_OPS(xor)
|
||||
*
|
||||
*/
|
||||
|
||||
static inline int atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
||||
static inline int arch_atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
||||
{
|
||||
int __oldval;
|
||||
register int tmp;
|
||||
@@ -180,6 +180,6 @@ static inline int atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
||||
);
|
||||
return __oldval;
|
||||
}
|
||||
#define atomic_fetch_add_unless atomic_fetch_add_unless
|
||||
#define arch_atomic_fetch_add_unless arch_atomic_fetch_add_unless
|
||||
|
||||
#endif
|
||||
|
||||
@@ -42,7 +42,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
|
||||
* Atomically swap the contents of a register with memory. Should be atomic
|
||||
* between multiple CPU's and within interrupts on the same CPU.
|
||||
*/
|
||||
#define xchg(ptr, v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v), (ptr), \
|
||||
#define arch_xchg(ptr, v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v), (ptr), \
|
||||
sizeof(*(ptr))))
|
||||
|
||||
/*
|
||||
@@ -51,7 +51,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
|
||||
* variable casting.
|
||||
*/
|
||||
|
||||
#define cmpxchg(ptr, old, new) \
|
||||
#define arch_cmpxchg(ptr, old, new) \
|
||||
({ \
|
||||
__typeof__(ptr) __ptr = (ptr); \
|
||||
__typeof__(*(ptr)) __old = (old); \
|
||||
|
||||
@@ -135,7 +135,7 @@ unsigned long get_wchan(struct task_struct *p)
|
||||
unsigned long fp, pc;
|
||||
unsigned long stack_page;
|
||||
int count = 0;
|
||||
if (!p || p == current || p->state == TASK_RUNNING)
|
||||
if (!p || p == current || task_is_running(p))
|
||||
return 0;
|
||||
|
||||
stack_page = (unsigned long)task_stack_page(p);
|
||||
|
||||
@@ -21,11 +21,11 @@
|
||||
|
||||
#define ATOMIC64_INIT(i) { (i) }
|
||||
|
||||
#define atomic_read(v) READ_ONCE((v)->counter)
|
||||
#define atomic64_read(v) READ_ONCE((v)->counter)
|
||||
#define arch_atomic_read(v) READ_ONCE((v)->counter)
|
||||
#define arch_atomic64_read(v) READ_ONCE((v)->counter)
|
||||
|
||||
#define atomic_set(v,i) WRITE_ONCE(((v)->counter), (i))
|
||||
#define atomic64_set(v,i) WRITE_ONCE(((v)->counter), (i))
|
||||
#define arch_atomic_set(v,i) WRITE_ONCE(((v)->counter), (i))
|
||||
#define arch_atomic64_set(v,i) WRITE_ONCE(((v)->counter), (i))
|
||||
|
||||
#define ATOMIC_OP(op, c_op) \
|
||||
static __inline__ int \
|
||||
@@ -36,7 +36,7 @@ ia64_atomic_##op (int i, atomic_t *v) \
|
||||
\
|
||||
do { \
|
||||
CMPXCHG_BUGCHECK(v); \
|
||||
old = atomic_read(v); \
|
||||
old = arch_atomic_read(v); \
|
||||
new = old c_op i; \
|
||||
} while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic_t)) != old); \
|
||||
return new; \
|
||||
@@ -51,7 +51,7 @@ ia64_atomic_fetch_##op (int i, atomic_t *v) \
|
||||
\
|
||||
do { \
|
||||
CMPXCHG_BUGCHECK(v); \
|
||||
old = atomic_read(v); \
|
||||
old = arch_atomic_read(v); \
|
||||
new = old c_op i; \
|
||||
} while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic_t)) != old); \
|
||||
return old; \
|
||||
@@ -74,7 +74,7 @@ ATOMIC_OPS(sub, -)
|
||||
#define __ia64_atomic_const(i) 0
|
||||
#endif
|
||||
|
||||
#define atomic_add_return(i,v) \
|
||||
#define arch_atomic_add_return(i,v) \
|
||||
({ \
|
||||
int __ia64_aar_i = (i); \
|
||||
__ia64_atomic_const(i) \
|
||||
@@ -82,7 +82,7 @@ ATOMIC_OPS(sub, -)
|
||||
: ia64_atomic_add(__ia64_aar_i, v); \
|
||||
})
|
||||
|
||||
#define atomic_sub_return(i,v) \
|
||||
#define arch_atomic_sub_return(i,v) \
|
||||
({ \
|
||||
int __ia64_asr_i = (i); \
|
||||
__ia64_atomic_const(i) \
|
||||
@@ -90,7 +90,7 @@ ATOMIC_OPS(sub, -)
|
||||
: ia64_atomic_sub(__ia64_asr_i, v); \
|
||||
})
|
||||
|
||||
#define atomic_fetch_add(i,v) \
|
||||
#define arch_atomic_fetch_add(i,v) \
|
||||
({ \
|
||||
int __ia64_aar_i = (i); \
|
||||
__ia64_atomic_const(i) \
|
||||
@@ -98,7 +98,7 @@ ATOMIC_OPS(sub, -)
|
||||
: ia64_atomic_fetch_add(__ia64_aar_i, v); \
|
||||
})
|
||||
|
||||
#define atomic_fetch_sub(i,v) \
|
||||
#define arch_atomic_fetch_sub(i,v) \
|
||||
({ \
|
||||
int __ia64_asr_i = (i); \
|
||||
__ia64_atomic_const(i) \
|
||||
@@ -110,13 +110,13 @@ ATOMIC_FETCH_OP(and, &)
|
||||
ATOMIC_FETCH_OP(or, |)
|
||||
ATOMIC_FETCH_OP(xor, ^)
|
||||
|
||||
#define atomic_and(i,v) (void)ia64_atomic_fetch_and(i,v)
|
||||
#define atomic_or(i,v) (void)ia64_atomic_fetch_or(i,v)
|
||||
#define atomic_xor(i,v) (void)ia64_atomic_fetch_xor(i,v)
|
||||
#define arch_atomic_and(i,v) (void)ia64_atomic_fetch_and(i,v)
|
||||
#define arch_atomic_or(i,v) (void)ia64_atomic_fetch_or(i,v)
|
||||
#define arch_atomic_xor(i,v) (void)ia64_atomic_fetch_xor(i,v)
|
||||
|
||||
#define atomic_fetch_and(i,v) ia64_atomic_fetch_and(i,v)
|
||||
#define atomic_fetch_or(i,v) ia64_atomic_fetch_or(i,v)
|
||||
#define atomic_fetch_xor(i,v) ia64_atomic_fetch_xor(i,v)
|
||||
#define arch_atomic_fetch_and(i,v) ia64_atomic_fetch_and(i,v)
|
||||
#define arch_atomic_fetch_or(i,v) ia64_atomic_fetch_or(i,v)
|
||||
#define arch_atomic_fetch_xor(i,v) ia64_atomic_fetch_xor(i,v)
|
||||
|
||||
#undef ATOMIC_OPS
|
||||
#undef ATOMIC_FETCH_OP
|
||||
@@ -131,7 +131,7 @@ ia64_atomic64_##op (s64 i, atomic64_t *v) \
|
||||
\
|
||||
do { \
|
||||
CMPXCHG_BUGCHECK(v); \
|
||||
old = atomic64_read(v); \
|
||||
old = arch_atomic64_read(v); \
|
||||
new = old c_op i; \
|
||||
} while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic64_t)) != old); \
|
||||
return new; \
|
||||
@@ -146,7 +146,7 @@ ia64_atomic64_fetch_##op (s64 i, atomic64_t *v) \
|
||||
\
|
||||
do { \
|
||||
CMPXCHG_BUGCHECK(v); \
|
||||
old = atomic64_read(v); \
|
||||
old = arch_atomic64_read(v); \
|
||||
new = old c_op i; \
|
||||
} while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic64_t)) != old); \
|
||||
return old; \
|
||||
@@ -159,7 +159,7 @@ ia64_atomic64_fetch_##op (s64 i, atomic64_t *v) \
|
||||
ATOMIC64_OPS(add, +)
|
||||
ATOMIC64_OPS(sub, -)
|
||||
|
||||
#define atomic64_add_return(i,v) \
|
||||
#define arch_atomic64_add_return(i,v) \
|
||||
({ \
|
||||
s64 __ia64_aar_i = (i); \
|
||||
__ia64_atomic_const(i) \
|
||||
@@ -167,7 +167,7 @@ ATOMIC64_OPS(sub, -)
|
||||
: ia64_atomic64_add(__ia64_aar_i, v); \
|
||||
})
|
||||
|
||||
#define atomic64_sub_return(i,v) \
|
||||
#define arch_atomic64_sub_return(i,v) \
|
||||
({ \
|
||||
s64 __ia64_asr_i = (i); \
|
||||
__ia64_atomic_const(i) \
|
||||
@@ -175,7 +175,7 @@ ATOMIC64_OPS(sub, -)
|
||||
: ia64_atomic64_sub(__ia64_asr_i, v); \
|
||||
})
|
||||
|
||||
#define atomic64_fetch_add(i,v) \
|
||||
#define arch_atomic64_fetch_add(i,v) \
|
||||
({ \
|
||||
s64 __ia64_aar_i = (i); \
|
||||
__ia64_atomic_const(i) \
|
||||
@@ -183,7 +183,7 @@ ATOMIC64_OPS(sub, -)
|
||||
: ia64_atomic64_fetch_add(__ia64_aar_i, v); \
|
||||
})
|
||||
|
||||
#define atomic64_fetch_sub(i,v) \
|
||||
#define arch_atomic64_fetch_sub(i,v) \
|
||||
({ \
|
||||
s64 __ia64_asr_i = (i); \
|
||||
__ia64_atomic_const(i) \
|
||||
@@ -195,29 +195,29 @@ ATOMIC64_FETCH_OP(and, &)
|
||||
ATOMIC64_FETCH_OP(or, |)
|
||||
ATOMIC64_FETCH_OP(xor, ^)
|
||||
|
||||
#define atomic64_and(i,v) (void)ia64_atomic64_fetch_and(i,v)
|
||||
#define atomic64_or(i,v) (void)ia64_atomic64_fetch_or(i,v)
|
||||
#define atomic64_xor(i,v) (void)ia64_atomic64_fetch_xor(i,v)
|
||||
#define arch_atomic64_and(i,v) (void)ia64_atomic64_fetch_and(i,v)
|
||||
#define arch_atomic64_or(i,v) (void)ia64_atomic64_fetch_or(i,v)
|
||||
#define arch_atomic64_xor(i,v) (void)ia64_atomic64_fetch_xor(i,v)
|
||||
|
||||
#define atomic64_fetch_and(i,v) ia64_atomic64_fetch_and(i,v)
|
||||
#define atomic64_fetch_or(i,v) ia64_atomic64_fetch_or(i,v)
|
||||
#define atomic64_fetch_xor(i,v) ia64_atomic64_fetch_xor(i,v)
|
||||
#define arch_atomic64_fetch_and(i,v) ia64_atomic64_fetch_and(i,v)
|
||||
#define arch_atomic64_fetch_or(i,v) ia64_atomic64_fetch_or(i,v)
|
||||
#define arch_atomic64_fetch_xor(i,v) ia64_atomic64_fetch_xor(i,v)
|
||||
|
||||
#undef ATOMIC64_OPS
|
||||
#undef ATOMIC64_FETCH_OP
|
||||
#undef ATOMIC64_OP
|
||||
|
||||
#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new))
|
||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
|
||||
#define arch_atomic_cmpxchg(v, old, new) (arch_cmpxchg(&((v)->counter), old, new))
|
||||
#define arch_atomic_xchg(v, new) (arch_xchg(&((v)->counter), new))
|
||||
|
||||
#define atomic64_cmpxchg(v, old, new) \
|
||||
(cmpxchg(&((v)->counter), old, new))
|
||||
#define atomic64_xchg(v, new) (xchg(&((v)->counter), new))
|
||||
#define arch_atomic64_cmpxchg(v, old, new) \
|
||||
(arch_cmpxchg(&((v)->counter), old, new))
|
||||
#define arch_atomic64_xchg(v, new) (arch_xchg(&((v)->counter), new))
|
||||
|
||||
#define atomic_add(i,v) (void)atomic_add_return((i), (v))
|
||||
#define atomic_sub(i,v) (void)atomic_sub_return((i), (v))
|
||||
#define arch_atomic_add(i,v) (void)arch_atomic_add_return((i), (v))
|
||||
#define arch_atomic_sub(i,v) (void)arch_atomic_sub_return((i), (v))
|
||||
|
||||
#define atomic64_add(i,v) (void)atomic64_add_return((i), (v))
|
||||
#define atomic64_sub(i,v) (void)atomic64_sub_return((i), (v))
|
||||
#define arch_atomic64_add(i,v) (void)arch_atomic64_add_return((i), (v))
|
||||
#define arch_atomic64_sub(i,v) (void)arch_atomic64_sub_return((i), (v))
|
||||
|
||||
#endif /* _ASM_IA64_ATOMIC_H */
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_IA64_CMPXCHG_H
|
||||
#define _ASM_IA64_CMPXCHG_H
|
||||
|
||||
#include <uapi/asm/cmpxchg.h>
|
||||
|
||||
#define arch_xchg(ptr, x) \
|
||||
({(__typeof__(*(ptr))) __xchg((unsigned long) (x), (ptr), sizeof(*(ptr)));})
|
||||
|
||||
#define arch_cmpxchg(ptr, o, n) cmpxchg_acq((ptr), (o), (n))
|
||||
#define arch_cmpxchg64(ptr, o, n) cmpxchg_acq((ptr), (o), (n))
|
||||
|
||||
#define arch_cmpxchg_local arch_cmpxchg
|
||||
#define arch_cmpxchg64_local arch_cmpxchg64
|
||||
|
||||
#endif /* _ASM_IA64_CMPXCHG_H */
|
||||
@@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ASM_IA64_CMPXCHG_H
|
||||
#define _ASM_IA64_CMPXCHG_H
|
||||
#ifndef _UAPI_ASM_IA64_CMPXCHG_H
|
||||
#define _UAPI_ASM_IA64_CMPXCHG_H
|
||||
|
||||
/*
|
||||
* Compare/Exchange, forked from asm/intrinsics.h
|
||||
@@ -53,8 +53,10 @@ extern void ia64_xchg_called_with_bad_pointer(void);
|
||||
__xchg_result; \
|
||||
})
|
||||
|
||||
#ifndef __KERNEL__
|
||||
#define xchg(ptr, x) \
|
||||
({(__typeof__(*(ptr))) __xchg((unsigned long) (x), (ptr), sizeof(*(ptr)));})
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Atomic compare and exchange. Compare OLD with MEM, if identical,
|
||||
@@ -126,12 +128,14 @@ extern long ia64_cmpxchg_called_with_bad_pointer(void);
|
||||
* we had to back-pedal and keep the "legacy" behavior of a full fence :-(
|
||||
*/
|
||||
|
||||
#ifndef __KERNEL__
|
||||
/* for compatibility with other platforms: */
|
||||
#define cmpxchg(ptr, o, n) cmpxchg_acq((ptr), (o), (n))
|
||||
#define cmpxchg64(ptr, o, n) cmpxchg_acq((ptr), (o), (n))
|
||||
|
||||
#define cmpxchg_local cmpxchg
|
||||
#define cmpxchg64_local cmpxchg64
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IA64_DEBUG_CMPXCHG
|
||||
# define CMPXCHG_BUGCHECK_DECL int _cmpxchg_bugcheck_count = 128;
|
||||
@@ -152,4 +156,4 @@ do { \
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_IA64_CMPXCHG_H */
|
||||
#endif /* _UAPI_ASM_IA64_CMPXCHG_H */
|
||||
|
||||
@@ -843,22 +843,6 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
|
||||
break;
|
||||
case KPROBE_HIT_ACTIVE:
|
||||
case KPROBE_HIT_SSDONE:
|
||||
/*
|
||||
* We increment the nmissed count for accounting,
|
||||
* we can also use npre/npostfault count for accounting
|
||||
* these specific fault cases.
|
||||
*/
|
||||
kprobes_inc_nmissed_count(cur);
|
||||
|
||||
/*
|
||||
* We come here because instructions in the pre/post
|
||||
* handler caused the page_fault, this could happen
|
||||
* if handler tries to access user space by
|
||||
* copy_from_user(), get_user() etc. Let the
|
||||
* user-specified handler try to fix it first.
|
||||
*/
|
||||
if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr))
|
||||
return 1;
|
||||
/*
|
||||
* In case the user-specified fault handler returned
|
||||
* zero, try to fix up.
|
||||
|
||||
@@ -1788,7 +1788,7 @@ format_mca_init_stack(void *mca_data, unsigned long offset,
|
||||
ti->task = p;
|
||||
ti->cpu = cpu;
|
||||
p->stack = ti;
|
||||
p->state = TASK_UNINTERRUPTIBLE;
|
||||
p->__state = TASK_UNINTERRUPTIBLE;
|
||||
cpumask_set_cpu(cpu, &p->cpus_mask);
|
||||
INIT_LIST_HEAD(&p->tasks);
|
||||
p->parent = p->real_parent = p->group_leader = p;
|
||||
|
||||
@@ -529,7 +529,7 @@ get_wchan (struct task_struct *p)
|
||||
unsigned long ip;
|
||||
int count = 0;
|
||||
|
||||
if (!p || p == current || p->state == TASK_RUNNING)
|
||||
if (!p || p == current || task_is_running(p))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
@@ -542,7 +542,7 @@ get_wchan (struct task_struct *p)
|
||||
*/
|
||||
unw_init_from_blocked_task(&info, p);
|
||||
do {
|
||||
if (p->state == TASK_RUNNING)
|
||||
if (task_is_running(p))
|
||||
return 0;
|
||||
if (unw_unwind(&info) < 0)
|
||||
return 0;
|
||||
|
||||
@@ -641,11 +641,11 @@ ptrace_attach_sync_user_rbs (struct task_struct *child)
|
||||
read_lock(&tasklist_lock);
|
||||
if (child->sighand) {
|
||||
spin_lock_irq(&child->sighand->siglock);
|
||||
if (child->state == TASK_STOPPED &&
|
||||
if (READ_ONCE(child->__state) == TASK_STOPPED &&
|
||||
!test_and_set_tsk_thread_flag(child, TIF_RESTORE_RSE)) {
|
||||
set_notify_resume(child);
|
||||
|
||||
child->state = TASK_TRACED;
|
||||
WRITE_ONCE(child->__state, TASK_TRACED);
|
||||
stopped = 1;
|
||||
}
|
||||
spin_unlock_irq(&child->sighand->siglock);
|
||||
@@ -665,9 +665,9 @@ ptrace_attach_sync_user_rbs (struct task_struct *child)
|
||||
read_lock(&tasklist_lock);
|
||||
if (child->sighand) {
|
||||
spin_lock_irq(&child->sighand->siglock);
|
||||
if (child->state == TASK_TRACED &&
|
||||
if (READ_ONCE(child->__state) == TASK_TRACED &&
|
||||
(child->signal->flags & SIGNAL_STOP_STOPPED)) {
|
||||
child->state = TASK_STOPPED;
|
||||
WRITE_ONCE(child->__state, TASK_STOPPED);
|
||||
}
|
||||
spin_unlock_irq(&child->sighand->siglock);
|
||||
}
|
||||
|
||||
@@ -441,7 +441,6 @@ start_secondary (void *unused)
|
||||
#endif
|
||||
efi_map_pal_code();
|
||||
cpu_init();
|
||||
preempt_disable();
|
||||
smp_callin();
|
||||
|
||||
cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user