Merge tag 'v5.14-rc3' into android-mainline
Linux 5.14-rc3 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I5db742d6b8faf7b40efe1cb3b5beae486010f3fd
This commit is contained in:
@@ -45,8 +45,9 @@ how the user addresses are used by the kernel:
|
|||||||
|
|
||||||
1. User addresses not accessed by the kernel but used for address space
|
1. User addresses not accessed by the kernel but used for address space
|
||||||
management (e.g. ``mprotect()``, ``madvise()``). The use of valid
|
management (e.g. ``mprotect()``, ``madvise()``). The use of valid
|
||||||
tagged pointers in this context is allowed with the exception of
|
tagged pointers in this context is allowed with these exceptions:
|
||||||
``brk()``, ``mmap()`` and the ``new_address`` argument to
|
|
||||||
|
- ``brk()``, ``mmap()`` and the ``new_address`` argument to
|
||||||
``mremap()`` as these have the potential to alias with existing
|
``mremap()`` as these have the potential to alias with existing
|
||||||
user addresses.
|
user addresses.
|
||||||
|
|
||||||
@@ -54,6 +55,15 @@ how the user addresses are used by the kernel:
|
|||||||
incorrectly accept valid tagged pointers for the ``brk()``,
|
incorrectly accept valid tagged pointers for the ``brk()``,
|
||||||
``mmap()`` and ``mremap()`` system calls.
|
``mmap()`` and ``mremap()`` system calls.
|
||||||
|
|
||||||
|
- The ``range.start``, ``start`` and ``dst`` arguments to the
|
||||||
|
``UFFDIO_*`` ``ioctl()``s used on a file descriptor obtained from
|
||||||
|
``userfaultfd()``, as fault addresses subsequently obtained by reading
|
||||||
|
the file descriptor will be untagged, which may otherwise confuse
|
||||||
|
tag-unaware programs.
|
||||||
|
|
||||||
|
NOTE: This behaviour changed in v5.14 and so some earlier kernels may
|
||||||
|
incorrectly accept valid tagged pointers for this system call.
|
||||||
|
|
||||||
2. User addresses accessed by the kernel (e.g. ``write()``). This ABI
|
2. User addresses accessed by the kernel (e.g. ``write()``). This ABI
|
||||||
relaxation is disabled by default and the application thread needs to
|
relaxation is disabled by default and the application thread needs to
|
||||||
explicitly enable it via ``prctl()`` as follows:
|
explicitly enable it via ``prctl()`` as follows:
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
IMX8 glue layer controller, NXP imx8 families support Synopsys MAC 5.10a IP.
|
|
||||||
|
|
||||||
This file documents platform glue layer for IMX.
|
|
||||||
Please see stmmac.txt for the other unchanged properties.
|
|
||||||
|
|
||||||
The device node has following properties.
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible: Should be "nxp,imx8mp-dwmac-eqos" to select glue layer
|
|
||||||
and "snps,dwmac-5.10a" to select IP version.
|
|
||||||
- clocks: Must contain a phandle for each entry in clock-names.
|
|
||||||
- clock-names: Should be "stmmaceth" for the host clock.
|
|
||||||
Should be "pclk" for the MAC apb clock.
|
|
||||||
Should be "ptp_ref" for the MAC timer clock.
|
|
||||||
Should be "tx" for the MAC RGMII TX clock:
|
|
||||||
Should be "mem" for EQOS MEM clock.
|
|
||||||
- "mem" clock is required for imx8dxl platform.
|
|
||||||
- "mem" clock is not required for imx8mp platform.
|
|
||||||
- interrupt-names: Should contain a list of interrupt names corresponding to
|
|
||||||
the interrupts in the interrupts property, if available.
|
|
||||||
Should be "macirq" for the main MAC IRQ
|
|
||||||
Should be "eth_wake_irq" for the IT which wake up system
|
|
||||||
- intf_mode: Should be phandle/offset pair. The phandle to the syscon node which
|
|
||||||
encompases the GPR register, and the offset of the GPR register.
|
|
||||||
- required for imx8mp platform.
|
|
||||||
- is optional for imx8dxl platform.
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- intf_mode: is optional for imx8dxl platform.
|
|
||||||
- snps,rmii_refclk_ext: to select RMII reference clock from external.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
eqos: ethernet@30bf0000 {
|
|
||||||
compatible = "nxp,imx8mp-dwmac-eqos", "snps,dwmac-5.10a";
|
|
||||||
reg = <0x30bf0000 0x10000>;
|
|
||||||
interrupts = <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>,
|
|
||||||
<GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
|
|
||||||
interrupt-names = "eth_wake_irq", "macirq";
|
|
||||||
clocks = <&clk IMX8MP_CLK_ENET_QOS_ROOT>,
|
|
||||||
<&clk IMX8MP_CLK_QOS_ENET_ROOT>,
|
|
||||||
<&clk IMX8MP_CLK_ENET_QOS_TIMER>,
|
|
||||||
<&clk IMX8MP_CLK_ENET_QOS>;
|
|
||||||
clock-names = "stmmaceth", "pclk", "ptp_ref", "tx";
|
|
||||||
assigned-clocks = <&clk IMX8MP_CLK_ENET_AXI>,
|
|
||||||
<&clk IMX8MP_CLK_ENET_QOS_TIMER>,
|
|
||||||
<&clk IMX8MP_CLK_ENET_QOS>;
|
|
||||||
assigned-clock-parents = <&clk IMX8MP_SYS_PLL1_266M>,
|
|
||||||
<&clk IMX8MP_SYS_PLL2_100M>,
|
|
||||||
<&clk IMX8MP_SYS_PLL2_125M>;
|
|
||||||
assigned-clock-rates = <0>, <100000000>, <125000000>;
|
|
||||||
nvmem-cells = <ð_mac0>;
|
|
||||||
nvmem-cell-names = "mac-address";
|
|
||||||
nvmem_macaddr_swap;
|
|
||||||
intf_mode = <&gpr 0x4>;
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
93
Documentation/devicetree/bindings/net/nxp,dwmac-imx.yaml
Normal file
93
Documentation/devicetree/bindings/net/nxp,dwmac-imx.yaml
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/net/nxp,dwmac-imx.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: NXP i.MX8 DWMAC glue layer Device Tree Bindings
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Joakim Zhang <qiangqing.zhang@nxp.com>
|
||||||
|
|
||||||
|
# We need a select here so we don't match all nodes with 'snps,dwmac'
|
||||||
|
select:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
- nxp,imx8mp-dwmac-eqos
|
||||||
|
- nxp,imx8dxl-dwmac-eqos
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: "snps,dwmac.yaml#"
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- items:
|
||||||
|
- enum:
|
||||||
|
- nxp,imx8mp-dwmac-eqos
|
||||||
|
- nxp,imx8dxl-dwmac-eqos
|
||||||
|
- const: snps,dwmac-5.10a
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
minItems: 3
|
||||||
|
maxItems: 5
|
||||||
|
items:
|
||||||
|
- description: MAC host clock
|
||||||
|
- description: MAC apb clock
|
||||||
|
- description: MAC timer clock
|
||||||
|
- description: MAC RGMII TX clock
|
||||||
|
- description: EQOS MEM clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
minItems: 3
|
||||||
|
maxItems: 5
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
- stmmaceth
|
||||||
|
- pclk
|
||||||
|
- ptp_ref
|
||||||
|
- tx
|
||||||
|
- mem
|
||||||
|
|
||||||
|
intf_mode:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||||
|
description:
|
||||||
|
Should be phandle/offset pair. The phandle to the syscon node which
|
||||||
|
encompases the GPR register, and the offset of the GPR register.
|
||||||
|
|
||||||
|
snps,rmii_refclk_ext:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
description:
|
||||||
|
To select RMII reference clock from external.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
#include <dt-bindings/clock/imx8mp-clock.h>
|
||||||
|
|
||||||
|
eqos: ethernet@30bf0000 {
|
||||||
|
compatible = "nxp,imx8mp-dwmac-eqos","snps,dwmac-5.10a";
|
||||||
|
reg = <0x30bf0000 0x10000>;
|
||||||
|
interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
interrupt-names = "macirq", "eth_wake_irq";
|
||||||
|
clocks = <&clk IMX8MP_CLK_ENET_QOS_ROOT>,
|
||||||
|
<&clk IMX8MP_CLK_QOS_ENET_ROOT>,
|
||||||
|
<&clk IMX8MP_CLK_ENET_QOS_TIMER>,
|
||||||
|
<&clk IMX8MP_CLK_ENET_QOS>;
|
||||||
|
clock-names = "stmmaceth", "pclk", "ptp_ref", "tx";
|
||||||
|
phy-mode = "rgmii";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
@@ -28,6 +28,7 @@ select:
|
|||||||
- snps,dwmac-4.00
|
- snps,dwmac-4.00
|
||||||
- snps,dwmac-4.10a
|
- snps,dwmac-4.10a
|
||||||
- snps,dwmac-4.20a
|
- snps,dwmac-4.20a
|
||||||
|
- snps,dwmac-5.10a
|
||||||
- snps,dwxgmac
|
- snps,dwxgmac
|
||||||
- snps,dwxgmac-2.10
|
- snps,dwxgmac-2.10
|
||||||
|
|
||||||
@@ -82,6 +83,7 @@ properties:
|
|||||||
- snps,dwmac-4.00
|
- snps,dwmac-4.00
|
||||||
- snps,dwmac-4.10a
|
- snps,dwmac-4.10a
|
||||||
- snps,dwmac-4.20a
|
- snps,dwmac-4.20a
|
||||||
|
- snps,dwmac-5.10a
|
||||||
- snps,dwxgmac
|
- snps,dwxgmac
|
||||||
- snps,dwxgmac-2.10
|
- snps,dwxgmac-2.10
|
||||||
|
|
||||||
@@ -375,6 +377,7 @@ allOf:
|
|||||||
- snps,dwmac-4.00
|
- snps,dwmac-4.00
|
||||||
- snps,dwmac-4.10a
|
- snps,dwmac-4.10a
|
||||||
- snps,dwmac-4.20a
|
- snps,dwmac-4.20a
|
||||||
|
- snps,dwmac-5.10a
|
||||||
- snps,dwxgmac
|
- snps,dwxgmac
|
||||||
- snps,dwxgmac-2.10
|
- snps,dwxgmac-2.10
|
||||||
- st,spear600-gmac
|
- st,spear600-gmac
|
||||||
|
|||||||
@@ -57,12 +57,14 @@ properties:
|
|||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
power-domains:
|
power-domains:
|
||||||
|
deprecated: true
|
||||||
description:
|
description:
|
||||||
Power domain to use for enable control. This binding is only
|
Power domain to use for enable control. This binding is only
|
||||||
available if the compatible is chosen to regulator-fixed-domain.
|
available if the compatible is chosen to regulator-fixed-domain.
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
required-opps:
|
required-opps:
|
||||||
|
deprecated: true
|
||||||
description:
|
description:
|
||||||
Performance state to use for enable control. This binding is only
|
Performance state to use for enable control. This binding is only
|
||||||
available if the compatible is chosen to regulator-fixed-domain. The
|
available if the compatible is chosen to regulator-fixed-domain. The
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ properties:
|
|||||||
|
|
||||||
ports:
|
ports:
|
||||||
$ref: /schemas/graph.yaml#/properties/ports
|
$ref: /schemas/graph.yaml#/properties/ports
|
||||||
properties:
|
patternProperties:
|
||||||
port(@[0-9a-f]+)?:
|
port(@[0-9a-f]+)?:
|
||||||
$ref: audio-graph-port.yaml#
|
$ref: audio-graph-port.yaml#
|
||||||
unevaluatedProperties: false
|
unevaluatedProperties: false
|
||||||
|
|||||||
@@ -243,8 +243,8 @@ Configuration Flags and Socket Options
|
|||||||
These are the various configuration flags that can be used to control
|
These are the various configuration flags that can be used to control
|
||||||
and monitor the behavior of AF_XDP sockets.
|
and monitor the behavior of AF_XDP sockets.
|
||||||
|
|
||||||
XDP_COPY and XDP_ZERO_COPY bind flags
|
XDP_COPY and XDP_ZEROCOPY bind flags
|
||||||
-------------------------------------
|
------------------------------------
|
||||||
|
|
||||||
When you bind to a socket, the kernel will first try to use zero-copy
|
When you bind to a socket, the kernel will first try to use zero-copy
|
||||||
copy. If zero-copy is not supported, it will fall back on using copy
|
copy. If zero-copy is not supported, it will fall back on using copy
|
||||||
@@ -252,7 +252,7 @@ mode, i.e. copying all packets out to user space. But if you would
|
|||||||
like to force a certain mode, you can use the following flags. If you
|
like to force a certain mode, you can use the following flags. If you
|
||||||
pass the XDP_COPY flag to the bind call, the kernel will force the
|
pass the XDP_COPY flag to the bind call, the kernel will force the
|
||||||
socket into copy mode. If it cannot use copy mode, the bind call will
|
socket into copy mode. If it cannot use copy mode, the bind call will
|
||||||
fail with an error. Conversely, the XDP_ZERO_COPY flag will force the
|
fail with an error. Conversely, the XDP_ZEROCOPY flag will force the
|
||||||
socket into zero-copy mode or fail.
|
socket into zero-copy mode or fail.
|
||||||
|
|
||||||
XDP_SHARED_UMEM bind flag
|
XDP_SHARED_UMEM bind flag
|
||||||
|
|||||||
@@ -826,7 +826,7 @@ tcp_fastopen_blackhole_timeout_sec - INTEGER
|
|||||||
initial value when the blackhole issue goes away.
|
initial value when the blackhole issue goes away.
|
||||||
0 to disable the blackhole detection.
|
0 to disable the blackhole detection.
|
||||||
|
|
||||||
By default, it is set to 1hr.
|
By default, it is set to 0 (feature is disabled).
|
||||||
|
|
||||||
tcp_fastopen_key - list of comma separated 32-digit hexadecimal INTEGERs
|
tcp_fastopen_key - list of comma separated 32-digit hexadecimal INTEGERs
|
||||||
The list consists of a primary key and an optional backup key. The
|
The list consists of a primary key and an optional backup key. The
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ Documentation written by Tom Zanussi
|
|||||||
with the event, in nanoseconds. May be
|
with the event, in nanoseconds. May be
|
||||||
modified by .usecs to have timestamps
|
modified by .usecs to have timestamps
|
||||||
interpreted as microseconds.
|
interpreted as microseconds.
|
||||||
cpu int the cpu on which the event occurred.
|
common_cpu int the cpu on which the event occurred.
|
||||||
====================== ==== =======================================
|
====================== ==== =======================================
|
||||||
|
|
||||||
Extended error information
|
Extended error information
|
||||||
|
|||||||
13
MAINTAINERS
13
MAINTAINERS
@@ -445,7 +445,7 @@ F: drivers/platform/x86/wmi.c
|
|||||||
F: include/uapi/linux/wmi.h
|
F: include/uapi/linux/wmi.h
|
||||||
|
|
||||||
ACRN HYPERVISOR SERVICE MODULE
|
ACRN HYPERVISOR SERVICE MODULE
|
||||||
M: Shuo Liu <shuo.a.liu@intel.com>
|
M: Fei Li <fei1.li@intel.com>
|
||||||
L: acrn-dev@lists.projectacrn.org (subscribers-only)
|
L: acrn-dev@lists.projectacrn.org (subscribers-only)
|
||||||
S: Supported
|
S: Supported
|
||||||
W: https://projectacrn.org
|
W: https://projectacrn.org
|
||||||
@@ -11765,6 +11765,7 @@ F: drivers/char/hw_random/mtk-rng.c
|
|||||||
MEDIATEK SWITCH DRIVER
|
MEDIATEK SWITCH DRIVER
|
||||||
M: Sean Wang <sean.wang@mediatek.com>
|
M: Sean Wang <sean.wang@mediatek.com>
|
||||||
M: Landen Chao <Landen.Chao@mediatek.com>
|
M: Landen Chao <Landen.Chao@mediatek.com>
|
||||||
|
M: DENG Qingfang <dqfext@gmail.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/dsa/mt7530.*
|
F: drivers/net/dsa/mt7530.*
|
||||||
@@ -19135,7 +19136,7 @@ M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
|||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/phy/hisilicon,hi3670-usb3.yaml
|
F: Documentation/devicetree/bindings/phy/hisilicon,hi3670-usb3.yaml
|
||||||
F: drivers/phy/hisilicon/phy-kirin970-usb3.c
|
F: drivers/phy/hisilicon/phy-hi3670-usb3.c
|
||||||
|
|
||||||
USB ISP116X DRIVER
|
USB ISP116X DRIVER
|
||||||
M: Olav Kongas <ok@artecdesign.ee>
|
M: Olav Kongas <ok@artecdesign.ee>
|
||||||
@@ -19813,6 +19814,14 @@ L: netdev@vger.kernel.org
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/ptp/ptp_vmw.c
|
F: drivers/ptp/ptp_vmw.c
|
||||||
|
|
||||||
|
VMWARE VMCI DRIVER
|
||||||
|
M: Jorgen Hansen <jhansen@vmware.com>
|
||||||
|
M: Vishnu Dasa <vdasa@vmware.com>
|
||||||
|
L: linux-kernel@vger.kernel.org
|
||||||
|
L: pv-drivers@vmware.com (private)
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/misc/vmw_vmci/
|
||||||
|
|
||||||
VMWARE VMMOUSE SUBDRIVER
|
VMWARE VMMOUSE SUBDRIVER
|
||||||
M: "VMware Graphics" <linux-graphics-maintainer@vmware.com>
|
M: "VMware Graphics" <linux-graphics-maintainer@vmware.com>
|
||||||
M: "VMware, Inc." <pv-drivers@vmware.com>
|
M: "VMware, Inc." <pv-drivers@vmware.com>
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@
|
|||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 14
|
PATCHLEVEL = 14
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc2
|
EXTRAVERSION = -rc3
|
||||||
NAME = Opossums on Parade
|
NAME = Opossums on Parade
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|||||||
@@ -821,9 +821,9 @@
|
|||||||
eqos: ethernet@30bf0000 {
|
eqos: ethernet@30bf0000 {
|
||||||
compatible = "nxp,imx8mp-dwmac-eqos", "snps,dwmac-5.10a";
|
compatible = "nxp,imx8mp-dwmac-eqos", "snps,dwmac-5.10a";
|
||||||
reg = <0x30bf0000 0x10000>;
|
reg = <0x30bf0000 0x10000>;
|
||||||
interrupts = <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>,
|
interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
|
<GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
interrupt-names = "eth_wake_irq", "macirq";
|
interrupt-names = "macirq", "eth_wake_irq";
|
||||||
clocks = <&clk IMX8MP_CLK_ENET_QOS_ROOT>,
|
clocks = <&clk IMX8MP_CLK_ENET_QOS_ROOT>,
|
||||||
<&clk IMX8MP_CLK_QOS_ENET_ROOT>,
|
<&clk IMX8MP_CLK_QOS_ENET_ROOT>,
|
||||||
<&clk IMX8MP_CLK_ENET_QOS_TIMER>,
|
<&clk IMX8MP_CLK_ENET_QOS_TIMER>,
|
||||||
|
|||||||
@@ -1063,7 +1063,7 @@
|
|||||||
status = "okay";
|
status = "okay";
|
||||||
extcon = <&usb2_id>;
|
extcon = <&usb2_id>;
|
||||||
|
|
||||||
usb@7600000 {
|
dwc3@7600000 {
|
||||||
extcon = <&usb2_id>;
|
extcon = <&usb2_id>;
|
||||||
dr_mode = "otg";
|
dr_mode = "otg";
|
||||||
maximum-speed = "high-speed";
|
maximum-speed = "high-speed";
|
||||||
@@ -1074,7 +1074,7 @@
|
|||||||
status = "okay";
|
status = "okay";
|
||||||
extcon = <&usb3_id>;
|
extcon = <&usb3_id>;
|
||||||
|
|
||||||
usb@6a00000 {
|
dwc3@6a00000 {
|
||||||
extcon = <&usb3_id>;
|
extcon = <&usb3_id>;
|
||||||
dr_mode = "otg";
|
dr_mode = "otg";
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -443,7 +443,7 @@
|
|||||||
resets = <&gcc GCC_USB0_BCR>;
|
resets = <&gcc GCC_USB0_BCR>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
dwc_0: usb@8a00000 {
|
dwc_0: dwc3@8a00000 {
|
||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0x8a00000 0xcd00>;
|
reg = <0x8a00000 0xcd00>;
|
||||||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
@@ -484,7 +484,7 @@
|
|||||||
resets = <&gcc GCC_USB1_BCR>;
|
resets = <&gcc GCC_USB1_BCR>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
dwc_1: usb@8c00000 {
|
dwc_1: dwc3@8c00000 {
|
||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0x8c00000 0xcd00>;
|
reg = <0x8c00000 0xcd00>;
|
||||||
interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|||||||
@@ -2566,7 +2566,7 @@
|
|||||||
power-domains = <&gcc USB30_GDSC>;
|
power-domains = <&gcc USB30_GDSC>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
usb@6a00000 {
|
dwc3@6a00000 {
|
||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0x06a00000 0xcc00>;
|
reg = <0x06a00000 0xcc00>;
|
||||||
interrupts = <0 131 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <0 131 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
@@ -2873,7 +2873,7 @@
|
|||||||
qcom,select-utmi-as-pipe-clk;
|
qcom,select-utmi-as-pipe-clk;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
usb@7600000 {
|
dwc3@7600000 {
|
||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0x07600000 0xcc00>;
|
reg = <0x07600000 0xcc00>;
|
||||||
interrupts = <0 138 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <0 138 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|||||||
@@ -1964,7 +1964,7 @@
|
|||||||
|
|
||||||
resets = <&gcc GCC_USB_30_BCR>;
|
resets = <&gcc GCC_USB_30_BCR>;
|
||||||
|
|
||||||
usb3_dwc3: usb@a800000 {
|
usb3_dwc3: dwc3@a800000 {
|
||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0x0a800000 0xcd00>;
|
reg = <0x0a800000 0xcd00>;
|
||||||
interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|||||||
@@ -337,7 +337,7 @@
|
|||||||
&usb3 {
|
&usb3 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
usb@7580000 {
|
dwc3@7580000 {
|
||||||
dr_mode = "host";
|
dr_mode = "host";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -544,7 +544,7 @@
|
|||||||
assigned-clock-rates = <19200000>, <200000000>;
|
assigned-clock-rates = <19200000>, <200000000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
usb@7580000 {
|
dwc3@7580000 {
|
||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0x07580000 0xcd00>;
|
reg = <0x07580000 0xcd00>;
|
||||||
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
@@ -573,7 +573,7 @@
|
|||||||
assigned-clock-rates = <19200000>, <133333333>;
|
assigned-clock-rates = <19200000>, <133333333>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
usb@78c0000 {
|
dwc3@78c0000 {
|
||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0x078c0000 0xcc00>;
|
reg = <0x078c0000 0xcc00>;
|
||||||
interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|||||||
@@ -2756,7 +2756,7 @@
|
|||||||
<&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_USB3 0>;
|
<&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_USB3 0>;
|
||||||
interconnect-names = "usb-ddr", "apps-usb";
|
interconnect-names = "usb-ddr", "apps-usb";
|
||||||
|
|
||||||
usb_1_dwc3: usb@a600000 {
|
usb_1_dwc3: dwc3@a600000 {
|
||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0 0x0a600000 0 0xe000>;
|
reg = <0 0x0a600000 0 0xe000>;
|
||||||
interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|||||||
@@ -3781,7 +3781,7 @@
|
|||||||
<&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_USB3_0 0>;
|
<&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_USB3_0 0>;
|
||||||
interconnect-names = "usb-ddr", "apps-usb";
|
interconnect-names = "usb-ddr", "apps-usb";
|
||||||
|
|
||||||
usb_1_dwc3: usb@a600000 {
|
usb_1_dwc3: dwc3@a600000 {
|
||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0 0x0a600000 0 0xcd00>;
|
reg = <0 0x0a600000 0 0xcd00>;
|
||||||
interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
@@ -3829,7 +3829,7 @@
|
|||||||
<&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_USB3_1 0>;
|
<&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_USB3_1 0>;
|
||||||
interconnect-names = "usb-ddr", "apps-usb";
|
interconnect-names = "usb-ddr", "apps-usb";
|
||||||
|
|
||||||
usb_2_dwc3: usb@a800000 {
|
usb_2_dwc3: dwc3@a800000 {
|
||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0 0x0a800000 0 0xcd00>;
|
reg = <0 0x0a800000 0 0xcd00>;
|
||||||
interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|||||||
@@ -2344,7 +2344,7 @@
|
|||||||
|
|
||||||
resets = <&gcc GCC_USB30_PRIM_BCR>;
|
resets = <&gcc GCC_USB30_PRIM_BCR>;
|
||||||
|
|
||||||
usb_1_dwc3: usb@a600000 {
|
usb_1_dwc3: dwc3@a600000 {
|
||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0 0x0a600000 0 0xcd00>;
|
reg = <0 0x0a600000 0 0xcd00>;
|
||||||
interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|||||||
@@ -32,20 +32,23 @@ SYM_FUNC_END(__arm_smccc_sve_check)
|
|||||||
EXPORT_SYMBOL(__arm_smccc_sve_check)
|
EXPORT_SYMBOL(__arm_smccc_sve_check)
|
||||||
|
|
||||||
.macro SMCCC instr
|
.macro SMCCC instr
|
||||||
|
stp x29, x30, [sp, #-16]!
|
||||||
|
mov x29, sp
|
||||||
alternative_if ARM64_SVE
|
alternative_if ARM64_SVE
|
||||||
bl __arm_smccc_sve_check
|
bl __arm_smccc_sve_check
|
||||||
alternative_else_nop_endif
|
alternative_else_nop_endif
|
||||||
\instr #0
|
\instr #0
|
||||||
ldr x4, [sp]
|
ldr x4, [sp, #16]
|
||||||
stp x0, x1, [x4, #ARM_SMCCC_RES_X0_OFFS]
|
stp x0, x1, [x4, #ARM_SMCCC_RES_X0_OFFS]
|
||||||
stp x2, x3, [x4, #ARM_SMCCC_RES_X2_OFFS]
|
stp x2, x3, [x4, #ARM_SMCCC_RES_X2_OFFS]
|
||||||
ldr x4, [sp, #8]
|
ldr x4, [sp, #24]
|
||||||
cbz x4, 1f /* no quirk structure */
|
cbz x4, 1f /* no quirk structure */
|
||||||
ldr x9, [x4, #ARM_SMCCC_QUIRK_ID_OFFS]
|
ldr x9, [x4, #ARM_SMCCC_QUIRK_ID_OFFS]
|
||||||
cmp x9, #ARM_SMCCC_QUIRK_QCOM_A6
|
cmp x9, #ARM_SMCCC_QUIRK_QCOM_A6
|
||||||
b.ne 1f
|
b.ne 1f
|
||||||
str x6, [x4, ARM_SMCCC_QUIRK_STATE_OFFS]
|
str x6, [x4, ARM_SMCCC_QUIRK_STATE_OFFS]
|
||||||
1: ret
|
1: ldp x29, x30, [sp], #16
|
||||||
|
ret
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -1339,7 +1339,6 @@ void *__init fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot)
|
|||||||
return dt_virt;
|
return dt_virt;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_PGTABLE_LEVELS > 3
|
|
||||||
int pud_set_huge(pud_t *pudp, phys_addr_t phys, pgprot_t prot)
|
int pud_set_huge(pud_t *pudp, phys_addr_t phys, pgprot_t prot)
|
||||||
{
|
{
|
||||||
pud_t new_pud = pfn_pud(__phys_to_pfn(phys), mk_pud_sect_prot(prot));
|
pud_t new_pud = pfn_pud(__phys_to_pfn(phys), mk_pud_sect_prot(prot));
|
||||||
@@ -1354,16 +1353,6 @@ int pud_set_huge(pud_t *pudp, phys_addr_t phys, pgprot_t prot)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pud_clear_huge(pud_t *pudp)
|
|
||||||
{
|
|
||||||
if (!pud_sect(READ_ONCE(*pudp)))
|
|
||||||
return 0;
|
|
||||||
pud_clear(pudp);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CONFIG_PGTABLE_LEVELS > 2
|
|
||||||
int pmd_set_huge(pmd_t *pmdp, phys_addr_t phys, pgprot_t prot)
|
int pmd_set_huge(pmd_t *pmdp, phys_addr_t phys, pgprot_t prot)
|
||||||
{
|
{
|
||||||
pmd_t new_pmd = pfn_pmd(__phys_to_pfn(phys), mk_pmd_sect_prot(prot));
|
pmd_t new_pmd = pfn_pmd(__phys_to_pfn(phys), mk_pmd_sect_prot(prot));
|
||||||
@@ -1378,6 +1367,14 @@ int pmd_set_huge(pmd_t *pmdp, phys_addr_t phys, pgprot_t prot)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pud_clear_huge(pud_t *pudp)
|
||||||
|
{
|
||||||
|
if (!pud_sect(READ_ONCE(*pudp)))
|
||||||
|
return 0;
|
||||||
|
pud_clear(pudp);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int pmd_clear_huge(pmd_t *pmdp)
|
int pmd_clear_huge(pmd_t *pmdp)
|
||||||
{
|
{
|
||||||
if (!pmd_sect(READ_ONCE(*pmdp)))
|
if (!pmd_sect(READ_ONCE(*pmdp)))
|
||||||
@@ -1385,7 +1382,6 @@ int pmd_clear_huge(pmd_t *pmdp)
|
|||||||
pmd_clear(pmdp);
|
pmd_clear(pmdp);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
int pmd_free_pte_page(pmd_t *pmdp, unsigned long addr)
|
int pmd_free_pte_page(pmd_t *pmdp, unsigned long addr)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ config MAC
|
|||||||
depends on MMU
|
depends on MMU
|
||||||
select MMU_MOTOROLA if MMU
|
select MMU_MOTOROLA if MMU
|
||||||
select HAVE_ARCH_NVRAM_OPS
|
select HAVE_ARCH_NVRAM_OPS
|
||||||
|
select HAVE_PATA_PLATFORM
|
||||||
select LEGACY_TIMER_TICK
|
select LEGACY_TIMER_TICK
|
||||||
help
|
help
|
||||||
This option enables support for the Apple Macintosh series of
|
This option enables support for the Apple Macintosh series of
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
|||||||
|
|
||||||
vma = find_vma(mm, addr);
|
vma = find_vma(mm, addr);
|
||||||
if (TASK_SIZE - len >= addr &&
|
if (TASK_SIZE - len >= addr &&
|
||||||
(!vma || addr + len <= vma->vm_start))
|
(!vma || addr + len <= vm_start_gap(vma)))
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2697,8 +2697,10 @@ static int kvmppc_core_vcpu_create_hv(struct kvm_vcpu *vcpu)
|
|||||||
HFSCR_DSCR | HFSCR_VECVSX | HFSCR_FP | HFSCR_PREFIX;
|
HFSCR_DSCR | HFSCR_VECVSX | HFSCR_FP | HFSCR_PREFIX;
|
||||||
if (cpu_has_feature(CPU_FTR_HVMODE)) {
|
if (cpu_has_feature(CPU_FTR_HVMODE)) {
|
||||||
vcpu->arch.hfscr &= mfspr(SPRN_HFSCR);
|
vcpu->arch.hfscr &= mfspr(SPRN_HFSCR);
|
||||||
|
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||||
if (cpu_has_feature(CPU_FTR_P9_TM_HV_ASSIST))
|
if (cpu_has_feature(CPU_FTR_P9_TM_HV_ASSIST))
|
||||||
vcpu->arch.hfscr |= HFSCR_TM;
|
vcpu->arch.hfscr |= HFSCR_TM;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (cpu_has_feature(CPU_FTR_TM_COMP))
|
if (cpu_has_feature(CPU_FTR_TM_COMP))
|
||||||
vcpu->arch.hfscr |= HFSCR_TM;
|
vcpu->arch.hfscr |= HFSCR_TM;
|
||||||
|
|||||||
@@ -302,6 +302,9 @@ long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu)
|
|||||||
if (vcpu->kvm->arch.l1_ptcr == 0)
|
if (vcpu->kvm->arch.l1_ptcr == 0)
|
||||||
return H_NOT_AVAILABLE;
|
return H_NOT_AVAILABLE;
|
||||||
|
|
||||||
|
if (MSR_TM_TRANSACTIONAL(vcpu->arch.shregs.msr))
|
||||||
|
return H_BAD_MODE;
|
||||||
|
|
||||||
/* copy parameters in */
|
/* copy parameters in */
|
||||||
hv_ptr = kvmppc_get_gpr(vcpu, 4);
|
hv_ptr = kvmppc_get_gpr(vcpu, 4);
|
||||||
regs_ptr = kvmppc_get_gpr(vcpu, 5);
|
regs_ptr = kvmppc_get_gpr(vcpu, 5);
|
||||||
@@ -322,6 +325,23 @@ long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu)
|
|||||||
if (l2_hv.vcpu_token >= NR_CPUS)
|
if (l2_hv.vcpu_token >= NR_CPUS)
|
||||||
return H_PARAMETER;
|
return H_PARAMETER;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* L1 must have set up a suspended state to enter the L2 in a
|
||||||
|
* transactional state, and only in that case. These have to be
|
||||||
|
* filtered out here to prevent causing a TM Bad Thing in the
|
||||||
|
* host HRFID. We could synthesize a TM Bad Thing back to the L1
|
||||||
|
* here but there doesn't seem like much point.
|
||||||
|
*/
|
||||||
|
if (MSR_TM_SUSPENDED(vcpu->arch.shregs.msr)) {
|
||||||
|
if (!MSR_TM_ACTIVE(l2_regs.msr))
|
||||||
|
return H_BAD_MODE;
|
||||||
|
} else {
|
||||||
|
if (l2_regs.msr & MSR_TS_MASK)
|
||||||
|
return H_BAD_MODE;
|
||||||
|
if (WARN_ON_ONCE(vcpu->arch.shregs.msr & MSR_TS_MASK))
|
||||||
|
return H_BAD_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
/* translate lpid */
|
/* translate lpid */
|
||||||
l2 = kvmhv_get_nested(vcpu->kvm, l2_hv.lpid, true);
|
l2 = kvmhv_get_nested(vcpu->kvm, l2_hv.lpid, true);
|
||||||
if (!l2)
|
if (!l2)
|
||||||
|
|||||||
@@ -317,6 +317,9 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
|
|||||||
*/
|
*/
|
||||||
mtspr(SPRN_HDEC, hdec);
|
mtspr(SPRN_HDEC, hdec);
|
||||||
|
|
||||||
|
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||||
|
tm_return_to_guest:
|
||||||
|
#endif
|
||||||
mtspr(SPRN_DAR, vcpu->arch.shregs.dar);
|
mtspr(SPRN_DAR, vcpu->arch.shregs.dar);
|
||||||
mtspr(SPRN_DSISR, vcpu->arch.shregs.dsisr);
|
mtspr(SPRN_DSISR, vcpu->arch.shregs.dsisr);
|
||||||
mtspr(SPRN_SRR0, vcpu->arch.shregs.srr0);
|
mtspr(SPRN_SRR0, vcpu->arch.shregs.srr0);
|
||||||
@@ -415,11 +418,23 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
|
|||||||
* is in real suspend mode and is trying to transition to
|
* is in real suspend mode and is trying to transition to
|
||||||
* transactional mode.
|
* transactional mode.
|
||||||
*/
|
*/
|
||||||
if (local_paca->kvm_hstate.fake_suspend &&
|
if (!local_paca->kvm_hstate.fake_suspend &&
|
||||||
(vcpu->arch.shregs.msr & MSR_TS_S)) {
|
(vcpu->arch.shregs.msr & MSR_TS_S)) {
|
||||||
if (kvmhv_p9_tm_emulation_early(vcpu)) {
|
if (kvmhv_p9_tm_emulation_early(vcpu)) {
|
||||||
/* Prevent it being handled again. */
|
/*
|
||||||
trap = 0;
|
* Go straight back into the guest with the
|
||||||
|
* new NIP/MSR as set by TM emulation.
|
||||||
|
*/
|
||||||
|
mtspr(SPRN_HSRR0, vcpu->arch.regs.nip);
|
||||||
|
mtspr(SPRN_HSRR1, vcpu->arch.shregs.msr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* tm_return_to_guest re-loads SRR0/1, DAR,
|
||||||
|
* DSISR after RI is cleared, in case they had
|
||||||
|
* been clobbered by a MCE.
|
||||||
|
*/
|
||||||
|
__mtmsrd(0, 1); /* clear RI */
|
||||||
|
goto tm_return_to_guest;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -499,6 +514,10 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
|
|||||||
* If we are in real mode, only switch MMU on after the MMU is
|
* If we are in real mode, only switch MMU on after the MMU is
|
||||||
* switched to host, to avoid the P9_RADIX_PREFETCH_BUG.
|
* switched to host, to avoid the P9_RADIX_PREFETCH_BUG.
|
||||||
*/
|
*/
|
||||||
|
if (IS_ENABLED(CONFIG_PPC_TRANSACTIONAL_MEM) &&
|
||||||
|
vcpu->arch.shregs.msr & MSR_TS_MASK)
|
||||||
|
msr |= MSR_TS_S;
|
||||||
|
|
||||||
__mtmsrd(msr, 0);
|
__mtmsrd(msr, 0);
|
||||||
|
|
||||||
end_timing(vcpu);
|
end_timing(vcpu);
|
||||||
|
|||||||
@@ -242,6 +242,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
|
|||||||
* value so we can restore it on the way out.
|
* value so we can restore it on the way out.
|
||||||
*/
|
*/
|
||||||
orig_rets = args.rets;
|
orig_rets = args.rets;
|
||||||
|
if (be32_to_cpu(args.nargs) >= ARRAY_SIZE(args.args)) {
|
||||||
|
/*
|
||||||
|
* Don't overflow our args array: ensure there is room for
|
||||||
|
* at least rets[0] (even if the call specifies 0 nret).
|
||||||
|
*
|
||||||
|
* Each handler must then check for the correct nargs and nret
|
||||||
|
* values, but they may always return failure in rets[0].
|
||||||
|
*/
|
||||||
|
rc = -EINVAL;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
args.rets = &args.args[be32_to_cpu(args.nargs)];
|
args.rets = &args.args[be32_to_cpu(args.nargs)];
|
||||||
|
|
||||||
mutex_lock(&vcpu->kvm->arch.rtas_token_lock);
|
mutex_lock(&vcpu->kvm->arch.rtas_token_lock);
|
||||||
@@ -269,9 +280,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
|
|||||||
fail:
|
fail:
|
||||||
/*
|
/*
|
||||||
* We only get here if the guest has called RTAS with a bogus
|
* We only get here if the guest has called RTAS with a bogus
|
||||||
* args pointer. That means we can't get to the args, and so we
|
* args pointer or nargs/nret values that would overflow the
|
||||||
* can't fail the RTAS call. So fail right out to userspace,
|
* array. That means we can't get to the args, and so we can't
|
||||||
* which should kill the guest.
|
* fail the RTAS call. So fail right out to userspace, which
|
||||||
|
* should kill the guest.
|
||||||
|
*
|
||||||
|
* SLOF should actually pass the hcall return value from the
|
||||||
|
* rtas handler call in r3, so enter_rtas could be modified to
|
||||||
|
* return a failure indication in r3 and we could return such
|
||||||
|
* errors to the guest rather than failing to host userspace.
|
||||||
|
* However old guests that don't test for failure could then
|
||||||
|
* continue silently after errors, so for now we won't do this.
|
||||||
*/
|
*/
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2048,9 +2048,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
|||||||
{
|
{
|
||||||
struct kvm_enable_cap cap;
|
struct kvm_enable_cap cap;
|
||||||
r = -EFAULT;
|
r = -EFAULT;
|
||||||
vcpu_load(vcpu);
|
|
||||||
if (copy_from_user(&cap, argp, sizeof(cap)))
|
if (copy_from_user(&cap, argp, sizeof(cap)))
|
||||||
goto out;
|
goto out;
|
||||||
|
vcpu_load(vcpu);
|
||||||
r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap);
|
r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap);
|
||||||
vcpu_put(vcpu);
|
vcpu_put(vcpu);
|
||||||
break;
|
break;
|
||||||
@@ -2074,9 +2074,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
|||||||
case KVM_DIRTY_TLB: {
|
case KVM_DIRTY_TLB: {
|
||||||
struct kvm_dirty_tlb dirty;
|
struct kvm_dirty_tlb dirty;
|
||||||
r = -EFAULT;
|
r = -EFAULT;
|
||||||
vcpu_load(vcpu);
|
|
||||||
if (copy_from_user(&dirty, argp, sizeof(dirty)))
|
if (copy_from_user(&dirty, argp, sizeof(dirty)))
|
||||||
goto out;
|
goto out;
|
||||||
|
vcpu_load(vcpu);
|
||||||
r = kvm_vcpu_ioctl_dirty_tlb(vcpu, &dirty);
|
r = kvm_vcpu_ioctl_dirty_tlb(vcpu, &dirty);
|
||||||
vcpu_put(vcpu);
|
vcpu_put(vcpu);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -240,3 +240,13 @@ void __init setup_kuap(bool disabled)
|
|||||||
mtspr(SPRN_MD_AP, MD_APG_KUAP);
|
mtspr(SPRN_MD_AP, MD_APG_KUAP);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int pud_clear_huge(pud_t *pud)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pmd_clear_huge(pmd_t *pmd)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ static int pasemi_system_reset_exception(struct pt_regs *regs)
|
|||||||
switch (regs->msr & SRR1_WAKEMASK) {
|
switch (regs->msr & SRR1_WAKEMASK) {
|
||||||
case SRR1_WAKEDEC:
|
case SRR1_WAKEDEC:
|
||||||
set_dec(1);
|
set_dec(1);
|
||||||
|
break;
|
||||||
case SRR1_WAKEEE:
|
case SRR1_WAKEEE:
|
||||||
/*
|
/*
|
||||||
* Handle these when interrupts get re-enabled and we take
|
* Handle these when interrupts get re-enabled and we take
|
||||||
|
|||||||
@@ -27,10 +27,10 @@ int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md);
|
|||||||
|
|
||||||
#define ARCH_EFI_IRQ_FLAGS_MASK (SR_IE | SR_SPIE)
|
#define ARCH_EFI_IRQ_FLAGS_MASK (SR_IE | SR_SPIE)
|
||||||
|
|
||||||
/* Load initrd at enough distance from DRAM start */
|
/* Load initrd anywhere in system RAM */
|
||||||
static inline unsigned long efi_get_max_initrd_addr(unsigned long image_addr)
|
static inline unsigned long efi_get_max_initrd_addr(unsigned long image_addr)
|
||||||
{
|
{
|
||||||
return image_addr + SZ_256M;
|
return ULONG_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define alloc_screen_info(x...) (&screen_info)
|
#define alloc_screen_info(x...) (&screen_info)
|
||||||
|
|||||||
@@ -132,8 +132,12 @@ unsigned long get_wchan(struct task_struct *task)
|
|||||||
{
|
{
|
||||||
unsigned long pc = 0;
|
unsigned long pc = 0;
|
||||||
|
|
||||||
if (likely(task && task != current && !task_is_running(task)))
|
if (likely(task && task != current && !task_is_running(task))) {
|
||||||
|
if (!try_get_task_stack(task))
|
||||||
|
return 0;
|
||||||
walk_stackframe(task, NULL, save_wchan, &pc);
|
walk_stackframe(task, NULL, save_wchan, &pc);
|
||||||
|
put_task_stack(task);
|
||||||
|
}
|
||||||
return pc;
|
return pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,23 +30,23 @@ ENTRY(__asm_copy_from_user)
|
|||||||
* t0 - end of uncopied dst
|
* t0 - end of uncopied dst
|
||||||
*/
|
*/
|
||||||
add t0, a0, a2
|
add t0, a0, a2
|
||||||
bgtu a0, t0, 5f
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use byte copy only if too small.
|
* Use byte copy only if too small.
|
||||||
|
* SZREG holds 4 for RV32 and 8 for RV64
|
||||||
*/
|
*/
|
||||||
li a3, 8*SZREG /* size must be larger than size in word_copy */
|
li a3, 9*SZREG /* size must be larger than size in word_copy */
|
||||||
bltu a2, a3, .Lbyte_copy_tail
|
bltu a2, a3, .Lbyte_copy_tail
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy first bytes until dst is align to word boundary.
|
* Copy first bytes until dst is aligned to word boundary.
|
||||||
* a0 - start of dst
|
* a0 - start of dst
|
||||||
* t1 - start of aligned dst
|
* t1 - start of aligned dst
|
||||||
*/
|
*/
|
||||||
addi t1, a0, SZREG-1
|
addi t1, a0, SZREG-1
|
||||||
andi t1, t1, ~(SZREG-1)
|
andi t1, t1, ~(SZREG-1)
|
||||||
/* dst is already aligned, skip */
|
/* dst is already aligned, skip */
|
||||||
beq a0, t1, .Lskip_first_bytes
|
beq a0, t1, .Lskip_align_dst
|
||||||
1:
|
1:
|
||||||
/* a5 - one byte for copying data */
|
/* a5 - one byte for copying data */
|
||||||
fixup lb a5, 0(a1), 10f
|
fixup lb a5, 0(a1), 10f
|
||||||
@@ -55,7 +55,7 @@ ENTRY(__asm_copy_from_user)
|
|||||||
addi a0, a0, 1 /* dst */
|
addi a0, a0, 1 /* dst */
|
||||||
bltu a0, t1, 1b /* t1 - start of aligned dst */
|
bltu a0, t1, 1b /* t1 - start of aligned dst */
|
||||||
|
|
||||||
.Lskip_first_bytes:
|
.Lskip_align_dst:
|
||||||
/*
|
/*
|
||||||
* Now dst is aligned.
|
* Now dst is aligned.
|
||||||
* Use shift-copy if src is misaligned.
|
* Use shift-copy if src is misaligned.
|
||||||
@@ -72,10 +72,9 @@ ENTRY(__asm_copy_from_user)
|
|||||||
*
|
*
|
||||||
* a0 - start of aligned dst
|
* a0 - start of aligned dst
|
||||||
* a1 - start of aligned src
|
* a1 - start of aligned src
|
||||||
* a3 - a1 & mask:(SZREG-1)
|
|
||||||
* t0 - end of aligned dst
|
* t0 - end of aligned dst
|
||||||
*/
|
*/
|
||||||
addi t0, t0, -(8*SZREG-1) /* not to over run */
|
addi t0, t0, -(8*SZREG) /* not to over run */
|
||||||
2:
|
2:
|
||||||
fixup REG_L a4, 0(a1), 10f
|
fixup REG_L a4, 0(a1), 10f
|
||||||
fixup REG_L a5, SZREG(a1), 10f
|
fixup REG_L a5, SZREG(a1), 10f
|
||||||
@@ -97,7 +96,7 @@ ENTRY(__asm_copy_from_user)
|
|||||||
addi a1, a1, 8*SZREG
|
addi a1, a1, 8*SZREG
|
||||||
bltu a0, t0, 2b
|
bltu a0, t0, 2b
|
||||||
|
|
||||||
addi t0, t0, 8*SZREG-1 /* revert to original value */
|
addi t0, t0, 8*SZREG /* revert to original value */
|
||||||
j .Lbyte_copy_tail
|
j .Lbyte_copy_tail
|
||||||
|
|
||||||
.Lshift_copy:
|
.Lshift_copy:
|
||||||
@@ -107,7 +106,7 @@ ENTRY(__asm_copy_from_user)
|
|||||||
* For misaligned copy we still perform aligned word copy, but
|
* For misaligned copy we still perform aligned word copy, but
|
||||||
* we need to use the value fetched from the previous iteration and
|
* we need to use the value fetched from the previous iteration and
|
||||||
* do some shifts.
|
* do some shifts.
|
||||||
* This is safe because reading less than a word size.
|
* This is safe because reading is less than a word size.
|
||||||
*
|
*
|
||||||
* a0 - start of aligned dst
|
* a0 - start of aligned dst
|
||||||
* a1 - start of src
|
* a1 - start of src
|
||||||
@@ -117,7 +116,7 @@ ENTRY(__asm_copy_from_user)
|
|||||||
*/
|
*/
|
||||||
/* calculating aligned word boundary for dst */
|
/* calculating aligned word boundary for dst */
|
||||||
andi t1, t0, ~(SZREG-1)
|
andi t1, t0, ~(SZREG-1)
|
||||||
/* Converting unaligned src to aligned arc */
|
/* Converting unaligned src to aligned src */
|
||||||
andi a1, a1, ~(SZREG-1)
|
andi a1, a1, ~(SZREG-1)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -125,11 +124,11 @@ ENTRY(__asm_copy_from_user)
|
|||||||
* t3 - prev shift
|
* t3 - prev shift
|
||||||
* t4 - current shift
|
* t4 - current shift
|
||||||
*/
|
*/
|
||||||
slli t3, a3, LGREG
|
slli t3, a3, 3 /* converting bytes in a3 to bits */
|
||||||
li a5, SZREG*8
|
li a5, SZREG*8
|
||||||
sub t4, a5, t3
|
sub t4, a5, t3
|
||||||
|
|
||||||
/* Load the first word to combine with seceond word */
|
/* Load the first word to combine with second word */
|
||||||
fixup REG_L a5, 0(a1), 10f
|
fixup REG_L a5, 0(a1), 10f
|
||||||
|
|
||||||
3:
|
3:
|
||||||
@@ -161,7 +160,7 @@ ENTRY(__asm_copy_from_user)
|
|||||||
* a1 - start of remaining src
|
* a1 - start of remaining src
|
||||||
* t0 - end of remaining dst
|
* t0 - end of remaining dst
|
||||||
*/
|
*/
|
||||||
bgeu a0, t0, 5f
|
bgeu a0, t0, .Lout_copy_user /* check if end of copy */
|
||||||
4:
|
4:
|
||||||
fixup lb a5, 0(a1), 10f
|
fixup lb a5, 0(a1), 10f
|
||||||
addi a1, a1, 1 /* src */
|
addi a1, a1, 1 /* src */
|
||||||
@@ -169,7 +168,7 @@ ENTRY(__asm_copy_from_user)
|
|||||||
addi a0, a0, 1 /* dst */
|
addi a0, a0, 1 /* dst */
|
||||||
bltu a0, t0, 4b /* t0 - end of dst */
|
bltu a0, t0, 4b /* t0 - end of dst */
|
||||||
|
|
||||||
5:
|
.Lout_copy_user:
|
||||||
/* Disable access to user memory */
|
/* Disable access to user memory */
|
||||||
csrc CSR_STATUS, t6
|
csrc CSR_STATUS, t6
|
||||||
li a0, 0
|
li a0, 0
|
||||||
|
|||||||
@@ -127,10 +127,17 @@ void __init mem_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The default maximal physical memory size is -PAGE_OFFSET,
|
* The default maximal physical memory size is -PAGE_OFFSET for 32-bit kernel,
|
||||||
* limit the memory size via mem.
|
* whereas for 64-bit kernel, the end of the virtual address space is occupied
|
||||||
|
* by the modules/BPF/kernel mappings which reduces the available size of the
|
||||||
|
* linear mapping.
|
||||||
|
* Limit the memory size via mem.
|
||||||
*/
|
*/
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
static phys_addr_t memory_limit = -PAGE_OFFSET - SZ_4G;
|
||||||
|
#else
|
||||||
static phys_addr_t memory_limit = -PAGE_OFFSET;
|
static phys_addr_t memory_limit = -PAGE_OFFSET;
|
||||||
|
#endif
|
||||||
|
|
||||||
static int __init early_mem(char *p)
|
static int __init early_mem(char *p)
|
||||||
{
|
{
|
||||||
@@ -152,7 +159,7 @@ static void __init setup_bootmem(void)
|
|||||||
{
|
{
|
||||||
phys_addr_t vmlinux_end = __pa_symbol(&_end);
|
phys_addr_t vmlinux_end = __pa_symbol(&_end);
|
||||||
phys_addr_t vmlinux_start = __pa_symbol(&_start);
|
phys_addr_t vmlinux_start = __pa_symbol(&_start);
|
||||||
phys_addr_t max_mapped_addr = __pa(~(ulong)0);
|
phys_addr_t __maybe_unused max_mapped_addr;
|
||||||
phys_addr_t dram_end;
|
phys_addr_t dram_end;
|
||||||
|
|
||||||
#ifdef CONFIG_XIP_KERNEL
|
#ifdef CONFIG_XIP_KERNEL
|
||||||
@@ -175,14 +182,21 @@ static void __init setup_bootmem(void)
|
|||||||
memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start);
|
memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start);
|
||||||
|
|
||||||
dram_end = memblock_end_of_DRAM();
|
dram_end = memblock_end_of_DRAM();
|
||||||
|
|
||||||
|
#ifndef CONFIG_64BIT
|
||||||
/*
|
/*
|
||||||
* memblock allocator is not aware of the fact that last 4K bytes of
|
* memblock allocator is not aware of the fact that last 4K bytes of
|
||||||
* the addressable memory can not be mapped because of IS_ERR_VALUE
|
* the addressable memory can not be mapped because of IS_ERR_VALUE
|
||||||
* macro. Make sure that last 4k bytes are not usable by memblock
|
* macro. Make sure that last 4k bytes are not usable by memblock
|
||||||
* if end of dram is equal to maximum addressable memory.
|
* if end of dram is equal to maximum addressable memory. For 64-bit
|
||||||
|
* kernel, this problem can't happen here as the end of the virtual
|
||||||
|
* address space is occupied by the kernel mapping then this check must
|
||||||
|
* be done in create_kernel_page_table.
|
||||||
*/
|
*/
|
||||||
|
max_mapped_addr = __pa(~(ulong)0);
|
||||||
if (max_mapped_addr == (dram_end - 1))
|
if (max_mapped_addr == (dram_end - 1))
|
||||||
memblock_set_current_limit(max_mapped_addr - 4096);
|
memblock_set_current_limit(max_mapped_addr - 4096);
|
||||||
|
#endif
|
||||||
|
|
||||||
min_low_pfn = PFN_UP(memblock_start_of_DRAM());
|
min_low_pfn = PFN_UP(memblock_start_of_DRAM());
|
||||||
max_low_pfn = max_pfn = PFN_DOWN(dram_end);
|
max_low_pfn = max_pfn = PFN_DOWN(dram_end);
|
||||||
@@ -570,6 +584,14 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)
|
|||||||
BUG_ON((PAGE_OFFSET % PGDIR_SIZE) != 0);
|
BUG_ON((PAGE_OFFSET % PGDIR_SIZE) != 0);
|
||||||
BUG_ON((kernel_map.phys_addr % map_size) != 0);
|
BUG_ON((kernel_map.phys_addr % map_size) != 0);
|
||||||
|
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
/*
|
||||||
|
* The last 4K bytes of the addressable memory can not be mapped because
|
||||||
|
* of IS_ERR_VALUE macro.
|
||||||
|
*/
|
||||||
|
BUG_ON((kernel_map.virt_addr + kernel_map.size) > ADDRESS_SPACE_END - SZ_4K);
|
||||||
|
#endif
|
||||||
|
|
||||||
pt_ops.alloc_pte = alloc_pte_early;
|
pt_ops.alloc_pte = alloc_pte_early;
|
||||||
pt_ops.get_pte_virt = get_pte_virt_early;
|
pt_ops.get_pte_virt = get_pte_virt_early;
|
||||||
#ifndef __PAGETABLE_PMD_FOLDED
|
#ifndef __PAGETABLE_PMD_FOLDED
|
||||||
@@ -709,6 +731,8 @@ static void __init setup_vm_final(void)
|
|||||||
if (start <= __pa(PAGE_OFFSET) &&
|
if (start <= __pa(PAGE_OFFSET) &&
|
||||||
__pa(PAGE_OFFSET) < end)
|
__pa(PAGE_OFFSET) < end)
|
||||||
start = __pa(PAGE_OFFSET);
|
start = __pa(PAGE_OFFSET);
|
||||||
|
if (end >= __pa(PAGE_OFFSET) + memory_limit)
|
||||||
|
end = __pa(PAGE_OFFSET) + memory_limit;
|
||||||
|
|
||||||
map_size = best_map_size(start, end - start);
|
map_size = best_map_size(start, end - start);
|
||||||
for (pa = start; pa < end; pa += map_size) {
|
for (pa = start; pa < end; pa += map_size) {
|
||||||
|
|||||||
@@ -9,16 +9,6 @@
|
|||||||
#include <asm/errno.h>
|
#include <asm/errno.h>
|
||||||
#include <asm/sigp.h>
|
#include <asm/sigp.h>
|
||||||
|
|
||||||
#ifdef CC_USING_EXPOLINE
|
|
||||||
.pushsection .dma.text.__s390_indirect_jump_r14,"axG"
|
|
||||||
__dma__s390_indirect_jump_r14:
|
|
||||||
larl %r1,0f
|
|
||||||
ex 0,0(%r1)
|
|
||||||
j .
|
|
||||||
0: br %r14
|
|
||||||
.popsection
|
|
||||||
#endif
|
|
||||||
|
|
||||||
.section .dma.text,"ax"
|
.section .dma.text,"ax"
|
||||||
/*
|
/*
|
||||||
* Simplified version of expoline thunk. The normal thunks can not be used here,
|
* Simplified version of expoline thunk. The normal thunks can not be used here,
|
||||||
@@ -27,11 +17,10 @@ __dma__s390_indirect_jump_r14:
|
|||||||
* affects a few functions that are not performance-relevant.
|
* affects a few functions that are not performance-relevant.
|
||||||
*/
|
*/
|
||||||
.macro BR_EX_DMA_r14
|
.macro BR_EX_DMA_r14
|
||||||
#ifdef CC_USING_EXPOLINE
|
larl %r1,0f
|
||||||
jg __dma__s390_indirect_jump_r14
|
ex 0,0(%r1)
|
||||||
#else
|
j .
|
||||||
br %r14
|
0: br %r14
|
||||||
#endif
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -5,7 +5,12 @@ CONFIG_WATCH_QUEUE=y
|
|||||||
CONFIG_AUDIT=y
|
CONFIG_AUDIT=y
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
CONFIG_BPF_SYSCALL=y
|
||||||
|
CONFIG_BPF_JIT=y
|
||||||
|
CONFIG_BPF_JIT_ALWAYS_ON=y
|
||||||
|
CONFIG_BPF_LSM=y
|
||||||
CONFIG_PREEMPT=y
|
CONFIG_PREEMPT=y
|
||||||
|
CONFIG_SCHED_CORE=y
|
||||||
CONFIG_BSD_PROCESS_ACCT=y
|
CONFIG_BSD_PROCESS_ACCT=y
|
||||||
CONFIG_BSD_PROCESS_ACCT_V3=y
|
CONFIG_BSD_PROCESS_ACCT_V3=y
|
||||||
CONFIG_TASKSTATS=y
|
CONFIG_TASKSTATS=y
|
||||||
@@ -28,14 +33,13 @@ CONFIG_CGROUP_DEVICE=y
|
|||||||
CONFIG_CGROUP_CPUACCT=y
|
CONFIG_CGROUP_CPUACCT=y
|
||||||
CONFIG_CGROUP_PERF=y
|
CONFIG_CGROUP_PERF=y
|
||||||
CONFIG_CGROUP_BPF=y
|
CONFIG_CGROUP_BPF=y
|
||||||
|
CONFIG_CGROUP_MISC=y
|
||||||
CONFIG_NAMESPACES=y
|
CONFIG_NAMESPACES=y
|
||||||
CONFIG_USER_NS=y
|
CONFIG_USER_NS=y
|
||||||
CONFIG_CHECKPOINT_RESTORE=y
|
CONFIG_CHECKPOINT_RESTORE=y
|
||||||
CONFIG_SCHED_AUTOGROUP=y
|
CONFIG_SCHED_AUTOGROUP=y
|
||||||
CONFIG_EXPERT=y
|
CONFIG_EXPERT=y
|
||||||
# CONFIG_SYSFS_SYSCALL is not set
|
# CONFIG_SYSFS_SYSCALL is not set
|
||||||
CONFIG_BPF_LSM=y
|
|
||||||
CONFIG_BPF_SYSCALL=y
|
|
||||||
CONFIG_USERFAULTFD=y
|
CONFIG_USERFAULTFD=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_PROFILING=y
|
CONFIG_PROFILING=y
|
||||||
@@ -76,6 +80,7 @@ CONFIG_BLK_DEV_THROTTLING=y
|
|||||||
CONFIG_BLK_WBT=y
|
CONFIG_BLK_WBT=y
|
||||||
CONFIG_BLK_CGROUP_IOLATENCY=y
|
CONFIG_BLK_CGROUP_IOLATENCY=y
|
||||||
CONFIG_BLK_CGROUP_IOCOST=y
|
CONFIG_BLK_CGROUP_IOCOST=y
|
||||||
|
CONFIG_BLK_CGROUP_IOPRIO=y
|
||||||
CONFIG_BLK_INLINE_ENCRYPTION=y
|
CONFIG_BLK_INLINE_ENCRYPTION=y
|
||||||
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
|
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
@@ -95,6 +100,7 @@ CONFIG_CLEANCACHE=y
|
|||||||
CONFIG_FRONTSWAP=y
|
CONFIG_FRONTSWAP=y
|
||||||
CONFIG_CMA_DEBUG=y
|
CONFIG_CMA_DEBUG=y
|
||||||
CONFIG_CMA_DEBUGFS=y
|
CONFIG_CMA_DEBUGFS=y
|
||||||
|
CONFIG_CMA_SYSFS=y
|
||||||
CONFIG_CMA_AREAS=7
|
CONFIG_CMA_AREAS=7
|
||||||
CONFIG_MEM_SOFT_DIRTY=y
|
CONFIG_MEM_SOFT_DIRTY=y
|
||||||
CONFIG_ZSWAP=y
|
CONFIG_ZSWAP=y
|
||||||
@@ -158,6 +164,7 @@ CONFIG_IPV6_RPL_LWTUNNEL=y
|
|||||||
CONFIG_MPTCP=y
|
CONFIG_MPTCP=y
|
||||||
CONFIG_NETFILTER=y
|
CONFIG_NETFILTER=y
|
||||||
CONFIG_BRIDGE_NETFILTER=m
|
CONFIG_BRIDGE_NETFILTER=m
|
||||||
|
CONFIG_NETFILTER_NETLINK_HOOK=m
|
||||||
CONFIG_NF_CONNTRACK=m
|
CONFIG_NF_CONNTRACK=m
|
||||||
CONFIG_NF_CONNTRACK_SECMARK=y
|
CONFIG_NF_CONNTRACK_SECMARK=y
|
||||||
CONFIG_NF_CONNTRACK_EVENTS=y
|
CONFIG_NF_CONNTRACK_EVENTS=y
|
||||||
@@ -280,6 +287,7 @@ CONFIG_IP_VS_FTP=m
|
|||||||
CONFIG_IP_VS_PE_SIP=m
|
CONFIG_IP_VS_PE_SIP=m
|
||||||
CONFIG_NFT_FIB_IPV4=m
|
CONFIG_NFT_FIB_IPV4=m
|
||||||
CONFIG_NF_TABLES_ARP=y
|
CONFIG_NF_TABLES_ARP=y
|
||||||
|
CONFIG_NF_LOG_IPV4=m
|
||||||
CONFIG_IP_NF_IPTABLES=m
|
CONFIG_IP_NF_IPTABLES=m
|
||||||
CONFIG_IP_NF_MATCH_AH=m
|
CONFIG_IP_NF_MATCH_AH=m
|
||||||
CONFIG_IP_NF_MATCH_ECN=m
|
CONFIG_IP_NF_MATCH_ECN=m
|
||||||
@@ -384,12 +392,11 @@ CONFIG_VSOCKETS=m
|
|||||||
CONFIG_VIRTIO_VSOCKETS=m
|
CONFIG_VIRTIO_VSOCKETS=m
|
||||||
CONFIG_NETLINK_DIAG=m
|
CONFIG_NETLINK_DIAG=m
|
||||||
CONFIG_CGROUP_NET_PRIO=y
|
CONFIG_CGROUP_NET_PRIO=y
|
||||||
CONFIG_BPF_JIT=y
|
|
||||||
CONFIG_NET_PKTGEN=m
|
CONFIG_NET_PKTGEN=m
|
||||||
CONFIG_PCI=y
|
CONFIG_PCI=y
|
||||||
CONFIG_PCI_IOV=y
|
|
||||||
# CONFIG_PCIEASPM is not set
|
# CONFIG_PCIEASPM is not set
|
||||||
CONFIG_PCI_DEBUG=y
|
CONFIG_PCI_DEBUG=y
|
||||||
|
CONFIG_PCI_IOV=y
|
||||||
CONFIG_HOTPLUG_PCI=y
|
CONFIG_HOTPLUG_PCI=y
|
||||||
CONFIG_HOTPLUG_PCI_S390=y
|
CONFIG_HOTPLUG_PCI_S390=y
|
||||||
CONFIG_DEVTMPFS=y
|
CONFIG_DEVTMPFS=y
|
||||||
@@ -436,7 +443,7 @@ CONFIG_MD_MULTIPATH=m
|
|||||||
CONFIG_MD_FAULTY=m
|
CONFIG_MD_FAULTY=m
|
||||||
CONFIG_MD_CLUSTER=m
|
CONFIG_MD_CLUSTER=m
|
||||||
CONFIG_BCACHE=m
|
CONFIG_BCACHE=m
|
||||||
CONFIG_BLK_DEV_DM=m
|
CONFIG_BLK_DEV_DM=y
|
||||||
CONFIG_DM_UNSTRIPED=m
|
CONFIG_DM_UNSTRIPED=m
|
||||||
CONFIG_DM_CRYPT=m
|
CONFIG_DM_CRYPT=m
|
||||||
CONFIG_DM_SNAPSHOT=m
|
CONFIG_DM_SNAPSHOT=m
|
||||||
@@ -453,6 +460,7 @@ CONFIG_DM_MULTIPATH_ST=m
|
|||||||
CONFIG_DM_MULTIPATH_HST=m
|
CONFIG_DM_MULTIPATH_HST=m
|
||||||
CONFIG_DM_MULTIPATH_IOA=m
|
CONFIG_DM_MULTIPATH_IOA=m
|
||||||
CONFIG_DM_DELAY=m
|
CONFIG_DM_DELAY=m
|
||||||
|
CONFIG_DM_INIT=y
|
||||||
CONFIG_DM_UEVENT=y
|
CONFIG_DM_UEVENT=y
|
||||||
CONFIG_DM_FLAKEY=m
|
CONFIG_DM_FLAKEY=m
|
||||||
CONFIG_DM_VERITY=m
|
CONFIG_DM_VERITY=m
|
||||||
@@ -495,6 +503,7 @@ CONFIG_NLMON=m
|
|||||||
# CONFIG_NET_VENDOR_GOOGLE is not set
|
# CONFIG_NET_VENDOR_GOOGLE is not set
|
||||||
# CONFIG_NET_VENDOR_HUAWEI is not set
|
# CONFIG_NET_VENDOR_HUAWEI is not set
|
||||||
# CONFIG_NET_VENDOR_INTEL is not set
|
# CONFIG_NET_VENDOR_INTEL is not set
|
||||||
|
# CONFIG_NET_VENDOR_MICROSOFT is not set
|
||||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||||
CONFIG_MLX4_EN=m
|
CONFIG_MLX4_EN=m
|
||||||
CONFIG_MLX5_CORE=m
|
CONFIG_MLX5_CORE=m
|
||||||
@@ -551,7 +560,6 @@ CONFIG_INPUT_EVDEV=y
|
|||||||
CONFIG_LEGACY_PTY_COUNT=0
|
CONFIG_LEGACY_PTY_COUNT=0
|
||||||
CONFIG_VIRTIO_CONSOLE=m
|
CONFIG_VIRTIO_CONSOLE=m
|
||||||
CONFIG_HW_RANDOM_VIRTIO=m
|
CONFIG_HW_RANDOM_VIRTIO=m
|
||||||
CONFIG_RAW_DRIVER=m
|
|
||||||
CONFIG_HANGCHECK_TIMER=m
|
CONFIG_HANGCHECK_TIMER=m
|
||||||
CONFIG_TN3270_FS=y
|
CONFIG_TN3270_FS=y
|
||||||
CONFIG_PPS=m
|
CONFIG_PPS=m
|
||||||
@@ -574,7 +582,6 @@ CONFIG_SYNC_FILE=y
|
|||||||
CONFIG_VFIO=m
|
CONFIG_VFIO=m
|
||||||
CONFIG_VFIO_PCI=m
|
CONFIG_VFIO_PCI=m
|
||||||
CONFIG_VFIO_MDEV=m
|
CONFIG_VFIO_MDEV=m
|
||||||
CONFIG_VFIO_MDEV_DEVICE=m
|
|
||||||
CONFIG_VIRTIO_PCI=m
|
CONFIG_VIRTIO_PCI=m
|
||||||
CONFIG_VIRTIO_BALLOON=m
|
CONFIG_VIRTIO_BALLOON=m
|
||||||
CONFIG_VIRTIO_INPUT=y
|
CONFIG_VIRTIO_INPUT=y
|
||||||
@@ -619,6 +626,7 @@ CONFIG_FUSE_FS=y
|
|||||||
CONFIG_CUSE=m
|
CONFIG_CUSE=m
|
||||||
CONFIG_VIRTIO_FS=m
|
CONFIG_VIRTIO_FS=m
|
||||||
CONFIG_OVERLAY_FS=m
|
CONFIG_OVERLAY_FS=m
|
||||||
|
CONFIG_NETFS_STATS=y
|
||||||
CONFIG_FSCACHE=m
|
CONFIG_FSCACHE=m
|
||||||
CONFIG_CACHEFILES=m
|
CONFIG_CACHEFILES=m
|
||||||
CONFIG_ISO9660_FS=y
|
CONFIG_ISO9660_FS=y
|
||||||
@@ -654,7 +662,6 @@ CONFIG_NFSD_V3_ACL=y
|
|||||||
CONFIG_NFSD_V4=y
|
CONFIG_NFSD_V4=y
|
||||||
CONFIG_NFSD_V4_SECURITY_LABEL=y
|
CONFIG_NFSD_V4_SECURITY_LABEL=y
|
||||||
CONFIG_CIFS=m
|
CONFIG_CIFS=m
|
||||||
CONFIG_CIFS_STATS2=y
|
|
||||||
CONFIG_CIFS_WEAK_PW_HASH=y
|
CONFIG_CIFS_WEAK_PW_HASH=y
|
||||||
CONFIG_CIFS_UPCALL=y
|
CONFIG_CIFS_UPCALL=y
|
||||||
CONFIG_CIFS_XATTR=y
|
CONFIG_CIFS_XATTR=y
|
||||||
@@ -682,6 +689,7 @@ CONFIG_SECURITY_SELINUX_BOOTPARAM=y
|
|||||||
CONFIG_SECURITY_SELINUX_DISABLE=y
|
CONFIG_SECURITY_SELINUX_DISABLE=y
|
||||||
CONFIG_SECURITY_LOCKDOWN_LSM=y
|
CONFIG_SECURITY_LOCKDOWN_LSM=y
|
||||||
CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y
|
CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y
|
||||||
|
CONFIG_SECURITY_LANDLOCK=y
|
||||||
CONFIG_INTEGRITY_SIGNATURE=y
|
CONFIG_INTEGRITY_SIGNATURE=y
|
||||||
CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y
|
CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y
|
||||||
CONFIG_IMA=y
|
CONFIG_IMA=y
|
||||||
@@ -696,6 +704,7 @@ CONFIG_CRYPTO_CRYPTD=m
|
|||||||
CONFIG_CRYPTO_TEST=m
|
CONFIG_CRYPTO_TEST=m
|
||||||
CONFIG_CRYPTO_DH=m
|
CONFIG_CRYPTO_DH=m
|
||||||
CONFIG_CRYPTO_ECDH=m
|
CONFIG_CRYPTO_ECDH=m
|
||||||
|
CONFIG_CRYPTO_ECDSA=m
|
||||||
CONFIG_CRYPTO_ECRDSA=m
|
CONFIG_CRYPTO_ECRDSA=m
|
||||||
CONFIG_CRYPTO_SM2=m
|
CONFIG_CRYPTO_SM2=m
|
||||||
CONFIG_CRYPTO_CURVE25519=m
|
CONFIG_CRYPTO_CURVE25519=m
|
||||||
@@ -843,7 +852,6 @@ CONFIG_FAULT_INJECTION_DEBUG_FS=y
|
|||||||
CONFIG_FAIL_FUNCTION=y
|
CONFIG_FAIL_FUNCTION=y
|
||||||
CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
|
CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
|
||||||
CONFIG_LKDTM=m
|
CONFIG_LKDTM=m
|
||||||
CONFIG_TEST_LIST_SORT=y
|
|
||||||
CONFIG_TEST_MIN_HEAP=y
|
CONFIG_TEST_MIN_HEAP=y
|
||||||
CONFIG_TEST_SORT=y
|
CONFIG_TEST_SORT=y
|
||||||
CONFIG_KPROBES_SANITY_TEST=y
|
CONFIG_KPROBES_SANITY_TEST=y
|
||||||
@@ -853,3 +861,4 @@ CONFIG_PERCPU_TEST=m
|
|||||||
CONFIG_ATOMIC64_SELFTEST=y
|
CONFIG_ATOMIC64_SELFTEST=y
|
||||||
CONFIG_TEST_BITOPS=m
|
CONFIG_TEST_BITOPS=m
|
||||||
CONFIG_TEST_BPF=m
|
CONFIG_TEST_BPF=m
|
||||||
|
CONFIG_TEST_LIVEPATCH=m
|
||||||
|
|||||||
@@ -4,6 +4,11 @@ CONFIG_WATCH_QUEUE=y
|
|||||||
CONFIG_AUDIT=y
|
CONFIG_AUDIT=y
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
CONFIG_BPF_SYSCALL=y
|
||||||
|
CONFIG_BPF_JIT=y
|
||||||
|
CONFIG_BPF_JIT_ALWAYS_ON=y
|
||||||
|
CONFIG_BPF_LSM=y
|
||||||
|
CONFIG_SCHED_CORE=y
|
||||||
CONFIG_BSD_PROCESS_ACCT=y
|
CONFIG_BSD_PROCESS_ACCT=y
|
||||||
CONFIG_BSD_PROCESS_ACCT_V3=y
|
CONFIG_BSD_PROCESS_ACCT_V3=y
|
||||||
CONFIG_TASKSTATS=y
|
CONFIG_TASKSTATS=y
|
||||||
@@ -26,14 +31,13 @@ CONFIG_CGROUP_DEVICE=y
|
|||||||
CONFIG_CGROUP_CPUACCT=y
|
CONFIG_CGROUP_CPUACCT=y
|
||||||
CONFIG_CGROUP_PERF=y
|
CONFIG_CGROUP_PERF=y
|
||||||
CONFIG_CGROUP_BPF=y
|
CONFIG_CGROUP_BPF=y
|
||||||
|
CONFIG_CGROUP_MISC=y
|
||||||
CONFIG_NAMESPACES=y
|
CONFIG_NAMESPACES=y
|
||||||
CONFIG_USER_NS=y
|
CONFIG_USER_NS=y
|
||||||
CONFIG_CHECKPOINT_RESTORE=y
|
CONFIG_CHECKPOINT_RESTORE=y
|
||||||
CONFIG_SCHED_AUTOGROUP=y
|
CONFIG_SCHED_AUTOGROUP=y
|
||||||
CONFIG_EXPERT=y
|
CONFIG_EXPERT=y
|
||||||
# CONFIG_SYSFS_SYSCALL is not set
|
# CONFIG_SYSFS_SYSCALL is not set
|
||||||
CONFIG_BPF_LSM=y
|
|
||||||
CONFIG_BPF_SYSCALL=y
|
|
||||||
CONFIG_USERFAULTFD=y
|
CONFIG_USERFAULTFD=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_PROFILING=y
|
CONFIG_PROFILING=y
|
||||||
@@ -70,6 +74,7 @@ CONFIG_BLK_DEV_THROTTLING=y
|
|||||||
CONFIG_BLK_WBT=y
|
CONFIG_BLK_WBT=y
|
||||||
CONFIG_BLK_CGROUP_IOLATENCY=y
|
CONFIG_BLK_CGROUP_IOLATENCY=y
|
||||||
CONFIG_BLK_CGROUP_IOCOST=y
|
CONFIG_BLK_CGROUP_IOCOST=y
|
||||||
|
CONFIG_BLK_CGROUP_IOPRIO=y
|
||||||
CONFIG_BLK_INLINE_ENCRYPTION=y
|
CONFIG_BLK_INLINE_ENCRYPTION=y
|
||||||
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
|
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
@@ -87,6 +92,7 @@ CONFIG_KSM=y
|
|||||||
CONFIG_TRANSPARENT_HUGEPAGE=y
|
CONFIG_TRANSPARENT_HUGEPAGE=y
|
||||||
CONFIG_CLEANCACHE=y
|
CONFIG_CLEANCACHE=y
|
||||||
CONFIG_FRONTSWAP=y
|
CONFIG_FRONTSWAP=y
|
||||||
|
CONFIG_CMA_SYSFS=y
|
||||||
CONFIG_CMA_AREAS=7
|
CONFIG_CMA_AREAS=7
|
||||||
CONFIG_MEM_SOFT_DIRTY=y
|
CONFIG_MEM_SOFT_DIRTY=y
|
||||||
CONFIG_ZSWAP=y
|
CONFIG_ZSWAP=y
|
||||||
@@ -149,6 +155,7 @@ CONFIG_IPV6_RPL_LWTUNNEL=y
|
|||||||
CONFIG_MPTCP=y
|
CONFIG_MPTCP=y
|
||||||
CONFIG_NETFILTER=y
|
CONFIG_NETFILTER=y
|
||||||
CONFIG_BRIDGE_NETFILTER=m
|
CONFIG_BRIDGE_NETFILTER=m
|
||||||
|
CONFIG_NETFILTER_NETLINK_HOOK=m
|
||||||
CONFIG_NF_CONNTRACK=m
|
CONFIG_NF_CONNTRACK=m
|
||||||
CONFIG_NF_CONNTRACK_SECMARK=y
|
CONFIG_NF_CONNTRACK_SECMARK=y
|
||||||
CONFIG_NF_CONNTRACK_EVENTS=y
|
CONFIG_NF_CONNTRACK_EVENTS=y
|
||||||
@@ -271,6 +278,7 @@ CONFIG_IP_VS_FTP=m
|
|||||||
CONFIG_IP_VS_PE_SIP=m
|
CONFIG_IP_VS_PE_SIP=m
|
||||||
CONFIG_NFT_FIB_IPV4=m
|
CONFIG_NFT_FIB_IPV4=m
|
||||||
CONFIG_NF_TABLES_ARP=y
|
CONFIG_NF_TABLES_ARP=y
|
||||||
|
CONFIG_NF_LOG_IPV4=m
|
||||||
CONFIG_IP_NF_IPTABLES=m
|
CONFIG_IP_NF_IPTABLES=m
|
||||||
CONFIG_IP_NF_MATCH_AH=m
|
CONFIG_IP_NF_MATCH_AH=m
|
||||||
CONFIG_IP_NF_MATCH_ECN=m
|
CONFIG_IP_NF_MATCH_ECN=m
|
||||||
@@ -374,11 +382,10 @@ CONFIG_VSOCKETS=m
|
|||||||
CONFIG_VIRTIO_VSOCKETS=m
|
CONFIG_VIRTIO_VSOCKETS=m
|
||||||
CONFIG_NETLINK_DIAG=m
|
CONFIG_NETLINK_DIAG=m
|
||||||
CONFIG_CGROUP_NET_PRIO=y
|
CONFIG_CGROUP_NET_PRIO=y
|
||||||
CONFIG_BPF_JIT=y
|
|
||||||
CONFIG_NET_PKTGEN=m
|
CONFIG_NET_PKTGEN=m
|
||||||
CONFIG_PCI=y
|
CONFIG_PCI=y
|
||||||
CONFIG_PCI_IOV=y
|
|
||||||
# CONFIG_PCIEASPM is not set
|
# CONFIG_PCIEASPM is not set
|
||||||
|
CONFIG_PCI_IOV=y
|
||||||
CONFIG_HOTPLUG_PCI=y
|
CONFIG_HOTPLUG_PCI=y
|
||||||
CONFIG_HOTPLUG_PCI_S390=y
|
CONFIG_HOTPLUG_PCI_S390=y
|
||||||
CONFIG_UEVENT_HELPER=y
|
CONFIG_UEVENT_HELPER=y
|
||||||
@@ -427,7 +434,7 @@ CONFIG_MD_MULTIPATH=m
|
|||||||
CONFIG_MD_FAULTY=m
|
CONFIG_MD_FAULTY=m
|
||||||
CONFIG_MD_CLUSTER=m
|
CONFIG_MD_CLUSTER=m
|
||||||
CONFIG_BCACHE=m
|
CONFIG_BCACHE=m
|
||||||
CONFIG_BLK_DEV_DM=m
|
CONFIG_BLK_DEV_DM=y
|
||||||
CONFIG_DM_UNSTRIPED=m
|
CONFIG_DM_UNSTRIPED=m
|
||||||
CONFIG_DM_CRYPT=m
|
CONFIG_DM_CRYPT=m
|
||||||
CONFIG_DM_SNAPSHOT=m
|
CONFIG_DM_SNAPSHOT=m
|
||||||
@@ -444,6 +451,7 @@ CONFIG_DM_MULTIPATH_ST=m
|
|||||||
CONFIG_DM_MULTIPATH_HST=m
|
CONFIG_DM_MULTIPATH_HST=m
|
||||||
CONFIG_DM_MULTIPATH_IOA=m
|
CONFIG_DM_MULTIPATH_IOA=m
|
||||||
CONFIG_DM_DELAY=m
|
CONFIG_DM_DELAY=m
|
||||||
|
CONFIG_DM_INIT=y
|
||||||
CONFIG_DM_UEVENT=y
|
CONFIG_DM_UEVENT=y
|
||||||
CONFIG_DM_FLAKEY=m
|
CONFIG_DM_FLAKEY=m
|
||||||
CONFIG_DM_VERITY=m
|
CONFIG_DM_VERITY=m
|
||||||
@@ -487,6 +495,7 @@ CONFIG_NLMON=m
|
|||||||
# CONFIG_NET_VENDOR_GOOGLE is not set
|
# CONFIG_NET_VENDOR_GOOGLE is not set
|
||||||
# CONFIG_NET_VENDOR_HUAWEI is not set
|
# CONFIG_NET_VENDOR_HUAWEI is not set
|
||||||
# CONFIG_NET_VENDOR_INTEL is not set
|
# CONFIG_NET_VENDOR_INTEL is not set
|
||||||
|
# CONFIG_NET_VENDOR_MICROSOFT is not set
|
||||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||||
CONFIG_MLX4_EN=m
|
CONFIG_MLX4_EN=m
|
||||||
CONFIG_MLX5_CORE=m
|
CONFIG_MLX5_CORE=m
|
||||||
@@ -543,7 +552,6 @@ CONFIG_INPUT_EVDEV=y
|
|||||||
CONFIG_LEGACY_PTY_COUNT=0
|
CONFIG_LEGACY_PTY_COUNT=0
|
||||||
CONFIG_VIRTIO_CONSOLE=m
|
CONFIG_VIRTIO_CONSOLE=m
|
||||||
CONFIG_HW_RANDOM_VIRTIO=m
|
CONFIG_HW_RANDOM_VIRTIO=m
|
||||||
CONFIG_RAW_DRIVER=m
|
|
||||||
CONFIG_HANGCHECK_TIMER=m
|
CONFIG_HANGCHECK_TIMER=m
|
||||||
CONFIG_TN3270_FS=y
|
CONFIG_TN3270_FS=y
|
||||||
# CONFIG_PTP_1588_CLOCK is not set
|
# CONFIG_PTP_1588_CLOCK is not set
|
||||||
@@ -566,7 +574,6 @@ CONFIG_SYNC_FILE=y
|
|||||||
CONFIG_VFIO=m
|
CONFIG_VFIO=m
|
||||||
CONFIG_VFIO_PCI=m
|
CONFIG_VFIO_PCI=m
|
||||||
CONFIG_VFIO_MDEV=m
|
CONFIG_VFIO_MDEV=m
|
||||||
CONFIG_VFIO_MDEV_DEVICE=m
|
|
||||||
CONFIG_VIRTIO_PCI=m
|
CONFIG_VIRTIO_PCI=m
|
||||||
CONFIG_VIRTIO_BALLOON=m
|
CONFIG_VIRTIO_BALLOON=m
|
||||||
CONFIG_VIRTIO_INPUT=y
|
CONFIG_VIRTIO_INPUT=y
|
||||||
@@ -607,6 +614,7 @@ CONFIG_FUSE_FS=y
|
|||||||
CONFIG_CUSE=m
|
CONFIG_CUSE=m
|
||||||
CONFIG_VIRTIO_FS=m
|
CONFIG_VIRTIO_FS=m
|
||||||
CONFIG_OVERLAY_FS=m
|
CONFIG_OVERLAY_FS=m
|
||||||
|
CONFIG_NETFS_STATS=y
|
||||||
CONFIG_FSCACHE=m
|
CONFIG_FSCACHE=m
|
||||||
CONFIG_CACHEFILES=m
|
CONFIG_CACHEFILES=m
|
||||||
CONFIG_ISO9660_FS=y
|
CONFIG_ISO9660_FS=y
|
||||||
@@ -642,7 +650,6 @@ CONFIG_NFSD_V3_ACL=y
|
|||||||
CONFIG_NFSD_V4=y
|
CONFIG_NFSD_V4=y
|
||||||
CONFIG_NFSD_V4_SECURITY_LABEL=y
|
CONFIG_NFSD_V4_SECURITY_LABEL=y
|
||||||
CONFIG_CIFS=m
|
CONFIG_CIFS=m
|
||||||
CONFIG_CIFS_STATS2=y
|
|
||||||
CONFIG_CIFS_WEAK_PW_HASH=y
|
CONFIG_CIFS_WEAK_PW_HASH=y
|
||||||
CONFIG_CIFS_UPCALL=y
|
CONFIG_CIFS_UPCALL=y
|
||||||
CONFIG_CIFS_XATTR=y
|
CONFIG_CIFS_XATTR=y
|
||||||
@@ -669,6 +676,7 @@ CONFIG_SECURITY_SELINUX_BOOTPARAM=y
|
|||||||
CONFIG_SECURITY_SELINUX_DISABLE=y
|
CONFIG_SECURITY_SELINUX_DISABLE=y
|
||||||
CONFIG_SECURITY_LOCKDOWN_LSM=y
|
CONFIG_SECURITY_LOCKDOWN_LSM=y
|
||||||
CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y
|
CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y
|
||||||
|
CONFIG_SECURITY_LANDLOCK=y
|
||||||
CONFIG_INTEGRITY_SIGNATURE=y
|
CONFIG_INTEGRITY_SIGNATURE=y
|
||||||
CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y
|
CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y
|
||||||
CONFIG_IMA=y
|
CONFIG_IMA=y
|
||||||
@@ -684,6 +692,7 @@ CONFIG_CRYPTO_CRYPTD=m
|
|||||||
CONFIG_CRYPTO_TEST=m
|
CONFIG_CRYPTO_TEST=m
|
||||||
CONFIG_CRYPTO_DH=m
|
CONFIG_CRYPTO_DH=m
|
||||||
CONFIG_CRYPTO_ECDH=m
|
CONFIG_CRYPTO_ECDH=m
|
||||||
|
CONFIG_CRYPTO_ECDSA=m
|
||||||
CONFIG_CRYPTO_ECRDSA=m
|
CONFIG_CRYPTO_ECRDSA=m
|
||||||
CONFIG_CRYPTO_SM2=m
|
CONFIG_CRYPTO_SM2=m
|
||||||
CONFIG_CRYPTO_CURVE25519=m
|
CONFIG_CRYPTO_CURVE25519=m
|
||||||
@@ -754,6 +763,7 @@ CONFIG_CRC8=m
|
|||||||
CONFIG_DMA_CMA=y
|
CONFIG_DMA_CMA=y
|
||||||
CONFIG_CMA_SIZE_MBYTES=0
|
CONFIG_CMA_SIZE_MBYTES=0
|
||||||
CONFIG_PRINTK_TIME=y
|
CONFIG_PRINTK_TIME=y
|
||||||
|
CONFIG_DYNAMIC_DEBUG=y
|
||||||
CONFIG_DEBUG_INFO=y
|
CONFIG_DEBUG_INFO=y
|
||||||
CONFIG_DEBUG_INFO_DWARF4=y
|
CONFIG_DEBUG_INFO_DWARF4=y
|
||||||
CONFIG_GDB_SCRIPTS=y
|
CONFIG_GDB_SCRIPTS=y
|
||||||
@@ -781,3 +791,4 @@ CONFIG_LKDTM=m
|
|||||||
CONFIG_PERCPU_TEST=m
|
CONFIG_PERCPU_TEST=m
|
||||||
CONFIG_ATOMIC64_SELFTEST=y
|
CONFIG_ATOMIC64_SELFTEST=y
|
||||||
CONFIG_TEST_BPF=m
|
CONFIG_TEST_BPF=m
|
||||||
|
CONFIG_TEST_LIVEPATCH=m
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ CONFIG_PARTITION_ADVANCED=y
|
|||||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||||
# CONFIG_COMPACTION is not set
|
# CONFIG_COMPACTION is not set
|
||||||
# CONFIG_MIGRATION is not set
|
# CONFIG_MIGRATION is not set
|
||||||
# CONFIG_BOUNCE is not set
|
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
# CONFIG_IUCV is not set
|
# CONFIG_IUCV is not set
|
||||||
|
# CONFIG_PCPU_DEV_REFCNT is not set
|
||||||
# CONFIG_ETHTOOL_NETLINK is not set
|
# CONFIG_ETHTOOL_NETLINK is not set
|
||||||
CONFIG_DEVTMPFS=y
|
CONFIG_DEVTMPFS=y
|
||||||
CONFIG_BLK_DEV_RAM=y
|
CONFIG_BLK_DEV_RAM=y
|
||||||
@@ -51,7 +51,6 @@ CONFIG_ZFCP=y
|
|||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_HVC_IUCV is not set
|
# CONFIG_HVC_IUCV is not set
|
||||||
# CONFIG_HW_RANDOM_S390 is not set
|
# CONFIG_HW_RANDOM_S390 is not set
|
||||||
CONFIG_RAW_DRIVER=y
|
|
||||||
# CONFIG_HMC_DRV is not set
|
# CONFIG_HMC_DRV is not set
|
||||||
# CONFIG_S390_TAPE is not set
|
# CONFIG_S390_TAPE is not set
|
||||||
# CONFIG_VMCP is not set
|
# CONFIG_VMCP is not set
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ void ftrace_caller(void);
|
|||||||
|
|
||||||
extern char ftrace_graph_caller_end;
|
extern char ftrace_graph_caller_end;
|
||||||
extern unsigned long ftrace_plt;
|
extern unsigned long ftrace_plt;
|
||||||
|
extern void *ftrace_func;
|
||||||
|
|
||||||
struct dyn_arch_ftrace { };
|
struct dyn_arch_ftrace { };
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
* trampoline (ftrace_plt), which clobbers also r1.
|
* trampoline (ftrace_plt), which clobbers also r1.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
void *ftrace_func __read_mostly = ftrace_stub;
|
||||||
unsigned long ftrace_plt;
|
unsigned long ftrace_plt;
|
||||||
|
|
||||||
int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
|
int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
|
||||||
@@ -85,6 +86,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
|||||||
|
|
||||||
int ftrace_update_ftrace_func(ftrace_func_t func)
|
int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||||
{
|
{
|
||||||
|
ftrace_func = func;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,13 +59,13 @@ ENTRY(ftrace_caller)
|
|||||||
#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
|
#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
|
||||||
aghik %r2,%r0,-MCOUNT_INSN_SIZE
|
aghik %r2,%r0,-MCOUNT_INSN_SIZE
|
||||||
lgrl %r4,function_trace_op
|
lgrl %r4,function_trace_op
|
||||||
lgrl %r1,ftrace_trace_function
|
lgrl %r1,ftrace_func
|
||||||
#else
|
#else
|
||||||
lgr %r2,%r0
|
lgr %r2,%r0
|
||||||
aghi %r2,-MCOUNT_INSN_SIZE
|
aghi %r2,-MCOUNT_INSN_SIZE
|
||||||
larl %r4,function_trace_op
|
larl %r4,function_trace_op
|
||||||
lg %r4,0(%r4)
|
lg %r4,0(%r4)
|
||||||
larl %r1,ftrace_trace_function
|
larl %r1,ftrace_func
|
||||||
lg %r1,0(%r1)
|
lg %r1,0(%r1)
|
||||||
#endif
|
#endif
|
||||||
lgr %r3,%r14
|
lgr %r3,%r14
|
||||||
|
|||||||
@@ -745,7 +745,7 @@ static int __init cpumf_pmu_init(void)
|
|||||||
if (!cf_dbg) {
|
if (!cf_dbg) {
|
||||||
pr_err("Registration of s390dbf(cpum_cf) failed\n");
|
pr_err("Registration of s390dbf(cpum_cf) failed\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
};
|
}
|
||||||
debug_register_view(cf_dbg, &debug_sprintf_view);
|
debug_register_view(cf_dbg, &debug_sprintf_view);
|
||||||
|
|
||||||
cpumf_pmu.attr_groups = cpumf_cf_event_group();
|
cpumf_pmu.attr_groups = cpumf_cf_event_group();
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ $(targets:%=$(obj)/%.dbg): KBUILD_CFLAGS = $(KBUILD_CFLAGS_32)
|
|||||||
$(targets:%=$(obj)/%.dbg): KBUILD_AFLAGS = $(KBUILD_AFLAGS_32)
|
$(targets:%=$(obj)/%.dbg): KBUILD_AFLAGS = $(KBUILD_AFLAGS_32)
|
||||||
|
|
||||||
obj-y += vdso32_wrapper.o
|
obj-y += vdso32_wrapper.o
|
||||||
|
targets += vdso32.lds
|
||||||
CPPFLAGS_vdso32.lds += -P -C -U$(ARCH)
|
CPPFLAGS_vdso32.lds += -P -C -U$(ARCH)
|
||||||
|
|
||||||
# Disable gcov profiling, ubsan and kasan for VDSO code
|
# Disable gcov profiling, ubsan and kasan for VDSO code
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ static inline void reg_set_seen(struct bpf_jit *jit, u32 b1)
|
|||||||
{
|
{
|
||||||
u32 r1 = reg2hex[b1];
|
u32 r1 = reg2hex[b1];
|
||||||
|
|
||||||
if (!jit->seen_reg[r1] && r1 >= 6 && r1 <= 15)
|
if (r1 >= 6 && r1 <= 15 && !jit->seen_reg[r1])
|
||||||
jit->seen_reg[r1] = 1;
|
jit->seen_reg[r1] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -237,7 +237,7 @@ static void __init hv_smp_prepare_cpus(unsigned int max_cpus)
|
|||||||
for_each_present_cpu(i) {
|
for_each_present_cpu(i) {
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
continue;
|
continue;
|
||||||
ret = hv_call_add_logical_proc(numa_cpu_node(i), i, i);
|
ret = hv_call_add_logical_proc(numa_cpu_node(i), i, cpu_physical_id(i));
|
||||||
BUG_ON(ret);
|
BUG_ON(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,8 @@ __jump_label_patch(struct jump_entry *entry, enum jump_label_type type)
|
|||||||
return (struct jump_label_patch){.code = code, .size = size};
|
return (struct jump_label_patch){.code = code, .size = size};
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __jump_label_transform(struct jump_entry *entry,
|
static __always_inline void
|
||||||
|
__jump_label_transform(struct jump_entry *entry,
|
||||||
enum jump_label_type type,
|
enum jump_label_type type,
|
||||||
int init)
|
int init)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -682,7 +682,6 @@ int p4d_clear_huge(p4d_t *p4d)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_PGTABLE_LEVELS > 3
|
|
||||||
/**
|
/**
|
||||||
* pud_set_huge - setup kernel PUD mapping
|
* pud_set_huge - setup kernel PUD mapping
|
||||||
*
|
*
|
||||||
@@ -721,23 +720,6 @@ int pud_set_huge(pud_t *pud, phys_addr_t addr, pgprot_t prot)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* pud_clear_huge - clear kernel PUD mapping when it is set
|
|
||||||
*
|
|
||||||
* Returns 1 on success and 0 on failure (no PUD map is found).
|
|
||||||
*/
|
|
||||||
int pud_clear_huge(pud_t *pud)
|
|
||||||
{
|
|
||||||
if (pud_large(*pud)) {
|
|
||||||
pud_clear(pud);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CONFIG_PGTABLE_LEVELS > 2
|
|
||||||
/**
|
/**
|
||||||
* pmd_set_huge - setup kernel PMD mapping
|
* pmd_set_huge - setup kernel PMD mapping
|
||||||
*
|
*
|
||||||
@@ -768,6 +750,21 @@ int pmd_set_huge(pmd_t *pmd, phys_addr_t addr, pgprot_t prot)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pud_clear_huge - clear kernel PUD mapping when it is set
|
||||||
|
*
|
||||||
|
* Returns 1 on success and 0 on failure (no PUD map is found).
|
||||||
|
*/
|
||||||
|
int pud_clear_huge(pud_t *pud)
|
||||||
|
{
|
||||||
|
if (pud_large(*pud)) {
|
||||||
|
pud_clear(pud);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pmd_clear_huge - clear kernel PMD mapping when it is set
|
* pmd_clear_huge - clear kernel PMD mapping when it is set
|
||||||
*
|
*
|
||||||
@@ -782,7 +779,6 @@ int pmd_clear_huge(pmd_t *pmd)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -370,7 +370,7 @@ config ACPI_TABLE_UPGRADE
|
|||||||
config ACPI_TABLE_OVERRIDE_VIA_BUILTIN_INITRD
|
config ACPI_TABLE_OVERRIDE_VIA_BUILTIN_INITRD
|
||||||
bool "Override ACPI tables from built-in initrd"
|
bool "Override ACPI tables from built-in initrd"
|
||||||
depends on ACPI_TABLE_UPGRADE
|
depends on ACPI_TABLE_UPGRADE
|
||||||
depends on INITRAMFS_SOURCE!="" && INITRAMFS_COMPRESSION=""
|
depends on INITRAMFS_SOURCE!="" && INITRAMFS_COMPRESSION_NONE
|
||||||
help
|
help
|
||||||
This option provides functionality to override arbitrary ACPI tables
|
This option provides functionality to override arbitrary ACPI tables
|
||||||
from built-in uncompressed initrd.
|
from built-in uncompressed initrd.
|
||||||
|
|||||||
@@ -860,11 +860,9 @@ EXPORT_SYMBOL(acpi_dev_present);
|
|||||||
* Return the next match of ACPI device if another matching device was present
|
* Return the next match of ACPI device if another matching device was present
|
||||||
* at the moment of invocation, or NULL otherwise.
|
* at the moment of invocation, or NULL otherwise.
|
||||||
*
|
*
|
||||||
* FIXME: The function does not tolerate the sudden disappearance of @adev, e.g.
|
|
||||||
* in the case of a hotplug event. That said, the caller should ensure that
|
|
||||||
* this will never happen.
|
|
||||||
*
|
|
||||||
* The caller is responsible for invoking acpi_dev_put() on the returned device.
|
* The caller is responsible for invoking acpi_dev_put() on the returned device.
|
||||||
|
* On the other hand the function invokes acpi_dev_put() on the given @adev
|
||||||
|
* assuming that its reference counter had been increased beforehand.
|
||||||
*
|
*
|
||||||
* See additional information in acpi_dev_present() as well.
|
* See additional information in acpi_dev_present() as well.
|
||||||
*/
|
*/
|
||||||
@@ -880,6 +878,7 @@ acpi_dev_get_next_match_dev(struct acpi_device *adev, const char *hid, const cha
|
|||||||
match.hrv = hrv;
|
match.hrv = hrv;
|
||||||
|
|
||||||
dev = bus_find_device(&acpi_bus_type, start, &match, acpi_dev_match_cb);
|
dev = bus_find_device(&acpi_bus_type, start, &match, acpi_dev_match_cb);
|
||||||
|
acpi_dev_put(adev);
|
||||||
return dev ? to_acpi_device(dev) : NULL;
|
return dev ? to_acpi_device(dev) : NULL;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(acpi_dev_get_next_match_dev);
|
EXPORT_SYMBOL(acpi_dev_get_next_match_dev);
|
||||||
|
|||||||
@@ -231,6 +231,8 @@ EXPORT_SYMBOL_GPL(auxiliary_find_device);
|
|||||||
int __auxiliary_driver_register(struct auxiliary_driver *auxdrv,
|
int __auxiliary_driver_register(struct auxiliary_driver *auxdrv,
|
||||||
struct module *owner, const char *modname)
|
struct module *owner, const char *modname)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (WARN_ON(!auxdrv->probe) || WARN_ON(!auxdrv->id_table))
|
if (WARN_ON(!auxdrv->probe) || WARN_ON(!auxdrv->id_table))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
@@ -246,7 +248,11 @@ int __auxiliary_driver_register(struct auxiliary_driver *auxdrv,
|
|||||||
auxdrv->driver.bus = &auxiliary_bus_type;
|
auxdrv->driver.bus = &auxiliary_bus_type;
|
||||||
auxdrv->driver.mod_name = modname;
|
auxdrv->driver.mod_name = modname;
|
||||||
|
|
||||||
return driver_register(&auxdrv->driver);
|
ret = driver_register(&auxdrv->driver);
|
||||||
|
if (ret)
|
||||||
|
kfree(auxdrv->driver.name);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(__auxiliary_driver_register);
|
EXPORT_SYMBOL_GPL(__auxiliary_driver_register);
|
||||||
|
|
||||||
|
|||||||
@@ -574,8 +574,10 @@ static void devlink_remove_symlinks(struct device *dev,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (device_is_registered(con)) {
|
||||||
snprintf(buf, len, "supplier:%s:%s", dev_bus_name(sup), dev_name(sup));
|
snprintf(buf, len, "supplier:%s:%s", dev_bus_name(sup), dev_name(sup));
|
||||||
sysfs_remove_link(&con->kobj, buf);
|
sysfs_remove_link(&con->kobj, buf);
|
||||||
|
}
|
||||||
snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
|
snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
|
||||||
sysfs_remove_link(&sup->kobj, buf);
|
sysfs_remove_link(&sup->kobj, buf);
|
||||||
kfree(buf);
|
kfree(buf);
|
||||||
|
|||||||
@@ -4100,8 +4100,6 @@ again:
|
|||||||
|
|
||||||
static bool rbd_quiesce_lock(struct rbd_device *rbd_dev)
|
static bool rbd_quiesce_lock(struct rbd_device *rbd_dev)
|
||||||
{
|
{
|
||||||
bool need_wait;
|
|
||||||
|
|
||||||
dout("%s rbd_dev %p\n", __func__, rbd_dev);
|
dout("%s rbd_dev %p\n", __func__, rbd_dev);
|
||||||
lockdep_assert_held_write(&rbd_dev->lock_rwsem);
|
lockdep_assert_held_write(&rbd_dev->lock_rwsem);
|
||||||
|
|
||||||
@@ -4113,11 +4111,11 @@ static bool rbd_quiesce_lock(struct rbd_device *rbd_dev)
|
|||||||
*/
|
*/
|
||||||
rbd_dev->lock_state = RBD_LOCK_STATE_RELEASING;
|
rbd_dev->lock_state = RBD_LOCK_STATE_RELEASING;
|
||||||
rbd_assert(!completion_done(&rbd_dev->releasing_wait));
|
rbd_assert(!completion_done(&rbd_dev->releasing_wait));
|
||||||
need_wait = !list_empty(&rbd_dev->running_list);
|
if (list_empty(&rbd_dev->running_list))
|
||||||
downgrade_write(&rbd_dev->lock_rwsem);
|
return true;
|
||||||
if (need_wait)
|
|
||||||
|
up_write(&rbd_dev->lock_rwsem);
|
||||||
wait_for_completion(&rbd_dev->releasing_wait);
|
wait_for_completion(&rbd_dev->releasing_wait);
|
||||||
up_read(&rbd_dev->lock_rwsem);
|
|
||||||
|
|
||||||
down_write(&rbd_dev->lock_rwsem);
|
down_write(&rbd_dev->lock_rwsem);
|
||||||
if (rbd_dev->lock_state != RBD_LOCK_STATE_RELEASING)
|
if (rbd_dev->lock_state != RBD_LOCK_STATE_RELEASING)
|
||||||
@@ -4203,15 +4201,11 @@ static void rbd_handle_acquired_lock(struct rbd_device *rbd_dev, u8 struct_v,
|
|||||||
if (!rbd_cid_equal(&cid, &rbd_empty_cid)) {
|
if (!rbd_cid_equal(&cid, &rbd_empty_cid)) {
|
||||||
down_write(&rbd_dev->lock_rwsem);
|
down_write(&rbd_dev->lock_rwsem);
|
||||||
if (rbd_cid_equal(&cid, &rbd_dev->owner_cid)) {
|
if (rbd_cid_equal(&cid, &rbd_dev->owner_cid)) {
|
||||||
/*
|
dout("%s rbd_dev %p cid %llu-%llu == owner_cid\n",
|
||||||
* we already know that the remote client is
|
__func__, rbd_dev, cid.gid, cid.handle);
|
||||||
* the owner
|
} else {
|
||||||
*/
|
|
||||||
up_write(&rbd_dev->lock_rwsem);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
rbd_set_owner_cid(rbd_dev, &cid);
|
rbd_set_owner_cid(rbd_dev, &cid);
|
||||||
|
}
|
||||||
downgrade_write(&rbd_dev->lock_rwsem);
|
downgrade_write(&rbd_dev->lock_rwsem);
|
||||||
} else {
|
} else {
|
||||||
down_read(&rbd_dev->lock_rwsem);
|
down_read(&rbd_dev->lock_rwsem);
|
||||||
@@ -4236,14 +4230,12 @@ static void rbd_handle_released_lock(struct rbd_device *rbd_dev, u8 struct_v,
|
|||||||
if (!rbd_cid_equal(&cid, &rbd_empty_cid)) {
|
if (!rbd_cid_equal(&cid, &rbd_empty_cid)) {
|
||||||
down_write(&rbd_dev->lock_rwsem);
|
down_write(&rbd_dev->lock_rwsem);
|
||||||
if (!rbd_cid_equal(&cid, &rbd_dev->owner_cid)) {
|
if (!rbd_cid_equal(&cid, &rbd_dev->owner_cid)) {
|
||||||
dout("%s rbd_dev %p unexpected owner, cid %llu-%llu != owner_cid %llu-%llu\n",
|
dout("%s rbd_dev %p cid %llu-%llu != owner_cid %llu-%llu\n",
|
||||||
__func__, rbd_dev, cid.gid, cid.handle,
|
__func__, rbd_dev, cid.gid, cid.handle,
|
||||||
rbd_dev->owner_cid.gid, rbd_dev->owner_cid.handle);
|
rbd_dev->owner_cid.gid, rbd_dev->owner_cid.handle);
|
||||||
up_write(&rbd_dev->lock_rwsem);
|
} else {
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
rbd_set_owner_cid(rbd_dev, &rbd_empty_cid);
|
rbd_set_owner_cid(rbd_dev, &rbd_empty_cid);
|
||||||
|
}
|
||||||
downgrade_write(&rbd_dev->lock_rwsem);
|
downgrade_write(&rbd_dev->lock_rwsem);
|
||||||
} else {
|
} else {
|
||||||
down_read(&rbd_dev->lock_rwsem);
|
down_read(&rbd_dev->lock_rwsem);
|
||||||
@@ -4951,6 +4943,7 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
|
|||||||
disk->minors = RBD_MINORS_PER_MAJOR;
|
disk->minors = RBD_MINORS_PER_MAJOR;
|
||||||
}
|
}
|
||||||
disk->fops = &rbd_bd_ops;
|
disk->fops = &rbd_bd_ops;
|
||||||
|
disk->private_data = rbd_dev;
|
||||||
|
|
||||||
blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
|
blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
|
||||||
/* QUEUE_FLAG_ADD_RANDOM is off by default for blk-mq */
|
/* QUEUE_FLAG_ADD_RANDOM is off by default for blk-mq */
|
||||||
|
|||||||
@@ -773,11 +773,18 @@ static void mhi_process_cmd_completion(struct mhi_controller *mhi_cntrl,
|
|||||||
cmd_pkt = mhi_to_virtual(mhi_ring, ptr);
|
cmd_pkt = mhi_to_virtual(mhi_ring, ptr);
|
||||||
|
|
||||||
chan = MHI_TRE_GET_CMD_CHID(cmd_pkt);
|
chan = MHI_TRE_GET_CMD_CHID(cmd_pkt);
|
||||||
|
|
||||||
|
if (chan < mhi_cntrl->max_chan &&
|
||||||
|
mhi_cntrl->mhi_chan[chan].configured) {
|
||||||
mhi_chan = &mhi_cntrl->mhi_chan[chan];
|
mhi_chan = &mhi_cntrl->mhi_chan[chan];
|
||||||
write_lock_bh(&mhi_chan->lock);
|
write_lock_bh(&mhi_chan->lock);
|
||||||
mhi_chan->ccs = MHI_TRE_GET_EV_CODE(tre);
|
mhi_chan->ccs = MHI_TRE_GET_EV_CODE(tre);
|
||||||
complete(&mhi_chan->completion);
|
complete(&mhi_chan->completion);
|
||||||
write_unlock_bh(&mhi_chan->lock);
|
write_unlock_bh(&mhi_chan->lock);
|
||||||
|
} else {
|
||||||
|
dev_err(&mhi_cntrl->mhi_dev->dev,
|
||||||
|
"Completion packet for invalid channel ID: %d\n", chan);
|
||||||
|
}
|
||||||
|
|
||||||
mhi_del_ring_element(mhi_cntrl, mhi_ring);
|
mhi_del_ring_element(mhi_cntrl, mhi_ring);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,8 @@
|
|||||||
* @edl: emergency download mode firmware path (if any)
|
* @edl: emergency download mode firmware path (if any)
|
||||||
* @bar_num: PCI base address register to use for MHI MMIO register space
|
* @bar_num: PCI base address register to use for MHI MMIO register space
|
||||||
* @dma_data_width: DMA transfer word size (32 or 64 bits)
|
* @dma_data_width: DMA transfer word size (32 or 64 bits)
|
||||||
|
* @sideband_wake: Devices using dedicated sideband GPIO for wakeup instead
|
||||||
|
* of inband wake support (such as sdx24)
|
||||||
*/
|
*/
|
||||||
struct mhi_pci_dev_info {
|
struct mhi_pci_dev_info {
|
||||||
const struct mhi_controller_config *config;
|
const struct mhi_controller_config *config;
|
||||||
@@ -40,6 +42,7 @@ struct mhi_pci_dev_info {
|
|||||||
const char *edl;
|
const char *edl;
|
||||||
unsigned int bar_num;
|
unsigned int bar_num;
|
||||||
unsigned int dma_data_width;
|
unsigned int dma_data_width;
|
||||||
|
bool sideband_wake;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MHI_CHANNEL_CONFIG_UL(ch_num, ch_name, el_count, ev_ring) \
|
#define MHI_CHANNEL_CONFIG_UL(ch_num, ch_name, el_count, ev_ring) \
|
||||||
@@ -72,6 +75,22 @@ struct mhi_pci_dev_info {
|
|||||||
.doorbell_mode_switch = false, \
|
.doorbell_mode_switch = false, \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MHI_CHANNEL_CONFIG_DL_AUTOQUEUE(ch_num, ch_name, el_count, ev_ring) \
|
||||||
|
{ \
|
||||||
|
.num = ch_num, \
|
||||||
|
.name = ch_name, \
|
||||||
|
.num_elements = el_count, \
|
||||||
|
.event_ring = ev_ring, \
|
||||||
|
.dir = DMA_FROM_DEVICE, \
|
||||||
|
.ee_mask = BIT(MHI_EE_AMSS), \
|
||||||
|
.pollcfg = 0, \
|
||||||
|
.doorbell = MHI_DB_BRST_DISABLE, \
|
||||||
|
.lpm_notify = false, \
|
||||||
|
.offload_channel = false, \
|
||||||
|
.doorbell_mode_switch = false, \
|
||||||
|
.auto_queue = true, \
|
||||||
|
}
|
||||||
|
|
||||||
#define MHI_EVENT_CONFIG_CTRL(ev_ring, el_count) \
|
#define MHI_EVENT_CONFIG_CTRL(ev_ring, el_count) \
|
||||||
{ \
|
{ \
|
||||||
.num_elements = el_count, \
|
.num_elements = el_count, \
|
||||||
@@ -210,7 +229,7 @@ static const struct mhi_channel_config modem_qcom_v1_mhi_channels[] = {
|
|||||||
MHI_CHANNEL_CONFIG_UL(14, "QMI", 4, 0),
|
MHI_CHANNEL_CONFIG_UL(14, "QMI", 4, 0),
|
||||||
MHI_CHANNEL_CONFIG_DL(15, "QMI", 4, 0),
|
MHI_CHANNEL_CONFIG_DL(15, "QMI", 4, 0),
|
||||||
MHI_CHANNEL_CONFIG_UL(20, "IPCR", 8, 0),
|
MHI_CHANNEL_CONFIG_UL(20, "IPCR", 8, 0),
|
||||||
MHI_CHANNEL_CONFIG_DL(21, "IPCR", 8, 0),
|
MHI_CHANNEL_CONFIG_DL_AUTOQUEUE(21, "IPCR", 8, 0),
|
||||||
MHI_CHANNEL_CONFIG_UL_FP(34, "FIREHOSE", 32, 0),
|
MHI_CHANNEL_CONFIG_UL_FP(34, "FIREHOSE", 32, 0),
|
||||||
MHI_CHANNEL_CONFIG_DL_FP(35, "FIREHOSE", 32, 0),
|
MHI_CHANNEL_CONFIG_DL_FP(35, "FIREHOSE", 32, 0),
|
||||||
MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0", 128, 2),
|
MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0", 128, 2),
|
||||||
@@ -242,7 +261,8 @@ static const struct mhi_pci_dev_info mhi_qcom_sdx65_info = {
|
|||||||
.edl = "qcom/sdx65m/edl.mbn",
|
.edl = "qcom/sdx65m/edl.mbn",
|
||||||
.config = &modem_qcom_v1_mhiv_config,
|
.config = &modem_qcom_v1_mhiv_config,
|
||||||
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
||||||
.dma_data_width = 32
|
.dma_data_width = 32,
|
||||||
|
.sideband_wake = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct mhi_pci_dev_info mhi_qcom_sdx55_info = {
|
static const struct mhi_pci_dev_info mhi_qcom_sdx55_info = {
|
||||||
@@ -251,7 +271,8 @@ static const struct mhi_pci_dev_info mhi_qcom_sdx55_info = {
|
|||||||
.edl = "qcom/sdx55m/edl.mbn",
|
.edl = "qcom/sdx55m/edl.mbn",
|
||||||
.config = &modem_qcom_v1_mhiv_config,
|
.config = &modem_qcom_v1_mhiv_config,
|
||||||
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
||||||
.dma_data_width = 32
|
.dma_data_width = 32,
|
||||||
|
.sideband_wake = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct mhi_pci_dev_info mhi_qcom_sdx24_info = {
|
static const struct mhi_pci_dev_info mhi_qcom_sdx24_info = {
|
||||||
@@ -259,7 +280,8 @@ static const struct mhi_pci_dev_info mhi_qcom_sdx24_info = {
|
|||||||
.edl = "qcom/prog_firehose_sdx24.mbn",
|
.edl = "qcom/prog_firehose_sdx24.mbn",
|
||||||
.config = &modem_qcom_v1_mhiv_config,
|
.config = &modem_qcom_v1_mhiv_config,
|
||||||
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
||||||
.dma_data_width = 32
|
.dma_data_width = 32,
|
||||||
|
.sideband_wake = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct mhi_channel_config mhi_quectel_em1xx_channels[] = {
|
static const struct mhi_channel_config mhi_quectel_em1xx_channels[] = {
|
||||||
@@ -301,7 +323,8 @@ static const struct mhi_pci_dev_info mhi_quectel_em1xx_info = {
|
|||||||
.edl = "qcom/prog_firehose_sdx24.mbn",
|
.edl = "qcom/prog_firehose_sdx24.mbn",
|
||||||
.config = &modem_quectel_em1xx_config,
|
.config = &modem_quectel_em1xx_config,
|
||||||
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
||||||
.dma_data_width = 32
|
.dma_data_width = 32,
|
||||||
|
.sideband_wake = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct mhi_channel_config mhi_foxconn_sdx55_channels[] = {
|
static const struct mhi_channel_config mhi_foxconn_sdx55_channels[] = {
|
||||||
@@ -339,7 +362,8 @@ static const struct mhi_pci_dev_info mhi_foxconn_sdx55_info = {
|
|||||||
.edl = "qcom/sdx55m/edl.mbn",
|
.edl = "qcom/sdx55m/edl.mbn",
|
||||||
.config = &modem_foxconn_sdx55_config,
|
.config = &modem_foxconn_sdx55_config,
|
||||||
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
||||||
.dma_data_width = 32
|
.dma_data_width = 32,
|
||||||
|
.sideband_wake = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pci_device_id mhi_pci_id_table[] = {
|
static const struct pci_device_id mhi_pci_id_table[] = {
|
||||||
@@ -640,9 +664,12 @@ static int mhi_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||||||
mhi_cntrl->status_cb = mhi_pci_status_cb;
|
mhi_cntrl->status_cb = mhi_pci_status_cb;
|
||||||
mhi_cntrl->runtime_get = mhi_pci_runtime_get;
|
mhi_cntrl->runtime_get = mhi_pci_runtime_get;
|
||||||
mhi_cntrl->runtime_put = mhi_pci_runtime_put;
|
mhi_cntrl->runtime_put = mhi_pci_runtime_put;
|
||||||
|
|
||||||
|
if (info->sideband_wake) {
|
||||||
mhi_cntrl->wake_get = mhi_pci_wake_get_nop;
|
mhi_cntrl->wake_get = mhi_pci_wake_get_nop;
|
||||||
mhi_cntrl->wake_put = mhi_pci_wake_put_nop;
|
mhi_cntrl->wake_put = mhi_pci_wake_put_nop;
|
||||||
mhi_cntrl->wake_toggle = mhi_pci_wake_toggle_nop;
|
mhi_cntrl->wake_toggle = mhi_pci_wake_toggle_nop;
|
||||||
|
}
|
||||||
|
|
||||||
err = mhi_pci_claim(mhi_cntrl, info->bar_num, DMA_BIT_MASK(info->dma_data_width));
|
err = mhi_pci_claim(mhi_cntrl, info->bar_num, DMA_BIT_MASK(info->dma_data_width));
|
||||||
if (err)
|
if (err)
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ static long __init parse_acpi_path(const struct efi_dev_path *node,
|
|||||||
break;
|
break;
|
||||||
if (!adev->pnp.unique_id && node->acpi.uid == 0)
|
if (!adev->pnp.unique_id && node->acpi.uid == 0)
|
||||||
break;
|
break;
|
||||||
acpi_dev_put(adev);
|
|
||||||
}
|
}
|
||||||
if (!adev)
|
if (!adev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|||||||
@@ -896,6 +896,7 @@ static int __init efi_memreserve_map_root(void)
|
|||||||
static int efi_mem_reserve_iomem(phys_addr_t addr, u64 size)
|
static int efi_mem_reserve_iomem(phys_addr_t addr, u64 size)
|
||||||
{
|
{
|
||||||
struct resource *res, *parent;
|
struct resource *res, *parent;
|
||||||
|
int ret;
|
||||||
|
|
||||||
res = kzalloc(sizeof(struct resource), GFP_ATOMIC);
|
res = kzalloc(sizeof(struct resource), GFP_ATOMIC);
|
||||||
if (!res)
|
if (!res)
|
||||||
@@ -908,7 +909,17 @@ static int efi_mem_reserve_iomem(phys_addr_t addr, u64 size)
|
|||||||
|
|
||||||
/* we expect a conflict with a 'System RAM' region */
|
/* we expect a conflict with a 'System RAM' region */
|
||||||
parent = request_resource_conflict(&iomem_resource, res);
|
parent = request_resource_conflict(&iomem_resource, res);
|
||||||
return parent ? request_resource(parent, res) : 0;
|
ret = parent ? request_resource(parent, res) : 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Given that efi_mem_reserve_iomem() can be called at any
|
||||||
|
* time, only call memblock_reserve() if the architecture
|
||||||
|
* keeps the infrastructure around.
|
||||||
|
*/
|
||||||
|
if (IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK) && !ret)
|
||||||
|
memblock_reserve(addr, size);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size)
|
int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size)
|
||||||
|
|||||||
@@ -630,8 +630,8 @@ efi_status_t efi_load_initrd_cmdline(efi_loaded_image_t *image,
|
|||||||
* @image: EFI loaded image protocol
|
* @image: EFI loaded image protocol
|
||||||
* @load_addr: pointer to loaded initrd
|
* @load_addr: pointer to loaded initrd
|
||||||
* @load_size: size of loaded initrd
|
* @load_size: size of loaded initrd
|
||||||
* @soft_limit: preferred size of allocated memory for loading the initrd
|
* @soft_limit: preferred address for loading the initrd
|
||||||
* @hard_limit: minimum size of allocated memory
|
* @hard_limit: upper limit address for loading the initrd
|
||||||
*
|
*
|
||||||
* Return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -180,7 +180,10 @@ void __init efi_mokvar_table_init(void)
|
|||||||
pr_err("EFI MOKvar config table is not valid\n");
|
pr_err("EFI MOKvar config table is not valid\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (md.type == EFI_BOOT_SERVICES_DATA)
|
||||||
efi_mem_reserve(efi.mokvar_table, map_size_needed);
|
efi_mem_reserve(efi.mokvar_table, map_size_needed);
|
||||||
|
|
||||||
efi_mokvar_table_size = map_size_needed;
|
efi_mokvar_table_size = map_size_needed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,9 +62,11 @@ int __init efi_tpm_eventlog_init(void)
|
|||||||
tbl_size = sizeof(*log_tbl) + log_tbl->size;
|
tbl_size = sizeof(*log_tbl) + log_tbl->size;
|
||||||
memblock_reserve(efi.tpm_log, tbl_size);
|
memblock_reserve(efi.tpm_log, tbl_size);
|
||||||
|
|
||||||
if (efi.tpm_final_log == EFI_INVALID_TABLE_ADDR ||
|
if (efi.tpm_final_log == EFI_INVALID_TABLE_ADDR) {
|
||||||
log_tbl->version != EFI_TCG2_EVENT_LOG_FORMAT_TCG_2) {
|
pr_info("TPM Final Events table not present\n");
|
||||||
pr_warn(FW_BUG "TPM Final Events table missing or invalid\n");
|
goto out;
|
||||||
|
} else if (log_tbl->version != EFI_TCG2_EVENT_LOG_FORMAT_TCG_2) {
|
||||||
|
pr_warn(FW_BUG "TPM Final Events table invalid\n");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -619,6 +619,13 @@ struct amdgpu_video_codec_info {
|
|||||||
u32 max_level;
|
u32 max_level;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define codec_info_build(type, width, height, level) \
|
||||||
|
.codec_type = type,\
|
||||||
|
.max_width = width,\
|
||||||
|
.max_height = height,\
|
||||||
|
.max_pixels_per_frame = height * width,\
|
||||||
|
.max_level = level,
|
||||||
|
|
||||||
struct amdgpu_video_codecs {
|
struct amdgpu_video_codecs {
|
||||||
const u32 codec_count;
|
const u32 codec_count;
|
||||||
const struct amdgpu_video_codec_info *codec_array;
|
const struct amdgpu_video_codec_info *codec_array;
|
||||||
|
|||||||
@@ -1190,6 +1190,10 @@ static const struct pci_device_id pciidlist[] = {
|
|||||||
/* Van Gogh */
|
/* Van Gogh */
|
||||||
{0x1002, 0x163F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VANGOGH|AMD_IS_APU},
|
{0x1002, 0x163F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VANGOGH|AMD_IS_APU},
|
||||||
|
|
||||||
|
/* Yellow Carp */
|
||||||
|
{0x1002, 0x164D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_YELLOW_CARP|AMD_IS_APU},
|
||||||
|
{0x1002, 0x1681, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_YELLOW_CARP|AMD_IS_APU},
|
||||||
|
|
||||||
/* Navy_Flounder */
|
/* Navy_Flounder */
|
||||||
{0x1002, 0x73C0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
|
{0x1002, 0x73C0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
|
||||||
{0x1002, 0x73C1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
|
{0x1002, 0x73C1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},
|
||||||
|
|||||||
@@ -255,6 +255,15 @@ static int amdgpu_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_str
|
|||||||
if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
|
if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
|
||||||
|
/* Workaround for Thunk bug creating PROT_NONE,MAP_PRIVATE mappings
|
||||||
|
* for debugger access to invisible VRAM. Should have used MAP_SHARED
|
||||||
|
* instead. Clearing VM_MAYWRITE prevents the mapping from ever
|
||||||
|
* becoming writable and makes is_cow_mapping(vm_flags) false.
|
||||||
|
*/
|
||||||
|
if (is_cow_mapping(vma->vm_flags) &&
|
||||||
|
!(vma->vm_flags & (VM_READ | VM_WRITE | VM_EXEC)))
|
||||||
|
vma->vm_flags &= ~VM_MAYWRITE;
|
||||||
|
|
||||||
return drm_gem_ttm_mmap(obj, vma);
|
return drm_gem_ttm_mmap(obj, vma);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3300,6 +3300,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_3[] =
|
|||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_PERFCOUNTER7_SELECT, 0xf0f001ff, 0x00000000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_PERFCOUNTER7_SELECT, 0xf0f001ff, 0x00000000),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_PERFCOUNTER8_SELECT, 0xf0f001ff, 0x00000000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_PERFCOUNTER8_SELECT, 0xf0f001ff, 0x00000000),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_PERFCOUNTER9_SELECT, 0xf0f001ff, 0x00000000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_PERFCOUNTER9_SELECT, 0xf0f001ff, 0x00000000),
|
||||||
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSX_DEBUG_1, 0x00010000, 0x00010020),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfff7ffff, 0x01030000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfff7ffff, 0x01030000),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffbfffff, 0x00a00000)
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffbfffff, 0x00a00000)
|
||||||
};
|
};
|
||||||
@@ -3379,6 +3380,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_3_vangogh[] =
|
|||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_2, 0xffffffbf, 0x00000020),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_2, 0xffffffbf, 0x00000020),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_CONFIG_CNTL_1_Vangogh, 0xffffffff, 0x00070103),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_CONFIG_CNTL_1_Vangogh, 0xffffffff, 0x00070103),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQG_CONFIG, 0x000017ff, 0x00001000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQG_CONFIG, 0x000017ff, 0x00001000),
|
||||||
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSX_DEBUG_1, 0x00010000, 0x00010020),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfff7ffff, 0x01030000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfff7ffff, 0x01030000),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffffffff, 0x00400000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffffffff, 0x00400000),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_GS_MAX_WAVE_ID, 0x00000fff, 0x000000ff),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_GS_MAX_WAVE_ID, 0x00000fff, 0x000000ff),
|
||||||
@@ -3445,6 +3447,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_3_4[] =
|
|||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_PERFCOUNTER7_SELECT, 0xf0f001ff, 0x00000000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_PERFCOUNTER7_SELECT, 0xf0f001ff, 0x00000000),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_PERFCOUNTER8_SELECT, 0xf0f001ff, 0x00000000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_PERFCOUNTER8_SELECT, 0xf0f001ff, 0x00000000),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_PERFCOUNTER9_SELECT, 0xf0f001ff, 0x00000000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_PERFCOUNTER9_SELECT, 0xf0f001ff, 0x00000000),
|
||||||
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSX_DEBUG_1, 0x00010000, 0x00010020),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0x01030000, 0x01030000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0x01030000, 0x01030000),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0x03a00000, 0x00a00000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0x03a00000, 0x00a00000),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmLDS_CONFIG, 0x00000020, 0x00000020)
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmLDS_CONFIG, 0x00000020, 0x00000020)
|
||||||
|
|||||||
@@ -64,32 +64,13 @@
|
|||||||
#include "smuio_v11_0.h"
|
#include "smuio_v11_0.h"
|
||||||
#include "smuio_v11_0_6.h"
|
#include "smuio_v11_0_6.h"
|
||||||
|
|
||||||
#define codec_info_build(type, width, height, level) \
|
|
||||||
.codec_type = type,\
|
|
||||||
.max_width = width,\
|
|
||||||
.max_height = height,\
|
|
||||||
.max_pixels_per_frame = height * width,\
|
|
||||||
.max_level = level,
|
|
||||||
|
|
||||||
static const struct amd_ip_funcs nv_common_ip_funcs;
|
static const struct amd_ip_funcs nv_common_ip_funcs;
|
||||||
|
|
||||||
/* Navi */
|
/* Navi */
|
||||||
static const struct amdgpu_video_codec_info nv_video_codecs_encode_array[] =
|
static const struct amdgpu_video_codec_info nv_video_codecs_encode_array[] =
|
||||||
{
|
{
|
||||||
{
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2304, 0)},
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 2304, 0)},
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 2304,
|
|
||||||
.max_pixels_per_frame = 4096 * 2304,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 2304,
|
|
||||||
.max_pixels_per_frame = 4096 * 2304,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct amdgpu_video_codecs nv_video_codecs_encode =
|
static const struct amdgpu_video_codecs nv_video_codecs_encode =
|
||||||
@@ -101,55 +82,13 @@ static const struct amdgpu_video_codecs nv_video_codecs_encode =
|
|||||||
/* Navi1x */
|
/* Navi1x */
|
||||||
static const struct amdgpu_video_codec_info nv_video_codecs_decode_array[] =
|
static const struct amdgpu_video_codec_info nv_video_codecs_decode_array[] =
|
||||||
{
|
{
|
||||||
{
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4906, 3)},
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4906, 5)},
|
||||||
.max_width = 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4906, 52)},
|
||||||
.max_height = 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4906, 4)},
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)},
|
||||||
.max_level = 3,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
|
||||||
},
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 5,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 52,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 4,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
|
|
||||||
.max_width = 8192,
|
|
||||||
.max_height = 4352,
|
|
||||||
.max_pixels_per_frame = 8192 * 4352,
|
|
||||||
.max_level = 186,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9,
|
|
||||||
.max_width = 8192,
|
|
||||||
.max_height = 4352,
|
|
||||||
.max_pixels_per_frame = 8192 * 4352,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct amdgpu_video_codecs nv_video_codecs_decode =
|
static const struct amdgpu_video_codecs nv_video_codecs_decode =
|
||||||
@@ -161,62 +100,14 @@ static const struct amdgpu_video_codecs nv_video_codecs_decode =
|
|||||||
/* Sienna Cichlid */
|
/* Sienna Cichlid */
|
||||||
static const struct amdgpu_video_codec_info sc_video_codecs_decode_array[] =
|
static const struct amdgpu_video_codec_info sc_video_codecs_decode_array[] =
|
||||||
{
|
{
|
||||||
{
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4906, 3)},
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4906, 5)},
|
||||||
.max_width = 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4906, 52)},
|
||||||
.max_height = 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4906, 4)},
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)},
|
||||||
.max_level = 3,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
|
||||||
},
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},
|
||||||
{
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)},
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 5,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 52,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 4,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
|
|
||||||
.max_width = 8192,
|
|
||||||
.max_height = 4352,
|
|
||||||
.max_pixels_per_frame = 8192 * 4352,
|
|
||||||
.max_level = 186,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9,
|
|
||||||
.max_width = 8192,
|
|
||||||
.max_height = 4352,
|
|
||||||
.max_pixels_per_frame = 8192 * 4352,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1,
|
|
||||||
.max_width = 8192,
|
|
||||||
.max_height = 4352,
|
|
||||||
.max_pixels_per_frame = 8192 * 4352,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct amdgpu_video_codecs sc_video_codecs_decode =
|
static const struct amdgpu_video_codecs sc_video_codecs_decode =
|
||||||
@@ -228,80 +119,20 @@ static const struct amdgpu_video_codecs sc_video_codecs_decode =
|
|||||||
/* SRIOV Sienna Cichlid, not const since data is controlled by host */
|
/* SRIOV Sienna Cichlid, not const since data is controlled by host */
|
||||||
static struct amdgpu_video_codec_info sriov_sc_video_codecs_encode_array[] =
|
static struct amdgpu_video_codec_info sriov_sc_video_codecs_encode_array[] =
|
||||||
{
|
{
|
||||||
{
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2304, 0)},
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 2304, 0)},
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 2304,
|
|
||||||
.max_pixels_per_frame = 4096 * 2304,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 2304,
|
|
||||||
.max_pixels_per_frame = 4096 * 2304,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct amdgpu_video_codec_info sriov_sc_video_codecs_decode_array[] =
|
static struct amdgpu_video_codec_info sriov_sc_video_codecs_decode_array[] =
|
||||||
{
|
{
|
||||||
{
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4906, 3)},
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4906, 5)},
|
||||||
.max_width = 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4906, 52)},
|
||||||
.max_height = 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4906, 4)},
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)},
|
||||||
.max_level = 3,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
|
||||||
},
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},
|
||||||
{
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)},
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 5,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 52,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 4,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
|
|
||||||
.max_width = 8192,
|
|
||||||
.max_height = 4352,
|
|
||||||
.max_pixels_per_frame = 8192 * 4352,
|
|
||||||
.max_level = 186,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9,
|
|
||||||
.max_width = 8192,
|
|
||||||
.max_height = 4352,
|
|
||||||
.max_pixels_per_frame = 8192 * 4352,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1,
|
|
||||||
.max_width = 8192,
|
|
||||||
.max_height = 4352,
|
|
||||||
.max_pixels_per_frame = 8192 * 4352,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct amdgpu_video_codecs sriov_sc_video_codecs_encode =
|
static struct amdgpu_video_codecs sriov_sc_video_codecs_encode =
|
||||||
@@ -333,6 +164,19 @@ static const struct amdgpu_video_codecs bg_video_codecs_encode = {
|
|||||||
.codec_array = NULL,
|
.codec_array = NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Yellow Carp*/
|
||||||
|
static const struct amdgpu_video_codec_info yc_video_codecs_decode_array[] = {
|
||||||
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4906, 52)},
|
||||||
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)},
|
||||||
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},
|
||||||
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct amdgpu_video_codecs yc_video_codecs_decode = {
|
||||||
|
.codec_count = ARRAY_SIZE(yc_video_codecs_decode_array),
|
||||||
|
.codec_array = yc_video_codecs_decode_array,
|
||||||
|
};
|
||||||
|
|
||||||
static int nv_query_video_codecs(struct amdgpu_device *adev, bool encode,
|
static int nv_query_video_codecs(struct amdgpu_device *adev, bool encode,
|
||||||
const struct amdgpu_video_codecs **codecs)
|
const struct amdgpu_video_codecs **codecs)
|
||||||
{
|
{
|
||||||
@@ -353,12 +197,17 @@ static int nv_query_video_codecs(struct amdgpu_device *adev, bool encode,
|
|||||||
case CHIP_NAVY_FLOUNDER:
|
case CHIP_NAVY_FLOUNDER:
|
||||||
case CHIP_DIMGREY_CAVEFISH:
|
case CHIP_DIMGREY_CAVEFISH:
|
||||||
case CHIP_VANGOGH:
|
case CHIP_VANGOGH:
|
||||||
case CHIP_YELLOW_CARP:
|
|
||||||
if (encode)
|
if (encode)
|
||||||
*codecs = &nv_video_codecs_encode;
|
*codecs = &nv_video_codecs_encode;
|
||||||
else
|
else
|
||||||
*codecs = &sc_video_codecs_decode;
|
*codecs = &sc_video_codecs_decode;
|
||||||
return 0;
|
return 0;
|
||||||
|
case CHIP_YELLOW_CARP:
|
||||||
|
if (encode)
|
||||||
|
*codecs = &nv_video_codecs_encode;
|
||||||
|
else
|
||||||
|
*codecs = &yc_video_codecs_decode;
|
||||||
|
return 0;
|
||||||
case CHIP_BEIGE_GOBY:
|
case CHIP_BEIGE_GOBY:
|
||||||
if (encode)
|
if (encode)
|
||||||
*codecs = &bg_video_codecs_encode;
|
*codecs = &bg_video_codecs_encode;
|
||||||
@@ -1387,6 +1236,9 @@ static int nv_common_early_init(void *handle)
|
|||||||
AMD_PG_SUPPORT_VCN |
|
AMD_PG_SUPPORT_VCN |
|
||||||
AMD_PG_SUPPORT_VCN_DPG |
|
AMD_PG_SUPPORT_VCN_DPG |
|
||||||
AMD_PG_SUPPORT_JPEG;
|
AMD_PG_SUPPORT_JPEG;
|
||||||
|
if (adev->pdev->device == 0x1681)
|
||||||
|
adev->external_rev_id = adev->rev_id + 0x19;
|
||||||
|
else
|
||||||
adev->external_rev_id = adev->rev_id + 0x01;
|
adev->external_rev_id = adev->rev_id + 0x01;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -88,20 +88,8 @@
|
|||||||
/* Vega, Raven, Arcturus */
|
/* Vega, Raven, Arcturus */
|
||||||
static const struct amdgpu_video_codec_info vega_video_codecs_encode_array[] =
|
static const struct amdgpu_video_codec_info vega_video_codecs_encode_array[] =
|
||||||
{
|
{
|
||||||
{
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2304, 0)},
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 2304, 0)},
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 2304,
|
|
||||||
.max_pixels_per_frame = 4096 * 2304,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 2304,
|
|
||||||
.max_pixels_per_frame = 4096 * 2304,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct amdgpu_video_codecs vega_video_codecs_encode =
|
static const struct amdgpu_video_codecs vega_video_codecs_encode =
|
||||||
@@ -113,48 +101,12 @@ static const struct amdgpu_video_codecs vega_video_codecs_encode =
|
|||||||
/* Vega */
|
/* Vega */
|
||||||
static const struct amdgpu_video_codec_info vega_video_codecs_decode_array[] =
|
static const struct amdgpu_video_codec_info vega_video_codecs_decode_array[] =
|
||||||
{
|
{
|
||||||
{
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4906, 3)},
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4906, 5)},
|
||||||
.max_width = 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4906, 52)},
|
||||||
.max_height = 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4906, 4)},
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 4096, 186)},
|
||||||
.max_level = 3,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 5,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 52,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 4,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 186,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct amdgpu_video_codecs vega_video_codecs_decode =
|
static const struct amdgpu_video_codecs vega_video_codecs_decode =
|
||||||
@@ -166,55 +118,13 @@ static const struct amdgpu_video_codecs vega_video_codecs_decode =
|
|||||||
/* Raven */
|
/* Raven */
|
||||||
static const struct amdgpu_video_codec_info rv_video_codecs_decode_array[] =
|
static const struct amdgpu_video_codec_info rv_video_codecs_decode_array[] =
|
||||||
{
|
{
|
||||||
{
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4906, 3)},
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4906, 5)},
|
||||||
.max_width = 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4906, 52)},
|
||||||
.max_height = 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4906, 4)},
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 4096, 186)},
|
||||||
.max_level = 3,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
|
||||||
},
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 4096, 4096, 0)},
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 5,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 52,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 4,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 186,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct amdgpu_video_codecs rv_video_codecs_decode =
|
static const struct amdgpu_video_codecs rv_video_codecs_decode =
|
||||||
@@ -226,55 +136,13 @@ static const struct amdgpu_video_codecs rv_video_codecs_decode =
|
|||||||
/* Renoir, Arcturus */
|
/* Renoir, Arcturus */
|
||||||
static const struct amdgpu_video_codec_info rn_video_codecs_decode_array[] =
|
static const struct amdgpu_video_codec_info rn_video_codecs_decode_array[] =
|
||||||
{
|
{
|
||||||
{
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4906, 3)},
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4906, 5)},
|
||||||
.max_width = 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4906, 52)},
|
||||||
.max_height = 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4906, 4)},
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)},
|
||||||
.max_level = 3,
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)},
|
||||||
},
|
{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)},
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 5,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 52,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 4,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
|
|
||||||
.max_width = 8192,
|
|
||||||
.max_height = 4352,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 186,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG,
|
|
||||||
.max_width = 4096,
|
|
||||||
.max_height = 4096,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9,
|
|
||||||
.max_width = 8192,
|
|
||||||
.max_height = 4352,
|
|
||||||
.max_pixels_per_frame = 4096 * 4096,
|
|
||||||
.max_level = 0,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct amdgpu_video_codecs rn_video_codecs_decode =
|
static const struct amdgpu_video_codecs rn_video_codecs_decode =
|
||||||
|
|||||||
@@ -190,6 +190,10 @@ void dcn3_init_clocks(struct clk_mgr *clk_mgr_base)
|
|||||||
&clk_mgr_base->bw_params->clk_table.entries[0].dtbclk_mhz,
|
&clk_mgr_base->bw_params->clk_table.entries[0].dtbclk_mhz,
|
||||||
&num_levels);
|
&num_levels);
|
||||||
|
|
||||||
|
/* SOCCLK */
|
||||||
|
dcn3_init_single_clock(clk_mgr, PPCLK_SOCCLK,
|
||||||
|
&clk_mgr_base->bw_params->clk_table.entries[0].socclk_mhz,
|
||||||
|
&num_levels);
|
||||||
// DPREFCLK ???
|
// DPREFCLK ???
|
||||||
|
|
||||||
/* DISPCLK */
|
/* DISPCLK */
|
||||||
|
|||||||
@@ -48,6 +48,21 @@
|
|||||||
|
|
||||||
#include "dc_dmub_srv.h"
|
#include "dc_dmub_srv.h"
|
||||||
|
|
||||||
|
#include "yellow_carp_offset.h"
|
||||||
|
|
||||||
|
#define regCLK1_CLK_PLL_REQ 0x0237
|
||||||
|
#define regCLK1_CLK_PLL_REQ_BASE_IDX 0
|
||||||
|
|
||||||
|
#define CLK1_CLK_PLL_REQ__FbMult_int__SHIFT 0x0
|
||||||
|
#define CLK1_CLK_PLL_REQ__PllSpineDiv__SHIFT 0xc
|
||||||
|
#define CLK1_CLK_PLL_REQ__FbMult_frac__SHIFT 0x10
|
||||||
|
#define CLK1_CLK_PLL_REQ__FbMult_int_MASK 0x000001FFL
|
||||||
|
#define CLK1_CLK_PLL_REQ__PllSpineDiv_MASK 0x0000F000L
|
||||||
|
#define CLK1_CLK_PLL_REQ__FbMult_frac_MASK 0xFFFF0000L
|
||||||
|
|
||||||
|
#define REG(reg_name) \
|
||||||
|
(CLK_BASE.instance[0].segment[reg ## reg_name ## _BASE_IDX] + reg ## reg_name)
|
||||||
|
|
||||||
#define TO_CLK_MGR_DCN31(clk_mgr)\
|
#define TO_CLK_MGR_DCN31(clk_mgr)\
|
||||||
container_of(clk_mgr, struct clk_mgr_dcn31, base)
|
container_of(clk_mgr, struct clk_mgr_dcn31, base)
|
||||||
|
|
||||||
@@ -124,10 +139,10 @@ static void dcn31_update_clocks(struct clk_mgr *clk_mgr_base,
|
|||||||
* also if safe to lower is false, we just go in the higher state
|
* also if safe to lower is false, we just go in the higher state
|
||||||
*/
|
*/
|
||||||
if (safe_to_lower) {
|
if (safe_to_lower) {
|
||||||
if (new_clocks->z9_support == DCN_Z9_SUPPORT_ALLOW &&
|
if (new_clocks->zstate_support == DCN_ZSTATE_SUPPORT_ALLOW &&
|
||||||
new_clocks->z9_support != clk_mgr_base->clks.z9_support) {
|
new_clocks->zstate_support != clk_mgr_base->clks.zstate_support) {
|
||||||
dcn31_smu_set_Z9_support(clk_mgr, true);
|
dcn31_smu_set_Z9_support(clk_mgr, true);
|
||||||
clk_mgr_base->clks.z9_support = new_clocks->z9_support;
|
clk_mgr_base->clks.zstate_support = new_clocks->zstate_support;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clk_mgr_base->clks.dtbclk_en && !new_clocks->dtbclk_en) {
|
if (clk_mgr_base->clks.dtbclk_en && !new_clocks->dtbclk_en) {
|
||||||
@@ -148,10 +163,10 @@ static void dcn31_update_clocks(struct clk_mgr *clk_mgr_base,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (new_clocks->z9_support == DCN_Z9_SUPPORT_DISALLOW &&
|
if (new_clocks->zstate_support == DCN_ZSTATE_SUPPORT_DISALLOW &&
|
||||||
new_clocks->z9_support != clk_mgr_base->clks.z9_support) {
|
new_clocks->zstate_support != clk_mgr_base->clks.zstate_support) {
|
||||||
dcn31_smu_set_Z9_support(clk_mgr, false);
|
dcn31_smu_set_Z9_support(clk_mgr, false);
|
||||||
clk_mgr_base->clks.z9_support = new_clocks->z9_support;
|
clk_mgr_base->clks.zstate_support = new_clocks->zstate_support;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!clk_mgr_base->clks.dtbclk_en && new_clocks->dtbclk_en) {
|
if (!clk_mgr_base->clks.dtbclk_en && new_clocks->dtbclk_en) {
|
||||||
@@ -229,7 +244,32 @@ static void dcn31_update_clocks(struct clk_mgr *clk_mgr_base,
|
|||||||
|
|
||||||
static int get_vco_frequency_from_reg(struct clk_mgr_internal *clk_mgr)
|
static int get_vco_frequency_from_reg(struct clk_mgr_internal *clk_mgr)
|
||||||
{
|
{
|
||||||
return 0;
|
/* get FbMult value */
|
||||||
|
struct fixed31_32 pll_req;
|
||||||
|
unsigned int fbmult_frac_val = 0;
|
||||||
|
unsigned int fbmult_int_val = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register value of fbmult is in 8.16 format, we are converting to 31.32
|
||||||
|
* to leverage the fix point operations available in driver
|
||||||
|
*/
|
||||||
|
|
||||||
|
REG_GET(CLK1_CLK_PLL_REQ, FbMult_frac, &fbmult_frac_val); /* 16 bit fractional part*/
|
||||||
|
REG_GET(CLK1_CLK_PLL_REQ, FbMult_int, &fbmult_int_val); /* 8 bit integer part */
|
||||||
|
|
||||||
|
pll_req = dc_fixpt_from_int(fbmult_int_val);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* since fractional part is only 16 bit in register definition but is 32 bit
|
||||||
|
* in our fix point definiton, need to shift left by 16 to obtain correct value
|
||||||
|
*/
|
||||||
|
pll_req.value |= fbmult_frac_val << 16;
|
||||||
|
|
||||||
|
/* multiply by REFCLK period */
|
||||||
|
pll_req = dc_fixpt_mul_int(pll_req, clk_mgr->dfs_ref_freq_khz);
|
||||||
|
|
||||||
|
/* integer part is now VCO frequency in kHz */
|
||||||
|
return dc_fixpt_floor(pll_req);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dcn31_enable_pme_wa(struct clk_mgr *clk_mgr_base)
|
static void dcn31_enable_pme_wa(struct clk_mgr *clk_mgr_base)
|
||||||
@@ -246,7 +286,7 @@ static void dcn31_init_clocks(struct clk_mgr *clk_mgr)
|
|||||||
clk_mgr->clks.p_state_change_support = true;
|
clk_mgr->clks.p_state_change_support = true;
|
||||||
clk_mgr->clks.prev_p_state_change_support = true;
|
clk_mgr->clks.prev_p_state_change_support = true;
|
||||||
clk_mgr->clks.pwr_state = DCN_PWR_STATE_UNKNOWN;
|
clk_mgr->clks.pwr_state = DCN_PWR_STATE_UNKNOWN;
|
||||||
clk_mgr->clks.z9_support = DCN_Z9_SUPPORT_UNKNOWN;
|
clk_mgr->clks.zstate_support = DCN_ZSTATE_SUPPORT_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool dcn31_are_clock_states_equal(struct dc_clocks *a,
|
static bool dcn31_are_clock_states_equal(struct dc_clocks *a,
|
||||||
@@ -260,7 +300,7 @@ static bool dcn31_are_clock_states_equal(struct dc_clocks *a,
|
|||||||
return false;
|
return false;
|
||||||
else if (a->dcfclk_deep_sleep_khz != b->dcfclk_deep_sleep_khz)
|
else if (a->dcfclk_deep_sleep_khz != b->dcfclk_deep_sleep_khz)
|
||||||
return false;
|
return false;
|
||||||
else if (a->z9_support != b->z9_support)
|
else if (a->zstate_support != b->zstate_support)
|
||||||
return false;
|
return false;
|
||||||
else if (a->dtbclk_en != b->dtbclk_en)
|
else if (a->dtbclk_en != b->dtbclk_en)
|
||||||
return false;
|
return false;
|
||||||
@@ -592,6 +632,7 @@ void dcn31_clk_mgr_construct(
|
|||||||
clk_mgr->base.dprefclk_ss_percentage = 0;
|
clk_mgr->base.dprefclk_ss_percentage = 0;
|
||||||
clk_mgr->base.dprefclk_ss_divider = 1000;
|
clk_mgr->base.dprefclk_ss_divider = 1000;
|
||||||
clk_mgr->base.ss_on_dprefclk = false;
|
clk_mgr->base.ss_on_dprefclk = false;
|
||||||
|
clk_mgr->base.dfs_ref_freq_khz = 48000;
|
||||||
|
|
||||||
clk_mgr->smu_wm_set.wm_set = (struct dcn31_watermarks *)dm_helpers_allocate_gpu_mem(
|
clk_mgr->smu_wm_set.wm_set = (struct dcn31_watermarks *)dm_helpers_allocate_gpu_mem(
|
||||||
clk_mgr->base.base.ctx,
|
clk_mgr->base.base.ctx,
|
||||||
|
|||||||
@@ -27,60 +27,6 @@
|
|||||||
#define __DCN31_CLK_MGR_H__
|
#define __DCN31_CLK_MGR_H__
|
||||||
#include "clk_mgr_internal.h"
|
#include "clk_mgr_internal.h"
|
||||||
|
|
||||||
//CLK1_CLK_PLL_REQ
|
|
||||||
#ifndef CLK11_CLK1_CLK_PLL_REQ__FbMult_int__SHIFT
|
|
||||||
#define CLK11_CLK1_CLK_PLL_REQ__FbMult_int__SHIFT 0x0
|
|
||||||
#define CLK11_CLK1_CLK_PLL_REQ__PllSpineDiv__SHIFT 0xc
|
|
||||||
#define CLK11_CLK1_CLK_PLL_REQ__FbMult_frac__SHIFT 0x10
|
|
||||||
#define CLK11_CLK1_CLK_PLL_REQ__FbMult_int_MASK 0x000001FFL
|
|
||||||
#define CLK11_CLK1_CLK_PLL_REQ__PllSpineDiv_MASK 0x0000F000L
|
|
||||||
#define CLK11_CLK1_CLK_PLL_REQ__FbMult_frac_MASK 0xFFFF0000L
|
|
||||||
//CLK1_CLK0_DFS_CNTL
|
|
||||||
#define CLK11_CLK1_CLK0_DFS_CNTL__CLK0_DIVIDER__SHIFT 0x0
|
|
||||||
#define CLK11_CLK1_CLK0_DFS_CNTL__CLK0_DIVIDER_MASK 0x0000007FL
|
|
||||||
/*DPREF clock related*/
|
|
||||||
#define CLK0_CLK3_DFS_CNTL__CLK3_DIVIDER__SHIFT 0x0
|
|
||||||
#define CLK0_CLK3_DFS_CNTL__CLK3_DIVIDER_MASK 0x0000007FL
|
|
||||||
#define CLK1_CLK3_DFS_CNTL__CLK3_DIVIDER__SHIFT 0x0
|
|
||||||
#define CLK1_CLK3_DFS_CNTL__CLK3_DIVIDER_MASK 0x0000007FL
|
|
||||||
#define CLK2_CLK3_DFS_CNTL__CLK3_DIVIDER__SHIFT 0x0
|
|
||||||
#define CLK2_CLK3_DFS_CNTL__CLK3_DIVIDER_MASK 0x0000007FL
|
|
||||||
#define CLK3_CLK3_DFS_CNTL__CLK3_DIVIDER__SHIFT 0x0
|
|
||||||
#define CLK3_CLK3_DFS_CNTL__CLK3_DIVIDER_MASK 0x0000007FL
|
|
||||||
|
|
||||||
//CLK3_0_CLK3_CLK_PLL_REQ
|
|
||||||
#define CLK3_0_CLK3_CLK_PLL_REQ__FbMult_int__SHIFT 0x0
|
|
||||||
#define CLK3_0_CLK3_CLK_PLL_REQ__PllSpineDiv__SHIFT 0xc
|
|
||||||
#define CLK3_0_CLK3_CLK_PLL_REQ__FbMult_frac__SHIFT 0x10
|
|
||||||
#define CLK3_0_CLK3_CLK_PLL_REQ__FbMult_int_MASK 0x000001FFL
|
|
||||||
#define CLK3_0_CLK3_CLK_PLL_REQ__PllSpineDiv_MASK 0x0000F000L
|
|
||||||
#define CLK3_0_CLK3_CLK_PLL_REQ__FbMult_frac_MASK 0xFFFF0000L
|
|
||||||
|
|
||||||
#define mmCLK0_CLK3_DFS_CNTL 0x16C60
|
|
||||||
#define mmCLK00_CLK0_CLK3_DFS_CNTL 0x16C60
|
|
||||||
#define mmCLK01_CLK0_CLK3_DFS_CNTL 0x16E60
|
|
||||||
#define mmCLK02_CLK0_CLK3_DFS_CNTL 0x17060
|
|
||||||
#define mmCLK03_CLK0_CLK3_DFS_CNTL 0x17260
|
|
||||||
|
|
||||||
#define mmCLK0_CLK_PLL_REQ 0x16C10
|
|
||||||
#define mmCLK00_CLK0_CLK_PLL_REQ 0x16C10
|
|
||||||
#define mmCLK01_CLK0_CLK_PLL_REQ 0x16E10
|
|
||||||
#define mmCLK02_CLK0_CLK_PLL_REQ 0x17010
|
|
||||||
#define mmCLK03_CLK0_CLK_PLL_REQ 0x17210
|
|
||||||
|
|
||||||
#define mmCLK1_CLK_PLL_REQ 0x1B00D
|
|
||||||
#define mmCLK10_CLK1_CLK_PLL_REQ 0x1B00D
|
|
||||||
#define mmCLK11_CLK1_CLK_PLL_REQ 0x1B20D
|
|
||||||
#define mmCLK12_CLK1_CLK_PLL_REQ 0x1B40D
|
|
||||||
#define mmCLK13_CLK1_CLK_PLL_REQ 0x1B60D
|
|
||||||
|
|
||||||
#define mmCLK2_CLK_PLL_REQ 0x17E0D
|
|
||||||
|
|
||||||
/*AMCLK*/
|
|
||||||
#define mmCLK11_CLK1_CLK0_DFS_CNTL 0x1B23F
|
|
||||||
#define mmCLK11_CLK1_CLK_PLL_REQ 0x1B20D
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct dcn31_watermarks;
|
struct dcn31_watermarks;
|
||||||
|
|
||||||
struct dcn31_smu_watermark_set {
|
struct dcn31_smu_watermark_set {
|
||||||
|
|||||||
@@ -1820,8 +1820,7 @@ bool perform_link_training_with_retries(
|
|||||||
*/
|
*/
|
||||||
panel_mode = DP_PANEL_MODE_DEFAULT;
|
panel_mode = DP_PANEL_MODE_DEFAULT;
|
||||||
}
|
}
|
||||||
} else
|
}
|
||||||
panel_mode = DP_PANEL_MODE_DEFAULT;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -4650,7 +4649,10 @@ enum dp_panel_mode dp_get_panel_mode(struct dc_link *link)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (link->dpcd_caps.panel_mode_edp) {
|
if (link->dpcd_caps.panel_mode_edp &&
|
||||||
|
(link->connector_signal == SIGNAL_TYPE_EDP ||
|
||||||
|
(link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT &&
|
||||||
|
link->is_internal_display))) {
|
||||||
return DP_PANEL_MODE_EDP;
|
return DP_PANEL_MODE_EDP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4914,9 +4916,7 @@ bool dc_link_set_default_brightness_aux(struct dc_link *link)
|
|||||||
{
|
{
|
||||||
uint32_t default_backlight;
|
uint32_t default_backlight;
|
||||||
|
|
||||||
if (link &&
|
if (link && link->dpcd_sink_ext_caps.bits.oled == 1) {
|
||||||
(link->dpcd_sink_ext_caps.bits.hdr_aux_backlight_control == 1 ||
|
|
||||||
link->dpcd_sink_ext_caps.bits.sdr_aux_backlight_control == 1)) {
|
|
||||||
if (!dc_link_read_default_bl_aux(link, &default_backlight))
|
if (!dc_link_read_default_bl_aux(link, &default_backlight))
|
||||||
default_backlight = 150000;
|
default_backlight = 150000;
|
||||||
// if < 5 nits or > 5000, it might be wrong readback
|
// if < 5 nits or > 5000, it might be wrong readback
|
||||||
|
|||||||
@@ -1062,7 +1062,7 @@ bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx)
|
|||||||
* so use only 30 bpp on DCE_VERSION_11_0. Testing with DCE 11.2 and 8.3
|
* so use only 30 bpp on DCE_VERSION_11_0. Testing with DCE 11.2 and 8.3
|
||||||
* did not show such problems, so this seems to be the exception.
|
* did not show such problems, so this seems to be the exception.
|
||||||
*/
|
*/
|
||||||
if (plane_state->ctx->dce_version != DCE_VERSION_11_0)
|
if (plane_state->ctx->dce_version > DCE_VERSION_11_0)
|
||||||
pipe_ctx->plane_res.scl_data.lb_params.depth = LB_PIXEL_DEPTH_36BPP;
|
pipe_ctx->plane_res.scl_data.lb_params.depth = LB_PIXEL_DEPTH_36BPP;
|
||||||
else
|
else
|
||||||
pipe_ctx->plane_res.scl_data.lb_params.depth = LB_PIXEL_DEPTH_30BPP;
|
pipe_ctx->plane_res.scl_data.lb_params.depth = LB_PIXEL_DEPTH_30BPP;
|
||||||
|
|||||||
@@ -354,10 +354,10 @@ enum dcn_pwr_state {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
||||||
enum dcn_z9_support_state {
|
enum dcn_zstate_support_state {
|
||||||
DCN_Z9_SUPPORT_UNKNOWN,
|
DCN_ZSTATE_SUPPORT_UNKNOWN,
|
||||||
DCN_Z9_SUPPORT_ALLOW,
|
DCN_ZSTATE_SUPPORT_ALLOW,
|
||||||
DCN_Z9_SUPPORT_DISALLOW,
|
DCN_ZSTATE_SUPPORT_DISALLOW,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
@@ -378,7 +378,7 @@ struct dc_clocks {
|
|||||||
int dramclk_khz;
|
int dramclk_khz;
|
||||||
bool p_state_change_support;
|
bool p_state_change_support;
|
||||||
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
||||||
enum dcn_z9_support_state z9_support;
|
enum dcn_zstate_support_state zstate_support;
|
||||||
bool dtbclk_en;
|
bool dtbclk_en;
|
||||||
#endif
|
#endif
|
||||||
enum dcn_pwr_state pwr_state;
|
enum dcn_pwr_state pwr_state;
|
||||||
|
|||||||
@@ -636,6 +636,7 @@ struct dce_hwseq_registers {
|
|||||||
uint32_t ODM_MEM_PWR_CTRL3;
|
uint32_t ODM_MEM_PWR_CTRL3;
|
||||||
uint32_t DMU_MEM_PWR_CNTL;
|
uint32_t DMU_MEM_PWR_CNTL;
|
||||||
uint32_t MMHUBBUB_MEM_PWR_CNTL;
|
uint32_t MMHUBBUB_MEM_PWR_CNTL;
|
||||||
|
uint32_t DCHUBBUB_ARB_HOSTVM_CNTL;
|
||||||
};
|
};
|
||||||
/* set field name */
|
/* set field name */
|
||||||
#define HWS_SF(blk_name, reg_name, field_name, post_fix)\
|
#define HWS_SF(blk_name, reg_name, field_name, post_fix)\
|
||||||
@@ -1110,7 +1111,8 @@ struct dce_hwseq_registers {
|
|||||||
type DOMAIN_POWER_FORCEON;\
|
type DOMAIN_POWER_FORCEON;\
|
||||||
type DOMAIN_POWER_GATE;\
|
type DOMAIN_POWER_GATE;\
|
||||||
type DOMAIN_PGFSM_PWR_STATUS;\
|
type DOMAIN_PGFSM_PWR_STATUS;\
|
||||||
type HPO_HDMISTREAMCLK_G_GATE_DIS;
|
type HPO_HDMISTREAMCLK_G_GATE_DIS;\
|
||||||
|
type DISABLE_HOSTVM_FORCE_ALLOW_PSTATE;
|
||||||
|
|
||||||
struct dce_hwseq_shift {
|
struct dce_hwseq_shift {
|
||||||
HWSEQ_REG_FIELD_LIST(uint8_t)
|
HWSEQ_REG_FIELD_LIST(uint8_t)
|
||||||
|
|||||||
@@ -217,6 +217,8 @@ static void dpp1_dscl_set_lb(
|
|||||||
const struct line_buffer_params *lb_params,
|
const struct line_buffer_params *lb_params,
|
||||||
enum lb_memory_config mem_size_config)
|
enum lb_memory_config mem_size_config)
|
||||||
{
|
{
|
||||||
|
uint32_t max_partitions = 63; /* Currently hardcoded on all ASICs before DCN 3.2 */
|
||||||
|
|
||||||
/* LB */
|
/* LB */
|
||||||
if (dpp->base.caps->dscl_data_proc_format == DSCL_DATA_PRCESSING_FIXED_FORMAT) {
|
if (dpp->base.caps->dscl_data_proc_format == DSCL_DATA_PRCESSING_FIXED_FORMAT) {
|
||||||
/* DSCL caps: pixel data processed in fixed format */
|
/* DSCL caps: pixel data processed in fixed format */
|
||||||
@@ -239,9 +241,12 @@ static void dpp1_dscl_set_lb(
|
|||||||
LB_DATA_FORMAT__ALPHA_EN, lb_params->alpha_en); /* Alpha enable */
|
LB_DATA_FORMAT__ALPHA_EN, lb_params->alpha_en); /* Alpha enable */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dpp->base.caps->max_lb_partitions == 31)
|
||||||
|
max_partitions = 31;
|
||||||
|
|
||||||
REG_SET_2(LB_MEMORY_CTRL, 0,
|
REG_SET_2(LB_MEMORY_CTRL, 0,
|
||||||
MEMORY_CONFIG, mem_size_config,
|
MEMORY_CONFIG, mem_size_config,
|
||||||
LB_MAX_PARTITIONS, 63);
|
LB_MAX_PARTITIONS, max_partitions);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const uint16_t *dpp1_dscl_get_filter_coeffs_64p(int taps, struct fixed31_32 ratio)
|
static const uint16_t *dpp1_dscl_get_filter_coeffs_64p(int taps, struct fixed31_32 ratio)
|
||||||
|
|||||||
@@ -2093,8 +2093,10 @@ int dcn20_populate_dml_pipes_from_context(
|
|||||||
- timing->v_border_bottom;
|
- timing->v_border_bottom;
|
||||||
pipes[pipe_cnt].pipe.dest.htotal = timing->h_total;
|
pipes[pipe_cnt].pipe.dest.htotal = timing->h_total;
|
||||||
pipes[pipe_cnt].pipe.dest.vtotal = v_total;
|
pipes[pipe_cnt].pipe.dest.vtotal = v_total;
|
||||||
pipes[pipe_cnt].pipe.dest.hactive = timing->h_addressable;
|
pipes[pipe_cnt].pipe.dest.hactive =
|
||||||
pipes[pipe_cnt].pipe.dest.vactive = timing->v_addressable;
|
timing->h_addressable + timing->h_border_left + timing->h_border_right;
|
||||||
|
pipes[pipe_cnt].pipe.dest.vactive =
|
||||||
|
timing->v_addressable + timing->v_border_top + timing->v_border_bottom;
|
||||||
pipes[pipe_cnt].pipe.dest.interlaced = timing->flags.INTERLACE;
|
pipes[pipe_cnt].pipe.dest.interlaced = timing->flags.INTERLACE;
|
||||||
pipes[pipe_cnt].pipe.dest.pixel_rate_mhz = timing->pix_clk_100hz/10000.0;
|
pipes[pipe_cnt].pipe.dest.pixel_rate_mhz = timing->pix_clk_100hz/10000.0;
|
||||||
if (timing->timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
|
if (timing->timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
|
||||||
@@ -3079,6 +3081,37 @@ static bool is_dtbclk_required(struct dc *dc, struct dc_state *context)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, struct dc_state *context)
|
||||||
|
{
|
||||||
|
int plane_count;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
plane_count = 0;
|
||||||
|
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||||
|
if (context->res_ctx.pipe_ctx[i].plane_state)
|
||||||
|
plane_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Zstate is allowed in following scenarios:
|
||||||
|
* 1. Single eDP with PSR enabled
|
||||||
|
* 2. 0 planes (No memory requests)
|
||||||
|
* 3. Single eDP without PSR but > 5ms stutter period
|
||||||
|
*/
|
||||||
|
if (plane_count == 0)
|
||||||
|
return DCN_ZSTATE_SUPPORT_ALLOW;
|
||||||
|
else if (context->stream_count == 1 && context->streams[0]->signal == SIGNAL_TYPE_EDP) {
|
||||||
|
struct dc_link *link = context->streams[0]->sink->link;
|
||||||
|
|
||||||
|
if ((link->link_index == 0 && link->psr_settings.psr_feature_enabled)
|
||||||
|
|| context->bw_ctx.dml.vba.StutterPeriod > 5000.0)
|
||||||
|
return DCN_ZSTATE_SUPPORT_ALLOW;
|
||||||
|
else
|
||||||
|
return DCN_ZSTATE_SUPPORT_DISALLOW;
|
||||||
|
} else
|
||||||
|
return DCN_ZSTATE_SUPPORT_DISALLOW;
|
||||||
|
}
|
||||||
|
|
||||||
void dcn20_calculate_dlg_params(
|
void dcn20_calculate_dlg_params(
|
||||||
struct dc *dc, struct dc_state *context,
|
struct dc *dc, struct dc_state *context,
|
||||||
display_e2e_pipe_params_st *pipes,
|
display_e2e_pipe_params_st *pipes,
|
||||||
@@ -3086,7 +3119,6 @@ void dcn20_calculate_dlg_params(
|
|||||||
int vlevel)
|
int vlevel)
|
||||||
{
|
{
|
||||||
int i, pipe_idx;
|
int i, pipe_idx;
|
||||||
int plane_count;
|
|
||||||
|
|
||||||
/* Writeback MCIF_WB arbitration parameters */
|
/* Writeback MCIF_WB arbitration parameters */
|
||||||
dc->res_pool->funcs->set_mcif_arb_params(dc, context, pipes, pipe_cnt);
|
dc->res_pool->funcs->set_mcif_arb_params(dc, context, pipes, pipe_cnt);
|
||||||
@@ -3102,17 +3134,7 @@ void dcn20_calculate_dlg_params(
|
|||||||
!= dm_dram_clock_change_unsupported;
|
!= dm_dram_clock_change_unsupported;
|
||||||
context->bw_ctx.bw.dcn.clk.dppclk_khz = 0;
|
context->bw_ctx.bw.dcn.clk.dppclk_khz = 0;
|
||||||
|
|
||||||
context->bw_ctx.bw.dcn.clk.z9_support = (context->bw_ctx.dml.vba.StutterPeriod > 5000.0) ?
|
context->bw_ctx.bw.dcn.clk.zstate_support = decide_zstate_support(dc, context);
|
||||||
DCN_Z9_SUPPORT_ALLOW : DCN_Z9_SUPPORT_DISALLOW;
|
|
||||||
|
|
||||||
plane_count = 0;
|
|
||||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
|
||||||
if (context->res_ctx.pipe_ctx[i].plane_state)
|
|
||||||
plane_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (plane_count == 0)
|
|
||||||
context->bw_ctx.bw.dcn.clk.z9_support = DCN_Z9_SUPPORT_ALLOW;
|
|
||||||
|
|
||||||
context->bw_ctx.bw.dcn.clk.dtbclk_en = is_dtbclk_required(dc, context);
|
context->bw_ctx.bw.dcn.clk.dtbclk_en = is_dtbclk_required(dc, context);
|
||||||
|
|
||||||
|
|||||||
@@ -383,13 +383,6 @@ bool dpp3_get_optimal_number_of_taps(
|
|||||||
int min_taps_y, min_taps_c;
|
int min_taps_y, min_taps_c;
|
||||||
enum lb_memory_config lb_config;
|
enum lb_memory_config lb_config;
|
||||||
|
|
||||||
/* Some ASICs does not support FP16 scaling, so we reject modes require this*/
|
|
||||||
if (scl_data->viewport.width != scl_data->h_active &&
|
|
||||||
scl_data->viewport.height != scl_data->v_active &&
|
|
||||||
dpp->caps->dscl_data_proc_format == DSCL_DATA_PRCESSING_FIXED_FORMAT &&
|
|
||||||
scl_data->format == PIXEL_FORMAT_FP16)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (scl_data->viewport.width > scl_data->h_active &&
|
if (scl_data->viewport.width > scl_data->h_active &&
|
||||||
dpp->ctx->dc->debug.max_downscale_src_width != 0 &&
|
dpp->ctx->dc->debug.max_downscale_src_width != 0 &&
|
||||||
scl_data->viewport.width > dpp->ctx->dc->debug.max_downscale_src_width)
|
scl_data->viewport.width > dpp->ctx->dc->debug.max_downscale_src_width)
|
||||||
@@ -1440,15 +1433,6 @@ bool dpp3_construct(
|
|||||||
dpp->tf_shift = tf_shift;
|
dpp->tf_shift = tf_shift;
|
||||||
dpp->tf_mask = tf_mask;
|
dpp->tf_mask = tf_mask;
|
||||||
|
|
||||||
dpp->lb_pixel_depth_supported =
|
|
||||||
LB_PIXEL_DEPTH_18BPP |
|
|
||||||
LB_PIXEL_DEPTH_24BPP |
|
|
||||||
LB_PIXEL_DEPTH_30BPP |
|
|
||||||
LB_PIXEL_DEPTH_36BPP;
|
|
||||||
|
|
||||||
dpp->lb_bits_per_entry = LB_BITS_PER_ENTRY;
|
|
||||||
dpp->lb_memory_size = LB_TOTAL_NUMBER_OF_ENTRIES; /*0x1404*/
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -154,6 +154,7 @@
|
|||||||
SRI(COLOR_KEYER_BLUE, CNVC_CFG, id), \
|
SRI(COLOR_KEYER_BLUE, CNVC_CFG, id), \
|
||||||
SRI(CURSOR_CONTROL, CURSOR0_, id),\
|
SRI(CURSOR_CONTROL, CURSOR0_, id),\
|
||||||
SRI(OBUF_MEM_PWR_CTRL, DSCL, id),\
|
SRI(OBUF_MEM_PWR_CTRL, DSCL, id),\
|
||||||
|
SRI(DSCL_MEM_PWR_STATUS, DSCL, id), \
|
||||||
SRI(DSCL_MEM_PWR_CTRL, DSCL, id)
|
SRI(DSCL_MEM_PWR_CTRL, DSCL, id)
|
||||||
|
|
||||||
#define DPP_REG_LIST_DCN30(id)\
|
#define DPP_REG_LIST_DCN30(id)\
|
||||||
@@ -163,8 +164,6 @@
|
|||||||
SRI(CM_SHAPER_LUT_DATA, CM, id),\
|
SRI(CM_SHAPER_LUT_DATA, CM, id),\
|
||||||
SRI(CM_MEM_PWR_CTRL2, CM, id), \
|
SRI(CM_MEM_PWR_CTRL2, CM, id), \
|
||||||
SRI(CM_MEM_PWR_STATUS2, CM, id), \
|
SRI(CM_MEM_PWR_STATUS2, CM, id), \
|
||||||
SRI(DSCL_MEM_PWR_STATUS, DSCL, id), \
|
|
||||||
SRI(DSCL_MEM_PWR_CTRL, DSCL, id), \
|
|
||||||
SRI(CM_BLNDGAM_RAMA_START_SLOPE_CNTL_B, CM, id),\
|
SRI(CM_BLNDGAM_RAMA_START_SLOPE_CNTL_B, CM, id),\
|
||||||
SRI(CM_BLNDGAM_RAMA_START_SLOPE_CNTL_G, CM, id),\
|
SRI(CM_BLNDGAM_RAMA_START_SLOPE_CNTL_G, CM, id),\
|
||||||
SRI(CM_BLNDGAM_RAMA_START_SLOPE_CNTL_R, CM, id),\
|
SRI(CM_BLNDGAM_RAMA_START_SLOPE_CNTL_R, CM, id),\
|
||||||
|
|||||||
@@ -1398,11 +1398,18 @@ void dcn302_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_param
|
|||||||
dcn3_02_soc.clock_limits[i].dispclk_mhz = max_dispclk_mhz;
|
dcn3_02_soc.clock_limits[i].dispclk_mhz = max_dispclk_mhz;
|
||||||
dcn3_02_soc.clock_limits[i].dppclk_mhz = max_dppclk_mhz;
|
dcn3_02_soc.clock_limits[i].dppclk_mhz = max_dppclk_mhz;
|
||||||
dcn3_02_soc.clock_limits[i].phyclk_mhz = max_phyclk_mhz;
|
dcn3_02_soc.clock_limits[i].phyclk_mhz = max_phyclk_mhz;
|
||||||
dcn3_02_soc.clock_limits[i].dtbclk_mhz = dcn3_02_soc.clock_limits[0].dtbclk_mhz;
|
/* Populate from bw_params for DTBCLK, SOCCLK */
|
||||||
|
if (!bw_params->clk_table.entries[i].dtbclk_mhz && i > 0)
|
||||||
|
dcn3_02_soc.clock_limits[i].dtbclk_mhz = dcn3_02_soc.clock_limits[i-1].dtbclk_mhz;
|
||||||
|
else
|
||||||
|
dcn3_02_soc.clock_limits[i].dtbclk_mhz = bw_params->clk_table.entries[i].dtbclk_mhz;
|
||||||
|
if (!bw_params->clk_table.entries[i].socclk_mhz && i > 0)
|
||||||
|
dcn3_02_soc.clock_limits[i].socclk_mhz = dcn3_02_soc.clock_limits[i-1].socclk_mhz;
|
||||||
|
else
|
||||||
|
dcn3_02_soc.clock_limits[i].socclk_mhz = bw_params->clk_table.entries[i].socclk_mhz;
|
||||||
/* These clocks cannot come from bw_params, always fill from dcn3_02_soc[1] */
|
/* These clocks cannot come from bw_params, always fill from dcn3_02_soc[1] */
|
||||||
/* FCLK, PHYCLK_D18, SOCCLK, DSCCLK */
|
/* FCLK, PHYCLK_D18, DSCCLK */
|
||||||
dcn3_02_soc.clock_limits[i].phyclk_d18_mhz = dcn3_02_soc.clock_limits[0].phyclk_d18_mhz;
|
dcn3_02_soc.clock_limits[i].phyclk_d18_mhz = dcn3_02_soc.clock_limits[0].phyclk_d18_mhz;
|
||||||
dcn3_02_soc.clock_limits[i].socclk_mhz = dcn3_02_soc.clock_limits[0].socclk_mhz;
|
|
||||||
dcn3_02_soc.clock_limits[i].dscclk_mhz = dcn3_02_soc.clock_limits[0].dscclk_mhz;
|
dcn3_02_soc.clock_limits[i].dscclk_mhz = dcn3_02_soc.clock_limits[0].dscclk_mhz;
|
||||||
}
|
}
|
||||||
/* re-init DML with updated bb */
|
/* re-init DML with updated bb */
|
||||||
|
|||||||
@@ -1326,11 +1326,18 @@ void dcn303_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_param
|
|||||||
dcn3_03_soc.clock_limits[i].dispclk_mhz = max_dispclk_mhz;
|
dcn3_03_soc.clock_limits[i].dispclk_mhz = max_dispclk_mhz;
|
||||||
dcn3_03_soc.clock_limits[i].dppclk_mhz = max_dppclk_mhz;
|
dcn3_03_soc.clock_limits[i].dppclk_mhz = max_dppclk_mhz;
|
||||||
dcn3_03_soc.clock_limits[i].phyclk_mhz = max_phyclk_mhz;
|
dcn3_03_soc.clock_limits[i].phyclk_mhz = max_phyclk_mhz;
|
||||||
dcn3_03_soc.clock_limits[i].dtbclk_mhz = dcn3_03_soc.clock_limits[0].dtbclk_mhz;
|
/* Populate from bw_params for DTBCLK, SOCCLK */
|
||||||
|
if (!bw_params->clk_table.entries[i].dtbclk_mhz && i > 0)
|
||||||
|
dcn3_03_soc.clock_limits[i].dtbclk_mhz = dcn3_03_soc.clock_limits[i-1].dtbclk_mhz;
|
||||||
|
else
|
||||||
|
dcn3_03_soc.clock_limits[i].dtbclk_mhz = bw_params->clk_table.entries[i].dtbclk_mhz;
|
||||||
|
if (!bw_params->clk_table.entries[i].socclk_mhz && i > 0)
|
||||||
|
dcn3_03_soc.clock_limits[i].socclk_mhz = dcn3_03_soc.clock_limits[i-1].socclk_mhz;
|
||||||
|
else
|
||||||
|
dcn3_03_soc.clock_limits[i].socclk_mhz = bw_params->clk_table.entries[i].socclk_mhz;
|
||||||
/* These clocks cannot come from bw_params, always fill from dcn3_03_soc[1] */
|
/* These clocks cannot come from bw_params, always fill from dcn3_03_soc[1] */
|
||||||
/* FCLK, PHYCLK_D18, SOCCLK, DSCCLK */
|
/* FCLK, PHYCLK_D18, DSCCLK */
|
||||||
dcn3_03_soc.clock_limits[i].phyclk_d18_mhz = dcn3_03_soc.clock_limits[0].phyclk_d18_mhz;
|
dcn3_03_soc.clock_limits[i].phyclk_d18_mhz = dcn3_03_soc.clock_limits[0].phyclk_d18_mhz;
|
||||||
dcn3_03_soc.clock_limits[i].socclk_mhz = dcn3_03_soc.clock_limits[0].socclk_mhz;
|
|
||||||
dcn3_03_soc.clock_limits[i].dscclk_mhz = dcn3_03_soc.clock_limits[0].dscclk_mhz;
|
dcn3_03_soc.clock_limits[i].dscclk_mhz = dcn3_03_soc.clock_limits[0].dscclk_mhz;
|
||||||
}
|
}
|
||||||
/* re-init DML with updated bb */
|
/* re-init DML with updated bb */
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
#include "dce/dmub_outbox.h"
|
#include "dce/dmub_outbox.h"
|
||||||
#include "dc_link_dp.h"
|
#include "dc_link_dp.h"
|
||||||
#include "inc/link_dpcd.h"
|
#include "inc/link_dpcd.h"
|
||||||
|
#include "dcn10/dcn10_hw_sequencer.h"
|
||||||
|
|
||||||
#define DC_LOGGER_INIT(logger)
|
#define DC_LOGGER_INIT(logger)
|
||||||
|
|
||||||
@@ -594,3 +595,20 @@ bool dcn31_is_abm_supported(struct dc *dc,
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void apply_riommu_invalidation_wa(struct dc *dc)
|
||||||
|
{
|
||||||
|
struct dce_hwseq *hws = dc->hwseq;
|
||||||
|
|
||||||
|
if (!hws->wa.early_riommu_invalidation)
|
||||||
|
return;
|
||||||
|
|
||||||
|
REG_UPDATE(DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dcn31_init_pipes(struct dc *dc, struct dc_state *context)
|
||||||
|
{
|
||||||
|
dcn10_init_pipes(dc, context);
|
||||||
|
apply_riommu_invalidation_wa(dc);
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -52,5 +52,6 @@ void dcn31_reset_hw_ctx_wrap(
|
|||||||
struct dc_state *context);
|
struct dc_state *context);
|
||||||
bool dcn31_is_abm_supported(struct dc *dc,
|
bool dcn31_is_abm_supported(struct dc *dc,
|
||||||
struct dc_state *context, struct dc_stream_state *stream);
|
struct dc_state *context, struct dc_stream_state *stream);
|
||||||
|
void dcn31_init_pipes(struct dc *dc, struct dc_state *context);
|
||||||
|
|
||||||
#endif /* __DC_HWSS_DCN31_H__ */
|
#endif /* __DC_HWSS_DCN31_H__ */
|
||||||
|
|||||||
@@ -93,7 +93,6 @@ static const struct hw_sequencer_funcs dcn31_funcs = {
|
|||||||
.set_flip_control_gsl = dcn20_set_flip_control_gsl,
|
.set_flip_control_gsl = dcn20_set_flip_control_gsl,
|
||||||
.get_vupdate_offset_from_vsync = dcn10_get_vupdate_offset_from_vsync,
|
.get_vupdate_offset_from_vsync = dcn10_get_vupdate_offset_from_vsync,
|
||||||
.calc_vupdate_position = dcn10_calc_vupdate_position,
|
.calc_vupdate_position = dcn10_calc_vupdate_position,
|
||||||
.apply_idle_power_optimizations = dcn30_apply_idle_power_optimizations,
|
|
||||||
.set_backlight_level = dcn21_set_backlight_level,
|
.set_backlight_level = dcn21_set_backlight_level,
|
||||||
.set_abm_immediate_disable = dcn21_set_abm_immediate_disable,
|
.set_abm_immediate_disable = dcn21_set_abm_immediate_disable,
|
||||||
.set_pipe = dcn21_set_pipe,
|
.set_pipe = dcn21_set_pipe,
|
||||||
@@ -104,7 +103,7 @@ static const struct hw_sequencer_funcs dcn31_funcs = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct hwseq_private_funcs dcn31_private_funcs = {
|
static const struct hwseq_private_funcs dcn31_private_funcs = {
|
||||||
.init_pipes = dcn10_init_pipes,
|
.init_pipes = dcn31_init_pipes,
|
||||||
.update_plane_addr = dcn20_update_plane_addr,
|
.update_plane_addr = dcn20_update_plane_addr,
|
||||||
.plane_atomic_disconnect = dcn10_plane_atomic_disconnect,
|
.plane_atomic_disconnect = dcn10_plane_atomic_disconnect,
|
||||||
.update_mpcc = dcn20_update_mpcc,
|
.update_mpcc = dcn20_update_mpcc,
|
||||||
|
|||||||
@@ -220,6 +220,7 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_1_soc = {
|
|||||||
.sr_exit_z8_time_us = 402.0,
|
.sr_exit_z8_time_us = 402.0,
|
||||||
.sr_enter_plus_exit_z8_time_us = 520.0,
|
.sr_enter_plus_exit_z8_time_us = 520.0,
|
||||||
.writeback_latency_us = 12.0,
|
.writeback_latency_us = 12.0,
|
||||||
|
.dram_channel_width_bytes = 4,
|
||||||
.round_trip_ping_latency_dcfclk_cycles = 106,
|
.round_trip_ping_latency_dcfclk_cycles = 106,
|
||||||
.urgent_latency_pixel_data_only_us = 4.0,
|
.urgent_latency_pixel_data_only_us = 4.0,
|
||||||
.urgent_latency_pixel_mixed_with_vm_data_us = 4.0,
|
.urgent_latency_pixel_mixed_with_vm_data_us = 4.0,
|
||||||
@@ -741,6 +742,7 @@ static const struct dccg_mask dccg_mask = {
|
|||||||
|
|
||||||
#define HWSEQ_DCN31_REG_LIST()\
|
#define HWSEQ_DCN31_REG_LIST()\
|
||||||
SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
|
SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
|
||||||
|
SR(DCHUBBUB_ARB_HOSTVM_CNTL), \
|
||||||
SR(DIO_MEM_PWR_CTRL), \
|
SR(DIO_MEM_PWR_CTRL), \
|
||||||
SR(ODM_MEM_PWR_CTRL3), \
|
SR(ODM_MEM_PWR_CTRL3), \
|
||||||
SR(DMU_MEM_PWR_CNTL), \
|
SR(DMU_MEM_PWR_CNTL), \
|
||||||
@@ -801,6 +803,7 @@ static const struct dce_hwseq_registers hwseq_reg = {
|
|||||||
#define HWSEQ_DCN31_MASK_SH_LIST(mask_sh)\
|
#define HWSEQ_DCN31_MASK_SH_LIST(mask_sh)\
|
||||||
HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
|
HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
|
||||||
HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
|
HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
|
||||||
|
HWS_SF(, DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, mask_sh), \
|
||||||
HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
|
HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
|
||||||
HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
|
HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
|
||||||
HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
|
HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
|
||||||
@@ -1299,6 +1302,7 @@ static struct dce_hwseq *dcn31_hwseq_create(
|
|||||||
hws->regs = &hwseq_reg;
|
hws->regs = &hwseq_reg;
|
||||||
hws->shifts = &hwseq_shift;
|
hws->shifts = &hwseq_shift;
|
||||||
hws->masks = &hwseq_mask;
|
hws->masks = &hwseq_mask;
|
||||||
|
hws->wa.early_riommu_invalidation = true;
|
||||||
}
|
}
|
||||||
return hws;
|
return hws;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4889,7 +4889,7 @@ void dml21_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
|
|||||||
}
|
}
|
||||||
} while ((locals->PrefetchSupported[i][j] != true || locals->VRatioInPrefetchSupported[i][j] != true)
|
} while ((locals->PrefetchSupported[i][j] != true || locals->VRatioInPrefetchSupported[i][j] != true)
|
||||||
&& (mode_lib->vba.NextMaxVStartup != mode_lib->vba.MaxMaxVStartup[0][0]
|
&& (mode_lib->vba.NextMaxVStartup != mode_lib->vba.MaxMaxVStartup[0][0]
|
||||||
|| mode_lib->vba.NextPrefetchMode < mode_lib->vba.MaxPrefetchMode));
|
|| mode_lib->vba.NextPrefetchMode <= mode_lib->vba.MaxPrefetchMode));
|
||||||
|
|
||||||
if (locals->PrefetchSupported[i][j] == true && locals->VRatioInPrefetchSupported[i][j] == true) {
|
if (locals->PrefetchSupported[i][j] == true && locals->VRatioInPrefetchSupported[i][j] == true) {
|
||||||
mode_lib->vba.BandwidthAvailableForImmediateFlip = locals->ReturnBWPerState[i][0];
|
mode_lib->vba.BandwidthAvailableForImmediateFlip = locals->ReturnBWPerState[i][0];
|
||||||
|
|||||||
@@ -289,6 +289,9 @@ struct dpp_caps {
|
|||||||
/* DSCL processing pixel data in fixed or float format */
|
/* DSCL processing pixel data in fixed or float format */
|
||||||
enum dscl_data_processing_format dscl_data_proc_format;
|
enum dscl_data_processing_format dscl_data_proc_format;
|
||||||
|
|
||||||
|
/* max LB partitions */
|
||||||
|
unsigned int max_lb_partitions;
|
||||||
|
|
||||||
/* Calculates the number of partitions in the line buffer.
|
/* Calculates the number of partitions in the line buffer.
|
||||||
* The implementation of this function is overloaded for
|
* The implementation of this function is overloaded for
|
||||||
* different versions of DSCL LB.
|
* different versions of DSCL LB.
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ struct dce_hwseq_wa {
|
|||||||
bool DEGVIDCN10_254;
|
bool DEGVIDCN10_254;
|
||||||
bool DEGVIDCN21;
|
bool DEGVIDCN21;
|
||||||
bool disallow_self_refresh_during_multi_plane_transition;
|
bool disallow_self_refresh_during_multi_plane_transition;
|
||||||
|
bool early_riommu_invalidation;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct hwseq_wa_state {
|
struct hwseq_wa_state {
|
||||||
|
|||||||
@@ -101,7 +101,8 @@
|
|||||||
#define PPSMC_MSG_SetSystemVirtualSTBtoDramAddrLow 0x41
|
#define PPSMC_MSG_SetSystemVirtualSTBtoDramAddrLow 0x41
|
||||||
|
|
||||||
#define PPSMC_MSG_GfxDriverResetRecovery 0x42
|
#define PPSMC_MSG_GfxDriverResetRecovery 0x42
|
||||||
#define PPSMC_Message_Count 0x43
|
#define PPSMC_MSG_BoardPowerCalibration 0x43
|
||||||
|
#define PPSMC_Message_Count 0x44
|
||||||
|
|
||||||
//PPSMC Reset Types
|
//PPSMC Reset Types
|
||||||
#define PPSMC_RESET_TYPE_WARM_RESET 0x00
|
#define PPSMC_RESET_TYPE_WARM_RESET 0x00
|
||||||
|
|||||||
@@ -225,7 +225,8 @@
|
|||||||
__SMU_DUMMY_MAP(DisableDeterminism), \
|
__SMU_DUMMY_MAP(DisableDeterminism), \
|
||||||
__SMU_DUMMY_MAP(SetUclkDpmMode), \
|
__SMU_DUMMY_MAP(SetUclkDpmMode), \
|
||||||
__SMU_DUMMY_MAP(LightSBR), \
|
__SMU_DUMMY_MAP(LightSBR), \
|
||||||
__SMU_DUMMY_MAP(GfxDriverResetRecovery),
|
__SMU_DUMMY_MAP(GfxDriverResetRecovery), \
|
||||||
|
__SMU_DUMMY_MAP(BoardPowerCalibration),
|
||||||
|
|
||||||
#undef __SMU_DUMMY_MAP
|
#undef __SMU_DUMMY_MAP
|
||||||
#define __SMU_DUMMY_MAP(type) SMU_MSG_##type
|
#define __SMU_DUMMY_MAP(type) SMU_MSG_##type
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#define SMU11_DRIVER_IF_VERSION_Navy_Flounder 0xE
|
#define SMU11_DRIVER_IF_VERSION_Navy_Flounder 0xE
|
||||||
#define SMU11_DRIVER_IF_VERSION_VANGOGH 0x03
|
#define SMU11_DRIVER_IF_VERSION_VANGOGH 0x03
|
||||||
#define SMU11_DRIVER_IF_VERSION_Dimgrey_Cavefish 0xF
|
#define SMU11_DRIVER_IF_VERSION_Dimgrey_Cavefish 0xF
|
||||||
#define SMU11_DRIVER_IF_VERSION_Beige_Goby 0x9
|
#define SMU11_DRIVER_IF_VERSION_Beige_Goby 0xD
|
||||||
|
|
||||||
/* MP Apertures */
|
/* MP Apertures */
|
||||||
#define MP0_Public 0x03800000
|
#define MP0_Public 0x03800000
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ static const struct cmn2asic_msg_mapping aldebaran_message_map[SMU_MSG_MAX_COUNT
|
|||||||
MSG_MAP(DisableDeterminism, PPSMC_MSG_DisableDeterminism, 0),
|
MSG_MAP(DisableDeterminism, PPSMC_MSG_DisableDeterminism, 0),
|
||||||
MSG_MAP(SetUclkDpmMode, PPSMC_MSG_SetUclkDpmMode, 0),
|
MSG_MAP(SetUclkDpmMode, PPSMC_MSG_SetUclkDpmMode, 0),
|
||||||
MSG_MAP(GfxDriverResetRecovery, PPSMC_MSG_GfxDriverResetRecovery, 0),
|
MSG_MAP(GfxDriverResetRecovery, PPSMC_MSG_GfxDriverResetRecovery, 0),
|
||||||
|
MSG_MAP(BoardPowerCalibration, PPSMC_MSG_BoardPowerCalibration, 0),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct cmn2asic_mapping aldebaran_clk_map[SMU_CLK_COUNT] = {
|
static const struct cmn2asic_mapping aldebaran_clk_map[SMU_CLK_COUNT] = {
|
||||||
@@ -440,6 +441,39 @@ static int aldebaran_setup_pptable(struct smu_context *smu)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool aldebaran_is_primary(struct smu_context *smu)
|
||||||
|
{
|
||||||
|
struct amdgpu_device *adev = smu->adev;
|
||||||
|
|
||||||
|
if (adev->smuio.funcs && adev->smuio.funcs->get_die_id)
|
||||||
|
return adev->smuio.funcs->get_die_id(adev) == 0;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int aldebaran_run_board_btc(struct smu_context *smu)
|
||||||
|
{
|
||||||
|
u32 smu_version;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!aldebaran_is_primary(smu))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret = smu_cmn_get_smc_version(smu, NULL, &smu_version);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(smu->adev->dev, "Failed to get smu version!\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
if (smu_version <= 0x00441d00)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret = smu_cmn_send_smc_msg(smu, SMU_MSG_BoardPowerCalibration, NULL);
|
||||||
|
if (ret)
|
||||||
|
dev_err(smu->adev->dev, "Board power calibration failed!\n");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int aldebaran_run_btc(struct smu_context *smu)
|
static int aldebaran_run_btc(struct smu_context *smu)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@@ -447,6 +481,8 @@ static int aldebaran_run_btc(struct smu_context *smu)
|
|||||||
ret = smu_cmn_send_smc_msg(smu, SMU_MSG_RunDcBtc, NULL);
|
ret = smu_cmn_send_smc_msg(smu, SMU_MSG_RunDcBtc, NULL);
|
||||||
if (ret)
|
if (ret)
|
||||||
dev_err(smu->adev->dev, "RunDcBtc failed!\n");
|
dev_err(smu->adev->dev, "RunDcBtc failed!\n");
|
||||||
|
else
|
||||||
|
ret = aldebaran_run_board_btc(smu);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -524,16 +560,6 @@ static int aldebaran_freqs_in_same_level(int32_t frequency1,
|
|||||||
return (abs(frequency1 - frequency2) <= EPSILON);
|
return (abs(frequency1 - frequency2) <= EPSILON);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool aldebaran_is_primary(struct smu_context *smu)
|
|
||||||
{
|
|
||||||
struct amdgpu_device *adev = smu->adev;
|
|
||||||
|
|
||||||
if (adev->smuio.funcs && adev->smuio.funcs->get_die_id)
|
|
||||||
return adev->smuio.funcs->get_die_id(adev) == 0;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int aldebaran_get_smu_metrics_data(struct smu_context *smu,
|
static int aldebaran_get_smu_metrics_data(struct smu_context *smu,
|
||||||
MetricsMember_t member,
|
MetricsMember_t member,
|
||||||
uint32_t *value)
|
uint32_t *value)
|
||||||
|
|||||||
@@ -834,6 +834,9 @@ long drm_ioctl(struct file *filp,
|
|||||||
if (drm_dev_is_unplugged(dev))
|
if (drm_dev_is_unplugged(dev))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
if (DRM_IOCTL_TYPE(cmd) != DRM_IOCTL_BASE)
|
||||||
|
return -ENOTTY;
|
||||||
|
|
||||||
is_driver_ioctl = nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END;
|
is_driver_ioctl = nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END;
|
||||||
|
|
||||||
if (is_driver_ioctl) {
|
if (is_driver_ioctl) {
|
||||||
|
|||||||
@@ -25,10 +25,8 @@
|
|||||||
#include "i915_gem_clflush.h"
|
#include "i915_gem_clflush.h"
|
||||||
#include "i915_gem_context.h"
|
#include "i915_gem_context.h"
|
||||||
#include "i915_gem_ioctls.h"
|
#include "i915_gem_ioctls.h"
|
||||||
#include "i915_sw_fence_work.h"
|
|
||||||
#include "i915_trace.h"
|
#include "i915_trace.h"
|
||||||
#include "i915_user_extensions.h"
|
#include "i915_user_extensions.h"
|
||||||
#include "i915_memcpy.h"
|
|
||||||
|
|
||||||
struct eb_vma {
|
struct eb_vma {
|
||||||
struct i915_vma *vma;
|
struct i915_vma *vma;
|
||||||
@@ -1456,6 +1454,10 @@ static u32 *reloc_gpu(struct i915_execbuffer *eb,
|
|||||||
int err;
|
int err;
|
||||||
struct intel_engine_cs *engine = eb->engine;
|
struct intel_engine_cs *engine = eb->engine;
|
||||||
|
|
||||||
|
/* If we need to copy for the cmdparser, we will stall anyway */
|
||||||
|
if (eb_use_cmdparser(eb))
|
||||||
|
return ERR_PTR(-EWOULDBLOCK);
|
||||||
|
|
||||||
if (!reloc_can_use_engine(engine)) {
|
if (!reloc_can_use_engine(engine)) {
|
||||||
engine = engine->gt->engine_class[COPY_ENGINE_CLASS][0];
|
engine = engine->gt->engine_class[COPY_ENGINE_CLASS][0];
|
||||||
if (!engine)
|
if (!engine)
|
||||||
@@ -2372,217 +2374,6 @@ shadow_batch_pin(struct i915_execbuffer *eb,
|
|||||||
return vma;
|
return vma;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct eb_parse_work {
|
|
||||||
struct dma_fence_work base;
|
|
||||||
struct intel_engine_cs *engine;
|
|
||||||
struct i915_vma *batch;
|
|
||||||
struct i915_vma *shadow;
|
|
||||||
struct i915_vma *trampoline;
|
|
||||||
unsigned long batch_offset;
|
|
||||||
unsigned long batch_length;
|
|
||||||
unsigned long *jump_whitelist;
|
|
||||||
const void *batch_map;
|
|
||||||
void *shadow_map;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __eb_parse(struct dma_fence_work *work)
|
|
||||||
{
|
|
||||||
struct eb_parse_work *pw = container_of(work, typeof(*pw), base);
|
|
||||||
int ret;
|
|
||||||
bool cookie;
|
|
||||||
|
|
||||||
cookie = dma_fence_begin_signalling();
|
|
||||||
ret = intel_engine_cmd_parser(pw->engine,
|
|
||||||
pw->batch,
|
|
||||||
pw->batch_offset,
|
|
||||||
pw->batch_length,
|
|
||||||
pw->shadow,
|
|
||||||
pw->jump_whitelist,
|
|
||||||
pw->shadow_map,
|
|
||||||
pw->batch_map);
|
|
||||||
dma_fence_end_signalling(cookie);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __eb_parse_release(struct dma_fence_work *work)
|
|
||||||
{
|
|
||||||
struct eb_parse_work *pw = container_of(work, typeof(*pw), base);
|
|
||||||
|
|
||||||
if (!IS_ERR_OR_NULL(pw->jump_whitelist))
|
|
||||||
kfree(pw->jump_whitelist);
|
|
||||||
|
|
||||||
if (pw->batch_map)
|
|
||||||
i915_gem_object_unpin_map(pw->batch->obj);
|
|
||||||
else
|
|
||||||
i915_gem_object_unpin_pages(pw->batch->obj);
|
|
||||||
|
|
||||||
i915_gem_object_unpin_map(pw->shadow->obj);
|
|
||||||
|
|
||||||
if (pw->trampoline)
|
|
||||||
i915_active_release(&pw->trampoline->active);
|
|
||||||
i915_active_release(&pw->shadow->active);
|
|
||||||
i915_active_release(&pw->batch->active);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct dma_fence_work_ops eb_parse_ops = {
|
|
||||||
.name = "eb_parse",
|
|
||||||
.work = __eb_parse,
|
|
||||||
.release = __eb_parse_release,
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__parser_mark_active(struct i915_vma *vma,
|
|
||||||
struct intel_timeline *tl,
|
|
||||||
struct dma_fence *fence)
|
|
||||||
{
|
|
||||||
struct intel_gt_buffer_pool_node *node = vma->private;
|
|
||||||
|
|
||||||
return i915_active_ref(&node->active, tl->fence_context, fence);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
parser_mark_active(struct eb_parse_work *pw, struct intel_timeline *tl)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
mutex_lock(&tl->mutex);
|
|
||||||
|
|
||||||
err = __parser_mark_active(pw->shadow, tl, &pw->base.dma);
|
|
||||||
if (err)
|
|
||||||
goto unlock;
|
|
||||||
|
|
||||||
if (pw->trampoline) {
|
|
||||||
err = __parser_mark_active(pw->trampoline, tl, &pw->base.dma);
|
|
||||||
if (err)
|
|
||||||
goto unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
unlock:
|
|
||||||
mutex_unlock(&tl->mutex);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int eb_parse_pipeline(struct i915_execbuffer *eb,
|
|
||||||
struct i915_vma *shadow,
|
|
||||||
struct i915_vma *trampoline)
|
|
||||||
{
|
|
||||||
struct eb_parse_work *pw;
|
|
||||||
struct drm_i915_gem_object *batch = eb->batch->vma->obj;
|
|
||||||
bool needs_clflush;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
GEM_BUG_ON(overflows_type(eb->batch_start_offset, pw->batch_offset));
|
|
||||||
GEM_BUG_ON(overflows_type(eb->batch_len, pw->batch_length));
|
|
||||||
|
|
||||||
pw = kzalloc(sizeof(*pw), GFP_KERNEL);
|
|
||||||
if (!pw)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
err = i915_active_acquire(&eb->batch->vma->active);
|
|
||||||
if (err)
|
|
||||||
goto err_free;
|
|
||||||
|
|
||||||
err = i915_active_acquire(&shadow->active);
|
|
||||||
if (err)
|
|
||||||
goto err_batch;
|
|
||||||
|
|
||||||
if (trampoline) {
|
|
||||||
err = i915_active_acquire(&trampoline->active);
|
|
||||||
if (err)
|
|
||||||
goto err_shadow;
|
|
||||||
}
|
|
||||||
|
|
||||||
pw->shadow_map = i915_gem_object_pin_map(shadow->obj, I915_MAP_WB);
|
|
||||||
if (IS_ERR(pw->shadow_map)) {
|
|
||||||
err = PTR_ERR(pw->shadow_map);
|
|
||||||
goto err_trampoline;
|
|
||||||
}
|
|
||||||
|
|
||||||
needs_clflush =
|
|
||||||
!(batch->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ);
|
|
||||||
|
|
||||||
pw->batch_map = ERR_PTR(-ENODEV);
|
|
||||||
if (needs_clflush && i915_has_memcpy_from_wc())
|
|
||||||
pw->batch_map = i915_gem_object_pin_map(batch, I915_MAP_WC);
|
|
||||||
|
|
||||||
if (IS_ERR(pw->batch_map)) {
|
|
||||||
err = i915_gem_object_pin_pages(batch);
|
|
||||||
if (err)
|
|
||||||
goto err_unmap_shadow;
|
|
||||||
pw->batch_map = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
pw->jump_whitelist =
|
|
||||||
intel_engine_cmd_parser_alloc_jump_whitelist(eb->batch_len,
|
|
||||||
trampoline);
|
|
||||||
if (IS_ERR(pw->jump_whitelist)) {
|
|
||||||
err = PTR_ERR(pw->jump_whitelist);
|
|
||||||
goto err_unmap_batch;
|
|
||||||
}
|
|
||||||
|
|
||||||
dma_fence_work_init(&pw->base, &eb_parse_ops);
|
|
||||||
|
|
||||||
pw->engine = eb->engine;
|
|
||||||
pw->batch = eb->batch->vma;
|
|
||||||
pw->batch_offset = eb->batch_start_offset;
|
|
||||||
pw->batch_length = eb->batch_len;
|
|
||||||
pw->shadow = shadow;
|
|
||||||
pw->trampoline = trampoline;
|
|
||||||
|
|
||||||
/* Mark active refs early for this worker, in case we get interrupted */
|
|
||||||
err = parser_mark_active(pw, eb->context->timeline);
|
|
||||||
if (err)
|
|
||||||
goto err_commit;
|
|
||||||
|
|
||||||
err = dma_resv_reserve_shared(pw->batch->resv, 1);
|
|
||||||
if (err)
|
|
||||||
goto err_commit;
|
|
||||||
|
|
||||||
err = dma_resv_reserve_shared(shadow->resv, 1);
|
|
||||||
if (err)
|
|
||||||
goto err_commit;
|
|
||||||
|
|
||||||
/* Wait for all writes (and relocs) into the batch to complete */
|
|
||||||
err = i915_sw_fence_await_reservation(&pw->base.chain,
|
|
||||||
pw->batch->resv, NULL, false,
|
|
||||||
0, I915_FENCE_GFP);
|
|
||||||
if (err < 0)
|
|
||||||
goto err_commit;
|
|
||||||
|
|
||||||
/* Keep the batch alive and unwritten as we parse */
|
|
||||||
dma_resv_add_shared_fence(pw->batch->resv, &pw->base.dma);
|
|
||||||
|
|
||||||
/* Force execution to wait for completion of the parser */
|
|
||||||
dma_resv_add_excl_fence(shadow->resv, &pw->base.dma);
|
|
||||||
|
|
||||||
dma_fence_work_commit_imm(&pw->base);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
err_commit:
|
|
||||||
i915_sw_fence_set_error_once(&pw->base.chain, err);
|
|
||||||
dma_fence_work_commit_imm(&pw->base);
|
|
||||||
return err;
|
|
||||||
|
|
||||||
err_unmap_batch:
|
|
||||||
if (pw->batch_map)
|
|
||||||
i915_gem_object_unpin_map(batch);
|
|
||||||
else
|
|
||||||
i915_gem_object_unpin_pages(batch);
|
|
||||||
err_unmap_shadow:
|
|
||||||
i915_gem_object_unpin_map(shadow->obj);
|
|
||||||
err_trampoline:
|
|
||||||
if (trampoline)
|
|
||||||
i915_active_release(&trampoline->active);
|
|
||||||
err_shadow:
|
|
||||||
i915_active_release(&shadow->active);
|
|
||||||
err_batch:
|
|
||||||
i915_active_release(&eb->batch->vma->active);
|
|
||||||
err_free:
|
|
||||||
kfree(pw);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct i915_vma *eb_dispatch_secure(struct i915_execbuffer *eb, struct i915_vma *vma)
|
static struct i915_vma *eb_dispatch_secure(struct i915_execbuffer *eb, struct i915_vma *vma)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@@ -2672,7 +2463,15 @@ static int eb_parse(struct i915_execbuffer *eb)
|
|||||||
goto err_trampoline;
|
goto err_trampoline;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = eb_parse_pipeline(eb, shadow, trampoline);
|
err = dma_resv_reserve_shared(shadow->resv, 1);
|
||||||
|
if (err)
|
||||||
|
goto err_trampoline;
|
||||||
|
|
||||||
|
err = intel_engine_cmd_parser(eb->engine,
|
||||||
|
eb->batch->vma,
|
||||||
|
eb->batch_start_offset,
|
||||||
|
eb->batch_len,
|
||||||
|
shadow, trampoline);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_unpin_batch;
|
goto err_unpin_batch;
|
||||||
|
|
||||||
|
|||||||
@@ -125,6 +125,10 @@ static int igt_gpu_reloc(void *arg)
|
|||||||
intel_gt_pm_get(&eb.i915->gt);
|
intel_gt_pm_get(&eb.i915->gt);
|
||||||
|
|
||||||
for_each_uabi_engine(eb.engine, eb.i915) {
|
for_each_uabi_engine(eb.engine, eb.i915) {
|
||||||
|
if (intel_engine_requires_cmd_parser(eb.engine) ||
|
||||||
|
intel_engine_using_cmd_parser(eb.engine))
|
||||||
|
continue;
|
||||||
|
|
||||||
reloc_cache_init(&eb.reloc_cache, eb.i915);
|
reloc_cache_init(&eb.reloc_cache, eb.i915);
|
||||||
memset(map, POISON_INUSE, 4096);
|
memset(map, POISON_INUSE, 4096);
|
||||||
|
|
||||||
|
|||||||
@@ -1977,6 +1977,21 @@ static int elsp_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
|
|||||||
if (drm_WARN_ON(&i915->drm, !engine))
|
if (drm_WARN_ON(&i915->drm, !engine))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Due to d3_entered is used to indicate skipping PPGTT invalidation on
|
||||||
|
* vGPU reset, it's set on D0->D3 on PCI config write, and cleared after
|
||||||
|
* vGPU reset if in resuming.
|
||||||
|
* In S0ix exit, the device power state also transite from D3 to D0 as
|
||||||
|
* S3 resume, but no vGPU reset (triggered by QEMU devic model). After
|
||||||
|
* S0ix exit, all engines continue to work. However the d3_entered
|
||||||
|
* remains set which will break next vGPU reset logic (miss the expected
|
||||||
|
* PPGTT invalidation).
|
||||||
|
* Engines can only work in D0. Thus the 1st elsp write gives GVT a
|
||||||
|
* chance to clear d3_entered.
|
||||||
|
*/
|
||||||
|
if (vgpu->d3_entered)
|
||||||
|
vgpu->d3_entered = false;
|
||||||
|
|
||||||
execlist = &vgpu->submission.execlist[engine->id];
|
execlist = &vgpu->submission.execlist[engine->id];
|
||||||
|
|
||||||
execlist->elsp_dwords.data[3 - execlist->elsp_dwords.index] = data;
|
execlist->elsp_dwords.data[3 - execlist->elsp_dwords.index] = data;
|
||||||
|
|||||||
@@ -1145,19 +1145,41 @@ find_reg(const struct intel_engine_cs *engine, u32 addr)
|
|||||||
static u32 *copy_batch(struct drm_i915_gem_object *dst_obj,
|
static u32 *copy_batch(struct drm_i915_gem_object *dst_obj,
|
||||||
struct drm_i915_gem_object *src_obj,
|
struct drm_i915_gem_object *src_obj,
|
||||||
unsigned long offset, unsigned long length,
|
unsigned long offset, unsigned long length,
|
||||||
void *dst, const void *src)
|
bool *needs_clflush_after)
|
||||||
{
|
{
|
||||||
bool needs_clflush =
|
unsigned int src_needs_clflush;
|
||||||
!(src_obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ);
|
unsigned int dst_needs_clflush;
|
||||||
|
void *dst, *src;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (src) {
|
ret = i915_gem_object_prepare_write(dst_obj, &dst_needs_clflush);
|
||||||
GEM_BUG_ON(!needs_clflush);
|
if (ret)
|
||||||
i915_unaligned_memcpy_from_wc(dst, src + offset, length);
|
return ERR_PTR(ret);
|
||||||
} else {
|
|
||||||
struct scatterlist *sg;
|
dst = i915_gem_object_pin_map(dst_obj, I915_MAP_WB);
|
||||||
|
i915_gem_object_finish_access(dst_obj);
|
||||||
|
if (IS_ERR(dst))
|
||||||
|
return dst;
|
||||||
|
|
||||||
|
ret = i915_gem_object_prepare_read(src_obj, &src_needs_clflush);
|
||||||
|
if (ret) {
|
||||||
|
i915_gem_object_unpin_map(dst_obj);
|
||||||
|
return ERR_PTR(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
src = ERR_PTR(-ENODEV);
|
||||||
|
if (src_needs_clflush && i915_has_memcpy_from_wc()) {
|
||||||
|
src = i915_gem_object_pin_map(src_obj, I915_MAP_WC);
|
||||||
|
if (!IS_ERR(src)) {
|
||||||
|
i915_unaligned_memcpy_from_wc(dst,
|
||||||
|
src + offset,
|
||||||
|
length);
|
||||||
|
i915_gem_object_unpin_map(src_obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (IS_ERR(src)) {
|
||||||
|
unsigned long x, n, remain;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
unsigned int x, sg_ofs;
|
|
||||||
unsigned long remain;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can avoid clflushing partial cachelines before the write
|
* We can avoid clflushing partial cachelines before the write
|
||||||
@@ -1168,40 +1190,34 @@ static u32 *copy_batch(struct drm_i915_gem_object *dst_obj,
|
|||||||
* validate up to the end of the batch.
|
* validate up to the end of the batch.
|
||||||
*/
|
*/
|
||||||
remain = length;
|
remain = length;
|
||||||
if (!(dst_obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ))
|
if (dst_needs_clflush & CLFLUSH_BEFORE)
|
||||||
remain = round_up(remain,
|
remain = round_up(remain,
|
||||||
boot_cpu_data.x86_clflush_size);
|
boot_cpu_data.x86_clflush_size);
|
||||||
|
|
||||||
ptr = dst;
|
ptr = dst;
|
||||||
x = offset_in_page(offset);
|
x = offset_in_page(offset);
|
||||||
sg = i915_gem_object_get_sg(src_obj, offset >> PAGE_SHIFT, &sg_ofs, false);
|
for (n = offset >> PAGE_SHIFT; remain; n++) {
|
||||||
|
int len = min(remain, PAGE_SIZE - x);
|
||||||
|
|
||||||
while (remain) {
|
src = kmap_atomic(i915_gem_object_get_page(src_obj, n));
|
||||||
unsigned long sg_max = sg->length >> PAGE_SHIFT;
|
if (src_needs_clflush)
|
||||||
|
drm_clflush_virt_range(src + x, len);
|
||||||
for (; remain && sg_ofs < sg_max; sg_ofs++) {
|
memcpy(ptr, src + x, len);
|
||||||
unsigned long len = min(remain, PAGE_SIZE - x);
|
kunmap_atomic(src);
|
||||||
void *map;
|
|
||||||
|
|
||||||
map = kmap_atomic(nth_page(sg_page(sg), sg_ofs));
|
|
||||||
if (needs_clflush)
|
|
||||||
drm_clflush_virt_range(map + x, len);
|
|
||||||
memcpy(ptr, map + x, len);
|
|
||||||
kunmap_atomic(map);
|
|
||||||
|
|
||||||
ptr += len;
|
ptr += len;
|
||||||
remain -= len;
|
remain -= len;
|
||||||
x = 0;
|
x = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sg_ofs = 0;
|
i915_gem_object_finish_access(src_obj);
|
||||||
sg = sg_next(sg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
memset32(dst + length, 0, (dst_obj->base.size - length) / sizeof(u32));
|
memset32(dst + length, 0, (dst_obj->base.size - length) / sizeof(u32));
|
||||||
|
|
||||||
/* dst_obj is returned with vmap pinned */
|
/* dst_obj is returned with vmap pinned */
|
||||||
|
*needs_clflush_after = dst_needs_clflush & CLFLUSH_AFTER;
|
||||||
|
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1360,6 +1376,9 @@ static int check_bbstart(u32 *cmd, u32 offset, u32 length,
|
|||||||
if (target_cmd_index == offset)
|
if (target_cmd_index == offset)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (IS_ERR(jump_whitelist))
|
||||||
|
return PTR_ERR(jump_whitelist);
|
||||||
|
|
||||||
if (!test_bit(target_cmd_index, jump_whitelist)) {
|
if (!test_bit(target_cmd_index, jump_whitelist)) {
|
||||||
DRM_DEBUG("CMD: BB_START to 0x%llx not a previously executed cmd\n",
|
DRM_DEBUG("CMD: BB_START to 0x%llx not a previously executed cmd\n",
|
||||||
jump_target);
|
jump_target);
|
||||||
@@ -1369,28 +1388,10 @@ static int check_bbstart(u32 *cmd, u32 offset, u32 length,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static unsigned long *alloc_whitelist(u32 batch_length)
|
||||||
* intel_engine_cmd_parser_alloc_jump_whitelist() - preallocate jump whitelist for intel_engine_cmd_parser()
|
|
||||||
* @batch_length: length of the commands in batch_obj
|
|
||||||
* @trampoline: Whether jump trampolines are used.
|
|
||||||
*
|
|
||||||
* Preallocates a jump whitelist for parsing the cmd buffer in intel_engine_cmd_parser().
|
|
||||||
* This has to be preallocated, because the command parser runs in signaling context,
|
|
||||||
* and may not allocate any memory.
|
|
||||||
*
|
|
||||||
* Return: NULL or pointer to a jump whitelist, or ERR_PTR() on failure. Use
|
|
||||||
* IS_ERR() to check for errors. Must bre freed() with kfree().
|
|
||||||
*
|
|
||||||
* NULL is a valid value, meaning no allocation was required.
|
|
||||||
*/
|
|
||||||
unsigned long *intel_engine_cmd_parser_alloc_jump_whitelist(u32 batch_length,
|
|
||||||
bool trampoline)
|
|
||||||
{
|
{
|
||||||
unsigned long *jmp;
|
unsigned long *jmp;
|
||||||
|
|
||||||
if (trampoline)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We expect batch_length to be less than 256KiB for known users,
|
* We expect batch_length to be less than 256KiB for known users,
|
||||||
* i.e. we need at most an 8KiB bitmap allocation which should be
|
* i.e. we need at most an 8KiB bitmap allocation which should be
|
||||||
@@ -1415,9 +1416,7 @@ unsigned long *intel_engine_cmd_parser_alloc_jump_whitelist(u32 batch_length,
|
|||||||
* @batch_offset: byte offset in the batch at which execution starts
|
* @batch_offset: byte offset in the batch at which execution starts
|
||||||
* @batch_length: length of the commands in batch_obj
|
* @batch_length: length of the commands in batch_obj
|
||||||
* @shadow: validated copy of the batch buffer in question
|
* @shadow: validated copy of the batch buffer in question
|
||||||
* @jump_whitelist: buffer preallocated with intel_engine_cmd_parser_alloc_jump_whitelist()
|
* @trampoline: true if we need to trampoline into privileged execution
|
||||||
* @shadow_map: mapping to @shadow vma
|
|
||||||
* @batch_map: mapping to @batch vma
|
|
||||||
*
|
*
|
||||||
* Parses the specified batch buffer looking for privilege violations as
|
* Parses the specified batch buffer looking for privilege violations as
|
||||||
* described in the overview.
|
* described in the overview.
|
||||||
@@ -1425,21 +1424,21 @@ unsigned long *intel_engine_cmd_parser_alloc_jump_whitelist(u32 batch_length,
|
|||||||
* Return: non-zero if the parser finds violations or otherwise fails; -EACCES
|
* Return: non-zero if the parser finds violations or otherwise fails; -EACCES
|
||||||
* if the batch appears legal but should use hardware parsing
|
* if the batch appears legal but should use hardware parsing
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int intel_engine_cmd_parser(struct intel_engine_cs *engine,
|
int intel_engine_cmd_parser(struct intel_engine_cs *engine,
|
||||||
struct i915_vma *batch,
|
struct i915_vma *batch,
|
||||||
unsigned long batch_offset,
|
unsigned long batch_offset,
|
||||||
unsigned long batch_length,
|
unsigned long batch_length,
|
||||||
struct i915_vma *shadow,
|
struct i915_vma *shadow,
|
||||||
unsigned long *jump_whitelist,
|
bool trampoline)
|
||||||
void *shadow_map,
|
|
||||||
const void *batch_map)
|
|
||||||
{
|
{
|
||||||
u32 *cmd, *batch_end, offset = 0;
|
u32 *cmd, *batch_end, offset = 0;
|
||||||
struct drm_i915_cmd_descriptor default_desc = noop_desc;
|
struct drm_i915_cmd_descriptor default_desc = noop_desc;
|
||||||
const struct drm_i915_cmd_descriptor *desc = &default_desc;
|
const struct drm_i915_cmd_descriptor *desc = &default_desc;
|
||||||
|
bool needs_clflush_after = false;
|
||||||
|
unsigned long *jump_whitelist;
|
||||||
u64 batch_addr, shadow_addr;
|
u64 batch_addr, shadow_addr;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
bool trampoline = !jump_whitelist;
|
|
||||||
|
|
||||||
GEM_BUG_ON(!IS_ALIGNED(batch_offset, sizeof(*cmd)));
|
GEM_BUG_ON(!IS_ALIGNED(batch_offset, sizeof(*cmd)));
|
||||||
GEM_BUG_ON(!IS_ALIGNED(batch_length, sizeof(*cmd)));
|
GEM_BUG_ON(!IS_ALIGNED(batch_length, sizeof(*cmd)));
|
||||||
@@ -1447,8 +1446,18 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
|
|||||||
batch->size));
|
batch->size));
|
||||||
GEM_BUG_ON(!batch_length);
|
GEM_BUG_ON(!batch_length);
|
||||||
|
|
||||||
cmd = copy_batch(shadow->obj, batch->obj, batch_offset, batch_length,
|
cmd = copy_batch(shadow->obj, batch->obj,
|
||||||
shadow_map, batch_map);
|
batch_offset, batch_length,
|
||||||
|
&needs_clflush_after);
|
||||||
|
if (IS_ERR(cmd)) {
|
||||||
|
DRM_DEBUG("CMD: Failed to copy batch\n");
|
||||||
|
return PTR_ERR(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
jump_whitelist = NULL;
|
||||||
|
if (!trampoline)
|
||||||
|
/* Defer failure until attempted use */
|
||||||
|
jump_whitelist = alloc_whitelist(batch_length);
|
||||||
|
|
||||||
shadow_addr = gen8_canonical_addr(shadow->node.start);
|
shadow_addr = gen8_canonical_addr(shadow->node.start);
|
||||||
batch_addr = gen8_canonical_addr(batch->node.start + batch_offset);
|
batch_addr = gen8_canonical_addr(batch->node.start + batch_offset);
|
||||||
@@ -1549,6 +1558,9 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
|
|||||||
|
|
||||||
i915_gem_object_flush_map(shadow->obj);
|
i915_gem_object_flush_map(shadow->obj);
|
||||||
|
|
||||||
|
if (!IS_ERR_OR_NULL(jump_whitelist))
|
||||||
|
kfree(jump_whitelist);
|
||||||
|
i915_gem_object_unpin_map(shadow->obj);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1906,17 +1906,12 @@ const char *i915_cache_level_str(struct drm_i915_private *i915, int type);
|
|||||||
int i915_cmd_parser_get_version(struct drm_i915_private *dev_priv);
|
int i915_cmd_parser_get_version(struct drm_i915_private *dev_priv);
|
||||||
int intel_engine_init_cmd_parser(struct intel_engine_cs *engine);
|
int intel_engine_init_cmd_parser(struct intel_engine_cs *engine);
|
||||||
void intel_engine_cleanup_cmd_parser(struct intel_engine_cs *engine);
|
void intel_engine_cleanup_cmd_parser(struct intel_engine_cs *engine);
|
||||||
unsigned long *intel_engine_cmd_parser_alloc_jump_whitelist(u32 batch_length,
|
|
||||||
bool trampoline);
|
|
||||||
|
|
||||||
int intel_engine_cmd_parser(struct intel_engine_cs *engine,
|
int intel_engine_cmd_parser(struct intel_engine_cs *engine,
|
||||||
struct i915_vma *batch,
|
struct i915_vma *batch,
|
||||||
unsigned long batch_offset,
|
unsigned long batch_offset,
|
||||||
unsigned long batch_length,
|
unsigned long batch_length,
|
||||||
struct i915_vma *shadow,
|
struct i915_vma *shadow,
|
||||||
unsigned long *jump_whitelist,
|
bool trampoline);
|
||||||
void *shadow_map,
|
|
||||||
const void *batch_map);
|
|
||||||
#define I915_CMD_PARSER_TRAMPOLINE_SIZE 8
|
#define I915_CMD_PARSER_TRAMPOLINE_SIZE 8
|
||||||
|
|
||||||
/* intel_device_info.c */
|
/* intel_device_info.c */
|
||||||
|
|||||||
@@ -1426,10 +1426,8 @@ i915_request_await_execution(struct i915_request *rq,
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
fence = *child++;
|
fence = *child++;
|
||||||
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
|
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
||||||
i915_sw_fence_set_error_once(&rq->submit, fence->error);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
if (fence->context == rq->fence.context)
|
if (fence->context == rq->fence.context)
|
||||||
continue;
|
continue;
|
||||||
@@ -1527,10 +1525,8 @@ i915_request_await_dma_fence(struct i915_request *rq, struct dma_fence *fence)
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
fence = *child++;
|
fence = *child++;
|
||||||
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
|
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
||||||
i915_sw_fence_set_error_once(&rq->submit, fence->error);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Requests on the same timeline are explicitly ordered, along
|
* Requests on the same timeline are explicitly ordered, along
|
||||||
|
|||||||
@@ -149,6 +149,8 @@ nouveau_bo_del_ttm(struct ttm_buffer_object *bo)
|
|||||||
*/
|
*/
|
||||||
if (bo->base.dev)
|
if (bo->base.dev)
|
||||||
drm_gem_object_release(&bo->base);
|
drm_gem_object_release(&bo->base);
|
||||||
|
else
|
||||||
|
dma_resv_fini(&bo->base._resv);
|
||||||
|
|
||||||
kfree(nvbo);
|
kfree(nvbo);
|
||||||
}
|
}
|
||||||
@@ -330,6 +332,10 @@ nouveau_bo_new(struct nouveau_cli *cli, u64 size, int align,
|
|||||||
if (IS_ERR(nvbo))
|
if (IS_ERR(nvbo))
|
||||||
return PTR_ERR(nvbo);
|
return PTR_ERR(nvbo);
|
||||||
|
|
||||||
|
nvbo->bo.base.size = size;
|
||||||
|
dma_resv_init(&nvbo->bo.base._resv);
|
||||||
|
drm_vma_node_reset(&nvbo->bo.base.vma_node);
|
||||||
|
|
||||||
ret = nouveau_bo_init(nvbo, size, align, domain, sg, robj);
|
ret = nouveau_bo_init(nvbo, size, align, domain, sg, robj);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -447,7 +447,6 @@ static int rpi_touchscreen_remove(struct i2c_client *i2c)
|
|||||||
drm_panel_remove(&ts->base);
|
drm_panel_remove(&ts->base);
|
||||||
|
|
||||||
mipi_dsi_device_unregister(ts->dsi);
|
mipi_dsi_device_unregister(ts->dsi);
|
||||||
kfree(ts->dsi);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user