mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
Linux 6.19-rc5
-----BEGIN PGP SIGNATURE----- iQFSBAABCgA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAmlkZHIeHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiGaSUH/jsIthYCRnSsVxms HVEEKeSTEWUFH7wpnsTle2fep4HC/LmvxX2T07M5XuhgS7fUafnwonaEbs/NvgsT I0/28Px4ovU69NwFNZ17fOIDdcfIGPzWvcTHK354+PWwKNBciNgSq6AQ+iq1zK4T 2eAUS2CybkMqquIDN1w2Y9dLXHovY6flXAzZZQutd1sqGtIlZl/R5W4qxbtuvS1n d4Jq40erS5YGganxGcHvC6JFMuh+vEARQjZSOq8J4Cy3z6SvkJoGrg2q3qU3tFAf /cvVlXwrzxR9XDg+5ZH7c4TlnRWWiz5KDeYNFlqd7Gor3SNTUB8G6WWHkm4JrCZd EzE+MGw= =LUKA -----END PGP SIGNATURE----- Merge tag 'v6.19-rc5' into driver-core-next We need the driver-core fixes in here as well to build on top of. Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
commit
8f799b4e8c
12
.mailmap
12
.mailmap
|
|
@ -127,7 +127,8 @@ Barry Song <baohua@kernel.org> <Baohua.Song@csr.com>
|
|||
Barry Song <baohua@kernel.org> <barry.song@analog.com>
|
||||
Bart Van Assche <bvanassche@acm.org> <bart.vanassche@sandisk.com>
|
||||
Bart Van Assche <bvanassche@acm.org> <bart.vanassche@wdc.com>
|
||||
Bartosz Golaszewski <brgl@bgdev.pl> <bgolaszewski@baylibre.com>
|
||||
Bartosz Golaszewski <brgl@kernel.org> <bartosz.golaszewski@linaro.org>
|
||||
Bartosz Golaszewski <brgl@kernel.org> <bgolaszewski@baylibre.com>
|
||||
Ben Dooks <ben-linux@fluff.org> <ben.dooks@simtec.co.uk>
|
||||
Ben Dooks <ben-linux@fluff.org> <ben.dooks@sifive.com>
|
||||
Ben Gardner <bgardner@wabtec.com>
|
||||
|
|
@ -415,6 +416,7 @@ Juha Yrjola <at solidboot.com>
|
|||
Juha Yrjola <juha.yrjola@nokia.com>
|
||||
Juha Yrjola <juha.yrjola@solidboot.com>
|
||||
Julien Thierry <julien.thierry.kdev@gmail.com> <julien.thierry@arm.com>
|
||||
Justin Iurman <justin.iurman@gmail.com> <justin.iurman@uliege.be>
|
||||
Iskren Chernev <me@iskren.info> <iskren.chernev@gmail.com>
|
||||
Kalle Valo <kvalo@kernel.org> <kvalo@codeaurora.org>
|
||||
Kalle Valo <kvalo@kernel.org> <quic_kvalo@quicinc.com>
|
||||
|
|
@ -471,6 +473,10 @@ Linas Vepstas <linas@austin.ibm.com>
|
|||
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@ascom.ch>
|
||||
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@web.de>
|
||||
Linus Lüssing <linus.luessing@c0d3.blue> <ll@simonwunderlich.de>
|
||||
Linus Walleij <linusw@kernel.org> <linus.walleij@ericsson.com>
|
||||
Linus Walleij <linusw@kernel.org> <linus.walleij@stericsson.com>
|
||||
Linus Walleij <linusw@kernel.org> <linus.walleij@linaro.org>
|
||||
Linus Walleij <linusw@kernel.org> <triad@df.lth.se>
|
||||
<linux-hardening@vger.kernel.org> <kernel-hardening@lists.openwall.com>
|
||||
Li Yang <leoyang.li@nxp.com> <leoli@freescale.com>
|
||||
Li Yang <leoyang.li@nxp.com> <leo@zh-kernel.org>
|
||||
|
|
@ -704,6 +710,8 @@ Sankeerth Billakanti <quic_sbillaka@quicinc.com> <sbillaka@codeaurora.org>
|
|||
Santosh Shilimkar <santosh.shilimkar@oracle.org>
|
||||
Santosh Shilimkar <ssantosh@kernel.org>
|
||||
Sarangdhar Joshi <spjoshi@codeaurora.org>
|
||||
Saravana Kannan <saravanak@kernel.org> <skannan@codeaurora.org>
|
||||
Saravana Kannan <saravanak@kernel.org> <saravanak@google.com>
|
||||
Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Sahitya Tummala <quic_stummala@quicinc.com> <stummala@codeaurora.org>
|
||||
Sathishkumar Muruganandam <quic_murugana@quicinc.com> <murugana@codeaurora.org>
|
||||
|
|
@ -793,6 +801,7 @@ Tanzir Hasan <tanzhasanwork@gmail.com> <tanzirh@google.com>
|
|||
Tejun Heo <htejun@gmail.com>
|
||||
Tomeu Vizoso <tomeu@tomeuvizoso.net> <tomeu.vizoso@collabora.com>
|
||||
Thomas Graf <tgraf@suug.ch>
|
||||
Thomas Gleixner <tglx@kernel.org> <tglx@linutronix.de>
|
||||
Thomas Körper <socketcan@esd.eu> <thomas.koerper@esd.eu>
|
||||
Thomas Pedersen <twp@codeaurora.org>
|
||||
Thorsten Blum <thorsten.blum@linux.dev> <thorsten.blum@toblux.com>
|
||||
|
|
@ -857,7 +866,6 @@ Vladimir Davydov <vdavydov.dev@gmail.com> <vdavydov@parallels.com>
|
|||
Vladimir Davydov <vdavydov.dev@gmail.com> <vdavydov@virtuozzo.com>
|
||||
WangYuli <wangyuli@aosc.io> <wangyl5933@chinaunicom.cn>
|
||||
WangYuli <wangyuli@aosc.io> <wangyuli@deepin.org>
|
||||
WangYuli <wangyuli@aosc.io> <wangyuli@uniontech.com>
|
||||
Weiwen Hu <huweiwen@linux.alibaba.com> <sehuww@mail.scut.edu.cn>
|
||||
WeiXiong Liao <gmpy.liaowx@gmail.com> <liaoweixiong@allwinnertech.com>
|
||||
Wen Gong <quic_wgong@quicinc.com> <wgong@codeaurora.org>
|
||||
|
|
|
|||
2
CREDITS
2
CREDITS
|
|
@ -1398,7 +1398,7 @@ D: SRM environment driver (for Alpha systems)
|
|||
P: 1024D/8399E1BB 250D 3BCF 7127 0D8C A444 A961 1DBD 5E75 8399 E1BB
|
||||
|
||||
N: Thomas Gleixner
|
||||
E: tglx@linutronix.de
|
||||
E: tglx@kernel.org
|
||||
D: NAND flash hardware support, JFFS2 on NAND flash
|
||||
|
||||
N: Jérôme Glisse
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
What: /sys/kernel/time/aux_clocks/<ID>/enable
|
||||
Date: May 2025
|
||||
Contact: Thomas Gleixner <tglx@linutronix.de>
|
||||
Contact: Thomas Gleixner <tglx@kernel.org>
|
||||
Description:
|
||||
Controls the enablement of auxiliary clock timekeepers.
|
||||
|
|
|
|||
|
|
@ -17,14 +17,14 @@ Date: January 2012
|
|||
contact: Lee Jones <lee@kernel.org>
|
||||
Description:
|
||||
Read-only attribute common to all SoCs. Contains the SoC machine
|
||||
name (e.g. Ux500).
|
||||
name (e.g. DB8500).
|
||||
|
||||
What: /sys/devices/socX/family
|
||||
Date: January 2012
|
||||
contact: Lee Jones <lee@kernel.org>
|
||||
Description:
|
||||
Read-only attribute common to all SoCs. Contains SoC family name
|
||||
(e.g. DB8500).
|
||||
(e.g. ux500).
|
||||
|
||||
On many of ARM based silicon with SMCCC v1.2+ compliant firmware
|
||||
this will contain the JEDEC JEP106 manufacturer’s identification
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ with the generic one and look at this one in parallel for the x86 specifics.
|
|||
Needless to say, code should use the generic functions - this file is *only*
|
||||
here to *document* the inner workings of x86 topology.
|
||||
|
||||
Started by Thomas Gleixner <tglx@linutronix.de> and Borislav Petkov <bp@alien8.de>.
|
||||
Started by Thomas Gleixner <tglx@kernel.org> and Borislav Petkov <bp@alien8.de>.
|
||||
|
||||
The main aim of the topology facilities is to present adequate interfaces to
|
||||
code which needs to know/query/use the structure of the running system wrt
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ CPU hotplug in the Kernel
|
|||
Srivatsa Vaddagiri <vatsa@in.ibm.com>,
|
||||
Ashok Raj <ashok.raj@intel.com>,
|
||||
Joel Schopp <jschopp@austin.ibm.com>,
|
||||
Thomas Gleixner <tglx@linutronix.de>
|
||||
Thomas Gleixner <tglx@kernel.org>
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
|
|
|||
|
|
@ -439,6 +439,6 @@ Credits
|
|||
|
||||
The following people have contributed to this document:
|
||||
|
||||
1. Thomas Gleixner tglx@linutronix.de
|
||||
1. Thomas Gleixner tglx@kernel.org
|
||||
|
||||
2. Ingo Molnar mingo@elte.hu
|
||||
|
|
|
|||
|
|
@ -209,4 +209,4 @@ testing. Thanks a lot.
|
|||
|
||||
The following people have contributed to this document:
|
||||
|
||||
Thomas Gleixner\ tglx@linutronix.de
|
||||
Thomas Gleixner\ tglx@kernel.org
|
||||
|
|
|
|||
|
|
@ -1105,7 +1105,6 @@ properties:
|
|||
- gateworks,imx8mp-gw74xx # i.MX8MP Gateworks Board
|
||||
- gateworks,imx8mp-gw75xx-2x # i.MX8MP Gateworks Board
|
||||
- gateworks,imx8mp-gw82xx-2x # i.MX8MP Gateworks Board
|
||||
- gocontroll,moduline-display # GOcontroll Moduline Display controller
|
||||
- prt,prt8ml # Protonic PRT8ML
|
||||
- skov,imx8mp-skov-basic # SKOV i.MX8MP baseboard without frontplate
|
||||
- skov,imx8mp-skov-revb-hdmi # SKOV i.MX8MP climate control without panel
|
||||
|
|
@ -1164,6 +1163,14 @@ properties:
|
|||
- const: engicam,icore-mx8mp # i.MX8MP Engicam i.Core MX8M Plus SoM
|
||||
- const: fsl,imx8mp
|
||||
|
||||
- description: Ka-Ro TX8P-ML81 SoM based boards
|
||||
items:
|
||||
- enum:
|
||||
- gocontroll,moduline-display
|
||||
- gocontroll,moduline-display-106
|
||||
- const: karo,tx8p-ml81
|
||||
- const: fsl,imx8mp
|
||||
|
||||
- description: Kontron i.MX8MP OSM-S SoM based Boards
|
||||
items:
|
||||
- const: kontron,imx8mp-bl-osm-s # Kontron BL i.MX8MP OSM-S Board
|
||||
|
|
|
|||
|
|
@ -25,6 +25,10 @@ properties:
|
|||
items:
|
||||
- const: pci1de4,1
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description: The PCI Bus-Device-Function address.
|
||||
|
||||
'#interrupt-cells':
|
||||
const: 2
|
||||
description: |
|
||||
|
|
@ -101,6 +105,7 @@ unevaluatedProperties: false
|
|||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#interrupt-cells'
|
||||
- interrupt-controller
|
||||
- pci-ep-bus@1
|
||||
|
|
@ -111,8 +116,9 @@ examples:
|
|||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
rp1@0,0 {
|
||||
dev@0,0 {
|
||||
compatible = "pci1de4,1";
|
||||
reg = <0x10000 0x0 0x0 0x0 0x0>;
|
||||
ranges = <0x01 0x00 0x00000000 0x82010000 0x00 0x00 0x00 0x400000>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ title: Marvell MMP Timer
|
|||
|
||||
maintainers:
|
||||
- Daniel Lezcano <daniel.lezcano@linaro.org>
|
||||
- Thomas Gleixner <tglx@linutronix.de>
|
||||
- Thomas Gleixner <tglx@kernel.org>
|
||||
- Rob Herring <robh@kernel.org>
|
||||
|
||||
properties:
|
||||
|
|
|
|||
|
|
@ -996,11 +996,11 @@ The following people have contributed to the NAND driver:
|
|||
|
||||
2. David Woodhouse\ dwmw2@infradead.org
|
||||
|
||||
3. Thomas Gleixner\ tglx@linutronix.de
|
||||
3. Thomas Gleixner\ tglx@kernel.org
|
||||
|
||||
A lot of users have provided bugfixes, improvements and helping hands
|
||||
for testing. Thanks a lot.
|
||||
|
||||
The following people have contributed to this document:
|
||||
|
||||
1. Thomas Gleixner\ tglx@linutronix.de
|
||||
1. Thomas Gleixner\ tglx@kernel.org
|
||||
|
|
|
|||
|
|
@ -416,6 +416,7 @@ lm_change yes no no
|
|||
lm_breaker_owns_lease: yes no no
|
||||
lm_lock_expirable yes no no
|
||||
lm_expire_lock no no yes
|
||||
lm_open_conflict yes no no
|
||||
====================== ============= ================= =========
|
||||
|
||||
buffer_head
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ attribute-sets:
|
|||
name: ifindex
|
||||
doc: |
|
||||
ifindex of the netdev to which the pool belongs.
|
||||
May be reported as 0 if the page pool was allocated for a netdev
|
||||
May not be reported if the page pool was allocated for a netdev
|
||||
which got destroyed already (page pools may outlast their netdevs
|
||||
because they wait for all memory to be returned).
|
||||
type: u32
|
||||
|
|
@ -601,7 +601,9 @@ operations:
|
|||
name: page-pool-get
|
||||
doc: |
|
||||
Get / dump information about Page Pools.
|
||||
(Only Page Pools associated with a net_device can be listed.)
|
||||
Only Page Pools associated by the driver with a net_device
|
||||
can be listed. ifindex will not be reported if the net_device
|
||||
no longer exists.
|
||||
attribute-set: page-pool
|
||||
do:
|
||||
request:
|
||||
|
|
|
|||
|
|
@ -57,8 +57,10 @@ Submitting Patches for Given SoC
|
|||
|
||||
All typical platform related patches should be sent via SoC submaintainers
|
||||
(platform-specific maintainers). This includes also changes to per-platform or
|
||||
shared defconfigs (scripts/get_maintainer.pl might not provide correct
|
||||
addresses in such case).
|
||||
shared defconfigs. Note that scripts/get_maintainer.pl might not provide
|
||||
correct addresses for the shared defconfig, so ignore its output and manually
|
||||
create CC-list based on MAINTAINERS file or use something like
|
||||
``scripts/get_maintainer.pl -f drivers/soc/FOO/``).
|
||||
|
||||
Submitting Patches to the Main SoC Maintainers
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
@ -114,9 +116,9 @@ coordinating how the changes get merged through different maintainer trees.
|
|||
Usually the branch that includes a driver change will also include the
|
||||
corresponding change to the devicetree binding description, to ensure they are
|
||||
in fact compatible. This means that the devicetree branch can end up causing
|
||||
warnings in the "make dtbs_check" step. If a devicetree change depends on
|
||||
warnings in the ``make dtbs_check`` step. If a devicetree change depends on
|
||||
missing additions to a header file in include/dt-bindings/, it will fail the
|
||||
"make dtbs" step and not get merged.
|
||||
``make dtbs`` step and not get merged.
|
||||
|
||||
There are multiple ways to deal with this:
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
Srivatsa Vaddagiri <vatsa@in.ibm.com>,
|
||||
Ashok Raj <ashok.raj@intel.com>,
|
||||
Joel Schopp <jschopp@austin.ibm.com>,
|
||||
Thomas Gleixner <tglx@linutronix.de>
|
||||
Thomas Gleixner <tglx@kernel.org>
|
||||
|
||||
简介
|
||||
====
|
||||
|
|
|
|||
|
|
@ -404,6 +404,6 @@ kernel/irq/chip.c
|
|||
|
||||
感谢以下人士对本文档作出的贡献:
|
||||
|
||||
1. Thomas Gleixner tglx@linutronix.de
|
||||
1. Thomas Gleixner tglx@kernel.org
|
||||
|
||||
2. Ingo Molnar mingo@elte.hu
|
||||
|
|
|
|||
69
MAINTAINERS
69
MAINTAINERS
|
|
@ -1283,6 +1283,7 @@ F: include/uapi/drm/amdxdna_accel.h
|
|||
|
||||
AMD XGBE DRIVER
|
||||
M: "Shyam Sundar S K" <Shyam-sundar.S-k@amd.com>
|
||||
M: Raju Rangoju <Raju.Rangoju@amd.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/arm64/boot/dts/amd/amd-seattle-xgbe*.dtsi
|
||||
|
|
@ -2011,7 +2012,7 @@ ARM AND ARM64 SoC SUB-ARCHITECTURES (COMMON PARTS)
|
|||
M: Arnd Bergmann <arnd@arndb.de>
|
||||
M: Krzysztof Kozlowski <krzk@kernel.org>
|
||||
M: Alexandre Belloni <alexandre.belloni@bootlin.com>
|
||||
M: Linus Walleij <linus.walleij@linaro.org>
|
||||
M: Linus Walleij <linusw@kernel.org>
|
||||
R: Drew Fustini <fustini@kernel.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
L: soc@lists.linux.dev
|
||||
|
|
@ -2158,7 +2159,7 @@ M: Alice Ryhl <aliceryhl@google.com>
|
|||
L: dri-devel@lists.freedesktop.org
|
||||
S: Supported
|
||||
W: https://rust-for-linux.com/tyr-gpu-driver
|
||||
W https://drm.pages.freedesktop.org/maintainer-tools/drm-rust.html
|
||||
W: https://drm.pages.freedesktop.org/maintainer-tools/drm-rust.html
|
||||
B: https://gitlab.freedesktop.org/panfrost/linux/-/issues
|
||||
T: git https://gitlab.freedesktop.org/drm/rust/kernel.git
|
||||
F: Documentation/devicetree/bindings/gpu/arm,mali-valhall-csf.yaml
|
||||
|
|
@ -5801,7 +5802,8 @@ F: drivers/power/supply/cw2015_battery.c
|
|||
|
||||
CEPH COMMON CODE (LIBCEPH)
|
||||
M: Ilya Dryomov <idryomov@gmail.com>
|
||||
M: Xiubo Li <xiubli@redhat.com>
|
||||
M: Alex Markuze <amarkuze@redhat.com>
|
||||
M: Viacheslav Dubeyko <slava@dubeyko.com>
|
||||
L: ceph-devel@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://ceph.com/
|
||||
|
|
@ -5812,8 +5814,9 @@ F: include/linux/crush/
|
|||
F: net/ceph/
|
||||
|
||||
CEPH DISTRIBUTED FILE SYSTEM CLIENT (CEPH)
|
||||
M: Xiubo Li <xiubli@redhat.com>
|
||||
M: Ilya Dryomov <idryomov@gmail.com>
|
||||
M: Alex Markuze <amarkuze@redhat.com>
|
||||
M: Viacheslav Dubeyko <slava@dubeyko.com>
|
||||
L: ceph-devel@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://ceph.com/
|
||||
|
|
@ -6172,7 +6175,7 @@ F: include/linux/clk.h
|
|||
|
||||
CLOCKSOURCE, CLOCKEVENT DRIVERS
|
||||
M: Daniel Lezcano <daniel.lezcano@linaro.org>
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
|
||||
|
|
@ -6532,13 +6535,13 @@ F: rust/kernel/cpufreq.rs
|
|||
F: tools/testing/selftests/cpufreq/
|
||||
|
||||
CPU FREQUENCY DRIVERS - VIRTUAL MACHINE CPUFREQ
|
||||
M: Saravana Kannan <saravanak@google.com>
|
||||
M: Saravana Kannan <saravanak@kernel.org>
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/cpufreq/virtual-cpufreq.c
|
||||
|
||||
CPU HOTPLUG
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
M: Peter Zijlstra <peterz@infradead.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
|
@ -6705,6 +6708,7 @@ S: Maintained
|
|||
T: git https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git libcrypto-next
|
||||
T: git https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git libcrypto-fixes
|
||||
F: lib/crypto/
|
||||
F: scripts/crypto/
|
||||
|
||||
CRYPTO SPEED TEST COMPARE
|
||||
M: Wang Jinchao <wangjinchao@xfusion.com>
|
||||
|
|
@ -6965,7 +6969,7 @@ F: Documentation/scsi/dc395x.rst
|
|||
F: drivers/scsi/dc395x.*
|
||||
|
||||
DEBUGOBJECTS:
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core/debugobjects
|
||||
|
|
@ -7170,7 +7174,7 @@ F: drivers/base/devcoredump.c
|
|||
F: include/linux/devcoredump.h
|
||||
|
||||
DEVICE DEPENDENCY HELPER SCRIPT
|
||||
M: Saravana Kannan <saravanak@google.com>
|
||||
M: Saravana Kannan <saravanak@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: scripts/dev-needs.sh
|
||||
|
|
@ -8069,7 +8073,7 @@ W: https://rust-for-linux.com/nova-gpu-driver
|
|||
Q: https://patchwork.freedesktop.org/project/nouveau/
|
||||
B: https://gitlab.freedesktop.org/drm/nova/-/issues
|
||||
C: irc://irc.oftc.net/nouveau
|
||||
T: git https://gitlab.freedesktop.org/drm/nova.git nova-next
|
||||
T: git https://gitlab.freedesktop.org/drm/rust/kernel.git drm-rust-next
|
||||
F: Documentation/gpu/nova/
|
||||
F: drivers/gpu/nova-core/
|
||||
|
||||
|
|
@ -8081,7 +8085,7 @@ W: https://rust-for-linux.com/nova-gpu-driver
|
|||
Q: https://patchwork.freedesktop.org/project/nouveau/
|
||||
B: https://gitlab.freedesktop.org/drm/nova/-/issues
|
||||
C: irc://irc.oftc.net/nouveau
|
||||
T: git https://gitlab.freedesktop.org/drm/nova.git nova-next
|
||||
T: git https://gitlab.freedesktop.org/drm/rust/kernel.git drm-rust-next
|
||||
F: Documentation/gpu/nova/
|
||||
F: drivers/gpu/drm/nova/
|
||||
F: include/uapi/drm/nova_drm.h
|
||||
|
|
@ -8359,6 +8363,7 @@ X: drivers/gpu/drm/msm/
|
|||
X: drivers/gpu/drm/nova/
|
||||
X: drivers/gpu/drm/radeon/
|
||||
X: drivers/gpu/drm/tegra/
|
||||
X: drivers/gpu/drm/tyr/
|
||||
X: drivers/gpu/drm/xe/
|
||||
|
||||
DRM DRIVERS AND COMMON INFRASTRUCTURE [RUST]
|
||||
|
|
@ -10369,7 +10374,7 @@ F: include/uapi/linux/fuse.h
|
|||
F: tools/testing/selftests/filesystems/fuse/
|
||||
|
||||
FUTEX SUBSYSTEM
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
M: Ingo Molnar <mingo@redhat.com>
|
||||
R: Peter Zijlstra <peterz@infradead.org>
|
||||
R: Darren Hart <dvhart@infradead.org>
|
||||
|
|
@ -10513,7 +10518,7 @@ F: drivers/base/arch_topology.c
|
|||
F: include/linux/arch_topology.h
|
||||
|
||||
GENERIC ENTRY CODE
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
M: Peter Zijlstra <peterz@infradead.org>
|
||||
M: Andy Lutomirski <luto@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
|
|
@ -10626,7 +10631,7 @@ F: drivers/uio/uio_pci_generic.c
|
|||
|
||||
GENERIC VDSO LIBRARY
|
||||
M: Andy Lutomirski <luto@kernel.org>
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
M: Vincenzo Frascino <vincenzo.frascino@arm.com>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
|
@ -11239,7 +11244,7 @@ F: drivers/hid/hid-logitech-hidpp.c
|
|||
HIGH-RESOLUTION TIMERS, TIMER WHEEL, CLOCKEVENTS
|
||||
M: Anna-Maria Behnsen <anna-maria@linutronix.de>
|
||||
M: Frederic Weisbecker <frederic@kernel.org>
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
|
||||
|
|
@ -11262,7 +11267,7 @@ R: Boqun Feng <boqun.feng@gmail.com>
|
|||
R: FUJITA Tomonori <fujita.tomonori@gmail.com>
|
||||
R: Frederic Weisbecker <frederic@kernel.org>
|
||||
R: Lyude Paul <lyude@redhat.com>
|
||||
R: Thomas Gleixner <tglx@linutronix.de>
|
||||
R: Thomas Gleixner <tglx@kernel.org>
|
||||
R: Anna-Maria Behnsen <anna-maria@linutronix.de>
|
||||
R: John Stultz <jstultz@google.com>
|
||||
R: Stephen Boyd <sboyd@kernel.org>
|
||||
|
|
@ -13332,7 +13337,7 @@ F: Documentation/devicetree/bindings/sound/irondevice,*
|
|||
F: sound/soc/codecs/sma*
|
||||
|
||||
IRQ DOMAINS (IRQ NUMBER MAPPING LIBRARY)
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
|
||||
F: Documentation/core-api/irq/irq-domain.rst
|
||||
|
|
@ -13342,7 +13347,7 @@ F: kernel/irq/irqdomain.c
|
|||
F: kernel/irq/msi.c
|
||||
|
||||
IRQ SUBSYSTEM
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
|
||||
|
|
@ -13355,7 +13360,7 @@ F: kernel/irq/
|
|||
F: lib/group_cpus.c
|
||||
|
||||
IRQCHIP DRIVERS
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
|
||||
|
|
@ -13961,6 +13966,7 @@ S: Maintained
|
|||
F: Documentation/admin-guide/mm/kho.rst
|
||||
F: Documentation/core-api/kho/*
|
||||
F: include/linux/kexec_handover.h
|
||||
F: include/linux/kho/
|
||||
F: kernel/liveupdate/kexec_handover*
|
||||
F: lib/test_kho.c
|
||||
F: tools/testing/selftests/kho/
|
||||
|
|
@ -14448,7 +14454,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-nonmm-unstab
|
|||
F: lib/*
|
||||
|
||||
LICENSES and SPDX stuff
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: linux-spdx@vger.kernel.org
|
||||
S: Maintained
|
||||
|
|
@ -14639,6 +14645,7 @@ S: Maintained
|
|||
F: Documentation/core-api/liveupdate.rst
|
||||
F: Documentation/mm/memfd_preservation.rst
|
||||
F: Documentation/userspace-api/liveupdate.rst
|
||||
F: include/linux/kho/abi/
|
||||
F: include/linux/liveupdate.h
|
||||
F: include/linux/liveupdate/
|
||||
F: include/uapi/linux/liveupdate.h
|
||||
|
|
@ -16428,6 +16435,7 @@ MEMORY HOT(UN)PLUG
|
|||
M: David Hildenbrand <david@kernel.org>
|
||||
M: Oscar Salvador <osalvador@suse.de>
|
||||
L: linux-mm@kvack.org
|
||||
L: linux-cxl@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/admin-guide/mm/memory-hotplug.rst
|
||||
F: Documentation/core-api/memory-hotplug.rst
|
||||
|
|
@ -16753,6 +16761,7 @@ F: tools/testing/selftests/mm/transhuge-stress.c
|
|||
|
||||
MEMORY MANAGEMENT - USERFAULTFD
|
||||
M: Andrew Morton <akpm@linux-foundation.org>
|
||||
M: Mike Rapoport <rppt@kernel.org>
|
||||
R: Peter Xu <peterx@redhat.com>
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
|
|
@ -18281,7 +18290,7 @@ X: net/wireless/
|
|||
X: tools/testing/selftests/net/can/
|
||||
|
||||
NETWORKING [IOAM]
|
||||
M: Justin Iurman <justin.iurman@uliege.be>
|
||||
M: Justin Iurman <justin.iurman@gmail.com>
|
||||
S: Maintained
|
||||
F: Documentation/networking/ioam6*
|
||||
F: include/linux/ioam6*
|
||||
|
|
@ -18570,7 +18579,7 @@ NOHZ, DYNTICKS SUPPORT
|
|||
M: Anna-Maria Behnsen <anna-maria@linutronix.de>
|
||||
M: Frederic Weisbecker <frederic@kernel.org>
|
||||
M: Ingo Molnar <mingo@kernel.org>
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/nohz
|
||||
|
|
@ -19545,7 +19554,7 @@ F: include/linux/oa_tc6.h
|
|||
|
||||
OPEN FIRMWARE AND FLATTENED DEVICE TREE
|
||||
M: Rob Herring <robh@kernel.org>
|
||||
M: Saravana Kannan <saravanak@google.com>
|
||||
M: Saravana Kannan <saravanak@kernel.org>
|
||||
L: devicetree@vger.kernel.org
|
||||
S: Maintained
|
||||
Q: http://patchwork.kernel.org/project/devicetree/list/
|
||||
|
|
@ -20755,7 +20764,7 @@ F: drivers/platform/x86/portwell-ec.c
|
|||
POSIX CLOCKS and TIMERS
|
||||
M: Anna-Maria Behnsen <anna-maria@linutronix.de>
|
||||
M: Frederic Weisbecker <frederic@kernel.org>
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
|
||||
|
|
@ -21347,7 +21356,7 @@ F: Documentation/devicetree/bindings/net/qcom,bam-dmux.yaml
|
|||
F: drivers/net/wwan/qcom_bam_dmux.c
|
||||
|
||||
QUALCOMM BLUETOOTH DRIVER
|
||||
M: Bartosz Golaszewski <brgl@bgdev.pl>
|
||||
M: Bartosz Golaszewski <brgl@kernel.org>
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/bluetooth/btqca.[ch]
|
||||
|
|
@ -24573,7 +24582,7 @@ F: drivers/tty/vcc.c
|
|||
F: include/linux/sunserialcore.h
|
||||
|
||||
SPARSE CHECKER
|
||||
M: "Luc Van Oostenryck" <luc.vanoostenryck@gmail.com>
|
||||
M: Chris Li <sparse@chrisli.org>
|
||||
L: linux-sparse@vger.kernel.org
|
||||
S: Maintained
|
||||
W: https://sparse.docs.kernel.org/
|
||||
|
|
@ -26266,7 +26275,7 @@ F: drivers/net/wireless/ti/
|
|||
|
||||
TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
|
||||
M: John Stultz <jstultz@google.com>
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
R: Stephen Boyd <sboyd@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
|
|
@ -28197,7 +28206,7 @@ F: net/lapb/
|
|||
F: net/x25/
|
||||
|
||||
X86 ARCHITECTURE (32-BIT AND 64-BIT)
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
M: Ingo Molnar <mingo@redhat.com>
|
||||
M: Borislav Petkov <bp@alien8.de>
|
||||
M: Dave Hansen <dave.hansen@linux.intel.com>
|
||||
|
|
@ -28213,7 +28222,7 @@ F: tools/testing/selftests/x86
|
|||
|
||||
X86 CPUID DATABASE
|
||||
M: Borislav Petkov <bp@alien8.de>
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
M: x86@kernel.org
|
||||
R: Ahmed S. Darwish <darwi@linutronix.de>
|
||||
L: x86-cpuid@lists.linux.dev
|
||||
|
|
@ -28229,7 +28238,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/asm
|
|||
F: arch/x86/entry/
|
||||
|
||||
X86 HARDWARE VULNERABILITIES
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Thomas Gleixner <tglx@kernel.org>
|
||||
M: Borislav Petkov <bp@alien8.de>
|
||||
M: Peter Zijlstra <peterz@infradead.org>
|
||||
M: Josh Poimboeuf <jpoimboe@kernel.org>
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -2,7 +2,7 @@
|
|||
VERSION = 6
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc3
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Baby Opossum Posse
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
|||
|
|
@ -12,6 +12,17 @@ / {
|
|||
model = "Actiontec MI424WR rev A/C";
|
||||
compatible = "actiontec,mi424wr-ac", "intel,ixp42x";
|
||||
|
||||
/* Connect the switch to EthC */
|
||||
spi {
|
||||
ethernet-switch@0 {
|
||||
ethernet-ports {
|
||||
ethernet-port@4 {
|
||||
ethernet = <ðc>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
/* EthB used for WAN */
|
||||
ethernet@c8009000 {
|
||||
|
|
|
|||
|
|
@ -12,6 +12,17 @@ / {
|
|||
model = "Actiontec MI424WR rev D";
|
||||
compatible = "actiontec,mi424wr-d", "intel,ixp42x";
|
||||
|
||||
/* Connect the switch to EthB */
|
||||
spi {
|
||||
ethernet-switch@0 {
|
||||
ethernet-ports {
|
||||
ethernet-port@4 {
|
||||
ethernet = <ðb>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
/* EthB used for LAN */
|
||||
ethernet@c8009000 {
|
||||
|
|
|
|||
|
|
@ -152,7 +152,6 @@ ethernet-port@3 {
|
|||
};
|
||||
ethernet-port@4 {
|
||||
reg = <4>;
|
||||
ethernet = <ðc>;
|
||||
phy-mode = "mii";
|
||||
fixed-link {
|
||||
speed = <100>;
|
||||
|
|
|
|||
|
|
@ -248,14 +248,14 @@ ledr3: led@9 {
|
|||
linux,default-trigger = "nand-disk";
|
||||
};
|
||||
|
||||
ledg3: led@10 {
|
||||
reg = <10>;
|
||||
ledg3: led@a {
|
||||
reg = <0xa>;
|
||||
label = "system:green3:live";
|
||||
linux,default-trigger = "heartbeat";
|
||||
};
|
||||
|
||||
ledb3: led@11 {
|
||||
reg = <11>;
|
||||
ledb3: led@b {
|
||||
reg = <0xb>;
|
||||
label = "system:blue3:cpu";
|
||||
linux,default-trigger = "cpu0";
|
||||
};
|
||||
|
|
|
|||
|
|
@ -398,13 +398,13 @@ leds {
|
|||
#size-cells = <0>;
|
||||
led-control = <0x0 0x0 0x3f83f8 0x0>;
|
||||
|
||||
sysled0@3 {
|
||||
led@3 {
|
||||
reg = <3>;
|
||||
label = "system:green:status";
|
||||
linux,default-trigger = "default-on";
|
||||
};
|
||||
|
||||
sysled1@4 {
|
||||
led@4 {
|
||||
reg = <4>;
|
||||
label = "system:green:act";
|
||||
linux,default-trigger = "heartbeat";
|
||||
|
|
|
|||
|
|
@ -225,13 +225,13 @@ leds {
|
|||
#size-cells = <0>;
|
||||
led-control = <0x0 0x0 0x3f83f8 0x0>;
|
||||
|
||||
sysled3: led3@3 {
|
||||
sysled3: led@3 {
|
||||
reg = <3>;
|
||||
label = "system:red:power";
|
||||
linux,default-trigger = "default-on";
|
||||
};
|
||||
|
||||
sysled4: led4@4 {
|
||||
sysled4: led@4 {
|
||||
reg = <4>;
|
||||
label = "system:green:act";
|
||||
linux,default-trigger = "heartbeat";
|
||||
|
|
|
|||
|
|
@ -153,13 +153,13 @@ leds {
|
|||
#size-cells = <0>;
|
||||
led-control = <0x0 0x0 0x3f83f8 0x0>;
|
||||
|
||||
sysled3: led3@3 {
|
||||
sysled3: led@3 {
|
||||
reg = <3>;
|
||||
label = "system:red:power";
|
||||
linux,default-trigger = "default-on";
|
||||
};
|
||||
|
||||
sysled4: led4@4 {
|
||||
sysled4: led@4 {
|
||||
reg = <4>;
|
||||
label = "system:green:act";
|
||||
linux,default-trigger = "heartbeat";
|
||||
|
|
|
|||
|
|
@ -337,7 +337,7 @@ rtc@32 {
|
|||
pinctrl-0 = <&pinctrl_rtc>;
|
||||
reg = <0x32>;
|
||||
interrupt-parent = <&gpio4>;
|
||||
interrupts = <10 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts = <10 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -7,15 +7,13 @@ dtb-$(CONFIG_ARCH_BCM2835) += bcm2711-rpi-400.dtb \
|
|||
bcm2711-rpi-4-b.dtb \
|
||||
bcm2711-rpi-cm4-io.dtb \
|
||||
bcm2712-rpi-5-b.dtb \
|
||||
bcm2712-rpi-5-b-ovl-rp1.dtb \
|
||||
bcm2712-d-rpi-5-b.dtb \
|
||||
bcm2837-rpi-2-b.dtb \
|
||||
bcm2837-rpi-3-a-plus.dtb \
|
||||
bcm2837-rpi-3-b.dtb \
|
||||
bcm2837-rpi-3-b-plus.dtb \
|
||||
bcm2837-rpi-cm3-io3.dtb \
|
||||
bcm2837-rpi-zero-2-w.dtb \
|
||||
rp1.dtbo
|
||||
bcm2837-rpi-zero-2-w.dtb
|
||||
|
||||
subdir-y += bcmbca
|
||||
subdir-y += northstar2
|
||||
|
|
|
|||
|
|
@ -1,22 +1,16 @@
|
|||
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||
/*
|
||||
* bcm2712-rpi-5-b-ovl-rp1.dts is the overlay-ready DT which will make
|
||||
* the RP1 driver to load the RP1 dtb overlay at runtime, while
|
||||
* bcm2712-rpi-5-b.dts (this file) is the fully defined one (i.e. it
|
||||
* already contains RP1 node, so no overlay is loaded nor needed).
|
||||
* This file is intended to host the override nodes for the RP1 peripherals,
|
||||
* e.g. to declare the phy of the ethernet interface or the custom pin setup
|
||||
* for several RP1 peripherals.
|
||||
* This in turn is due to the fact that there's no current generic
|
||||
* infrastructure to reference nodes (i.e. the nodes in rp1-common.dtsi) that
|
||||
* are not yet defined in the DT since they are loaded at runtime via overlay.
|
||||
* As a loose attempt to separate RP1 customizations from SoC peripherals
|
||||
* definitioni, this file is intended to host the override nodes for the RP1
|
||||
* peripherals, e.g. to declare the phy of the ethernet interface or custom
|
||||
* pin setup.
|
||||
* All other nodes that do not have anything to do with RP1 should be added
|
||||
* to the included bcm2712-rpi-5-b-ovl-rp1.dts instead.
|
||||
* to the included bcm2712-rpi-5-b-base.dtsi instead.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include "bcm2712-rpi-5-b-ovl-rp1.dts"
|
||||
#include "bcm2712-rpi-5-b-base.dtsi"
|
||||
|
||||
/ {
|
||||
aliases {
|
||||
|
|
@ -25,7 +19,26 @@ aliases {
|
|||
};
|
||||
|
||||
&pcie2 {
|
||||
#include "rp1-nexus.dtsi"
|
||||
pci@0,0 {
|
||||
reg = <0x0 0x0 0x0 0x0 0x0>;
|
||||
ranges;
|
||||
bus-range = <0 1>;
|
||||
device_type = "pci";
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
dev@0,0 {
|
||||
compatible = "pci1de4,1";
|
||||
reg = <0x10000 0x0 0x0 0x0 0x0>;
|
||||
ranges = <0x1 0x0 0x0 0x82010000 0x0 0x0 0x0 0x400000>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
#include "rp1-common.dtsi"
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&rp1_eth {
|
||||
|
|
|
|||
|
|
@ -1,14 +0,0 @@
|
|||
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||
|
||||
rp1_nexus {
|
||||
compatible = "pci1de4,1";
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
ranges = <0x01 0x00 0x00000000
|
||||
0x02000000 0x00 0x00000000
|
||||
0x0 0x400000>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
|
||||
#include "rp1-common.dtsi"
|
||||
};
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||
|
||||
/dts-v1/;
|
||||
/plugin/;
|
||||
|
||||
&pcie2 {
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
#include "rp1-nexus.dtsi"
|
||||
};
|
||||
|
|
@ -113,6 +113,7 @@ mdio {
|
|||
ethphy0f: ethernet-phy@1 { /* SMSC LAN8740Ai */
|
||||
compatible = "ethernet-phy-id0007.c110",
|
||||
"ethernet-phy-ieee802.3-c22";
|
||||
clocks = <&clk IMX8MP_CLK_ENET_QOS>;
|
||||
interrupt-parent = <&gpio3>;
|
||||
interrupts = <19 IRQ_TYPE_LEVEL_LOW>;
|
||||
pinctrl-0 = <&pinctrl_ethphy0>;
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
#include "imx8mp-tx8p-ml81.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "gocontroll,moduline-display", "fsl,imx8mp";
|
||||
compatible = "gocontroll,moduline-display-106", "karo,tx8p-ml81", "fsl,imx8mp";
|
||||
chassis-type = "embedded";
|
||||
hardware = "Moduline Display V1.06";
|
||||
model = "GOcontroll Moduline Display baseboard";
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ &eqos {
|
|||
<&clk IMX8MP_SYS_PLL2_100M>,
|
||||
<&clk IMX8MP_SYS_PLL2_50M>;
|
||||
assigned-clock-rates = <266000000>, <100000000>, <50000000>;
|
||||
nvmem-cells = <ð_mac1>;
|
||||
phy-handle = <ðphy0>;
|
||||
phy-mode = "rmii";
|
||||
pinctrl-0 = <&pinctrl_eqos>;
|
||||
|
|
@ -75,6 +76,10 @@ ethphy0: ethernet-phy@0 {
|
|||
};
|
||||
};
|
||||
|
||||
&fec {
|
||||
nvmem-cells = <ð_mac2>;
|
||||
};
|
||||
|
||||
&gpio1 {
|
||||
gpio-line-names = "SODIMM_152",
|
||||
"SODIMM_42",
|
||||
|
|
|
|||
|
|
@ -263,6 +263,7 @@ reg_usdhc2_vmmc: usdhc2-vmmc {
|
|||
regulator-max-microvolt = <3000000>;
|
||||
gpio = <&lsio_gpio4 7 GPIO_ACTIVE_HIGH>;
|
||||
enable-active-high;
|
||||
off-on-delay-us = <4800>;
|
||||
};
|
||||
|
||||
reg_audio: regulator-audio {
|
||||
|
|
@ -576,7 +577,7 @@ light-sensor@44 {
|
|||
compatible = "isil,isl29023";
|
||||
reg = <0x44>;
|
||||
interrupt-parent = <&lsio_gpio4>;
|
||||
interrupts = <11 IRQ_TYPE_EDGE_FALLING>;
|
||||
interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
|
||||
pressure-sensor@60 {
|
||||
|
|
|
|||
|
|
@ -172,25 +172,25 @@ &flexcan3 {
|
|||
|
||||
&lpuart0 {
|
||||
compatible = "fsl,imx8qm-lpuart", "fsl,imx8qxp-lpuart";
|
||||
dmas = <&edma2 13 0 0>, <&edma2 12 0 1>;
|
||||
dmas = <&edma2 12 0 FSL_EDMA_RX>, <&edma2 13 0 0>;
|
||||
dma-names = "rx","tx";
|
||||
};
|
||||
|
||||
&lpuart1 {
|
||||
compatible = "fsl,imx8qm-lpuart", "fsl,imx8qxp-lpuart";
|
||||
dmas = <&edma2 15 0 0>, <&edma2 14 0 1>;
|
||||
dmas = <&edma2 14 0 FSL_EDMA_RX>, <&edma2 15 0 0>;
|
||||
dma-names = "rx","tx";
|
||||
};
|
||||
|
||||
&lpuart2 {
|
||||
compatible = "fsl,imx8qm-lpuart", "fsl,imx8qxp-lpuart";
|
||||
dmas = <&edma2 17 0 0>, <&edma2 16 0 1>;
|
||||
dmas = <&edma2 16 0 FSL_EDMA_RX>, <&edma2 17 0 0>;
|
||||
dma-names = "rx","tx";
|
||||
};
|
||||
|
||||
&lpuart3 {
|
||||
compatible = "fsl,imx8qm-lpuart", "fsl,imx8qxp-lpuart";
|
||||
dmas = <&edma2 19 0 0>, <&edma2 18 0 1>;
|
||||
dmas = <&edma2 18 0 FSL_EDMA_RX>, <&edma2 19 0 0>;
|
||||
dma-names = "rx","tx";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -406,8 +406,6 @@ som_gpio_expander_1: gpio@21 {
|
|||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"SMARC_SDIO_WP";
|
||||
};
|
||||
|
||||
|
|
@ -582,7 +580,7 @@ &netc_emdio {
|
|||
ethphy1: ethernet-phy@1 {
|
||||
reg = <1>;
|
||||
interrupt-parent = <&som_gpio_expander_1>;
|
||||
interrupts = <6 IRQ_TYPE_LEVEL_LOW>;
|
||||
interrupts = <6 IRQ_TYPE_EDGE_FALLING>;
|
||||
ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
|
||||
ti,tx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -828,7 +828,7 @@ i3c2: i3c@42520000 {
|
|||
interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&scmi_clk IMX95_CLK_BUSAON>,
|
||||
clocks = <&scmi_clk IMX95_CLK_BUSWAKEUP>,
|
||||
<&scmi_clk IMX95_CLK_I3C2SLOW>;
|
||||
clock-names = "pclk", "fast_clk";
|
||||
status = "disabled";
|
||||
|
|
|
|||
|
|
@ -192,7 +192,7 @@ ethphy0: ethernet-phy@e {
|
|||
reset-assert-us = <500000>;
|
||||
reset-deassert-us = <500>;
|
||||
interrupt-parent = <&expander2>;
|
||||
interrupts = <6 IRQ_TYPE_EDGE_FALLING>;
|
||||
interrupts = <6 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -675,10 +675,7 @@ &dwc3 { /* USB */
|
|||
snps,lfps_filter_quirk;
|
||||
snps,dis_u2_susphy_quirk;
|
||||
snps,dis_u3_susphy_quirk;
|
||||
snps,tx_de_emphasis_quirk;
|
||||
snps,tx_de_emphasis = <1>;
|
||||
snps,dis_enblslpm_quirk;
|
||||
snps,gctl-reset-quirk;
|
||||
usb-role-switch;
|
||||
role-switch-default-mode = "host";
|
||||
port {
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ &mcasp1 {
|
|||
};
|
||||
|
||||
&main_pmx0 {
|
||||
gpmc0_pins_default: gpmc0-pins-default {
|
||||
gpmc0_pins_default: gpmc0-default-pins {
|
||||
pinctrl-single,pins = <
|
||||
AM62X_IOPAD(0x003c, PIN_INPUT, 0) /* (K19) GPMC0_AD0 */
|
||||
AM62X_IOPAD(0x0040, PIN_INPUT, 0) /* (L19) GPMC0_AD1 */
|
||||
|
|
|
|||
|
|
@ -30,13 +30,10 @@ icssg1-ethernet {
|
|||
<&main_pktdma 0xc206 15>, /* egress slice 1 */
|
||||
<&main_pktdma 0xc207 15>, /* egress slice 1 */
|
||||
<&main_pktdma 0x4200 15>, /* ingress slice 0 */
|
||||
<&main_pktdma 0x4201 15>, /* ingress slice 1 */
|
||||
<&main_pktdma 0x4202 0>, /* mgmnt rsp slice 0 */
|
||||
<&main_pktdma 0x4203 0>; /* mgmnt rsp slice 1 */
|
||||
<&main_pktdma 0x4201 15>; /* ingress slice 1 */
|
||||
dma-names = "tx0-0", "tx0-1", "tx0-2", "tx0-3",
|
||||
"tx1-0", "tx1-1", "tx1-2", "tx1-3",
|
||||
"rx0", "rx1",
|
||||
"rxmgm0", "rxmgm1";
|
||||
"rx0", "rx1";
|
||||
|
||||
firmware-name = "ti-pruss/am65x-sr2-pru0-prueth-fw.elf",
|
||||
"ti-pruss/am65x-sr2-rtu0-prueth-fw.elf",
|
||||
|
|
|
|||
|
|
@ -20,13 +20,13 @@ aliases {
|
|||
};
|
||||
|
||||
&main_pmx0 {
|
||||
main_gpio1_exp_header_gpio_pins_default: main-gpio1-exp-header-gpio-pins-default {
|
||||
main_gpio1_exp_header_gpio_pins_default: main-gpio1-exp-header-gpio-default-pins {
|
||||
pinctrl-single,pins = <
|
||||
AM64X_IOPAD(0x0220, PIN_INPUT, 7) /* (D14) SPI1_CS1.GPIO1_48 */
|
||||
>;
|
||||
};
|
||||
|
||||
main_spi1_pins_default: main-spi1-pins-default {
|
||||
main_spi1_pins_default: main-spi1-default-pins {
|
||||
pinctrl-single,pins = <
|
||||
AM64X_IOPAD(0x0224, PIN_INPUT, 0) /* (C14) SPI1_CLK */
|
||||
AM64X_IOPAD(0x021C, PIN_OUTPUT, 0) /* (B14) SPI1_CS0 */
|
||||
|
|
@ -35,7 +35,7 @@ AM64X_IOPAD(0x022C, PIN_INPUT, 0) /* (A15) SPI1_D1 */
|
|||
>;
|
||||
};
|
||||
|
||||
main_uart3_pins_default: main-uart3-pins-default {
|
||||
main_uart3_pins_default: main-uart3-default-pins {
|
||||
pinctrl-single,pins = <
|
||||
AM64X_IOPAD(0x0048, PIN_INPUT, 2) /* (U20) GPMC0_AD3.UART3_RXD */
|
||||
AM64X_IOPAD(0x004c, PIN_OUTPUT, 2) /* (U18) GPMC0_AD4.UART3_TXD */
|
||||
|
|
@ -52,7 +52,7 @@ &main_gpio1 {
|
|||
&main_spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&main_spi1_pins_default>;
|
||||
ti,pindir-d0-out-d1-in = <1>;
|
||||
ti,pindir-d0-out-d1-in;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ void arch_efi_call_virt_teardown(void);
|
|||
* switching to the EFI runtime stack.
|
||||
*/
|
||||
#define current_in_efi() \
|
||||
(!preemptible() && efi_rt_stack_top != NULL && \
|
||||
(efi_rt_stack_top != NULL && \
|
||||
on_task_stack(current, READ_ONCE(efi_rt_stack_top[-1]), 1))
|
||||
|
||||
#define ARCH_EFI_IRQ_FLAGS_MASK (PSR_D_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT)
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
#ifndef __ASM_SUSPEND_H
|
||||
#define __ASM_SUSPEND_H
|
||||
|
||||
#define NR_CTX_REGS 13
|
||||
#define NR_CTX_REGS 14
|
||||
#define NR_CALLEE_SAVED_REGS 12
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -171,7 +171,8 @@ static int change_memory_common(unsigned long addr, int numpages,
|
|||
*/
|
||||
area = find_vm_area((void *)addr);
|
||||
if (!area ||
|
||||
end > (unsigned long)kasan_reset_tag(area->addr) + area->size ||
|
||||
((unsigned long)kasan_reset_tag((void *)end) >
|
||||
(unsigned long)kasan_reset_tag(area->addr) + area->size) ||
|
||||
((area->flags & (VM_ALLOC | VM_ALLOW_HUGE_VMAP)) != VM_ALLOC))
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -184,7 +185,8 @@ static int change_memory_common(unsigned long addr, int numpages,
|
|||
*/
|
||||
if (rodata_full && (pgprot_val(set_mask) == PTE_RDONLY ||
|
||||
pgprot_val(clear_mask) == PTE_RDONLY)) {
|
||||
unsigned long idx = (start - (unsigned long)kasan_reset_tag(area->addr))
|
||||
unsigned long idx = ((unsigned long)kasan_reset_tag((void *)start) -
|
||||
(unsigned long)kasan_reset_tag(area->addr))
|
||||
>> PAGE_SHIFT;
|
||||
for (; numpages; idx++, numpages--) {
|
||||
ret = __change_memory_common((u64)page_address(area->pages[idx]),
|
||||
|
|
|
|||
|
|
@ -110,6 +110,10 @@ SYM_FUNC_START(cpu_do_suspend)
|
|||
* call stack.
|
||||
*/
|
||||
str x18, [x0, #96]
|
||||
alternative_if ARM64_HAS_TCR2
|
||||
mrs x2, REG_TCR2_EL1
|
||||
str x2, [x0, #104]
|
||||
alternative_else_nop_endif
|
||||
ret
|
||||
SYM_FUNC_END(cpu_do_suspend)
|
||||
|
||||
|
|
@ -144,6 +148,10 @@ SYM_FUNC_START(cpu_do_resume)
|
|||
msr tcr_el1, x8
|
||||
msr vbar_el1, x9
|
||||
msr mdscr_el1, x10
|
||||
alternative_if ARM64_HAS_TCR2
|
||||
ldr x2, [x0, #104]
|
||||
msr REG_TCR2_EL1, x2
|
||||
alternative_else_nop_endif
|
||||
|
||||
msr sctlr_el1, x12
|
||||
set_this_cpu_offset x13
|
||||
|
|
|
|||
|
|
@ -94,6 +94,12 @@
|
|||
#define CPUCFG2_LSPW BIT(21)
|
||||
#define CPUCFG2_LAM BIT(22)
|
||||
#define CPUCFG2_PTW BIT(24)
|
||||
#define CPUCFG2_FRECIPE BIT(25)
|
||||
#define CPUCFG2_DIV32 BIT(26)
|
||||
#define CPUCFG2_LAM_BH BIT(27)
|
||||
#define CPUCFG2_LAMCAS BIT(28)
|
||||
#define CPUCFG2_LLACQ_SCREL BIT(29)
|
||||
#define CPUCFG2_SCQ BIT(30)
|
||||
|
||||
#define LOONGARCH_CPUCFG3 0x3
|
||||
#define CPUCFG3_CCDMA BIT(0)
|
||||
|
|
@ -108,6 +114,7 @@
|
|||
#define CPUCFG3_SPW_HG_HF BIT(11)
|
||||
#define CPUCFG3_RVA BIT(12)
|
||||
#define CPUCFG3_RVAMAX GENMASK(16, 13)
|
||||
#define CPUCFG3_DBAR_HINTS BIT(17)
|
||||
#define CPUCFG3_ALDORDER_CAP BIT(18) /* All address load ordered, capability */
|
||||
#define CPUCFG3_ASTORDER_CAP BIT(19) /* All address store ordered, capability */
|
||||
#define CPUCFG3_ALDORDER_STA BIT(20) /* All address load ordered, status */
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ SYM_DATA(kernel_fsize, .long _kernel_fsize);
|
|||
.align 12
|
||||
|
||||
SYM_CODE_START(kernel_entry) # kernel entry point
|
||||
UNWIND_HINT_END_OF_STACK
|
||||
|
||||
SETUP_TWINS
|
||||
SETUP_MODES t0
|
||||
|
|
@ -113,6 +114,7 @@ SYM_CODE_END(kernel_entry)
|
|||
* function after setting up the stack and tp registers.
|
||||
*/
|
||||
SYM_CODE_START(smpboot_entry)
|
||||
UNWIND_HINT_END_OF_STACK
|
||||
|
||||
SETUP_TWINS
|
||||
SETUP_MODES t0
|
||||
|
|
@ -142,5 +144,3 @@ SYM_CODE_START(smpboot_entry)
|
|||
SYM_CODE_END(smpboot_entry)
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
SYM_ENTRY(kernel_entry_end, SYM_L_GLOBAL, SYM_A_NONE)
|
||||
|
|
|
|||
|
|
@ -94,7 +94,6 @@ SYM_INNER_LABEL(ftrace_graph_call, SYM_L_GLOBAL)
|
|||
* at the callsite, so there is no need to restore the T series regs.
|
||||
*/
|
||||
ftrace_common_return:
|
||||
PTR_L ra, sp, PT_R1
|
||||
PTR_L a0, sp, PT_R4
|
||||
PTR_L a1, sp, PT_R5
|
||||
PTR_L a2, sp, PT_R6
|
||||
|
|
@ -104,12 +103,17 @@ ftrace_common_return:
|
|||
PTR_L a6, sp, PT_R10
|
||||
PTR_L a7, sp, PT_R11
|
||||
PTR_L fp, sp, PT_R22
|
||||
PTR_L t0, sp, PT_ERA
|
||||
PTR_L t1, sp, PT_R13
|
||||
PTR_ADDI sp, sp, PT_SIZE
|
||||
bnez t1, .Ldirect
|
||||
|
||||
PTR_L ra, sp, PT_R1
|
||||
PTR_L t0, sp, PT_ERA
|
||||
PTR_ADDI sp, sp, PT_SIZE
|
||||
jr t0
|
||||
.Ldirect:
|
||||
PTR_L t0, sp, PT_R1
|
||||
PTR_L ra, sp, PT_ERA
|
||||
PTR_ADDI sp, sp, PT_SIZE
|
||||
jr t1
|
||||
SYM_CODE_END(ftrace_common)
|
||||
|
||||
|
|
@ -161,6 +165,8 @@ SYM_CODE_END(return_to_handler)
|
|||
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
|
||||
SYM_CODE_START(ftrace_stub_direct_tramp)
|
||||
UNWIND_HINT_UNDEFINED
|
||||
jr t0
|
||||
move t1, ra
|
||||
move ra, t0
|
||||
jr t1
|
||||
SYM_CODE_END(ftrace_stub_direct_tramp)
|
||||
#endif /* CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS */
|
||||
|
|
|
|||
|
|
@ -535,10 +535,15 @@ asmlinkage void noinstr do_fpe(struct pt_regs *regs, unsigned long fcsr)
|
|||
asmlinkage void noinstr do_ade(struct pt_regs *regs)
|
||||
{
|
||||
irqentry_state_t state = irqentry_enter(regs);
|
||||
unsigned int esubcode = FIELD_GET(CSR_ESTAT_ESUBCODE, regs->csr_estat);
|
||||
|
||||
if ((esubcode == EXSUBCODE_ADEM) && fixup_exception(regs))
|
||||
goto out;
|
||||
|
||||
die_if_kernel("Kernel ade access", regs);
|
||||
force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)regs->csr_badvaddr);
|
||||
|
||||
out:
|
||||
irqentry_exit(regs, state);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -348,24 +348,10 @@ void unwind_start(struct unwind_state *state, struct task_struct *task,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(unwind_start);
|
||||
|
||||
static bool is_entry_func(unsigned long addr)
|
||||
{
|
||||
extern u32 kernel_entry;
|
||||
extern u32 kernel_entry_end;
|
||||
|
||||
return addr >= (unsigned long)&kernel_entry && addr < (unsigned long)&kernel_entry_end;
|
||||
}
|
||||
|
||||
static inline unsigned long bt_address(unsigned long ra)
|
||||
{
|
||||
extern unsigned long eentry;
|
||||
|
||||
if (__kernel_text_address(ra))
|
||||
return ra;
|
||||
|
||||
if (__module_text_address(ra))
|
||||
return ra;
|
||||
|
||||
if (ra >= eentry && ra < eentry + EXCCODE_INT_END * VECSIZE) {
|
||||
unsigned long func;
|
||||
unsigned long type = (ra - eentry) / VECSIZE;
|
||||
|
|
@ -383,10 +369,13 @@ static inline unsigned long bt_address(unsigned long ra)
|
|||
break;
|
||||
}
|
||||
|
||||
return func + offset;
|
||||
ra = func + offset;
|
||||
}
|
||||
|
||||
return ra;
|
||||
if (__kernel_text_address(ra))
|
||||
return ra;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool unwind_next_frame(struct unwind_state *state)
|
||||
|
|
@ -402,9 +391,6 @@ bool unwind_next_frame(struct unwind_state *state)
|
|||
/* Don't let modules unload while we're reading their ORC data. */
|
||||
guard(rcu)();
|
||||
|
||||
if (is_entry_func(state->pc))
|
||||
goto end;
|
||||
|
||||
orc = orc_find(state->pc);
|
||||
if (!orc) {
|
||||
/*
|
||||
|
|
@ -512,9 +498,6 @@ bool unwind_next_frame(struct unwind_state *state)
|
|||
goto err;
|
||||
}
|
||||
|
||||
if (!__kernel_text_address(state->pc))
|
||||
goto err;
|
||||
|
||||
return true;
|
||||
|
||||
err:
|
||||
|
|
|
|||
|
|
@ -160,8 +160,8 @@ void cpu_cache_init(void)
|
|||
|
||||
static const pgprot_t protection_map[16] = {
|
||||
[VM_NONE] = __pgprot(_CACHE_CC | _PAGE_USER |
|
||||
_PAGE_PROTNONE | _PAGE_NO_EXEC |
|
||||
_PAGE_NO_READ),
|
||||
_PAGE_NO_EXEC | _PAGE_NO_READ |
|
||||
(_PAGE_PROTNONE ? : _PAGE_PRESENT)),
|
||||
[VM_READ] = __pgprot(_CACHE_CC | _PAGE_VALID |
|
||||
_PAGE_USER | _PAGE_PRESENT |
|
||||
_PAGE_NO_EXEC),
|
||||
|
|
@ -180,8 +180,8 @@ static const pgprot_t protection_map[16] = {
|
|||
[VM_EXEC | VM_WRITE | VM_READ] = __pgprot(_CACHE_CC | _PAGE_VALID |
|
||||
_PAGE_USER | _PAGE_PRESENT),
|
||||
[VM_SHARED] = __pgprot(_CACHE_CC | _PAGE_USER |
|
||||
_PAGE_PROTNONE | _PAGE_NO_EXEC |
|
||||
_PAGE_NO_READ),
|
||||
_PAGE_NO_EXEC | _PAGE_NO_READ |
|
||||
(_PAGE_PROTNONE ? : _PAGE_PRESENT)),
|
||||
[VM_SHARED | VM_READ] = __pgprot(_CACHE_CC | _PAGE_VALID |
|
||||
_PAGE_USER | _PAGE_PRESENT |
|
||||
_PAGE_NO_EXEC),
|
||||
|
|
|
|||
|
|
@ -139,6 +139,7 @@ static void build_prologue(struct jit_ctx *ctx)
|
|||
stack_adjust = round_up(stack_adjust, 16);
|
||||
stack_adjust += bpf_stack_adjust;
|
||||
|
||||
move_reg(ctx, LOONGARCH_GPR_T0, LOONGARCH_GPR_RA);
|
||||
/* Reserve space for the move_imm + jirl instruction */
|
||||
for (i = 0; i < LOONGARCH_LONG_JUMP_NINSNS; i++)
|
||||
emit_insn(ctx, nop);
|
||||
|
|
@ -238,7 +239,7 @@ static void __build_epilogue(struct jit_ctx *ctx, bool is_tail_call)
|
|||
* Call the next bpf prog and skip the first instruction
|
||||
* of TCC initialization.
|
||||
*/
|
||||
emit_insn(ctx, jirl, LOONGARCH_GPR_ZERO, LOONGARCH_GPR_T3, 6);
|
||||
emit_insn(ctx, jirl, LOONGARCH_GPR_ZERO, LOONGARCH_GPR_T3, 7);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -280,6 +281,8 @@ static int emit_bpf_tail_call(struct jit_ctx *ctx, int insn)
|
|||
* goto out;
|
||||
*/
|
||||
tc_ninsn = insn ? ctx->offset[insn+1] - ctx->offset[insn] : ctx->offset[0];
|
||||
emit_zext_32(ctx, a2, true);
|
||||
|
||||
off = offsetof(struct bpf_array, map.max_entries);
|
||||
emit_insn(ctx, ldwu, t1, a1, off);
|
||||
/* bgeu $a2, $t1, jmp_offset */
|
||||
|
|
@ -950,6 +953,22 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
|
|||
emit_insn(ctx, ldd, REG_TCC, LOONGARCH_GPR_SP, tcc_ptr_off);
|
||||
}
|
||||
|
||||
if (insn->src_reg == BPF_PSEUDO_KFUNC_CALL) {
|
||||
const struct btf_func_model *m;
|
||||
int i;
|
||||
|
||||
m = bpf_jit_find_kfunc_model(ctx->prog, insn);
|
||||
if (!m)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < m->nr_args; i++) {
|
||||
u8 reg = regmap[BPF_REG_1 + i];
|
||||
bool sign = m->arg_flags[i] & BTF_FMODEL_SIGNED_ARG;
|
||||
|
||||
emit_abi_ext(ctx, reg, m->arg_size[i], sign);
|
||||
}
|
||||
}
|
||||
|
||||
move_addr(ctx, t1, func_addr);
|
||||
emit_insn(ctx, jirl, LOONGARCH_GPR_RA, t1, 0);
|
||||
|
||||
|
|
@ -1265,7 +1284,7 @@ static int emit_jump_or_nops(void *target, void *ip, u32 *insns, bool is_call)
|
|||
return 0;
|
||||
}
|
||||
|
||||
return emit_jump_and_link(&ctx, is_call ? LOONGARCH_GPR_T0 : LOONGARCH_GPR_ZERO, (u64)target);
|
||||
return emit_jump_and_link(&ctx, is_call ? LOONGARCH_GPR_RA : LOONGARCH_GPR_ZERO, (u64)target);
|
||||
}
|
||||
|
||||
static int emit_call(struct jit_ctx *ctx, u64 addr)
|
||||
|
|
@ -1290,15 +1309,30 @@ int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type old_t,
|
|||
{
|
||||
int ret;
|
||||
bool is_call;
|
||||
unsigned long size = 0;
|
||||
unsigned long offset = 0;
|
||||
void *image = NULL;
|
||||
char namebuf[KSYM_NAME_LEN];
|
||||
u32 old_insns[LOONGARCH_LONG_JUMP_NINSNS] = {[0 ... 4] = INSN_NOP};
|
||||
u32 new_insns[LOONGARCH_LONG_JUMP_NINSNS] = {[0 ... 4] = INSN_NOP};
|
||||
|
||||
/* Only poking bpf text is supported. Since kernel function entry
|
||||
* is set up by ftrace, we rely on ftrace to poke kernel functions.
|
||||
*/
|
||||
if (!is_bpf_text_address((unsigned long)ip))
|
||||
if (!__bpf_address_lookup((unsigned long)ip, &size, &offset, namebuf))
|
||||
return -ENOTSUPP;
|
||||
|
||||
image = ip - offset;
|
||||
|
||||
/* zero offset means we're poking bpf prog entry */
|
||||
if (offset == 0) {
|
||||
/* skip to the nop instruction in bpf prog entry:
|
||||
* move t0, ra
|
||||
* nop
|
||||
*/
|
||||
ip = image + LOONGARCH_INSN_SIZE;
|
||||
}
|
||||
|
||||
is_call = old_t == BPF_MOD_CALL;
|
||||
ret = emit_jump_or_nops(old_addr, ip, old_insns, is_call);
|
||||
if (ret)
|
||||
|
|
@ -1622,14 +1656,12 @@ static int __arch_prepare_bpf_trampoline(struct jit_ctx *ctx, struct bpf_tramp_i
|
|||
|
||||
/* To traced function */
|
||||
/* Ftrace jump skips 2 NOP instructions */
|
||||
if (is_kernel_text((unsigned long)orig_call))
|
||||
if (is_kernel_text((unsigned long)orig_call) ||
|
||||
is_module_text_address((unsigned long)orig_call))
|
||||
orig_call += LOONGARCH_FENTRY_NBYTES;
|
||||
/* Direct jump skips 5 NOP instructions */
|
||||
else if (is_bpf_text_address((unsigned long)orig_call))
|
||||
orig_call += LOONGARCH_BPF_FENTRY_NBYTES;
|
||||
/* Module tracing not supported - cause kernel lockups */
|
||||
else if (is_module_text_address((unsigned long)orig_call))
|
||||
return -ENOTSUPP;
|
||||
|
||||
if (flags & BPF_TRAMP_F_CALL_ORIG) {
|
||||
move_addr(ctx, LOONGARCH_GPR_A0, (const u64)im);
|
||||
|
|
@ -1722,12 +1754,16 @@ static int __arch_prepare_bpf_trampoline(struct jit_ctx *ctx, struct bpf_tramp_i
|
|||
emit_insn(ctx, ldd, LOONGARCH_GPR_FP, LOONGARCH_GPR_SP, 0);
|
||||
emit_insn(ctx, addid, LOONGARCH_GPR_SP, LOONGARCH_GPR_SP, 16);
|
||||
|
||||
if (flags & BPF_TRAMP_F_SKIP_FRAME)
|
||||
if (flags & BPF_TRAMP_F_SKIP_FRAME) {
|
||||
/* return to parent function */
|
||||
emit_insn(ctx, jirl, LOONGARCH_GPR_ZERO, LOONGARCH_GPR_RA, 0);
|
||||
else
|
||||
/* return to traced function */
|
||||
move_reg(ctx, LOONGARCH_GPR_RA, LOONGARCH_GPR_T0);
|
||||
emit_insn(ctx, jirl, LOONGARCH_GPR_ZERO, LOONGARCH_GPR_T0, 0);
|
||||
} else {
|
||||
/* return to traced function */
|
||||
move_reg(ctx, LOONGARCH_GPR_T1, LOONGARCH_GPR_RA);
|
||||
move_reg(ctx, LOONGARCH_GPR_RA, LOONGARCH_GPR_T0);
|
||||
emit_insn(ctx, jirl, LOONGARCH_GPR_ZERO, LOONGARCH_GPR_T1, 0);
|
||||
}
|
||||
}
|
||||
|
||||
ret = ctx->idx;
|
||||
|
|
|
|||
|
|
@ -88,6 +88,32 @@ static inline void emit_sext_32(struct jit_ctx *ctx, enum loongarch_gpr reg, boo
|
|||
emit_insn(ctx, addiw, reg, reg, 0);
|
||||
}
|
||||
|
||||
/* Emit proper extension according to ABI requirements.
|
||||
* Note that it requires a value of size `size` already resides in register `reg`.
|
||||
*/
|
||||
static inline void emit_abi_ext(struct jit_ctx *ctx, int reg, u8 size, bool sign)
|
||||
{
|
||||
/* ABI requires unsigned char/short to be zero-extended */
|
||||
if (!sign && (size == 1 || size == 2))
|
||||
return;
|
||||
|
||||
switch (size) {
|
||||
case 1:
|
||||
emit_insn(ctx, extwb, reg, reg);
|
||||
break;
|
||||
case 2:
|
||||
emit_insn(ctx, extwh, reg, reg);
|
||||
break;
|
||||
case 4:
|
||||
emit_insn(ctx, addiw, reg, reg, 0);
|
||||
break;
|
||||
case 8:
|
||||
break;
|
||||
default:
|
||||
pr_warn("bpf_jit: invalid size %d for extension\n", size);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void move_addr(struct jit_ctx *ctx, enum loongarch_gpr rd, u64 addr)
|
||||
{
|
||||
u64 imm_11_0, imm_31_12, imm_51_32, imm_63_52;
|
||||
|
|
|
|||
|
|
@ -31,11 +31,7 @@ $(obj)/xipImage: vmlinux FORCE
|
|||
|
||||
endif
|
||||
|
||||
ifdef CONFIG_RELOCATABLE
|
||||
$(obj)/Image: vmlinux.unstripped FORCE
|
||||
else
|
||||
$(obj)/Image: vmlinux FORCE
|
||||
endif
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
$(obj)/Image.gz: $(obj)/Image FORCE
|
||||
|
|
|
|||
|
|
@ -55,7 +55,6 @@ CONFIG_DEVTMPFS_MOUNT=y
|
|||
# CONFIG_HW_RANDOM is not set
|
||||
# CONFIG_DEVMEM is not set
|
||||
CONFIG_I2C=y
|
||||
# CONFIG_I2C_COMPAT is not set
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
# CONFIG_I2C_HELPER_AUTO is not set
|
||||
CONFIG_I2C_DESIGNWARE_CORE=y
|
||||
|
|
@ -89,7 +88,6 @@ CONFIG_PRINTK_TIME=y
|
|||
# CONFIG_FRAME_POINTER is not set
|
||||
# CONFIG_DEBUG_MISC is not set
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_RCU_TRACE is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_RUNTIME_TESTING_MENU is not set
|
||||
|
|
|
|||
|
|
@ -86,7 +86,6 @@ CONFIG_PRINTK_TIME=y
|
|||
# CONFIG_FRAME_POINTER is not set
|
||||
# CONFIG_DEBUG_MISC is not set
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_RCU_TRACE is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_RUNTIME_TESTING_MENU is not set
|
||||
|
|
|
|||
|
|
@ -66,7 +66,6 @@ CONFIG_EXT2_FS=y
|
|||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_LSM="[]"
|
||||
CONFIG_PRINTK_TIME=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_RCU_TRACE is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_RUNTIME_TESTING_MENU is not set
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@
|
|||
#endif /* _LINUX_BITOPS_H */
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/irqflags.h>
|
||||
#include <asm/barrier.h>
|
||||
#include <asm/bitsperlong.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -124,10 +124,6 @@
|
|||
#ifdef CONFIG_64BIT
|
||||
#include <asm/pgtable-64.h>
|
||||
|
||||
#define VA_USER_SV39 (UL(1) << (VA_BITS_SV39 - 1))
|
||||
#define VA_USER_SV48 (UL(1) << (VA_BITS_SV48 - 1))
|
||||
#define VA_USER_SV57 (UL(1) << (VA_BITS_SV57 - 1))
|
||||
|
||||
#define MMAP_VA_BITS_64 ((VA_BITS >= VA_BITS_SV48) ? VA_BITS_SV48 : VA_BITS)
|
||||
#define MMAP_MIN_VA_BITS_64 (VA_BITS_SV39)
|
||||
#define MMAP_VA_BITS (is_compat_task() ? VA_BITS_SV32 : MMAP_VA_BITS_64)
|
||||
|
|
|
|||
|
|
@ -3,12 +3,6 @@
|
|||
# Makefile for the RISC-V Linux kernel
|
||||
#
|
||||
|
||||
ifdef CONFIG_FTRACE
|
||||
CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_patch.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_return_address.o = $(CC_FLAGS_FTRACE)
|
||||
endif
|
||||
CFLAGS_syscall_table.o += $(call cc-disable-warning, override-init)
|
||||
CFLAGS_compat_syscall_table.o += $(call cc-disable-warning, override-init)
|
||||
|
||||
|
|
@ -24,7 +18,6 @@ CFLAGS_sbi_ecall.o := -mcmodel=medany
|
|||
ifdef CONFIG_FTRACE
|
||||
CFLAGS_REMOVE_alternative.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_cpufeature.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_sbi_ecall.o = $(CC_FLAGS_FTRACE)
|
||||
endif
|
||||
ifdef CONFIG_RELOCATABLE
|
||||
CFLAGS_alternative.o += -fno-pie
|
||||
|
|
@ -43,6 +36,14 @@ CFLAGS_sbi_ecall.o += -D__NO_FORTIFY
|
|||
endif
|
||||
endif
|
||||
|
||||
ifdef CONFIG_FTRACE
|
||||
CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_patch.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_return_address.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_sbi_ecall.o = $(CC_FLAGS_FTRACE)
|
||||
endif
|
||||
|
||||
always-$(KBUILD_BUILTIN) += vmlinux.lds
|
||||
|
||||
obj-y += head.o
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ static void sbi_cpu_stop(void)
|
|||
int ret;
|
||||
|
||||
ret = sbi_hsm_hart_stop();
|
||||
pr_crit("Unable to stop the cpu %u (%d)\n", smp_processor_id(), ret);
|
||||
pr_crit("Unable to stop the cpu %d (%d)\n", smp_processor_id(), ret);
|
||||
}
|
||||
|
||||
static int sbi_cpu_is_stopped(unsigned int cpuid)
|
||||
|
|
|
|||
|
|
@ -301,23 +301,22 @@ static const unsigned int riscv_a_exts[] = {
|
|||
RISCV_ISA_EXT_ZALRSC,
|
||||
};
|
||||
|
||||
#define RISCV_ISA_EXT_ZKN \
|
||||
RISCV_ISA_EXT_ZBKB, \
|
||||
RISCV_ISA_EXT_ZBKC, \
|
||||
RISCV_ISA_EXT_ZBKX, \
|
||||
RISCV_ISA_EXT_ZKND, \
|
||||
RISCV_ISA_EXT_ZKNE, \
|
||||
RISCV_ISA_EXT_ZKNH
|
||||
|
||||
static const unsigned int riscv_zk_bundled_exts[] = {
|
||||
RISCV_ISA_EXT_ZBKB,
|
||||
RISCV_ISA_EXT_ZBKC,
|
||||
RISCV_ISA_EXT_ZBKX,
|
||||
RISCV_ISA_EXT_ZKND,
|
||||
RISCV_ISA_EXT_ZKNE,
|
||||
RISCV_ISA_EXT_ZKN,
|
||||
RISCV_ISA_EXT_ZKR,
|
||||
RISCV_ISA_EXT_ZKT,
|
||||
RISCV_ISA_EXT_ZKT
|
||||
};
|
||||
|
||||
static const unsigned int riscv_zkn_bundled_exts[] = {
|
||||
RISCV_ISA_EXT_ZBKB,
|
||||
RISCV_ISA_EXT_ZBKC,
|
||||
RISCV_ISA_EXT_ZBKX,
|
||||
RISCV_ISA_EXT_ZKND,
|
||||
RISCV_ISA_EXT_ZKNE,
|
||||
RISCV_ISA_EXT_ZKNH,
|
||||
RISCV_ISA_EXT_ZKN
|
||||
};
|
||||
|
||||
static const unsigned int riscv_zks_bundled_exts[] = {
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ static int image_probe(const char *kernel_buf, unsigned long kernel_len)
|
|||
if (!h || kernel_len < sizeof(*h))
|
||||
return -EINVAL;
|
||||
|
||||
/* According to Documentation/riscv/boot-image-header.rst,
|
||||
/* According to Documentation/arch/riscv/boot-image-header.rst,
|
||||
* use "magic2" field to check when version >= 0.2.
|
||||
*/
|
||||
|
||||
|
|
|
|||
|
|
@ -181,6 +181,7 @@ SYM_FUNC_END(test_kprobes_c_bnez)
|
|||
|
||||
#endif /* CONFIG_RISCV_ISA_C */
|
||||
|
||||
.section .rodata
|
||||
SYM_DATA_START(test_kprobes_addresses)
|
||||
RISCV_PTR test_kprobes_add_addr1
|
||||
RISCV_PTR test_kprobes_add_addr2
|
||||
|
|
@ -212,6 +213,7 @@ SYM_DATA_START(test_kprobes_addresses)
|
|||
RISCV_PTR 0
|
||||
SYM_DATA_END(test_kprobes_addresses)
|
||||
|
||||
.section .rodata
|
||||
SYM_DATA_START(test_kprobes_functions)
|
||||
RISCV_PTR test_kprobes_add
|
||||
RISCV_PTR test_kprobes_jal
|
||||
|
|
|
|||
|
|
@ -339,8 +339,10 @@ void do_trap_ecall_u(struct pt_regs *regs)
|
|||
|
||||
add_random_kstack_offset();
|
||||
|
||||
if (syscall >= 0 && syscall < NR_syscalls)
|
||||
if (syscall >= 0 && syscall < NR_syscalls) {
|
||||
syscall = array_index_nospec(syscall, NR_syscalls);
|
||||
syscall_handler(regs, syscall);
|
||||
}
|
||||
|
||||
/*
|
||||
* Ultimately, this value will get limited by KSTACK_OFFSET_MAX(),
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
* Heavily based on the x86 and PowerPC implementations.
|
||||
*
|
||||
* x86:
|
||||
* Copyright (C) 2008 Thomas Gleixner <tglx@linutronix.de>
|
||||
* Copyright (C) 2008 Linutronix GmbH, Thomas Gleixner <tglx@kernel.org>
|
||||
* Copyright (C) 2008-2009 Red Hat, Inc., Ingo Molnar
|
||||
* Copyright (C) 2009 Jaswinder Singh Rajput
|
||||
* Copyright (C) 2009 Advanced Micro Devices, Inc., Robert Richter
|
||||
|
|
|
|||
|
|
@ -181,6 +181,28 @@ static int __init ofpci_debug(char *str)
|
|||
|
||||
__setup("ofpci_debug=", ofpci_debug);
|
||||
|
||||
static void of_fixup_pci_pref(struct pci_dev *dev, int index,
|
||||
struct resource *res)
|
||||
{
|
||||
struct pci_bus_region region;
|
||||
|
||||
if (!(res->flags & IORESOURCE_MEM_64))
|
||||
return;
|
||||
|
||||
if (!resource_size(res))
|
||||
return;
|
||||
|
||||
pcibios_resource_to_bus(dev->bus, ®ion, res);
|
||||
if (region.end <= ~((u32)0))
|
||||
return;
|
||||
|
||||
if (!(res->flags & IORESOURCE_PREFETCH)) {
|
||||
res->flags |= IORESOURCE_PREFETCH;
|
||||
pci_info(dev, "reg 0x%x: fixup: pref added to 64-bit resource\n",
|
||||
index);
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned long pci_parse_of_flags(u32 addr0)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
|
@ -244,6 +266,7 @@ static void pci_parse_of_addrs(struct platform_device *op,
|
|||
res->end = op_res->end;
|
||||
res->flags = flags;
|
||||
res->name = pci_name(dev);
|
||||
of_fixup_pci_pref(dev, i, res);
|
||||
|
||||
pci_info(dev, "reg 0x%x: %pR\n", i, res);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
* This code is based almost entirely upon the x86 perf event
|
||||
* code, which is:
|
||||
*
|
||||
* Copyright (C) 2008 Thomas Gleixner <tglx@linutronix.de>
|
||||
* Copyright (C) 2008 Linutronix GmbH, Thomas Gleixner <tglx@kernel.org>
|
||||
* Copyright (C) 2008-2009 Red Hat, Inc., Ingo Molnar
|
||||
* Copyright (C) 2009 Jaswinder Singh Rajput
|
||||
* Copyright (C) 2009 Advanced Micro Devices, Inc., Robert Richter
|
||||
|
|
|
|||
|
|
@ -8,3 +8,5 @@ UBSAN_SANITIZE_noinstr.o := n
|
|||
# GCC may fail to respect __no_sanitize_address or __no_kcsan when inlining
|
||||
KASAN_SANITIZE_noinstr.o := n
|
||||
KCSAN_SANITIZE_noinstr.o := n
|
||||
|
||||
GCOV_PROFILE_noinstr.o := n
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Performance events x86 architecture code
|
||||
*
|
||||
* Copyright (C) 2008 Thomas Gleixner <tglx@linutronix.de>
|
||||
* Copyright (C) 2008 Linutronix GmbH, Thomas Gleixner <tglx@kernel.org>
|
||||
* Copyright (C) 2008-2009 Red Hat, Inc., Ingo Molnar
|
||||
* Copyright (C) 2009 Jaswinder Singh Rajput
|
||||
* Copyright (C) 2009 Advanced Micro Devices, Inc., Robert Richter
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Performance events x86 architecture header
|
||||
*
|
||||
* Copyright (C) 2008 Thomas Gleixner <tglx@linutronix.de>
|
||||
* Copyright (C) 2008 Linutronix GmbH, Thomas Gleixner <tglx@kernel.org>
|
||||
* Copyright (C) 2008-2009 Red Hat, Inc., Ingo Molnar
|
||||
* Copyright (C) 2009 Jaswinder Singh Rajput
|
||||
* Copyright (C) 2009 Advanced Micro Devices, Inc., Robert Richter
|
||||
|
|
|
|||
|
|
@ -258,7 +258,7 @@ static bool cpu_has_entrysign(void)
|
|||
if (fam == 0x1a) {
|
||||
if (model <= 0x2f ||
|
||||
(0x40 <= model && model <= 0x4f) ||
|
||||
(0x60 <= model && model <= 0x6f))
|
||||
(0x60 <= model && model <= 0x7f))
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2009 Thomas Gleixner <tglx@linutronix.de>
|
||||
* Copyright (C) 2009 Linutronix GmbH, Thomas Gleixner <tglx@kernel.org>
|
||||
*
|
||||
* For licencing details see kernel-base/COPYING
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* Signed-off-by: Michael Schwarz <michael.schwarz@iaik.tugraz.at>
|
||||
*
|
||||
* Major changes to the original code by: Dave Hansen <dave.hansen@intel.com>
|
||||
* Mostly rewritten by Thomas Gleixner <tglx@linutronix.de> and
|
||||
* Mostly rewritten by Thomas Gleixner <tglx@kernel.org> and
|
||||
* Andy Lutomirsky <luto@amacapital.net>
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
|
|
|
|||
|
|
@ -380,7 +380,7 @@ static void bfqg_stats_add_aux(struct bfqg_stats *to, struct bfqg_stats *from)
|
|||
blkg_rwstat_add_aux(&to->merged, &from->merged);
|
||||
blkg_rwstat_add_aux(&to->service_time, &from->service_time);
|
||||
blkg_rwstat_add_aux(&to->wait_time, &from->wait_time);
|
||||
bfq_stat_add_aux(&from->time, &from->time);
|
||||
bfq_stat_add_aux(&to->time, &from->time);
|
||||
bfq_stat_add_aux(&to->avg_queue_size_sum, &from->avg_queue_size_sum);
|
||||
bfq_stat_add_aux(&to->avg_queue_size_samples,
|
||||
&from->avg_queue_size_samples);
|
||||
|
|
|
|||
|
|
@ -984,7 +984,7 @@ struct bfq_group_data {
|
|||
* unused for the root group. Used to know whether there
|
||||
* are groups with more than one active @bfq_entity
|
||||
* (see the comments to the function
|
||||
* bfq_bfqq_may_idle()).
|
||||
* bfq_better_to_idle()).
|
||||
* @rq_pos_tree: rbtree sorted by next_request position, used when
|
||||
* determining if two or more queues have interleaving
|
||||
* requests (see bfq_find_close_cooperator()).
|
||||
|
|
|
|||
|
|
@ -140,14 +140,21 @@ EXPORT_SYMBOL_GPL(blk_rq_integrity_map_user);
|
|||
bool blk_integrity_merge_rq(struct request_queue *q, struct request *req,
|
||||
struct request *next)
|
||||
{
|
||||
struct bio_integrity_payload *bip, *bip_next;
|
||||
|
||||
if (blk_integrity_rq(req) == 0 && blk_integrity_rq(next) == 0)
|
||||
return true;
|
||||
|
||||
if (blk_integrity_rq(req) == 0 || blk_integrity_rq(next) == 0)
|
||||
return false;
|
||||
|
||||
if (bio_integrity(req->bio)->bip_flags !=
|
||||
bio_integrity(next->bio)->bip_flags)
|
||||
bip = bio_integrity(req->bio);
|
||||
bip_next = bio_integrity(next->bio);
|
||||
if (bip->bip_flags != bip_next->bip_flags)
|
||||
return false;
|
||||
|
||||
if (bip->bip_flags & BIP_CHECK_APPTAG &&
|
||||
bip->app_tag != bip_next->app_tag)
|
||||
return false;
|
||||
|
||||
if (req->nr_integrity_segments + next->nr_integrity_segments >
|
||||
|
|
@ -163,15 +170,21 @@ bool blk_integrity_merge_rq(struct request_queue *q, struct request *req,
|
|||
bool blk_integrity_merge_bio(struct request_queue *q, struct request *req,
|
||||
struct bio *bio)
|
||||
{
|
||||
struct bio_integrity_payload *bip, *bip_bio = bio_integrity(bio);
|
||||
int nr_integrity_segs;
|
||||
|
||||
if (blk_integrity_rq(req) == 0 && bio_integrity(bio) == NULL)
|
||||
if (blk_integrity_rq(req) == 0 && bip_bio == NULL)
|
||||
return true;
|
||||
|
||||
if (blk_integrity_rq(req) == 0 || bio_integrity(bio) == NULL)
|
||||
if (blk_integrity_rq(req) == 0 || bip_bio == NULL)
|
||||
return false;
|
||||
|
||||
if (bio_integrity(req->bio)->bip_flags != bio_integrity(bio)->bip_flags)
|
||||
bip = bio_integrity(req->bio);
|
||||
if (bip->bip_flags != bip_bio->bip_flags)
|
||||
return false;
|
||||
|
||||
if (bip->bip_flags & BIP_CHECK_APPTAG &&
|
||||
bip->app_tag != bip_bio->app_tag)
|
||||
return false;
|
||||
|
||||
nr_integrity_segs = blk_rq_count_integrity_sg(q, bio);
|
||||
|
|
|
|||
|
|
@ -3721,7 +3721,7 @@ static int blk_mq_hctx_notify_offline(unsigned int cpu, struct hlist_node *node)
|
|||
struct blk_mq_hw_ctx, cpuhp_online);
|
||||
int ret = 0;
|
||||
|
||||
if (blk_mq_hctx_has_online_cpu(hctx, cpu))
|
||||
if (!hctx->nr_ctx || blk_mq_hctx_has_online_cpu(hctx, cpu))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
|
|
@ -4553,8 +4553,7 @@ static void __blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set,
|
|||
* Make sure reading the old queue_hw_ctx from other
|
||||
* context concurrently won't trigger uaf.
|
||||
*/
|
||||
synchronize_rcu_expedited();
|
||||
kfree(hctxs);
|
||||
kfree_rcu_mightsleep(hctxs);
|
||||
hctxs = new_hctxs;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -112,29 +112,26 @@ void __rq_qos_queue_depth_changed(struct rq_qos *rqos);
|
|||
|
||||
static inline void rq_qos_cleanup(struct request_queue *q, struct bio *bio)
|
||||
{
|
||||
if (unlikely(test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags)) &&
|
||||
q->rq_qos)
|
||||
if (test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags) && q->rq_qos)
|
||||
__rq_qos_cleanup(q->rq_qos, bio);
|
||||
}
|
||||
|
||||
static inline void rq_qos_done(struct request_queue *q, struct request *rq)
|
||||
{
|
||||
if (unlikely(test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags)) &&
|
||||
q->rq_qos && !blk_rq_is_passthrough(rq))
|
||||
if (test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags) &&
|
||||
q->rq_qos && !blk_rq_is_passthrough(rq))
|
||||
__rq_qos_done(q->rq_qos, rq);
|
||||
}
|
||||
|
||||
static inline void rq_qos_issue(struct request_queue *q, struct request *rq)
|
||||
{
|
||||
if (unlikely(test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags)) &&
|
||||
q->rq_qos)
|
||||
if (test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags) && q->rq_qos)
|
||||
__rq_qos_issue(q->rq_qos, rq);
|
||||
}
|
||||
|
||||
static inline void rq_qos_requeue(struct request_queue *q, struct request *rq)
|
||||
{
|
||||
if (unlikely(test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags)) &&
|
||||
q->rq_qos)
|
||||
if (test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags) && q->rq_qos)
|
||||
__rq_qos_requeue(q->rq_qos, rq);
|
||||
}
|
||||
|
||||
|
|
@ -162,8 +159,7 @@ static inline void rq_qos_done_bio(struct bio *bio)
|
|||
|
||||
static inline void rq_qos_throttle(struct request_queue *q, struct bio *bio)
|
||||
{
|
||||
if (unlikely(test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags)) &&
|
||||
q->rq_qos) {
|
||||
if (test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags) && q->rq_qos) {
|
||||
bio_set_flag(bio, BIO_QOS_THROTTLED);
|
||||
__rq_qos_throttle(q->rq_qos, bio);
|
||||
}
|
||||
|
|
@ -172,16 +168,14 @@ static inline void rq_qos_throttle(struct request_queue *q, struct bio *bio)
|
|||
static inline void rq_qos_track(struct request_queue *q, struct request *rq,
|
||||
struct bio *bio)
|
||||
{
|
||||
if (unlikely(test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags)) &&
|
||||
q->rq_qos)
|
||||
if (test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags) && q->rq_qos)
|
||||
__rq_qos_track(q->rq_qos, rq, bio);
|
||||
}
|
||||
|
||||
static inline void rq_qos_merge(struct request_queue *q, struct request *rq,
|
||||
struct bio *bio)
|
||||
{
|
||||
if (unlikely(test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags)) &&
|
||||
q->rq_qos) {
|
||||
if (test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags) && q->rq_qos) {
|
||||
bio_set_flag(bio, BIO_QOS_MERGED);
|
||||
__rq_qos_merge(q->rq_qos, rq, bio);
|
||||
}
|
||||
|
|
@ -189,8 +183,7 @@ static inline void rq_qos_merge(struct request_queue *q, struct request *rq,
|
|||
|
||||
static inline void rq_qos_queue_depth_changed(struct request_queue *q)
|
||||
{
|
||||
if (unlikely(test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags)) &&
|
||||
q->rq_qos)
|
||||
if (test_bit(QUEUE_FLAG_QOS_ENABLED, &q->queue_flags) && q->rq_qos)
|
||||
__rq_qos_queue_depth_changed(q->rq_qos);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ static int seqiv_aead_encrypt(struct aead_request *req)
|
|||
struct aead_geniv_ctx *ctx = crypto_aead_ctx(geniv);
|
||||
struct aead_request *subreq = aead_request_ctx(req);
|
||||
crypto_completion_t compl;
|
||||
bool unaligned_info;
|
||||
void *data;
|
||||
u8 *info;
|
||||
unsigned int ivsize = 8;
|
||||
|
|
@ -68,8 +69,9 @@ static int seqiv_aead_encrypt(struct aead_request *req)
|
|||
memcpy_sglist(req->dst, req->src,
|
||||
req->assoclen + req->cryptlen);
|
||||
|
||||
if (unlikely(!IS_ALIGNED((unsigned long)info,
|
||||
crypto_aead_alignmask(geniv) + 1))) {
|
||||
unaligned_info = !IS_ALIGNED((unsigned long)info,
|
||||
crypto_aead_alignmask(geniv) + 1);
|
||||
if (unlikely(unaligned_info)) {
|
||||
info = kmemdup(req->iv, ivsize, req->base.flags &
|
||||
CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL :
|
||||
GFP_ATOMIC);
|
||||
|
|
@ -89,7 +91,7 @@ static int seqiv_aead_encrypt(struct aead_request *req)
|
|||
scatterwalk_map_and_copy(info, req->dst, req->assoclen, ivsize, 1);
|
||||
|
||||
err = crypto_aead_encrypt(subreq);
|
||||
if (unlikely(info != req->iv))
|
||||
if (unlikely(unaligned_info))
|
||||
seqiv_aead_encrypt_complete2(req, err);
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@ static int acpi_pci_irq_check_entry(acpi_handle handle, struct pci_dev *dev,
|
|||
* the IRQ value, which is hardwired to specific interrupt inputs on
|
||||
* the interrupt controller.
|
||||
*/
|
||||
pr_debug("%04x:%02x:%02x[%c] -> %s[%d]\n",
|
||||
pr_debug("%04x:%02x:%02x[%c] -> %s[%u]\n",
|
||||
entry->id.segment, entry->id.bus, entry->id.device,
|
||||
pin_name(entry->pin), prt->source, entry->index);
|
||||
|
||||
|
|
@ -384,7 +384,7 @@ static inline bool acpi_pci_irq_valid(struct pci_dev *dev, u8 pin)
|
|||
int acpi_pci_irq_enable(struct pci_dev *dev)
|
||||
{
|
||||
struct acpi_prt_entry *entry;
|
||||
int gsi;
|
||||
u32 gsi;
|
||||
u8 pin;
|
||||
int triggering = ACPI_LEVEL_SENSITIVE;
|
||||
/*
|
||||
|
|
@ -422,18 +422,21 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
rc = -ENODEV;
|
||||
|
||||
if (entry) {
|
||||
if (entry->link)
|
||||
gsi = acpi_pci_link_allocate_irq(entry->link,
|
||||
rc = acpi_pci_link_allocate_irq(entry->link,
|
||||
entry->index,
|
||||
&triggering, &polarity,
|
||||
&link);
|
||||
else
|
||||
&link, &gsi);
|
||||
else {
|
||||
gsi = entry->index;
|
||||
} else
|
||||
gsi = -1;
|
||||
rc = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (gsi < 0) {
|
||||
if (rc < 0) {
|
||||
/*
|
||||
* No IRQ known to the ACPI subsystem - maybe the BIOS /
|
||||
* driver reported one, then use it. Exit in any case.
|
||||
|
|
|
|||
|
|
@ -448,7 +448,7 @@ static int acpi_isa_irq_penalty[ACPI_MAX_ISA_IRQS] = {
|
|||
/* >IRQ15 */
|
||||
};
|
||||
|
||||
static int acpi_irq_pci_sharing_penalty(int irq)
|
||||
static int acpi_irq_pci_sharing_penalty(u32 irq)
|
||||
{
|
||||
struct acpi_pci_link *link;
|
||||
int penalty = 0;
|
||||
|
|
@ -474,7 +474,7 @@ static int acpi_irq_pci_sharing_penalty(int irq)
|
|||
return penalty;
|
||||
}
|
||||
|
||||
static int acpi_irq_get_penalty(int irq)
|
||||
static int acpi_irq_get_penalty(u32 irq)
|
||||
{
|
||||
int penalty = 0;
|
||||
|
||||
|
|
@ -528,7 +528,7 @@ static int acpi_irq_balance = -1; /* 0: static, 1: balance */
|
|||
static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
||||
{
|
||||
acpi_handle handle = link->device->handle;
|
||||
int irq;
|
||||
u32 irq;
|
||||
int i;
|
||||
|
||||
if (link->irq.initialized) {
|
||||
|
|
@ -598,44 +598,53 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* acpi_pci_link_allocate_irq
|
||||
* success: return IRQ >= 0
|
||||
* failure: return -1
|
||||
/**
|
||||
* acpi_pci_link_allocate_irq(): Retrieve a link device GSI
|
||||
*
|
||||
* @handle: Handle for the link device
|
||||
* @index: GSI index
|
||||
* @triggering: pointer to store the GSI trigger
|
||||
* @polarity: pointer to store GSI polarity
|
||||
* @name: pointer to store link device name
|
||||
* @gsi: pointer to store GSI number
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success with @triggering, @polarity, @name, @gsi initialized.
|
||||
* -ENODEV on failure
|
||||
*/
|
||||
int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
|
||||
int *polarity, char **name)
|
||||
int *polarity, char **name, u32 *gsi)
|
||||
{
|
||||
struct acpi_device *device = acpi_fetch_acpi_dev(handle);
|
||||
struct acpi_pci_link *link;
|
||||
|
||||
if (!device) {
|
||||
acpi_handle_err(handle, "Invalid link device\n");
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
link = acpi_driver_data(device);
|
||||
if (!link) {
|
||||
acpi_handle_err(handle, "Invalid link context\n");
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* TBD: Support multiple index (IRQ) entries per Link Device */
|
||||
if (index) {
|
||||
acpi_handle_err(handle, "Invalid index %d\n", index);
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
mutex_lock(&acpi_link_lock);
|
||||
if (acpi_pci_link_allocate(link)) {
|
||||
mutex_unlock(&acpi_link_lock);
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!link->irq.active) {
|
||||
mutex_unlock(&acpi_link_lock);
|
||||
acpi_handle_err(handle, "Link active IRQ is 0!\n");
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
link->refcnt++;
|
||||
mutex_unlock(&acpi_link_lock);
|
||||
|
|
@ -647,7 +656,9 @@ int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
|
|||
if (name)
|
||||
*name = acpi_device_bid(link->device);
|
||||
acpi_handle_debug(handle, "Link is referenced\n");
|
||||
return link->irq.active;
|
||||
*gsi = link->irq.active;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -727,8 +727,5 @@ fn drop(self: Pin<&mut Self>) {
|
|||
drop(mm);
|
||||
drop(page);
|
||||
|
||||
// SAFETY: We just unlocked the lru lock, but it should be locked when we return.
|
||||
unsafe { bindings::spin_lock(&raw mut (*lru).lock) };
|
||||
|
||||
LRU_REMOVED_ENTRY
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1587,7 +1587,8 @@ he_stop(struct he_dev *he_dev)
|
|||
he_dev->tbrq_base, he_dev->tbrq_phys);
|
||||
|
||||
if (he_dev->tpdrq_base)
|
||||
dma_free_coherent(&he_dev->pci_dev->dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq),
|
||||
dma_free_coherent(&he_dev->pci_dev->dev,
|
||||
CONFIG_TPDRQ_SIZE * sizeof(struct he_tpdrq),
|
||||
he_dev->tpdrq_base, he_dev->tpdrq_phys);
|
||||
|
||||
dma_pool_destroy(he_dev->tpd_pool);
|
||||
|
|
|
|||
|
|
@ -1225,16 +1225,28 @@ static int loop_clr_fd(struct loop_device *lo)
|
|||
}
|
||||
|
||||
static int
|
||||
loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
|
||||
loop_set_status(struct loop_device *lo, blk_mode_t mode,
|
||||
struct block_device *bdev, const struct loop_info64 *info)
|
||||
{
|
||||
int err;
|
||||
bool partscan = false;
|
||||
bool size_changed = false;
|
||||
unsigned int memflags;
|
||||
|
||||
/*
|
||||
* If we don't hold exclusive handle for the device, upgrade to it
|
||||
* here to avoid changing device under exclusive owner.
|
||||
*/
|
||||
if (!(mode & BLK_OPEN_EXCL)) {
|
||||
err = bd_prepare_to_claim(bdev, loop_set_status, NULL);
|
||||
if (err)
|
||||
goto out_reread_partitions;
|
||||
}
|
||||
|
||||
err = mutex_lock_killable(&lo->lo_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
goto out_abort_claiming;
|
||||
|
||||
if (lo->lo_state != Lo_bound) {
|
||||
err = -ENXIO;
|
||||
goto out_unlock;
|
||||
|
|
@ -1273,6 +1285,10 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
|
|||
}
|
||||
out_unlock:
|
||||
mutex_unlock(&lo->lo_mutex);
|
||||
out_abort_claiming:
|
||||
if (!(mode & BLK_OPEN_EXCL))
|
||||
bd_abort_claiming(bdev, loop_set_status);
|
||||
out_reread_partitions:
|
||||
if (partscan)
|
||||
loop_reread_partitions(lo);
|
||||
|
||||
|
|
@ -1352,7 +1368,9 @@ loop_info64_to_old(const struct loop_info64 *info64, struct loop_info *info)
|
|||
}
|
||||
|
||||
static int
|
||||
loop_set_status_old(struct loop_device *lo, const struct loop_info __user *arg)
|
||||
loop_set_status_old(struct loop_device *lo, blk_mode_t mode,
|
||||
struct block_device *bdev,
|
||||
const struct loop_info __user *arg)
|
||||
{
|
||||
struct loop_info info;
|
||||
struct loop_info64 info64;
|
||||
|
|
@ -1360,17 +1378,19 @@ loop_set_status_old(struct loop_device *lo, const struct loop_info __user *arg)
|
|||
if (copy_from_user(&info, arg, sizeof (struct loop_info)))
|
||||
return -EFAULT;
|
||||
loop_info64_from_old(&info, &info64);
|
||||
return loop_set_status(lo, &info64);
|
||||
return loop_set_status(lo, mode, bdev, &info64);
|
||||
}
|
||||
|
||||
static int
|
||||
loop_set_status64(struct loop_device *lo, const struct loop_info64 __user *arg)
|
||||
loop_set_status64(struct loop_device *lo, blk_mode_t mode,
|
||||
struct block_device *bdev,
|
||||
const struct loop_info64 __user *arg)
|
||||
{
|
||||
struct loop_info64 info64;
|
||||
|
||||
if (copy_from_user(&info64, arg, sizeof (struct loop_info64)))
|
||||
return -EFAULT;
|
||||
return loop_set_status(lo, &info64);
|
||||
return loop_set_status(lo, mode, bdev, &info64);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -1549,14 +1569,14 @@ static int lo_ioctl(struct block_device *bdev, blk_mode_t mode,
|
|||
case LOOP_SET_STATUS:
|
||||
err = -EPERM;
|
||||
if ((mode & BLK_OPEN_WRITE) || capable(CAP_SYS_ADMIN))
|
||||
err = loop_set_status_old(lo, argp);
|
||||
err = loop_set_status_old(lo, mode, bdev, argp);
|
||||
break;
|
||||
case LOOP_GET_STATUS:
|
||||
return loop_get_status_old(lo, argp);
|
||||
case LOOP_SET_STATUS64:
|
||||
err = -EPERM;
|
||||
if ((mode & BLK_OPEN_WRITE) || capable(CAP_SYS_ADMIN))
|
||||
err = loop_set_status64(lo, argp);
|
||||
err = loop_set_status64(lo, mode, bdev, argp);
|
||||
break;
|
||||
case LOOP_GET_STATUS64:
|
||||
return loop_get_status64(lo, argp);
|
||||
|
|
@ -1650,8 +1670,9 @@ loop_info64_to_compat(const struct loop_info64 *info64,
|
|||
}
|
||||
|
||||
static int
|
||||
loop_set_status_compat(struct loop_device *lo,
|
||||
const struct compat_loop_info __user *arg)
|
||||
loop_set_status_compat(struct loop_device *lo, blk_mode_t mode,
|
||||
struct block_device *bdev,
|
||||
const struct compat_loop_info __user *arg)
|
||||
{
|
||||
struct loop_info64 info64;
|
||||
int ret;
|
||||
|
|
@ -1659,7 +1680,7 @@ loop_set_status_compat(struct loop_device *lo,
|
|||
ret = loop_info64_from_compat(arg, &info64);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
return loop_set_status(lo, &info64);
|
||||
return loop_set_status(lo, mode, bdev, &info64);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -1685,7 +1706,7 @@ static int lo_compat_ioctl(struct block_device *bdev, blk_mode_t mode,
|
|||
|
||||
switch(cmd) {
|
||||
case LOOP_SET_STATUS:
|
||||
err = loop_set_status_compat(lo,
|
||||
err = loop_set_status_compat(lo, mode, bdev,
|
||||
(const struct compat_loop_info __user *)arg);
|
||||
break;
|
||||
case LOOP_GET_STATUS:
|
||||
|
|
|
|||
|
|
@ -237,6 +237,7 @@ struct ublk_device {
|
|||
bool canceling;
|
||||
pid_t ublksrv_tgid;
|
||||
struct delayed_work exit_work;
|
||||
struct work_struct partition_scan_work;
|
||||
|
||||
struct ublk_queue *queues[];
|
||||
};
|
||||
|
|
@ -1582,6 +1583,27 @@ static void ublk_put_disk(struct gendisk *disk)
|
|||
put_device(disk_to_dev(disk));
|
||||
}
|
||||
|
||||
static void ublk_partition_scan_work(struct work_struct *work)
|
||||
{
|
||||
struct ublk_device *ub =
|
||||
container_of(work, struct ublk_device, partition_scan_work);
|
||||
/* Hold disk reference to prevent UAF during concurrent teardown */
|
||||
struct gendisk *disk = ublk_get_disk(ub);
|
||||
|
||||
if (!disk)
|
||||
return;
|
||||
|
||||
if (WARN_ON_ONCE(!test_and_clear_bit(GD_SUPPRESS_PART_SCAN,
|
||||
&disk->state)))
|
||||
goto out;
|
||||
|
||||
mutex_lock(&disk->open_mutex);
|
||||
bdev_disk_changed(disk, false);
|
||||
mutex_unlock(&disk->open_mutex);
|
||||
out:
|
||||
ublk_put_disk(disk);
|
||||
}
|
||||
|
||||
/*
|
||||
* Use this function to ensure that ->canceling is consistently set for
|
||||
* the device and all queues. Do not set these flags directly.
|
||||
|
|
@ -2026,6 +2048,7 @@ static void ublk_stop_dev(struct ublk_device *ub)
|
|||
mutex_lock(&ub->mutex);
|
||||
ublk_stop_dev_unlocked(ub);
|
||||
mutex_unlock(&ub->mutex);
|
||||
cancel_work_sync(&ub->partition_scan_work);
|
||||
ublk_cancel_dev(ub);
|
||||
}
|
||||
|
||||
|
|
@ -2954,9 +2977,17 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub,
|
|||
|
||||
ublk_apply_params(ub);
|
||||
|
||||
/* don't probe partitions if any daemon task is un-trusted */
|
||||
if (ub->unprivileged_daemons)
|
||||
set_bit(GD_SUPPRESS_PART_SCAN, &disk->state);
|
||||
/*
|
||||
* Suppress partition scan to avoid potential IO hang.
|
||||
*
|
||||
* If ublk server error occurs during partition scan, the IO may
|
||||
* wait while holding ub->mutex, which can deadlock with other
|
||||
* operations that need the mutex. Defer partition scan to async
|
||||
* work.
|
||||
* For unprivileged daemons, keep GD_SUPPRESS_PART_SCAN set
|
||||
* permanently.
|
||||
*/
|
||||
set_bit(GD_SUPPRESS_PART_SCAN, &disk->state);
|
||||
|
||||
ublk_get_device(ub);
|
||||
ub->dev_info.state = UBLK_S_DEV_LIVE;
|
||||
|
|
@ -2973,6 +3004,10 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub,
|
|||
|
||||
set_bit(UB_STATE_USED, &ub->state);
|
||||
|
||||
/* Schedule async partition scan for trusted daemons */
|
||||
if (!ub->unprivileged_daemons)
|
||||
schedule_work(&ub->partition_scan_work);
|
||||
|
||||
out_put_cdev:
|
||||
if (ret) {
|
||||
ublk_detach_disk(ub);
|
||||
|
|
@ -3138,6 +3173,7 @@ static int ublk_ctrl_add_dev(const struct ublksrv_ctrl_cmd *header)
|
|||
mutex_init(&ub->mutex);
|
||||
spin_lock_init(&ub->lock);
|
||||
mutex_init(&ub->cancel_mutex);
|
||||
INIT_WORK(&ub->partition_scan_work, ublk_partition_scan_work);
|
||||
|
||||
ret = ublk_alloc_dev_number(ub, header->dev_id);
|
||||
if (ret < 0)
|
||||
|
|
|
|||
|
|
@ -4052,7 +4052,7 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL);
|
||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -4075,8 +4075,10 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
}
|
||||
}
|
||||
|
||||
if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep)
|
||||
if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep) {
|
||||
kfree(data);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (id->driver_info & BTUSB_AMP) {
|
||||
data->cmdreq_type = USB_TYPE_CLASS | 0x01;
|
||||
|
|
@ -4131,8 +4133,10 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
data->recv_acl = hci_recv_frame;
|
||||
|
||||
hdev = hci_alloc_dev_priv(priv_size);
|
||||
if (!hdev)
|
||||
if (!hdev) {
|
||||
kfree(data);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
hdev->bus = HCI_USB;
|
||||
hci_set_drvdata(hdev, data);
|
||||
|
|
@ -4406,6 +4410,7 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
if (data->reset_gpio)
|
||||
gpiod_put(data->reset_gpio);
|
||||
hci_free_dev(hdev);
|
||||
kfree(data);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -4454,6 +4459,7 @@ static void btusb_disconnect(struct usb_interface *intf)
|
|||
}
|
||||
|
||||
hci_free_dev(hdev);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
|
|
|||
|
|
@ -1192,6 +1192,7 @@ static irqreturn_t quad8_irq_handler(int irq, void *private)
|
|||
{
|
||||
struct counter_device *counter = private;
|
||||
struct quad8 *const priv = counter_priv(counter);
|
||||
struct device *dev = counter->parent;
|
||||
unsigned int status;
|
||||
unsigned long irq_status;
|
||||
unsigned long channel;
|
||||
|
|
@ -1200,8 +1201,11 @@ static irqreturn_t quad8_irq_handler(int irq, void *private)
|
|||
int ret;
|
||||
|
||||
ret = regmap_read(priv->map, QUAD8_INTERRUPT_STATUS, &status);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (ret) {
|
||||
dev_WARN_ONCE(dev, true,
|
||||
"Attempt to read Interrupt Status Register failed: %d\n", ret);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
if (!status)
|
||||
return IRQ_NONE;
|
||||
|
||||
|
|
@ -1223,8 +1227,9 @@ static irqreturn_t quad8_irq_handler(int irq, void *private)
|
|||
break;
|
||||
default:
|
||||
/* should never reach this path */
|
||||
WARN_ONCE(true, "invalid interrupt trigger function %u configured for channel %lu\n",
|
||||
flg_pins, channel);
|
||||
dev_WARN_ONCE(dev, true,
|
||||
"invalid interrupt trigger function %u configured for channel %lu\n",
|
||||
flg_pins, channel);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -1232,8 +1237,11 @@ static irqreturn_t quad8_irq_handler(int irq, void *private)
|
|||
}
|
||||
|
||||
ret = regmap_write(priv->map, QUAD8_CHANNEL_OPERATION, CLEAR_PENDING_INTERRUPTS);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (ret) {
|
||||
dev_WARN_ONCE(dev, true,
|
||||
"Attempt to clear pending interrupts by writing to Channel Operation Register failed: %d\n", ret);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -229,8 +229,7 @@ static int interrupt_cnt_probe(struct platform_device *pdev)
|
|||
|
||||
irq_set_status_flags(priv->irq, IRQ_NOAUTOEN);
|
||||
ret = devm_request_irq(dev, priv->irq, interrupt_cnt_isr,
|
||||
IRQF_TRIGGER_RISING | IRQF_NO_THREAD,
|
||||
dev_name(dev), counter);
|
||||
IRQF_TRIGGER_RISING, dev_name(dev), counter);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
|||
|
|
@ -991,7 +991,7 @@ static void qm_get_complete_eqe_num(struct hisi_qm *qm)
|
|||
return;
|
||||
poll_data = &qm->poll_data[cqn];
|
||||
|
||||
while (QM_EQE_PHASE(dw0) != qm->status.eqc_phase) {
|
||||
do {
|
||||
poll_data->qp_finish_id[eqe_num] = dw0 & QM_EQE_CQN_MASK;
|
||||
eqe_num++;
|
||||
|
||||
|
|
@ -1004,11 +1004,10 @@ static void qm_get_complete_eqe_num(struct hisi_qm *qm)
|
|||
qm->status.eq_head++;
|
||||
}
|
||||
|
||||
if (eqe_num == (eq_depth >> 1) - 1)
|
||||
break;
|
||||
|
||||
dw0 = le32_to_cpu(eqe->dw0);
|
||||
}
|
||||
if (QM_EQE_PHASE(dw0) != qm->status.eqc_phase)
|
||||
break;
|
||||
} while (eqe_num < (eq_depth >> 1) - 1);
|
||||
|
||||
poll_data->eqe_num = eqe_num;
|
||||
queue_work(qm->wq, &poll_data->work);
|
||||
|
|
|
|||
|
|
@ -41,8 +41,6 @@ static pci_ers_result_t adf_error_detected(struct pci_dev *pdev,
|
|||
adf_error_notifier(accel_dev);
|
||||
adf_pf2vf_notify_fatal_error(accel_dev);
|
||||
adf_dev_restarting_notify(accel_dev);
|
||||
adf_pf2vf_notify_restarting(accel_dev);
|
||||
adf_pf2vf_wait_for_restarting_complete(accel_dev);
|
||||
pci_clear_master(pdev);
|
||||
adf_dev_down(accel_dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/cleanup.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
|
|
@ -241,23 +242,17 @@ static int it87_gpio_direction_out(struct gpio_chip *chip,
|
|||
mask = 1 << (gpio_num % 8);
|
||||
group = (gpio_num / 8);
|
||||
|
||||
spin_lock(&it87_gpio->lock);
|
||||
guard(spinlock)(&it87_gpio->lock);
|
||||
|
||||
rc = superio_enter();
|
||||
if (rc)
|
||||
goto exit;
|
||||
return rc;
|
||||
|
||||
/* set the output enable bit */
|
||||
superio_set_mask(mask, group + it87_gpio->output_base);
|
||||
|
||||
rc = it87_gpio_set(chip, gpio_num, val);
|
||||
if (rc)
|
||||
goto exit;
|
||||
|
||||
superio_exit();
|
||||
|
||||
exit:
|
||||
spin_unlock(&it87_gpio->lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -548,6 +548,13 @@ static void gpio_mpsse_ida_remove(void *data)
|
|||
ida_free(&gpio_mpsse_ida, priv->id);
|
||||
}
|
||||
|
||||
static void gpio_mpsse_usb_put_dev(void *data)
|
||||
{
|
||||
struct mpsse_priv *priv = data;
|
||||
|
||||
usb_put_dev(priv->udev);
|
||||
}
|
||||
|
||||
static int mpsse_init_valid_mask(struct gpio_chip *chip,
|
||||
unsigned long *valid_mask,
|
||||
unsigned int ngpios)
|
||||
|
|
@ -592,6 +599,10 @@ static int gpio_mpsse_probe(struct usb_interface *interface,
|
|||
INIT_LIST_HEAD(&priv->workers);
|
||||
|
||||
priv->udev = usb_get_dev(interface_to_usbdev(interface));
|
||||
err = devm_add_action_or_reset(dev, gpio_mpsse_usb_put_dev, priv);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
priv->intf = interface;
|
||||
priv->intf_id = interface->cur_altsetting->desc.bInterfaceNumber;
|
||||
|
||||
|
|
@ -713,7 +724,6 @@ static void gpio_mpsse_disconnect(struct usb_interface *intf)
|
|||
|
||||
priv->intf = NULL;
|
||||
usb_set_intfdata(intf, NULL);
|
||||
usb_put_dev(priv->udev);
|
||||
}
|
||||
|
||||
static struct usb_driver gpio_mpsse_driver = {
|
||||
|
|
|
|||
|
|
@ -943,14 +943,35 @@ static bool pca953x_irq_pending(struct pca953x_chip *chip, unsigned long *pendin
|
|||
DECLARE_BITMAP(old_stat, MAX_LINE);
|
||||
DECLARE_BITMAP(cur_stat, MAX_LINE);
|
||||
DECLARE_BITMAP(new_stat, MAX_LINE);
|
||||
DECLARE_BITMAP(int_stat, MAX_LINE);
|
||||
DECLARE_BITMAP(trigger, MAX_LINE);
|
||||
DECLARE_BITMAP(edges, MAX_LINE);
|
||||
int ret;
|
||||
|
||||
if (chip->driver_data & PCA_PCAL) {
|
||||
/* Read INT_STAT before it is cleared by the input-port read. */
|
||||
ret = pca953x_read_regs(chip, PCAL953X_INT_STAT, int_stat);
|
||||
if (ret)
|
||||
return false;
|
||||
}
|
||||
|
||||
ret = pca953x_read_regs(chip, chip->regs->input, cur_stat);
|
||||
if (ret)
|
||||
return false;
|
||||
|
||||
if (chip->driver_data & PCA_PCAL) {
|
||||
/* Detect short pulses via INT_STAT. */
|
||||
bitmap_and(trigger, int_stat, chip->irq_mask, gc->ngpio);
|
||||
|
||||
/* Apply filter for rising/falling edge selection. */
|
||||
bitmap_replace(new_stat, chip->irq_trig_fall, chip->irq_trig_raise,
|
||||
cur_stat, gc->ngpio);
|
||||
|
||||
bitmap_and(int_stat, new_stat, trigger, gc->ngpio);
|
||||
} else {
|
||||
bitmap_zero(int_stat, gc->ngpio);
|
||||
}
|
||||
|
||||
/* Remove output pins from the equation */
|
||||
pca953x_read_regs(chip, chip->regs->direction, reg_direction);
|
||||
|
||||
|
|
@ -964,7 +985,8 @@ static bool pca953x_irq_pending(struct pca953x_chip *chip, unsigned long *pendin
|
|||
|
||||
if (bitmap_empty(chip->irq_trig_level_high, gc->ngpio) &&
|
||||
bitmap_empty(chip->irq_trig_level_low, gc->ngpio)) {
|
||||
if (bitmap_empty(trigger, gc->ngpio))
|
||||
if (bitmap_empty(trigger, gc->ngpio) &&
|
||||
bitmap_empty(int_stat, gc->ngpio))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -972,6 +994,7 @@ static bool pca953x_irq_pending(struct pca953x_chip *chip, unsigned long *pendin
|
|||
bitmap_and(old_stat, chip->irq_trig_raise, new_stat, gc->ngpio);
|
||||
bitmap_or(edges, old_stat, cur_stat, gc->ngpio);
|
||||
bitmap_and(pending, edges, trigger, gc->ngpio);
|
||||
bitmap_or(pending, pending, int_stat, gc->ngpio);
|
||||
|
||||
bitmap_and(cur_stat, new_stat, chip->irq_trig_level_high, gc->ngpio);
|
||||
bitmap_and(cur_stat, cur_stat, chip->irq_mask, gc->ngpio);
|
||||
|
|
|
|||
|
|
@ -593,6 +593,7 @@ static int rockchip_gpiolib_register(struct rockchip_pin_bank *bank)
|
|||
gc->ngpio = bank->nr_pins;
|
||||
gc->label = bank->name;
|
||||
gc->parent = bank->dev;
|
||||
gc->can_sleep = true;
|
||||
|
||||
ret = gpiochip_add_data(gc, bank);
|
||||
if (ret) {
|
||||
|
|
|
|||
|
|
@ -38,8 +38,10 @@ struct gpio_shared_ref {
|
|||
int dev_id;
|
||||
/* Protects the auxiliary device struct and the lookup table. */
|
||||
struct mutex lock;
|
||||
struct lock_class_key lock_key;
|
||||
struct auxiliary_device adev;
|
||||
struct gpiod_lookup_table *lookup;
|
||||
bool is_reset_gpio;
|
||||
};
|
||||
|
||||
/* Represents a single GPIO pin. */
|
||||
|
|
@ -76,6 +78,60 @@ gpio_shared_find_entry(struct fwnode_handle *controller_node,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static struct gpio_shared_ref *gpio_shared_make_ref(struct fwnode_handle *fwnode,
|
||||
const char *con_id,
|
||||
enum gpiod_flags flags)
|
||||
{
|
||||
char *con_id_cpy __free(kfree) = NULL;
|
||||
|
||||
struct gpio_shared_ref *ref __free(kfree) = kzalloc(sizeof(*ref), GFP_KERNEL);
|
||||
if (!ref)
|
||||
return NULL;
|
||||
|
||||
if (con_id) {
|
||||
con_id_cpy = kstrdup(con_id, GFP_KERNEL);
|
||||
if (!con_id_cpy)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ref->dev_id = ida_alloc(&gpio_shared_ida, GFP_KERNEL);
|
||||
if (ref->dev_id < 0)
|
||||
return NULL;
|
||||
|
||||
ref->flags = flags;
|
||||
ref->con_id = no_free_ptr(con_id_cpy);
|
||||
ref->fwnode = fwnode;
|
||||
lockdep_register_key(&ref->lock_key);
|
||||
mutex_init_with_key(&ref->lock, &ref->lock_key);
|
||||
|
||||
return no_free_ptr(ref);
|
||||
}
|
||||
|
||||
static int gpio_shared_setup_reset_proxy(struct gpio_shared_entry *entry,
|
||||
enum gpiod_flags flags)
|
||||
{
|
||||
struct gpio_shared_ref *ref;
|
||||
|
||||
list_for_each_entry(ref, &entry->refs, list) {
|
||||
if (ref->is_reset_gpio)
|
||||
/* Already set-up. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
ref = gpio_shared_make_ref(NULL, "reset", flags);
|
||||
if (!ref)
|
||||
return -ENOMEM;
|
||||
|
||||
ref->is_reset_gpio = true;
|
||||
|
||||
list_add_tail(&ref->list, &entry->refs);
|
||||
|
||||
pr_debug("Created a secondary shared GPIO reference for potential reset-gpio device for GPIO %u at %s\n",
|
||||
entry->offset, fwnode_get_name(entry->fwnode));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Handle all special nodes that we should ignore. */
|
||||
static bool gpio_shared_of_node_ignore(struct device_node *node)
|
||||
{
|
||||
|
|
@ -106,6 +162,7 @@ static int gpio_shared_of_traverse(struct device_node *curr)
|
|||
size_t con_id_len, suffix_len;
|
||||
struct fwnode_handle *fwnode;
|
||||
struct of_phandle_args args;
|
||||
struct gpio_shared_ref *ref;
|
||||
struct property *prop;
|
||||
unsigned int offset;
|
||||
const char *suffix;
|
||||
|
|
@ -138,6 +195,7 @@ static int gpio_shared_of_traverse(struct device_node *curr)
|
|||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct device_node *np __free(device_node) = NULL;
|
||||
char *con_id __free(kfree) = NULL;
|
||||
|
||||
ret = of_parse_phandle_with_args(curr, prop->name,
|
||||
"#gpio-cells", i,
|
||||
|
|
@ -182,15 +240,6 @@ static int gpio_shared_of_traverse(struct device_node *curr)
|
|||
list_add_tail(&entry->list, &gpio_shared_list);
|
||||
}
|
||||
|
||||
struct gpio_shared_ref *ref __free(kfree) =
|
||||
kzalloc(sizeof(*ref), GFP_KERNEL);
|
||||
if (!ref)
|
||||
return -ENOMEM;
|
||||
|
||||
ref->fwnode = fwnode_handle_get(of_fwnode_handle(curr));
|
||||
ref->flags = args.args[1];
|
||||
mutex_init(&ref->lock);
|
||||
|
||||
if (strends(prop->name, "gpios"))
|
||||
suffix = "-gpios";
|
||||
else if (strends(prop->name, "gpio"))
|
||||
|
|
@ -202,27 +251,32 @@ static int gpio_shared_of_traverse(struct device_node *curr)
|
|||
|
||||
/* We only set con_id if there's actually one. */
|
||||
if (strcmp(prop->name, "gpios") && strcmp(prop->name, "gpio")) {
|
||||
ref->con_id = kstrdup(prop->name, GFP_KERNEL);
|
||||
if (!ref->con_id)
|
||||
con_id = kstrdup(prop->name, GFP_KERNEL);
|
||||
if (!con_id)
|
||||
return -ENOMEM;
|
||||
|
||||
con_id_len = strlen(ref->con_id);
|
||||
con_id_len = strlen(con_id);
|
||||
suffix_len = strlen(suffix);
|
||||
|
||||
ref->con_id[con_id_len - suffix_len] = '\0';
|
||||
con_id[con_id_len - suffix_len] = '\0';
|
||||
}
|
||||
|
||||
ref->dev_id = ida_alloc(&gpio_shared_ida, GFP_KERNEL);
|
||||
if (ref->dev_id < 0) {
|
||||
kfree(ref->con_id);
|
||||
ref = gpio_shared_make_ref(fwnode_handle_get(of_fwnode_handle(curr)),
|
||||
con_id, args.args[1]);
|
||||
if (!ref)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (!list_empty(&entry->refs))
|
||||
pr_debug("GPIO %u at %s is shared by multiple firmware nodes\n",
|
||||
entry->offset, fwnode_get_name(entry->fwnode));
|
||||
|
||||
list_add_tail(&no_free_ptr(ref)->list, &entry->refs);
|
||||
list_add_tail(&ref->list, &entry->refs);
|
||||
|
||||
if (strcmp(prop->name, "reset-gpios") == 0) {
|
||||
ret = gpio_shared_setup_reset_proxy(entry, args.args[1]);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -306,20 +360,16 @@ static bool gpio_shared_dev_is_reset_gpio(struct device *consumer,
|
|||
struct fwnode_handle *reset_fwnode = dev_fwnode(consumer);
|
||||
struct fwnode_reference_args ref_args, aux_args;
|
||||
struct device *parent = consumer->parent;
|
||||
struct gpio_shared_ref *real_ref;
|
||||
bool match;
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&ref->lock);
|
||||
|
||||
/* The reset-gpio device must have a parent AND a firmware node. */
|
||||
if (!parent || !reset_fwnode)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* FIXME: use device_is_compatible() once the reset-gpio drivers gains
|
||||
* a compatible string which it currently does not have.
|
||||
*/
|
||||
if (!strstarts(dev_name(consumer), "reset.gpio."))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* Parent of the reset-gpio auxiliary device is the GPIO chip whose
|
||||
* fwnode we stored in the entry structure.
|
||||
|
|
@ -328,33 +378,61 @@ static bool gpio_shared_dev_is_reset_gpio(struct device *consumer,
|
|||
return false;
|
||||
|
||||
/*
|
||||
* The device associated with the shared reference's firmware node is
|
||||
* the consumer of the reset control exposed by the reset-gpio device.
|
||||
* It must have a "reset-gpios" property that's referencing the entry's
|
||||
* firmware node.
|
||||
*
|
||||
* The reference args must agree between the real consumer and the
|
||||
* auxiliary reset-gpio device.
|
||||
* Now we need to find the actual pin we want to assign to this
|
||||
* reset-gpio device. To that end: iterate over the list of references
|
||||
* of this entry and see if there's one, whose reset-gpios property's
|
||||
* arguments match the ones from this consumer's node.
|
||||
*/
|
||||
ret = fwnode_property_get_reference_args(ref->fwnode, "reset-gpios",
|
||||
NULL, 2, 0, &ref_args);
|
||||
if (ret)
|
||||
return false;
|
||||
list_for_each_entry(real_ref, &entry->refs, list) {
|
||||
if (real_ref == ref)
|
||||
continue;
|
||||
|
||||
guard(mutex)(&real_ref->lock);
|
||||
|
||||
if (!real_ref->fwnode)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* The device associated with the shared reference's firmware
|
||||
* node is the consumer of the reset control exposed by the
|
||||
* reset-gpio device. It must have a "reset-gpios" property
|
||||
* that's referencing the entry's firmware node.
|
||||
*
|
||||
* The reference args must agree between the real consumer and
|
||||
* the auxiliary reset-gpio device.
|
||||
*/
|
||||
ret = fwnode_property_get_reference_args(real_ref->fwnode,
|
||||
"reset-gpios",
|
||||
NULL, 2, 0, &ref_args);
|
||||
if (ret)
|
||||
continue;
|
||||
|
||||
ret = fwnode_property_get_reference_args(reset_fwnode, "reset-gpios",
|
||||
NULL, 2, 0, &aux_args);
|
||||
if (ret) {
|
||||
fwnode_handle_put(ref_args.fwnode);
|
||||
continue;
|
||||
}
|
||||
|
||||
match = ((ref_args.fwnode == entry->fwnode) &&
|
||||
(aux_args.fwnode == entry->fwnode) &&
|
||||
(ref_args.args[0] == aux_args.args[0]));
|
||||
|
||||
ret = fwnode_property_get_reference_args(reset_fwnode, "reset-gpios",
|
||||
NULL, 2, 0, &aux_args);
|
||||
if (ret) {
|
||||
fwnode_handle_put(ref_args.fwnode);
|
||||
return false;
|
||||
fwnode_handle_put(aux_args.fwnode);
|
||||
|
||||
if (!match)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Reuse the fwnode of the real device, next time we'll use it
|
||||
* in the normal path.
|
||||
*/
|
||||
ref->fwnode = fwnode_handle_get(reset_fwnode);
|
||||
return true;
|
||||
}
|
||||
|
||||
match = ((ref_args.fwnode == entry->fwnode) &&
|
||||
(aux_args.fwnode == entry->fwnode) &&
|
||||
(ref_args.args[0] == aux_args.args[0]));
|
||||
|
||||
fwnode_handle_put(ref_args.fwnode);
|
||||
fwnode_handle_put(aux_args.fwnode);
|
||||
return match;
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
static bool gpio_shared_dev_is_reset_gpio(struct device *consumer,
|
||||
|
|
@ -365,25 +443,34 @@ static bool gpio_shared_dev_is_reset_gpio(struct device *consumer,
|
|||
}
|
||||
#endif /* CONFIG_RESET_GPIO */
|
||||
|
||||
int gpio_shared_add_proxy_lookup(struct device *consumer, unsigned long lflags)
|
||||
int gpio_shared_add_proxy_lookup(struct device *consumer, const char *con_id,
|
||||
unsigned long lflags)
|
||||
{
|
||||
const char *dev_id = dev_name(consumer);
|
||||
struct gpiod_lookup_table *lookup;
|
||||
struct gpio_shared_entry *entry;
|
||||
struct gpio_shared_ref *ref;
|
||||
|
||||
struct gpiod_lookup_table *lookup __free(kfree) =
|
||||
kzalloc(struct_size(lookup, table, 2), GFP_KERNEL);
|
||||
if (!lookup)
|
||||
return -ENOMEM;
|
||||
|
||||
list_for_each_entry(entry, &gpio_shared_list, list) {
|
||||
list_for_each_entry(ref, &entry->refs, list) {
|
||||
if (!device_match_fwnode(consumer, ref->fwnode) &&
|
||||
!gpio_shared_dev_is_reset_gpio(consumer, entry, ref))
|
||||
continue;
|
||||
|
||||
guard(mutex)(&ref->lock);
|
||||
|
||||
/*
|
||||
* FIXME: use device_is_compatible() once the reset-gpio
|
||||
* drivers gains a compatible string which it currently
|
||||
* does not have.
|
||||
*/
|
||||
if (!ref->fwnode && strstarts(dev_name(consumer), "reset.gpio.")) {
|
||||
if (!gpio_shared_dev_is_reset_gpio(consumer, entry, ref))
|
||||
continue;
|
||||
} else if (!device_match_fwnode(consumer, ref->fwnode)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((!con_id && ref->con_id) || (con_id && !ref->con_id) ||
|
||||
(con_id && ref->con_id && strcmp(con_id, ref->con_id) != 0))
|
||||
continue;
|
||||
|
||||
/* We've already done that on a previous request. */
|
||||
if (ref->lookup)
|
||||
return 0;
|
||||
|
|
@ -395,6 +482,10 @@ int gpio_shared_add_proxy_lookup(struct device *consumer, unsigned long lflags)
|
|||
if (!key)
|
||||
return -ENOMEM;
|
||||
|
||||
lookup = kzalloc(struct_size(lookup, table, 2), GFP_KERNEL);
|
||||
if (!lookup)
|
||||
return -ENOMEM;
|
||||
|
||||
pr_debug("Adding machine lookup entry for a shared GPIO for consumer %s, with key '%s' and con_id '%s'\n",
|
||||
dev_id, key, ref->con_id ?: "none");
|
||||
|
||||
|
|
@ -402,7 +493,7 @@ int gpio_shared_add_proxy_lookup(struct device *consumer, unsigned long lflags)
|
|||
lookup->table[0] = GPIO_LOOKUP(no_free_ptr(key), 0,
|
||||
ref->con_id, lflags);
|
||||
|
||||
ref->lookup = no_free_ptr(lookup);
|
||||
ref->lookup = lookup;
|
||||
gpiod_add_lookup_table(ref->lookup);
|
||||
|
||||
return 0;
|
||||
|
|
@ -466,8 +557,9 @@ int gpio_device_setup_shared(struct gpio_device *gdev)
|
|||
entry->offset, gpio_device_get_label(gdev));
|
||||
|
||||
list_for_each_entry(ref, &entry->refs, list) {
|
||||
pr_debug("Setting up a shared GPIO entry for %s\n",
|
||||
fwnode_get_name(ref->fwnode));
|
||||
pr_debug("Setting up a shared GPIO entry for %s (con_id: '%s')\n",
|
||||
fwnode_get_name(ref->fwnode) ?: "(no fwnode)",
|
||||
ref->con_id ?: "(none)");
|
||||
|
||||
ret = gpio_shared_make_adev(gdev, entry, ref);
|
||||
if (ret)
|
||||
|
|
@ -487,15 +579,6 @@ void gpio_device_teardown_shared(struct gpio_device *gdev)
|
|||
if (!device_match_fwnode(&gdev->dev, entry->fwnode))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* For some reason if we call synchronize_srcu() in GPIO core,
|
||||
* descent here and take this mutex and then recursively call
|
||||
* synchronize_srcu() again from gpiochip_remove() (which is
|
||||
* totally fine) called after gpio_shared_remove_adev(),
|
||||
* lockdep prints a false positive deadlock splat. Disable
|
||||
* lockdep here.
|
||||
*/
|
||||
lockdep_off();
|
||||
list_for_each_entry(ref, &entry->refs, list) {
|
||||
guard(mutex)(&ref->lock);
|
||||
|
||||
|
|
@ -508,7 +591,6 @@ void gpio_device_teardown_shared(struct gpio_device *gdev)
|
|||
|
||||
gpio_shared_remove_adev(&ref->adev);
|
||||
}
|
||||
lockdep_on();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -604,6 +686,7 @@ static void gpio_shared_drop_ref(struct gpio_shared_ref *ref)
|
|||
{
|
||||
list_del(&ref->list);
|
||||
mutex_destroy(&ref->lock);
|
||||
lockdep_unregister_key(&ref->lock_key);
|
||||
kfree(ref->con_id);
|
||||
ida_free(&gpio_shared_ida, ref->dev_id);
|
||||
fwnode_handle_put(ref->fwnode);
|
||||
|
|
@ -635,12 +718,38 @@ static void __init gpio_shared_teardown(void)
|
|||
}
|
||||
}
|
||||
|
||||
static bool gpio_shared_entry_is_really_shared(struct gpio_shared_entry *entry)
|
||||
{
|
||||
size_t num_nodes = list_count_nodes(&entry->refs);
|
||||
struct gpio_shared_ref *ref;
|
||||
|
||||
if (num_nodes <= 1)
|
||||
return false;
|
||||
|
||||
if (num_nodes > 2)
|
||||
return true;
|
||||
|
||||
/* Exactly two references: */
|
||||
list_for_each_entry(ref, &entry->refs, list) {
|
||||
/*
|
||||
* Corner-case: the second reference comes from the potential
|
||||
* reset-gpio instance. However, this pin is not really shared
|
||||
* as it would have three references in this case. Avoid
|
||||
* creating unnecessary proxies.
|
||||
*/
|
||||
if (ref->is_reset_gpio)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void gpio_shared_free_exclusive(void)
|
||||
{
|
||||
struct gpio_shared_entry *entry, *epos;
|
||||
|
||||
list_for_each_entry_safe(entry, epos, &gpio_shared_list, list) {
|
||||
if (list_count_nodes(&entry->refs) > 1)
|
||||
if (gpio_shared_entry_is_really_shared(entry))
|
||||
continue;
|
||||
|
||||
gpio_shared_drop_ref(list_first_entry(&entry->refs,
|
||||
|
|
|
|||
|
|
@ -16,7 +16,8 @@ struct device;
|
|||
|
||||
int gpio_device_setup_shared(struct gpio_device *gdev);
|
||||
void gpio_device_teardown_shared(struct gpio_device *gdev);
|
||||
int gpio_shared_add_proxy_lookup(struct device *consumer, unsigned long lflags);
|
||||
int gpio_shared_add_proxy_lookup(struct device *consumer, const char *con_id,
|
||||
unsigned long lflags);
|
||||
|
||||
#else
|
||||
|
||||
|
|
@ -28,6 +29,7 @@ static inline int gpio_device_setup_shared(struct gpio_device *gdev)
|
|||
static inline void gpio_device_teardown_shared(struct gpio_device *gdev) { }
|
||||
|
||||
static inline int gpio_shared_add_proxy_lookup(struct device *consumer,
|
||||
const char *con_id,
|
||||
unsigned long lflags)
|
||||
{
|
||||
return 0;
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user