Merge branch 'for-5.17/letsketch' into for-linus

- new driver to support for LetSketch device (Hans de Goede)
This commit is contained in:
Jiri Kosina 2022-01-10 09:56:57 +01:00
commit 3551a3ff82
523 changed files with 5765 additions and 1973 deletions

View file

@ -126,6 +126,8 @@ Greg Kroah-Hartman <gregkh@suse.de>
Greg Kroah-Hartman <greg@kroah.com> Greg Kroah-Hartman <greg@kroah.com>
Greg Kurz <groug@kaod.org> <gkurz@linux.vnet.ibm.com> Greg Kurz <groug@kaod.org> <gkurz@linux.vnet.ibm.com>
Gregory CLEMENT <gregory.clement@bootlin.com> <gregory.clement@free-electrons.com> Gregory CLEMENT <gregory.clement@bootlin.com> <gregory.clement@free-electrons.com>
Guo Ren <guoren@kernel.org> <guoren@linux.alibaba.com>
Guo Ren <guoren@kernel.org> <ren_guo@c-sky.com>
Gustavo Padovan <gustavo@las.ic.unicamp.br> Gustavo Padovan <gustavo@las.ic.unicamp.br>
Gustavo Padovan <padovan@profusion.mobi> Gustavo Padovan <padovan@profusion.mobi>
Hanjun Guo <guohanjun@huawei.com> <hanjun.guo@linaro.org> Hanjun Guo <guohanjun@huawei.com> <hanjun.guo@linaro.org>

View file

@ -20,9 +20,9 @@ allOf:
properties: properties:
compatible: compatible:
enum: items:
- apple,t8103-i2c - const: apple,t8103-i2c
- apple,i2c - const: apple,i2c
reg: reg:
maxItems: 1 maxItems: 1
@ -51,7 +51,7 @@ unevaluatedProperties: false
examples: examples:
- | - |
i2c@35010000 { i2c@35010000 {
compatible = "apple,t8103-i2c"; compatible = "apple,t8103-i2c", "apple,i2c";
reg = <0x35010000 0x4000>; reg = <0x35010000 0x4000>;
interrupt-parent = <&aic>; interrupt-parent = <&aic>;
interrupts = <0 627 4>; interrupts = <0 627 4>;

View file

@ -136,7 +136,7 @@ examples:
samsung,syscon-phandle = <&pmu_system_controller>; samsung,syscon-phandle = <&pmu_system_controller>;
/* NTC thermistor is a hwmon device */ /* NTC thermistor is a hwmon device */
ncp15wb473 { thermistor {
compatible = "murata,ncp15wb473"; compatible = "murata,ncp15wb473";
pullup-uv = <1800000>; pullup-uv = <1800000>;
pullup-ohm = <47000>; pullup-ohm = <47000>;

View file

@ -142,7 +142,7 @@ examples:
down { down {
label = "GPIO Key DOWN"; label = "GPIO Key DOWN";
linux,code = <108>; linux,code = <108>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>; interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
}; };
}; };

View file

@ -79,6 +79,8 @@ properties:
properties: properties:
data-lanes: data-lanes:
description:
Note that 'fsl,imx7-mipi-csi2' only supports up to 2 data lines.
items: items:
minItems: 1 minItems: 1
maxItems: 4 maxItems: 4
@ -91,18 +93,6 @@ properties:
required: required:
- data-lanes - data-lanes
allOf:
- if:
properties:
compatible:
contains:
const: fsl,imx7-mipi-csi2
then:
properties:
data-lanes:
items:
maxItems: 2
port@1: port@1:
$ref: /schemas/graph.yaml#/properties/port $ref: /schemas/graph.yaml#/properties/port
description: description:

View file

@ -91,6 +91,14 @@ properties:
compensate for the board being designed with the lanes compensate for the board being designed with the lanes
swapped. swapped.
enet-phy-lane-no-swap:
$ref: /schemas/types.yaml#/definitions/flag
description:
If set, indicates that PHY will disable swap of the
TX/RX lanes. This property allows the PHY to work correcly after
e.g. wrong bootstrap configuration caused by issues in PCB
layout design.
eee-broken-100tx: eee-broken-100tx:
$ref: /schemas/types.yaml#/definitions/flag $ref: /schemas/types.yaml#/definitions/flag
description: description:

View file

@ -29,7 +29,7 @@ properties:
- PHY_TYPE_PCIE - PHY_TYPE_PCIE
- PHY_TYPE_SATA - PHY_TYPE_SATA
- PHY_TYPE_SGMII - PHY_TYPE_SGMII
- PHY_TYPE_USB - PHY_TYPE_USB3
- description: The PHY instance - description: The PHY instance
minimum: 0 minimum: 0
maximum: 1 # for DP, SATA or USB maximum: 1 # for DP, SATA or USB

View file

@ -105,7 +105,7 @@ examples:
reg = <0x65>; reg = <0x65>;
interrupt-parent = <&gpio1>; interrupt-parent = <&gpio1>;
interrupts = <16 IRQ_TYPE_EDGE_FALLING>; interrupts = <16 IRQ_TYPE_EDGE_FALLING>;
ti,watchdog-timer = <0>; ti,watchdog-timeout-ms = <0>;
ti,sc-ocp-limit-microamp = <2000000>; ti,sc-ocp-limit-microamp = <2000000>;
ti,sc-ovp-limit-microvolt = <17800000>; ti,sc-ovp-limit-microvolt = <17800000>;
monitored-battery = <&bat>; monitored-battery = <&bat>;

View file

@ -51,6 +51,19 @@ patternProperties:
description: description:
Properties for single BUCK regulator. Properties for single BUCK regulator.
properties:
op_mode:
$ref: /schemas/types.yaml#/definitions/uint32
enum: [0, 1, 2, 3]
default: 1
description: |
Describes the different operating modes of the regulator with power
mode change in SOC. The different possible values are:
0 - always off mode
1 - on in normal mode
2 - low power mode
3 - suspend mode
required: required:
- regulator-name - regulator-name
@ -63,6 +76,18 @@ patternProperties:
Properties for single BUCK regulator. Properties for single BUCK regulator.
properties: properties:
op_mode:
$ref: /schemas/types.yaml#/definitions/uint32
enum: [0, 1, 2, 3]
default: 1
description: |
Describes the different operating modes of the regulator with power
mode change in SOC. The different possible values are:
0 - always off mode
1 - on in normal mode
2 - low power mode
3 - suspend mode
s5m8767,pmic-ext-control-gpios: s5m8767,pmic-ext-control-gpios:
maxItems: 1 maxItems: 1
description: | description: |

View file

@ -19,6 +19,9 @@ properties:
clocks: clocks:
maxItems: 1 maxItems: 1
interrupts:
maxItems: 1
"#sound-dai-cells": "#sound-dai-cells":
const: 0 const: 0

View file

@ -439,11 +439,9 @@ preemption. The following substitution works on both kernels::
spin_lock(&p->lock); spin_lock(&p->lock);
p->count += this_cpu_read(var2); p->count += this_cpu_read(var2);
On a non-PREEMPT_RT kernel migrate_disable() maps to preempt_disable()
which makes the above code fully equivalent. On a PREEMPT_RT kernel
migrate_disable() ensures that the task is pinned on the current CPU which migrate_disable() ensures that the task is pinned on the current CPU which
in turn guarantees that the per-CPU access to var1 and var2 are staying on in turn guarantees that the per-CPU access to var1 and var2 are staying on
the same CPU. the same CPU while the task remains preemptible.
The migrate_disable() substitution is not valid for the following The migrate_disable() substitution is not valid for the following
scenario:: scenario::
@ -456,9 +454,8 @@ scenario::
p = this_cpu_ptr(&var1); p = this_cpu_ptr(&var1);
p->val = func2(); p->val = func2();
While correct on a non-PREEMPT_RT kernel, this breaks on PREEMPT_RT because This breaks because migrate_disable() does not protect against reentrancy from
here migrate_disable() does not protect against reentrancy from a a preempting task. A correct substitution for this case is::
preempting task. A correct substitution for this case is::
func() func()
{ {

View file

@ -440,6 +440,22 @@ NOTE: For 82599-based network connections, if you are enabling jumbo frames in
a virtual function (VF), jumbo frames must first be enabled in the physical a virtual function (VF), jumbo frames must first be enabled in the physical
function (PF). The VF MTU setting cannot be larger than the PF MTU. function (PF). The VF MTU setting cannot be larger than the PF MTU.
NBASE-T Support
---------------
The ixgbe driver supports NBASE-T on some devices. However, the advertisement
of NBASE-T speeds is suppressed by default, to accommodate broken network
switches which cannot cope with advertised NBASE-T speeds. Use the ethtool
command to enable advertising NBASE-T speeds on devices which support it::
ethtool -s eth? advertise 0x1800000001028
On Linux systems with INTERFACES(5), this can be specified as a pre-up command
in /etc/network/interfaces so that the interface is always brought up with
NBASE-T support, e.g.::
iface eth? inet dhcp
pre-up ethtool -s eth? advertise 0x1800000001028 || true
Generic Receive Offload, aka GRO Generic Receive Offload, aka GRO
-------------------------------- --------------------------------
The driver supports the in-kernel software implementation of GRO. GRO has The driver supports the in-kernel software implementation of GRO. GRO has

View file

@ -3066,7 +3066,7 @@ F: Documentation/devicetree/bindings/phy/phy-ath79-usb.txt
F: drivers/phy/qualcomm/phy-ath79-usb.c F: drivers/phy/qualcomm/phy-ath79-usb.c
ATHEROS ATH GENERIC UTILITIES ATHEROS ATH GENERIC UTILITIES
M: Kalle Valo <kvalo@codeaurora.org> M: Kalle Valo <kvalo@kernel.org>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
S: Supported S: Supported
F: drivers/net/wireless/ath/* F: drivers/net/wireless/ath/*
@ -3081,7 +3081,7 @@ W: https://wireless.wiki.kernel.org/en/users/Drivers/ath5k
F: drivers/net/wireless/ath/ath5k/ F: drivers/net/wireless/ath/ath5k/
ATHEROS ATH6KL WIRELESS DRIVER ATHEROS ATH6KL WIRELESS DRIVER
M: Kalle Valo <kvalo@codeaurora.org> M: Kalle Valo <kvalo@kernel.org>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
S: Supported S: Supported
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath6kl W: https://wireless.wiki.kernel.org/en/users/Drivers/ath6kl
@ -9329,7 +9329,6 @@ S: Maintained
F: drivers/iio/pressure/dps310.c F: drivers/iio/pressure/dps310.c
INFINIBAND SUBSYSTEM INFINIBAND SUBSYSTEM
M: Doug Ledford <dledford@redhat.com>
M: Jason Gunthorpe <jgg@nvidia.com> M: Jason Gunthorpe <jgg@nvidia.com>
L: linux-rdma@vger.kernel.org L: linux-rdma@vger.kernel.org
S: Supported S: Supported
@ -10280,9 +10279,9 @@ F: lib/Kconfig.kcsan
F: scripts/Makefile.kcsan F: scripts/Makefile.kcsan
KDUMP KDUMP
M: Dave Young <dyoung@redhat.com>
M: Baoquan He <bhe@redhat.com> M: Baoquan He <bhe@redhat.com>
R: Vivek Goyal <vgoyal@redhat.com> R: Vivek Goyal <vgoyal@redhat.com>
R: Dave Young <dyoung@redhat.com>
L: kexec@lists.infradead.org L: kexec@lists.infradead.org
S: Maintained S: Maintained
W: http://lse.sourceforge.net/kdump/ W: http://lse.sourceforge.net/kdump/
@ -10746,6 +10745,13 @@ S: Maintained
W: http://legousb.sourceforge.net/ W: http://legousb.sourceforge.net/
F: drivers/usb/misc/legousbtower.c F: drivers/usb/misc/legousbtower.c
LETSKETCH HID TABLET DRIVER
M: Hans de Goede <hdegoede@redhat.com>
L: linux-input@vger.kernel.org
S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git
F: drivers/hid/hid-letsketch.c
LG LAPTOP EXTRAS LG LAPTOP EXTRAS
M: Matan Ziv-Av <matan@svgalib.org> M: Matan Ziv-Av <matan@svgalib.org>
L: platform-driver-x86@vger.kernel.org L: platform-driver-x86@vger.kernel.org
@ -12180,8 +12186,8 @@ F: drivers/net/ethernet/mellanox/mlx5/core/fpga/*
F: include/linux/mlx5/mlx5_ifc_fpga.h F: include/linux/mlx5/mlx5_ifc_fpga.h
MELLANOX ETHERNET SWITCH DRIVERS MELLANOX ETHERNET SWITCH DRIVERS
M: Jiri Pirko <jiri@nvidia.com>
M: Ido Schimmel <idosch@nvidia.com> M: Ido Schimmel <idosch@nvidia.com>
M: Petr Machata <petrm@nvidia.com>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Supported S: Supported
W: http://www.mellanox.com W: http://www.mellanox.com
@ -13249,7 +13255,7 @@ F: include/uapi/linux/if_*
F: include/uapi/linux/netdevice.h F: include/uapi/linux/netdevice.h
NETWORKING DRIVERS (WIRELESS) NETWORKING DRIVERS (WIRELESS)
M: Kalle Valo <kvalo@codeaurora.org> M: Kalle Valo <kvalo@kernel.org>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
S: Maintained S: Maintained
Q: http://patchwork.kernel.org/project/linux-wireless/list/ Q: http://patchwork.kernel.org/project/linux-wireless/list/
@ -15705,7 +15711,7 @@ T: git git://linuxtv.org/anttip/media_tree.git
F: drivers/media/tuners/qt1010* F: drivers/media/tuners/qt1010*
QUALCOMM ATHEROS ATH10K WIRELESS DRIVER QUALCOMM ATHEROS ATH10K WIRELESS DRIVER
M: Kalle Valo <kvalo@codeaurora.org> M: Kalle Valo <kvalo@kernel.org>
L: ath10k@lists.infradead.org L: ath10k@lists.infradead.org
S: Supported S: Supported
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath10k W: https://wireless.wiki.kernel.org/en/users/Drivers/ath10k
@ -15713,7 +15719,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
F: drivers/net/wireless/ath/ath10k/ F: drivers/net/wireless/ath/ath10k/
QUALCOMM ATHEROS ATH11K WIRELESS DRIVER QUALCOMM ATHEROS ATH11K WIRELESS DRIVER
M: Kalle Valo <kvalo@codeaurora.org> M: Kalle Valo <kvalo@kernel.org>
L: ath11k@lists.infradead.org L: ath11k@lists.infradead.org
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
@ -15771,6 +15777,15 @@ S: Maintained
F: Documentation/devicetree/bindings/net/qcom,ethqos.txt F: Documentation/devicetree/bindings/net/qcom,ethqos.txt
F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
QUALCOMM FASTRPC DRIVER
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
M: Amol Maheshwari <amahesh@qti.qualcomm.com>
L: linux-arm-msm@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/misc/qcom,fastrpc.txt
F: drivers/misc/fastrpc.c
F: include/uapi/misc/fastrpc.h
QUALCOMM GENERIC INTERFACE I2C DRIVER QUALCOMM GENERIC INTERFACE I2C DRIVER
M: Akash Asthana <akashast@codeaurora.org> M: Akash Asthana <akashast@codeaurora.org>
M: Mukesh Savaliya <msavaliy@codeaurora.org> M: Mukesh Savaliya <msavaliy@codeaurora.org>
@ -15877,7 +15892,7 @@ F: Documentation/devicetree/bindings/media/*venus*
F: drivers/media/platform/qcom/venus/ F: drivers/media/platform/qcom/venus/
QUALCOMM WCN36XX WIRELESS DRIVER QUALCOMM WCN36XX WIRELESS DRIVER
M: Kalle Valo <kvalo@codeaurora.org> M: Kalle Valo <kvalo@kernel.org>
L: wcn36xx@lists.infradead.org L: wcn36xx@lists.infradead.org
S: Supported S: Supported
W: https://wireless.wiki.kernel.org/en/users/Drivers/wcn36xx W: https://wireless.wiki.kernel.org/en/users/Drivers/wcn36xx
@ -16629,7 +16644,6 @@ W: http://www.ibm.com/developerworks/linux/linux390/
F: drivers/iommu/s390-iommu.c F: drivers/iommu/s390-iommu.c
S390 IUCV NETWORK LAYER S390 IUCV NETWORK LAYER
M: Julian Wiedmann <jwi@linux.ibm.com>
M: Alexandra Winter <wintera@linux.ibm.com> M: Alexandra Winter <wintera@linux.ibm.com>
M: Wenjia Zhang <wenjia@linux.ibm.com> M: Wenjia Zhang <wenjia@linux.ibm.com>
L: linux-s390@vger.kernel.org L: linux-s390@vger.kernel.org
@ -16641,7 +16655,6 @@ F: include/net/iucv/
F: net/iucv/ F: net/iucv/
S390 NETWORK DRIVERS S390 NETWORK DRIVERS
M: Julian Wiedmann <jwi@linux.ibm.com>
M: Alexandra Winter <wintera@linux.ibm.com> M: Alexandra Winter <wintera@linux.ibm.com>
M: Wenjia Zhang <wenjia@linux.ibm.com> M: Wenjia Zhang <wenjia@linux.ibm.com>
L: linux-s390@vger.kernel.org L: linux-s390@vger.kernel.org
@ -21053,7 +21066,7 @@ S: Maintained
F: arch/x86/kernel/cpu/zhaoxin.c F: arch/x86/kernel/cpu/zhaoxin.c
ZONEFS FILESYSTEM ZONEFS FILESYSTEM
M: Damien Le Moal <damien.lemoal@wdc.com> M: Damien Le Moal <damien.lemoal@opensource.wdc.com>
M: Naohiro Aota <naohiro.aota@wdc.com> M: Naohiro Aota <naohiro.aota@wdc.com>
R: Johannes Thumshirn <jth@kernel.org> R: Johannes Thumshirn <jth@kernel.org>
L: linux-fsdevel@vger.kernel.org L: linux-fsdevel@vger.kernel.org

View file

@ -2,7 +2,7 @@
VERSION = 5 VERSION = 5
PATCHLEVEL = 16 PATCHLEVEL = 16
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc4 EXTRAVERSION = -rc6
NAME = Gobble Gobble NAME = Gobble Gobble
# *DOCUMENTATION* # *DOCUMENTATION*
@ -1374,17 +1374,17 @@ endif
ifneq ($(dtstree),) ifneq ($(dtstree),)
%.dtb: dt_binding_check include/config/kernel.release scripts_dtc %.dtb: include/config/kernel.release scripts_dtc
$(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@ $(dtstree)/$*.dt.yaml $(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@
%.dtbo: dt_binding_check include/config/kernel.release scripts_dtc %.dtbo: include/config/kernel.release scripts_dtc
$(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@ $(dtstree)/$*.dt.yaml $(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@
PHONY += dtbs dtbs_install dtbs_check PHONY += dtbs dtbs_install dtbs_check
dtbs: include/config/kernel.release scripts_dtc dtbs: include/config/kernel.release scripts_dtc
$(Q)$(MAKE) $(build)=$(dtstree) $(Q)$(MAKE) $(build)=$(dtstree)
ifneq ($(filter dtbs_check %.dtb %.dtbo, $(MAKECMDGOALS)),) ifneq ($(filter dtbs_check, $(MAKECMDGOALS)),)
export CHECK_DTBS=y export CHECK_DTBS=y
dtbs: dt_binding_check dtbs: dt_binding_check
endif endif

View file

@ -178,6 +178,8 @@
label = "cpu"; label = "cpu";
ethernet = <&fec>; ethernet = <&fec>;
phy-mode = "rgmii-id"; phy-mode = "rgmii-id";
rx-internal-delay-ps = <2000>;
tx-internal-delay-ps = <2000>;
fixed-link { fixed-link {
speed = <100>; speed = <100>;

View file

@ -82,6 +82,6 @@
#define MX6ULL_PAD_CSI_DATA04__ESAI_TX_FS 0x01F4 0x0480 0x0000 0x9 0x0 #define MX6ULL_PAD_CSI_DATA04__ESAI_TX_FS 0x01F4 0x0480 0x0000 0x9 0x0
#define MX6ULL_PAD_CSI_DATA05__ESAI_TX_CLK 0x01F8 0x0484 0x0000 0x9 0x0 #define MX6ULL_PAD_CSI_DATA05__ESAI_TX_CLK 0x01F8 0x0484 0x0000 0x9 0x0
#define MX6ULL_PAD_CSI_DATA06__ESAI_TX5_RX0 0x01FC 0x0488 0x0000 0x9 0x0 #define MX6ULL_PAD_CSI_DATA06__ESAI_TX5_RX0 0x01FC 0x0488 0x0000 0x9 0x0
#define MX6ULL_PAD_CSI_DATA07__ESAI_T0 0x0200 0x048C 0x0000 0x9 0x0 #define MX6ULL_PAD_CSI_DATA07__ESAI_TX0 0x0200 0x048C 0x0000 0x9 0x0
#endif /* __DTS_IMX6ULL_PINFUNC_H */ #endif /* __DTS_IMX6ULL_PINFUNC_H */

View file

@ -91,6 +91,8 @@
/* Internal port connected to eth2 */ /* Internal port connected to eth2 */
ethernet = <&enet2>; ethernet = <&enet2>;
phy-mode = "rgmii"; phy-mode = "rgmii";
rx-internal-delay-ps = <0>;
tx-internal-delay-ps = <0>;
reg = <4>; reg = <4>;
fixed-link { fixed-link {

View file

@ -12,7 +12,7 @@
flash0: n25q00@0 { flash0: n25q00@0 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
compatible = "n25q00aa"; compatible = "micron,mt25qu02g", "jedec,spi-nor";
reg = <0>; reg = <0>;
spi-max-frequency = <100000000>; spi-max-frequency = <100000000>;

View file

@ -119,7 +119,7 @@
flash: flash@0 { flash: flash@0 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
compatible = "n25q256a"; compatible = "micron,n25q256a", "jedec,spi-nor";
reg = <0>; reg = <0>;
spi-max-frequency = <100000000>; spi-max-frequency = <100000000>;

View file

@ -124,7 +124,7 @@
flash0: n25q00@0 { flash0: n25q00@0 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
compatible = "n25q00"; compatible = "micron,mt25qu02g", "jedec,spi-nor";
reg = <0>; /* chip select */ reg = <0>; /* chip select */
spi-max-frequency = <100000000>; spi-max-frequency = <100000000>;

View file

@ -169,7 +169,7 @@
flash: flash@0 { flash: flash@0 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
compatible = "n25q00"; compatible = "micron,mt25qu02g", "jedec,spi-nor";
reg = <0>; reg = <0>;
spi-max-frequency = <100000000>; spi-max-frequency = <100000000>;

View file

@ -80,7 +80,7 @@
flash: flash@0 { flash: flash@0 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
compatible = "n25q256a"; compatible = "micron,n25q256a", "jedec,spi-nor";
reg = <0>; reg = <0>;
spi-max-frequency = <100000000>; spi-max-frequency = <100000000>;
m25p,fast-read; m25p,fast-read;

View file

@ -116,7 +116,7 @@
flash0: n25q512a@0 { flash0: n25q512a@0 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
compatible = "n25q512a"; compatible = "micron,n25q512a", "jedec,spi-nor";
reg = <0>; reg = <0>;
spi-max-frequency = <100000000>; spi-max-frequency = <100000000>;

View file

@ -224,7 +224,7 @@
n25q128@0 { n25q128@0 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
compatible = "n25q128"; compatible = "micron,n25q128", "jedec,spi-nor";
reg = <0>; /* chip select */ reg = <0>; /* chip select */
spi-max-frequency = <100000000>; spi-max-frequency = <100000000>;
m25p,fast-read; m25p,fast-read;
@ -241,7 +241,7 @@
n25q00@1 { n25q00@1 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
compatible = "n25q00"; compatible = "micron,mt25qu02g", "jedec,spi-nor";
reg = <1>; /* chip select */ reg = <1>; /* chip select */
spi-max-frequency = <100000000>; spi-max-frequency = <100000000>;
m25p,fast-read; m25p,fast-read;

View file

@ -189,7 +189,7 @@ static int __init rockchip_smp_prepare_sram(struct device_node *node)
rockchip_boot_fn = __pa_symbol(secondary_startup); rockchip_boot_fn = __pa_symbol(secondary_startup);
/* copy the trampoline to sram, that runs during startup of the core */ /* copy the trampoline to sram, that runs during startup of the core */
memcpy(sram_base_addr, &rockchip_secondary_trampoline, trampoline_sz); memcpy_toio(sram_base_addr, &rockchip_secondary_trampoline, trampoline_sz);
flush_cache_all(); flush_cache_all();
outer_clean_range(0, trampoline_sz); outer_clean_range(0, trampoline_sz);

View file

@ -161,7 +161,6 @@ config ARCH_MEDIATEK
config ARCH_MESON config ARCH_MESON
bool "Amlogic Platforms" bool "Amlogic Platforms"
select COMMON_CLK
help help
This enables support for the arm64 based Amlogic SoCs This enables support for the arm64 based Amlogic SoCs
such as the s905, S905X/D, S912, A113X/D or S905X/D2 such as the s905, S905X/D, S912, A113X/D or S905X/D2

View file

@ -134,23 +134,23 @@
type = "critical"; type = "critical";
}; };
}; };
};
cpu_cooling_maps: cooling-maps { cpu_cooling_maps: cooling-maps {
map0 { map0 {
trip = <&cpu_passive>; trip = <&cpu_passive>;
cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
<&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
<&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
<&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
}; };
map1 { map1 {
trip = <&cpu_hot>; trip = <&cpu_hot>;
cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
<&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
<&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
<&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
};
}; };
}; };
}; };

View file

@ -60,7 +60,7 @@
&port02 { &port02 {
bus-range = <3 3>; bus-range = <3 3>;
ethernet0: pci@0,0 { ethernet0: ethernet@0,0 {
reg = <0x30000 0x0 0x0 0x0 0x0>; reg = <0x30000 0x0 0x0 0x0 0x0>;
/* To be filled by the loader */ /* To be filled by the loader */
local-mac-address = [00 10 18 00 00 00]; local-mac-address = [00 10 18 00 00 00];

View file

@ -7,6 +7,7 @@
* Copyright The Asahi Linux Contributors * Copyright The Asahi Linux Contributors
*/ */
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/apple-aic.h> #include <dt-bindings/interrupt-controller/apple-aic.h>
#include <dt-bindings/interrupt-controller/irq.h> #include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/pinctrl/apple.h> #include <dt-bindings/pinctrl/apple.h>
@ -143,6 +144,7 @@
apple,npins = <212>; apple,npins = <212>;
interrupt-controller; interrupt-controller;
#interrupt-cells = <2>;
interrupt-parent = <&aic>; interrupt-parent = <&aic>;
interrupts = <AIC_IRQ 190 IRQ_TYPE_LEVEL_HIGH>, interrupts = <AIC_IRQ 190 IRQ_TYPE_LEVEL_HIGH>,
<AIC_IRQ 191 IRQ_TYPE_LEVEL_HIGH>, <AIC_IRQ 191 IRQ_TYPE_LEVEL_HIGH>,
@ -169,6 +171,7 @@
apple,npins = <42>; apple,npins = <42>;
interrupt-controller; interrupt-controller;
#interrupt-cells = <2>;
interrupt-parent = <&aic>; interrupt-parent = <&aic>;
interrupts = <AIC_IRQ 268 IRQ_TYPE_LEVEL_HIGH>, interrupts = <AIC_IRQ 268 IRQ_TYPE_LEVEL_HIGH>,
<AIC_IRQ 269 IRQ_TYPE_LEVEL_HIGH>, <AIC_IRQ 269 IRQ_TYPE_LEVEL_HIGH>,
@ -189,6 +192,7 @@
apple,npins = <23>; apple,npins = <23>;
interrupt-controller; interrupt-controller;
#interrupt-cells = <2>;
interrupt-parent = <&aic>; interrupt-parent = <&aic>;
interrupts = <AIC_IRQ 330 IRQ_TYPE_LEVEL_HIGH>, interrupts = <AIC_IRQ 330 IRQ_TYPE_LEVEL_HIGH>,
<AIC_IRQ 331 IRQ_TYPE_LEVEL_HIGH>, <AIC_IRQ 331 IRQ_TYPE_LEVEL_HIGH>,
@ -209,6 +213,7 @@
apple,npins = <16>; apple,npins = <16>;
interrupt-controller; interrupt-controller;
#interrupt-cells = <2>;
interrupt-parent = <&aic>; interrupt-parent = <&aic>;
interrupts = <AIC_IRQ 391 IRQ_TYPE_LEVEL_HIGH>, interrupts = <AIC_IRQ 391 IRQ_TYPE_LEVEL_HIGH>,
<AIC_IRQ 392 IRQ_TYPE_LEVEL_HIGH>, <AIC_IRQ 392 IRQ_TYPE_LEVEL_HIGH>,
@ -281,7 +286,7 @@
port00: pci@0,0 { port00: pci@0,0 {
device_type = "pci"; device_type = "pci";
reg = <0x0 0x0 0x0 0x0 0x0>; reg = <0x0 0x0 0x0 0x0 0x0>;
reset-gpios = <&pinctrl_ap 152 0>; reset-gpios = <&pinctrl_ap 152 GPIO_ACTIVE_LOW>;
max-link-speed = <2>; max-link-speed = <2>;
#address-cells = <3>; #address-cells = <3>;
@ -301,7 +306,7 @@
port01: pci@1,0 { port01: pci@1,0 {
device_type = "pci"; device_type = "pci";
reg = <0x800 0x0 0x0 0x0 0x0>; reg = <0x800 0x0 0x0 0x0 0x0>;
reset-gpios = <&pinctrl_ap 153 0>; reset-gpios = <&pinctrl_ap 153 GPIO_ACTIVE_LOW>;
max-link-speed = <2>; max-link-speed = <2>;
#address-cells = <3>; #address-cells = <3>;
@ -321,7 +326,7 @@
port02: pci@2,0 { port02: pci@2,0 {
device_type = "pci"; device_type = "pci";
reg = <0x1000 0x0 0x0 0x0 0x0>; reg = <0x1000 0x0 0x0 0x0 0x0>;
reset-gpios = <&pinctrl_ap 33 0>; reset-gpios = <&pinctrl_ap 33 GPIO_ACTIVE_LOW>;
max-link-speed = <1>; max-link-speed = <1>;
#address-cells = <3>; #address-cells = <3>;

View file

@ -38,7 +38,6 @@
powerdn { powerdn {
label = "External Power Down"; label = "External Power Down";
gpios = <&gpio1 17 GPIO_ACTIVE_LOW>; gpios = <&gpio1 17 GPIO_ACTIVE_LOW>;
interrupts = <&gpio1 17 IRQ_TYPE_EDGE_FALLING>;
linux,code = <KEY_POWER>; linux,code = <KEY_POWER>;
}; };
@ -46,7 +45,6 @@
admin { admin {
label = "ADMIN button"; label = "ADMIN button";
gpios = <&gpio3 8 GPIO_ACTIVE_HIGH>; gpios = <&gpio3 8 GPIO_ACTIVE_HIGH>;
interrupts = <&gpio3 8 IRQ_TYPE_EDGE_RISING>;
linux,code = <KEY_WPS_BUTTON>; linux,code = <KEY_WPS_BUTTON>;
}; };
}; };

View file

@ -386,6 +386,8 @@
reg = <2>; reg = <2>;
ethernet = <&dpmac17>; ethernet = <&dpmac17>;
phy-mode = "rgmii-id"; phy-mode = "rgmii-id";
rx-internal-delay-ps = <2000>;
tx-internal-delay-ps = <2000>;
fixed-link { fixed-link {
speed = <1000>; speed = <1000>;
@ -529,6 +531,8 @@
reg = <2>; reg = <2>;
ethernet = <&dpmac18>; ethernet = <&dpmac18>;
phy-mode = "rgmii-id"; phy-mode = "rgmii-id";
rx-internal-delay-ps = <2000>;
tx-internal-delay-ps = <2000>;
fixed-link { fixed-link {
speed = <1000>; speed = <1000>;

View file

@ -524,8 +524,6 @@
<&clk IMX8MQ_VIDEO_PLL1>, <&clk IMX8MQ_VIDEO_PLL1>,
<&clk IMX8MQ_VIDEO_PLL1_OUT>; <&clk IMX8MQ_VIDEO_PLL1_OUT>;
assigned-clock-rates = <0>, <0>, <0>, <594000000>; assigned-clock-rates = <0>, <0>, <0>, <594000000>;
interconnects = <&noc IMX8MQ_ICM_LCDIF &noc IMX8MQ_ICS_DRAM>;
interconnect-names = "dram";
status = "disabled"; status = "disabled";
port@0 { port@0 {

View file

@ -97,7 +97,7 @@
regulator-max-microvolt = <3300000>; regulator-max-microvolt = <3300000>;
regulator-always-on; regulator-always-on;
regulator-boot-on; regulator-boot-on;
vim-supply = <&vcc_io>; vin-supply = <&vcc_io>;
}; };
vdd_core: vdd-core { vdd_core: vdd-core {

View file

@ -705,7 +705,6 @@
&sdhci { &sdhci {
bus-width = <8>; bus-width = <8>;
mmc-hs400-1_8v; mmc-hs400-1_8v;
mmc-hs400-enhanced-strobe;
non-removable; non-removable;
status = "okay"; status = "okay";
}; };

View file

@ -276,6 +276,7 @@
clock-output-names = "xin32k", "rk808-clkout2"; clock-output-names = "xin32k", "rk808-clkout2";
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pmic_int_l>; pinctrl-0 = <&pmic_int_l>;
rockchip,system-power-controller;
vcc1-supply = <&vcc5v0_sys>; vcc1-supply = <&vcc5v0_sys>;
vcc2-supply = <&vcc5v0_sys>; vcc2-supply = <&vcc5v0_sys>;
vcc3-supply = <&vcc5v0_sys>; vcc3-supply = <&vcc5v0_sys>;

View file

@ -55,7 +55,7 @@
regulator-boot-on; regulator-boot-on;
regulator-min-microvolt = <3300000>; regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>; regulator-max-microvolt = <3300000>;
vim-supply = <&vcc3v3_sys>; vin-supply = <&vcc3v3_sys>;
}; };
vcc3v3_sys: vcc3v3-sys { vcc3v3_sys: vcc3v3-sys {

View file

@ -502,7 +502,7 @@
status = "okay"; status = "okay";
bt656-supply = <&vcc_3v0>; bt656-supply = <&vcc_3v0>;
audio-supply = <&vcc_3v0>; audio-supply = <&vcc1v8_codec>;
sdmmc-supply = <&vcc_sdio>; sdmmc-supply = <&vcc_sdio>;
gpio1830-supply = <&vcc_3v0>; gpio1830-supply = <&vcc_3v0>;
}; };

View file

@ -149,6 +149,7 @@ int load_other_segments(struct kimage *image,
initrd_len, cmdline, 0); initrd_len, cmdline, 0);
if (!dtb) { if (!dtb) {
pr_err("Preparing for new dtb failed\n"); pr_err("Preparing for new dtb failed\n");
ret = -EINVAL;
goto out_err; goto out_err;
} }

View file

@ -209,7 +209,7 @@ asmlinkage void do_trap_illinsn(struct pt_regs *regs)
asmlinkage void do_trap_fpe(struct pt_regs *regs) asmlinkage void do_trap_fpe(struct pt_regs *regs)
{ {
#ifdef CONFIG_CPU_HAS_FP #ifdef CONFIG_CPU_HAS_FPU
return fpu_fpe(regs); return fpu_fpe(regs);
#else #else
do_trap_error(regs, SIGILL, ILL_ILLOPC, regs->pc, do_trap_error(regs, SIGILL, ILL_ILLOPC, regs->pc,
@ -219,7 +219,7 @@ asmlinkage void do_trap_fpe(struct pt_regs *regs)
asmlinkage void do_trap_priv(struct pt_regs *regs) asmlinkage void do_trap_priv(struct pt_regs *regs)
{ {
#ifdef CONFIG_CPU_HAS_FP #ifdef CONFIG_CPU_HAS_FPU
if (user_mode(regs) && fpu_libc_helper(regs)) if (user_mode(regs) && fpu_libc_helper(regs))
return; return;
#endif #endif

View file

@ -6,5 +6,7 @@
#define PCI_IOSIZE SZ_64K #define PCI_IOSIZE SZ_64K
#define IO_SPACE_LIMIT (PCI_IOSIZE - 1) #define IO_SPACE_LIMIT (PCI_IOSIZE - 1)
#define pci_remap_iospace pci_remap_iospace
#include <asm/mach-generic/spaces.h> #include <asm/mach-generic/spaces.h>
#endif #endif

View file

@ -20,10 +20,6 @@
#include <linux/list.h> #include <linux/list.h>
#include <linux/of.h> #include <linux/of.h>
#ifdef CONFIG_PCI_DRIVERS_GENERIC
#define pci_remap_iospace pci_remap_iospace
#endif
#ifdef CONFIG_PCI_DRIVERS_LEGACY #ifdef CONFIG_PCI_DRIVERS_LEGACY
/* /*

View file

@ -98,7 +98,7 @@ do { \
#define emit(...) __emit(__VA_ARGS__) #define emit(...) __emit(__VA_ARGS__)
/* Workaround for R10000 ll/sc errata */ /* Workaround for R10000 ll/sc errata */
#ifdef CONFIG_WAR_R10000 #ifdef CONFIG_WAR_R10000_LLSC
#define LLSC_beqz beqzl #define LLSC_beqz beqzl
#else #else
#define LLSC_beqz beqz #define LLSC_beqz beqz

View file

@ -47,6 +47,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
pci_read_bridge_bases(bus); pci_read_bridge_bases(bus);
} }
#ifdef pci_remap_iospace
int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr) int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
{ {
unsigned long vaddr; unsigned long vaddr;
@ -60,3 +61,4 @@ int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
set_io_port_base(vaddr); set_io_port_base(vaddr);
return 0; return 0;
} }
#endif

View file

@ -422,11 +422,17 @@ static inline int create_stub(const Elf64_Shdr *sechdrs,
const char *name) const char *name)
{ {
long reladdr; long reladdr;
func_desc_t desc;
int i;
if (is_mprofile_ftrace_call(name)) if (is_mprofile_ftrace_call(name))
return create_ftrace_stub(entry, addr, me); return create_ftrace_stub(entry, addr, me);
memcpy(entry->jump, ppc64_stub_insns, sizeof(ppc64_stub_insns)); for (i = 0; i < sizeof(ppc64_stub_insns) / sizeof(u32); i++) {
if (patch_instruction(&entry->jump[i],
ppc_inst(ppc64_stub_insns[i])))
return 0;
}
/* Stub uses address relative to r2. */ /* Stub uses address relative to r2. */
reladdr = (unsigned long)entry - my_r2(sechdrs, me); reladdr = (unsigned long)entry - my_r2(sechdrs, me);
@ -437,10 +443,24 @@ static inline int create_stub(const Elf64_Shdr *sechdrs,
} }
pr_debug("Stub %p get data from reladdr %li\n", entry, reladdr); pr_debug("Stub %p get data from reladdr %li\n", entry, reladdr);
entry->jump[0] |= PPC_HA(reladdr); if (patch_instruction(&entry->jump[0],
entry->jump[1] |= PPC_LO(reladdr); ppc_inst(entry->jump[0] | PPC_HA(reladdr))))
entry->funcdata = func_desc(addr); return 0;
entry->magic = STUB_MAGIC;
if (patch_instruction(&entry->jump[1],
ppc_inst(entry->jump[1] | PPC_LO(reladdr))))
return 0;
// func_desc_t is 8 bytes if ABIv2, else 16 bytes
desc = func_desc(addr);
for (i = 0; i < sizeof(func_desc_t) / sizeof(u32); i++) {
if (patch_instruction(((u32 *)&entry->funcdata) + i,
ppc_inst(((u32 *)(&desc))[i])))
return 0;
}
if (patch_instruction(&entry->magic, ppc_inst(STUB_MAGIC)))
return 0;
return 1; return 1;
} }
@ -495,8 +515,11 @@ static int restore_r2(const char *name, u32 *instruction, struct module *me)
me->name, *instruction, instruction); me->name, *instruction, instruction);
return 0; return 0;
} }
/* ld r2,R2_STACK_OFFSET(r1) */ /* ld r2,R2_STACK_OFFSET(r1) */
*instruction = PPC_INST_LD_TOC; if (patch_instruction(instruction, ppc_inst(PPC_INST_LD_TOC)))
return 0;
return 1; return 1;
} }
@ -636,9 +659,12 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
} }
/* Only replace bits 2 through 26 */ /* Only replace bits 2 through 26 */
*(uint32_t *)location value = (*(uint32_t *)location & ~0x03fffffc)
= (*(uint32_t *)location & ~0x03fffffc)
| (value & 0x03fffffc); | (value & 0x03fffffc);
if (patch_instruction((u32 *)location, ppc_inst(value)))
return -EFAULT;
break; break;
case R_PPC64_REL64: case R_PPC64_REL64:

View file

@ -220,7 +220,7 @@ static int smp_85xx_start_cpu(int cpu)
local_irq_save(flags); local_irq_save(flags);
hard_irq_disable(); hard_irq_disable();
if (qoriq_pm_ops) if (qoriq_pm_ops && qoriq_pm_ops->cpu_up_prepare)
qoriq_pm_ops->cpu_up_prepare(cpu); qoriq_pm_ops->cpu_up_prepare(cpu);
/* if cpu is not spinning, reset it */ /* if cpu is not spinning, reset it */
@ -292,7 +292,7 @@ static int smp_85xx_kick_cpu(int nr)
booting_thread_hwid = cpu_thread_in_core(nr); booting_thread_hwid = cpu_thread_in_core(nr);
primary = cpu_first_thread_sibling(nr); primary = cpu_first_thread_sibling(nr);
if (qoriq_pm_ops) if (qoriq_pm_ops && qoriq_pm_ops->cpu_up_prepare)
qoriq_pm_ops->cpu_up_prepare(nr); qoriq_pm_ops->cpu_up_prepare(nr);
/* /*

View file

@ -76,6 +76,7 @@
spi-max-frequency = <20000000>; spi-max-frequency = <20000000>;
voltage-ranges = <3300 3300>; voltage-ranges = <3300 3300>;
disable-wp; disable-wp;
gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
}; };
}; };

View file

@ -2,6 +2,7 @@
/* Copyright (c) 2020 SiFive, Inc */ /* Copyright (c) 2020 SiFive, Inc */
#include "fu740-c000.dtsi" #include "fu740-c000.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h> #include <dt-bindings/interrupt-controller/irq.h>
/* Clock frequency (in Hz) of the PCB crystal for rtcclk */ /* Clock frequency (in Hz) of the PCB crystal for rtcclk */
@ -54,10 +55,21 @@
temperature-sensor@4c { temperature-sensor@4c {
compatible = "ti,tmp451"; compatible = "ti,tmp451";
reg = <0x4c>; reg = <0x4c>;
vcc-supply = <&vdd_bpro>;
interrupt-parent = <&gpio>; interrupt-parent = <&gpio>;
interrupts = <6 IRQ_TYPE_LEVEL_LOW>; interrupts = <6 IRQ_TYPE_LEVEL_LOW>;
}; };
eeprom@54 {
compatible = "microchip,24c02", "atmel,24c02";
reg = <0x54>;
vcc-supply = <&vdd_bpro>;
label = "board-id";
pagesize = <16>;
read-only;
size = <256>;
};
pmic@58 { pmic@58 {
compatible = "dlg,da9063"; compatible = "dlg,da9063";
reg = <0x58>; reg = <0x58>;
@ -65,48 +77,44 @@
interrupts = <1 IRQ_TYPE_LEVEL_LOW>; interrupts = <1 IRQ_TYPE_LEVEL_LOW>;
interrupt-controller; interrupt-controller;
regulators { onkey {
vdd_bcore1: bcore1 { compatible = "dlg,da9063-onkey";
regulator-min-microvolt = <900000>; };
regulator-max-microvolt = <900000>;
regulator-min-microamp = <5000000>;
regulator-max-microamp = <5000000>;
regulator-always-on;
};
vdd_bcore2: bcore2 { rtc {
regulator-min-microvolt = <900000>; compatible = "dlg,da9063-rtc";
regulator-max-microvolt = <900000>; };
regulator-min-microamp = <5000000>;
regulator-max-microamp = <5000000>; wdt {
compatible = "dlg,da9063-watchdog";
};
regulators {
vdd_bcore: bcores-merged {
regulator-min-microvolt = <1050000>;
regulator-max-microvolt = <1050000>;
regulator-min-microamp = <4800000>;
regulator-max-microamp = <4800000>;
regulator-always-on; regulator-always-on;
}; };
vdd_bpro: bpro { vdd_bpro: bpro {
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>; regulator-max-microvolt = <1800000>;
regulator-min-microamp = <2500000>; regulator-min-microamp = <2400000>;
regulator-max-microamp = <2500000>; regulator-max-microamp = <2400000>;
regulator-always-on; regulator-always-on;
}; };
vdd_bperi: bperi { vdd_bperi: bperi {
regulator-min-microvolt = <1050000>; regulator-min-microvolt = <1060000>;
regulator-max-microvolt = <1050000>; regulator-max-microvolt = <1060000>;
regulator-min-microamp = <1500000>; regulator-min-microamp = <1500000>;
regulator-max-microamp = <1500000>; regulator-max-microamp = <1500000>;
regulator-always-on; regulator-always-on;
}; };
vdd_bmem: bmem { vdd_bmem_bio: bmem-bio-merged {
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
regulator-min-microamp = <3000000>;
regulator-max-microamp = <3000000>;
regulator-always-on;
};
vdd_bio: bio {
regulator-min-microvolt = <1200000>; regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>; regulator-max-microvolt = <1200000>;
regulator-min-microamp = <3000000>; regulator-min-microamp = <3000000>;
@ -117,86 +125,66 @@
vdd_ldo1: ldo1 { vdd_ldo1: ldo1 {
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>; regulator-max-microvolt = <1800000>;
regulator-min-microamp = <100000>;
regulator-max-microamp = <100000>;
regulator-always-on; regulator-always-on;
}; };
vdd_ldo2: ldo2 { vdd_ldo2: ldo2 {
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>; regulator-max-microvolt = <1800000>;
regulator-min-microamp = <200000>;
regulator-max-microamp = <200000>;
regulator-always-on; regulator-always-on;
}; };
vdd_ldo3: ldo3 { vdd_ldo3: ldo3 {
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <1800000>; regulator-max-microvolt = <3300000>;
regulator-min-microamp = <200000>;
regulator-max-microamp = <200000>;
regulator-always-on; regulator-always-on;
}; };
vdd_ldo4: ldo4 { vdd_ldo4: ldo4 {
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <2500000>;
regulator-max-microvolt = <1800000>; regulator-max-microvolt = <2500000>;
regulator-min-microamp = <200000>;
regulator-max-microamp = <200000>;
regulator-always-on; regulator-always-on;
}; };
vdd_ldo5: ldo5 { vdd_ldo5: ldo5 {
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <1800000>; regulator-max-microvolt = <3300000>;
regulator-min-microamp = <100000>;
regulator-max-microamp = <100000>;
regulator-always-on; regulator-always-on;
}; };
vdd_ldo6: ldo6 { vdd_ldo6: ldo6 {
regulator-min-microvolt = <3300000>; regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <3300000>; regulator-max-microvolt = <1800000>;
regulator-min-microamp = <200000>;
regulator-max-microamp = <200000>;
regulator-always-on; regulator-always-on;
}; };
vdd_ldo7: ldo7 { vdd_ldo7: ldo7 {
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <1800000>; regulator-max-microvolt = <3300000>;
regulator-min-microamp = <200000>;
regulator-max-microamp = <200000>;
regulator-always-on; regulator-always-on;
}; };
vdd_ldo8: ldo8 { vdd_ldo8: ldo8 {
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <1800000>; regulator-max-microvolt = <3300000>;
regulator-min-microamp = <200000>;
regulator-max-microamp = <200000>;
regulator-always-on; regulator-always-on;
}; };
vdd_ld09: ldo9 { vdd_ld09: ldo9 {
regulator-min-microvolt = <1050000>; regulator-min-microvolt = <1050000>;
regulator-max-microvolt = <1050000>; regulator-max-microvolt = <1050000>;
regulator-min-microamp = <200000>; regulator-always-on;
regulator-max-microamp = <200000>;
}; };
vdd_ldo10: ldo10 { vdd_ldo10: ldo10 {
regulator-min-microvolt = <1000000>; regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <1000000>; regulator-max-microvolt = <1000000>;
regulator-min-microamp = <300000>; regulator-always-on;
regulator-max-microamp = <300000>;
}; };
vdd_ldo11: ldo11 { vdd_ldo11: ldo11 {
regulator-min-microvolt = <2500000>; regulator-min-microvolt = <2500000>;
regulator-max-microvolt = <2500000>; regulator-max-microvolt = <2500000>;
regulator-min-microamp = <300000>;
regulator-max-microamp = <300000>;
regulator-always-on; regulator-always-on;
}; };
}; };
@ -223,6 +211,7 @@
spi-max-frequency = <20000000>; spi-max-frequency = <20000000>;
voltage-ranges = <3300 3300>; voltage-ranges = <3300 3300>;
disable-wp; disable-wp;
gpios = <&gpio 15 GPIO_ACTIVE_LOW>;
}; };
}; };
@ -245,4 +234,8 @@
&gpio { &gpio {
status = "okay"; status = "okay";
gpio-line-names = "J29.1", "PMICNTB", "PMICSHDN", "J8.1", "J8.3",
"PCIe_PWREN", "THERM", "UBRDG_RSTN", "PCIe_PERSTN",
"ULPI_RSTN", "J8.2", "UHUB_RSTN", "GEMGXL_RST", "J8.4",
"EN_VDD_SD", "SD_CD";
}; };

View file

@ -117,6 +117,7 @@ CONFIG_UNIX=y
CONFIG_UNIX_DIAG=m CONFIG_UNIX_DIAG=m
CONFIG_XFRM_USER=m CONFIG_XFRM_USER=m
CONFIG_NET_KEY=m CONFIG_NET_KEY=m
CONFIG_NET_SWITCHDEV=y
CONFIG_SMC=m CONFIG_SMC=m
CONFIG_SMC_DIAG=m CONFIG_SMC_DIAG=m
CONFIG_INET=y CONFIG_INET=y
@ -511,6 +512,7 @@ CONFIG_NLMON=m
CONFIG_MLX4_EN=m CONFIG_MLX4_EN=m
CONFIG_MLX5_CORE=m CONFIG_MLX5_CORE=m
CONFIG_MLX5_CORE_EN=y CONFIG_MLX5_CORE_EN=y
CONFIG_MLX5_ESWITCH=y
# CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICREL is not set
# CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROCHIP is not set
# CONFIG_NET_VENDOR_MICROSEMI is not set # CONFIG_NET_VENDOR_MICROSEMI is not set

View file

@ -109,6 +109,7 @@ CONFIG_UNIX=y
CONFIG_UNIX_DIAG=m CONFIG_UNIX_DIAG=m
CONFIG_XFRM_USER=m CONFIG_XFRM_USER=m
CONFIG_NET_KEY=m CONFIG_NET_KEY=m
CONFIG_NET_SWITCHDEV=y
CONFIG_SMC=m CONFIG_SMC=m
CONFIG_SMC_DIAG=m CONFIG_SMC_DIAG=m
CONFIG_INET=y CONFIG_INET=y
@ -502,6 +503,7 @@ CONFIG_NLMON=m
CONFIG_MLX4_EN=m CONFIG_MLX4_EN=m
CONFIG_MLX5_CORE=m CONFIG_MLX5_CORE=m
CONFIG_MLX5_CORE_EN=y CONFIG_MLX5_CORE_EN=y
CONFIG_MLX5_ESWITCH=y
# CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICREL is not set
# CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROCHIP is not set
# CONFIG_NET_VENDOR_MICROSEMI is not set # CONFIG_NET_VENDOR_MICROSEMI is not set

View file

@ -290,7 +290,6 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
return; return;
regs = ftrace_get_regs(fregs); regs = ftrace_get_regs(fregs);
preempt_disable_notrace();
p = get_kprobe((kprobe_opcode_t *)ip); p = get_kprobe((kprobe_opcode_t *)ip);
if (unlikely(!p) || kprobe_disabled(p)) if (unlikely(!p) || kprobe_disabled(p))
goto out; goto out;
@ -318,7 +317,6 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
} }
__this_cpu_write(current_kprobe, NULL); __this_cpu_write(current_kprobe, NULL);
out: out:
preempt_enable_notrace();
ftrace_test_recursion_unlock(bit); ftrace_test_recursion_unlock(bit);
} }
NOKPROBE_SYMBOL(kprobe_ftrace_handler); NOKPROBE_SYMBOL(kprobe_ftrace_handler);

View file

@ -138,7 +138,7 @@ void noinstr do_io_irq(struct pt_regs *regs)
struct pt_regs *old_regs = set_irq_regs(regs); struct pt_regs *old_regs = set_irq_regs(regs);
int from_idle; int from_idle;
irq_enter(); irq_enter_rcu();
if (user_mode(regs)) { if (user_mode(regs)) {
update_timer_sys(); update_timer_sys();
@ -158,7 +158,8 @@ void noinstr do_io_irq(struct pt_regs *regs)
do_irq_async(regs, IO_INTERRUPT); do_irq_async(regs, IO_INTERRUPT);
} while (MACHINE_IS_LPAR && irq_pending(regs)); } while (MACHINE_IS_LPAR && irq_pending(regs));
irq_exit(); irq_exit_rcu();
set_irq_regs(old_regs); set_irq_regs(old_regs);
irqentry_exit(regs, state); irqentry_exit(regs, state);
@ -172,7 +173,7 @@ void noinstr do_ext_irq(struct pt_regs *regs)
struct pt_regs *old_regs = set_irq_regs(regs); struct pt_regs *old_regs = set_irq_regs(regs);
int from_idle; int from_idle;
irq_enter(); irq_enter_rcu();
if (user_mode(regs)) { if (user_mode(regs)) {
update_timer_sys(); update_timer_sys();
@ -190,7 +191,7 @@ void noinstr do_ext_irq(struct pt_regs *regs)
do_irq_async(regs, EXT_INTERRUPT); do_irq_async(regs, EXT_INTERRUPT);
irq_exit(); irq_exit_rcu();
set_irq_regs(old_regs); set_irq_regs(old_regs);
irqentry_exit(regs, state); irqentry_exit(regs, state);

View file

@ -7,6 +7,8 @@
* Author(s): Philipp Rudo <prudo@linux.vnet.ibm.com> * Author(s): Philipp Rudo <prudo@linux.vnet.ibm.com>
*/ */
#define pr_fmt(fmt) "kexec: " fmt
#include <linux/elf.h> #include <linux/elf.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/kexec.h> #include <linux/kexec.h>
@ -290,8 +292,16 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
const Elf_Shdr *relsec, const Elf_Shdr *relsec,
const Elf_Shdr *symtab) const Elf_Shdr *symtab)
{ {
const char *strtab, *name, *shstrtab;
const Elf_Shdr *sechdrs;
Elf_Rela *relas; Elf_Rela *relas;
int i, r_type; int i, r_type;
int ret;
/* String & section header string table */
sechdrs = (void *)pi->ehdr + pi->ehdr->e_shoff;
strtab = (char *)pi->ehdr + sechdrs[symtab->sh_link].sh_offset;
shstrtab = (char *)pi->ehdr + sechdrs[pi->ehdr->e_shstrndx].sh_offset;
relas = (void *)pi->ehdr + relsec->sh_offset; relas = (void *)pi->ehdr + relsec->sh_offset;
@ -304,15 +314,27 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
sym = (void *)pi->ehdr + symtab->sh_offset; sym = (void *)pi->ehdr + symtab->sh_offset;
sym += ELF64_R_SYM(relas[i].r_info); sym += ELF64_R_SYM(relas[i].r_info);
if (sym->st_shndx == SHN_UNDEF) if (sym->st_name)
return -ENOEXEC; name = strtab + sym->st_name;
else
name = shstrtab + sechdrs[sym->st_shndx].sh_name;
if (sym->st_shndx == SHN_COMMON) if (sym->st_shndx == SHN_UNDEF) {
pr_err("Undefined symbol: %s\n", name);
return -ENOEXEC; return -ENOEXEC;
}
if (sym->st_shndx == SHN_COMMON) {
pr_err("symbol '%s' in common section\n", name);
return -ENOEXEC;
}
if (sym->st_shndx >= pi->ehdr->e_shnum && if (sym->st_shndx >= pi->ehdr->e_shnum &&
sym->st_shndx != SHN_ABS) sym->st_shndx != SHN_ABS) {
pr_err("Invalid section %d for symbol %s\n",
sym->st_shndx, name);
return -ENOEXEC; return -ENOEXEC;
}
loc = pi->purgatory_buf; loc = pi->purgatory_buf;
loc += section->sh_offset; loc += section->sh_offset;
@ -326,7 +348,15 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
addr = section->sh_addr + relas[i].r_offset; addr = section->sh_addr + relas[i].r_offset;
r_type = ELF64_R_TYPE(relas[i].r_info); r_type = ELF64_R_TYPE(relas[i].r_info);
arch_kexec_do_relocs(r_type, loc, val, addr);
if (r_type == R_390_PLT32DBL)
r_type = R_390_PC32DBL;
ret = arch_kexec_do_relocs(r_type, loc, val, addr);
if (ret) {
pr_err("Unknown rela relocation: %d\n", r_type);
return -ENOEXEC;
}
} }
return 0; return 0;
} }

View file

@ -97,7 +97,7 @@
KVM_ARCH_REQ_FLAGS(25, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) KVM_ARCH_REQ_FLAGS(25, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
#define KVM_REQ_TLB_FLUSH_CURRENT KVM_ARCH_REQ(26) #define KVM_REQ_TLB_FLUSH_CURRENT KVM_ARCH_REQ(26)
#define KVM_REQ_TLB_FLUSH_GUEST \ #define KVM_REQ_TLB_FLUSH_GUEST \
KVM_ARCH_REQ_FLAGS(27, KVM_REQUEST_NO_WAKEUP) KVM_ARCH_REQ_FLAGS(27, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
#define KVM_REQ_APF_READY KVM_ARCH_REQ(28) #define KVM_REQ_APF_READY KVM_ARCH_REQ(28)
#define KVM_REQ_MSR_FILTER_CHANGED KVM_ARCH_REQ(29) #define KVM_REQ_MSR_FILTER_CHANGED KVM_ARCH_REQ(29)
#define KVM_REQ_UPDATE_CPU_DIRTY_LOGGING \ #define KVM_REQ_UPDATE_CPU_DIRTY_LOGGING \

View file

@ -579,6 +579,17 @@ static struct sched_domain_topology_level x86_numa_in_package_topology[] = {
{ NULL, }, { NULL, },
}; };
static struct sched_domain_topology_level x86_hybrid_topology[] = {
#ifdef CONFIG_SCHED_SMT
{ cpu_smt_mask, x86_smt_flags, SD_INIT_NAME(SMT) },
#endif
#ifdef CONFIG_SCHED_MC
{ cpu_coregroup_mask, x86_core_flags, SD_INIT_NAME(MC) },
#endif
{ cpu_cpu_mask, SD_INIT_NAME(DIE) },
{ NULL, },
};
static struct sched_domain_topology_level x86_topology[] = { static struct sched_domain_topology_level x86_topology[] = {
#ifdef CONFIG_SCHED_SMT #ifdef CONFIG_SCHED_SMT
{ cpu_smt_mask, x86_smt_flags, SD_INIT_NAME(SMT) }, { cpu_smt_mask, x86_smt_flags, SD_INIT_NAME(SMT) },
@ -1469,8 +1480,11 @@ void __init native_smp_cpus_done(unsigned int max_cpus)
calculate_max_logical_packages(); calculate_max_logical_packages();
/* XXX for now assume numa-in-package and hybrid don't overlap */
if (x86_has_numa_in_package) if (x86_has_numa_in_package)
set_sched_topology(x86_numa_in_package_topology); set_sched_topology(x86_numa_in_package_topology);
if (cpu_feature_enabled(X86_FEATURE_HYBRID_CPU))
set_sched_topology(x86_hybrid_topology);
nmi_selftest(); nmi_selftest();
impress_friends(); impress_friends();

View file

@ -1922,11 +1922,13 @@ static u64 kvm_hv_send_ipi(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc, bool
all_cpus = send_ipi_ex.vp_set.format == HV_GENERIC_SET_ALL; all_cpus = send_ipi_ex.vp_set.format == HV_GENERIC_SET_ALL;
if (all_cpus)
goto check_and_send_ipi;
if (!sparse_banks_len) if (!sparse_banks_len)
goto ret_success; goto ret_success;
if (!all_cpus && if (kvm_read_guest(kvm,
kvm_read_guest(kvm,
hc->ingpa + offsetof(struct hv_send_ipi_ex, hc->ingpa + offsetof(struct hv_send_ipi_ex,
vp_set.bank_contents), vp_set.bank_contents),
sparse_banks, sparse_banks,
@ -1934,6 +1936,7 @@ static u64 kvm_hv_send_ipi(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc, bool
return HV_STATUS_INVALID_HYPERCALL_INPUT; return HV_STATUS_INVALID_HYPERCALL_INPUT;
} }
check_and_send_ipi:
if ((vector < HV_IPI_LOW_VECTOR) || (vector > HV_IPI_HIGH_VECTOR)) if ((vector < HV_IPI_LOW_VECTOR) || (vector > HV_IPI_HIGH_VECTOR))
return HV_STATUS_INVALID_HYPERCALL_INPUT; return HV_STATUS_INVALID_HYPERCALL_INPUT;

View file

@ -3987,7 +3987,21 @@ out_retry:
static bool is_page_fault_stale(struct kvm_vcpu *vcpu, static bool is_page_fault_stale(struct kvm_vcpu *vcpu,
struct kvm_page_fault *fault, int mmu_seq) struct kvm_page_fault *fault, int mmu_seq)
{ {
if (is_obsolete_sp(vcpu->kvm, to_shadow_page(vcpu->arch.mmu->root_hpa))) struct kvm_mmu_page *sp = to_shadow_page(vcpu->arch.mmu->root_hpa);
/* Special roots, e.g. pae_root, are not backed by shadow pages. */
if (sp && is_obsolete_sp(vcpu->kvm, sp))
return true;
/*
* Roots without an associated shadow page are considered invalid if
* there is a pending request to free obsolete roots. The request is
* only a hint that the current root _may_ be obsolete and needs to be
* reloaded, e.g. if the guest frees a PGD that KVM is tracking as a
* previous root, then __kvm_mmu_prepare_zap_page() signals all vCPUs
* to reload even if no vCPU is actively using the root.
*/
if (!sp && kvm_test_request(KVM_REQ_MMU_RELOAD, vcpu))
return true; return true;
return fault->slot && return fault->slot &&

View file

@ -2646,15 +2646,6 @@ int alloc_loaded_vmcs(struct loaded_vmcs *loaded_vmcs)
if (!loaded_vmcs->msr_bitmap) if (!loaded_vmcs->msr_bitmap)
goto out_vmcs; goto out_vmcs;
memset(loaded_vmcs->msr_bitmap, 0xff, PAGE_SIZE); memset(loaded_vmcs->msr_bitmap, 0xff, PAGE_SIZE);
if (IS_ENABLED(CONFIG_HYPERV) &&
static_branch_unlikely(&enable_evmcs) &&
(ms_hyperv.nested_features & HV_X64_NESTED_MSR_BITMAP)) {
struct hv_enlightened_vmcs *evmcs =
(struct hv_enlightened_vmcs *)loaded_vmcs->vmcs;
evmcs->hv_enlightenments_control.msr_bitmap = 1;
}
} }
memset(&loaded_vmcs->host_state, 0, sizeof(struct vmcs_host_state)); memset(&loaded_vmcs->host_state, 0, sizeof(struct vmcs_host_state));
@ -6842,6 +6833,19 @@ static int vmx_create_vcpu(struct kvm_vcpu *vcpu)
if (err < 0) if (err < 0)
goto free_pml; goto free_pml;
/*
* Use Hyper-V 'Enlightened MSR Bitmap' feature when KVM runs as a
* nested (L1) hypervisor and Hyper-V in L0 supports it. Enable the
* feature only for vmcs01, KVM currently isn't equipped to realize any
* performance benefits from enabling it for vmcs02.
*/
if (IS_ENABLED(CONFIG_HYPERV) && static_branch_unlikely(&enable_evmcs) &&
(ms_hyperv.nested_features & HV_X64_NESTED_MSR_BITMAP)) {
struct hv_enlightened_vmcs *evmcs = (void *)vmx->vmcs01.vmcs;
evmcs->hv_enlightenments_control.msr_bitmap = 1;
}
/* The MSR bitmap starts with all ones */ /* The MSR bitmap starts with all ones */
bitmap_fill(vmx->shadow_msr_intercept.read, MAX_POSSIBLE_PASSTHROUGH_MSRS); bitmap_fill(vmx->shadow_msr_intercept.read, MAX_POSSIBLE_PASSTHROUGH_MSRS);
bitmap_fill(vmx->shadow_msr_intercept.write, MAX_POSSIBLE_PASSTHROUGH_MSRS); bitmap_fill(vmx->shadow_msr_intercept.write, MAX_POSSIBLE_PASSTHROUGH_MSRS);

View file

@ -890,7 +890,8 @@ int kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
!load_pdptrs(vcpu, vcpu->arch.walk_mmu, kvm_read_cr3(vcpu))) !load_pdptrs(vcpu, vcpu->arch.walk_mmu, kvm_read_cr3(vcpu)))
return 1; return 1;
if (!(cr0 & X86_CR0_PG) && kvm_read_cr4_bits(vcpu, X86_CR4_PCIDE)) if (!(cr0 & X86_CR0_PG) &&
(is_64_bit_mode(vcpu) || kvm_read_cr4_bits(vcpu, X86_CR4_PCIDE)))
return 1; return 1;
static_call(kvm_x86_set_cr0)(vcpu, cr0); static_call(kvm_x86_set_cr0)(vcpu, cr0);
@ -3412,7 +3413,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
if (!msr_info->host_initiated) if (!msr_info->host_initiated)
return 1; return 1;
if (guest_cpuid_has(vcpu, X86_FEATURE_PDCM) && kvm_get_msr_feature(&msr_ent)) if (kvm_get_msr_feature(&msr_ent))
return 1; return 1;
if (data & ~msr_ent.data) if (data & ~msr_ent.data)
return 1; return 1;
@ -7121,7 +7122,13 @@ static int emulator_pio_in(struct kvm_vcpu *vcpu, int size,
unsigned short port, void *val, unsigned int count) unsigned short port, void *val, unsigned int count)
{ {
if (vcpu->arch.pio.count) { if (vcpu->arch.pio.count) {
/* Complete previous iteration. */ /*
* Complete a previous iteration that required userspace I/O.
* Note, @count isn't guaranteed to match pio.count as userspace
* can modify ECX before rerunning the vCPU. Ignore any such
* shenanigans as KVM doesn't support modifying the rep count,
* and the emulator ensures @count doesn't overflow the buffer.
*/
} else { } else {
int r = __emulator_pio_in(vcpu, size, port, count); int r = __emulator_pio_in(vcpu, size, port, count);
if (!r) if (!r)
@ -7130,7 +7137,6 @@ static int emulator_pio_in(struct kvm_vcpu *vcpu, int size,
/* Results already available, fall through. */ /* Results already available, fall through. */
} }
WARN_ON(count != vcpu->arch.pio.count);
complete_emulator_pio_in(vcpu, val); complete_emulator_pio_in(vcpu, val);
return 1; return 1;
} }

View file

@ -1252,19 +1252,54 @@ st: if (is_imm8(insn->off))
case BPF_LDX | BPF_MEM | BPF_DW: case BPF_LDX | BPF_MEM | BPF_DW:
case BPF_LDX | BPF_PROBE_MEM | BPF_DW: case BPF_LDX | BPF_PROBE_MEM | BPF_DW:
if (BPF_MODE(insn->code) == BPF_PROBE_MEM) { if (BPF_MODE(insn->code) == BPF_PROBE_MEM) {
/* test src_reg, src_reg */ /* Though the verifier prevents negative insn->off in BPF_PROBE_MEM
maybe_emit_mod(&prog, src_reg, src_reg, true); /* always 1 byte */ * add abs(insn->off) to the limit to make sure that negative
EMIT2(0x85, add_2reg(0xC0, src_reg, src_reg)); * offset won't be an issue.
/* jne start_of_ldx */ * insn->off is s16, so it won't affect valid pointers.
EMIT2(X86_JNE, 0); */
u64 limit = TASK_SIZE_MAX + PAGE_SIZE + abs(insn->off);
u8 *end_of_jmp1, *end_of_jmp2;
/* Conservatively check that src_reg + insn->off is a kernel address:
* 1. src_reg + insn->off >= limit
* 2. src_reg + insn->off doesn't become small positive.
* Cannot do src_reg + insn->off >= limit in one branch,
* since it needs two spare registers, but JIT has only one.
*/
/* movabsq r11, limit */
EMIT2(add_1mod(0x48, AUX_REG), add_1reg(0xB8, AUX_REG));
EMIT((u32)limit, 4);
EMIT(limit >> 32, 4);
/* cmp src_reg, r11 */
maybe_emit_mod(&prog, src_reg, AUX_REG, true);
EMIT2(0x39, add_2reg(0xC0, src_reg, AUX_REG));
/* if unsigned '<' goto end_of_jmp2 */
EMIT2(X86_JB, 0);
end_of_jmp1 = prog;
/* mov r11, src_reg */
emit_mov_reg(&prog, true, AUX_REG, src_reg);
/* add r11, insn->off */
maybe_emit_1mod(&prog, AUX_REG, true);
EMIT2_off32(0x81, add_1reg(0xC0, AUX_REG), insn->off);
/* jmp if not carry to start_of_ldx
* Otherwise ERR_PTR(-EINVAL) + 128 will be the user addr
* that has to be rejected.
*/
EMIT2(0x73 /* JNC */, 0);
end_of_jmp2 = prog;
/* xor dst_reg, dst_reg */ /* xor dst_reg, dst_reg */
emit_mov_imm32(&prog, false, dst_reg, 0); emit_mov_imm32(&prog, false, dst_reg, 0);
/* jmp byte_after_ldx */ /* jmp byte_after_ldx */
EMIT2(0xEB, 0); EMIT2(0xEB, 0);
/* populate jmp_offset for JNE above */ /* populate jmp_offset for JB above to jump to xor dst_reg */
temp[4] = prog - temp - 5 /* sizeof(test + jne) */; end_of_jmp1[-1] = end_of_jmp2 - end_of_jmp1;
/* populate jmp_offset for JNC above to jump to start_of_ldx */
start_of_ldx = prog; start_of_ldx = prog;
end_of_jmp2[-1] = start_of_ldx - end_of_jmp2;
} }
emit_ldx(&prog, BPF_SIZE(insn->code), dst_reg, src_reg, insn->off); emit_ldx(&prog, BPF_SIZE(insn->code), dst_reg, src_reg, insn->off);
if (BPF_MODE(insn->code) == BPF_PROBE_MEM) { if (BPF_MODE(insn->code) == BPF_PROBE_MEM) {
@ -1305,7 +1340,7 @@ st: if (is_imm8(insn->off))
* End result: x86 insn "mov rbx, qword ptr [rax+0x14]" * End result: x86 insn "mov rbx, qword ptr [rax+0x14]"
* of 4 bytes will be ignored and rbx will be zero inited. * of 4 bytes will be ignored and rbx will be zero inited.
*/ */
ex->fixup = (prog - temp) | (reg2pt_regs[dst_reg] << 8); ex->fixup = (prog - start_of_ldx) | (reg2pt_regs[dst_reg] << 8);
} }
break; break;

View file

@ -2311,7 +2311,14 @@ static void ioc_timer_fn(struct timer_list *timer)
hwm = current_hweight_max(iocg); hwm = current_hweight_max(iocg);
new_hwi = hweight_after_donation(iocg, old_hwi, hwm, new_hwi = hweight_after_donation(iocg, old_hwi, hwm,
usage, &now); usage, &now);
if (new_hwi < hwm) { /*
* Donation calculation assumes hweight_after_donation
* to be positive, a condition that a donor w/ hwa < 2
* can't meet. Don't bother with donation if hwa is
* below 2. It's not gonna make a meaningful difference
* anyway.
*/
if (new_hwi < hwm && hwa >= 2) {
iocg->hweight_donating = hwa; iocg->hweight_donating = hwa;
iocg->hweight_after_donation = new_hwi; iocg->hweight_after_donation = new_hwi;
list_add(&iocg->surplus_list, &surpluses); list_add(&iocg->surplus_list, &surpluses);

View file

@ -15,6 +15,7 @@
#include <linux/falloc.h> #include <linux/falloc.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/module.h>
#include "blk.h" #include "blk.h"
static inline struct inode *bdev_file_inode(struct file *file) static inline struct inode *bdev_file_inode(struct file *file)
@ -340,8 +341,7 @@ static ssize_t __blkdev_direct_IO_async(struct kiocb *iocb,
} else { } else {
ret = bio_iov_iter_get_pages(bio, iter); ret = bio_iov_iter_get_pages(bio, iter);
if (unlikely(ret)) { if (unlikely(ret)) {
bio->bi_status = BLK_STS_IOERR; bio_put(bio);
bio_endio(bio);
return ret; return ret;
} }
} }

View file

@ -220,6 +220,7 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who)
pgrp = task_pgrp(current); pgrp = task_pgrp(current);
else else
pgrp = find_vpid(who); pgrp = find_vpid(who);
read_lock(&tasklist_lock);
do_each_pid_thread(pgrp, PIDTYPE_PGID, p) { do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
tmpio = get_task_ioprio(p); tmpio = get_task_ioprio(p);
if (tmpio < 0) if (tmpio < 0)
@ -229,6 +230,8 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who)
else else
ret = ioprio_best(ret, tmpio); ret = ioprio_best(ret, tmpio);
} while_each_pid_thread(pgrp, PIDTYPE_PGID, p); } while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
read_unlock(&tasklist_lock);
break; break;
case IOPRIO_WHO_USER: case IOPRIO_WHO_USER:
uid = make_kuid(current_user_ns(), who); uid = make_kuid(current_user_ns(), who);

View file

@ -41,8 +41,7 @@ obj-$(CONFIG_DMADEVICES) += dma/
# SOC specific infrastructure drivers. # SOC specific infrastructure drivers.
obj-y += soc/ obj-y += soc/
obj-$(CONFIG_VIRTIO) += virtio/ obj-y += virtio/
obj-$(CONFIG_VIRTIO_PCI_LIB) += virtio/
obj-$(CONFIG_VDPA) += vdpa/ obj-$(CONFIG_VDPA) += vdpa/
obj-$(CONFIG_XEN) += xen/ obj-$(CONFIG_XEN) += xen/

View file

@ -4422,23 +4422,20 @@ static int binder_thread_release(struct binder_proc *proc,
__release(&t->lock); __release(&t->lock);
/* /*
* If this thread used poll, make sure we remove the waitqueue * If this thread used poll, make sure we remove the waitqueue from any
* from any epoll data structures holding it with POLLFREE. * poll data structures holding it.
* waitqueue_active() is safe to use here because we're holding
* the inner lock.
*/ */
if ((thread->looper & BINDER_LOOPER_STATE_POLL) && if (thread->looper & BINDER_LOOPER_STATE_POLL)
waitqueue_active(&thread->wait)) { wake_up_pollfree(&thread->wait);
wake_up_poll(&thread->wait, EPOLLHUP | POLLFREE);
}
binder_inner_proc_unlock(thread->proc); binder_inner_proc_unlock(thread->proc);
/* /*
* This is needed to avoid races between wake_up_poll() above and * This is needed to avoid races between wake_up_pollfree() above and
* and ep_remove_waitqueue() called for other reasons (eg the epoll file * someone else removing the last entry from the queue for other reasons
* descriptor being closed); ep_remove_waitqueue() holds an RCU read * (e.g. ep_remove_wait_queue() being called due to an epoll file
* lock, so we can be sure it's done after calling synchronize_rcu(). * descriptor being closed). Such other users hold an RCU read lock, so
* we can be sure they're done after we call synchronize_rcu().
*/ */
if (thread->looper & BINDER_LOOPER_STATE_POLL) if (thread->looper & BINDER_LOOPER_STATE_POLL)
synchronize_rcu(); synchronize_rcu();

View file

@ -94,6 +94,7 @@ struct ceva_ahci_priv {
static unsigned int ceva_ahci_read_id(struct ata_device *dev, static unsigned int ceva_ahci_read_id(struct ata_device *dev,
struct ata_taskfile *tf, u16 *id) struct ata_taskfile *tf, u16 *id)
{ {
__le16 *__id = (__le16 *)id;
u32 err_mask; u32 err_mask;
err_mask = ata_do_dev_read_id(dev, tf, id); err_mask = ata_do_dev_read_id(dev, tf, id);
@ -103,7 +104,7 @@ static unsigned int ceva_ahci_read_id(struct ata_device *dev,
* Since CEVA controller does not support device sleep feature, we * Since CEVA controller does not support device sleep feature, we
* need to clear DEVSLP (bit 8) in word78 of the IDENTIFY DEVICE data. * need to clear DEVSLP (bit 8) in word78 of the IDENTIFY DEVICE data.
*/ */
id[ATA_ID_FEATURE_SUPP] &= cpu_to_le16(~(1 << 8)); __id[ATA_ID_FEATURE_SUPP] &= cpu_to_le16(~(1 << 8));
return 0; return 0;
} }

View file

@ -3920,6 +3920,8 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
{ "VRFDFC22048UCHC-TE*", NULL, ATA_HORKAGE_NODMA }, { "VRFDFC22048UCHC-TE*", NULL, ATA_HORKAGE_NODMA },
/* Odd clown on sil3726/4726 PMPs */ /* Odd clown on sil3726/4726 PMPs */
{ "Config Disk", NULL, ATA_HORKAGE_DISABLE }, { "Config Disk", NULL, ATA_HORKAGE_DISABLE },
/* Similar story with ASMedia 1092 */
{ "ASMT109x- Config", NULL, ATA_HORKAGE_DISABLE },
/* Weird ATAPI devices */ /* Weird ATAPI devices */
{ "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 }, { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 },

View file

@ -2859,8 +2859,19 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
goto invalid_fld; goto invalid_fld;
} }
if (ata_is_ncq(tf->protocol) && (cdb[2 + cdb_offset] & 0x3) == 0) if ((cdb[2 + cdb_offset] & 0x3) == 0) {
tf->protocol = ATA_PROT_NCQ_NODATA; /*
* When T_LENGTH is zero (No data is transferred), dir should
* be DMA_NONE.
*/
if (scmd->sc_data_direction != DMA_NONE) {
fp = 2 + cdb_offset;
goto invalid_fld;
}
if (ata_is_ncq(tf->protocol))
tf->protocol = ATA_PROT_NCQ_NODATA;
}
/* enable LBA */ /* enable LBA */
tf->flags |= ATA_TFLAG_LBA; tf->flags |= ATA_TFLAG_LBA;

View file

@ -1512,9 +1512,12 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
unsigned long flags; unsigned long flags;
struct blkfront_ring_info *rinfo = (struct blkfront_ring_info *)dev_id; struct blkfront_ring_info *rinfo = (struct blkfront_ring_info *)dev_id;
struct blkfront_info *info = rinfo->dev_info; struct blkfront_info *info = rinfo->dev_info;
unsigned int eoiflag = XEN_EOI_FLAG_SPURIOUS;
if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) {
xen_irq_lateeoi(irq, XEN_EOI_FLAG_SPURIOUS);
return IRQ_HANDLED; return IRQ_HANDLED;
}
spin_lock_irqsave(&rinfo->ring_lock, flags); spin_lock_irqsave(&rinfo->ring_lock, flags);
again: again:
@ -1530,6 +1533,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
unsigned long id; unsigned long id;
unsigned int op; unsigned int op;
eoiflag = 0;
RING_COPY_RESPONSE(&rinfo->ring, i, &bret); RING_COPY_RESPONSE(&rinfo->ring, i, &bret);
id = bret.id; id = bret.id;
@ -1646,6 +1651,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
spin_unlock_irqrestore(&rinfo->ring_lock, flags); spin_unlock_irqrestore(&rinfo->ring_lock, flags);
xen_irq_lateeoi(irq, eoiflag);
return IRQ_HANDLED; return IRQ_HANDLED;
err: err:
@ -1653,6 +1660,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
spin_unlock_irqrestore(&rinfo->ring_lock, flags); spin_unlock_irqrestore(&rinfo->ring_lock, flags);
/* No EOI in order to avoid further interrupts. */
pr_alert("%s disabled for further use\n", info->gd->disk_name); pr_alert("%s disabled for further use\n", info->gd->disk_name);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
@ -1692,8 +1701,8 @@ static int setup_blkring(struct xenbus_device *dev,
if (err) if (err)
goto fail; goto fail;
err = bind_evtchn_to_irqhandler(rinfo->evtchn, blkif_interrupt, 0, err = bind_evtchn_to_irqhandler_lateeoi(rinfo->evtchn, blkif_interrupt,
"blkif", rinfo); 0, "blkif", rinfo);
if (err <= 0) { if (err <= 0) {
xenbus_dev_fatal(dev, err, xenbus_dev_fatal(dev, err,
"bind_evtchn_to_irqhandler failed"); "bind_evtchn_to_irqhandler failed");

View file

@ -881,7 +881,7 @@ int mhi_pm_suspend(struct mhi_controller *mhi_cntrl)
} }
EXPORT_SYMBOL_GPL(mhi_pm_suspend); EXPORT_SYMBOL_GPL(mhi_pm_suspend);
int mhi_pm_resume(struct mhi_controller *mhi_cntrl) static int __mhi_pm_resume(struct mhi_controller *mhi_cntrl, bool force)
{ {
struct mhi_chan *itr, *tmp; struct mhi_chan *itr, *tmp;
struct device *dev = &mhi_cntrl->mhi_dev->dev; struct device *dev = &mhi_cntrl->mhi_dev->dev;
@ -898,8 +898,12 @@ int mhi_pm_resume(struct mhi_controller *mhi_cntrl)
if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))
return -EIO; return -EIO;
if (mhi_get_mhi_state(mhi_cntrl) != MHI_STATE_M3) if (mhi_get_mhi_state(mhi_cntrl) != MHI_STATE_M3) {
return -EINVAL; dev_warn(dev, "Resuming from non M3 state (%s)\n",
TO_MHI_STATE_STR(mhi_get_mhi_state(mhi_cntrl)));
if (!force)
return -EINVAL;
}
/* Notify clients about exiting LPM */ /* Notify clients about exiting LPM */
list_for_each_entry_safe(itr, tmp, &mhi_cntrl->lpm_chans, node) { list_for_each_entry_safe(itr, tmp, &mhi_cntrl->lpm_chans, node) {
@ -940,8 +944,19 @@ int mhi_pm_resume(struct mhi_controller *mhi_cntrl)
return 0; return 0;
} }
int mhi_pm_resume(struct mhi_controller *mhi_cntrl)
{
return __mhi_pm_resume(mhi_cntrl, false);
}
EXPORT_SYMBOL_GPL(mhi_pm_resume); EXPORT_SYMBOL_GPL(mhi_pm_resume);
int mhi_pm_resume_force(struct mhi_controller *mhi_cntrl)
{
return __mhi_pm_resume(mhi_cntrl, true);
}
EXPORT_SYMBOL_GPL(mhi_pm_resume_force);
int __mhi_device_get_sync(struct mhi_controller *mhi_cntrl) int __mhi_device_get_sync(struct mhi_controller *mhi_cntrl)
{ {
int ret; int ret;

View file

@ -20,7 +20,7 @@
#define MHI_PCI_DEFAULT_BAR_NUM 0 #define MHI_PCI_DEFAULT_BAR_NUM 0
#define MHI_POST_RESET_DELAY_MS 500 #define MHI_POST_RESET_DELAY_MS 2000
#define HEALTH_CHECK_PERIOD (HZ * 2) #define HEALTH_CHECK_PERIOD (HZ * 2)

View file

@ -3418,6 +3418,14 @@ static int __clk_core_init(struct clk_core *core)
clk_prepare_lock(); clk_prepare_lock();
/*
* Set hw->core after grabbing the prepare_lock to synchronize with
* callers of clk_core_fill_parent_index() where we treat hw->core
* being NULL as the clk not being registered yet. This is crucial so
* that clks aren't parented until their parent is fully registered.
*/
core->hw->core = core;
ret = clk_pm_runtime_get(core); ret = clk_pm_runtime_get(core);
if (ret) if (ret)
goto unlock; goto unlock;
@ -3582,8 +3590,10 @@ static int __clk_core_init(struct clk_core *core)
out: out:
clk_pm_runtime_put(core); clk_pm_runtime_put(core);
unlock: unlock:
if (ret) if (ret) {
hlist_del_init(&core->child_node); hlist_del_init(&core->child_node);
core->hw->core = NULL;
}
clk_prepare_unlock(); clk_prepare_unlock();
@ -3847,7 +3857,6 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw)
core->num_parents = init->num_parents; core->num_parents = init->num_parents;
core->min_rate = 0; core->min_rate = 0;
core->max_rate = ULONG_MAX; core->max_rate = ULONG_MAX;
hw->core = core;
ret = clk_core_populate_parent_map(core, init); ret = clk_core_populate_parent_map(core, init);
if (ret) if (ret)
@ -3865,7 +3874,7 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw)
goto fail_create_clk; goto fail_create_clk;
} }
clk_core_link_consumer(hw->core, hw->clk); clk_core_link_consumer(core, hw->clk);
ret = __clk_core_init(core); ret = __clk_core_init(core);
if (!ret) if (!ret)

View file

@ -370,7 +370,7 @@ static struct platform_driver imx8qxp_lpcg_clk_driver = {
.probe = imx8qxp_lpcg_clk_probe, .probe = imx8qxp_lpcg_clk_probe,
}; };
builtin_platform_driver(imx8qxp_lpcg_clk_driver); module_platform_driver(imx8qxp_lpcg_clk_driver);
MODULE_AUTHOR("Aisheng Dong <aisheng.dong@nxp.com>"); MODULE_AUTHOR("Aisheng Dong <aisheng.dong@nxp.com>");
MODULE_DESCRIPTION("NXP i.MX8QXP LPCG clock driver"); MODULE_DESCRIPTION("NXP i.MX8QXP LPCG clock driver");

View file

@ -308,7 +308,7 @@ static struct platform_driver imx8qxp_clk_driver = {
}, },
.probe = imx8qxp_clk_probe, .probe = imx8qxp_clk_probe,
}; };
builtin_platform_driver(imx8qxp_clk_driver); module_platform_driver(imx8qxp_clk_driver);
MODULE_AUTHOR("Aisheng Dong <aisheng.dong@nxp.com>"); MODULE_AUTHOR("Aisheng Dong <aisheng.dong@nxp.com>");
MODULE_DESCRIPTION("NXP i.MX8QXP clock driver"); MODULE_DESCRIPTION("NXP i.MX8QXP clock driver");

View file

@ -1429,6 +1429,15 @@ EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_fabia_ops);
void clk_trion_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, void clk_trion_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
const struct alpha_pll_config *config) const struct alpha_pll_config *config)
{ {
/*
* If the bootloader left the PLL enabled it's likely that there are
* RCGs that will lock up if we disable the PLL below.
*/
if (trion_pll_is_enabled(pll, regmap)) {
pr_debug("Trion PLL is already enabled, skipping configuration\n");
return;
}
clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l); clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l);
regmap_write(regmap, PLL_CAL_L_VAL(pll), TRION_PLL_CAL_VAL); regmap_write(regmap, PLL_CAL_L_VAL(pll), TRION_PLL_CAL_VAL);
clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll), config->alpha); clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll), config->alpha);

View file

@ -28,7 +28,7 @@ static u8 mux_get_parent(struct clk_hw *hw)
val &= mask; val &= mask;
if (mux->parent_map) if (mux->parent_map)
return qcom_find_src_index(hw, mux->parent_map, val); return qcom_find_cfg_index(hw, mux->parent_map, val);
return val; return val;
} }

View file

@ -69,6 +69,18 @@ int qcom_find_src_index(struct clk_hw *hw, const struct parent_map *map, u8 src)
} }
EXPORT_SYMBOL_GPL(qcom_find_src_index); EXPORT_SYMBOL_GPL(qcom_find_src_index);
int qcom_find_cfg_index(struct clk_hw *hw, const struct parent_map *map, u8 cfg)
{
int i, num_parents = clk_hw_get_num_parents(hw);
for (i = 0; i < num_parents; i++)
if (cfg == map[i].cfg)
return i;
return -ENOENT;
}
EXPORT_SYMBOL_GPL(qcom_find_cfg_index);
struct regmap * struct regmap *
qcom_cc_map(struct platform_device *pdev, const struct qcom_cc_desc *desc) qcom_cc_map(struct platform_device *pdev, const struct qcom_cc_desc *desc)
{ {

View file

@ -49,6 +49,8 @@ extern void
qcom_pll_set_fsm_mode(struct regmap *m, u32 reg, u8 bias_count, u8 lock_count); qcom_pll_set_fsm_mode(struct regmap *m, u32 reg, u8 bias_count, u8 lock_count);
extern int qcom_find_src_index(struct clk_hw *hw, const struct parent_map *map, extern int qcom_find_src_index(struct clk_hw *hw, const struct parent_map *map,
u8 src); u8 src);
extern int qcom_find_cfg_index(struct clk_hw *hw, const struct parent_map *map,
u8 cfg);
extern int qcom_cc_register_board_clk(struct device *dev, const char *path, extern int qcom_cc_register_board_clk(struct device *dev, const char *path,
const char *name, unsigned long rate); const char *name, unsigned long rate);

View file

@ -1121,7 +1121,7 @@ static struct clk_rcg2 gcc_sdcc1_apps_clk_src = {
.name = "gcc_sdcc1_apps_clk_src", .name = "gcc_sdcc1_apps_clk_src",
.parent_data = gcc_parent_data_1, .parent_data = gcc_parent_data_1,
.num_parents = ARRAY_SIZE(gcc_parent_data_1), .num_parents = ARRAY_SIZE(gcc_parent_data_1),
.ops = &clk_rcg2_ops, .ops = &clk_rcg2_floor_ops,
}, },
}; };
@ -1143,7 +1143,7 @@ static struct clk_rcg2 gcc_sdcc1_ice_core_clk_src = {
.name = "gcc_sdcc1_ice_core_clk_src", .name = "gcc_sdcc1_ice_core_clk_src",
.parent_data = gcc_parent_data_0, .parent_data = gcc_parent_data_0,
.num_parents = ARRAY_SIZE(gcc_parent_data_0), .num_parents = ARRAY_SIZE(gcc_parent_data_0),
.ops = &clk_rcg2_floor_ops, .ops = &clk_rcg2_ops,
}, },
}; };

View file

@ -543,8 +543,8 @@ static void __init of_syscon_icst_setup(struct device_node *np)
regclk = icst_clk_setup(NULL, &icst_desc, name, parent_name, map, ctype); regclk = icst_clk_setup(NULL, &icst_desc, name, parent_name, map, ctype);
if (IS_ERR(regclk)) { if (IS_ERR(regclk)) {
kfree(name);
pr_err("error setting up syscon ICST clock %s\n", name); pr_err("error setting up syscon ICST clock %s\n", name);
kfree(name);
return; return;
} }
of_clk_add_provider(np, of_clk_src_simple_get, regclk); of_clk_add_provider(np, of_clk_src_simple_get, regclk);

View file

@ -394,8 +394,13 @@ EXPORT_SYMBOL_GPL(timer_unstable_counter_workaround);
static atomic_t timer_unstable_counter_workaround_in_use = ATOMIC_INIT(0); static atomic_t timer_unstable_counter_workaround_in_use = ATOMIC_INIT(0);
static void erratum_set_next_event_generic(const int access, unsigned long evt, /*
struct clock_event_device *clk) * Force the inlining of this function so that the register accesses
* can be themselves correctly inlined.
*/
static __always_inline
void erratum_set_next_event_generic(const int access, unsigned long evt,
struct clock_event_device *clk)
{ {
unsigned long ctrl; unsigned long ctrl;
u64 cval; u64 cval;

View file

@ -47,7 +47,7 @@ static int __init timer_get_base_and_rate(struct device_node *np,
pr_warn("pclk for %pOFn is present, but could not be activated\n", pr_warn("pclk for %pOFn is present, but could not be activated\n",
np); np);
if (!of_property_read_u32(np, "clock-freq", rate) && if (!of_property_read_u32(np, "clock-freq", rate) ||
!of_property_read_u32(np, "clock-frequency", rate)) !of_property_read_u32(np, "clock-frequency", rate))
return 0; return 0;

View file

@ -373,7 +373,7 @@ static void axi_chan_block_xfer_start(struct axi_dma_chan *chan,
struct axi_dma_desc *first) struct axi_dma_desc *first)
{ {
u32 priority = chan->chip->dw->hdata->priority[chan->id]; u32 priority = chan->chip->dw->hdata->priority[chan->id];
struct axi_dma_chan_config config; struct axi_dma_chan_config config = {};
u32 irq_mask; u32 irq_mask;
u8 lms = 0; /* Select AXI0 master for LLI fetching */ u8 lms = 0; /* Select AXI0 master for LLI fetching */
@ -391,7 +391,7 @@ static void axi_chan_block_xfer_start(struct axi_dma_chan *chan,
config.tt_fc = DWAXIDMAC_TT_FC_MEM_TO_MEM_DMAC; config.tt_fc = DWAXIDMAC_TT_FC_MEM_TO_MEM_DMAC;
config.prior = priority; config.prior = priority;
config.hs_sel_dst = DWAXIDMAC_HS_SEL_HW; config.hs_sel_dst = DWAXIDMAC_HS_SEL_HW;
config.hs_sel_dst = DWAXIDMAC_HS_SEL_HW; config.hs_sel_src = DWAXIDMAC_HS_SEL_HW;
switch (chan->direction) { switch (chan->direction) {
case DMA_MEM_TO_DEV: case DMA_MEM_TO_DEV:
dw_axi_dma_set_byte_halfword(chan, true); dw_axi_dma_set_byte_halfword(chan, true);

View file

@ -187,17 +187,9 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
/* DMA configuration */ /* DMA configuration */
err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
if (!err) { if (err) {
pci_err(pdev, "DMA mask 64 set failed\n"); pci_err(pdev, "DMA mask 64 set failed\n");
return err; return err;
} else {
pci_err(pdev, "DMA mask 64 set failed\n");
err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
if (err) {
pci_err(pdev, "DMA mask 32 set failed\n");
return err;
}
} }
/* Data structure allocation */ /* Data structure allocation */

View file

@ -137,10 +137,10 @@ halt:
INIT_WORK(&idxd->work, idxd_device_reinit); INIT_WORK(&idxd->work, idxd_device_reinit);
queue_work(idxd->wq, &idxd->work); queue_work(idxd->wq, &idxd->work);
} else { } else {
spin_lock(&idxd->dev_lock);
idxd->state = IDXD_DEV_HALTED; idxd->state = IDXD_DEV_HALTED;
idxd_wqs_quiesce(idxd); idxd_wqs_quiesce(idxd);
idxd_wqs_unmap_portal(idxd); idxd_wqs_unmap_portal(idxd);
spin_lock(&idxd->dev_lock);
idxd_device_clear_state(idxd); idxd_device_clear_state(idxd);
dev_err(&idxd->pdev->dev, dev_err(&idxd->pdev->dev,
"idxd halted, need %s.\n", "idxd halted, need %s.\n",

View file

@ -106,6 +106,7 @@ static void llist_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,
{ {
struct idxd_desc *d, *t, *found = NULL; struct idxd_desc *d, *t, *found = NULL;
struct llist_node *head; struct llist_node *head;
LIST_HEAD(flist);
desc->completion->status = IDXD_COMP_DESC_ABORT; desc->completion->status = IDXD_COMP_DESC_ABORT;
/* /*
@ -120,7 +121,11 @@ static void llist_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,
found = desc; found = desc;
continue; continue;
} }
list_add_tail(&desc->list, &ie->work_list);
if (d->completion->status)
list_add_tail(&d->list, &flist);
else
list_add_tail(&d->list, &ie->work_list);
} }
} }
@ -130,6 +135,17 @@ static void llist_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,
if (found) if (found)
complete_desc(found, IDXD_COMPLETE_ABORT); complete_desc(found, IDXD_COMPLETE_ABORT);
/*
* complete_desc() will return desc to allocator and the desc can be
* acquired by a different process and the desc->list can be modified.
* Delete desc from list so the list trasversing does not get corrupted
* by the other process.
*/
list_for_each_entry_safe(d, t, &flist, list) {
list_del_init(&d->list);
complete_desc(d, IDXD_COMPLETE_NORMAL);
}
} }
int idxd_submit_desc(struct idxd_wq *wq, struct idxd_desc *desc) int idxd_submit_desc(struct idxd_wq *wq, struct idxd_desc *desc)

View file

@ -874,4 +874,4 @@ MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("STMicroelectronics FDMA engine driver"); MODULE_DESCRIPTION("STMicroelectronics FDMA engine driver");
MODULE_AUTHOR("Ludovic.barre <Ludovic.barre@st.com>"); MODULE_AUTHOR("Ludovic.barre <Ludovic.barre@st.com>");
MODULE_AUTHOR("Peter Griffin <peter.griffin@linaro.org>"); MODULE_AUTHOR("Peter Griffin <peter.griffin@linaro.org>");
MODULE_ALIAS("platform: " DRIVER_NAME); MODULE_ALIAS("platform:" DRIVER_NAME);

View file

@ -4534,45 +4534,60 @@ static int udma_setup_resources(struct udma_dev *ud)
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN]; rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
if (IS_ERR(rm_res)) { if (IS_ERR(rm_res)) {
bitmap_zero(ud->tchan_map, ud->tchan_cnt); bitmap_zero(ud->tchan_map, ud->tchan_cnt);
irq_res.sets = 1;
} else { } else {
bitmap_fill(ud->tchan_map, ud->tchan_cnt); bitmap_fill(ud->tchan_map, ud->tchan_cnt);
for (i = 0; i < rm_res->sets; i++) for (i = 0; i < rm_res->sets; i++)
udma_mark_resource_ranges(ud, ud->tchan_map, udma_mark_resource_ranges(ud, ud->tchan_map,
&rm_res->desc[i], "tchan"); &rm_res->desc[i], "tchan");
irq_res.sets = rm_res->sets;
} }
irq_res.sets = rm_res->sets;
/* rchan and matching default flow ranges */ /* rchan and matching default flow ranges */
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN]; rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
if (IS_ERR(rm_res)) { if (IS_ERR(rm_res)) {
bitmap_zero(ud->rchan_map, ud->rchan_cnt); bitmap_zero(ud->rchan_map, ud->rchan_cnt);
irq_res.sets++;
} else { } else {
bitmap_fill(ud->rchan_map, ud->rchan_cnt); bitmap_fill(ud->rchan_map, ud->rchan_cnt);
for (i = 0; i < rm_res->sets; i++) for (i = 0; i < rm_res->sets; i++)
udma_mark_resource_ranges(ud, ud->rchan_map, udma_mark_resource_ranges(ud, ud->rchan_map,
&rm_res->desc[i], "rchan"); &rm_res->desc[i], "rchan");
irq_res.sets += rm_res->sets;
} }
irq_res.sets += rm_res->sets;
irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL); irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
if (!irq_res.desc)
return -ENOMEM;
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN]; rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
for (i = 0; i < rm_res->sets; i++) { if (IS_ERR(rm_res)) {
irq_res.desc[i].start = rm_res->desc[i].start; irq_res.desc[0].start = 0;
irq_res.desc[i].num = rm_res->desc[i].num; irq_res.desc[0].num = ud->tchan_cnt;
irq_res.desc[i].start_sec = rm_res->desc[i].start_sec; i = 1;
irq_res.desc[i].num_sec = rm_res->desc[i].num_sec; } else {
for (i = 0; i < rm_res->sets; i++) {
irq_res.desc[i].start = rm_res->desc[i].start;
irq_res.desc[i].num = rm_res->desc[i].num;
irq_res.desc[i].start_sec = rm_res->desc[i].start_sec;
irq_res.desc[i].num_sec = rm_res->desc[i].num_sec;
}
} }
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN]; rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
for (j = 0; j < rm_res->sets; j++, i++) { if (IS_ERR(rm_res)) {
if (rm_res->desc[j].num) { irq_res.desc[i].start = 0;
irq_res.desc[i].start = rm_res->desc[j].start + irq_res.desc[i].num = ud->rchan_cnt;
ud->soc_data->oes.udma_rchan; } else {
irq_res.desc[i].num = rm_res->desc[j].num; for (j = 0; j < rm_res->sets; j++, i++) {
} if (rm_res->desc[j].num) {
if (rm_res->desc[j].num_sec) { irq_res.desc[i].start = rm_res->desc[j].start +
irq_res.desc[i].start_sec = rm_res->desc[j].start_sec + ud->soc_data->oes.udma_rchan;
ud->soc_data->oes.udma_rchan; irq_res.desc[i].num = rm_res->desc[j].num;
irq_res.desc[i].num_sec = rm_res->desc[j].num_sec; }
if (rm_res->desc[j].num_sec) {
irq_res.desc[i].start_sec = rm_res->desc[j].start_sec +
ud->soc_data->oes.udma_rchan;
irq_res.desc[i].num_sec = rm_res->desc[j].num_sec;
}
} }
} }
ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res); ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res);
@ -4690,14 +4705,15 @@ static int bcdma_setup_resources(struct udma_dev *ud)
rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN]; rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN];
if (IS_ERR(rm_res)) { if (IS_ERR(rm_res)) {
bitmap_zero(ud->bchan_map, ud->bchan_cnt); bitmap_zero(ud->bchan_map, ud->bchan_cnt);
irq_res.sets++;
} else { } else {
bitmap_fill(ud->bchan_map, ud->bchan_cnt); bitmap_fill(ud->bchan_map, ud->bchan_cnt);
for (i = 0; i < rm_res->sets; i++) for (i = 0; i < rm_res->sets; i++)
udma_mark_resource_ranges(ud, ud->bchan_map, udma_mark_resource_ranges(ud, ud->bchan_map,
&rm_res->desc[i], &rm_res->desc[i],
"bchan"); "bchan");
irq_res.sets += rm_res->sets;
} }
irq_res.sets += rm_res->sets;
} }
/* tchan ranges */ /* tchan ranges */
@ -4705,14 +4721,15 @@ static int bcdma_setup_resources(struct udma_dev *ud)
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN]; rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
if (IS_ERR(rm_res)) { if (IS_ERR(rm_res)) {
bitmap_zero(ud->tchan_map, ud->tchan_cnt); bitmap_zero(ud->tchan_map, ud->tchan_cnt);
irq_res.sets += 2;
} else { } else {
bitmap_fill(ud->tchan_map, ud->tchan_cnt); bitmap_fill(ud->tchan_map, ud->tchan_cnt);
for (i = 0; i < rm_res->sets; i++) for (i = 0; i < rm_res->sets; i++)
udma_mark_resource_ranges(ud, ud->tchan_map, udma_mark_resource_ranges(ud, ud->tchan_map,
&rm_res->desc[i], &rm_res->desc[i],
"tchan"); "tchan");
irq_res.sets += rm_res->sets * 2;
} }
irq_res.sets += rm_res->sets * 2;
} }
/* rchan ranges */ /* rchan ranges */
@ -4720,47 +4737,72 @@ static int bcdma_setup_resources(struct udma_dev *ud)
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN]; rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
if (IS_ERR(rm_res)) { if (IS_ERR(rm_res)) {
bitmap_zero(ud->rchan_map, ud->rchan_cnt); bitmap_zero(ud->rchan_map, ud->rchan_cnt);
irq_res.sets += 2;
} else { } else {
bitmap_fill(ud->rchan_map, ud->rchan_cnt); bitmap_fill(ud->rchan_map, ud->rchan_cnt);
for (i = 0; i < rm_res->sets; i++) for (i = 0; i < rm_res->sets; i++)
udma_mark_resource_ranges(ud, ud->rchan_map, udma_mark_resource_ranges(ud, ud->rchan_map,
&rm_res->desc[i], &rm_res->desc[i],
"rchan"); "rchan");
irq_res.sets += rm_res->sets * 2;
} }
irq_res.sets += rm_res->sets * 2;
} }
irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL); irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
if (!irq_res.desc)
return -ENOMEM;
if (ud->bchan_cnt) { if (ud->bchan_cnt) {
rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN]; rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN];
for (i = 0; i < rm_res->sets; i++) { if (IS_ERR(rm_res)) {
irq_res.desc[i].start = rm_res->desc[i].start + irq_res.desc[0].start = oes->bcdma_bchan_ring;
oes->bcdma_bchan_ring; irq_res.desc[0].num = ud->bchan_cnt;
irq_res.desc[i].num = rm_res->desc[i].num; i = 1;
} else {
for (i = 0; i < rm_res->sets; i++) {
irq_res.desc[i].start = rm_res->desc[i].start +
oes->bcdma_bchan_ring;
irq_res.desc[i].num = rm_res->desc[i].num;
}
} }
} }
if (ud->tchan_cnt) { if (ud->tchan_cnt) {
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN]; rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
for (j = 0; j < rm_res->sets; j++, i += 2) { if (IS_ERR(rm_res)) {
irq_res.desc[i].start = rm_res->desc[j].start + irq_res.desc[i].start = oes->bcdma_tchan_data;
oes->bcdma_tchan_data; irq_res.desc[i].num = ud->tchan_cnt;
irq_res.desc[i].num = rm_res->desc[j].num; irq_res.desc[i + 1].start = oes->bcdma_tchan_ring;
irq_res.desc[i + 1].num = ud->tchan_cnt;
i += 2;
} else {
for (j = 0; j < rm_res->sets; j++, i += 2) {
irq_res.desc[i].start = rm_res->desc[j].start +
oes->bcdma_tchan_data;
irq_res.desc[i].num = rm_res->desc[j].num;
irq_res.desc[i + 1].start = rm_res->desc[j].start + irq_res.desc[i + 1].start = rm_res->desc[j].start +
oes->bcdma_tchan_ring; oes->bcdma_tchan_ring;
irq_res.desc[i + 1].num = rm_res->desc[j].num; irq_res.desc[i + 1].num = rm_res->desc[j].num;
}
} }
} }
if (ud->rchan_cnt) { if (ud->rchan_cnt) {
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN]; rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
for (j = 0; j < rm_res->sets; j++, i += 2) { if (IS_ERR(rm_res)) {
irq_res.desc[i].start = rm_res->desc[j].start + irq_res.desc[i].start = oes->bcdma_rchan_data;
oes->bcdma_rchan_data; irq_res.desc[i].num = ud->rchan_cnt;
irq_res.desc[i].num = rm_res->desc[j].num; irq_res.desc[i + 1].start = oes->bcdma_rchan_ring;
irq_res.desc[i + 1].num = ud->rchan_cnt;
i += 2;
} else {
for (j = 0; j < rm_res->sets; j++, i += 2) {
irq_res.desc[i].start = rm_res->desc[j].start +
oes->bcdma_rchan_data;
irq_res.desc[i].num = rm_res->desc[j].num;
irq_res.desc[i + 1].start = rm_res->desc[j].start + irq_res.desc[i + 1].start = rm_res->desc[j].start +
oes->bcdma_rchan_ring; oes->bcdma_rchan_ring;
irq_res.desc[i + 1].num = rm_res->desc[j].num; irq_res.desc[i + 1].num = rm_res->desc[j].num;
}
} }
} }
@ -4858,39 +4900,54 @@ static int pktdma_setup_resources(struct udma_dev *ud)
if (IS_ERR(rm_res)) { if (IS_ERR(rm_res)) {
/* all rflows are assigned exclusively to Linux */ /* all rflows are assigned exclusively to Linux */
bitmap_zero(ud->rflow_in_use, ud->rflow_cnt); bitmap_zero(ud->rflow_in_use, ud->rflow_cnt);
irq_res.sets = 1;
} else { } else {
bitmap_fill(ud->rflow_in_use, ud->rflow_cnt); bitmap_fill(ud->rflow_in_use, ud->rflow_cnt);
for (i = 0; i < rm_res->sets; i++) for (i = 0; i < rm_res->sets; i++)
udma_mark_resource_ranges(ud, ud->rflow_in_use, udma_mark_resource_ranges(ud, ud->rflow_in_use,
&rm_res->desc[i], "rflow"); &rm_res->desc[i], "rflow");
irq_res.sets = rm_res->sets;
} }
irq_res.sets = rm_res->sets;
/* tflow ranges */ /* tflow ranges */
rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW]; rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW];
if (IS_ERR(rm_res)) { if (IS_ERR(rm_res)) {
/* all tflows are assigned exclusively to Linux */ /* all tflows are assigned exclusively to Linux */
bitmap_zero(ud->tflow_map, ud->tflow_cnt); bitmap_zero(ud->tflow_map, ud->tflow_cnt);
irq_res.sets++;
} else { } else {
bitmap_fill(ud->tflow_map, ud->tflow_cnt); bitmap_fill(ud->tflow_map, ud->tflow_cnt);
for (i = 0; i < rm_res->sets; i++) for (i = 0; i < rm_res->sets; i++)
udma_mark_resource_ranges(ud, ud->tflow_map, udma_mark_resource_ranges(ud, ud->tflow_map,
&rm_res->desc[i], "tflow"); &rm_res->desc[i], "tflow");
irq_res.sets += rm_res->sets;
} }
irq_res.sets += rm_res->sets;
irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL); irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
if (!irq_res.desc)
return -ENOMEM;
rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW]; rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW];
for (i = 0; i < rm_res->sets; i++) { if (IS_ERR(rm_res)) {
irq_res.desc[i].start = rm_res->desc[i].start + irq_res.desc[0].start = oes->pktdma_tchan_flow;
oes->pktdma_tchan_flow; irq_res.desc[0].num = ud->tflow_cnt;
irq_res.desc[i].num = rm_res->desc[i].num; i = 1;
} else {
for (i = 0; i < rm_res->sets; i++) {
irq_res.desc[i].start = rm_res->desc[i].start +
oes->pktdma_tchan_flow;
irq_res.desc[i].num = rm_res->desc[i].num;
}
} }
rm_res = tisci_rm->rm_ranges[RM_RANGE_RFLOW]; rm_res = tisci_rm->rm_ranges[RM_RANGE_RFLOW];
for (j = 0; j < rm_res->sets; j++, i++) { if (IS_ERR(rm_res)) {
irq_res.desc[i].start = rm_res->desc[j].start + irq_res.desc[i].start = oes->pktdma_rchan_flow;
oes->pktdma_rchan_flow; irq_res.desc[i].num = ud->rflow_cnt;
irq_res.desc[i].num = rm_res->desc[j].num; } else {
for (j = 0; j < rm_res->sets; j++, i++) {
irq_res.desc[i].start = rm_res->desc[j].start +
oes->pktdma_rchan_flow;
irq_res.desc[i].num = rm_res->desc[j].num;
}
} }
ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res); ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res);
kfree(irq_res.desc); kfree(irq_res.desc);

View file

@ -16,7 +16,6 @@ struct scpi_pm_domain {
struct generic_pm_domain genpd; struct generic_pm_domain genpd;
struct scpi_ops *ops; struct scpi_ops *ops;
u32 domain; u32 domain;
char name[30];
}; };
/* /*
@ -110,8 +109,13 @@ static int scpi_pm_domain_probe(struct platform_device *pdev)
scpi_pd->domain = i; scpi_pd->domain = i;
scpi_pd->ops = scpi_ops; scpi_pd->ops = scpi_ops;
sprintf(scpi_pd->name, "%pOFn.%d", np, i); scpi_pd->genpd.name = devm_kasprintf(dev, GFP_KERNEL,
scpi_pd->genpd.name = scpi_pd->name; "%pOFn.%d", np, i);
if (!scpi_pd->genpd.name) {
dev_err(dev, "Failed to allocate genpd name:%pOFn.%d\n",
np, i);
continue;
}
scpi_pd->genpd.power_off = scpi_pd_power_off; scpi_pd->genpd.power_off = scpi_pd_power_off;
scpi_pd->genpd.power_on = scpi_pd_power_on; scpi_pd->genpd.power_on = scpi_pd_power_on;

View file

@ -77,13 +77,14 @@ static const char *get_filename(struct tegra_bpmp *bpmp,
const char *root_path, *filename = NULL; const char *root_path, *filename = NULL;
char *root_path_buf; char *root_path_buf;
size_t root_len; size_t root_len;
size_t root_path_buf_len = 512;
root_path_buf = kzalloc(512, GFP_KERNEL); root_path_buf = kzalloc(root_path_buf_len, GFP_KERNEL);
if (!root_path_buf) if (!root_path_buf)
goto out; goto out;
root_path = dentry_path(bpmp->debugfs_mirror, root_path_buf, root_path = dentry_path(bpmp->debugfs_mirror, root_path_buf,
sizeof(root_path_buf)); root_path_buf_len);
if (IS_ERR(root_path)) if (IS_ERR(root_path))
goto out; goto out;

View file

@ -3070,8 +3070,8 @@ static void gfx_v9_0_init_pg(struct amdgpu_device *adev)
AMD_PG_SUPPORT_CP | AMD_PG_SUPPORT_CP |
AMD_PG_SUPPORT_GDS | AMD_PG_SUPPORT_GDS |
AMD_PG_SUPPORT_RLC_SMU_HS)) { AMD_PG_SUPPORT_RLC_SMU_HS)) {
WREG32(mmRLC_JUMP_TABLE_RESTORE, WREG32_SOC15(GC, 0, mmRLC_JUMP_TABLE_RESTORE,
adev->gfx.rlc.cp_table_gpu_addr >> 8); adev->gfx.rlc.cp_table_gpu_addr >> 8);
gfx_v9_0_init_gfx_power_gating(adev); gfx_v9_0_init_gfx_power_gating(adev);
} }
} }

View file

@ -162,7 +162,6 @@ static void gfxhub_v1_0_init_tlb_regs(struct amdgpu_device *adev)
ENABLE_ADVANCED_DRIVER_MODEL, 1); ENABLE_ADVANCED_DRIVER_MODEL, 1);
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
MTYPE, MTYPE_UC);/* XXX for emulation. */ MTYPE, MTYPE_UC);/* XXX for emulation. */
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1); tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1);

View file

@ -196,7 +196,6 @@ static void gfxhub_v2_0_init_tlb_regs(struct amdgpu_device *adev)
ENABLE_ADVANCED_DRIVER_MODEL, 1); ENABLE_ADVANCED_DRIVER_MODEL, 1);
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL,
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL,
MTYPE, MTYPE_UC); /* UC, uncached */ MTYPE, MTYPE_UC); /* UC, uncached */

View file

@ -197,7 +197,6 @@ static void gfxhub_v2_1_init_tlb_regs(struct amdgpu_device *adev)
ENABLE_ADVANCED_DRIVER_MODEL, 1); ENABLE_ADVANCED_DRIVER_MODEL, 1);
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL,
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL,
MTYPE, MTYPE_UC); /* UC, uncached */ MTYPE, MTYPE_UC); /* UC, uncached */

View file

@ -1808,6 +1808,14 @@ static int gmc_v9_0_hw_fini(void *handle)
return 0; return 0;
} }
/*
* Pair the operations did in gmc_v9_0_hw_init and thus maintain
* a correct cached state for GMC. Otherwise, the "gate" again
* operation on S3 resuming will fail due to wrong cached state.
*/
if (adev->mmhub.funcs->update_power_gating)
adev->mmhub.funcs->update_power_gating(adev, false);
amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0); amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0); amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);

View file

@ -145,7 +145,6 @@ static void mmhub_v1_0_init_tlb_regs(struct amdgpu_device *adev)
ENABLE_ADVANCED_DRIVER_MODEL, 1); ENABLE_ADVANCED_DRIVER_MODEL, 1);
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
MTYPE, MTYPE_UC);/* XXX for emulation. */ MTYPE, MTYPE_UC);/* XXX for emulation. */
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1); tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1);
@ -302,10 +301,10 @@ static void mmhub_v1_0_update_power_gating(struct amdgpu_device *adev,
if (amdgpu_sriov_vf(adev)) if (amdgpu_sriov_vf(adev))
return; return;
if (enable && adev->pg_flags & AMD_PG_SUPPORT_MMHUB) { if (adev->pg_flags & AMD_PG_SUPPORT_MMHUB)
amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GMC, true); amdgpu_dpm_set_powergating_by_smu(adev,
AMD_IP_BLOCK_TYPE_GMC,
} enable);
} }
static int mmhub_v1_0_gart_enable(struct amdgpu_device *adev) static int mmhub_v1_0_gart_enable(struct amdgpu_device *adev)

View file

@ -165,7 +165,6 @@ static void mmhub_v1_7_init_tlb_regs(struct amdgpu_device *adev)
ENABLE_ADVANCED_DRIVER_MODEL, 1); ENABLE_ADVANCED_DRIVER_MODEL, 1);
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
MTYPE, MTYPE_UC);/* XXX for emulation. */ MTYPE, MTYPE_UC);/* XXX for emulation. */
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1); tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1);

View file

@ -267,7 +267,6 @@ static void mmhub_v2_0_init_tlb_regs(struct amdgpu_device *adev)
ENABLE_ADVANCED_DRIVER_MODEL, 1); ENABLE_ADVANCED_DRIVER_MODEL, 1);
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
MTYPE, MTYPE_UC); /* UC, uncached */ MTYPE, MTYPE_UC); /* UC, uncached */

View file

@ -194,7 +194,6 @@ static void mmhub_v2_3_init_tlb_regs(struct amdgpu_device *adev)
ENABLE_ADVANCED_DRIVER_MODEL, 1); ENABLE_ADVANCED_DRIVER_MODEL, 1);
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
MTYPE, MTYPE_UC); /* UC, uncached */ MTYPE, MTYPE_UC); /* UC, uncached */

View file

@ -189,8 +189,6 @@ static void mmhub_v9_4_init_tlb_regs(struct amdgpu_device *adev, int hubid)
ENABLE_ADVANCED_DRIVER_MODEL, 1); ENABLE_ADVANCED_DRIVER_MODEL, 1);
tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
ECO_BITS, 0);
tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
MTYPE, MTYPE_UC);/* XXX for emulation. */ MTYPE, MTYPE_UC);/* XXX for emulation. */
tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL, tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,

View file

@ -1051,6 +1051,11 @@ static int dm_dmub_hw_init(struct amdgpu_device *adev)
return 0; return 0;
} }
/* Reset DMCUB if it was previously running - before we overwrite its memory. */
status = dmub_srv_hw_reset(dmub_srv);
if (status != DMUB_STATUS_OK)
DRM_WARN("Error resetting DMUB HW: %d\n", status);
hdr = (const struct dmcub_firmware_header_v1_0 *)dmub_fw->data; hdr = (const struct dmcub_firmware_header_v1_0 *)dmub_fw->data;
fw_inst_const = dmub_fw->data + fw_inst_const = dmub_fw->data +
@ -2576,7 +2581,8 @@ static int dm_resume(void *handle)
*/ */
link_enc_cfg_init(dm->dc, dc_state); link_enc_cfg_init(dm->dc, dc_state);
amdgpu_dm_outbox_init(adev); if (dc_enable_dmub_notifications(adev->dm.dc))
amdgpu_dm_outbox_init(adev);
r = dm_dmub_hw_init(adev); r = dm_dmub_hw_init(adev);
if (r) if (r)
@ -2625,6 +2631,10 @@ static int dm_resume(void *handle)
/* TODO: Remove dc_state->dccg, use dc->dccg directly. */ /* TODO: Remove dc_state->dccg, use dc->dccg directly. */
dc_resource_state_construct(dm->dc, dm_state->context); dc_resource_state_construct(dm->dc, dm_state->context);
/* Re-enable outbox interrupts for DPIA. */
if (dc_enable_dmub_notifications(adev->dm.dc))
amdgpu_dm_outbox_init(adev);
/* Before powering on DC we need to re-initialize DMUB. */ /* Before powering on DC we need to re-initialize DMUB. */
r = dm_dmub_hw_init(adev); r = dm_dmub_hw_init(adev);
if (r) if (r)

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