Merge 4.2-rc4 into tty-next
Other serial driver work wants to build on patches now in 4.2-rc4 so merge the branch so this can properly happen. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
commit
92311e46ec
274 changed files with 2105 additions and 1578 deletions
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
16
MAINTAINERS
16
MAINTAINERS
|
@ -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>
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -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*
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -41,8 +41,8 @@
|
||||||
pinctrl-0 = <&pinctrl_esdhc2>,
|
pinctrl-0 = <&pinctrl_esdhc2>,
|
||||||
<&pinctrl_esdhc2_cdwp>;
|
<&pinctrl_esdhc2_cdwp>;
|
||||||
vmmc-supply = <®_3p3v>;
|
vmmc-supply = <®_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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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>;
|
||||||
|
|
|
@ -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 = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 = <®_3p3v>;
|
vmmc-supply = <®_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 = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_usdhc3
|
pinctrl-0 = <&pinctrl_usdhc3
|
||||||
|
|
|
@ -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 = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 = <®_3p3v>;
|
vmmc-supply = <®_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 = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
|
@ -173,7 +173,7 @@
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_usdhc1>;
|
pinctrl-0 = <&pinctrl_usdhc1>;
|
||||||
vmmc-supply = <®_3p3v>;
|
vmmc-supply = <®_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 = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
cd-gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>;
|
cd-gpios = <&gpio4 8 GPIO_ACTIVE_LOW>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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 = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
cd-gpios = <&gpio1 4 0>;
|
cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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 = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -299,6 +299,6 @@
|
||||||
&pinctrl_hummingboard_usdhc2
|
&pinctrl_hummingboard_usdhc2
|
||||||
>;
|
>;
|
||||||
vmmc-supply = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
cd-gpios = <&gpio1 4 0>;
|
cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 = <®_3p3v>;
|
vmmc-supply = <®_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 = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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 = <®_3p3v>;
|
vmmc-supply = <®_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 = <®_3p3v>;
|
vmmc-supply = <®_3p3v>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
17
block/bio.c
17
block/bio.c
|
@ -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()
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) &&
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 },
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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) |
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
Loading…
Reference in a new issue