Merge 4.2-rc4 into usb-next

We want the USB fixes that went into that release in this branch as
well.

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Greg Kroah-Hartman 2015-07-27 11:15:16 -07:00
commit 722b262c96
274 changed files with 2105 additions and 1578 deletions

View file

@ -35,3 +35,6 @@ the PCIe specification.
NOTE: this only applies to the SMMU itself, not NOTE: this only applies to the SMMU itself, not
masters connected upstream of the SMMU. masters connected upstream of the SMMU.
- hisilicon,broken-prefetch-cmd
: Avoid sending CMD_PREFETCH_* commands to the SMMU.

View file

@ -17,7 +17,6 @@ Required properties:
"fsl,imx6sx-usdhc" "fsl,imx6sx-usdhc"
Optional properties: Optional properties:
- fsl,cd-controller : Indicate to use controller internal card detection
- fsl,wp-controller : Indicate to use controller internal write protection - fsl,wp-controller : Indicate to use controller internal write protection
- fsl,delay-line : Specify the number of delay cells for override mode. - fsl,delay-line : Specify the number of delay cells for override mode.
This is used to set the clock delay for DLL(Delay Line) on override mode This is used to set the clock delay for DLL(Delay Line) on override mode
@ -35,7 +34,6 @@ esdhc@70004000 {
compatible = "fsl,imx51-esdhc"; compatible = "fsl,imx51-esdhc";
reg = <0x70004000 0x4000>; reg = <0x70004000 0x4000>;
interrupts = <1>; interrupts = <1>;
fsl,cd-controller;
fsl,wp-controller; fsl,wp-controller;
}; };

View file

@ -5899,7 +5899,6 @@ S: Supported
F: Documentation/s390/kvm.txt F: Documentation/s390/kvm.txt
F: arch/s390/include/asm/kvm* F: arch/s390/include/asm/kvm*
F: arch/s390/kvm/ F: arch/s390/kvm/
F: drivers/s390/kvm/
KERNEL VIRTUAL MACHINE (KVM) FOR ARM KERNEL VIRTUAL MACHINE (KVM) FOR ARM
M: Christoffer Dall <christoffer.dall@linaro.org> M: Christoffer Dall <christoffer.dall@linaro.org>
@ -6839,6 +6838,12 @@ T: git git://linuxtv.org/anttip/media_tree.git
S: Maintained S: Maintained
F: drivers/media/usb/msi2500/ F: drivers/media/usb/msi2500/
MSYSTEMS DISKONCHIP G3 MTD DRIVER
M: Robert Jarzmik <robert.jarzmik@free.fr>
L: linux-mtd@lists.infradead.org
S: Maintained
F: drivers/mtd/devices/docg3*
MT9M032 APTINA SENSOR DRIVER MT9M032 APTINA SENSOR DRIVER
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com> M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
L: linux-media@vger.kernel.org L: linux-media@vger.kernel.org
@ -10896,6 +10901,15 @@ F: drivers/block/virtio_blk.c
F: include/linux/virtio_*.h F: include/linux/virtio_*.h
F: include/uapi/linux/virtio_*.h F: include/uapi/linux/virtio_*.h
VIRTIO DRIVERS FOR S390
M: Christian Borntraeger <borntraeger@de.ibm.com>
M: Cornelia Huck <cornelia.huck@de.ibm.com>
L: linux-s390@vger.kernel.org
L: virtualization@lists.linux-foundation.org
L: kvm@vger.kernel.org
S: Supported
F: drivers/s390/virtio/
VIRTIO GPU DRIVER VIRTIO GPU DRIVER
M: David Airlie <airlied@linux.ie> M: David Airlie <airlied@linux.ie>
M: Gerd Hoffmann <kraxel@redhat.com> M: Gerd Hoffmann <kraxel@redhat.com>

View file

@ -1,7 +1,7 @@
VERSION = 4 VERSION = 4
PATCHLEVEL = 2 PATCHLEVEL = 2
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc3 EXTRAVERSION = -rc4
NAME = Hurr durr I'ma sheep NAME = Hurr durr I'ma sheep
# *DOCUMENTATION* # *DOCUMENTATION*

View file

@ -10,6 +10,7 @@
*/ */
/dts-v1/; /dts-v1/;
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h> #include <dt-bindings/input/input.h>
#include "imx25.dtsi" #include "imx25.dtsi"
@ -114,8 +115,8 @@
&esdhc1 { &esdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc1>; pinctrl-0 = <&pinctrl_esdhc1>;
cd-gpios = <&gpio2 1 0>; cd-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 0 0>; wp-gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };

View file

@ -98,7 +98,7 @@
&esdhc1 { &esdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc1>; pinctrl-0 = <&pinctrl_esdhc1>;
cd-gpios = <&gpio2 29 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio2 29 GPIO_ACTIVE_LOW>;
bus-width = <4>; bus-width = <4>;
status = "okay"; status = "okay";
}; };

View file

@ -103,8 +103,8 @@
&esdhc1 { &esdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc1>; pinctrl-0 = <&pinctrl_esdhc1>;
cd-gpios = <&gpio1 1 0>; cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio1 9 0>; wp-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };

View file

@ -124,8 +124,8 @@
&esdhc1 { &esdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc1>; pinctrl-0 = <&pinctrl_esdhc1>;
cd-gpios = <&gpio1 1 0>; cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio1 9 0>; wp-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };

View file

@ -147,8 +147,8 @@
&esdhc3 { &esdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc3>; pinctrl-0 = <&pinctrl_esdhc3>;
cd-gpios = <&gpio3 11 0>; cd-gpios = <&gpio3 11 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio3 12 0>; wp-gpios = <&gpio3 12 GPIO_ACTIVE_HIGH>;
bus-width = <8>; bus-width = <8>;
status = "okay"; status = "okay";
}; };

View file

@ -41,8 +41,8 @@
&esdhc1 { &esdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc1>; pinctrl-0 = <&pinctrl_esdhc1>;
cd-gpios = <&gpio3 13 0>; cd-gpios = <&gpio3 13 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio4 11 0>; wp-gpios = <&gpio4 11 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };

View file

@ -41,8 +41,8 @@
pinctrl-0 = <&pinctrl_esdhc2>, pinctrl-0 = <&pinctrl_esdhc2>,
<&pinctrl_esdhc2_cdwp>; <&pinctrl_esdhc2_cdwp>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
wp-gpios = <&gpio1 2 0>; wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
cd-gpios = <&gpio1 4 0>; cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
status = "disabled"; status = "disabled";
}; };

View file

@ -183,7 +183,7 @@
}; };
&esdhc1 { &esdhc1 {
cd-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio3 24 GPIO_ACTIVE_LOW>;
fsl,wp-controller; fsl,wp-controller;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc1>; pinctrl-0 = <&pinctrl_esdhc1>;
@ -191,7 +191,7 @@
}; };
&esdhc2 { &esdhc2 {
cd-gpios = <&gpio3 25 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio3 25 GPIO_ACTIVE_LOW>;
fsl,wp-controller; fsl,wp-controller;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc2>; pinctrl-0 = <&pinctrl_esdhc2>;

View file

@ -119,8 +119,8 @@
&esdhc2 { &esdhc2 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc2>; pinctrl-0 = <&pinctrl_esdhc2>;
cd-gpios = <&gpio3 25 0>; cd-gpios = <&gpio3 25 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 19 0>; wp-gpios = <&gpio2 19 GPIO_ACTIVE_HIGH>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };

View file

@ -305,8 +305,8 @@
&usdhc2 { &usdhc2 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
cd-gpios = <&gpio1 4 0>; cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio1 2 0>; wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
@ -314,8 +314,8 @@
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio7 0 0>; cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio7 1 0>; wp-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };

View file

@ -11,6 +11,7 @@
*/ */
/dts-v1/; /dts-v1/;
#include <dt-bindings/gpio/gpio.h>
#include "imx6q.dtsi" #include "imx6q.dtsi"
/ { / {
@ -196,8 +197,8 @@
}; };
&usdhc3 { &usdhc3 {
cd-gpios = <&gpio6 11 0>; cd-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio6 14 0>; wp-gpios = <&gpio6 14 GPIO_ACTIVE_HIGH>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3 pinctrl-0 = <&pinctrl_usdhc3

View file

@ -7,6 +7,7 @@
*/ */
/dts-v1/; /dts-v1/;
#include <dt-bindings/gpio/gpio.h>
#include "imx6q.dtsi" #include "imx6q.dtsi"
/ { / {
@ -161,7 +162,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
bus-width = <4>; bus-width = <4>;
cd-gpios = <&gpio6 11 0>; cd-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };

View file

@ -251,7 +251,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
bus-width = <4>; bus-width = <4>;
cd-gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
@ -260,7 +260,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
bus-width = <4>; bus-width = <4>;
cd-gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>; wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";

View file

@ -173,7 +173,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc1>; pinctrl-0 = <&pinctrl_usdhc1>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
cd-gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio4 7 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };
@ -181,7 +181,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
cd-gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio4 8 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };

View file

@ -392,7 +392,7 @@
&usdhc1 { &usdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc1>; pinctrl-0 = <&pinctrl_usdhc1>;
cd-gpios = <&gpio1 27 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio1 27 GPIO_ACTIVE_LOW>;
no-1-8-v; no-1-8-v;
status = "okay"; status = "okay";
}; };
@ -400,7 +400,7 @@
&usdhc2 { &usdhc2 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
cd-gpios = <&gpio4 5 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio4 5 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>; wp-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>;
no-1-8-v; no-1-8-v;
status = "okay"; status = "okay";

View file

@ -258,6 +258,6 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_cubox_i_usdhc2_aux &pinctrl_cubox_i_usdhc2>; pinctrl-0 = <&pinctrl_cubox_i_usdhc2_aux &pinctrl_cubox_i_usdhc2>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
cd-gpios = <&gpio1 4 0>; cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };

View file

@ -1,3 +1,5 @@
#include <dt-bindings/gpio/gpio.h>
/ { / {
regulators { regulators {
compatible = "simple-bus"; compatible = "simple-bus";
@ -181,7 +183,7 @@
&usdhc2 { /* module slot */ &usdhc2 { /* module slot */
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
cd-gpios = <&gpio2 2 0>; cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };

View file

@ -318,7 +318,7 @@
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };

View file

@ -324,7 +324,7 @@
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };

View file

@ -417,7 +417,7 @@
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };

View file

@ -299,6 +299,6 @@
&pinctrl_hummingboard_usdhc2 &pinctrl_hummingboard_usdhc2
>; >;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
cd-gpios = <&gpio1 4 0>; cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };

View file

@ -453,7 +453,7 @@
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio7 0 0>; cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
@ -461,7 +461,7 @@
&usdhc4 { &usdhc4 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc4>; pinctrl-0 = <&pinctrl_usdhc4>;
cd-gpios = <&gpio2 6 0>; cd-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };

View file

@ -409,8 +409,8 @@
&usdhc2 { &usdhc2 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
cd-gpios = <&gpio1 4 0>; cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio1 2 0>; wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
status = "disabled"; status = "disabled";
}; };
@ -418,7 +418,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3 pinctrl-0 = <&pinctrl_usdhc3
&pinctrl_usdhc3_cdwp>; &pinctrl_usdhc3_cdwp>;
cd-gpios = <&gpio1 27 0>; cd-gpios = <&gpio1 27 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio1 29 0>; wp-gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>;
status = "disabled"; status = "disabled";
}; };

View file

@ -342,7 +342,7 @@
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
bus-width = <4>; bus-width = <4>;
cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>; cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 3 GPIO_ACTIVE_LOW>; wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
@ -351,6 +351,6 @@
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
bus-width = <4>; bus-width = <4>;
cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>; cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>; wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };

View file

@ -467,8 +467,8 @@
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
pinctrl-1 = <&pinctrl_usdhc3_100mhz>; pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
pinctrl-2 = <&pinctrl_usdhc3_200mhz>; pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
cd-gpios = <&gpio6 15 0>; cd-gpios = <&gpio6 15 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio1 13 0>; wp-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };

View file

@ -448,8 +448,8 @@
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio7 0 0>; cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio7 1 0>; wp-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
@ -457,7 +457,7 @@
&usdhc4 { &usdhc4 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc4>; pinctrl-0 = <&pinctrl_usdhc4>;
cd-gpios = <&gpio2 6 0>; cd-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };

View file

@ -562,8 +562,8 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
bus-width = <8>; bus-width = <8>;
cd-gpios = <&gpio2 2 0>; cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 3 0>; wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
@ -571,8 +571,8 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
bus-width = <8>; bus-width = <8>;
cd-gpios = <&gpio2 0 0>; cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 1 0>; wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };

View file

@ -680,7 +680,7 @@
pinctrl-0 = <&pinctrl_usdhc1>; pinctrl-0 = <&pinctrl_usdhc1>;
bus-width = <4>; bus-width = <4>;
no-1-8-v; no-1-8-v;
cd-gpios = <&gpio7 2 0>; cd-gpios = <&gpio7 2 GPIO_ACTIVE_LOW>;
fsl,wp-controller; fsl,wp-controller;
status = "okay"; status = "okay";
}; };
@ -690,7 +690,7 @@
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
bus-width = <4>; bus-width = <4>;
no-1-8-v; no-1-8-v;
cd-gpios = <&gpio7 3 0>; cd-gpios = <&gpio7 3 GPIO_ACTIVE_LOW>;
fsl,wp-controller; fsl,wp-controller;
status = "okay"; status = "okay";
}; };

View file

@ -9,6 +9,8 @@
* *
*/ */
#include <dt-bindings/gpio/gpio.h>
/ { / {
regulators { regulators {
compatible = "simple-bus"; compatible = "simple-bus";
@ -250,13 +252,13 @@
&usdhc1 { &usdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc1>; pinctrl-0 = <&pinctrl_usdhc1>;
cd-gpios = <&gpio1 2 0>; cd-gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio3 9 0>; cd-gpios = <&gpio3 9 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };

View file

@ -617,8 +617,8 @@
pinctrl-1 = <&pinctrl_usdhc1_100mhz>; pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
pinctrl-2 = <&pinctrl_usdhc1_200mhz>; pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
bus-width = <8>; bus-width = <8>;
cd-gpios = <&gpio4 7 0>; cd-gpios = <&gpio4 7 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio4 6 0>; wp-gpios = <&gpio4 6 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
@ -627,8 +627,8 @@
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
pinctrl-1 = <&pinctrl_usdhc2_100mhz>; pinctrl-1 = <&pinctrl_usdhc2_100mhz>;
pinctrl-2 = <&pinctrl_usdhc2_200mhz>; pinctrl-2 = <&pinctrl_usdhc2_200mhz>;
cd-gpios = <&gpio5 0 0>; cd-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio4 29 0>; wp-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
@ -637,6 +637,6 @@
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
pinctrl-1 = <&pinctrl_usdhc3_100mhz>; pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
pinctrl-2 = <&pinctrl_usdhc3_200mhz>; pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
cd-gpios = <&gpio3 22 0>; cd-gpios = <&gpio3 22 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };

View file

@ -49,7 +49,7 @@
pinctrl-1 = <&pinctrl_usdhc3_100mhz>; pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
pinctrl-2 = <&pinctrl_usdhc3_200mhz>; pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
bus-width = <8>; bus-width = <8>;
cd-gpios = <&gpio7 10 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio7 10 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>; wp-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
keep-power-in-suspend; keep-power-in-suspend;
enable-sdio-wakeup; enable-sdio-wakeup;
@ -61,7 +61,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc4>; pinctrl-0 = <&pinctrl_usdhc4>;
bus-width = <8>; bus-width = <8>;
cd-gpios = <&gpio7 11 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio7 11 GPIO_ACTIVE_LOW>;
no-1-8-v; no-1-8-v;
keep-power-in-suspend; keep-power-in-suspend;
enable-sdio-wakup; enable-sdio-wakup;

View file

@ -293,7 +293,7 @@
pinctrl-1 = <&pinctrl_usdhc3_100mhz>; pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
pinctrl-2 = <&pinctrl_usdhc3_200mhz>; pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
bus-width = <8>; bus-width = <8>;
cd-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>; wp-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>;
keep-power-in-suspend; keep-power-in-suspend;
enable-sdio-wakeup; enable-sdio-wakeup;
@ -304,7 +304,7 @@
&usdhc4 { &usdhc4 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc4>; pinctrl-0 = <&pinctrl_usdhc4>;
cd-gpios = <&gpio6 21 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio6 21 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio6 20 GPIO_ACTIVE_HIGH>; wp-gpios = <&gpio6 20 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };

View file

@ -234,8 +234,8 @@
&usdhc1 { &usdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc1>; pinctrl-0 = <&pinctrl_usdhc1>;
cd-gpios = <&gpio5 0 0>; cd-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio5 1 0>; wp-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;
enable-sdio-wakeup; enable-sdio-wakeup;
keep-power-in-suspend; keep-power-in-suspend;
status = "okay"; status = "okay";

View file

@ -74,32 +74,52 @@ struct jit_ctx {
int bpf_jit_enable __read_mostly; int bpf_jit_enable __read_mostly;
static u64 jit_get_skb_b(struct sk_buff *skb, unsigned offset) static inline int call_neg_helper(struct sk_buff *skb, int offset, void *ret,
unsigned int size)
{
void *ptr = bpf_internal_load_pointer_neg_helper(skb, offset, size);
if (!ptr)
return -EFAULT;
memcpy(ret, ptr, size);
return 0;
}
static u64 jit_get_skb_b(struct sk_buff *skb, int offset)
{ {
u8 ret; u8 ret;
int err; int err;
err = skb_copy_bits(skb, offset, &ret, 1); if (offset < 0)
err = call_neg_helper(skb, offset, &ret, 1);
else
err = skb_copy_bits(skb, offset, &ret, 1);
return (u64)err << 32 | ret; return (u64)err << 32 | ret;
} }
static u64 jit_get_skb_h(struct sk_buff *skb, unsigned offset) static u64 jit_get_skb_h(struct sk_buff *skb, int offset)
{ {
u16 ret; u16 ret;
int err; int err;
err = skb_copy_bits(skb, offset, &ret, 2); if (offset < 0)
err = call_neg_helper(skb, offset, &ret, 2);
else
err = skb_copy_bits(skb, offset, &ret, 2);
return (u64)err << 32 | ntohs(ret); return (u64)err << 32 | ntohs(ret);
} }
static u64 jit_get_skb_w(struct sk_buff *skb, unsigned offset) static u64 jit_get_skb_w(struct sk_buff *skb, int offset)
{ {
u32 ret; u32 ret;
int err; int err;
err = skb_copy_bits(skb, offset, &ret, 4); if (offset < 0)
err = call_neg_helper(skb, offset, &ret, 4);
else
err = skb_copy_bits(skb, offset, &ret, 4);
return (u64)err << 32 | ntohl(ret); return (u64)err << 32 | ntohl(ret);
} }
@ -536,9 +556,6 @@ static int build_body(struct jit_ctx *ctx)
case BPF_LD | BPF_B | BPF_ABS: case BPF_LD | BPF_B | BPF_ABS:
load_order = 0; load_order = 0;
load: load:
/* the interpreter will deal with the negative K */
if ((int)k < 0)
return -ENOTSUPP;
emit_mov_i(r_off, k, ctx); emit_mov_i(r_off, k, ctx);
load_common: load_common:
ctx->seen |= SEEN_DATA | SEEN_CALL; ctx->seen |= SEEN_DATA | SEEN_CALL;
@ -547,12 +564,24 @@ load_common:
emit(ARM_SUB_I(r_scratch, r_skb_hl, emit(ARM_SUB_I(r_scratch, r_skb_hl,
1 << load_order), ctx); 1 << load_order), ctx);
emit(ARM_CMP_R(r_scratch, r_off), ctx); emit(ARM_CMP_R(r_scratch, r_off), ctx);
condt = ARM_COND_HS; condt = ARM_COND_GE;
} else { } else {
emit(ARM_CMP_R(r_skb_hl, r_off), ctx); emit(ARM_CMP_R(r_skb_hl, r_off), ctx);
condt = ARM_COND_HI; condt = ARM_COND_HI;
} }
/*
* test for negative offset, only if we are
* currently scheduled to take the fast
* path. this will update the flags so that
* the slowpath instruction are ignored if the
* offset is negative.
*
* for loard_order == 0 the HI condition will
* make loads at offset 0 take the slow path too.
*/
_emit(condt, ARM_CMP_I(r_off, 0), ctx);
_emit(condt, ARM_ADD_R(r_scratch, r_off, r_skb_data), _emit(condt, ARM_ADD_R(r_scratch, r_off, r_skb_data),
ctx); ctx);
@ -860,9 +889,11 @@ b_epilogue:
off = offsetof(struct sk_buff, vlan_tci); off = offsetof(struct sk_buff, vlan_tci);
emit(ARM_LDRH_I(r_A, r_skb, off), ctx); emit(ARM_LDRH_I(r_A, r_skb, off), ctx);
if (code == (BPF_ANC | SKF_AD_VLAN_TAG)) if (code == (BPF_ANC | SKF_AD_VLAN_TAG))
OP_IMM3(ARM_AND, r_A, r_A, VLAN_VID_MASK, ctx); OP_IMM3(ARM_AND, r_A, r_A, ~VLAN_TAG_PRESENT, ctx);
else else {
OP_IMM3(ARM_AND, r_A, r_A, VLAN_TAG_PRESENT, ctx); OP_IMM3(ARM_LSR, r_A, r_A, 12, ctx);
OP_IMM3(ARM_AND, r_A, r_A, 0x1, ctx);
}
break; break;
case BPF_ANC | SKF_AD_QUEUE: case BPF_ANC | SKF_AD_QUEUE:
ctx->seen |= SEEN_SKB; ctx->seen |= SEEN_SKB;

View file

@ -585,7 +585,8 @@ ENDPROC(el0_irq)
* *
*/ */
ENTRY(cpu_switch_to) ENTRY(cpu_switch_to)
add x8, x0, #THREAD_CPU_CONTEXT mov x10, #THREAD_CPU_CONTEXT
add x8, x0, x10
mov x9, sp mov x9, sp
stp x19, x20, [x8], #16 // store callee-saved registers stp x19, x20, [x8], #16 // store callee-saved registers
stp x21, x22, [x8], #16 stp x21, x22, [x8], #16
@ -594,7 +595,7 @@ ENTRY(cpu_switch_to)
stp x27, x28, [x8], #16 stp x27, x28, [x8], #16
stp x29, x9, [x8], #16 stp x29, x9, [x8], #16
str lr, [x8] str lr, [x8]
add x8, x1, #THREAD_CPU_CONTEXT add x8, x1, x10
ldp x19, x20, [x8], #16 // restore callee-saved registers ldp x19, x20, [x8], #16 // restore callee-saved registers
ldp x21, x22, [x8], #16 ldp x21, x22, [x8], #16
ldp x23, x24, [x8], #16 ldp x23, x24, [x8], #16

View file

@ -61,7 +61,7 @@ void __init init_IRQ(void)
static bool migrate_one_irq(struct irq_desc *desc) static bool migrate_one_irq(struct irq_desc *desc)
{ {
struct irq_data *d = irq_desc_get_irq_data(desc); struct irq_data *d = irq_desc_get_irq_data(desc);
const struct cpumask *affinity = d->affinity; const struct cpumask *affinity = irq_data_get_affinity_mask(d);
struct irq_chip *c; struct irq_chip *c;
bool ret = false; bool ret = false;
@ -81,7 +81,7 @@ static bool migrate_one_irq(struct irq_desc *desc)
if (!c->irq_set_affinity) if (!c->irq_set_affinity)
pr_debug("IRQ%u: unable to set affinity\n", d->irq); pr_debug("IRQ%u: unable to set affinity\n", d->irq);
else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret) else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret)
cpumask_copy(d->affinity, affinity); cpumask_copy(irq_data_get_affinity_mask(d), affinity);
return ret; return ret;
} }

View file

@ -18,6 +18,7 @@
#include <mach/pm.h> #include <mach/pm.h>
static bool disable_cpu_idle_poll;
static cycle_t read_cycle_count(struct clocksource *cs) static cycle_t read_cycle_count(struct clocksource *cs)
{ {
@ -80,45 +81,45 @@ static int comparator_next_event(unsigned long delta,
return 0; return 0;
} }
static void comparator_mode(enum clock_event_mode mode, static int comparator_shutdown(struct clock_event_device *evdev)
struct clock_event_device *evdev)
{ {
switch (mode) { pr_debug("%s: %s\n", __func__, evdev->name);
case CLOCK_EVT_MODE_ONESHOT: sysreg_write(COMPARE, 0);
pr_debug("%s: start\n", evdev->name);
/* FALLTHROUGH */ if (disable_cpu_idle_poll) {
case CLOCK_EVT_MODE_RESUME: disable_cpu_idle_poll = false;
/* /*
* If we're using the COUNT and COMPARE registers we * Only disable idle poll if we have forced that
* need to force idle poll. * in a previous call.
*/ */
cpu_idle_poll_ctrl(true); cpu_idle_poll_ctrl(false);
break;
case CLOCK_EVT_MODE_UNUSED:
case CLOCK_EVT_MODE_SHUTDOWN:
sysreg_write(COMPARE, 0);
pr_debug("%s: stop\n", evdev->name);
if (evdev->mode == CLOCK_EVT_MODE_ONESHOT ||
evdev->mode == CLOCK_EVT_MODE_RESUME) {
/*
* Only disable idle poll if we have forced that
* in a previous call.
*/
cpu_idle_poll_ctrl(false);
}
break;
default:
BUG();
} }
return 0;
}
static int comparator_set_oneshot(struct clock_event_device *evdev)
{
pr_debug("%s: %s\n", __func__, evdev->name);
disable_cpu_idle_poll = true;
/*
* If we're using the COUNT and COMPARE registers we
* need to force idle poll.
*/
cpu_idle_poll_ctrl(true);
return 0;
} }
static struct clock_event_device comparator = { static struct clock_event_device comparator = {
.name = "avr32_comparator", .name = "avr32_comparator",
.features = CLOCK_EVT_FEAT_ONESHOT, .features = CLOCK_EVT_FEAT_ONESHOT,
.shift = 16, .shift = 16,
.rating = 50, .rating = 50,
.set_next_event = comparator_next_event, .set_next_event = comparator_next_event,
.set_mode = comparator_mode, .set_state_shutdown = comparator_shutdown,
.set_state_oneshot = comparator_set_oneshot,
.tick_resume = comparator_set_oneshot,
}; };
void read_persistent_clock(struct timespec *ts) void read_persistent_clock(struct timespec *ts)

View file

@ -174,6 +174,11 @@ static inline void _writel(unsigned long l, unsigned long addr)
#define iowrite16 writew #define iowrite16 writew
#define iowrite32 writel #define iowrite32 writel
#define ioread16be(addr) be16_to_cpu(readw(addr))
#define ioread32be(addr) be32_to_cpu(readl(addr))
#define iowrite16be(v, addr) writew(cpu_to_be16(v), (addr))
#define iowrite32be(v, addr) writel(cpu_to_be32(v), (addr))
#define mmiowb() #define mmiowb()
#define flush_write_buffers() do { } while (0) /* M32R_FIXME */ #define flush_write_buffers() do { } while (0) /* M32R_FIXME */

View file

@ -23,15 +23,15 @@
int main(void) int main(void)
{ {
DEFINE(__THREAD_info, offsetof(struct task_struct, stack)); DEFINE(__TASK_thread_info, offsetof(struct task_struct, stack));
DEFINE(__THREAD_ksp, offsetof(struct task_struct, thread.ksp)); DEFINE(__TASK_thread, offsetof(struct task_struct, thread));
DEFINE(__THREAD_mm_segment, offsetof(struct task_struct, thread.mm_segment));
BLANK();
DEFINE(__TASK_pid, offsetof(struct task_struct, pid)); DEFINE(__TASK_pid, offsetof(struct task_struct, pid));
BLANK(); BLANK();
DEFINE(__THREAD_per_cause, offsetof(struct task_struct, thread.per_event.cause)); DEFINE(__THREAD_ksp, offsetof(struct thread_struct, ksp));
DEFINE(__THREAD_per_address, offsetof(struct task_struct, thread.per_event.address)); DEFINE(__THREAD_per_cause, offsetof(struct thread_struct, per_event.cause));
DEFINE(__THREAD_per_paid, offsetof(struct task_struct, thread.per_event.paid)); DEFINE(__THREAD_per_address, offsetof(struct thread_struct, per_event.address));
DEFINE(__THREAD_per_paid, offsetof(struct thread_struct, per_event.paid));
DEFINE(__THREAD_trap_tdb, offsetof(struct thread_struct, trap_tdb));
BLANK(); BLANK();
DEFINE(__TI_task, offsetof(struct thread_info, task)); DEFINE(__TI_task, offsetof(struct thread_info, task));
DEFINE(__TI_flags, offsetof(struct thread_info, flags)); DEFINE(__TI_flags, offsetof(struct thread_info, flags));
@ -176,7 +176,6 @@ int main(void)
DEFINE(__LC_VDSO_PER_CPU, offsetof(struct _lowcore, vdso_per_cpu_data)); DEFINE(__LC_VDSO_PER_CPU, offsetof(struct _lowcore, vdso_per_cpu_data));
DEFINE(__LC_GMAP, offsetof(struct _lowcore, gmap)); DEFINE(__LC_GMAP, offsetof(struct _lowcore, gmap));
DEFINE(__LC_PGM_TDB, offsetof(struct _lowcore, pgm_tdb)); DEFINE(__LC_PGM_TDB, offsetof(struct _lowcore, pgm_tdb));
DEFINE(__THREAD_trap_tdb, offsetof(struct task_struct, thread.trap_tdb));
DEFINE(__GMAP_ASCE, offsetof(struct gmap, asce)); DEFINE(__GMAP_ASCE, offsetof(struct gmap, asce));
DEFINE(__SIE_PROG0C, offsetof(struct kvm_s390_sie_block, prog0c)); DEFINE(__SIE_PROG0C, offsetof(struct kvm_s390_sie_block, prog0c));
DEFINE(__SIE_PROG20, offsetof(struct kvm_s390_sie_block, prog20)); DEFINE(__SIE_PROG20, offsetof(struct kvm_s390_sie_block, prog20));

View file

@ -178,17 +178,21 @@ _PIF_WORK = (_PIF_PER_TRAP)
*/ */
ENTRY(__switch_to) ENTRY(__switch_to)
stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task
stg %r15,__THREAD_ksp(%r2) # store kernel stack of prev lgr %r1,%r2
lg %r4,__THREAD_info(%r2) # get thread_info of prev aghi %r1,__TASK_thread # thread_struct of prev task
lg %r5,__THREAD_info(%r3) # get thread_info of next lg %r4,__TASK_thread_info(%r2) # get thread_info of prev
lg %r5,__TASK_thread_info(%r3) # get thread_info of next
stg %r15,__THREAD_ksp(%r1) # store kernel stack of prev
lgr %r1,%r3
aghi %r1,__TASK_thread # thread_struct of next task
lgr %r15,%r5 lgr %r15,%r5
aghi %r15,STACK_INIT # end of kernel stack of next aghi %r15,STACK_INIT # end of kernel stack of next
stg %r3,__LC_CURRENT # store task struct of next stg %r3,__LC_CURRENT # store task struct of next
stg %r5,__LC_THREAD_INFO # store thread info of next stg %r5,__LC_THREAD_INFO # store thread info of next
stg %r15,__LC_KERNEL_STACK # store end of kernel stack stg %r15,__LC_KERNEL_STACK # store end of kernel stack
lg %r15,__THREAD_ksp(%r1) # load kernel stack of next
lctl %c4,%c4,__TASK_pid(%r3) # load pid to control reg. 4 lctl %c4,%c4,__TASK_pid(%r3) # load pid to control reg. 4
mvc __LC_CURRENT_PID+4(4,%r0),__TASK_pid(%r3) # store pid of next mvc __LC_CURRENT_PID+4(4,%r0),__TASK_pid(%r3) # store pid of next
lg %r15,__THREAD_ksp(%r3) # load kernel stack of next
lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task
br %r14 br %r14
@ -417,6 +421,7 @@ ENTRY(pgm_check_handler)
LAST_BREAK %r14 LAST_BREAK %r14
lg %r15,__LC_KERNEL_STACK lg %r15,__LC_KERNEL_STACK
lg %r14,__TI_task(%r12) lg %r14,__TI_task(%r12)
aghi %r14,__TASK_thread # pointer to thread_struct
lghi %r13,__LC_PGM_TDB lghi %r13,__LC_PGM_TDB
tm __LC_PGM_ILC+2,0x02 # check for transaction abort tm __LC_PGM_ILC+2,0x02 # check for transaction abort
jz 2f jz 2f

View file

@ -259,7 +259,7 @@ void vector_exception(struct pt_regs *regs)
} }
/* get vector interrupt code from fpc */ /* get vector interrupt code from fpc */
asm volatile("stfpc %0" : "=m" (current->thread.fp_regs.fpc)); asm volatile("stfpc %0" : "=Q" (current->thread.fp_regs.fpc));
vic = (current->thread.fp_regs.fpc & 0xf00) >> 8; vic = (current->thread.fp_regs.fpc & 0xf00) >> 8;
switch (vic) { switch (vic) {
case 1: /* invalid vector operation */ case 1: /* invalid vector operation */
@ -297,7 +297,7 @@ void data_exception(struct pt_regs *regs)
location = get_trap_ip(regs); location = get_trap_ip(regs);
asm volatile("stfpc %0" : "=m" (current->thread.fp_regs.fpc)); asm volatile("stfpc %0" : "=Q" (current->thread.fp_regs.fpc));
/* Check for vector register enablement */ /* Check for vector register enablement */
if (MACHINE_HAS_VX && !current->thread.vxrs && if (MACHINE_HAS_VX && !current->thread.vxrs &&
(current->thread.fp_regs.fpc & FPC_DXC_MASK) == 0xfe00) { (current->thread.fp_regs.fpc & FPC_DXC_MASK) == 0xfe00) {

View file

@ -1139,7 +1139,7 @@ static void __init load_hv_initrd(void)
void __init free_initrd_mem(unsigned long begin, unsigned long end) void __init free_initrd_mem(unsigned long begin, unsigned long end)
{ {
free_bootmem(__pa(begin), end - begin); free_bootmem_late(__pa(begin), end - begin);
} }
static int __init setup_initrd(char *str) static int __init setup_initrd(char *str)

View file

@ -205,7 +205,6 @@ sysexit_from_sys_call:
movl RDX(%rsp), %edx /* arg3 */ movl RDX(%rsp), %edx /* arg3 */
movl RSI(%rsp), %ecx /* arg4 */ movl RSI(%rsp), %ecx /* arg4 */
movl RDI(%rsp), %r8d /* arg5 */ movl RDI(%rsp), %r8d /* arg5 */
movl %ebp, %r9d /* arg6 */
.endm .endm
.macro auditsys_exit exit .macro auditsys_exit exit
@ -236,6 +235,7 @@ sysexit_from_sys_call:
sysenter_auditsys: sysenter_auditsys:
auditsys_entry_common auditsys_entry_common
movl %ebp, %r9d /* reload 6th syscall arg */
jmp sysenter_dispatch jmp sysenter_dispatch
sysexit_audit: sysexit_audit:
@ -336,7 +336,7 @@ ENTRY(entry_SYSCALL_compat)
* 32-bit zero extended: * 32-bit zero extended:
*/ */
ASM_STAC ASM_STAC
1: movl (%r8), %ebp 1: movl (%r8), %r9d
_ASM_EXTABLE(1b, ia32_badarg) _ASM_EXTABLE(1b, ia32_badarg)
ASM_CLAC ASM_CLAC
orl $TS_COMPAT, ASM_THREAD_INFO(TI_status, %rsp, SIZEOF_PTREGS) orl $TS_COMPAT, ASM_THREAD_INFO(TI_status, %rsp, SIZEOF_PTREGS)
@ -346,7 +346,7 @@ ENTRY(entry_SYSCALL_compat)
cstar_do_call: cstar_do_call:
/* 32-bit syscall -> 64-bit C ABI argument conversion */ /* 32-bit syscall -> 64-bit C ABI argument conversion */
movl %edi, %r8d /* arg5 */ movl %edi, %r8d /* arg5 */
movl %ebp, %r9d /* arg6 */ /* r9 already loaded */ /* arg6 */
xchg %ecx, %esi /* rsi:arg2, rcx:arg4 */ xchg %ecx, %esi /* rsi:arg2, rcx:arg4 */
movl %ebx, %edi /* arg1 */ movl %ebx, %edi /* arg1 */
movl %edx, %edx /* arg3 (zero extension) */ movl %edx, %edx /* arg3 (zero extension) */
@ -358,7 +358,6 @@ cstar_dispatch:
call *ia32_sys_call_table(, %rax, 8) call *ia32_sys_call_table(, %rax, 8)
movq %rax, RAX(%rsp) movq %rax, RAX(%rsp)
1: 1:
movl RCX(%rsp), %ebp
DISABLE_INTERRUPTS(CLBR_NONE) DISABLE_INTERRUPTS(CLBR_NONE)
TRACE_IRQS_OFF TRACE_IRQS_OFF
testl $_TIF_ALLWORK_MASK, ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) testl $_TIF_ALLWORK_MASK, ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS)
@ -392,7 +391,9 @@ sysretl_from_sys_call:
#ifdef CONFIG_AUDITSYSCALL #ifdef CONFIG_AUDITSYSCALL
cstar_auditsys: cstar_auditsys:
movl %r9d, R9(%rsp) /* register to be clobbered by call */
auditsys_entry_common auditsys_entry_common
movl R9(%rsp), %r9d /* reload 6th syscall arg */
jmp cstar_dispatch jmp cstar_dispatch
sysretl_audit: sysretl_audit:
@ -404,14 +405,16 @@ cstar_tracesys:
testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT), ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT), ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS)
jz cstar_auditsys jz cstar_auditsys
#endif #endif
xchgl %r9d, %ebp
SAVE_EXTRA_REGS SAVE_EXTRA_REGS
xorl %eax, %eax /* Do not leak kernel information */ xorl %eax, %eax /* Do not leak kernel information */
movq %rax, R11(%rsp) movq %rax, R11(%rsp)
movq %rax, R10(%rsp) movq %rax, R10(%rsp)
movq %rax, R9(%rsp) movq %r9, R9(%rsp)
movq %rax, R8(%rsp) movq %rax, R8(%rsp)
movq %rsp, %rdi /* &pt_regs -> arg1 */ movq %rsp, %rdi /* &pt_regs -> arg1 */
call syscall_trace_enter call syscall_trace_enter
movl R9(%rsp), %r9d
/* Reload arg registers from stack. (see sysenter_tracesys) */ /* Reload arg registers from stack. (see sysenter_tracesys) */
movl RCX(%rsp), %ecx movl RCX(%rsp), %ecx
@ -421,6 +424,7 @@ cstar_tracesys:
movl %eax, %eax /* zero extension */ movl %eax, %eax /* zero extension */
RESTORE_EXTRA_REGS RESTORE_EXTRA_REGS
xchgl %ebp, %r9d
jmp cstar_do_call jmp cstar_do_call
END(entry_SYSCALL_compat) END(entry_SYSCALL_compat)

View file

@ -354,7 +354,7 @@ struct kvm_xcrs {
struct kvm_sync_regs { struct kvm_sync_regs {
}; };
#define KVM_QUIRK_LINT0_REENABLED (1 << 0) #define KVM_X86_QUIRK_LINT0_REENABLED (1 << 0)
#define KVM_QUIRK_CD_NW_CLEARED (1 << 1) #define KVM_X86_QUIRK_CD_NW_CLEARED (1 << 1)
#endif /* _ASM_X86_KVM_H */ #endif /* _ASM_X86_KVM_H */

View file

@ -951,6 +951,14 @@ static u64 intel_cqm_event_count(struct perf_event *event)
if (!cqm_group_leader(event)) if (!cqm_group_leader(event))
return 0; return 0;
/*
* Getting up-to-date values requires an SMP IPI which is not
* possible if we're being called in interrupt context. Return
* the cached values instead.
*/
if (unlikely(in_interrupt()))
goto out;
/* /*
* Notice that we don't perform the reading of an RMID * Notice that we don't perform the reading of an RMID
* atomically, because we can't hold a spin lock across the * atomically, because we can't hold a spin lock across the

View file

@ -351,9 +351,15 @@ static int __init x86_noxsave_setup(char *s)
setup_clear_cpu_cap(X86_FEATURE_XSAVE); setup_clear_cpu_cap(X86_FEATURE_XSAVE);
setup_clear_cpu_cap(X86_FEATURE_XSAVEOPT); setup_clear_cpu_cap(X86_FEATURE_XSAVEOPT);
setup_clear_cpu_cap(X86_FEATURE_XSAVEC);
setup_clear_cpu_cap(X86_FEATURE_XSAVES); setup_clear_cpu_cap(X86_FEATURE_XSAVES);
setup_clear_cpu_cap(X86_FEATURE_AVX); setup_clear_cpu_cap(X86_FEATURE_AVX);
setup_clear_cpu_cap(X86_FEATURE_AVX2); setup_clear_cpu_cap(X86_FEATURE_AVX2);
setup_clear_cpu_cap(X86_FEATURE_AVX512F);
setup_clear_cpu_cap(X86_FEATURE_AVX512PF);
setup_clear_cpu_cap(X86_FEATURE_AVX512ER);
setup_clear_cpu_cap(X86_FEATURE_AVX512CD);
setup_clear_cpu_cap(X86_FEATURE_MPX);
return 1; return 1;
} }

View file

@ -1595,7 +1595,7 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event)
for (i = 0; i < APIC_LVT_NUM; i++) for (i = 0; i < APIC_LVT_NUM; i++)
apic_set_reg(apic, APIC_LVTT + 0x10 * i, APIC_LVT_MASKED); apic_set_reg(apic, APIC_LVTT + 0x10 * i, APIC_LVT_MASKED);
apic_update_lvtt(apic); apic_update_lvtt(apic);
if (!(vcpu->kvm->arch.disabled_quirks & KVM_QUIRK_LINT0_REENABLED)) if (kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_LINT0_REENABLED))
apic_set_reg(apic, APIC_LVT0, apic_set_reg(apic, APIC_LVT0,
SET_APIC_DELIVERY_MODE(0, APIC_MODE_EXTINT)); SET_APIC_DELIVERY_MODE(0, APIC_MODE_EXTINT));
apic_manage_nmi_watchdog(apic, kvm_apic_get_reg(apic, APIC_LVT0)); apic_manage_nmi_watchdog(apic, kvm_apic_get_reg(apic, APIC_LVT0));

View file

@ -120,6 +120,16 @@ static u8 mtrr_default_type(struct kvm_mtrr *mtrr_state)
return mtrr_state->deftype & IA32_MTRR_DEF_TYPE_TYPE_MASK; return mtrr_state->deftype & IA32_MTRR_DEF_TYPE_TYPE_MASK;
} }
static u8 mtrr_disabled_type(void)
{
/*
* Intel SDM 11.11.2.2: all MTRRs are disabled when
* IA32_MTRR_DEF_TYPE.E bit is cleared, and the UC
* memory type is applied to all of physical memory.
*/
return MTRR_TYPE_UNCACHABLE;
}
/* /*
* Three terms are used in the following code: * Three terms are used in the following code:
* - segment, it indicates the address segments covered by fixed MTRRs. * - segment, it indicates the address segments covered by fixed MTRRs.
@ -434,6 +444,8 @@ struct mtrr_iter {
/* output fields. */ /* output fields. */
int mem_type; int mem_type;
/* mtrr is completely disabled? */
bool mtrr_disabled;
/* [start, end) is not fully covered in MTRRs? */ /* [start, end) is not fully covered in MTRRs? */
bool partial_map; bool partial_map;
@ -549,7 +561,7 @@ static void mtrr_lookup_var_next(struct mtrr_iter *iter)
static void mtrr_lookup_start(struct mtrr_iter *iter) static void mtrr_lookup_start(struct mtrr_iter *iter)
{ {
if (!mtrr_is_enabled(iter->mtrr_state)) { if (!mtrr_is_enabled(iter->mtrr_state)) {
iter->partial_map = true; iter->mtrr_disabled = true;
return; return;
} }
@ -563,6 +575,7 @@ static void mtrr_lookup_init(struct mtrr_iter *iter,
iter->mtrr_state = mtrr_state; iter->mtrr_state = mtrr_state;
iter->start = start; iter->start = start;
iter->end = end; iter->end = end;
iter->mtrr_disabled = false;
iter->partial_map = false; iter->partial_map = false;
iter->fixed = false; iter->fixed = false;
iter->range = NULL; iter->range = NULL;
@ -656,15 +669,19 @@ u8 kvm_mtrr_get_guest_memory_type(struct kvm_vcpu *vcpu, gfn_t gfn)
return MTRR_TYPE_WRBACK; return MTRR_TYPE_WRBACK;
} }
/* It is not covered by MTRRs. */ if (iter.mtrr_disabled)
if (iter.partial_map) { return mtrr_disabled_type();
/*
* We just check one page, partially covered by MTRRs is /*
* impossible. * We just check one page, partially covered by MTRRs is
*/ * impossible.
WARN_ON(type != -1); */
type = mtrr_default_type(mtrr_state); WARN_ON(iter.partial_map);
}
/* not contained in any MTRRs. */
if (type == -1)
return mtrr_default_type(mtrr_state);
return type; return type;
} }
EXPORT_SYMBOL_GPL(kvm_mtrr_get_guest_memory_type); EXPORT_SYMBOL_GPL(kvm_mtrr_get_guest_memory_type);
@ -689,6 +706,9 @@ bool kvm_mtrr_check_gfn_range_consistency(struct kvm_vcpu *vcpu, gfn_t gfn,
return false; return false;
} }
if (iter.mtrr_disabled)
return true;
if (!iter.partial_map) if (!iter.partial_map)
return true; return true;

View file

@ -1672,7 +1672,7 @@ static void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
* does not do it - this results in some delay at * does not do it - this results in some delay at
* reboot * reboot
*/ */
if (!(vcpu->kvm->arch.disabled_quirks & KVM_QUIRK_CD_NW_CLEARED)) if (kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_CD_NW_CLEARED))
cr0 &= ~(X86_CR0_CD | X86_CR0_NW); cr0 &= ~(X86_CR0_CD | X86_CR0_NW);
svm->vmcb->save.cr0 = cr0; svm->vmcb->save.cr0 = cr0;
mark_dirty(svm->vmcb, VMCB_CR); mark_dirty(svm->vmcb, VMCB_CR);

View file

@ -8650,7 +8650,10 @@ static u64 vmx_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
if (kvm_read_cr0(vcpu) & X86_CR0_CD) { if (kvm_read_cr0(vcpu) & X86_CR0_CD) {
ipat = VMX_EPT_IPAT_BIT; ipat = VMX_EPT_IPAT_BIT;
cache = MTRR_TYPE_UNCACHABLE; if (kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_CD_NW_CLEARED))
cache = MTRR_TYPE_WRBACK;
else
cache = MTRR_TYPE_UNCACHABLE;
goto exit; goto exit;
} }

View file

@ -147,6 +147,11 @@ static inline void kvm_register_writel(struct kvm_vcpu *vcpu,
return kvm_register_write(vcpu, reg, val); return kvm_register_write(vcpu, reg, val);
} }
static inline bool kvm_check_has_quirk(struct kvm *kvm, u64 quirk)
{
return !(kvm->arch.disabled_quirks & quirk);
}
void kvm_before_handle_nmi(struct kvm_vcpu *vcpu); void kvm_before_handle_nmi(struct kvm_vcpu *vcpu);
void kvm_after_handle_nmi(struct kvm_vcpu *vcpu); void kvm_after_handle_nmi(struct kvm_vcpu *vcpu);
void kvm_set_pending_timer(struct kvm_vcpu *vcpu); void kvm_set_pending_timer(struct kvm_vcpu *vcpu);

View file

@ -63,8 +63,6 @@ static int __ioremap_check_ram(unsigned long start_pfn, unsigned long nr_pages,
!PageReserved(pfn_to_page(start_pfn + i))) !PageReserved(pfn_to_page(start_pfn + i)))
return 1; return 1;
WARN_ONCE(1, "ioremap on RAM pfn 0x%lx\n", start_pfn);
return 0; return 0;
} }
@ -94,7 +92,6 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr,
pgprot_t prot; pgprot_t prot;
int retval; int retval;
void __iomem *ret_addr; void __iomem *ret_addr;
int ram_region;
/* Don't allow wraparound or zero size */ /* Don't allow wraparound or zero size */
last_addr = phys_addr + size - 1; last_addr = phys_addr + size - 1;
@ -117,23 +114,15 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr,
/* /*
* Don't allow anybody to remap normal RAM that we're using.. * Don't allow anybody to remap normal RAM that we're using..
*/ */
/* First check if whole region can be identified as RAM or not */ pfn = phys_addr >> PAGE_SHIFT;
ram_region = region_is_ram(phys_addr, size); last_pfn = last_addr >> PAGE_SHIFT;
if (ram_region > 0) { if (walk_system_ram_range(pfn, last_pfn - pfn + 1, NULL,
WARN_ONCE(1, "ioremap on RAM at 0x%lx - 0x%lx\n", __ioremap_check_ram) == 1) {
(unsigned long int)phys_addr, WARN_ONCE(1, "ioremap on RAM at %pa - %pa\n",
(unsigned long int)last_addr); &phys_addr, &last_addr);
return NULL; return NULL;
} }
/* If could not be identified(-1), check page by page */
if (ram_region < 0) {
pfn = phys_addr >> PAGE_SHIFT;
last_pfn = last_addr >> PAGE_SHIFT;
if (walk_system_ram_range(pfn, last_pfn - pfn + 1, NULL,
__ioremap_check_ram) == 1)
return NULL;
}
/* /*
* Mappings have to be page-aligned * Mappings have to be page-aligned
*/ */

View file

@ -126,3 +126,10 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
mm->get_unmapped_area = arch_get_unmapped_area_topdown; mm->get_unmapped_area = arch_get_unmapped_area_topdown;
} }
} }
const char *arch_vma_name(struct vm_area_struct *vma)
{
if (vma->vm_flags & VM_MPX)
return "[mpx]";
return NULL;
}

View file

@ -20,20 +20,6 @@
#define CREATE_TRACE_POINTS #define CREATE_TRACE_POINTS
#include <asm/trace/mpx.h> #include <asm/trace/mpx.h>
static const char *mpx_mapping_name(struct vm_area_struct *vma)
{
return "[mpx]";
}
static struct vm_operations_struct mpx_vma_ops = {
.name = mpx_mapping_name,
};
static int is_mpx_vma(struct vm_area_struct *vma)
{
return (vma->vm_ops == &mpx_vma_ops);
}
static inline unsigned long mpx_bd_size_bytes(struct mm_struct *mm) static inline unsigned long mpx_bd_size_bytes(struct mm_struct *mm)
{ {
if (is_64bit_mm(mm)) if (is_64bit_mm(mm))
@ -53,9 +39,6 @@ static inline unsigned long mpx_bt_size_bytes(struct mm_struct *mm)
/* /*
* This is really a simplified "vm_mmap". it only handles MPX * This is really a simplified "vm_mmap". it only handles MPX
* bounds tables (the bounds directory is user-allocated). * bounds tables (the bounds directory is user-allocated).
*
* Later on, we use the vma->vm_ops to uniquely identify these
* VMAs.
*/ */
static unsigned long mpx_mmap(unsigned long len) static unsigned long mpx_mmap(unsigned long len)
{ {
@ -101,7 +84,6 @@ static unsigned long mpx_mmap(unsigned long len)
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
} }
vma->vm_ops = &mpx_vma_ops;
if (vm_flags & VM_LOCKED) { if (vm_flags & VM_LOCKED) {
up_write(&mm->mmap_sem); up_write(&mm->mmap_sem);
@ -812,7 +794,7 @@ static noinline int zap_bt_entries_mapping(struct mm_struct *mm,
* so stop immediately and return an error. This * so stop immediately and return an error. This
* probably results in a SIGSEGV. * probably results in a SIGSEGV.
*/ */
if (!is_mpx_vma(vma)) if (!(vma->vm_flags & VM_MPX))
return -EINVAL; return -EINVAL;
len = min(vma->vm_end, end) - addr; len = min(vma->vm_end, end) - addr;
@ -945,9 +927,9 @@ static int try_unmap_single_bt(struct mm_struct *mm,
* lots of tables even though we have no actual table * lots of tables even though we have no actual table
* entries in use. * entries in use.
*/ */
while (next && is_mpx_vma(next)) while (next && (next->vm_flags & VM_MPX))
next = next->vm_next; next = next->vm_next;
while (prev && is_mpx_vma(prev)) while (prev && (prev->vm_flags & VM_MPX))
prev = prev->vm_prev; prev = prev->vm_prev;
/* /*
* We know 'start' and 'end' lie within an area controlled * We know 'start' and 'end' lie within an area controlled

View file

@ -117,7 +117,7 @@ static void flush_tlb_func(void *info)
} else { } else {
unsigned long addr; unsigned long addr;
unsigned long nr_pages = unsigned long nr_pages =
f->flush_end - f->flush_start / PAGE_SIZE; (f->flush_end - f->flush_start) / PAGE_SIZE;
addr = f->flush_start; addr = f->flush_start;
while (addr < f->flush_end) { while (addr < f->flush_end) {
__flush_tlb_single(addr); __flush_tlb_single(addr);

View file

@ -1831,8 +1831,9 @@ EXPORT_SYMBOL(bio_endio);
* Allocates and returns a new bio which represents @sectors from the start of * Allocates and returns a new bio which represents @sectors from the start of
* @bio, and updates @bio to represent the remaining sectors. * @bio, and updates @bio to represent the remaining sectors.
* *
* The newly allocated bio will point to @bio's bi_io_vec; it is the caller's * Unless this is a discard request the newly allocated bio will point
* responsibility to ensure that @bio is not freed before the split. * to @bio's bi_io_vec; it is the caller's responsibility to ensure that
* @bio is not freed before the split.
*/ */
struct bio *bio_split(struct bio *bio, int sectors, struct bio *bio_split(struct bio *bio, int sectors,
gfp_t gfp, struct bio_set *bs) gfp_t gfp, struct bio_set *bs)
@ -1842,7 +1843,15 @@ struct bio *bio_split(struct bio *bio, int sectors,
BUG_ON(sectors <= 0); BUG_ON(sectors <= 0);
BUG_ON(sectors >= bio_sectors(bio)); BUG_ON(sectors >= bio_sectors(bio));
split = bio_clone_fast(bio, gfp, bs); /*
* Discards need a mutable bio_vec to accommodate the payload
* required by the DSM TRIM and UNMAP commands.
*/
if (bio->bi_rw & REQ_DISCARD)
split = bio_clone_bioset(bio, gfp, bs);
else
split = bio_clone_fast(bio, gfp, bs);
if (!split) if (!split)
return NULL; return NULL;
@ -2009,6 +2018,7 @@ int bio_associate_blkcg(struct bio *bio, struct cgroup_subsys_state *blkcg_css)
bio->bi_css = blkcg_css; bio->bi_css = blkcg_css;
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(bio_associate_blkcg);
/** /**
* bio_associate_current - associate a bio with %current * bio_associate_current - associate a bio with %current
@ -2039,6 +2049,7 @@ int bio_associate_current(struct bio *bio)
bio->bi_css = task_get_css(current, blkio_cgrp_id); bio->bi_css = task_get_css(current, blkio_cgrp_id);
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(bio_associate_current);
/** /**
* bio_disassociate_task - undo bio_associate_current() * bio_disassociate_task - undo bio_associate_current()

View file

@ -718,8 +718,12 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
return -EINVAL; return -EINVAL;
disk = get_gendisk(MKDEV(major, minor), &part); disk = get_gendisk(MKDEV(major, minor), &part);
if (!disk || part) if (!disk)
return -EINVAL; return -EINVAL;
if (part) {
put_disk(disk);
return -EINVAL;
}
rcu_read_lock(); rcu_read_lock();
spin_lock_irq(disk->queue->queue_lock); spin_lock_irq(disk->queue->queue_lock);

View file

@ -2478,6 +2478,10 @@ int ata_dev_configure(struct ata_device *dev)
dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_128, dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_128,
dev->max_sectors); dev->max_sectors);
if (dev->horkage & ATA_HORKAGE_MAX_SEC_1024)
dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_1024,
dev->max_sectors);
if (dev->horkage & ATA_HORKAGE_MAX_SEC_LBA48) if (dev->horkage & ATA_HORKAGE_MAX_SEC_LBA48)
dev->max_sectors = ATA_MAX_SECTORS_LBA48; dev->max_sectors = ATA_MAX_SECTORS_LBA48;
@ -4146,6 +4150,12 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
{ "Slimtype DVD A DS8A8SH", NULL, ATA_HORKAGE_MAX_SEC_LBA48 }, { "Slimtype DVD A DS8A8SH", NULL, ATA_HORKAGE_MAX_SEC_LBA48 },
{ "Slimtype DVD A DS8A9SH", NULL, ATA_HORKAGE_MAX_SEC_LBA48 }, { "Slimtype DVD A DS8A9SH", NULL, ATA_HORKAGE_MAX_SEC_LBA48 },
/*
* Causes silent data corruption with higher max sects.
* http://lkml.kernel.org/g/x49wpy40ysk.fsf@segfault.boston.devel.redhat.com
*/
{ "ST380013AS", "3.20", ATA_HORKAGE_MAX_SEC_1024 },
/* Devices we expect to fail diagnostics */ /* Devices we expect to fail diagnostics */
/* Devices where NCQ should be avoided */ /* Devices where NCQ should be avoided */
@ -4174,9 +4184,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
{ "ST3320[68]13AS", "SD1[5-9]", ATA_HORKAGE_NONCQ | { "ST3320[68]13AS", "SD1[5-9]", ATA_HORKAGE_NONCQ |
ATA_HORKAGE_FIRMWARE_WARN }, ATA_HORKAGE_FIRMWARE_WARN },
/* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */ /* drives which fail FPDMA_AA activation (some may freeze afterwards) */
{ "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA }, { "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA },
{ "ST1000LM024 HN-M101MBB", "2BA30001", ATA_HORKAGE_BROKEN_FPDMA_AA }, { "ST1000LM024 HN-M101MBB", "2BA30001", ATA_HORKAGE_BROKEN_FPDMA_AA },
{ "VB0250EAVER", "HPG7", ATA_HORKAGE_BROKEN_FPDMA_AA },
/* Blacklist entries taken from Silicon Image 3124/3132 /* Blacklist entries taken from Silicon Image 3124/3132
Windows driver .inf file - also several Linux problem reports */ Windows driver .inf file - also several Linux problem reports */
@ -4229,7 +4240,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
ATA_HORKAGE_ZERO_AFTER_TRIM, }, ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Crucial_CT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | { "Crucial_CT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, }, ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Micron_M5[15]0*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM | { "Micron_M5[15]0_*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, }, ATA_HORKAGE_ZERO_AFTER_TRIM, },
{ "Crucial_CT*M550*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM | { "Crucial_CT*M550*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, }, ATA_HORKAGE_ZERO_AFTER_TRIM, },
@ -4238,6 +4249,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
{ "Samsung SSD 8*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | { "Samsung SSD 8*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
ATA_HORKAGE_ZERO_AFTER_TRIM, }, ATA_HORKAGE_ZERO_AFTER_TRIM, },
/* devices that don't properly handle TRIM commands */
{ "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, },
/* /*
* As defined, the DRAT (Deterministic Read After Trim) and RZAT * As defined, the DRAT (Deterministic Read After Trim) and RZAT
* (Return Zero After Trim) flags in the ATA Command Set are * (Return Zero After Trim) flags in the ATA Command Set are
@ -4501,7 +4515,8 @@ static unsigned int ata_dev_set_xfermode(struct ata_device *dev)
else /* In the ancient relic department - skip all of this */ else /* In the ancient relic department - skip all of this */
return 0; return 0;
err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0); /* On some disks, this command causes spin-up, so we need longer timeout */
err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 15000);
DPRINTK("EXIT, err_mask=%x\n", err_mask); DPRINTK("EXIT, err_mask=%x\n", err_mask);
return err_mask; return err_mask;

View file

@ -460,6 +460,13 @@ static void sata_pmp_quirks(struct ata_port *ap)
ATA_LFLAG_NO_SRST | ATA_LFLAG_NO_SRST |
ATA_LFLAG_ASSUME_ATA; ATA_LFLAG_ASSUME_ATA;
} }
} else if (vendor == 0x11ab && devid == 0x4140) {
/* Marvell 4140 quirks */
ata_for_each_link(link, ap, EDGE) {
/* port 4 is for SEMB device and it doesn't like SRST */
if (link->pmp == 4)
link->flags |= ATA_LFLAG_DISABLED;
}
} }
} }

View file

@ -2568,7 +2568,8 @@ static unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf)
rbuf[14] = (lowest_aligned >> 8) & 0x3f; rbuf[14] = (lowest_aligned >> 8) & 0x3f;
rbuf[15] = lowest_aligned; rbuf[15] = lowest_aligned;
if (ata_id_has_trim(args->id)) { if (ata_id_has_trim(args->id) &&
!(dev->horkage & ATA_HORKAGE_NOTRIM)) {
rbuf[14] |= 0x80; /* LBPME */ rbuf[14] |= 0x80; /* LBPME */
if (ata_id_has_zero_after_trim(args->id) && if (ata_id_has_zero_after_trim(args->id) &&

View file

@ -569,6 +569,8 @@ show_ata_dev_trim(struct device *dev,
if (!ata_id_has_trim(ata_dev->id)) if (!ata_id_has_trim(ata_dev->id))
mode = "unsupported"; mode = "unsupported";
else if (ata_dev->horkage & ATA_HORKAGE_NOTRIM)
mode = "forced_unsupported";
else if (ata_dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM) else if (ata_dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM)
mode = "forced_unqueued"; mode = "forced_unqueued";
else if (ata_fpdma_dsm_supported(ata_dev)) else if (ata_fpdma_dsm_supported(ata_dev))

View file

@ -240,19 +240,19 @@ static enum hrtimer_restart null_cmd_timer_expired(struct hrtimer *timer)
while ((entry = llist_del_all(&cq->list)) != NULL) { while ((entry = llist_del_all(&cq->list)) != NULL) {
entry = llist_reverse_order(entry); entry = llist_reverse_order(entry);
do { do {
struct request_queue *q = NULL;
cmd = container_of(entry, struct nullb_cmd, ll_list); cmd = container_of(entry, struct nullb_cmd, ll_list);
entry = entry->next; entry = entry->next;
if (cmd->rq)
q = cmd->rq->q;
end_cmd(cmd); end_cmd(cmd);
if (cmd->rq) { if (q && !q->mq_ops && blk_queue_stopped(q)) {
struct request_queue *q = cmd->rq->q; spin_lock(q->queue_lock);
if (blk_queue_stopped(q))
if (!q->mq_ops && blk_queue_stopped(q)) { blk_start_queue(q);
spin_lock(q->queue_lock); spin_unlock(q->queue_lock);
if (blk_queue_stopped(q))
blk_start_queue(q);
spin_unlock(q->queue_lock);
}
} }
} while (entry); } while (entry);
} }

View file

@ -472,12 +472,11 @@ int btbcm_setup_apple(struct hci_dev *hdev)
/* Read Verbose Config Version Info */ /* Read Verbose Config Version Info */
skb = btbcm_read_verbose_config(hdev); skb = btbcm_read_verbose_config(hdev);
if (IS_ERR(skb)) if (!IS_ERR(skb)) {
return PTR_ERR(skb); BT_INFO("%s: BCM: chip id %u build %4.4u", hdev->name, skb->data[1],
get_unaligned_le16(skb->data + 5));
BT_INFO("%s: BCM: chip id %u build %4.4u", hdev->name, skb->data[1], kfree_skb(skb);
get_unaligned_le16(skb->data + 5)); }
kfree_skb(skb);
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);

View file

@ -305,10 +305,17 @@ const char *cper_mem_err_unpack(struct trace_seq *p,
return ret; return ret;
} }
static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem) static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem,
int len)
{ {
struct cper_mem_err_compact cmem; struct cper_mem_err_compact cmem;
/* Don't trust UEFI 2.1/2.2 structure with bad validation bits */
if (len == sizeof(struct cper_sec_mem_err_old) &&
(mem->validation_bits & ~(CPER_MEM_VALID_RANK_NUMBER - 1))) {
pr_err(FW_WARN "valid bits set for fields beyond structure\n");
return;
}
if (mem->validation_bits & CPER_MEM_VALID_ERROR_STATUS) if (mem->validation_bits & CPER_MEM_VALID_ERROR_STATUS)
printk("%s""error_status: 0x%016llx\n", pfx, mem->error_status); printk("%s""error_status: 0x%016llx\n", pfx, mem->error_status);
if (mem->validation_bits & CPER_MEM_VALID_PA) if (mem->validation_bits & CPER_MEM_VALID_PA)
@ -405,8 +412,10 @@ static void cper_estatus_print_section(
} else if (!uuid_le_cmp(*sec_type, CPER_SEC_PLATFORM_MEM)) { } else if (!uuid_le_cmp(*sec_type, CPER_SEC_PLATFORM_MEM)) {
struct cper_sec_mem_err *mem_err = (void *)(gdata + 1); struct cper_sec_mem_err *mem_err = (void *)(gdata + 1);
printk("%s""section_type: memory error\n", newpfx); printk("%s""section_type: memory error\n", newpfx);
if (gdata->error_data_length >= sizeof(*mem_err)) if (gdata->error_data_length >=
cper_print_mem(newpfx, mem_err); sizeof(struct cper_sec_mem_err_old))
cper_print_mem(newpfx, mem_err,
gdata->error_data_length);
else else
goto err_section_too_small; goto err_section_too_small;
} else if (!uuid_le_cmp(*sec_type, CPER_SEC_PCIE)) { } else if (!uuid_le_cmp(*sec_type, CPER_SEC_PCIE)) {

View file

@ -1614,6 +1614,9 @@ struct amdgpu_uvd {
#define AMDGPU_MAX_VCE_HANDLES 16 #define AMDGPU_MAX_VCE_HANDLES 16
#define AMDGPU_VCE_FIRMWARE_OFFSET 256 #define AMDGPU_VCE_FIRMWARE_OFFSET 256
#define AMDGPU_VCE_HARVEST_VCE0 (1 << 0)
#define AMDGPU_VCE_HARVEST_VCE1 (1 << 1)
struct amdgpu_vce { struct amdgpu_vce {
struct amdgpu_bo *vcpu_bo; struct amdgpu_bo *vcpu_bo;
uint64_t gpu_addr; uint64_t gpu_addr;
@ -1626,6 +1629,7 @@ struct amdgpu_vce {
const struct firmware *fw; /* VCE firmware */ const struct firmware *fw; /* VCE firmware */
struct amdgpu_ring ring[AMDGPU_MAX_VCE_RINGS]; struct amdgpu_ring ring[AMDGPU_MAX_VCE_RINGS];
struct amdgpu_irq_src irq; struct amdgpu_irq_src irq;
unsigned harvest_config;
}; };
/* /*

View file

@ -459,6 +459,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
memcpy(&dev_info.cu_bitmap[0], &cu_info.bitmap[0], sizeof(cu_info.bitmap)); memcpy(&dev_info.cu_bitmap[0], &cu_info.bitmap[0], sizeof(cu_info.bitmap));
dev_info.vram_type = adev->mc.vram_type; dev_info.vram_type = adev->mc.vram_type;
dev_info.vram_bit_width = adev->mc.vram_width; dev_info.vram_bit_width = adev->mc.vram_width;
dev_info.vce_harvest_config = adev->vce.harvest_config;
return copy_to_user(out, &dev_info, return copy_to_user(out, &dev_info,
min((size_t)size, sizeof(dev_info))) ? -EFAULT : 0; min((size_t)size, sizeof(dev_info))) ? -EFAULT : 0;

View file

@ -494,29 +494,67 @@ static void cz_dpm_fini(struct amdgpu_device *adev)
amdgpu_free_extended_power_table(adev); amdgpu_free_extended_power_table(adev);
} }
#define ixSMUSVI_NB_CURRENTVID 0xD8230044
#define CURRENT_NB_VID_MASK 0xff000000
#define CURRENT_NB_VID__SHIFT 24
#define ixSMUSVI_GFX_CURRENTVID 0xD8230048
#define CURRENT_GFX_VID_MASK 0xff000000
#define CURRENT_GFX_VID__SHIFT 24
static void static void
cz_dpm_debugfs_print_current_performance_level(struct amdgpu_device *adev, cz_dpm_debugfs_print_current_performance_level(struct amdgpu_device *adev,
struct seq_file *m) struct seq_file *m)
{ {
struct cz_power_info *pi = cz_get_pi(adev);
struct amdgpu_clock_voltage_dependency_table *table = struct amdgpu_clock_voltage_dependency_table *table =
&adev->pm.dpm.dyn_state.vddc_dependency_on_sclk; &adev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
u32 current_index = struct amdgpu_uvd_clock_voltage_dependency_table *uvd_table =
(RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX) & &adev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table;
TARGET_AND_CURRENT_PROFILE_INDEX__CURR_SCLK_INDEX_MASK) >> struct amdgpu_vce_clock_voltage_dependency_table *vce_table =
TARGET_AND_CURRENT_PROFILE_INDEX__CURR_SCLK_INDEX__SHIFT; &adev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table;
u32 sclk, tmp; u32 sclk_index = REG_GET_FIELD(RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX),
u16 vddc; TARGET_AND_CURRENT_PROFILE_INDEX, CURR_SCLK_INDEX);
u32 uvd_index = REG_GET_FIELD(RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX_2),
TARGET_AND_CURRENT_PROFILE_INDEX_2, CURR_UVD_INDEX);
u32 vce_index = REG_GET_FIELD(RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX_2),
TARGET_AND_CURRENT_PROFILE_INDEX_2, CURR_VCE_INDEX);
u32 sclk, vclk, dclk, ecclk, tmp;
u16 vddnb, vddgfx;
if (current_index >= NUM_SCLK_LEVELS) { if (sclk_index >= NUM_SCLK_LEVELS) {
seq_printf(m, "invalid dpm profile %d\n", current_index); seq_printf(m, "invalid sclk dpm profile %d\n", sclk_index);
} else { } else {
sclk = table->entries[current_index].clk; sclk = table->entries[sclk_index].clk;
tmp = (RREG32_SMC(ixSMU_VOLTAGE_STATUS) & seq_printf(m, "%u sclk: %u\n", sclk_index, sclk);
SMU_VOLTAGE_STATUS__SMU_VOLTAGE_CURRENT_LEVEL_MASK) >> }
SMU_VOLTAGE_STATUS__SMU_VOLTAGE_CURRENT_LEVEL__SHIFT;
vddc = cz_convert_8bit_index_to_voltage(adev, (u16)tmp); tmp = (RREG32_SMC(ixSMUSVI_NB_CURRENTVID) &
seq_printf(m, "power level %d sclk: %u vddc: %u\n", CURRENT_NB_VID_MASK) >> CURRENT_NB_VID__SHIFT;
current_index, sclk, vddc); vddnb = cz_convert_8bit_index_to_voltage(adev, (u16)tmp);
tmp = (RREG32_SMC(ixSMUSVI_GFX_CURRENTVID) &
CURRENT_GFX_VID_MASK) >> CURRENT_GFX_VID__SHIFT;
vddgfx = cz_convert_8bit_index_to_voltage(adev, (u16)tmp);
seq_printf(m, "vddnb: %u vddgfx: %u\n", vddnb, vddgfx);
seq_printf(m, "uvd %sabled\n", pi->uvd_power_gated ? "dis" : "en");
if (!pi->uvd_power_gated) {
if (uvd_index >= CZ_MAX_HARDWARE_POWERLEVELS) {
seq_printf(m, "invalid uvd dpm level %d\n", uvd_index);
} else {
vclk = uvd_table->entries[uvd_index].vclk;
dclk = uvd_table->entries[uvd_index].dclk;
seq_printf(m, "%u uvd vclk: %u dclk: %u\n", uvd_index, vclk, dclk);
}
}
seq_printf(m, "vce %sabled\n", pi->vce_power_gated ? "dis" : "en");
if (!pi->vce_power_gated) {
if (vce_index >= CZ_MAX_HARDWARE_POWERLEVELS) {
seq_printf(m, "invalid vce dpm level %d\n", vce_index);
} else {
ecclk = vce_table->entries[vce_index].ecclk;
seq_printf(m, "%u vce ecclk: %u\n", vce_index, ecclk);
}
} }
} }

View file

@ -2632,6 +2632,7 @@ static void dce_v10_0_crtc_dpms(struct drm_crtc *crtc, int mode)
struct drm_device *dev = crtc->dev; struct drm_device *dev = crtc->dev;
struct amdgpu_device *adev = dev->dev_private; struct amdgpu_device *adev = dev->dev_private;
struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
unsigned type;
switch (mode) { switch (mode) {
case DRM_MODE_DPMS_ON: case DRM_MODE_DPMS_ON:
@ -2640,6 +2641,9 @@ static void dce_v10_0_crtc_dpms(struct drm_crtc *crtc, int mode)
dce_v10_0_vga_enable(crtc, true); dce_v10_0_vga_enable(crtc, true);
amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE); amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE);
dce_v10_0_vga_enable(crtc, false); dce_v10_0_vga_enable(crtc, false);
/* Make sure VBLANK interrupt is still enabled */
type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id);
amdgpu_irq_update(adev, &adev->crtc_irq, type);
drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id); drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id);
dce_v10_0_crtc_load_lut(crtc); dce_v10_0_crtc_load_lut(crtc);
break; break;

View file

@ -2631,6 +2631,7 @@ static void dce_v11_0_crtc_dpms(struct drm_crtc *crtc, int mode)
struct drm_device *dev = crtc->dev; struct drm_device *dev = crtc->dev;
struct amdgpu_device *adev = dev->dev_private; struct amdgpu_device *adev = dev->dev_private;
struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
unsigned type;
switch (mode) { switch (mode) {
case DRM_MODE_DPMS_ON: case DRM_MODE_DPMS_ON:
@ -2639,6 +2640,9 @@ static void dce_v11_0_crtc_dpms(struct drm_crtc *crtc, int mode)
dce_v11_0_vga_enable(crtc, true); dce_v11_0_vga_enable(crtc, true);
amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE); amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE);
dce_v11_0_vga_enable(crtc, false); dce_v11_0_vga_enable(crtc, false);
/* Make sure VBLANK interrupt is still enabled */
type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id);
amdgpu_irq_update(adev, &adev->crtc_irq, type);
drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id); drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id);
dce_v11_0_crtc_load_lut(crtc); dce_v11_0_crtc_load_lut(crtc);
break; break;

View file

@ -35,6 +35,8 @@
#include "oss/oss_2_0_d.h" #include "oss/oss_2_0_d.h"
#include "oss/oss_2_0_sh_mask.h" #include "oss/oss_2_0_sh_mask.h"
#include "gca/gfx_8_0_d.h" #include "gca/gfx_8_0_d.h"
#include "smu/smu_7_1_2_d.h"
#include "smu/smu_7_1_2_sh_mask.h"
#define GRBM_GFX_INDEX__VCE_INSTANCE__SHIFT 0x04 #define GRBM_GFX_INDEX__VCE_INSTANCE__SHIFT 0x04
#define GRBM_GFX_INDEX__VCE_INSTANCE_MASK 0x10 #define GRBM_GFX_INDEX__VCE_INSTANCE_MASK 0x10
@ -112,6 +114,10 @@ static int vce_v3_0_start(struct amdgpu_device *adev)
mutex_lock(&adev->grbm_idx_mutex); mutex_lock(&adev->grbm_idx_mutex);
for (idx = 0; idx < 2; ++idx) { for (idx = 0; idx < 2; ++idx) {
if (adev->vce.harvest_config & (1 << idx))
continue;
if(idx == 0) if(idx == 0)
WREG32_P(mmGRBM_GFX_INDEX, 0, WREG32_P(mmGRBM_GFX_INDEX, 0,
~GRBM_GFX_INDEX__VCE_INSTANCE_MASK); ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK);
@ -190,10 +196,52 @@ static int vce_v3_0_start(struct amdgpu_device *adev)
return 0; return 0;
} }
#define ixVCE_HARVEST_FUSE_MACRO__ADDRESS 0xC0014074
#define VCE_HARVEST_FUSE_MACRO__SHIFT 27
#define VCE_HARVEST_FUSE_MACRO__MASK 0x18000000
static unsigned vce_v3_0_get_harvest_config(struct amdgpu_device *adev)
{
u32 tmp;
unsigned ret;
if (adev->flags & AMDGPU_IS_APU)
tmp = (RREG32_SMC(ixVCE_HARVEST_FUSE_MACRO__ADDRESS) &
VCE_HARVEST_FUSE_MACRO__MASK) >>
VCE_HARVEST_FUSE_MACRO__SHIFT;
else
tmp = (RREG32_SMC(ixCC_HARVEST_FUSES) &
CC_HARVEST_FUSES__VCE_DISABLE_MASK) >>
CC_HARVEST_FUSES__VCE_DISABLE__SHIFT;
switch (tmp) {
case 1:
ret = AMDGPU_VCE_HARVEST_VCE0;
break;
case 2:
ret = AMDGPU_VCE_HARVEST_VCE1;
break;
case 3:
ret = AMDGPU_VCE_HARVEST_VCE0 | AMDGPU_VCE_HARVEST_VCE1;
break;
default:
ret = 0;
}
return ret;
}
static int vce_v3_0_early_init(void *handle) static int vce_v3_0_early_init(void *handle)
{ {
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
adev->vce.harvest_config = vce_v3_0_get_harvest_config(adev);
if ((adev->vce.harvest_config &
(AMDGPU_VCE_HARVEST_VCE0 | AMDGPU_VCE_HARVEST_VCE1)) ==
(AMDGPU_VCE_HARVEST_VCE0 | AMDGPU_VCE_HARVEST_VCE1))
return -ENOENT;
vce_v3_0_set_ring_funcs(adev); vce_v3_0_set_ring_funcs(adev);
vce_v3_0_set_irq_funcs(adev); vce_v3_0_set_irq_funcs(adev);

View file

@ -355,6 +355,7 @@ int atmel_hlcdc_crtc_create(struct drm_device *dev)
planes->overlays[i]->base.possible_crtcs = 1 << crtc->id; planes->overlays[i]->base.possible_crtcs = 1 << crtc->id;
drm_crtc_helper_add(&crtc->base, &lcdc_crtc_helper_funcs); drm_crtc_helper_add(&crtc->base, &lcdc_crtc_helper_funcs);
drm_crtc_vblank_reset(&crtc->base);
dc->crtc = &crtc->base; dc->crtc = &crtc->base;

View file

@ -313,6 +313,12 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev)
pm_runtime_enable(dev->dev); pm_runtime_enable(dev->dev);
ret = drm_vblank_init(dev, 1);
if (ret < 0) {
dev_err(dev->dev, "failed to initialize vblank\n");
goto err_periph_clk_disable;
}
ret = atmel_hlcdc_dc_modeset_init(dev); ret = atmel_hlcdc_dc_modeset_init(dev);
if (ret < 0) { if (ret < 0) {
dev_err(dev->dev, "failed to initialize mode setting\n"); dev_err(dev->dev, "failed to initialize mode setting\n");
@ -321,12 +327,6 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev)
drm_mode_config_reset(dev); drm_mode_config_reset(dev);
ret = drm_vblank_init(dev, 1);
if (ret < 0) {
dev_err(dev->dev, "failed to initialize vblank\n");
goto err_periph_clk_disable;
}
pm_runtime_get_sync(dev->dev); pm_runtime_get_sync(dev->dev);
ret = drm_irq_install(dev, dc->hlcdc->irq); ret = drm_irq_install(dev, dc->hlcdc->irq);
pm_runtime_put_sync(dev->dev); pm_runtime_put_sync(dev->dev);

View file

@ -5398,12 +5398,9 @@ void drm_mode_config_reset(struct drm_device *dev)
if (encoder->funcs->reset) if (encoder->funcs->reset)
encoder->funcs->reset(encoder); encoder->funcs->reset(encoder);
list_for_each_entry(connector, &dev->mode_config.connector_list, head) { list_for_each_entry(connector, &dev->mode_config.connector_list, head)
connector->status = connector_status_unknown;
if (connector->funcs->reset) if (connector->funcs->reset)
connector->funcs->reset(connector); connector->funcs->reset(connector);
}
} }
EXPORT_SYMBOL(drm_mode_config_reset); EXPORT_SYMBOL(drm_mode_config_reset);

View file

@ -1274,10 +1274,12 @@ int i915_reg_read_ioctl(struct drm_device *dev,
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct drm_i915_reg_read *reg = data; struct drm_i915_reg_read *reg = data;
struct register_whitelist const *entry = whitelist; struct register_whitelist const *entry = whitelist;
unsigned size;
u64 offset;
int i, ret = 0; int i, ret = 0;
for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) { for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) {
if (entry->offset == reg->offset && if (entry->offset == (reg->offset & -entry->size) &&
(1 << INTEL_INFO(dev)->gen & entry->gen_bitmask)) (1 << INTEL_INFO(dev)->gen & entry->gen_bitmask))
break; break;
} }
@ -1285,23 +1287,33 @@ int i915_reg_read_ioctl(struct drm_device *dev,
if (i == ARRAY_SIZE(whitelist)) if (i == ARRAY_SIZE(whitelist))
return -EINVAL; return -EINVAL;
/* We use the low bits to encode extra flags as the register should
* be naturally aligned (and those that are not so aligned merely
* limit the available flags for that register).
*/
offset = entry->offset;
size = entry->size;
size |= reg->offset ^ offset;
intel_runtime_pm_get(dev_priv); intel_runtime_pm_get(dev_priv);
switch (entry->size) { switch (size) {
case 8 | 1:
reg->val = I915_READ64_2x32(offset, offset+4);
break;
case 8: case 8:
reg->val = I915_READ64(reg->offset); reg->val = I915_READ64(offset);
break; break;
case 4: case 4:
reg->val = I915_READ(reg->offset); reg->val = I915_READ(offset);
break; break;
case 2: case 2:
reg->val = I915_READ16(reg->offset); reg->val = I915_READ16(offset);
break; break;
case 1: case 1:
reg->val = I915_READ8(reg->offset); reg->val = I915_READ8(offset);
break; break;
default: default:
MISSING_CASE(entry->size);
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }

View file

@ -490,7 +490,8 @@ pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp)
else if (boot_cpu_data.x86 > 3) else if (boot_cpu_data.x86 > 3)
tmp = pgprot_noncached(tmp); tmp = pgprot_noncached(tmp);
#endif #endif
#if defined(__ia64__) || defined(__arm__) || defined(__powerpc__) #if defined(__ia64__) || defined(__arm__) || defined(__aarch64__) || \
defined(__powerpc__)
if (caching_flags & TTM_PL_FLAG_WC) if (caching_flags & TTM_PL_FLAG_WC)
tmp = pgprot_writecombine(tmp); tmp = pgprot_writecombine(tmp);
else else

View file

@ -356,6 +356,8 @@ static int cp2112_read(struct cp2112_device *dev, u8 *data, size_t size)
struct cp2112_force_read_report report; struct cp2112_force_read_report report;
int ret; int ret;
if (size > sizeof(dev->read_data))
size = sizeof(dev->read_data);
report.report = CP2112_DATA_READ_FORCE_SEND; report.report = CP2112_DATA_READ_FORCE_SEND;
report.length = cpu_to_be16(size); report.length = cpu_to_be16(size);

View file

@ -778,9 +778,16 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
/* /*
* some egalax touchscreens have "application == HID_DG_TOUCHSCREEN" * some egalax touchscreens have "application == HID_DG_TOUCHSCREEN"
* for the stylus. * for the stylus.
* The check for mt_report_id ensures we don't process
* HID_DG_CONTACTCOUNT from the pen report as it is outside the physical
* collection, but within the report ID.
*/ */
if (field->physical == HID_DG_STYLUS) if (field->physical == HID_DG_STYLUS)
return 0; return 0;
else if ((field->physical == 0) &&
(field->report->id != td->mt_report_id) &&
(td->mt_report_id != -1))
return 0;
if (field->application == HID_DG_TOUCHSCREEN || if (field->application == HID_DG_TOUCHSCREEN ||
field->application == HID_DG_TOUCHPAD) field->application == HID_DG_TOUCHPAD)

View file

@ -87,6 +87,9 @@ static const struct hid_blacklist {
{ USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOUSE_C05A, HID_QUIRK_ALWAYS_POLL }, { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOUSE_C05A, HID_QUIRK_ALWAYS_POLL },
{ USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOUSE_C06A, HID_QUIRK_ALWAYS_POLL }, { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOUSE_C06A, HID_QUIRK_ALWAYS_POLL },
{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET }, { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_PRO_2, HID_QUIRK_NO_INIT_REPORTS },
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2, HID_QUIRK_NO_INIT_REPORTS },
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2, HID_QUIRK_NO_INIT_REPORTS },
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS },
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3_JP, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3_JP, HID_QUIRK_NO_INIT_REPORTS },
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER, HID_QUIRK_NO_INIT_REPORTS },

View file

@ -1271,11 +1271,13 @@ fail_leds:
pad_input_dev = NULL; pad_input_dev = NULL;
wacom_wac->pad_registered = false; wacom_wac->pad_registered = false;
fail_register_pad_input: fail_register_pad_input:
input_unregister_device(touch_input_dev); if (touch_input_dev)
input_unregister_device(touch_input_dev);
wacom_wac->touch_input = NULL; wacom_wac->touch_input = NULL;
wacom_wac->touch_registered = false; wacom_wac->touch_registered = false;
fail_register_touch_input: fail_register_touch_input:
input_unregister_device(pen_input_dev); if (pen_input_dev)
input_unregister_device(pen_input_dev);
wacom_wac->pen_input = NULL; wacom_wac->pen_input = NULL;
wacom_wac->pen_registered = false; wacom_wac->pen_registered = false;
fail_register_pen_input: fail_register_pen_input:

View file

@ -2213,6 +2213,9 @@ void wacom_setup_device_quirks(struct wacom *wacom)
features->x_max = 4096; features->x_max = 4096;
features->y_max = 4096; features->y_max = 4096;
} }
else if (features->pktlen == WACOM_PKGLEN_BBTOUCH) {
features->device_type |= WACOM_DEVICETYPE_PAD;
}
} }
/* /*

View file

@ -557,21 +557,21 @@ static void mma8452_transient_interrupt(struct iio_dev *indio_dev)
if (src & MMA8452_TRANSIENT_SRC_XTRANSE) if (src & MMA8452_TRANSIENT_SRC_XTRANSE)
iio_push_event(indio_dev, iio_push_event(indio_dev,
IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X, IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X,
IIO_EV_TYPE_THRESH, IIO_EV_TYPE_MAG,
IIO_EV_DIR_RISING), IIO_EV_DIR_RISING),
ts); ts);
if (src & MMA8452_TRANSIENT_SRC_YTRANSE) if (src & MMA8452_TRANSIENT_SRC_YTRANSE)
iio_push_event(indio_dev, iio_push_event(indio_dev,
IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Y, IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Y,
IIO_EV_TYPE_THRESH, IIO_EV_TYPE_MAG,
IIO_EV_DIR_RISING), IIO_EV_DIR_RISING),
ts); ts);
if (src & MMA8452_TRANSIENT_SRC_ZTRANSE) if (src & MMA8452_TRANSIENT_SRC_ZTRANSE)
iio_push_event(indio_dev, iio_push_event(indio_dev,
IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Z, IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Z,
IIO_EV_TYPE_THRESH, IIO_EV_TYPE_MAG,
IIO_EV_DIR_RISING), IIO_EV_DIR_RISING),
ts); ts);
} }
@ -644,7 +644,7 @@ static int mma8452_reg_access_dbg(struct iio_dev *indio_dev,
static const struct iio_event_spec mma8452_transient_event[] = { static const struct iio_event_spec mma8452_transient_event[] = {
{ {
.type = IIO_EV_TYPE_THRESH, .type = IIO_EV_TYPE_MAG,
.dir = IIO_EV_DIR_RISING, .dir = IIO_EV_DIR_RISING,
.mask_separate = BIT(IIO_EV_INFO_ENABLE), .mask_separate = BIT(IIO_EV_INFO_ENABLE),
.mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) | .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |

View file

@ -299,6 +299,8 @@ static int mcp320x_probe(struct spi_device *spi)
indio_dev->channels = chip_info->channels; indio_dev->channels = chip_info->channels;
indio_dev->num_channels = chip_info->num_channels; indio_dev->num_channels = chip_info->num_channels;
adc->chip_info = chip_info;
adc->transfer[0].tx_buf = &adc->tx_buf; adc->transfer[0].tx_buf = &adc->tx_buf;
adc->transfer[0].len = sizeof(adc->tx_buf); adc->transfer[0].len = sizeof(adc->tx_buf);
adc->transfer[1].rx_buf = adc->rx_buf; adc->transfer[1].rx_buf = adc->rx_buf;

View file

@ -635,7 +635,7 @@ static int vf610_adc_reg_access(struct iio_dev *indio_dev,
struct vf610_adc *info = iio_priv(indio_dev); struct vf610_adc *info = iio_priv(indio_dev);
if ((readval == NULL) || if ((readval == NULL) ||
(!(reg % 4) || (reg > VF610_REG_ADC_PCTL))) ((reg % 4) || (reg > VF610_REG_ADC_PCTL)))
return -EINVAL; return -EINVAL;
*readval = readl(info->regs + reg); *readval = readl(info->regs + reg);

View file

@ -200,7 +200,7 @@ static int stk3310_read_event(struct iio_dev *indio_dev,
int *val, int *val2) int *val, int *val2)
{ {
u8 reg; u8 reg;
u16 buf; __be16 buf;
int ret; int ret;
struct stk3310_data *data = iio_priv(indio_dev); struct stk3310_data *data = iio_priv(indio_dev);
@ -222,7 +222,7 @@ static int stk3310_read_event(struct iio_dev *indio_dev,
dev_err(&data->client->dev, "register read failed\n"); dev_err(&data->client->dev, "register read failed\n");
return ret; return ret;
} }
*val = swab16(buf); *val = be16_to_cpu(buf);
return IIO_VAL_INT; return IIO_VAL_INT;
} }
@ -235,7 +235,7 @@ static int stk3310_write_event(struct iio_dev *indio_dev,
int val, int val2) int val, int val2)
{ {
u8 reg; u8 reg;
u16 buf; __be16 buf;
int ret; int ret;
unsigned int index; unsigned int index;
struct stk3310_data *data = iio_priv(indio_dev); struct stk3310_data *data = iio_priv(indio_dev);
@ -252,7 +252,7 @@ static int stk3310_write_event(struct iio_dev *indio_dev,
else else
return -EINVAL; return -EINVAL;
buf = swab16(val); buf = cpu_to_be16(val);
ret = regmap_bulk_write(data->regmap, reg, &buf, 2); ret = regmap_bulk_write(data->regmap, reg, &buf, 2);
if (ret < 0) if (ret < 0)
dev_err(&client->dev, "failed to set PS threshold!\n"); dev_err(&client->dev, "failed to set PS threshold!\n");
@ -301,7 +301,7 @@ static int stk3310_read_raw(struct iio_dev *indio_dev,
int *val, int *val2, long mask) int *val, int *val2, long mask)
{ {
u8 reg; u8 reg;
u16 buf; __be16 buf;
int ret; int ret;
unsigned int index; unsigned int index;
struct stk3310_data *data = iio_priv(indio_dev); struct stk3310_data *data = iio_priv(indio_dev);
@ -322,7 +322,7 @@ static int stk3310_read_raw(struct iio_dev *indio_dev,
mutex_unlock(&data->lock); mutex_unlock(&data->lock);
return ret; return ret;
} }
*val = swab16(buf); *val = be16_to_cpu(buf);
mutex_unlock(&data->lock); mutex_unlock(&data->lock);
return IIO_VAL_INT; return IIO_VAL_INT;
case IIO_CHAN_INFO_INT_TIME: case IIO_CHAN_INFO_INT_TIME:
@ -608,13 +608,7 @@ static int stk3310_probe(struct i2c_client *client,
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = iio_device_register(indio_dev); if (client->irq < 0)
if (ret < 0) {
dev_err(&client->dev, "device_register failed\n");
stk3310_set_state(data, STK3310_STATE_STANDBY);
}
if (client->irq <= 0)
client->irq = stk3310_gpio_probe(client); client->irq = stk3310_gpio_probe(client);
if (client->irq >= 0) { if (client->irq >= 0) {
@ -629,6 +623,12 @@ static int stk3310_probe(struct i2c_client *client,
client->irq); client->irq);
} }
ret = iio_device_register(indio_dev);
if (ret < 0) {
dev_err(&client->dev, "device_register failed\n");
stk3310_set_state(data, STK3310_STATE_STANDBY);
}
return ret; return ret;
} }

View file

@ -90,6 +90,7 @@ config IIO_ST_MAGN_SPI_3AXIS
config BMC150_MAGN config BMC150_MAGN
tristate "Bosch BMC150 Magnetometer Driver" tristate "Bosch BMC150 Magnetometer Driver"
depends on I2C depends on I2C
select REGMAP_I2C
select IIO_BUFFER select IIO_BUFFER
select IIO_TRIGGERED_BUFFER select IIO_TRIGGERED_BUFFER
help help

View file

@ -706,11 +706,11 @@ static int bmc150_magn_init(struct bmc150_magn_data *data)
goto err_poweroff; goto err_poweroff;
} }
if (chip_id != BMC150_MAGN_CHIP_ID_VAL) { if (chip_id != BMC150_MAGN_CHIP_ID_VAL) {
dev_err(&data->client->dev, "Invalid chip id 0x%x\n", ret); dev_err(&data->client->dev, "Invalid chip id 0x%x\n", chip_id);
ret = -ENODEV; ret = -ENODEV;
goto err_poweroff; goto err_poweroff;
} }
dev_dbg(&data->client->dev, "Chip id %x\n", ret); dev_dbg(&data->client->dev, "Chip id %x\n", chip_id);
preset = bmc150_magn_presets_table[BMC150_MAGN_DEFAULT_PRESET]; preset = bmc150_magn_presets_table[BMC150_MAGN_DEFAULT_PRESET];
ret = bmc150_magn_set_odr(data, preset.odr); ret = bmc150_magn_set_odr(data, preset.odr);

View file

@ -202,8 +202,8 @@ static int mmc35240_hw_set(struct mmc35240_data *data, bool set)
coil_bit = MMC35240_CTRL0_RESET_BIT; coil_bit = MMC35240_CTRL0_RESET_BIT;
return regmap_update_bits(data->regmap, MMC35240_REG_CTRL0, return regmap_update_bits(data->regmap, MMC35240_REG_CTRL0,
MMC35240_CTRL0_REFILL_BIT, coil_bit, coil_bit);
coil_bit);
} }
static int mmc35240_init(struct mmc35240_data *data) static int mmc35240_init(struct mmc35240_data *data)
@ -222,14 +222,15 @@ static int mmc35240_init(struct mmc35240_data *data)
/* /*
* make sure we restore sensor characteristics, by doing * make sure we restore sensor characteristics, by doing
* a RESET/SET sequence * a SET/RESET sequence, the axis polarity being naturally
* aligned after RESET
*/ */
ret = mmc35240_hw_set(data, false); ret = mmc35240_hw_set(data, true);
if (ret < 0) if (ret < 0)
return ret; return ret;
usleep_range(MMC53240_WAIT_SET_RESET, MMC53240_WAIT_SET_RESET + 1); usleep_range(MMC53240_WAIT_SET_RESET, MMC53240_WAIT_SET_RESET + 1);
ret = mmc35240_hw_set(data, true); ret = mmc35240_hw_set(data, false);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -503,6 +504,7 @@ static int mmc35240_probe(struct i2c_client *client,
} }
data = iio_priv(indio_dev); data = iio_priv(indio_dev);
i2c_set_clientdata(client, indio_dev);
data->client = client; data->client = client;
data->regmap = regmap; data->regmap = regmap;
data->res = MMC35240_16_BITS_SLOW; data->res = MMC35240_16_BITS_SLOW;

View file

@ -204,7 +204,7 @@ static int mlx90614_read_raw(struct iio_dev *indio_dev,
*val = ret; *val = ret;
return IIO_VAL_INT; return IIO_VAL_INT;
case IIO_CHAN_INFO_OFFSET: case IIO_CHAN_INFO_OFFSET:
*val = 13657; *val = -13657;
*val2 = 500000; *val2 = 500000;
return IIO_VAL_INT_PLUS_MICRO; return IIO_VAL_INT_PLUS_MICRO;
case IIO_CHAN_INFO_SCALE: case IIO_CHAN_INFO_SCALE:

View file

@ -31,6 +31,8 @@
* SOFTWARE. * SOFTWARE.
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/idr.h> #include <linux/idr.h>
@ -399,8 +401,8 @@ static int ipath_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
u32 bar0 = 0, bar1 = 0; u32 bar0 = 0, bar1 = 0;
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
if (WARN(pat_enabled(), if (pat_enabled()) {
"ipath needs PAT disabled, boot with nopat kernel parameter\n")) { pr_warn("ipath needs PAT disabled, boot with nopat kernel parameter\n");
ret = -ENODEV; ret = -ENODEV;
goto bail; goto bail;
} }

View file

@ -71,6 +71,18 @@ static void input_leds_event(struct input_handle *handle, unsigned int type,
{ {
} }
static int input_leds_get_count(struct input_dev *dev)
{
unsigned int led_code;
int count = 0;
for_each_set_bit(led_code, dev->ledbit, LED_CNT)
if (input_led_info[led_code].name)
count++;
return count;
}
static int input_leds_connect(struct input_handler *handler, static int input_leds_connect(struct input_handler *handler,
struct input_dev *dev, struct input_dev *dev,
const struct input_device_id *id) const struct input_device_id *id)
@ -81,7 +93,7 @@ static int input_leds_connect(struct input_handler *handler,
int led_no; int led_no;
int error; int error;
num_leds = bitmap_weight(dev->ledbit, LED_CNT); num_leds = input_leds_get_count(dev);
if (!num_leds) if (!num_leds)
return -ENXIO; return -ENXIO;
@ -112,7 +124,7 @@ static int input_leds_connect(struct input_handler *handler,
led->handle = &leds->handle; led->handle = &leds->handle;
led->code = led_code; led->code = led_code;
if (WARN_ON(!input_led_info[led_code].name)) if (!input_led_info[led_code].name)
continue; continue;
led->cdev.name = kasprintf(GFP_KERNEL, "%s::%s", led->cdev.name = kasprintf(GFP_KERNEL, "%s::%s",

View file

@ -1167,7 +1167,7 @@ static int elantech_set_input_params(struct psmouse *psmouse)
struct input_dev *dev = psmouse->dev; struct input_dev *dev = psmouse->dev;
struct elantech_data *etd = psmouse->private; struct elantech_data *etd = psmouse->private;
unsigned int x_min = 0, y_min = 0, x_max = 0, y_max = 0, width = 0; unsigned int x_min = 0, y_min = 0, x_max = 0, y_max = 0, width = 0;
unsigned int x_res = 0, y_res = 0; unsigned int x_res = 31, y_res = 31;
if (elantech_set_range(psmouse, &x_min, &y_min, &x_max, &y_max, &width)) if (elantech_set_range(psmouse, &x_min, &y_min, &x_max, &y_max, &width))
return -1; return -1;
@ -1232,8 +1232,6 @@ static int elantech_set_input_params(struct psmouse *psmouse)
/* For X to recognize me as touchpad. */ /* For X to recognize me as touchpad. */
input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0);
input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0); input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0);
input_abs_set_res(dev, ABS_X, x_res);
input_abs_set_res(dev, ABS_Y, y_res);
/* /*
* range of pressure and width is the same as v2, * range of pressure and width is the same as v2,
* report ABS_PRESSURE, ABS_TOOL_WIDTH for compatibility. * report ABS_PRESSURE, ABS_TOOL_WIDTH for compatibility.
@ -1246,8 +1244,6 @@ static int elantech_set_input_params(struct psmouse *psmouse)
input_mt_init_slots(dev, ETP_MAX_FINGERS, 0); input_mt_init_slots(dev, ETP_MAX_FINGERS, 0);
input_set_abs_params(dev, ABS_MT_POSITION_X, x_min, x_max, 0, 0); input_set_abs_params(dev, ABS_MT_POSITION_X, x_min, x_max, 0, 0);
input_set_abs_params(dev, ABS_MT_POSITION_Y, y_min, y_max, 0, 0); input_set_abs_params(dev, ABS_MT_POSITION_Y, y_min, y_max, 0, 0);
input_abs_set_res(dev, ABS_MT_POSITION_X, x_res);
input_abs_set_res(dev, ABS_MT_POSITION_Y, y_res);
input_set_abs_params(dev, ABS_MT_PRESSURE, ETP_PMIN_V2, input_set_abs_params(dev, ABS_MT_PRESSURE, ETP_PMIN_V2,
ETP_PMAX_V2, 0, 0); ETP_PMAX_V2, 0, 0);
/* /*
@ -1259,6 +1255,13 @@ static int elantech_set_input_params(struct psmouse *psmouse)
break; break;
} }
input_abs_set_res(dev, ABS_X, x_res);
input_abs_set_res(dev, ABS_Y, y_res);
if (etd->hw_version > 1) {
input_abs_set_res(dev, ABS_MT_POSITION_X, x_res);
input_abs_set_res(dev, ABS_MT_POSITION_Y, y_res);
}
etd->y_max = y_max; etd->y_max = y_max;
etd->width = width; etd->width = width;

View file

@ -15,6 +15,7 @@
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/dmi.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/input/mt.h> #include <linux/input/mt.h>
@ -34,6 +35,7 @@ struct goodix_ts_data {
int abs_y_max; int abs_y_max;
unsigned int max_touch_num; unsigned int max_touch_num;
unsigned int int_trigger_type; unsigned int int_trigger_type;
bool rotated_screen;
}; };
#define GOODIX_MAX_HEIGHT 4096 #define GOODIX_MAX_HEIGHT 4096
@ -60,6 +62,30 @@ static const unsigned long goodix_irq_flags[] = {
IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH,
}; };
/*
* Those tablets have their coordinates origin at the bottom right
* of the tablet, as if rotated 180 degrees
*/
static const struct dmi_system_id rotated_screen[] = {
#if defined(CONFIG_DMI) && defined(CONFIG_X86)
{
.ident = "WinBook TW100",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "WinBook"),
DMI_MATCH(DMI_PRODUCT_NAME, "TW100")
}
},
{
.ident = "WinBook TW700",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "WinBook"),
DMI_MATCH(DMI_PRODUCT_NAME, "TW700")
},
},
#endif
{}
};
/** /**
* goodix_i2c_read - read data from a register of the i2c slave device. * goodix_i2c_read - read data from a register of the i2c slave device.
* *
@ -129,6 +155,11 @@ static void goodix_ts_report_touch(struct goodix_ts_data *ts, u8 *coor_data)
int input_y = get_unaligned_le16(&coor_data[3]); int input_y = get_unaligned_le16(&coor_data[3]);
int input_w = get_unaligned_le16(&coor_data[5]); int input_w = get_unaligned_le16(&coor_data[5]);
if (ts->rotated_screen) {
input_x = ts->abs_x_max - input_x;
input_y = ts->abs_y_max - input_y;
}
input_mt_slot(ts->input_dev, id); input_mt_slot(ts->input_dev, id);
input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true); input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);
input_report_abs(ts->input_dev, ABS_MT_POSITION_X, input_x); input_report_abs(ts->input_dev, ABS_MT_POSITION_X, input_x);
@ -223,6 +254,11 @@ static void goodix_read_config(struct goodix_ts_data *ts)
ts->abs_y_max = GOODIX_MAX_HEIGHT; ts->abs_y_max = GOODIX_MAX_HEIGHT;
ts->max_touch_num = GOODIX_MAX_CONTACTS; ts->max_touch_num = GOODIX_MAX_CONTACTS;
} }
ts->rotated_screen = dmi_check_system(rotated_screen);
if (ts->rotated_screen)
dev_dbg(&ts->client->dev,
"Applying '180 degrees rotated screen' quirk\n");
} }
/** /**

View file

@ -627,6 +627,9 @@ static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
goto err_out; goto err_out;
} }
/* TSC-25 data sheet specifies a delay after the RESET command */
msleep(150);
/* set coordinate output rate */ /* set coordinate output rate */
buf[0] = buf[1] = 0xFF; buf[0] = buf[1] = 0xFF;
ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),

View file

@ -429,7 +429,7 @@ static int zforce_read_packet(struct zforce_ts *ts, u8 *buf)
goto unlock; goto unlock;
} }
if (buf[PAYLOAD_LENGTH] == 0) { if (buf[PAYLOAD_LENGTH] == 0 || buf[PAYLOAD_LENGTH] > FRAME_MAXSIZE) {
dev_err(&client->dev, "invalid payload length: %d\n", dev_err(&client->dev, "invalid payload length: %d\n",
buf[PAYLOAD_LENGTH]); buf[PAYLOAD_LENGTH]);
ret = -EIO; ret = -EIO;

View file

@ -199,9 +199,10 @@
* Stream table. * Stream table.
* *
* Linear: Enough to cover 1 << IDR1.SIDSIZE entries * Linear: Enough to cover 1 << IDR1.SIDSIZE entries
* 2lvl: 8k L1 entries, 256 lazy entries per table (each table covers a PCI bus) * 2lvl: 128k L1 entries,
* 256 lazy entries per table (each table covers a PCI bus)
*/ */
#define STRTAB_L1_SZ_SHIFT 16 #define STRTAB_L1_SZ_SHIFT 20
#define STRTAB_SPLIT 8 #define STRTAB_SPLIT 8
#define STRTAB_L1_DESC_DWORDS 1 #define STRTAB_L1_DESC_DWORDS 1
@ -269,10 +270,10 @@
#define ARM64_TCR_TG0_SHIFT 14 #define ARM64_TCR_TG0_SHIFT 14
#define ARM64_TCR_TG0_MASK 0x3UL #define ARM64_TCR_TG0_MASK 0x3UL
#define CTXDESC_CD_0_TCR_IRGN0_SHIFT 8 #define CTXDESC_CD_0_TCR_IRGN0_SHIFT 8
#define ARM64_TCR_IRGN0_SHIFT 24 #define ARM64_TCR_IRGN0_SHIFT 8
#define ARM64_TCR_IRGN0_MASK 0x3UL #define ARM64_TCR_IRGN0_MASK 0x3UL
#define CTXDESC_CD_0_TCR_ORGN0_SHIFT 10 #define CTXDESC_CD_0_TCR_ORGN0_SHIFT 10
#define ARM64_TCR_ORGN0_SHIFT 26 #define ARM64_TCR_ORGN0_SHIFT 10
#define ARM64_TCR_ORGN0_MASK 0x3UL #define ARM64_TCR_ORGN0_MASK 0x3UL
#define CTXDESC_CD_0_TCR_SH0_SHIFT 12 #define CTXDESC_CD_0_TCR_SH0_SHIFT 12
#define ARM64_TCR_SH0_SHIFT 12 #define ARM64_TCR_SH0_SHIFT 12
@ -542,6 +543,9 @@ struct arm_smmu_device {
#define ARM_SMMU_FEAT_HYP (1 << 12) #define ARM_SMMU_FEAT_HYP (1 << 12)
u32 features; u32 features;
#define ARM_SMMU_OPT_SKIP_PREFETCH (1 << 0)
u32 options;
struct arm_smmu_cmdq cmdq; struct arm_smmu_cmdq cmdq;
struct arm_smmu_evtq evtq; struct arm_smmu_evtq evtq;
struct arm_smmu_priq priq; struct arm_smmu_priq priq;
@ -602,11 +606,35 @@ struct arm_smmu_domain {
static DEFINE_SPINLOCK(arm_smmu_devices_lock); static DEFINE_SPINLOCK(arm_smmu_devices_lock);
static LIST_HEAD(arm_smmu_devices); static LIST_HEAD(arm_smmu_devices);
struct arm_smmu_option_prop {
u32 opt;
const char *prop;
};
static struct arm_smmu_option_prop arm_smmu_options[] = {
{ ARM_SMMU_OPT_SKIP_PREFETCH, "hisilicon,broken-prefetch-cmd" },
{ 0, NULL},
};
static struct arm_smmu_domain *to_smmu_domain(struct iommu_domain *dom) static struct arm_smmu_domain *to_smmu_domain(struct iommu_domain *dom)
{ {
return container_of(dom, struct arm_smmu_domain, domain); return container_of(dom, struct arm_smmu_domain, domain);
} }
static void parse_driver_options(struct arm_smmu_device *smmu)
{
int i = 0;
do {
if (of_property_read_bool(smmu->dev->of_node,
arm_smmu_options[i].prop)) {
smmu->options |= arm_smmu_options[i].opt;
dev_notice(smmu->dev, "option %s\n",
arm_smmu_options[i].prop);
}
} while (arm_smmu_options[++i].opt);
}
/* Low-level queue manipulation functions */ /* Low-level queue manipulation functions */
static bool queue_full(struct arm_smmu_queue *q) static bool queue_full(struct arm_smmu_queue *q)
{ {
@ -1036,7 +1064,8 @@ static void arm_smmu_write_strtab_ent(struct arm_smmu_device *smmu, u32 sid,
arm_smmu_sync_ste_for_sid(smmu, sid); arm_smmu_sync_ste_for_sid(smmu, sid);
/* It's likely that we'll want to use the new STE soon */ /* It's likely that we'll want to use the new STE soon */
arm_smmu_cmdq_issue_cmd(smmu, &prefetch_cmd); if (!(smmu->options & ARM_SMMU_OPT_SKIP_PREFETCH))
arm_smmu_cmdq_issue_cmd(smmu, &prefetch_cmd);
} }
static void arm_smmu_init_bypass_stes(u64 *strtab, unsigned int nent) static void arm_smmu_init_bypass_stes(u64 *strtab, unsigned int nent)
@ -1064,7 +1093,7 @@ static int arm_smmu_init_l2_strtab(struct arm_smmu_device *smmu, u32 sid)
return 0; return 0;
size = 1 << (STRTAB_SPLIT + ilog2(STRTAB_STE_DWORDS) + 3); size = 1 << (STRTAB_SPLIT + ilog2(STRTAB_STE_DWORDS) + 3);
strtab = &cfg->strtab[sid >> STRTAB_SPLIT << STRTAB_L1_DESC_DWORDS]; strtab = &cfg->strtab[(sid >> STRTAB_SPLIT) * STRTAB_L1_DESC_DWORDS];
desc->span = STRTAB_SPLIT + 1; desc->span = STRTAB_SPLIT + 1;
desc->l2ptr = dma_zalloc_coherent(smmu->dev, size, &desc->l2ptr_dma, desc->l2ptr = dma_zalloc_coherent(smmu->dev, size, &desc->l2ptr_dma,
@ -2020,21 +2049,23 @@ static int arm_smmu_init_strtab_2lvl(struct arm_smmu_device *smmu)
{ {
void *strtab; void *strtab;
u64 reg; u64 reg;
u32 size; u32 size, l1size;
int ret; int ret;
struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg; struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
/* Calculate the L1 size, capped to the SIDSIZE */ /* Calculate the L1 size, capped to the SIDSIZE */
size = STRTAB_L1_SZ_SHIFT - (ilog2(STRTAB_L1_DESC_DWORDS) + 3); size = STRTAB_L1_SZ_SHIFT - (ilog2(STRTAB_L1_DESC_DWORDS) + 3);
size = min(size, smmu->sid_bits - STRTAB_SPLIT); size = min(size, smmu->sid_bits - STRTAB_SPLIT);
if (size + STRTAB_SPLIT < smmu->sid_bits) cfg->num_l1_ents = 1 << size;
size += STRTAB_SPLIT;
if (size < smmu->sid_bits)
dev_warn(smmu->dev, dev_warn(smmu->dev,
"2-level strtab only covers %u/%u bits of SID\n", "2-level strtab only covers %u/%u bits of SID\n",
size + STRTAB_SPLIT, smmu->sid_bits); size, smmu->sid_bits);
cfg->num_l1_ents = 1 << size; l1size = cfg->num_l1_ents * (STRTAB_L1_DESC_DWORDS << 3);
size = cfg->num_l1_ents * (STRTAB_L1_DESC_DWORDS << 3); strtab = dma_zalloc_coherent(smmu->dev, l1size, &cfg->strtab_dma,
strtab = dma_zalloc_coherent(smmu->dev, size, &cfg->strtab_dma,
GFP_KERNEL); GFP_KERNEL);
if (!strtab) { if (!strtab) {
dev_err(smmu->dev, dev_err(smmu->dev,
@ -2055,8 +2086,7 @@ static int arm_smmu_init_strtab_2lvl(struct arm_smmu_device *smmu)
ret = arm_smmu_init_l1_strtab(smmu); ret = arm_smmu_init_l1_strtab(smmu);
if (ret) if (ret)
dma_free_coherent(smmu->dev, dma_free_coherent(smmu->dev,
cfg->num_l1_ents * l1size,
(STRTAB_L1_DESC_DWORDS << 3),
strtab, strtab,
cfg->strtab_dma); cfg->strtab_dma);
return ret; return ret;
@ -2573,6 +2603,8 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
if (irq > 0) if (irq > 0)
smmu->gerr_irq = irq; smmu->gerr_irq = irq;
parse_driver_options(smmu);
/* Probe the h/w */ /* Probe the h/w */
ret = arm_smmu_device_probe(smmu); ret = arm_smmu_device_probe(smmu);
if (ret) if (ret)

View file

@ -1830,8 +1830,9 @@ static int domain_init(struct dmar_domain *domain, int guest_width)
static void domain_exit(struct dmar_domain *domain) static void domain_exit(struct dmar_domain *domain)
{ {
struct dmar_drhd_unit *drhd;
struct intel_iommu *iommu;
struct page *freelist = NULL; struct page *freelist = NULL;
int i;
/* Domain 0 is reserved, so dont process it */ /* Domain 0 is reserved, so dont process it */
if (!domain) if (!domain)
@ -1851,8 +1852,10 @@ static void domain_exit(struct dmar_domain *domain)
/* clear attached or cached domains */ /* clear attached or cached domains */
rcu_read_lock(); rcu_read_lock();
for_each_set_bit(i, domain->iommu_bmp, g_num_of_iommus) for_each_active_iommu(iommu, drhd)
iommu_detach_domain(domain, g_iommus[i]); if (domain_type_is_vm(domain) ||
test_bit(iommu->seq_id, domain->iommu_bmp))
iommu_detach_domain(domain, iommu);
rcu_read_unlock(); rcu_read_unlock();
dma_free_pagelist(freelist); dma_free_pagelist(freelist);

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