mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 06:01:57 +00:00
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.c2560db6ede
("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.c858430db28
("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:
commit
502cc061de
4
.mailmap
4
.mailmap
@ -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>
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
41
MAINTAINERS
41
MAINTAINERS
@ -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
|
||||||
|
3
Makefile
3
Makefile
@ -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 \
|
||||||
|
@ -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
|
||||||
|
@ -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>;
|
||||||
};
|
};
|
||||||
|
@ -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 {
|
||||||
|
@ -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 )
|
||||||
|
@ -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>;
|
||||||
|
@ -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>;
|
||||||
|
@ -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>;
|
||||||
|
@ -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>;
|
||||||
|
@ -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>;
|
||||||
|
@ -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>;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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";
|
||||||
};
|
};
|
||||||
|
@ -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 = <®_usdhc2_vmmc>;
|
vmmc-supply = <®_usdhc2_vmmc>;
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
no-sdio;
|
no-sdio;
|
||||||
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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 = <ð_mac2>;
|
nvmem-cells = <ð_mac2>;
|
||||||
nvmem-cell-names = "mac-address";
|
nvmem-cell-names = "mac-address";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
@ -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";
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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>,
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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))
|
||||||
|
@ -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;
|
||||||
|
@ -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 */
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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 */
|
||||||
|
@ -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]);
|
||||||
|
@ -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;
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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));
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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));
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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__ */
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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) \
|
||||||
|
@ -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);
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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, ¬_used);
|
virtual = ttm_kmap_obj_virtual(&vbo->map, ¬_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);
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
Loading…
Reference in New Issue
Block a user