Merge 6.3-rc6 into char-misc-next

We need it here to apply other char/misc driver changes to.

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Greg Kroah-Hartman 2023-04-10 08:49:26 +02:00
commit 5790d407da
731 changed files with 8020 additions and 3481 deletions

View File

@ -133,6 +133,8 @@ Dmitry Safonov <0x7f454c46@gmail.com> <dsafonov@virtuozzo.com>
Domen Puncer <domen@coderock.org> Domen Puncer <domen@coderock.org>
Douglas Gilbert <dougg@torque.net> Douglas Gilbert <dougg@torque.net>
Ed L. Cashin <ecashin@coraid.com> 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> Erik Kaneda <erik.kaneda@intel.com> <erik.schmauss@intel.com>
Eugen Hristev <eugen.hristev@collabora.com> <eugen.hristev@microchip.com> Eugen Hristev <eugen.hristev@collabora.com> <eugen.hristev@microchip.com>
Evgeniy Polyakov <johnpol@2ka.mipt.ru> Evgeniy Polyakov <johnpol@2ka.mipt.ru>
@ -263,7 +265,9 @@ Krzysztof Kozlowski <krzk@kernel.org> <k.kozlowski@samsung.com>
Krzysztof Kozlowski <krzk@kernel.org> <krzysztof.kozlowski@canonical.com> Krzysztof Kozlowski <krzk@kernel.org> <krzysztof.kozlowski@canonical.com>
Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Kuogee Hsieh <quic_khsieh@quicinc.com> <khsieh@codeaurora.org> Kuogee Hsieh <quic_khsieh@quicinc.com> <khsieh@codeaurora.org>
Leonard Crestez <leonard.crestez@nxp.com> Leonard Crestez <cdleonard@gmail.com>
Leonardo Bras <leobras.c@gmail.com> <leonardo@linux.ibm.com> Leonardo Bras <leobras.c@gmail.com> <leonardo@linux.ibm.com>
Leonard Göhrs <l.goehrs@pengutronix.de>
Leonid I Ananiev <leonid.i.ananiev@intel.com> Leonid I Ananiev <leonid.i.ananiev@intel.com>
Leon Romanovsky <leon@kernel.org> <leon@leon.nu> Leon Romanovsky <leon@kernel.org> <leon@leon.nu>
Leon Romanovsky <leon@kernel.org> <leonro@mellanox.com> Leon Romanovsky <leon@kernel.org> <leonro@mellanox.com>
@ -379,6 +383,7 @@ Quentin Monnet <quentin@isovalent.com> <quentin.monnet@netronome.com>
Quentin Perret <qperret@qperret.net> <quentin.perret@arm.com> Quentin Perret <qperret@qperret.net> <quentin.perret@arm.com>
Rafael J. Wysocki <rjw@rjwysocki.net> <rjw@sisk.pl> Rafael J. Wysocki <rjw@rjwysocki.net> <rjw@sisk.pl>
Rajeev Nandan <quic_rajeevny@quicinc.com> <rajeevny@codeaurora.org> Rajeev Nandan <quic_rajeevny@quicinc.com> <rajeevny@codeaurora.org>
Rajendra Nayak <quic_rjendra@quicinc.com> <rnayak@codeaurora.org>
Rajesh Shah <rajesh.shah@intel.com> Rajesh Shah <rajesh.shah@intel.com>
Ralf Baechle <ralf@linux-mips.org> Ralf Baechle <ralf@linux-mips.org>
Ralf Wildenhues <Ralf.Wildenhues@gmx.de> Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
@ -387,6 +392,9 @@ Rémi Denis-Courmont <rdenis@simphalempin.com>
Ricardo Ribalda <ribalda@kernel.org> <ricardo@ribalda.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 Delgado <ribalda@kernel.org>
Ricardo Ribalda <ribalda@kernel.org> <ricardo.ribalda@gmail.com> 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> Robert Foss <rfoss@kernel.org> <robert.foss@linaro.org>
Roman Gushchin <roman.gushchin@linux.dev> <guro@fb.com> Roman Gushchin <roman.gushchin@linux.dev> <guro@fb.com>
Roman Gushchin <roman.gushchin@linux.dev> <guroan@gmail.com> Roman Gushchin <roman.gushchin@linux.dev> <guroan@gmail.com>
@ -397,6 +405,7 @@ Ross Zwisler <zwisler@kernel.org> <ross.zwisler@linux.intel.com>
Rudolf Marek <R.Marek@sh.cvut.cz> Rudolf Marek <R.Marek@sh.cvut.cz>
Rui Saraiva <rmps@joel.ist.utl.pt> Rui Saraiva <rmps@joel.ist.utl.pt>
Sachin P Sant <ssant@in.ibm.com> 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> Sakari Ailus <sakari.ailus@linux.intel.com> <sakari.ailus@iki.fi>
Sam Ravnborg <sam@mars.ravnborg.org> Sam Ravnborg <sam@mars.ravnborg.org>
Sankeerth Billakanti <quic_sbillaka@quicinc.com> <sbillaka@codeaurora.org> Sankeerth Billakanti <quic_sbillaka@quicinc.com> <sbillaka@codeaurora.org>
@ -437,6 +446,10 @@ Thomas Graf <tgraf@suug.ch>
Thomas Körper <socketcan@esd.eu> <thomas.koerper@esd.eu> Thomas Körper <socketcan@esd.eu> <thomas.koerper@esd.eu>
Thomas Pedersen <twp@codeaurora.org> Thomas Pedersen <twp@codeaurora.org>
Tiezhu Yang <yangtiezhu@loongson.cn> <kernelpatch@126.com> 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> Todor Tomov <todor.too@gmail.com> <todor.tomov@linaro.org>
Tony Luck <tony.luck@intel.com> Tony Luck <tony.luck@intel.com>
TripleX Chung <xxx.phy@gmail.com> <triplex@zh-kernel.org> TripleX Chung <xxx.phy@gmail.com> <triplex@zh-kernel.org>

View File

@ -36,7 +36,6 @@ problems and bugs in particular.
reporting-issues reporting-issues
reporting-regressions reporting-regressions
security-bugs
bug-hunting bug-hunting
bug-bisect bug-bisect
tainted-kernels tainted-kernels

View File

@ -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. 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 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. provides additional details how to best handle security issues.
An issue is a 'really severe problem' when something totally unacceptably bad 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 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. 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 Duties after the report went out

View File

@ -76,6 +76,13 @@ properties:
If "broken-flash-reset" is present then having this property does not If "broken-flash-reset" is present then having this property does not
make any difference. make any difference.
spi-cpol: true
spi-cpha: true
dependencies:
spi-cpol: [ spi-cpha ]
spi-cpha: [ spi-cpol ]
unevaluatedProperties: false unevaluatedProperties: false
examples: examples:

View File

@ -96,9 +96,11 @@ $defs:
2: Lower Slew rate (slower edges) 2: Lower Slew rate (slower edges)
3: Reserved (No adjustments) 3: Reserved (No adjustments)
bias-bus-hold: true
bias-pull-down: true bias-pull-down: true
bias-pull-up: true bias-pull-up: true
bias-disable: true bias-disable: true
input-enable: true
output-high: true output-high: true
output-low: true output-low: true

View File

@ -92,7 +92,7 @@ properties:
- description: Error interrupt - description: Error interrupt
- description: Receive buffer full interrupt - description: Receive buffer full interrupt
- description: Transmit buffer empty interrupt - description: Transmit buffer empty interrupt
- description: Transmit End interrupt - description: Break interrupt
- items: - items:
- description: Error interrupt - description: Error interrupt
- description: Receive buffer full interrupt - description: Receive buffer full interrupt
@ -107,7 +107,7 @@ properties:
- const: eri - const: eri
- const: rxi - const: rxi
- const: txi - const: txi
- const: tei - const: bri
- items: - items:
- const: eri - const: eri
- const: rxi - const: rxi

View File

@ -39,13 +39,12 @@ With CONFIG_ZSMALLOC_STAT, we could see zsmalloc internal information via
# cat /sys/kernel/debug/zsmalloc/zram0/classes # cat /sys/kernel/debug/zsmalloc/zram0/classes
class size almost_full almost_empty obj_allocated obj_used pages_used pages_per_zspage class size 10% 20% 30% 40% 50% 60% 70% 80% 90% 99% 100% obj_allocated obj_used pages_used pages_per_zspage freeable
... ...
... ...
9 176 0 1 186 129 8 4 30 512 0 12 4 1 0 1 0 0 1 0 414 3464 3346 433 1 14
10 192 1 0 2880 2872 135 3 31 528 2 7 2 2 1 0 1 0 0 2 117 4154 3793 536 4 44
11 208 0 1 819 795 42 2 32 544 6 3 4 1 2 1 0 0 0 1 260 4170 3965 556 2 26
12 224 0 1 219 159 12 4
... ...
... ...
@ -54,10 +53,28 @@ class
index index
size size
object size zspage stores object size zspage stores
almost_empty 10%
the number of ZS_ALMOST_EMPTY zspages(see below) the number of zspages with usage ratio less than 10% (see below)
almost_full 20%
the number of ZS_ALMOST_FULL zspages(see below) the number of zspages with usage ratio between 10% and 20%
30%
the number of zspages with usage ratio between 20% and 30%
40%
the number of zspages with usage ratio between 30% and 40%
50%
the number of zspages with usage ratio between 40% and 50%
60%
the number of zspages with usage ratio between 50% and 60%
70%
the number of zspages with usage ratio between 60% and 70%
80%
the number of zspages with usage ratio between 70% and 80%
90%
the number of zspages with usage ratio between 80% and 90%
99%
the number of zspages with usage ratio between 90% and 99%
100%
the number of zspages with usage ratio 100%
obj_allocated obj_allocated
the number of objects allocated the number of objects allocated
obj_used obj_used
@ -66,19 +83,14 @@ pages_used
the number of pages allocated for the class the number of pages allocated for the class
pages_per_zspage pages_per_zspage
the number of 0-order pages to make a zspage the number of 0-order pages to make a zspage
freeable
the approximate number of pages class compaction can free
We assign a zspage to ZS_ALMOST_EMPTY fullness group when n <= N / f, where Each zspage maintains inuse counter which keeps track of the number of
objects stored in the zspage. The inuse counter determines the zspage's
* n = number of allocated objects "fullness group" which is calculated as the ratio of the "inuse" objects to
* N = total number of objects zspage can store the total number of objects the zspage can hold (objs_per_zspage). The
* f = fullness_threshold_frac(ie, 4 at the moment) closer the inuse counter is to objs_per_zspage, the better.
Similarly, we assign zspage to:
* ZS_ALMOST_FULL when n > N / f
* ZS_EMPTY when n == 0
* ZS_FULL when n == N
Internals Internals
========= =========
@ -94,10 +106,10 @@ of objects that each zspage can store.
For instance, consider the following size classes::: For instance, consider the following size classes:::
class size almost_full almost_empty obj_allocated obj_used pages_used pages_per_zspage freeable class size 10% .... 100% obj_allocated obj_used pages_used pages_per_zspage freeable
... ...
94 1536 0 0 0 0 0 3 0 94 1536 0 .... 0 0 0 0 3 0
100 1632 0 0 0 0 0 2 0 100 1632 0 .... 0 0 0 0 2 0
... ...
@ -134,10 +146,11 @@ reduces memory wastage.
Let's take a closer look at the bottom of `/sys/kernel/debug/zsmalloc/zramX/classes`::: Let's take a closer look at the bottom of `/sys/kernel/debug/zsmalloc/zramX/classes`:::
class size almost_full almost_empty obj_allocated obj_used pages_used pages_per_zspage freeable class size 10% .... 100% obj_allocated obj_used pages_used pages_per_zspage freeable
... ...
202 3264 0 0 0 0 0 4 0 202 3264 0 .. 0 0 0 0 4 0
254 4096 0 0 0 0 0 1 0 254 4096 0 .. 0 0 0 0 1 0
... ...
Size class #202 stores objects of size 3264 bytes and has a maximum of 4 pages Size class #202 stores objects of size 3264 bytes and has a maximum of 4 pages
@ -151,40 +164,42 @@ efficient storage of large objects.
For zspage chain size of 8, huge class watermark becomes 3632 bytes::: For zspage chain size of 8, huge class watermark becomes 3632 bytes:::
class size almost_full almost_empty obj_allocated obj_used pages_used pages_per_zspage freeable class size 10% .... 100% obj_allocated obj_used pages_used pages_per_zspage freeable
... ...
202 3264 0 0 0 0 0 4 0 202 3264 0 .. 0 0 0 0 4 0
211 3408 0 0 0 0 0 5 0 211 3408 0 .. 0 0 0 0 5 0
217 3504 0 0 0 0 0 6 0 217 3504 0 .. 0 0 0 0 6 0
222 3584 0 0 0 0 0 7 0 222 3584 0 .. 0 0 0 0 7 0
225 3632 0 0 0 0 0 8 0 225 3632 0 .. 0 0 0 0 8 0
254 4096 0 0 0 0 0 1 0 254 4096 0 .. 0 0 0 0 1 0
... ...
For zspage chain size of 16, huge class watermark becomes 3840 bytes::: For zspage chain size of 16, huge class watermark becomes 3840 bytes:::
class size almost_full almost_empty obj_allocated obj_used pages_used pages_per_zspage freeable class size 10% .... 100% obj_allocated obj_used pages_used pages_per_zspage freeable
... ...
202 3264 0 0 0 0 0 4 0 202 3264 0 .. 0 0 0 0 4 0
206 3328 0 0 0 0 0 13 0 206 3328 0 .. 0 0 0 0 13 0
207 3344 0 0 0 0 0 9 0 207 3344 0 .. 0 0 0 0 9 0
208 3360 0 0 0 0 0 14 0 208 3360 0 .. 0 0 0 0 14 0
211 3408 0 0 0 0 0 5 0 211 3408 0 .. 0 0 0 0 5 0
212 3424 0 0 0 0 0 16 0 212 3424 0 .. 0 0 0 0 16 0
214 3456 0 0 0 0 0 11 0 214 3456 0 .. 0 0 0 0 11 0
217 3504 0 0 0 0 0 6 0 217 3504 0 .. 0 0 0 0 6 0
219 3536 0 0 0 0 0 13 0 219 3536 0 .. 0 0 0 0 13 0
222 3584 0 0 0 0 0 7 0 222 3584 0 .. 0 0 0 0 7 0
223 3600 0 0 0 0 0 15 0 223 3600 0 .. 0 0 0 0 15 0
225 3632 0 0 0 0 0 8 0 225 3632 0 .. 0 0 0 0 8 0
228 3680 0 0 0 0 0 9 0 228 3680 0 .. 0 0 0 0 9 0
230 3712 0 0 0 0 0 10 0 230 3712 0 .. 0 0 0 0 10 0
232 3744 0 0 0 0 0 11 0 232 3744 0 .. 0 0 0 0 11 0
234 3776 0 0 0 0 0 12 0 234 3776 0 .. 0 0 0 0 12 0
235 3792 0 0 0 0 0 13 0 235 3792 0 .. 0 0 0 0 13 0
236 3808 0 0 0 0 0 14 0 236 3808 0 .. 0 0 0 0 14 0
238 3840 0 0 0 0 0 15 0 238 3840 0 .. 0 0 0 0 15 0
254 4096 0 0 0 0 0 1 0 254 4096 0 .. 0 0 0 0 1 0
... ...
Overall the combined zspage chain size effect on zsmalloc pool configuration::: Overall the combined zspage chain size effect on zsmalloc pool configuration:::
@ -214,9 +229,10 @@ zram as a build artifacts storage (Linux kernel compilation).
zsmalloc classes stats::: zsmalloc classes stats:::
class size almost_full almost_empty obj_allocated obj_used pages_used pages_per_zspage freeable class size 10% .... 100% obj_allocated obj_used pages_used pages_per_zspage freeable
... ...
Total 13 51 413836 412973 159955 3 Total 13 .. 51 413836 412973 159955 3
zram mm_stat::: zram mm_stat:::
@ -227,9 +243,10 @@ zram as a build artifacts storage (Linux kernel compilation).
zsmalloc classes stats::: zsmalloc classes stats:::
class size almost_full almost_empty obj_allocated obj_used pages_used pages_per_zspage freeable class size 10% .... 100% obj_allocated obj_used pages_used pages_per_zspage freeable
... ...
Total 18 87 414852 412978 156666 0 Total 18 .. 87 414852 412978 156666 0
zram mm_stat::: zram mm_stat:::

View File

@ -23,10 +23,13 @@ metadata is supported, this set will grow:
An XDP program can use these kfuncs to read the metadata into stack 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 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 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 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 Within an XDP frame, the metadata layout (accessed via ``xdp_buff``) is
as follows:: as follows::

View File

@ -138,7 +138,7 @@ required reading:
philosophy and is very important for people moving to Linux from philosophy and is very important for people moving to Linux from
development on other Operating Systems. 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, 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 please follow the steps in this document to help notify the kernel
developers, and help solve the issue. developers, and help solve the issue.

View File

@ -35,6 +35,14 @@ Below are the essential guides that every developer should read.
kernel-enforcement-statement kernel-enforcement-statement
kernel-driver-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: Other guides to the community that are of interest to most developers are:
.. toctree:: .. toctree::
@ -47,7 +55,6 @@ Other guides to the community that are of interest to most developers are:
submit-checklist submit-checklist
kernel-docs kernel-docs
deprecated deprecated
embargoed-hardware-issues
maintainers maintainers
researcher-guidelines researcher-guidelines

View File

@ -68,7 +68,7 @@ Before contributing, carefully read the appropriate documentation:
* Documentation/process/development-process.rst * Documentation/process/development-process.rst
* Documentation/process/submitting-patches.rst * Documentation/process/submitting-patches.rst
* Documentation/admin-guide/reporting-issues.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 Then send a patch (including a commit log with all the details listed
below) and follow up on any feedback from other developers. below) and follow up on any feedback from other developers.

View File

@ -39,7 +39,7 @@ Procedure for submitting patches to the -stable tree
Security patches should not be handled (solely) by the -stable review Security patches should not be handled (solely) by the -stable review
process but should follow the procedures in 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 For all other submissions, choose one of the following procedures
----------------------------------------------------------------- -----------------------------------------------------------------

View File

@ -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 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, 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 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 Patches that fix a severe bug in a released kernel should be directed
toward the stable maintainers by putting a line like this:: toward the stable maintainers by putting a line like this::

View File

@ -1,6 +1,6 @@
.. include:: ../disclaimer-ita.rst .. include:: ../disclaimer-ita.rst
:Original: :ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>` :Original: :ref:`Documentation/process/security-bugs.rst <securitybugs>`
.. _it_securitybugs: .. _it_securitybugs:

View File

@ -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; distribuzioni di prendere la patch e renderla disponibile ai loro utenti;
in questo caso, ovviamente, la patch non dovrebbe essere inviata su alcuna in questo caso, ovviamente, la patch non dovrebbe essere inviata su alcuna
lista di discussione pubblica. Leggete anche 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 Patch che correggono bachi importanti su un kernel già rilasciato, dovrebbero
essere inviate ai manutentori dei kernel stabili aggiungendo la seguente riga:: essere inviate ai manutentori dei kernel stabili aggiungendo la seguente riga::

View File

@ -167,7 +167,7 @@ linux-api@vger.kernel.org に送ることを勧めます。
このドキュメントは Linux 開発の思想を理解するのに非常に重要です。 このドキュメントは Linux 開発の思想を理解するのに非常に重要です。
そして、他のOSでの開発者が Linux に移る時にとても重要です。 そして、他のOSでの開発者が Linux に移る時にとても重要です。
:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>` :ref:`Documentation/process/security-bugs.rst <securitybugs>`
もし Linux カーネルでセキュリティ問題を発見したように思ったら、こ もし Linux カーネルでセキュリティ問題を発見したように思ったら、こ
のドキュメントのステップに従ってカーネル開発者に連絡し、問題解決を のドキュメントのステップに従ってカーネル開発者に連絡し、問題解決を
支援してください。 支援してください。

View File

@ -157,7 +157,7 @@ mtk.manpages@gmail.com의 메인테이너에게 보낼 것을 권장한다.
리눅스로 전향하는 사람들에게는 매우 중요하다. 리눅스로 전향하는 사람들에게는 매우 중요하다.
:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>` :ref:`Documentation/process/security-bugs.rst <securitybugs>`
여러분들이 리눅스 커널의 보안 문제를 발견했다고 생각한다면 이 문서에 여러분들이 리눅스 커널의 보안 문제를 발견했다고 생각한다면 이 문서에
나온 단계에 따라서 커널 개발자들에게 알리고 그 문제를 해결할 수 있도록 나온 단계에 따라서 커널 개발자들에게 알리고 그 문제를 해결할 수 있도록
도와 달라. 도와 달라.

View File

@ -135,7 +135,7 @@ de obligada lectura:
de Linux y es muy importante para las personas que se mudan a Linux de Linux y es muy importante para las personas que se mudan a Linux
tras desarrollar otros sistemas operativos. 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 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 Linux, siga los pasos de este documento para ayudar a notificar a los
desarrolladores del kernel y ayudar a resolver el problema. desarrolladores del kernel y ayudar a resolver el problema.

View File

@ -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 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 los usuarios; en esos casos, obviamente, el parche no debe enviarse a
ninguna lista pública. Revise también 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 Los parches que corrigen un error grave en un kernel en uso deben dirigirse
hacia los maintainers estables poniendo una línea como esta:: hacia los maintainers estables poniendo una línea como esta::

View File

@ -1,6 +1,6 @@
.. include:: ../disclaimer-zh_CN.rst .. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../admin-guide/security-bugs` :Original: :doc:`../../../process/security-bugs`
:译者: :译者:

View File

@ -125,7 +125,7 @@ Linux内核代码中包含有大量的文档。这些文档对于学习如何与
这篇文档对于理解Linux的开发哲学至关重要。对于将开发平台从其他操作系 这篇文档对于理解Linux的开发哲学至关重要。对于将开发平台从其他操作系
统转移到Linux的人来说也很重要。 统转移到Linux的人来说也很重要。
:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>` :ref:`Documentation/process/security-bugs.rst <securitybugs>`
如果你认为自己发现了Linux内核的安全性问题请根据这篇文档中的步骤来 如果你认为自己发现了Linux内核的安全性问题请根据这篇文档中的步骤来
提醒其他内核开发者并帮助解决这个问题。 提醒其他内核开发者并帮助解决这个问题。

View File

@ -2,7 +2,7 @@
.. include:: ../disclaimer-zh_TW.rst .. include:: ../disclaimer-zh_TW.rst
:Original: :doc:`../../../admin-guide/security-bugs` :Original: :doc:`../../../process/security-bugs`
:譯者: :譯者:

View File

@ -128,7 +128,7 @@ Linux內核代碼中包含有大量的文檔。這些文檔對於學習如何與
這篇文檔對於理解Linux的開發哲學至關重要。對於將開發平台從其他操作系 這篇文檔對於理解Linux的開發哲學至關重要。對於將開發平台從其他操作系
統轉移到Linux的人來說也很重要。 統轉移到Linux的人來說也很重要。
:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>` :ref:`Documentation/process/security-bugs.rst <securitybugs>`
如果你認爲自己發現了Linux內核的安全性問題請根據這篇文檔中的步驟來 如果你認爲自己發現了Linux內核的安全性問題請根據這篇文檔中的步驟來
提醒其他內核開發者並幫助解決這個問題。 提醒其他內核開發者並幫助解決這個問題。

View 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

View File

@ -16,6 +16,7 @@ USB support
gadget_multi gadget_multi
gadget_printer gadget_printer
gadget_serial gadget_serial
gadget_uvc
gadget-testing gadget-testing
iuu_phoenix iuu_phoenix
mass-storage mass-storage

View File

@ -8296,11 +8296,11 @@ ENOSYS for the others.
8.35 KVM_CAP_PMU_CAPABILITY 8.35 KVM_CAP_PMU_CAPABILITY
--------------------------- ---------------------------
:Capability KVM_CAP_PMU_CAPABILITY :Capability: KVM_CAP_PMU_CAPABILITY
:Architectures: x86 :Architectures: x86
:Type: vm :Type: vm
:Parameters: arg[0] is bitmask of PMU virtualization capabilities. :Parameters: arg[0] is bitmask of PMU virtualization capabilities.
:Returns 0 on success, -EINVAL when arg[0] contains invalid bits :Returns: 0 on success, -EINVAL when arg[0] contains invalid bits
This capability alters PMU virtualization in KVM. This capability alters PMU virtualization in KVM.

View File

@ -73,7 +73,7 @@ Tips for patch submitters
and ideally, should come with a patch proposal. Please do not send and ideally, should come with a patch proposal. Please do not send
automated reports to this list either. Such bugs will be handled automated reports to this list either. Such bugs will be handled
better and faster in the usual public places. See 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. 8. Happy hacking.
@ -8224,6 +8224,7 @@ F: drivers/net/ethernet/freescale/dpaa
FREESCALE QORIQ DPAA FMAN DRIVER FREESCALE QORIQ DPAA FMAN DRIVER
M: Madalin Bucur <madalin.bucur@nxp.com> M: Madalin Bucur <madalin.bucur@nxp.com>
R: Sean Anderson <sean.anderson@seco.com>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/net/fsl-fman.txt F: Documentation/devicetree/bindings/net/fsl-fman.txt
@ -14665,10 +14666,8 @@ F: net/ipv4/nexthop.c
NFC SUBSYSTEM NFC SUBSYSTEM
M: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> M: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
L: linux-nfc@lists.01.org (subscribers-only)
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
B: mailto:linux-nfc@lists.01.org
F: Documentation/devicetree/bindings/net/nfc/ F: Documentation/devicetree/bindings/net/nfc/
F: drivers/nfc/ F: drivers/nfc/
F: include/linux/platform_data/nfcmrvl.h F: include/linux/platform_data/nfcmrvl.h
@ -14679,7 +14678,6 @@ F: net/nfc/
NFC VIRTUAL NCI DEVICE DRIVER NFC VIRTUAL NCI DEVICE DRIVER
M: Bongsu Jeon <bongsu.jeon@samsung.com> M: Bongsu Jeon <bongsu.jeon@samsung.com>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
L: linux-nfc@lists.01.org (subscribers-only)
S: Supported S: Supported
F: drivers/nfc/virtual_ncidev.c F: drivers/nfc/virtual_ncidev.c
F: tools/testing/selftests/nci/ F: tools/testing/selftests/nci/
@ -15051,7 +15049,6 @@ F: Documentation/devicetree/bindings/sound/nxp,tfa989x.yaml
F: sound/soc/codecs/tfa989x.c F: sound/soc/codecs/tfa989x.c
NXP-NCI NFC DRIVER NXP-NCI NFC DRIVER
L: linux-nfc@lists.01.org (subscribers-only)
S: Orphan S: Orphan
F: Documentation/devicetree/bindings/net/nfc/nxp,nci.yaml F: Documentation/devicetree/bindings/net/nfc/nxp,nci.yaml
F: drivers/nfc/nxp-nci F: drivers/nfc/nxp-nci
@ -18294,8 +18291,9 @@ F: drivers/s390/block/dasd*
F: include/linux/dasd_mod.h F: include/linux/dasd_mod.h
S390 IOMMU (PCI) S390 IOMMU (PCI)
M: Niklas Schnelle <schnelle@linux.ibm.com>
M: Matthew Rosato <mjrosato@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 L: linux-s390@vger.kernel.org
S: Supported S: Supported
F: drivers/iommu/s390-iommu.c F: drivers/iommu/s390-iommu.c
@ -18490,7 +18488,6 @@ F: include/media/drv-intf/s3c_camif.h
SAMSUNG S3FWRN5 NFC DRIVER SAMSUNG S3FWRN5 NFC DRIVER
M: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> M: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
L: linux-nfc@lists.01.org (subscribers-only)
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/net/nfc/samsung,s3fwrn5.yaml F: Documentation/devicetree/bindings/net/nfc/samsung,s3fwrn5.yaml
F: drivers/nfc/s3fwrn5 F: drivers/nfc/s3fwrn5
@ -18800,7 +18797,7 @@ F: include/uapi/linux/sed*
SECURITY CONTACT SECURITY CONTACT
M: Security Officers <security@kernel.org> M: Security Officers <security@kernel.org>
S: Supported S: Supported
F: Documentation/admin-guide/security-bugs.rst F: Documentation/process/security-bugs.rst
SECURITY SUBSYSTEM SECURITY SUBSYSTEM
M: Paul Moore <paul@paul-moore.com> M: Paul Moore <paul@paul-moore.com>
@ -20649,7 +20646,6 @@ F: sound/soc/codecs/tscs*.h
TENSILICA XTENSA PORT (xtensa) TENSILICA XTENSA PORT (xtensa)
M: Chris Zankel <chris@zankel.net> M: Chris Zankel <chris@zankel.net>
M: Max Filippov <jcmvbkbc@gmail.com> M: Max Filippov <jcmvbkbc@gmail.com>
L: linux-xtensa@linux-xtensa.org
S: Maintained S: Maintained
T: git https://github.com/jcmvbkbc/linux-xtensa.git T: git https://github.com/jcmvbkbc/linux-xtensa.git
F: arch/xtensa/ F: arch/xtensa/
@ -20985,7 +20981,6 @@ F: drivers/iio/magnetometer/tmag5273.c
TI TRF7970A NFC DRIVER TI TRF7970A NFC DRIVER
M: Mark Greer <mgreer@animalcreek.com> M: Mark Greer <mgreer@animalcreek.com>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
L: linux-nfc@lists.01.org (subscribers-only)
S: Supported S: Supported
F: Documentation/devicetree/bindings/net/nfc/ti,trf7970a.yaml F: Documentation/devicetree/bindings/net/nfc/ti,trf7970a.yaml
F: drivers/nfc/trf7970a.c F: drivers/nfc/trf7970a.c
@ -21647,6 +21642,7 @@ USB OVER IP DRIVER
M: Valentina Manea <valentina.manea.m@gmail.com> M: Valentina Manea <valentina.manea.m@gmail.com>
M: Shuah Khan <shuah@kernel.org> M: Shuah Khan <shuah@kernel.org>
M: Shuah Khan <skhan@linuxfoundation.org> M: Shuah Khan <skhan@linuxfoundation.org>
R: Hongren Zheng <i@zenithal.me>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/usb/usbip_protocol.rst F: Documentation/usb/usbip_protocol.rst
@ -23041,7 +23037,6 @@ F: drivers/gpio/gpio-xra1403.c
XTENSA XTFPGA PLATFORM SUPPORT XTENSA XTFPGA PLATFORM SUPPORT
M: Max Filippov <jcmvbkbc@gmail.com> M: Max Filippov <jcmvbkbc@gmail.com>
L: linux-xtensa@linux-xtensa.org
S: Maintained S: Maintained
F: drivers/spi/spi-xtensa-xtfpga.c F: drivers/spi/spi-xtensa-xtfpga.c
F: sound/soc/xtensa/xtfpga-i2s.c F: sound/soc/xtensa/xtfpga-i2s.c

View File

@ -2,7 +2,7 @@
VERSION = 6 VERSION = 6
PATCHLEVEL = 3 PATCHLEVEL = 3
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc3 EXTRAVERSION = -rc6
NAME = Hurr durr I'ma ninja sloth NAME = Hurr durr I'ma ninja sloth
# *DOCUMENTATION* # *DOCUMENTATION*

View File

@ -311,6 +311,7 @@
&usbotg1 { &usbotg1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usbotg1>;
disable-over-current; disable-over-current;
srp-disable; srp-disable;
hnp-disable; hnp-disable;

View File

@ -321,6 +321,7 @@
&usbotg1 { &usbotg1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usbotg1>;
disable-over-current; disable-over-current;
srp-disable; srp-disable;
hnp-disable; hnp-disable;

View File

@ -625,6 +625,7 @@
&usbotg1 { &usbotg1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usbotg1>;
disable-over-current; disable-over-current;
srp-disable; srp-disable;
hnp-disable; hnp-disable;

View File

@ -27,6 +27,16 @@
}; };
reserved-memory { 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 { adsp_region: adsp@3300000 {
reg = <0x03300000 0x1400000>; reg = <0x03300000 0x1400000>;
no-map; no-map;

View File

@ -116,7 +116,7 @@ __copy_to_user_memcpy(void __user *to, const void *from, unsigned long n)
tocopy = n; tocopy = n;
ua_flags = uaccess_save_and_enable(); ua_flags = uaccess_save_and_enable();
memcpy((void *)to, from, tocopy); __memcpy((void *)to, from, tocopy);
uaccess_restore(ua_flags); uaccess_restore(ua_flags);
to += tocopy; to += tocopy;
from += tocopy; from += tocopy;
@ -178,7 +178,7 @@ __clear_user_memset(void __user *addr, unsigned long n)
tocopy = n; tocopy = n;
ua_flags = uaccess_save_and_enable(); ua_flags = uaccess_save_and_enable();
memset((void *)addr, 0, tocopy); __memset((void *)addr, 0, tocopy);
uaccess_restore(ua_flags); uaccess_restore(ua_flags);
addr += tocopy; addr += tocopy;
n -= tocopy; n -= tocopy;

View File

@ -56,14 +56,10 @@
}; };
&enetc_port2 { &enetc_port2 {
nvmem-cells = <&base_mac_address 2>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };
&enetc_port3 { &enetc_port3 {
nvmem-cells = <&base_mac_address 3>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };
@ -84,8 +80,6 @@
managed = "in-band-status"; managed = "in-band-status";
phy-handle = <&qsgmii_phy0>; phy-handle = <&qsgmii_phy0>;
phy-mode = "qsgmii"; phy-mode = "qsgmii";
nvmem-cells = <&base_mac_address 4>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };
@ -94,8 +88,6 @@
managed = "in-band-status"; managed = "in-band-status";
phy-handle = <&qsgmii_phy1>; phy-handle = <&qsgmii_phy1>;
phy-mode = "qsgmii"; phy-mode = "qsgmii";
nvmem-cells = <&base_mac_address 5>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };
@ -104,8 +96,6 @@
managed = "in-band-status"; managed = "in-band-status";
phy-handle = <&qsgmii_phy2>; phy-handle = <&qsgmii_phy2>;
phy-mode = "qsgmii"; phy-mode = "qsgmii";
nvmem-cells = <&base_mac_address 6>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };
@ -114,8 +104,6 @@
managed = "in-band-status"; managed = "in-band-status";
phy-handle = <&qsgmii_phy3>; phy-handle = <&qsgmii_phy3>;
phy-mode = "qsgmii"; phy-mode = "qsgmii";
nvmem-cells = <&base_mac_address 7>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };

View File

@ -55,7 +55,5 @@
&enetc_port1 { &enetc_port1 {
phy-handle = <&phy0>; phy-handle = <&phy0>;
phy-mode = "rgmii-id"; phy-mode = "rgmii-id";
nvmem-cells = <&base_mac_address 0>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };

View File

@ -36,14 +36,10 @@
}; };
&enetc_port2 { &enetc_port2 {
nvmem-cells = <&base_mac_address 2>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };
&enetc_port3 { &enetc_port3 {
nvmem-cells = <&base_mac_address 3>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };
@ -56,8 +52,6 @@
managed = "in-band-status"; managed = "in-band-status";
phy-handle = <&phy0>; phy-handle = <&phy0>;
phy-mode = "sgmii"; phy-mode = "sgmii";
nvmem-cells = <&base_mac_address 0>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };
@ -66,8 +60,6 @@
managed = "in-band-status"; managed = "in-band-status";
phy-handle = <&phy1>; phy-handle = <&phy1>;
phy-mode = "sgmii"; phy-mode = "sgmii";
nvmem-cells = <&base_mac_address 1>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };

View File

@ -43,7 +43,5 @@
&enetc_port1 { &enetc_port1 {
phy-handle = <&phy1>; phy-handle = <&phy1>;
phy-mode = "rgmii-id"; phy-mode = "rgmii-id";
nvmem-cells = <&base_mac_address 1>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };

View File

@ -92,8 +92,6 @@
phy-handle = <&phy0>; phy-handle = <&phy0>;
phy-mode = "sgmii"; phy-mode = "sgmii";
managed = "in-band-status"; managed = "in-band-status";
nvmem-cells = <&base_mac_address 0>;
nvmem-cell-names = "mac-address";
status = "okay"; status = "okay";
}; };
@ -156,21 +154,6 @@
label = "bootloader environment"; 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>;
};
};
};
}; };
}; };

View File

@ -117,7 +117,7 @@ lsio_subsys: bus@5d000000 {
interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX_SC_R_FSPI_0 IMX_SC_PM_CLK_PER>, clocks = <&clk IMX_SC_R_FSPI_0 IMX_SC_PM_CLK_PER>,
<&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>; power-domains = <&pd IMX_SC_R_FSPI_0>;
status = "disabled"; status = "disabled";
}; };

View File

@ -121,8 +121,6 @@
phy-handle = <&ethphy0>; phy-handle = <&ethphy0>;
nvmem-cells = <&fec_mac1>; nvmem-cells = <&fec_mac1>;
nvmem-cell-names = "mac-address"; nvmem-cell-names = "mac-address";
snps,reset-gpios = <&pca6416_1 2 GPIO_ACTIVE_LOW>;
snps,reset-delays-us = <10 20 200000>;
status = "okay"; status = "okay";
mdio { mdio {
@ -136,6 +134,9 @@
eee-broken-1000t; eee-broken-1000t;
qca,disable-smarteee; qca,disable-smarteee;
qca,disable-hibernation-mode; qca,disable-hibernation-mode;
reset-gpios = <&pca6416_1 2 GPIO_ACTIVE_LOW>;
reset-assert-us = <20>;
reset-deassert-us = <200000>;
vddio-supply = <&vddio0>; vddio-supply = <&vddio0>;
vddio0: vddio-regulator { vddio0: vddio-regulator {

View File

@ -247,7 +247,7 @@
compatible = "wlf,wm8960"; compatible = "wlf,wm8960";
reg = <0x1a>; reg = <0x1a>;
clocks = <&clk IMX8MM_CLK_SAI1_ROOT>; clocks = <&clk IMX8MM_CLK_SAI1_ROOT>;
clock-names = "mclk1"; clock-names = "mclk";
wlf,shared-lrclk; wlf,shared-lrclk;
#sound-dai-cells = <0>; #sound-dai-cells = <0>;
}; };

View File

@ -296,6 +296,7 @@
sai2: sai@30020000 { sai2: sai@30020000 {
compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai";
reg = <0x30020000 0x10000>; reg = <0x30020000 0x10000>;
#sound-dai-cells = <0>;
interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX8MN_CLK_SAI2_IPG>, clocks = <&clk IMX8MN_CLK_SAI2_IPG>,
<&clk IMX8MN_CLK_DUMMY>, <&clk IMX8MN_CLK_DUMMY>,
@ -310,6 +311,7 @@
sai3: sai@30030000 { sai3: sai@30030000 {
compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai";
reg = <0x30030000 0x10000>; reg = <0x30030000 0x10000>;
#sound-dai-cells = <0>;
interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX8MN_CLK_SAI3_IPG>, clocks = <&clk IMX8MN_CLK_SAI3_IPG>,
<&clk IMX8MN_CLK_DUMMY>, <&clk IMX8MN_CLK_DUMMY>,
@ -324,6 +326,7 @@
sai5: sai@30050000 { sai5: sai@30050000 {
compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai";
reg = <0x30050000 0x10000>; reg = <0x30050000 0x10000>;
#sound-dai-cells = <0>;
interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX8MN_CLK_SAI5_IPG>, clocks = <&clk IMX8MN_CLK_SAI5_IPG>,
<&clk IMX8MN_CLK_DUMMY>, <&clk IMX8MN_CLK_DUMMY>,
@ -340,6 +343,7 @@
sai6: sai@30060000 { sai6: sai@30060000 {
compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai";
reg = <0x30060000 0x10000>; reg = <0x30060000 0x10000>;
#sound-dai-cells = <0>;
interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX8MN_CLK_SAI6_IPG>, clocks = <&clk IMX8MN_CLK_SAI6_IPG>,
<&clk IMX8MN_CLK_DUMMY>, <&clk IMX8MN_CLK_DUMMY>,
@ -397,6 +401,7 @@
sai7: sai@300b0000 { sai7: sai@300b0000 {
compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai";
reg = <0x300b0000 0x10000>; reg = <0x300b0000 0x10000>;
#sound-dai-cells = <0>;
interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX8MN_CLK_SAI7_IPG>, clocks = <&clk IMX8MN_CLK_SAI7_IPG>,
<&clk IMX8MN_CLK_DUMMY>, <&clk IMX8MN_CLK_DUMMY>,

View File

@ -1131,8 +1131,8 @@
reg = <0x32e90000 0x238>; reg = <0x32e90000 0x238>;
interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX8MP_CLK_MEDIA_DISP2_PIX_ROOT>, 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"; clock-names = "pix", "axi", "disp_axi";
assigned-clocks = <&clk IMX8MP_CLK_MEDIA_DISP2_PIX>, assigned-clocks = <&clk IMX8MP_CLK_MEDIA_DISP2_PIX>,
<&clk IMX8MP_VIDEO_PLL1>; <&clk IMX8MP_VIDEO_PLL1>;

View File

@ -164,6 +164,8 @@
lpi2c1: i2c@44340000 { lpi2c1: i2c@44340000 {
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c"; compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
reg = <0x44340000 0x10000>; reg = <0x44340000 0x10000>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX93_CLK_LPI2C1_GATE>, clocks = <&clk IMX93_CLK_LPI2C1_GATE>,
<&clk IMX93_CLK_BUS_AON>; <&clk IMX93_CLK_BUS_AON>;
@ -174,6 +176,8 @@
lpi2c2: i2c@44350000 { lpi2c2: i2c@44350000 {
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c"; compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
reg = <0x44350000 0x10000>; reg = <0x44350000 0x10000>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX93_CLK_LPI2C2_GATE>, clocks = <&clk IMX93_CLK_LPI2C2_GATE>,
<&clk IMX93_CLK_BUS_AON>; <&clk IMX93_CLK_BUS_AON>;
@ -343,6 +347,8 @@
lpi2c3: i2c@42530000 { lpi2c3: i2c@42530000 {
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c"; compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
reg = <0x42530000 0x10000>; reg = <0x42530000 0x10000>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX93_CLK_LPI2C3_GATE>, clocks = <&clk IMX93_CLK_LPI2C3_GATE>,
<&clk IMX93_CLK_BUS_WAKEUP>; <&clk IMX93_CLK_BUS_WAKEUP>;
@ -353,6 +359,8 @@
lpi2c4: i2c@42540000 { lpi2c4: i2c@42540000 {
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c"; compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
reg = <0x42540000 0x10000>; reg = <0x42540000 0x10000>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX93_CLK_LPI2C4_GATE>, clocks = <&clk IMX93_CLK_LPI2C4_GATE>,
<&clk IMX93_CLK_BUS_WAKEUP>; <&clk IMX93_CLK_BUS_WAKEUP>;
@ -455,6 +463,8 @@
lpi2c5: i2c@426b0000 { lpi2c5: i2c@426b0000 {
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c"; compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
reg = <0x426b0000 0x10000>; reg = <0x426b0000 0x10000>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <GIC_SPI 195 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 195 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX93_CLK_LPI2C5_GATE>, clocks = <&clk IMX93_CLK_LPI2C5_GATE>,
<&clk IMX93_CLK_BUS_WAKEUP>; <&clk IMX93_CLK_BUS_WAKEUP>;
@ -465,6 +475,8 @@
lpi2c6: i2c@426c0000 { lpi2c6: i2c@426c0000 {
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c"; compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
reg = <0x426c0000 0x10000>; reg = <0x426c0000 0x10000>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX93_CLK_LPI2C6_GATE>, clocks = <&clk IMX93_CLK_LPI2C6_GATE>,
<&clk IMX93_CLK_BUS_WAKEUP>; <&clk IMX93_CLK_BUS_WAKEUP>;
@ -475,6 +487,8 @@
lpi2c7: i2c@426d0000 { lpi2c7: i2c@426d0000 {
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c"; compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
reg = <0x426d0000 0x10000>; reg = <0x426d0000 0x10000>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX93_CLK_LPI2C7_GATE>, clocks = <&clk IMX93_CLK_LPI2C7_GATE>,
<&clk IMX93_CLK_BUS_WAKEUP>; <&clk IMX93_CLK_BUS_WAKEUP>;
@ -485,6 +499,8 @@
lpi2c8: i2c@426e0000 { lpi2c8: i2c@426e0000 {
compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c"; compatible = "fsl,imx93-lpi2c", "fsl,imx7ulp-lpi2c";
reg = <0x426e0000 0x10000>; reg = <0x426e0000 0x10000>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX93_CLK_LPI2C8_GATE>, clocks = <&clk IMX93_CLK_LPI2C8_GATE>,
<&clk IMX93_CLK_BUS_WAKEUP>; <&clk IMX93_CLK_BUS_WAKEUP>;
@ -580,9 +596,9 @@
eqos: ethernet@428a0000 { eqos: ethernet@428a0000 {
compatible = "nxp,imx93-dwmac-eqos", "snps,dwmac-5.10a"; compatible = "nxp,imx93-dwmac-eqos", "snps,dwmac-5.10a";
reg = <0x428a0000 0x10000>; reg = <0x428a0000 0x10000>;
interrupts = <GIC_SPI 183 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>; <GIC_SPI 183 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "eth_wake_irq", "macirq"; interrupt-names = "macirq", "eth_wake_irq";
clocks = <&clk IMX93_CLK_ENET_QOS_GATE>, clocks = <&clk IMX93_CLK_ENET_QOS_GATE>,
<&clk IMX93_CLK_ENET_QOS_GATE>, <&clk IMX93_CLK_ENET_QOS_GATE>,
<&clk IMX93_CLK_ENET_TIMER2>, <&clk IMX93_CLK_ENET_TIMER2>,
@ -595,7 +611,7 @@
<&clk IMX93_CLK_SYS_PLL_PFD0_DIV2>; <&clk IMX93_CLK_SYS_PLL_PFD0_DIV2>;
assigned-clock-rates = <100000000>, <250000000>; assigned-clock-rates = <100000000>, <250000000>;
intf_mode = <&wakeupmix_gpr 0x28>; intf_mode = <&wakeupmix_gpr 0x28>;
clk_csr = <0>; snps,clk-csr = <0>;
status = "disabled"; status = "disabled";
}; };

View File

@ -22,7 +22,7 @@
#address-cells = <2>; #address-cells = <2>;
#size-cells = <2>; #size-cells = <2>;
ranges = <0x0 0x0 0x0 0x0 0x0 0x40000000>; ranges = <0x0 0x0 0x0 0x0 0x100 0x0>;
apbmisc: misc@100000 { apbmisc: misc@100000 {
compatible = "nvidia,tegra194-misc"; compatible = "nvidia,tegra194-misc";

View File

@ -20,7 +20,7 @@
#address-cells = <2>; #address-cells = <2>;
#size-cells = <2>; #size-cells = <2>;
ranges = <0x0 0x0 0x0 0x0 0x0 0x40000000>; ranges = <0x0 0x0 0x0 0x0 0x100 0x0>;
misc@100000 { misc@100000 {
compatible = "nvidia,tegra234-misc"; compatible = "nvidia,tegra234-misc";

View File

@ -33,7 +33,3 @@
&gpio_leds_default { &gpio_leds_default {
pins = "gpio81", "gpio82", "gpio83"; pins = "gpio81", "gpio82", "gpio83";
}; };
&sim_ctrl_default {
pins = "gpio1", "gpio2";
};

View File

@ -25,6 +25,11 @@
gpios = <&msmgpio 20 GPIO_ACTIVE_HIGH>; gpios = <&msmgpio 20 GPIO_ACTIVE_HIGH>;
}; };
&mpss {
pinctrl-0 = <&sim_ctrl_default>;
pinctrl-names = "default";
};
&button_default { &button_default {
pins = "gpio37"; pins = "gpio37";
bias-pull-down; bias-pull-down;
@ -34,6 +39,25 @@
pins = "gpio20", "gpio21", "gpio22"; pins = "gpio20", "gpio21", "gpio22";
}; };
&sim_ctrl_default { /* This selects the external SIM card slot by default */
pins = "gpio1", "gpio2"; &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;
};
};
}; };

View File

@ -92,9 +92,6 @@
}; };
&mpss { &mpss {
pinctrl-0 = <&sim_ctrl_default>;
pinctrl-names = "default";
status = "okay"; status = "okay";
}; };
@ -240,11 +237,4 @@
drive-strength = <2>; drive-strength = <2>;
bias-disable; bias-disable;
}; };
sim_ctrl_default: sim-ctrl-default-state {
function = "gpio";
drive-strength = <2>;
bias-disable;
output-low;
};
}; };

View File

@ -241,7 +241,7 @@
}; };
&remoteproc_nsp0 { &remoteproc_nsp0 {
firmware-name = "qcom/sa8540p/cdsp.mbn"; firmware-name = "qcom/sa8540p/cdsp0.mbn";
status = "okay"; status = "okay";
}; };

View File

@ -2131,6 +2131,8 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pcie1_clkreq_n>; pinctrl-0 = <&pcie1_clkreq_n>;
dma-coherent;
iommus = <&apps_smmu 0x1c80 0x1>; iommus = <&apps_smmu 0x1c80 0x1>;
iommu-map = <0x0 &apps_smmu 0x1c80 0x1>, iommu-map = <0x0 &apps_smmu 0x1c80 0x1>,

View File

@ -370,6 +370,7 @@
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>; regulator-max-microvolt = <1800000>;
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>; regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
regulator-always-on;
}; };
vreg_s11b: smps11 { vreg_s11b: smps11 {
@ -377,6 +378,7 @@
regulator-min-microvolt = <1272000>; regulator-min-microvolt = <1272000>;
regulator-max-microvolt = <1272000>; regulator-max-microvolt = <1272000>;
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>; regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
regulator-always-on;
}; };
vreg_s12b: smps12 { vreg_s12b: smps12 {
@ -384,6 +386,7 @@
regulator-min-microvolt = <984000>; regulator-min-microvolt = <984000>;
regulator-max-microvolt = <984000>; regulator-max-microvolt = <984000>;
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>; regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
regulator-always-on;
}; };
vreg_l3b: ldo3 { vreg_l3b: ldo3 {
@ -441,6 +444,7 @@
regulator-min-microvolt = <3008000>; regulator-min-microvolt = <3008000>;
regulator-max-microvolt = <3960000>; regulator-max-microvolt = <3960000>;
regulator-initial-mode = <RPMH_REGULATOR_MODE_AUTO>; regulator-initial-mode = <RPMH_REGULATOR_MODE_AUTO>;
regulator-always-on;
}; };
}; };
@ -772,75 +776,88 @@
pmic-die-temp@3 { pmic-die-temp@3 {
reg = <PMK8350_ADC7_DIE_TEMP>; reg = <PMK8350_ADC7_DIE_TEMP>;
qcom,pre-scaling = <1 1>; qcom,pre-scaling = <1 1>;
label = "pmk8350_die_temp";
}; };
xo-therm@44 { xo-therm@44 {
reg = <PMK8350_ADC7_AMUX_THM1_100K_PU>; reg = <PMK8350_ADC7_AMUX_THM1_100K_PU>;
qcom,hw-settle-time = <200>; qcom,hw-settle-time = <200>;
qcom,ratiometric; qcom,ratiometric;
label = "pmk8350_xo_therm";
}; };
pmic-die-temp@103 { pmic-die-temp@103 {
reg = <PM8350_ADC7_DIE_TEMP(1)>; reg = <PM8350_ADC7_DIE_TEMP(1)>;
qcom,pre-scaling = <1 1>; qcom,pre-scaling = <1 1>;
label = "pmc8280_1_die_temp";
}; };
sys-therm@144 { sys-therm@144 {
reg = <PM8350_ADC7_AMUX_THM1_100K_PU(1)>; reg = <PM8350_ADC7_AMUX_THM1_100K_PU(1)>;
qcom,hw-settle-time = <200>; qcom,hw-settle-time = <200>;
qcom,ratiometric; qcom,ratiometric;
label = "sys_therm1";
}; };
sys-therm@145 { sys-therm@145 {
reg = <PM8350_ADC7_AMUX_THM2_100K_PU(1)>; reg = <PM8350_ADC7_AMUX_THM2_100K_PU(1)>;
qcom,hw-settle-time = <200>; qcom,hw-settle-time = <200>;
qcom,ratiometric; qcom,ratiometric;
label = "sys_therm2";
}; };
sys-therm@146 { sys-therm@146 {
reg = <PM8350_ADC7_AMUX_THM3_100K_PU(1)>; reg = <PM8350_ADC7_AMUX_THM3_100K_PU(1)>;
qcom,hw-settle-time = <200>; qcom,hw-settle-time = <200>;
qcom,ratiometric; qcom,ratiometric;
label = "sys_therm3";
}; };
sys-therm@147 { sys-therm@147 {
reg = <PM8350_ADC7_AMUX_THM4_100K_PU(1)>; reg = <PM8350_ADC7_AMUX_THM4_100K_PU(1)>;
qcom,hw-settle-time = <200>; qcom,hw-settle-time = <200>;
qcom,ratiometric; qcom,ratiometric;
label = "sys_therm4";
}; };
pmic-die-temp@303 { pmic-die-temp@303 {
reg = <PM8350_ADC7_DIE_TEMP(3)>; reg = <PM8350_ADC7_DIE_TEMP(3)>;
qcom,pre-scaling = <1 1>; qcom,pre-scaling = <1 1>;
label = "pmc8280_2_die_temp";
}; };
sys-therm@344 { sys-therm@344 {
reg = <PM8350_ADC7_AMUX_THM1_100K_PU(3)>; reg = <PM8350_ADC7_AMUX_THM1_100K_PU(3)>;
qcom,hw-settle-time = <200>; qcom,hw-settle-time = <200>;
qcom,ratiometric; qcom,ratiometric;
label = "sys_therm5";
}; };
sys-therm@345 { sys-therm@345 {
reg = <PM8350_ADC7_AMUX_THM2_100K_PU(3)>; reg = <PM8350_ADC7_AMUX_THM2_100K_PU(3)>;
qcom,hw-settle-time = <200>; qcom,hw-settle-time = <200>;
qcom,ratiometric; qcom,ratiometric;
label = "sys_therm6";
}; };
sys-therm@346 { sys-therm@346 {
reg = <PM8350_ADC7_AMUX_THM3_100K_PU(3)>; reg = <PM8350_ADC7_AMUX_THM3_100K_PU(3)>;
qcom,hw-settle-time = <200>; qcom,hw-settle-time = <200>;
qcom,ratiometric; qcom,ratiometric;
label = "sys_therm7";
}; };
sys-therm@347 { sys-therm@347 {
reg = <PM8350_ADC7_AMUX_THM4_100K_PU(3)>; reg = <PM8350_ADC7_AMUX_THM4_100K_PU(3)>;
qcom,hw-settle-time = <200>; qcom,hw-settle-time = <200>;
qcom,ratiometric; qcom,ratiometric;
label = "sys_therm8";
}; };
pmic-die-temp@403 { pmic-die-temp@403 {
reg = <PMR735A_ADC7_DIE_TEMP>; reg = <PMR735A_ADC7_DIE_TEMP>;
qcom,pre-scaling = <1 1>; qcom,pre-scaling = <1 1>;
label = "pmr735a_die_temp";
}; };
}; };
@ -884,9 +901,9 @@
"VA DMIC0", "MIC BIAS1", "VA DMIC0", "MIC BIAS1",
"VA DMIC1", "MIC BIAS1", "VA DMIC1", "MIC BIAS1",
"VA DMIC2", "MIC BIAS3", "VA DMIC2", "MIC BIAS3",
"TX DMIC0", "MIC BIAS1", "VA DMIC0", "VA MIC BIAS1",
"TX DMIC1", "MIC BIAS2", "VA DMIC1", "VA MIC BIAS1",
"TX DMIC2", "MIC BIAS3", "VA DMIC2", "VA MIC BIAS3",
"TX SWR_ADC1", "ADC2_OUTPUT"; "TX SWR_ADC1", "ADC2_OUTPUT";
wcd-playback-dai-link { wcd-playback-dai-link {
@ -937,7 +954,7 @@
va-dai-link { va-dai-link {
link-name = "VA Capture"; link-name = "VA Capture";
cpu { cpu {
sound-dai = <&q6apmbedai TX_CODEC_DMA_TX_3>; sound-dai = <&q6apmbedai VA_CODEC_DMA_TX_0>;
}; };
platform { platform {
@ -1062,7 +1079,7 @@
vdd-micb-supply = <&vreg_s10b>; vdd-micb-supply = <&vreg_s10b>;
qcom,dmic-sample-rate = <600000>; qcom,dmic-sample-rate = <4800000>;
status = "okay"; status = "okay";
}; };

View File

@ -2504,12 +2504,12 @@
qcom,ports-sinterval-low = /bits/ 8 <0x03 0x1f 0x1f 0x07 0x00>; qcom,ports-sinterval-low = /bits/ 8 <0x03 0x1f 0x1f 0x07 0x00>;
qcom,ports-offset1 = /bits/ 8 <0x00 0x00 0x0B 0x01 0x00>; qcom,ports-offset1 = /bits/ 8 <0x00 0x00 0x0B 0x01 0x00>;
qcom,ports-offset2 = /bits/ 8 <0x00 0x00 0x0B 0x00 0x00>; qcom,ports-offset2 = /bits/ 8 <0x00 0x00 0x0B 0x00 0x00>;
qcom,ports-hstart = /bits/ 8 <0xff 0x03 0xff 0xff 0xff>; qcom,ports-hstart = /bits/ 8 <0xff 0x03 0x00 0xff 0xff>;
qcom,ports-hstop = /bits/ 8 <0xff 0x06 0xff 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-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-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>; #sound-dai-cells = <1>;
#address-cells = <2>; #address-cells = <2>;
@ -2600,7 +2600,7 @@
<&intc GIC_SPI 520 IRQ_TYPE_LEVEL_HIGH>; <&intc GIC_SPI 520 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "core", "wake"; interrupt-names = "core", "wake";
clocks = <&vamacro>; clocks = <&txmacro>;
clock-names = "iface"; clock-names = "iface";
label = "TX"; label = "TX";
#sound-dai-cells = <1>; #sound-dai-cells = <1>;
@ -2609,15 +2609,15 @@
qcom,din-ports = <4>; qcom,din-ports = <4>;
qcom,dout-ports = <0>; qcom,dout-ports = <0>;
qcom,ports-sinterval-low = /bits/ 8 <0x01 0x03 0x03 0x03>; qcom,ports-sinterval-low = /bits/ 8 <0x01 0x01 0x03 0x03>;
qcom,ports-offset1 = /bits/ 8 <0x01 0x00 0x02 0x01>; qcom,ports-offset1 = /bits/ 8 <0x01 0x00 0x02 0x00>;
qcom,ports-offset2 = /bits/ 8 <0x00 0x00 0x00 0x00>; qcom,ports-offset2 = /bits/ 8 <0x00 0x00 0x00 0x00>;
qcom,ports-block-pack-mode = /bits/ 8 <0xff 0xff 0xff 0xff>; qcom,ports-block-pack-mode = /bits/ 8 <0xff 0xff 0xff 0xff>;
qcom,ports-hstart = /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-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-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"; status = "disabled";
}; };

View File

@ -1078,6 +1078,7 @@
dma-names = "tx", "rx"; dma-names = "tx", "rx";
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
status = "disabled";
}; };
}; };

View File

@ -1209,6 +1209,7 @@
clock-names = "xo"; clock-names = "xo";
power-domains = <&rpmpd SM6375_VDDCX>; power-domains = <&rpmpd SM6375_VDDCX>;
power-domain-names = "cx";
memory-region = <&pil_cdsp_mem>; memory-region = <&pil_cdsp_mem>;

View File

@ -1826,7 +1826,7 @@
"slave_q2a", "slave_q2a",
"tbu"; "tbu";
iommus = <&apps_smmu 0x1d80 0x7f>; iommus = <&apps_smmu 0x1d80 0x3f>;
iommu-map = <0x0 &apps_smmu 0x1d80 0x1>, iommu-map = <0x0 &apps_smmu 0x1d80 0x1>,
<0x100 &apps_smmu 0x1d81 0x1>; <0x100 &apps_smmu 0x1d81 0x1>;
@ -1925,7 +1925,7 @@
assigned-clocks = <&gcc GCC_PCIE_1_AUX_CLK>; assigned-clocks = <&gcc GCC_PCIE_1_AUX_CLK>;
assigned-clock-rates = <19200000>; assigned-clock-rates = <19200000>;
iommus = <&apps_smmu 0x1e00 0x7f>; iommus = <&apps_smmu 0x1e00 0x3f>;
iommu-map = <0x0 &apps_smmu 0x1e00 0x1>, iommu-map = <0x0 &apps_smmu 0x1e00 0x1>,
<0x100 &apps_smmu 0x1e01 0x1>; <0x100 &apps_smmu 0x1e01 0x1>;

View File

@ -625,6 +625,6 @@
}; };
&venus { &venus {
firmware-name = "qcom/sm8250/elish/venus.mbn"; firmware-name = "qcom/sm8250/xiaomi/elish/venus.mbn";
status = "okay"; status = "okay";
}; };

View File

@ -1664,6 +1664,7 @@
power-domains = <&gcc UFS_PHY_GDSC>; power-domains = <&gcc UFS_PHY_GDSC>;
iommus = <&apps_smmu 0xe0 0x0>; iommus = <&apps_smmu 0xe0 0x0>;
dma-coherent;
clock-names = clock-names =
"core_clk", "core_clk",

View File

@ -2143,8 +2143,8 @@
<&q6prmcc LPASS_HW_DCODEC_VOTE LPASS_CLK_ATTRIBUTE_COUPLE_NO>, <&q6prmcc LPASS_HW_DCODEC_VOTE LPASS_CLK_ATTRIBUTE_COUPLE_NO>,
<&vamacro>; <&vamacro>;
clock-names = "mclk", "npl", "macro", "dcodec", "fsgen"; clock-names = "mclk", "npl", "macro", "dcodec", "fsgen";
assigned-clocks = <&q6prmcc LPASS_CLK_ID_WSA_CORE_TX_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_WSA_CORE_TX_2X_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>; assigned-clock-rates = <19200000>, <19200000>;
#clock-cells = <0>; #clock-cells = <0>;
@ -4003,6 +4003,7 @@
power-domains = <&gcc UFS_PHY_GDSC>; power-domains = <&gcc UFS_PHY_GDSC>;
iommus = <&apps_smmu 0xe0 0x0>; iommus = <&apps_smmu 0xe0 0x0>;
dma-coherent;
interconnects = <&aggre1_noc MASTER_UFS_MEM 0 &mc_virt SLAVE_EBI1 0>, 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>; <&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_UFS_MEM_CFG 0>;

View File

@ -66,7 +66,7 @@
CPU0: cpu@0 { CPU0: cpu@0 {
device_type = "cpu"; device_type = "cpu";
compatible = "qcom,kryo"; compatible = "arm,cortex-a510";
reg = <0 0>; reg = <0 0>;
enable-method = "psci"; enable-method = "psci";
next-level-cache = <&L2_0>; next-level-cache = <&L2_0>;
@ -89,7 +89,7 @@
CPU1: cpu@100 { CPU1: cpu@100 {
device_type = "cpu"; device_type = "cpu";
compatible = "qcom,kryo"; compatible = "arm,cortex-a510";
reg = <0 0x100>; reg = <0 0x100>;
enable-method = "psci"; enable-method = "psci";
next-level-cache = <&L2_100>; next-level-cache = <&L2_100>;
@ -108,7 +108,7 @@
CPU2: cpu@200 { CPU2: cpu@200 {
device_type = "cpu"; device_type = "cpu";
compatible = "qcom,kryo"; compatible = "arm,cortex-a510";
reg = <0 0x200>; reg = <0 0x200>;
enable-method = "psci"; enable-method = "psci";
next-level-cache = <&L2_200>; next-level-cache = <&L2_200>;
@ -127,7 +127,7 @@
CPU3: cpu@300 { CPU3: cpu@300 {
device_type = "cpu"; device_type = "cpu";
compatible = "qcom,kryo"; compatible = "arm,cortex-a715";
reg = <0 0x300>; reg = <0 0x300>;
enable-method = "psci"; enable-method = "psci";
next-level-cache = <&L2_300>; next-level-cache = <&L2_300>;
@ -146,7 +146,7 @@
CPU4: cpu@400 { CPU4: cpu@400 {
device_type = "cpu"; device_type = "cpu";
compatible = "qcom,kryo"; compatible = "arm,cortex-a715";
reg = <0 0x400>; reg = <0 0x400>;
enable-method = "psci"; enable-method = "psci";
next-level-cache = <&L2_400>; next-level-cache = <&L2_400>;
@ -165,7 +165,7 @@
CPU5: cpu@500 { CPU5: cpu@500 {
device_type = "cpu"; device_type = "cpu";
compatible = "qcom,kryo"; compatible = "arm,cortex-a710";
reg = <0 0x500>; reg = <0 0x500>;
enable-method = "psci"; enable-method = "psci";
next-level-cache = <&L2_500>; next-level-cache = <&L2_500>;
@ -184,7 +184,7 @@
CPU6: cpu@600 { CPU6: cpu@600 {
device_type = "cpu"; device_type = "cpu";
compatible = "qcom,kryo"; compatible = "arm,cortex-a710";
reg = <0 0x600>; reg = <0 0x600>;
enable-method = "psci"; enable-method = "psci";
next-level-cache = <&L2_600>; next-level-cache = <&L2_600>;
@ -203,7 +203,7 @@
CPU7: cpu@700 { CPU7: cpu@700 {
device_type = "cpu"; device_type = "cpu";
compatible = "qcom,kryo"; compatible = "arm,cortex-x3";
reg = <0 0x700>; reg = <0 0x700>;
enable-method = "psci"; enable-method = "psci";
next-level-cache = <&L2_700>; next-level-cache = <&L2_700>;
@ -1905,6 +1905,7 @@
required-opps = <&rpmhpd_opp_nom>; required-opps = <&rpmhpd_opp_nom>;
iommus = <&apps_smmu 0x60 0x0>; iommus = <&apps_smmu 0x60 0x0>;
dma-coherent;
interconnects = <&aggre1_noc MASTER_UFS_MEM 0 &mc_virt SLAVE_EBI1 0>, 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>; <&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_UFS_MEM_CFG 0>;
@ -1997,7 +1998,7 @@
lpass_tlmm: pinctrl@6e80000 { lpass_tlmm: pinctrl@6e80000 {
compatible = "qcom,sm8550-lpass-lpi-pinctrl"; compatible = "qcom,sm8550-lpass-lpi-pinctrl";
reg = <0 0x06e80000 0 0x20000>, reg = <0 0x06e80000 0 0x20000>,
<0 0x0725a000 0 0x10000>; <0 0x07250000 0 0x10000>;
gpio-controller; gpio-controller;
#gpio-cells = <2>; #gpio-cells = <2>;
gpio-ranges = <&lpass_tlmm 0 0 23>; gpio-ranges = <&lpass_tlmm 0 0 23>;
@ -2691,7 +2692,7 @@
pins = "gpio28", "gpio29"; pins = "gpio28", "gpio29";
function = "qup1_se0"; function = "qup1_se0";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_i2c1_data_clk: qup-i2c1-data-clk-state { qup_i2c1_data_clk: qup-i2c1-data-clk-state {
@ -2699,7 +2700,7 @@
pins = "gpio32", "gpio33"; pins = "gpio32", "gpio33";
function = "qup1_se1"; function = "qup1_se1";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_i2c2_data_clk: qup-i2c2-data-clk-state { qup_i2c2_data_clk: qup-i2c2-data-clk-state {
@ -2707,7 +2708,7 @@
pins = "gpio36", "gpio37"; pins = "gpio36", "gpio37";
function = "qup1_se2"; function = "qup1_se2";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_i2c3_data_clk: qup-i2c3-data-clk-state { qup_i2c3_data_clk: qup-i2c3-data-clk-state {
@ -2715,7 +2716,7 @@
pins = "gpio40", "gpio41"; pins = "gpio40", "gpio41";
function = "qup1_se3"; function = "qup1_se3";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_i2c4_data_clk: qup-i2c4-data-clk-state { qup_i2c4_data_clk: qup-i2c4-data-clk-state {
@ -2723,7 +2724,7 @@
pins = "gpio44", "gpio45"; pins = "gpio44", "gpio45";
function = "qup1_se4"; function = "qup1_se4";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_i2c5_data_clk: qup-i2c5-data-clk-state { qup_i2c5_data_clk: qup-i2c5-data-clk-state {
@ -2731,7 +2732,7 @@
pins = "gpio52", "gpio53"; pins = "gpio52", "gpio53";
function = "qup1_se5"; function = "qup1_se5";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_i2c6_data_clk: qup-i2c6-data-clk-state { qup_i2c6_data_clk: qup-i2c6-data-clk-state {
@ -2739,7 +2740,7 @@
pins = "gpio48", "gpio49"; pins = "gpio48", "gpio49";
function = "qup1_se6"; function = "qup1_se6";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_i2c8_data_clk: qup-i2c8-data-clk-state { qup_i2c8_data_clk: qup-i2c8-data-clk-state {
@ -2747,14 +2748,14 @@
pins = "gpio57"; pins = "gpio57";
function = "qup2_se0_l1_mira"; function = "qup2_se0_l1_mira";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
sda-pins { sda-pins {
pins = "gpio56"; pins = "gpio56";
function = "qup2_se0_l0_mira"; function = "qup2_se0_l0_mira";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
}; };
@ -2763,7 +2764,7 @@
pins = "gpio60", "gpio61"; pins = "gpio60", "gpio61";
function = "qup2_se1"; function = "qup2_se1";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_i2c10_data_clk: qup-i2c10-data-clk-state { qup_i2c10_data_clk: qup-i2c10-data-clk-state {
@ -2771,7 +2772,7 @@
pins = "gpio64", "gpio65"; pins = "gpio64", "gpio65";
function = "qup2_se2"; function = "qup2_se2";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_i2c11_data_clk: qup-i2c11-data-clk-state { qup_i2c11_data_clk: qup-i2c11-data-clk-state {
@ -2779,7 +2780,7 @@
pins = "gpio68", "gpio69"; pins = "gpio68", "gpio69";
function = "qup2_se3"; function = "qup2_se3";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_i2c12_data_clk: qup-i2c12-data-clk-state { qup_i2c12_data_clk: qup-i2c12-data-clk-state {
@ -2787,7 +2788,7 @@
pins = "gpio2", "gpio3"; pins = "gpio2", "gpio3";
function = "qup2_se4"; function = "qup2_se4";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_i2c13_data_clk: qup-i2c13-data-clk-state { qup_i2c13_data_clk: qup-i2c13-data-clk-state {
@ -2795,7 +2796,7 @@
pins = "gpio80", "gpio81"; pins = "gpio80", "gpio81";
function = "qup2_se5"; function = "qup2_se5";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_i2c15_data_clk: qup-i2c15-data-clk-state { qup_i2c15_data_clk: qup-i2c15-data-clk-state {
@ -2803,7 +2804,7 @@
pins = "gpio72", "gpio106"; pins = "gpio72", "gpio106";
function = "qup2_se7"; function = "qup2_se7";
drive-strength = <2>; drive-strength = <2>;
bias-pull-up; bias-pull-up = <2200>;
}; };
qup_spi0_cs: qup-spi0-cs-state { qup_spi0_cs: qup-spi0-cs-state {

View File

@ -314,36 +314,32 @@ int do_compat_alignment_fixup(unsigned long addr, struct pt_regs *regs)
int (*handler)(unsigned long addr, u32 instr, struct pt_regs *regs); int (*handler)(unsigned long addr, u32 instr, struct pt_regs *regs);
unsigned int type; unsigned int type;
u32 instr = 0; u32 instr = 0;
u16 tinstr = 0;
int isize = 4; int isize = 4;
int thumb2_32b = 0; int thumb2_32b = 0;
int fault;
instrptr = instruction_pointer(regs); instrptr = instruction_pointer(regs);
if (compat_thumb_mode(regs)) { if (compat_thumb_mode(regs)) {
__le16 __user *ptr = (__le16 __user *)(instrptr & ~1); __le16 __user *ptr = (__le16 __user *)(instrptr & ~1);
u16 tinstr, tinst2;
fault = alignment_get_thumb(regs, ptr, &tinstr); if (alignment_get_thumb(regs, ptr, &tinstr))
if (!fault) { return 1;
if (IS_T32(tinstr)) {
/* Thumb-2 32-bit */ if (IS_T32(tinstr)) { /* Thumb-2 32-bit */
u16 tinst2; if (alignment_get_thumb(regs, ptr + 1, &tinst2))
fault = alignment_get_thumb(regs, ptr + 1, &tinst2); return 1;
instr = ((u32)tinstr << 16) | tinst2; instr = ((u32)tinstr << 16) | tinst2;
thumb2_32b = 1; thumb2_32b = 1;
} else { } else {
isize = 2; isize = 2;
instr = thumb2arm(tinstr); instr = thumb2arm(tinstr);
}
} }
} else { } else {
fault = alignment_get_arm(regs, (__le32 __user *)instrptr, &instr); if (alignment_get_arm(regs, (__le32 __user *)instrptr, &instr))
return 1;
} }
if (fault)
return 1;
switch (CODING_BITS(instr)) { switch (CODING_BITS(instr)) {
case 0x00000000: /* 3.13.4 load/store instruction extensions */ case 0x00000000: /* 3.13.4 load/store instruction extensions */
if (LDSTHD_I_BIT(instr)) if (LDSTHD_I_BIT(instr))

View File

@ -66,7 +66,7 @@
.long .Lefi_header_end - .L_head // SizeOfHeaders .long .Lefi_header_end - .L_head // SizeOfHeaders
.long 0 // CheckSum .long 0 // CheckSum
.short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem .short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem
.short 0 // DllCharacteristics .short IMAGE_DLL_CHARACTERISTICS_NX_COMPAT // DllCharacteristics
.quad 0 // SizeOfStackReserve .quad 0 // SizeOfStackReserve
.quad 0 // SizeOfStackCommit .quad 0 // SizeOfStackCommit
.quad 0 // SizeOfHeapReserve .quad 0 // SizeOfHeapReserve

View File

@ -220,6 +220,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
case KVM_CAP_VCPU_ATTRIBUTES: case KVM_CAP_VCPU_ATTRIBUTES:
case KVM_CAP_PTP_KVM: case KVM_CAP_PTP_KVM:
case KVM_CAP_ARM_SYSTEM_SUSPEND: case KVM_CAP_ARM_SYSTEM_SUSPEND:
case KVM_CAP_IRQFD_RESAMPLE:
r = 1; r = 1;
break; break;
case KVM_CAP_SET_GUEST_DEBUG2: case KVM_CAP_SET_GUEST_DEBUG2:

View File

@ -666,14 +666,33 @@ static int get_user_mapping_size(struct kvm *kvm, u64 addr)
CONFIG_PGTABLE_LEVELS), CONFIG_PGTABLE_LEVELS),
.mm_ops = &kvm_user_mm_ops, .mm_ops = &kvm_user_mm_ops,
}; };
unsigned long flags;
kvm_pte_t pte = 0; /* Keep GCC quiet... */ kvm_pte_t pte = 0; /* Keep GCC quiet... */
u32 level = ~0; u32 level = ~0;
int ret; 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); ret = kvm_pgtable_get_leaf(&pgt, addr, &pte, &level);
VM_BUG_ON(ret); local_irq_restore(flags);
VM_BUG_ON(level >= KVM_PGTABLE_MAX_LEVELS);
VM_BUG_ON(!(pte & PTE_VALID)); 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)); 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. * Returns the size of the mapping.
*/ */
static unsigned long static long
transparent_hugepage_adjust(struct kvm *kvm, struct kvm_memory_slot *memslot, transparent_hugepage_adjust(struct kvm *kvm, struct kvm_memory_slot *memslot,
unsigned long hva, kvm_pfn_t *pfnp, unsigned long hva, kvm_pfn_t *pfnp,
phys_addr_t *ipap) 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 * sure that the HVA and IPA are sufficiently aligned and that the
* block map is contained within the memslot. * block map is contained within the memslot.
*/ */
if (fault_supports_stage2_huge_mapping(memslot, hva, PMD_SIZE) && if (fault_supports_stage2_huge_mapping(memslot, hva, PMD_SIZE)) {
get_user_mapping_size(kvm, 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 * The address we faulted on is backed by a transparent huge
* page. However, because we map the compound huge page and * 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; int ret = 0;
bool write_fault, writable, force_pte = false; bool write_fault, writable, force_pte = false;
bool exec_fault; bool exec_fault, mte_allowed;
bool device = false; bool device = false;
unsigned long mmu_seq; unsigned long mmu_seq;
struct kvm *kvm = vcpu->kvm; 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; kvm_pfn_t pfn;
bool logging_active = memslot_is_logging(memslot); bool logging_active = memslot_is_logging(memslot);
unsigned long fault_level = kvm_vcpu_trap_get_fault_level(vcpu); 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; enum kvm_pgtable_prot prot = KVM_PGTABLE_PROT_R;
struct kvm_pgtable *pgt; struct kvm_pgtable *pgt;
@ -1217,6 +1243,20 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
return -EFAULT; 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 * Let's check if we will get back a huge page backed by hugetlbfs, or
* get block mapping for device MMIO region. * 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); fault_ipa &= ~(vma_pagesize - 1);
gfn = fault_ipa >> PAGE_SHIFT; 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, * Read mmu_invalidate_seq so that KVM can detect if the results of
* and so normally don't require allocations from the memcache. The * vma_lookup() or __gfn_to_pfn_memslot() become stale prior to
* only exception to this is when dirty logging is enabled at runtime * acquiring kvm->mmu_lock.
* 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>.
* *
* Besides, __gfn_to_pfn_memslot() instead of gfn_to_pfn_prot() is * Rely on mmap_read_unlock() for an implicit smp_rmb(), which pairs
* used to avoid unnecessary overhead introduced to locate the memory * with the smp_wmb() in kvm_mmu_invalidate_end().
* slot because it's always fixed even @gfn is adjusted for huge pages.
*/ */
smp_rmb(); mmu_seq = vcpu->kvm->mmu_invalidate_seq;
mmap_read_unlock(current->mm);
pfn = __gfn_to_pfn_memslot(memslot, gfn, false, false, NULL, pfn = __gfn_to_pfn_memslot(memslot, gfn, false, false, NULL,
write_fault, &writable, 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, vma_pagesize = transparent_hugepage_adjust(kvm, memslot,
hva, &pfn, hva, &pfn,
&fault_ipa); &fault_ipa);
if (vma_pagesize < 0) {
ret = vma_pagesize;
goto out_unlock;
}
} }
if (fault_status != ESR_ELx_FSC_PERM && !device && kvm_has_mte(kvm)) { if (fault_status != ESR_ELx_FSC_PERM && !device && kvm_has_mte(kvm)) {
/* Check the VMM hasn't introduced a new disallowed VMA */ /* 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); sanitise_mte_tags(kvm, pfn, vma_pagesize);
} else { } else {
ret = -EFAULT; ret = -EFAULT;

View File

@ -538,7 +538,8 @@ void kvm_pmu_handle_pmcr(struct kvm_vcpu *vcpu, u64 val)
if (!kvm_pmu_is_3p5(vcpu)) if (!kvm_pmu_is_3p5(vcpu))
val &= ~ARMV8_PMU_PMCR_LP; 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) { if (val & ARMV8_PMU_PMCR_E) {
kvm_pmu_enable_counter_mask(vcpu, kvm_pmu_enable_counter_mask(vcpu,

View File

@ -856,6 +856,22 @@ static bool pmu_counter_idx_valid(struct kvm_vcpu *vcpu, u64 idx)
return true; 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, static bool access_pmu_evcntr(struct kvm_vcpu *vcpu,
struct sys_reg_params *p, struct sys_reg_params *p,
const struct sys_reg_desc *r) 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 */ /* Macro to expand the PMEVCNTRn_EL0 register */
#define PMU_PMEVCNTR_EL0(n) \ #define PMU_PMEVCNTR_EL0(n) \
{ PMU_SYS_REG(SYS_PMEVCNTRn_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), } .access = access_pmu_evcntr, .reg = (PMEVCNTR0_EL0 + n), }
/* Macro to expand the PMEVTYPERn_EL0 register */ /* 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), { PMU_SYS_REG(SYS_PMCEID1_EL0),
.access = access_pmceid, .reset = NULL }, .access = access_pmceid, .reset = NULL },
{ PMU_SYS_REG(SYS_PMCCNTR_EL0), { 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), { PMU_SYS_REG(SYS_PMXEVTYPER_EL0),
.access = access_pmu_evtyper, .reset = NULL }, .access = access_pmu_evtyper, .reset = NULL },
{ PMU_SYS_REG(SYS_PMXEVCNTR_EL0), { PMU_SYS_REG(SYS_PMXEVCNTR_EL0),

View File

@ -5,6 +5,8 @@
#include <asm/bmips.h> #include <asm/bmips.h>
#include <asm/io.h> #include <asm/io.h>
bool bmips_rac_flush_disable;
void arch_sync_dma_for_cpu_all(void) void arch_sync_dma_for_cpu_all(void)
{ {
void __iomem *cbr = BMIPS_GET_CBR(); void __iomem *cbr = BMIPS_GET_CBR();
@ -15,6 +17,9 @@ void arch_sync_dma_for_cpu_all(void)
boot_cpu_type() != CPU_BMIPS4380) boot_cpu_type() != CPU_BMIPS4380)
return; return;
if (unlikely(bmips_rac_flush_disable))
return;
/* Flush stale data out of the readahead cache */ /* Flush stale data out of the readahead cache */
cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG); cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG);
__raw_writel(cfg | 0x100, cbr + BMIPS_RAC_CONFIG); __raw_writel(cfg | 0x100, cbr + BMIPS_RAC_CONFIG);

View File

@ -35,6 +35,8 @@
#define REG_BCM6328_OTP ((void __iomem *)CKSEG1ADDR(0x1000062c)) #define REG_BCM6328_OTP ((void __iomem *)CKSEG1ADDR(0x1000062c))
#define BCM6328_TP1_DISABLED BIT(9) #define BCM6328_TP1_DISABLED BIT(9)
extern bool bmips_rac_flush_disable;
static const unsigned long kbase = VMLINUX_LOAD_ADDRESS & 0xfff00000; static const unsigned long kbase = VMLINUX_LOAD_ADDRESS & 0xfff00000;
struct bmips_quirk { struct bmips_quirk {
@ -104,6 +106,12 @@ static void bcm6358_quirks(void)
* disable SMP for now * disable SMP for now
*/ */
bmips_smp_enabled = 0; 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) static void bcm6368_quirks(void)

View File

@ -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, static inline bool __pte_flags_need_flush(unsigned long oldval,
unsigned long newval) 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. * We do not expect kernel mappings or non-PTEs or not-present PTEs.
*/ */
VM_WARN_ON_ONCE(oldval & _PAGE_PRIVILEGED); VM_WARN_ON_ONCE(!__pte_protnone(oldval) && oldval & _PAGE_PRIVILEGED);
VM_WARN_ON_ONCE(newval & _PAGE_PRIVILEGED); VM_WARN_ON_ONCE(!__pte_protnone(newval) && newval & _PAGE_PRIVILEGED);
VM_WARN_ON_ONCE(!(oldval & _PAGE_PTE)); VM_WARN_ON_ONCE(!(oldval & _PAGE_PTE));
VM_WARN_ON_ONCE(!(newval & _PAGE_PTE)); VM_WARN_ON_ONCE(!(newval & _PAGE_PTE));
VM_WARN_ON_ONCE(!(oldval & _PAGE_PRESENT)); VM_WARN_ON_ONCE(!(oldval & _PAGE_PRESENT));

View File

@ -2,7 +2,7 @@
#ifndef __ASM_KASAN_H #ifndef __ASM_KASAN_H
#define __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_KASAN(fn) _GLOBAL(__##fn)
#define _GLOBAL_TOC_KASAN(fn) _GLOBAL_TOC(__##fn) #define _GLOBAL_TOC_KASAN(fn) _GLOBAL_TOC(__##fn)
#define EXPORT_SYMBOL_KASAN(fn) EXPORT_SYMBOL(__##fn) #define EXPORT_SYMBOL_KASAN(fn) EXPORT_SYMBOL(__##fn)

View File

@ -30,11 +30,17 @@ extern int memcmp(const void *,const void *,__kernel_size_t);
extern void * memchr(const void *,int,__kernel_size_t); extern void * memchr(const void *,int,__kernel_size_t);
void memcpy_flushcache(void *dest, const void *src, size_t size); 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 *__memset(void *s, int c, __kernel_size_t count);
void *__memcpy(void *to, const void *from, __kernel_size_t n); void *__memcpy(void *to, const void *from, __kernel_size_t n);
void *__memmove(void *to, const void *from, __kernel_size_t n); void *__memmove(void *to, const void *from, __kernel_size_t n);
#ifndef __SANITIZE_ADDRESS__
#if defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__)
/* /*
* For files that are not instrumented (e.g. mm/slub.c) we * For files that are not instrumented (e.g. mm/slub.c) we
* should use not instrumented version of mem* functions. * 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 #ifndef __NO_FORTIFY
#define __NO_FORTIFY /* FORTIFY_SOURCE uses __builtin_memcpy, etc. */ #define __NO_FORTIFY /* FORTIFY_SOURCE uses __builtin_memcpy, etc. */
#endif #endif
#endif /* !__SANITIZE_ADDRESS__ */
#endif #endif /* CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX */
#endif /* CONFIG_KASAN */
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
#ifndef CONFIG_KASAN #ifndef CONFIG_KASAN

View File

@ -13,8 +13,13 @@
# If you really need to reference something from prom_init.o add # If you really need to reference something from prom_init.o add
# it to the list below: # it to the list below:
grep "^CONFIG_KASAN=y$" ${KCONFIG_CONFIG} >/dev/null has_renamed_memintrinsics()
if [ $? -eq 0 ] {
grep -q "^CONFIG_KASAN=y$" ${KCONFIG_CONFIG} && \
! grep -q "^CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX=y" ${KCONFIG_CONFIG}
}
if has_renamed_memintrinsics
then then
MEM_FUNCS="__memcpy __memset" MEM_FUNCS="__memcpy __memset"
else else

View File

@ -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, static int ppr_get(struct task_struct *target, const struct user_regset *regset,
struct membuf to) struct membuf to)
{ {
if (!target->thread.regs)
return -EINVAL;
return membuf_write(&to, &target->thread.regs->ppr, sizeof(u64)); 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, unsigned int pos, unsigned int count, const void *kbuf,
const void __user *ubuf) const void __user *ubuf)
{ {
if (!target->thread.regs)
return -EINVAL;
return user_regset_copyin(&pos, &count, &kbuf, &ubuf, return user_regset_copyin(&pos, &count, &kbuf, &ubuf,
&target->thread.regs->ppr, 0, sizeof(u64)); &target->thread.regs->ppr, 0, sizeof(u64));
} }

View File

@ -576,6 +576,12 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
break; break;
#endif #endif
#ifdef CONFIG_HAVE_KVM_IRQFD
case KVM_CAP_IRQFD_RESAMPLE:
r = !xive_enabled();
break;
#endif
case KVM_CAP_PPC_ALLOC_HTAB: case KVM_CAP_PPC_ALLOC_HTAB:
r = hv_enabled; r = hv_enabled;
break; break;

View File

@ -856,6 +856,13 @@ int pseries_vas_dlpar_cpu(void)
{ {
int new_nr_creds, rc; 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, rc = h_query_vas_capabilities(H_QUERY_VAS_CAPABILITIES,
vascaps[VAS_GZIP_DEF_FEAT_TYPE].feat, vascaps[VAS_GZIP_DEF_FEAT_TYPE].feat,
(u64)virt_to_phys(&hv_cop_caps)); (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 * Linux supports user space COPY/PASTE only with Radix
*/ */
if (!radix_enabled()) { if (!radix_enabled()) {
copypaste_feat = false;
pr_err("API is supported only with radix page tables\n"); pr_err("API is supported only with radix page tables\n");
return -ENOTSUPP; return -ENOTSUPP;
} }

View File

@ -126,6 +126,7 @@ config RISCV
select OF_IRQ select OF_IRQ
select PCI_DOMAINS_GENERIC if PCI select PCI_DOMAINS_GENERIC if PCI
select PCI_MSI if PCI select PCI_MSI if PCI
select RISCV_ALTERNATIVE if !XIP_KERNEL
select RISCV_INTC select RISCV_INTC
select RISCV_TIMER if RISCV_SBI select RISCV_TIMER if RISCV_SBI
select SIFIVE_PLIC select SIFIVE_PLIC
@ -401,9 +402,8 @@ config RISCV_ISA_C
config RISCV_ISA_SVPBMT config RISCV_ISA_SVPBMT
bool "SVPBMT extension support" bool "SVPBMT extension support"
depends on 64BIT && MMU depends on 64BIT && MMU
depends on !XIP_KERNEL depends on RISCV_ALTERNATIVE
default y default y
select RISCV_ALTERNATIVE
help help
Adds support to dynamically detect the presence of the SVPBMT Adds support to dynamically detect the presence of the SVPBMT
ISA-extension (Supervisor-mode: page-based memory types) and ISA-extension (Supervisor-mode: page-based memory types) and
@ -428,8 +428,8 @@ config TOOLCHAIN_HAS_ZBB
config RISCV_ISA_ZBB config RISCV_ISA_ZBB
bool "Zbb extension support for bit manipulation instructions" bool "Zbb extension support for bit manipulation instructions"
depends on TOOLCHAIN_HAS_ZBB depends on TOOLCHAIN_HAS_ZBB
depends on !XIP_KERNEL && MMU depends on MMU
select RISCV_ALTERNATIVE depends on RISCV_ALTERNATIVE
default y default y
help help
Adds support to dynamically detect the presence of the ZBB Adds support to dynamically detect the presence of the ZBB
@ -443,9 +443,9 @@ config RISCV_ISA_ZBB
config RISCV_ISA_ZICBOM config RISCV_ISA_ZICBOM
bool "Zicbom extension support for non-coherent DMA operation" bool "Zicbom extension support for non-coherent DMA operation"
depends on !XIP_KERNEL && MMU depends on MMU
depends on RISCV_ALTERNATIVE
default y default y
select RISCV_ALTERNATIVE
select RISCV_DMA_NONCOHERENT select RISCV_DMA_NONCOHERENT
help help
Adds support to dynamically detect the presence of the ZICBOM 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 !32BIT || $(cc-option,-mabi=ilp32 -march=rv32ima_zihintpause)
depends on LLD_VERSION >= 150000 || LD_VERSION >= 23600 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 config FPU
bool "FPU support" bool "FPU support"
default y default y

View File

@ -2,8 +2,7 @@ menu "CPU errata selection"
config ERRATA_SIFIVE config ERRATA_SIFIVE
bool "SiFive errata" bool "SiFive errata"
depends on !XIP_KERNEL depends on RISCV_ALTERNATIVE
select RISCV_ALTERNATIVE
help help
All SiFive errata Kconfig depend on this Kconfig. Disabling All SiFive errata Kconfig depend on this Kconfig. Disabling
this Kconfig will disable all SiFive errata. Please say "Y" this Kconfig will disable all SiFive errata. Please say "Y"
@ -35,8 +34,7 @@ config ERRATA_SIFIVE_CIP_1200
config ERRATA_THEAD config ERRATA_THEAD
bool "T-HEAD errata" bool "T-HEAD errata"
depends on !XIP_KERNEL depends on RISCV_ALTERNATIVE
select RISCV_ALTERNATIVE
help help
All T-HEAD errata Kconfig depend on this Kconfig. Disabling All T-HEAD errata Kconfig depend on this Kconfig. Disabling
this Kconfig will disable all T-HEAD errata. Please say "Y" this Kconfig will disable all T-HEAD errata. Please say "Y"

View File

@ -57,10 +57,12 @@ riscv-march-$(CONFIG_ARCH_RV64I) := rv64ima
riscv-march-$(CONFIG_FPU) := $(riscv-march-y)fd riscv-march-$(CONFIG_FPU) := $(riscv-march-y)fd
riscv-march-$(CONFIG_RISCV_ISA_C) := $(riscv-march-y)c riscv-march-$(CONFIG_RISCV_ISA_C) := $(riscv-march-y)c
# Newer binutils versions default to ISA spec version 20191213 which moves some ifdef CONFIG_TOOLCHAIN_NEEDS_OLD_ISA_SPEC
# instructions from the I extension to the Zicsr and Zifencei extensions. KBUILD_CFLAGS += -Wa,-misa-spec=2.2
toolchain-need-zicsr-zifencei := $(call cc-option-yn, -march=$(riscv-march-y)_zicsr_zifencei) KBUILD_AFLAGS += -Wa,-misa-spec=2.2
riscv-march-$(toolchain-need-zicsr-zifencei) := $(riscv-march-y)_zicsr_zifencei else
riscv-march-$(CONFIG_TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI) := $(riscv-march-y)_zicsr_zifencei
endif
# Check if the toolchain supports Zihintpause extension # Check if the toolchain supports Zihintpause extension
riscv-march-$(CONFIG_TOOLCHAIN_HAS_ZIHINTPAUSE) := $(riscv-march-y)_zihintpause riscv-march-$(CONFIG_TOOLCHAIN_HAS_ZIHINTPAUSE) := $(riscv-march-y)_zihintpause

View File

@ -57,18 +57,31 @@ struct riscv_isa_ext_data {
unsigned int isa_ext_id; 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 static __always_inline bool
riscv_has_extension_likely(const unsigned long ext) riscv_has_extension_likely(const unsigned long ext)
{ {
compiletime_assert(ext < RISCV_ISA_EXT_MAX, compiletime_assert(ext < RISCV_ISA_EXT_MAX,
"ext must be < RISCV_ISA_EXT_MAX"); "ext must be < RISCV_ISA_EXT_MAX");
asm_volatile_goto( if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE)) {
ALTERNATIVE("j %l[l_no]", "nop", 0, %[ext], 1) asm_volatile_goto(
: ALTERNATIVE("j %l[l_no]", "nop", 0, %[ext], 1)
: [ext] "i" (ext) :
: : [ext] "i" (ext)
: l_no); :
: l_no);
} else {
if (!__riscv_isa_extension_available(NULL, ext))
goto l_no;
}
return true; return true;
l_no: l_no:
@ -81,26 +94,23 @@ riscv_has_extension_unlikely(const unsigned long ext)
compiletime_assert(ext < RISCV_ISA_EXT_MAX, compiletime_assert(ext < RISCV_ISA_EXT_MAX,
"ext must be < RISCV_ISA_EXT_MAX"); "ext must be < RISCV_ISA_EXT_MAX");
asm_volatile_goto( if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE)) {
ALTERNATIVE("nop", "j %l[l_yes]", 0, %[ext], 1) asm_volatile_goto(
: ALTERNATIVE("nop", "j %l[l_yes]", 0, %[ext], 1)
: [ext] "i" (ext) :
: : [ext] "i" (ext)
: l_yes); :
: l_yes);
} else {
if (__riscv_isa_extension_available(NULL, ext))
goto l_yes;
}
return false; return false;
l_yes: l_yes:
return true; 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
#endif /* _ASM_RISCV_HWCAP_H */ #endif /* _ASM_RISCV_HWCAP_H */

View File

@ -12,6 +12,8 @@
#include <asm/errata_list.h> #include <asm/errata_list.h>
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
extern unsigned long asid_mask;
static inline void local_flush_tlb_all(void) static inline void local_flush_tlb_all(void)
{ {
__asm__ __volatile__ ("sfence.vma" : : : "memory"); __asm__ __volatile__ ("sfence.vma" : : : "memory");

View File

@ -147,10 +147,8 @@ static void kvm_riscv_vcpu_timer_blocking(struct kvm_vcpu *vcpu)
return; return;
delta_ns = kvm_riscv_delta_cycles2ns(t->next_cycles, gt, t); delta_ns = kvm_riscv_delta_cycles2ns(t->next_cycles, gt, t);
if (delta_ns) { hrtimer_start(&t->hrt, ktime_set(0, delta_ns), HRTIMER_MODE_REL);
hrtimer_start(&t->hrt, ktime_set(0, delta_ns), HRTIMER_MODE_REL); t->next_set = true;
t->next_set = true;
}
} }
static void kvm_riscv_vcpu_timer_unblocking(struct kvm_vcpu *vcpu) static void kvm_riscv_vcpu_timer_unblocking(struct kvm_vcpu *vcpu)

View File

@ -22,7 +22,7 @@ DEFINE_STATIC_KEY_FALSE(use_asid_allocator);
static unsigned long asid_bits; static unsigned long asid_bits;
static unsigned long num_asids; static unsigned long num_asids;
static unsigned long asid_mask; unsigned long asid_mask;
static atomic_long_t current_version; static atomic_long_t current_version;

View File

@ -42,7 +42,7 @@ static void __sbi_tlb_flush_range(struct mm_struct *mm, unsigned long start,
/* check if the tlbflush needs to be sent to other CPUs */ /* check if the tlbflush needs to be sent to other CPUs */
broadcast = cpumask_any_but(cmask, cpuid) < nr_cpu_ids; broadcast = cpumask_any_but(cmask, cpuid) < nr_cpu_ids;
if (static_branch_unlikely(&use_asid_allocator)) { if (static_branch_unlikely(&use_asid_allocator)) {
unsigned long asid = atomic_long_read(&mm->context.id); unsigned long asid = atomic_long_read(&mm->context.id) & asid_mask;
if (broadcast) { if (broadcast) {
sbi_remote_sfence_vma_asid(cmask, start, size, asid); sbi_remote_sfence_vma_asid(cmask, start, size, asid);

View File

@ -162,7 +162,7 @@ vdso_prepare: prepare0
ifdef CONFIG_EXPOLINE_EXTERN ifdef CONFIG_EXPOLINE_EXTERN
modules_prepare: expoline_prepare modules_prepare: expoline_prepare
expoline_prepare: expoline_prepare: scripts
$(Q)$(MAKE) $(build)=arch/s390/lib/expoline arch/s390/lib/expoline/expoline.o $(Q)$(MAKE) $(build)=arch/s390/lib/expoline arch/s390/lib/expoline/expoline.o
endif endif
endif endif

View File

@ -474,9 +474,7 @@ long arch_ptrace(struct task_struct *child, long request,
} }
return 0; return 0;
case PTRACE_GET_LAST_BREAK: case PTRACE_GET_LAST_BREAK:
put_user(child->thread.last_break, return put_user(child->thread.last_break, (unsigned long __user *)data);
(unsigned long __user *) data);
return 0;
case PTRACE_ENABLE_TE: case PTRACE_ENABLE_TE:
if (!MACHINE_HAS_TE) if (!MACHINE_HAS_TE)
return -EIO; return -EIO;
@ -824,9 +822,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
} }
return 0; return 0;
case PTRACE_GET_LAST_BREAK: case PTRACE_GET_LAST_BREAK:
put_user(child->thread.last_break, return put_user(child->thread.last_break, (unsigned int __user *)data);
(unsigned int __user *) data);
return 0;
} }
return compat_ptrace_request(child, request, addr, data); return compat_ptrace_request(child, request, addr, data);
} }

View File

@ -271,10 +271,18 @@ static int handle_prog(struct kvm_vcpu *vcpu)
* handle_external_interrupt - used for external interruption interceptions * handle_external_interrupt - used for external interruption interceptions
* @vcpu: virtual cpu * @vcpu: virtual cpu
* *
* This interception only occurs if the CPUSTAT_EXT_INT bit was set, or if * This interception occurs if:
* the new PSW does not have external interrupts disabled. In the first case, * - the CPUSTAT_EXT_INT bit was already set when the external interrupt
* we've got to deliver the interrupt manually, and in the second case, we * occurred. In this case, the interrupt needs to be injected manually to
* drop to userspace to handle the situation there. * preserve interrupt priority.
* - the external new PSW has external interrupts enabled, which will cause an
* interruption loop. We drop to userspace in this case.
*
* The latter case can be detected by inspecting the external mask bit in the
* external new psw.
*
* Under PV, only the latter case can occur, since interrupt priorities are
* handled in the ultravisor.
*/ */
static int handle_external_interrupt(struct kvm_vcpu *vcpu) static int handle_external_interrupt(struct kvm_vcpu *vcpu)
{ {
@ -285,10 +293,18 @@ static int handle_external_interrupt(struct kvm_vcpu *vcpu)
vcpu->stat.exit_external_interrupt++; vcpu->stat.exit_external_interrupt++;
rc = read_guest_lc(vcpu, __LC_EXT_NEW_PSW, &newpsw, sizeof(psw_t)); if (kvm_s390_pv_cpu_is_protected(vcpu)) {
if (rc) newpsw = vcpu->arch.sie_block->gpsw;
return rc; } else {
/* We can not handle clock comparator or timer interrupt with bad PSW */ rc = read_guest_lc(vcpu, __LC_EXT_NEW_PSW, &newpsw, sizeof(psw_t));
if (rc)
return rc;
}
/*
* Clock comparator or timer interrupt with external interrupt enabled
* will cause interrupt loop. Drop to userspace.
*/
if ((eic == EXT_IRQ_CLK_COMP || eic == EXT_IRQ_CPU_TIMER) && if ((eic == EXT_IRQ_CLK_COMP || eic == EXT_IRQ_CPU_TIMER) &&
(newpsw.mask & PSW_MASK_EXT)) (newpsw.mask & PSW_MASK_EXT))
return -EOPNOTSUPP; return -EOPNOTSUPP;

View File

@ -573,6 +573,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
case KVM_CAP_S390_VCPU_RESETS: case KVM_CAP_S390_VCPU_RESETS:
case KVM_CAP_SET_GUEST_DEBUG: case KVM_CAP_SET_GUEST_DEBUG:
case KVM_CAP_S390_DIAG318: case KVM_CAP_S390_DIAG318:
case KVM_CAP_IRQFD_RESAMPLE:
r = 1; r = 1;
break; break;
case KVM_CAP_SET_GUEST_DEBUG2: case KVM_CAP_SET_GUEST_DEBUG2:

View File

@ -172,7 +172,7 @@ unsigned long __clear_user(void __user *to, unsigned long size)
"4: slgr %0,%0\n" "4: slgr %0,%0\n"
"5:\n" "5:\n"
EX_TABLE(0b,2b) EX_TABLE(6b,2b) EX_TABLE(3b,5b) EX_TABLE(7b,5b) EX_TABLE(0b,2b) EX_TABLE(6b,2b) EX_TABLE(3b,5b) EX_TABLE(7b,5b)
: "+a" (size), "+a" (to), "+a" (tmp1), "=a" (tmp2) : "+&a" (size), "+&a" (to), "+a" (tmp1), "=&a" (tmp2)
: "a" (empty_zero_page), [spec] "d" (spec.val) : "a" (empty_zero_page), [spec] "d" (spec.val)
: "cc", "memory", "0"); : "cc", "memory", "0");
return size; return size;

View File

@ -923,6 +923,7 @@ static int amd_pmu_v2_handle_irq(struct pt_regs *regs)
/* Event overflow */ /* Event overflow */
handled++; handled++;
status &= ~mask;
perf_sample_data_init(&data, 0, hwc->last_period); perf_sample_data_init(&data, 0, hwc->last_period);
if (!x86_perf_event_set_period(event)) if (!x86_perf_event_set_period(event))
@ -933,8 +934,6 @@ static int amd_pmu_v2_handle_irq(struct pt_regs *regs)
if (perf_event_overflow(event, &data, regs)) if (perf_event_overflow(event, &data, regs))
x86_pmu_stop(event, 0); x86_pmu_stop(event, 0);
status &= ~mask;
} }
/* /*

View File

@ -125,6 +125,8 @@
#define INTEL_FAM6_LUNARLAKE_M 0xBD #define INTEL_FAM6_LUNARLAKE_M 0xBD
#define INTEL_FAM6_ARROWLAKE 0xC6
/* "Small Core" Processors (Atom/E-Core) */ /* "Small Core" Processors (Atom/E-Core) */
#define INTEL_FAM6_ATOM_BONNELL 0x1C /* Diamondville, Pineview */ #define INTEL_FAM6_ATOM_BONNELL 0x1C /* Diamondville, Pineview */

View File

@ -146,7 +146,11 @@ static int __init acpi_parse_madt(struct acpi_table_header *table)
pr_debug("Local APIC address 0x%08x\n", madt->address); pr_debug("Local APIC address 0x%08x\n", madt->address);
} }
if (madt->header.revision >= 5)
/* ACPI 6.3 and newer support the online capable bit. */
if (acpi_gbl_FADT.header.revision > 6 ||
(acpi_gbl_FADT.header.revision == 6 &&
acpi_gbl_FADT.minor_revision >= 3))
acpi_support_online_capable = true; acpi_support_online_capable = true;
default_acpi_madt_oem_check(madt->header.oem_id, default_acpi_madt_oem_check(madt->header.oem_id,
@ -193,7 +197,8 @@ static bool __init acpi_is_processor_usable(u32 lapic_flags)
if (lapic_flags & ACPI_MADT_ENABLED) if (lapic_flags & ACPI_MADT_ENABLED)
return true; return true;
if (acpi_support_online_capable && (lapic_flags & ACPI_MADT_ONLINE_CAPABLE)) if (!acpi_support_online_capable ||
(lapic_flags & ACPI_MADT_ONLINE_CAPABLE))
return true; return true;
return false; return false;

View File

@ -358,12 +358,16 @@ static void __init ms_hyperv_init_platform(void)
* To mirror what Windows does we should extract CPU management * To mirror what Windows does we should extract CPU management
* features and use the ReservedIdentityBit to detect if Linux is the * features and use the ReservedIdentityBit to detect if Linux is the
* root partition. But that requires negotiating CPU management * root partition. But that requires negotiating CPU management
* interface (a process to be finalized). * interface (a process to be finalized). For now, use the privilege
* flag as the indicator for running as root.
* *
* For now, use the privilege flag as the indicator for running as * Hyper-V should never specify running as root and as a Confidential
* root. * VM. But to protect against a compromised/malicious Hyper-V trying
* to exploit root behavior to expose Confidential VM memory, ignore
* the root partition setting if also a Confidential VM.
*/ */
if (cpuid_ebx(HYPERV_CPUID_FEATURES) & HV_CPU_MANAGEMENT) { if ((ms_hyperv.priv_high & HV_CPU_MANAGEMENT) &&
!(ms_hyperv.priv_high & HV_ISOLATION)) {
hv_root_partition = true; hv_root_partition = true;
pr_info("Hyper-V: running as root partition\n"); pr_info("Hyper-V: running as root partition\n");
} }

View File

@ -1118,21 +1118,20 @@ void __copy_xstate_to_uabi_buf(struct membuf to, struct fpstate *fpstate,
zerofrom = offsetof(struct xregs_state, extended_state_area); zerofrom = offsetof(struct xregs_state, extended_state_area);
/* /*
* The ptrace buffer is in non-compacted XSAVE format. In * This 'mask' indicates which states to copy from fpstate.
* non-compacted format disabled features still occupy state space, * Those extended states that are not present in fpstate are
* but there is no state to copy from in the compacted * either disabled or initialized:
* init_fpstate. The gap tracking will zero these states. *
* In non-compacted format, disabled features still occupy
* state space but there is no state to copy from in the
* compacted init_fpstate. The gap tracking will zero these
* states.
*
* The extended features have an all zeroes init state. Thus,
* remove them from 'mask' to zero those features in the user
* buffer instead of retrieving them from init_fpstate.
*/ */
mask = fpstate->user_xfeatures; mask = header.xfeatures;
/*
* Dynamic features are not present in init_fpstate. When they are
* in an all zeros init state, remove those from 'mask' to zero
* those features in the user buffer instead of retrieving them
* from init_fpstate.
*/
if (fpu_state_size_dynamic())
mask &= (header.xfeatures | xinit->header.xcomp_bv);
for_each_extended_xfeature(i, mask) { for_each_extended_xfeature(i, mask) {
/* /*
@ -1151,9 +1150,8 @@ void __copy_xstate_to_uabi_buf(struct membuf to, struct fpstate *fpstate,
pkru.pkru = pkru_val; pkru.pkru = pkru_val;
membuf_write(&to, &pkru, sizeof(pkru)); membuf_write(&to, &pkru, sizeof(pkru));
} else { } else {
copy_feature(header.xfeatures & BIT_ULL(i), &to, membuf_write(&to,
__raw_xsave_addr(xsave, i), __raw_xsave_addr(xsave, i),
__raw_xsave_addr(xinit, i),
xstate_sizes[i]); xstate_sizes[i]);
} }
/* /*

View File

@ -368,9 +368,39 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val)
mask_after = e->fields.mask; mask_after = e->fields.mask;
if (mask_before != mask_after) if (mask_before != mask_after)
kvm_fire_mask_notifiers(ioapic->kvm, KVM_IRQCHIP_IOAPIC, index, mask_after); kvm_fire_mask_notifiers(ioapic->kvm, KVM_IRQCHIP_IOAPIC, index, mask_after);
if (e->fields.trig_mode == IOAPIC_LEVEL_TRIG if (e->fields.trig_mode == IOAPIC_LEVEL_TRIG &&
&& ioapic->irr & (1 << index)) ioapic->irr & (1 << index) && !e->fields.mask && !e->fields.remote_irr) {
ioapic_service(ioapic, index, false); /*
* Pending status in irr may be outdated: the IRQ line may have
* already been deasserted by a device while the IRQ was masked.
* This occurs, for instance, if the interrupt is handled in a
* Linux guest as a oneshot interrupt (IRQF_ONESHOT). In this
* case the guest acknowledges the interrupt to the device in
* its threaded irq handler, i.e. after the EOI but before
* unmasking, so at the time of unmasking the IRQ line is
* already down but our pending irr bit is still set. In such
* cases, injecting this pending interrupt to the guest is
* buggy: the guest will receive an extra unwanted interrupt.
*
* So we need to check here if the IRQ is actually still pending.
* As we are generally not able to probe the IRQ line status
* directly, we do it through irqfd resampler. Namely, we clear
* the pending status and notify the resampler that this interrupt
* is done, without actually injecting it into the guest. If the
* IRQ line is actually already deasserted, we are done. If it is
* still asserted, a new interrupt will be shortly triggered
* through irqfd and injected into the guest.
*
* If, however, it's not possible to resample (no irqfd resampler
* registered for this irq), then unconditionally inject this
* pending interrupt into the guest, so the guest will not miss
* an interrupt, although may get an extra unwanted interrupt.
*/
if (kvm_notify_irqfd_resampler(ioapic->kvm, KVM_IRQCHIP_IOAPIC, index))
ioapic->irr &= ~(1 << index);
else
ioapic_service(ioapic, index, false);
}
if (e->fields.delivery_mode == APIC_DM_FIXED) { if (e->fields.delivery_mode == APIC_DM_FIXED) {
struct kvm_lapic_irq irq; struct kvm_lapic_irq irq;

View File

@ -12,6 +12,11 @@ int hv_remote_flush_tlb_with_range(struct kvm *kvm,
int hv_remote_flush_tlb(struct kvm *kvm); int hv_remote_flush_tlb(struct kvm *kvm);
void hv_track_root_tdp(struct kvm_vcpu *vcpu, hpa_t root_tdp); void hv_track_root_tdp(struct kvm_vcpu *vcpu, hpa_t root_tdp);
#else /* !CONFIG_HYPERV */ #else /* !CONFIG_HYPERV */
static inline int hv_remote_flush_tlb(struct kvm *kvm)
{
return -EOPNOTSUPP;
}
static inline void hv_track_root_tdp(struct kvm_vcpu *vcpu, hpa_t root_tdp) static inline void hv_track_root_tdp(struct kvm_vcpu *vcpu, hpa_t root_tdp)
{ {
} }

View File

@ -3729,7 +3729,7 @@ static void svm_enable_nmi_window(struct kvm_vcpu *vcpu)
svm->vmcb->save.rflags |= (X86_EFLAGS_TF | X86_EFLAGS_RF); svm->vmcb->save.rflags |= (X86_EFLAGS_TF | X86_EFLAGS_RF);
} }
static void svm_flush_tlb_current(struct kvm_vcpu *vcpu) static void svm_flush_tlb_asid(struct kvm_vcpu *vcpu)
{ {
struct vcpu_svm *svm = to_svm(vcpu); struct vcpu_svm *svm = to_svm(vcpu);
@ -3753,6 +3753,37 @@ static void svm_flush_tlb_current(struct kvm_vcpu *vcpu)
svm->current_vmcb->asid_generation--; svm->current_vmcb->asid_generation--;
} }
static void svm_flush_tlb_current(struct kvm_vcpu *vcpu)
{
hpa_t root_tdp = vcpu->arch.mmu->root.hpa;
/*
* When running on Hyper-V with EnlightenedNptTlb enabled, explicitly
* flush the NPT mappings via hypercall as flushing the ASID only
* affects virtual to physical mappings, it does not invalidate guest
* physical to host physical mappings.
*/
if (svm_hv_is_enlightened_tlb_enabled(vcpu) && VALID_PAGE(root_tdp))
hyperv_flush_guest_mapping(root_tdp);
svm_flush_tlb_asid(vcpu);
}
static void svm_flush_tlb_all(struct kvm_vcpu *vcpu)
{
/*
* When running on Hyper-V with EnlightenedNptTlb enabled, remote TLB
* flushes should be routed to hv_remote_flush_tlb() without requesting
* a "regular" remote flush. Reaching this point means either there's
* a KVM bug or a prior hv_remote_flush_tlb() call failed, both of
* which might be fatal to the guest. Yell, but try to recover.
*/
if (WARN_ON_ONCE(svm_hv_is_enlightened_tlb_enabled(vcpu)))
hv_remote_flush_tlb(vcpu->kvm);
svm_flush_tlb_asid(vcpu);
}
static void svm_flush_tlb_gva(struct kvm_vcpu *vcpu, gva_t gva) static void svm_flush_tlb_gva(struct kvm_vcpu *vcpu, gva_t gva)
{ {
struct vcpu_svm *svm = to_svm(vcpu); struct vcpu_svm *svm = to_svm(vcpu);
@ -4745,10 +4776,10 @@ static struct kvm_x86_ops svm_x86_ops __initdata = {
.set_rflags = svm_set_rflags, .set_rflags = svm_set_rflags,
.get_if_flag = svm_get_if_flag, .get_if_flag = svm_get_if_flag,
.flush_tlb_all = svm_flush_tlb_current, .flush_tlb_all = svm_flush_tlb_all,
.flush_tlb_current = svm_flush_tlb_current, .flush_tlb_current = svm_flush_tlb_current,
.flush_tlb_gva = svm_flush_tlb_gva, .flush_tlb_gva = svm_flush_tlb_gva,
.flush_tlb_guest = svm_flush_tlb_current, .flush_tlb_guest = svm_flush_tlb_asid,
.vcpu_pre_run = svm_vcpu_pre_run, .vcpu_pre_run = svm_vcpu_pre_run,
.vcpu_run = svm_vcpu_run, .vcpu_run = svm_vcpu_run,

View File

@ -6,6 +6,8 @@
#ifndef __ARCH_X86_KVM_SVM_ONHYPERV_H__ #ifndef __ARCH_X86_KVM_SVM_ONHYPERV_H__
#define __ARCH_X86_KVM_SVM_ONHYPERV_H__ #define __ARCH_X86_KVM_SVM_ONHYPERV_H__
#include <asm/mshyperv.h>
#if IS_ENABLED(CONFIG_HYPERV) #if IS_ENABLED(CONFIG_HYPERV)
#include "kvm_onhyperv.h" #include "kvm_onhyperv.h"
@ -15,6 +17,14 @@ static struct kvm_x86_ops svm_x86_ops;
int svm_hv_enable_l2_tlb_flush(struct kvm_vcpu *vcpu); int svm_hv_enable_l2_tlb_flush(struct kvm_vcpu *vcpu);
static inline bool svm_hv_is_enlightened_tlb_enabled(struct kvm_vcpu *vcpu)
{
struct hv_vmcb_enlightenments *hve = &to_svm(vcpu)->vmcb->control.hv_enlightenments;
return ms_hyperv.nested_features & HV_X64_NESTED_ENLIGHTENED_TLB &&
!!hve->hv_enlightenments_control.enlightened_npt_tlb;
}
static inline void svm_hv_init_vmcb(struct vmcb *vmcb) static inline void svm_hv_init_vmcb(struct vmcb *vmcb)
{ {
struct hv_vmcb_enlightenments *hve = &vmcb->control.hv_enlightenments; struct hv_vmcb_enlightenments *hve = &vmcb->control.hv_enlightenments;
@ -80,6 +90,11 @@ static inline void svm_hv_update_vp_id(struct vmcb *vmcb, struct kvm_vcpu *vcpu)
} }
#else #else
static inline bool svm_hv_is_enlightened_tlb_enabled(struct kvm_vcpu *vcpu)
{
return false;
}
static inline void svm_hv_init_vmcb(struct vmcb *vmcb) static inline void svm_hv_init_vmcb(struct vmcb *vmcb)
{ {
} }

View File

@ -3868,7 +3868,12 @@ static void nested_vmx_inject_exception_vmexit(struct kvm_vcpu *vcpu)
exit_qual = 0; exit_qual = 0;
} }
if (ex->has_error_code) { /*
* Unlike AMD's Paged Real Mode, which reports an error code on #PF
* VM-Exits even if the CPU is in Real Mode, Intel VMX never sets the
* "has error code" flags on VM-Exit if the CPU is in Real Mode.
*/
if (ex->has_error_code && is_protmode(vcpu)) {
/* /*
* Intel CPUs do not generate error codes with bits 31:16 set, * Intel CPUs do not generate error codes with bits 31:16 set,
* and more importantly VMX disallows setting bits 31:16 in the * and more importantly VMX disallows setting bits 31:16 in the

View File

@ -4432,6 +4432,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
case KVM_CAP_VAPIC: case KVM_CAP_VAPIC:
case KVM_CAP_ENABLE_CAP: case KVM_CAP_ENABLE_CAP:
case KVM_CAP_VM_DISABLE_NX_HUGE_PAGES: case KVM_CAP_VM_DISABLE_NX_HUGE_PAGES:
case KVM_CAP_IRQFD_RESAMPLE:
r = 1; r = 1;
break; break;
case KVM_CAP_EXIT_HYPERCALL: case KVM_CAP_EXIT_HYPERCALL:
@ -8903,6 +8904,8 @@ restart:
} }
if (ctxt->have_exception) { if (ctxt->have_exception) {
WARN_ON_ONCE(vcpu->mmio_needed && !vcpu->mmio_is_write);
vcpu->mmio_needed = false;
r = 1; r = 1;
inject_emulated_exception(vcpu); inject_emulated_exception(vcpu);
} else if (vcpu->arch.pio.count) { } else if (vcpu->arch.pio.count) {
@ -9906,13 +9909,20 @@ int kvm_check_nested_events(struct kvm_vcpu *vcpu)
static void kvm_inject_exception(struct kvm_vcpu *vcpu) static void kvm_inject_exception(struct kvm_vcpu *vcpu)
{ {
/*
* Suppress the error code if the vCPU is in Real Mode, as Real Mode
* exceptions don't report error codes. The presence of an error code
* is carried with the exception and only stripped when the exception
* is injected as intercepted #PF VM-Exits for AMD's Paged Real Mode do
* report an error code despite the CPU being in Real Mode.
*/
vcpu->arch.exception.has_error_code &= is_protmode(vcpu);
trace_kvm_inj_exception(vcpu->arch.exception.vector, trace_kvm_inj_exception(vcpu->arch.exception.vector,
vcpu->arch.exception.has_error_code, vcpu->arch.exception.has_error_code,
vcpu->arch.exception.error_code, vcpu->arch.exception.error_code,
vcpu->arch.exception.injected); vcpu->arch.exception.injected);
if (vcpu->arch.exception.error_code && !is_protmode(vcpu))
vcpu->arch.exception.error_code = false;
static_call(kvm_x86_inject_exception)(vcpu); static_call(kvm_x86_inject_exception)(vcpu);
} }

Some files were not shown because too many files have changed in this diff Show More