Add support for Rockchip RK860X regulators
Merge series from Cristian Ciocaltea <cristian.ciocaltea@collabora.com>: This patch series introduces support for the Rockchip RK860X regulators, while also providing a few fixes and improvements to the existing fan53555 driver. RK8600/RK8601 are quite similar to the FAN53555 regulators. RK8602/RK8603 are a bit different, having a wider output voltage selection range, from 0.5 V to 1.5 V in 6.25 mV steps. They are used in the Rock 5B board to power the ARM Cortex-A76 cores and the NPU.
This commit is contained in:
commit
53e59b5c46
1
.gitignore
vendored
1
.gitignore
vendored
@ -78,6 +78,7 @@ modules.order
|
||||
# RPM spec file (make rpm-pkg)
|
||||
#
|
||||
/*.spec
|
||||
/rpmbuild/
|
||||
|
||||
#
|
||||
# Debian directory (make deb-pkg)
|
||||
|
18
.mailmap
18
.mailmap
@ -28,6 +28,7 @@ Alexander Lobakin <alobakin@pm.me> <bloodyreaper@yandex.ru>
|
||||
Alexander Mikhalitsyn <alexander@mihalicyn.com> <alexander.mikhalitsyn@virtuozzo.com>
|
||||
Alexander Mikhalitsyn <alexander@mihalicyn.com> <aleksandr.mikhalitsyn@canonical.com>
|
||||
Alexandre Belloni <alexandre.belloni@bootlin.com> <alexandre.belloni@free-electrons.com>
|
||||
Alexandre Ghiti <alex@ghiti.fr> <alexandre.ghiti@canonical.com>
|
||||
Alexei Starovoitov <ast@kernel.org> <alexei.starovoitov@gmail.com>
|
||||
Alexei Starovoitov <ast@kernel.org> <ast@fb.com>
|
||||
Alexei Starovoitov <ast@kernel.org> <ast@plumgrid.com>
|
||||
@ -121,7 +122,7 @@ Dengcheng Zhu <dzhu@wavecomp.com> <dengcheng.zhu@gmail.com>
|
||||
Dengcheng Zhu <dzhu@wavecomp.com> <dengcheng.zhu@imgtec.com>
|
||||
Dengcheng Zhu <dzhu@wavecomp.com> <dengcheng.zhu@mips.com>
|
||||
<dev.kurt@vandijck-laurijssen.be> <kurt.van.dijck@eia.be>
|
||||
Dikshita Agarwal <dikshita@qti.qualcomm.com> <dikshita@codeaurora.org>
|
||||
Dikshita Agarwal <quic_dikshita@quicinc.com> <dikshita@codeaurora.org>
|
||||
Dmitry Baryshkov <dbaryshkov@gmail.com>
|
||||
Dmitry Baryshkov <dbaryshkov@gmail.com> <[dbaryshkov@gmail.com]>
|
||||
Dmitry Baryshkov <dbaryshkov@gmail.com> <dmitry_baryshkov@mentor.com>
|
||||
@ -132,6 +133,8 @@ Dmitry Safonov <0x7f454c46@gmail.com> <dsafonov@virtuozzo.com>
|
||||
Domen Puncer <domen@coderock.org>
|
||||
Douglas Gilbert <dougg@torque.net>
|
||||
Ed L. Cashin <ecashin@coraid.com>
|
||||
Enric Balletbo i Serra <eballetbo@kernel.org> <enric.balletbo@collabora.com>
|
||||
Enric Balletbo i Serra <eballetbo@kernel.org> <eballetbo@iseebcn.com>
|
||||
Erik Kaneda <erik.kaneda@intel.com> <erik.schmauss@intel.com>
|
||||
Eugen Hristev <eugen.hristev@collabora.com> <eugen.hristev@microchip.com>
|
||||
Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
@ -194,6 +197,7 @@ Jan Glauber <jan.glauber@gmail.com> <jang@linux.vnet.ibm.com>
|
||||
Jan Glauber <jan.glauber@gmail.com> <jglauber@cavium.com>
|
||||
Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@linux.intel.com>
|
||||
Jarkko Sakkinen <jarkko@kernel.org> <jarkko@profian.com>
|
||||
Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@tuni.fi>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgg@mellanox.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgg@nvidia.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgunthorpe@obsidianresearch.com>
|
||||
@ -213,6 +217,9 @@ Jens Axboe <axboe@suse.de>
|
||||
Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
|
||||
Jernej Skrabec <jernej.skrabec@gmail.com> <jernej.skrabec@siol.net>
|
||||
Jessica Zhang <quic_jesszhan@quicinc.com> <jesszhan@codeaurora.org>
|
||||
Jiri Pirko <jiri@resnulli.us> <jiri@nvidia.com>
|
||||
Jiri Pirko <jiri@resnulli.us> <jiri@mellanox.com>
|
||||
Jiri Pirko <jiri@resnulli.us> <jpirko@redhat.com>
|
||||
Jiri Slaby <jirislaby@kernel.org> <jirislaby@gmail.com>
|
||||
Jiri Slaby <jirislaby@kernel.org> <jslaby@novell.com>
|
||||
Jiri Slaby <jirislaby@kernel.org> <jslaby@suse.com>
|
||||
@ -374,6 +381,7 @@ Quentin Monnet <quentin@isovalent.com> <quentin.monnet@netronome.com>
|
||||
Quentin Perret <qperret@qperret.net> <quentin.perret@arm.com>
|
||||
Rafael J. Wysocki <rjw@rjwysocki.net> <rjw@sisk.pl>
|
||||
Rajeev Nandan <quic_rajeevny@quicinc.com> <rajeevny@codeaurora.org>
|
||||
Rajendra Nayak <quic_rjendra@quicinc.com> <rnayak@codeaurora.org>
|
||||
Rajesh Shah <rajesh.shah@intel.com>
|
||||
Ralf Baechle <ralf@linux-mips.org>
|
||||
Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
||||
@ -382,6 +390,9 @@ Rémi Denis-Courmont <rdenis@simphalempin.com>
|
||||
Ricardo Ribalda <ribalda@kernel.org> <ricardo@ribalda.com>
|
||||
Ricardo Ribalda <ribalda@kernel.org> Ricardo Ribalda Delgado <ribalda@kernel.org>
|
||||
Ricardo Ribalda <ribalda@kernel.org> <ricardo.ribalda@gmail.com>
|
||||
Richard Leitner <richard.leitner@linux.dev> <dev@g0hl1n.net>
|
||||
Richard Leitner <richard.leitner@linux.dev> <me@g0hl1n.net>
|
||||
Richard Leitner <richard.leitner@linux.dev> <richard.leitner@skidata.com>
|
||||
Robert Foss <rfoss@kernel.org> <robert.foss@linaro.org>
|
||||
Roman Gushchin <roman.gushchin@linux.dev> <guro@fb.com>
|
||||
Roman Gushchin <roman.gushchin@linux.dev> <guroan@gmail.com>
|
||||
@ -392,6 +403,7 @@ Ross Zwisler <zwisler@kernel.org> <ross.zwisler@linux.intel.com>
|
||||
Rudolf Marek <R.Marek@sh.cvut.cz>
|
||||
Rui Saraiva <rmps@joel.ist.utl.pt>
|
||||
Sachin P Sant <ssant@in.ibm.com>
|
||||
Sai Prakash Ranjan <quic_saipraka@quicinc.com> <saiprakash.ranjan@codeaurora.org>
|
||||
Sakari Ailus <sakari.ailus@linux.intel.com> <sakari.ailus@iki.fi>
|
||||
Sam Ravnborg <sam@mars.ravnborg.org>
|
||||
Sankeerth Billakanti <quic_sbillaka@quicinc.com> <sbillaka@codeaurora.org>
|
||||
@ -432,6 +444,10 @@ Thomas Graf <tgraf@suug.ch>
|
||||
Thomas Körper <socketcan@esd.eu> <thomas.koerper@esd.eu>
|
||||
Thomas Pedersen <twp@codeaurora.org>
|
||||
Tiezhu Yang <yangtiezhu@loongson.cn> <kernelpatch@126.com>
|
||||
Tobias Klauser <tklauser@distanz.ch> <tobias.klauser@gmail.com>
|
||||
Tobias Klauser <tklauser@distanz.ch> <klto@zhaw.ch>
|
||||
Tobias Klauser <tklauser@distanz.ch> <tklauser@nuerscht.ch>
|
||||
Tobias Klauser <tklauser@distanz.ch> <tklauser@xenon.tklauser.home>
|
||||
Todor Tomov <todor.too@gmail.com> <todor.tomov@linaro.org>
|
||||
Tony Luck <tony.luck@intel.com>
|
||||
TripleX Chung <xxx.phy@gmail.com> <triplex@zh-kernel.org>
|
||||
|
@ -36,7 +36,6 @@ problems and bugs in particular.
|
||||
|
||||
reporting-issues
|
||||
reporting-regressions
|
||||
security-bugs
|
||||
bug-hunting
|
||||
bug-bisect
|
||||
tainted-kernels
|
||||
|
@ -395,7 +395,7 @@ might want to be aware of; it for example explains how to add your issue to the
|
||||
list of tracked regressions, to ensure it won't fall through the cracks.
|
||||
|
||||
What qualifies as security issue is left to your judgment. Consider reading
|
||||
Documentation/admin-guide/security-bugs.rst before proceeding, as it
|
||||
Documentation/process/security-bugs.rst before proceeding, as it
|
||||
provides additional details how to best handle security issues.
|
||||
|
||||
An issue is a 'really severe problem' when something totally unacceptably bad
|
||||
@ -1269,7 +1269,7 @@ them when sending the report by mail. If you filed it in a bug tracker, forward
|
||||
the report's text to these addresses; but on top of it put a small note where
|
||||
you mention that you filed it with a link to the ticket.
|
||||
|
||||
See Documentation/admin-guide/security-bugs.rst for more information.
|
||||
See Documentation/process/security-bugs.rst for more information.
|
||||
|
||||
|
||||
Duties after the report went out
|
||||
|
@ -76,6 +76,13 @@ properties:
|
||||
If "broken-flash-reset" is present then having this property does not
|
||||
make any difference.
|
||||
|
||||
spi-cpol: true
|
||||
spi-cpha: true
|
||||
|
||||
dependencies:
|
||||
spi-cpol: [ spi-cpha ]
|
||||
spi-cpha: [ spi-cpol ]
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
|
@ -96,9 +96,11 @@ $defs:
|
||||
2: Lower Slew rate (slower edges)
|
||||
3: Reserved (No adjustments)
|
||||
|
||||
bias-bus-hold: true
|
||||
bias-pull-down: true
|
||||
bias-pull-up: true
|
||||
bias-disable: true
|
||||
input-enable: true
|
||||
output-high: true
|
||||
output-low: true
|
||||
|
||||
|
@ -14,12 +14,21 @@ allOf:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- fcs,fan53555
|
||||
- fcs,fan53526
|
||||
- silergy,syr827
|
||||
- silergy,syr828
|
||||
- tcs,tcs4525
|
||||
oneOf:
|
||||
- enum:
|
||||
- fcs,fan53555
|
||||
- fcs,fan53526
|
||||
- rockchip,rk8600
|
||||
- rockchip,rk8602
|
||||
- silergy,syr827
|
||||
- silergy,syr828
|
||||
- tcs,tcs4525
|
||||
- items:
|
||||
- const: rockchip,rk8601
|
||||
- const: rockchip,rk8600
|
||||
- items:
|
||||
- const: rockchip,rk8603
|
||||
- const: rockchip,rk8602
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
@ -242,7 +242,7 @@ group and can access them as follows::
|
||||
VFIO User API
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Please see include/linux/vfio.h for complete API documentation.
|
||||
Please see include/uapi/linux/vfio.h for complete API documentation.
|
||||
|
||||
VFIO bus driver API
|
||||
-------------------------------------------------------------------------------
|
||||
|
@ -1222,7 +1222,7 @@ defined:
|
||||
return
|
||||
-ECHILD and it will be called again in ref-walk mode.
|
||||
|
||||
``_weak_revalidate``
|
||||
``d_weak_revalidate``
|
||||
called when the VFS needs to revalidate a "jumped" dentry. This
|
||||
is called when a path-walk ends at dentry that was not acquired
|
||||
by doing a lookup in the parent directory. This includes "/",
|
||||
|
@ -19,7 +19,7 @@ possible we decided to do following:
|
||||
platform devices.
|
||||
|
||||
- Devices behind real busses where there is a connector resource
|
||||
are represented as struct spi_device or struct i2c_device. Note
|
||||
are represented as struct spi_device or struct i2c_client. Note
|
||||
that standard UARTs are not busses so there is no struct uart_device,
|
||||
although some of them may be represented by struct serdev_device.
|
||||
|
||||
|
@ -213,11 +213,7 @@ point rather than some random spot. If your upstream-bound branch has
|
||||
emptied entirely into the mainline during the merge window, you can pull it
|
||||
forward with a command like::
|
||||
|
||||
git merge v5.2-rc1^0
|
||||
|
||||
The "^0" will cause Git to do a fast-forward merge (which should be
|
||||
possible in this situation), thus avoiding the addition of a spurious merge
|
||||
commit.
|
||||
git merge --ff-only v5.2-rc1
|
||||
|
||||
The guidelines laid out above are just that: guidelines. There will always
|
||||
be situations that call out for a different solution, and these guidelines
|
||||
|
@ -5,10 +5,10 @@ Hugetlbfs Reservation
|
||||
Overview
|
||||
========
|
||||
|
||||
Huge pages as described at Documentation/mm/hugetlbpage.rst are typically
|
||||
preallocated for application use. These huge pages are instantiated in a
|
||||
task's address space at page fault time if the VMA indicates huge pages are
|
||||
to be used. If no huge page exists at page fault time, the task is sent
|
||||
Huge pages as described at Documentation/admin-guide/mm/hugetlbpage.rst are
|
||||
typically preallocated for application use. These huge pages are instantiated
|
||||
in a task's address space at page fault time if the VMA indicates huge pages
|
||||
are to be used. If no huge page exists at page fault time, the task is sent
|
||||
a SIGBUS and often dies an unhappy death. Shortly after huge page support
|
||||
was added, it was determined that it would be better to detect a shortage
|
||||
of huge pages at mmap() time. The idea is that if there were not enough
|
||||
|
@ -66,7 +66,7 @@ one of the types described below.
|
||||
also populated on boot using one of ``kernelcore``, ``movablecore`` and
|
||||
``movable_node`` kernel command line parameters. See
|
||||
Documentation/mm/page_migration.rst and
|
||||
Documentation/admin-guide/mm/memory_hotplug.rst for additional details.
|
||||
Documentation/admin-guide/mm/memory-hotplug.rst for additional details.
|
||||
|
||||
* ``ZONE_DEVICE`` represents memory residing on devices such as PMEM and GPU.
|
||||
It has different characteristics than RAM zone types and it exists to provide
|
||||
|
@ -1,4 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://kernel.org/schemas/netlink/genetlink-c.yaml#
|
||||
|
@ -1,4 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://kernel.org/schemas/netlink/genetlink-legacy.yaml#
|
||||
|
@ -1,4 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://kernel.org/schemas/netlink/genetlink-legacy.yaml#
|
||||
|
@ -1,4 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
|
||||
|
||||
name: ethtool
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
|
||||
|
||||
name: fou
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
|
||||
|
||||
name: netdev
|
||||
|
||||
@ -9,6 +9,7 @@ definitions:
|
||||
-
|
||||
type: flags
|
||||
name: xdp-act
|
||||
render-max: true
|
||||
entries:
|
||||
-
|
||||
name: basic
|
||||
|
@ -23,10 +23,13 @@ metadata is supported, this set will grow:
|
||||
An XDP program can use these kfuncs to read the metadata into stack
|
||||
variables for its own consumption. Or, to pass the metadata on to other
|
||||
consumers, an XDP program can store it into the metadata area carried
|
||||
ahead of the packet.
|
||||
ahead of the packet. Not all packets will necessary have the requested
|
||||
metadata available in which case the driver returns ``-ENODATA``.
|
||||
|
||||
Not all kfuncs have to be implemented by the device driver; when not
|
||||
implemented, the default ones that return ``-EOPNOTSUPP`` will be used.
|
||||
implemented, the default ones that return ``-EOPNOTSUPP`` will be used
|
||||
to indicate the device driver have not implemented this kfunc.
|
||||
|
||||
|
||||
Within an XDP frame, the metadata layout (accessed via ``xdp_buff``) is
|
||||
as follows::
|
||||
|
@ -138,7 +138,7 @@ required reading:
|
||||
philosophy and is very important for people moving to Linux from
|
||||
development on other Operating Systems.
|
||||
|
||||
:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>`
|
||||
:ref:`Documentation/process/security-bugs.rst <securitybugs>`
|
||||
If you feel you have found a security problem in the Linux kernel,
|
||||
please follow the steps in this document to help notify the kernel
|
||||
developers, and help solve the issue.
|
||||
|
@ -35,6 +35,14 @@ Below are the essential guides that every developer should read.
|
||||
kernel-enforcement-statement
|
||||
kernel-driver-statement
|
||||
|
||||
For security issues, see:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
security-bugs
|
||||
embargoed-hardware-issues
|
||||
|
||||
Other guides to the community that are of interest to most developers are:
|
||||
|
||||
.. toctree::
|
||||
@ -47,7 +55,6 @@ Other guides to the community that are of interest to most developers are:
|
||||
submit-checklist
|
||||
kernel-docs
|
||||
deprecated
|
||||
embargoed-hardware-issues
|
||||
maintainers
|
||||
researcher-guidelines
|
||||
|
||||
|
@ -12,10 +12,6 @@ under ``-std=gnu11`` [gcc-c-dialect-options]_: the GNU dialect of ISO C11.
|
||||
This dialect contains many extensions to the language [gnu-extensions]_,
|
||||
and many of them are used within the kernel as a matter of course.
|
||||
|
||||
There is some support for compiling the kernel with ``icc`` [icc]_ for several
|
||||
of the architectures, although at the time of writing it is not completed,
|
||||
requiring third-party patches.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
|
||||
@ -35,12 +31,28 @@ in order to feature detect which ones can be used and/or to shorten the code.
|
||||
|
||||
Please refer to ``include/linux/compiler_attributes.h`` for more information.
|
||||
|
||||
Rust
|
||||
----
|
||||
|
||||
The kernel has experimental support for the Rust programming language
|
||||
[rust-language]_ under ``CONFIG_RUST``. It is compiled with ``rustc`` [rustc]_
|
||||
under ``--edition=2021`` [rust-editions]_. Editions are a way to introduce
|
||||
small changes to the language that are not backwards compatible.
|
||||
|
||||
On top of that, some unstable features [rust-unstable-features]_ are used in
|
||||
the kernel. Unstable features may change in the future, thus it is an important
|
||||
goal to reach a point where only stable features are used.
|
||||
|
||||
Please refer to Documentation/rust/index.rst for more information.
|
||||
|
||||
.. [c-language] http://www.open-std.org/jtc1/sc22/wg14/www/standards
|
||||
.. [gcc] https://gcc.gnu.org
|
||||
.. [clang] https://clang.llvm.org
|
||||
.. [icc] https://software.intel.com/en-us/c-compilers
|
||||
.. [gcc-c-dialect-options] https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html
|
||||
.. [gnu-extensions] https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
|
||||
.. [gcc-attribute-syntax] https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html
|
||||
.. [n2049] http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2049.pdf
|
||||
|
||||
.. [rust-language] https://www.rust-lang.org
|
||||
.. [rustc] https://doc.rust-lang.org/rustc/
|
||||
.. [rust-editions] https://doc.rust-lang.org/edition-guide/editions/
|
||||
.. [rust-unstable-features] https://github.com/Rust-for-Linux/linux/issues/2
|
||||
|
@ -68,7 +68,7 @@ Before contributing, carefully read the appropriate documentation:
|
||||
* Documentation/process/development-process.rst
|
||||
* Documentation/process/submitting-patches.rst
|
||||
* Documentation/admin-guide/reporting-issues.rst
|
||||
* Documentation/admin-guide/security-bugs.rst
|
||||
* Documentation/process/security-bugs.rst
|
||||
|
||||
Then send a patch (including a commit log with all the details listed
|
||||
below) and follow up on any feedback from other developers.
|
||||
|
@ -39,7 +39,7 @@ Procedure for submitting patches to the -stable tree
|
||||
|
||||
Security patches should not be handled (solely) by the -stable review
|
||||
process but should follow the procedures in
|
||||
:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>`.
|
||||
:ref:`Documentation/process/security-bugs.rst <securitybugs>`.
|
||||
|
||||
For all other submissions, choose one of the following procedures
|
||||
-----------------------------------------------------------------
|
||||
|
@ -254,7 +254,7 @@ If you have a patch that fixes an exploitable security bug, send that patch
|
||||
to security@kernel.org. For severe bugs, a short embargo may be considered
|
||||
to allow distributors to get the patch out to users; in such cases,
|
||||
obviously, the patch should not be sent to any public lists. See also
|
||||
Documentation/admin-guide/security-bugs.rst.
|
||||
Documentation/process/security-bugs.rst.
|
||||
|
||||
Patches that fix a severe bug in a released kernel should be directed
|
||||
toward the stable maintainers by putting a line like this::
|
||||
@ -320,7 +320,7 @@ for their time. Code review is a tiring and time-consuming process, and
|
||||
reviewers sometimes get grumpy. Even in that case, though, respond
|
||||
politely and address the problems they have pointed out. When sending a next
|
||||
version, add a ``patch changelog`` to the cover letter or to individual patches
|
||||
explaining difference aganst previous submission (see
|
||||
explaining difference against previous submission (see
|
||||
:ref:`the_canonical_patch_format`).
|
||||
|
||||
See Documentation/process/email-clients.rst for recommendations on email
|
||||
|
@ -258,7 +258,7 @@ Linux cannot currently figure out CPU capacity on its own, this information thus
|
||||
needs to be handed to it. Architectures must define arch_scale_cpu_capacity()
|
||||
for that purpose.
|
||||
|
||||
The arm and arm64 architectures directly map this to the arch_topology driver
|
||||
The arm, arm64, and RISC-V architectures directly map this to the arch_topology driver
|
||||
CPU scaling data, which is derived from the capacity-dmips-mhz CPU binding; see
|
||||
Documentation/devicetree/bindings/cpu/cpu-capacity.txt.
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
.. include:: ../disclaimer-ita.rst
|
||||
|
||||
:Original: :ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>`
|
||||
:Original: :ref:`Documentation/process/security-bugs.rst <securitybugs>`
|
||||
|
||||
.. _it_securitybugs:
|
||||
|
||||
|
@ -272,7 +272,7 @@ embargo potrebbe essere preso in considerazione per dare il tempo alle
|
||||
distribuzioni di prendere la patch e renderla disponibile ai loro utenti;
|
||||
in questo caso, ovviamente, la patch non dovrebbe essere inviata su alcuna
|
||||
lista di discussione pubblica. Leggete anche
|
||||
Documentation/admin-guide/security-bugs.rst.
|
||||
Documentation/process/security-bugs.rst.
|
||||
|
||||
Patch che correggono bachi importanti su un kernel già rilasciato, dovrebbero
|
||||
essere inviate ai manutentori dei kernel stabili aggiungendo la seguente riga::
|
||||
|
@ -167,7 +167,7 @@ linux-api@vger.kernel.org に送ることを勧めます。
|
||||
このドキュメントは Linux 開発の思想を理解するのに非常に重要です。
|
||||
そして、他のOSでの開発者が Linux に移る時にとても重要です。
|
||||
|
||||
:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>`
|
||||
:ref:`Documentation/process/security-bugs.rst <securitybugs>`
|
||||
もし Linux カーネルでセキュリティ問題を発見したように思ったら、こ
|
||||
のドキュメントのステップに従ってカーネル開発者に連絡し、問題解決を
|
||||
支援してください。
|
||||
|
@ -157,7 +157,7 @@ mtk.manpages@gmail.com의 메인테이너에게 보낼 것을 권장한다.
|
||||
리눅스로 전향하는 사람들에게는 매우 중요하다.
|
||||
|
||||
|
||||
:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>`
|
||||
:ref:`Documentation/process/security-bugs.rst <securitybugs>`
|
||||
여러분들이 리눅스 커널의 보안 문제를 발견했다고 생각한다면 이 문서에
|
||||
나온 단계에 따라서 커널 개발자들에게 알리고 그 문제를 해결할 수 있도록
|
||||
도와 달라.
|
||||
|
@ -135,7 +135,7 @@ de obligada lectura:
|
||||
de Linux y es muy importante para las personas que se mudan a Linux
|
||||
tras desarrollar otros sistemas operativos.
|
||||
|
||||
:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>`
|
||||
:ref:`Documentation/process/security-bugs.rst <securitybugs>`
|
||||
Si cree que ha encontrado un problema de seguridad en el kernel de
|
||||
Linux, siga los pasos de este documento para ayudar a notificar a los
|
||||
desarrolladores del kernel y ayudar a resolver el problema.
|
||||
|
@ -276,7 +276,7 @@ parche a security@kernel.org. Para errores graves, se debe mantener un
|
||||
poco de discreción y permitir que los distribuidores entreguen el parche a
|
||||
los usuarios; en esos casos, obviamente, el parche no debe enviarse a
|
||||
ninguna lista pública. Revise también
|
||||
Documentation/admin-guide/security-bugs.rst.
|
||||
Documentation/process/security-bugs.rst.
|
||||
|
||||
Los parches que corrigen un error grave en un kernel en uso deben dirigirse
|
||||
hacia los maintainers estables poniendo una línea como esta::
|
||||
|
@ -1,6 +1,6 @@
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: :doc:`../../../admin-guide/security-bugs`
|
||||
:Original: :doc:`../../../process/security-bugs`
|
||||
|
||||
:译者:
|
||||
|
||||
|
@ -15,7 +15,8 @@ Hugetlbfs 预留
|
||||
概述
|
||||
====
|
||||
|
||||
Documentation/mm/hugetlbpage.rst 中描述的巨页通常是预先分配给应用程序使用的。如果VMA指
|
||||
Documentation/admin-guide/mm/hugetlbpage.rst
|
||||
中描述的巨页通常是预先分配给应用程序使用的 。如果VMA指
|
||||
示要使用巨页,这些巨页会在缺页异常时被实例化到任务的地址空间。如果在缺页异常
|
||||
时没有巨页存在,任务就会被发送一个SIGBUS,并经常不高兴地死去。在加入巨页支
|
||||
持后不久,人们决定,在mmap()时检测巨页的短缺情况会更好。这个想法是,如果
|
||||
|
@ -125,7 +125,7 @@ Linux内核代码中包含有大量的文档。这些文档对于学习如何与
|
||||
这篇文档对于理解Linux的开发哲学至关重要。对于将开发平台从其他操作系
|
||||
统转移到Linux的人来说也很重要。
|
||||
|
||||
:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>`
|
||||
:ref:`Documentation/process/security-bugs.rst <securitybugs>`
|
||||
如果你认为自己发现了Linux内核的安全性问题,请根据这篇文档中的步骤来
|
||||
提醒其他内核开发者并帮助解决这个问题。
|
||||
|
||||
|
@ -231,7 +231,7 @@ CFS调度类基于实体负载跟踪机制(Per-Entity Load Tracking, PELT)
|
||||
当前,Linux无法凭自身算出CPU算力,因此必须要有把这个信息传递给Linux的方式。每个架构必须为此
|
||||
定义arch_scale_cpu_capacity()函数。
|
||||
|
||||
arm和arm64架构直接把这个信息映射到arch_topology驱动的CPU scaling数据中(译注:参考
|
||||
arm、arm64和RISC-V架构直接把这个信息映射到arch_topology驱动的CPU scaling数据中(译注:参考
|
||||
arch_topology.h的percpu变量cpu_scale),它是从capacity-dmips-mhz CPU binding中衍生计算
|
||||
出来的。参见Documentation/devicetree/bindings/cpu/cpu-capacity.txt。
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
.. include:: ../disclaimer-zh_TW.rst
|
||||
|
||||
:Original: :doc:`../../../admin-guide/security-bugs`
|
||||
:Original: :doc:`../../../process/security-bugs`
|
||||
|
||||
:譯者:
|
||||
|
||||
|
@ -128,7 +128,7 @@ Linux內核代碼中包含有大量的文檔。這些文檔對於學習如何與
|
||||
這篇文檔對於理解Linux的開發哲學至關重要。對於將開發平台從其他操作系
|
||||
統轉移到Linux的人來說也很重要。
|
||||
|
||||
:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>`
|
||||
:ref:`Documentation/process/security-bugs.rst <securitybugs>`
|
||||
如果你認爲自己發現了Linux內核的安全性問題,請根據這篇文檔中的步驟來
|
||||
提醒其他內核開發者並幫助解決這個問題。
|
||||
|
||||
|
352
Documentation/usb/gadget_uvc.rst
Normal file
352
Documentation/usb/gadget_uvc.rst
Normal file
@ -0,0 +1,352 @@
|
||||
=======================
|
||||
Linux UVC Gadget Driver
|
||||
=======================
|
||||
|
||||
Overview
|
||||
--------
|
||||
The UVC Gadget driver is a driver for hardware on the *device* side of a USB
|
||||
connection. It is intended to run on a Linux system that has USB device-side
|
||||
hardware such as boards with an OTG port.
|
||||
|
||||
On the device system, once the driver is bound it appears as a V4L2 device with
|
||||
the output capability.
|
||||
|
||||
On the host side (once connected via USB cable), a device running the UVC Gadget
|
||||
driver *and controlled by an appropriate userspace program* should appear as a UVC
|
||||
specification compliant camera, and function appropriately with any program
|
||||
designed to handle them. The userspace program running on the device system can
|
||||
queue image buffers from a variety of sources to be transmitted via the USB
|
||||
connection. Typically this would mean forwarding the buffers from a camera sensor
|
||||
peripheral, but the source of the buffer is entirely dependent on the userspace
|
||||
companion program.
|
||||
|
||||
Configuring the device kernel
|
||||
-----------------------------
|
||||
The Kconfig options USB_CONFIGFS, USB_LIBCOMPOSITE, USB_CONFIGFS_F_UVC and
|
||||
USB_F_UVC must be selected to enable support for the UVC gadget.
|
||||
|
||||
Configuring the gadget through configfs
|
||||
---------------------------------------
|
||||
The UVC Gadget expects to be configured through configfs using the UVC function.
|
||||
This allows a significant degree of flexibility, as many of a UVC device's
|
||||
settings can be controlled this way.
|
||||
|
||||
Not all of the available attributes are described here. For a complete enumeration
|
||||
see Documentation/ABI/testing/configfs-usb-gadget-uvc
|
||||
|
||||
Assumptions
|
||||
~~~~~~~~~~~
|
||||
This section assumes that you have mounted configfs at `/sys/kernel/config` and
|
||||
created a gadget as `/sys/kernel/config/usb_gadget/g1`.
|
||||
|
||||
The UVC Function
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
The first step is to create the UVC function:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# These variables will be assumed throughout the rest of the document
|
||||
CONFIGFS="/sys/kernel/config"
|
||||
GADGET="$CONFIGFS/usb_gadget/g1"
|
||||
FUNCTION="$GADGET/functions/uvc.0"
|
||||
|
||||
mkdir -p $FUNCTION
|
||||
|
||||
Formats and Frames
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
You must configure the gadget by telling it which formats you support, as well
|
||||
as the frame sizes and frame intervals that are supported for each format. In
|
||||
the current implementation there is no way for the gadget to refuse to set a
|
||||
format that the host instructs it to set, so it is important that this step is
|
||||
completed *accurately* to ensure that the host never asks for a format that
|
||||
can't be provided.
|
||||
|
||||
Formats are created under the streaming/uncompressed and streaming/mjpeg configfs
|
||||
groups, with the framesizes created under the formats in the following
|
||||
structure:
|
||||
|
||||
::
|
||||
|
||||
uvc.0 +
|
||||
|
|
||||
+ streaming +
|
||||
|
|
||||
+ mjpeg +
|
||||
| |
|
||||
| + mjpeg +
|
||||
| |
|
||||
| + 720p
|
||||
| |
|
||||
| + 1080p
|
||||
|
|
||||
+ uncompressed +
|
||||
|
|
||||
+ yuyv +
|
||||
|
|
||||
+ 720p
|
||||
|
|
||||
+ 1080p
|
||||
|
||||
Each frame can then be configured with a width and height, plus the maximum
|
||||
buffer size required to store a single frame, and finally with the supported
|
||||
frame intervals for that format and framesize. Width and height are enumerated in
|
||||
units of pixels, frame interval in units of 100ns. To create the structure
|
||||
above with 2, 15 and 100 fps frameintervals for each framesize for example you
|
||||
might do:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
create_frame() {
|
||||
# Example usage:
|
||||
# create_frame <width> <height> <group> <format name>
|
||||
|
||||
WIDTH=$1
|
||||
HEIGHT=$2
|
||||
FORMAT=$3
|
||||
NAME=$4
|
||||
|
||||
wdir=$FUNCTION/streaming/$FORMAT/$NAME/${HEIGHT}p
|
||||
|
||||
mkdir -p $wdir
|
||||
echo $WIDTH > $wdir/wWidth
|
||||
echo $HEIGHT > $wdir/wHeight
|
||||
echo $(( $WIDTH * $HEIGHT * 2 )) > $wdir/dwMaxVideoFrameBufferSize
|
||||
cat <<EOF > $wdir/dwFrameInterval
|
||||
666666
|
||||
100000
|
||||
5000000
|
||||
EOF
|
||||
}
|
||||
|
||||
create_frame 1280 720 mjpeg mjpeg
|
||||
create_frame 1920 1080 mjpeg mjpeg
|
||||
create_frame 1280 720 uncompressed yuyv
|
||||
create_frame 1920 1080 uncompressed yuyv
|
||||
|
||||
The only uncompressed format currently supported is YUYV, which is detailed at
|
||||
Documentation/userspace-api/media/v4l/pixfmt-packed.yuv.rst.
|
||||
|
||||
Color Matching Descriptors
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
It's possible to specify some colometry information for each format you create.
|
||||
This step is optional, and default information will be included if this step is
|
||||
skipped; those default values follow those defined in the Color Matching Descriptor
|
||||
section of the UVC specification.
|
||||
|
||||
To create a Color Matching Descriptor, create a configfs item and set its three
|
||||
attributes to your desired settings and then link to it from the format you wish
|
||||
it to be associated with:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Create a new Color Matching Descriptor
|
||||
|
||||
mkdir $FUNCTION/streaming/color_matching/yuyv
|
||||
pushd $FUNCTION/streaming/color_matching/yuyv
|
||||
|
||||
echo 1 > bColorPrimaries
|
||||
echo 1 > bTransferCharacteristics
|
||||
echo 4 > bMatrixCoefficients
|
||||
|
||||
popd
|
||||
|
||||
# Create a symlink to the Color Matching Descriptor from the format's config item
|
||||
ln -s $FUNCTION/streaming/color_matching/yuyv $FUNCTION/streaming/uncompressed/yuyv
|
||||
|
||||
For details about the valid values, consult the UVC specification. Note that a
|
||||
default color matching descriptor exists and is used by any format which does
|
||||
not have a link to a different Color Matching Descriptor. It's possible to
|
||||
change the attribute settings for the default descriptor, so bear in mind that if
|
||||
you do that you are altering the defaults for any format that does not link to
|
||||
a different one.
|
||||
|
||||
|
||||
Header linking
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
The UVC specification requires that Format and Frame descriptors be preceded by
|
||||
Headers detailing things such as the number and cumulative size of the different
|
||||
Format descriptors that follow. This and similar operations are acheived in
|
||||
configfs by linking between the configfs item representing the header and the
|
||||
config items representing those other descriptors, in this manner:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
mkdir $FUNCTION/streaming/header/h
|
||||
|
||||
# This section links the format descriptors and their associated frames
|
||||
# to the header
|
||||
cd $FUNCTION/streaming/header/h
|
||||
ln -s ../../uncompressed/yuyv
|
||||
ln -s ../../mjpeg/mjpeg
|
||||
|
||||
# This section ensures that the header will be transmitted for each
|
||||
# speed's set of descriptors. If support for a particular speed is not
|
||||
# needed then it can be skipped here.
|
||||
cd ../../class/fs
|
||||
ln -s ../../header/h
|
||||
cd ../../class/hs
|
||||
ln -s ../../header/h
|
||||
cd ../../class/ss
|
||||
ln -s ../../header/h
|
||||
cd ../../../control
|
||||
mkdir header/h
|
||||
ln -s header/h class/fs
|
||||
ln -s header/h class/ss
|
||||
|
||||
|
||||
Extension Unit Support
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
A UVC Extension Unit (XU) basically provides a distinct unit to which control set
|
||||
and get requests can be addressed. The meaning of those control requests is
|
||||
entirely implementation dependent, but may be used to control settings outside
|
||||
of the UVC specification (for example enabling or disabling video effects). An
|
||||
XU can be inserted into the UVC unit chain or left free-hanging.
|
||||
|
||||
Configuring an extension unit involves creating an entry in the appropriate
|
||||
directory and setting its attributes appropriately, like so:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
mkdir $FUNCTION/control/extensions/xu.0
|
||||
pushd $FUNCTION/control/extensions/xu.0
|
||||
|
||||
# Set the bUnitID of the Processing Unit as the source for this
|
||||
# Extension Unit
|
||||
echo 2 > baSourceID
|
||||
|
||||
# Set this XU as the source of the default output terminal. This inserts
|
||||
# the XU into the UVC chain between the PU and OT such that the final
|
||||
# chain is IT > PU > XU.0 > OT
|
||||
cat bUnitID > ../../terminal/output/default/baSourceID
|
||||
|
||||
# Flag some controls as being available for use. The bmControl field is
|
||||
# a bitmap with each bit denoting the availability of a particular
|
||||
# control. For example to flag the 0th, 2nd and 3rd controls available:
|
||||
echo 0x0d > bmControls
|
||||
|
||||
# Set the GUID; this is a vendor-specific code identifying the XU.
|
||||
echo -e -n "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10" > guidExtensionCode
|
||||
|
||||
popd
|
||||
|
||||
The bmControls attribute and the baSourceID attribute are multi-value attributes.
|
||||
This means that you may write multiple newline separated values to them. For
|
||||
example to flag the 1st, 2nd, 9th and 10th controls as being available you would
|
||||
need to write two values to bmControls, like so:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
cat << EOF > bmControls
|
||||
0x03
|
||||
0x03
|
||||
EOF
|
||||
|
||||
The multi-value nature of the baSourceID attribute belies the fact that XUs can
|
||||
be multiple-input, though note that this currently has no significant effect.
|
||||
|
||||
The bControlSize attribute reflects the size of the bmControls attribute, and
|
||||
similarly bNrInPins reflects the size of the baSourceID attributes. Both
|
||||
attributes are automatically increased / decreased as you set bmControls and
|
||||
baSourceID. It is also possible to manually increase or decrease bControlSize
|
||||
which has the effect of truncating entries to the new size, or padding entries
|
||||
out with 0x00, for example:
|
||||
|
||||
::
|
||||
|
||||
$ cat bmControls
|
||||
0x03
|
||||
0x05
|
||||
|
||||
$ cat bControlSize
|
||||
2
|
||||
|
||||
$ echo 1 > bControlSize
|
||||
$ cat bmControls
|
||||
0x03
|
||||
|
||||
$ echo 2 > bControlSize
|
||||
$ cat bmControls
|
||||
0x03
|
||||
0x00
|
||||
|
||||
bNrInPins and baSourceID function in the same way.
|
||||
|
||||
Custom Strings Support
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
String descriptors that provide a textual description for various parts of a
|
||||
USB device can be defined in the usual place within USB configfs, and may then
|
||||
be linked to from the UVC function root or from Extension Unit directories to
|
||||
assign those strings as descriptors:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Create a string descriptor in us-EN and link to it from the function
|
||||
# root. The name of the link is significant here, as it declares this
|
||||
# descriptor to be intended for the Interface Association Descriptor.
|
||||
# Other significant link names at function root are vs0_desc and vs1_desc
|
||||
# For the VideoStreaming Interface 0/1 Descriptors.
|
||||
|
||||
mkdir -p $GADGET/strings/0x409/iad_desc
|
||||
echo -n "Interface Associaton Descriptor" > $GADGET/strings/0x409/iad_desc/s
|
||||
ln -s $GADGET/strings/0x409/iad_desc $FUNCTION/iad_desc
|
||||
|
||||
# Because the link to a String Descriptor from an Extension Unit clearly
|
||||
# associates the two, the name of this link is not significant and may
|
||||
# be set freely.
|
||||
|
||||
mkdir -p $GADGET/strings/0x409/xu.0
|
||||
echo -n "A Very Useful Extension Unit" > $GADGET/strings/0x409/xu.0/s
|
||||
ln -s $GADGET/strings/0x409/xu.0 $FUNCTION/control/extensions/xu.0
|
||||
|
||||
The interrupt endpoint
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The VideoControl interface has an optional interrupt endpoint which is by default
|
||||
disabled. This is intended to support delayed response control set requests for
|
||||
UVC (which should respond through the interrupt endpoint rather than tying up
|
||||
endpoint 0). At present support for sending data through this endpoint is missing
|
||||
and so it is left disabled to avoid confusion. If you wish to enable it you can
|
||||
do so through the configfs attribute:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
echo 1 > $FUNCTION/control/enable_interrupt_ep
|
||||
|
||||
Bandwidth configuration
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
There are three attributes which control the bandwidth of the USB connection.
|
||||
These live in the function root and can be set within limits:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# streaming_interval sets bInterval. Values range from 1..255
|
||||
echo 1 > $FUNCTION/streaming_interval
|
||||
|
||||
# streaming_maxpacket sets wMaxPacketSize. Valid values are 1024/2048/3072
|
||||
echo 3072 > $FUNCTION/streaming_maxpacket
|
||||
|
||||
# streaming_maxburst sets bMaxBurst. Valid values are 1..15
|
||||
echo 1 > $FUNCTION/streaming_maxburst
|
||||
|
||||
|
||||
The values passed here will be clamped to valid values according to the UVC
|
||||
specification (which depend on the speed of the USB connection). To understand
|
||||
how the settings influence bandwidth you should consult the UVC specifications,
|
||||
but a rule of thumb is that increasing the streaming_maxpacket setting will
|
||||
improve bandwidth (and thus the maximum possible framerate), whilst the same is
|
||||
true for streaming_maxburst provided the USB connection is running at SuperSpeed.
|
||||
Increasing streaming_interval will reduce bandwidth and framerate.
|
||||
|
||||
The userspace application
|
||||
-------------------------
|
||||
By itself, the UVC Gadget driver cannot do anything particularly interesting. It
|
||||
must be paired with a userspace program that responds to UVC control requests and
|
||||
fills buffers to be queued to the V4L2 device that the driver creates. How those
|
||||
things are achieved is implementation dependent and beyond the scope of this
|
||||
document, but a reference application can be found at https://gitlab.freedesktop.org/camera/uvc-gadget
|
@ -16,6 +16,7 @@ USB support
|
||||
gadget_multi
|
||||
gadget_printer
|
||||
gadget_serial
|
||||
gadget_uvc
|
||||
gadget-testing
|
||||
iuu_phoenix
|
||||
mass-storage
|
||||
|
@ -24,7 +24,8 @@ YAML specifications can be found under ``Documentation/netlink/specs/``
|
||||
This document describes details of the schema.
|
||||
See :doc:`intro-specs` for a practical starting guide.
|
||||
|
||||
All specs must be licensed under ``GPL-2.0-only OR BSD-3-Clause``
|
||||
All specs must be licensed under
|
||||
``((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)``
|
||||
to allow for easy adoption in user space code.
|
||||
|
||||
Compatibility levels
|
||||
|
37
MAINTAINERS
37
MAINTAINERS
@ -73,7 +73,7 @@ Tips for patch submitters
|
||||
and ideally, should come with a patch proposal. Please do not send
|
||||
automated reports to this list either. Such bugs will be handled
|
||||
better and faster in the usual public places. See
|
||||
Documentation/admin-guide/security-bugs.rst for details.
|
||||
Documentation/process/security-bugs.rst for details.
|
||||
|
||||
8. Happy hacking.
|
||||
|
||||
@ -5971,7 +5971,7 @@ F: include/linux/dm-*.h
|
||||
F: include/uapi/linux/dm-*.h
|
||||
|
||||
DEVLINK
|
||||
M: Jiri Pirko <jiri@nvidia.com>
|
||||
M: Jiri Pirko <jiri@resnulli.us>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/networking/devlink
|
||||
@ -8216,6 +8216,7 @@ F: drivers/net/ethernet/freescale/dpaa
|
||||
|
||||
FREESCALE QORIQ DPAA FMAN DRIVER
|
||||
M: Madalin Bucur <madalin.bucur@nxp.com>
|
||||
R: Sean Anderson <sean.anderson@seco.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/net/fsl-fman.txt
|
||||
@ -14656,10 +14657,8 @@ F: net/ipv4/nexthop.c
|
||||
|
||||
NFC SUBSYSTEM
|
||||
M: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
L: linux-nfc@lists.01.org (subscribers-only)
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
B: mailto:linux-nfc@lists.01.org
|
||||
F: Documentation/devicetree/bindings/net/nfc/
|
||||
F: drivers/nfc/
|
||||
F: include/linux/platform_data/nfcmrvl.h
|
||||
@ -14670,7 +14669,6 @@ F: net/nfc/
|
||||
NFC VIRTUAL NCI DEVICE DRIVER
|
||||
M: Bongsu Jeon <bongsu.jeon@samsung.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: linux-nfc@lists.01.org (subscribers-only)
|
||||
S: Supported
|
||||
F: drivers/nfc/virtual_ncidev.c
|
||||
F: tools/testing/selftests/nci/
|
||||
@ -14872,12 +14870,12 @@ M: Sagi Grimberg <sagi@grimberg.me>
|
||||
L: linux-nvme@lists.infradead.org
|
||||
S: Supported
|
||||
W: http://git.infradead.org/nvme.git
|
||||
T: git://git.infradead.org/nvme.git
|
||||
T: git git://git.infradead.org/nvme.git
|
||||
F: Documentation/nvme/
|
||||
F: drivers/nvme/host/
|
||||
F: drivers/nvme/common/
|
||||
F: include/linux/nvme.h
|
||||
F: drivers/nvme/host/
|
||||
F: include/linux/nvme-*.h
|
||||
F: include/linux/nvme.h
|
||||
F: include/uapi/linux/nvme_ioctl.h
|
||||
|
||||
NVM EXPRESS FABRICS AUTHENTICATION
|
||||
@ -14912,7 +14910,7 @@ M: Chaitanya Kulkarni <kch@nvidia.com>
|
||||
L: linux-nvme@lists.infradead.org
|
||||
S: Supported
|
||||
W: http://git.infradead.org/nvme.git
|
||||
T: git://git.infradead.org/nvme.git
|
||||
T: git git://git.infradead.org/nvme.git
|
||||
F: drivers/nvme/target/
|
||||
|
||||
NVMEM FRAMEWORK
|
||||
@ -15042,7 +15040,6 @@ F: Documentation/devicetree/bindings/sound/nxp,tfa989x.yaml
|
||||
F: sound/soc/codecs/tfa989x.c
|
||||
|
||||
NXP-NCI NFC DRIVER
|
||||
L: linux-nfc@lists.01.org (subscribers-only)
|
||||
S: Orphan
|
||||
F: Documentation/devicetree/bindings/net/nfc/nxp,nci.yaml
|
||||
F: drivers/nfc/nxp-nci
|
||||
@ -15079,7 +15076,7 @@ F: Documentation/hwmon/nzxt-smart2.rst
|
||||
F: drivers/hwmon/nzxt-smart2.c
|
||||
|
||||
OBJAGG
|
||||
M: Jiri Pirko <jiri@nvidia.com>
|
||||
M: Jiri Pirko <jiri@resnulli.us>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: include/linux/objagg.h
|
||||
@ -15853,7 +15850,7 @@ F: drivers/video/logo/logo_parisc*
|
||||
F: include/linux/hp_sdc.h
|
||||
|
||||
PARMAN
|
||||
M: Jiri Pirko <jiri@nvidia.com>
|
||||
M: Jiri Pirko <jiri@resnulli.us>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: include/linux/parman.h
|
||||
@ -17990,7 +17987,7 @@ F: Documentation/devicetree/bindings/spi/microchip,mpfs-spi.yaml
|
||||
F: Documentation/devicetree/bindings/usb/microchip,mpfs-musb.yaml
|
||||
F: arch/riscv/boot/dts/microchip/
|
||||
F: drivers/char/hw_random/mpfs-rng.c
|
||||
F: drivers/clk/microchip/clk-mpfs.c
|
||||
F: drivers/clk/microchip/clk-mpfs*.c
|
||||
F: drivers/i2c/busses/i2c-microchip-corei2c.c
|
||||
F: drivers/mailbox/mailbox-mpfs.c
|
||||
F: drivers/pci/controller/pcie-microchip-host.c
|
||||
@ -18291,8 +18288,9 @@ F: drivers/s390/block/dasd*
|
||||
F: include/linux/dasd_mod.h
|
||||
|
||||
S390 IOMMU (PCI)
|
||||
M: Niklas Schnelle <schnelle@linux.ibm.com>
|
||||
M: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||
M: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
|
||||
R: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
|
||||
L: linux-s390@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/iommu/s390-iommu.c
|
||||
@ -18487,7 +18485,6 @@ F: include/media/drv-intf/s3c_camif.h
|
||||
|
||||
SAMSUNG S3FWRN5 NFC DRIVER
|
||||
M: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
L: linux-nfc@lists.01.org (subscribers-only)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/net/nfc/samsung,s3fwrn5.yaml
|
||||
F: drivers/nfc/s3fwrn5
|
||||
@ -18802,7 +18799,7 @@ F: include/uapi/linux/sed*
|
||||
SECURITY CONTACT
|
||||
M: Security Officers <security@kernel.org>
|
||||
S: Supported
|
||||
F: Documentation/admin-guide/security-bugs.rst
|
||||
F: Documentation/process/security-bugs.rst
|
||||
|
||||
SECURITY SUBSYSTEM
|
||||
M: Paul Moore <paul@paul-moore.com>
|
||||
@ -19150,9 +19147,7 @@ W: http://www.brownhat.org/sis900.html
|
||||
F: drivers/net/ethernet/sis/sis900.*
|
||||
|
||||
SIS FRAMEBUFFER DRIVER
|
||||
M: Thomas Winischhofer <thomas@winischhofer.net>
|
||||
S: Maintained
|
||||
W: http://www.winischhofer.net/linuxsisvga.shtml
|
||||
S: Orphan
|
||||
F: Documentation/fb/sisfb.rst
|
||||
F: drivers/video/fbdev/sis/
|
||||
F: include/video/sisfb.h
|
||||
@ -20647,7 +20642,6 @@ F: sound/soc/codecs/tscs*.h
|
||||
TENSILICA XTENSA PORT (xtensa)
|
||||
M: Chris Zankel <chris@zankel.net>
|
||||
M: Max Filippov <jcmvbkbc@gmail.com>
|
||||
L: linux-xtensa@linux-xtensa.org
|
||||
S: Maintained
|
||||
T: git https://github.com/jcmvbkbc/linux-xtensa.git
|
||||
F: arch/xtensa/
|
||||
@ -20983,7 +20977,6 @@ F: drivers/iio/magnetometer/tmag5273.c
|
||||
TI TRF7970A NFC DRIVER
|
||||
M: Mark Greer <mgreer@animalcreek.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: linux-nfc@lists.01.org (subscribers-only)
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/net/nfc/ti,trf7970a.yaml
|
||||
F: drivers/nfc/trf7970a.c
|
||||
@ -21645,6 +21638,7 @@ USB OVER IP DRIVER
|
||||
M: Valentina Manea <valentina.manea.m@gmail.com>
|
||||
M: Shuah Khan <shuah@kernel.org>
|
||||
M: Shuah Khan <skhan@linuxfoundation.org>
|
||||
R: Hongren Zheng <i@zenithal.me>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/usb/usbip_protocol.rst
|
||||
@ -23039,7 +23033,6 @@ F: drivers/gpio/gpio-xra1403.c
|
||||
|
||||
XTENSA XTFPGA PLATFORM SUPPORT
|
||||
M: Max Filippov <jcmvbkbc@gmail.com>
|
||||
L: linux-xtensa@linux-xtensa.org
|
||||
S: Maintained
|
||||
F: drivers/spi/spi-xtensa-xtfpga.c
|
||||
F: sound/soc/xtensa/xtfpga-i2s.c
|
||||
|
13
Makefile
13
Makefile
@ -2,7 +2,7 @@
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 3
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Hurr durr I'ma ninja sloth
|
||||
|
||||
# *DOCUMENTATION*
|
||||
@ -274,8 +274,7 @@ no-dot-config-targets := $(clean-targets) \
|
||||
cscope gtags TAGS tags help% %docs check% coccicheck \
|
||||
$(version_h) headers headers_% archheaders archscripts \
|
||||
%asm-generic kernelversion %src-pkg dt_binding_check \
|
||||
outputmakefile rustavailable rustfmt rustfmtcheck \
|
||||
scripts_package
|
||||
outputmakefile rustavailable rustfmt rustfmtcheck
|
||||
# Installation targets should not require compiler. Unfortunately, vdso_install
|
||||
# is an exception where build artifacts may be updated. This must be fixed.
|
||||
no-compiler-targets := $(no-dot-config-targets) install dtbs_install \
|
||||
@ -1605,7 +1604,7 @@ MRPROPER_FILES += include/config include/generated \
|
||||
certs/signing_key.pem \
|
||||
certs/x509.genkey \
|
||||
vmlinux-gdb.py \
|
||||
*.spec \
|
||||
*.spec rpmbuild \
|
||||
rust/libmacros.so
|
||||
|
||||
# clean - Delete most, but leave enough to build external modules
|
||||
@ -1656,10 +1655,6 @@ distclean: mrproper
|
||||
%pkg: include/config/kernel.release FORCE
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.package $@
|
||||
|
||||
PHONY += scripts_package
|
||||
scripts_package: scripts_basic
|
||||
$(Q)$(MAKE) $(build)=scripts scripts/list-gitignored
|
||||
|
||||
# Brief documentation of the typical targets used
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@ -1886,6 +1881,8 @@ endif
|
||||
|
||||
else # KBUILD_EXTMOD
|
||||
|
||||
filechk_kernel.release = echo $(KERNELRELEASE)
|
||||
|
||||
###
|
||||
# External module support.
|
||||
# When building external modules the kernel used as basis is considered
|
||||
|
@ -311,6 +311,7 @@
|
||||
|
||||
&usbotg1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_usbotg1>;
|
||||
disable-over-current;
|
||||
srp-disable;
|
||||
hnp-disable;
|
||||
|
@ -321,6 +321,7 @@
|
||||
|
||||
&usbotg1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_usbotg1>;
|
||||
disable-over-current;
|
||||
srp-disable;
|
||||
hnp-disable;
|
||||
|
@ -625,6 +625,7 @@
|
||||
|
||||
&usbotg1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_usbotg1>;
|
||||
disable-over-current;
|
||||
srp-disable;
|
||||
hnp-disable;
|
||||
|
@ -27,6 +27,16 @@
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
sbl_region: sbl@2f00000 {
|
||||
reg = <0x02f00000 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
external_image_region: external-image@3100000 {
|
||||
reg = <0x03100000 0x200000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
adsp_region: adsp@3300000 {
|
||||
reg = <0x03300000 0x1400000>;
|
||||
no-map;
|
||||
|
@ -116,7 +116,7 @@ __copy_to_user_memcpy(void __user *to, const void *from, unsigned long n)
|
||||
tocopy = n;
|
||||
|
||||
ua_flags = uaccess_save_and_enable();
|
||||
memcpy((void *)to, from, tocopy);
|
||||
__memcpy((void *)to, from, tocopy);
|
||||
uaccess_restore(ua_flags);
|
||||
to += tocopy;
|
||||
from += tocopy;
|
||||
@ -178,7 +178,7 @@ __clear_user_memset(void __user *addr, unsigned long n)
|
||||
tocopy = n;
|
||||
|
||||
ua_flags = uaccess_save_and_enable();
|
||||
memset((void *)addr, 0, tocopy);
|
||||
__memset((void *)addr, 0, tocopy);
|
||||
uaccess_restore(ua_flags);
|
||||
addr += tocopy;
|
||||
n -= tocopy;
|
||||
|
@ -56,14 +56,10 @@
|
||||
};
|
||||
|
||||
&enetc_port2 {
|
||||
nvmem-cells = <&base_mac_address 2>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&enetc_port3 {
|
||||
nvmem-cells = <&base_mac_address 3>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@ -84,8 +80,6 @@
|
||||
managed = "in-band-status";
|
||||
phy-handle = <&qsgmii_phy0>;
|
||||
phy-mode = "qsgmii";
|
||||
nvmem-cells = <&base_mac_address 4>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@ -94,8 +88,6 @@
|
||||
managed = "in-band-status";
|
||||
phy-handle = <&qsgmii_phy1>;
|
||||
phy-mode = "qsgmii";
|
||||
nvmem-cells = <&base_mac_address 5>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@ -104,8 +96,6 @@
|
||||
managed = "in-band-status";
|
||||
phy-handle = <&qsgmii_phy2>;
|
||||
phy-mode = "qsgmii";
|
||||
nvmem-cells = <&base_mac_address 6>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@ -114,8 +104,6 @@
|
||||
managed = "in-band-status";
|
||||
phy-handle = <&qsgmii_phy3>;
|
||||
phy-mode = "qsgmii";
|
||||
nvmem-cells = <&base_mac_address 7>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
@ -55,7 +55,5 @@
|
||||
&enetc_port1 {
|
||||
phy-handle = <&phy0>;
|
||||
phy-mode = "rgmii-id";
|
||||
nvmem-cells = <&base_mac_address 0>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -36,14 +36,10 @@
|
||||
};
|
||||
|
||||
&enetc_port2 {
|
||||
nvmem-cells = <&base_mac_address 2>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&enetc_port3 {
|
||||
nvmem-cells = <&base_mac_address 3>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@ -56,8 +52,6 @@
|
||||
managed = "in-band-status";
|
||||
phy-handle = <&phy0>;
|
||||
phy-mode = "sgmii";
|
||||
nvmem-cells = <&base_mac_address 0>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@ -66,8 +60,6 @@
|
||||
managed = "in-band-status";
|
||||
phy-handle = <&phy1>;
|
||||
phy-mode = "sgmii";
|
||||
nvmem-cells = <&base_mac_address 1>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
@ -43,7 +43,5 @@
|
||||
&enetc_port1 {
|
||||
phy-handle = <&phy1>;
|
||||
phy-mode = "rgmii-id";
|
||||
nvmem-cells = <&base_mac_address 1>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -92,8 +92,6 @@
|
||||
phy-handle = <&phy0>;
|
||||
phy-mode = "sgmii";
|
||||
managed = "in-band-status";
|
||||
nvmem-cells = <&base_mac_address 0>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@ -156,21 +154,6 @@
|
||||
label = "bootloader environment";
|
||||
};
|
||||
};
|
||||
|
||||
otp-1 {
|
||||
compatible = "user-otp";
|
||||
|
||||
nvmem-layout {
|
||||
compatible = "kontron,sl28-vpd";
|
||||
|
||||
serial_number: serial-number {
|
||||
};
|
||||
|
||||
base_mac_address: base-mac-address {
|
||||
#nvmem-cell-cells = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -117,7 +117,7 @@ lsio_subsys: bus@5d000000 {
|
||||
interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX_SC_R_FSPI_0 IMX_SC_PM_CLK_PER>,
|
||||
<&clk IMX_SC_R_FSPI_0 IMX_SC_PM_CLK_PER>;
|
||||
clock-names = "fspi", "fspi_en";
|
||||
clock-names = "fspi_en", "fspi";
|
||||
power-domains = <&pd IMX_SC_R_FSPI_0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -121,8 +121,6 @@
|
||||
phy-handle = <ðphy0>;
|
||||
nvmem-cells = <&fec_mac1>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
snps,reset-gpios = <&pca6416_1 2 GPIO_ACTIVE_LOW>;
|
||||
snps,reset-delays-us = <10 20 200000>;
|
||||
status = "okay";
|
||||
|
||||
mdio {
|
||||
@ -136,6 +134,9 @@
|
||||
eee-broken-1000t;
|
||||
qca,disable-smarteee;
|
||||
qca,disable-hibernation-mode;
|
||||
reset-gpios = <&pca6416_1 2 GPIO_ACTIVE_LOW>;
|
||||
reset-assert-us = <20>;
|
||||
reset-deassert-us = <200000>;
|
||||
vddio-supply = <&vddio0>;
|
||||
|
||||
vddio0: vddio-regulator {
|
||||
|
@ -247,7 +247,7 @@
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
clocks = <&clk IMX8MM_CLK_SAI1_ROOT>;
|
||||
clock-names = "mclk1";
|
||||
clock-names = "mclk";
|
||||
wlf,shared-lrclk;
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
||||
|
@ -296,6 +296,7 @@
|
||||
sai2: sai@30020000 {
|
||||
compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai";
|
||||
reg = <0x30020000 0x10000>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX8MN_CLK_SAI2_IPG>,
|
||||
<&clk IMX8MN_CLK_DUMMY>,
|
||||
@ -310,6 +311,7 @@
|
||||
sai3: sai@30030000 {
|
||||
compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai";
|
||||
reg = <0x30030000 0x10000>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX8MN_CLK_SAI3_IPG>,
|
||||
<&clk IMX8MN_CLK_DUMMY>,
|
||||
@ -324,6 +326,7 @@
|
||||
sai5: sai@30050000 {
|
||||
compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai";
|
||||
reg = <0x30050000 0x10000>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX8MN_CLK_SAI5_IPG>,
|
||||
<&clk IMX8MN_CLK_DUMMY>,
|
||||
@ -340,6 +343,7 @@
|
||||
sai6: sai@30060000 {
|
||||
compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai";
|
||||
reg = <0x30060000 0x10000>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX8MN_CLK_SAI6_IPG>,
|
||||
<&clk IMX8MN_CLK_DUMMY>,
|
||||
@ -397,6 +401,7 @@
|
||||
sai7: sai@300b0000 {
|
||||
compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai";
|
||||
reg = <0x300b0000 0x10000>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX8MN_CLK_SAI7_IPG>,
|
||||
<&clk IMX8MN_CLK_DUMMY>,
|
||||
|
@ -1131,8 +1131,8 @@
|
||||
reg = <0x32e90000 0x238>;
|
||||
interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX8MP_CLK_MEDIA_DISP2_PIX_ROOT>,
|
||||
<&clk IMX8MP_CLK_MEDIA_AXI_ROOT>,
|
||||
<&clk IMX8MP_CLK_MEDIA_APB_ROOT>;
|
||||
<&clk IMX8MP_CLK_MEDIA_APB_ROOT>,
|
||||
<&clk IMX8MP_CLK_MEDIA_AXI_ROOT>;
|
||||
clock-names = "pix", "axi", "disp_axi";
|
||||
assigned-clocks = <&clk IMX8MP_CLK_MEDIA_DISP2_PIX>,
|
||||
<&clk IMX8MP_VIDEO_PLL1>;
|
||||
|
@ -164,6 +164,8 @@
|
||||
lpi2c1: i2c@44340000 {
|
||||
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
|
||||
reg = <0x44340000 0x10000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX93_CLK_LPI2C1_GATE>,
|
||||
<&clk IMX93_CLK_BUS_AON>;
|
||||
@ -174,6 +176,8 @@
|
||||
lpi2c2: i2c@44350000 {
|
||||
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
|
||||
reg = <0x44350000 0x10000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX93_CLK_LPI2C2_GATE>,
|
||||
<&clk IMX93_CLK_BUS_AON>;
|
||||
@ -343,6 +347,8 @@
|
||||
lpi2c3: i2c@42530000 {
|
||||
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
|
||||
reg = <0x42530000 0x10000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX93_CLK_LPI2C3_GATE>,
|
||||
<&clk IMX93_CLK_BUS_WAKEUP>;
|
||||
@ -353,6 +359,8 @@
|
||||
lpi2c4: i2c@42540000 {
|
||||
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
|
||||
reg = <0x42540000 0x10000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX93_CLK_LPI2C4_GATE>,
|
||||
<&clk IMX93_CLK_BUS_WAKEUP>;
|
||||
@ -455,6 +463,8 @@
|
||||
lpi2c5: i2c@426b0000 {
|
||||
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
|
||||
reg = <0x426b0000 0x10000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <GIC_SPI 195 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX93_CLK_LPI2C5_GATE>,
|
||||
<&clk IMX93_CLK_BUS_WAKEUP>;
|
||||
@ -465,6 +475,8 @@
|
||||
lpi2c6: i2c@426c0000 {
|
||||
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
|
||||
reg = <0x426c0000 0x10000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX93_CLK_LPI2C6_GATE>,
|
||||
<&clk IMX93_CLK_BUS_WAKEUP>;
|
||||
@ -475,6 +487,8 @@
|
||||
lpi2c7: i2c@426d0000 {
|
||||
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
|
||||
reg = <0x426d0000 0x10000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX93_CLK_LPI2C7_GATE>,
|
||||
<&clk IMX93_CLK_BUS_WAKEUP>;
|
||||
@ -485,6 +499,8 @@
|
||||
lpi2c8: i2c@426e0000 {
|
||||
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
|
||||
reg = <0x426e0000 0x10000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX93_CLK_LPI2C8_GATE>,
|
||||
<&clk IMX93_CLK_BUS_WAKEUP>;
|
||||
@ -580,9 +596,9 @@
|
||||
eqos: ethernet@428a0000 {
|
||||
compatible = "nxp,imx93-dwmac-eqos", "snps,dwmac-5.10a";
|
||||
reg = <0x428a0000 0x10000>;
|
||||
interrupts = <GIC_SPI 183 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "eth_wake_irq", "macirq";
|
||||
interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 183 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "macirq", "eth_wake_irq";
|
||||
clocks = <&clk IMX93_CLK_ENET_QOS_GATE>,
|
||||
<&clk IMX93_CLK_ENET_QOS_GATE>,
|
||||
<&clk IMX93_CLK_ENET_TIMER2>,
|
||||
@ -595,7 +611,7 @@
|
||||
<&clk IMX93_CLK_SYS_PLL_PFD0_DIV2>;
|
||||
assigned-clock-rates = <100000000>, <250000000>;
|
||||
intf_mode = <&wakeupmix_gpr 0x28>;
|
||||
clk_csr = <0>;
|
||||
snps,clk-csr = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges = <0x0 0x0 0x0 0x0 0x0 0x40000000>;
|
||||
ranges = <0x0 0x0 0x0 0x0 0x100 0x0>;
|
||||
|
||||
apbmisc: misc@100000 {
|
||||
compatible = "nvidia,tegra194-misc";
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges = <0x0 0x0 0x0 0x0 0x0 0x40000000>;
|
||||
ranges = <0x0 0x0 0x0 0x0 0x100 0x0>;
|
||||
|
||||
misc@100000 {
|
||||
compatible = "nvidia,tegra234-misc";
|
||||
|
@ -33,7 +33,3 @@
|
||||
&gpio_leds_default {
|
||||
pins = "gpio81", "gpio82", "gpio83";
|
||||
};
|
||||
|
||||
&sim_ctrl_default {
|
||||
pins = "gpio1", "gpio2";
|
||||
};
|
||||
|
@ -25,6 +25,11 @@
|
||||
gpios = <&msmgpio 20 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
&mpss {
|
||||
pinctrl-0 = <&sim_ctrl_default>;
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
&button_default {
|
||||
pins = "gpio37";
|
||||
bias-pull-down;
|
||||
@ -34,6 +39,25 @@
|
||||
pins = "gpio20", "gpio21", "gpio22";
|
||||
};
|
||||
|
||||
&sim_ctrl_default {
|
||||
pins = "gpio1", "gpio2";
|
||||
/* This selects the external SIM card slot by default */
|
||||
&msmgpio {
|
||||
sim_ctrl_default: sim-ctrl-default-state {
|
||||
esim-sel-pins {
|
||||
pins = "gpio0", "gpio3";
|
||||
bias-disable;
|
||||
output-low;
|
||||
};
|
||||
|
||||
sim-en-pins {
|
||||
pins = "gpio1";
|
||||
bias-disable;
|
||||
output-low;
|
||||
};
|
||||
|
||||
sim-sel-pins {
|
||||
pins = "gpio2";
|
||||
bias-disable;
|
||||
output-high;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -92,9 +92,6 @@
|
||||
};
|
||||
|
||||
&mpss {
|
||||
pinctrl-0 = <&sim_ctrl_default>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@ -240,11 +237,4 @@
|
||||
drive-strength = <2>;
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
sim_ctrl_default: sim-ctrl-default-state {
|
||||
function = "gpio";
|
||||
drive-strength = <2>;
|
||||
bias-disable;
|
||||
output-low;
|
||||
};
|
||||
};
|
||||
|
@ -241,7 +241,7 @@
|
||||
};
|
||||
|
||||
&remoteproc_nsp0 {
|
||||
firmware-name = "qcom/sa8540p/cdsp.mbn";
|
||||
firmware-name = "qcom/sa8540p/cdsp0.mbn";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
@ -2131,6 +2131,8 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie1_clkreq_n>;
|
||||
|
||||
dma-coherent;
|
||||
|
||||
iommus = <&apps_smmu 0x1c80 0x1>;
|
||||
|
||||
iommu-map = <0x0 &apps_smmu 0x1c80 0x1>,
|
||||
|
@ -370,6 +370,7 @@
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vreg_s11b: smps11 {
|
||||
@ -377,6 +378,7 @@
|
||||
regulator-min-microvolt = <1272000>;
|
||||
regulator-max-microvolt = <1272000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vreg_s12b: smps12 {
|
||||
@ -384,6 +386,7 @@
|
||||
regulator-min-microvolt = <984000>;
|
||||
regulator-max-microvolt = <984000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vreg_l3b: ldo3 {
|
||||
@ -441,6 +444,7 @@
|
||||
regulator-min-microvolt = <3008000>;
|
||||
regulator-max-microvolt = <3960000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_AUTO>;
|
||||
regulator-always-on;
|
||||
};
|
||||
};
|
||||
|
||||
@ -772,75 +776,88 @@
|
||||
pmic-die-temp@3 {
|
||||
reg = <PMK8350_ADC7_DIE_TEMP>;
|
||||
qcom,pre-scaling = <1 1>;
|
||||
label = "pmk8350_die_temp";
|
||||
};
|
||||
|
||||
xo-therm@44 {
|
||||
reg = <PMK8350_ADC7_AMUX_THM1_100K_PU>;
|
||||
qcom,hw-settle-time = <200>;
|
||||
qcom,ratiometric;
|
||||
label = "pmk8350_xo_therm";
|
||||
};
|
||||
|
||||
pmic-die-temp@103 {
|
||||
reg = <PM8350_ADC7_DIE_TEMP(1)>;
|
||||
qcom,pre-scaling = <1 1>;
|
||||
label = "pmc8280_1_die_temp";
|
||||
};
|
||||
|
||||
sys-therm@144 {
|
||||
reg = <PM8350_ADC7_AMUX_THM1_100K_PU(1)>;
|
||||
qcom,hw-settle-time = <200>;
|
||||
qcom,ratiometric;
|
||||
label = "sys_therm1";
|
||||
};
|
||||
|
||||
sys-therm@145 {
|
||||
reg = <PM8350_ADC7_AMUX_THM2_100K_PU(1)>;
|
||||
qcom,hw-settle-time = <200>;
|
||||
qcom,ratiometric;
|
||||
label = "sys_therm2";
|
||||
};
|
||||
|
||||
sys-therm@146 {
|
||||
reg = <PM8350_ADC7_AMUX_THM3_100K_PU(1)>;
|
||||
qcom,hw-settle-time = <200>;
|
||||
qcom,ratiometric;
|
||||
label = "sys_therm3";
|
||||
};
|
||||
|
||||
sys-therm@147 {
|
||||
reg = <PM8350_ADC7_AMUX_THM4_100K_PU(1)>;
|
||||
qcom,hw-settle-time = <200>;
|
||||
qcom,ratiometric;
|
||||
label = "sys_therm4";
|
||||
};
|
||||
|
||||
pmic-die-temp@303 {
|
||||
reg = <PM8350_ADC7_DIE_TEMP(3)>;
|
||||
qcom,pre-scaling = <1 1>;
|
||||
label = "pmc8280_2_die_temp";
|
||||
};
|
||||
|
||||
sys-therm@344 {
|
||||
reg = <PM8350_ADC7_AMUX_THM1_100K_PU(3)>;
|
||||
qcom,hw-settle-time = <200>;
|
||||
qcom,ratiometric;
|
||||
label = "sys_therm5";
|
||||
};
|
||||
|
||||
sys-therm@345 {
|
||||
reg = <PM8350_ADC7_AMUX_THM2_100K_PU(3)>;
|
||||
qcom,hw-settle-time = <200>;
|
||||
qcom,ratiometric;
|
||||
label = "sys_therm6";
|
||||
};
|
||||
|
||||
sys-therm@346 {
|
||||
reg = <PM8350_ADC7_AMUX_THM3_100K_PU(3)>;
|
||||
qcom,hw-settle-time = <200>;
|
||||
qcom,ratiometric;
|
||||
label = "sys_therm7";
|
||||
};
|
||||
|
||||
sys-therm@347 {
|
||||
reg = <PM8350_ADC7_AMUX_THM4_100K_PU(3)>;
|
||||
qcom,hw-settle-time = <200>;
|
||||
qcom,ratiometric;
|
||||
label = "sys_therm8";
|
||||
};
|
||||
|
||||
pmic-die-temp@403 {
|
||||
reg = <PMR735A_ADC7_DIE_TEMP>;
|
||||
qcom,pre-scaling = <1 1>;
|
||||
label = "pmr735a_die_temp";
|
||||
};
|
||||
};
|
||||
|
||||
@ -884,9 +901,9 @@
|
||||
"VA DMIC0", "MIC BIAS1",
|
||||
"VA DMIC1", "MIC BIAS1",
|
||||
"VA DMIC2", "MIC BIAS3",
|
||||
"TX DMIC0", "MIC BIAS1",
|
||||
"TX DMIC1", "MIC BIAS2",
|
||||
"TX DMIC2", "MIC BIAS3",
|
||||
"VA DMIC0", "VA MIC BIAS1",
|
||||
"VA DMIC1", "VA MIC BIAS1",
|
||||
"VA DMIC2", "VA MIC BIAS3",
|
||||
"TX SWR_ADC1", "ADC2_OUTPUT";
|
||||
|
||||
wcd-playback-dai-link {
|
||||
@ -937,7 +954,7 @@
|
||||
va-dai-link {
|
||||
link-name = "VA Capture";
|
||||
cpu {
|
||||
sound-dai = <&q6apmbedai TX_CODEC_DMA_TX_3>;
|
||||
sound-dai = <&q6apmbedai VA_CODEC_DMA_TX_0>;
|
||||
};
|
||||
|
||||
platform {
|
||||
@ -1062,7 +1079,7 @@
|
||||
|
||||
vdd-micb-supply = <&vreg_s10b>;
|
||||
|
||||
qcom,dmic-sample-rate = <600000>;
|
||||
qcom,dmic-sample-rate = <4800000>;
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -2504,12 +2504,12 @@
|
||||
qcom,ports-sinterval-low = /bits/ 8 <0x03 0x1f 0x1f 0x07 0x00>;
|
||||
qcom,ports-offset1 = /bits/ 8 <0x00 0x00 0x0B 0x01 0x00>;
|
||||
qcom,ports-offset2 = /bits/ 8 <0x00 0x00 0x0B 0x00 0x00>;
|
||||
qcom,ports-hstart = /bits/ 8 <0xff 0x03 0xff 0xff 0xff>;
|
||||
qcom,ports-hstop = /bits/ 8 <0xff 0x06 0xff 0xff 0xff>;
|
||||
qcom,ports-hstart = /bits/ 8 <0xff 0x03 0x00 0xff 0xff>;
|
||||
qcom,ports-hstop = /bits/ 8 <0xff 0x06 0x0f 0xff 0xff>;
|
||||
qcom,ports-word-length = /bits/ 8 <0x01 0x07 0x04 0xff 0xff>;
|
||||
qcom,ports-block-pack-mode = /bits/ 8 <0xff 0x00 0x01 0xff 0xff>;
|
||||
qcom,ports-block-pack-mode = /bits/ 8 <0xff 0xff 0x01 0xff 0xff>;
|
||||
qcom,ports-lane-control = /bits/ 8 <0x01 0x00 0x00 0x00 0x00>;
|
||||
qcom,ports-block-group-count = /bits/ 8 <0xff 0xff 0xff 0xff 0x00>;
|
||||
qcom,ports-block-group-count = /bits/ 8 <0xff 0xff 0xff 0xff 0xff>;
|
||||
|
||||
#sound-dai-cells = <1>;
|
||||
#address-cells = <2>;
|
||||
@ -2600,7 +2600,7 @@
|
||||
<&intc GIC_SPI 520 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "core", "wake";
|
||||
|
||||
clocks = <&vamacro>;
|
||||
clocks = <&txmacro>;
|
||||
clock-names = "iface";
|
||||
label = "TX";
|
||||
#sound-dai-cells = <1>;
|
||||
@ -2609,15 +2609,15 @@
|
||||
|
||||
qcom,din-ports = <4>;
|
||||
qcom,dout-ports = <0>;
|
||||
qcom,ports-sinterval-low = /bits/ 8 <0x01 0x03 0x03 0x03>;
|
||||
qcom,ports-offset1 = /bits/ 8 <0x01 0x00 0x02 0x01>;
|
||||
qcom,ports-sinterval-low = /bits/ 8 <0x01 0x01 0x03 0x03>;
|
||||
qcom,ports-offset1 = /bits/ 8 <0x01 0x00 0x02 0x00>;
|
||||
qcom,ports-offset2 = /bits/ 8 <0x00 0x00 0x00 0x00>;
|
||||
qcom,ports-block-pack-mode = /bits/ 8 <0xff 0xff 0xff 0xff>;
|
||||
qcom,ports-hstart = /bits/ 8 <0xff 0xff 0xff 0xff>;
|
||||
qcom,ports-hstop = /bits/ 8 <0xff 0xff 0xff 0xff>;
|
||||
qcom,ports-word-length = /bits/ 8 <0xff 0x00 0xff 0xff>;
|
||||
qcom,ports-word-length = /bits/ 8 <0xff 0xff 0xff 0xff>;
|
||||
qcom,ports-block-group-count = /bits/ 8 <0xff 0xff 0xff 0xff>;
|
||||
qcom,ports-lane-control = /bits/ 8 <0x00 0x01 0x00 0x00>;
|
||||
qcom,ports-lane-control = /bits/ 8 <0x00 0x01 0x00 0x01>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -1078,6 +1078,7 @@
|
||||
dma-names = "tx", "rx";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -1209,6 +1209,7 @@
|
||||
clock-names = "xo";
|
||||
|
||||
power-domains = <&rpmpd SM6375_VDDCX>;
|
||||
power-domain-names = "cx";
|
||||
|
||||
memory-region = <&pil_cdsp_mem>;
|
||||
|
||||
|
@ -1826,7 +1826,7 @@
|
||||
"slave_q2a",
|
||||
"tbu";
|
||||
|
||||
iommus = <&apps_smmu 0x1d80 0x7f>;
|
||||
iommus = <&apps_smmu 0x1d80 0x3f>;
|
||||
iommu-map = <0x0 &apps_smmu 0x1d80 0x1>,
|
||||
<0x100 &apps_smmu 0x1d81 0x1>;
|
||||
|
||||
@ -1925,7 +1925,7 @@
|
||||
assigned-clocks = <&gcc GCC_PCIE_1_AUX_CLK>;
|
||||
assigned-clock-rates = <19200000>;
|
||||
|
||||
iommus = <&apps_smmu 0x1e00 0x7f>;
|
||||
iommus = <&apps_smmu 0x1e00 0x3f>;
|
||||
iommu-map = <0x0 &apps_smmu 0x1e00 0x1>,
|
||||
<0x100 &apps_smmu 0x1e01 0x1>;
|
||||
|
||||
|
@ -625,6 +625,6 @@
|
||||
};
|
||||
|
||||
&venus {
|
||||
firmware-name = "qcom/sm8250/elish/venus.mbn";
|
||||
firmware-name = "qcom/sm8250/xiaomi/elish/venus.mbn";
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -1664,6 +1664,7 @@
|
||||
power-domains = <&gcc UFS_PHY_GDSC>;
|
||||
|
||||
iommus = <&apps_smmu 0xe0 0x0>;
|
||||
dma-coherent;
|
||||
|
||||
clock-names =
|
||||
"core_clk",
|
||||
|
@ -2143,8 +2143,8 @@
|
||||
<&q6prmcc LPASS_HW_DCODEC_VOTE LPASS_CLK_ATTRIBUTE_COUPLE_NO>,
|
||||
<&vamacro>;
|
||||
clock-names = "mclk", "npl", "macro", "dcodec", "fsgen";
|
||||
assigned-clocks = <&q6prmcc LPASS_CLK_ID_WSA_CORE_TX_MCLK LPASS_CLK_ATTRIBUTE_COUPLE_NO>,
|
||||
<&q6prmcc LPASS_CLK_ID_WSA_CORE_TX_2X_MCLK LPASS_CLK_ATTRIBUTE_COUPLE_NO>;
|
||||
assigned-clocks = <&q6prmcc LPASS_CLK_ID_WSA2_CORE_TX_MCLK LPASS_CLK_ATTRIBUTE_COUPLE_NO>,
|
||||
<&q6prmcc LPASS_CLK_ID_WSA2_CORE_TX_2X_MCLK LPASS_CLK_ATTRIBUTE_COUPLE_NO>;
|
||||
assigned-clock-rates = <19200000>, <19200000>;
|
||||
|
||||
#clock-cells = <0>;
|
||||
@ -4003,6 +4003,7 @@
|
||||
power-domains = <&gcc UFS_PHY_GDSC>;
|
||||
|
||||
iommus = <&apps_smmu 0xe0 0x0>;
|
||||
dma-coherent;
|
||||
|
||||
interconnects = <&aggre1_noc MASTER_UFS_MEM 0 &mc_virt SLAVE_EBI1 0>,
|
||||
<&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_UFS_MEM_CFG 0>;
|
||||
|
@ -66,7 +66,7 @@
|
||||
|
||||
CPU0: cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "qcom,kryo";
|
||||
compatible = "arm,cortex-a510";
|
||||
reg = <0 0>;
|
||||
enable-method = "psci";
|
||||
next-level-cache = <&L2_0>;
|
||||
@ -89,7 +89,7 @@
|
||||
|
||||
CPU1: cpu@100 {
|
||||
device_type = "cpu";
|
||||
compatible = "qcom,kryo";
|
||||
compatible = "arm,cortex-a510";
|
||||
reg = <0 0x100>;
|
||||
enable-method = "psci";
|
||||
next-level-cache = <&L2_100>;
|
||||
@ -108,7 +108,7 @@
|
||||
|
||||
CPU2: cpu@200 {
|
||||
device_type = "cpu";
|
||||
compatible = "qcom,kryo";
|
||||
compatible = "arm,cortex-a510";
|
||||
reg = <0 0x200>;
|
||||
enable-method = "psci";
|
||||
next-level-cache = <&L2_200>;
|
||||
@ -127,7 +127,7 @@
|
||||
|
||||
CPU3: cpu@300 {
|
||||
device_type = "cpu";
|
||||
compatible = "qcom,kryo";
|
||||
compatible = "arm,cortex-a715";
|
||||
reg = <0 0x300>;
|
||||
enable-method = "psci";
|
||||
next-level-cache = <&L2_300>;
|
||||
@ -146,7 +146,7 @@
|
||||
|
||||
CPU4: cpu@400 {
|
||||
device_type = "cpu";
|
||||
compatible = "qcom,kryo";
|
||||
compatible = "arm,cortex-a715";
|
||||
reg = <0 0x400>;
|
||||
enable-method = "psci";
|
||||
next-level-cache = <&L2_400>;
|
||||
@ -165,7 +165,7 @@
|
||||
|
||||
CPU5: cpu@500 {
|
||||
device_type = "cpu";
|
||||
compatible = "qcom,kryo";
|
||||
compatible = "arm,cortex-a710";
|
||||
reg = <0 0x500>;
|
||||
enable-method = "psci";
|
||||
next-level-cache = <&L2_500>;
|
||||
@ -184,7 +184,7 @@
|
||||
|
||||
CPU6: cpu@600 {
|
||||
device_type = "cpu";
|
||||
compatible = "qcom,kryo";
|
||||
compatible = "arm,cortex-a710";
|
||||
reg = <0 0x600>;
|
||||
enable-method = "psci";
|
||||
next-level-cache = <&L2_600>;
|
||||
@ -203,7 +203,7 @@
|
||||
|
||||
CPU7: cpu@700 {
|
||||
device_type = "cpu";
|
||||
compatible = "qcom,kryo";
|
||||
compatible = "arm,cortex-x3";
|
||||
reg = <0 0x700>;
|
||||
enable-method = "psci";
|
||||
next-level-cache = <&L2_700>;
|
||||
@ -1905,6 +1905,7 @@
|
||||
required-opps = <&rpmhpd_opp_nom>;
|
||||
|
||||
iommus = <&apps_smmu 0x60 0x0>;
|
||||
dma-coherent;
|
||||
|
||||
interconnects = <&aggre1_noc MASTER_UFS_MEM 0 &mc_virt SLAVE_EBI1 0>,
|
||||
<&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_UFS_MEM_CFG 0>;
|
||||
@ -1997,7 +1998,7 @@
|
||||
lpass_tlmm: pinctrl@6e80000 {
|
||||
compatible = "qcom,sm8550-lpass-lpi-pinctrl";
|
||||
reg = <0 0x06e80000 0 0x20000>,
|
||||
<0 0x0725a000 0 0x10000>;
|
||||
<0 0x07250000 0 0x10000>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
gpio-ranges = <&lpass_tlmm 0 0 23>;
|
||||
@ -2691,7 +2692,7 @@
|
||||
pins = "gpio28", "gpio29";
|
||||
function = "qup1_se0";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_i2c1_data_clk: qup-i2c1-data-clk-state {
|
||||
@ -2699,7 +2700,7 @@
|
||||
pins = "gpio32", "gpio33";
|
||||
function = "qup1_se1";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_i2c2_data_clk: qup-i2c2-data-clk-state {
|
||||
@ -2707,7 +2708,7 @@
|
||||
pins = "gpio36", "gpio37";
|
||||
function = "qup1_se2";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_i2c3_data_clk: qup-i2c3-data-clk-state {
|
||||
@ -2715,7 +2716,7 @@
|
||||
pins = "gpio40", "gpio41";
|
||||
function = "qup1_se3";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_i2c4_data_clk: qup-i2c4-data-clk-state {
|
||||
@ -2723,7 +2724,7 @@
|
||||
pins = "gpio44", "gpio45";
|
||||
function = "qup1_se4";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_i2c5_data_clk: qup-i2c5-data-clk-state {
|
||||
@ -2731,7 +2732,7 @@
|
||||
pins = "gpio52", "gpio53";
|
||||
function = "qup1_se5";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_i2c6_data_clk: qup-i2c6-data-clk-state {
|
||||
@ -2739,7 +2740,7 @@
|
||||
pins = "gpio48", "gpio49";
|
||||
function = "qup1_se6";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_i2c8_data_clk: qup-i2c8-data-clk-state {
|
||||
@ -2747,14 +2748,14 @@
|
||||
pins = "gpio57";
|
||||
function = "qup2_se0_l1_mira";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
sda-pins {
|
||||
pins = "gpio56";
|
||||
function = "qup2_se0_l0_mira";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
};
|
||||
|
||||
@ -2763,7 +2764,7 @@
|
||||
pins = "gpio60", "gpio61";
|
||||
function = "qup2_se1";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_i2c10_data_clk: qup-i2c10-data-clk-state {
|
||||
@ -2771,7 +2772,7 @@
|
||||
pins = "gpio64", "gpio65";
|
||||
function = "qup2_se2";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_i2c11_data_clk: qup-i2c11-data-clk-state {
|
||||
@ -2779,7 +2780,7 @@
|
||||
pins = "gpio68", "gpio69";
|
||||
function = "qup2_se3";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_i2c12_data_clk: qup-i2c12-data-clk-state {
|
||||
@ -2787,7 +2788,7 @@
|
||||
pins = "gpio2", "gpio3";
|
||||
function = "qup2_se4";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_i2c13_data_clk: qup-i2c13-data-clk-state {
|
||||
@ -2795,7 +2796,7 @@
|
||||
pins = "gpio80", "gpio81";
|
||||
function = "qup2_se5";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_i2c15_data_clk: qup-i2c15-data-clk-state {
|
||||
@ -2803,7 +2804,7 @@
|
||||
pins = "gpio72", "gpio106";
|
||||
function = "qup2_se7";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
bias-pull-up = <2200>;
|
||||
};
|
||||
|
||||
qup_spi0_cs: qup-spi0-cs-state {
|
||||
|
@ -193,6 +193,9 @@ struct kvm_arch {
|
||||
/* Interrupt controller */
|
||||
struct vgic_dist vgic;
|
||||
|
||||
/* Timers */
|
||||
struct arch_timer_vm_data timer_data;
|
||||
|
||||
/* Mandated version of PSCI */
|
||||
u32 psci_version;
|
||||
|
||||
|
@ -66,7 +66,7 @@
|
||||
.long .Lefi_header_end - .L_head // SizeOfHeaders
|
||||
.long 0 // CheckSum
|
||||
.short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem
|
||||
.short 0 // DllCharacteristics
|
||||
.short IMAGE_DLL_CHARACTERISTICS_NX_COMPAT // DllCharacteristics
|
||||
.quad 0 // SizeOfStackReserve
|
||||
.quad 0 // SizeOfStackCommit
|
||||
.quad 0 // SizeOfHeapReserve
|
||||
|
@ -84,14 +84,10 @@ u64 timer_get_cval(struct arch_timer_context *ctxt)
|
||||
|
||||
static u64 timer_get_offset(struct arch_timer_context *ctxt)
|
||||
{
|
||||
struct kvm_vcpu *vcpu = ctxt->vcpu;
|
||||
if (ctxt->offset.vm_offset)
|
||||
return *ctxt->offset.vm_offset;
|
||||
|
||||
switch(arch_timer_ctx_index(ctxt)) {
|
||||
case TIMER_VTIMER:
|
||||
return __vcpu_sys_reg(vcpu, CNTVOFF_EL2);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void timer_set_ctl(struct arch_timer_context *ctxt, u32 ctl)
|
||||
@ -128,15 +124,12 @@ static void timer_set_cval(struct arch_timer_context *ctxt, u64 cval)
|
||||
|
||||
static void timer_set_offset(struct arch_timer_context *ctxt, u64 offset)
|
||||
{
|
||||
struct kvm_vcpu *vcpu = ctxt->vcpu;
|
||||
|
||||
switch(arch_timer_ctx_index(ctxt)) {
|
||||
case TIMER_VTIMER:
|
||||
__vcpu_sys_reg(vcpu, CNTVOFF_EL2) = offset;
|
||||
break;
|
||||
default:
|
||||
if (!ctxt->offset.vm_offset) {
|
||||
WARN(offset, "timer %ld\n", arch_timer_ctx_index(ctxt));
|
||||
return;
|
||||
}
|
||||
|
||||
WRITE_ONCE(*ctxt->offset.vm_offset, offset);
|
||||
}
|
||||
|
||||
u64 kvm_phys_timer_read(void)
|
||||
@ -765,25 +758,6 @@ int kvm_timer_vcpu_reset(struct kvm_vcpu *vcpu)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Make the updates of cntvoff for all vtimer contexts atomic */
|
||||
static void update_vtimer_cntvoff(struct kvm_vcpu *vcpu, u64 cntvoff)
|
||||
{
|
||||
unsigned long i;
|
||||
struct kvm *kvm = vcpu->kvm;
|
||||
struct kvm_vcpu *tmp;
|
||||
|
||||
mutex_lock(&kvm->lock);
|
||||
kvm_for_each_vcpu(i, tmp, kvm)
|
||||
timer_set_offset(vcpu_vtimer(tmp), cntvoff);
|
||||
|
||||
/*
|
||||
* When called from the vcpu create path, the CPU being created is not
|
||||
* included in the loop above, so we just set it here as well.
|
||||
*/
|
||||
timer_set_offset(vcpu_vtimer(vcpu), cntvoff);
|
||||
mutex_unlock(&kvm->lock);
|
||||
}
|
||||
|
||||
void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct arch_timer_cpu *timer = vcpu_timer(vcpu);
|
||||
@ -791,10 +765,11 @@ void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu)
|
||||
struct arch_timer_context *ptimer = vcpu_ptimer(vcpu);
|
||||
|
||||
vtimer->vcpu = vcpu;
|
||||
vtimer->offset.vm_offset = &vcpu->kvm->arch.timer_data.voffset;
|
||||
ptimer->vcpu = vcpu;
|
||||
|
||||
/* Synchronize cntvoff across all vtimers of a VM. */
|
||||
update_vtimer_cntvoff(vcpu, kvm_phys_timer_read());
|
||||
timer_set_offset(vtimer, kvm_phys_timer_read());
|
||||
timer_set_offset(ptimer, 0);
|
||||
|
||||
hrtimer_init(&timer->bg_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD);
|
||||
@ -840,7 +815,7 @@ int kvm_arm_timer_set_reg(struct kvm_vcpu *vcpu, u64 regid, u64 value)
|
||||
break;
|
||||
case KVM_REG_ARM_TIMER_CNT:
|
||||
timer = vcpu_vtimer(vcpu);
|
||||
update_vtimer_cntvoff(vcpu, kvm_phys_timer_read() - value);
|
||||
timer_set_offset(timer, kvm_phys_timer_read() - value);
|
||||
break;
|
||||
case KVM_REG_ARM_TIMER_CVAL:
|
||||
timer = vcpu_vtimer(vcpu);
|
||||
|
@ -44,7 +44,7 @@ static void kvm_ptp_get_time(struct kvm_vcpu *vcpu, u64 *val)
|
||||
feature = smccc_get_arg1(vcpu);
|
||||
switch (feature) {
|
||||
case KVM_PTP_VIRT_COUNTER:
|
||||
cycles = systime_snapshot.cycles - vcpu_read_sys_reg(vcpu, CNTVOFF_EL2);
|
||||
cycles = systime_snapshot.cycles - vcpu->kvm->arch.timer_data.voffset;
|
||||
break;
|
||||
case KVM_PTP_PHYS_COUNTER:
|
||||
cycles = systime_snapshot.cycles;
|
||||
|
@ -666,14 +666,33 @@ static int get_user_mapping_size(struct kvm *kvm, u64 addr)
|
||||
CONFIG_PGTABLE_LEVELS),
|
||||
.mm_ops = &kvm_user_mm_ops,
|
||||
};
|
||||
unsigned long flags;
|
||||
kvm_pte_t pte = 0; /* Keep GCC quiet... */
|
||||
u32 level = ~0;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Disable IRQs so that we hazard against a concurrent
|
||||
* teardown of the userspace page tables (which relies on
|
||||
* IPI-ing threads).
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
ret = kvm_pgtable_get_leaf(&pgt, addr, &pte, &level);
|
||||
VM_BUG_ON(ret);
|
||||
VM_BUG_ON(level >= KVM_PGTABLE_MAX_LEVELS);
|
||||
VM_BUG_ON(!(pte & PTE_VALID));
|
||||
local_irq_restore(flags);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Not seeing an error, but not updating level? Something went
|
||||
* deeply wrong...
|
||||
*/
|
||||
if (WARN_ON(level >= KVM_PGTABLE_MAX_LEVELS))
|
||||
return -EFAULT;
|
||||
|
||||
/* Oops, the userspace PTs are gone... Replay the fault */
|
||||
if (!kvm_pte_valid(pte))
|
||||
return -EAGAIN;
|
||||
|
||||
return BIT(ARM64_HW_PGTABLE_LEVEL_SHIFT(level));
|
||||
}
|
||||
@ -1079,7 +1098,7 @@ static bool fault_supports_stage2_huge_mapping(struct kvm_memory_slot *memslot,
|
||||
*
|
||||
* Returns the size of the mapping.
|
||||
*/
|
||||
static unsigned long
|
||||
static long
|
||||
transparent_hugepage_adjust(struct kvm *kvm, struct kvm_memory_slot *memslot,
|
||||
unsigned long hva, kvm_pfn_t *pfnp,
|
||||
phys_addr_t *ipap)
|
||||
@ -1091,8 +1110,15 @@ transparent_hugepage_adjust(struct kvm *kvm, struct kvm_memory_slot *memslot,
|
||||
* sure that the HVA and IPA are sufficiently aligned and that the
|
||||
* block map is contained within the memslot.
|
||||
*/
|
||||
if (fault_supports_stage2_huge_mapping(memslot, hva, PMD_SIZE) &&
|
||||
get_user_mapping_size(kvm, hva) >= PMD_SIZE) {
|
||||
if (fault_supports_stage2_huge_mapping(memslot, hva, PMD_SIZE)) {
|
||||
int sz = get_user_mapping_size(kvm, hva);
|
||||
|
||||
if (sz < 0)
|
||||
return sz;
|
||||
|
||||
if (sz < PMD_SIZE)
|
||||
return PAGE_SIZE;
|
||||
|
||||
/*
|
||||
* The address we faulted on is backed by a transparent huge
|
||||
* page. However, because we map the compound huge page and
|
||||
@ -1192,7 +1218,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
||||
{
|
||||
int ret = 0;
|
||||
bool write_fault, writable, force_pte = false;
|
||||
bool exec_fault;
|
||||
bool exec_fault, mte_allowed;
|
||||
bool device = false;
|
||||
unsigned long mmu_seq;
|
||||
struct kvm *kvm = vcpu->kvm;
|
||||
@ -1203,7 +1229,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
||||
kvm_pfn_t pfn;
|
||||
bool logging_active = memslot_is_logging(memslot);
|
||||
unsigned long fault_level = kvm_vcpu_trap_get_fault_level(vcpu);
|
||||
unsigned long vma_pagesize, fault_granule;
|
||||
long vma_pagesize, fault_granule;
|
||||
enum kvm_pgtable_prot prot = KVM_PGTABLE_PROT_R;
|
||||
struct kvm_pgtable *pgt;
|
||||
|
||||
@ -1217,6 +1243,20 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
/*
|
||||
* Permission faults just need to update the existing leaf entry,
|
||||
* and so normally don't require allocations from the memcache. The
|
||||
* only exception to this is when dirty logging is enabled at runtime
|
||||
* and a write fault needs to collapse a block entry into a table.
|
||||
*/
|
||||
if (fault_status != ESR_ELx_FSC_PERM ||
|
||||
(logging_active && write_fault)) {
|
||||
ret = kvm_mmu_topup_memory_cache(memcache,
|
||||
kvm_mmu_cache_min_pages(kvm));
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Let's check if we will get back a huge page backed by hugetlbfs, or
|
||||
* get block mapping for device MMIO region.
|
||||
@ -1269,37 +1309,21 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
||||
fault_ipa &= ~(vma_pagesize - 1);
|
||||
|
||||
gfn = fault_ipa >> PAGE_SHIFT;
|
||||
mmap_read_unlock(current->mm);
|
||||
mte_allowed = kvm_vma_mte_allowed(vma);
|
||||
|
||||
/* Don't use the VMA after the unlock -- it may have vanished */
|
||||
vma = NULL;
|
||||
|
||||
/*
|
||||
* Permission faults just need to update the existing leaf entry,
|
||||
* and so normally don't require allocations from the memcache. The
|
||||
* only exception to this is when dirty logging is enabled at runtime
|
||||
* and a write fault needs to collapse a block entry into a table.
|
||||
*/
|
||||
if (fault_status != ESR_ELx_FSC_PERM ||
|
||||
(logging_active && write_fault)) {
|
||||
ret = kvm_mmu_topup_memory_cache(memcache,
|
||||
kvm_mmu_cache_min_pages(kvm));
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
mmu_seq = vcpu->kvm->mmu_invalidate_seq;
|
||||
/*
|
||||
* Ensure the read of mmu_invalidate_seq happens before we call
|
||||
* gfn_to_pfn_prot (which calls get_user_pages), so that we don't risk
|
||||
* the page we just got a reference to gets unmapped before we have a
|
||||
* chance to grab the mmu_lock, which ensure that if the page gets
|
||||
* unmapped afterwards, the call to kvm_unmap_gfn will take it away
|
||||
* from us again properly. This smp_rmb() interacts with the smp_wmb()
|
||||
* in kvm_mmu_notifier_invalidate_<page|range_end>.
|
||||
* Read mmu_invalidate_seq so that KVM can detect if the results of
|
||||
* vma_lookup() or __gfn_to_pfn_memslot() become stale prior to
|
||||
* acquiring kvm->mmu_lock.
|
||||
*
|
||||
* Besides, __gfn_to_pfn_memslot() instead of gfn_to_pfn_prot() is
|
||||
* used to avoid unnecessary overhead introduced to locate the memory
|
||||
* slot because it's always fixed even @gfn is adjusted for huge pages.
|
||||
* Rely on mmap_read_unlock() for an implicit smp_rmb(), which pairs
|
||||
* with the smp_wmb() in kvm_mmu_invalidate_end().
|
||||
*/
|
||||
smp_rmb();
|
||||
mmu_seq = vcpu->kvm->mmu_invalidate_seq;
|
||||
mmap_read_unlock(current->mm);
|
||||
|
||||
pfn = __gfn_to_pfn_memslot(memslot, gfn, false, false, NULL,
|
||||
write_fault, &writable, NULL);
|
||||
@ -1350,11 +1374,16 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
||||
vma_pagesize = transparent_hugepage_adjust(kvm, memslot,
|
||||
hva, &pfn,
|
||||
&fault_ipa);
|
||||
|
||||
if (vma_pagesize < 0) {
|
||||
ret = vma_pagesize;
|
||||
goto out_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
if (fault_status != ESR_ELx_FSC_PERM && !device && kvm_has_mte(kvm)) {
|
||||
/* Check the VMM hasn't introduced a new disallowed VMA */
|
||||
if (kvm_vma_mte_allowed(vma)) {
|
||||
if (mte_allowed) {
|
||||
sanitise_mte_tags(kvm, pfn, vma_pagesize);
|
||||
} else {
|
||||
ret = -EFAULT;
|
||||
|
@ -538,7 +538,8 @@ void kvm_pmu_handle_pmcr(struct kvm_vcpu *vcpu, u64 val)
|
||||
if (!kvm_pmu_is_3p5(vcpu))
|
||||
val &= ~ARMV8_PMU_PMCR_LP;
|
||||
|
||||
__vcpu_sys_reg(vcpu, PMCR_EL0) = val;
|
||||
/* The reset bits don't indicate any state, and shouldn't be saved. */
|
||||
__vcpu_sys_reg(vcpu, PMCR_EL0) = val & ~(ARMV8_PMU_PMCR_C | ARMV8_PMU_PMCR_P);
|
||||
|
||||
if (val & ARMV8_PMU_PMCR_E) {
|
||||
kvm_pmu_enable_counter_mask(vcpu,
|
||||
|
@ -856,6 +856,22 @@ static bool pmu_counter_idx_valid(struct kvm_vcpu *vcpu, u64 idx)
|
||||
return true;
|
||||
}
|
||||
|
||||
static int get_pmu_evcntr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r,
|
||||
u64 *val)
|
||||
{
|
||||
u64 idx;
|
||||
|
||||
if (r->CRn == 9 && r->CRm == 13 && r->Op2 == 0)
|
||||
/* PMCCNTR_EL0 */
|
||||
idx = ARMV8_PMU_CYCLE_IDX;
|
||||
else
|
||||
/* PMEVCNTRn_EL0 */
|
||||
idx = ((r->CRm & 3) << 3) | (r->Op2 & 7);
|
||||
|
||||
*val = kvm_pmu_get_counter_value(vcpu, idx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool access_pmu_evcntr(struct kvm_vcpu *vcpu,
|
||||
struct sys_reg_params *p,
|
||||
const struct sys_reg_desc *r)
|
||||
@ -1072,7 +1088,7 @@ static bool access_pmuserenr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
|
||||
/* Macro to expand the PMEVCNTRn_EL0 register */
|
||||
#define PMU_PMEVCNTR_EL0(n) \
|
||||
{ PMU_SYS_REG(SYS_PMEVCNTRn_EL0(n)), \
|
||||
.reset = reset_pmevcntr, \
|
||||
.reset = reset_pmevcntr, .get_user = get_pmu_evcntr, \
|
||||
.access = access_pmu_evcntr, .reg = (PMEVCNTR0_EL0 + n), }
|
||||
|
||||
/* Macro to expand the PMEVTYPERn_EL0 register */
|
||||
@ -1982,7 +1998,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
|
||||
{ PMU_SYS_REG(SYS_PMCEID1_EL0),
|
||||
.access = access_pmceid, .reset = NULL },
|
||||
{ PMU_SYS_REG(SYS_PMCCNTR_EL0),
|
||||
.access = access_pmu_evcntr, .reset = reset_unknown, .reg = PMCCNTR_EL0 },
|
||||
.access = access_pmu_evcntr, .reset = reset_unknown,
|
||||
.reg = PMCCNTR_EL0, .get_user = get_pmu_evcntr},
|
||||
{ PMU_SYS_REG(SYS_PMXEVTYPER_EL0),
|
||||
.access = access_pmu_evtyper, .reset = NULL },
|
||||
{ PMU_SYS_REG(SYS_PMXEVCNTR_EL0),
|
||||
|
@ -5,6 +5,8 @@
|
||||
#include <asm/bmips.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
bool bmips_rac_flush_disable;
|
||||
|
||||
void arch_sync_dma_for_cpu_all(void)
|
||||
{
|
||||
void __iomem *cbr = BMIPS_GET_CBR();
|
||||
@ -15,6 +17,9 @@ void arch_sync_dma_for_cpu_all(void)
|
||||
boot_cpu_type() != CPU_BMIPS4380)
|
||||
return;
|
||||
|
||||
if (unlikely(bmips_rac_flush_disable))
|
||||
return;
|
||||
|
||||
/* Flush stale data out of the readahead cache */
|
||||
cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG);
|
||||
__raw_writel(cfg | 0x100, cbr + BMIPS_RAC_CONFIG);
|
||||
|
@ -35,6 +35,8 @@
|
||||
#define REG_BCM6328_OTP ((void __iomem *)CKSEG1ADDR(0x1000062c))
|
||||
#define BCM6328_TP1_DISABLED BIT(9)
|
||||
|
||||
extern bool bmips_rac_flush_disable;
|
||||
|
||||
static const unsigned long kbase = VMLINUX_LOAD_ADDRESS & 0xfff00000;
|
||||
|
||||
struct bmips_quirk {
|
||||
@ -104,6 +106,12 @@ static void bcm6358_quirks(void)
|
||||
* disable SMP for now
|
||||
*/
|
||||
bmips_smp_enabled = 0;
|
||||
|
||||
/*
|
||||
* RAC flush causes kernel panics on BCM6358 when booting from TP1
|
||||
* because the bootloader is not initializing it properly.
|
||||
*/
|
||||
bmips_rac_flush_disable = !!(read_c0_brcm_cmt_local() & (1 << 31));
|
||||
}
|
||||
|
||||
static void bcm6368_quirks(void)
|
||||
|
@ -148,6 +148,11 @@ static inline void flush_tlb_fix_spurious_fault(struct vm_area_struct *vma,
|
||||
*/
|
||||
}
|
||||
|
||||
static inline bool __pte_protnone(unsigned long pte)
|
||||
{
|
||||
return (pte & (pgprot_val(PAGE_NONE) | _PAGE_RWX)) == pgprot_val(PAGE_NONE);
|
||||
}
|
||||
|
||||
static inline bool __pte_flags_need_flush(unsigned long oldval,
|
||||
unsigned long newval)
|
||||
{
|
||||
@ -164,8 +169,8 @@ static inline bool __pte_flags_need_flush(unsigned long oldval,
|
||||
/*
|
||||
* We do not expect kernel mappings or non-PTEs or not-present PTEs.
|
||||
*/
|
||||
VM_WARN_ON_ONCE(oldval & _PAGE_PRIVILEGED);
|
||||
VM_WARN_ON_ONCE(newval & _PAGE_PRIVILEGED);
|
||||
VM_WARN_ON_ONCE(!__pte_protnone(oldval) && oldval & _PAGE_PRIVILEGED);
|
||||
VM_WARN_ON_ONCE(!__pte_protnone(newval) && newval & _PAGE_PRIVILEGED);
|
||||
VM_WARN_ON_ONCE(!(oldval & _PAGE_PTE));
|
||||
VM_WARN_ON_ONCE(!(newval & _PAGE_PTE));
|
||||
VM_WARN_ON_ONCE(!(oldval & _PAGE_PRESENT));
|
||||
|
@ -2,7 +2,7 @@
|
||||
#ifndef __ASM_KASAN_H
|
||||
#define __ASM_KASAN_H
|
||||
|
||||
#ifdef CONFIG_KASAN
|
||||
#if defined(CONFIG_KASAN) && !defined(CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX)
|
||||
#define _GLOBAL_KASAN(fn) _GLOBAL(__##fn)
|
||||
#define _GLOBAL_TOC_KASAN(fn) _GLOBAL_TOC(__##fn)
|
||||
#define EXPORT_SYMBOL_KASAN(fn) EXPORT_SYMBOL(__##fn)
|
||||
|
@ -30,11 +30,17 @@ extern int memcmp(const void *,const void *,__kernel_size_t);
|
||||
extern void * memchr(const void *,int,__kernel_size_t);
|
||||
void memcpy_flushcache(void *dest, const void *src, size_t size);
|
||||
|
||||
#ifdef CONFIG_KASAN
|
||||
/* __mem variants are used by KASAN to implement instrumented meminstrinsics. */
|
||||
#ifdef CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX
|
||||
#define __memset memset
|
||||
#define __memcpy memcpy
|
||||
#define __memmove memmove
|
||||
#else /* CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX */
|
||||
void *__memset(void *s, int c, __kernel_size_t count);
|
||||
void *__memcpy(void *to, const void *from, __kernel_size_t n);
|
||||
void *__memmove(void *to, const void *from, __kernel_size_t n);
|
||||
|
||||
#if defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__)
|
||||
#ifndef __SANITIZE_ADDRESS__
|
||||
/*
|
||||
* For files that are not instrumented (e.g. mm/slub.c) we
|
||||
* should use not instrumented version of mem* functions.
|
||||
@ -46,8 +52,9 @@ void *__memmove(void *to, const void *from, __kernel_size_t n);
|
||||
#ifndef __NO_FORTIFY
|
||||
#define __NO_FORTIFY /* FORTIFY_SOURCE uses __builtin_memcpy, etc. */
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif /* !__SANITIZE_ADDRESS__ */
|
||||
#endif /* CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX */
|
||||
#endif /* CONFIG_KASAN */
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
#ifndef CONFIG_KASAN
|
||||
|
@ -13,8 +13,13 @@
|
||||
# If you really need to reference something from prom_init.o add
|
||||
# it to the list below:
|
||||
|
||||
grep "^CONFIG_KASAN=y$" ${KCONFIG_CONFIG} >/dev/null
|
||||
if [ $? -eq 0 ]
|
||||
has_renamed_memintrinsics()
|
||||
{
|
||||
grep -q "^CONFIG_KASAN=y$" ${KCONFIG_CONFIG} && \
|
||||
! grep -q "^CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX=y" ${KCONFIG_CONFIG}
|
||||
}
|
||||
|
||||
if has_renamed_memintrinsics
|
||||
then
|
||||
MEM_FUNCS="__memcpy __memset"
|
||||
else
|
||||
|
@ -290,6 +290,9 @@ static int gpr_set(struct task_struct *target, const struct user_regset *regset,
|
||||
static int ppr_get(struct task_struct *target, const struct user_regset *regset,
|
||||
struct membuf to)
|
||||
{
|
||||
if (!target->thread.regs)
|
||||
return -EINVAL;
|
||||
|
||||
return membuf_write(&to, &target->thread.regs->ppr, sizeof(u64));
|
||||
}
|
||||
|
||||
@ -297,6 +300,9 @@ static int ppr_set(struct task_struct *target, const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count, const void *kbuf,
|
||||
const void __user *ubuf)
|
||||
{
|
||||
if (!target->thread.regs)
|
||||
return -EINVAL;
|
||||
|
||||
return user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
&target->thread.regs->ppr, 0, sizeof(u64));
|
||||
}
|
||||
|
@ -271,11 +271,16 @@ static bool access_error(bool is_write, bool is_exec, struct vm_area_struct *vma
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for a read fault. This could be caused by a read on an
|
||||
* inaccessible page (i.e. PROT_NONE), or a Radix MMU execute-only page.
|
||||
* VM_READ, VM_WRITE and VM_EXEC all imply read permissions, as
|
||||
* defined in protection_map[]. Read faults can only be caused by
|
||||
* a PROT_NONE mapping, or with a PROT_EXEC-only mapping on Radix.
|
||||
*/
|
||||
if (unlikely(!(vma->vm_flags & VM_READ)))
|
||||
if (unlikely(!vma_is_accessible(vma)))
|
||||
return true;
|
||||
|
||||
if (unlikely(radix_enabled() && ((vma->vm_flags & VM_ACCESS_FLAGS) == VM_EXEC)))
|
||||
return true;
|
||||
|
||||
/*
|
||||
* We should ideally do the vma pkey access check here. But in the
|
||||
* fault path, handle_mm_fault() also does the same check. To avoid
|
||||
|
@ -7,6 +7,7 @@ config PPC_PSERIES
|
||||
select OF_DYNAMIC
|
||||
select FORCE_PCI
|
||||
select PCI_MSI
|
||||
select GENERIC_ALLOCATOR
|
||||
select PPC_XICS
|
||||
select PPC_XIVE_SPAPR
|
||||
select PPC_ICP_NATIVE
|
||||
|
@ -856,6 +856,13 @@ int pseries_vas_dlpar_cpu(void)
|
||||
{
|
||||
int new_nr_creds, rc;
|
||||
|
||||
/*
|
||||
* NX-GZIP is not enabled. Nothing to do for DLPAR event
|
||||
*/
|
||||
if (!copypaste_feat)
|
||||
return 0;
|
||||
|
||||
|
||||
rc = h_query_vas_capabilities(H_QUERY_VAS_CAPABILITIES,
|
||||
vascaps[VAS_GZIP_DEF_FEAT_TYPE].feat,
|
||||
(u64)virt_to_phys(&hv_cop_caps));
|
||||
@ -1012,6 +1019,7 @@ static int __init pseries_vas_init(void)
|
||||
* Linux supports user space COPY/PASTE only with Radix
|
||||
*/
|
||||
if (!radix_enabled()) {
|
||||
copypaste_feat = false;
|
||||
pr_err("API is supported only with radix page tables\n");
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
@ -126,6 +126,7 @@ config RISCV
|
||||
select OF_IRQ
|
||||
select PCI_DOMAINS_GENERIC if PCI
|
||||
select PCI_MSI if PCI
|
||||
select RISCV_ALTERNATIVE if !XIP_KERNEL
|
||||
select RISCV_INTC
|
||||
select RISCV_TIMER if RISCV_SBI
|
||||
select SIFIVE_PLIC
|
||||
@ -401,9 +402,8 @@ config RISCV_ISA_C
|
||||
config RISCV_ISA_SVPBMT
|
||||
bool "SVPBMT extension support"
|
||||
depends on 64BIT && MMU
|
||||
depends on !XIP_KERNEL
|
||||
depends on RISCV_ALTERNATIVE
|
||||
default y
|
||||
select RISCV_ALTERNATIVE
|
||||
help
|
||||
Adds support to dynamically detect the presence of the SVPBMT
|
||||
ISA-extension (Supervisor-mode: page-based memory types) and
|
||||
@ -428,8 +428,8 @@ config TOOLCHAIN_HAS_ZBB
|
||||
config RISCV_ISA_ZBB
|
||||
bool "Zbb extension support for bit manipulation instructions"
|
||||
depends on TOOLCHAIN_HAS_ZBB
|
||||
depends on !XIP_KERNEL && MMU
|
||||
select RISCV_ALTERNATIVE
|
||||
depends on MMU
|
||||
depends on RISCV_ALTERNATIVE
|
||||
default y
|
||||
help
|
||||
Adds support to dynamically detect the presence of the ZBB
|
||||
@ -443,9 +443,9 @@ config RISCV_ISA_ZBB
|
||||
|
||||
config RISCV_ISA_ZICBOM
|
||||
bool "Zicbom extension support for non-coherent DMA operation"
|
||||
depends on !XIP_KERNEL && MMU
|
||||
depends on MMU
|
||||
depends on RISCV_ALTERNATIVE
|
||||
default y
|
||||
select RISCV_ALTERNATIVE
|
||||
select RISCV_DMA_NONCOHERENT
|
||||
help
|
||||
Adds support to dynamically detect the presence of the ZICBOM
|
||||
@ -464,6 +464,28 @@ config TOOLCHAIN_HAS_ZIHINTPAUSE
|
||||
depends on !32BIT || $(cc-option,-mabi=ilp32 -march=rv32ima_zihintpause)
|
||||
depends on LLD_VERSION >= 150000 || LD_VERSION >= 23600
|
||||
|
||||
config TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI
|
||||
def_bool y
|
||||
# https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=aed44286efa8ae8717a77d94b51ac3614e2ca6dc
|
||||
depends on AS_IS_GNU && AS_VERSION >= 23800
|
||||
help
|
||||
Newer binutils versions default to ISA spec version 20191213 which
|
||||
moves some instructions from the I extension to the Zicsr and Zifencei
|
||||
extensions.
|
||||
|
||||
config TOOLCHAIN_NEEDS_OLD_ISA_SPEC
|
||||
def_bool y
|
||||
depends on TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI
|
||||
# https://github.com/llvm/llvm-project/commit/22e199e6afb1263c943c0c0d4498694e15bf8a16
|
||||
depends on CC_IS_CLANG && CLANG_VERSION < 170000
|
||||
help
|
||||
Certain versions of clang do not support zicsr and zifencei via -march
|
||||
but newer versions of binutils require it for the reasons noted in the
|
||||
help text of CONFIG_TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI. This
|
||||
option causes an older ISA spec compatible with these older versions
|
||||
of clang to be passed to GAS, which has the same result as passing zicsr
|
||||
and zifencei to -march.
|
||||
|
||||
config FPU
|
||||
bool "FPU support"
|
||||
default y
|
||||
|
@ -2,8 +2,7 @@ menu "CPU errata selection"
|
||||
|
||||
config ERRATA_SIFIVE
|
||||
bool "SiFive errata"
|
||||
depends on !XIP_KERNEL
|
||||
select RISCV_ALTERNATIVE
|
||||
depends on RISCV_ALTERNATIVE
|
||||
help
|
||||
All SiFive errata Kconfig depend on this Kconfig. Disabling
|
||||
this Kconfig will disable all SiFive errata. Please say "Y"
|
||||
@ -35,8 +34,7 @@ config ERRATA_SIFIVE_CIP_1200
|
||||
|
||||
config ERRATA_THEAD
|
||||
bool "T-HEAD errata"
|
||||
depends on !XIP_KERNEL
|
||||
select RISCV_ALTERNATIVE
|
||||
depends on RISCV_ALTERNATIVE
|
||||
help
|
||||
All T-HEAD errata Kconfig depend on this Kconfig. Disabling
|
||||
this Kconfig will disable all T-HEAD errata. Please say "Y"
|
||||
|
@ -57,10 +57,12 @@ riscv-march-$(CONFIG_ARCH_RV64I) := rv64ima
|
||||
riscv-march-$(CONFIG_FPU) := $(riscv-march-y)fd
|
||||
riscv-march-$(CONFIG_RISCV_ISA_C) := $(riscv-march-y)c
|
||||
|
||||
# Newer binutils versions default to ISA spec version 20191213 which moves some
|
||||
# instructions from the I extension to the Zicsr and Zifencei extensions.
|
||||
toolchain-need-zicsr-zifencei := $(call cc-option-yn, -march=$(riscv-march-y)_zicsr_zifencei)
|
||||
riscv-march-$(toolchain-need-zicsr-zifencei) := $(riscv-march-y)_zicsr_zifencei
|
||||
ifdef CONFIG_TOOLCHAIN_NEEDS_OLD_ISA_SPEC
|
||||
KBUILD_CFLAGS += -Wa,-misa-spec=2.2
|
||||
KBUILD_AFLAGS += -Wa,-misa-spec=2.2
|
||||
else
|
||||
riscv-march-$(CONFIG_TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI) := $(riscv-march-y)_zicsr_zifencei
|
||||
endif
|
||||
|
||||
# Check if the toolchain supports Zihintpause extension
|
||||
riscv-march-$(CONFIG_TOOLCHAIN_HAS_ZIHINTPAUSE) := $(riscv-march-y)_zihintpause
|
||||
|
@ -57,18 +57,31 @@ struct riscv_isa_ext_data {
|
||||
unsigned int isa_ext_id;
|
||||
};
|
||||
|
||||
unsigned long riscv_isa_extension_base(const unsigned long *isa_bitmap);
|
||||
|
||||
#define riscv_isa_extension_mask(ext) BIT_MASK(RISCV_ISA_EXT_##ext)
|
||||
|
||||
bool __riscv_isa_extension_available(const unsigned long *isa_bitmap, int bit);
|
||||
#define riscv_isa_extension_available(isa_bitmap, ext) \
|
||||
__riscv_isa_extension_available(isa_bitmap, RISCV_ISA_EXT_##ext)
|
||||
|
||||
static __always_inline bool
|
||||
riscv_has_extension_likely(const unsigned long ext)
|
||||
{
|
||||
compiletime_assert(ext < RISCV_ISA_EXT_MAX,
|
||||
"ext must be < RISCV_ISA_EXT_MAX");
|
||||
|
||||
asm_volatile_goto(
|
||||
ALTERNATIVE("j %l[l_no]", "nop", 0, %[ext], 1)
|
||||
:
|
||||
: [ext] "i" (ext)
|
||||
:
|
||||
: l_no);
|
||||
if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE)) {
|
||||
asm_volatile_goto(
|
||||
ALTERNATIVE("j %l[l_no]", "nop", 0, %[ext], 1)
|
||||
:
|
||||
: [ext] "i" (ext)
|
||||
:
|
||||
: l_no);
|
||||
} else {
|
||||
if (!__riscv_isa_extension_available(NULL, ext))
|
||||
goto l_no;
|
||||
}
|
||||
|
||||
return true;
|
||||
l_no:
|
||||
@ -81,26 +94,23 @@ riscv_has_extension_unlikely(const unsigned long ext)
|
||||
compiletime_assert(ext < RISCV_ISA_EXT_MAX,
|
||||
"ext must be < RISCV_ISA_EXT_MAX");
|
||||
|
||||
asm_volatile_goto(
|
||||
ALTERNATIVE("nop", "j %l[l_yes]", 0, %[ext], 1)
|
||||
:
|
||||
: [ext] "i" (ext)
|
||||
:
|
||||
: l_yes);
|
||||
if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE)) {
|
||||
asm_volatile_goto(
|
||||
ALTERNATIVE("nop", "j %l[l_yes]", 0, %[ext], 1)
|
||||
:
|
||||
: [ext] "i" (ext)
|
||||
:
|
||||
: l_yes);
|
||||
} else {
|
||||
if (__riscv_isa_extension_available(NULL, ext))
|
||||
goto l_yes;
|
||||
}
|
||||
|
||||
return false;
|
||||
l_yes:
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned long riscv_isa_extension_base(const unsigned long *isa_bitmap);
|
||||
|
||||
#define riscv_isa_extension_mask(ext) BIT_MASK(RISCV_ISA_EXT_##ext)
|
||||
|
||||
bool __riscv_isa_extension_available(const unsigned long *isa_bitmap, int bit);
|
||||
#define riscv_isa_extension_available(isa_bitmap, ext) \
|
||||
__riscv_isa_extension_available(isa_bitmap, RISCV_ISA_EXT_##ext)
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_RISCV_HWCAP_H */
|
||||
|
@ -19,8 +19,6 @@ typedef struct {
|
||||
#ifdef CONFIG_SMP
|
||||
/* A local icache flush is needed before user execution can resume. */
|
||||
cpumask_t icache_stale_mask;
|
||||
/* A local tlb flush is needed before user execution can resume. */
|
||||
cpumask_t tlb_stale_mask;
|
||||
#endif
|
||||
} mm_context_t;
|
||||
|
||||
|
@ -12,6 +12,8 @@
|
||||
#include <asm/errata_list.h>
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
extern unsigned long asid_mask;
|
||||
|
||||
static inline void local_flush_tlb_all(void)
|
||||
{
|
||||
__asm__ __volatile__ ("sfence.vma" : : : "memory");
|
||||
@ -22,24 +24,6 @@ static inline void local_flush_tlb_page(unsigned long addr)
|
||||
{
|
||||
ALT_FLUSH_TLB_PAGE(__asm__ __volatile__ ("sfence.vma %0" : : "r" (addr) : "memory"));
|
||||
}
|
||||
|
||||
static inline void local_flush_tlb_all_asid(unsigned long asid)
|
||||
{
|
||||
__asm__ __volatile__ ("sfence.vma x0, %0"
|
||||
:
|
||||
: "r" (asid)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
static inline void local_flush_tlb_page_asid(unsigned long addr,
|
||||
unsigned long asid)
|
||||
{
|
||||
__asm__ __volatile__ ("sfence.vma %0, %1"
|
||||
:
|
||||
: "r" (addr), "r" (asid)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
#else /* CONFIG_MMU */
|
||||
#define local_flush_tlb_all() do { } while (0)
|
||||
#define local_flush_tlb_page(addr) do { } while (0)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user