Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net

Cross-merge networking fixes after downstream PR.

Conflicts:

drivers/net/phy/phy_device.c
  2560db6ede ("net: phy: Fix missing of_node_put() for leds")
  1dce520abd ("net: phy: Use for_each_available_child_of_node_scoped()")
https://lore.kernel.org/20240904115823.74333648@canb.auug.org.au

Adjacent changes:

drivers/net/ethernet/xilinx/xilinx_axienet.h
drivers/net/ethernet/xilinx/xilinx_axienet_main.c
  858430db28 ("net: xilinx: axienet: Fix race in axienet_stop")
  76abb5d675 ("net: xilinx: axienet: Add statistics support")

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jakub Kicinski 2024-09-05 20:27:09 -07:00
commit 502cc061de
305 changed files with 3208 additions and 1819 deletions

View File

@ -60,6 +60,7 @@ Amit Nischal <quic_anischal@quicinc.com> <anischal@codeaurora.org>
Andi Kleen <ak@linux.intel.com> <ak@suse.de> Andi Kleen <ak@linux.intel.com> <ak@suse.de>
Andi Shyti <andi@etezian.org> <andi.shyti@samsung.com> Andi Shyti <andi@etezian.org> <andi.shyti@samsung.com>
Andreas Herrmann <aherrman@de.ibm.com> Andreas Herrmann <aherrman@de.ibm.com>
Andreas Hindborg <a.hindborg@kernel.org> <a.hindborg@samsung.com>
Andrej Shadura <andrew.shadura@collabora.co.uk> Andrej Shadura <andrew.shadura@collabora.co.uk>
Andrej Shadura <andrew@shadura.me> <andrew@beldisplaytech.com> Andrej Shadura <andrew@shadura.me> <andrew@beldisplaytech.com>
Andrew Morton <akpm@linux-foundation.org> Andrew Morton <akpm@linux-foundation.org>
@ -269,6 +270,7 @@ James Ketrenos <jketreno@io.(none)>
Jan Glauber <jan.glauber@gmail.com> <jang@de.ibm.com> Jan Glauber <jan.glauber@gmail.com> <jang@de.ibm.com>
Jan Glauber <jan.glauber@gmail.com> <jang@linux.vnet.ibm.com> Jan Glauber <jan.glauber@gmail.com> <jang@linux.vnet.ibm.com>
Jan Glauber <jan.glauber@gmail.com> <jglauber@cavium.com> Jan Glauber <jan.glauber@gmail.com> <jglauber@cavium.com>
Jan Kuliga <jtkuliga.kdev@gmail.com> <jankul@alatek.krakow.pl>
Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@linux.intel.com> Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@linux.intel.com>
Jarkko Sakkinen <jarkko@kernel.org> <jarkko@profian.com> Jarkko Sakkinen <jarkko@kernel.org> <jarkko@profian.com>
Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@tuni.fi> Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@tuni.fi>
@ -354,6 +356,8 @@ Kenneth Westfield <quic_kwestfie@quicinc.com> <kwestfie@codeaurora.org>
Kiran Gunda <quic_kgunda@quicinc.com> <kgunda@codeaurora.org> Kiran Gunda <quic_kgunda@quicinc.com> <kgunda@codeaurora.org>
Kirill Tkhai <tkhai@ya.ru> <ktkhai@virtuozzo.com> Kirill Tkhai <tkhai@ya.ru> <ktkhai@virtuozzo.com>
Kishon Vijay Abraham I <kishon@kernel.org> <kishon@ti.com> Kishon Vijay Abraham I <kishon@kernel.org> <kishon@ti.com>
Konrad Dybcio <konradybcio@kernel.org> <konrad.dybcio@linaro.org>
Konrad Dybcio <konradybcio@kernel.org> <konrad.dybcio@somainline.org>
Konstantin Khlebnikov <koct9i@gmail.com> <khlebnikov@yandex-team.ru> Konstantin Khlebnikov <koct9i@gmail.com> <khlebnikov@yandex-team.ru>
Konstantin Khlebnikov <koct9i@gmail.com> <k.khlebnikov@samsung.com> Konstantin Khlebnikov <koct9i@gmail.com> <k.khlebnikov@samsung.com>
Koushik <raghavendra.koushik@neterion.com> Koushik <raghavendra.koushik@neterion.com>

View File

@ -258,24 +258,29 @@ Description: (RW) When retrieving the PHC with the PTP SYS_OFFSET_EXTENDED
the estimated point where the FPGA latches the PHC time. This the estimated point where the FPGA latches the PHC time. This
value may be changed by writing an unsigned integer. value may be changed by writing an unsigned integer.
What: /sys/class/timecard/ocpN/ttyGNSS What: /sys/class/timecard/ocpN/tty
What: /sys/class/timecard/ocpN/ttyGNSS2 Date: August 2024
Date: September 2021 Contact: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Contact: Jonathan Lemon <jonathan.lemon@gmail.com> Description: (RO) Directory containing the sysfs nodes for TTY attributes
Description: These optional attributes link to the TTY serial ports
associated with the GNSS devices.
What: /sys/class/timecard/ocpN/ttyMAC What: /sys/class/timecard/ocpN/tty/ttyGNSS
Date: September 2021 What: /sys/class/timecard/ocpN/tty/ttyGNSS2
Date: August 2024
Contact: Jonathan Lemon <jonathan.lemon@gmail.com> Contact: Jonathan Lemon <jonathan.lemon@gmail.com>
Description: This optional attribute links to the TTY serial port Description: (RO) These optional attributes contain names of the TTY serial
associated with the Miniature Atomic Clock. ports associated with the GNSS devices.
What: /sys/class/timecard/ocpN/ttyNMEA What: /sys/class/timecard/ocpN/tty/ttyMAC
Date: September 2021 Date: August 2024
Contact: Jonathan Lemon <jonathan.lemon@gmail.com> Contact: Jonathan Lemon <jonathan.lemon@gmail.com>
Description: This optional attribute links to the TTY serial port Description: (RO) This optional attribute contains name of the TTY serial
which outputs the PHC time in NMEA ZDA format. port associated with the Miniature Atomic Clock.
What: /sys/class/timecard/ocpN/tty/ttyNMEA
Date: August 2024
Contact: Jonathan Lemon <jonathan.lemon@gmail.com>
Description: (RO) This optional attribute contains name of the TTY serial
port which outputs the PHC time in NMEA ZDA format.
What: /sys/class/timecard/ocpN/utc_tai_offset What: /sys/class/timecard/ocpN/utc_tai_offset
Date: September 2021 Date: September 2021

View File

@ -1717,9 +1717,10 @@ The following nested keys are defined.
entries fault back in or are written out to disk. entries fault back in or are written out to disk.
memory.zswap.writeback memory.zswap.writeback
A read-write single value file. The default value is "1". The A read-write single value file. The default value is "1".
initial value of the root cgroup is 1, and when a new cgroup is Note that this setting is hierarchical, i.e. the writeback would be
created, it inherits the current value of its parent. implicitly disabled for child cgroups if the upper hierarchy
does so.
When this is set to 0, all swapping attempts to swapping devices When this is set to 0, all swapping attempts to swapping devices
are disabled. This included both zswap writebacks, and swapping due are disabled. This included both zswap writebacks, and swapping due

View File

@ -10,7 +10,7 @@ maintainers:
- Fabio Estevam <festevam@gmail.com> - Fabio Estevam <festevam@gmail.com>
allOf: allOf:
- $ref: usb-hcd.yaml# - $ref: usb-device.yaml#
properties: properties:
compatible: compatible:
@ -36,6 +36,13 @@ required:
- compatible - compatible
- reg - reg
patternProperties:
"^.*@[0-9a-f]{1,2}$":
description: The hard wired USB devices
type: object
$ref: /schemas/usb/usb-device.yaml
additionalProperties: true
unevaluatedProperties: false unevaluatedProperties: false
examples: examples:

View File

@ -375,6 +375,22 @@ When working in existing code which uses nonstandard formatting make
your code follow the most recent guidelines, so that eventually all code your code follow the most recent guidelines, so that eventually all code
in the domain of netdev is in the preferred format. in the domain of netdev is in the preferred format.
Using device-managed and cleanup.h constructs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Netdev remains skeptical about promises of all "auto-cleanup" APIs,
including even ``devm_`` helpers, historically. They are not the preferred
style of implementation, merely an acceptable one.
Use of ``guard()`` is discouraged within any function longer than 20 lines,
``scoped_guard()`` is considered more readable. Using normal lock/unlock is
still (weakly) preferred.
Low level cleanup constructs (such as ``__free()``) can be used when building
APIs and helpers, especially scoped iterators. However, direct use of
``__free()`` within networking core and drivers is discouraged.
Similar guidance applies to declaring variables mid-function.
Resending after review Resending after review
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~

View File

@ -1888,6 +1888,10 @@ F: Documentation/devicetree/bindings/iommu/arm,smmu*
F: drivers/iommu/arm/ F: drivers/iommu/arm/
F: drivers/iommu/io-pgtable-arm* F: drivers/iommu/io-pgtable-arm*
ARM SMMU SVA SUPPORT
R: Jean-Philippe Brucker <jean-philippe@linaro.org>
F: drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c
ARM SUB-ARCHITECTURES ARM SUB-ARCHITECTURES
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained S: Maintained
@ -2543,8 +2547,7 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Supported S: Supported
W: http://www.linux4sam.org W: http://www.linux4sam.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/at91/linux.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/at91/linux.git
F: arch/arm/boot/dts/microchip/at91* F: arch/arm/boot/dts/microchip/
F: arch/arm/boot/dts/microchip/sama*
F: arch/arm/include/debug/at91.S F: arch/arm/include/debug/at91.S
F: arch/arm/mach-at91/ F: arch/arm/mach-at91/
F: drivers/memory/atmel* F: drivers/memory/atmel*
@ -2753,7 +2756,7 @@ F: include/linux/soc/qcom/
ARM/QUALCOMM SUPPORT ARM/QUALCOMM SUPPORT
M: Bjorn Andersson <andersson@kernel.org> M: Bjorn Andersson <andersson@kernel.org>
M: Konrad Dybcio <konrad.dybcio@linaro.org> M: Konrad Dybcio <konradybcio@kernel.org>
L: linux-arm-msm@vger.kernel.org L: linux-arm-msm@vger.kernel.org
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git
@ -3873,7 +3876,7 @@ F: kernel/trace/blktrace.c
F: lib/sbitmap.c F: lib/sbitmap.c
BLOCK LAYER DEVICE DRIVER API [RUST] BLOCK LAYER DEVICE DRIVER API [RUST]
M: Andreas Hindborg <a.hindborg@samsung.com> M: Andreas Hindborg <a.hindborg@kernel.org>
R: Boqun Feng <boqun.feng@gmail.com> R: Boqun Feng <boqun.feng@gmail.com>
L: linux-block@vger.kernel.org L: linux-block@vger.kernel.org
L: rust-for-linux@vger.kernel.org L: rust-for-linux@vger.kernel.org
@ -5961,6 +5964,7 @@ F: Documentation/process/cve.rst
CW1200 WLAN driver CW1200 WLAN driver
S: Orphan S: Orphan
F: drivers/net/wireless/st/cw1200/ F: drivers/net/wireless/st/cw1200/
F: include/linux/platform_data/net-cw1200.h
CX18 VIDEO4LINUX DRIVER CX18 VIDEO4LINUX DRIVER
M: Andy Walls <awalls@md.metrocast.net> M: Andy Walls <awalls@md.metrocast.net>
@ -7116,7 +7120,7 @@ F: drivers/gpu/drm/tiny/panel-mipi-dbi.c
DRM DRIVER for Qualcomm Adreno GPUs DRM DRIVER for Qualcomm Adreno GPUs
M: Rob Clark <robdclark@gmail.com> M: Rob Clark <robdclark@gmail.com>
R: Sean Paul <sean@poorly.run> R: Sean Paul <sean@poorly.run>
R: Konrad Dybcio <konrad.dybcio@linaro.org> R: Konrad Dybcio <konradybcio@kernel.org>
L: linux-arm-msm@vger.kernel.org L: linux-arm-msm@vger.kernel.org
L: dri-devel@lists.freedesktop.org L: dri-devel@lists.freedesktop.org
L: freedreno@lists.freedesktop.org L: freedreno@lists.freedesktop.org
@ -8871,6 +8875,7 @@ F: drivers/dma/fsldma.*
FREESCALE DSPI DRIVER FREESCALE DSPI DRIVER
M: Vladimir Oltean <olteanv@gmail.com> M: Vladimir Oltean <olteanv@gmail.com>
L: linux-spi@vger.kernel.org L: linux-spi@vger.kernel.org
L: imx@lists.linux.dev
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/spi/fsl,dspi*.yaml F: Documentation/devicetree/bindings/spi/fsl,dspi*.yaml
F: drivers/spi/spi-fsl-dspi.c F: drivers/spi/spi-fsl-dspi.c
@ -8955,6 +8960,14 @@ S: Maintained
F: Documentation/devicetree/bindings/i2c/i2c-imx-lpi2c.yaml F: Documentation/devicetree/bindings/i2c/i2c-imx-lpi2c.yaml
F: drivers/i2c/busses/i2c-imx-lpi2c.c F: drivers/i2c/busses/i2c-imx-lpi2c.c
FREESCALE IMX LPSPI DRIVER
M: Frank Li <Frank.Li@nxp.com>
L: linux-spi@vger.kernel.org
L: imx@lists.linux.dev
S: Maintained
F: Documentation/devicetree/bindings/spi/spi-fsl-lpspi.yaml
F: drivers/spi/spi-fsl-lpspi.c
FREESCALE MPC I2C DRIVER FREESCALE MPC I2C DRIVER
M: Chris Packham <chris.packham@alliedtelesis.co.nz> M: Chris Packham <chris.packham@alliedtelesis.co.nz>
L: linux-i2c@vger.kernel.org L: linux-i2c@vger.kernel.org
@ -8991,6 +9004,7 @@ F: include/linux/fsl/ptp_qoriq.h
FREESCALE QUAD SPI DRIVER FREESCALE QUAD SPI DRIVER
M: Han Xu <han.xu@nxp.com> M: Han Xu <han.xu@nxp.com>
L: linux-spi@vger.kernel.org L: linux-spi@vger.kernel.org
L: imx@lists.linux.dev
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml F: Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml
F: drivers/spi/spi-fsl-qspi.c F: drivers/spi/spi-fsl-qspi.c
@ -15903,6 +15917,8 @@ F: include/uapi/linux/ethtool_netlink.h
F: include/uapi/linux/if_* F: include/uapi/linux/if_*
F: include/uapi/linux/netdev* F: include/uapi/linux/netdev*
F: tools/testing/selftests/drivers/net/ F: tools/testing/selftests/drivers/net/
X: Documentation/devicetree/bindings/net/bluetooth/
X: Documentation/devicetree/bindings/net/wireless/
X: drivers/net/wireless/ X: drivers/net/wireless/
NETWORKING DRIVERS (WIRELESS) NETWORKING DRIVERS (WIRELESS)
@ -16416,6 +16432,7 @@ M: Han Xu <han.xu@nxp.com>
M: Haibo Chen <haibo.chen@nxp.com> M: Haibo Chen <haibo.chen@nxp.com>
R: Yogesh Gaur <yogeshgaur.83@gmail.com> R: Yogesh Gaur <yogeshgaur.83@gmail.com>
L: linux-spi@vger.kernel.org L: linux-spi@vger.kernel.org
L: imx@lists.linux.dev
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/spi/spi-nxp-fspi.yaml F: Documentation/devicetree/bindings/spi/spi-nxp-fspi.yaml
F: drivers/spi/spi-nxp-fspi.c F: drivers/spi/spi-nxp-fspi.c
@ -17127,7 +17144,7 @@ F: include/dt-bindings/
OPENCOMPUTE PTP CLOCK DRIVER OPENCOMPUTE PTP CLOCK DRIVER
M: Jonathan Lemon <jonathan.lemon@gmail.com> M: Jonathan Lemon <jonathan.lemon@gmail.com>
M: Vadim Fedorenko <vadfed@linux.dev> M: Vadim Fedorenko <vadim.fedorenko@linux.dev>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: drivers/ptp/ptp_ocp.c F: drivers/ptp/ptp_ocp.c
@ -17446,6 +17463,7 @@ M: Roy Zang <roy.zang@nxp.com>
L: linuxppc-dev@lists.ozlabs.org L: linuxppc-dev@lists.ozlabs.org
L: linux-pci@vger.kernel.org L: linux-pci@vger.kernel.org
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
L: imx@lists.linux.dev
S: Maintained S: Maintained
F: drivers/pci/controller/dwc/*layerscape* F: drivers/pci/controller/dwc/*layerscape*
@ -17472,6 +17490,7 @@ M: Richard Zhu <hongxing.zhu@nxp.com>
M: Lucas Stach <l.stach@pengutronix.de> M: Lucas Stach <l.stach@pengutronix.de>
L: linux-pci@vger.kernel.org L: linux-pci@vger.kernel.org
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
L: imx@lists.linux.dev
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-common.yaml F: Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-common.yaml
F: Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-ep.yaml F: Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-ep.yaml
@ -17650,6 +17669,7 @@ F: drivers/pci/controller/pci-xgene-msi.c
PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
M: Lorenzo Pieralisi <lpieralisi@kernel.org> M: Lorenzo Pieralisi <lpieralisi@kernel.org>
M: Krzysztof Wilczyński <kw@linux.com> M: Krzysztof Wilczyński <kw@linux.com>
R: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
R: Rob Herring <robh@kernel.org> R: Rob Herring <robh@kernel.org>
L: linux-pci@vger.kernel.org L: linux-pci@vger.kernel.org
S: Supported S: Supported
@ -18804,7 +18824,7 @@ F: include/uapi/drm/qaic_accel.h
QUALCOMM CORE POWER REDUCTION (CPR) AVS DRIVER QUALCOMM CORE POWER REDUCTION (CPR) AVS DRIVER
M: Bjorn Andersson <andersson@kernel.org> M: Bjorn Andersson <andersson@kernel.org>
M: Konrad Dybcio <konrad.dybcio@linaro.org> M: Konrad Dybcio <konradybcio@kernel.org>
L: linux-pm@vger.kernel.org L: linux-pm@vger.kernel.org
L: linux-arm-msm@vger.kernel.org L: linux-arm-msm@vger.kernel.org
S: Maintained S: Maintained
@ -19946,12 +19966,11 @@ F: tools/verification/
RUST RUST
M: Miguel Ojeda <ojeda@kernel.org> M: Miguel Ojeda <ojeda@kernel.org>
M: Alex Gaynor <alex.gaynor@gmail.com> M: Alex Gaynor <alex.gaynor@gmail.com>
M: Wedson Almeida Filho <wedsonaf@gmail.com>
R: Boqun Feng <boqun.feng@gmail.com> R: Boqun Feng <boqun.feng@gmail.com>
R: Gary Guo <gary@garyguo.net> R: Gary Guo <gary@garyguo.net>
R: Björn Roy Baron <bjorn3_gh@protonmail.com> R: Björn Roy Baron <bjorn3_gh@protonmail.com>
R: Benno Lossin <benno.lossin@proton.me> R: Benno Lossin <benno.lossin@proton.me>
R: Andreas Hindborg <a.hindborg@samsung.com> R: Andreas Hindborg <a.hindborg@kernel.org>
R: Alice Ryhl <aliceryhl@google.com> R: Alice Ryhl <aliceryhl@google.com>
L: rust-for-linux@vger.kernel.org L: rust-for-linux@vger.kernel.org
S: Supported S: Supported
@ -23862,10 +23881,8 @@ F: drivers/media/usb/uvc/
F: include/uapi/linux/uvcvideo.h F: include/uapi/linux/uvcvideo.h
USB WEBCAM GADGET USB WEBCAM GADGET
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
M: Daniel Scally <dan.scally@ideasonboard.com>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
S: Maintained S: Orphan
F: drivers/usb/gadget/function/*uvc* F: drivers/usb/gadget/function/*uvc*
F: drivers/usb/gadget/legacy/webcam.c F: drivers/usb/gadget/legacy/webcam.c
F: include/uapi/linux/usb/g_uvc.h F: include/uapi/linux/usb/g_uvc.h

View File

@ -2,7 +2,7 @@
VERSION = 6 VERSION = 6
PATCHLEVEL = 11 PATCHLEVEL = 11
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc5 EXTRAVERSION = -rc6
NAME = Baby Opossum Posse NAME = Baby Opossum Posse
# *DOCUMENTATION* # *DOCUMENTATION*
@ -445,6 +445,7 @@ KBUILD_USERLDFLAGS := $(USERLDFLAGS)
# host programs. # host programs.
export rust_common_flags := --edition=2021 \ export rust_common_flags := --edition=2021 \
-Zbinary_dep_depinfo=y \ -Zbinary_dep_depinfo=y \
-Astable_features \
-Dunsafe_op_in_unsafe_fn \ -Dunsafe_op_in_unsafe_fn \
-Dnon_ascii_idents \ -Dnon_ascii_idents \
-Wrust_2018_idioms \ -Wrust_2018_idioms \

View File

@ -117,7 +117,7 @@ config ARM
select HAVE_KERNEL_XZ select HAVE_KERNEL_XZ
select HAVE_KPROBES if !XIP_KERNEL && !CPU_ENDIAN_BE32 && !CPU_V7M select HAVE_KPROBES if !XIP_KERNEL && !CPU_ENDIAN_BE32 && !CPU_V7M
select HAVE_KRETPROBES if HAVE_KPROBES select HAVE_KRETPROBES if HAVE_KPROBES
select HAVE_LD_DEAD_CODE_DATA_ELIMINATION select HAVE_LD_DEAD_CODE_DATA_ELIMINATION if (LD_VERSION >= 23600 || LD_IS_LLD)
select HAVE_MOD_ARCH_SPECIFIC select HAVE_MOD_ARCH_SPECIFIC
select HAVE_NMI select HAVE_NMI
select HAVE_OPTPROBES if !THUMB2_KERNEL select HAVE_OPTPROBES if !THUMB2_KERNEL

View File

@ -274,24 +274,24 @@
led@0 { led@0 {
chan-name = "R"; chan-name = "R";
led-cur = /bits/ 8 <0x20>; led-cur = /bits/ 8 <0x6e>;
max-cur = /bits/ 8 <0x60>; max-cur = /bits/ 8 <0xc8>;
reg = <0>; reg = <0>;
color = <LED_COLOR_ID_RED>; color = <LED_COLOR_ID_RED>;
}; };
led@1 { led@1 {
chan-name = "G"; chan-name = "G";
led-cur = /bits/ 8 <0x20>; led-cur = /bits/ 8 <0xbe>;
max-cur = /bits/ 8 <0x60>; max-cur = /bits/ 8 <0xc8>;
reg = <1>; reg = <1>;
color = <LED_COLOR_ID_GREEN>; color = <LED_COLOR_ID_GREEN>;
}; };
led@2 { led@2 {
chan-name = "B"; chan-name = "B";
led-cur = /bits/ 8 <0x20>; led-cur = /bits/ 8 <0xbe>;
max-cur = /bits/ 8 <0x60>; max-cur = /bits/ 8 <0xc8>;
reg = <2>; reg = <2>;
color = <LED_COLOR_ID_BLUE>; color = <LED_COLOR_ID_BLUE>;
}; };

View File

@ -781,7 +781,7 @@
mount-matrix = "-1", "0", "0", mount-matrix = "-1", "0", "0",
"0", "1", "0", "0", "1", "0",
"0", "0", "1"; "0", "0", "-1";
}; };
cam1: camera@3e { cam1: camera@3e {

View File

@ -29,6 +29,12 @@
#include "entry-header.S" #include "entry-header.S"
#include <asm/probes.h> #include <asm/probes.h>
#ifdef CONFIG_HAVE_LD_DEAD_CODE_DATA_ELIMINATION
#define RELOC_TEXT_NONE .reloc .text, R_ARM_NONE, .
#else
#define RELOC_TEXT_NONE
#endif
/* /*
* Interrupt handling. * Interrupt handling.
*/ */
@ -1065,7 +1071,7 @@ vector_addrexcptn:
.globl vector_fiq .globl vector_fiq
.section .vectors, "ax", %progbits .section .vectors, "ax", %progbits
.reloc .text, R_ARM_NONE, . RELOC_TEXT_NONE
W(b) vector_rst W(b) vector_rst
W(b) vector_und W(b) vector_und
ARM( .reloc ., R_ARM_LDR_PC_G0, .L__vector_swi ) ARM( .reloc ., R_ARM_LDR_PC_G0, .L__vector_swi )
@ -1079,7 +1085,7 @@ THUMB( .reloc ., R_ARM_THM_PC12, .L__vector_swi )
#ifdef CONFIG_HARDEN_BRANCH_HISTORY #ifdef CONFIG_HARDEN_BRANCH_HISTORY
.section .vectors.bhb.loop8, "ax", %progbits .section .vectors.bhb.loop8, "ax", %progbits
.reloc .text, R_ARM_NONE, . RELOC_TEXT_NONE
W(b) vector_rst W(b) vector_rst
W(b) vector_bhb_loop8_und W(b) vector_bhb_loop8_und
ARM( .reloc ., R_ARM_LDR_PC_G0, .L__vector_bhb_loop8_swi ) ARM( .reloc ., R_ARM_LDR_PC_G0, .L__vector_bhb_loop8_swi )
@ -1092,7 +1098,7 @@ THUMB( .reloc ., R_ARM_THM_PC12, .L__vector_bhb_loop8_swi )
W(b) vector_bhb_loop8_fiq W(b) vector_bhb_loop8_fiq
.section .vectors.bhb.bpiall, "ax", %progbits .section .vectors.bhb.bpiall, "ax", %progbits
.reloc .text, R_ARM_NONE, . RELOC_TEXT_NONE
W(b) vector_rst W(b) vector_rst
W(b) vector_bhb_bpiall_und W(b) vector_bhb_bpiall_und
ARM( .reloc ., R_ARM_LDR_PC_G0, .L__vector_bhb_bpiall_swi ) ARM( .reloc ., R_ARM_LDR_PC_G0, .L__vector_bhb_bpiall_swi )

View File

@ -175,7 +175,7 @@
}; };
}; };
core-cluster-thermal { cluster-thermal {
polling-delay-passive = <1000>; polling-delay-passive = <1000>;
polling-delay = <5000>; polling-delay = <5000>;
thermal-sensors = <&tmu 1>; thermal-sensors = <&tmu 1>;

View File

@ -214,7 +214,7 @@
}; };
}; };
core-cluster-thermal { cluster-thermal {
polling-delay-passive = <1000>; polling-delay-passive = <1000>;
polling-delay = <5000>; polling-delay = <5000>;
thermal-sensors = <&tmu 3>; thermal-sensors = <&tmu 3>;

View File

@ -182,7 +182,7 @@
}; };
}; };
core-cluster-thermal { cluster-thermal {
polling-delay-passive = <1000>; polling-delay-passive = <1000>;
polling-delay = <5000>; polling-delay = <5000>;
thermal-sensors = <&tmu 3>; thermal-sensors = <&tmu 3>;

View File

@ -131,7 +131,7 @@
}; };
thermal-zones { thermal-zones {
core-cluster-thermal { cluster-thermal {
polling-delay-passive = <1000>; polling-delay-passive = <1000>;
polling-delay = <5000>; polling-delay = <5000>;
thermal-sensors = <&tmu 0>; thermal-sensors = <&tmu 0>;

View File

@ -122,7 +122,7 @@
}; };
}; };
core-cluster1-thermal { cluster1-thermal {
polling-delay-passive = <1000>; polling-delay-passive = <1000>;
polling-delay = <5000>; polling-delay = <5000>;
thermal-sensors = <&tmu 4>; thermal-sensors = <&tmu 4>;
@ -151,7 +151,7 @@
}; };
}; };
core-cluster2-thermal { cluster2-thermal {
polling-delay-passive = <1000>; polling-delay-passive = <1000>;
polling-delay = <5000>; polling-delay = <5000>;
thermal-sensors = <&tmu 5>; thermal-sensors = <&tmu 5>;
@ -180,7 +180,7 @@
}; };
}; };
core-cluster3-thermal { cluster3-thermal {
polling-delay-passive = <1000>; polling-delay-passive = <1000>;
polling-delay = <5000>; polling-delay = <5000>;
thermal-sensors = <&tmu 6>; thermal-sensors = <&tmu 6>;
@ -209,7 +209,7 @@
}; };
}; };
core-cluster4-thermal { cluster4-thermal {
polling-delay-passive = <1000>; polling-delay-passive = <1000>;
polling-delay = <5000>; polling-delay = <5000>;
thermal-sensors = <&tmu 7>; thermal-sensors = <&tmu 7>;

View File

@ -492,7 +492,7 @@
}; };
}; };
ddr-cluster5-thermal { ddr-ctrl5-thermal {
polling-delay-passive = <1000>; polling-delay-passive = <1000>;
polling-delay = <5000>; polling-delay = <5000>;
thermal-sensors = <&tmu 1>; thermal-sensors = <&tmu 1>;

View File

@ -21,7 +21,7 @@
&gpio3 { &gpio3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrcl-0 = <&pinctrl_gpio3_hog>; pinctrl-0 = <&pinctrl_gpio3_hog>;
uart4_rs485_en { uart4_rs485_en {
gpio-hog; gpio-hog;

View File

@ -22,7 +22,7 @@
&gpio3 { &gpio3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrcl-0 = <&pinctrl_gpio3_hog>; pinctrl-0 = <&pinctrl_gpio3_hog>;
uart4_rs485_en { uart4_rs485_en {
gpio-hog; gpio-hog;

View File

@ -211,13 +211,12 @@
simple-audio-card,cpu { simple-audio-card,cpu {
sound-dai = <&sai3>; sound-dai = <&sai3>;
frame-master;
bitclock-master;
}; };
simple-audio-card,codec { simple-audio-card,codec {
sound-dai = <&wm8962>; sound-dai = <&wm8962>;
clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO1>;
frame-master;
bitclock-master;
}; };
}; };
}; };
@ -507,10 +506,9 @@
&sai3 { &sai3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sai3>; pinctrl-0 = <&pinctrl_sai3>;
assigned-clocks = <&clk IMX8MP_CLK_SAI3>, assigned-clocks = <&clk IMX8MP_CLK_SAI3>;
<&clk IMX8MP_AUDIO_PLL2> ; assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL1_OUT>;
assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL2_OUT>; assigned-clock-rates = <12288000>;
assigned-clock-rates = <12288000>, <361267200>;
fsl,sai-mclk-direction-output; fsl,sai-mclk-direction-output;
status = "okay"; status = "okay";
}; };

View File

@ -499,7 +499,7 @@
pinctrl-0 = <&pinctrl_usdhc2_hs>, <&pinctrl_usdhc2_gpio>; pinctrl-0 = <&pinctrl_usdhc2_hs>, <&pinctrl_usdhc2_gpio>;
pinctrl-1 = <&pinctrl_usdhc2_uhs>, <&pinctrl_usdhc2_gpio>; pinctrl-1 = <&pinctrl_usdhc2_uhs>, <&pinctrl_usdhc2_gpio>;
pinctrl-2 = <&pinctrl_usdhc2_uhs>, <&pinctrl_usdhc2_gpio>; pinctrl-2 = <&pinctrl_usdhc2_uhs>, <&pinctrl_usdhc2_gpio>;
cd-gpios = <&gpio3 00 GPIO_ACTIVE_LOW>; cd-gpios = <&gpio3 0 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_usdhc2_vmmc>; vmmc-supply = <&reg_usdhc2_vmmc>;
bus-width = <4>; bus-width = <4>;
no-sdio; no-sdio;

View File

@ -19,7 +19,7 @@
linux,cma { linux,cma {
compatible = "shared-dma-pool"; compatible = "shared-dma-pool";
reusable; reusable;
alloc-ranges = <0 0x60000000 0 0x40000000>; alloc-ranges = <0 0x80000000 0 0x40000000>;
size = <0 0x10000000>; size = <0 0x10000000>;
linux,cma-default; linux,cma-default;
}; };
@ -156,6 +156,7 @@
&wdog3 { &wdog3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_wdog>; pinctrl-0 = <&pinctrl_wdog>;
fsl,ext-reset-output;
status = "okay"; status = "okay";
}; };

View File

@ -1105,7 +1105,7 @@
<&clk IMX93_CLK_SYS_PLL_PFD0_DIV2>; <&clk IMX93_CLK_SYS_PLL_PFD0_DIV2>;
assigned-clock-rates = <100000000>, <250000000>; assigned-clock-rates = <100000000>, <250000000>;
intf_mode = <&wakeupmix_gpr 0x28>; intf_mode = <&wakeupmix_gpr 0x28>;
snps,clk-csr = <0>; snps,clk-csr = <6>;
nvmem-cells = <&eth_mac2>; nvmem-cells = <&eth_mac2>;
nvmem-cell-names = "mac-address"; nvmem-cell-names = "mac-address";
status = "disabled"; status = "disabled";

View File

@ -27,7 +27,7 @@
reg = <0x0>; reg = <0x0>;
enable-method = "psci"; enable-method = "psci";
#cooling-cells = <2>; #cooling-cells = <2>;
power-domains = <&scmi_devpd IMX95_PERF_A55>; power-domains = <&scmi_perf IMX95_PERF_A55>;
power-domain-names = "perf"; power-domain-names = "perf";
i-cache-size = <32768>; i-cache-size = <32768>;
i-cache-line-size = <64>; i-cache-line-size = <64>;
@ -44,7 +44,7 @@
reg = <0x100>; reg = <0x100>;
enable-method = "psci"; enable-method = "psci";
#cooling-cells = <2>; #cooling-cells = <2>;
power-domains = <&scmi_devpd IMX95_PERF_A55>; power-domains = <&scmi_perf IMX95_PERF_A55>;
power-domain-names = "perf"; power-domain-names = "perf";
i-cache-size = <32768>; i-cache-size = <32768>;
i-cache-line-size = <64>; i-cache-line-size = <64>;
@ -61,7 +61,7 @@
reg = <0x200>; reg = <0x200>;
enable-method = "psci"; enable-method = "psci";
#cooling-cells = <2>; #cooling-cells = <2>;
power-domains = <&scmi_devpd IMX95_PERF_A55>; power-domains = <&scmi_perf IMX95_PERF_A55>;
power-domain-names = "perf"; power-domain-names = "perf";
i-cache-size = <32768>; i-cache-size = <32768>;
i-cache-line-size = <64>; i-cache-line-size = <64>;
@ -78,7 +78,7 @@
reg = <0x300>; reg = <0x300>;
enable-method = "psci"; enable-method = "psci";
#cooling-cells = <2>; #cooling-cells = <2>;
power-domains = <&scmi_devpd IMX95_PERF_A55>; power-domains = <&scmi_perf IMX95_PERF_A55>;
power-domain-names = "perf"; power-domain-names = "perf";
i-cache-size = <32768>; i-cache-size = <32768>;
i-cache-line-size = <64>; i-cache-line-size = <64>;
@ -93,7 +93,7 @@
device_type = "cpu"; device_type = "cpu";
compatible = "arm,cortex-a55"; compatible = "arm,cortex-a55";
reg = <0x400>; reg = <0x400>;
power-domains = <&scmi_devpd IMX95_PERF_A55>; power-domains = <&scmi_perf IMX95_PERF_A55>;
power-domain-names = "perf"; power-domain-names = "perf";
enable-method = "psci"; enable-method = "psci";
#cooling-cells = <2>; #cooling-cells = <2>;
@ -110,7 +110,7 @@
device_type = "cpu"; device_type = "cpu";
compatible = "arm,cortex-a55"; compatible = "arm,cortex-a55";
reg = <0x500>; reg = <0x500>;
power-domains = <&scmi_devpd IMX95_PERF_A55>; power-domains = <&scmi_perf IMX95_PERF_A55>;
power-domain-names = "perf"; power-domain-names = "perf";
enable-method = "psci"; enable-method = "psci";
#cooling-cells = <2>; #cooling-cells = <2>;
@ -187,7 +187,7 @@
compatible = "cache"; compatible = "cache";
cache-size = <524288>; cache-size = <524288>;
cache-line-size = <64>; cache-line-size = <64>;
cache-sets = <1024>; cache-sets = <512>;
cache-level = <3>; cache-level = <3>;
cache-unified; cache-unified;
}; };

View File

@ -320,8 +320,8 @@
reg = <0x08af8800 0x400>; reg = <0x08af8800 0x400>;
interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 53 IRQ_TYPE_EDGE_BOTH>, <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 52 IRQ_TYPE_EDGE_BOTH>; <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "pwr_event", interrupt-names = "pwr_event",
"dp_hs_phy_irq", "dp_hs_phy_irq",
"dm_hs_phy_irq"; "dm_hs_phy_irq";

View File

@ -278,6 +278,13 @@
vdd-l3-supply = <&vreg_s1f_0p7>; vdd-l3-supply = <&vreg_s1f_0p7>;
vdd-s1-supply = <&vph_pwr>; vdd-s1-supply = <&vph_pwr>;
vdd-s2-supply = <&vph_pwr>; vdd-s2-supply = <&vph_pwr>;
vreg_l3i_0p8: ldo3 {
regulator-name = "vreg_l3i_0p8";
regulator-min-microvolt = <880000>;
regulator-max-microvolt = <920000>;
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
};
}; };
regulators-7 { regulators-7 {
@ -423,11 +430,17 @@
}; };
&pcie4 { &pcie4 {
perst-gpios = <&tlmm 146 GPIO_ACTIVE_LOW>;
wake-gpios = <&tlmm 148 GPIO_ACTIVE_LOW>;
pinctrl-0 = <&pcie4_default>;
pinctrl-names = "default";
status = "okay"; status = "okay";
}; };
&pcie4_phy { &pcie4_phy {
vdda-phy-supply = <&vreg_l3j_0p8>; vdda-phy-supply = <&vreg_l3i_0p8>;
vdda-pll-supply = <&vreg_l3e_1p2>; vdda-pll-supply = <&vreg_l3e_1p2>;
status = "okay"; status = "okay";
@ -517,7 +530,30 @@
bias-disable; bias-disable;
}; };
pcie6a_default: pcie2a-default-state { pcie4_default: pcie4-default-state {
clkreq-n-pins {
pins = "gpio147";
function = "pcie4_clk";
drive-strength = <2>;
bias-pull-up;
};
perst-n-pins {
pins = "gpio146";
function = "gpio";
drive-strength = <2>;
bias-disable;
};
wake-n-pins {
pins = "gpio148";
function = "gpio";
drive-strength = <2>;
bias-pull-up;
};
};
pcie6a_default: pcie6a-default-state {
clkreq-n-pins { clkreq-n-pins {
pins = "gpio153"; pins = "gpio153";
function = "pcie6a_clk"; function = "pcie6a_clk";
@ -529,7 +565,7 @@
pins = "gpio152"; pins = "gpio152";
function = "gpio"; function = "gpio";
drive-strength = <2>; drive-strength = <2>;
bias-pull-down; bias-disable;
}; };
wake-n-pins { wake-n-pins {

View File

@ -268,7 +268,6 @@
pinctrl-0 = <&edp_reg_en>; pinctrl-0 = <&edp_reg_en>;
pinctrl-names = "default"; pinctrl-names = "default";
regulator-always-on;
regulator-boot-on; regulator-boot-on;
}; };
@ -637,6 +636,14 @@
}; };
}; };
&gpu {
status = "okay";
zap-shader {
firmware-name = "qcom/x1e80100/gen70500_zap.mbn";
};
};
&i2c0 { &i2c0 {
clock-frequency = <400000>; clock-frequency = <400000>;
@ -724,9 +731,13 @@
aux-bus { aux-bus {
panel { panel {
compatible = "edp-panel"; compatible = "samsung,atna45af01", "samsung,atna33xc20";
enable-gpios = <&pmc8380_3_gpios 4 GPIO_ACTIVE_HIGH>;
power-supply = <&vreg_edp_3p3>; power-supply = <&vreg_edp_3p3>;
pinctrl-0 = <&edp_bl_en>;
pinctrl-names = "default";
port { port {
edp_panel_in: endpoint { edp_panel_in: endpoint {
remote-endpoint = <&mdss_dp3_out>; remote-endpoint = <&mdss_dp3_out>;
@ -756,11 +767,17 @@
}; };
&pcie4 { &pcie4 {
perst-gpios = <&tlmm 146 GPIO_ACTIVE_LOW>;
wake-gpios = <&tlmm 148 GPIO_ACTIVE_LOW>;
pinctrl-0 = <&pcie4_default>;
pinctrl-names = "default";
status = "okay"; status = "okay";
}; };
&pcie4_phy { &pcie4_phy {
vdda-phy-supply = <&vreg_l3j_0p8>; vdda-phy-supply = <&vreg_l3i_0p8>;
vdda-pll-supply = <&vreg_l3e_1p2>; vdda-pll-supply = <&vreg_l3e_1p2>;
status = "okay"; status = "okay";
@ -785,6 +802,16 @@
status = "okay"; status = "okay";
}; };
&pmc8380_3_gpios {
edp_bl_en: edp-bl-en-state {
pins = "gpio4";
function = "normal";
power-source = <1>; /* 1.8V */
input-disable;
output-enable;
};
};
&qupv3_0 { &qupv3_0 {
status = "okay"; status = "okay";
}; };
@ -931,7 +958,30 @@
bias-disable; bias-disable;
}; };
pcie6a_default: pcie2a-default-state { pcie4_default: pcie4-default-state {
clkreq-n-pins {
pins = "gpio147";
function = "pcie4_clk";
drive-strength = <2>;
bias-pull-up;
};
perst-n-pins {
pins = "gpio146";
function = "gpio";
drive-strength = <2>;
bias-disable;
};
wake-n-pins {
pins = "gpio148";
function = "gpio";
drive-strength = <2>;
bias-pull-up;
};
};
pcie6a_default: pcie6a-default-state {
clkreq-n-pins { clkreq-n-pins {
pins = "gpio153"; pins = "gpio153";
function = "pcie6a_clk"; function = "pcie6a_clk";
@ -943,7 +993,7 @@
pins = "gpio152"; pins = "gpio152";
function = "gpio"; function = "gpio";
drive-strength = <2>; drive-strength = <2>;
bias-pull-down; bias-disable;
}; };
wake-n-pins { wake-n-pins {

View File

@ -625,16 +625,31 @@
}; };
&pcie4 { &pcie4 {
perst-gpios = <&tlmm 146 GPIO_ACTIVE_LOW>;
wake-gpios = <&tlmm 148 GPIO_ACTIVE_LOW>;
pinctrl-0 = <&pcie4_default>;
pinctrl-names = "default";
status = "okay"; status = "okay";
}; };
&pcie4_phy { &pcie4_phy {
vdda-phy-supply = <&vreg_l3j_0p8>; vdda-phy-supply = <&vreg_l3i_0p8>;
vdda-pll-supply = <&vreg_l3e_1p2>; vdda-pll-supply = <&vreg_l3e_1p2>;
status = "okay"; status = "okay";
}; };
&pcie4_port0 {
wifi@0 {
compatible = "pci17cb,1107";
reg = <0x10000 0x0 0x0 0x0 0x0>;
qcom,ath12k-calibration-variant = "LES790";
};
};
&pcie6a { &pcie6a {
perst-gpios = <&tlmm 152 GPIO_ACTIVE_LOW>; perst-gpios = <&tlmm 152 GPIO_ACTIVE_LOW>;
wake-gpios = <&tlmm 154 GPIO_ACTIVE_LOW>; wake-gpios = <&tlmm 154 GPIO_ACTIVE_LOW>;
@ -782,7 +797,30 @@
bias-disable; bias-disable;
}; };
pcie6a_default: pcie2a-default-state { pcie4_default: pcie4-default-state {
clkreq-n-pins {
pins = "gpio147";
function = "pcie4_clk";
drive-strength = <2>;
bias-pull-up;
};
perst-n-pins {
pins = "gpio146";
function = "gpio";
drive-strength = <2>;
bias-disable;
};
wake-n-pins {
pins = "gpio148";
function = "gpio";
drive-strength = <2>;
bias-pull-up;
};
};
pcie6a_default: pcie6a-default-state {
clkreq-n-pins { clkreq-n-pins {
pins = "gpio153"; pins = "gpio153";
function = "pcie6a_clk"; function = "pcie6a_clk";
@ -794,7 +832,7 @@
pins = "gpio152"; pins = "gpio152";
function = "gpio"; function = "gpio";
drive-strength = <2>; drive-strength = <2>;
bias-pull-down; bias-disable;
}; };
wake-n-pins { wake-n-pins {

View File

@ -606,6 +606,14 @@
}; };
}; };
&gpu {
status = "okay";
zap-shader {
firmware-name = "qcom/x1e80100/gen70500_zap.mbn";
};
};
&lpass_tlmm { &lpass_tlmm {
spkr_01_sd_n_active: spkr-01-sd-n-active-state { spkr_01_sd_n_active: spkr-01-sd-n-active-state {
pins = "gpio12"; pins = "gpio12";
@ -660,11 +668,17 @@
}; };
&pcie4 { &pcie4 {
perst-gpios = <&tlmm 146 GPIO_ACTIVE_LOW>;
wake-gpios = <&tlmm 148 GPIO_ACTIVE_LOW>;
pinctrl-0 = <&pcie4_default>;
pinctrl-names = "default";
status = "okay"; status = "okay";
}; };
&pcie4_phy { &pcie4_phy {
vdda-phy-supply = <&vreg_l3j_0p8>; vdda-phy-supply = <&vreg_l3i_0p8>;
vdda-pll-supply = <&vreg_l3e_1p2>; vdda-pll-supply = <&vreg_l3e_1p2>;
status = "okay"; status = "okay";
@ -804,7 +818,30 @@
bias-disable; bias-disable;
}; };
pcie6a_default: pcie2a-default-state { pcie4_default: pcie4-default-state {
clkreq-n-pins {
pins = "gpio147";
function = "pcie4_clk";
drive-strength = <2>;
bias-pull-up;
};
perst-n-pins {
pins = "gpio146";
function = "gpio";
drive-strength = <2>;
bias-disable;
};
wake-n-pins {
pins = "gpio148";
function = "gpio";
drive-strength = <2>;
bias-pull-up;
};
};
pcie6a_default: pcie6a-default-state {
clkreq-n-pins { clkreq-n-pins {
pins = "gpio153"; pins = "gpio153";
function = "pcie6a_clk"; function = "pcie6a_clk";
@ -816,7 +853,7 @@
pins = "gpio152"; pins = "gpio152";
function = "gpio"; function = "gpio";
drive-strength = <2>; drive-strength = <2>;
bias-pull-down; bias-disable;
}; };
wake-n-pins { wake-n-pins {

View File

@ -2901,7 +2901,7 @@
dma-coherent; dma-coherent;
linux,pci-domain = <7>; linux,pci-domain = <6>;
num-lanes = <2>; num-lanes = <2>;
interrupts = <GIC_SPI 773 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 773 IRQ_TYPE_LEVEL_HIGH>,
@ -2959,6 +2959,7 @@
"link_down"; "link_down";
power-domains = <&gcc GCC_PCIE_6A_GDSC>; power-domains = <&gcc GCC_PCIE_6A_GDSC>;
required-opps = <&rpmhpd_opp_nom>;
phys = <&pcie6a_phy>; phys = <&pcie6a_phy>;
phy-names = "pciephy"; phy-names = "pciephy";
@ -3022,7 +3023,7 @@
dma-coherent; dma-coherent;
linux,pci-domain = <5>; linux,pci-domain = <4>;
num-lanes = <2>; num-lanes = <2>;
interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>,
@ -3080,11 +3081,22 @@
"link_down"; "link_down";
power-domains = <&gcc GCC_PCIE_4_GDSC>; power-domains = <&gcc GCC_PCIE_4_GDSC>;
required-opps = <&rpmhpd_opp_nom>;
phys = <&pcie4_phy>; phys = <&pcie4_phy>;
phy-names = "pciephy"; phy-names = "pciephy";
status = "disabled"; status = "disabled";
pcie4_port0: pcie@0 {
device_type = "pci";
reg = <0x0 0x0 0x0 0x0 0x0>;
bus-range = <0x01 0xff>;
#address-cells = <3>;
#size-cells = <2>;
ranges;
};
}; };
pcie4_phy: phy@1c0e000 { pcie4_phy: phy@1c0e000 {
@ -3155,9 +3167,10 @@
interconnects = <&gem_noc MASTER_GFX3D 0 &mc_virt SLAVE_EBI1 0>; interconnects = <&gem_noc MASTER_GFX3D 0 &mc_virt SLAVE_EBI1 0>;
interconnect-names = "gfx-mem"; interconnect-names = "gfx-mem";
status = "disabled";
zap-shader { zap-shader {
memory-region = <&gpu_microcode_mem>; memory-region = <&gpu_microcode_mem>;
firmware-name = "qcom/gen70500_zap.mbn";
}; };
gpu_opp_table: opp-table { gpu_opp_table: opp-table {
@ -3288,7 +3301,7 @@
reg = <0x0 0x03da0000 0x0 0x40000>; reg = <0x0 0x03da0000 0x0 0x40000>;
#iommu-cells = <2>; #iommu-cells = <2>;
#global-interrupts = <1>; #global-interrupts = <1>;
interrupts = <GIC_SPI 673 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 674 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 678 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 678 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 679 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 679 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 680 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 680 IRQ_TYPE_LEVEL_HIGH>,

View File

@ -887,6 +887,7 @@ CONFIG_DRM_PANEL_KHADAS_TS050=m
CONFIG_DRM_PANEL_MANTIX_MLAF057WE51=m CONFIG_DRM_PANEL_MANTIX_MLAF057WE51=m
CONFIG_DRM_PANEL_NOVATEK_NT36672E=m CONFIG_DRM_PANEL_NOVATEK_NT36672E=m
CONFIG_DRM_PANEL_RAYDIUM_RM67191=m CONFIG_DRM_PANEL_RAYDIUM_RM67191=m
CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20=m
CONFIG_DRM_PANEL_SITRONIX_ST7703=m CONFIG_DRM_PANEL_SITRONIX_ST7703=m
CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA=m CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA=m
CONFIG_DRM_PANEL_VISIONOX_VTDR6130=m CONFIG_DRM_PANEL_VISIONOX_VTDR6130=m

View File

@ -193,11 +193,6 @@ asmlinkage void __init mmu_init(void)
{ {
unsigned int kstart, ksize; unsigned int kstart, ksize;
if (!memblock.reserved.cnt) {
pr_emerg("Error memory count\n");
machine_restart(NULL);
}
if ((u32) memblock.memory.regions[0].size < 0x400000) { if ((u32) memblock.memory.regions[0].size < 0x400000) {
pr_emerg("Memory must be greater than 4MB\n"); pr_emerg("Memory must be greater than 4MB\n");
machine_restart(NULL); machine_restart(NULL);

View File

@ -21,9 +21,7 @@ static struct clocksource clocksource_mips = {
.name = "MIPS", .name = "MIPS",
.read = c0_hpt_read, .read = c0_hpt_read,
.mask = CLOCKSOURCE_MASK(32), .mask = CLOCKSOURCE_MASK(32),
.flags = CLOCK_SOURCE_IS_CONTINUOUS | .flags = CLOCK_SOURCE_IS_CONTINUOUS,
CLOCK_SOURCE_MUST_VERIFY |
CLOCK_SOURCE_VERIFY_PERCPU,
}; };
static u64 __maybe_unused notrace r4k_read_sched_clock(void) static u64 __maybe_unused notrace r4k_read_sched_clock(void)

View File

@ -459,7 +459,6 @@ void free_initmem(void)
unsigned long kernel_end = (unsigned long)&_end; unsigned long kernel_end = (unsigned long)&_end;
/* Remap kernel text and data, but do not touch init section yet. */ /* Remap kernel text and data, but do not touch init section yet. */
kernel_set_to_readonly = true;
map_pages(init_end, __pa(init_end), kernel_end - init_end, map_pages(init_end, __pa(init_end), kernel_end - init_end,
PAGE_KERNEL, 0); PAGE_KERNEL, 0);
@ -493,11 +492,18 @@ void free_initmem(void)
#ifdef CONFIG_STRICT_KERNEL_RWX #ifdef CONFIG_STRICT_KERNEL_RWX
void mark_rodata_ro(void) void mark_rodata_ro(void)
{ {
/* rodata memory was already mapped with KERNEL_RO access rights by unsigned long start = (unsigned long) &__start_rodata;
pagetable_init() and map_pages(). No need to do additional stuff here */ unsigned long end = (unsigned long) &__end_rodata;
unsigned long roai_size = __end_ro_after_init - __start_ro_after_init;
pr_info("Write protected read-only-after-init data: %luk\n", roai_size >> 10); pr_info("Write protecting the kernel read-only data: %luk\n",
(end - start) >> 10);
kernel_set_to_readonly = true;
map_pages(start, __pa(start), end - start, PAGE_KERNEL, 0);
/* force the kernel to see the new page table entries */
flush_cache_all();
flush_tlb_all();
} }
#endif #endif

View File

@ -389,7 +389,6 @@ static bool mmio_read(int size, unsigned long addr, unsigned long *val)
.r12 = size, .r12 = size,
.r13 = EPT_READ, .r13 = EPT_READ,
.r14 = addr, .r14 = addr,
.r15 = *val,
}; };
if (__tdx_hypercall(&args)) if (__tdx_hypercall(&args))

View File

@ -4589,6 +4589,25 @@ static enum hybrid_cpu_type adl_get_hybrid_cpu_type(void)
return HYBRID_INTEL_CORE; return HYBRID_INTEL_CORE;
} }
static inline bool erratum_hsw11(struct perf_event *event)
{
return (event->hw.config & INTEL_ARCH_EVENT_MASK) ==
X86_CONFIG(.event=0xc0, .umask=0x01);
}
/*
* The HSW11 requires a period larger than 100 which is the same as the BDM11.
* A minimum period of 128 is enforced as well for the INST_RETIRED.ALL.
*
* The message 'interrupt took too long' can be observed on any counter which
* was armed with a period < 32 and two events expired in the same NMI.
* A minimum period of 32 is enforced for the rest of the events.
*/
static void hsw_limit_period(struct perf_event *event, s64 *left)
{
*left = max(*left, erratum_hsw11(event) ? 128 : 32);
}
/* /*
* Broadwell: * Broadwell:
* *
@ -4606,8 +4625,7 @@ static enum hybrid_cpu_type adl_get_hybrid_cpu_type(void)
*/ */
static void bdw_limit_period(struct perf_event *event, s64 *left) static void bdw_limit_period(struct perf_event *event, s64 *left)
{ {
if ((event->hw.config & INTEL_ARCH_EVENT_MASK) == if (erratum_hsw11(event)) {
X86_CONFIG(.event=0xc0, .umask=0x01)) {
if (*left < 128) if (*left < 128)
*left = 128; *left = 128;
*left &= ~0x3fULL; *left &= ~0x3fULL;
@ -6766,6 +6784,7 @@ __init int intel_pmu_init(void)
x86_pmu.hw_config = hsw_hw_config; x86_pmu.hw_config = hsw_hw_config;
x86_pmu.get_event_constraints = hsw_get_event_constraints; x86_pmu.get_event_constraints = hsw_get_event_constraints;
x86_pmu.limit_period = hsw_limit_period;
x86_pmu.lbr_double_abort = true; x86_pmu.lbr_double_abort = true;
extra_attr = boot_cpu_has(X86_FEATURE_RTM) ? extra_attr = boot_cpu_has(X86_FEATURE_RTM) ?
hsw_format_attr : nhm_format_attr; hsw_format_attr : nhm_format_attr;

View File

@ -591,6 +591,13 @@ struct fpu_state_config {
* even without XSAVE support, i.e. legacy features FP + SSE * even without XSAVE support, i.e. legacy features FP + SSE
*/ */
u64 legacy_features; u64 legacy_features;
/*
* @independent_features:
*
* Features that are supported by XSAVES, but not managed as part of
* the FPU core, such as LBR
*/
u64 independent_features;
}; };
/* FPU state configuration information */ /* FPU state configuration information */

View File

@ -17,6 +17,7 @@ extern unsigned long phys_base;
extern unsigned long page_offset_base; extern unsigned long page_offset_base;
extern unsigned long vmalloc_base; extern unsigned long vmalloc_base;
extern unsigned long vmemmap_base; extern unsigned long vmemmap_base;
extern unsigned long physmem_end;
static __always_inline unsigned long __phys_addr_nodebug(unsigned long x) static __always_inline unsigned long __phys_addr_nodebug(unsigned long x)
{ {

View File

@ -140,6 +140,10 @@ extern unsigned int ptrs_per_p4d;
# define VMEMMAP_START __VMEMMAP_BASE_L4 # define VMEMMAP_START __VMEMMAP_BASE_L4
#endif /* CONFIG_DYNAMIC_MEMORY_LAYOUT */ #endif /* CONFIG_DYNAMIC_MEMORY_LAYOUT */
#ifdef CONFIG_RANDOMIZE_MEMORY
# define PHYSMEM_END physmem_end
#endif
/* /*
* End of the region for which vmalloc page tables are pre-allocated. * End of the region for which vmalloc page tables are pre-allocated.
* For non-KMSAN builds, this is the same as VMALLOC_END. * For non-KMSAN builds, this is the same as VMALLOC_END.

View File

@ -156,12 +156,6 @@ static inline void resctrl_sched_in(struct task_struct *tsk)
__resctrl_sched_in(tsk); __resctrl_sched_in(tsk);
} }
static inline u32 resctrl_arch_system_num_rmid_idx(void)
{
/* RMID are independent numbers for x86. num_rmid_idx == num_rmid */
return boot_cpu_data.x86_cache_max_rmid + 1;
}
static inline void resctrl_arch_rmid_idx_decode(u32 idx, u32 *closid, u32 *rmid) static inline void resctrl_arch_rmid_idx_decode(u32 idx, u32 *closid, u32 *rmid)
{ {
*rmid = idx; *rmid = idx;

View File

@ -1775,12 +1775,9 @@ static __init void apic_set_fixmap(bool read_apic);
static __init void x2apic_disable(void) static __init void x2apic_disable(void)
{ {
u32 x2apic_id, state = x2apic_state; u32 x2apic_id;
x2apic_mode = 0; if (x2apic_state < X2APIC_ON)
x2apic_state = X2APIC_DISABLED;
if (state != X2APIC_ON)
return; return;
x2apic_id = read_apic_id(); x2apic_id = read_apic_id();
@ -1793,6 +1790,10 @@ static __init void x2apic_disable(void)
} }
__x2apic_disable(); __x2apic_disable();
x2apic_mode = 0;
x2apic_state = X2APIC_DISABLED;
/* /*
* Don't reread the APIC ID as it was already done from * Don't reread the APIC ID as it was already done from
* check_x2apic() and the APIC driver still is a x2APIC variant, * check_x2apic() and the APIC driver still is a x2APIC variant,

View File

@ -119,6 +119,14 @@ struct rdt_hw_resource rdt_resources_all[] = {
}, },
}; };
u32 resctrl_arch_system_num_rmid_idx(void)
{
struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl;
/* RMID are independent numbers for x86. num_rmid_idx == num_rmid */
return r->num_rmid;
}
/* /*
* cache_alloc_hsw_probe() - Have to probe for Intel haswell server CPUs * cache_alloc_hsw_probe() - Have to probe for Intel haswell server CPUs
* as they do not have CPUID enumeration support for Cache allocation. * as they do not have CPUID enumeration support for Cache allocation.

View File

@ -788,6 +788,9 @@ void __init fpu__init_system_xstate(unsigned int legacy_size)
goto out_disable; goto out_disable;
} }
fpu_kernel_cfg.independent_features = fpu_kernel_cfg.max_features &
XFEATURE_MASK_INDEPENDENT;
/* /*
* Clear XSAVE features that are disabled in the normal CPUID. * Clear XSAVE features that are disabled in the normal CPUID.
*/ */

View File

@ -62,9 +62,9 @@ static inline u64 xfeatures_mask_supervisor(void)
static inline u64 xfeatures_mask_independent(void) static inline u64 xfeatures_mask_independent(void)
{ {
if (!cpu_feature_enabled(X86_FEATURE_ARCH_LBR)) if (!cpu_feature_enabled(X86_FEATURE_ARCH_LBR))
return XFEATURE_MASK_INDEPENDENT & ~XFEATURE_MASK_LBR; return fpu_kernel_cfg.independent_features & ~XFEATURE_MASK_LBR;
return XFEATURE_MASK_INDEPENDENT; return fpu_kernel_cfg.independent_features;
} }
/* XSAVE/XRSTOR wrapper functions */ /* XSAVE/XRSTOR wrapper functions */

View File

@ -958,8 +958,12 @@ static void update_end_of_memory_vars(u64 start, u64 size)
int add_pages(int nid, unsigned long start_pfn, unsigned long nr_pages, int add_pages(int nid, unsigned long start_pfn, unsigned long nr_pages,
struct mhp_params *params) struct mhp_params *params)
{ {
unsigned long end = ((start_pfn + nr_pages) << PAGE_SHIFT) - 1;
int ret; int ret;
if (WARN_ON_ONCE(end > PHYSMEM_END))
return -ERANGE;
ret = __add_pages(nid, start_pfn, nr_pages, params); ret = __add_pages(nid, start_pfn, nr_pages, params);
WARN_ON_ONCE(ret); WARN_ON_ONCE(ret);

View File

@ -47,13 +47,24 @@ static const unsigned long vaddr_end = CPU_ENTRY_AREA_BASE;
*/ */
static __initdata struct kaslr_memory_region { static __initdata struct kaslr_memory_region {
unsigned long *base; unsigned long *base;
unsigned long *end;
unsigned long size_tb; unsigned long size_tb;
} kaslr_regions[] = { } kaslr_regions[] = {
{ &page_offset_base, 0 }, {
{ &vmalloc_base, 0 }, .base = &page_offset_base,
{ &vmemmap_base, 0 }, .end = &physmem_end,
},
{
.base = &vmalloc_base,
},
{
.base = &vmemmap_base,
},
}; };
/* The end of the possible address space for physical memory */
unsigned long physmem_end __ro_after_init;
/* Get size in bytes used by the memory region */ /* Get size in bytes used by the memory region */
static inline unsigned long get_padding(struct kaslr_memory_region *region) static inline unsigned long get_padding(struct kaslr_memory_region *region)
{ {
@ -82,6 +93,8 @@ void __init kernel_randomize_memory(void)
BUILD_BUG_ON(vaddr_end != CPU_ENTRY_AREA_BASE); BUILD_BUG_ON(vaddr_end != CPU_ENTRY_AREA_BASE);
BUILD_BUG_ON(vaddr_end > __START_KERNEL_map); BUILD_BUG_ON(vaddr_end > __START_KERNEL_map);
/* Preset the end of the possible address space for physical memory */
physmem_end = ((1ULL << MAX_PHYSMEM_BITS) - 1);
if (!kaslr_memory_enabled()) if (!kaslr_memory_enabled())
return; return;
@ -128,11 +141,18 @@ void __init kernel_randomize_memory(void)
vaddr += entropy; vaddr += entropy;
*kaslr_regions[i].base = vaddr; *kaslr_regions[i].base = vaddr;
/* /* Calculate the end of the region */
* Jump the region and add a minimum padding based on
* randomization alignment.
*/
vaddr += get_padding(&kaslr_regions[i]); vaddr += get_padding(&kaslr_regions[i]);
/*
* KASLR trims the maximum possible size of the
* direct-map. Update the physmem_end boundary.
* No rounding required as the region starts
* PUD aligned and size is in units of TB.
*/
if (kaslr_regions[i].end)
*kaslr_regions[i].end = __pa_nodebug(vaddr - 1);
/* Add a minimum padding based on randomization alignment. */
vaddr = round_up(vaddr + 1, PUD_SIZE); vaddr = round_up(vaddr + 1, PUD_SIZE);
remain_entropy -= entropy; remain_entropy -= entropy;
} }

View File

@ -174,7 +174,7 @@ static int blkdev_issue_write_zeroes(struct block_device *bdev, sector_t sector,
* on an I/O error, in which case we'll turn any error into * on an I/O error, in which case we'll turn any error into
* "not supported" here. * "not supported" here.
*/ */
if (ret && !limit) if (ret && !bdev_write_zeroes_sectors(bdev))
return -EOPNOTSUPP; return -EOPNOTSUPP;
return ret; return ret;
} }

View File

@ -5593,8 +5593,10 @@ struct ata_host *ata_host_alloc(struct device *dev, int n_ports)
} }
dr = devres_alloc(ata_devres_release, 0, GFP_KERNEL); dr = devres_alloc(ata_devres_release, 0, GFP_KERNEL);
if (!dr) if (!dr) {
kfree(host);
goto err_out; goto err_out;
}
devres_add(dev, dr); devres_add(dev, dr);
dev_set_drvdata(dev, host); dev_set_drvdata(dev, host);

View File

@ -1091,6 +1091,7 @@ static void qca_controller_memdump(struct work_struct *work)
qca->memdump_state = QCA_MEMDUMP_COLLECTED; qca->memdump_state = QCA_MEMDUMP_COLLECTED;
cancel_delayed_work(&qca->ctrl_memdump_timeout); cancel_delayed_work(&qca->ctrl_memdump_timeout);
clear_bit(QCA_MEMDUMP_COLLECTION, &qca->flags); clear_bit(QCA_MEMDUMP_COLLECTION, &qca->flags);
clear_bit(QCA_IBS_DISABLED, &qca->flags);
mutex_unlock(&qca->hci_memdump_lock); mutex_unlock(&qca->hci_memdump_lock);
return; return;
} }

View File

@ -160,14 +160,17 @@ static void amd_pstate_ut_check_perf(u32 index)
lowest_perf = AMD_CPPC_LOWEST_PERF(cap1); lowest_perf = AMD_CPPC_LOWEST_PERF(cap1);
} }
if ((highest_perf != READ_ONCE(cpudata->highest_perf)) || if (highest_perf != READ_ONCE(cpudata->highest_perf) && !cpudata->hw_prefcore) {
(nominal_perf != READ_ONCE(cpudata->nominal_perf)) || pr_err("%s cpu%d highest=%d %d highest perf doesn't match\n",
__func__, cpu, highest_perf, cpudata->highest_perf);
goto skip_test;
}
if ((nominal_perf != READ_ONCE(cpudata->nominal_perf)) ||
(lowest_nonlinear_perf != READ_ONCE(cpudata->lowest_nonlinear_perf)) || (lowest_nonlinear_perf != READ_ONCE(cpudata->lowest_nonlinear_perf)) ||
(lowest_perf != READ_ONCE(cpudata->lowest_perf))) { (lowest_perf != READ_ONCE(cpudata->lowest_perf))) {
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL; amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL;
pr_err("%s cpu%d highest=%d %d nominal=%d %d lowest_nonlinear=%d %d lowest=%d %d, they should be equal!\n", pr_err("%s cpu%d nominal=%d %d lowest_nonlinear=%d %d lowest=%d %d, they should be equal!\n",
__func__, cpu, highest_perf, cpudata->highest_perf, __func__, cpu, nominal_perf, cpudata->nominal_perf,
nominal_perf, cpudata->nominal_perf,
lowest_nonlinear_perf, cpudata->lowest_nonlinear_perf, lowest_nonlinear_perf, cpudata->lowest_nonlinear_perf,
lowest_perf, cpudata->lowest_perf); lowest_perf, cpudata->lowest_perf);
goto skip_test; goto skip_test;

View File

@ -321,7 +321,7 @@ static inline int pstate_enable(bool enable)
return 0; return 0;
for_each_present_cpu(cpu) { for_each_present_cpu(cpu) {
unsigned long logical_id = topology_logical_die_id(cpu); unsigned long logical_id = topology_logical_package_id(cpu);
if (test_bit(logical_id, &logical_proc_id_mask)) if (test_bit(logical_id, &logical_proc_id_mask))
continue; continue;
@ -692,7 +692,7 @@ static int amd_pstate_cpu_boost_update(struct cpufreq_policy *policy, bool on)
struct amd_cpudata *cpudata = policy->driver_data; struct amd_cpudata *cpudata = policy->driver_data;
struct cppc_perf_ctrls perf_ctrls; struct cppc_perf_ctrls perf_ctrls;
u32 highest_perf, nominal_perf, nominal_freq, max_freq; u32 highest_perf, nominal_perf, nominal_freq, max_freq;
int ret; int ret = 0;
highest_perf = READ_ONCE(cpudata->highest_perf); highest_perf = READ_ONCE(cpudata->highest_perf);
nominal_perf = READ_ONCE(cpudata->nominal_perf); nominal_perf = READ_ONCE(cpudata->nominal_perf);

View File

@ -17,8 +17,8 @@ enum dw_hdma_control {
DW_HDMA_V0_CB = BIT(0), DW_HDMA_V0_CB = BIT(0),
DW_HDMA_V0_TCB = BIT(1), DW_HDMA_V0_TCB = BIT(1),
DW_HDMA_V0_LLP = BIT(2), DW_HDMA_V0_LLP = BIT(2),
DW_HDMA_V0_LIE = BIT(3), DW_HDMA_V0_LWIE = BIT(3),
DW_HDMA_V0_RIE = BIT(4), DW_HDMA_V0_RWIE = BIT(4),
DW_HDMA_V0_CCS = BIT(8), DW_HDMA_V0_CCS = BIT(8),
DW_HDMA_V0_LLE = BIT(9), DW_HDMA_V0_LLE = BIT(9),
}; };
@ -195,25 +195,14 @@ static void dw_hdma_v0_write_ll_link(struct dw_edma_chunk *chunk,
static void dw_hdma_v0_core_write_chunk(struct dw_edma_chunk *chunk) static void dw_hdma_v0_core_write_chunk(struct dw_edma_chunk *chunk)
{ {
struct dw_edma_burst *child; struct dw_edma_burst *child;
struct dw_edma_chan *chan = chunk->chan;
u32 control = 0, i = 0; u32 control = 0, i = 0;
int j;
if (chunk->cb) if (chunk->cb)
control = DW_HDMA_V0_CB; control = DW_HDMA_V0_CB;
j = chunk->bursts_alloc; list_for_each_entry(child, &chunk->burst->list, list)
list_for_each_entry(child, &chunk->burst->list, list) {
j--;
if (!j) {
control |= DW_HDMA_V0_LIE;
if (!(chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL))
control |= DW_HDMA_V0_RIE;
}
dw_hdma_v0_write_ll_data(chunk, i++, control, child->sz, dw_hdma_v0_write_ll_data(chunk, i++, control, child->sz,
child->sar, child->dar); child->sar, child->dar);
}
control = DW_HDMA_V0_LLP | DW_HDMA_V0_TCB; control = DW_HDMA_V0_LLP | DW_HDMA_V0_TCB;
if (!chunk->cb) if (!chunk->cb)
@ -247,10 +236,11 @@ static void dw_hdma_v0_core_start(struct dw_edma_chunk *chunk, bool first)
if (first) { if (first) {
/* Enable engine */ /* Enable engine */
SET_CH_32(dw, chan->dir, chan->id, ch_en, BIT(0)); SET_CH_32(dw, chan->dir, chan->id, ch_en, BIT(0));
/* Interrupt enable&unmask - done, abort */ /* Interrupt unmask - stop, abort */
tmp = GET_CH_32(dw, chan->dir, chan->id, int_setup) | tmp = GET_CH_32(dw, chan->dir, chan->id, int_setup);
HDMA_V0_STOP_INT_MASK | HDMA_V0_ABORT_INT_MASK | tmp &= ~(HDMA_V0_STOP_INT_MASK | HDMA_V0_ABORT_INT_MASK);
HDMA_V0_LOCAL_STOP_INT_EN | HDMA_V0_LOCAL_ABORT_INT_EN; /* Interrupt enable - stop, abort */
tmp |= HDMA_V0_LOCAL_STOP_INT_EN | HDMA_V0_LOCAL_ABORT_INT_EN;
if (!(dw->chip->flags & DW_EDMA_CHIP_LOCAL)) if (!(dw->chip->flags & DW_EDMA_CHIP_LOCAL))
tmp |= HDMA_V0_REMOTE_STOP_INT_EN | HDMA_V0_REMOTE_ABORT_INT_EN; tmp |= HDMA_V0_REMOTE_STOP_INT_EN | HDMA_V0_REMOTE_ABORT_INT_EN;
SET_CH_32(dw, chan->dir, chan->id, int_setup, tmp); SET_CH_32(dw, chan->dir, chan->id, int_setup, tmp);

View File

@ -16,6 +16,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/log2.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
@ -621,12 +622,10 @@ dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
struct dw_desc *prev; struct dw_desc *prev;
struct dw_desc *first; struct dw_desc *first;
u32 ctllo, ctlhi; u32 ctllo, ctlhi;
u8 m_master = dwc->dws.m_master; u8 lms = DWC_LLP_LMS(dwc->dws.m_master);
u8 lms = DWC_LLP_LMS(m_master);
dma_addr_t reg; dma_addr_t reg;
unsigned int reg_width; unsigned int reg_width;
unsigned int mem_width; unsigned int mem_width;
unsigned int data_width = dw->pdata->data_width[m_master];
unsigned int i; unsigned int i;
struct scatterlist *sg; struct scatterlist *sg;
size_t total_len = 0; size_t total_len = 0;
@ -660,7 +659,7 @@ dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
mem = sg_dma_address(sg); mem = sg_dma_address(sg);
len = sg_dma_len(sg); len = sg_dma_len(sg);
mem_width = __ffs(data_width | mem | len); mem_width = __ffs(sconfig->src_addr_width | mem | len);
slave_sg_todev_fill_desc: slave_sg_todev_fill_desc:
desc = dwc_desc_get(dwc); desc = dwc_desc_get(dwc);
@ -720,7 +719,7 @@ slave_sg_fromdev_fill_desc:
lli_write(desc, sar, reg); lli_write(desc, sar, reg);
lli_write(desc, dar, mem); lli_write(desc, dar, mem);
lli_write(desc, ctlhi, ctlhi); lli_write(desc, ctlhi, ctlhi);
mem_width = __ffs(data_width | mem); mem_width = __ffs(sconfig->dst_addr_width | mem);
lli_write(desc, ctllo, ctllo | DWC_CTLL_DST_WIDTH(mem_width)); lli_write(desc, ctllo, ctllo | DWC_CTLL_DST_WIDTH(mem_width));
desc->len = dlen; desc->len = dlen;
@ -780,20 +779,108 @@ bool dw_dma_filter(struct dma_chan *chan, void *param)
} }
EXPORT_SYMBOL_GPL(dw_dma_filter); EXPORT_SYMBOL_GPL(dw_dma_filter);
static int dwc_config(struct dma_chan *chan, struct dma_slave_config *sconfig) static int dwc_verify_maxburst(struct dma_chan *chan)
{
struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
dwc->dma_sconfig.src_maxburst =
clamp(dwc->dma_sconfig.src_maxburst, 1U, dwc->max_burst);
dwc->dma_sconfig.dst_maxburst =
clamp(dwc->dma_sconfig.dst_maxburst, 1U, dwc->max_burst);
dwc->dma_sconfig.src_maxburst =
rounddown_pow_of_two(dwc->dma_sconfig.src_maxburst);
dwc->dma_sconfig.dst_maxburst =
rounddown_pow_of_two(dwc->dma_sconfig.dst_maxburst);
return 0;
}
static int dwc_verify_p_buswidth(struct dma_chan *chan)
{ {
struct dw_dma_chan *dwc = to_dw_dma_chan(chan); struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
struct dw_dma *dw = to_dw_dma(chan->device); struct dw_dma *dw = to_dw_dma(chan->device);
u32 reg_width, max_width;
if (dwc->dma_sconfig.direction == DMA_MEM_TO_DEV)
reg_width = dwc->dma_sconfig.dst_addr_width;
else if (dwc->dma_sconfig.direction == DMA_DEV_TO_MEM)
reg_width = dwc->dma_sconfig.src_addr_width;
else /* DMA_MEM_TO_MEM */
return 0;
max_width = dw->pdata->data_width[dwc->dws.p_master];
/* Fall-back to 1-byte transfer width if undefined */
if (reg_width == DMA_SLAVE_BUSWIDTH_UNDEFINED)
reg_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
else if (!is_power_of_2(reg_width) || reg_width > max_width)
return -EINVAL;
else /* bus width is valid */
return 0;
/* Update undefined addr width value */
if (dwc->dma_sconfig.direction == DMA_MEM_TO_DEV)
dwc->dma_sconfig.dst_addr_width = reg_width;
else /* DMA_DEV_TO_MEM */
dwc->dma_sconfig.src_addr_width = reg_width;
return 0;
}
static int dwc_verify_m_buswidth(struct dma_chan *chan)
{
struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
struct dw_dma *dw = to_dw_dma(chan->device);
u32 reg_width, reg_burst, mem_width;
mem_width = dw->pdata->data_width[dwc->dws.m_master];
/*
* It's possible to have a data portion locked in the DMA FIFO in case
* of the channel suspension. Subsequent channel disabling will cause
* that data silent loss. In order to prevent that maintain the src and
* dst transfer widths coherency by means of the relation:
* (CTLx.SRC_TR_WIDTH * CTLx.SRC_MSIZE >= CTLx.DST_TR_WIDTH)
* Look for the details in the commit message that brings this change.
*
* Note the DMA configs utilized in the calculations below must have
* been verified to have correct values by this method call.
*/
if (dwc->dma_sconfig.direction == DMA_MEM_TO_DEV) {
reg_width = dwc->dma_sconfig.dst_addr_width;
if (mem_width < reg_width)
return -EINVAL;
dwc->dma_sconfig.src_addr_width = mem_width;
} else if (dwc->dma_sconfig.direction == DMA_DEV_TO_MEM) {
reg_width = dwc->dma_sconfig.src_addr_width;
reg_burst = dwc->dma_sconfig.src_maxburst;
dwc->dma_sconfig.dst_addr_width = min(mem_width, reg_width * reg_burst);
}
return 0;
}
static int dwc_config(struct dma_chan *chan, struct dma_slave_config *sconfig)
{
struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
int ret;
memcpy(&dwc->dma_sconfig, sconfig, sizeof(*sconfig)); memcpy(&dwc->dma_sconfig, sconfig, sizeof(*sconfig));
dwc->dma_sconfig.src_maxburst = ret = dwc_verify_maxburst(chan);
clamp(dwc->dma_sconfig.src_maxburst, 0U, dwc->max_burst); if (ret)
dwc->dma_sconfig.dst_maxburst = return ret;
clamp(dwc->dma_sconfig.dst_maxburst, 0U, dwc->max_burst);
dw->encode_maxburst(dwc, &dwc->dma_sconfig.src_maxburst); ret = dwc_verify_p_buswidth(chan);
dw->encode_maxburst(dwc, &dwc->dma_sconfig.dst_maxburst); if (ret)
return ret;
ret = dwc_verify_m_buswidth(chan);
if (ret)
return ret;
return 0; return 0;
} }
@ -1068,7 +1155,7 @@ int do_dma_probe(struct dw_dma_chip *chip)
bool autocfg = false; bool autocfg = false;
unsigned int dw_params; unsigned int dw_params;
unsigned int i; unsigned int i;
int err; int ret;
dw->pdata = devm_kzalloc(chip->dev, sizeof(*dw->pdata), GFP_KERNEL); dw->pdata = devm_kzalloc(chip->dev, sizeof(*dw->pdata), GFP_KERNEL);
if (!dw->pdata) if (!dw->pdata)
@ -1084,7 +1171,7 @@ int do_dma_probe(struct dw_dma_chip *chip)
autocfg = dw_params >> DW_PARAMS_EN & 1; autocfg = dw_params >> DW_PARAMS_EN & 1;
if (!autocfg) { if (!autocfg) {
err = -EINVAL; ret = -EINVAL;
goto err_pdata; goto err_pdata;
} }
@ -1104,7 +1191,7 @@ int do_dma_probe(struct dw_dma_chip *chip)
pdata->chan_allocation_order = CHAN_ALLOCATION_ASCENDING; pdata->chan_allocation_order = CHAN_ALLOCATION_ASCENDING;
pdata->chan_priority = CHAN_PRIORITY_ASCENDING; pdata->chan_priority = CHAN_PRIORITY_ASCENDING;
} else if (chip->pdata->nr_channels > DW_DMA_MAX_NR_CHANNELS) { } else if (chip->pdata->nr_channels > DW_DMA_MAX_NR_CHANNELS) {
err = -EINVAL; ret = -EINVAL;
goto err_pdata; goto err_pdata;
} else { } else {
memcpy(dw->pdata, chip->pdata, sizeof(*dw->pdata)); memcpy(dw->pdata, chip->pdata, sizeof(*dw->pdata));
@ -1116,7 +1203,7 @@ int do_dma_probe(struct dw_dma_chip *chip)
dw->chan = devm_kcalloc(chip->dev, pdata->nr_channels, sizeof(*dw->chan), dw->chan = devm_kcalloc(chip->dev, pdata->nr_channels, sizeof(*dw->chan),
GFP_KERNEL); GFP_KERNEL);
if (!dw->chan) { if (!dw->chan) {
err = -ENOMEM; ret = -ENOMEM;
goto err_pdata; goto err_pdata;
} }
@ -1134,15 +1221,15 @@ int do_dma_probe(struct dw_dma_chip *chip)
sizeof(struct dw_desc), 4, 0); sizeof(struct dw_desc), 4, 0);
if (!dw->desc_pool) { if (!dw->desc_pool) {
dev_err(chip->dev, "No memory for descriptors dma pool\n"); dev_err(chip->dev, "No memory for descriptors dma pool\n");
err = -ENOMEM; ret = -ENOMEM;
goto err_pdata; goto err_pdata;
} }
tasklet_setup(&dw->tasklet, dw_dma_tasklet); tasklet_setup(&dw->tasklet, dw_dma_tasklet);
err = request_irq(chip->irq, dw_dma_interrupt, IRQF_SHARED, ret = request_irq(chip->irq, dw_dma_interrupt, IRQF_SHARED,
dw->name, dw); dw->name, dw);
if (err) if (ret)
goto err_pdata; goto err_pdata;
INIT_LIST_HEAD(&dw->dma.channels); INIT_LIST_HEAD(&dw->dma.channels);
@ -1254,8 +1341,8 @@ int do_dma_probe(struct dw_dma_chip *chip)
*/ */
dma_set_max_seg_size(dw->dma.dev, dw->chan[0].block_size); dma_set_max_seg_size(dw->dma.dev, dw->chan[0].block_size);
err = dma_async_device_register(&dw->dma); ret = dma_async_device_register(&dw->dma);
if (err) if (ret)
goto err_dma_register; goto err_dma_register;
dev_info(chip->dev, "DesignWare DMA Controller, %d channels\n", dev_info(chip->dev, "DesignWare DMA Controller, %d channels\n",
@ -1269,7 +1356,7 @@ err_dma_register:
free_irq(chip->irq, dw); free_irq(chip->irq, dw);
err_pdata: err_pdata:
pm_runtime_put_sync_suspend(chip->dev); pm_runtime_put_sync_suspend(chip->dev);
return err; return ret;
} }
int do_dma_remove(struct dw_dma_chip *chip) int do_dma_remove(struct dw_dma_chip *chip)

View File

@ -64,28 +64,37 @@ static size_t dw_dma_block2bytes(struct dw_dma_chan *dwc, u32 block, u32 width)
return DWC_CTLH_BLOCK_TS(block) << width; return DWC_CTLH_BLOCK_TS(block) << width;
} }
static u32 dw_dma_prepare_ctllo(struct dw_dma_chan *dwc) static inline u8 dw_dma_encode_maxburst(u32 maxburst)
{
struct dma_slave_config *sconfig = &dwc->dma_sconfig;
u8 smsize = (dwc->direction == DMA_DEV_TO_MEM) ? sconfig->src_maxburst : 0;
u8 dmsize = (dwc->direction == DMA_MEM_TO_DEV) ? sconfig->dst_maxburst : 0;
u8 p_master = dwc->dws.p_master;
u8 m_master = dwc->dws.m_master;
u8 dms = (dwc->direction == DMA_MEM_TO_DEV) ? p_master : m_master;
u8 sms = (dwc->direction == DMA_DEV_TO_MEM) ? p_master : m_master;
return DWC_CTLL_LLP_D_EN | DWC_CTLL_LLP_S_EN |
DWC_CTLL_DST_MSIZE(dmsize) | DWC_CTLL_SRC_MSIZE(smsize) |
DWC_CTLL_DMS(dms) | DWC_CTLL_SMS(sms);
}
static void dw_dma_encode_maxburst(struct dw_dma_chan *dwc, u32 *maxburst)
{ {
/* /*
* Fix burst size according to dw_dmac. We need to convert them as: * Fix burst size according to dw_dmac. We need to convert them as:
* 1 -> 0, 4 -> 1, 8 -> 2, 16 -> 3. * 1 -> 0, 4 -> 1, 8 -> 2, 16 -> 3.
*/ */
*maxburst = *maxburst > 1 ? fls(*maxburst) - 2 : 0; return maxburst > 1 ? fls(maxburst) - 2 : 0;
}
static u32 dw_dma_prepare_ctllo(struct dw_dma_chan *dwc)
{
struct dma_slave_config *sconfig = &dwc->dma_sconfig;
u8 smsize = 0, dmsize = 0;
u8 sms, dms;
if (dwc->direction == DMA_MEM_TO_DEV) {
sms = dwc->dws.m_master;
dms = dwc->dws.p_master;
dmsize = dw_dma_encode_maxburst(sconfig->dst_maxburst);
} else if (dwc->direction == DMA_DEV_TO_MEM) {
sms = dwc->dws.p_master;
dms = dwc->dws.m_master;
smsize = dw_dma_encode_maxburst(sconfig->src_maxburst);
} else /* DMA_MEM_TO_MEM */ {
sms = dwc->dws.m_master;
dms = dwc->dws.m_master;
}
return DWC_CTLL_LLP_D_EN | DWC_CTLL_LLP_S_EN |
DWC_CTLL_DST_MSIZE(dmsize) | DWC_CTLL_SRC_MSIZE(smsize) |
DWC_CTLL_DMS(dms) | DWC_CTLL_SMS(sms);
} }
static void dw_dma_set_device_name(struct dw_dma *dw, int id) static void dw_dma_set_device_name(struct dw_dma *dw, int id)
@ -116,7 +125,6 @@ int dw_dma_probe(struct dw_dma_chip *chip)
dw->suspend_chan = dw_dma_suspend_chan; dw->suspend_chan = dw_dma_suspend_chan;
dw->resume_chan = dw_dma_resume_chan; dw->resume_chan = dw_dma_resume_chan;
dw->prepare_ctllo = dw_dma_prepare_ctllo; dw->prepare_ctllo = dw_dma_prepare_ctllo;
dw->encode_maxburst = dw_dma_encode_maxburst;
dw->bytes2block = dw_dma_bytes2block; dw->bytes2block = dw_dma_bytes2block;
dw->block2bytes = dw_dma_block2bytes; dw->block2bytes = dw_dma_block2bytes;

View File

@ -199,21 +199,25 @@ static size_t idma32_block2bytes(struct dw_dma_chan *dwc, u32 block, u32 width)
return IDMA32C_CTLH_BLOCK_TS(block); return IDMA32C_CTLH_BLOCK_TS(block);
} }
static inline u8 idma32_encode_maxburst(u32 maxburst)
{
return maxburst > 1 ? fls(maxburst) - 1 : 0;
}
static u32 idma32_prepare_ctllo(struct dw_dma_chan *dwc) static u32 idma32_prepare_ctllo(struct dw_dma_chan *dwc)
{ {
struct dma_slave_config *sconfig = &dwc->dma_sconfig; struct dma_slave_config *sconfig = &dwc->dma_sconfig;
u8 smsize = (dwc->direction == DMA_DEV_TO_MEM) ? sconfig->src_maxburst : 0; u8 smsize = 0, dmsize = 0;
u8 dmsize = (dwc->direction == DMA_MEM_TO_DEV) ? sconfig->dst_maxburst : 0;
if (dwc->direction == DMA_MEM_TO_DEV)
dmsize = idma32_encode_maxburst(sconfig->dst_maxburst);
else if (dwc->direction == DMA_DEV_TO_MEM)
smsize = idma32_encode_maxburst(sconfig->src_maxburst);
return DWC_CTLL_LLP_D_EN | DWC_CTLL_LLP_S_EN | return DWC_CTLL_LLP_D_EN | DWC_CTLL_LLP_S_EN |
DWC_CTLL_DST_MSIZE(dmsize) | DWC_CTLL_SRC_MSIZE(smsize); DWC_CTLL_DST_MSIZE(dmsize) | DWC_CTLL_SRC_MSIZE(smsize);
} }
static void idma32_encode_maxburst(struct dw_dma_chan *dwc, u32 *maxburst)
{
*maxburst = *maxburst > 1 ? fls(*maxburst) - 1 : 0;
}
static void idma32_set_device_name(struct dw_dma *dw, int id) static void idma32_set_device_name(struct dw_dma *dw, int id)
{ {
snprintf(dw->name, sizeof(dw->name), "idma32:dmac%d", id); snprintf(dw->name, sizeof(dw->name), "idma32:dmac%d", id);
@ -270,7 +274,6 @@ int idma32_dma_probe(struct dw_dma_chip *chip)
dw->suspend_chan = idma32_suspend_chan; dw->suspend_chan = idma32_suspend_chan;
dw->resume_chan = idma32_resume_chan; dw->resume_chan = idma32_resume_chan;
dw->prepare_ctllo = idma32_prepare_ctllo; dw->prepare_ctllo = idma32_prepare_ctllo;
dw->encode_maxburst = idma32_encode_maxburst;
dw->bytes2block = idma32_bytes2block; dw->bytes2block = idma32_bytes2block;
dw->block2bytes = idma32_block2bytes; dw->block2bytes = idma32_block2bytes;

View File

@ -29,7 +29,7 @@ static int dw_probe(struct platform_device *pdev)
struct dw_dma_chip_pdata *data; struct dw_dma_chip_pdata *data;
struct dw_dma_chip *chip; struct dw_dma_chip *chip;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
int err; int ret;
match = device_get_match_data(dev); match = device_get_match_data(dev);
if (!match) if (!match)
@ -51,9 +51,9 @@ static int dw_probe(struct platform_device *pdev)
if (IS_ERR(chip->regs)) if (IS_ERR(chip->regs))
return PTR_ERR(chip->regs); return PTR_ERR(chip->regs);
err = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); ret = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
if (err) if (ret)
return err; return ret;
if (!data->pdata) if (!data->pdata)
data->pdata = dev_get_platdata(dev); data->pdata = dev_get_platdata(dev);
@ -69,14 +69,14 @@ static int dw_probe(struct platform_device *pdev)
chip->clk = devm_clk_get_optional(chip->dev, "hclk"); chip->clk = devm_clk_get_optional(chip->dev, "hclk");
if (IS_ERR(chip->clk)) if (IS_ERR(chip->clk))
return PTR_ERR(chip->clk); return PTR_ERR(chip->clk);
err = clk_prepare_enable(chip->clk); ret = clk_prepare_enable(chip->clk);
if (err) if (ret)
return err; return ret;
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
err = data->probe(chip); ret = data->probe(chip);
if (err) if (ret)
goto err_dw_dma_probe; goto err_dw_dma_probe;
platform_set_drvdata(pdev, data); platform_set_drvdata(pdev, data);
@ -90,7 +90,7 @@ static int dw_probe(struct platform_device *pdev)
err_dw_dma_probe: err_dw_dma_probe:
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
clk_disable_unprepare(chip->clk); clk_disable_unprepare(chip->clk);
return err; return ret;
} }
static void dw_remove(struct platform_device *pdev) static void dw_remove(struct platform_device *pdev)

View File

@ -327,7 +327,6 @@ struct dw_dma {
void (*suspend_chan)(struct dw_dma_chan *dwc, bool drain); void (*suspend_chan)(struct dw_dma_chan *dwc, bool drain);
void (*resume_chan)(struct dw_dma_chan *dwc, bool drain); void (*resume_chan)(struct dw_dma_chan *dwc, bool drain);
u32 (*prepare_ctllo)(struct dw_dma_chan *dwc); u32 (*prepare_ctllo)(struct dw_dma_chan *dwc);
void (*encode_maxburst)(struct dw_dma_chan *dwc, u32 *maxburst);
u32 (*bytes2block)(struct dw_dma_chan *dwc, size_t bytes, u32 (*bytes2block)(struct dw_dma_chan *dwc, size_t bytes,
unsigned int width, size_t *len); unsigned int width, size_t *len);
size_t (*block2bytes)(struct dw_dma_chan *dwc, u32 block, u32 width); size_t (*block2bytes)(struct dw_dma_chan *dwc, u32 block, u32 width);

View File

@ -403,6 +403,7 @@ static struct stm32_dma3_swdesc *stm32_dma3_chan_desc_alloc(struct stm32_dma3_ch
swdesc = kzalloc(struct_size(swdesc, lli, count), GFP_NOWAIT); swdesc = kzalloc(struct_size(swdesc, lli, count), GFP_NOWAIT);
if (!swdesc) if (!swdesc)
return NULL; return NULL;
swdesc->lli_size = count;
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
swdesc->lli[i].hwdesc = dma_pool_zalloc(chan->lli_pool, GFP_NOWAIT, swdesc->lli[i].hwdesc = dma_pool_zalloc(chan->lli_pool, GFP_NOWAIT,
@ -410,7 +411,6 @@ static struct stm32_dma3_swdesc *stm32_dma3_chan_desc_alloc(struct stm32_dma3_ch
if (!swdesc->lli[i].hwdesc) if (!swdesc->lli[i].hwdesc)
goto err_pool_free; goto err_pool_free;
} }
swdesc->lli_size = count;
swdesc->ccr = 0; swdesc->ccr = 0;
/* Set LL base address */ /* Set LL base address */

View File

@ -1186,10 +1186,10 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
d->dev_addr = dev_addr; d->dev_addr = dev_addr;
d->fi = burst; d->fi = burst;
d->es = es; d->es = es;
d->sglen = 1;
d->sg[0].addr = buf_addr; d->sg[0].addr = buf_addr;
d->sg[0].en = period_len / es_bytes[es]; d->sg[0].en = period_len / es_bytes[es];
d->sg[0].fn = buf_len / period_len; d->sg[0].fn = buf_len / period_len;
d->sglen = 1;
d->ccr = c->ccr; d->ccr = c->ccr;
if (dir == DMA_DEV_TO_MEM) if (dir == DMA_DEV_TO_MEM)
@ -1258,10 +1258,10 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_memcpy(
d->dev_addr = src; d->dev_addr = src;
d->fi = 0; d->fi = 0;
d->es = data_type; d->es = data_type;
d->sglen = 1;
d->sg[0].en = len / BIT(data_type); d->sg[0].en = len / BIT(data_type);
d->sg[0].fn = 1; d->sg[0].fn = 1;
d->sg[0].addr = dest; d->sg[0].addr = dest;
d->sglen = 1;
d->ccr = c->ccr; d->ccr = c->ccr;
d->ccr |= CCR_DST_AMODE_POSTINC | CCR_SRC_AMODE_POSTINC; d->ccr |= CCR_DST_AMODE_POSTINC | CCR_SRC_AMODE_POSTINC;
@ -1309,6 +1309,7 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_interleaved(
if (data_type > CSDP_DATA_TYPE_32) if (data_type > CSDP_DATA_TYPE_32)
data_type = CSDP_DATA_TYPE_32; data_type = CSDP_DATA_TYPE_32;
d->sglen = 1;
sg = &d->sg[0]; sg = &d->sg[0];
d->dir = DMA_MEM_TO_MEM; d->dir = DMA_MEM_TO_MEM;
d->dev_addr = xt->src_start; d->dev_addr = xt->src_start;
@ -1316,7 +1317,6 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_interleaved(
sg->en = xt->sgl[0].size / BIT(data_type); sg->en = xt->sgl[0].size / BIT(data_type);
sg->fn = xt->numf; sg->fn = xt->numf;
sg->addr = xt->dst_start; sg->addr = xt->dst_start;
d->sglen = 1;
d->ccr = c->ccr; d->ccr = c->ccr;
src_icg = dmaengine_get_src_icg(xt, &xt->sgl[0]); src_icg = dmaengine_get_src_icg(xt, &xt->sgl[0]);

View File

@ -166,7 +166,7 @@ static enum fw_upload_err mpfs_auto_update_poll_complete(struct fw_upload *fw_up
*/ */
ret = wait_for_completion_timeout(&priv->programming_complete, ret = wait_for_completion_timeout(&priv->programming_complete,
msecs_to_jiffies(AUTO_UPDATE_TIMEOUT_MS)); msecs_to_jiffies(AUTO_UPDATE_TIMEOUT_MS));
if (ret) if (!ret)
return FW_UPLOAD_ERR_TIMEOUT; return FW_UPLOAD_ERR_TIMEOUT;
return FW_UPLOAD_ERR_NONE; return FW_UPLOAD_ERR_NONE;

View File

@ -73,7 +73,7 @@ int scm_get_wq_ctx(u32 *wq_ctx, u32 *flags, u32 *more_pending)
struct arm_smccc_res get_wq_res; struct arm_smccc_res get_wq_res;
struct arm_smccc_args get_wq_ctx = {0}; struct arm_smccc_args get_wq_ctx = {0};
get_wq_ctx.args[0] = ARM_SMCCC_CALL_VAL(ARM_SMCCC_STD_CALL, get_wq_ctx.args[0] = ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,
ARM_SMCCC_SMC_64, ARM_SMCCC_OWNER_SIP, ARM_SMCCC_SMC_64, ARM_SMCCC_OWNER_SIP,
SCM_SMC_FNID(QCOM_SCM_SVC_WAITQ, QCOM_SCM_WAITQ_GET_WQ_CTX)); SCM_SMC_FNID(QCOM_SCM_SVC_WAITQ, QCOM_SCM_WAITQ_GET_WQ_CTX));

View File

@ -40,7 +40,6 @@ struct qcom_tzmem_pool {
}; };
struct qcom_tzmem_chunk { struct qcom_tzmem_chunk {
phys_addr_t paddr;
size_t size; size_t size;
struct qcom_tzmem_pool *owner; struct qcom_tzmem_pool *owner;
}; };
@ -78,6 +77,7 @@ static bool qcom_tzmem_using_shm_bridge;
/* List of machines that are known to not support SHM bridge correctly. */ /* List of machines that are known to not support SHM bridge correctly. */
static const char *const qcom_tzmem_blacklist[] = { static const char *const qcom_tzmem_blacklist[] = {
"qcom,sc8180x", "qcom,sc8180x",
"qcom,sdm670", /* failure in GPU firmware loading */
"qcom,sdm845", /* reset in rmtfs memory assignment */ "qcom,sdm845", /* reset in rmtfs memory assignment */
"qcom,sm8150", /* reset in rmtfs memory assignment */ "qcom,sm8150", /* reset in rmtfs memory assignment */
NULL NULL
@ -385,7 +385,6 @@ again:
return NULL; return NULL;
} }
chunk->paddr = gen_pool_virt_to_phys(pool->genpool, vaddr);
chunk->size = size; chunk->size = size;
chunk->owner = pool; chunk->owner = pool;
@ -431,25 +430,37 @@ void qcom_tzmem_free(void *vaddr)
EXPORT_SYMBOL_GPL(qcom_tzmem_free); EXPORT_SYMBOL_GPL(qcom_tzmem_free);
/** /**
* qcom_tzmem_to_phys() - Map the virtual address of a TZ buffer to physical. * qcom_tzmem_to_phys() - Map the virtual address of TZ memory to physical.
* @vaddr: Virtual address of the buffer allocated from a TZ memory pool. * @vaddr: Virtual address of memory allocated from a TZ memory pool.
* *
* Can be used in any context. The address must have been returned by a call * Can be used in any context. The address must point to memory allocated
* to qcom_tzmem_alloc(). * using qcom_tzmem_alloc().
* *
* Returns: Physical address of the buffer. * Returns:
* Physical address mapped from the virtual or 0 if the mapping failed.
*/ */
phys_addr_t qcom_tzmem_to_phys(void *vaddr) phys_addr_t qcom_tzmem_to_phys(void *vaddr)
{ {
struct qcom_tzmem_chunk *chunk; struct qcom_tzmem_chunk *chunk;
struct radix_tree_iter iter;
void __rcu **slot;
phys_addr_t ret;
guard(spinlock_irqsave)(&qcom_tzmem_chunks_lock); guard(spinlock_irqsave)(&qcom_tzmem_chunks_lock);
chunk = radix_tree_lookup(&qcom_tzmem_chunks, (unsigned long)vaddr); radix_tree_for_each_slot(slot, &qcom_tzmem_chunks, &iter, 0) {
if (!chunk) chunk = radix_tree_deref_slot_protected(slot,
return 0; &qcom_tzmem_chunks_lock);
return chunk->paddr; ret = gen_pool_virt_to_phys(chunk->owner->genpool,
(unsigned long)vaddr);
if (ret == -1)
continue;
return ret;
}
return 0;
} }
EXPORT_SYMBOL_GPL(qcom_tzmem_to_phys); EXPORT_SYMBOL_GPL(qcom_tzmem_to_phys);

View File

@ -39,6 +39,8 @@ static struct platform_device *pd;
static DEFINE_MUTEX(disable_lock); static DEFINE_MUTEX(disable_lock);
static bool disabled; static bool disabled;
static struct device *sysfb_parent_dev(const struct screen_info *si);
static bool sysfb_unregister(void) static bool sysfb_unregister(void)
{ {
if (IS_ERR_OR_NULL(pd)) if (IS_ERR_OR_NULL(pd))
@ -52,6 +54,7 @@ static bool sysfb_unregister(void)
/** /**
* sysfb_disable() - disable the Generic System Framebuffers support * sysfb_disable() - disable the Generic System Framebuffers support
* @dev: the device to check if non-NULL
* *
* This disables the registration of system framebuffer devices that match the * This disables the registration of system framebuffer devices that match the
* generic drivers that make use of the system framebuffer set up by firmware. * generic drivers that make use of the system framebuffer set up by firmware.
@ -61,17 +64,21 @@ static bool sysfb_unregister(void)
* Context: The function can sleep. A @disable_lock mutex is acquired to serialize * Context: The function can sleep. A @disable_lock mutex is acquired to serialize
* against sysfb_init(), that registers a system framebuffer device. * against sysfb_init(), that registers a system framebuffer device.
*/ */
void sysfb_disable(void) void sysfb_disable(struct device *dev)
{ {
struct screen_info *si = &screen_info;
mutex_lock(&disable_lock); mutex_lock(&disable_lock);
if (!dev || dev == sysfb_parent_dev(si)) {
sysfb_unregister(); sysfb_unregister();
disabled = true; disabled = true;
}
mutex_unlock(&disable_lock); mutex_unlock(&disable_lock);
} }
EXPORT_SYMBOL_GPL(sysfb_disable); EXPORT_SYMBOL_GPL(sysfb_disable);
#if defined(CONFIG_PCI) #if defined(CONFIG_PCI)
static __init bool sysfb_pci_dev_is_enabled(struct pci_dev *pdev) static bool sysfb_pci_dev_is_enabled(struct pci_dev *pdev)
{ {
/* /*
* TODO: Try to integrate this code into the PCI subsystem * TODO: Try to integrate this code into the PCI subsystem
@ -87,13 +94,13 @@ static __init bool sysfb_pci_dev_is_enabled(struct pci_dev *pdev)
return true; return true;
} }
#else #else
static __init bool sysfb_pci_dev_is_enabled(struct pci_dev *pdev) static bool sysfb_pci_dev_is_enabled(struct pci_dev *pdev)
{ {
return false; return false;
} }
#endif #endif
static __init struct device *sysfb_parent_dev(const struct screen_info *si) static struct device *sysfb_parent_dev(const struct screen_info *si)
{ {
struct pci_dev *pdev; struct pci_dev *pdev;

View File

@ -1500,6 +1500,7 @@ union gc_info {
struct gc_info_v1_0 v1; struct gc_info_v1_0 v1;
struct gc_info_v1_1 v1_1; struct gc_info_v1_1 v1_1;
struct gc_info_v1_2 v1_2; struct gc_info_v1_2 v1_2;
struct gc_info_v1_3 v1_3;
struct gc_info_v2_0 v2; struct gc_info_v2_0 v2;
struct gc_info_v2_1 v2_1; struct gc_info_v2_1 v2_1;
}; };
@ -1558,6 +1559,16 @@ static int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)
adev->gfx.config.gc_gl1c_size_per_instance = le32_to_cpu(gc_info->v1_2.gc_gl1c_size_per_instance); adev->gfx.config.gc_gl1c_size_per_instance = le32_to_cpu(gc_info->v1_2.gc_gl1c_size_per_instance);
adev->gfx.config.gc_gl2c_per_gpu = le32_to_cpu(gc_info->v1_2.gc_gl2c_per_gpu); adev->gfx.config.gc_gl2c_per_gpu = le32_to_cpu(gc_info->v1_2.gc_gl2c_per_gpu);
} }
if (le16_to_cpu(gc_info->v1.header.version_minor) >= 3) {
adev->gfx.config.gc_tcp_size_per_cu = le32_to_cpu(gc_info->v1_3.gc_tcp_size_per_cu);
adev->gfx.config.gc_tcp_cache_line_size = le32_to_cpu(gc_info->v1_3.gc_tcp_cache_line_size);
adev->gfx.config.gc_instruction_cache_size_per_sqc = le32_to_cpu(gc_info->v1_3.gc_instruction_cache_size_per_sqc);
adev->gfx.config.gc_instruction_cache_line_size = le32_to_cpu(gc_info->v1_3.gc_instruction_cache_line_size);
adev->gfx.config.gc_scalar_data_cache_size_per_sqc = le32_to_cpu(gc_info->v1_3.gc_scalar_data_cache_size_per_sqc);
adev->gfx.config.gc_scalar_data_cache_line_size = le32_to_cpu(gc_info->v1_3.gc_scalar_data_cache_line_size);
adev->gfx.config.gc_tcc_size = le32_to_cpu(gc_info->v1_3.gc_tcc_size);
adev->gfx.config.gc_tcc_cache_line_size = le32_to_cpu(gc_info->v1_3.gc_tcc_cache_line_size);
}
break; break;
case 2: case 2:
adev->gfx.config.max_shader_engines = le32_to_cpu(gc_info->v2.gc_num_se); adev->gfx.config.max_shader_engines = le32_to_cpu(gc_info->v2.gc_num_se);

View File

@ -240,6 +240,12 @@ struct amdgpu_gfx_config {
uint32_t gc_tcp_size_per_cu; uint32_t gc_tcp_size_per_cu;
uint32_t gc_num_cu_per_sqc; uint32_t gc_num_cu_per_sqc;
uint32_t gc_tcc_size; uint32_t gc_tcc_size;
uint32_t gc_tcp_cache_line_size;
uint32_t gc_instruction_cache_size_per_sqc;
uint32_t gc_instruction_cache_line_size;
uint32_t gc_scalar_data_cache_size_per_sqc;
uint32_t gc_scalar_data_cache_line_size;
uint32_t gc_tcc_cache_line_size;
}; };
struct amdgpu_cu_info { struct amdgpu_cu_info {

View File

@ -3005,7 +3005,7 @@ static int gfx_v12_0_compute_mqd_init(struct amdgpu_device *adev, void *m,
(order_base_2(prop->queue_size / 4) - 1)); (order_base_2(prop->queue_size / 4) - 1));
tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE, tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE,
(order_base_2(AMDGPU_GPU_PAGE_SIZE / 4) - 1)); (order_base_2(AMDGPU_GPU_PAGE_SIZE / 4) - 1));
tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, UNORD_DISPATCH, 0); tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, UNORD_DISPATCH, 1);
tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, TUNNEL_DISPATCH, 0); tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, TUNNEL_DISPATCH, 0);
tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1); tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1);
tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1); tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1);

View File

@ -187,6 +187,7 @@ static void update_mqd(struct mqd_manager *mm, void *mqd,
m->cp_hqd_pq_control = 5 << CP_HQD_PQ_CONTROL__RPTR_BLOCK_SIZE__SHIFT; m->cp_hqd_pq_control = 5 << CP_HQD_PQ_CONTROL__RPTR_BLOCK_SIZE__SHIFT;
m->cp_hqd_pq_control |= m->cp_hqd_pq_control |=
ffs(q->queue_size / sizeof(unsigned int)) - 1 - 1; ffs(q->queue_size / sizeof(unsigned int)) - 1 - 1;
m->cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__UNORD_DISPATCH_MASK;
pr_debug("cp_hqd_pq_control 0x%x\n", m->cp_hqd_pq_control); pr_debug("cp_hqd_pq_control 0x%x\n", m->cp_hqd_pq_control);
m->cp_hqd_pq_base_lo = lower_32_bits((uint64_t)q->queue_address >> 8); m->cp_hqd_pq_base_lo = lower_32_bits((uint64_t)q->queue_address >> 8);

View File

@ -28,6 +28,7 @@
#include <drm/drm_blend.h> #include <drm/drm_blend.h>
#include <drm/drm_gem_atomic_helper.h> #include <drm/drm_gem_atomic_helper.h>
#include <drm/drm_plane_helper.h> #include <drm/drm_plane_helper.h>
#include <drm/drm_gem_framebuffer_helper.h>
#include <drm/drm_fourcc.h> #include <drm/drm_fourcc.h>
#include "amdgpu.h" #include "amdgpu.h"
@ -935,10 +936,14 @@ static int amdgpu_dm_plane_helper_prepare_fb(struct drm_plane *plane,
} }
afb = to_amdgpu_framebuffer(new_state->fb); afb = to_amdgpu_framebuffer(new_state->fb);
obj = new_state->fb->obj[0]; obj = drm_gem_fb_get_obj(new_state->fb, 0);
if (!obj) {
DRM_ERROR("Failed to get obj from framebuffer\n");
return -EINVAL;
}
rbo = gem_to_amdgpu_bo(obj); rbo = gem_to_amdgpu_bo(obj);
adev = amdgpu_ttm_adev(rbo->tbo.bdev); adev = amdgpu_ttm_adev(rbo->tbo.bdev);
r = amdgpu_bo_reserve(rbo, true); r = amdgpu_bo_reserve(rbo, true);
if (r) { if (r) {
dev_err(adev->dev, "fail to reserve bo (%d)\n", r); dev_err(adev->dev, "fail to reserve bo (%d)\n", r);

View File

@ -258,6 +258,48 @@ struct gc_info_v1_2 {
uint32_t gc_gl2c_per_gpu; uint32_t gc_gl2c_per_gpu;
}; };
struct gc_info_v1_3 {
struct gpu_info_header header;
uint32_t gc_num_se;
uint32_t gc_num_wgp0_per_sa;
uint32_t gc_num_wgp1_per_sa;
uint32_t gc_num_rb_per_se;
uint32_t gc_num_gl2c;
uint32_t gc_num_gprs;
uint32_t gc_num_max_gs_thds;
uint32_t gc_gs_table_depth;
uint32_t gc_gsprim_buff_depth;
uint32_t gc_parameter_cache_depth;
uint32_t gc_double_offchip_lds_buffer;
uint32_t gc_wave_size;
uint32_t gc_max_waves_per_simd;
uint32_t gc_max_scratch_slots_per_cu;
uint32_t gc_lds_size;
uint32_t gc_num_sc_per_se;
uint32_t gc_num_sa_per_se;
uint32_t gc_num_packer_per_sc;
uint32_t gc_num_gl2a;
uint32_t gc_num_tcp_per_sa;
uint32_t gc_num_sdp_interface;
uint32_t gc_num_tcps;
uint32_t gc_num_tcp_per_wpg;
uint32_t gc_tcp_l1_size;
uint32_t gc_num_sqc_per_wgp;
uint32_t gc_l1_instruction_cache_size_per_sqc;
uint32_t gc_l1_data_cache_size_per_sqc;
uint32_t gc_gl1c_per_sa;
uint32_t gc_gl1c_size_per_instance;
uint32_t gc_gl2c_per_gpu;
uint32_t gc_tcp_size_per_cu;
uint32_t gc_tcp_cache_line_size;
uint32_t gc_instruction_cache_size_per_sqc;
uint32_t gc_instruction_cache_line_size;
uint32_t gc_scalar_data_cache_size_per_sqc;
uint32_t gc_scalar_data_cache_line_size;
uint32_t gc_tcc_size;
uint32_t gc_tcc_cache_line_size;
};
struct gc_info_v2_0 { struct gc_info_v2_0 {
struct gpu_info_header header; struct gpu_info_header header;

View File

@ -2225,7 +2225,8 @@ static int smu_bump_power_profile_mode(struct smu_context *smu,
static int smu_adjust_power_state_dynamic(struct smu_context *smu, static int smu_adjust_power_state_dynamic(struct smu_context *smu,
enum amd_dpm_forced_level level, enum amd_dpm_forced_level level,
bool skip_display_settings) bool skip_display_settings,
bool force_update)
{ {
int ret = 0; int ret = 0;
int index = 0; int index = 0;
@ -2254,7 +2255,7 @@ static int smu_adjust_power_state_dynamic(struct smu_context *smu,
} }
} }
if (smu_dpm_ctx->dpm_level != level) { if (force_update || smu_dpm_ctx->dpm_level != level) {
ret = smu_asic_set_performance_level(smu, level); ret = smu_asic_set_performance_level(smu, level);
if (ret) { if (ret) {
dev_err(smu->adev->dev, "Failed to set performance level!"); dev_err(smu->adev->dev, "Failed to set performance level!");
@ -2265,13 +2266,12 @@ static int smu_adjust_power_state_dynamic(struct smu_context *smu,
smu_dpm_ctx->dpm_level = level; smu_dpm_ctx->dpm_level = level;
} }
if (smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL && if (smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM) {
smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM) {
index = fls(smu->workload_mask); index = fls(smu->workload_mask);
index = index > 0 && index <= WORKLOAD_POLICY_MAX ? index - 1 : 0; index = index > 0 && index <= WORKLOAD_POLICY_MAX ? index - 1 : 0;
workload[0] = smu->workload_setting[index]; workload[0] = smu->workload_setting[index];
if (smu->power_profile_mode != workload[0]) if (force_update || smu->power_profile_mode != workload[0])
smu_bump_power_profile_mode(smu, workload, 0); smu_bump_power_profile_mode(smu, workload, 0);
} }
@ -2292,11 +2292,13 @@ static int smu_handle_task(struct smu_context *smu,
ret = smu_pre_display_config_changed(smu); ret = smu_pre_display_config_changed(smu);
if (ret) if (ret)
return ret; return ret;
ret = smu_adjust_power_state_dynamic(smu, level, false); ret = smu_adjust_power_state_dynamic(smu, level, false, false);
break; break;
case AMD_PP_TASK_COMPLETE_INIT: case AMD_PP_TASK_COMPLETE_INIT:
ret = smu_adjust_power_state_dynamic(smu, level, true, true);
break;
case AMD_PP_TASK_READJUST_POWER_STATE: case AMD_PP_TASK_READJUST_POWER_STATE:
ret = smu_adjust_power_state_dynamic(smu, level, true); ret = smu_adjust_power_state_dynamic(smu, level, true, false);
break; break;
default: default:
break; break;
@ -2343,8 +2345,7 @@ static int smu_switch_power_profile(void *handle,
workload[0] = smu->workload_setting[index]; workload[0] = smu->workload_setting[index];
} }
if (smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL && if (smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM)
smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM)
smu_bump_power_profile_mode(smu, workload, 0); smu_bump_power_profile_mode(smu, workload, 0);
return 0; return 0;

View File

@ -92,7 +92,6 @@
//Resets //Resets
#define PPSMC_MSG_PrepareMp1ForUnload 0x2E #define PPSMC_MSG_PrepareMp1ForUnload 0x2E
#define PPSMC_MSG_Mode1Reset 0x2F
//Set SystemVirtual DramAddrHigh //Set SystemVirtual DramAddrHigh
#define PPSMC_MSG_SetSystemVirtualDramAddrHigh 0x30 #define PPSMC_MSG_SetSystemVirtualDramAddrHigh 0x30
@ -119,11 +118,12 @@
//STB to dram log //STB to dram log
#define PPSMC_MSG_DumpSTBtoDram 0x3D #define PPSMC_MSG_DumpSTBtoDram 0x3D
#define PPSMC_MSG_STBtoDramLogSetDramAddrHigh 0x3E #define PPSMC_MSG_STBtoDramLogSetDramAddress 0x3E
#define PPSMC_MSG_STBtoDramLogSetDramAddrLow 0x3F #define PPSMC_MSG_DummyUndefined 0x3F
#define PPSMC_MSG_STBtoDramLogSetDramSize 0x40 #define PPSMC_MSG_STBtoDramLogSetDramSize 0x40
#define PPSMC_MSG_SetOBMTraceBufferLogging 0x41 #define PPSMC_MSG_SetOBMTraceBufferLogging 0x41
#define PPSMC_MSG_UseProfilingMode 0x42
#define PPSMC_MSG_AllowGfxDcs 0x43 #define PPSMC_MSG_AllowGfxDcs 0x43
#define PPSMC_MSG_DisallowGfxDcs 0x44 #define PPSMC_MSG_DisallowGfxDcs 0x44
#define PPSMC_MSG_EnableAudioStutterWA 0x45 #define PPSMC_MSG_EnableAudioStutterWA 0x45
@ -135,6 +135,16 @@
#define PPSMC_MSG_SetBadMemoryPagesRetiredFlagsPerChannel 0x4B #define PPSMC_MSG_SetBadMemoryPagesRetiredFlagsPerChannel 0x4B
#define PPSMC_MSG_SetPriorityDeltaGain 0x4C #define PPSMC_MSG_SetPriorityDeltaGain 0x4C
#define PPSMC_MSG_AllowIHHostInterrupt 0x4D #define PPSMC_MSG_AllowIHHostInterrupt 0x4D
#define PPSMC_MSG_EnableShadowDpm 0x4E
#define PPSMC_MSG_Mode3Reset 0x4F #define PPSMC_MSG_Mode3Reset 0x4F
#define PPSMC_Message_Count 0x50 #define PPSMC_MSG_SetDriverDramAddr 0x50
#define PPSMC_MSG_SetToolsDramAddr 0x51
#define PPSMC_MSG_TransferTableSmu2DramWithAddr 0x52
#define PPSMC_MSG_TransferTableDram2SmuWithAddr 0x53
#define PPSMC_MSG_GetAllRunningSmuFeatures 0x54
#define PPSMC_MSG_GetSvi3Voltage 0x55
#define PPSMC_MSG_UpdatePolicy 0x56
#define PPSMC_MSG_ExtPwrConnSupport 0x57
#define PPSMC_MSG_PreloadSwPstateForUclkOverDrive 0x58
#define PPSMC_Message_Count 0x59
#endif #endif

View File

@ -121,6 +121,7 @@ struct mca_ras_info {
#define P2S_TABLE_ID_A 0x50325341 #define P2S_TABLE_ID_A 0x50325341
#define P2S_TABLE_ID_X 0x50325358 #define P2S_TABLE_ID_X 0x50325358
#define P2S_TABLE_ID_3 0x50325303
// clang-format off // clang-format off
static const struct cmn2asic_msg_mapping smu_v13_0_6_message_map[SMU_MSG_MAX_COUNT] = { static const struct cmn2asic_msg_mapping smu_v13_0_6_message_map[SMU_MSG_MAX_COUNT] = {
@ -271,14 +272,18 @@ static int smu_v13_0_6_init_microcode(struct smu_context *smu)
struct amdgpu_device *adev = smu->adev; struct amdgpu_device *adev = smu->adev;
uint32_t p2s_table_id = P2S_TABLE_ID_A; uint32_t p2s_table_id = P2S_TABLE_ID_A;
int ret = 0, i, p2stable_count; int ret = 0, i, p2stable_count;
int var = (adev->pdev->device & 0xF);
char ucode_prefix[15]; char ucode_prefix[15];
/* No need to load P2S tables in IOV mode */ /* No need to load P2S tables in IOV mode */
if (amdgpu_sriov_vf(adev)) if (amdgpu_sriov_vf(adev))
return 0; return 0;
if (!(adev->flags & AMD_IS_APU)) if (!(adev->flags & AMD_IS_APU)) {
p2s_table_id = P2S_TABLE_ID_X; p2s_table_id = P2S_TABLE_ID_X;
if (var == 0x5)
p2s_table_id = P2S_TABLE_ID_3;
}
amdgpu_ucode_ip_version_decode(adev, MP1_HWIP, ucode_prefix, amdgpu_ucode_ip_version_decode(adev, MP1_HWIP, ucode_prefix,
sizeof(ucode_prefix)); sizeof(ucode_prefix));

View File

@ -2378,7 +2378,7 @@ static int smu_v13_0_7_get_power_profile_mode(struct smu_context *smu, char *buf
size += sysfs_emit_at(buf, size, " "); size += sysfs_emit_at(buf, size, " ");
for (i = 0; i <= PP_SMC_POWER_PROFILE_WINDOW3D; i++) for (i = 0; i <= PP_SMC_POWER_PROFILE_WINDOW3D; i++)
size += sysfs_emit_at(buf, size, "%-14s%s", amdgpu_pp_profile_name[i], size += sysfs_emit_at(buf, size, "%d %-14s%s", i, amdgpu_pp_profile_name[i],
(i == smu->power_profile_mode) ? "* " : " "); (i == smu->power_profile_mode) ? "* " : " ");
size += sysfs_emit_at(buf, size, "\n"); size += sysfs_emit_at(buf, size, "\n");
@ -2408,7 +2408,7 @@ static int smu_v13_0_7_get_power_profile_mode(struct smu_context *smu, char *buf
do { \ do { \
size += sysfs_emit_at(buf, size, "%-30s", #field); \ size += sysfs_emit_at(buf, size, "%-30s", #field); \
for (j = 0; j <= PP_SMC_POWER_PROFILE_WINDOW3D; j++) \ for (j = 0; j <= PP_SMC_POWER_PROFILE_WINDOW3D; j++) \
size += sysfs_emit_at(buf, size, "%-16d", activity_monitor_external[j].DpmActivityMonitorCoeffInt.field); \ size += sysfs_emit_at(buf, size, "%-18d", activity_monitor_external[j].DpmActivityMonitorCoeffInt.field); \
size += sysfs_emit_at(buf, size, "\n"); \ size += sysfs_emit_at(buf, size, "\n"); \
} while (0) } while (0)

View File

@ -115,7 +115,6 @@ static struct cmn2asic_msg_mapping smu_v14_0_2_message_map[SMU_MSG_MAX_COUNT] =
MSG_MAP(SetMGpuFanBoostLimitRpm, PPSMC_MSG_SetMGpuFanBoostLimitRpm, 0), MSG_MAP(SetMGpuFanBoostLimitRpm, PPSMC_MSG_SetMGpuFanBoostLimitRpm, 0),
MSG_MAP(GetPptLimit, PPSMC_MSG_GetPptLimit, 0), MSG_MAP(GetPptLimit, PPSMC_MSG_GetPptLimit, 0),
MSG_MAP(NotifyPowerSource, PPSMC_MSG_NotifyPowerSource, 0), MSG_MAP(NotifyPowerSource, PPSMC_MSG_NotifyPowerSource, 0),
MSG_MAP(Mode1Reset, PPSMC_MSG_Mode1Reset, 0),
MSG_MAP(PrepareMp1ForUnload, PPSMC_MSG_PrepareMp1ForUnload, 0), MSG_MAP(PrepareMp1ForUnload, PPSMC_MSG_PrepareMp1ForUnload, 0),
MSG_MAP(DFCstateControl, PPSMC_MSG_SetExternalClientDfCstateAllow, 0), MSG_MAP(DFCstateControl, PPSMC_MSG_SetExternalClientDfCstateAllow, 0),
MSG_MAP(ArmD3, PPSMC_MSG_ArmD3, 0), MSG_MAP(ArmD3, PPSMC_MSG_ArmD3, 0),
@ -1824,50 +1823,6 @@ static void smu_v14_0_2_set_smu_mailbox_registers(struct smu_context *smu)
smu->debug_resp_reg = SOC15_REG_OFFSET(MP1, 0, regMP1_SMN_C2PMSG_54); smu->debug_resp_reg = SOC15_REG_OFFSET(MP1, 0, regMP1_SMN_C2PMSG_54);
} }
static int smu_v14_0_2_smu_send_bad_mem_page_num(struct smu_context *smu,
uint32_t size)
{
int ret = 0;
/* message SMU to update the bad page number on SMUBUS */
ret = smu_cmn_send_smc_msg_with_param(smu,
SMU_MSG_SetNumBadMemoryPagesRetired,
size, NULL);
if (ret)
dev_err(smu->adev->dev,
"[%s] failed to message SMU to update bad memory pages number\n",
__func__);
return ret;
}
static int smu_v14_0_2_send_bad_mem_channel_flag(struct smu_context *smu,
uint32_t size)
{
int ret = 0;
/* message SMU to update the bad channel info on SMUBUS */
ret = smu_cmn_send_smc_msg_with_param(smu,
SMU_MSG_SetBadMemoryPagesRetiredFlagsPerChannel,
size, NULL);
if (ret)
dev_err(smu->adev->dev,
"[%s] failed to message SMU to update bad memory pages channel info\n",
__func__);
return ret;
}
static ssize_t smu_v14_0_2_get_ecc_info(struct smu_context *smu,
void *table)
{
int ret = 0;
// TODO
return ret;
}
static ssize_t smu_v14_0_2_get_gpu_metrics(struct smu_context *smu, static ssize_t smu_v14_0_2_get_gpu_metrics(struct smu_context *smu,
void **table) void **table)
{ {
@ -2015,12 +1970,9 @@ static const struct pptable_funcs smu_v14_0_2_ppt_funcs = {
.enable_gfx_features = smu_v14_0_2_enable_gfx_features, .enable_gfx_features = smu_v14_0_2_enable_gfx_features,
.set_mp1_state = smu_v14_0_2_set_mp1_state, .set_mp1_state = smu_v14_0_2_set_mp1_state,
.set_df_cstate = smu_v14_0_2_set_df_cstate, .set_df_cstate = smu_v14_0_2_set_df_cstate,
.send_hbm_bad_pages_num = smu_v14_0_2_smu_send_bad_mem_page_num,
.send_hbm_bad_channel_flag = smu_v14_0_2_send_bad_mem_channel_flag,
#if 0 #if 0
.gpo_control = smu_v14_0_gpo_control, .gpo_control = smu_v14_0_gpo_control,
#endif #endif
.get_ecc_info = smu_v14_0_2_get_ecc_info,
}; };
void smu_v14_0_2_set_ppt_funcs(struct smu_context *smu) void smu_v14_0_2_set_ppt_funcs(struct smu_context *smu)

View File

@ -5935,6 +5935,18 @@ intel_dp_detect(struct drm_connector *connector,
else else
status = connector_status_disconnected; status = connector_status_disconnected;
if (status != connector_status_disconnected &&
!intel_dp_mst_verify_dpcd_state(intel_dp))
/*
* This requires retrying detection for instance to re-enable
* the MST mode that got reset via a long HPD pulse. The retry
* will happen either via the hotplug handler's retry logic,
* ensured by setting the connector here to SST/disconnected,
* or via a userspace connector probing in response to the
* hotplug uevent sent when removing the MST connectors.
*/
status = connector_status_disconnected;
if (status == connector_status_disconnected) { if (status == connector_status_disconnected) {
memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance)); memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd)); memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd));

View File

@ -1998,3 +1998,43 @@ bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
return false; return false;
} }
/*
* intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state wrt. the DPCD
* @intel_dp: DP port object
*
* Verify if @intel_dp's MST enabled SW state matches the corresponding DPCD
* state. A long HPD pulse - not long enough to be detected as a disconnected
* state - could've reset the DPCD state, which requires tearing
* down/recreating the MST topology.
*
* Returns %true if the SW MST enabled and DPCD states match, %false
* otherwise.
*/
bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp)
{
struct intel_display *display = to_intel_display(intel_dp);
struct intel_connector *connector = intel_dp->attached_connector;
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
struct intel_encoder *encoder = &dig_port->base;
int ret;
u8 val;
if (!intel_dp->is_mst)
return true;
ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL, &val);
/* Adjust the expected register value for SST + SideBand. */
if (ret < 0 || val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC)) {
drm_dbg_kms(display->drm,
"[CONNECTOR:%d:%s][ENCODER:%d:%s] MST mode got reset, removing topology (ret=%d, ctrl=0x%02x)\n",
connector->base.base.id, connector->base.name,
encoder->base.base.id, encoder->base.name,
ret, val);
return false;
}
return true;
}

View File

@ -27,5 +27,6 @@ int intel_dp_mst_atomic_check_link(struct intel_atomic_state *state,
struct intel_link_bw_limits *limits); struct intel_link_bw_limits *limits);
bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state, bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
struct intel_crtc *crtc); struct intel_crtc *crtc);
bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
#endif /* __INTEL_DP_MST_H__ */ #endif /* __INTEL_DP_MST_H__ */

View File

@ -1870,7 +1870,6 @@ static const struct dmi_system_id vlv_dsi_dmi_quirk_table[] = {
/* Lenovo Yoga Tab 3 Pro YT3-X90F */ /* Lenovo Yoga Tab 3 Pro YT3-X90F */
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
DMI_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"),
DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"), DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"),
}, },
.driver_data = (void *)vlv_dsi_lenovo_yoga_tab3_backlight_fixup, .driver_data = (void *)vlv_dsi_lenovo_yoga_tab3_backlight_fixup,

View File

@ -212,6 +212,37 @@ int intel_gsc_fw_get_binary_info(struct intel_uc_fw *gsc_fw, const void *data, s
} }
} }
if (IS_ARROWLAKE(gt->i915)) {
bool too_old = false;
/*
* ARL requires a newer firmware than MTL did (102.0.10.1878) but the
* firmware is actually common. So, need to do an explicit version check
* here rather than using a separate table entry. And if the older
* MTL-only version is found, then just don't use GSC rather than aborting
* the driver load.
*/
if (gsc->release.major < 102) {
too_old = true;
} else if (gsc->release.major == 102) {
if (gsc->release.minor == 0) {
if (gsc->release.patch < 10) {
too_old = true;
} else if (gsc->release.patch == 10) {
if (gsc->release.build < 1878)
too_old = true;
}
}
}
if (too_old) {
gt_info(gt, "GSC firmware too old for ARL, got %d.%d.%d.%d but need at least 102.0.10.1878",
gsc->release.major, gsc->release.minor,
gsc->release.patch, gsc->release.build);
return -EINVAL;
}
}
return 0; return 0;
} }

View File

@ -698,12 +698,18 @@ static int check_gsc_manifest(struct intel_gt *gt,
const struct firmware *fw, const struct firmware *fw,
struct intel_uc_fw *uc_fw) struct intel_uc_fw *uc_fw)
{ {
int ret;
switch (uc_fw->type) { switch (uc_fw->type) {
case INTEL_UC_FW_TYPE_HUC: case INTEL_UC_FW_TYPE_HUC:
intel_huc_fw_get_binary_info(uc_fw, fw->data, fw->size); ret = intel_huc_fw_get_binary_info(uc_fw, fw->data, fw->size);
if (ret)
return ret;
break; break;
case INTEL_UC_FW_TYPE_GSC: case INTEL_UC_FW_TYPE_GSC:
intel_gsc_fw_get_binary_info(uc_fw, fw->data, fw->size); ret = intel_gsc_fw_get_binary_info(uc_fw, fw->data, fw->size);
if (ret)
return ret;
break; break;
default: default:
MISSING_CASE(uc_fw->type); MISSING_CASE(uc_fw->type);

View File

@ -546,6 +546,8 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
#define IS_LUNARLAKE(i915) (0 && i915) #define IS_LUNARLAKE(i915) (0 && i915)
#define IS_BATTLEMAGE(i915) (0 && i915) #define IS_BATTLEMAGE(i915) (0 && i915)
#define IS_ARROWLAKE(i915) \
IS_SUBPLATFORM(i915, INTEL_METEORLAKE, INTEL_SUBPLATFORM_ARL)
#define IS_DG2_G10(i915) \ #define IS_DG2_G10(i915) \
IS_SUBPLATFORM(i915, INTEL_DG2, INTEL_SUBPLATFORM_G10) IS_SUBPLATFORM(i915, INTEL_DG2, INTEL_SUBPLATFORM_G10)
#define IS_DG2_G11(i915) \ #define IS_DG2_G11(i915) \

View File

@ -203,6 +203,10 @@ static const u16 subplatform_g12_ids[] = {
INTEL_DG2_G12_IDS(ID), INTEL_DG2_G12_IDS(ID),
}; };
static const u16 subplatform_arl_ids[] = {
INTEL_ARL_IDS(ID),
};
static bool find_devid(u16 id, const u16 *p, unsigned int num) static bool find_devid(u16 id, const u16 *p, unsigned int num)
{ {
for (; num; num--, p++) { for (; num; num--, p++) {
@ -260,6 +264,9 @@ static void intel_device_info_subplatform_init(struct drm_i915_private *i915)
} else if (find_devid(devid, subplatform_g12_ids, } else if (find_devid(devid, subplatform_g12_ids,
ARRAY_SIZE(subplatform_g12_ids))) { ARRAY_SIZE(subplatform_g12_ids))) {
mask = BIT(INTEL_SUBPLATFORM_G12); mask = BIT(INTEL_SUBPLATFORM_G12);
} else if (find_devid(devid, subplatform_arl_ids,
ARRAY_SIZE(subplatform_arl_ids))) {
mask = BIT(INTEL_SUBPLATFORM_ARL);
} }
GEM_BUG_ON(mask & ~INTEL_SUBPLATFORM_MASK); GEM_BUG_ON(mask & ~INTEL_SUBPLATFORM_MASK);

View File

@ -127,6 +127,9 @@ enum intel_platform {
#define INTEL_SUBPLATFORM_N 1 #define INTEL_SUBPLATFORM_N 1
#define INTEL_SUBPLATFORM_RPLU 2 #define INTEL_SUBPLATFORM_RPLU 2
/* MTL */
#define INTEL_SUBPLATFORM_ARL 0
enum intel_ppgtt_type { enum intel_ppgtt_type {
INTEL_PPGTT_NONE = I915_GEM_PPGTT_NONE, INTEL_PPGTT_NONE = I915_GEM_PPGTT_NONE,
INTEL_PPGTT_ALIASING = I915_GEM_PPGTT_ALIASING, INTEL_PPGTT_ALIASING = I915_GEM_PPGTT_ALIASING,

View File

@ -134,6 +134,8 @@ v3d_job_start_stats(struct v3d_job *job, enum v3d_queue queue)
struct v3d_stats *local_stats = &file->stats[queue]; struct v3d_stats *local_stats = &file->stats[queue];
u64 now = local_clock(); u64 now = local_clock();
preempt_disable();
write_seqcount_begin(&local_stats->lock); write_seqcount_begin(&local_stats->lock);
local_stats->start_ns = now; local_stats->start_ns = now;
write_seqcount_end(&local_stats->lock); write_seqcount_end(&local_stats->lock);
@ -141,6 +143,8 @@ v3d_job_start_stats(struct v3d_job *job, enum v3d_queue queue)
write_seqcount_begin(&global_stats->lock); write_seqcount_begin(&global_stats->lock);
global_stats->start_ns = now; global_stats->start_ns = now;
write_seqcount_end(&global_stats->lock); write_seqcount_end(&global_stats->lock);
preempt_enable();
} }
static void static void
@ -162,8 +166,10 @@ v3d_job_update_stats(struct v3d_job *job, enum v3d_queue queue)
struct v3d_stats *local_stats = &file->stats[queue]; struct v3d_stats *local_stats = &file->stats[queue];
u64 now = local_clock(); u64 now = local_clock();
preempt_disable();
v3d_stats_update(local_stats, now); v3d_stats_update(local_stats, now);
v3d_stats_update(global_stats, now); v3d_stats_update(global_stats, now);
preempt_enable();
} }
static struct dma_fence *v3d_bin_job_run(struct drm_sched_job *sched_job) static struct dma_fence *v3d_bin_job_run(struct drm_sched_job *sched_job)

View File

@ -27,6 +27,8 @@
**************************************************************************/ **************************************************************************/
#include "vmwgfx_drv.h" #include "vmwgfx_drv.h"
#include "vmwgfx_bo.h"
#include <linux/highmem.h> #include <linux/highmem.h>
/* /*
@ -420,13 +422,105 @@ static int vmw_bo_cpu_blit_line(struct vmw_bo_blit_line_data *d,
return 0; return 0;
} }
static void *map_external(struct vmw_bo *bo, struct iosys_map *map)
{
struct vmw_private *vmw =
container_of(bo->tbo.bdev, struct vmw_private, bdev);
void *ptr = NULL;
int ret;
if (bo->tbo.base.import_attach) {
ret = dma_buf_vmap(bo->tbo.base.dma_buf, map);
if (ret) {
drm_dbg_driver(&vmw->drm,
"Wasn't able to map external bo!\n");
goto out;
}
ptr = map->vaddr;
} else {
ptr = vmw_bo_map_and_cache(bo);
}
out:
return ptr;
}
static void unmap_external(struct vmw_bo *bo, struct iosys_map *map)
{
if (bo->tbo.base.import_attach)
dma_buf_vunmap(bo->tbo.base.dma_buf, map);
else
vmw_bo_unmap(bo);
}
static int vmw_external_bo_copy(struct vmw_bo *dst, u32 dst_offset,
u32 dst_stride, struct vmw_bo *src,
u32 src_offset, u32 src_stride,
u32 width_in_bytes, u32 height,
struct vmw_diff_cpy *diff)
{
struct vmw_private *vmw =
container_of(dst->tbo.bdev, struct vmw_private, bdev);
size_t dst_size = dst->tbo.resource->size;
size_t src_size = src->tbo.resource->size;
struct iosys_map dst_map = {0};
struct iosys_map src_map = {0};
int ret, i;
int x_in_bytes;
u8 *vsrc;
u8 *vdst;
vsrc = map_external(src, &src_map);
if (!vsrc) {
drm_dbg_driver(&vmw->drm, "Wasn't able to map src\n");
ret = -ENOMEM;
goto out;
}
vdst = map_external(dst, &dst_map);
if (!vdst) {
drm_dbg_driver(&vmw->drm, "Wasn't able to map dst\n");
ret = -ENOMEM;
goto out;
}
vsrc += src_offset;
vdst += dst_offset;
if (src_stride == dst_stride) {
dst_size -= dst_offset;
src_size -= src_offset;
memcpy(vdst, vsrc,
min(dst_stride * height, min(dst_size, src_size)));
} else {
WARN_ON(dst_stride < width_in_bytes);
for (i = 0; i < height; ++i) {
memcpy(vdst, vsrc, width_in_bytes);
vsrc += src_stride;
vdst += dst_stride;
}
}
x_in_bytes = (dst_offset % dst_stride);
diff->rect.x1 = x_in_bytes / diff->cpp;
diff->rect.y1 = ((dst_offset - x_in_bytes) / dst_stride);
diff->rect.x2 = diff->rect.x1 + width_in_bytes / diff->cpp;
diff->rect.y2 = diff->rect.y1 + height;
ret = 0;
out:
unmap_external(src, &src_map);
unmap_external(dst, &dst_map);
return ret;
}
/** /**
* vmw_bo_cpu_blit - in-kernel cpu blit. * vmw_bo_cpu_blit - in-kernel cpu blit.
* *
* @dst: Destination buffer object. * @vmw_dst: Destination buffer object.
* @dst_offset: Destination offset of blit start in bytes. * @dst_offset: Destination offset of blit start in bytes.
* @dst_stride: Destination stride in bytes. * @dst_stride: Destination stride in bytes.
* @src: Source buffer object. * @vmw_src: Source buffer object.
* @src_offset: Source offset of blit start in bytes. * @src_offset: Source offset of blit start in bytes.
* @src_stride: Source stride in bytes. * @src_stride: Source stride in bytes.
* @w: Width of blit. * @w: Width of blit.
@ -444,13 +538,15 @@ static int vmw_bo_cpu_blit_line(struct vmw_bo_blit_line_data *d,
* Neither of the buffer objects may be placed in PCI memory * Neither of the buffer objects may be placed in PCI memory
* (Fixed memory in TTM terminology) when using this function. * (Fixed memory in TTM terminology) when using this function.
*/ */
int vmw_bo_cpu_blit(struct ttm_buffer_object *dst, int vmw_bo_cpu_blit(struct vmw_bo *vmw_dst,
u32 dst_offset, u32 dst_stride, u32 dst_offset, u32 dst_stride,
struct ttm_buffer_object *src, struct vmw_bo *vmw_src,
u32 src_offset, u32 src_stride, u32 src_offset, u32 src_stride,
u32 w, u32 h, u32 w, u32 h,
struct vmw_diff_cpy *diff) struct vmw_diff_cpy *diff)
{ {
struct ttm_buffer_object *src = &vmw_src->tbo;
struct ttm_buffer_object *dst = &vmw_dst->tbo;
struct ttm_operation_ctx ctx = { struct ttm_operation_ctx ctx = {
.interruptible = false, .interruptible = false,
.no_wait_gpu = false .no_wait_gpu = false
@ -460,6 +556,11 @@ int vmw_bo_cpu_blit(struct ttm_buffer_object *dst,
int ret = 0; int ret = 0;
struct page **dst_pages = NULL; struct page **dst_pages = NULL;
struct page **src_pages = NULL; struct page **src_pages = NULL;
bool src_external = (src->ttm->page_flags & TTM_TT_FLAG_EXTERNAL) != 0;
bool dst_external = (dst->ttm->page_flags & TTM_TT_FLAG_EXTERNAL) != 0;
if (WARN_ON(dst == src))
return -EINVAL;
/* Buffer objects need to be either pinned or reserved: */ /* Buffer objects need to be either pinned or reserved: */
if (!(dst->pin_count)) if (!(dst->pin_count))
@ -479,6 +580,11 @@ int vmw_bo_cpu_blit(struct ttm_buffer_object *dst,
return ret; return ret;
} }
if (src_external || dst_external)
return vmw_external_bo_copy(vmw_dst, dst_offset, dst_stride,
vmw_src, src_offset, src_stride,
w, h, diff);
if (!src->ttm->pages && src->ttm->sg) { if (!src->ttm->pages && src->ttm->sg) {
src_pages = kvmalloc_array(src->ttm->num_pages, src_pages = kvmalloc_array(src->ttm->num_pages,
sizeof(struct page *), GFP_KERNEL); sizeof(struct page *), GFP_KERNEL);

View File

@ -360,6 +360,8 @@ void *vmw_bo_map_and_cache_size(struct vmw_bo *vbo, size_t size)
void *virtual; void *virtual;
int ret; int ret;
atomic_inc(&vbo->map_count);
virtual = ttm_kmap_obj_virtual(&vbo->map, &not_used); virtual = ttm_kmap_obj_virtual(&vbo->map, &not_used);
if (virtual) if (virtual)
return virtual; return virtual;
@ -383,12 +385,18 @@ void *vmw_bo_map_and_cache_size(struct vmw_bo *vbo, size_t size)
*/ */
void vmw_bo_unmap(struct vmw_bo *vbo) void vmw_bo_unmap(struct vmw_bo *vbo)
{ {
int map_count;
if (vbo->map.bo == NULL) if (vbo->map.bo == NULL)
return; return;
map_count = atomic_dec_return(&vbo->map_count);
if (!map_count) {
ttm_bo_kunmap(&vbo->map); ttm_bo_kunmap(&vbo->map);
vbo->map.bo = NULL; vbo->map.bo = NULL;
} }
}
/** /**
@ -421,6 +429,7 @@ static int vmw_bo_init(struct vmw_private *dev_priv,
vmw_bo->tbo.priority = 3; vmw_bo->tbo.priority = 3;
vmw_bo->res_tree = RB_ROOT; vmw_bo->res_tree = RB_ROOT;
xa_init(&vmw_bo->detached_resources); xa_init(&vmw_bo->detached_resources);
atomic_set(&vmw_bo->map_count, 0);
params->size = ALIGN(params->size, PAGE_SIZE); params->size = ALIGN(params->size, PAGE_SIZE);
drm_gem_private_object_init(vdev, &vmw_bo->tbo.base, params->size); drm_gem_private_object_init(vdev, &vmw_bo->tbo.base, params->size);

View File

@ -71,6 +71,8 @@ struct vmw_bo_params {
* @map: Kmap object for semi-persistent mappings * @map: Kmap object for semi-persistent mappings
* @res_tree: RB tree of resources using this buffer object as a backing MOB * @res_tree: RB tree of resources using this buffer object as a backing MOB
* @res_prios: Eviction priority counts for attached resources * @res_prios: Eviction priority counts for attached resources
* @map_count: The number of currently active maps. Will differ from the
* cpu_writers because it includes kernel maps.
* @cpu_writers: Number of synccpu write grabs. Protected by reservation when * @cpu_writers: Number of synccpu write grabs. Protected by reservation when
* increased. May be decreased without reservation. * increased. May be decreased without reservation.
* @dx_query_ctx: DX context if this buffer object is used as a DX query MOB * @dx_query_ctx: DX context if this buffer object is used as a DX query MOB
@ -90,6 +92,7 @@ struct vmw_bo {
u32 res_prios[TTM_MAX_BO_PRIORITY]; u32 res_prios[TTM_MAX_BO_PRIORITY];
struct xarray detached_resources; struct xarray detached_resources;
atomic_t map_count;
atomic_t cpu_writers; atomic_t cpu_writers;
/* Not ref-counted. Protected by binding_mutex */ /* Not ref-counted. Protected by binding_mutex */
struct vmw_resource *dx_query_ctx; struct vmw_resource *dx_query_ctx;

View File

@ -1353,9 +1353,9 @@ void vmw_diff_memcpy(struct vmw_diff_cpy *diff, u8 *dest, const u8 *src,
void vmw_memcpy(struct vmw_diff_cpy *diff, u8 *dest, const u8 *src, size_t n); void vmw_memcpy(struct vmw_diff_cpy *diff, u8 *dest, const u8 *src, size_t n);
int vmw_bo_cpu_blit(struct ttm_buffer_object *dst, int vmw_bo_cpu_blit(struct vmw_bo *dst,
u32 dst_offset, u32 dst_stride, u32 dst_offset, u32 dst_stride,
struct ttm_buffer_object *src, struct vmw_bo *src,
u32 src_offset, u32 src_stride, u32 src_offset, u32 src_stride,
u32 w, u32 h, u32 w, u32 h,
struct vmw_diff_cpy *diff); struct vmw_diff_cpy *diff);

View File

@ -502,7 +502,7 @@ static void vmw_stdu_bo_cpu_commit(struct vmw_kms_dirty *dirty)
container_of(dirty->unit, typeof(*stdu), base); container_of(dirty->unit, typeof(*stdu), base);
s32 width, height; s32 width, height;
s32 src_pitch, dst_pitch; s32 src_pitch, dst_pitch;
struct ttm_buffer_object *src_bo, *dst_bo; struct vmw_bo *src_bo, *dst_bo;
u32 src_offset, dst_offset; u32 src_offset, dst_offset;
struct vmw_diff_cpy diff = VMW_CPU_BLIT_DIFF_INITIALIZER(stdu->cpp); struct vmw_diff_cpy diff = VMW_CPU_BLIT_DIFF_INITIALIZER(stdu->cpp);
@ -517,11 +517,11 @@ static void vmw_stdu_bo_cpu_commit(struct vmw_kms_dirty *dirty)
/* Assume we are blitting from Guest (bo) to Host (display_srf) */ /* Assume we are blitting from Guest (bo) to Host (display_srf) */
src_pitch = stdu->display_srf->metadata.base_size.width * stdu->cpp; src_pitch = stdu->display_srf->metadata.base_size.width * stdu->cpp;
src_bo = &stdu->display_srf->res.guest_memory_bo->tbo; src_bo = stdu->display_srf->res.guest_memory_bo;
src_offset = ddirty->top * src_pitch + ddirty->left * stdu->cpp; src_offset = ddirty->top * src_pitch + ddirty->left * stdu->cpp;
dst_pitch = ddirty->pitch; dst_pitch = ddirty->pitch;
dst_bo = &ddirty->buf->tbo; dst_bo = ddirty->buf;
dst_offset = ddirty->fb_top * dst_pitch + ddirty->fb_left * stdu->cpp; dst_offset = ddirty->fb_top * dst_pitch + ddirty->fb_left * stdu->cpp;
(void) vmw_bo_cpu_blit(dst_bo, dst_offset, dst_pitch, (void) vmw_bo_cpu_blit(dst_bo, dst_offset, dst_pitch,
@ -1170,7 +1170,7 @@ vmw_stdu_bo_populate_update_cpu(struct vmw_du_update_plane *update, void *cmd,
struct vmw_diff_cpy diff = VMW_CPU_BLIT_DIFF_INITIALIZER(0); struct vmw_diff_cpy diff = VMW_CPU_BLIT_DIFF_INITIALIZER(0);
struct vmw_stdu_update_gb_image *cmd_img = cmd; struct vmw_stdu_update_gb_image *cmd_img = cmd;
struct vmw_stdu_update *cmd_update; struct vmw_stdu_update *cmd_update;
struct ttm_buffer_object *src_bo, *dst_bo; struct vmw_bo *src_bo, *dst_bo;
u32 src_offset, dst_offset; u32 src_offset, dst_offset;
s32 src_pitch, dst_pitch; s32 src_pitch, dst_pitch;
s32 width, height; s32 width, height;
@ -1184,11 +1184,11 @@ vmw_stdu_bo_populate_update_cpu(struct vmw_du_update_plane *update, void *cmd,
diff.cpp = stdu->cpp; diff.cpp = stdu->cpp;
dst_bo = &stdu->display_srf->res.guest_memory_bo->tbo; dst_bo = stdu->display_srf->res.guest_memory_bo;
dst_pitch = stdu->display_srf->metadata.base_size.width * stdu->cpp; dst_pitch = stdu->display_srf->metadata.base_size.width * stdu->cpp;
dst_offset = bb->y1 * dst_pitch + bb->x1 * stdu->cpp; dst_offset = bb->y1 * dst_pitch + bb->x1 * stdu->cpp;
src_bo = &vfbbo->buffer->tbo; src_bo = vfbbo->buffer;
src_pitch = update->vfb->base.pitches[0]; src_pitch = update->vfb->base.pitches[0];
src_offset = bo_update->fb_top * src_pitch + bo_update->fb_left * src_offset = bo_update->fb_top * src_pitch + bo_update->fb_left *
stdu->cpp; stdu->cpp;

View File

@ -2283,9 +2283,11 @@ int vmw_dumb_create(struct drm_file *file_priv,
/* /*
* Without mob support we're just going to use raw memory buffer * Without mob support we're just going to use raw memory buffer
* because we wouldn't be able to support full surface coherency * because we wouldn't be able to support full surface coherency
* without mobs * without mobs. There also no reason to support surface coherency
* without 3d (i.e. gpu usage on the host) because then all the
* contents is going to be rendered guest side.
*/ */
if (!dev_priv->has_mob) { if (!dev_priv->has_mob || !vmw_supports_3d(dev_priv)) {
int cpp = DIV_ROUND_UP(args->bpp, 8); int cpp = DIV_ROUND_UP(args->bpp, 8);
switch (cpp) { switch (cpp) {

View File

@ -450,7 +450,7 @@ static int xe_hwmon_pcode_write_i1(struct xe_gt *gt, u32 uval)
{ {
return xe_pcode_write(gt, PCODE_MBOX(PCODE_POWER_SETUP, return xe_pcode_write(gt, PCODE_MBOX(PCODE_POWER_SETUP,
POWER_SETUP_SUBCOMMAND_WRITE_I1, 0), POWER_SETUP_SUBCOMMAND_WRITE_I1, 0),
uval); (uval & POWER_SETUP_I1_DATA_MASK));
} }
static int xe_hwmon_power_curr_crit_read(struct xe_hwmon *hwmon, int channel, static int xe_hwmon_power_curr_crit_read(struct xe_hwmon *hwmon, int channel,

View File

@ -3341,9 +3341,10 @@ int xe_vm_invalidate_vma(struct xe_vma *vma)
{ {
struct xe_device *xe = xe_vma_vm(vma)->xe; struct xe_device *xe = xe_vma_vm(vma)->xe;
struct xe_tile *tile; struct xe_tile *tile;
struct xe_gt_tlb_invalidation_fence fence[XE_MAX_TILES_PER_DEVICE]; struct xe_gt_tlb_invalidation_fence
u32 tile_needs_invalidate = 0; fence[XE_MAX_TILES_PER_DEVICE * XE_MAX_GT_PER_TILE];
u8 id; u8 id;
u32 fence_id = 0;
int ret = 0; int ret = 0;
xe_assert(xe, !xe_vma_is_null(vma)); xe_assert(xe, !xe_vma_is_null(vma));
@ -3371,26 +3372,36 @@ int xe_vm_invalidate_vma(struct xe_vma *vma)
if (xe_pt_zap_ptes(tile, vma)) { if (xe_pt_zap_ptes(tile, vma)) {
xe_device_wmb(xe); xe_device_wmb(xe);
xe_gt_tlb_invalidation_fence_init(tile->primary_gt, xe_gt_tlb_invalidation_fence_init(tile->primary_gt,
&fence[id], true); &fence[fence_id],
true);
/*
* FIXME: We potentially need to invalidate multiple
* GTs within the tile
*/
ret = xe_gt_tlb_invalidation_vma(tile->primary_gt, ret = xe_gt_tlb_invalidation_vma(tile->primary_gt,
&fence[id], vma); &fence[fence_id], vma);
if (ret < 0) { if (ret < 0) {
xe_gt_tlb_invalidation_fence_fini(&fence[id]); xe_gt_tlb_invalidation_fence_fini(&fence[fence_id]);
goto wait; goto wait;
} }
++fence_id;
tile_needs_invalidate |= BIT(id); if (!tile->media_gt)
continue;
xe_gt_tlb_invalidation_fence_init(tile->media_gt,
&fence[fence_id],
true);
ret = xe_gt_tlb_invalidation_vma(tile->media_gt,
&fence[fence_id], vma);
if (ret < 0) {
xe_gt_tlb_invalidation_fence_fini(&fence[fence_id]);
goto wait;
}
++fence_id;
} }
} }
wait: wait:
for_each_tile(tile, xe, id) for (id = 0; id < fence_id; ++id)
if (tile_needs_invalidate & BIT(id))
xe_gt_tlb_invalidation_fence_wait(&fence[id]); xe_gt_tlb_invalidation_fence_wait(&fence[id]);
vma->tile_invalidated = vma->tile_mask; vma->tile_invalidated = vma->tile_mask;

View File

@ -420,7 +420,7 @@ static const struct ec_board_info board_info_strix_b550_i_gaming = {
static const struct ec_board_info board_info_strix_x570_e_gaming = { static const struct ec_board_info board_info_strix_x570_e_gaming = {
.sensors = SENSOR_SET_TEMP_CHIPSET_CPU_MB | .sensors = SENSOR_SET_TEMP_CHIPSET_CPU_MB |
SENSOR_TEMP_T_SENSOR | SENSOR_TEMP_VRM | SENSOR_TEMP_T_SENSOR |
SENSOR_FAN_CHIPSET | SENSOR_CURR_CPU | SENSOR_FAN_CHIPSET | SENSOR_CURR_CPU |
SENSOR_IN_CPU_CORE, SENSOR_IN_CPU_CORE,
.mutex_path = ASUS_HW_ACCESS_MUTEX_ASMX, .mutex_path = ASUS_HW_ACCESS_MUTEX_ASMX,

View File

@ -1637,6 +1637,8 @@ static void hp_wmi_notify(u32 value, void *context)
goto out_unlock; goto out_unlock;
wobj = out.pointer; wobj = out.pointer;
if (!wobj)
goto out_unlock;
err = populate_event_from_wobj(dev, &event, wobj); err = populate_event_from_wobj(dev, &event, wobj);
if (err) { if (err) {

View File

@ -42,9 +42,9 @@
#define LTC2991_V7_V8_FILT_EN BIT(7) #define LTC2991_V7_V8_FILT_EN BIT(7)
#define LTC2991_V7_V8_TEMP_EN BIT(5) #define LTC2991_V7_V8_TEMP_EN BIT(5)
#define LTC2991_V7_V8_DIFF_EN BIT(4) #define LTC2991_V7_V8_DIFF_EN BIT(4)
#define LTC2991_V5_V6_FILT_EN BIT(7) #define LTC2991_V5_V6_FILT_EN BIT(3)
#define LTC2991_V5_V6_TEMP_EN BIT(5) #define LTC2991_V5_V6_TEMP_EN BIT(1)
#define LTC2991_V5_V6_DIFF_EN BIT(4) #define LTC2991_V5_V6_DIFF_EN BIT(0)
#define LTC2991_REPEAT_ACQ_EN BIT(4) #define LTC2991_REPEAT_ACQ_EN BIT(4)
#define LTC2991_T_INT_FILT_EN BIT(3) #define LTC2991_T_INT_FILT_EN BIT(3)

View File

@ -427,7 +427,7 @@ static int pt5161l_read(struct device *dev, enum hwmon_sensor_types type,
struct pt5161l_data *data = dev_get_drvdata(dev); struct pt5161l_data *data = dev_get_drvdata(dev);
int ret; int ret;
u8 buf[8]; u8 buf[8];
long adc_code; u32 adc_code;
switch (attr) { switch (attr) {
case hwmon_temp_input: case hwmon_temp_input:
@ -449,7 +449,7 @@ static int pt5161l_read(struct device *dev, enum hwmon_sensor_types type,
adc_code = buf[3] << 24 | buf[2] << 16 | buf[1] << 8 | buf[0]; adc_code = buf[3] << 24 | buf[2] << 16 | buf[1] << 8 | buf[0];
if (adc_code == 0 || adc_code >= 0x3ff) { if (adc_code == 0 || adc_code >= 0x3ff) {
dev_dbg(dev, "Invalid adc_code %lx\n", adc_code); dev_dbg(dev, "Invalid adc_code %x\n", adc_code);
return -EIO; return -EIO;
} }

View File

@ -91,48 +91,6 @@ static int cypress_ps2_ext_cmd(struct psmouse *psmouse, u8 prefix, u8 nibble)
return rc; return rc;
} }
static int cypress_ps2_read_cmd_status(struct psmouse *psmouse,
u8 cmd, u8 *param)
{
struct ps2dev *ps2dev = &psmouse->ps2dev;
enum psmouse_state old_state;
int pktsize;
int rc;
ps2_begin_command(ps2dev);
old_state = psmouse->state;
psmouse->state = PSMOUSE_CMD_MODE;
psmouse->pktcnt = 0;
pktsize = (cmd == CYTP_CMD_READ_TP_METRICS) ? 8 : 3;
memset(param, 0, pktsize);
rc = cypress_ps2_sendbyte(psmouse, PSMOUSE_CMD_GETINFO & 0xff);
if (rc)
goto out;
if (!wait_event_timeout(ps2dev->wait,
psmouse->pktcnt >= pktsize,
msecs_to_jiffies(CYTP_CMD_TIMEOUT))) {
rc = -ETIMEDOUT;
goto out;
}
memcpy(param, psmouse->packet, pktsize);
psmouse_dbg(psmouse, "Command 0x%02x response data (0x): %*ph\n",
cmd, pktsize, param);
out:
psmouse->state = old_state;
psmouse->pktcnt = 0;
ps2_end_command(ps2dev);
return rc;
}
static bool cypress_verify_cmd_state(struct psmouse *psmouse, u8 cmd, u8* param) static bool cypress_verify_cmd_state(struct psmouse *psmouse, u8 cmd, u8* param)
{ {
bool rate_match = false; bool rate_match = false;
@ -166,6 +124,8 @@ static bool cypress_verify_cmd_state(struct psmouse *psmouse, u8 cmd, u8* param)
static int cypress_send_ext_cmd(struct psmouse *psmouse, u8 cmd, u8 *param) static int cypress_send_ext_cmd(struct psmouse *psmouse, u8 cmd, u8 *param)
{ {
u8 cmd_prefix = PSMOUSE_CMD_SETRES & 0xff; u8 cmd_prefix = PSMOUSE_CMD_SETRES & 0xff;
unsigned int resp_size = cmd == CYTP_CMD_READ_TP_METRICS ? 8 : 3;
unsigned int ps2_cmd = (PSMOUSE_CMD_GETINFO & 0xff) | (resp_size << 8);
int tries = CYTP_PS2_CMD_TRIES; int tries = CYTP_PS2_CMD_TRIES;
int error; int error;
@ -179,10 +139,18 @@ static int cypress_send_ext_cmd(struct psmouse *psmouse, u8 cmd, u8 *param)
cypress_ps2_ext_cmd(psmouse, cmd_prefix, DECODE_CMD_BB(cmd)); cypress_ps2_ext_cmd(psmouse, cmd_prefix, DECODE_CMD_BB(cmd));
cypress_ps2_ext_cmd(psmouse, cmd_prefix, DECODE_CMD_AA(cmd)); cypress_ps2_ext_cmd(psmouse, cmd_prefix, DECODE_CMD_AA(cmd));
error = cypress_ps2_read_cmd_status(psmouse, cmd, param); error = ps2_command(&psmouse->ps2dev, param, ps2_cmd);
if (!error && cypress_verify_cmd_state(psmouse, cmd, param)) if (error) {
return 0; psmouse_dbg(psmouse, "Command 0x%02x failed: %d\n",
cmd, error);
} else {
psmouse_dbg(psmouse,
"Command 0x%02x response data (0x): %*ph\n",
cmd, resp_size, param);
if (cypress_verify_cmd_state(psmouse, cmd, param))
return 0;
}
} while (--tries > 0); } while (--tries > 0);
return -EIO; return -EIO;

View File

@ -1777,7 +1777,7 @@ static int arm_smmu_handle_evt(struct arm_smmu_device *smmu, u64 *evt)
goto out_unlock; goto out_unlock;
} }
iommu_report_device_fault(master->dev, &fault_evt); ret = iommu_report_device_fault(master->dev, &fault_evt);
out_unlock: out_unlock:
mutex_unlock(&smmu->streams_mutex); mutex_unlock(&smmu->streams_mutex);
return ret; return ret;

View File

@ -1944,6 +1944,7 @@ static void domain_context_clear_one(struct device_domain_info *info, u8 bus, u8
{ {
struct intel_iommu *iommu = info->iommu; struct intel_iommu *iommu = info->iommu;
struct context_entry *context; struct context_entry *context;
u16 did;
spin_lock(&iommu->lock); spin_lock(&iommu->lock);
context = iommu_context_addr(iommu, bus, devfn, 0); context = iommu_context_addr(iommu, bus, devfn, 0);
@ -1952,10 +1953,11 @@ static void domain_context_clear_one(struct device_domain_info *info, u8 bus, u8
return; return;
} }
did = context_domain_id(context);
context_clear_entry(context); context_clear_entry(context);
__iommu_flush_cache(iommu, context, sizeof(*context)); __iommu_flush_cache(iommu, context, sizeof(*context));
spin_unlock(&iommu->lock); spin_unlock(&iommu->lock);
intel_context_flush_present(info, context, true); intel_context_flush_present(info, context, did, true);
} }
static int domain_setup_first_level(struct intel_iommu *iommu, static int domain_setup_first_level(struct intel_iommu *iommu,
@ -4249,6 +4251,7 @@ static int context_flip_pri(struct device_domain_info *info, bool enable)
struct intel_iommu *iommu = info->iommu; struct intel_iommu *iommu = info->iommu;
u8 bus = info->bus, devfn = info->devfn; u8 bus = info->bus, devfn = info->devfn;
struct context_entry *context; struct context_entry *context;
u16 did;
spin_lock(&iommu->lock); spin_lock(&iommu->lock);
if (context_copied(iommu, bus, devfn)) { if (context_copied(iommu, bus, devfn)) {
@ -4261,6 +4264,7 @@ static int context_flip_pri(struct device_domain_info *info, bool enable)
spin_unlock(&iommu->lock); spin_unlock(&iommu->lock);
return -ENODEV; return -ENODEV;
} }
did = context_domain_id(context);
if (enable) if (enable)
context_set_sm_pre(context); context_set_sm_pre(context);
@ -4269,7 +4273,7 @@ static int context_flip_pri(struct device_domain_info *info, bool enable)
if (!ecap_coherent(iommu->ecap)) if (!ecap_coherent(iommu->ecap))
clflush_cache_range(context, sizeof(*context)); clflush_cache_range(context, sizeof(*context));
intel_context_flush_present(info, context, true); intel_context_flush_present(info, context, did, true);
spin_unlock(&iommu->lock); spin_unlock(&iommu->lock);
return 0; return 0;

View File

@ -1154,7 +1154,7 @@ void cache_tag_flush_range_np(struct dmar_domain *domain, unsigned long start,
void intel_context_flush_present(struct device_domain_info *info, void intel_context_flush_present(struct device_domain_info *info,
struct context_entry *context, struct context_entry *context,
bool affect_domains); u16 did, bool affect_domains);
#ifdef CONFIG_INTEL_IOMMU_SVM #ifdef CONFIG_INTEL_IOMMU_SVM
void intel_svm_check(struct intel_iommu *iommu); void intel_svm_check(struct intel_iommu *iommu);

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