mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
Merge remote-tracking branch 'torvalds/master' into perf/core
To pick up fixes and check if libraries used that comes from other trees continue to work with tools/perf, such as tools/lib/bpf. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
commit
b3c39b1a96
295 changed files with 2104 additions and 1056 deletions
1
.mailmap
1
.mailmap
|
@ -416,6 +416,7 @@ TripleX Chung <xxx.phy@gmail.com> <triplex@zh-kernel.org>
|
|||
TripleX Chung <xxx.phy@gmail.com> <zhongyu@18mail.cn>
|
||||
Tsuneo Yoshioka <Tsuneo.Yoshioka@f-secure.com>
|
||||
Tycho Andersen <tycho@tycho.pizza> <tycho@tycho.ws>
|
||||
Tzung-Bi Shih <tzungbi@kernel.org> <tzungbi@google.com>
|
||||
Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
|
||||
Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
|
||||
Uwe Kleine-König <ukleinek@strlen.de>
|
||||
|
|
4
CREDITS
4
CREDITS
|
@ -2452,6 +2452,10 @@ S: 482 Shadowgraph Dr.
|
|||
S: San Jose, CA 95110
|
||||
S: USA
|
||||
|
||||
N: Michal Marek
|
||||
E: michal.lkml@markovi.net
|
||||
D: Kbuild Maintainer 2009-2017
|
||||
|
||||
N: Martin Mares
|
||||
E: mj@ucw.cz
|
||||
W: http://www.ucw.cz/~mj/
|
||||
|
|
|
@ -16,8 +16,11 @@ description:
|
|||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
oneOf:
|
||||
- const: goodix,gt7375p
|
||||
- items:
|
||||
- const: goodix,gt7986u
|
||||
- const: goodix,gt7375p
|
||||
|
||||
reg:
|
||||
enum:
|
||||
|
|
|
@ -8,7 +8,7 @@ title: Audio codec controlled by ChromeOS EC
|
|||
|
||||
maintainers:
|
||||
- Cheng-Yi Chiang <cychiang@chromium.org>
|
||||
- Tzung-Bi Shih <tzungbi@google.com>
|
||||
- Tzung-Bi Shih <tzungbi@kernel.org>
|
||||
|
||||
description: |
|
||||
Google's ChromeOS EC codec is a digital mic codec provided by the
|
||||
|
|
|
@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
|||
title: Realtek rt1015p codec devicetree bindings
|
||||
|
||||
maintainers:
|
||||
- Tzung-Bi Shih <tzungbi@google.com>
|
||||
- Tzung-Bi Shih <tzungbi@kernel.org>
|
||||
|
||||
description: |
|
||||
Rt1015p is a rt1015 variant which does not support I2C and
|
||||
|
|
|
@ -16,12 +16,11 @@ Parallel Port Devices
|
|||
16x50 UART Driver
|
||||
=================
|
||||
|
||||
.. kernel-doc:: drivers/tty/serial/serial_core.c
|
||||
:export:
|
||||
|
||||
.. kernel-doc:: drivers/tty/serial/8250/8250_core.c
|
||||
:export:
|
||||
|
||||
See serial/driver.rst for related APIs.
|
||||
|
||||
Pulse-Width Modulation (PWM)
|
||||
============================
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ the Technical Advisory Board (TAB) or other maintainers if you're
|
|||
uncertain how to handle situations that come up. It will not be
|
||||
considered a violation report unless you want it to be. If you are
|
||||
uncertain about approaching the TAB or any other maintainers, please
|
||||
reach out to our conflict mediator, Joanna Lee <joanna.lee@gesmer.com>.
|
||||
reach out to our conflict mediator, Joanna Lee <jlee@linuxfoundation.org>.
|
||||
|
||||
In the end, "be kind to each other" is really what the end goal is for
|
||||
everybody. We know everyone is human and we all fail at times, but the
|
||||
|
|
49
MAINTAINERS
49
MAINTAINERS
|
@ -2197,7 +2197,7 @@ M: Wei Xu <xuwei5@hisilicon.com>
|
|||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
W: http://www.hisilicon.com
|
||||
T: git git://github.com/hisilicon/linux-hisi.git
|
||||
T: git https://github.com/hisilicon/linux-hisi.git
|
||||
F: arch/arm/boot/dts/hi3*
|
||||
F: arch/arm/boot/dts/hip*
|
||||
F: arch/arm/boot/dts/hisi*
|
||||
|
@ -4809,7 +4809,7 @@ R: Jeff Layton <jlayton@kernel.org>
|
|||
L: ceph-devel@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://ceph.com/
|
||||
T: git git://github.com/ceph/ceph-client.git
|
||||
T: git https://github.com/ceph/ceph-client.git
|
||||
F: include/linux/ceph/
|
||||
F: include/linux/crush/
|
||||
F: net/ceph/
|
||||
|
@ -4821,7 +4821,7 @@ R: Jeff Layton <jlayton@kernel.org>
|
|||
L: ceph-devel@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://ceph.com/
|
||||
T: git git://github.com/ceph/ceph-client.git
|
||||
T: git https://github.com/ceph/ceph-client.git
|
||||
F: Documentation/filesystems/ceph.rst
|
||||
F: fs/ceph/
|
||||
|
||||
|
@ -4911,7 +4911,7 @@ F: drivers/platform/chrome/
|
|||
|
||||
CHROMEOS EC CODEC DRIVER
|
||||
M: Cheng-Yi Chiang <cychiang@chromium.org>
|
||||
M: Tzung-Bi Shih <tzungbi@google.com>
|
||||
M: Tzung-Bi Shih <tzungbi@kernel.org>
|
||||
R: Guenter Roeck <groeck@chromium.org>
|
||||
L: chrome-platform@lists.linux.dev
|
||||
S: Maintained
|
||||
|
@ -11035,6 +11035,7 @@ KCONFIG
|
|||
M: Masahiro Yamada <masahiroy@kernel.org>
|
||||
L: linux-kbuild@vger.kernel.org
|
||||
S: Maintained
|
||||
Q: https://patchwork.kernel.org/project/linux-kbuild/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git kconfig
|
||||
F: Documentation/kbuild/kconfig*
|
||||
F: scripts/Kconfig.include
|
||||
|
@ -11092,10 +11093,12 @@ F: fs/autofs/
|
|||
|
||||
KERNEL BUILD + files below scripts/ (unless maintained elsewhere)
|
||||
M: Masahiro Yamada <masahiroy@kernel.org>
|
||||
M: Michal Marek <michal.lkml@markovi.net>
|
||||
R: Nathan Chancellor <nathan@kernel.org>
|
||||
R: Nick Desaulniers <ndesaulniers@google.com>
|
||||
R: Nicolas Schier <nicolas@fjasle.eu>
|
||||
L: linux-kbuild@vger.kernel.org
|
||||
S: Maintained
|
||||
Q: https://patchwork.kernel.org/project/linux-kbuild/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git
|
||||
F: Documentation/kbuild/
|
||||
F: Makefile
|
||||
|
@ -13625,6 +13628,12 @@ S: Supported
|
|||
F: drivers/misc/atmel-ssc.c
|
||||
F: include/linux/atmel-ssc.h
|
||||
|
||||
MICROCHIP SOC DRIVERS
|
||||
M: Conor Dooley <conor@kernel.org>
|
||||
S: Supported
|
||||
T: git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
|
||||
F: drivers/soc/microchip/
|
||||
|
||||
MICROCHIP USB251XB DRIVER
|
||||
M: Richard Leitner <richard.leitner@skidata.com>
|
||||
L: linux-usb@vger.kernel.org
|
||||
|
@ -17222,7 +17231,7 @@ R: Dongsheng Yang <dongsheng.yang@easystack.cn>
|
|||
L: ceph-devel@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://ceph.com/
|
||||
T: git git://github.com/ceph/ceph-client.git
|
||||
T: git https://github.com/ceph/ceph-client.git
|
||||
F: Documentation/ABI/testing/sysfs-bus-rbd
|
||||
F: drivers/block/rbd.c
|
||||
F: drivers/block/rbd_types.h
|
||||
|
@ -17723,7 +17732,7 @@ F: arch/riscv/
|
|||
N: riscv
|
||||
K: riscv
|
||||
|
||||
RISC-V/MICROCHIP POLARFIRE SOC SUPPORT
|
||||
RISC-V MICROCHIP FPGA SUPPORT
|
||||
M: Conor Dooley <conor.dooley@microchip.com>
|
||||
M: Daire McNamara <daire.mcnamara@microchip.com>
|
||||
L: linux-riscv@lists.infradead.org
|
||||
|
@ -17741,17 +17750,26 @@ F: Documentation/devicetree/bindings/usb/microchip,mpfs-musb.yaml
|
|||
F: arch/riscv/boot/dts/microchip/
|
||||
F: drivers/char/hw_random/mpfs-rng.c
|
||||
F: drivers/clk/microchip/clk-mpfs.c
|
||||
F: drivers/i2c/busses/i2c-microchip-core.c
|
||||
F: drivers/i2c/busses/i2c-microchip-corei2c.c
|
||||
F: drivers/mailbox/mailbox-mpfs.c
|
||||
F: drivers/pci/controller/pcie-microchip-host.c
|
||||
F: drivers/reset/reset-mpfs.c
|
||||
F: drivers/rtc/rtc-mpfs.c
|
||||
F: drivers/soc/microchip/
|
||||
F: drivers/soc/microchip/mpfs-sys-controller.c
|
||||
F: drivers/spi/spi-microchip-core-qspi.c
|
||||
F: drivers/spi/spi-microchip-core.c
|
||||
F: drivers/usb/musb/mpfs.c
|
||||
F: include/soc/microchip/mpfs.h
|
||||
|
||||
RISC-V MISC SOC SUPPORT
|
||||
M: Conor Dooley <conor@kernel.org>
|
||||
L: linux-riscv@lists.infradead.org
|
||||
S: Maintained
|
||||
Q: https://patchwork.kernel.org/project/linux-riscv/list/
|
||||
T: git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
|
||||
F: Documentation/devicetree/bindings/riscv/
|
||||
F: arch/riscv/boot/dts/
|
||||
|
||||
RNBD BLOCK DRIVERS
|
||||
M: Md. Haris Iqbal <haris.iqbal@ionos.com>
|
||||
M: Jack Wang <jinpu.wang@ionos.com>
|
||||
|
@ -18778,7 +18796,6 @@ M: Palmer Dabbelt <palmer@dabbelt.com>
|
|||
M: Paul Walmsley <paul.walmsley@sifive.com>
|
||||
L: linux-riscv@lists.infradead.org
|
||||
S: Supported
|
||||
T: git https://github.com/sifive/riscv-linux.git
|
||||
N: sifive
|
||||
K: [^@]sifive
|
||||
|
||||
|
@ -18797,6 +18814,13 @@ S: Maintained
|
|||
F: Documentation/devicetree/bindings/dma/sifive,fu540-c000-pdma.yaml
|
||||
F: drivers/dma/sf-pdma/
|
||||
|
||||
SIFIVE SOC DRIVERS
|
||||
M: Conor Dooley <conor@kernel.org>
|
||||
L: linux-riscv@lists.infradead.org
|
||||
S: Maintained
|
||||
T: git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
|
||||
F: drivers/soc/sifive/
|
||||
|
||||
SILEAD TOUCHSCREEN DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
L: linux-input@vger.kernel.org
|
||||
|
@ -19598,6 +19622,11 @@ M: Ion Badulescu <ionut@badula.org>
|
|||
S: Odd Fixes
|
||||
F: drivers/net/ethernet/adaptec/starfire*
|
||||
|
||||
STARFIVE DEVICETREES
|
||||
M: Emil Renner Berthing <kernel@esmil.dk>
|
||||
S: Maintained
|
||||
F: arch/riscv/boot/dts/starfive/
|
||||
|
||||
STARFIVE JH7100 CLOCK DRIVERS
|
||||
M: Emil Renner Berthing <kernel@esmil.dk>
|
||||
S: Maintained
|
||||
|
|
|
@ -1270,10 +1270,10 @@
|
|||
clocks = <&clks IMX7D_NAND_USDHC_BUS_RAWNAND_CLK>;
|
||||
};
|
||||
|
||||
gpmi: nand-controller@33002000{
|
||||
gpmi: nand-controller@33002000 {
|
||||
compatible = "fsl,imx7d-gpmi-nand";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x33002000 0x2000>, <0x33004000 0x4000>;
|
||||
reg-names = "gpmi-nand", "bch";
|
||||
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
|
|
@ -69,6 +69,12 @@
|
|||
pins = "GPIO_35", "GPIO_36";
|
||||
function = "can0_b";
|
||||
};
|
||||
|
||||
sgpio_a_pins: sgpio-a-pins {
|
||||
/* SCK, D0, D1, LD */
|
||||
pins = "GPIO_32", "GPIO_33", "GPIO_34", "GPIO_35";
|
||||
function = "sgpio_a";
|
||||
};
|
||||
};
|
||||
|
||||
&can0 {
|
||||
|
@ -118,6 +124,20 @@
|
|||
status = "okay";
|
||||
};
|
||||
|
||||
&sgpio {
|
||||
pinctrl-0 = <&sgpio_a_pins>;
|
||||
pinctrl-names = "default";
|
||||
microchip,sgpio-port-ranges = <0 3>, <8 11>;
|
||||
status = "okay";
|
||||
|
||||
gpio@0 {
|
||||
ngpios = <64>;
|
||||
};
|
||||
gpio@1 {
|
||||
ngpios = <64>;
|
||||
};
|
||||
};
|
||||
|
||||
&switch {
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
@ -261,7 +261,7 @@
|
|||
#define PIN_PB2__FLEXCOM6_IO0 PINMUX_PIN(PIN_PB2, 2, 1)
|
||||
#define PIN_PB2__ADTRG PINMUX_PIN(PIN_PB2, 3, 1)
|
||||
#define PIN_PB2__A20 PINMUX_PIN(PIN_PB2, 4, 1)
|
||||
#define PIN_PB2__FLEXCOM11_IO0 PINMUX_PIN(PIN_PB2, 6, 3)
|
||||
#define PIN_PB2__FLEXCOM11_IO1 PINMUX_PIN(PIN_PB2, 6, 3)
|
||||
#define PIN_PB3 35
|
||||
#define PIN_PB3__GPIO PINMUX_PIN(PIN_PB3, 0, 0)
|
||||
#define PIN_PB3__RF1 PINMUX_PIN(PIN_PB3, 1, 1)
|
||||
|
|
|
@ -169,10 +169,15 @@ sr_ena_2:
|
|||
cmp tmp1, #UDDRC_STAT_SELFREF_TYPE_SW
|
||||
bne sr_ena_2
|
||||
|
||||
/* Put DDR PHY's DLL in bypass mode for non-backup modes. */
|
||||
/* Disable DX DLLs for non-backup modes. */
|
||||
cmp r7, #AT91_PM_BACKUP
|
||||
beq sr_ena_3
|
||||
|
||||
/* Do not soft reset the AC DLL. */
|
||||
ldr tmp1, [r3, DDR3PHY_ACDLLCR]
|
||||
bic tmp1, tmp1, DDR3PHY_ACDLLCR_DLLSRST
|
||||
str tmp1, [r3, DDR3PHY_ACDLLCR]
|
||||
|
||||
/* Disable DX DLLs. */
|
||||
ldr tmp1, [r3, #DDR3PHY_DX0DLLCR]
|
||||
orr tmp1, tmp1, #DDR3PHY_DXDLLCR_DLLDIS
|
||||
|
|
|
@ -34,11 +34,25 @@
|
|||
off-on-delay-us = <12000>;
|
||||
};
|
||||
|
||||
extcon_usbotg1: extcon-usbotg1 {
|
||||
compatible = "linux,extcon-usb-gpio";
|
||||
connector {
|
||||
compatible = "gpio-usb-b-connector", "usb-b-connector";
|
||||
type = "micro";
|
||||
label = "X19";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_usb1_extcon>;
|
||||
id-gpio = <&gpio1 10 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-0 = <&pinctrl_usb1_connector>;
|
||||
id-gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
usb_dr_connector: endpoint {
|
||||
remote-endpoint = <&usb1_drd_sw>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -105,13 +119,19 @@
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_usbotg1>;
|
||||
dr_mode = "otg";
|
||||
extcon = <&extcon_usbotg1>;
|
||||
srp-disable;
|
||||
hnp-disable;
|
||||
adp-disable;
|
||||
power-active-high;
|
||||
over-current-active-low;
|
||||
usb-role-switch;
|
||||
status = "okay";
|
||||
|
||||
port {
|
||||
usb1_drd_sw: endpoint {
|
||||
remote-endpoint = <&usb_dr_connector>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&usbotg2 {
|
||||
|
@ -231,7 +251,7 @@
|
|||
<MX8MM_IOMUXC_GPIO1_IO13_USB1_OTG_OC 0x84>;
|
||||
};
|
||||
|
||||
pinctrl_usb1_extcon: usb1-extcongrp {
|
||||
pinctrl_usb1_connector: usb1-connectorgrp {
|
||||
fsl,pins = <MX8MM_IOMUXC_GPIO1_IO10_GPIO1_IO10 0x1c0>;
|
||||
};
|
||||
|
||||
|
|
|
@ -1244,10 +1244,10 @@
|
|||
clocks = <&clk IMX8MM_CLK_NAND_USDHC_BUS_RAWNAND_CLK>;
|
||||
};
|
||||
|
||||
gpmi: nand-controller@33002000{
|
||||
gpmi: nand-controller@33002000 {
|
||||
compatible = "fsl,imx8mm-gpmi-nand", "fsl,imx7d-gpmi-nand";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x33002000 0x2000>, <0x33004000 0x4000>;
|
||||
reg-names = "gpmi-nand", "bch";
|
||||
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
|
|
@ -1102,7 +1102,7 @@
|
|||
gpmi: nand-controller@33002000 {
|
||||
compatible = "fsl,imx8mn-gpmi-nand", "fsl,imx7d-gpmi-nand";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x33002000 0x2000>, <0x33004000 0x4000>;
|
||||
reg-names = "gpmi-nand", "bch";
|
||||
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
|
0
arch/arm64/boot/dts/freescale/imx93-pinfunc.h
Executable file → Normal file
0
arch/arm64/boot/dts/freescale/imx93-pinfunc.h
Executable file → Normal file
|
@ -668,7 +668,7 @@
|
|||
|
||||
apcs_glb: mailbox@b111000 {
|
||||
compatible = "qcom,ipq8074-apcs-apps-global";
|
||||
reg = <0x0b111000 0x6000>;
|
||||
reg = <0x0b111000 0x1000>;
|
||||
|
||||
#clock-cells = <1>;
|
||||
#mbox-cells = <1>;
|
||||
|
|
|
@ -3504,7 +3504,7 @@
|
|||
};
|
||||
|
||||
saw3: syscon@9a10000 {
|
||||
compatible = "qcom,tcsr-msm8996", "syscon";
|
||||
compatible = "syscon";
|
||||
reg = <0x09a10000 0x1000>;
|
||||
};
|
||||
|
||||
|
|
|
@ -43,7 +43,6 @@
|
|||
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-allow-set-load;
|
||||
|
||||
vin-supply = <&vreg_3p3>;
|
||||
};
|
||||
|
@ -137,6 +136,9 @@
|
|||
regulator-max-microvolt = <880000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l7a_1p8: ldo7 {
|
||||
|
@ -152,6 +154,9 @@
|
|||
regulator-max-microvolt = <2960000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l11a_0p8: ldo11 {
|
||||
|
@ -258,6 +263,9 @@
|
|||
regulator-max-microvolt = <1200000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l7c_1p8: ldo7 {
|
||||
|
@ -273,6 +281,9 @@
|
|||
regulator-max-microvolt = <1200000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l10c_3p3: ldo10 {
|
||||
|
|
|
@ -83,6 +83,9 @@
|
|||
regulator-max-microvolt = <1200000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l4c: ldo4 {
|
||||
|
@ -98,6 +101,9 @@
|
|||
regulator-max-microvolt = <1200000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l7c: ldo7 {
|
||||
|
@ -113,6 +119,9 @@
|
|||
regulator-max-microvolt = <2504000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l17c: ldo17 {
|
||||
|
@ -121,6 +130,9 @@
|
|||
regulator-max-microvolt = <2504000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -2296,7 +2296,8 @@
|
|||
|
||||
lpass_audiocc: clock-controller@3300000 {
|
||||
compatible = "qcom,sc7280-lpassaudiocc";
|
||||
reg = <0 0x03300000 0 0x30000>;
|
||||
reg = <0 0x03300000 0 0x30000>,
|
||||
<0 0x032a9000 0 0x1000>;
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>,
|
||||
<&lpass_aon LPASS_AON_CC_MAIN_RCG_CLK_SRC>;
|
||||
clock-names = "bi_tcxo", "lpass_aon_cc_main_rcg_clk_src";
|
||||
|
|
|
@ -124,6 +124,9 @@
|
|||
regulator-max-microvolt = <2504000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l13c: ldo13 {
|
||||
|
@ -146,6 +149,9 @@
|
|||
regulator-max-microvolt = <1200000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l4d: ldo4 {
|
||||
|
|
|
@ -885,13 +885,13 @@
|
|||
|
||||
ufs_mem_phy: phy@1d87000 {
|
||||
compatible = "qcom,sc8280xp-qmp-ufs-phy";
|
||||
reg = <0 0x01d87000 0 0xe10>;
|
||||
reg = <0 0x01d87000 0 0x1c8>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
clock-names = "ref",
|
||||
"ref_aux";
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>,
|
||||
clocks = <&gcc GCC_UFS_REF_CLKREF_CLK>,
|
||||
<&gcc GCC_UFS_PHY_PHY_AUX_CLK>;
|
||||
|
||||
resets = <&ufs_mem_hc 0>;
|
||||
|
@ -953,13 +953,13 @@
|
|||
|
||||
ufs_card_phy: phy@1da7000 {
|
||||
compatible = "qcom,sc8280xp-qmp-ufs-phy";
|
||||
reg = <0 0x01da7000 0 0xe10>;
|
||||
reg = <0 0x01da7000 0 0x1c8>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
clock-names = "ref",
|
||||
"ref_aux";
|
||||
clocks = <&gcc GCC_UFS_1_CARD_CLKREF_CLK>,
|
||||
clocks = <&gcc GCC_UFS_REF_CLKREF_CLK>,
|
||||
<&gcc GCC_UFS_CARD_PHY_AUX_CLK>;
|
||||
|
||||
resets = <&ufs_card_hc 0>;
|
||||
|
@ -1181,26 +1181,16 @@
|
|||
usb_0_ssphy: usb3-phy@88eb400 {
|
||||
reg = <0 0x088eb400 0 0x100>,
|
||||
<0 0x088eb600 0 0x3ec>,
|
||||
<0 0x088ec400 0 0x1f0>,
|
||||
<0 0x088ec400 0 0x364>,
|
||||
<0 0x088eba00 0 0x100>,
|
||||
<0 0x088ebc00 0 0x3ec>,
|
||||
<0 0x088ec700 0 0x64>;
|
||||
<0 0x088ec200 0 0x18>;
|
||||
#phy-cells = <0>;
|
||||
#clock-cells = <0>;
|
||||
clocks = <&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>;
|
||||
clock-names = "pipe0";
|
||||
clock-output-names = "usb0_phy_pipe_clk_src";
|
||||
};
|
||||
|
||||
usb_0_dpphy: dp-phy@88ed200 {
|
||||
reg = <0 0x088ed200 0 0x200>,
|
||||
<0 0x088ed400 0 0x200>,
|
||||
<0 0x088eda00 0 0x200>,
|
||||
<0 0x088ea600 0 0x200>,
|
||||
<0 0x088ea800 0 0x200>;
|
||||
#clock-cells = <1>;
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
usb_1_hsphy: phy@8902000 {
|
||||
|
@ -1242,8 +1232,8 @@
|
|||
|
||||
usb_1_ssphy: usb3-phy@8903400 {
|
||||
reg = <0 0x08903400 0 0x100>,
|
||||
<0 0x08903c00 0 0x3ec>,
|
||||
<0 0x08904400 0 0x1f0>,
|
||||
<0 0x08903600 0 0x3ec>,
|
||||
<0 0x08904400 0 0x364>,
|
||||
<0 0x08903a00 0 0x100>,
|
||||
<0 0x08903c00 0 0x3ec>,
|
||||
<0 0x08904200 0 0x18>;
|
||||
|
@ -1253,16 +1243,6 @@
|
|||
clock-names = "pipe0";
|
||||
clock-output-names = "usb1_phy_pipe_clk_src";
|
||||
};
|
||||
|
||||
usb_1_dpphy: dp-phy@8904200 {
|
||||
reg = <0 0x08904200 0 0x200>,
|
||||
<0 0x08904400 0 0x200>,
|
||||
<0 0x08904a00 0 0x200>,
|
||||
<0 0x08904600 0 0x200>,
|
||||
<0 0x08904800 0 0x200>;
|
||||
#clock-cells = <1>;
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
system-cache-controller@9200000 {
|
||||
|
|
|
@ -348,6 +348,9 @@
|
|||
regulator-max-microvolt = <2960000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l7c_3p0: ldo7 {
|
||||
|
@ -367,6 +370,9 @@
|
|||
regulator-max-microvolt = <2960000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l10c_3p3: ldo10 {
|
||||
|
|
|
@ -317,6 +317,9 @@
|
|||
regulator-max-microvolt = <2960000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l7c_2p85: ldo7 {
|
||||
|
@ -339,6 +342,9 @@
|
|||
regulator-max-microvolt = <2960000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l10c_3p3: ldo10 {
|
||||
|
|
|
@ -334,6 +334,7 @@
|
|||
exit-latency-us = <6562>;
|
||||
min-residency-us = <9987>;
|
||||
local-timer-stop;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -107,6 +107,9 @@
|
|||
regulator-max-microvolt = <888000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l6b_1p2: ldo6 {
|
||||
|
@ -115,6 +118,9 @@
|
|||
regulator-max-microvolt = <1208000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l7b_2p96: ldo7 {
|
||||
|
@ -123,6 +129,9 @@
|
|||
regulator-max-microvolt = <2504000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
|
||||
vreg_l9b_1p2: ldo9 {
|
||||
|
@ -131,6 +140,9 @@
|
|||
regulator-max-microvolt = <1200000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
regulator-allow-set-load;
|
||||
regulator-allowed-modes =
|
||||
<RPMH_REGULATOR_MODE_LPM
|
||||
RPMH_REGULATOR_MODE_HPM>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -863,12 +863,12 @@ static inline bool pte_user_accessible_page(pte_t pte)
|
|||
|
||||
static inline bool pmd_user_accessible_page(pmd_t pmd)
|
||||
{
|
||||
return pmd_present(pmd) && (pmd_user(pmd) || pmd_user_exec(pmd));
|
||||
return pmd_leaf(pmd) && (pmd_user(pmd) || pmd_user_exec(pmd));
|
||||
}
|
||||
|
||||
static inline bool pud_user_accessible_page(pud_t pud)
|
||||
{
|
||||
return pud_present(pud) && pud_user(pud);
|
||||
return pud_leaf(pud) && pud_user(pud);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -299,11 +299,11 @@ SYM_TYPED_FUNC_START(ftrace_stub)
|
|||
ret
|
||||
SYM_FUNC_END(ftrace_stub)
|
||||
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
SYM_TYPED_FUNC_START(ftrace_stub_graph)
|
||||
ret
|
||||
SYM_FUNC_END(ftrace_stub_graph)
|
||||
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
/*
|
||||
* void return_to_handler(void)
|
||||
*
|
||||
|
|
|
@ -199,7 +199,16 @@ unsigned long __get_wchan(struct task_struct *p);
|
|||
/* Has task runtime instrumentation enabled ? */
|
||||
#define is_ri_task(tsk) (!!(tsk)->thread.ri_cb)
|
||||
|
||||
register unsigned long current_stack_pointer asm("r15");
|
||||
/* avoid using global register due to gcc bug in versions < 8.4 */
|
||||
#define current_stack_pointer (__current_stack_pointer())
|
||||
|
||||
static __always_inline unsigned long __current_stack_pointer(void)
|
||||
{
|
||||
unsigned long sp;
|
||||
|
||||
asm volatile("lgr %0,15" : "=d" (sp));
|
||||
return sp;
|
||||
}
|
||||
|
||||
static __always_inline unsigned short stap(void)
|
||||
{
|
||||
|
|
|
@ -535,6 +535,11 @@
|
|||
#define MSR_AMD64_CPUID_FN_1 0xc0011004
|
||||
#define MSR_AMD64_LS_CFG 0xc0011020
|
||||
#define MSR_AMD64_DC_CFG 0xc0011022
|
||||
|
||||
#define MSR_AMD64_DE_CFG 0xc0011029
|
||||
#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT 1
|
||||
#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE BIT_ULL(MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT)
|
||||
|
||||
#define MSR_AMD64_BU_CFG2 0xc001102a
|
||||
#define MSR_AMD64_IBSFETCHCTL 0xc0011030
|
||||
#define MSR_AMD64_IBSFETCHLINAD 0xc0011031
|
||||
|
@ -640,9 +645,6 @@
|
|||
#define FAM10H_MMIO_CONF_BASE_MASK 0xfffffffULL
|
||||
#define FAM10H_MMIO_CONF_BASE_SHIFT 20
|
||||
#define MSR_FAM10H_NODE_ID 0xc001100c
|
||||
#define MSR_F10H_DECFG 0xc0011029
|
||||
#define MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT 1
|
||||
#define MSR_F10H_DECFG_LFENCE_SERIALIZE BIT_ULL(MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT)
|
||||
|
||||
/* K8 MSRs */
|
||||
#define MSR_K8_TOP_MEM1 0xc001001a
|
||||
|
|
|
@ -770,8 +770,6 @@ static void init_amd_gh(struct cpuinfo_x86 *c)
|
|||
set_cpu_bug(c, X86_BUG_AMD_TLB_MMATCH);
|
||||
}
|
||||
|
||||
#define MSR_AMD64_DE_CFG 0xC0011029
|
||||
|
||||
static void init_amd_ln(struct cpuinfo_x86 *c)
|
||||
{
|
||||
/*
|
||||
|
@ -965,8 +963,8 @@ static void init_amd(struct cpuinfo_x86 *c)
|
|||
* msr_set_bit() uses the safe accessors, too, even if the MSR
|
||||
* is not present.
|
||||
*/
|
||||
msr_set_bit(MSR_F10H_DECFG,
|
||||
MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT);
|
||||
msr_set_bit(MSR_AMD64_DE_CFG,
|
||||
MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT);
|
||||
|
||||
/* A serializing LFENCE stops RDTSC speculation */
|
||||
set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);
|
||||
|
|
|
@ -326,8 +326,8 @@ static void init_hygon(struct cpuinfo_x86 *c)
|
|||
* msr_set_bit() uses the safe accessors, too, even if the MSR
|
||||
* is not present.
|
||||
*/
|
||||
msr_set_bit(MSR_F10H_DECFG,
|
||||
MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT);
|
||||
msr_set_bit(MSR_AMD64_DE_CFG,
|
||||
MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT);
|
||||
|
||||
/* A serializing LFENCE stops RDTSC speculation */
|
||||
set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);
|
||||
|
|
|
@ -2709,9 +2709,9 @@ static int svm_get_msr_feature(struct kvm_msr_entry *msr)
|
|||
msr->data = 0;
|
||||
|
||||
switch (msr->index) {
|
||||
case MSR_F10H_DECFG:
|
||||
if (boot_cpu_has(X86_FEATURE_LFENCE_RDTSC))
|
||||
msr->data |= MSR_F10H_DECFG_LFENCE_SERIALIZE;
|
||||
case MSR_AMD64_DE_CFG:
|
||||
if (cpu_feature_enabled(X86_FEATURE_LFENCE_RDTSC))
|
||||
msr->data |= MSR_AMD64_DE_CFG_LFENCE_SERIALIZE;
|
||||
break;
|
||||
case MSR_IA32_PERF_CAPABILITIES:
|
||||
return 0;
|
||||
|
@ -2812,7 +2812,7 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
|||
msr_info->data = 0x1E;
|
||||
}
|
||||
break;
|
||||
case MSR_F10H_DECFG:
|
||||
case MSR_AMD64_DE_CFG:
|
||||
msr_info->data = svm->msr_decfg;
|
||||
break;
|
||||
default:
|
||||
|
@ -3041,7 +3041,7 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
|
|||
case MSR_VM_IGNNE:
|
||||
vcpu_unimpl(vcpu, "unimplemented wrmsr: 0x%x data 0x%llx\n", ecx, data);
|
||||
break;
|
||||
case MSR_F10H_DECFG: {
|
||||
case MSR_AMD64_DE_CFG: {
|
||||
struct kvm_msr_entry msr_entry;
|
||||
|
||||
msr_entry.index = msr->index;
|
||||
|
|
|
@ -1557,7 +1557,7 @@ static const u32 msr_based_features_all[] = {
|
|||
MSR_IA32_VMX_EPT_VPID_CAP,
|
||||
MSR_IA32_VMX_VMFUNC,
|
||||
|
||||
MSR_F10H_DECFG,
|
||||
MSR_AMD64_DE_CFG,
|
||||
MSR_IA32_UCODE_REV,
|
||||
MSR_IA32_ARCH_CAPABILITIES,
|
||||
MSR_IA32_PERF_CAPABILITIES,
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
#include <linux/bpf.h>
|
||||
#include <linux/memory.h>
|
||||
#include <linux/sort.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/extable.h>
|
||||
#include <asm/set_memory.h>
|
||||
#include <asm/nospec-branch.h>
|
||||
|
@ -389,18 +388,6 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
int __init bpf_arch_init_dispatcher_early(void *ip)
|
||||
{
|
||||
const u8 *nop_insn = x86_nops[5];
|
||||
|
||||
if (is_endbr(*(u32 *)ip))
|
||||
ip += ENDBR_INSN_SIZE;
|
||||
|
||||
if (memcmp(ip, nop_insn, X86_PATCH_SIZE))
|
||||
text_poke_early(ip, nop_insn, X86_PATCH_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
|
||||
void *old_addr, void *new_addr)
|
||||
{
|
||||
|
|
|
@ -519,6 +519,7 @@ static void pm_save_spec_msr(void)
|
|||
MSR_TSX_FORCE_ABORT,
|
||||
MSR_IA32_MCU_OPT_CTRL,
|
||||
MSR_AMD64_LS_CFG,
|
||||
MSR_AMD64_DE_CFG,
|
||||
};
|
||||
|
||||
msr_build_context(spec_msr_id, ARRAY_SIZE(spec_msr_id));
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/start_kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/kstrtox.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/mm.h>
|
||||
|
@ -113,7 +114,7 @@ static __read_mostly bool xen_msr_safe = IS_ENABLED(CONFIG_XEN_PV_MSR_SAFE);
|
|||
static int __init parse_xen_msr_safe(char *str)
|
||||
{
|
||||
if (str)
|
||||
return strtobool(str, &xen_msr_safe);
|
||||
return kstrtobool(str, &xen_msr_safe);
|
||||
return -EINVAL;
|
||||
}
|
||||
early_param("xen_msr_safe", parse_xen_msr_safe);
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kstrtox.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/memblock.h>
|
||||
|
@ -85,7 +86,7 @@ static void __init xen_parse_512gb(void)
|
|||
arg = strstr(xen_start_info->cmd_line, "xen_512gb_limit=");
|
||||
if (!arg)
|
||||
val = true;
|
||||
else if (strtobool(arg + strlen("xen_512gb_limit="), &val))
|
||||
else if (kstrtobool(arg + strlen("xen_512gb_limit="), &val))
|
||||
return;
|
||||
|
||||
xen_512gb_limit = val;
|
||||
|
|
|
@ -1213,7 +1213,7 @@ static int blkcg_css_online(struct cgroup_subsys_state *css)
|
|||
* parent so that offline always happens towards the root.
|
||||
*/
|
||||
if (parent)
|
||||
blkcg_pin_online(css);
|
||||
blkcg_pin_online(&parent->css);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -425,7 +425,6 @@ struct request_queue *blk_alloc_queue(int node_id, bool alloc_srcu)
|
|||
PERCPU_REF_INIT_ATOMIC, GFP_KERNEL))
|
||||
goto fail_stats;
|
||||
|
||||
blk_queue_dma_alignment(q, 511);
|
||||
blk_set_default_limits(&q->limits);
|
||||
q->nr_requests = BLKDEV_DEFAULT_RQ;
|
||||
|
||||
|
|
|
@ -57,8 +57,8 @@ void blk_set_default_limits(struct queue_limits *lim)
|
|||
lim->misaligned = 0;
|
||||
lim->zoned = BLK_ZONED_NONE;
|
||||
lim->zone_write_granularity = 0;
|
||||
lim->dma_alignment = 511;
|
||||
}
|
||||
EXPORT_SYMBOL(blk_set_default_limits);
|
||||
|
||||
/**
|
||||
* blk_set_stacking_limits - set default limits for stacking devices
|
||||
|
@ -600,6 +600,7 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
|
|||
|
||||
t->io_min = max(t->io_min, b->io_min);
|
||||
t->io_opt = lcm_not_zero(t->io_opt, b->io_opt);
|
||||
t->dma_alignment = max(t->dma_alignment, b->dma_alignment);
|
||||
|
||||
/* Set non-power-of-2 compatible chunk_sectors boundary */
|
||||
if (b->chunk_sectors)
|
||||
|
@ -773,7 +774,7 @@ EXPORT_SYMBOL(blk_queue_virt_boundary);
|
|||
**/
|
||||
void blk_queue_dma_alignment(struct request_queue *q, int mask)
|
||||
{
|
||||
q->dma_alignment = mask;
|
||||
q->limits.dma_alignment = mask;
|
||||
}
|
||||
EXPORT_SYMBOL(blk_queue_dma_alignment);
|
||||
|
||||
|
@ -795,8 +796,8 @@ void blk_queue_update_dma_alignment(struct request_queue *q, int mask)
|
|||
{
|
||||
BUG_ON(mask > PAGE_SIZE);
|
||||
|
||||
if (mask > q->dma_alignment)
|
||||
q->dma_alignment = mask;
|
||||
if (mask > q->limits.dma_alignment)
|
||||
q->limits.dma_alignment = mask;
|
||||
}
|
||||
EXPORT_SYMBOL(blk_queue_update_dma_alignment);
|
||||
|
||||
|
|
|
@ -331,6 +331,7 @@ void blk_rq_set_mixed_merge(struct request *rq);
|
|||
bool blk_rq_merge_ok(struct request *rq, struct bio *bio);
|
||||
enum elv_merge blk_try_merge(struct request *rq, struct bio *bio);
|
||||
|
||||
void blk_set_default_limits(struct queue_limits *lim);
|
||||
int blk_dev_init(void);
|
||||
|
||||
/*
|
||||
|
|
|
@ -1778,7 +1778,7 @@ static void speakup_con_update(struct vc_data *vc)
|
|||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!speakup_console[vc->vc_num] || spk_parked)
|
||||
if (!speakup_console[vc->vc_num] || spk_parked || !synth)
|
||||
return;
|
||||
if (!spin_trylock_irqsave(&speakup_info.spinlock, flags))
|
||||
/* Speakup output, discard */
|
||||
|
|
|
@ -54,7 +54,7 @@ static inline int oops(const char *msg, const char *info)
|
|||
|
||||
static inline struct st_key *hash_name(char *name)
|
||||
{
|
||||
u_char *pn = (u_char *)name;
|
||||
unsigned char *pn = (unsigned char *)name;
|
||||
int hash = 0;
|
||||
|
||||
while (*pn) {
|
||||
|
|
|
@ -739,6 +739,12 @@ int binder_alloc_mmap_handler(struct binder_alloc *alloc,
|
|||
const char *failure_string;
|
||||
struct binder_buffer *buffer;
|
||||
|
||||
if (unlikely(vma->vm_mm != alloc->mm)) {
|
||||
ret = -EINVAL;
|
||||
failure_string = "invalid vma->vm_mm";
|
||||
goto err_invalid_mm;
|
||||
}
|
||||
|
||||
mutex_lock(&binder_alloc_mmap_lock);
|
||||
if (alloc->buffer_size) {
|
||||
ret = -EBUSY;
|
||||
|
@ -785,6 +791,7 @@ err_alloc_pages_failed:
|
|||
alloc->buffer_size = 0;
|
||||
err_already_mapped:
|
||||
mutex_unlock(&binder_alloc_mmap_lock);
|
||||
err_invalid_mm:
|
||||
binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
|
||||
"%s: %d %lx-%lx %s failed %d\n", __func__,
|
||||
alloc->pid, vma->vm_start, vma->vm_end,
|
||||
|
|
|
@ -2672,7 +2672,7 @@ static int init_submitter(struct drbd_device *device)
|
|||
enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsigned int minor)
|
||||
{
|
||||
struct drbd_resource *resource = adm_ctx->resource;
|
||||
struct drbd_connection *connection;
|
||||
struct drbd_connection *connection, *n;
|
||||
struct drbd_device *device;
|
||||
struct drbd_peer_device *peer_device, *tmp_peer_device;
|
||||
struct gendisk *disk;
|
||||
|
@ -2789,7 +2789,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
|
|||
return NO_ERROR;
|
||||
|
||||
out_idr_remove_from_resource:
|
||||
for_each_connection(connection, resource) {
|
||||
for_each_connection_safe(connection, n, resource) {
|
||||
peer_device = idr_remove(&connection->peer_devices, vnr);
|
||||
if (peer_device)
|
||||
kref_put(&connection->kref, drbd_destroy_connection);
|
||||
|
|
|
@ -327,7 +327,13 @@ static irqreturn_t tusb320_irq_handler(int irq, void *dev_id)
|
|||
return IRQ_NONE;
|
||||
|
||||
tusb320_extcon_irq_handler(priv, reg);
|
||||
tusb320_typec_irq_handler(priv, reg);
|
||||
|
||||
/*
|
||||
* Type-C support is optional. Only call the Type-C handler if a
|
||||
* port had been registered previously.
|
||||
*/
|
||||
if (priv->port)
|
||||
tusb320_typec_irq_handler(priv, reg);
|
||||
|
||||
regmap_write(priv->regmap, TUSB320_REG9, reg);
|
||||
|
||||
|
|
|
@ -149,12 +149,8 @@ static int coreboot_table_probe(struct platform_device *pdev)
|
|||
if (!ptr)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = bus_register(&coreboot_bus_type);
|
||||
if (!ret) {
|
||||
ret = coreboot_table_populate(dev, ptr);
|
||||
if (ret)
|
||||
bus_unregister(&coreboot_bus_type);
|
||||
}
|
||||
ret = coreboot_table_populate(dev, ptr);
|
||||
|
||||
memunmap(ptr);
|
||||
|
||||
return ret;
|
||||
|
@ -169,7 +165,6 @@ static int __cb_dev_unregister(struct device *dev, void *dummy)
|
|||
static int coreboot_table_remove(struct platform_device *pdev)
|
||||
{
|
||||
bus_for_each_dev(&coreboot_bus_type, NULL, NULL, __cb_dev_unregister);
|
||||
bus_unregister(&coreboot_bus_type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -199,6 +194,32 @@ static struct platform_driver coreboot_table_driver = {
|
|||
.of_match_table = of_match_ptr(coreboot_of_match),
|
||||
},
|
||||
};
|
||||
module_platform_driver(coreboot_table_driver);
|
||||
|
||||
static int __init coreboot_table_driver_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = bus_register(&coreboot_bus_type);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = platform_driver_register(&coreboot_table_driver);
|
||||
if (ret) {
|
||||
bus_unregister(&coreboot_bus_type);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit coreboot_table_driver_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&coreboot_table_driver);
|
||||
bus_unregister(&coreboot_bus_type);
|
||||
}
|
||||
|
||||
module_init(coreboot_table_driver_init);
|
||||
module_exit(coreboot_table_driver_exit);
|
||||
|
||||
MODULE_AUTHOR("Google, Inc.");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -1293,6 +1293,7 @@ void amdgpu_device_pcie_port_wreg(struct amdgpu_device *adev,
|
|||
u32 reg, u32 v);
|
||||
struct dma_fence *amdgpu_device_switch_gang(struct amdgpu_device *adev,
|
||||
struct dma_fence *gang);
|
||||
bool amdgpu_device_has_display_hardware(struct amdgpu_device *adev);
|
||||
|
||||
/* atpx handler */
|
||||
#if defined(CONFIG_VGA_SWITCHEROO)
|
||||
|
|
|
@ -171,9 +171,7 @@ int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,
|
|||
(kfd_mem_limit.ttm_mem_used + ttm_mem_needed >
|
||||
kfd_mem_limit.max_ttm_mem_limit) ||
|
||||
(adev && adev->kfd.vram_used + vram_needed >
|
||||
adev->gmc.real_vram_size -
|
||||
atomic64_read(&adev->vram_pin_size) -
|
||||
reserved_for_pt)) {
|
||||
adev->gmc.real_vram_size - reserved_for_pt)) {
|
||||
ret = -ENOMEM;
|
||||
goto release;
|
||||
}
|
||||
|
|
|
@ -109,6 +109,7 @@ static int amdgpu_cs_p1_ib(struct amdgpu_cs_parser *p,
|
|||
return r;
|
||||
|
||||
++(num_ibs[r]);
|
||||
p->gang_leader_idx = r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -287,8 +288,10 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,
|
|||
}
|
||||
}
|
||||
|
||||
if (!p->gang_size)
|
||||
return -EINVAL;
|
||||
if (!p->gang_size) {
|
||||
ret = -EINVAL;
|
||||
goto free_partial_kdata;
|
||||
}
|
||||
|
||||
for (i = 0; i < p->gang_size; ++i) {
|
||||
ret = amdgpu_job_alloc(p->adev, num_ibs[i], &p->jobs[i], vm);
|
||||
|
@ -300,7 +303,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,
|
|||
if (ret)
|
||||
goto free_all_kdata;
|
||||
}
|
||||
p->gang_leader = p->jobs[p->gang_size - 1];
|
||||
p->gang_leader = p->jobs[p->gang_leader_idx];
|
||||
|
||||
if (p->ctx->vram_lost_counter != p->gang_leader->vram_lost_counter) {
|
||||
ret = -ECANCELED;
|
||||
|
@ -1195,16 +1198,18 @@ static int amdgpu_cs_sync_rings(struct amdgpu_cs_parser *p)
|
|||
return r;
|
||||
}
|
||||
|
||||
for (i = 0; i < p->gang_size - 1; ++i) {
|
||||
for (i = 0; i < p->gang_size; ++i) {
|
||||
if (p->jobs[i] == leader)
|
||||
continue;
|
||||
|
||||
r = amdgpu_sync_clone(&leader->sync, &p->jobs[i]->sync);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_ctx_wait_prev_fence(p->ctx, p->entities[p->gang_size - 1]);
|
||||
r = amdgpu_ctx_wait_prev_fence(p->ctx, p->entities[p->gang_leader_idx]);
|
||||
if (r && r != -ERESTARTSYS)
|
||||
DRM_ERROR("amdgpu_ctx_wait_prev_fence failed.\n");
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1238,9 +1243,12 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
|
|||
for (i = 0; i < p->gang_size; ++i)
|
||||
drm_sched_job_arm(&p->jobs[i]->base);
|
||||
|
||||
for (i = 0; i < (p->gang_size - 1); ++i) {
|
||||
for (i = 0; i < p->gang_size; ++i) {
|
||||
struct dma_fence *fence;
|
||||
|
||||
if (p->jobs[i] == leader)
|
||||
continue;
|
||||
|
||||
fence = &p->jobs[i]->base.s_fence->scheduled;
|
||||
r = amdgpu_sync_fence(&leader->sync, fence);
|
||||
if (r)
|
||||
|
@ -1276,7 +1284,10 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
|
|||
list_for_each_entry(e, &p->validated, tv.head) {
|
||||
|
||||
/* Everybody except for the gang leader uses READ */
|
||||
for (i = 0; i < (p->gang_size - 1); ++i) {
|
||||
for (i = 0; i < p->gang_size; ++i) {
|
||||
if (p->jobs[i] == leader)
|
||||
continue;
|
||||
|
||||
dma_resv_add_fence(e->tv.bo->base.resv,
|
||||
&p->jobs[i]->base.s_fence->finished,
|
||||
DMA_RESV_USAGE_READ);
|
||||
|
@ -1286,7 +1297,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
|
|||
e->tv.num_shared = 0;
|
||||
}
|
||||
|
||||
seq = amdgpu_ctx_add_fence(p->ctx, p->entities[p->gang_size - 1],
|
||||
seq = amdgpu_ctx_add_fence(p->ctx, p->entities[p->gang_leader_idx],
|
||||
p->fence);
|
||||
amdgpu_cs_post_dependencies(p);
|
||||
|
||||
|
|
|
@ -54,6 +54,7 @@ struct amdgpu_cs_parser {
|
|||
|
||||
/* scheduler job objects */
|
||||
unsigned int gang_size;
|
||||
unsigned int gang_leader_idx;
|
||||
struct drm_sched_entity *entities[AMDGPU_CS_GANG_SIZE];
|
||||
struct amdgpu_job *jobs[AMDGPU_CS_GANG_SIZE];
|
||||
struct amdgpu_job *gang_leader;
|
||||
|
|
|
@ -6044,3 +6044,44 @@ struct dma_fence *amdgpu_device_switch_gang(struct amdgpu_device *adev,
|
|||
dma_fence_put(old);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool amdgpu_device_has_display_hardware(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
case CHIP_HAINAN:
|
||||
#endif
|
||||
case CHIP_TOPAZ:
|
||||
/* chips with no display hardware */
|
||||
return false;
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
case CHIP_TAHITI:
|
||||
case CHIP_PITCAIRN:
|
||||
case CHIP_VERDE:
|
||||
case CHIP_OLAND:
|
||||
#endif
|
||||
#ifdef CONFIG_DRM_AMDGPU_CIK
|
||||
case CHIP_BONAIRE:
|
||||
case CHIP_HAWAII:
|
||||
case CHIP_KAVERI:
|
||||
case CHIP_KABINI:
|
||||
case CHIP_MULLINS:
|
||||
#endif
|
||||
case CHIP_TONGA:
|
||||
case CHIP_FIJI:
|
||||
case CHIP_POLARIS10:
|
||||
case CHIP_POLARIS11:
|
||||
case CHIP_POLARIS12:
|
||||
case CHIP_VEGAM:
|
||||
case CHIP_CARRIZO:
|
||||
case CHIP_STONEY:
|
||||
/* chips with display hardware */
|
||||
return true;
|
||||
default:
|
||||
/* IP discovery */
|
||||
if (!adev->ip_versions[DCE_HWIP][0] ||
|
||||
(adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -656,7 +656,7 @@ void amdgpu_gmc_get_vbios_allocations(struct amdgpu_device *adev)
|
|||
}
|
||||
|
||||
if (amdgpu_sriov_vf(adev) ||
|
||||
!amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_DCE)) {
|
||||
!amdgpu_device_has_display_hardware(adev)) {
|
||||
size = 0;
|
||||
} else {
|
||||
size = amdgpu_gmc_get_vbios_fb_size(adev);
|
||||
|
|
|
@ -45,6 +45,7 @@ MODULE_FIRMWARE("amdgpu/psp_13_0_0_ta.bin");
|
|||
MODULE_FIRMWARE("amdgpu/psp_13_0_7_sos.bin");
|
||||
MODULE_FIRMWARE("amdgpu/psp_13_0_7_ta.bin");
|
||||
MODULE_FIRMWARE("amdgpu/psp_13_0_10_sos.bin");
|
||||
MODULE_FIRMWARE("amdgpu/psp_13_0_10_ta.bin");
|
||||
|
||||
/* For large FW files the time to complete can be very long */
|
||||
#define USBC_PD_POLLING_LIMIT_S 240
|
||||
|
|
|
@ -147,6 +147,14 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
|
|||
/* Number of bytes in PSP footer for firmware. */
|
||||
#define PSP_FOOTER_BYTES 0x100
|
||||
|
||||
/*
|
||||
* DMUB Async to Sync Mechanism Status
|
||||
*/
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_FAIL 1
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT 2
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS 3
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_INVALID 4
|
||||
|
||||
/**
|
||||
* DOC: overview
|
||||
*
|
||||
|
@ -1637,12 +1645,6 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
|
|||
}
|
||||
}
|
||||
|
||||
if (amdgpu_dm_initialize_drm_device(adev)) {
|
||||
DRM_ERROR(
|
||||
"amdgpu: failed to initialize sw for display support.\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Enable outbox notification only after IRQ handlers are registered and DMUB is alive.
|
||||
* It is expected that DMUB will resend any pending notifications at this point, for
|
||||
* example HPD from DPIA.
|
||||
|
@ -1650,6 +1652,12 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
|
|||
if (dc_is_dmub_outbox_supported(adev->dm.dc))
|
||||
dc_enable_dmub_outbox(adev->dm.dc);
|
||||
|
||||
if (amdgpu_dm_initialize_drm_device(adev)) {
|
||||
DRM_ERROR(
|
||||
"amdgpu: failed to initialize sw for display support.\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* create fake encoders for MST */
|
||||
dm_dp_create_fake_mst_encoders(adev);
|
||||
|
||||
|
@ -10109,6 +10117,8 @@ static int amdgpu_dm_set_dmub_async_sync_status(bool is_cmd_aux,
|
|||
*operation_result = AUX_RET_ERROR_TIMEOUT;
|
||||
} else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_FAIL) {
|
||||
*operation_result = AUX_RET_ERROR_ENGINE_ACQUIRE;
|
||||
} else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_INVALID) {
|
||||
*operation_result = AUX_RET_ERROR_INVALID_REPLY;
|
||||
} else {
|
||||
*operation_result = AUX_RET_ERROR_UNKNOWN;
|
||||
}
|
||||
|
@ -10156,6 +10166,16 @@ int amdgpu_dm_process_dmub_aux_transfer_sync(bool is_cmd_aux, struct dc_context
|
|||
payload->reply[0] = adev->dm.dmub_notify->aux_reply.command;
|
||||
if (!payload->write && adev->dm.dmub_notify->aux_reply.length &&
|
||||
payload->reply[0] == AUX_TRANSACTION_REPLY_AUX_ACK) {
|
||||
|
||||
if (payload->length != adev->dm.dmub_notify->aux_reply.length) {
|
||||
DRM_WARN("invalid read from DPIA AUX %x(%d) got length %d!\n",
|
||||
payload->address, payload->length,
|
||||
adev->dm.dmub_notify->aux_reply.length);
|
||||
return amdgpu_dm_set_dmub_async_sync_status(is_cmd_aux, ctx,
|
||||
DMUB_ASYNC_TO_SYNC_ACCESS_INVALID,
|
||||
(uint32_t *)operation_result);
|
||||
}
|
||||
|
||||
memcpy(payload->data, adev->dm.dmub_notify->aux_reply.data,
|
||||
adev->dm.dmub_notify->aux_reply.length);
|
||||
}
|
||||
|
|
|
@ -50,12 +50,6 @@
|
|||
|
||||
#define AMDGPU_DMUB_NOTIFICATION_MAX 5
|
||||
|
||||
/*
|
||||
* DMUB Async to Sync Mechanism Status
|
||||
*/
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_FAIL 1
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT 2
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS 3
|
||||
/*
|
||||
#include "include/amdgpu_dal_power_if.h"
|
||||
#include "amdgpu_dm_irq.h"
|
||||
|
|
|
@ -412,7 +412,7 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
|
|||
{
|
||||
struct amdgpu_crtc *acrtc = NULL;
|
||||
struct drm_plane *cursor_plane;
|
||||
|
||||
bool is_dcn;
|
||||
int res = -ENOMEM;
|
||||
|
||||
cursor_plane = kzalloc(sizeof(*cursor_plane), GFP_KERNEL);
|
||||
|
@ -450,8 +450,14 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
|
|||
acrtc->otg_inst = -1;
|
||||
|
||||
dm->adev->mode_info.crtcs[crtc_index] = acrtc;
|
||||
drm_crtc_enable_color_mgmt(&acrtc->base, MAX_COLOR_LUT_ENTRIES,
|
||||
|
||||
/* Don't enable DRM CRTC degamma property for DCE since it doesn't
|
||||
* support programmable degamma anywhere.
|
||||
*/
|
||||
is_dcn = dm->adev->dm.dc->caps.color.dpp.dcn_arch;
|
||||
drm_crtc_enable_color_mgmt(&acrtc->base, is_dcn ? MAX_COLOR_LUT_ENTRIES : 0,
|
||||
true, MAX_COLOR_LUT_ENTRIES);
|
||||
|
||||
drm_mode_crtc_set_gamma_size(&acrtc->base, MAX_COLOR_LEGACY_LUT_ENTRIES);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -2393,6 +2393,26 @@ static enum bp_result get_vram_info_v25(
|
|||
return result;
|
||||
}
|
||||
|
||||
static enum bp_result get_vram_info_v30(
|
||||
struct bios_parser *bp,
|
||||
struct dc_vram_info *info)
|
||||
{
|
||||
struct atom_vram_info_header_v3_0 *info_v30;
|
||||
enum bp_result result = BP_RESULT_OK;
|
||||
|
||||
info_v30 = GET_IMAGE(struct atom_vram_info_header_v3_0,
|
||||
DATA_TABLES(vram_info));
|
||||
|
||||
if (info_v30 == NULL)
|
||||
return BP_RESULT_BADBIOSTABLE;
|
||||
|
||||
info->num_chans = info_v30->channel_num;
|
||||
info->dram_channel_width_bytes = (1 << info_v30->channel_width) / 8;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_integrated_info_v11
|
||||
*
|
||||
|
@ -3060,6 +3080,16 @@ static enum bp_result bios_parser_get_vram_info(
|
|||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
switch (revision.minor) {
|
||||
case 0:
|
||||
result = get_vram_info_v30(bp, info);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -87,6 +87,7 @@ static struct hubp_funcs dcn31_hubp_funcs = {
|
|||
.hubp_init = hubp3_init,
|
||||
.set_unbounded_requesting = hubp31_set_unbounded_requesting,
|
||||
.hubp_soft_reset = hubp31_soft_reset,
|
||||
.hubp_set_flip_int = hubp1_set_flip_int,
|
||||
.hubp_in_blank = hubp1_in_blank,
|
||||
.program_extended_blank = hubp31_program_extended_blank,
|
||||
};
|
||||
|
|
|
@ -237,7 +237,7 @@ static struct timing_generator_funcs dcn314_tg_funcs = {
|
|||
.clear_optc_underflow = optc1_clear_optc_underflow,
|
||||
.setup_global_swap_lock = NULL,
|
||||
.get_crc = optc1_get_crc,
|
||||
.configure_crc = optc2_configure_crc,
|
||||
.configure_crc = optc1_configure_crc,
|
||||
.set_dsc_config = optc3_set_dsc_config,
|
||||
.get_dsc_status = optc2_get_dsc_status,
|
||||
.set_dwb_source = NULL,
|
||||
|
|
|
@ -283,8 +283,7 @@ static uint32_t dcn32_calculate_cab_allocation(struct dc *dc, struct dc_state *c
|
|||
using the max for calculation */
|
||||
|
||||
if (hubp->curs_attr.width > 0) {
|
||||
// Round cursor width to next multiple of 64
|
||||
cursor_size = (((hubp->curs_attr.width + 63) / 64) * 64) * hubp->curs_attr.height;
|
||||
cursor_size = hubp->curs_attr.pitch * hubp->curs_attr.height;
|
||||
|
||||
switch (pipe->stream->cursor_attributes.color_format) {
|
||||
case CURSOR_MODE_MONO:
|
||||
|
@ -309,9 +308,9 @@ static uint32_t dcn32_calculate_cab_allocation(struct dc *dc, struct dc_state *c
|
|||
cursor_size > 16384) {
|
||||
/* cursor_num_mblk = CEILING(num_cursors*cursor_width*cursor_width*cursor_Bpe/mblk_bytes, 1)
|
||||
*/
|
||||
cache_lines_used += (((hubp->curs_attr.width * hubp->curs_attr.height * cursor_bpp +
|
||||
DCN3_2_MALL_MBLK_SIZE_BYTES - 1) / DCN3_2_MALL_MBLK_SIZE_BYTES) *
|
||||
DCN3_2_MALL_MBLK_SIZE_BYTES) / dc->caps.cache_line_size + 2;
|
||||
cache_lines_used += (((cursor_size + DCN3_2_MALL_MBLK_SIZE_BYTES - 1) /
|
||||
DCN3_2_MALL_MBLK_SIZE_BYTES) * DCN3_2_MALL_MBLK_SIZE_BYTES) /
|
||||
dc->caps.cache_line_size + 2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -727,10 +726,7 @@ void dcn32_update_mall_sel(struct dc *dc, struct dc_state *context)
|
|||
struct hubp *hubp = pipe->plane_res.hubp;
|
||||
|
||||
if (pipe->stream && pipe->plane_state && hubp && hubp->funcs->hubp_update_mall_sel) {
|
||||
//Round cursor width up to next multiple of 64
|
||||
int cursor_width = ((hubp->curs_attr.width + 63) / 64) * 64;
|
||||
int cursor_height = hubp->curs_attr.height;
|
||||
int cursor_size = cursor_width * cursor_height;
|
||||
int cursor_size = hubp->curs_attr.pitch * hubp->curs_attr.height;
|
||||
|
||||
switch (hubp->curs_attr.color_format) {
|
||||
case CURSOR_MODE_MONO:
|
||||
|
|
|
@ -1803,6 +1803,12 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
|||
*/
|
||||
context->bw_ctx.dml.soc.dram_clock_change_latency_us =
|
||||
dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us;
|
||||
/* For DCN32/321 need to validate with fclk pstate change latency equal to dummy so
|
||||
* prefetch is scheduled correctly to account for dummy pstate.
|
||||
*/
|
||||
if (dummy_latency_index == 0)
|
||||
context->bw_ctx.dml.soc.fclk_change_latency_us =
|
||||
dc->clk_mgr->bw_params->dummy_pstate_table[dummy_latency_index].dummy_pstate_latency_us;
|
||||
dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, false);
|
||||
maxMpcComb = context->bw_ctx.dml.vba.maxMpcComb;
|
||||
dcfclk_from_fw_based_mclk_switching = context->bw_ctx.dml.vba.DCFCLKState[vlevel][context->bw_ctx.dml.vba.maxMpcComb];
|
||||
|
@ -1990,6 +1996,10 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
|||
|
||||
context->perf_params.stutter_period_us = context->bw_ctx.dml.vba.StutterPeriod;
|
||||
|
||||
if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching && dummy_latency_index == 0)
|
||||
context->bw_ctx.dml.soc.fclk_change_latency_us =
|
||||
dc->clk_mgr->bw_params->dummy_pstate_table[dummy_latency_index].dummy_pstate_latency_us;
|
||||
|
||||
dcn32_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
|
||||
|
||||
if (!pstate_en)
|
||||
|
@ -1997,8 +2007,12 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
|||
context->bw_ctx.dml.soc.dram_clock_change_latency_us =
|
||||
dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us;
|
||||
|
||||
if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching)
|
||||
if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching) {
|
||||
dcn30_setup_mclk_switch_using_fw_based_vblank_stretch(dc, context);
|
||||
if (dummy_latency_index == 0)
|
||||
context->bw_ctx.dml.soc.fclk_change_latency_us =
|
||||
dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.fclk_change_latency_us;
|
||||
}
|
||||
}
|
||||
|
||||
static void dcn32_get_optimal_dcfclk_fclk_for_uclk(unsigned int uclk_mts,
|
||||
|
|
|
@ -718,6 +718,8 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
|
|||
|
||||
do {
|
||||
MaxTotalRDBandwidth = 0;
|
||||
DestinationLineTimesForPrefetchLessThan2 = false;
|
||||
VRatioPrefetchMoreThanMax = false;
|
||||
#ifdef __DML_VBA_DEBUG__
|
||||
dml_print("DML::%s: Start loop: VStartup = %d\n", __func__, mode_lib->vba.VStartupLines);
|
||||
#endif
|
||||
|
|
|
@ -46,6 +46,8 @@
|
|||
// Prefetch schedule max vratio
|
||||
#define __DML_MAX_VRATIO_PRE__ 4.0
|
||||
|
||||
#define __DML_VBA_MAX_DST_Y_PRE__ 63.75
|
||||
|
||||
#define BPP_INVALID 0
|
||||
#define BPP_BLENDED_PIPE 0xffffffff
|
||||
|
||||
|
|
|
@ -3475,7 +3475,6 @@ bool dml32_CalculatePrefetchSchedule(
|
|||
double min_Lsw;
|
||||
double Tsw_est1 = 0;
|
||||
double Tsw_est3 = 0;
|
||||
double TPreMargin = 0;
|
||||
|
||||
if (v->GPUVMEnable == true && v->HostVMEnable == true)
|
||||
HostVMDynamicLevelsTrips = v->HostVMMaxNonCachedPageTableLevels;
|
||||
|
@ -3669,6 +3668,7 @@ bool dml32_CalculatePrefetchSchedule(
|
|||
dst_y_prefetch_equ = VStartup - (*TSetup + dml_max(TWait + TCalc, *Tdmdl)) / LineTime -
|
||||
(*DSTYAfterScaler + (double) *DSTXAfterScaler / (double) myPipe->HTotal);
|
||||
|
||||
dst_y_prefetch_equ = dml_min(dst_y_prefetch_equ, __DML_VBA_MAX_DST_Y_PRE__);
|
||||
#ifdef __DML_VBA_DEBUG__
|
||||
dml_print("DML::%s: HTotal = %d\n", __func__, myPipe->HTotal);
|
||||
dml_print("DML::%s: min_Lsw = %f\n", __func__, min_Lsw);
|
||||
|
@ -3701,8 +3701,6 @@ bool dml32_CalculatePrefetchSchedule(
|
|||
|
||||
dst_y_prefetch_equ = dml_floor(4.0 * (dst_y_prefetch_equ + 0.125), 1) / 4.0;
|
||||
Tpre_rounded = dst_y_prefetch_equ * LineTime;
|
||||
|
||||
TPreMargin = Tpre_rounded - TPreReq;
|
||||
#ifdef __DML_VBA_DEBUG__
|
||||
dml_print("DML::%s: dst_y_prefetch_equ: %f (after round)\n", __func__, dst_y_prefetch_equ);
|
||||
dml_print("DML::%s: LineTime: %f\n", __func__, LineTime);
|
||||
|
@ -3730,7 +3728,8 @@ bool dml32_CalculatePrefetchSchedule(
|
|||
*VRatioPrefetchY = 0;
|
||||
*VRatioPrefetchC = 0;
|
||||
*RequiredPrefetchPixDataBWLuma = 0;
|
||||
if (dst_y_prefetch_equ > 1 && TPreMargin > 0.0) {
|
||||
if (dst_y_prefetch_equ > 1 &&
|
||||
(Tpre_rounded >= TPreReq || dst_y_prefetch_equ == __DML_VBA_MAX_DST_Y_PRE__)) {
|
||||
double PrefetchBandwidth1;
|
||||
double PrefetchBandwidth2;
|
||||
double PrefetchBandwidth3;
|
||||
|
|
|
@ -1156,22 +1156,21 @@ static int smu_smc_hw_setup(struct smu_context *smu)
|
|||
uint64_t features_supported;
|
||||
int ret = 0;
|
||||
|
||||
if (adev->in_suspend && smu_is_dpm_running(smu)) {
|
||||
dev_info(adev->dev, "dpm has been enabled\n");
|
||||
/* this is needed specifically */
|
||||
switch (adev->ip_versions[MP1_HWIP][0]) {
|
||||
case IP_VERSION(11, 0, 7):
|
||||
case IP_VERSION(11, 0, 11):
|
||||
case IP_VERSION(11, 5, 0):
|
||||
case IP_VERSION(11, 0, 12):
|
||||
switch (adev->ip_versions[MP1_HWIP][0]) {
|
||||
case IP_VERSION(11, 0, 7):
|
||||
case IP_VERSION(11, 0, 11):
|
||||
case IP_VERSION(11, 5, 0):
|
||||
case IP_VERSION(11, 0, 12):
|
||||
if (adev->in_suspend && smu_is_dpm_running(smu)) {
|
||||
dev_info(adev->dev, "dpm has been enabled\n");
|
||||
ret = smu_system_features_control(smu, true);
|
||||
if (ret)
|
||||
dev_err(adev->dev, "Failed system features control!\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
ret = smu_init_display_count(smu, 0);
|
||||
|
|
|
@ -1388,6 +1388,14 @@ enum smu_cmn2asic_mapping_type {
|
|||
CMN2ASIC_MAPPING_WORKLOAD,
|
||||
};
|
||||
|
||||
enum smu_baco_seq {
|
||||
BACO_SEQ_BACO = 0,
|
||||
BACO_SEQ_MSR,
|
||||
BACO_SEQ_BAMACO,
|
||||
BACO_SEQ_ULPS,
|
||||
BACO_SEQ_COUNT,
|
||||
};
|
||||
|
||||
#define MSG_MAP(msg, index, valid_in_vf) \
|
||||
[SMU_MSG_##msg] = {1, (index), (valid_in_vf)}
|
||||
|
||||
|
|
|
@ -147,14 +147,6 @@ struct smu_11_5_power_context {
|
|||
uint32_t max_fast_ppt_limit;
|
||||
};
|
||||
|
||||
enum smu_v11_0_baco_seq {
|
||||
BACO_SEQ_BACO = 0,
|
||||
BACO_SEQ_MSR,
|
||||
BACO_SEQ_BAMACO,
|
||||
BACO_SEQ_ULPS,
|
||||
BACO_SEQ_COUNT,
|
||||
};
|
||||
|
||||
#if defined(SWSMU_CODE_LAYER_L2) || defined(SWSMU_CODE_LAYER_L3)
|
||||
|
||||
int smu_v11_0_init_microcode(struct smu_context *smu);
|
||||
|
@ -257,7 +249,7 @@ int smu_v11_0_baco_enter(struct smu_context *smu);
|
|||
int smu_v11_0_baco_exit(struct smu_context *smu);
|
||||
|
||||
int smu_v11_0_baco_set_armd3_sequence(struct smu_context *smu,
|
||||
enum smu_v11_0_baco_seq baco_seq);
|
||||
enum smu_baco_seq baco_seq);
|
||||
|
||||
int smu_v11_0_mode1_reset(struct smu_context *smu);
|
||||
|
||||
|
|
|
@ -124,14 +124,6 @@ struct smu_13_0_power_context {
|
|||
enum smu_13_0_power_state power_state;
|
||||
};
|
||||
|
||||
enum smu_v13_0_baco_seq {
|
||||
BACO_SEQ_BACO = 0,
|
||||
BACO_SEQ_MSR,
|
||||
BACO_SEQ_BAMACO,
|
||||
BACO_SEQ_ULPS,
|
||||
BACO_SEQ_COUNT,
|
||||
};
|
||||
|
||||
#if defined(SWSMU_CODE_LAYER_L2) || defined(SWSMU_CODE_LAYER_L3)
|
||||
|
||||
int smu_v13_0_init_microcode(struct smu_context *smu);
|
||||
|
@ -218,6 +210,9 @@ int smu_v13_0_set_azalia_d3_pme(struct smu_context *smu);
|
|||
int smu_v13_0_get_max_sustainable_clocks_by_dc(struct smu_context *smu,
|
||||
struct pp_smu_nv_clock_table *max_clocks);
|
||||
|
||||
int smu_v13_0_baco_set_armd3_sequence(struct smu_context *smu,
|
||||
enum smu_baco_seq baco_seq);
|
||||
|
||||
bool smu_v13_0_baco_is_support(struct smu_context *smu);
|
||||
|
||||
enum smu_baco_state smu_v13_0_baco_get_state(struct smu_context *smu);
|
||||
|
|
|
@ -379,6 +379,10 @@ static void sienna_cichlid_check_bxco_support(struct smu_context *smu)
|
|||
((adev->pdev->device == 0x73BF) &&
|
||||
(adev->pdev->revision == 0xCF)) ||
|
||||
((adev->pdev->device == 0x7422) &&
|
||||
(adev->pdev->revision == 0x00)) ||
|
||||
((adev->pdev->device == 0x73A3) &&
|
||||
(adev->pdev->revision == 0x00)) ||
|
||||
((adev->pdev->device == 0x73E3) &&
|
||||
(adev->pdev->revision == 0x00)))
|
||||
smu_baco->platform_support = false;
|
||||
|
||||
|
|
|
@ -1576,7 +1576,7 @@ int smu_v11_0_set_azalia_d3_pme(struct smu_context *smu)
|
|||
}
|
||||
|
||||
int smu_v11_0_baco_set_armd3_sequence(struct smu_context *smu,
|
||||
enum smu_v11_0_baco_seq baco_seq)
|
||||
enum smu_baco_seq baco_seq)
|
||||
{
|
||||
return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_ArmD3, baco_seq, NULL);
|
||||
}
|
||||
|
|
|
@ -2230,6 +2230,15 @@ int smu_v13_0_gfx_ulv_control(struct smu_context *smu,
|
|||
return ret;
|
||||
}
|
||||
|
||||
int smu_v13_0_baco_set_armd3_sequence(struct smu_context *smu,
|
||||
enum smu_baco_seq baco_seq)
|
||||
{
|
||||
return smu_cmn_send_smc_msg_with_param(smu,
|
||||
SMU_MSG_ArmD3,
|
||||
baco_seq,
|
||||
NULL);
|
||||
}
|
||||
|
||||
bool smu_v13_0_baco_is_support(struct smu_context *smu)
|
||||
{
|
||||
struct smu_baco_context *smu_baco = &smu->smu_baco;
|
||||
|
|
|
@ -120,6 +120,7 @@ static struct cmn2asic_msg_mapping smu_v13_0_0_message_map[SMU_MSG_MAX_COUNT] =
|
|||
MSG_MAP(Mode1Reset, PPSMC_MSG_Mode1Reset, 0),
|
||||
MSG_MAP(PrepareMp1ForUnload, PPSMC_MSG_PrepareMp1ForUnload, 0),
|
||||
MSG_MAP(DFCstateControl, PPSMC_MSG_SetExternalClientDfCstateAllow, 0),
|
||||
MSG_MAP(ArmD3, PPSMC_MSG_ArmD3, 0),
|
||||
};
|
||||
|
||||
static struct cmn2asic_mapping smu_v13_0_0_clk_map[SMU_CLK_COUNT] = {
|
||||
|
@ -1566,6 +1567,31 @@ static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu,
|
|||
NULL);
|
||||
}
|
||||
|
||||
static int smu_v13_0_0_baco_enter(struct smu_context *smu)
|
||||
{
|
||||
struct smu_baco_context *smu_baco = &smu->smu_baco;
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
|
||||
if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev))
|
||||
return smu_v13_0_baco_set_armd3_sequence(smu,
|
||||
smu_baco->maco_support ? BACO_SEQ_BAMACO : BACO_SEQ_BACO);
|
||||
else
|
||||
return smu_v13_0_baco_enter(smu);
|
||||
}
|
||||
|
||||
static int smu_v13_0_0_baco_exit(struct smu_context *smu)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
|
||||
if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) {
|
||||
/* Wait for PMFW handling for the Dstate change */
|
||||
usleep_range(10000, 11000);
|
||||
return smu_v13_0_baco_set_armd3_sequence(smu, BACO_SEQ_ULPS);
|
||||
} else {
|
||||
return smu_v13_0_baco_exit(smu);
|
||||
}
|
||||
}
|
||||
|
||||
static bool smu_v13_0_0_is_mode1_reset_supported(struct smu_context *smu)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
|
@ -1827,8 +1853,8 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {
|
|||
.baco_is_support = smu_v13_0_baco_is_support,
|
||||
.baco_get_state = smu_v13_0_baco_get_state,
|
||||
.baco_set_state = smu_v13_0_baco_set_state,
|
||||
.baco_enter = smu_v13_0_baco_enter,
|
||||
.baco_exit = smu_v13_0_baco_exit,
|
||||
.baco_enter = smu_v13_0_0_baco_enter,
|
||||
.baco_exit = smu_v13_0_0_baco_exit,
|
||||
.mode1_reset_is_support = smu_v13_0_0_is_mode1_reset_supported,
|
||||
.mode1_reset = smu_v13_0_mode1_reset,
|
||||
.set_mp1_state = smu_v13_0_0_set_mp1_state,
|
||||
|
|
|
@ -122,6 +122,7 @@ static struct cmn2asic_msg_mapping smu_v13_0_7_message_map[SMU_MSG_MAX_COUNT] =
|
|||
MSG_MAP(PrepareMp1ForUnload, PPSMC_MSG_PrepareMp1ForUnload, 0),
|
||||
MSG_MAP(SetMGpuFanBoostLimitRpm, PPSMC_MSG_SetMGpuFanBoostLimitRpm, 0),
|
||||
MSG_MAP(DFCstateControl, PPSMC_MSG_SetExternalClientDfCstateAllow, 0),
|
||||
MSG_MAP(ArmD3, PPSMC_MSG_ArmD3, 0),
|
||||
};
|
||||
|
||||
static struct cmn2asic_mapping smu_v13_0_7_clk_map[SMU_CLK_COUNT] = {
|
||||
|
@ -1578,6 +1579,31 @@ static int smu_v13_0_7_set_mp1_state(struct smu_context *smu,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int smu_v13_0_7_baco_enter(struct smu_context *smu)
|
||||
{
|
||||
struct smu_baco_context *smu_baco = &smu->smu_baco;
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
|
||||
if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev))
|
||||
return smu_v13_0_baco_set_armd3_sequence(smu,
|
||||
smu_baco->maco_support ? BACO_SEQ_BAMACO : BACO_SEQ_BACO);
|
||||
else
|
||||
return smu_v13_0_baco_enter(smu);
|
||||
}
|
||||
|
||||
static int smu_v13_0_7_baco_exit(struct smu_context *smu)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
|
||||
if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) {
|
||||
/* Wait for PMFW handling for the Dstate change */
|
||||
usleep_range(10000, 11000);
|
||||
return smu_v13_0_baco_set_armd3_sequence(smu, BACO_SEQ_ULPS);
|
||||
} else {
|
||||
return smu_v13_0_baco_exit(smu);
|
||||
}
|
||||
}
|
||||
|
||||
static bool smu_v13_0_7_is_mode1_reset_supported(struct smu_context *smu)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
|
@ -1655,8 +1681,8 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
|
|||
.baco_is_support = smu_v13_0_baco_is_support,
|
||||
.baco_get_state = smu_v13_0_baco_get_state,
|
||||
.baco_set_state = smu_v13_0_baco_set_state,
|
||||
.baco_enter = smu_v13_0_baco_enter,
|
||||
.baco_exit = smu_v13_0_baco_exit,
|
||||
.baco_enter = smu_v13_0_7_baco_enter,
|
||||
.baco_exit = smu_v13_0_7_baco_exit,
|
||||
.mode1_reset_is_support = smu_v13_0_7_is_mode1_reset_supported,
|
||||
.mode1_reset = smu_v13_0_mode1_reset,
|
||||
.set_mp1_state = smu_v13_0_7_set_mp1_state,
|
||||
|
|
|
@ -63,23 +63,45 @@
|
|||
ssize_t drm_dp_dual_mode_read(struct i2c_adapter *adapter,
|
||||
u8 offset, void *buffer, size_t size)
|
||||
{
|
||||
u8 zero = 0;
|
||||
char *tmpbuf = NULL;
|
||||
/*
|
||||
* As sub-addressing is not supported by all adaptors,
|
||||
* always explicitly read from the start and discard
|
||||
* any bytes that come before the requested offset.
|
||||
* This way, no matter whether the adaptor supports it
|
||||
* or not, we'll end up reading the proper data.
|
||||
*/
|
||||
struct i2c_msg msgs[] = {
|
||||
{
|
||||
.addr = DP_DUAL_MODE_SLAVE_ADDRESS,
|
||||
.flags = 0,
|
||||
.len = 1,
|
||||
.buf = &offset,
|
||||
.buf = &zero,
|
||||
},
|
||||
{
|
||||
.addr = DP_DUAL_MODE_SLAVE_ADDRESS,
|
||||
.flags = I2C_M_RD,
|
||||
.len = size,
|
||||
.len = size + offset,
|
||||
.buf = buffer,
|
||||
},
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (offset) {
|
||||
tmpbuf = kmalloc(size + offset, GFP_KERNEL);
|
||||
if (!tmpbuf)
|
||||
return -ENOMEM;
|
||||
|
||||
msgs[1].buf = tmpbuf;
|
||||
}
|
||||
|
||||
ret = i2c_transfer(adapter, msgs, ARRAY_SIZE(msgs));
|
||||
if (tmpbuf)
|
||||
memcpy(buffer, tmpbuf + offset, size);
|
||||
|
||||
kfree(tmpbuf);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret != ARRAY_SIZE(msgs))
|
||||
|
@ -208,18 +230,6 @@ enum drm_dp_dual_mode_type drm_dp_dual_mode_detect(const struct drm_device *dev,
|
|||
if (ret)
|
||||
return DRM_DP_DUAL_MODE_UNKNOWN;
|
||||
|
||||
/*
|
||||
* Sigh. Some (maybe all?) type 1 adaptors are broken and ack
|
||||
* the offset but ignore it, and instead they just always return
|
||||
* data from the start of the HDMI ID buffer. So for a broken
|
||||
* type 1 HDMI adaptor a single byte read will always give us
|
||||
* 0x44, and for a type 1 DVI adaptor it should give 0x00
|
||||
* (assuming it implements any registers). Fortunately neither
|
||||
* of those values will match the type 2 signature of the
|
||||
* DP_DUAL_MODE_ADAPTOR_ID register so we can proceed with
|
||||
* the type 2 adaptor detection safely even in the presence
|
||||
* of broken type 1 adaptors.
|
||||
*/
|
||||
ret = drm_dp_dual_mode_read(adapter, DP_DUAL_MODE_ADAPTOR_ID,
|
||||
&adaptor_id, sizeof(adaptor_id));
|
||||
drm_dbg_kms(dev, "DP dual mode adaptor ID: %02x (err %zd)\n", adaptor_id, ret);
|
||||
|
@ -233,11 +243,10 @@ enum drm_dp_dual_mode_type drm_dp_dual_mode_detect(const struct drm_device *dev,
|
|||
return DRM_DP_DUAL_MODE_TYPE2_DVI;
|
||||
}
|
||||
/*
|
||||
* If neither a proper type 1 ID nor a broken type 1 adaptor
|
||||
* as described above, assume type 1, but let the user know
|
||||
* that we may have misdetected the type.
|
||||
* If not a proper type 1 ID, still assume type 1, but let
|
||||
* the user know that we may have misdetected the type.
|
||||
*/
|
||||
if (!is_type1_adaptor(adaptor_id) && adaptor_id != hdmi_id[0])
|
||||
if (!is_type1_adaptor(adaptor_id))
|
||||
drm_err(dev, "Unexpected DP dual mode adaptor ID %02x\n", adaptor_id);
|
||||
|
||||
}
|
||||
|
@ -343,10 +352,8 @@ EXPORT_SYMBOL(drm_dp_dual_mode_get_tmds_output);
|
|||
* @enable: enable (as opposed to disable) the TMDS output buffers
|
||||
*
|
||||
* Set the state of the TMDS output buffers in the adaptor. For
|
||||
* type2 this is set via the DP_DUAL_MODE_TMDS_OEN register. As
|
||||
* some type 1 adaptors have problems with registers (see comments
|
||||
* in drm_dp_dual_mode_detect()) we avoid touching the register,
|
||||
* making this function a no-op on type 1 adaptors.
|
||||
* type2 this is set via the DP_DUAL_MODE_TMDS_OEN register.
|
||||
* Type1 adaptors do not support any register writes.
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success, negative error code on failure
|
||||
|
|
|
@ -615,7 +615,7 @@ static int drm_dev_init(struct drm_device *dev,
|
|||
mutex_init(&dev->clientlist_mutex);
|
||||
mutex_init(&dev->master_mutex);
|
||||
|
||||
ret = drmm_add_action(dev, drm_dev_init_release, NULL);
|
||||
ret = drmm_add_action_or_reset(dev, drm_dev_init_release, NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -104,7 +104,8 @@ static inline void drm_vblank_flush_worker(struct drm_vblank_crtc *vblank)
|
|||
|
||||
static inline void drm_vblank_destroy_worker(struct drm_vblank_crtc *vblank)
|
||||
{
|
||||
kthread_destroy_worker(vblank->worker);
|
||||
if (vblank->worker)
|
||||
kthread_destroy_worker(vblank->worker);
|
||||
}
|
||||
|
||||
int drm_vblank_worker_init(struct drm_vblank_crtc *vblank);
|
||||
|
|
|
@ -151,9 +151,6 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
|
|||
count = 0;
|
||||
connector_id = u64_to_user_ptr(card_res->connector_id_ptr);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
if (connector->registration_state != DRM_CONNECTOR_REGISTERED)
|
||||
continue;
|
||||
|
||||
/* only expose writeback connectors if userspace understands them */
|
||||
if (!file_priv->writeback_connectors &&
|
||||
(connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK))
|
||||
|
|
|
@ -1013,9 +1013,6 @@ static vm_fault_t vm_fault_ttm(struct vm_fault *vmf)
|
|||
return VM_FAULT_SIGBUS;
|
||||
}
|
||||
|
||||
if (i915_ttm_cpu_maps_iomem(bo->resource))
|
||||
wakeref = intel_runtime_pm_get(&to_i915(obj->base.dev)->runtime_pm);
|
||||
|
||||
if (!i915_ttm_resource_mappable(bo->resource)) {
|
||||
int err = -ENODEV;
|
||||
int i;
|
||||
|
@ -1042,6 +1039,9 @@ static vm_fault_t vm_fault_ttm(struct vm_fault *vmf)
|
|||
}
|
||||
}
|
||||
|
||||
if (i915_ttm_cpu_maps_iomem(bo->resource))
|
||||
wakeref = intel_runtime_pm_get(&to_i915(obj->base.dev)->runtime_pm);
|
||||
|
||||
if (drm_dev_enter(dev, &idx)) {
|
||||
ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot,
|
||||
TTM_BO_VM_NUM_PREFAULT);
|
||||
|
|
|
@ -112,11 +112,6 @@ int lima_devfreq_init(struct lima_device *ldev)
|
|||
unsigned long cur_freq;
|
||||
int ret;
|
||||
const char *regulator_names[] = { "mali", NULL };
|
||||
const char *clk_names[] = { "core", NULL };
|
||||
struct dev_pm_opp_config config = {
|
||||
.regulator_names = regulator_names,
|
||||
.clk_names = clk_names,
|
||||
};
|
||||
|
||||
if (!device_property_present(dev, "operating-points-v2"))
|
||||
/* Optional, continue without devfreq */
|
||||
|
@ -124,7 +119,15 @@ int lima_devfreq_init(struct lima_device *ldev)
|
|||
|
||||
spin_lock_init(&ldevfreq->lock);
|
||||
|
||||
ret = devm_pm_opp_set_config(dev, &config);
|
||||
/*
|
||||
* clkname is set separately so it is not affected by the optional
|
||||
* regulator setting which may return error.
|
||||
*/
|
||||
ret = devm_pm_opp_set_clkname(dev, "core");
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = devm_pm_opp_set_regulators(dev, regulator_names);
|
||||
if (ret) {
|
||||
/* Continue if the optional regulator is missing */
|
||||
if (ret != -ENODEV)
|
||||
|
|
|
@ -2500,6 +2500,7 @@ static const struct display_timing logictechno_lt161010_2nh_timing = {
|
|||
static const struct panel_desc logictechno_lt161010_2nh = {
|
||||
.timings = &logictechno_lt161010_2nh_timing,
|
||||
.num_timings = 1,
|
||||
.bpc = 6,
|
||||
.size = {
|
||||
.width = 154,
|
||||
.height = 86,
|
||||
|
@ -2529,6 +2530,7 @@ static const struct display_timing logictechno_lt170410_2whc_timing = {
|
|||
static const struct panel_desc logictechno_lt170410_2whc = {
|
||||
.timings = &logictechno_lt170410_2whc_timing,
|
||||
.num_timings = 1,
|
||||
.bpc = 8,
|
||||
.size = {
|
||||
.width = 217,
|
||||
.height = 136,
|
||||
|
|
|
@ -1093,6 +1093,10 @@ static bool host1x_drm_wants_iommu(struct host1x_device *dev)
|
|||
struct host1x *host1x = dev_get_drvdata(dev->dev.parent);
|
||||
struct iommu_domain *domain;
|
||||
|
||||
/* Our IOMMU usage policy doesn't currently play well with GART */
|
||||
if (of_machine_is_compatible("nvidia,tegra20"))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* If the Tegra DRM clients are backed by an IOMMU, push buffers are
|
||||
* likely to be allocated beyond the 32-bit boundary if sufficient
|
||||
|
|
|
@ -197,8 +197,8 @@ vc4_hvs_get_new_global_state(struct drm_atomic_state *state)
|
|||
struct drm_private_state *priv_state;
|
||||
|
||||
priv_state = drm_atomic_get_new_private_obj_state(state, &vc4->hvs_channels);
|
||||
if (IS_ERR(priv_state))
|
||||
return ERR_CAST(priv_state);
|
||||
if (!priv_state)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
return to_vc4_hvs_state(priv_state);
|
||||
}
|
||||
|
@ -210,8 +210,8 @@ vc4_hvs_get_old_global_state(struct drm_atomic_state *state)
|
|||
struct drm_private_state *priv_state;
|
||||
|
||||
priv_state = drm_atomic_get_old_private_obj_state(state, &vc4->hvs_channels);
|
||||
if (IS_ERR(priv_state))
|
||||
return ERR_CAST(priv_state);
|
||||
if (!priv_state)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
return to_vc4_hvs_state(priv_state);
|
||||
}
|
||||
|
|
|
@ -292,6 +292,10 @@ static void host1x_setup_virtualization_tables(struct host1x *host)
|
|||
|
||||
static bool host1x_wants_iommu(struct host1x *host1x)
|
||||
{
|
||||
/* Our IOMMU usage policy doesn't currently play well with GART */
|
||||
if (of_machine_is_compatible("nvidia,tegra20"))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* If we support addressing a maximum of 32 bits of physical memory
|
||||
* and if the host1x firewall is enabled, there's no need to enable
|
||||
|
|
|
@ -869,18 +869,6 @@ static int bma400_init(struct bma400_data *data)
|
|||
unsigned int val;
|
||||
int ret;
|
||||
|
||||
/* Try to read chip_id register. It must return 0x90. */
|
||||
ret = regmap_read(data->regmap, BMA400_CHIP_ID_REG, &val);
|
||||
if (ret) {
|
||||
dev_err(data->dev, "Failed to read chip id register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (val != BMA400_ID_REG_VAL) {
|
||||
dev_err(data->dev, "Chip ID mismatch\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
data->regulators[BMA400_VDD_REGULATOR].supply = "vdd";
|
||||
data->regulators[BMA400_VDDIO_REGULATOR].supply = "vddio";
|
||||
ret = devm_regulator_bulk_get(data->dev,
|
||||
|
@ -906,6 +894,18 @@ static int bma400_init(struct bma400_data *data)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Try to read chip_id register. It must return 0x90. */
|
||||
ret = regmap_read(data->regmap, BMA400_CHIP_ID_REG, &val);
|
||||
if (ret) {
|
||||
dev_err(data->dev, "Failed to read chip id register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (val != BMA400_ID_REG_VAL) {
|
||||
dev_err(data->dev, "Chip ID mismatch\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = bma400_get_power_mode(data);
|
||||
if (ret) {
|
||||
dev_err(data->dev, "Failed to get the initial power-mode\n");
|
||||
|
|
|
@ -2307,11 +2307,9 @@ static int at91_adc_temp_sensor_init(struct at91_adc_state *st,
|
|||
clb->p6 = buf[AT91_ADC_TS_CLB_IDX_P6];
|
||||
|
||||
/*
|
||||
* We prepare here the conversion to milli and also add constant
|
||||
* factor (5 degrees Celsius) to p1 here to avoid doing it on
|
||||
* hotpath.
|
||||
* We prepare here the conversion to milli to avoid doing it on hotpath.
|
||||
*/
|
||||
clb->p1 = clb->p1 * 1000 + 5000;
|
||||
clb->p1 = clb->p1 * 1000;
|
||||
|
||||
free_buf:
|
||||
kfree(buf);
|
||||
|
|
|
@ -634,8 +634,10 @@ static struct iio_trigger *at91_adc_allocate_trigger(struct iio_dev *idev,
|
|||
trig->ops = &at91_adc_trigger_ops;
|
||||
|
||||
ret = iio_trigger_register(trig);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
iio_trigger_free(trig);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return trig;
|
||||
}
|
||||
|
|
|
@ -57,7 +57,8 @@ static struct iio_map mp2629_adc_maps[] = {
|
|||
MP2629_MAP(SYSTEM_VOLT, "system-volt"),
|
||||
MP2629_MAP(INPUT_VOLT, "input-volt"),
|
||||
MP2629_MAP(BATT_CURRENT, "batt-current"),
|
||||
MP2629_MAP(INPUT_CURRENT, "input-current")
|
||||
MP2629_MAP(INPUT_CURRENT, "input-current"),
|
||||
{ }
|
||||
};
|
||||
|
||||
static int mp2629_read_raw(struct iio_dev *indio_dev,
|
||||
|
@ -74,7 +75,7 @@ static int mp2629_read_raw(struct iio_dev *indio_dev,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (chan->address == MP2629_INPUT_VOLT)
|
||||
if (chan->channel == MP2629_INPUT_VOLT)
|
||||
rval &= GENMASK(6, 0);
|
||||
*val = rval;
|
||||
return IIO_VAL_INT;
|
||||
|
|
|
@ -632,7 +632,7 @@ static int bno055_set_regmask(struct bno055_priv *priv, int val, int val2,
|
|||
return -EINVAL;
|
||||
}
|
||||
delta = abs(tbl_val - req_val);
|
||||
if (delta < best_delta || first) {
|
||||
if (first || delta < best_delta) {
|
||||
best_delta = delta;
|
||||
hwval = i;
|
||||
first = false;
|
||||
|
|
|
@ -25,13 +25,6 @@ enum {
|
|||
MS5607,
|
||||
};
|
||||
|
||||
struct ms5611_chip_info {
|
||||
u16 prom[MS5611_PROM_WORDS_NB];
|
||||
|
||||
int (*temp_and_pressure_compensate)(struct ms5611_chip_info *chip_info,
|
||||
s32 *temp, s32 *pressure);
|
||||
};
|
||||
|
||||
/*
|
||||
* OverSampling Rate descriptor.
|
||||
* Warning: cmd MUST be kept aligned on a word boundary (see
|
||||
|
@ -50,12 +43,15 @@ struct ms5611_state {
|
|||
const struct ms5611_osr *pressure_osr;
|
||||
const struct ms5611_osr *temp_osr;
|
||||
|
||||
u16 prom[MS5611_PROM_WORDS_NB];
|
||||
|
||||
int (*reset)(struct ms5611_state *st);
|
||||
int (*read_prom_word)(struct ms5611_state *st, int index, u16 *word);
|
||||
int (*read_adc_temp_and_pressure)(struct ms5611_state *st,
|
||||
s32 *temp, s32 *pressure);
|
||||
|
||||
struct ms5611_chip_info *chip_info;
|
||||
int (*compensate_temp_and_pressure)(struct ms5611_state *st, s32 *temp,
|
||||
s32 *pressure);
|
||||
struct regulator *vdd;
|
||||
};
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ static int ms5611_read_prom(struct iio_dev *indio_dev)
|
|||
struct ms5611_state *st = iio_priv(indio_dev);
|
||||
|
||||
for (i = 0; i < MS5611_PROM_WORDS_NB; i++) {
|
||||
ret = st->read_prom_word(st, i, &st->chip_info->prom[i]);
|
||||
ret = st->read_prom_word(st, i, &st->prom[i]);
|
||||
if (ret < 0) {
|
||||
dev_err(&indio_dev->dev,
|
||||
"failed to read prom at %d\n", i);
|
||||
|
@ -93,7 +93,7 @@ static int ms5611_read_prom(struct iio_dev *indio_dev)
|
|||
}
|
||||
}
|
||||
|
||||
if (!ms5611_prom_is_valid(st->chip_info->prom, MS5611_PROM_WORDS_NB)) {
|
||||
if (!ms5611_prom_is_valid(st->prom, MS5611_PROM_WORDS_NB)) {
|
||||
dev_err(&indio_dev->dev, "PROM integrity check failed\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -114,21 +114,20 @@ static int ms5611_read_temp_and_pressure(struct iio_dev *indio_dev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
return st->chip_info->temp_and_pressure_compensate(st->chip_info,
|
||||
temp, pressure);
|
||||
return st->compensate_temp_and_pressure(st, temp, pressure);
|
||||
}
|
||||
|
||||
static int ms5611_temp_and_pressure_compensate(struct ms5611_chip_info *chip_info,
|
||||
static int ms5611_temp_and_pressure_compensate(struct ms5611_state *st,
|
||||
s32 *temp, s32 *pressure)
|
||||
{
|
||||
s32 t = *temp, p = *pressure;
|
||||
s64 off, sens, dt;
|
||||
|
||||
dt = t - (chip_info->prom[5] << 8);
|
||||
off = ((s64)chip_info->prom[2] << 16) + ((chip_info->prom[4] * dt) >> 7);
|
||||
sens = ((s64)chip_info->prom[1] << 15) + ((chip_info->prom[3] * dt) >> 8);
|
||||
dt = t - (st->prom[5] << 8);
|
||||
off = ((s64)st->prom[2] << 16) + ((st->prom[4] * dt) >> 7);
|
||||
sens = ((s64)st->prom[1] << 15) + ((st->prom[3] * dt) >> 8);
|
||||
|
||||
t = 2000 + ((chip_info->prom[6] * dt) >> 23);
|
||||
t = 2000 + ((st->prom[6] * dt) >> 23);
|
||||
if (t < 2000) {
|
||||
s64 off2, sens2, t2;
|
||||
|
||||
|
@ -154,17 +153,17 @@ static int ms5611_temp_and_pressure_compensate(struct ms5611_chip_info *chip_inf
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ms5607_temp_and_pressure_compensate(struct ms5611_chip_info *chip_info,
|
||||
static int ms5607_temp_and_pressure_compensate(struct ms5611_state *st,
|
||||
s32 *temp, s32 *pressure)
|
||||
{
|
||||
s32 t = *temp, p = *pressure;
|
||||
s64 off, sens, dt;
|
||||
|
||||
dt = t - (chip_info->prom[5] << 8);
|
||||
off = ((s64)chip_info->prom[2] << 17) + ((chip_info->prom[4] * dt) >> 6);
|
||||
sens = ((s64)chip_info->prom[1] << 16) + ((chip_info->prom[3] * dt) >> 7);
|
||||
dt = t - (st->prom[5] << 8);
|
||||
off = ((s64)st->prom[2] << 17) + ((st->prom[4] * dt) >> 6);
|
||||
sens = ((s64)st->prom[1] << 16) + ((st->prom[3] * dt) >> 7);
|
||||
|
||||
t = 2000 + ((chip_info->prom[6] * dt) >> 23);
|
||||
t = 2000 + ((st->prom[6] * dt) >> 23);
|
||||
if (t < 2000) {
|
||||
s64 off2, sens2, t2, tmp;
|
||||
|
||||
|
@ -342,15 +341,6 @@ static int ms5611_write_raw(struct iio_dev *indio_dev,
|
|||
|
||||
static const unsigned long ms5611_scan_masks[] = {0x3, 0};
|
||||
|
||||
static struct ms5611_chip_info chip_info_tbl[] = {
|
||||
[MS5611] = {
|
||||
.temp_and_pressure_compensate = ms5611_temp_and_pressure_compensate,
|
||||
},
|
||||
[MS5607] = {
|
||||
.temp_and_pressure_compensate = ms5607_temp_and_pressure_compensate,
|
||||
}
|
||||
};
|
||||
|
||||
static const struct iio_chan_spec ms5611_channels[] = {
|
||||
{
|
||||
.type = IIO_PRESSURE,
|
||||
|
@ -433,7 +423,20 @@ int ms5611_probe(struct iio_dev *indio_dev, struct device *dev,
|
|||
struct ms5611_state *st = iio_priv(indio_dev);
|
||||
|
||||
mutex_init(&st->lock);
|
||||
st->chip_info = &chip_info_tbl[type];
|
||||
|
||||
switch (type) {
|
||||
case MS5611:
|
||||
st->compensate_temp_and_pressure =
|
||||
ms5611_temp_and_pressure_compensate;
|
||||
break;
|
||||
case MS5607:
|
||||
st->compensate_temp_and_pressure =
|
||||
ms5607_temp_and_pressure_compensate;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
st->temp_osr =
|
||||
&ms5611_avail_temp_osr[ARRAY_SIZE(ms5611_avail_temp_osr) - 1];
|
||||
st->pressure_osr =
|
||||
|
|
|
@ -91,7 +91,7 @@ static int ms5611_spi_probe(struct spi_device *spi)
|
|||
spi_set_drvdata(spi, indio_dev);
|
||||
|
||||
spi->mode = SPI_MODE_0;
|
||||
spi->max_speed_hz = 20000000;
|
||||
spi->max_speed_hz = min(spi->max_speed_hz, 20000000U);
|
||||
spi->bits_per_word = 8;
|
||||
ret = spi_setup(spi);
|
||||
if (ret < 0)
|
||||
|
|
|
@ -203,9 +203,13 @@ static int iio_sysfs_trigger_remove(int id)
|
|||
|
||||
static int __init iio_sysfs_trig_init(void)
|
||||
{
|
||||
int ret;
|
||||
device_initialize(&iio_sysfs_trig_dev);
|
||||
dev_set_name(&iio_sysfs_trig_dev, "iio_sysfs_trigger");
|
||||
return device_add(&iio_sysfs_trig_dev);
|
||||
ret = device_add(&iio_sysfs_trig_dev);
|
||||
if (ret)
|
||||
put_device(&iio_sysfs_trig_dev);
|
||||
return ret;
|
||||
}
|
||||
module_init(iio_sysfs_trig_init);
|
||||
|
||||
|
|
|
@ -273,22 +273,22 @@ int iforce_init_device(struct device *parent, u16 bustype,
|
|||
* Get device info.
|
||||
*/
|
||||
|
||||
if (!iforce_get_id_packet(iforce, 'M', buf, &len) || len < 3)
|
||||
if (!iforce_get_id_packet(iforce, 'M', buf, &len) && len >= 3)
|
||||
input_dev->id.vendor = get_unaligned_le16(buf + 1);
|
||||
else
|
||||
dev_warn(&iforce->dev->dev, "Device does not respond to id packet M\n");
|
||||
|
||||
if (!iforce_get_id_packet(iforce, 'P', buf, &len) || len < 3)
|
||||
if (!iforce_get_id_packet(iforce, 'P', buf, &len) && len >= 3)
|
||||
input_dev->id.product = get_unaligned_le16(buf + 1);
|
||||
else
|
||||
dev_warn(&iforce->dev->dev, "Device does not respond to id packet P\n");
|
||||
|
||||
if (!iforce_get_id_packet(iforce, 'B', buf, &len) || len < 3)
|
||||
if (!iforce_get_id_packet(iforce, 'B', buf, &len) && len >= 3)
|
||||
iforce->device_memory.end = get_unaligned_le16(buf + 1);
|
||||
else
|
||||
dev_warn(&iforce->dev->dev, "Device does not respond to id packet B\n");
|
||||
|
||||
if (!iforce_get_id_packet(iforce, 'N', buf, &len) || len < 2)
|
||||
if (!iforce_get_id_packet(iforce, 'N', buf, &len) && len >= 2)
|
||||
ff_effects = buf[1];
|
||||
else
|
||||
dev_warn(&iforce->dev->dev, "Device does not respond to id packet N\n");
|
||||
|
|
|
@ -18,6 +18,10 @@
|
|||
#include <linux/gpio.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
static bool use_low_level_irq;
|
||||
module_param(use_low_level_irq, bool, 0444);
|
||||
MODULE_PARM_DESC(use_low_level_irq, "Use low-level triggered IRQ instead of edge triggered");
|
||||
|
||||
struct soc_button_info {
|
||||
const char *name;
|
||||
int acpi_index;
|
||||
|
@ -73,6 +77,13 @@ static const struct dmi_system_id dmi_use_low_level_irq[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Acer Switch V 10 SW5-017, same issue as Acer Switch 10 SW5-012. */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/*
|
||||
* Acer One S1003. _LID method messes with power-button GPIO
|
||||
|
@ -164,7 +175,8 @@ soc_button_device_create(struct platform_device *pdev,
|
|||
}
|
||||
|
||||
/* See dmi_use_low_level_irq[] comment */
|
||||
if (!autorepeat && dmi_check_system(dmi_use_low_level_irq)) {
|
||||
if (!autorepeat && (use_low_level_irq ||
|
||||
dmi_check_system(dmi_use_low_level_irq))) {
|
||||
irq_set_irq_type(irq, IRQ_TYPE_LEVEL_LOW);
|
||||
gpio_keys[n_buttons].irq = irq;
|
||||
gpio_keys[n_buttons].gpio = -ENOENT;
|
||||
|
|
|
@ -192,6 +192,7 @@ static const char * const smbus_pnp_ids[] = {
|
|||
"SYN3221", /* HP 15-ay000 */
|
||||
"SYN323d", /* HP Spectre X360 13-w013dx */
|
||||
"SYN3257", /* HP Envy 13-ad105ng */
|
||||
"SYN3286", /* HP Laptop 15-da3001TU */
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
|
@ -115,18 +115,18 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
|||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_NEVER)
|
||||
},
|
||||
{
|
||||
/* ASUS ZenBook UX425UA */
|
||||
/* ASUS ZenBook UX425UA/QA */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425UA"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER)
|
||||
},
|
||||
{
|
||||
/* ASUS ZenBook UM325UA */
|
||||
/* ASUS ZenBook UM325UA/QA */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UA_UM325UA"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER)
|
||||
},
|
||||
|
|
|
@ -1543,8 +1543,6 @@ static int i8042_probe(struct platform_device *dev)
|
|||
{
|
||||
int error;
|
||||
|
||||
i8042_platform_device = dev;
|
||||
|
||||
if (i8042_reset == I8042_RESET_ALWAYS) {
|
||||
error = i8042_controller_selftest();
|
||||
if (error)
|
||||
|
@ -1582,7 +1580,6 @@ static int i8042_probe(struct platform_device *dev)
|
|||
i8042_free_aux_ports(); /* in case KBD failed but AUX not */
|
||||
i8042_free_irqs();
|
||||
i8042_controller_reset(false);
|
||||
i8042_platform_device = NULL;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
@ -1592,7 +1589,6 @@ static int i8042_remove(struct platform_device *dev)
|
|||
i8042_unregister_ports();
|
||||
i8042_free_irqs();
|
||||
i8042_controller_reset(false);
|
||||
i8042_platform_device = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue