Linux 4.20-rc5
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAlwEZdIeHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiGAlQH/19oax2Za3IPqF4X DM3lal5M6zlUVkoYstqzpbR3MqUwgEnMfvoeMDC6mI9N4/+r2LkV7cRR8HzqQCCS jDfD69IzRGb52VSeJmbOrkxBWsR1Nn0t4Z3rEeLPxwaOoNpRc8H973MbAQ2FKMpY S4Y3jIK1dNiRRxdh52NupVkQF+djAUwkBuVk/rrvRJmTDij4la03cuCDAO+Di9lt GHlVvygKw2SJhDR+z3ArwZNmE0ceCcE6+W7zPHzj2KeWuKrZg22kfUD454f2YEIw FG0hu9qecgtpYCkLSm2vr4jQzmpsDoyq3ZfwhjGrP4qtvPC3Db3vL3dbQnkzUcJu JtwhVCE= =O1q1 -----END PGP SIGNATURE----- Merge tag 'v4.20-rc5' into for-4.21/block Pull in v4.20-rc5, solving a conflict we'll otherwise get in aio.c and also getting the merge fix that went into mainline that users are hitting testing for-4.21/block and/or for-next. * tag 'v4.20-rc5': (664 commits) Linux 4.20-rc5 PCI: Fix incorrect value returned from pcie_get_speed_cap() MAINTAINERS: Update linux-mips mailing list address ocfs2: fix potential use after free mm/khugepaged: fix the xas_create_range() error path mm/khugepaged: collapse_shmem() do not crash on Compound mm/khugepaged: collapse_shmem() without freezing new_page mm/khugepaged: minor reorderings in collapse_shmem() mm/khugepaged: collapse_shmem() remember to clear holes mm/khugepaged: fix crashes due to misaccounted holes mm/khugepaged: collapse_shmem() stop if punched or truncated mm/huge_memory: fix lockdep complaint on 32-bit i_size_read() mm/huge_memory: splitting set mapping+index before unfreeze mm/huge_memory: rename freeze_page() to unmap_page() initramfs: clean old path before creating a hardlink kernel/kcov.c: mark funcs in __sanitizer_cov_trace_pc() as notrace psi: make disabling/enabling easier for vendor kernels proc: fixup map_files test on arm debugobjects: avoid recursive calls with kmemleak userfaultfd: shmem: UFFDIO_COPY: set the page dirty if VM_WRITE is not set ...
This commit is contained in:
commit
89d04ec349
4
CREDITS
4
CREDITS
|
@ -2204,6 +2204,10 @@ S: Post Office Box 371
|
||||||
S: North Little Rock, Arkansas 72115
|
S: North Little Rock, Arkansas 72115
|
||||||
S: USA
|
S: USA
|
||||||
|
|
||||||
|
N: Christopher Li
|
||||||
|
E: sparse@chrisli.org
|
||||||
|
D: Sparse maintainer 2009 - 2018
|
||||||
|
|
||||||
N: Stephan Linz
|
N: Stephan Linz
|
||||||
E: linz@mazet.de
|
E: linz@mazet.de
|
||||||
E: Stephan.Linz@gmx.de
|
E: Stephan.Linz@gmx.de
|
||||||
|
|
|
@ -856,7 +856,8 @@
|
||||||
causing system reset or hang due to sending
|
causing system reset or hang due to sending
|
||||||
INIT from AP to BSP.
|
INIT from AP to BSP.
|
||||||
|
|
||||||
disable_counter_freezing [HW]
|
perf_v4_pmi= [X86,INTEL]
|
||||||
|
Format: <bool>
|
||||||
Disable Intel PMU counter freezing feature.
|
Disable Intel PMU counter freezing feature.
|
||||||
The feature only exists starting from
|
The feature only exists starting from
|
||||||
Arch Perfmon v4 (Skylake and newer).
|
Arch Perfmon v4 (Skylake and newer).
|
||||||
|
@ -3504,6 +3505,10 @@
|
||||||
before loading.
|
before loading.
|
||||||
See Documentation/blockdev/ramdisk.txt.
|
See Documentation/blockdev/ramdisk.txt.
|
||||||
|
|
||||||
|
psi= [KNL] Enable or disable pressure stall information
|
||||||
|
tracking.
|
||||||
|
Format: <bool>
|
||||||
|
|
||||||
psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to
|
psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to
|
||||||
probe for; one of (bare|imps|exps|lifebook|any).
|
probe for; one of (bare|imps|exps|lifebook|any).
|
||||||
psmouse.rate= [HW,MOUSE] Set desired mouse report rate, in reports
|
psmouse.rate= [HW,MOUSE] Set desired mouse report rate, in reports
|
||||||
|
@ -4194,9 +4199,13 @@
|
||||||
|
|
||||||
spectre_v2= [X86] Control mitigation of Spectre variant 2
|
spectre_v2= [X86] Control mitigation of Spectre variant 2
|
||||||
(indirect branch speculation) vulnerability.
|
(indirect branch speculation) vulnerability.
|
||||||
|
The default operation protects the kernel from
|
||||||
|
user space attacks.
|
||||||
|
|
||||||
on - unconditionally enable
|
on - unconditionally enable, implies
|
||||||
off - unconditionally disable
|
spectre_v2_user=on
|
||||||
|
off - unconditionally disable, implies
|
||||||
|
spectre_v2_user=off
|
||||||
auto - kernel detects whether your CPU model is
|
auto - kernel detects whether your CPU model is
|
||||||
vulnerable
|
vulnerable
|
||||||
|
|
||||||
|
@ -4206,6 +4215,12 @@
|
||||||
CONFIG_RETPOLINE configuration option, and the
|
CONFIG_RETPOLINE configuration option, and the
|
||||||
compiler with which the kernel was built.
|
compiler with which the kernel was built.
|
||||||
|
|
||||||
|
Selecting 'on' will also enable the mitigation
|
||||||
|
against user space to user space task attacks.
|
||||||
|
|
||||||
|
Selecting 'off' will disable both the kernel and
|
||||||
|
the user space protections.
|
||||||
|
|
||||||
Specific mitigations can also be selected manually:
|
Specific mitigations can also be selected manually:
|
||||||
|
|
||||||
retpoline - replace indirect branches
|
retpoline - replace indirect branches
|
||||||
|
@ -4215,6 +4230,48 @@
|
||||||
Not specifying this option is equivalent to
|
Not specifying this option is equivalent to
|
||||||
spectre_v2=auto.
|
spectre_v2=auto.
|
||||||
|
|
||||||
|
spectre_v2_user=
|
||||||
|
[X86] Control mitigation of Spectre variant 2
|
||||||
|
(indirect branch speculation) vulnerability between
|
||||||
|
user space tasks
|
||||||
|
|
||||||
|
on - Unconditionally enable mitigations. Is
|
||||||
|
enforced by spectre_v2=on
|
||||||
|
|
||||||
|
off - Unconditionally disable mitigations. Is
|
||||||
|
enforced by spectre_v2=off
|
||||||
|
|
||||||
|
prctl - Indirect branch speculation is enabled,
|
||||||
|
but mitigation can be enabled via prctl
|
||||||
|
per thread. The mitigation control state
|
||||||
|
is inherited on fork.
|
||||||
|
|
||||||
|
prctl,ibpb
|
||||||
|
- Like "prctl" above, but only STIBP is
|
||||||
|
controlled per thread. IBPB is issued
|
||||||
|
always when switching between different user
|
||||||
|
space processes.
|
||||||
|
|
||||||
|
seccomp
|
||||||
|
- Same as "prctl" above, but all seccomp
|
||||||
|
threads will enable the mitigation unless
|
||||||
|
they explicitly opt out.
|
||||||
|
|
||||||
|
seccomp,ibpb
|
||||||
|
- Like "seccomp" above, but only STIBP is
|
||||||
|
controlled per thread. IBPB is issued
|
||||||
|
always when switching between different
|
||||||
|
user space processes.
|
||||||
|
|
||||||
|
auto - Kernel selects the mitigation depending on
|
||||||
|
the available CPU features and vulnerability.
|
||||||
|
|
||||||
|
Default mitigation:
|
||||||
|
If CONFIG_SECCOMP=y then "seccomp", otherwise "prctl"
|
||||||
|
|
||||||
|
Not specifying this option is equivalent to
|
||||||
|
spectre_v2_user=auto.
|
||||||
|
|
||||||
spec_store_bypass_disable=
|
spec_store_bypass_disable=
|
||||||
[HW] Control Speculative Store Bypass (SSB) Disable mitigation
|
[HW] Control Speculative Store Bypass (SSB) Disable mitigation
|
||||||
(Speculative Store Bypass vulnerability)
|
(Speculative Store Bypass vulnerability)
|
||||||
|
@ -4713,6 +4770,8 @@
|
||||||
prevent spurious wakeup);
|
prevent spurious wakeup);
|
||||||
n = USB_QUIRK_DELAY_CTRL_MSG (Device needs a
|
n = USB_QUIRK_DELAY_CTRL_MSG (Device needs a
|
||||||
pause after every control message);
|
pause after every control message);
|
||||||
|
o = USB_QUIRK_HUB_SLOW_RESET (Hub needs extra
|
||||||
|
delay after resetting its port);
|
||||||
Example: quirks=0781:5580:bk,0a5c:5834:gij
|
Example: quirks=0781:5580:bk,0a5c:5834:gij
|
||||||
|
|
||||||
usbhid.mousepoll=
|
usbhid.mousepoll=
|
||||||
|
|
|
@ -32,16 +32,17 @@ Disclosure and embargoed information
|
||||||
The security list is not a disclosure channel. For that, see Coordination
|
The security list is not a disclosure channel. For that, see Coordination
|
||||||
below.
|
below.
|
||||||
|
|
||||||
Once a robust fix has been developed, our preference is to release the
|
Once a robust fix has been developed, the release process starts. Fixes
|
||||||
fix in a timely fashion, treating it no differently than any of the other
|
for publicly known bugs are released immediately.
|
||||||
thousands of changes and fixes the Linux kernel project releases every
|
|
||||||
month.
|
|
||||||
|
|
||||||
However, at the request of the reporter, we will postpone releasing the
|
Although our preference is to release fixes for publicly undisclosed bugs
|
||||||
fix for up to 5 business days after the date of the report or after the
|
as soon as they become available, this may be postponed at the request of
|
||||||
embargo has lifted; whichever comes first. The only exception to that
|
the reporter or an affected party for up to 7 calendar days from the start
|
||||||
rule is if the bug is publicly known, in which case the preference is to
|
of the release process, with an exceptional extension to 14 calendar days
|
||||||
release the fix as soon as it's available.
|
if it is agreed that the criticality of the bug requires more time. The
|
||||||
|
only valid reason for deferring the publication of a fix is to accommodate
|
||||||
|
the logistics of QA and large scale rollouts which require release
|
||||||
|
coordination.
|
||||||
|
|
||||||
Whilst embargoed information may be shared with trusted individuals in
|
Whilst embargoed information may be shared with trusted individuals in
|
||||||
order to develop a fix, such information will not be published alongside
|
order to develop a fix, such information will not be published alongside
|
||||||
|
|
|
@ -57,6 +57,7 @@ stable kernels.
|
||||||
| ARM | Cortex-A73 | #858921 | ARM64_ERRATUM_858921 |
|
| ARM | Cortex-A73 | #858921 | ARM64_ERRATUM_858921 |
|
||||||
| ARM | Cortex-A55 | #1024718 | ARM64_ERRATUM_1024718 |
|
| ARM | Cortex-A55 | #1024718 | ARM64_ERRATUM_1024718 |
|
||||||
| ARM | Cortex-A76 | #1188873 | ARM64_ERRATUM_1188873 |
|
| ARM | Cortex-A76 | #1188873 | ARM64_ERRATUM_1188873 |
|
||||||
|
| ARM | Cortex-A76 | #1286807 | ARM64_ERRATUM_1286807 |
|
||||||
| ARM | MMU-500 | #841119,#826419 | N/A |
|
| ARM | MMU-500 | #841119,#826419 | N/A |
|
||||||
| | | | |
|
| | | | |
|
||||||
| Cavium | ThunderX ITS | #22375, #24313 | CAVIUM_ERRATUM_22375 |
|
| Cavium | ThunderX ITS | #22375, #24313 | CAVIUM_ERRATUM_22375 |
|
||||||
|
|
|
@ -74,7 +74,8 @@ using :c:func:`xa_load`. xa_store will overwrite any entry with the
|
||||||
new entry and return the previous entry stored at that index. You can
|
new entry and return the previous entry stored at that index. You can
|
||||||
use :c:func:`xa_erase` instead of calling :c:func:`xa_store` with a
|
use :c:func:`xa_erase` instead of calling :c:func:`xa_store` with a
|
||||||
``NULL`` entry. There is no difference between an entry that has never
|
``NULL`` entry. There is no difference between an entry that has never
|
||||||
been stored to and one that has most recently had ``NULL`` stored to it.
|
been stored to, one that has been erased and one that has most recently
|
||||||
|
had ``NULL`` stored to it.
|
||||||
|
|
||||||
You can conditionally replace an entry at an index by using
|
You can conditionally replace an entry at an index by using
|
||||||
:c:func:`xa_cmpxchg`. Like :c:func:`cmpxchg`, it will only succeed if
|
:c:func:`xa_cmpxchg`. Like :c:func:`cmpxchg`, it will only succeed if
|
||||||
|
@ -105,23 +106,44 @@ may result in the entry being marked at some, but not all of the other
|
||||||
indices. Storing into one index may result in the entry retrieved by
|
indices. Storing into one index may result in the entry retrieved by
|
||||||
some, but not all of the other indices changing.
|
some, but not all of the other indices changing.
|
||||||
|
|
||||||
|
Sometimes you need to ensure that a subsequent call to :c:func:`xa_store`
|
||||||
|
will not need to allocate memory. The :c:func:`xa_reserve` function
|
||||||
|
will store a reserved entry at the indicated index. Users of the normal
|
||||||
|
API will see this entry as containing ``NULL``. If you do not need to
|
||||||
|
use the reserved entry, you can call :c:func:`xa_release` to remove the
|
||||||
|
unused entry. If another user has stored to the entry in the meantime,
|
||||||
|
:c:func:`xa_release` will do nothing; if instead you want the entry to
|
||||||
|
become ``NULL``, you should use :c:func:`xa_erase`.
|
||||||
|
|
||||||
|
If all entries in the array are ``NULL``, the :c:func:`xa_empty` function
|
||||||
|
will return ``true``.
|
||||||
|
|
||||||
Finally, you can remove all entries from an XArray by calling
|
Finally, you can remove all entries from an XArray by calling
|
||||||
:c:func:`xa_destroy`. If the XArray entries are pointers, you may wish
|
:c:func:`xa_destroy`. If the XArray entries are pointers, you may wish
|
||||||
to free the entries first. You can do this by iterating over all present
|
to free the entries first. You can do this by iterating over all present
|
||||||
entries in the XArray using the :c:func:`xa_for_each` iterator.
|
entries in the XArray using the :c:func:`xa_for_each` iterator.
|
||||||
|
|
||||||
ID assignment
|
Allocating XArrays
|
||||||
-------------
|
------------------
|
||||||
|
|
||||||
|
If you use :c:func:`DEFINE_XARRAY_ALLOC` to define the XArray, or
|
||||||
|
initialise it by passing ``XA_FLAGS_ALLOC`` to :c:func:`xa_init_flags`,
|
||||||
|
the XArray changes to track whether entries are in use or not.
|
||||||
|
|
||||||
You can call :c:func:`xa_alloc` to store the entry at any unused index
|
You can call :c:func:`xa_alloc` to store the entry at any unused index
|
||||||
in the XArray. If you need to modify the array from interrupt context,
|
in the XArray. If you need to modify the array from interrupt context,
|
||||||
you can use :c:func:`xa_alloc_bh` or :c:func:`xa_alloc_irq` to disable
|
you can use :c:func:`xa_alloc_bh` or :c:func:`xa_alloc_irq` to disable
|
||||||
interrupts while allocating the ID. Unlike :c:func:`xa_store`, allocating
|
interrupts while allocating the ID.
|
||||||
a ``NULL`` pointer does not delete an entry. Instead it reserves an
|
|
||||||
entry like :c:func:`xa_reserve` and you can release it using either
|
Using :c:func:`xa_store`, :c:func:`xa_cmpxchg` or :c:func:`xa_insert`
|
||||||
:c:func:`xa_erase` or :c:func:`xa_release`. To use ID assignment, the
|
will mark the entry as being allocated. Unlike a normal XArray, storing
|
||||||
XArray must be defined with :c:func:`DEFINE_XARRAY_ALLOC`, or initialised
|
``NULL`` will mark the entry as being in use, like :c:func:`xa_reserve`.
|
||||||
by passing ``XA_FLAGS_ALLOC`` to :c:func:`xa_init_flags`,
|
To free an entry, use :c:func:`xa_erase` (or :c:func:`xa_release` if
|
||||||
|
you only want to free the entry if it's ``NULL``).
|
||||||
|
|
||||||
|
You cannot use ``XA_MARK_0`` with an allocating XArray as this mark
|
||||||
|
is used to track whether an entry is free or not. The other marks are
|
||||||
|
available for your use.
|
||||||
|
|
||||||
Memory allocation
|
Memory allocation
|
||||||
-----------------
|
-----------------
|
||||||
|
@ -158,6 +180,8 @@ Takes RCU read lock:
|
||||||
|
|
||||||
Takes xa_lock internally:
|
Takes xa_lock internally:
|
||||||
* :c:func:`xa_store`
|
* :c:func:`xa_store`
|
||||||
|
* :c:func:`xa_store_bh`
|
||||||
|
* :c:func:`xa_store_irq`
|
||||||
* :c:func:`xa_insert`
|
* :c:func:`xa_insert`
|
||||||
* :c:func:`xa_erase`
|
* :c:func:`xa_erase`
|
||||||
* :c:func:`xa_erase_bh`
|
* :c:func:`xa_erase_bh`
|
||||||
|
@ -167,6 +191,9 @@ Takes xa_lock internally:
|
||||||
* :c:func:`xa_alloc`
|
* :c:func:`xa_alloc`
|
||||||
* :c:func:`xa_alloc_bh`
|
* :c:func:`xa_alloc_bh`
|
||||||
* :c:func:`xa_alloc_irq`
|
* :c:func:`xa_alloc_irq`
|
||||||
|
* :c:func:`xa_reserve`
|
||||||
|
* :c:func:`xa_reserve_bh`
|
||||||
|
* :c:func:`xa_reserve_irq`
|
||||||
* :c:func:`xa_destroy`
|
* :c:func:`xa_destroy`
|
||||||
* :c:func:`xa_set_mark`
|
* :c:func:`xa_set_mark`
|
||||||
* :c:func:`xa_clear_mark`
|
* :c:func:`xa_clear_mark`
|
||||||
|
@ -177,6 +204,7 @@ Assumes xa_lock held on entry:
|
||||||
* :c:func:`__xa_erase`
|
* :c:func:`__xa_erase`
|
||||||
* :c:func:`__xa_cmpxchg`
|
* :c:func:`__xa_cmpxchg`
|
||||||
* :c:func:`__xa_alloc`
|
* :c:func:`__xa_alloc`
|
||||||
|
* :c:func:`__xa_reserve`
|
||||||
* :c:func:`__xa_set_mark`
|
* :c:func:`__xa_set_mark`
|
||||||
* :c:func:`__xa_clear_mark`
|
* :c:func:`__xa_clear_mark`
|
||||||
|
|
||||||
|
@ -234,7 +262,8 @@ Sharing the XArray with interrupt context is also possible, either
|
||||||
using :c:func:`xa_lock_irqsave` in both the interrupt handler and process
|
using :c:func:`xa_lock_irqsave` in both the interrupt handler and process
|
||||||
context, or :c:func:`xa_lock_irq` in process context and :c:func:`xa_lock`
|
context, or :c:func:`xa_lock_irq` in process context and :c:func:`xa_lock`
|
||||||
in the interrupt handler. Some of the more common patterns have helper
|
in the interrupt handler. Some of the more common patterns have helper
|
||||||
functions such as :c:func:`xa_erase_bh` and :c:func:`xa_erase_irq`.
|
functions such as :c:func:`xa_store_bh`, :c:func:`xa_store_irq`,
|
||||||
|
:c:func:`xa_erase_bh` and :c:func:`xa_erase_irq`.
|
||||||
|
|
||||||
Sometimes you need to protect access to the XArray with a mutex because
|
Sometimes you need to protect access to the XArray with a mutex because
|
||||||
that lock sits above another mutex in the locking hierarchy. That does
|
that lock sits above another mutex in the locking hierarchy. That does
|
||||||
|
@ -322,7 +351,8 @@ to :c:func:`xas_retry`, and retry the operation if it returns ``true``.
|
||||||
- :c:func:`xa_is_zero`
|
- :c:func:`xa_is_zero`
|
||||||
- Zero entries appear as ``NULL`` through the Normal API, but occupy
|
- Zero entries appear as ``NULL`` through the Normal API, but occupy
|
||||||
an entry in the XArray which can be used to reserve the index for
|
an entry in the XArray which can be used to reserve the index for
|
||||||
future use.
|
future use. This is used by allocating XArrays for allocated entries
|
||||||
|
which are ``NULL``.
|
||||||
|
|
||||||
Other internal entries may be added in the future. As far as possible, they
|
Other internal entries may be added in the future. As far as possible, they
|
||||||
will be handled by :c:func:`xas_retry`.
|
will be handled by :c:func:`xas_retry`.
|
||||||
|
|
|
@ -17,7 +17,7 @@ Example:
|
||||||
reg = <1>;
|
reg = <1>;
|
||||||
clocks = <&clk32m>;
|
clocks = <&clk32m>;
|
||||||
interrupt-parent = <&gpio4>;
|
interrupt-parent = <&gpio4>;
|
||||||
interrupts = <13 IRQ_TYPE_EDGE_RISING>;
|
interrupts = <13 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
vdd-supply = <®5v0>;
|
vdd-supply = <®5v0>;
|
||||||
xceiver-supply = <®5v0>;
|
xceiver-supply = <®5v0>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,6 +5,7 @@ Required properties:
|
||||||
- compatible: "renesas,can-r8a7743" if CAN controller is a part of R8A7743 SoC.
|
- compatible: "renesas,can-r8a7743" if CAN controller is a part of R8A7743 SoC.
|
||||||
"renesas,can-r8a7744" if CAN controller is a part of R8A7744 SoC.
|
"renesas,can-r8a7744" if CAN controller is a part of R8A7744 SoC.
|
||||||
"renesas,can-r8a7745" if CAN controller is a part of R8A7745 SoC.
|
"renesas,can-r8a7745" if CAN controller is a part of R8A7745 SoC.
|
||||||
|
"renesas,can-r8a774a1" if CAN controller is a part of R8A774A1 SoC.
|
||||||
"renesas,can-r8a7778" if CAN controller is a part of R8A7778 SoC.
|
"renesas,can-r8a7778" if CAN controller is a part of R8A7778 SoC.
|
||||||
"renesas,can-r8a7779" if CAN controller is a part of R8A7779 SoC.
|
"renesas,can-r8a7779" if CAN controller is a part of R8A7779 SoC.
|
||||||
"renesas,can-r8a7790" if CAN controller is a part of R8A7790 SoC.
|
"renesas,can-r8a7790" if CAN controller is a part of R8A7790 SoC.
|
||||||
|
@ -14,26 +15,32 @@ Required properties:
|
||||||
"renesas,can-r8a7794" if CAN controller is a part of R8A7794 SoC.
|
"renesas,can-r8a7794" if CAN controller is a part of R8A7794 SoC.
|
||||||
"renesas,can-r8a7795" if CAN controller is a part of R8A7795 SoC.
|
"renesas,can-r8a7795" if CAN controller is a part of R8A7795 SoC.
|
||||||
"renesas,can-r8a7796" if CAN controller is a part of R8A7796 SoC.
|
"renesas,can-r8a7796" if CAN controller is a part of R8A7796 SoC.
|
||||||
|
"renesas,can-r8a77965" if CAN controller is a part of R8A77965 SoC.
|
||||||
"renesas,rcar-gen1-can" for a generic R-Car Gen1 compatible device.
|
"renesas,rcar-gen1-can" for a generic R-Car Gen1 compatible device.
|
||||||
"renesas,rcar-gen2-can" for a generic R-Car Gen2 or RZ/G1
|
"renesas,rcar-gen2-can" for a generic R-Car Gen2 or RZ/G1
|
||||||
compatible device.
|
compatible device.
|
||||||
"renesas,rcar-gen3-can" for a generic R-Car Gen3 compatible device.
|
"renesas,rcar-gen3-can" for a generic R-Car Gen3 or RZ/G2
|
||||||
|
compatible device.
|
||||||
When compatible with the generic version, nodes must list the
|
When compatible with the generic version, nodes must list the
|
||||||
SoC-specific version corresponding to the platform first
|
SoC-specific version corresponding to the platform first
|
||||||
followed by the generic version.
|
followed by the generic version.
|
||||||
|
|
||||||
- reg: physical base address and size of the R-Car CAN register map.
|
- reg: physical base address and size of the R-Car CAN register map.
|
||||||
- interrupts: interrupt specifier for the sole interrupt.
|
- interrupts: interrupt specifier for the sole interrupt.
|
||||||
- clocks: phandles and clock specifiers for 3 CAN clock inputs.
|
- clocks: phandles and clock specifiers for 2 CAN clock inputs for RZ/G2
|
||||||
- clock-names: 3 clock input name strings: "clkp1", "clkp2", "can_clk".
|
devices.
|
||||||
|
phandles and clock specifiers for 3 CAN clock inputs for every other
|
||||||
|
SoC.
|
||||||
|
- clock-names: 2 clock input name strings for RZ/G2: "clkp1", "can_clk".
|
||||||
|
3 clock input name strings for every other SoC: "clkp1", "clkp2",
|
||||||
|
"can_clk".
|
||||||
- pinctrl-0: pin control group to be used for this controller.
|
- pinctrl-0: pin control group to be used for this controller.
|
||||||
- pinctrl-names: must be "default".
|
- pinctrl-names: must be "default".
|
||||||
|
|
||||||
Required properties for "renesas,can-r8a7795" and "renesas,can-r8a7796"
|
Required properties for R8A7795, R8A7796 and R8A77965:
|
||||||
compatible:
|
For the denoted SoCs, "clkp2" can be CANFD clock. This is a div6 clock and can
|
||||||
In R8A7795 and R8A7796 SoCs, "clkp2" can be CANFD clock. This is a div6 clock
|
be used by both CAN and CAN FD controller at the same time. It needs to be
|
||||||
and can be used by both CAN and CAN FD controller at the same time. It needs to
|
scaled to maximum frequency if any of these controllers use it. This is done
|
||||||
be scaled to maximum frequency if any of these controllers use it. This is done
|
|
||||||
using the below properties:
|
using the below properties:
|
||||||
|
|
||||||
- assigned-clocks: phandle of clkp2(CANFD) clock.
|
- assigned-clocks: phandle of clkp2(CANFD) clock.
|
||||||
|
@ -42,8 +49,9 @@ using the below properties:
|
||||||
Optional properties:
|
Optional properties:
|
||||||
- renesas,can-clock-select: R-Car CAN Clock Source Select. Valid values are:
|
- renesas,can-clock-select: R-Car CAN Clock Source Select. Valid values are:
|
||||||
<0x0> (default) : Peripheral clock (clkp1)
|
<0x0> (default) : Peripheral clock (clkp1)
|
||||||
<0x1> : Peripheral clock (clkp2)
|
<0x1> : Peripheral clock (clkp2) (not supported by
|
||||||
<0x3> : Externally input clock
|
RZ/G2 devices)
|
||||||
|
<0x3> : External input clock
|
||||||
|
|
||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
|
|
|
@ -7,7 +7,7 @@ limitations.
|
||||||
Current Binding
|
Current Binding
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
Switches are true Linux devices and can be probes by any means. Once
|
Switches are true Linux devices and can be probed by any means. Once
|
||||||
probed, they register to the DSA framework, passing a node
|
probed, they register to the DSA framework, passing a node
|
||||||
pointer. This node is expected to fulfil the following binding, and
|
pointer. This node is expected to fulfil the following binding, and
|
||||||
may contain additional properties as required by the device it is
|
may contain additional properties as required by the device it is
|
||||||
|
|
|
@ -40,24 +40,36 @@ Required properties:
|
||||||
"ref" for 19.2 MHz ref clk,
|
"ref" for 19.2 MHz ref clk,
|
||||||
"com_aux" for phy common block aux clock,
|
"com_aux" for phy common block aux clock,
|
||||||
"ref_aux" for phy reference aux clock,
|
"ref_aux" for phy reference aux clock,
|
||||||
|
|
||||||
|
For "qcom,ipq8074-qmp-pcie-phy": no clocks are listed.
|
||||||
For "qcom,msm8996-qmp-pcie-phy" must contain:
|
For "qcom,msm8996-qmp-pcie-phy" must contain:
|
||||||
"aux", "cfg_ahb", "ref".
|
"aux", "cfg_ahb", "ref".
|
||||||
For "qcom,msm8996-qmp-usb3-phy" must contain:
|
For "qcom,msm8996-qmp-usb3-phy" must contain:
|
||||||
"aux", "cfg_ahb", "ref".
|
"aux", "cfg_ahb", "ref".
|
||||||
For "qcom,qmp-v3-usb3-phy" must contain:
|
For "qcom,sdm845-qmp-usb3-phy" must contain:
|
||||||
"aux", "cfg_ahb", "ref", "com_aux".
|
"aux", "cfg_ahb", "ref", "com_aux".
|
||||||
|
For "qcom,sdm845-qmp-usb3-uni-phy" must contain:
|
||||||
|
"aux", "cfg_ahb", "ref", "com_aux".
|
||||||
|
For "qcom,sdm845-qmp-ufs-phy" must contain:
|
||||||
|
"ref", "ref_aux".
|
||||||
|
|
||||||
- resets: a list of phandles and reset controller specifier pairs,
|
- resets: a list of phandles and reset controller specifier pairs,
|
||||||
one for each entry in reset-names.
|
one for each entry in reset-names.
|
||||||
- reset-names: "phy" for reset of phy block,
|
- reset-names: "phy" for reset of phy block,
|
||||||
"common" for phy common block reset,
|
"common" for phy common block reset,
|
||||||
"cfg" for phy's ahb cfg block reset (Optional).
|
"cfg" for phy's ahb cfg block reset.
|
||||||
|
|
||||||
|
For "qcom,ipq8074-qmp-pcie-phy" must contain:
|
||||||
|
"phy", "common".
|
||||||
For "qcom,msm8996-qmp-pcie-phy" must contain:
|
For "qcom,msm8996-qmp-pcie-phy" must contain:
|
||||||
"phy", "common", "cfg".
|
"phy", "common", "cfg".
|
||||||
For "qcom,msm8996-qmp-usb3-phy" must contain
|
For "qcom,msm8996-qmp-usb3-phy" must contain
|
||||||
"phy", "common".
|
"phy", "common".
|
||||||
For "qcom,ipq8074-qmp-pcie-phy" must contain:
|
For "qcom,sdm845-qmp-usb3-phy" must contain:
|
||||||
"phy", "common".
|
"phy", "common".
|
||||||
|
For "qcom,sdm845-qmp-usb3-uni-phy" must contain:
|
||||||
|
"phy", "common".
|
||||||
|
For "qcom,sdm845-qmp-ufs-phy": no resets are listed.
|
||||||
|
|
||||||
- vdda-phy-supply: Phandle to a regulator supply to PHY core block.
|
- vdda-phy-supply: Phandle to a regulator supply to PHY core block.
|
||||||
- vdda-pll-supply: Phandle to 1.8V regulator supply to PHY refclk pll block.
|
- vdda-pll-supply: Phandle to 1.8V regulator supply to PHY refclk pll block.
|
||||||
|
@ -79,9 +91,10 @@ Required properties for child node:
|
||||||
|
|
||||||
- #phy-cells: must be 0
|
- #phy-cells: must be 0
|
||||||
|
|
||||||
|
Required properties child node of pcie and usb3 qmp phys:
|
||||||
- clocks: a list of phandles and clock-specifier pairs,
|
- clocks: a list of phandles and clock-specifier pairs,
|
||||||
one for each entry in clock-names.
|
one for each entry in clock-names.
|
||||||
- clock-names: Must contain following for pcie and usb qmp phys:
|
- clock-names: Must contain following:
|
||||||
"pipe<lane-number>" for pipe clock specific to each lane.
|
"pipe<lane-number>" for pipe clock specific to each lane.
|
||||||
- clock-output-names: Name of the PHY clock that will be the parent for
|
- clock-output-names: Name of the PHY clock that will be the parent for
|
||||||
the above pipe clock.
|
the above pipe clock.
|
||||||
|
@ -91,9 +104,11 @@ Required properties for child node:
|
||||||
(or)
|
(or)
|
||||||
"pcie20_phy1_pipe_clk"
|
"pcie20_phy1_pipe_clk"
|
||||||
|
|
||||||
|
Required properties for child node of PHYs with lane reset, AKA:
|
||||||
|
"qcom,msm8996-qmp-pcie-phy"
|
||||||
- resets: a list of phandles and reset controller specifier pairs,
|
- resets: a list of phandles and reset controller specifier pairs,
|
||||||
one for each entry in reset-names.
|
one for each entry in reset-names.
|
||||||
- reset-names: Must contain following for pcie qmp phys:
|
- reset-names: Must contain following:
|
||||||
"lane<lane-number>" for reset specific to each lane.
|
"lane<lane-number>" for reset specific to each lane.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
|
@ -5,18 +5,20 @@ UniPhier SoCs have SCSSI which supports SPI single channel.
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: should be "socionext,uniphier-scssi"
|
- compatible: should be "socionext,uniphier-scssi"
|
||||||
- reg: address and length of the spi master registers
|
- reg: address and length of the spi master registers
|
||||||
- #address-cells: must be <1>, see spi-bus.txt
|
- interrupts: a single interrupt specifier
|
||||||
- #size-cells: must be <0>, see spi-bus.txt
|
- pinctrl-names: should be "default"
|
||||||
- clocks: A phandle to the clock for the device.
|
- pinctrl-0: pin control state for the default mode
|
||||||
- resets: A phandle to the reset control for the device.
|
- clocks: a phandle to the clock for the device
|
||||||
|
- resets: a phandle to the reset control for the device
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
spi0: spi@54006000 {
|
spi0: spi@54006000 {
|
||||||
compatible = "socionext,uniphier-scssi";
|
compatible = "socionext,uniphier-scssi";
|
||||||
reg = <0x54006000 0x100>;
|
reg = <0x54006000 0x100>;
|
||||||
#address-cells = <1>;
|
interrupts = <0 39 4>;
|
||||||
#size-cells = <0>;
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinctrl_spi0>;
|
||||||
clocks = <&peri_clk 11>;
|
clocks = <&peri_clk 11>;
|
||||||
resets = <&peri_rst 11>;
|
resets = <&peri_rst 11>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -190,16 +190,7 @@ A few EV_REL codes have special meanings:
|
||||||
* REL_WHEEL, REL_HWHEEL:
|
* REL_WHEEL, REL_HWHEEL:
|
||||||
|
|
||||||
- These codes are used for vertical and horizontal scroll wheels,
|
- These codes are used for vertical and horizontal scroll wheels,
|
||||||
respectively. The value is the number of "notches" moved on the wheel, the
|
respectively.
|
||||||
physical size of which varies by device. For high-resolution wheels (which
|
|
||||||
report multiple events for each notch of movement, or do not have notches)
|
|
||||||
this may be an approximation based on the high-resolution scroll events.
|
|
||||||
|
|
||||||
* REL_WHEEL_HI_RES:
|
|
||||||
|
|
||||||
- If a vertical scroll wheel supports high-resolution scrolling, this code
|
|
||||||
will be emitted in addition to REL_WHEEL. The value is the (approximate)
|
|
||||||
distance travelled by the user's finger, in microns.
|
|
||||||
|
|
||||||
EV_ABS
|
EV_ABS
|
||||||
------
|
------
|
||||||
|
|
|
@ -40,7 +40,7 @@ To use the :ref:`format` ioctls applications set the ``type`` field of the
|
||||||
the desired operation. Both drivers and applications must set the remainder of
|
the desired operation. Both drivers and applications must set the remainder of
|
||||||
the :c:type:`v4l2_format` structure to 0.
|
the :c:type:`v4l2_format` structure to 0.
|
||||||
|
|
||||||
.. _v4l2-meta-format:
|
.. c:type:: v4l2_meta_format
|
||||||
|
|
||||||
.. tabularcolumns:: |p{1.4cm}|p{2.2cm}|p{13.9cm}|
|
.. tabularcolumns:: |p{1.4cm}|p{2.2cm}|p{13.9cm}|
|
||||||
|
|
||||||
|
|
|
@ -132,6 +132,11 @@ The format as returned by :ref:`VIDIOC_TRY_FMT <VIDIOC_G_FMT>` must be identical
|
||||||
- ``sdr``
|
- ``sdr``
|
||||||
- Definition of a data format, see :ref:`pixfmt`, used by SDR
|
- Definition of a data format, see :ref:`pixfmt`, used by SDR
|
||||||
capture and output devices.
|
capture and output devices.
|
||||||
|
* -
|
||||||
|
- struct :c:type:`v4l2_meta_format`
|
||||||
|
- ``meta``
|
||||||
|
- Definition of a metadata format, see :ref:`meta-formats`, used by
|
||||||
|
metadata capture devices.
|
||||||
* -
|
* -
|
||||||
- __u8
|
- __u8
|
||||||
- ``raw_data``\ [200]
|
- ``raw_data``\ [200]
|
||||||
|
|
|
@ -1056,18 +1056,23 @@ The kernel interface functions are as follows:
|
||||||
|
|
||||||
u32 rxrpc_kernel_check_life(struct socket *sock,
|
u32 rxrpc_kernel_check_life(struct socket *sock,
|
||||||
struct rxrpc_call *call);
|
struct rxrpc_call *call);
|
||||||
|
void rxrpc_kernel_probe_life(struct socket *sock,
|
||||||
|
struct rxrpc_call *call);
|
||||||
|
|
||||||
This returns a number that is updated when ACKs are received from the peer
|
The first function returns a number that is updated when ACKs are received
|
||||||
(notably including PING RESPONSE ACKs which we can elicit by sending PING
|
from the peer (notably including PING RESPONSE ACKs which we can elicit by
|
||||||
ACKs to see if the call still exists on the server). The caller should
|
sending PING ACKs to see if the call still exists on the server). The
|
||||||
compare the numbers of two calls to see if the call is still alive after
|
caller should compare the numbers of two calls to see if the call is still
|
||||||
waiting for a suitable interval.
|
alive after waiting for a suitable interval.
|
||||||
|
|
||||||
This allows the caller to work out if the server is still contactable and
|
This allows the caller to work out if the server is still contactable and
|
||||||
if the call is still alive on the server whilst waiting for the server to
|
if the call is still alive on the server whilst waiting for the server to
|
||||||
process a client operation.
|
process a client operation.
|
||||||
|
|
||||||
This function may transmit a PING ACK.
|
The second function causes a ping ACK to be transmitted to try to provoke
|
||||||
|
the peer into responding, which would then cause the value returned by the
|
||||||
|
first function to change. Note that this must be called in TASK_RUNNING
|
||||||
|
state.
|
||||||
|
|
||||||
(*) Get reply timestamp.
|
(*) Get reply timestamp.
|
||||||
|
|
||||||
|
|
|
@ -92,3 +92,12 @@ Speculation misfeature controls
|
||||||
* prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_ENABLE, 0, 0);
|
* prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_ENABLE, 0, 0);
|
||||||
* prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_DISABLE, 0, 0);
|
* prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_DISABLE, 0, 0);
|
||||||
* prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_FORCE_DISABLE, 0, 0);
|
* prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_FORCE_DISABLE, 0, 0);
|
||||||
|
|
||||||
|
- PR_SPEC_INDIR_BRANCH: Indirect Branch Speculation in User Processes
|
||||||
|
(Mitigate Spectre V2 style attacks against user processes)
|
||||||
|
|
||||||
|
Invocations:
|
||||||
|
* prctl(PR_GET_SPECULATION_CTRL, PR_SPEC_INDIRECT_BRANCH, 0, 0, 0);
|
||||||
|
* prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_INDIRECT_BRANCH, PR_SPEC_ENABLE, 0, 0);
|
||||||
|
* prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_INDIRECT_BRANCH, PR_SPEC_DISABLE, 0, 0);
|
||||||
|
* prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_INDIRECT_BRANCH, PR_SPEC_FORCE_DISABLE, 0, 0);
|
||||||
|
|
|
@ -61,18 +61,6 @@ Protocol 2.12: (Kernel 3.8) Added the xloadflags field and extension fields
|
||||||
to struct boot_params for loading bzImage and ramdisk
|
to struct boot_params for loading bzImage and ramdisk
|
||||||
above 4G in 64bit.
|
above 4G in 64bit.
|
||||||
|
|
||||||
Protocol 2.13: (Kernel 3.14) Support 32- and 64-bit flags being set in
|
|
||||||
xloadflags to support booting a 64-bit kernel from 32-bit
|
|
||||||
EFI
|
|
||||||
|
|
||||||
Protocol 2.14: (Kernel 4.20) Added acpi_rsdp_addr holding the physical
|
|
||||||
address of the ACPI RSDP table.
|
|
||||||
The bootloader updates version with:
|
|
||||||
0x8000 | min(kernel-version, bootloader-version)
|
|
||||||
kernel-version being the protocol version supported by
|
|
||||||
the kernel and bootloader-version the protocol version
|
|
||||||
supported by the bootloader.
|
|
||||||
|
|
||||||
**** MEMORY LAYOUT
|
**** MEMORY LAYOUT
|
||||||
|
|
||||||
The traditional memory map for the kernel loader, used for Image or
|
The traditional memory map for the kernel loader, used for Image or
|
||||||
|
@ -209,7 +197,6 @@ Offset Proto Name Meaning
|
||||||
0258/8 2.10+ pref_address Preferred loading address
|
0258/8 2.10+ pref_address Preferred loading address
|
||||||
0260/4 2.10+ init_size Linear memory required during initialization
|
0260/4 2.10+ init_size Linear memory required during initialization
|
||||||
0264/4 2.11+ handover_offset Offset of handover entry point
|
0264/4 2.11+ handover_offset Offset of handover entry point
|
||||||
0268/8 2.14+ acpi_rsdp_addr Physical address of RSDP table
|
|
||||||
|
|
||||||
(1) For backwards compatibility, if the setup_sects field contains 0, the
|
(1) For backwards compatibility, if the setup_sects field contains 0, the
|
||||||
real value is 4.
|
real value is 4.
|
||||||
|
@ -322,7 +309,7 @@ Protocol: 2.00+
|
||||||
Contains the magic number "HdrS" (0x53726448).
|
Contains the magic number "HdrS" (0x53726448).
|
||||||
|
|
||||||
Field name: version
|
Field name: version
|
||||||
Type: modify
|
Type: read
|
||||||
Offset/size: 0x206/2
|
Offset/size: 0x206/2
|
||||||
Protocol: 2.00+
|
Protocol: 2.00+
|
||||||
|
|
||||||
|
@ -330,12 +317,6 @@ Protocol: 2.00+
|
||||||
e.g. 0x0204 for version 2.04, and 0x0a11 for a hypothetical version
|
e.g. 0x0204 for version 2.04, and 0x0a11 for a hypothetical version
|
||||||
10.17.
|
10.17.
|
||||||
|
|
||||||
Up to protocol version 2.13 this information is only read by the
|
|
||||||
bootloader. From protocol version 2.14 onwards the bootloader will
|
|
||||||
write the used protocol version or-ed with 0x8000 to the field. The
|
|
||||||
used protocol version will be the minimum of the supported protocol
|
|
||||||
versions of the bootloader and the kernel.
|
|
||||||
|
|
||||||
Field name: realmode_swtch
|
Field name: realmode_swtch
|
||||||
Type: modify (optional)
|
Type: modify (optional)
|
||||||
Offset/size: 0x208/4
|
Offset/size: 0x208/4
|
||||||
|
@ -763,17 +744,6 @@ Offset/size: 0x264/4
|
||||||
|
|
||||||
See EFI HANDOVER PROTOCOL below for more details.
|
See EFI HANDOVER PROTOCOL below for more details.
|
||||||
|
|
||||||
Field name: acpi_rsdp_addr
|
|
||||||
Type: write
|
|
||||||
Offset/size: 0x268/8
|
|
||||||
Protocol: 2.14+
|
|
||||||
|
|
||||||
This field can be set by the boot loader to tell the kernel the
|
|
||||||
physical address of the ACPI RSDP table.
|
|
||||||
|
|
||||||
A value of 0 indicates the kernel should fall back to the standard
|
|
||||||
methods to locate the RSDP.
|
|
||||||
|
|
||||||
|
|
||||||
**** THE IMAGE CHECKSUM
|
**** THE IMAGE CHECKSUM
|
||||||
|
|
||||||
|
|
174
MAINTAINERS
174
MAINTAINERS
|
@ -180,6 +180,7 @@ F: drivers/net/hamradio/6pack.c
|
||||||
|
|
||||||
8169 10/100/1000 GIGABIT ETHERNET DRIVER
|
8169 10/100/1000 GIGABIT ETHERNET DRIVER
|
||||||
M: Realtek linux nic maintainers <nic_swsd@realtek.com>
|
M: Realtek linux nic maintainers <nic_swsd@realtek.com>
|
||||||
|
M: Heiner Kallweit <hkallweit1@gmail.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/ethernet/realtek/r8169.c
|
F: drivers/net/ethernet/realtek/r8169.c
|
||||||
|
@ -717,7 +718,7 @@ F: include/linux/mfd/altera-a10sr.h
|
||||||
F: include/dt-bindings/reset/altr,rst-mgr-a10sr.h
|
F: include/dt-bindings/reset/altr,rst-mgr-a10sr.h
|
||||||
|
|
||||||
ALTERA TRIPLE SPEED ETHERNET DRIVER
|
ALTERA TRIPLE SPEED ETHERNET DRIVER
|
||||||
M: Vince Bridgers <vbridger@opensource.altera.com>
|
M: Thor Thayer <thor.thayer@linux.intel.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
L: nios2-dev@lists.rocketboards.org (moderated for non-subscribers)
|
L: nios2-dev@lists.rocketboards.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -1922,7 +1923,6 @@ ARM/QUALCOMM SUPPORT
|
||||||
M: Andy Gross <andy.gross@linaro.org>
|
M: Andy Gross <andy.gross@linaro.org>
|
||||||
M: David Brown <david.brown@linaro.org>
|
M: David Brown <david.brown@linaro.org>
|
||||||
L: linux-arm-msm@vger.kernel.org
|
L: linux-arm-msm@vger.kernel.org
|
||||||
L: linux-soc@vger.kernel.org
|
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/soc/qcom/
|
F: Documentation/devicetree/bindings/soc/qcom/
|
||||||
F: arch/arm/boot/dts/qcom-*.dts
|
F: arch/arm/boot/dts/qcom-*.dts
|
||||||
|
@ -2490,7 +2490,7 @@ F: drivers/net/wireless/ath/*
|
||||||
ATHEROS ATH5K WIRELESS DRIVER
|
ATHEROS ATH5K WIRELESS DRIVER
|
||||||
M: Jiri Slaby <jirislaby@gmail.com>
|
M: Jiri Slaby <jirislaby@gmail.com>
|
||||||
M: Nick Kossifidis <mickflemm@gmail.com>
|
M: Nick Kossifidis <mickflemm@gmail.com>
|
||||||
M: "Luis R. Rodriguez" <mcgrof@do-not-panic.com>
|
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/ath5k
|
W: http://wireless.kernel.org/en/users/Drivers/ath5k
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -2800,7 +2800,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
|
||||||
Q: https://patchwork.ozlabs.org/project/netdev/list/?delegate=77147
|
Q: https://patchwork.ozlabs.org/project/netdev/list/?delegate=77147
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/x86/net/bpf_jit*
|
F: arch/*/net/*
|
||||||
F: Documentation/networking/filter.txt
|
F: Documentation/networking/filter.txt
|
||||||
F: Documentation/bpf/
|
F: Documentation/bpf/
|
||||||
F: include/linux/bpf*
|
F: include/linux/bpf*
|
||||||
|
@ -2820,6 +2820,67 @@ F: tools/bpf/
|
||||||
F: tools/lib/bpf/
|
F: tools/lib/bpf/
|
||||||
F: tools/testing/selftests/bpf/
|
F: tools/testing/selftests/bpf/
|
||||||
|
|
||||||
|
BPF JIT for ARM
|
||||||
|
M: Shubham Bansal <illusionist.neo@gmail.com>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/net/
|
||||||
|
|
||||||
|
BPF JIT for ARM64
|
||||||
|
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||||
|
M: Alexei Starovoitov <ast@kernel.org>
|
||||||
|
M: Zi Shen Lim <zlim.lnx@gmail.com>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
F: arch/arm64/net/
|
||||||
|
|
||||||
|
BPF JIT for MIPS (32-BIT AND 64-BIT)
|
||||||
|
M: Paul Burton <paul.burton@mips.com>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: arch/mips/net/
|
||||||
|
|
||||||
|
BPF JIT for NFP NICs
|
||||||
|
M: Jakub Kicinski <jakub.kicinski@netronome.com>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
F: drivers/net/ethernet/netronome/nfp/bpf/
|
||||||
|
|
||||||
|
BPF JIT for POWERPC (32-BIT AND 64-BIT)
|
||||||
|
M: Naveen N. Rao <naveen.n.rao@linux.ibm.com>
|
||||||
|
M: Sandipan Das <sandipan@linux.ibm.com>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: arch/powerpc/net/
|
||||||
|
|
||||||
|
BPF JIT for S390
|
||||||
|
M: Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||||
|
M: Heiko Carstens <heiko.carstens@de.ibm.com>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: arch/s390/net/
|
||||||
|
X: arch/s390/net/pnet.c
|
||||||
|
|
||||||
|
BPF JIT for SPARC (32-BIT AND 64-BIT)
|
||||||
|
M: David S. Miller <davem@davemloft.net>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: arch/sparc/net/
|
||||||
|
|
||||||
|
BPF JIT for X86 32-BIT
|
||||||
|
M: Wang YanQing <udknight@gmail.com>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: arch/x86/net/bpf_jit_comp32.c
|
||||||
|
|
||||||
|
BPF JIT for X86 64-BIT
|
||||||
|
M: Alexei Starovoitov <ast@kernel.org>
|
||||||
|
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
F: arch/x86/net/
|
||||||
|
X: arch/x86/net/bpf_jit_comp32.c
|
||||||
|
|
||||||
BROADCOM B44 10/100 ETHERNET DRIVER
|
BROADCOM B44 10/100 ETHERNET DRIVER
|
||||||
M: Michael Chan <michael.chan@broadcom.com>
|
M: Michael Chan <michael.chan@broadcom.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
@ -2860,7 +2921,7 @@ F: drivers/staging/vc04_services
|
||||||
BROADCOM BCM47XX MIPS ARCHITECTURE
|
BROADCOM BCM47XX MIPS ARCHITECTURE
|
||||||
M: Hauke Mehrtens <hauke@hauke-m.de>
|
M: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
M: Rafał Miłecki <zajec5@gmail.com>
|
M: Rafał Miłecki <zajec5@gmail.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/mips/brcm/
|
F: Documentation/devicetree/bindings/mips/brcm/
|
||||||
F: arch/mips/bcm47xx/*
|
F: arch/mips/bcm47xx/*
|
||||||
|
@ -2869,7 +2930,6 @@ F: arch/mips/include/asm/mach-bcm47xx/*
|
||||||
BROADCOM BCM5301X ARM ARCHITECTURE
|
BROADCOM BCM5301X ARM ARCHITECTURE
|
||||||
M: Hauke Mehrtens <hauke@hauke-m.de>
|
M: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
M: Rafał Miłecki <zajec5@gmail.com>
|
M: Rafał Miłecki <zajec5@gmail.com>
|
||||||
M: Jon Mason <jonmason@broadcom.com>
|
|
||||||
M: bcm-kernel-feedback-list@broadcom.com
|
M: bcm-kernel-feedback-list@broadcom.com
|
||||||
L: linux-arm-kernel@lists.infradead.org
|
L: linux-arm-kernel@lists.infradead.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -2924,7 +2984,7 @@ F: drivers/cpufreq/bmips-cpufreq.c
|
||||||
BROADCOM BMIPS MIPS ARCHITECTURE
|
BROADCOM BMIPS MIPS ARCHITECTURE
|
||||||
M: Kevin Cernekee <cernekee@gmail.com>
|
M: Kevin Cernekee <cernekee@gmail.com>
|
||||||
M: Florian Fainelli <f.fainelli@gmail.com>
|
M: Florian Fainelli <f.fainelli@gmail.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
T: git git://github.com/broadcom/stblinux.git
|
T: git git://github.com/broadcom/stblinux.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/mips/bmips/*
|
F: arch/mips/bmips/*
|
||||||
|
@ -3015,7 +3075,6 @@ F: drivers/net/ethernet/broadcom/genet/
|
||||||
BROADCOM IPROC ARM ARCHITECTURE
|
BROADCOM IPROC ARM ARCHITECTURE
|
||||||
M: Ray Jui <rjui@broadcom.com>
|
M: Ray Jui <rjui@broadcom.com>
|
||||||
M: Scott Branden <sbranden@broadcom.com>
|
M: Scott Branden <sbranden@broadcom.com>
|
||||||
M: Jon Mason <jonmason@broadcom.com>
|
|
||||||
M: bcm-kernel-feedback-list@broadcom.com
|
M: bcm-kernel-feedback-list@broadcom.com
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
T: git git://github.com/broadcom/cygnus-linux.git
|
T: git git://github.com/broadcom/cygnus-linux.git
|
||||||
|
@ -3062,7 +3121,7 @@ F: include/uapi/rdma/bnxt_re-abi.h
|
||||||
|
|
||||||
BROADCOM NVRAM DRIVER
|
BROADCOM NVRAM DRIVER
|
||||||
M: Rafał Miłecki <zajec5@gmail.com>
|
M: Rafał Miłecki <zajec5@gmail.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/firmware/broadcom/*
|
F: drivers/firmware/broadcom/*
|
||||||
|
|
||||||
|
@ -3276,6 +3335,12 @@ F: include/uapi/linux/caif/
|
||||||
F: include/net/caif/
|
F: include/net/caif/
|
||||||
F: net/caif/
|
F: net/caif/
|
||||||
|
|
||||||
|
CAKE QDISC
|
||||||
|
M: Toke Høiland-Jørgensen <toke@toke.dk>
|
||||||
|
L: cake@lists.bufferbloat.net (moderated for non-subscribers)
|
||||||
|
S: Maintained
|
||||||
|
F: net/sched/sch_cake.c
|
||||||
|
|
||||||
CALGARY x86-64 IOMMU
|
CALGARY x86-64 IOMMU
|
||||||
M: Muli Ben-Yehuda <mulix@mulix.org>
|
M: Muli Ben-Yehuda <mulix@mulix.org>
|
||||||
M: Jon Mason <jdmason@kudzu.us>
|
M: Jon Mason <jdmason@kudzu.us>
|
||||||
|
@ -4158,7 +4223,7 @@ F: net/decnet/
|
||||||
|
|
||||||
DECSTATION PLATFORM SUPPORT
|
DECSTATION PLATFORM SUPPORT
|
||||||
M: "Maciej W. Rozycki" <macro@linux-mips.org>
|
M: "Maciej W. Rozycki" <macro@linux-mips.org>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
W: http://www.linux-mips.org/wiki/DECstation
|
W: http://www.linux-mips.org/wiki/DECstation
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/mips/dec/
|
F: arch/mips/dec/
|
||||||
|
@ -5249,7 +5314,7 @@ EDAC-CAVIUM OCTEON
|
||||||
M: Ralf Baechle <ralf@linux-mips.org>
|
M: Ralf Baechle <ralf@linux-mips.org>
|
||||||
M: David Daney <david.daney@cavium.com>
|
M: David Daney <david.daney@cavium.com>
|
||||||
L: linux-edac@vger.kernel.org
|
L: linux-edac@vger.kernel.org
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/edac/octeon_edac*
|
F: drivers/edac/octeon_edac*
|
||||||
|
|
||||||
|
@ -5528,6 +5593,7 @@ F: net/bridge/
|
||||||
ETHERNET PHY LIBRARY
|
ETHERNET PHY LIBRARY
|
||||||
M: Andrew Lunn <andrew@lunn.ch>
|
M: Andrew Lunn <andrew@lunn.ch>
|
||||||
M: Florian Fainelli <f.fainelli@gmail.com>
|
M: Florian Fainelli <f.fainelli@gmail.com>
|
||||||
|
M: Heiner Kallweit <hkallweit1@gmail.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/ABI/testing/sysfs-bus-mdio
|
F: Documentation/ABI/testing/sysfs-bus-mdio
|
||||||
|
@ -5766,7 +5832,7 @@ F: include/uapi/linux/firewire*.h
|
||||||
F: tools/firewire/
|
F: tools/firewire/
|
||||||
|
|
||||||
FIRMWARE LOADER (request_firmware)
|
FIRMWARE LOADER (request_firmware)
|
||||||
M: Luis R. Rodriguez <mcgrof@kernel.org>
|
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/firmware_class/
|
F: Documentation/firmware_class/
|
||||||
|
@ -6299,6 +6365,7 @@ F: tools/testing/selftests/gpio/
|
||||||
|
|
||||||
GPIO SUBSYSTEM
|
GPIO SUBSYSTEM
|
||||||
M: Linus Walleij <linus.walleij@linaro.org>
|
M: Linus Walleij <linus.walleij@linaro.org>
|
||||||
|
M: Bartosz Golaszewski <bgolaszewski@baylibre.com>
|
||||||
L: linux-gpio@vger.kernel.org
|
L: linux-gpio@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -7436,6 +7503,20 @@ S: Maintained
|
||||||
F: Documentation/fb/intelfb.txt
|
F: Documentation/fb/intelfb.txt
|
||||||
F: drivers/video/fbdev/intelfb/
|
F: drivers/video/fbdev/intelfb/
|
||||||
|
|
||||||
|
INTEL GPIO DRIVERS
|
||||||
|
M: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
L: linux-gpio@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel.git
|
||||||
|
F: drivers/gpio/gpio-ich.c
|
||||||
|
F: drivers/gpio/gpio-intel-mid.c
|
||||||
|
F: drivers/gpio/gpio-lynxpoint.c
|
||||||
|
F: drivers/gpio/gpio-merrifield.c
|
||||||
|
F: drivers/gpio/gpio-ml-ioh.c
|
||||||
|
F: drivers/gpio/gpio-pch.c
|
||||||
|
F: drivers/gpio/gpio-sch.c
|
||||||
|
F: drivers/gpio/gpio-sodaville.c
|
||||||
|
|
||||||
INTEL GVT-g DRIVERS (Intel GPU Virtualization)
|
INTEL GVT-g DRIVERS (Intel GPU Virtualization)
|
||||||
M: Zhenyu Wang <zhenyuw@linux.intel.com>
|
M: Zhenyu Wang <zhenyuw@linux.intel.com>
|
||||||
M: Zhi Wang <zhi.a.wang@intel.com>
|
M: Zhi Wang <zhi.a.wang@intel.com>
|
||||||
|
@ -7446,12 +7527,6 @@ T: git https://github.com/intel/gvt-linux.git
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/gpu/drm/i915/gvt/
|
F: drivers/gpu/drm/i915/gvt/
|
||||||
|
|
||||||
INTEL PMIC GPIO DRIVER
|
|
||||||
R: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
|
||||||
S: Maintained
|
|
||||||
F: drivers/gpio/gpio-*cove.c
|
|
||||||
F: drivers/gpio/gpio-msic.c
|
|
||||||
|
|
||||||
INTEL HID EVENT DRIVER
|
INTEL HID EVENT DRIVER
|
||||||
M: Alex Hung <alex.hung@canonical.com>
|
M: Alex Hung <alex.hung@canonical.com>
|
||||||
L: platform-driver-x86@vger.kernel.org
|
L: platform-driver-x86@vger.kernel.org
|
||||||
|
@ -7539,12 +7614,6 @@ W: https://01.org/linux-acpi
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/platform/x86/intel_menlow.c
|
F: drivers/platform/x86/intel_menlow.c
|
||||||
|
|
||||||
INTEL MERRIFIELD GPIO DRIVER
|
|
||||||
M: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
|
||||||
L: linux-gpio@vger.kernel.org
|
|
||||||
S: Maintained
|
|
||||||
F: drivers/gpio/gpio-merrifield.c
|
|
||||||
|
|
||||||
INTEL MIC DRIVERS (mic)
|
INTEL MIC DRIVERS (mic)
|
||||||
M: Sudeep Dutt <sudeep.dutt@intel.com>
|
M: Sudeep Dutt <sudeep.dutt@intel.com>
|
||||||
M: Ashutosh Dixit <ashutosh.dixit@intel.com>
|
M: Ashutosh Dixit <ashutosh.dixit@intel.com>
|
||||||
|
@ -7577,6 +7646,13 @@ F: drivers/platform/x86/intel_punit_ipc.c
|
||||||
F: arch/x86/include/asm/intel_pmc_ipc.h
|
F: arch/x86/include/asm/intel_pmc_ipc.h
|
||||||
F: arch/x86/include/asm/intel_punit_ipc.h
|
F: arch/x86/include/asm/intel_punit_ipc.h
|
||||||
|
|
||||||
|
INTEL PMIC GPIO DRIVERS
|
||||||
|
M: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
S: Maintained
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel.git
|
||||||
|
F: drivers/gpio/gpio-*cove.c
|
||||||
|
F: drivers/gpio/gpio-msic.c
|
||||||
|
|
||||||
INTEL MULTIFUNCTION PMIC DEVICE DRIVERS
|
INTEL MULTIFUNCTION PMIC DEVICE DRIVERS
|
||||||
R: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
R: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -7685,7 +7761,7 @@ F: Documentation/devicetree/bindings/iio/gyroscope/invensense,mpu3050.txt
|
||||||
|
|
||||||
IOC3 ETHERNET DRIVER
|
IOC3 ETHERNET DRIVER
|
||||||
M: Ralf Baechle <ralf@linux-mips.org>
|
M: Ralf Baechle <ralf@linux-mips.org>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/ethernet/sgi/ioc3-eth.c
|
F: drivers/net/ethernet/sgi/ioc3-eth.c
|
||||||
|
|
||||||
|
@ -8056,7 +8132,7 @@ F: tools/testing/selftests/
|
||||||
F: Documentation/dev-tools/kselftest*
|
F: Documentation/dev-tools/kselftest*
|
||||||
|
|
||||||
KERNEL USERMODE HELPER
|
KERNEL USERMODE HELPER
|
||||||
M: "Luis R. Rodriguez" <mcgrof@kernel.org>
|
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: kernel/umh.c
|
F: kernel/umh.c
|
||||||
|
@ -8113,7 +8189,7 @@ F: arch/arm64/kvm/
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
|
KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
|
||||||
M: James Hogan <jhogan@kernel.org>
|
M: James Hogan <jhogan@kernel.org>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/mips/include/uapi/asm/kvm*
|
F: arch/mips/include/uapi/asm/kvm*
|
||||||
F: arch/mips/include/asm/kvm*
|
F: arch/mips/include/asm/kvm*
|
||||||
|
@ -8232,7 +8308,7 @@ F: mm/kmemleak.c
|
||||||
F: mm/kmemleak-test.c
|
F: mm/kmemleak-test.c
|
||||||
|
|
||||||
KMOD KERNEL MODULE LOADER - USERMODE HELPER
|
KMOD KERNEL MODULE LOADER - USERMODE HELPER
|
||||||
M: "Luis R. Rodriguez" <mcgrof@kernel.org>
|
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: kernel/kmod.c
|
F: kernel/kmod.c
|
||||||
|
@ -8286,7 +8362,7 @@ F: drivers/net/dsa/lantiq_gswip.c
|
||||||
|
|
||||||
LANTIQ MIPS ARCHITECTURE
|
LANTIQ MIPS ARCHITECTURE
|
||||||
M: John Crispin <john@phrozen.org>
|
M: John Crispin <john@phrozen.org>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/mips/lantiq
|
F: arch/mips/lantiq
|
||||||
F: drivers/soc/lantiq
|
F: drivers/soc/lantiq
|
||||||
|
@ -8849,7 +8925,7 @@ S: Maintained
|
||||||
|
|
||||||
MARDUK (CREATOR CI40) DEVICE TREE SUPPORT
|
MARDUK (CREATOR CI40) DEVICE TREE SUPPORT
|
||||||
M: Rahul Bedarkar <rahulbedarkar89@gmail.com>
|
M: Rahul Bedarkar <rahulbedarkar89@gmail.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/mips/boot/dts/img/pistachio_marduk.dts
|
F: arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
|
||||||
|
@ -9808,7 +9884,7 @@ F: drivers/dma/at_xdmac.c
|
||||||
|
|
||||||
MICROSEMI MIPS SOCS
|
MICROSEMI MIPS SOCS
|
||||||
M: Alexandre Belloni <alexandre.belloni@bootlin.com>
|
M: Alexandre Belloni <alexandre.belloni@bootlin.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/mips/generic/board-ocelot.c
|
F: arch/mips/generic/board-ocelot.c
|
||||||
F: arch/mips/configs/generic/board-ocelot.config
|
F: arch/mips/configs/generic/board-ocelot.config
|
||||||
|
@ -9848,7 +9924,7 @@ MIPS
|
||||||
M: Ralf Baechle <ralf@linux-mips.org>
|
M: Ralf Baechle <ralf@linux-mips.org>
|
||||||
M: Paul Burton <paul.burton@mips.com>
|
M: Paul Burton <paul.burton@mips.com>
|
||||||
M: James Hogan <jhogan@kernel.org>
|
M: James Hogan <jhogan@kernel.org>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
W: http://www.linux-mips.org/
|
W: http://www.linux-mips.org/
|
||||||
T: git git://git.linux-mips.org/pub/scm/ralf/linux.git
|
T: git git://git.linux-mips.org/pub/scm/ralf/linux.git
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git
|
||||||
|
@ -9861,7 +9937,7 @@ F: drivers/platform/mips/
|
||||||
|
|
||||||
MIPS BOSTON DEVELOPMENT BOARD
|
MIPS BOSTON DEVELOPMENT BOARD
|
||||||
M: Paul Burton <paul.burton@mips.com>
|
M: Paul Burton <paul.burton@mips.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/clock/img,boston-clock.txt
|
F: Documentation/devicetree/bindings/clock/img,boston-clock.txt
|
||||||
F: arch/mips/boot/dts/img/boston.dts
|
F: arch/mips/boot/dts/img/boston.dts
|
||||||
|
@ -9871,7 +9947,7 @@ F: include/dt-bindings/clock/boston-clock.h
|
||||||
|
|
||||||
MIPS GENERIC PLATFORM
|
MIPS GENERIC PLATFORM
|
||||||
M: Paul Burton <paul.burton@mips.com>
|
M: Paul Burton <paul.burton@mips.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/devicetree/bindings/power/mti,mips-cpc.txt
|
F: Documentation/devicetree/bindings/power/mti,mips-cpc.txt
|
||||||
F: arch/mips/generic/
|
F: arch/mips/generic/
|
||||||
|
@ -9879,7 +9955,7 @@ F: arch/mips/tools/generic-board-config.sh
|
||||||
|
|
||||||
MIPS/LOONGSON1 ARCHITECTURE
|
MIPS/LOONGSON1 ARCHITECTURE
|
||||||
M: Keguang Zhang <keguang.zhang@gmail.com>
|
M: Keguang Zhang <keguang.zhang@gmail.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/mips/loongson32/
|
F: arch/mips/loongson32/
|
||||||
F: arch/mips/include/asm/mach-loongson32/
|
F: arch/mips/include/asm/mach-loongson32/
|
||||||
|
@ -9888,7 +9964,7 @@ F: drivers/*/*/*loongson1*
|
||||||
|
|
||||||
MIPS/LOONGSON2 ARCHITECTURE
|
MIPS/LOONGSON2 ARCHITECTURE
|
||||||
M: Jiaxun Yang <jiaxun.yang@flygoat.com>
|
M: Jiaxun Yang <jiaxun.yang@flygoat.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/mips/loongson64/fuloong-2e/
|
F: arch/mips/loongson64/fuloong-2e/
|
||||||
F: arch/mips/loongson64/lemote-2f/
|
F: arch/mips/loongson64/lemote-2f/
|
||||||
|
@ -9898,7 +9974,7 @@ F: drivers/*/*/*loongson2*
|
||||||
|
|
||||||
MIPS/LOONGSON3 ARCHITECTURE
|
MIPS/LOONGSON3 ARCHITECTURE
|
||||||
M: Huacai Chen <chenhc@lemote.com>
|
M: Huacai Chen <chenhc@lemote.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/mips/loongson64/
|
F: arch/mips/loongson64/
|
||||||
F: arch/mips/include/asm/mach-loongson64/
|
F: arch/mips/include/asm/mach-loongson64/
|
||||||
|
@ -9908,7 +9984,7 @@ F: drivers/*/*/*loongson3*
|
||||||
|
|
||||||
MIPS RINT INSTRUCTION EMULATION
|
MIPS RINT INSTRUCTION EMULATION
|
||||||
M: Aleksandar Markovic <aleksandar.markovic@mips.com>
|
M: Aleksandar Markovic <aleksandar.markovic@mips.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/mips/math-emu/sp_rint.c
|
F: arch/mips/math-emu/sp_rint.c
|
||||||
F: arch/mips/math-emu/dp_rint.c
|
F: arch/mips/math-emu/dp_rint.c
|
||||||
|
@ -10893,7 +10969,7 @@ F: include/linux/platform_data/i2c-omap.h
|
||||||
|
|
||||||
ONION OMEGA2+ BOARD
|
ONION OMEGA2+ BOARD
|
||||||
M: Harvey Hunt <harveyhuntnexus@gmail.com>
|
M: Harvey Hunt <harveyhuntnexus@gmail.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/mips/boot/dts/ralink/omega2p.dts
|
F: arch/mips/boot/dts/ralink/omega2p.dts
|
||||||
|
|
||||||
|
@ -11802,7 +11878,7 @@ F: drivers/pinctrl/spear/
|
||||||
|
|
||||||
PISTACHIO SOC SUPPORT
|
PISTACHIO SOC SUPPORT
|
||||||
M: James Hartley <james.hartley@sondrel.com>
|
M: James Hartley <james.hartley@sondrel.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
F: arch/mips/pistachio/
|
F: arch/mips/pistachio/
|
||||||
F: arch/mips/include/asm/mach-pistachio/
|
F: arch/mips/include/asm/mach-pistachio/
|
||||||
|
@ -11982,7 +12058,7 @@ F: kernel/printk/
|
||||||
F: include/linux/printk.h
|
F: include/linux/printk.h
|
||||||
|
|
||||||
PRISM54 WIRELESS DRIVER
|
PRISM54 WIRELESS DRIVER
|
||||||
M: "Luis R. Rodriguez" <mcgrof@gmail.com>
|
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/p54
|
W: http://wireless.kernel.org/en/users/Drivers/p54
|
||||||
S: Obsolete
|
S: Obsolete
|
||||||
|
@ -11996,9 +12072,10 @@ S: Maintained
|
||||||
F: fs/proc/
|
F: fs/proc/
|
||||||
F: include/linux/proc_fs.h
|
F: include/linux/proc_fs.h
|
||||||
F: tools/testing/selftests/proc/
|
F: tools/testing/selftests/proc/
|
||||||
|
F: Documentation/filesystems/proc.txt
|
||||||
|
|
||||||
PROC SYSCTL
|
PROC SYSCTL
|
||||||
M: "Luis R. Rodriguez" <mcgrof@kernel.org>
|
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||||
M: Kees Cook <keescook@chromium.org>
|
M: Kees Cook <keescook@chromium.org>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
L: linux-fsdevel@vger.kernel.org
|
L: linux-fsdevel@vger.kernel.org
|
||||||
|
@ -12461,7 +12538,7 @@ F: drivers/media/usb/rainshadow-cec/*
|
||||||
|
|
||||||
RALINK MIPS ARCHITECTURE
|
RALINK MIPS ARCHITECTURE
|
||||||
M: John Crispin <john@phrozen.org>
|
M: John Crispin <john@phrozen.org>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/mips/ralink
|
F: arch/mips/ralink
|
||||||
|
|
||||||
|
@ -12481,7 +12558,7 @@ F: drivers/block/brd.c
|
||||||
|
|
||||||
RANCHU VIRTUAL BOARD FOR MIPS
|
RANCHU VIRTUAL BOARD FOR MIPS
|
||||||
M: Miodrag Dinic <miodrag.dinic@mips.com>
|
M: Miodrag Dinic <miodrag.dinic@mips.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/mips/generic/board-ranchu.c
|
F: arch/mips/generic/board-ranchu.c
|
||||||
F: arch/mips/configs/generic/board-ranchu.config
|
F: arch/mips/configs/generic/board-ranchu.config
|
||||||
|
@ -13931,6 +14008,7 @@ S: Supported
|
||||||
F: Documentation/devicetree/bindings/sound/
|
F: Documentation/devicetree/bindings/sound/
|
||||||
F: Documentation/sound/soc/
|
F: Documentation/sound/soc/
|
||||||
F: sound/soc/
|
F: sound/soc/
|
||||||
|
F: include/dt-bindings/sound/
|
||||||
F: include/sound/soc*
|
F: include/sound/soc*
|
||||||
|
|
||||||
SOUNDWIRE SUBSYSTEM
|
SOUNDWIRE SUBSYSTEM
|
||||||
|
@ -13978,11 +14056,10 @@ F: drivers/tty/serial/sunzilog.h
|
||||||
F: drivers/tty/vcc.c
|
F: drivers/tty/vcc.c
|
||||||
|
|
||||||
SPARSE CHECKER
|
SPARSE CHECKER
|
||||||
M: "Christopher Li" <sparse@chrisli.org>
|
M: "Luc Van Oostenryck" <luc.vanoostenryck@gmail.com>
|
||||||
L: linux-sparse@vger.kernel.org
|
L: linux-sparse@vger.kernel.org
|
||||||
W: https://sparse.wiki.kernel.org/
|
W: https://sparse.wiki.kernel.org/
|
||||||
T: git git://git.kernel.org/pub/scm/devel/sparse/sparse.git
|
T: git git://git.kernel.org/pub/scm/devel/sparse/sparse.git
|
||||||
T: git git://git.kernel.org/pub/scm/devel/sparse/chrisl/sparse.git
|
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: include/linux/compiler.h
|
F: include/linux/compiler.h
|
||||||
|
|
||||||
|
@ -14079,6 +14156,7 @@ F: Documentation/devicetree/bindings/iio/proximity/vl53l0x.txt
|
||||||
|
|
||||||
STABLE BRANCH
|
STABLE BRANCH
|
||||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
M: Sasha Levin <sashal@kernel.org>
|
||||||
L: stable@vger.kernel.org
|
L: stable@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/process/stable-kernel-rules.rst
|
F: Documentation/process/stable-kernel-rules.rst
|
||||||
|
@ -15216,7 +15294,7 @@ F: arch/um/os-Linux/drivers/
|
||||||
TURBOCHANNEL SUBSYSTEM
|
TURBOCHANNEL SUBSYSTEM
|
||||||
M: "Maciej W. Rozycki" <macro@linux-mips.org>
|
M: "Maciej W. Rozycki" <macro@linux-mips.org>
|
||||||
M: Ralf Baechle <ralf@linux-mips.org>
|
M: Ralf Baechle <ralf@linux-mips.org>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
Q: http://patchwork.linux-mips.org/project/linux-mips/list/
|
Q: http://patchwork.linux-mips.org/project/linux-mips/list/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/tc/
|
F: drivers/tc/
|
||||||
|
@ -16037,7 +16115,7 @@ F: drivers/net/vmxnet3/
|
||||||
|
|
||||||
VOCORE VOCORE2 BOARD
|
VOCORE VOCORE2 BOARD
|
||||||
M: Harvey Hunt <harveyhuntnexus@gmail.com>
|
M: Harvey Hunt <harveyhuntnexus@gmail.com>
|
||||||
L: linux-mips@linux-mips.org
|
L: linux-mips@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/mips/boot/dts/ralink/vocore2.dts
|
F: arch/mips/boot/dts/ralink/vocore2.dts
|
||||||
|
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -2,8 +2,8 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 20
|
PATCHLEVEL = 20
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc3
|
EXTRAVERSION = -rc5
|
||||||
NAME = "People's Front"
|
NAME = Shy Crocodile
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
# To see a list of typical targets execute "make help"
|
# To see a list of typical targets execute "make help"
|
||||||
|
|
|
@ -228,7 +228,7 @@
|
||||||
vmmc-supply = <&vmmc_fixed>;
|
vmmc-supply = <&vmmc_fixed>;
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
wp-gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>; /* gpio_126 */
|
wp-gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>; /* gpio_126 */
|
||||||
cd-gpios = <&gpio4 31 GPIO_ACTIVE_HIGH>; /* gpio_127 */
|
cd-gpios = <&gpio4 31 GPIO_ACTIVE_LOW>; /* gpio_127 */
|
||||||
};
|
};
|
||||||
|
|
||||||
&mmc3 {
|
&mmc3 {
|
||||||
|
|
|
@ -163,7 +163,7 @@
|
||||||
compatible = "ti,wl1271";
|
compatible = "ti,wl1271";
|
||||||
reg = <2>;
|
reg = <2>;
|
||||||
interrupt-parent = <&gpio6>;
|
interrupt-parent = <&gpio6>;
|
||||||
interrupts = <10 IRQ_TYPE_LEVEL_HIGH>; /* gpio_170 */
|
interrupts = <10 IRQ_TYPE_EDGE_RISING>; /* gpio_170 */
|
||||||
ref-clock-frequency = <26000000>;
|
ref-clock-frequency = <26000000>;
|
||||||
tcxo-clock-frequency = <26000000>;
|
tcxo-clock-frequency = <26000000>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -492,12 +492,6 @@
|
||||||
pinctrl-0 = <&pinctrl_i2c2>;
|
pinctrl-0 = <&pinctrl_i2c2>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
eeprom@50 {
|
|
||||||
compatible = "atmel,24c04";
|
|
||||||
pagesize = <16>;
|
|
||||||
reg = <0x50>;
|
|
||||||
};
|
|
||||||
|
|
||||||
hpa1: amp@60 {
|
hpa1: amp@60 {
|
||||||
compatible = "ti,tpa6130a2";
|
compatible = "ti,tpa6130a2";
|
||||||
reg = <0x60>;
|
reg = <0x60>;
|
||||||
|
|
|
@ -129,7 +129,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&mmc3 {
|
&mmc3 {
|
||||||
interrupts-extended = <&intc 94 &omap3_pmx_core2 0x46>;
|
interrupts-extended = <&intc 94 &omap3_pmx_core 0x136>;
|
||||||
pinctrl-0 = <&mmc3_pins &wl127x_gpio>;
|
pinctrl-0 = <&mmc3_pins &wl127x_gpio>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
vmmc-supply = <&wl12xx_vmmc>;
|
vmmc-supply = <&wl12xx_vmmc>;
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
* jumpering combinations for the long run.
|
* jumpering combinations for the long run.
|
||||||
*/
|
*/
|
||||||
&mmc3 {
|
&mmc3 {
|
||||||
interrupts-extended = <&intc 94 &omap3_pmx_core2 0x46>;
|
interrupts-extended = <&intc 94 &omap3_pmx_core 0x136>;
|
||||||
pinctrl-0 = <&mmc3_pins &mmc3_core2_pins>;
|
pinctrl-0 = <&mmc3_pins &mmc3_core2_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
vmmc-supply = <&wl12xx_vmmc>;
|
vmmc-supply = <&wl12xx_vmmc>;
|
||||||
|
|
|
@ -10,7 +10,11 @@
|
||||||
#include "rk3288.dtsi"
|
#include "rk3288.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
memory@0 {
|
/*
|
||||||
|
* The default coreboot on veyron devices ignores memory@0 nodes
|
||||||
|
* and would instead create another memory node.
|
||||||
|
*/
|
||||||
|
memory {
|
||||||
device_type = "memory";
|
device_type = "memory";
|
||||||
reg = <0x0 0x0 0x0 0x80000000>;
|
reg = <0x0 0x0 0x0 0x80000000>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -314,7 +314,7 @@
|
||||||
0x1 0x0 0x60000000 0x10000000
|
0x1 0x0 0x60000000 0x10000000
|
||||||
0x2 0x0 0x70000000 0x10000000
|
0x2 0x0 0x70000000 0x10000000
|
||||||
0x3 0x0 0x80000000 0x10000000>;
|
0x3 0x0 0x80000000 0x10000000>;
|
||||||
clocks = <&mck>;
|
clocks = <&h32ck>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
nand_controller: nand-controller {
|
nand_controller: nand-controller {
|
||||||
|
|
|
@ -183,9 +183,7 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
|
||||||
unsigned long frame_pointer)
|
unsigned long frame_pointer)
|
||||||
{
|
{
|
||||||
unsigned long return_hooker = (unsigned long) &return_to_handler;
|
unsigned long return_hooker = (unsigned long) &return_to_handler;
|
||||||
struct ftrace_graph_ent trace;
|
|
||||||
unsigned long old;
|
unsigned long old;
|
||||||
int err;
|
|
||||||
|
|
||||||
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
||||||
return;
|
return;
|
||||||
|
@ -193,21 +191,8 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
|
||||||
old = *parent;
|
old = *parent;
|
||||||
*parent = return_hooker;
|
*parent = return_hooker;
|
||||||
|
|
||||||
trace.func = self_addr;
|
if (function_graph_enter(old, self_addr, frame_pointer, NULL))
|
||||||
trace.depth = current->curr_ret_stack + 1;
|
|
||||||
|
|
||||||
/* Only trace if the calling function expects to */
|
|
||||||
if (!ftrace_graph_entry(&trace)) {
|
|
||||||
*parent = old;
|
*parent = old;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = ftrace_push_return_trace(old, self_addr, &trace.depth,
|
|
||||||
frame_pointer, NULL);
|
|
||||||
if (err == -EBUSY) {
|
|
||||||
*parent = old;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
|
|
|
@ -759,6 +759,8 @@ static struct davinci_id da830_ids[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct davinci_gpio_platform_data da830_gpio_platform_data = {
|
static struct davinci_gpio_platform_data da830_gpio_platform_data = {
|
||||||
|
.no_auto_base = true,
|
||||||
|
.base = 0,
|
||||||
.ngpio = 128,
|
.ngpio = 128,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -719,6 +719,8 @@ int __init da850_register_vpif_capture(struct vpif_capture_config
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct davinci_gpio_platform_data da850_gpio_platform_data = {
|
static struct davinci_gpio_platform_data da850_gpio_platform_data = {
|
||||||
|
.no_auto_base = true,
|
||||||
|
.base = 0,
|
||||||
.ngpio = 144,
|
.ngpio = 144,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -701,6 +701,46 @@ static struct resource da8xx_gpio_resources[] = {
|
||||||
},
|
},
|
||||||
{ /* interrupt */
|
{ /* interrupt */
|
||||||
.start = IRQ_DA8XX_GPIO0,
|
.start = IRQ_DA8XX_GPIO0,
|
||||||
|
.end = IRQ_DA8XX_GPIO0,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DA8XX_GPIO1,
|
||||||
|
.end = IRQ_DA8XX_GPIO1,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DA8XX_GPIO2,
|
||||||
|
.end = IRQ_DA8XX_GPIO2,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DA8XX_GPIO3,
|
||||||
|
.end = IRQ_DA8XX_GPIO3,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DA8XX_GPIO4,
|
||||||
|
.end = IRQ_DA8XX_GPIO4,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DA8XX_GPIO5,
|
||||||
|
.end = IRQ_DA8XX_GPIO5,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DA8XX_GPIO6,
|
||||||
|
.end = IRQ_DA8XX_GPIO6,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DA8XX_GPIO7,
|
||||||
|
.end = IRQ_DA8XX_GPIO7,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DA8XX_GPIO8,
|
||||||
.end = IRQ_DA8XX_GPIO8,
|
.end = IRQ_DA8XX_GPIO8,
|
||||||
.flags = IORESOURCE_IRQ,
|
.flags = IORESOURCE_IRQ,
|
||||||
},
|
},
|
||||||
|
|
|
@ -548,12 +548,44 @@ static struct resource dm355_gpio_resources[] = {
|
||||||
},
|
},
|
||||||
{ /* interrupt */
|
{ /* interrupt */
|
||||||
.start = IRQ_DM355_GPIOBNK0,
|
.start = IRQ_DM355_GPIOBNK0,
|
||||||
|
.end = IRQ_DM355_GPIOBNK0,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM355_GPIOBNK1,
|
||||||
|
.end = IRQ_DM355_GPIOBNK1,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM355_GPIOBNK2,
|
||||||
|
.end = IRQ_DM355_GPIOBNK2,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM355_GPIOBNK3,
|
||||||
|
.end = IRQ_DM355_GPIOBNK3,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM355_GPIOBNK4,
|
||||||
|
.end = IRQ_DM355_GPIOBNK4,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM355_GPIOBNK5,
|
||||||
|
.end = IRQ_DM355_GPIOBNK5,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM355_GPIOBNK6,
|
||||||
.end = IRQ_DM355_GPIOBNK6,
|
.end = IRQ_DM355_GPIOBNK6,
|
||||||
.flags = IORESOURCE_IRQ,
|
.flags = IORESOURCE_IRQ,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct davinci_gpio_platform_data dm355_gpio_platform_data = {
|
static struct davinci_gpio_platform_data dm355_gpio_platform_data = {
|
||||||
|
.no_auto_base = true,
|
||||||
|
.base = 0,
|
||||||
.ngpio = 104,
|
.ngpio = 104,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -267,12 +267,49 @@ static struct resource dm365_gpio_resources[] = {
|
||||||
},
|
},
|
||||||
{ /* interrupt */
|
{ /* interrupt */
|
||||||
.start = IRQ_DM365_GPIO0,
|
.start = IRQ_DM365_GPIO0,
|
||||||
|
.end = IRQ_DM365_GPIO0,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM365_GPIO1,
|
||||||
|
.end = IRQ_DM365_GPIO1,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM365_GPIO2,
|
||||||
|
.end = IRQ_DM365_GPIO2,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM365_GPIO3,
|
||||||
|
.end = IRQ_DM365_GPIO3,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM365_GPIO4,
|
||||||
|
.end = IRQ_DM365_GPIO4,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM365_GPIO5,
|
||||||
|
.end = IRQ_DM365_GPIO5,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM365_GPIO6,
|
||||||
|
.end = IRQ_DM365_GPIO6,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM365_GPIO7,
|
||||||
.end = IRQ_DM365_GPIO7,
|
.end = IRQ_DM365_GPIO7,
|
||||||
.flags = IORESOURCE_IRQ,
|
.flags = IORESOURCE_IRQ,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct davinci_gpio_platform_data dm365_gpio_platform_data = {
|
static struct davinci_gpio_platform_data dm365_gpio_platform_data = {
|
||||||
|
.no_auto_base = true,
|
||||||
|
.base = 0,
|
||||||
.ngpio = 104,
|
.ngpio = 104,
|
||||||
.gpio_unbanked = 8,
|
.gpio_unbanked = 8,
|
||||||
};
|
};
|
||||||
|
|
|
@ -492,12 +492,34 @@ static struct resource dm644_gpio_resources[] = {
|
||||||
},
|
},
|
||||||
{ /* interrupt */
|
{ /* interrupt */
|
||||||
.start = IRQ_GPIOBNK0,
|
.start = IRQ_GPIOBNK0,
|
||||||
|
.end = IRQ_GPIOBNK0,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_GPIOBNK1,
|
||||||
|
.end = IRQ_GPIOBNK1,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_GPIOBNK2,
|
||||||
|
.end = IRQ_GPIOBNK2,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_GPIOBNK3,
|
||||||
|
.end = IRQ_GPIOBNK3,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_GPIOBNK4,
|
||||||
.end = IRQ_GPIOBNK4,
|
.end = IRQ_GPIOBNK4,
|
||||||
.flags = IORESOURCE_IRQ,
|
.flags = IORESOURCE_IRQ,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct davinci_gpio_platform_data dm644_gpio_platform_data = {
|
static struct davinci_gpio_platform_data dm644_gpio_platform_data = {
|
||||||
|
.no_auto_base = true,
|
||||||
|
.base = 0,
|
||||||
.ngpio = 71,
|
.ngpio = 71,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -442,12 +442,24 @@ static struct resource dm646x_gpio_resources[] = {
|
||||||
},
|
},
|
||||||
{ /* interrupt */
|
{ /* interrupt */
|
||||||
.start = IRQ_DM646X_GPIOBNK0,
|
.start = IRQ_DM646X_GPIOBNK0,
|
||||||
|
.end = IRQ_DM646X_GPIOBNK0,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM646X_GPIOBNK1,
|
||||||
|
.end = IRQ_DM646X_GPIOBNK1,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IRQ_DM646X_GPIOBNK2,
|
||||||
.end = IRQ_DM646X_GPIOBNK2,
|
.end = IRQ_DM646X_GPIOBNK2,
|
||||||
.flags = IORESOURCE_IRQ,
|
.flags = IORESOURCE_IRQ,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct davinci_gpio_platform_data dm646x_gpio_platform_data = {
|
static struct davinci_gpio_platform_data dm646x_gpio_platform_data = {
|
||||||
|
.no_auto_base = true,
|
||||||
|
.base = 0,
|
||||||
.ngpio = 43,
|
.ngpio = 43,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -750,6 +750,9 @@ static void modem_pm(struct uart_port *port, unsigned int state, unsigned old)
|
||||||
struct modem_private_data *priv = port->private_data;
|
struct modem_private_data *priv = port->private_data;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!priv)
|
||||||
|
return;
|
||||||
|
|
||||||
if (IS_ERR(priv->regulator))
|
if (IS_ERR(priv->regulator))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -351,7 +351,7 @@ static void omap44xx_prm_reconfigure_io_chain(void)
|
||||||
* to occur, WAKEUPENABLE bits must be set in the pad mux registers, and
|
* to occur, WAKEUPENABLE bits must be set in the pad mux registers, and
|
||||||
* omap44xx_prm_reconfigure_io_chain() must be called. No return value.
|
* omap44xx_prm_reconfigure_io_chain() must be called. No return value.
|
||||||
*/
|
*/
|
||||||
static void __init omap44xx_prm_enable_io_wakeup(void)
|
static void omap44xx_prm_enable_io_wakeup(void)
|
||||||
{
|
{
|
||||||
s32 inst = omap4_prmst_get_prm_dev_inst();
|
s32 inst = omap4_prmst_get_prm_dev_inst();
|
||||||
|
|
||||||
|
|
|
@ -497,6 +497,24 @@ config ARM64_ERRATUM_1188873
|
||||||
|
|
||||||
If unsure, say Y.
|
If unsure, say Y.
|
||||||
|
|
||||||
|
config ARM64_ERRATUM_1286807
|
||||||
|
bool "Cortex-A76: Modification of the translation table for a virtual address might lead to read-after-read ordering violation"
|
||||||
|
default y
|
||||||
|
select ARM64_WORKAROUND_REPEAT_TLBI
|
||||||
|
help
|
||||||
|
This option adds workaround for ARM Cortex-A76 erratum 1286807
|
||||||
|
|
||||||
|
On the affected Cortex-A76 cores (r0p0 to r3p0), if a virtual
|
||||||
|
address for a cacheable mapping of a location is being
|
||||||
|
accessed by a core while another core is remapping the virtual
|
||||||
|
address to a new physical page using the recommended
|
||||||
|
break-before-make sequence, then under very rare circumstances
|
||||||
|
TLBI+DSB completes before a read using the translation being
|
||||||
|
invalidated has been observed by other observers. The
|
||||||
|
workaround repeats the TLBI+DSB operation.
|
||||||
|
|
||||||
|
If unsure, say Y.
|
||||||
|
|
||||||
config CAVIUM_ERRATUM_22375
|
config CAVIUM_ERRATUM_22375
|
||||||
bool "Cavium erratum 22375, 24313"
|
bool "Cavium erratum 22375, 24313"
|
||||||
default y
|
default y
|
||||||
|
@ -566,9 +584,16 @@ config QCOM_FALKOR_ERRATUM_1003
|
||||||
is unchanged. Work around the erratum by invalidating the walk cache
|
is unchanged. Work around the erratum by invalidating the walk cache
|
||||||
entries for the trampoline before entering the kernel proper.
|
entries for the trampoline before entering the kernel proper.
|
||||||
|
|
||||||
|
config ARM64_WORKAROUND_REPEAT_TLBI
|
||||||
|
bool
|
||||||
|
help
|
||||||
|
Enable the repeat TLBI workaround for Falkor erratum 1009 and
|
||||||
|
Cortex-A76 erratum 1286807.
|
||||||
|
|
||||||
config QCOM_FALKOR_ERRATUM_1009
|
config QCOM_FALKOR_ERRATUM_1009
|
||||||
bool "Falkor E1009: Prematurely complete a DSB after a TLBI"
|
bool "Falkor E1009: Prematurely complete a DSB after a TLBI"
|
||||||
default y
|
default y
|
||||||
|
select ARM64_WORKAROUND_REPEAT_TLBI
|
||||||
help
|
help
|
||||||
On Falkor v1, the CPU may prematurely complete a DSB following a
|
On Falkor v1, the CPU may prematurely complete a DSB following a
|
||||||
TLBI xxIS invalidate maintenance operation. Repeat the TLBI operation
|
TLBI xxIS invalidate maintenance operation. Repeat the TLBI operation
|
||||||
|
|
|
@ -241,3 +241,7 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&tlmm {
|
||||||
|
gpio-reserved-ranges = <0 4>, <81 4>;
|
||||||
|
};
|
||||||
|
|
|
@ -352,6 +352,10 @@
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&tlmm {
|
||||||
|
gpio-reserved-ranges = <0 4>, <81 4>;
|
||||||
|
};
|
||||||
|
|
||||||
&uart9 {
|
&uart9 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -153,7 +153,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&pcie0 {
|
&pcie0 {
|
||||||
ep-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_LOW>;
|
ep-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;
|
||||||
num-lanes = <4>;
|
num-lanes = <4>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pcie_clkreqn_cpm>;
|
pinctrl-0 = <&pcie_clkreqn_cpm>;
|
||||||
|
|
|
@ -57,18 +57,6 @@
|
||||||
regulator-always-on;
|
regulator-always-on;
|
||||||
vin-supply = <&vcc_sys>;
|
vin-supply = <&vcc_sys>;
|
||||||
};
|
};
|
||||||
|
|
||||||
vdd_log: vdd-log {
|
|
||||||
compatible = "pwm-regulator";
|
|
||||||
pwms = <&pwm2 0 25000 0>;
|
|
||||||
regulator-name = "vdd_log";
|
|
||||||
regulator-min-microvolt = <800000>;
|
|
||||||
regulator-max-microvolt = <1400000>;
|
|
||||||
regulator-always-on;
|
|
||||||
regulator-boot-on;
|
|
||||||
vin-supply = <&vcc_sys>;
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
&cpu_l0 {
|
&cpu_l0 {
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
|
|
||||||
wkup_uart0: serial@42300000 {
|
wkup_uart0: serial@42300000 {
|
||||||
compatible = "ti,am654-uart";
|
compatible = "ti,am654-uart";
|
||||||
reg = <0x00 0x42300000 0x00 0x100>;
|
reg = <0x42300000 0x100>;
|
||||||
reg-shift = <2>;
|
reg-shift = <2>;
|
||||||
reg-io-width = <4>;
|
reg-io-width = <4>;
|
||||||
interrupts = <GIC_SPI 697 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 697 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|
|
@ -56,6 +56,19 @@ static inline bool arch_trace_is_compat_syscall(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
return is_compat_task();
|
return is_compat_task();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
|
||||||
|
|
||||||
|
static inline bool arch_syscall_match_sym_name(const char *sym,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Since all syscall functions have __arm64_ prefix, we must skip it.
|
||||||
|
* However, as we described above, we decided to ignore compat
|
||||||
|
* syscalls, so we don't care about __arm64_compat_ prefix here.
|
||||||
|
*/
|
||||||
|
return !strcmp(sym + 8, name);
|
||||||
|
}
|
||||||
#endif /* ifndef __ASSEMBLY__ */
|
#endif /* ifndef __ASSEMBLY__ */
|
||||||
|
|
||||||
#endif /* __ASM_FTRACE_H */
|
#endif /* __ASM_FTRACE_H */
|
||||||
|
|
|
@ -468,7 +468,7 @@
|
||||||
SCTLR_ELx_SA | SCTLR_ELx_I | SCTLR_ELx_WXN | \
|
SCTLR_ELx_SA | SCTLR_ELx_I | SCTLR_ELx_WXN | \
|
||||||
SCTLR_ELx_DSSBS | ENDIAN_CLEAR_EL2 | SCTLR_EL2_RES0)
|
SCTLR_ELx_DSSBS | ENDIAN_CLEAR_EL2 | SCTLR_EL2_RES0)
|
||||||
|
|
||||||
#if (SCTLR_EL2_SET ^ SCTLR_EL2_CLEAR) != 0xffffffffffffffff
|
#if (SCTLR_EL2_SET ^ SCTLR_EL2_CLEAR) != 0xffffffffffffffffUL
|
||||||
#error "Inconsistent SCTLR_EL2 set/clear bits"
|
#error "Inconsistent SCTLR_EL2 set/clear bits"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -509,7 +509,7 @@
|
||||||
SCTLR_EL1_UMA | SCTLR_ELx_WXN | ENDIAN_CLEAR_EL1 |\
|
SCTLR_EL1_UMA | SCTLR_ELx_WXN | ENDIAN_CLEAR_EL1 |\
|
||||||
SCTLR_ELx_DSSBS | SCTLR_EL1_NTWI | SCTLR_EL1_RES0)
|
SCTLR_ELx_DSSBS | SCTLR_EL1_NTWI | SCTLR_EL1_RES0)
|
||||||
|
|
||||||
#if (SCTLR_EL1_SET ^ SCTLR_EL1_CLEAR) != 0xffffffffffffffff
|
#if (SCTLR_EL1_SET ^ SCTLR_EL1_CLEAR) != 0xffffffffffffffffUL
|
||||||
#error "Inconsistent SCTLR_EL1 set/clear bits"
|
#error "Inconsistent SCTLR_EL1 set/clear bits"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -41,14 +41,14 @@
|
||||||
ALTERNATIVE("nop\n nop", \
|
ALTERNATIVE("nop\n nop", \
|
||||||
"dsb ish\n tlbi " #op, \
|
"dsb ish\n tlbi " #op, \
|
||||||
ARM64_WORKAROUND_REPEAT_TLBI, \
|
ARM64_WORKAROUND_REPEAT_TLBI, \
|
||||||
CONFIG_QCOM_FALKOR_ERRATUM_1009) \
|
CONFIG_ARM64_WORKAROUND_REPEAT_TLBI) \
|
||||||
: : )
|
: : )
|
||||||
|
|
||||||
#define __TLBI_1(op, arg) asm ("tlbi " #op ", %0\n" \
|
#define __TLBI_1(op, arg) asm ("tlbi " #op ", %0\n" \
|
||||||
ALTERNATIVE("nop\n nop", \
|
ALTERNATIVE("nop\n nop", \
|
||||||
"dsb ish\n tlbi " #op ", %0", \
|
"dsb ish\n tlbi " #op ", %0", \
|
||||||
ARM64_WORKAROUND_REPEAT_TLBI, \
|
ARM64_WORKAROUND_REPEAT_TLBI, \
|
||||||
CONFIG_QCOM_FALKOR_ERRATUM_1009) \
|
CONFIG_ARM64_WORKAROUND_REPEAT_TLBI) \
|
||||||
: : "r" (arg))
|
: : "r" (arg))
|
||||||
|
|
||||||
#define __TLBI_N(op, arg, n, ...) __TLBI_##n(op, arg)
|
#define __TLBI_N(op, arg, n, ...) __TLBI_##n(op, arg)
|
||||||
|
|
|
@ -570,6 +570,20 @@ static const struct midr_range arm64_harden_el2_vectors[] = {
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARM64_WORKAROUND_REPEAT_TLBI
|
||||||
|
|
||||||
|
static const struct midr_range arm64_repeat_tlbi_cpus[] = {
|
||||||
|
#ifdef CONFIG_QCOM_FALKOR_ERRATUM_1009
|
||||||
|
MIDR_RANGE(MIDR_QCOM_FALKOR_V1, 0, 0, 0, 0),
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ARM64_ERRATUM_1286807
|
||||||
|
MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 3, 0),
|
||||||
|
#endif
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
const struct arm64_cpu_capabilities arm64_errata[] = {
|
const struct arm64_cpu_capabilities arm64_errata[] = {
|
||||||
#if defined(CONFIG_ARM64_ERRATUM_826319) || \
|
#if defined(CONFIG_ARM64_ERRATUM_826319) || \
|
||||||
defined(CONFIG_ARM64_ERRATUM_827319) || \
|
defined(CONFIG_ARM64_ERRATUM_827319) || \
|
||||||
|
@ -695,11 +709,11 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
|
||||||
.matches = is_kryo_midr,
|
.matches = is_kryo_midr,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_QCOM_FALKOR_ERRATUM_1009
|
#ifdef CONFIG_ARM64_WORKAROUND_REPEAT_TLBI
|
||||||
{
|
{
|
||||||
.desc = "Qualcomm Technologies Falkor erratum 1009",
|
.desc = "Qualcomm erratum 1009, ARM erratum 1286807",
|
||||||
.capability = ARM64_WORKAROUND_REPEAT_TLBI,
|
.capability = ARM64_WORKAROUND_REPEAT_TLBI,
|
||||||
ERRATA_MIDR_REV(MIDR_QCOM_FALKOR_V1, 0, 0),
|
ERRATA_MIDR_RANGE_LIST(arm64_repeat_tlbi_cpus),
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ARM64_ERRATUM_858921
|
#ifdef CONFIG_ARM64_ERRATUM_858921
|
||||||
|
|
|
@ -1333,7 +1333,6 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
||||||
.cpu_enable = cpu_enable_hw_dbm,
|
.cpu_enable = cpu_enable_hw_dbm,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ARM64_SSBD
|
|
||||||
{
|
{
|
||||||
.desc = "CRC32 instructions",
|
.desc = "CRC32 instructions",
|
||||||
.capability = ARM64_HAS_CRC32,
|
.capability = ARM64_HAS_CRC32,
|
||||||
|
@ -1343,6 +1342,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
||||||
.field_pos = ID_AA64ISAR0_CRC32_SHIFT,
|
.field_pos = ID_AA64ISAR0_CRC32_SHIFT,
|
||||||
.min_field_value = 1,
|
.min_field_value = 1,
|
||||||
},
|
},
|
||||||
|
#ifdef CONFIG_ARM64_SSBD
|
||||||
{
|
{
|
||||||
.desc = "Speculative Store Bypassing Safe (SSBS)",
|
.desc = "Speculative Store Bypassing Safe (SSBS)",
|
||||||
.capability = ARM64_SSBS,
|
.capability = ARM64_SSBS,
|
||||||
|
|
|
@ -216,8 +216,6 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
|
||||||
{
|
{
|
||||||
unsigned long return_hooker = (unsigned long)&return_to_handler;
|
unsigned long return_hooker = (unsigned long)&return_to_handler;
|
||||||
unsigned long old;
|
unsigned long old;
|
||||||
struct ftrace_graph_ent trace;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
||||||
return;
|
return;
|
||||||
|
@ -229,18 +227,7 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
|
||||||
*/
|
*/
|
||||||
old = *parent;
|
old = *parent;
|
||||||
|
|
||||||
trace.func = self_addr;
|
if (!function_graph_enter(old, self_addr, frame_pointer, NULL))
|
||||||
trace.depth = current->curr_ret_stack + 1;
|
|
||||||
|
|
||||||
/* Only trace if the calling function expects to */
|
|
||||||
if (!ftrace_graph_entry(&trace))
|
|
||||||
return;
|
|
||||||
|
|
||||||
err = ftrace_push_return_trace(old, self_addr, &trace.depth,
|
|
||||||
frame_pointer, NULL);
|
|
||||||
if (err == -EBUSY)
|
|
||||||
return;
|
|
||||||
else
|
|
||||||
*parent = return_hooker;
|
*parent = return_hooker;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -351,7 +351,8 @@ static void build_epilogue(struct jit_ctx *ctx)
|
||||||
* >0 - successfully JITed a 16-byte eBPF instruction.
|
* >0 - successfully JITed a 16-byte eBPF instruction.
|
||||||
* <0 - failed to JIT.
|
* <0 - failed to JIT.
|
||||||
*/
|
*/
|
||||||
static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
|
static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
|
||||||
|
bool extra_pass)
|
||||||
{
|
{
|
||||||
const u8 code = insn->code;
|
const u8 code = insn->code;
|
||||||
const u8 dst = bpf2a64[insn->dst_reg];
|
const u8 dst = bpf2a64[insn->dst_reg];
|
||||||
|
@ -625,12 +626,19 @@ emit_cond_jmp:
|
||||||
case BPF_JMP | BPF_CALL:
|
case BPF_JMP | BPF_CALL:
|
||||||
{
|
{
|
||||||
const u8 r0 = bpf2a64[BPF_REG_0];
|
const u8 r0 = bpf2a64[BPF_REG_0];
|
||||||
const u64 func = (u64)__bpf_call_base + imm;
|
bool func_addr_fixed;
|
||||||
|
u64 func_addr;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (ctx->prog->is_func)
|
ret = bpf_jit_get_func_addr(ctx->prog, insn, extra_pass,
|
||||||
emit_addr_mov_i64(tmp, func, ctx);
|
&func_addr, &func_addr_fixed);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
if (func_addr_fixed)
|
||||||
|
/* We can use optimized emission here. */
|
||||||
|
emit_a64_mov_i64(tmp, func_addr, ctx);
|
||||||
else
|
else
|
||||||
emit_a64_mov_i64(tmp, func, ctx);
|
emit_addr_mov_i64(tmp, func_addr, ctx);
|
||||||
emit(A64_BLR(tmp), ctx);
|
emit(A64_BLR(tmp), ctx);
|
||||||
emit(A64_MOV(1, r0, A64_R(0)), ctx);
|
emit(A64_MOV(1, r0, A64_R(0)), ctx);
|
||||||
break;
|
break;
|
||||||
|
@ -753,7 +761,7 @@ emit_cond_jmp:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int build_body(struct jit_ctx *ctx)
|
static int build_body(struct jit_ctx *ctx, bool extra_pass)
|
||||||
{
|
{
|
||||||
const struct bpf_prog *prog = ctx->prog;
|
const struct bpf_prog *prog = ctx->prog;
|
||||||
int i;
|
int i;
|
||||||
|
@ -762,7 +770,7 @@ static int build_body(struct jit_ctx *ctx)
|
||||||
const struct bpf_insn *insn = &prog->insnsi[i];
|
const struct bpf_insn *insn = &prog->insnsi[i];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = build_insn(insn, ctx);
|
ret = build_insn(insn, ctx, extra_pass);
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
i++;
|
i++;
|
||||||
if (ctx->image == NULL)
|
if (ctx->image == NULL)
|
||||||
|
@ -858,7 +866,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
|
||||||
/* 1. Initial fake pass to compute ctx->idx. */
|
/* 1. Initial fake pass to compute ctx->idx. */
|
||||||
|
|
||||||
/* Fake pass to fill in ctx->offset. */
|
/* Fake pass to fill in ctx->offset. */
|
||||||
if (build_body(&ctx)) {
|
if (build_body(&ctx, extra_pass)) {
|
||||||
prog = orig_prog;
|
prog = orig_prog;
|
||||||
goto out_off;
|
goto out_off;
|
||||||
}
|
}
|
||||||
|
@ -888,7 +896,7 @@ skip_init_ctx:
|
||||||
|
|
||||||
build_prologue(&ctx, was_classic);
|
build_prologue(&ctx, was_classic);
|
||||||
|
|
||||||
if (build_body(&ctx)) {
|
if (build_body(&ctx, extra_pass)) {
|
||||||
bpf_jit_binary_free(header);
|
bpf_jit_binary_free(header);
|
||||||
prog = orig_prog;
|
prog = orig_prog;
|
||||||
goto out_off;
|
goto out_off;
|
||||||
|
|
|
@ -59,7 +59,9 @@ extern struct node_cpuid_s node_cpuid[NR_CPUS];
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern u8 numa_slit[MAX_NUMNODES * MAX_NUMNODES];
|
extern u8 numa_slit[MAX_NUMNODES * MAX_NUMNODES];
|
||||||
#define node_distance(from,to) (numa_slit[(from) * MAX_NUMNODES + (to)])
|
#define slit_distance(from,to) (numa_slit[(from) * MAX_NUMNODES + (to)])
|
||||||
|
extern int __node_distance(int from, int to);
|
||||||
|
#define node_distance(from,to) __node_distance(from, to)
|
||||||
|
|
||||||
extern int paddr_to_nid(unsigned long paddr);
|
extern int paddr_to_nid(unsigned long paddr);
|
||||||
|
|
||||||
|
|
|
@ -578,8 +578,8 @@ void __init acpi_numa_fixup(void)
|
||||||
if (!slit_table) {
|
if (!slit_table) {
|
||||||
for (i = 0; i < MAX_NUMNODES; i++)
|
for (i = 0; i < MAX_NUMNODES; i++)
|
||||||
for (j = 0; j < MAX_NUMNODES; j++)
|
for (j = 0; j < MAX_NUMNODES; j++)
|
||||||
node_distance(i, j) = i == j ? LOCAL_DISTANCE :
|
slit_distance(i, j) = i == j ?
|
||||||
REMOTE_DISTANCE;
|
LOCAL_DISTANCE : REMOTE_DISTANCE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -592,7 +592,7 @@ void __init acpi_numa_fixup(void)
|
||||||
if (!pxm_bit_test(j))
|
if (!pxm_bit_test(j))
|
||||||
continue;
|
continue;
|
||||||
node_to = pxm_to_node(j);
|
node_to = pxm_to_node(j);
|
||||||
node_distance(node_from, node_to) =
|
slit_distance(node_from, node_to) =
|
||||||
slit_table->entry[i * slit_table->locality_count + j];
|
slit_table->entry[i * slit_table->locality_count + j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,12 @@ struct node_cpuid_s node_cpuid[NR_CPUS] =
|
||||||
*/
|
*/
|
||||||
u8 numa_slit[MAX_NUMNODES * MAX_NUMNODES];
|
u8 numa_slit[MAX_NUMNODES * MAX_NUMNODES];
|
||||||
|
|
||||||
|
int __node_distance(int from, int to)
|
||||||
|
{
|
||||||
|
return slit_distance(from, to);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(__node_distance);
|
||||||
|
|
||||||
/* Identify which cnode a physical address resides on */
|
/* Identify which cnode a physical address resides on */
|
||||||
int
|
int
|
||||||
paddr_to_nid(unsigned long paddr)
|
paddr_to_nid(unsigned long paddr)
|
||||||
|
|
|
@ -22,8 +22,7 @@
|
||||||
void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
|
void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
|
||||||
{
|
{
|
||||||
unsigned long old;
|
unsigned long old;
|
||||||
int faulted, err;
|
int faulted;
|
||||||
struct ftrace_graph_ent trace;
|
|
||||||
unsigned long return_hooker = (unsigned long)
|
unsigned long return_hooker = (unsigned long)
|
||||||
&return_to_handler;
|
&return_to_handler;
|
||||||
|
|
||||||
|
@ -63,18 +62,8 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ftrace_push_return_trace(old, self_addr, &trace.depth, 0, NULL);
|
if (function_graph_enter(old, self_addr, 0, NULL))
|
||||||
if (err == -EBUSY) {
|
|
||||||
*parent = old;
|
*parent = old;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
trace.func = self_addr;
|
|
||||||
/* Only trace if the calling function expects to */
|
|
||||||
if (!ftrace_graph_entry(&trace)) {
|
|
||||||
current->curr_ret_stack--;
|
|
||||||
*parent = old;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
||||||
|
|
||||||
|
|
|
@ -140,6 +140,7 @@ CONFIG_RTC_CLASS=y
|
||||||
CONFIG_RTC_DRV_DS1307=y
|
CONFIG_RTC_DRV_DS1307=y
|
||||||
CONFIG_STAGING=y
|
CONFIG_STAGING=y
|
||||||
CONFIG_OCTEON_ETHERNET=y
|
CONFIG_OCTEON_ETHERNET=y
|
||||||
|
CONFIG_OCTEON_USB=y
|
||||||
# CONFIG_IOMMU_SUPPORT is not set
|
# CONFIG_IOMMU_SUPPORT is not set
|
||||||
CONFIG_RAS=y
|
CONFIG_RAS=y
|
||||||
CONFIG_EXT4_FS=y
|
CONFIG_EXT4_FS=y
|
||||||
|
|
|
@ -73,7 +73,7 @@ static inline unsigned long mips_get_syscall_arg(unsigned long *arg,
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
case 4: case 5: case 6: case 7:
|
case 4: case 5: case 6: case 7:
|
||||||
#ifdef CONFIG_MIPS32_O32
|
#ifdef CONFIG_MIPS32_O32
|
||||||
if (test_thread_flag(TIF_32BIT_REGS))
|
if (test_tsk_thread_flag(task, TIF_32BIT_REGS))
|
||||||
return get_user(*arg, (int *)usp + n);
|
return get_user(*arg, (int *)usp + n);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -322,7 +322,6 @@ void prepare_ftrace_return(unsigned long *parent_ra_addr, unsigned long self_ra,
|
||||||
unsigned long fp)
|
unsigned long fp)
|
||||||
{
|
{
|
||||||
unsigned long old_parent_ra;
|
unsigned long old_parent_ra;
|
||||||
struct ftrace_graph_ent trace;
|
|
||||||
unsigned long return_hooker = (unsigned long)
|
unsigned long return_hooker = (unsigned long)
|
||||||
&return_to_handler;
|
&return_to_handler;
|
||||||
int faulted, insns;
|
int faulted, insns;
|
||||||
|
@ -369,12 +368,6 @@ void prepare_ftrace_return(unsigned long *parent_ra_addr, unsigned long self_ra,
|
||||||
if (unlikely(faulted))
|
if (unlikely(faulted))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (ftrace_push_return_trace(old_parent_ra, self_ra, &trace.depth, fp,
|
|
||||||
NULL) == -EBUSY) {
|
|
||||||
*parent_ra_addr = old_parent_ra;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the recorded ip of the current mcount calling site in the
|
* Get the recorded ip of the current mcount calling site in the
|
||||||
* __mcount_loc section, which will be used to filter the function
|
* __mcount_loc section, which will be used to filter the function
|
||||||
|
@ -382,13 +375,10 @@ void prepare_ftrace_return(unsigned long *parent_ra_addr, unsigned long self_ra,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
insns = core_kernel_text(self_ra) ? 2 : MCOUNT_OFFSET_INSNS + 1;
|
insns = core_kernel_text(self_ra) ? 2 : MCOUNT_OFFSET_INSNS + 1;
|
||||||
trace.func = self_ra - (MCOUNT_INSN_SIZE * insns);
|
self_ra -= (MCOUNT_INSN_SIZE * insns);
|
||||||
|
|
||||||
/* Only trace if the calling function expects to */
|
if (function_graph_enter(old_parent_ra, self_ra, fp, NULL))
|
||||||
if (!ftrace_graph_entry(&trace)) {
|
|
||||||
current->curr_ret_stack--;
|
|
||||||
*parent_ra_addr = old_parent_ra;
|
*parent_ra_addr = old_parent_ra;
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
out:
|
out:
|
||||||
ftrace_graph_stop();
|
ftrace_graph_stop();
|
||||||
|
|
|
@ -794,6 +794,7 @@ static void __init arch_mem_init(char **cmdline_p)
|
||||||
|
|
||||||
/* call board setup routine */
|
/* call board setup routine */
|
||||||
plat_mem_setup();
|
plat_mem_setup();
|
||||||
|
memblock_set_bottom_up(true);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure all kernel memory is in the maps. The "UP" and
|
* Make sure all kernel memory is in the maps. The "UP" and
|
||||||
|
|
|
@ -2260,10 +2260,8 @@ void __init trap_init(void)
|
||||||
unsigned long size = 0x200 + VECTORSPACING*64;
|
unsigned long size = 0x200 + VECTORSPACING*64;
|
||||||
phys_addr_t ebase_pa;
|
phys_addr_t ebase_pa;
|
||||||
|
|
||||||
memblock_set_bottom_up(true);
|
|
||||||
ebase = (unsigned long)
|
ebase = (unsigned long)
|
||||||
memblock_alloc_from(size, 1 << fls(size), 0);
|
memblock_alloc_from(size, 1 << fls(size), 0);
|
||||||
memblock_set_bottom_up(false);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Try to ensure ebase resides in KSeg0 if possible.
|
* Try to ensure ebase resides in KSeg0 if possible.
|
||||||
|
@ -2307,6 +2305,7 @@ void __init trap_init(void)
|
||||||
if (board_ebase_setup)
|
if (board_ebase_setup)
|
||||||
board_ebase_setup();
|
board_ebase_setup();
|
||||||
per_cpu_trap_init(true);
|
per_cpu_trap_init(true);
|
||||||
|
memblock_set_bottom_up(false);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy the generic exception handlers to their final destination.
|
* Copy the generic exception handlers to their final destination.
|
||||||
|
|
|
@ -231,6 +231,8 @@ static __init void prom_meminit(void)
|
||||||
cpumask_clear(&__node_data[(node)]->cpumask);
|
cpumask_clear(&__node_data[(node)]->cpumask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
max_low_pfn = PHYS_PFN(memblock_end_of_DRAM());
|
||||||
|
|
||||||
for (cpu = 0; cpu < loongson_sysconf.nr_cpus; cpu++) {
|
for (cpu = 0; cpu < loongson_sysconf.nr_cpus; cpu++) {
|
||||||
node = cpu / loongson_sysconf.cores_per_node;
|
node = cpu / loongson_sysconf.cores_per_node;
|
||||||
if (node >= num_online_nodes())
|
if (node >= num_online_nodes())
|
||||||
|
@ -248,19 +250,9 @@ static __init void prom_meminit(void)
|
||||||
|
|
||||||
void __init paging_init(void)
|
void __init paging_init(void)
|
||||||
{
|
{
|
||||||
unsigned node;
|
|
||||||
unsigned long zones_size[MAX_NR_ZONES] = {0, };
|
unsigned long zones_size[MAX_NR_ZONES] = {0, };
|
||||||
|
|
||||||
pagetable_init();
|
pagetable_init();
|
||||||
|
|
||||||
for_each_online_node(node) {
|
|
||||||
unsigned long start_pfn, end_pfn;
|
|
||||||
|
|
||||||
get_pfn_range_for_nid(node, &start_pfn, &end_pfn);
|
|
||||||
|
|
||||||
if (end_pfn > max_low_pfn)
|
|
||||||
max_low_pfn = end_pfn;
|
|
||||||
}
|
|
||||||
#ifdef CONFIG_ZONE_DMA32
|
#ifdef CONFIG_ZONE_DMA32
|
||||||
zones_size[ZONE_DMA32] = MAX_DMA32_PFN;
|
zones_size[ZONE_DMA32] = MAX_DMA32_PFN;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -84,7 +84,7 @@ static struct rt2880_pmx_func pcie_rst_grp[] = {
|
||||||
};
|
};
|
||||||
static struct rt2880_pmx_func nd_sd_grp[] = {
|
static struct rt2880_pmx_func nd_sd_grp[] = {
|
||||||
FUNC("nand", MT7620_GPIO_MODE_NAND, 45, 15),
|
FUNC("nand", MT7620_GPIO_MODE_NAND, 45, 15),
|
||||||
FUNC("sd", MT7620_GPIO_MODE_SD, 45, 15)
|
FUNC("sd", MT7620_GPIO_MODE_SD, 47, 13)
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct rt2880_pmx_group mt7620a_pinmux_data[] = {
|
static struct rt2880_pmx_group mt7620a_pinmux_data[] = {
|
||||||
|
|
|
@ -435,6 +435,7 @@ void __init prom_meminit(void)
|
||||||
|
|
||||||
mlreset();
|
mlreset();
|
||||||
szmem();
|
szmem();
|
||||||
|
max_low_pfn = PHYS_PFN(memblock_end_of_DRAM());
|
||||||
|
|
||||||
for (node = 0; node < MAX_COMPACT_NODES; node++) {
|
for (node = 0; node < MAX_COMPACT_NODES; node++) {
|
||||||
if (node_online(node)) {
|
if (node_online(node)) {
|
||||||
|
@ -455,18 +456,8 @@ extern void setup_zero_pages(void);
|
||||||
void __init paging_init(void)
|
void __init paging_init(void)
|
||||||
{
|
{
|
||||||
unsigned long zones_size[MAX_NR_ZONES] = {0, };
|
unsigned long zones_size[MAX_NR_ZONES] = {0, };
|
||||||
unsigned node;
|
|
||||||
|
|
||||||
pagetable_init();
|
pagetable_init();
|
||||||
|
|
||||||
for_each_online_node(node) {
|
|
||||||
unsigned long start_pfn, end_pfn;
|
|
||||||
|
|
||||||
get_pfn_range_for_nid(node, &start_pfn, &end_pfn);
|
|
||||||
|
|
||||||
if (end_pfn > max_low_pfn)
|
|
||||||
max_low_pfn = end_pfn;
|
|
||||||
}
|
|
||||||
zones_size[ZONE_NORMAL] = max_low_pfn;
|
zones_size[ZONE_NORMAL] = max_low_pfn;
|
||||||
free_area_init_nodes(zones_size);
|
free_area_init_nodes(zones_size);
|
||||||
}
|
}
|
||||||
|
|
|
@ -211,28 +211,14 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
|
||||||
unsigned long frame_pointer)
|
unsigned long frame_pointer)
|
||||||
{
|
{
|
||||||
unsigned long return_hooker = (unsigned long)&return_to_handler;
|
unsigned long return_hooker = (unsigned long)&return_to_handler;
|
||||||
struct ftrace_graph_ent trace;
|
|
||||||
unsigned long old;
|
unsigned long old;
|
||||||
int err;
|
|
||||||
|
|
||||||
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
old = *parent;
|
old = *parent;
|
||||||
|
|
||||||
trace.func = self_addr;
|
if (!function_graph_enter(old, self_addr, frame_pointer, NULL))
|
||||||
trace.depth = current->curr_ret_stack + 1;
|
|
||||||
|
|
||||||
/* Only trace if the calling function expects to */
|
|
||||||
if (!ftrace_graph_entry(&trace))
|
|
||||||
return;
|
|
||||||
|
|
||||||
err = ftrace_push_return_trace(old, self_addr, &trace.depth,
|
|
||||||
frame_pointer, NULL);
|
|
||||||
|
|
||||||
if (err == -EBUSY)
|
|
||||||
return;
|
|
||||||
|
|
||||||
*parent = return_hooker;
|
*parent = return_hooker;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,6 @@ static void __hot prepare_ftrace_return(unsigned long *parent,
|
||||||
unsigned long self_addr)
|
unsigned long self_addr)
|
||||||
{
|
{
|
||||||
unsigned long old;
|
unsigned long old;
|
||||||
struct ftrace_graph_ent trace;
|
|
||||||
extern int parisc_return_to_handler;
|
extern int parisc_return_to_handler;
|
||||||
|
|
||||||
if (unlikely(ftrace_graph_is_dead()))
|
if (unlikely(ftrace_graph_is_dead()))
|
||||||
|
@ -41,17 +40,7 @@ static void __hot prepare_ftrace_return(unsigned long *parent,
|
||||||
|
|
||||||
old = *parent;
|
old = *parent;
|
||||||
|
|
||||||
trace.func = self_addr;
|
if (!function_graph_enter(old, self_addr, 0, NULL))
|
||||||
trace.depth = current->curr_ret_stack + 1;
|
|
||||||
|
|
||||||
/* Only trace if the calling function expects to */
|
|
||||||
if (!ftrace_graph_entry(&trace))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (ftrace_push_return_trace(old, self_addr, &trace.depth,
|
|
||||||
0, NULL) == -EBUSY)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* activate parisc_return_to_handler() as return point */
|
/* activate parisc_return_to_handler() as return point */
|
||||||
*parent = (unsigned long) &parisc_return_to_handler;
|
*parent = (unsigned long) &parisc_return_to_handler;
|
||||||
}
|
}
|
||||||
|
|
|
@ -950,7 +950,6 @@ int ftrace_disable_ftrace_graph_caller(void)
|
||||||
*/
|
*/
|
||||||
unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip)
|
unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip)
|
||||||
{
|
{
|
||||||
struct ftrace_graph_ent trace;
|
|
||||||
unsigned long return_hooker;
|
unsigned long return_hooker;
|
||||||
|
|
||||||
if (unlikely(ftrace_graph_is_dead()))
|
if (unlikely(ftrace_graph_is_dead()))
|
||||||
|
@ -961,17 +960,7 @@ unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip)
|
||||||
|
|
||||||
return_hooker = ppc_function_entry(return_to_handler);
|
return_hooker = ppc_function_entry(return_to_handler);
|
||||||
|
|
||||||
trace.func = ip;
|
if (!function_graph_enter(parent, ip, 0, NULL))
|
||||||
trace.depth = current->curr_ret_stack + 1;
|
|
||||||
|
|
||||||
/* Only trace if the calling function expects to */
|
|
||||||
if (!ftrace_graph_entry(&trace))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (ftrace_push_return_trace(parent, ip, &trace.depth, 0,
|
|
||||||
NULL) == -EBUSY)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
parent = return_hooker;
|
parent = return_hooker;
|
||||||
out:
|
out:
|
||||||
return parent;
|
return parent;
|
||||||
|
|
|
@ -983,6 +983,7 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)
|
||||||
ret = kvmhv_enter_nested_guest(vcpu);
|
ret = kvmhv_enter_nested_guest(vcpu);
|
||||||
if (ret == H_INTERRUPT) {
|
if (ret == H_INTERRUPT) {
|
||||||
kvmppc_set_gpr(vcpu, 3, 0);
|
kvmppc_set_gpr(vcpu, 3, 0);
|
||||||
|
vcpu->arch.hcall_needed = 0;
|
||||||
return -EINTR;
|
return -EINTR;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -166,7 +166,33 @@ static void bpf_jit_build_epilogue(u32 *image, struct codegen_context *ctx)
|
||||||
PPC_BLR();
|
PPC_BLR();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bpf_jit_emit_func_call(u32 *image, struct codegen_context *ctx, u64 func)
|
static void bpf_jit_emit_func_call_hlp(u32 *image, struct codegen_context *ctx,
|
||||||
|
u64 func)
|
||||||
|
{
|
||||||
|
#ifdef PPC64_ELF_ABI_v1
|
||||||
|
/* func points to the function descriptor */
|
||||||
|
PPC_LI64(b2p[TMP_REG_2], func);
|
||||||
|
/* Load actual entry point from function descriptor */
|
||||||
|
PPC_BPF_LL(b2p[TMP_REG_1], b2p[TMP_REG_2], 0);
|
||||||
|
/* ... and move it to LR */
|
||||||
|
PPC_MTLR(b2p[TMP_REG_1]);
|
||||||
|
/*
|
||||||
|
* Load TOC from function descriptor at offset 8.
|
||||||
|
* We can clobber r2 since we get called through a
|
||||||
|
* function pointer (so caller will save/restore r2)
|
||||||
|
* and since we don't use a TOC ourself.
|
||||||
|
*/
|
||||||
|
PPC_BPF_LL(2, b2p[TMP_REG_2], 8);
|
||||||
|
#else
|
||||||
|
/* We can clobber r12 */
|
||||||
|
PPC_FUNC_ADDR(12, func);
|
||||||
|
PPC_MTLR(12);
|
||||||
|
#endif
|
||||||
|
PPC_BLRL();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bpf_jit_emit_func_call_rel(u32 *image, struct codegen_context *ctx,
|
||||||
|
u64 func)
|
||||||
{
|
{
|
||||||
unsigned int i, ctx_idx = ctx->idx;
|
unsigned int i, ctx_idx = ctx->idx;
|
||||||
|
|
||||||
|
@ -273,7 +299,7 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
|
||||||
{
|
{
|
||||||
const struct bpf_insn *insn = fp->insnsi;
|
const struct bpf_insn *insn = fp->insnsi;
|
||||||
int flen = fp->len;
|
int flen = fp->len;
|
||||||
int i;
|
int i, ret;
|
||||||
|
|
||||||
/* Start of epilogue code - will only be valid 2nd pass onwards */
|
/* Start of epilogue code - will only be valid 2nd pass onwards */
|
||||||
u32 exit_addr = addrs[flen];
|
u32 exit_addr = addrs[flen];
|
||||||
|
@ -284,8 +310,9 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
|
||||||
u32 src_reg = b2p[insn[i].src_reg];
|
u32 src_reg = b2p[insn[i].src_reg];
|
||||||
s16 off = insn[i].off;
|
s16 off = insn[i].off;
|
||||||
s32 imm = insn[i].imm;
|
s32 imm = insn[i].imm;
|
||||||
|
bool func_addr_fixed;
|
||||||
|
u64 func_addr;
|
||||||
u64 imm64;
|
u64 imm64;
|
||||||
u8 *func;
|
|
||||||
u32 true_cond;
|
u32 true_cond;
|
||||||
u32 tmp_idx;
|
u32 tmp_idx;
|
||||||
|
|
||||||
|
@ -711,23 +738,15 @@ emit_clear:
|
||||||
case BPF_JMP | BPF_CALL:
|
case BPF_JMP | BPF_CALL:
|
||||||
ctx->seen |= SEEN_FUNC;
|
ctx->seen |= SEEN_FUNC;
|
||||||
|
|
||||||
/* bpf function call */
|
ret = bpf_jit_get_func_addr(fp, &insn[i], extra_pass,
|
||||||
if (insn[i].src_reg == BPF_PSEUDO_CALL)
|
&func_addr, &func_addr_fixed);
|
||||||
if (!extra_pass)
|
if (ret < 0)
|
||||||
func = NULL;
|
return ret;
|
||||||
else if (fp->aux->func && off < fp->aux->func_cnt)
|
|
||||||
/* use the subprog id from the off
|
|
||||||
* field to lookup the callee address
|
|
||||||
*/
|
|
||||||
func = (u8 *) fp->aux->func[off]->bpf_func;
|
|
||||||
else
|
|
||||||
return -EINVAL;
|
|
||||||
/* kernel helper call */
|
|
||||||
else
|
|
||||||
func = (u8 *) __bpf_call_base + imm;
|
|
||||||
|
|
||||||
bpf_jit_emit_func_call(image, ctx, (u64)func);
|
|
||||||
|
|
||||||
|
if (func_addr_fixed)
|
||||||
|
bpf_jit_emit_func_call_hlp(image, ctx, func_addr);
|
||||||
|
else
|
||||||
|
bpf_jit_emit_func_call_rel(image, ctx, func_addr);
|
||||||
/* move return value from r3 to BPF_REG_0 */
|
/* move return value from r3 to BPF_REG_0 */
|
||||||
PPC_MR(b2p[BPF_REG_0], 3);
|
PPC_MR(b2p[BPF_REG_0], 3);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -71,6 +71,10 @@ KBUILD_CFLAGS += $(call cc-option,-mstrict-align)
|
||||||
# arch specific predefines for sparse
|
# arch specific predefines for sparse
|
||||||
CHECKFLAGS += -D__riscv -D__riscv_xlen=$(BITS)
|
CHECKFLAGS += -D__riscv -D__riscv_xlen=$(BITS)
|
||||||
|
|
||||||
|
# Default target when executing plain make
|
||||||
|
boot := arch/riscv/boot
|
||||||
|
KBUILD_IMAGE := $(boot)/Image.gz
|
||||||
|
|
||||||
head-y := arch/riscv/kernel/head.o
|
head-y := arch/riscv/kernel/head.o
|
||||||
|
|
||||||
core-y += arch/riscv/kernel/ arch/riscv/mm/
|
core-y += arch/riscv/kernel/ arch/riscv/mm/
|
||||||
|
@ -81,4 +85,13 @@ PHONY += vdso_install
|
||||||
vdso_install:
|
vdso_install:
|
||||||
$(Q)$(MAKE) $(build)=arch/riscv/kernel/vdso $@
|
$(Q)$(MAKE) $(build)=arch/riscv/kernel/vdso $@
|
||||||
|
|
||||||
all: vmlinux
|
all: Image.gz
|
||||||
|
|
||||||
|
Image: vmlinux
|
||||||
|
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||||
|
|
||||||
|
Image.%: Image
|
||||||
|
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||||
|
|
||||||
|
zinstall install:
|
||||||
|
$(Q)$(MAKE) $(build)=$(boot) $@
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Image
|
||||||
|
Image.gz
|
|
@ -0,0 +1,33 @@
|
||||||
|
#
|
||||||
|
# arch/riscv/boot/Makefile
|
||||||
|
#
|
||||||
|
# This file is included by the global makefile so that you can add your own
|
||||||
|
# architecture-specific flags and dependencies.
|
||||||
|
#
|
||||||
|
# This file is subject to the terms and conditions of the GNU General Public
|
||||||
|
# License. See the file "COPYING" in the main directory of this archive
|
||||||
|
# for more details.
|
||||||
|
#
|
||||||
|
# Copyright (C) 2018, Anup Patel.
|
||||||
|
# Author: Anup Patel <anup@brainfault.org>
|
||||||
|
#
|
||||||
|
# Based on the ia64 and arm64 boot/Makefile.
|
||||||
|
#
|
||||||
|
|
||||||
|
OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S
|
||||||
|
|
||||||
|
targets := Image
|
||||||
|
|
||||||
|
$(obj)/Image: vmlinux FORCE
|
||||||
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
|
$(obj)/Image.gz: $(obj)/Image FORCE
|
||||||
|
$(call if_changed,gzip)
|
||||||
|
|
||||||
|
install:
|
||||||
|
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \
|
||||||
|
$(obj)/Image System.map "$(INSTALL_PATH)"
|
||||||
|
|
||||||
|
zinstall:
|
||||||
|
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \
|
||||||
|
$(obj)/Image.gz System.map "$(INSTALL_PATH)"
|
|
@ -0,0 +1,60 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# arch/riscv/boot/install.sh
|
||||||
|
#
|
||||||
|
# This file is subject to the terms and conditions of the GNU General Public
|
||||||
|
# License. See the file "COPYING" in the main directory of this archive
|
||||||
|
# for more details.
|
||||||
|
#
|
||||||
|
# Copyright (C) 1995 by Linus Torvalds
|
||||||
|
#
|
||||||
|
# Adapted from code in arch/i386/boot/Makefile by H. Peter Anvin
|
||||||
|
# Adapted from code in arch/i386/boot/install.sh by Russell King
|
||||||
|
#
|
||||||
|
# "make install" script for the RISC-V Linux port
|
||||||
|
#
|
||||||
|
# Arguments:
|
||||||
|
# $1 - kernel version
|
||||||
|
# $2 - kernel image file
|
||||||
|
# $3 - kernel map file
|
||||||
|
# $4 - default install path (blank if root directory)
|
||||||
|
#
|
||||||
|
|
||||||
|
verify () {
|
||||||
|
if [ ! -f "$1" ]; then
|
||||||
|
echo "" 1>&2
|
||||||
|
echo " *** Missing file: $1" 1>&2
|
||||||
|
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||||
|
echo "" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Make sure the files actually exist
|
||||||
|
verify "$2"
|
||||||
|
verify "$3"
|
||||||
|
|
||||||
|
# User may have a custom install script
|
||||||
|
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||||
|
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||||
|
|
||||||
|
if [ "$(basename $2)" = "Image.gz" ]; then
|
||||||
|
# Compressed install
|
||||||
|
echo "Installing compressed kernel"
|
||||||
|
base=vmlinuz
|
||||||
|
else
|
||||||
|
# Normal install
|
||||||
|
echo "Installing normal kernel"
|
||||||
|
base=vmlinux
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f $4/$base-$1 ]; then
|
||||||
|
mv $4/$base-$1 $4/$base-$1.old
|
||||||
|
fi
|
||||||
|
cat $2 > $4/$base-$1
|
||||||
|
|
||||||
|
# Install system map file
|
||||||
|
if [ -f $4/System.map-$1 ]; then
|
||||||
|
mv $4/System.map-$1 $4/System.map-$1.old
|
||||||
|
fi
|
||||||
|
cp $3 $4/System.map-$1
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
#define MODULE_ARCH_VERMAGIC "riscv"
|
#define MODULE_ARCH_VERMAGIC "riscv"
|
||||||
|
|
||||||
|
struct module;
|
||||||
u64 module_emit_got_entry(struct module *mod, u64 val);
|
u64 module_emit_got_entry(struct module *mod, u64 val);
|
||||||
u64 module_emit_plt_entry(struct module *mod, u64 val);
|
u64 module_emit_plt_entry(struct module *mod, u64 val);
|
||||||
|
|
||||||
|
|
|
@ -400,13 +400,13 @@ extern unsigned long __must_check __asm_copy_from_user(void *to,
|
||||||
static inline unsigned long
|
static inline unsigned long
|
||||||
raw_copy_from_user(void *to, const void __user *from, unsigned long n)
|
raw_copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||||
{
|
{
|
||||||
return __asm_copy_to_user(to, from, n);
|
return __asm_copy_from_user(to, from, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long
|
static inline unsigned long
|
||||||
raw_copy_to_user(void __user *to, const void *from, unsigned long n)
|
raw_copy_to_user(void __user *to, const void *from, unsigned long n)
|
||||||
{
|
{
|
||||||
return __asm_copy_from_user(to, from, n);
|
return __asm_copy_to_user(to, from, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern long strncpy_from_user(char *dest, const char __user *src, long count);
|
extern long strncpy_from_user(char *dest, const char __user *src, long count);
|
||||||
|
|
|
@ -13,10 +13,9 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There is explicitly no include guard here because this file is expected to
|
* There is explicitly no include guard here because this file is expected to
|
||||||
* be included multiple times. See uapi/asm/syscalls.h for more info.
|
* be included multiple times.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define __ARCH_WANT_NEW_STAT
|
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
|
|
||||||
#include <uapi/asm/unistd.h>
|
#include <uapi/asm/unistd.h>
|
||||||
#include <uapi/asm/syscalls.h>
|
|
||||||
|
|
|
@ -1,13 +1,25 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2017-2018 SiFive
|
* Copyright (C) 2018 David Abdurachmanov <david.abdurachmanov@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
#ifdef __LP64__
|
||||||
* There is explicitly no include guard here because this file is expected to
|
#define __ARCH_WANT_NEW_STAT
|
||||||
* be included multiple times in order to define the syscall macros via
|
#endif /* __LP64__ */
|
||||||
* __SYSCALL.
|
|
||||||
*/
|
#include <asm-generic/unistd.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allows the instruction cache to be flushed from userspace. Despite RISC-V
|
* Allows the instruction cache to be flushed from userspace. Despite RISC-V
|
|
@ -64,7 +64,7 @@ int riscv_of_processor_hartid(struct device_node *node)
|
||||||
|
|
||||||
static void print_isa(struct seq_file *f, const char *orig_isa)
|
static void print_isa(struct seq_file *f, const char *orig_isa)
|
||||||
{
|
{
|
||||||
static const char *ext = "mafdc";
|
static const char *ext = "mafdcsu";
|
||||||
const char *isa = orig_isa;
|
const char *isa = orig_isa;
|
||||||
const char *e;
|
const char *e;
|
||||||
|
|
||||||
|
@ -88,11 +88,14 @@ static void print_isa(struct seq_file *f, const char *orig_isa)
|
||||||
/*
|
/*
|
||||||
* Check the rest of the ISA string for valid extensions, printing those
|
* Check the rest of the ISA string for valid extensions, printing those
|
||||||
* we find. RISC-V ISA strings define an order, so we only print the
|
* we find. RISC-V ISA strings define an order, so we only print the
|
||||||
* extension bits when they're in order.
|
* extension bits when they're in order. Hide the supervisor (S)
|
||||||
|
* extension from userspace as it's not accessible from there.
|
||||||
*/
|
*/
|
||||||
for (e = ext; *e != '\0'; ++e) {
|
for (e = ext; *e != '\0'; ++e) {
|
||||||
if (isa[0] == e[0]) {
|
if (isa[0] == e[0]) {
|
||||||
|
if (isa[0] != 's')
|
||||||
seq_write(f, isa, 1);
|
seq_write(f, isa, 1);
|
||||||
|
|
||||||
isa++;
|
isa++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,7 +132,6 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
|
||||||
{
|
{
|
||||||
unsigned long return_hooker = (unsigned long)&return_to_handler;
|
unsigned long return_hooker = (unsigned long)&return_to_handler;
|
||||||
unsigned long old;
|
unsigned long old;
|
||||||
struct ftrace_graph_ent trace;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
||||||
|
@ -144,16 +143,7 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
|
||||||
*/
|
*/
|
||||||
old = *parent;
|
old = *parent;
|
||||||
|
|
||||||
trace.func = self_addr;
|
if (function_graph_enter(old, self_addr, frame_pointer, parent))
|
||||||
trace.depth = current->curr_ret_stack + 1;
|
|
||||||
|
|
||||||
if (!ftrace_graph_entry(&trace))
|
|
||||||
return;
|
|
||||||
|
|
||||||
err = ftrace_push_return_trace(old, self_addr, &trace.depth,
|
|
||||||
frame_pointer, parent);
|
|
||||||
if (err == -EBUSY)
|
|
||||||
return;
|
|
||||||
*parent = return_hooker;
|
*parent = return_hooker;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,16 @@ ENTRY(_start)
|
||||||
amoadd.w a3, a2, (a3)
|
amoadd.w a3, a2, (a3)
|
||||||
bnez a3, .Lsecondary_start
|
bnez a3, .Lsecondary_start
|
||||||
|
|
||||||
|
/* Clear BSS for flat non-ELF images */
|
||||||
|
la a3, __bss_start
|
||||||
|
la a4, __bss_stop
|
||||||
|
ble a4, a3, clear_bss_done
|
||||||
|
clear_bss:
|
||||||
|
REG_S zero, (a3)
|
||||||
|
add a3, a3, RISCV_SZPTR
|
||||||
|
blt a3, a4, clear_bss
|
||||||
|
clear_bss_done:
|
||||||
|
|
||||||
/* Save hart ID and DTB physical address */
|
/* Save hart ID and DTB physical address */
|
||||||
mv s0, a0
|
mv s0, a0
|
||||||
mv s1, a1
|
mv s1, a1
|
||||||
|
|
|
@ -74,7 +74,7 @@ SECTIONS
|
||||||
*(.sbss*)
|
*(.sbss*)
|
||||||
}
|
}
|
||||||
|
|
||||||
BSS_SECTION(0, 0, 0)
|
BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0)
|
||||||
|
|
||||||
EXCEPTION_TABLE(0x10)
|
EXCEPTION_TABLE(0x10)
|
||||||
NOTES
|
NOTES
|
||||||
|
|
|
@ -203,21 +203,12 @@ device_initcall(ftrace_plt_init);
|
||||||
*/
|
*/
|
||||||
unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip)
|
unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip)
|
||||||
{
|
{
|
||||||
struct ftrace_graph_ent trace;
|
|
||||||
|
|
||||||
if (unlikely(ftrace_graph_is_dead()))
|
if (unlikely(ftrace_graph_is_dead()))
|
||||||
goto out;
|
goto out;
|
||||||
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
||||||
goto out;
|
goto out;
|
||||||
ip -= MCOUNT_INSN_SIZE;
|
ip -= MCOUNT_INSN_SIZE;
|
||||||
trace.func = ip;
|
if (!function_graph_enter(parent, ip, 0, NULL))
|
||||||
trace.depth = current->curr_ret_stack + 1;
|
|
||||||
/* Only trace if the calling function expects to. */
|
|
||||||
if (!ftrace_graph_entry(&trace))
|
|
||||||
goto out;
|
|
||||||
if (ftrace_push_return_trace(parent, ip, &trace.depth, 0,
|
|
||||||
NULL) == -EBUSY)
|
|
||||||
goto out;
|
|
||||||
parent = (unsigned long) return_to_handler;
|
parent = (unsigned long) return_to_handler;
|
||||||
out:
|
out:
|
||||||
return parent;
|
return parent;
|
||||||
|
|
|
@ -346,6 +346,8 @@ static int __hw_perf_event_init(struct perf_event *event)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PERF_TYPE_HARDWARE:
|
case PERF_TYPE_HARDWARE:
|
||||||
|
if (is_sampling_event(event)) /* No sampling support */
|
||||||
|
return -ENOENT;
|
||||||
ev = attr->config;
|
ev = attr->config;
|
||||||
/* Count user space (problem-state) only */
|
/* Count user space (problem-state) only */
|
||||||
if (!attr->exclude_user && attr->exclude_kernel) {
|
if (!attr->exclude_user && attr->exclude_kernel) {
|
||||||
|
|
|
@ -131,6 +131,7 @@ void crst_table_downgrade(struct mm_struct *mm)
|
||||||
}
|
}
|
||||||
|
|
||||||
pgd = mm->pgd;
|
pgd = mm->pgd;
|
||||||
|
mm_dec_nr_pmds(mm);
|
||||||
mm->pgd = (pgd_t *) (pgd_val(*pgd) & _REGION_ENTRY_ORIGIN);
|
mm->pgd = (pgd_t *) (pgd_val(*pgd) & _REGION_ENTRY_ORIGIN);
|
||||||
mm->context.asce_limit = _REGION3_SIZE;
|
mm->context.asce_limit = _REGION3_SIZE;
|
||||||
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
||||||
|
|
|
@ -321,8 +321,7 @@ int ftrace_disable_ftrace_graph_caller(void)
|
||||||
void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
|
void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
|
||||||
{
|
{
|
||||||
unsigned long old;
|
unsigned long old;
|
||||||
int faulted, err;
|
int faulted;
|
||||||
struct ftrace_graph_ent trace;
|
|
||||||
unsigned long return_hooker = (unsigned long)&return_to_handler;
|
unsigned long return_hooker = (unsigned long)&return_to_handler;
|
||||||
|
|
||||||
if (unlikely(ftrace_graph_is_dead()))
|
if (unlikely(ftrace_graph_is_dead()))
|
||||||
|
@ -365,18 +364,7 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ftrace_push_return_trace(old, self_addr, &trace.depth, 0, NULL);
|
if (function_graph_enter(old, self_addr, 0, NULL))
|
||||||
if (err == -EBUSY) {
|
|
||||||
__raw_writel(old, parent);
|
__raw_writel(old, parent);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
trace.func = self_addr;
|
|
||||||
|
|
||||||
/* Only trace if the calling function expects to */
|
|
||||||
if (!ftrace_graph_entry(&trace)) {
|
|
||||||
current->curr_ret_stack--;
|
|
||||||
__raw_writel(old, parent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
||||||
|
|
|
@ -126,20 +126,11 @@ unsigned long prepare_ftrace_return(unsigned long parent,
|
||||||
unsigned long frame_pointer)
|
unsigned long frame_pointer)
|
||||||
{
|
{
|
||||||
unsigned long return_hooker = (unsigned long) &return_to_handler;
|
unsigned long return_hooker = (unsigned long) &return_to_handler;
|
||||||
struct ftrace_graph_ent trace;
|
|
||||||
|
|
||||||
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
||||||
return parent + 8UL;
|
return parent + 8UL;
|
||||||
|
|
||||||
trace.func = self_addr;
|
if (function_graph_enter(parent, self_addr, frame_pointer, NULL))
|
||||||
trace.depth = current->curr_ret_stack + 1;
|
|
||||||
|
|
||||||
/* Only trace if the calling function expects to */
|
|
||||||
if (!ftrace_graph_entry(&trace))
|
|
||||||
return parent + 8UL;
|
|
||||||
|
|
||||||
if (ftrace_push_return_trace(parent, self_addr, &trace.depth,
|
|
||||||
frame_pointer, NULL) == -EBUSY)
|
|
||||||
return parent + 8UL;
|
return parent + 8UL;
|
||||||
|
|
||||||
return return_hooker;
|
return return_hooker;
|
||||||
|
|
|
@ -791,7 +791,7 @@ static int emit_compare_and_branch(const u8 code, const u8 dst, u8 src,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Just skip the save instruction and the ctx register move. */
|
/* Just skip the save instruction and the ctx register move. */
|
||||||
#define BPF_TAILCALL_PROLOGUE_SKIP 16
|
#define BPF_TAILCALL_PROLOGUE_SKIP 32
|
||||||
#define BPF_TAILCALL_CNT_SP_OFF (STACK_BIAS + 128)
|
#define BPF_TAILCALL_CNT_SP_OFF (STACK_BIAS + 128)
|
||||||
|
|
||||||
static void build_prologue(struct jit_ctx *ctx)
|
static void build_prologue(struct jit_ctx *ctx)
|
||||||
|
@ -824,9 +824,15 @@ static void build_prologue(struct jit_ctx *ctx)
|
||||||
const u8 vfp = bpf2sparc[BPF_REG_FP];
|
const u8 vfp = bpf2sparc[BPF_REG_FP];
|
||||||
|
|
||||||
emit(ADD | IMMED | RS1(FP) | S13(STACK_BIAS) | RD(vfp), ctx);
|
emit(ADD | IMMED | RS1(FP) | S13(STACK_BIAS) | RD(vfp), ctx);
|
||||||
|
} else {
|
||||||
|
emit_nop(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
emit_reg_move(I0, O0, ctx);
|
emit_reg_move(I0, O0, ctx);
|
||||||
|
emit_reg_move(I1, O1, ctx);
|
||||||
|
emit_reg_move(I2, O2, ctx);
|
||||||
|
emit_reg_move(I3, O3, ctx);
|
||||||
|
emit_reg_move(I4, O4, ctx);
|
||||||
/* If you add anything here, adjust BPF_TAILCALL_PROLOGUE_SKIP above. */
|
/* If you add anything here, adjust BPF_TAILCALL_PROLOGUE_SKIP above. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1270,6 +1276,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
|
||||||
const u8 tmp2 = bpf2sparc[TMP_REG_2];
|
const u8 tmp2 = bpf2sparc[TMP_REG_2];
|
||||||
u32 opcode = 0, rs2;
|
u32 opcode = 0, rs2;
|
||||||
|
|
||||||
|
if (insn->dst_reg == BPF_REG_FP)
|
||||||
|
ctx->saw_frame_pointer = true;
|
||||||
|
|
||||||
ctx->tmp_2_used = true;
|
ctx->tmp_2_used = true;
|
||||||
emit_loadimm(imm, tmp2, ctx);
|
emit_loadimm(imm, tmp2, ctx);
|
||||||
|
|
||||||
|
@ -1308,6 +1317,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
|
||||||
const u8 tmp = bpf2sparc[TMP_REG_1];
|
const u8 tmp = bpf2sparc[TMP_REG_1];
|
||||||
u32 opcode = 0, rs2;
|
u32 opcode = 0, rs2;
|
||||||
|
|
||||||
|
if (insn->dst_reg == BPF_REG_FP)
|
||||||
|
ctx->saw_frame_pointer = true;
|
||||||
|
|
||||||
switch (BPF_SIZE(code)) {
|
switch (BPF_SIZE(code)) {
|
||||||
case BPF_W:
|
case BPF_W:
|
||||||
opcode = ST32;
|
opcode = ST32;
|
||||||
|
@ -1340,6 +1352,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
|
||||||
const u8 tmp2 = bpf2sparc[TMP_REG_2];
|
const u8 tmp2 = bpf2sparc[TMP_REG_2];
|
||||||
const u8 tmp3 = bpf2sparc[TMP_REG_3];
|
const u8 tmp3 = bpf2sparc[TMP_REG_3];
|
||||||
|
|
||||||
|
if (insn->dst_reg == BPF_REG_FP)
|
||||||
|
ctx->saw_frame_pointer = true;
|
||||||
|
|
||||||
ctx->tmp_1_used = true;
|
ctx->tmp_1_used = true;
|
||||||
ctx->tmp_2_used = true;
|
ctx->tmp_2_used = true;
|
||||||
ctx->tmp_3_used = true;
|
ctx->tmp_3_used = true;
|
||||||
|
@ -1360,6 +1375,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
|
||||||
const u8 tmp2 = bpf2sparc[TMP_REG_2];
|
const u8 tmp2 = bpf2sparc[TMP_REG_2];
|
||||||
const u8 tmp3 = bpf2sparc[TMP_REG_3];
|
const u8 tmp3 = bpf2sparc[TMP_REG_3];
|
||||||
|
|
||||||
|
if (insn->dst_reg == BPF_REG_FP)
|
||||||
|
ctx->saw_frame_pointer = true;
|
||||||
|
|
||||||
ctx->tmp_1_used = true;
|
ctx->tmp_1_used = true;
|
||||||
ctx->tmp_2_used = true;
|
ctx->tmp_2_used = true;
|
||||||
ctx->tmp_3_used = true;
|
ctx->tmp_3_used = true;
|
||||||
|
@ -1425,12 +1443,12 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
|
||||||
struct bpf_prog *tmp, *orig_prog = prog;
|
struct bpf_prog *tmp, *orig_prog = prog;
|
||||||
struct sparc64_jit_data *jit_data;
|
struct sparc64_jit_data *jit_data;
|
||||||
struct bpf_binary_header *header;
|
struct bpf_binary_header *header;
|
||||||
|
u32 prev_image_size, image_size;
|
||||||
bool tmp_blinded = false;
|
bool tmp_blinded = false;
|
||||||
bool extra_pass = false;
|
bool extra_pass = false;
|
||||||
struct jit_ctx ctx;
|
struct jit_ctx ctx;
|
||||||
u32 image_size;
|
|
||||||
u8 *image_ptr;
|
u8 *image_ptr;
|
||||||
int pass;
|
int pass, i;
|
||||||
|
|
||||||
if (!prog->jit_requested)
|
if (!prog->jit_requested)
|
||||||
return orig_prog;
|
return orig_prog;
|
||||||
|
@ -1461,28 +1479,53 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
|
||||||
header = jit_data->header;
|
header = jit_data->header;
|
||||||
extra_pass = true;
|
extra_pass = true;
|
||||||
image_size = sizeof(u32) * ctx.idx;
|
image_size = sizeof(u32) * ctx.idx;
|
||||||
|
prev_image_size = image_size;
|
||||||
|
pass = 1;
|
||||||
goto skip_init_ctx;
|
goto skip_init_ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&ctx, 0, sizeof(ctx));
|
memset(&ctx, 0, sizeof(ctx));
|
||||||
ctx.prog = prog;
|
ctx.prog = prog;
|
||||||
|
|
||||||
ctx.offset = kcalloc(prog->len, sizeof(unsigned int), GFP_KERNEL);
|
ctx.offset = kmalloc_array(prog->len, sizeof(unsigned int), GFP_KERNEL);
|
||||||
if (ctx.offset == NULL) {
|
if (ctx.offset == NULL) {
|
||||||
prog = orig_prog;
|
prog = orig_prog;
|
||||||
goto out_off;
|
goto out_off;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fake pass to detect features used, and get an accurate assessment
|
/* Longest sequence emitted is for bswap32, 12 instructions. Pre-cook
|
||||||
* of what the final image size will be.
|
* the offset array so that we converge faster.
|
||||||
*/
|
*/
|
||||||
|
for (i = 0; i < prog->len; i++)
|
||||||
|
ctx.offset[i] = i * (12 * 4);
|
||||||
|
|
||||||
|
prev_image_size = ~0U;
|
||||||
|
for (pass = 1; pass < 40; pass++) {
|
||||||
|
ctx.idx = 0;
|
||||||
|
|
||||||
|
build_prologue(&ctx);
|
||||||
if (build_body(&ctx)) {
|
if (build_body(&ctx)) {
|
||||||
prog = orig_prog;
|
prog = orig_prog;
|
||||||
goto out_off;
|
goto out_off;
|
||||||
}
|
}
|
||||||
build_prologue(&ctx);
|
|
||||||
build_epilogue(&ctx);
|
build_epilogue(&ctx);
|
||||||
|
|
||||||
|
if (bpf_jit_enable > 1)
|
||||||
|
pr_info("Pass %d: size = %u, seen = [%c%c%c%c%c%c]\n", pass,
|
||||||
|
ctx.idx * 4,
|
||||||
|
ctx.tmp_1_used ? '1' : ' ',
|
||||||
|
ctx.tmp_2_used ? '2' : ' ',
|
||||||
|
ctx.tmp_3_used ? '3' : ' ',
|
||||||
|
ctx.saw_frame_pointer ? 'F' : ' ',
|
||||||
|
ctx.saw_call ? 'C' : ' ',
|
||||||
|
ctx.saw_tail_call ? 'T' : ' ');
|
||||||
|
|
||||||
|
if (ctx.idx * 4 == prev_image_size)
|
||||||
|
break;
|
||||||
|
prev_image_size = ctx.idx * 4;
|
||||||
|
cond_resched();
|
||||||
|
}
|
||||||
|
|
||||||
/* Now we know the actual image size. */
|
/* Now we know the actual image size. */
|
||||||
image_size = sizeof(u32) * ctx.idx;
|
image_size = sizeof(u32) * ctx.idx;
|
||||||
header = bpf_jit_binary_alloc(image_size, &image_ptr,
|
header = bpf_jit_binary_alloc(image_size, &image_ptr,
|
||||||
|
@ -1494,7 +1537,6 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
|
||||||
|
|
||||||
ctx.image = (u32 *)image_ptr;
|
ctx.image = (u32 *)image_ptr;
|
||||||
skip_init_ctx:
|
skip_init_ctx:
|
||||||
for (pass = 1; pass < 3; pass++) {
|
|
||||||
ctx.idx = 0;
|
ctx.idx = 0;
|
||||||
|
|
||||||
build_prologue(&ctx);
|
build_prologue(&ctx);
|
||||||
|
@ -1507,15 +1549,12 @@ skip_init_ctx:
|
||||||
|
|
||||||
build_epilogue(&ctx);
|
build_epilogue(&ctx);
|
||||||
|
|
||||||
if (bpf_jit_enable > 1)
|
if (ctx.idx * 4 != prev_image_size) {
|
||||||
pr_info("Pass %d: shrink = %d, seen = [%c%c%c%c%c%c]\n", pass,
|
pr_err("bpf_jit: Failed to converge, prev_size=%u size=%d\n",
|
||||||
image_size - (ctx.idx * 4),
|
prev_image_size, ctx.idx * 4);
|
||||||
ctx.tmp_1_used ? '1' : ' ',
|
bpf_jit_binary_free(header);
|
||||||
ctx.tmp_2_used ? '2' : ' ',
|
prog = orig_prog;
|
||||||
ctx.tmp_3_used ? '3' : ' ',
|
goto out_off;
|
||||||
ctx.saw_frame_pointer ? 'F' : ' ',
|
|
||||||
ctx.saw_call ? 'C' : ' ',
|
|
||||||
ctx.saw_tail_call ? 'T' : ' ');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bpf_jit_enable > 1)
|
if (bpf_jit_enable > 1)
|
||||||
|
|
|
@ -444,10 +444,6 @@ config RETPOLINE
|
||||||
branches. Requires a compiler with -mindirect-branch=thunk-extern
|
branches. Requires a compiler with -mindirect-branch=thunk-extern
|
||||||
support for full protection. The kernel may run slower.
|
support for full protection. The kernel may run slower.
|
||||||
|
|
||||||
Without compiler support, at least indirect branches in assembler
|
|
||||||
code are eliminated. Since this includes the syscall entry path,
|
|
||||||
it is not entirely pointless.
|
|
||||||
|
|
||||||
config INTEL_RDT
|
config INTEL_RDT
|
||||||
bool "Intel Resource Director Technology support"
|
bool "Intel Resource Director Technology support"
|
||||||
depends on X86 && CPU_SUP_INTEL
|
depends on X86 && CPU_SUP_INTEL
|
||||||
|
@ -1004,13 +1000,7 @@ config NR_CPUS
|
||||||
to the kernel image.
|
to the kernel image.
|
||||||
|
|
||||||
config SCHED_SMT
|
config SCHED_SMT
|
||||||
bool "SMT (Hyperthreading) scheduler support"
|
def_bool y if SMP
|
||||||
depends on SMP
|
|
||||||
---help---
|
|
||||||
SMT scheduler support improves the CPU scheduler's decision making
|
|
||||||
when dealing with Intel Pentium 4 chips with HyperThreading at a
|
|
||||||
cost of slightly increased overhead in some places. If unsure say
|
|
||||||
N here.
|
|
||||||
|
|
||||||
config SCHED_MC
|
config SCHED_MC
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
|
@ -220,9 +220,10 @@ KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
|
||||||
|
|
||||||
# Avoid indirect branches in kernel to deal with Spectre
|
# Avoid indirect branches in kernel to deal with Spectre
|
||||||
ifdef CONFIG_RETPOLINE
|
ifdef CONFIG_RETPOLINE
|
||||||
ifneq ($(RETPOLINE_CFLAGS),)
|
ifeq ($(RETPOLINE_CFLAGS),)
|
||||||
KBUILD_CFLAGS += $(RETPOLINE_CFLAGS) -DRETPOLINE
|
$(error You are building kernel with non-retpoline compiler, please update your compiler.)
|
||||||
endif
|
endif
|
||||||
|
KBUILD_CFLAGS += $(RETPOLINE_CFLAGS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
archscripts: scripts_basic
|
archscripts: scripts_basic
|
||||||
|
|
|
@ -300,7 +300,7 @@ _start:
|
||||||
# Part 2 of the header, from the old setup.S
|
# Part 2 of the header, from the old setup.S
|
||||||
|
|
||||||
.ascii "HdrS" # header signature
|
.ascii "HdrS" # header signature
|
||||||
.word 0x020e # header version number (>= 0x0105)
|
.word 0x020d # header version number (>= 0x0105)
|
||||||
# or else old loadlin-1.5 will fail)
|
# or else old loadlin-1.5 will fail)
|
||||||
.globl realmode_swtch
|
.globl realmode_swtch
|
||||||
realmode_swtch: .word 0, 0 # default_switch, SETUPSEG
|
realmode_swtch: .word 0, 0 # default_switch, SETUPSEG
|
||||||
|
@ -558,10 +558,6 @@ pref_address: .quad LOAD_PHYSICAL_ADDR # preferred load addr
|
||||||
init_size: .long INIT_SIZE # kernel initialization size
|
init_size: .long INIT_SIZE # kernel initialization size
|
||||||
handover_offset: .long 0 # Filled in by build.c
|
handover_offset: .long 0 # Filled in by build.c
|
||||||
|
|
||||||
acpi_rsdp_addr: .quad 0 # 64-bit physical pointer to the
|
|
||||||
# ACPI RSDP table, added with
|
|
||||||
# version 2.14
|
|
||||||
|
|
||||||
# End of setup header #####################################################
|
# End of setup header #####################################################
|
||||||
|
|
||||||
.section ".entrytext", "ax"
|
.section ".entrytext", "ax"
|
||||||
|
|
|
@ -438,26 +438,6 @@ int x86_setup_perfctr(struct perf_event *event)
|
||||||
if (config == -1LL)
|
if (config == -1LL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/*
|
|
||||||
* Branch tracing:
|
|
||||||
*/
|
|
||||||
if (attr->config == PERF_COUNT_HW_BRANCH_INSTRUCTIONS &&
|
|
||||||
!attr->freq && hwc->sample_period == 1) {
|
|
||||||
/* BTS is not supported by this architecture. */
|
|
||||||
if (!x86_pmu.bts_active)
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
|
|
||||||
/* BTS is currently only allowed for user-mode. */
|
|
||||||
if (!attr->exclude_kernel)
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
|
|
||||||
/* disallow bts if conflicting events are present */
|
|
||||||
if (x86_add_exclusive(x86_lbr_exclusive_lbr))
|
|
||||||
return -EBUSY;
|
|
||||||
|
|
||||||
event->destroy = hw_perf_lbr_event_destroy;
|
|
||||||
}
|
|
||||||
|
|
||||||
hwc->config |= config;
|
hwc->config |= config;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -2306,14 +2306,18 @@ static int handle_pmi_common(struct pt_regs *regs, u64 status)
|
||||||
return handled;
|
return handled;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool disable_counter_freezing;
|
static bool disable_counter_freezing = true;
|
||||||
static int __init intel_perf_counter_freezing_setup(char *s)
|
static int __init intel_perf_counter_freezing_setup(char *s)
|
||||||
{
|
{
|
||||||
disable_counter_freezing = true;
|
bool res;
|
||||||
pr_info("Intel PMU Counter freezing feature disabled\n");
|
|
||||||
|
if (kstrtobool(s, &res))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
disable_counter_freezing = !res;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
__setup("disable_counter_freezing", intel_perf_counter_freezing_setup);
|
__setup("perf_v4_pmi=", intel_perf_counter_freezing_setup);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Simplified handler for Arch Perfmon v4:
|
* Simplified handler for Arch Perfmon v4:
|
||||||
|
@ -2470,16 +2474,7 @@ done:
|
||||||
static struct event_constraint *
|
static struct event_constraint *
|
||||||
intel_bts_constraints(struct perf_event *event)
|
intel_bts_constraints(struct perf_event *event)
|
||||||
{
|
{
|
||||||
struct hw_perf_event *hwc = &event->hw;
|
if (unlikely(intel_pmu_has_bts(event)))
|
||||||
unsigned int hw_event, bts_event;
|
|
||||||
|
|
||||||
if (event->attr.freq)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
hw_event = hwc->config & INTEL_ARCH_EVENT_MASK;
|
|
||||||
bts_event = x86_pmu.event_map(PERF_COUNT_HW_BRANCH_INSTRUCTIONS);
|
|
||||||
|
|
||||||
if (unlikely(hw_event == bts_event && hwc->sample_period == 1))
|
|
||||||
return &bts_constraint;
|
return &bts_constraint;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -3098,10 +3093,51 @@ static unsigned long intel_pmu_large_pebs_flags(struct perf_event *event)
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int intel_pmu_bts_config(struct perf_event *event)
|
||||||
|
{
|
||||||
|
struct perf_event_attr *attr = &event->attr;
|
||||||
|
|
||||||
|
if (unlikely(intel_pmu_has_bts(event))) {
|
||||||
|
/* BTS is not supported by this architecture. */
|
||||||
|
if (!x86_pmu.bts_active)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
/* BTS is currently only allowed for user-mode. */
|
||||||
|
if (!attr->exclude_kernel)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
/* BTS is not allowed for precise events. */
|
||||||
|
if (attr->precise_ip)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
/* disallow bts if conflicting events are present */
|
||||||
|
if (x86_add_exclusive(x86_lbr_exclusive_lbr))
|
||||||
|
return -EBUSY;
|
||||||
|
|
||||||
|
event->destroy = hw_perf_lbr_event_destroy;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int core_pmu_hw_config(struct perf_event *event)
|
||||||
|
{
|
||||||
|
int ret = x86_pmu_hw_config(event);
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return intel_pmu_bts_config(event);
|
||||||
|
}
|
||||||
|
|
||||||
static int intel_pmu_hw_config(struct perf_event *event)
|
static int intel_pmu_hw_config(struct perf_event *event)
|
||||||
{
|
{
|
||||||
int ret = x86_pmu_hw_config(event);
|
int ret = x86_pmu_hw_config(event);
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = intel_pmu_bts_config(event);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -3127,7 +3163,7 @@ static int intel_pmu_hw_config(struct perf_event *event)
|
||||||
/*
|
/*
|
||||||
* BTS is set up earlier in this path, so don't account twice
|
* BTS is set up earlier in this path, so don't account twice
|
||||||
*/
|
*/
|
||||||
if (!intel_pmu_has_bts(event)) {
|
if (!unlikely(intel_pmu_has_bts(event))) {
|
||||||
/* disallow lbr if conflicting events are present */
|
/* disallow lbr if conflicting events are present */
|
||||||
if (x86_add_exclusive(x86_lbr_exclusive_lbr))
|
if (x86_add_exclusive(x86_lbr_exclusive_lbr))
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -3596,7 +3632,7 @@ static __initconst const struct x86_pmu core_pmu = {
|
||||||
.enable_all = core_pmu_enable_all,
|
.enable_all = core_pmu_enable_all,
|
||||||
.enable = core_pmu_enable_event,
|
.enable = core_pmu_enable_event,
|
||||||
.disable = x86_pmu_disable_event,
|
.disable = x86_pmu_disable_event,
|
||||||
.hw_config = x86_pmu_hw_config,
|
.hw_config = core_pmu_hw_config,
|
||||||
.schedule_events = x86_schedule_events,
|
.schedule_events = x86_schedule_events,
|
||||||
.eventsel = MSR_ARCH_PERFMON_EVENTSEL0,
|
.eventsel = MSR_ARCH_PERFMON_EVENTSEL0,
|
||||||
.perfctr = MSR_ARCH_PERFMON_PERFCTR0,
|
.perfctr = MSR_ARCH_PERFMON_PERFCTR0,
|
||||||
|
|
|
@ -859,11 +859,16 @@ static inline int amd_pmu_init(void)
|
||||||
|
|
||||||
static inline bool intel_pmu_has_bts(struct perf_event *event)
|
static inline bool intel_pmu_has_bts(struct perf_event *event)
|
||||||
{
|
{
|
||||||
if (event->attr.config == PERF_COUNT_HW_BRANCH_INSTRUCTIONS &&
|
struct hw_perf_event *hwc = &event->hw;
|
||||||
!event->attr.freq && event->hw.sample_period == 1)
|
unsigned int hw_event, bts_event;
|
||||||
return true;
|
|
||||||
|
|
||||||
|
if (event->attr.freq)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
hw_event = hwc->config & INTEL_ARCH_EVENT_MASK;
|
||||||
|
bts_event = x86_pmu.event_map(PERF_COUNT_HW_BRANCH_INSTRUCTIONS);
|
||||||
|
|
||||||
|
return hw_event == bts_event && hwc->sample_period == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int intel_pmu_save_and_restart(struct perf_event *event);
|
int intel_pmu_save_and_restart(struct perf_event *event);
|
||||||
|
|
|
@ -226,7 +226,7 @@ static inline void copy_fxregs_to_kernel(struct fpu *fpu)
|
||||||
"3: movl $-2,%[err]\n\t" \
|
"3: movl $-2,%[err]\n\t" \
|
||||||
"jmp 2b\n\t" \
|
"jmp 2b\n\t" \
|
||||||
".popsection\n\t" \
|
".popsection\n\t" \
|
||||||
_ASM_EXTABLE_UA(1b, 3b) \
|
_ASM_EXTABLE(1b, 3b) \
|
||||||
: [err] "=r" (err) \
|
: [err] "=r" (err) \
|
||||||
: "D" (st), "m" (*st), "a" (lmask), "d" (hmask) \
|
: "D" (st), "m" (*st), "a" (lmask), "d" (hmask) \
|
||||||
: "memory")
|
: "memory")
|
||||||
|
|
|
@ -1094,7 +1094,8 @@ struct kvm_x86_ops {
|
||||||
bool (*has_wbinvd_exit)(void);
|
bool (*has_wbinvd_exit)(void);
|
||||||
|
|
||||||
u64 (*read_l1_tsc_offset)(struct kvm_vcpu *vcpu);
|
u64 (*read_l1_tsc_offset)(struct kvm_vcpu *vcpu);
|
||||||
void (*write_tsc_offset)(struct kvm_vcpu *vcpu, u64 offset);
|
/* Returns actual tsc_offset set in active VMCS */
|
||||||
|
u64 (*write_l1_tsc_offset)(struct kvm_vcpu *vcpu, u64 offset);
|
||||||
|
|
||||||
void (*get_exit_info)(struct kvm_vcpu *vcpu, u64 *info1, u64 *info2);
|
void (*get_exit_info)(struct kvm_vcpu *vcpu, u64 *info1, u64 *info2);
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,8 @@
|
||||||
|
|
||||||
#define MSR_IA32_SPEC_CTRL 0x00000048 /* Speculation Control */
|
#define MSR_IA32_SPEC_CTRL 0x00000048 /* Speculation Control */
|
||||||
#define SPEC_CTRL_IBRS (1 << 0) /* Indirect Branch Restricted Speculation */
|
#define SPEC_CTRL_IBRS (1 << 0) /* Indirect Branch Restricted Speculation */
|
||||||
#define SPEC_CTRL_STIBP (1 << 1) /* Single Thread Indirect Branch Predictors */
|
#define SPEC_CTRL_STIBP_SHIFT 1 /* Single Thread Indirect Branch Predictor (STIBP) bit */
|
||||||
|
#define SPEC_CTRL_STIBP (1 << SPEC_CTRL_STIBP_SHIFT) /* STIBP mask */
|
||||||
#define SPEC_CTRL_SSBD_SHIFT 2 /* Speculative Store Bypass Disable bit */
|
#define SPEC_CTRL_SSBD_SHIFT 2 /* Speculative Store Bypass Disable bit */
|
||||||
#define SPEC_CTRL_SSBD (1 << SPEC_CTRL_SSBD_SHIFT) /* Speculative Store Bypass Disable */
|
#define SPEC_CTRL_SSBD (1 << SPEC_CTRL_SSBD_SHIFT) /* Speculative Store Bypass Disable */
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
#ifndef _ASM_X86_NOSPEC_BRANCH_H_
|
#ifndef _ASM_X86_NOSPEC_BRANCH_H_
|
||||||
#define _ASM_X86_NOSPEC_BRANCH_H_
|
#define _ASM_X86_NOSPEC_BRANCH_H_
|
||||||
|
|
||||||
|
#include <linux/static_key.h>
|
||||||
|
|
||||||
#include <asm/alternative.h>
|
#include <asm/alternative.h>
|
||||||
#include <asm/alternative-asm.h>
|
#include <asm/alternative-asm.h>
|
||||||
#include <asm/cpufeatures.h>
|
#include <asm/cpufeatures.h>
|
||||||
|
@ -162,11 +164,12 @@
|
||||||
_ASM_PTR " 999b\n\t" \
|
_ASM_PTR " 999b\n\t" \
|
||||||
".popsection\n\t"
|
".popsection\n\t"
|
||||||
|
|
||||||
#if defined(CONFIG_X86_64) && defined(RETPOLINE)
|
#ifdef CONFIG_RETPOLINE
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since the inline asm uses the %V modifier which is only in newer GCC,
|
* Inline asm uses the %V modifier which is only in newer GCC
|
||||||
* the 64-bit one is dependent on RETPOLINE not CONFIG_RETPOLINE.
|
* which is ensured when CONFIG_RETPOLINE is defined.
|
||||||
*/
|
*/
|
||||||
# define CALL_NOSPEC \
|
# define CALL_NOSPEC \
|
||||||
ANNOTATE_NOSPEC_ALTERNATIVE \
|
ANNOTATE_NOSPEC_ALTERNATIVE \
|
||||||
|
@ -181,7 +184,7 @@
|
||||||
X86_FEATURE_RETPOLINE_AMD)
|
X86_FEATURE_RETPOLINE_AMD)
|
||||||
# define THUNK_TARGET(addr) [thunk_target] "r" (addr)
|
# define THUNK_TARGET(addr) [thunk_target] "r" (addr)
|
||||||
|
|
||||||
#elif defined(CONFIG_X86_32) && defined(CONFIG_RETPOLINE)
|
#else /* CONFIG_X86_32 */
|
||||||
/*
|
/*
|
||||||
* For i386 we use the original ret-equivalent retpoline, because
|
* For i386 we use the original ret-equivalent retpoline, because
|
||||||
* otherwise we'll run out of registers. We don't care about CET
|
* otherwise we'll run out of registers. We don't care about CET
|
||||||
|
@ -211,6 +214,7 @@
|
||||||
X86_FEATURE_RETPOLINE_AMD)
|
X86_FEATURE_RETPOLINE_AMD)
|
||||||
|
|
||||||
# define THUNK_TARGET(addr) [thunk_target] "rm" (addr)
|
# define THUNK_TARGET(addr) [thunk_target] "rm" (addr)
|
||||||
|
#endif
|
||||||
#else /* No retpoline for C / inline asm */
|
#else /* No retpoline for C / inline asm */
|
||||||
# define CALL_NOSPEC "call *%[thunk_target]\n"
|
# define CALL_NOSPEC "call *%[thunk_target]\n"
|
||||||
# define THUNK_TARGET(addr) [thunk_target] "rm" (addr)
|
# define THUNK_TARGET(addr) [thunk_target] "rm" (addr)
|
||||||
|
@ -219,13 +223,19 @@
|
||||||
/* The Spectre V2 mitigation variants */
|
/* The Spectre V2 mitigation variants */
|
||||||
enum spectre_v2_mitigation {
|
enum spectre_v2_mitigation {
|
||||||
SPECTRE_V2_NONE,
|
SPECTRE_V2_NONE,
|
||||||
SPECTRE_V2_RETPOLINE_MINIMAL,
|
|
||||||
SPECTRE_V2_RETPOLINE_MINIMAL_AMD,
|
|
||||||
SPECTRE_V2_RETPOLINE_GENERIC,
|
SPECTRE_V2_RETPOLINE_GENERIC,
|
||||||
SPECTRE_V2_RETPOLINE_AMD,
|
SPECTRE_V2_RETPOLINE_AMD,
|
||||||
SPECTRE_V2_IBRS_ENHANCED,
|
SPECTRE_V2_IBRS_ENHANCED,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* The indirect branch speculation control variants */
|
||||||
|
enum spectre_v2_user_mitigation {
|
||||||
|
SPECTRE_V2_USER_NONE,
|
||||||
|
SPECTRE_V2_USER_STRICT,
|
||||||
|
SPECTRE_V2_USER_PRCTL,
|
||||||
|
SPECTRE_V2_USER_SECCOMP,
|
||||||
|
};
|
||||||
|
|
||||||
/* The Speculative Store Bypass disable variants */
|
/* The Speculative Store Bypass disable variants */
|
||||||
enum ssb_mitigation {
|
enum ssb_mitigation {
|
||||||
SPEC_STORE_BYPASS_NONE,
|
SPEC_STORE_BYPASS_NONE,
|
||||||
|
@ -303,6 +313,10 @@ do { \
|
||||||
preempt_enable(); \
|
preempt_enable(); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
DECLARE_STATIC_KEY_FALSE(switch_to_cond_stibp);
|
||||||
|
DECLARE_STATIC_KEY_FALSE(switch_mm_cond_ibpb);
|
||||||
|
DECLARE_STATIC_KEY_FALSE(switch_mm_always_ibpb);
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -53,12 +53,24 @@ static inline u64 ssbd_tif_to_spec_ctrl(u64 tifn)
|
||||||
return (tifn & _TIF_SSBD) >> (TIF_SSBD - SPEC_CTRL_SSBD_SHIFT);
|
return (tifn & _TIF_SSBD) >> (TIF_SSBD - SPEC_CTRL_SSBD_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline u64 stibp_tif_to_spec_ctrl(u64 tifn)
|
||||||
|
{
|
||||||
|
BUILD_BUG_ON(TIF_SPEC_IB < SPEC_CTRL_STIBP_SHIFT);
|
||||||
|
return (tifn & _TIF_SPEC_IB) >> (TIF_SPEC_IB - SPEC_CTRL_STIBP_SHIFT);
|
||||||
|
}
|
||||||
|
|
||||||
static inline unsigned long ssbd_spec_ctrl_to_tif(u64 spec_ctrl)
|
static inline unsigned long ssbd_spec_ctrl_to_tif(u64 spec_ctrl)
|
||||||
{
|
{
|
||||||
BUILD_BUG_ON(TIF_SSBD < SPEC_CTRL_SSBD_SHIFT);
|
BUILD_BUG_ON(TIF_SSBD < SPEC_CTRL_SSBD_SHIFT);
|
||||||
return (spec_ctrl & SPEC_CTRL_SSBD) << (TIF_SSBD - SPEC_CTRL_SSBD_SHIFT);
|
return (spec_ctrl & SPEC_CTRL_SSBD) << (TIF_SSBD - SPEC_CTRL_SSBD_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline unsigned long stibp_spec_ctrl_to_tif(u64 spec_ctrl)
|
||||||
|
{
|
||||||
|
BUILD_BUG_ON(TIF_SPEC_IB < SPEC_CTRL_STIBP_SHIFT);
|
||||||
|
return (spec_ctrl & SPEC_CTRL_STIBP) << (TIF_SPEC_IB - SPEC_CTRL_STIBP_SHIFT);
|
||||||
|
}
|
||||||
|
|
||||||
static inline u64 ssbd_tif_to_amd_ls_cfg(u64 tifn)
|
static inline u64 ssbd_tif_to_amd_ls_cfg(u64 tifn)
|
||||||
{
|
{
|
||||||
return (tifn & _TIF_SSBD) ? x86_amd_ls_cfg_ssbd_mask : 0ULL;
|
return (tifn & _TIF_SSBD) ? x86_amd_ls_cfg_ssbd_mask : 0ULL;
|
||||||
|
@ -70,11 +82,7 @@ extern void speculative_store_bypass_ht_init(void);
|
||||||
static inline void speculative_store_bypass_ht_init(void) { }
|
static inline void speculative_store_bypass_ht_init(void) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void speculative_store_bypass_update(unsigned long tif);
|
extern void speculation_ctrl_update(unsigned long tif);
|
||||||
|
extern void speculation_ctrl_update_current(void);
|
||||||
static inline void speculative_store_bypass_update_current(void)
|
|
||||||
{
|
|
||||||
speculative_store_bypass_update(current_thread_info()->flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -11,9 +11,6 @@ struct task_struct *__switch_to_asm(struct task_struct *prev,
|
||||||
|
|
||||||
__visible struct task_struct *__switch_to(struct task_struct *prev,
|
__visible struct task_struct *__switch_to(struct task_struct *prev,
|
||||||
struct task_struct *next);
|
struct task_struct *next);
|
||||||
struct tss_struct;
|
|
||||||
void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p,
|
|
||||||
struct tss_struct *tss);
|
|
||||||
|
|
||||||
/* This runs runs on the previous thread's stack. */
|
/* This runs runs on the previous thread's stack. */
|
||||||
static inline void prepare_switch_to(struct task_struct *next)
|
static inline void prepare_switch_to(struct task_struct *next)
|
||||||
|
|
|
@ -79,10 +79,12 @@ struct thread_info {
|
||||||
#define TIF_SIGPENDING 2 /* signal pending */
|
#define TIF_SIGPENDING 2 /* signal pending */
|
||||||
#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
|
#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
|
||||||
#define TIF_SINGLESTEP 4 /* reenable singlestep on user return*/
|
#define TIF_SINGLESTEP 4 /* reenable singlestep on user return*/
|
||||||
#define TIF_SSBD 5 /* Reduced data speculation */
|
#define TIF_SSBD 5 /* Speculative store bypass disable */
|
||||||
#define TIF_SYSCALL_EMU 6 /* syscall emulation active */
|
#define TIF_SYSCALL_EMU 6 /* syscall emulation active */
|
||||||
#define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */
|
#define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */
|
||||||
#define TIF_SECCOMP 8 /* secure computing */
|
#define TIF_SECCOMP 8 /* secure computing */
|
||||||
|
#define TIF_SPEC_IB 9 /* Indirect branch speculation mitigation */
|
||||||
|
#define TIF_SPEC_FORCE_UPDATE 10 /* Force speculation MSR update in context switch */
|
||||||
#define TIF_USER_RETURN_NOTIFY 11 /* notify kernel of userspace return */
|
#define TIF_USER_RETURN_NOTIFY 11 /* notify kernel of userspace return */
|
||||||
#define TIF_UPROBE 12 /* breakpointed or singlestepping */
|
#define TIF_UPROBE 12 /* breakpointed or singlestepping */
|
||||||
#define TIF_PATCH_PENDING 13 /* pending live patching update */
|
#define TIF_PATCH_PENDING 13 /* pending live patching update */
|
||||||
|
@ -110,6 +112,8 @@ struct thread_info {
|
||||||
#define _TIF_SYSCALL_EMU (1 << TIF_SYSCALL_EMU)
|
#define _TIF_SYSCALL_EMU (1 << TIF_SYSCALL_EMU)
|
||||||
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
||||||
#define _TIF_SECCOMP (1 << TIF_SECCOMP)
|
#define _TIF_SECCOMP (1 << TIF_SECCOMP)
|
||||||
|
#define _TIF_SPEC_IB (1 << TIF_SPEC_IB)
|
||||||
|
#define _TIF_SPEC_FORCE_UPDATE (1 << TIF_SPEC_FORCE_UPDATE)
|
||||||
#define _TIF_USER_RETURN_NOTIFY (1 << TIF_USER_RETURN_NOTIFY)
|
#define _TIF_USER_RETURN_NOTIFY (1 << TIF_USER_RETURN_NOTIFY)
|
||||||
#define _TIF_UPROBE (1 << TIF_UPROBE)
|
#define _TIF_UPROBE (1 << TIF_UPROBE)
|
||||||
#define _TIF_PATCH_PENDING (1 << TIF_PATCH_PENDING)
|
#define _TIF_PATCH_PENDING (1 << TIF_PATCH_PENDING)
|
||||||
|
@ -145,8 +149,18 @@ struct thread_info {
|
||||||
_TIF_FSCHECK)
|
_TIF_FSCHECK)
|
||||||
|
|
||||||
/* flags to check in __switch_to() */
|
/* flags to check in __switch_to() */
|
||||||
#define _TIF_WORK_CTXSW \
|
#define _TIF_WORK_CTXSW_BASE \
|
||||||
(_TIF_IO_BITMAP|_TIF_NOCPUID|_TIF_NOTSC|_TIF_BLOCKSTEP|_TIF_SSBD)
|
(_TIF_IO_BITMAP|_TIF_NOCPUID|_TIF_NOTSC|_TIF_BLOCKSTEP| \
|
||||||
|
_TIF_SSBD | _TIF_SPEC_FORCE_UPDATE)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Avoid calls to __switch_to_xtra() on UP as STIBP is not evaluated.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
# define _TIF_WORK_CTXSW (_TIF_WORK_CTXSW_BASE | _TIF_SPEC_IB)
|
||||||
|
#else
|
||||||
|
# define _TIF_WORK_CTXSW (_TIF_WORK_CTXSW_BASE)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY)
|
#define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY)
|
||||||
#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW)
|
#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW)
|
||||||
|
|
|
@ -169,10 +169,14 @@ struct tlb_state {
|
||||||
|
|
||||||
#define LOADED_MM_SWITCHING ((struct mm_struct *)1)
|
#define LOADED_MM_SWITCHING ((struct mm_struct *)1)
|
||||||
|
|
||||||
|
/* Last user mm for optimizing IBPB */
|
||||||
|
union {
|
||||||
|
struct mm_struct *last_user_mm;
|
||||||
|
unsigned long last_user_mm_ibpb;
|
||||||
|
};
|
||||||
|
|
||||||
u16 loaded_mm_asid;
|
u16 loaded_mm_asid;
|
||||||
u16 next_asid;
|
u16 next_asid;
|
||||||
/* last user mm's ctx id */
|
|
||||||
u64 last_ctx_id;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can be in one of several states:
|
* We can be in one of several states:
|
||||||
|
|
|
@ -303,6 +303,4 @@ extern void x86_init_noop(void);
|
||||||
extern void x86_init_uint_noop(unsigned int unused);
|
extern void x86_init_uint_noop(unsigned int unused);
|
||||||
extern bool x86_pnpbios_disabled(void);
|
extern bool x86_pnpbios_disabled(void);
|
||||||
|
|
||||||
void x86_verify_bootdata_version(void);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -16,9 +16,6 @@
|
||||||
#define RAMDISK_PROMPT_FLAG 0x8000
|
#define RAMDISK_PROMPT_FLAG 0x8000
|
||||||
#define RAMDISK_LOAD_FLAG 0x4000
|
#define RAMDISK_LOAD_FLAG 0x4000
|
||||||
|
|
||||||
/* version flags */
|
|
||||||
#define VERSION_WRITTEN 0x8000
|
|
||||||
|
|
||||||
/* loadflags */
|
/* loadflags */
|
||||||
#define LOADED_HIGH (1<<0)
|
#define LOADED_HIGH (1<<0)
|
||||||
#define KASLR_FLAG (1<<1)
|
#define KASLR_FLAG (1<<1)
|
||||||
|
@ -89,7 +86,6 @@ struct setup_header {
|
||||||
__u64 pref_address;
|
__u64 pref_address;
|
||||||
__u32 init_size;
|
__u32 init_size;
|
||||||
__u32 handover_offset;
|
__u32 handover_offset;
|
||||||
__u64 acpi_rsdp_addr;
|
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
struct sys_desc_table {
|
struct sys_desc_table {
|
||||||
|
@ -159,7 +155,8 @@ struct boot_params {
|
||||||
__u8 _pad2[4]; /* 0x054 */
|
__u8 _pad2[4]; /* 0x054 */
|
||||||
__u64 tboot_addr; /* 0x058 */
|
__u64 tboot_addr; /* 0x058 */
|
||||||
struct ist_info ist_info; /* 0x060 */
|
struct ist_info ist_info; /* 0x060 */
|
||||||
__u8 _pad3[16]; /* 0x070 */
|
__u64 acpi_rsdp_addr; /* 0x070 */
|
||||||
|
__u8 _pad3[8]; /* 0x078 */
|
||||||
__u8 hd0_info[16]; /* obsolete! */ /* 0x080 */
|
__u8 hd0_info[16]; /* obsolete! */ /* 0x080 */
|
||||||
__u8 hd1_info[16]; /* obsolete! */ /* 0x090 */
|
__u8 hd1_info[16]; /* obsolete! */ /* 0x090 */
|
||||||
struct sys_desc_table sys_desc_table; /* obsolete! */ /* 0x0a0 */
|
struct sys_desc_table sys_desc_table; /* obsolete! */ /* 0x0a0 */
|
||||||
|
|
|
@ -1776,5 +1776,5 @@ void __init arch_reserve_mem_area(acpi_physical_address addr, size_t size)
|
||||||
|
|
||||||
u64 x86_default_get_root_pointer(void)
|
u64 x86_default_get_root_pointer(void)
|
||||||
{
|
{
|
||||||
return boot_params.hdr.acpi_rsdp_addr;
|
return boot_params.acpi_rsdp_addr;
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue