Merge tag 'v6.1.75' of git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable into odroidg12-6.1.y

This is the 6.1.75 stable release
This commit is contained in:
Mauro (mdrjr) Ribeiro
2024-01-29 18:09:56 -03:00
422 changed files with 3545 additions and 2121 deletions

View File

@@ -126,7 +126,7 @@ examples:
- | - |
#include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/interrupt-controller/arm-gic.h>
gpio@e000a000 { gpio@a0020000 {
compatible = "xlnx,xps-gpio-1.00.a"; compatible = "xlnx,xps-gpio-1.00.a";
reg = <0xa0020000 0x10000>; reg = <0xa0020000 0x10000>;
#gpio-cells = <2>; #gpio-cells = <2>;

View File

@@ -61,6 +61,9 @@ properties:
- description: used for 1st data pipe from RDMA - description: used for 1st data pipe from RDMA
- description: used for 2nd data pipe from RDMA - description: used for 2nd data pipe from RDMA
'#dma-cells':
const: 1
required: required:
- compatible - compatible
- reg - reg
@@ -70,6 +73,7 @@ required:
- clocks - clocks
- iommus - iommus
- mboxes - mboxes
- '#dma-cells'
additionalProperties: false additionalProperties: false
@@ -80,16 +84,17 @@ examples:
#include <dt-bindings/power/mt8183-power.h> #include <dt-bindings/power/mt8183-power.h>
#include <dt-bindings/memory/mt8183-larb-port.h> #include <dt-bindings/memory/mt8183-larb-port.h>
mdp3_rdma0: mdp3-rdma0@14001000 { dma-controller@14001000 {
compatible = "mediatek,mt8183-mdp3-rdma"; compatible = "mediatek,mt8183-mdp3-rdma";
reg = <0x14001000 0x1000>; reg = <0x14001000 0x1000>;
mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x1000 0x1000>; mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x1000 0x1000>;
mediatek,gce-events = <CMDQ_EVENT_MDP_RDMA0_SOF>, mediatek,gce-events = <CMDQ_EVENT_MDP_RDMA0_SOF>,
<CMDQ_EVENT_MDP_RDMA0_EOF>; <CMDQ_EVENT_MDP_RDMA0_EOF>;
power-domains = <&spm MT8183_POWER_DOMAIN_DISP>; power-domains = <&spm MT8183_POWER_DOMAIN_DISP>;
clocks = <&mmsys CLK_MM_MDP_RDMA0>, clocks = <&mmsys CLK_MM_MDP_RDMA0>,
<&mmsys CLK_MM_MDP_RSZ1>; <&mmsys CLK_MM_MDP_RSZ1>;
iommus = <&iommu>; iommus = <&iommu>;
mboxes = <&gce 20 CMDQ_THR_PRIO_LOWEST>, mboxes = <&gce 20 CMDQ_THR_PRIO_LOWEST>,
<&gce 21 CMDQ_THR_PRIO_LOWEST>; <&gce 21 CMDQ_THR_PRIO_LOWEST>;
#dma-cells = <1>;
}; };

View File

@@ -50,6 +50,9 @@ properties:
iommus: iommus:
maxItems: 1 maxItems: 1
'#dma-cells':
const: 1
required: required:
- compatible - compatible
- reg - reg
@@ -58,6 +61,7 @@ required:
- power-domains - power-domains
- clocks - clocks
- iommus - iommus
- '#dma-cells'
additionalProperties: false additionalProperties: false
@@ -68,13 +72,14 @@ examples:
#include <dt-bindings/power/mt8183-power.h> #include <dt-bindings/power/mt8183-power.h>
#include <dt-bindings/memory/mt8183-larb-port.h> #include <dt-bindings/memory/mt8183-larb-port.h>
mdp3_wrot0: mdp3-wrot0@14005000 { dma-controller@14005000 {
compatible = "mediatek,mt8183-mdp3-wrot"; compatible = "mediatek,mt8183-mdp3-wrot";
reg = <0x14005000 0x1000>; reg = <0x14005000 0x1000>;
mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x5000 0x1000>; mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x5000 0x1000>;
mediatek,gce-events = <CMDQ_EVENT_MDP_WROT0_SOF>, mediatek,gce-events = <CMDQ_EVENT_MDP_WROT0_SOF>,
<CMDQ_EVENT_MDP_WROT0_EOF>; <CMDQ_EVENT_MDP_WROT0_EOF>;
power-domains = <&spm MT8183_POWER_DOMAIN_DISP>; power-domains = <&spm MT8183_POWER_DOMAIN_DISP>;
clocks = <&mmsys CLK_MM_MDP_WROT0>; clocks = <&mmsys CLK_MM_MDP_WROT0>;
iommus = <&iommu>; iommus = <&iommu>;
#dma-cells = <1>;
}; };

View File

@@ -90,15 +90,16 @@ properties:
description: connection point for input on the parallel interface description: connection point for input on the parallel interface
properties: properties:
bus-type:
enum: [5, 6]
endpoint: endpoint:
$ref: video-interfaces.yaml# $ref: video-interfaces.yaml#
unevaluatedProperties: false unevaluatedProperties: false
required: properties:
- bus-type bus-type:
enum: [5, 6]
required:
- bus-type
anyOf: anyOf:
- required: - required:

View File

@@ -83,19 +83,9 @@ this to include other types of resources like doorbells.
Client Drivers Client Drivers
-------------- --------------
A client driver typically only has to conditionally change its DMA map A client driver only has to use the mapping API :c:func:`dma_map_sg()`
routine to use the mapping function :c:func:`pci_p2pdma_map_sg()` instead and :c:func:`dma_unmap_sg()` functions as usual, and the implementation
of the usual :c:func:`dma_map_sg()` function. Memory mapped in this will do the right thing for the P2P capable memory.
way does not need to be unmapped.
The client may also, optionally, make use of
:c:func:`is_pci_p2pdma_page()` to determine when to use the P2P mapping
functions and when to use the regular mapping functions. In some
situations, it may be more appropriate to use a flag to indicate a
given request is P2P memory and map appropriately. It is important to
ensure that struct pages that back P2P memory stay out of code that
does not have support for them as other code may treat the pages as
regular memory which may not be appropriate.
Orchestrator Drivers Orchestrator Drivers

View File

@@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 6 VERSION = 6
PATCHLEVEL = 1 PATCHLEVEL = 1
SUBLEVEL = 74 SUBLEVEL = 75
EXTRAVERSION = EXTRAVERSION =
NAME = Curry Ramen NAME = Curry Ramen

View File

@@ -750,7 +750,7 @@
xoadc: xoadc@197 { xoadc: xoadc@197 {
compatible = "qcom,pm8921-adc"; compatible = "qcom,pm8921-adc";
reg = <197>; reg = <0x197>;
interrupts-extended = <&pmicintc 78 IRQ_TYPE_EDGE_RISING>; interrupts-extended = <&pmicintc 78 IRQ_TYPE_EDGE_RISING>;
#address-cells = <2>; #address-cells = <2>;
#size-cells = <0>; #size-cells = <0>;

View File

@@ -401,7 +401,7 @@
reg = <0x0c264000 0x1000>; reg = <0x0c264000 0x1000>;
}; };
spmi_bus: qcom,spmi@c440000 { spmi_bus: spmi@c440000 {
compatible = "qcom,spmi-pmic-arb"; compatible = "qcom,spmi-pmic-arb";
reg = <0xc440000 0xd00>, reg = <0xc440000 0xd00>,
<0xc600000 0x2000000>, <0xc600000 0x2000000>,

View File

@@ -11,7 +11,7 @@
/ { / {
model = "STMicroelectronics STM32MP157A-DK1 SCMI Discovery Board"; model = "STMicroelectronics STM32MP157A-DK1 SCMI Discovery Board";
compatible = "st,stm32mp157a-dk1-scmi", "st,stm32mp157a-dk1", "st,stm32mp157"; compatible = "st,stm32mp157a-dk1-scmi", "st,stm32mp157";
reserved-memory { reserved-memory {
optee@de000000 { optee@de000000 {

View File

@@ -11,7 +11,7 @@
/ { / {
model = "STMicroelectronics STM32MP157C-DK2 SCMI Discovery Board"; model = "STMicroelectronics STM32MP157C-DK2 SCMI Discovery Board";
compatible = "st,stm32mp157c-dk2-scmi", "st,stm32mp157c-dk2", "st,stm32mp157"; compatible = "st,stm32mp157c-dk2-scmi", "st,stm32mp157";
reserved-memory { reserved-memory {
optee@de000000 { optee@de000000 {

View File

@@ -11,7 +11,7 @@
/ { / {
model = "STMicroelectronics STM32MP157C-ED1 SCMI eval daughter"; model = "STMicroelectronics STM32MP157C-ED1 SCMI eval daughter";
compatible = "st,stm32mp157c-ed1-scmi", "st,stm32mp157c-ed1", "st,stm32mp157"; compatible = "st,stm32mp157c-ed1-scmi", "st,stm32mp157";
reserved-memory { reserved-memory {
optee@fe000000 { optee@fe000000 {

View File

@@ -11,8 +11,7 @@
/ { / {
model = "STMicroelectronics STM32MP157C-EV1 SCMI eval daughter on eval mother"; model = "STMicroelectronics STM32MP157C-EV1 SCMI eval daughter on eval mother";
compatible = "st,stm32mp157c-ev1-scmi", "st,stm32mp157c-ev1", "st,stm32mp157c-ed1", compatible = "st,stm32mp157c-ev1-scmi", "st,stm32mp157c-ed1", "st,stm32mp157";
"st,stm32mp157";
reserved-memory { reserved-memory {
optee@fe000000 { optee@fe000000 {

View File

@@ -4,12 +4,14 @@ menuconfig ARCH_DAVINCI
bool "TI DaVinci" bool "TI DaVinci"
depends on ARCH_MULTI_V5 depends on ARCH_MULTI_V5
depends on CPU_LITTLE_ENDIAN depends on CPU_LITTLE_ENDIAN
select CPU_ARM926T
select DAVINCI_TIMER select DAVINCI_TIMER
select ZONE_DMA select ZONE_DMA
select PM_GENERIC_DOMAINS if PM select PM_GENERIC_DOMAINS if PM
select PM_GENERIC_DOMAINS_OF if PM && OF select PM_GENERIC_DOMAINS_OF if PM && OF
select REGMAP_MMIO select REGMAP_MMIO
select RESET_CONTROLLER select RESET_CONTROLLER
select PINCTRL
select PINCTRL_SINGLE select PINCTRL_SINGLE
if ARCH_DAVINCI if ARCH_DAVINCI

View File

@@ -1303,7 +1303,7 @@
assigned-clocks = <&clk IMX8MM_CLK_GPU3D_CORE>, assigned-clocks = <&clk IMX8MM_CLK_GPU3D_CORE>,
<&clk IMX8MM_GPU_PLL_OUT>; <&clk IMX8MM_GPU_PLL_OUT>;
assigned-clock-parents = <&clk IMX8MM_GPU_PLL_OUT>; assigned-clock-parents = <&clk IMX8MM_GPU_PLL_OUT>;
assigned-clock-rates = <0>, <1000000000>; assigned-clock-rates = <0>, <800000000>;
power-domains = <&pgc_gpu>; power-domains = <&pgc_gpu>;
}; };
@@ -1318,7 +1318,7 @@
assigned-clocks = <&clk IMX8MM_CLK_GPU2D_CORE>, assigned-clocks = <&clk IMX8MM_CLK_GPU2D_CORE>,
<&clk IMX8MM_GPU_PLL_OUT>; <&clk IMX8MM_GPU_PLL_OUT>;
assigned-clock-parents = <&clk IMX8MM_GPU_PLL_OUT>; assigned-clock-parents = <&clk IMX8MM_GPU_PLL_OUT>;
assigned-clock-rates = <0>, <1000000000>; assigned-clock-rates = <0>, <800000000>;
power-domains = <&pgc_gpu>; power-domains = <&pgc_gpu>;
}; };

View File

@@ -25,9 +25,6 @@
gpios = <&gpio28 0 0>; gpios = <&gpio28 0 0>;
regulators { regulators {
#address-cells = <1>;
#size-cells = <0>;
ldo3: ldo3 { /* HDMI */ ldo3: ldo3 { /* HDMI */
regulator-name = "ldo3"; regulator-name = "ldo3";
regulator-min-microvolt = <1500000>; regulator-min-microvolt = <1500000>;

View File

@@ -130,7 +130,7 @@
compatible = "microchip,mcp7940x"; compatible = "microchip,mcp7940x";
reg = <0x6f>; reg = <0x6f>;
interrupt-parent = <&gpiosb>; interrupt-parent = <&gpiosb>;
interrupts = <5 0>; /* GPIO2_5 */ interrupts = <5 IRQ_TYPE_EDGE_FALLING>; /* GPIO2_5 */
}; };
}; };

View File

@@ -1586,7 +1586,7 @@
mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0 0x1000>; mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0 0x1000>;
}; };
mdp3-rdma0@14001000 { dma-controller0@14001000 {
compatible = "mediatek,mt8183-mdp3-rdma"; compatible = "mediatek,mt8183-mdp3-rdma";
reg = <0 0x14001000 0 0x1000>; reg = <0 0x14001000 0 0x1000>;
mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x1000 0x1000>; mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x1000 0x1000>;
@@ -1598,6 +1598,7 @@
iommus = <&iommu M4U_PORT_MDP_RDMA0>; iommus = <&iommu M4U_PORT_MDP_RDMA0>;
mboxes = <&gce 20 CMDQ_THR_PRIO_LOWEST 0>, mboxes = <&gce 20 CMDQ_THR_PRIO_LOWEST 0>,
<&gce 21 CMDQ_THR_PRIO_LOWEST 0>; <&gce 21 CMDQ_THR_PRIO_LOWEST 0>;
#dma-cells = <1>;
}; };
mdp3-rsz0@14003000 { mdp3-rsz0@14003000 {
@@ -1618,7 +1619,7 @@
clocks = <&mmsys CLK_MM_MDP_RSZ1>; clocks = <&mmsys CLK_MM_MDP_RSZ1>;
}; };
mdp3-wrot0@14005000 { dma-controller@14005000 {
compatible = "mediatek,mt8183-mdp3-wrot"; compatible = "mediatek,mt8183-mdp3-wrot";
reg = <0 0x14005000 0 0x1000>; reg = <0 0x14005000 0 0x1000>;
mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x5000 0x1000>; mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x5000 0x1000>;
@@ -1627,6 +1628,7 @@
power-domains = <&spm MT8183_POWER_DOMAIN_DISP>; power-domains = <&spm MT8183_POWER_DOMAIN_DISP>;
clocks = <&mmsys CLK_MM_MDP_WROT0>; clocks = <&mmsys CLK_MM_MDP_WROT0>;
iommus = <&iommu M4U_PORT_MDP_WROT0>; iommus = <&iommu M4U_PORT_MDP_WROT0>;
#dma-cells = <1>;
}; };
mdp3-wdma@14006000 { mdp3-wdma@14006000 {

View File

@@ -146,7 +146,7 @@
ranges; ranges;
rpm_msg_ram: memory@60000 { rpm_msg_ram: memory@60000 {
reg = <0x0 0x60000 0x0 0x6000>; reg = <0x0 0x00060000 0x0 0x6000>;
no-map; no-map;
}; };
@@ -181,7 +181,7 @@
prng: qrng@e1000 { prng: qrng@e1000 {
compatible = "qcom,prng-ee"; compatible = "qcom,prng-ee";
reg = <0x0 0xe3000 0x0 0x1000>; reg = <0x0 0x000e3000 0x0 0x1000>;
clocks = <&gcc GCC_PRNG_AHB_CLK>; clocks = <&gcc GCC_PRNG_AHB_CLK>;
clock-names = "core"; clock-names = "core";
}; };
@@ -201,8 +201,8 @@
compatible = "qcom,crypto-v5.1"; compatible = "qcom,crypto-v5.1";
reg = <0x0 0x0073a000 0x0 0x6000>; reg = <0x0 0x0073a000 0x0 0x6000>;
clocks = <&gcc GCC_CRYPTO_AHB_CLK>, clocks = <&gcc GCC_CRYPTO_AHB_CLK>,
<&gcc GCC_CRYPTO_AXI_CLK>, <&gcc GCC_CRYPTO_AXI_CLK>,
<&gcc GCC_CRYPTO_CLK>; <&gcc GCC_CRYPTO_CLK>;
clock-names = "iface", "bus", "core"; clock-names = "iface", "bus", "core";
dmas = <&cryptobam 2>, <&cryptobam 3>; dmas = <&cryptobam 2>, <&cryptobam 3>;
dma-names = "rx", "tx"; dma-names = "rx", "tx";
@@ -272,7 +272,7 @@
reg = <0x0 0x078b1000 0x0 0x200>; reg = <0x0 0x078b1000 0x0 0x200>;
interrupts = <GIC_SPI 306 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 306 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&gcc GCC_BLSP1_UART3_APPS_CLK>, clocks = <&gcc GCC_BLSP1_UART3_APPS_CLK>,
<&gcc GCC_BLSP1_AHB_CLK>; <&gcc GCC_BLSP1_AHB_CLK>;
clock-names = "core", "iface"; clock-names = "core", "iface";
status = "disabled"; status = "disabled";
}; };
@@ -285,7 +285,7 @@
interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>;
spi-max-frequency = <50000000>; spi-max-frequency = <50000000>;
clocks = <&gcc GCC_BLSP1_QUP1_SPI_APPS_CLK>, clocks = <&gcc GCC_BLSP1_QUP1_SPI_APPS_CLK>,
<&gcc GCC_BLSP1_AHB_CLK>; <&gcc GCC_BLSP1_AHB_CLK>;
clock-names = "core", "iface"; clock-names = "core", "iface";
dmas = <&blsp_dma 12>, <&blsp_dma 13>; dmas = <&blsp_dma 12>, <&blsp_dma 13>;
dma-names = "tx", "rx"; dma-names = "tx", "rx";
@@ -300,7 +300,7 @@
interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
spi-max-frequency = <50000000>; spi-max-frequency = <50000000>;
clocks = <&gcc GCC_BLSP1_QUP2_SPI_APPS_CLK>, clocks = <&gcc GCC_BLSP1_QUP2_SPI_APPS_CLK>,
<&gcc GCC_BLSP1_AHB_CLK>; <&gcc GCC_BLSP1_AHB_CLK>;
clock-names = "core", "iface"; clock-names = "core", "iface";
dmas = <&blsp_dma 14>, <&blsp_dma 15>; dmas = <&blsp_dma 14>, <&blsp_dma 15>;
dma-names = "tx", "rx"; dma-names = "tx", "rx";
@@ -358,8 +358,8 @@
clock-names = "core", "aon"; clock-names = "core", "aon";
dmas = <&qpic_bam 0>, dmas = <&qpic_bam 0>,
<&qpic_bam 1>, <&qpic_bam 1>,
<&qpic_bam 2>; <&qpic_bam 2>;
dma-names = "tx", "rx", "cmd"; dma-names = "tx", "rx", "cmd";
pinctrl-0 = <&qpic_pins>; pinctrl-0 = <&qpic_pins>;
pinctrl-names = "default"; pinctrl-names = "default";
@@ -372,10 +372,10 @@
#size-cells = <2>; #size-cells = <2>;
interrupt-controller; interrupt-controller;
#interrupt-cells = <0x3>; #interrupt-cells = <0x3>;
reg = <0x0 0x0b000000 0x0 0x1000>, /*GICD*/ reg = <0x0 0x0b000000 0x0 0x1000>, /*GICD*/
<0x0 0x0b002000 0x0 0x1000>, /*GICC*/ <0x0 0x0b002000 0x0 0x1000>, /*GICC*/
<0x0 0x0b001000 0x0 0x1000>, /*GICH*/ <0x0 0x0b001000 0x0 0x1000>, /*GICH*/
<0x0 0x0b004000 0x0 0x1000>; /*GICV*/ <0x0 0x0b004000 0x0 0x1000>; /*GICV*/
interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
ranges = <0 0 0 0xb00a000 0 0xffd>; ranges = <0 0 0 0xb00a000 0 0xffd>;
@@ -388,7 +388,7 @@
pcie_phy: phy@84000 { pcie_phy: phy@84000 {
compatible = "qcom,ipq6018-qmp-pcie-phy"; compatible = "qcom,ipq6018-qmp-pcie-phy";
reg = <0x0 0x84000 0x0 0x1bc>; /* Serdes PLL */ reg = <0x0 0x00084000 0x0 0x1bc>; /* Serdes PLL */
status = "disabled"; status = "disabled";
#address-cells = <2>; #address-cells = <2>;
#size-cells = <2>; #size-cells = <2>;
@@ -404,9 +404,10 @@
"common"; "common";
pcie_phy0: phy@84200 { pcie_phy0: phy@84200 {
reg = <0x0 0x84200 0x0 0x16c>, /* Serdes Tx */ reg = <0x0 0x00084200 0x0 0x16c>, /* Serdes Tx */
<0x0 0x84400 0x0 0x200>, /* Serdes Rx */ <0x0 0x00084400 0x0 0x200>, /* Serdes Rx */
<0x0 0x84800 0x0 0x4f4>; /* PCS: Lane0, COM, PCIE */ <0x0 0x00084800 0x0 0x1f0>, /* PCS: Lane0, COM, PCIE */
<0x0 0x00084c00 0x0 0xf4>; /* pcs_misc */
#phy-cells = <0>; #phy-cells = <0>;
clocks = <&gcc GCC_PCIE0_PIPE_CLK>; clocks = <&gcc GCC_PCIE0_PIPE_CLK>;
@@ -628,7 +629,7 @@
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
compatible = "qcom,ipq6018-mdio", "qcom,ipq4019-mdio"; compatible = "qcom,ipq6018-mdio", "qcom,ipq4019-mdio";
reg = <0x0 0x90000 0x0 0x64>; reg = <0x0 0x00090000 0x0 0x64>;
clocks = <&gcc GCC_MDIO_AHB_CLK>; clocks = <&gcc GCC_MDIO_AHB_CLK>;
clock-names = "gcc_mdio_ahb_clk"; clock-names = "gcc_mdio_ahb_clk";
status = "disabled"; status = "disabled";
@@ -636,7 +637,7 @@
qusb_phy_1: qusb@59000 { qusb_phy_1: qusb@59000 {
compatible = "qcom,ipq6018-qusb2-phy"; compatible = "qcom,ipq6018-qusb2-phy";
reg = <0x0 0x059000 0x0 0x180>; reg = <0x0 0x00059000 0x0 0x180>;
#phy-cells = <0>; #phy-cells = <0>;
clocks = <&gcc GCC_USB1_PHY_CFG_AHB_CLK>, clocks = <&gcc GCC_USB1_PHY_CFG_AHB_CLK>,
@@ -668,23 +669,23 @@
status = "disabled"; status = "disabled";
dwc_1: usb@7000000 { dwc_1: usb@7000000 {
compatible = "snps,dwc3"; compatible = "snps,dwc3";
reg = <0x0 0x7000000 0x0 0xcd00>; reg = <0x0 0x07000000 0x0 0xcd00>;
interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
phys = <&qusb_phy_1>; phys = <&qusb_phy_1>;
phy-names = "usb2-phy"; phy-names = "usb2-phy";
tx-fifo-resize; tx-fifo-resize;
snps,is-utmi-l1-suspend; snps,is-utmi-l1-suspend;
snps,hird-threshold = /bits/ 8 <0x0>; snps,hird-threshold = /bits/ 8 <0x0>;
snps,dis_u2_susphy_quirk; snps,dis_u2_susphy_quirk;
snps,dis_u3_susphy_quirk; snps,dis_u3_susphy_quirk;
dr_mode = "host"; dr_mode = "host";
}; };
}; };
ssphy_0: ssphy@78000 { ssphy_0: ssphy@78000 {
compatible = "qcom,ipq6018-qmp-usb3-phy"; compatible = "qcom,ipq6018-qmp-usb3-phy";
reg = <0x0 0x78000 0x0 0x1C4>; reg = <0x0 0x00078000 0x0 0x1c4>;
#address-cells = <2>; #address-cells = <2>;
#size-cells = <2>; #size-cells = <2>;
ranges; ranges;
@@ -701,7 +702,7 @@
usb0_ssphy: phy@78200 { usb0_ssphy: phy@78200 {
reg = <0x0 0x00078200 0x0 0x130>, /* Tx */ reg = <0x0 0x00078200 0x0 0x130>, /* Tx */
<0x0 0x00078400 0x0 0x200>, /* Rx */ <0x0 0x00078400 0x0 0x200>, /* Rx */
<0x0 0x00078800 0x0 0x1F8>, /* PCS */ <0x0 0x00078800 0x0 0x1f8>, /* PCS */
<0x0 0x00078600 0x0 0x044>; /* PCS misc */ <0x0 0x00078600 0x0 0x044>; /* PCS misc */
#phy-cells = <0>; #phy-cells = <0>;
#clock-cells = <0>; #clock-cells = <0>;
@@ -713,7 +714,7 @@
qusb_phy_0: qusb@79000 { qusb_phy_0: qusb@79000 {
compatible = "qcom,ipq6018-qusb2-phy"; compatible = "qcom,ipq6018-qusb2-phy";
reg = <0x0 0x079000 0x0 0x180>; reg = <0x0 0x00079000 0x0 0x180>;
#phy-cells = <0>; #phy-cells = <0>;
clocks = <&gcc GCC_USB0_PHY_CFG_AHB_CLK>, clocks = <&gcc GCC_USB0_PHY_CFG_AHB_CLK>,
@@ -726,7 +727,7 @@
usb3: usb@8af8800 { usb3: usb@8af8800 {
compatible = "qcom,ipq6018-dwc3", "qcom,dwc3"; compatible = "qcom,ipq6018-dwc3", "qcom,dwc3";
reg = <0x0 0x8AF8800 0x0 0x400>; reg = <0x0 0x8af8800 0x0 0x400>;
#address-cells = <2>; #address-cells = <2>;
#size-cells = <2>; #size-cells = <2>;
ranges; ranges;
@@ -745,14 +746,14 @@
<&gcc GCC_USB0_MOCK_UTMI_CLK>; <&gcc GCC_USB0_MOCK_UTMI_CLK>;
assigned-clock-rates = <133330000>, assigned-clock-rates = <133330000>,
<133330000>, <133330000>,
<20000000>; <24000000>;
resets = <&gcc GCC_USB0_BCR>; resets = <&gcc GCC_USB0_BCR>;
status = "disabled"; status = "disabled";
dwc_0: usb@8a00000 { dwc_0: usb@8a00000 {
compatible = "snps,dwc3"; compatible = "snps,dwc3";
reg = <0x0 0x8A00000 0x0 0xcd00>; reg = <0x0 0x8a00000 0x0 0xcd00>;
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
phys = <&qusb_phy_0>, <&usb0_ssphy>; phys = <&qusb_phy_0>, <&usb0_ssphy>;
phy-names = "usb2-phy", "usb3-phy"; phy-names = "usb2-phy", "usb3-phy";

View File

@@ -63,8 +63,8 @@
function = LED_FUNCTION_INDICATOR; function = LED_FUNCTION_INDICATOR;
color = <LED_COLOR_ID_GREEN>; color = <LED_COLOR_ID_GREEN>;
gpios = <&pm8150_gpios 10 GPIO_ACTIVE_HIGH>; gpios = <&pm8150_gpios 10 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "panic-indicator";
default-state = "off"; default-state = "off";
panic-indicator;
}; };
led-wlan { led-wlan {

View File

@@ -3378,7 +3378,7 @@
compatible = "qcom,apss-wdt-sc7180", "qcom,kpss-wdt"; compatible = "qcom,apss-wdt-sc7180", "qcom,kpss-wdt";
reg = <0 0x17c10000 0 0x1000>; reg = <0 0x17c10000 0 0x1000>;
clocks = <&sleep_clk>; clocks = <&sleep_clk>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 0 IRQ_TYPE_EDGE_RISING>;
}; };
timer@17c20000{ timer@17c20000{

View File

@@ -56,6 +56,26 @@
}; };
}; };
&lpass_aon {
status = "okay";
};
&lpass_core {
status = "okay";
};
&lpass_hm {
status = "okay";
};
&lpasscc {
status = "okay";
};
&pdc_reset {
status = "okay";
};
/* The PMIC PON code isn't compatible w/ how Chrome EC/BIOS handle things. */ /* The PMIC PON code isn't compatible w/ how Chrome EC/BIOS handle things. */
&pmk8350_pon { &pmk8350_pon {
status = "disabled"; status = "disabled";
@@ -93,6 +113,10 @@
reg = <0x0 0x9c900000 0x0 0x800000>; reg = <0x0 0x9c900000 0x0 0x800000>;
}; };
&watchdog {
status = "okay";
};
&wifi { &wifi {
status = "okay"; status = "okay";

View File

@@ -888,6 +888,7 @@
bus-width = <8>; bus-width = <8>;
supports-cqe; supports-cqe;
dma-coherent;
qcom,dll-config = <0x0007642c>; qcom,dll-config = <0x0007642c>;
qcom,ddr-config = <0x80040868>; qcom,ddr-config = <0x80040868>;
@@ -2187,6 +2188,7 @@
clocks = <&gcc GCC_CFG_NOC_LPASS_CLK>; clocks = <&gcc GCC_CFG_NOC_LPASS_CLK>;
clock-names = "iface"; clock-names = "iface";
#clock-cells = <1>; #clock-cells = <1>;
status = "reserved"; /* Owned by ADSP firmware */
}; };
lpass_rx_macro: codec@3200000 { lpass_rx_macro: codec@3200000 {
@@ -2339,6 +2341,7 @@
clock-names = "bi_tcxo", "bi_tcxo_ao", "iface"; clock-names = "bi_tcxo", "bi_tcxo_ao", "iface";
#clock-cells = <1>; #clock-cells = <1>;
#power-domain-cells = <1>; #power-domain-cells = <1>;
status = "reserved"; /* Owned by ADSP firmware */
}; };
lpass_core: clock-controller@3900000 { lpass_core: clock-controller@3900000 {
@@ -2349,6 +2352,7 @@
power-domains = <&lpass_hm LPASS_CORE_CC_LPASS_CORE_HM_GDSC>; power-domains = <&lpass_hm LPASS_CORE_CC_LPASS_CORE_HM_GDSC>;
#clock-cells = <1>; #clock-cells = <1>;
#power-domain-cells = <1>; #power-domain-cells = <1>;
status = "reserved"; /* Owned by ADSP firmware */
}; };
lpass_cpu: audio@3987000 { lpass_cpu: audio@3987000 {
@@ -2419,6 +2423,7 @@
clock-names = "bi_tcxo"; clock-names = "bi_tcxo";
#clock-cells = <1>; #clock-cells = <1>;
#power-domain-cells = <1>; #power-domain-cells = <1>;
status = "reserved"; /* Owned by ADSP firmware */
}; };
lpass_ag_noc: interconnect@3c40000 { lpass_ag_noc: interconnect@3c40000 {
@@ -2529,7 +2534,8 @@
"cx_mem", "cx_mem",
"cx_dbgc"; "cx_dbgc";
interrupts = <GIC_SPI 300 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 300 IRQ_TYPE_LEVEL_HIGH>;
iommus = <&adreno_smmu 0 0x401>; iommus = <&adreno_smmu 0 0x400>,
<&adreno_smmu 1 0x400>;
operating-points-v2 = <&gpu_opp_table>; operating-points-v2 = <&gpu_opp_table>;
qcom,gmu = <&gmu>; qcom,gmu = <&gmu>;
interconnects = <&gem_noc MASTER_GFX3D 0 &mc_virt SLAVE_EBI1 0>; interconnects = <&gem_noc MASTER_GFX3D 0 &mc_virt SLAVE_EBI1 0>;
@@ -2696,6 +2702,7 @@
"gpu_cc_hub_aon_clk"; "gpu_cc_hub_aon_clk";
power-domains = <&gpucc GPU_CC_CX_GDSC>; power-domains = <&gpucc GPU_CC_CX_GDSC>;
dma-coherent;
}; };
remoteproc_mpss: remoteproc@4080000 { remoteproc_mpss: remoteproc@4080000 {
@@ -3265,6 +3272,7 @@
operating-points-v2 = <&sdhc2_opp_table>; operating-points-v2 = <&sdhc2_opp_table>;
bus-width = <4>; bus-width = <4>;
dma-coherent;
qcom,dll-config = <0x0007642c>; qcom,dll-config = <0x0007642c>;
@@ -3386,8 +3394,8 @@
assigned-clock-rates = <19200000>, <200000000>; assigned-clock-rates = <19200000>, <200000000>;
interrupts-extended = <&intc GIC_SPI 240 IRQ_TYPE_LEVEL_HIGH>, interrupts-extended = <&intc GIC_SPI 240 IRQ_TYPE_LEVEL_HIGH>,
<&pdc 12 IRQ_TYPE_EDGE_RISING>, <&pdc 12 IRQ_TYPE_EDGE_BOTH>,
<&pdc 13 IRQ_TYPE_EDGE_RISING>; <&pdc 13 IRQ_TYPE_EDGE_BOTH>;
interrupt-names = "hs_phy_irq", interrupt-names = "hs_phy_irq",
"dp_hs_phy_irq", "dp_hs_phy_irq",
"dm_hs_phy_irq"; "dm_hs_phy_irq";
@@ -4195,6 +4203,7 @@
compatible = "qcom,sc7280-pdc-global"; compatible = "qcom,sc7280-pdc-global";
reg = <0 0x0b5e0000 0 0x20000>; reg = <0 0x0b5e0000 0 0x20000>;
#reset-cells = <1>; #reset-cells = <1>;
status = "reserved"; /* Owned by firmware */
}; };
tsens0: thermal-sensor@c263000 { tsens0: thermal-sensor@c263000 {
@@ -5186,11 +5195,12 @@
}; };
}; };
watchdog@17c10000 { watchdog: watchdog@17c10000 {
compatible = "qcom,apss-wdt-sc7280", "qcom,kpss-wdt"; compatible = "qcom,apss-wdt-sc7280", "qcom,kpss-wdt";
reg = <0 0x17c10000 0 0x1000>; reg = <0 0x17c10000 0 0x1000>;
clocks = <&sleep_clk>; clocks = <&sleep_clk>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 0 IRQ_TYPE_EDGE_RISING>;
status = "reserved"; /* Owned by Gunyah hyp */
}; };
timer@17c20000 { timer@17c20000 {

View File

@@ -1653,7 +1653,7 @@
compatible = "qcom,apss-wdt-sc8280xp", "qcom,kpss-wdt"; compatible = "qcom,apss-wdt-sc8280xp", "qcom,kpss-wdt";
reg = <0 0x17c10000 0 0x1000>; reg = <0 0x17c10000 0 0x1000>;
clocks = <&sleep_clk>; clocks = <&sleep_clk>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 0 IRQ_TYPE_EDGE_RISING>;
}; };
timer@17c20000 { timer@17c20000 {

View File

@@ -66,8 +66,8 @@
function = LED_FUNCTION_INDICATOR; function = LED_FUNCTION_INDICATOR;
color = <LED_COLOR_ID_GREEN>; color = <LED_COLOR_ID_GREEN>;
gpios = <&pm8998_gpio 13 GPIO_ACTIVE_HIGH>; gpios = <&pm8998_gpio 13 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "panic-indicator";
default-state = "off"; default-state = "off";
panic-indicator;
}; };
led-1 { led-1 {

View File

@@ -5019,7 +5019,7 @@
compatible = "qcom,apss-wdt-sdm845", "qcom,kpss-wdt"; compatible = "qcom,apss-wdt-sdm845", "qcom,kpss-wdt";
reg = <0 0x17980000 0 0x1000>; reg = <0 0x17980000 0 0x1000>;
clocks = <&sleep_clk>; clocks = <&sleep_clk>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 0 IRQ_TYPE_EDGE_RISING>;
}; };
apss_shared: mailbox@17990000 { apss_shared: mailbox@17990000 {

View File

@@ -1462,7 +1462,7 @@
compatible = "qcom,apss-wdt-sm6350", "qcom,kpss-wdt"; compatible = "qcom,apss-wdt-sm6350", "qcom,kpss-wdt";
reg = <0 0x17c10000 0 0x1000>; reg = <0 0x17c10000 0 0x1000>;
clocks = <&sleep_clk>; clocks = <&sleep_clk>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 0 IRQ_TYPE_EDGE_RISING>;
}; };
timer@17c20000 { timer@17c20000 {

View File

@@ -126,8 +126,6 @@
vdda_sp_sensor: vdda_sp_sensor:
vdda_ufs_2ln_core_1: vdda_ufs_2ln_core_1:
vdda_ufs_2ln_core_2: vdda_ufs_2ln_core_2:
vdda_usb_ss_dp_core_1:
vdda_usb_ss_dp_core_2:
vdda_qlink_lv: vdda_qlink_lv:
vdda_qlink_lv_ck: vdda_qlink_lv_ck:
vreg_l5a_0p875: ldo5 { vreg_l5a_0p875: ldo5 {
@@ -209,6 +207,12 @@
regulator-max-microvolt = <3008000>; regulator-max-microvolt = <3008000>;
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>; regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
}; };
vreg_l18a_0p8: ldo18 {
regulator-min-microvolt = <880000>;
regulator-max-microvolt = <880000>;
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
};
}; };
pm8150l-rpmh-regulators { pm8150l-rpmh-regulators {
@@ -439,13 +443,13 @@
&usb_1_qmpphy { &usb_1_qmpphy {
status = "okay"; status = "okay";
vdda-phy-supply = <&vreg_l3c_1p2>; vdda-phy-supply = <&vreg_l3c_1p2>;
vdda-pll-supply = <&vdda_usb_ss_dp_core_1>; vdda-pll-supply = <&vreg_l18a_0p8>;
}; };
&usb_2_qmpphy { &usb_2_qmpphy {
status = "okay"; status = "okay";
vdda-phy-supply = <&vreg_l3c_1p2>; vdda-phy-supply = <&vreg_l3c_1p2>;
vdda-pll-supply = <&vdda_usb_ss_dp_core_1>; vdda-pll-supply = <&vreg_l5a_0p875>;
}; };
&usb_1 { &usb_1 {

View File

@@ -3940,7 +3940,7 @@
compatible = "qcom,apss-wdt-sm8150", "qcom,kpss-wdt"; compatible = "qcom,apss-wdt-sm8150", "qcom,kpss-wdt";
reg = <0 0x17c10000 0 0x1000>; reg = <0 0x17c10000 0 0x1000>;
clocks = <&sleep_clk>; clocks = <&sleep_clk>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 0 IRQ_TYPE_EDGE_RISING>;
}; };
timer@17c20000 { timer@17c20000 {

View File

@@ -4879,7 +4879,7 @@
compatible = "qcom,apss-wdt-sm8250", "qcom,kpss-wdt"; compatible = "qcom,apss-wdt-sm8250", "qcom,kpss-wdt";
reg = <0 0x17c10000 0 0x1000>; reg = <0 0x17c10000 0 0x1000>;
clocks = <&sleep_clk>; clocks = <&sleep_clk>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 0 IRQ_TYPE_EDGE_RISING>;
}; };
timer@17c20000 { timer@17c20000 {

View File

@@ -903,9 +903,9 @@
}; };
}; };
gpi_dma0: dma-controller@9800000 { gpi_dma0: dma-controller@900000 {
compatible = "qcom,sm8350-gpi-dma", "qcom,sm6350-gpi-dma"; compatible = "qcom,sm8350-gpi-dma", "qcom,sm6350-gpi-dma";
reg = <0 0x09800000 0 0x60000>; reg = <0 0x00900000 0 0x60000>;
interrupts = <GIC_SPI 244 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 244 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 245 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 245 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 246 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 246 IRQ_TYPE_LEVEL_HIGH>,

View File

@@ -125,6 +125,9 @@
}; };
&hscif0 { &hscif0 {
pinctrl-0 = <&hscif0_pins>;
pinctrl-names = "default";
status = "okay"; status = "okay";
}; };

View File

@@ -245,7 +245,7 @@
<193>, <194>, <195>; <193>, <194>, <195>;
interrupt-controller; interrupt-controller;
#interrupt-cells = <2>; #interrupt-cells = <2>;
ti,ngpio = <87>; ti,ngpio = <92>;
ti,davinci-gpio-unbanked = <0>; ti,davinci-gpio-unbanked = <0>;
power-domains = <&k3_pds 77 TI_SCI_PD_EXCLUSIVE>; power-domains = <&k3_pds 77 TI_SCI_PD_EXCLUSIVE>;
clocks = <&k3_clks 77 0>; clocks = <&k3_clks 77 0>;
@@ -263,7 +263,7 @@
<183>, <184>, <185>; <183>, <184>, <185>;
interrupt-controller; interrupt-controller;
#interrupt-cells = <2>; #interrupt-cells = <2>;
ti,ngpio = <88>; ti,ngpio = <52>;
ti,davinci-gpio-unbanked = <0>; ti,davinci-gpio-unbanked = <0>;
power-domains = <&k3_pds 78 TI_SCI_PD_EXCLUSIVE>; power-domains = <&k3_pds 78 TI_SCI_PD_EXCLUSIVE>;
clocks = <&k3_clks 78 0>; clocks = <&k3_clks 78 0>;

View File

@@ -856,7 +856,7 @@
assigned-clocks = <&k3_clks 67 2>; assigned-clocks = <&k3_clks 67 2>;
assigned-clock-parents = <&k3_clks 67 5>; assigned-clock-parents = <&k3_clks 67 5>;
interrupts = <GIC_SPI 166 IRQ_TYPE_EDGE_RISING>; interrupts = <GIC_SPI 166 IRQ_TYPE_LEVEL_HIGH>;
dma-coherent; dma-coherent;

View File

@@ -584,7 +584,11 @@ static struct vgic_irq *vgic_its_check_cache(struct kvm *kvm, phys_addr_t db,
unsigned long flags; unsigned long flags;
raw_spin_lock_irqsave(&dist->lpi_list_lock, flags); raw_spin_lock_irqsave(&dist->lpi_list_lock, flags);
irq = __vgic_its_check_cache(dist, db, devid, eventid); irq = __vgic_its_check_cache(dist, db, devid, eventid);
if (irq)
vgic_get_irq_kref(irq);
raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags); raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
return irq; return irq;
@@ -763,6 +767,7 @@ int vgic_its_inject_cached_translation(struct kvm *kvm, struct kvm_msi *msi)
raw_spin_lock_irqsave(&irq->irq_lock, flags); raw_spin_lock_irqsave(&irq->irq_lock, flags);
irq->pending_latch = true; irq->pending_latch = true;
vgic_queue_irq_unlock(kvm, irq, flags); vgic_queue_irq_unlock(kvm, irq, flags);
vgic_put_irq(kvm, irq);
return 0; return 0;
} }

View File

@@ -365,19 +365,26 @@ static int vgic_v3_uaccess_write_pending(struct kvm_vcpu *vcpu,
struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
raw_spin_lock_irqsave(&irq->irq_lock, flags); raw_spin_lock_irqsave(&irq->irq_lock, flags);
if (test_bit(i, &val)) {
/* /*
* pending_latch is set irrespective of irq type * pending_latch is set irrespective of irq type
* (level or edge) to avoid dependency that VM should * (level or edge) to avoid dependency that VM should
* restore irq config before pending info. * restore irq config before pending info.
*/ */
irq->pending_latch = true; irq->pending_latch = test_bit(i, &val);
vgic_queue_irq_unlock(vcpu->kvm, irq, flags);
} else { if (irq->hw && vgic_irq_is_sgi(irq->intid)) {
irq_set_irqchip_state(irq->host_irq,
IRQCHIP_STATE_PENDING,
irq->pending_latch);
irq->pending_latch = false; irq->pending_latch = false;
raw_spin_unlock_irqrestore(&irq->irq_lock, flags);
} }
if (irq->pending_latch)
vgic_queue_irq_unlock(vcpu->kvm, irq, flags);
else
raw_spin_unlock_irqrestore(&irq->irq_lock, flags);
vgic_put_irq(vcpu->kvm, irq); vgic_put_irq(vcpu->kvm, irq);
} }

View File

@@ -43,5 +43,10 @@ label:
return true; return true;
} }
enum jump_label_type;
void arch_jump_label_transform_static(struct jump_entry *entry,
enum jump_label_type type);
#define arch_jump_label_transform_static arch_jump_label_transform_static
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __ASM_CSKY_JUMP_LABEL_H */ #endif /* __ASM_CSKY_JUMP_LABEL_H */

View File

@@ -241,8 +241,6 @@ void loongarch_dump_regs64(u64 *uregs, const struct pt_regs *regs);
do { \ do { \
current->thread.vdso = &vdso_info; \ current->thread.vdso = &vdso_info; \
\ \
loongarch_set_personality_fcsr(state); \
\
if (personality(current->personality) != PER_LINUX) \ if (personality(current->personality) != PER_LINUX) \
set_personality(PER_LINUX); \ set_personality(PER_LINUX); \
} while (0) } while (0)
@@ -259,7 +257,6 @@ do { \
clear_thread_flag(TIF_32BIT_ADDR); \ clear_thread_flag(TIF_32BIT_ADDR); \
\ \
current->thread.vdso = &vdso_info; \ current->thread.vdso = &vdso_info; \
loongarch_set_personality_fcsr(state); \
\ \
p = personality(current->personality); \ p = personality(current->personality); \
if (p != PER_LINUX32 && p != PER_LINUX) \ if (p != PER_LINUX32 && p != PER_LINUX) \
@@ -340,6 +337,4 @@ extern int arch_elf_pt_proc(void *ehdr, void *phdr, struct file *elf,
extern int arch_check_elf(void *ehdr, bool has_interpreter, void *interp_ehdr, extern int arch_check_elf(void *ehdr, bool has_interpreter, void *interp_ehdr,
struct arch_elf_state *state); struct arch_elf_state *state);
extern void loongarch_set_personality_fcsr(struct arch_elf_state *state);
#endif /* _ASM_ELF_H */ #endif /* _ASM_ELF_H */

View File

@@ -23,8 +23,3 @@ int arch_check_elf(void *_ehdr, bool has_interpreter, void *_interp_ehdr,
{ {
return 0; return 0;
} }
void loongarch_set_personality_fcsr(struct arch_elf_state *state)
{
current->thread.fpu.fcsr = boot_cpu_data.fpu_csr0;
}

View File

@@ -82,6 +82,7 @@ void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp)
euen = regs->csr_euen & ~(CSR_EUEN_FPEN); euen = regs->csr_euen & ~(CSR_EUEN_FPEN);
regs->csr_euen = euen; regs->csr_euen = euen;
lose_fpu(0); lose_fpu(0);
current->thread.fpu.fcsr = boot_cpu_data.fpu_csr0;
clear_thread_flag(TIF_LSX_CTX_LIVE); clear_thread_flag(TIF_LSX_CTX_LIVE);
clear_thread_flag(TIF_LASX_CTX_LIVE); clear_thread_flag(TIF_LASX_CTX_LIVE);

View File

@@ -402,7 +402,6 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
const u8 dst = regmap[insn->dst_reg]; const u8 dst = regmap[insn->dst_reg];
const s16 off = insn->off; const s16 off = insn->off;
const s32 imm = insn->imm; const s32 imm = insn->imm;
const u64 imm64 = (u64)(insn + 1)->imm << 32 | (u32)insn->imm;
const bool is32 = BPF_CLASS(insn->code) == BPF_ALU || BPF_CLASS(insn->code) == BPF_JMP32; const bool is32 = BPF_CLASS(insn->code) == BPF_ALU || BPF_CLASS(insn->code) == BPF_JMP32;
switch (code) { switch (code) {
@@ -806,8 +805,12 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
/* dst = imm64 */ /* dst = imm64 */
case BPF_LD | BPF_IMM | BPF_DW: case BPF_LD | BPF_IMM | BPF_DW:
{
const u64 imm64 = (u64)(insn + 1)->imm << 32 | (u32)insn->imm;
move_imm(ctx, dst, imm64, is32); move_imm(ctx, dst, imm64, is32);
return 1; return 1;
}
/* dst = *(size *)(src + off) */ /* dst = *(size *)(src + off) */
case BPF_LDX | BPF_MEM | BPF_B: case BPF_LDX | BPF_MEM | BPF_B:

View File

@@ -847,7 +847,7 @@ int __init db1200_dev_setup(void)
i2c_register_board_info(0, db1200_i2c_devs, i2c_register_board_info(0, db1200_i2c_devs,
ARRAY_SIZE(db1200_i2c_devs)); ARRAY_SIZE(db1200_i2c_devs));
spi_register_board_info(db1200_spi_devs, spi_register_board_info(db1200_spi_devs,
ARRAY_SIZE(db1200_i2c_devs)); ARRAY_SIZE(db1200_spi_devs));
/* SWITCHES: S6.8 I2C/SPI selector (OFF=I2C ON=SPI) /* SWITCHES: S6.8 I2C/SPI selector (OFF=I2C ON=SPI)
* S6.7 AC97/I2S selector (OFF=AC97 ON=I2S) * S6.7 AC97/I2S selector (OFF=AC97 ON=I2S)

View File

@@ -589,7 +589,7 @@ int __init db1550_dev_setup(void)
i2c_register_board_info(0, db1550_i2c_devs, i2c_register_board_info(0, db1550_i2c_devs,
ARRAY_SIZE(db1550_i2c_devs)); ARRAY_SIZE(db1550_i2c_devs));
spi_register_board_info(db1550_spi_devs, spi_register_board_info(db1550_spi_devs,
ARRAY_SIZE(db1550_i2c_devs)); ARRAY_SIZE(db1550_spi_devs));
c = clk_get(NULL, "psc0_intclk"); c = clk_get(NULL, "psc0_intclk");
if (!IS_ERR(c)) { if (!IS_ERR(c)) {

View File

@@ -5,7 +5,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/memblock.h> #include <linux/memblock.h>
#define dmi_early_remap(x, l) ioremap_cache(x, l) #define dmi_early_remap(x, l) ioremap(x, l)
#define dmi_early_unmap(x, l) iounmap(x) #define dmi_early_unmap(x, l) iounmap(x)
#define dmi_remap(x, l) ioremap_cache(x, l) #define dmi_remap(x, l) ioremap_cache(x, l)
#define dmi_unmap(x) iounmap(x) #define dmi_unmap(x) iounmap(x)

View File

@@ -326,11 +326,11 @@ static void __init bootmem_init(void)
panic("Incorrect memory mapping !!!"); panic("Incorrect memory mapping !!!");
if (max_pfn > PFN_DOWN(HIGHMEM_START)) { if (max_pfn > PFN_DOWN(HIGHMEM_START)) {
max_low_pfn = PFN_DOWN(HIGHMEM_START);
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
highstart_pfn = PFN_DOWN(HIGHMEM_START); highstart_pfn = max_low_pfn;
highend_pfn = max_pfn; highend_pfn = max_pfn;
#else #else
max_low_pfn = PFN_DOWN(HIGHMEM_START);
max_pfn = max_low_pfn; max_pfn = max_low_pfn;
#endif #endif
} }

View File

@@ -333,10 +333,11 @@ early_initcall(mips_smp_ipi_init);
*/ */
asmlinkage void start_secondary(void) asmlinkage void start_secondary(void)
{ {
unsigned int cpu; unsigned int cpu = raw_smp_processor_id();
cpu_probe(); cpu_probe();
per_cpu_trap_init(false); per_cpu_trap_init(false);
rcu_cpu_starting(cpu);
mips_clockevent_init(); mips_clockevent_init();
mp_ops->init_secondary(); mp_ops->init_secondary();
cpu_report(); cpu_report();
@@ -348,7 +349,6 @@ asmlinkage void start_secondary(void)
*/ */
calibrate_delay(); calibrate_delay();
cpu = smp_processor_id();
cpu_data[cpu].udelay_val = loops_per_jiffy; cpu_data[cpu].udelay_val = loops_per_jiffy;
set_cpu_sibling_map(cpu); set_cpu_sibling_map(cpu);

View File

@@ -806,6 +806,7 @@ config THREAD_SHIFT
int "Thread shift" if EXPERT int "Thread shift" if EXPERT
range 13 15 range 13 15
default "15" if PPC_256K_PAGES default "15" if PPC_256K_PAGES
default "15" if PPC_PSERIES || PPC_POWERNV
default "14" if PPC64 default "14" if PPC64
default "13" default "13"
help help

View File

@@ -42,18 +42,13 @@ machine-$(CONFIG_PPC64) += 64
machine-$(CONFIG_CPU_LITTLE_ENDIAN) += le machine-$(CONFIG_CPU_LITTLE_ENDIAN) += le
UTS_MACHINE := $(subst $(space),,$(machine-y)) UTS_MACHINE := $(subst $(space),,$(machine-y))
# XXX This needs to be before we override LD below ifeq ($(CONFIG_PPC64)$(CONFIG_LD_IS_BFD),yy)
ifdef CONFIG_PPC32
KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
else
ifeq ($(call ld-ifversion, -ge, 22500, y),y)
# Have the linker provide sfpr if possible. # Have the linker provide sfpr if possible.
# There is a corresponding test in arch/powerpc/lib/Makefile # There is a corresponding test in arch/powerpc/lib/Makefile
KBUILD_LDFLAGS_MODULE += --save-restore-funcs KBUILD_LDFLAGS_MODULE += --save-restore-funcs
else else
KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
endif endif
endif
ifdef CONFIG_CPU_LITTLE_ENDIAN ifdef CONFIG_CPU_LITTLE_ENDIAN
KBUILD_CFLAGS += -mlittle-endian KBUILD_CFLAGS += -mlittle-endian
@@ -391,17 +386,7 @@ endif
endif endif
PHONY += checkbin PHONY += checkbin
# Check toolchain versions:
# - gcc-4.6 is the minimum kernel-wide version so nothing required.
checkbin: checkbin:
@if test "x${CONFIG_LD_IS_LLD}" != "xy" -a \
"x$(call ld-ifversion, -le, 22400, y)" = "xy" ; then \
echo -n '*** binutils 2.24 miscompiles weak symbols ' ; \
echo 'in some circumstances.' ; \
echo '*** binutils 2.23 do not define the TOC symbol ' ; \
echo -n '*** Please use a different binutils version.' ; \
false ; \
fi
@if test "x${CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT}" = "xy" -a \ @if test "x${CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT}" = "xy" -a \
"x${CONFIG_LD_IS_BFD}" = "xy" -a \ "x${CONFIG_LD_IS_BFD}" = "xy" -a \
"${CONFIG_LD_VERSION}" = "23700" ; then \ "${CONFIG_LD_VERSION}" = "23700" ; then \

View File

@@ -42,8 +42,8 @@ obj-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o
# 64-bit linker creates .sfpr on demand for final link (vmlinux), # 64-bit linker creates .sfpr on demand for final link (vmlinux),
# so it is only needed for modules, and only for older linkers which # so it is only needed for modules, and only for older linkers which
# do not support --save-restore-funcs # do not support --save-restore-funcs
ifeq ($(call ld-ifversion, -lt, 22500, y),y) ifndef CONFIG_LD_IS_BFD
extra-$(CONFIG_PPC64) += crtsavres.o always-$(CONFIG_PPC64) += crtsavres.o
endif endif
obj-$(CONFIG_PPC_BOOK3S_64) += copyuser_power7.o copypage_power7.o \ obj-$(CONFIG_PPC_BOOK3S_64) += copyuser_power7.o copypage_power7.o \

View File

@@ -299,6 +299,8 @@ static int update_events_in_group(struct device_node *node, struct imc_pmu *pmu)
attr_group->attrs = attrs; attr_group->attrs = attrs;
do { do {
ev_val_str = kasprintf(GFP_KERNEL, "event=0x%x", pmu->events[i].value); ev_val_str = kasprintf(GFP_KERNEL, "event=0x%x", pmu->events[i].value);
if (!ev_val_str)
continue;
dev_str = device_str_attr_create(pmu->events[i].name, ev_val_str); dev_str = device_str_attr_create(pmu->events[i].name, ev_val_str);
if (!dev_str) if (!dev_str)
continue; continue;
@@ -306,6 +308,8 @@ static int update_events_in_group(struct device_node *node, struct imc_pmu *pmu)
attrs[j++] = dev_str; attrs[j++] = dev_str;
if (pmu->events[i].scale) { if (pmu->events[i].scale) {
ev_scale_str = kasprintf(GFP_KERNEL, "%s.scale", pmu->events[i].name); ev_scale_str = kasprintf(GFP_KERNEL, "%s.scale", pmu->events[i].name);
if (!ev_scale_str)
continue;
dev_str = device_str_attr_create(ev_scale_str, pmu->events[i].scale); dev_str = device_str_attr_create(ev_scale_str, pmu->events[i].scale);
if (!dev_str) if (!dev_str)
continue; continue;
@@ -315,6 +319,8 @@ static int update_events_in_group(struct device_node *node, struct imc_pmu *pmu)
if (pmu->events[i].unit) { if (pmu->events[i].unit) {
ev_unit_str = kasprintf(GFP_KERNEL, "%s.unit", pmu->events[i].name); ev_unit_str = kasprintf(GFP_KERNEL, "%s.unit", pmu->events[i].name);
if (!ev_unit_str)
continue;
dev_str = device_str_attr_create(ev_unit_str, pmu->events[i].unit); dev_str = device_str_attr_create(ev_unit_str, pmu->events[i].unit);
if (!dev_str) if (!dev_str)
continue; continue;

View File

@@ -173,6 +173,7 @@ config ISS4xx
config CURRITUCK config CURRITUCK
bool "IBM Currituck (476fpe) Support" bool "IBM Currituck (476fpe) Support"
depends on PPC_47x depends on PPC_47x
select I2C
select SWIOTLB select SWIOTLB
select 476FPE select 476FPE
select FORCE_PCI select FORCE_PCI

View File

@@ -275,6 +275,8 @@ int __init opal_event_init(void)
else else
name = kasprintf(GFP_KERNEL, "opal"); name = kasprintf(GFP_KERNEL, "opal");
if (!name)
continue;
/* Install interrupt handler */ /* Install interrupt handler */
rc = request_irq(r->start, opal_interrupt, r->flags & IRQD_TRIGGER_MASK, rc = request_irq(r->start, opal_interrupt, r->flags & IRQD_TRIGGER_MASK,
name, NULL); name, NULL);

View File

@@ -196,6 +196,12 @@ void __init opal_powercap_init(void)
j = 0; j = 0;
pcaps[i].pg.name = kasprintf(GFP_KERNEL, "%pOFn", node); pcaps[i].pg.name = kasprintf(GFP_KERNEL, "%pOFn", node);
if (!pcaps[i].pg.name) {
kfree(pcaps[i].pattrs);
kfree(pcaps[i].pg.attrs);
goto out_pcaps_pattrs;
}
if (has_min) { if (has_min) {
powercap_add_attr(min, "powercap-min", powercap_add_attr(min, "powercap-min",
&pcaps[i].pattrs[j]); &pcaps[i].pattrs[j]);

View File

@@ -165,6 +165,11 @@ static int scom_debug_init_one(struct dentry *root, struct device_node *dn,
ent->chip = chip; ent->chip = chip;
snprintf(ent->name, 16, "%08x", chip); snprintf(ent->name, 16, "%08x", chip);
ent->path.data = (void *)kasprintf(GFP_KERNEL, "%pOF", dn); ent->path.data = (void *)kasprintf(GFP_KERNEL, "%pOF", dn);
if (!ent->path.data) {
kfree(ent);
return -ENOMEM;
}
ent->path.size = strlen((char *)ent->path.data); ent->path.size = strlen((char *)ent->path.data);
dir = debugfs_create_dir(ent->name, root); dir = debugfs_create_dir(ent->name, root);

View File

@@ -500,14 +500,15 @@ static int dlpar_memory_remove_by_index(u32 drc_index)
} }
} }
if (!lmb_found) if (!lmb_found) {
pr_debug("Failed to look up LMB for drc index %x\n", drc_index);
rc = -EINVAL; rc = -EINVAL;
} else if (rc) {
if (rc)
pr_debug("Failed to hot-remove memory at %llx\n", pr_debug("Failed to hot-remove memory at %llx\n",
lmb->base_addr); lmb->base_addr);
else } else {
pr_debug("Memory at %llx was hot-removed\n", lmb->base_addr); pr_debug("Memory at %llx was hot-removed\n", lmb->base_addr);
}
return rc; return rc;
} }

View File

@@ -13,6 +13,7 @@ extern char _start_kernel[];
extern char __init_data_begin[], __init_data_end[]; extern char __init_data_begin[], __init_data_end[];
extern char __init_text_begin[], __init_text_end[]; extern char __init_text_begin[], __init_text_end[];
extern char __alt_start[], __alt_end[]; extern char __alt_start[], __alt_end[];
extern char __exittext_begin[], __exittext_end[];
static inline bool is_va_kernel_text(uintptr_t va) static inline bool is_va_kernel_text(uintptr_t va)
{ {

View File

@@ -13,7 +13,7 @@
add \reg, \reg, t0 add \reg, \reg, t0
.endm .endm
.macro XIP_FIXUP_FLASH_OFFSET reg .macro XIP_FIXUP_FLASH_OFFSET reg
la t1, __data_loc la t0, __data_loc
REG_L t1, _xip_phys_offset REG_L t1, _xip_phys_offset
sub \reg, \reg, t1 sub \reg, \reg, t1
add \reg, \reg, t0 add \reg, \reg, t0

View File

@@ -424,7 +424,8 @@ void *module_alloc(unsigned long size)
{ {
return __vmalloc_node_range(size, 1, MODULES_VADDR, return __vmalloc_node_range(size, 1, MODULES_VADDR,
MODULES_END, GFP_KERNEL, MODULES_END, GFP_KERNEL,
PAGE_KERNEL, 0, NUMA_NO_NODE, PAGE_KERNEL, VM_FLUSH_RESET_PERMS,
NUMA_NO_NODE,
__builtin_return_address(0)); __builtin_return_address(0));
} }
#endif #endif

View File

@@ -13,6 +13,7 @@
#include <asm/fixmap.h> #include <asm/fixmap.h>
#include <asm/ftrace.h> #include <asm/ftrace.h>
#include <asm/patch.h> #include <asm/patch.h>
#include <asm/sections.h>
struct patch_insn { struct patch_insn {
void *addr; void *addr;
@@ -23,6 +24,14 @@ struct patch_insn {
int riscv_patch_in_stop_machine = false; int riscv_patch_in_stop_machine = false;
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
static inline bool is_kernel_exittext(uintptr_t addr)
{
return system_state < SYSTEM_RUNNING &&
addr >= (uintptr_t)__exittext_begin &&
addr < (uintptr_t)__exittext_end;
}
/* /*
* The fix_to_virt(, idx) needs a const value (not a dynamic variable of * The fix_to_virt(, idx) needs a const value (not a dynamic variable of
* reg-a0) or BUILD_BUG_ON failed with "idx >= __end_of_fixed_addresses". * reg-a0) or BUILD_BUG_ON failed with "idx >= __end_of_fixed_addresses".
@@ -33,7 +42,7 @@ static __always_inline void *patch_map(void *addr, const unsigned int fixmap)
uintptr_t uintaddr = (uintptr_t) addr; uintptr_t uintaddr = (uintptr_t) addr;
struct page *page; struct page *page;
if (core_kernel_text(uintaddr)) if (core_kernel_text(uintaddr) || is_kernel_exittext(uintaddr))
page = phys_to_page(__pa_symbol(addr)); page = phys_to_page(__pa_symbol(addr));
else if (IS_ENABLED(CONFIG_STRICT_MODULE_RWX)) else if (IS_ENABLED(CONFIG_STRICT_MODULE_RWX))
page = vmalloc_to_page(addr); page = vmalloc_to_page(addr);

View File

@@ -29,10 +29,12 @@ SECTIONS
HEAD_TEXT_SECTION HEAD_TEXT_SECTION
INIT_TEXT_SECTION(PAGE_SIZE) INIT_TEXT_SECTION(PAGE_SIZE)
/* we have to discard exit text and such at runtime, not link time */ /* we have to discard exit text and such at runtime, not link time */
__exittext_begin = .;
.exit.text : .exit.text :
{ {
EXIT_TEXT EXIT_TEXT
} }
__exittext_end = .;
.text : { .text : {
_text = .; _text = .;

View File

@@ -72,10 +72,12 @@ SECTIONS
__soc_builtin_dtb_table_end = .; __soc_builtin_dtb_table_end = .;
} }
/* we have to discard exit text and such at runtime, not link time */ /* we have to discard exit text and such at runtime, not link time */
__exittext_begin = .;
.exit.text : .exit.text :
{ {
EXIT_TEXT EXIT_TEXT
} }
__exittext_end = .;
__init_text_end = .; __init_text_end = .;
. = ALIGN(SECTION_ALIGN); . = ALIGN(SECTION_ALIGN);

View File

@@ -5,6 +5,7 @@
#include <linux/pagewalk.h> #include <linux/pagewalk.h>
#include <linux/pgtable.h> #include <linux/pgtable.h>
#include <linux/vmalloc.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/bitops.h> #include <asm/bitops.h>
#include <asm/set_memory.h> #include <asm/set_memory.h>
@@ -25,19 +26,6 @@ static unsigned long set_pageattr_masks(unsigned long val, struct mm_walk *walk)
return new_val; return new_val;
} }
static int pageattr_pgd_entry(pgd_t *pgd, unsigned long addr,
unsigned long next, struct mm_walk *walk)
{
pgd_t val = READ_ONCE(*pgd);
if (pgd_leaf(val)) {
val = __pgd(set_pageattr_masks(pgd_val(val), walk));
set_pgd(pgd, val);
}
return 0;
}
static int pageattr_p4d_entry(p4d_t *p4d, unsigned long addr, static int pageattr_p4d_entry(p4d_t *p4d, unsigned long addr,
unsigned long next, struct mm_walk *walk) unsigned long next, struct mm_walk *walk)
{ {
@@ -96,7 +84,6 @@ static int pageattr_pte_hole(unsigned long addr, unsigned long next,
} }
static const struct mm_walk_ops pageattr_ops = { static const struct mm_walk_ops pageattr_ops = {
.pgd_entry = pageattr_pgd_entry,
.p4d_entry = pageattr_p4d_entry, .p4d_entry = pageattr_p4d_entry,
.pud_entry = pageattr_pud_entry, .pud_entry = pageattr_pud_entry,
.pmd_entry = pageattr_pmd_entry, .pmd_entry = pageattr_pmd_entry,
@@ -104,12 +91,181 @@ static const struct mm_walk_ops pageattr_ops = {
.pte_hole = pageattr_pte_hole, .pte_hole = pageattr_pte_hole,
}; };
#ifdef CONFIG_64BIT
static int __split_linear_mapping_pmd(pud_t *pudp,
unsigned long vaddr, unsigned long end)
{
pmd_t *pmdp;
unsigned long next;
pmdp = pmd_offset(pudp, vaddr);
do {
next = pmd_addr_end(vaddr, end);
if (next - vaddr >= PMD_SIZE &&
vaddr <= (vaddr & PMD_MASK) && end >= next)
continue;
if (pmd_leaf(*pmdp)) {
struct page *pte_page;
unsigned long pfn = _pmd_pfn(*pmdp);
pgprot_t prot = __pgprot(pmd_val(*pmdp) & ~_PAGE_PFN_MASK);
pte_t *ptep_new;
int i;
pte_page = alloc_page(GFP_KERNEL);
if (!pte_page)
return -ENOMEM;
ptep_new = (pte_t *)page_address(pte_page);
for (i = 0; i < PTRS_PER_PTE; ++i, ++ptep_new)
set_pte(ptep_new, pfn_pte(pfn + i, prot));
smp_wmb();
set_pmd(pmdp, pfn_pmd(page_to_pfn(pte_page), PAGE_TABLE));
}
} while (pmdp++, vaddr = next, vaddr != end);
return 0;
}
static int __split_linear_mapping_pud(p4d_t *p4dp,
unsigned long vaddr, unsigned long end)
{
pud_t *pudp;
unsigned long next;
int ret;
pudp = pud_offset(p4dp, vaddr);
do {
next = pud_addr_end(vaddr, end);
if (next - vaddr >= PUD_SIZE &&
vaddr <= (vaddr & PUD_MASK) && end >= next)
continue;
if (pud_leaf(*pudp)) {
struct page *pmd_page;
unsigned long pfn = _pud_pfn(*pudp);
pgprot_t prot = __pgprot(pud_val(*pudp) & ~_PAGE_PFN_MASK);
pmd_t *pmdp_new;
int i;
pmd_page = alloc_page(GFP_KERNEL);
if (!pmd_page)
return -ENOMEM;
pmdp_new = (pmd_t *)page_address(pmd_page);
for (i = 0; i < PTRS_PER_PMD; ++i, ++pmdp_new)
set_pmd(pmdp_new,
pfn_pmd(pfn + ((i * PMD_SIZE) >> PAGE_SHIFT), prot));
smp_wmb();
set_pud(pudp, pfn_pud(page_to_pfn(pmd_page), PAGE_TABLE));
}
ret = __split_linear_mapping_pmd(pudp, vaddr, next);
if (ret)
return ret;
} while (pudp++, vaddr = next, vaddr != end);
return 0;
}
static int __split_linear_mapping_p4d(pgd_t *pgdp,
unsigned long vaddr, unsigned long end)
{
p4d_t *p4dp;
unsigned long next;
int ret;
p4dp = p4d_offset(pgdp, vaddr);
do {
next = p4d_addr_end(vaddr, end);
/*
* If [vaddr; end] contains [vaddr & P4D_MASK; next], we don't
* need to split, we'll change the protections on the whole P4D.
*/
if (next - vaddr >= P4D_SIZE &&
vaddr <= (vaddr & P4D_MASK) && end >= next)
continue;
if (p4d_leaf(*p4dp)) {
struct page *pud_page;
unsigned long pfn = _p4d_pfn(*p4dp);
pgprot_t prot = __pgprot(p4d_val(*p4dp) & ~_PAGE_PFN_MASK);
pud_t *pudp_new;
int i;
pud_page = alloc_page(GFP_KERNEL);
if (!pud_page)
return -ENOMEM;
/*
* Fill the pud level with leaf puds that have the same
* protections as the leaf p4d.
*/
pudp_new = (pud_t *)page_address(pud_page);
for (i = 0; i < PTRS_PER_PUD; ++i, ++pudp_new)
set_pud(pudp_new,
pfn_pud(pfn + ((i * PUD_SIZE) >> PAGE_SHIFT), prot));
/*
* Make sure the pud filling is not reordered with the
* p4d store which could result in seeing a partially
* filled pud level.
*/
smp_wmb();
set_p4d(p4dp, pfn_p4d(page_to_pfn(pud_page), PAGE_TABLE));
}
ret = __split_linear_mapping_pud(p4dp, vaddr, next);
if (ret)
return ret;
} while (p4dp++, vaddr = next, vaddr != end);
return 0;
}
static int __split_linear_mapping_pgd(pgd_t *pgdp,
unsigned long vaddr,
unsigned long end)
{
unsigned long next;
int ret;
do {
next = pgd_addr_end(vaddr, end);
/* We never use PGD mappings for the linear mapping */
ret = __split_linear_mapping_p4d(pgdp, vaddr, next);
if (ret)
return ret;
} while (pgdp++, vaddr = next, vaddr != end);
return 0;
}
static int split_linear_mapping(unsigned long start, unsigned long end)
{
return __split_linear_mapping_pgd(pgd_offset_k(start), start, end);
}
#endif /* CONFIG_64BIT */
static int __set_memory(unsigned long addr, int numpages, pgprot_t set_mask, static int __set_memory(unsigned long addr, int numpages, pgprot_t set_mask,
pgprot_t clear_mask) pgprot_t clear_mask)
{ {
int ret; int ret;
unsigned long start = addr; unsigned long start = addr;
unsigned long end = start + PAGE_SIZE * numpages; unsigned long end = start + PAGE_SIZE * numpages;
unsigned long __maybe_unused lm_start;
unsigned long __maybe_unused lm_end;
struct pageattr_masks masks = { struct pageattr_masks masks = {
.set_mask = set_mask, .set_mask = set_mask,
.clear_mask = clear_mask .clear_mask = clear_mask
@@ -119,11 +275,72 @@ static int __set_memory(unsigned long addr, int numpages, pgprot_t set_mask,
return 0; return 0;
mmap_write_lock(&init_mm); mmap_write_lock(&init_mm);
#ifdef CONFIG_64BIT
/*
* We are about to change the permissions of a kernel mapping, we must
* apply the same changes to its linear mapping alias, which may imply
* splitting a huge mapping.
*/
if (is_vmalloc_or_module_addr((void *)start)) {
struct vm_struct *area = NULL;
int i, page_start;
area = find_vm_area((void *)start);
page_start = (start - (unsigned long)area->addr) >> PAGE_SHIFT;
for (i = page_start; i < page_start + numpages; ++i) {
lm_start = (unsigned long)page_address(area->pages[i]);
lm_end = lm_start + PAGE_SIZE;
ret = split_linear_mapping(lm_start, lm_end);
if (ret)
goto unlock;
ret = walk_page_range_novma(&init_mm, lm_start, lm_end,
&pageattr_ops, NULL, &masks);
if (ret)
goto unlock;
}
} else if (is_kernel_mapping(start) || is_linear_mapping(start)) {
if (is_kernel_mapping(start)) {
lm_start = (unsigned long)lm_alias(start);
lm_end = (unsigned long)lm_alias(end);
} else {
lm_start = start;
lm_end = end;
}
ret = split_linear_mapping(lm_start, lm_end);
if (ret)
goto unlock;
ret = walk_page_range_novma(&init_mm, lm_start, lm_end,
&pageattr_ops, NULL, &masks);
if (ret)
goto unlock;
}
ret = walk_page_range_novma(&init_mm, start, end, &pageattr_ops, NULL, ret = walk_page_range_novma(&init_mm, start, end, &pageattr_ops, NULL,
&masks); &masks);
unlock:
mmap_write_unlock(&init_mm);
/*
* We can't use flush_tlb_kernel_range() here as we may have split a
* hugepage that is larger than that, so let's flush everything.
*/
flush_tlb_all();
#else
ret = walk_page_range_novma(&init_mm, start, end, &pageattr_ops, NULL,
&masks);
mmap_write_unlock(&init_mm); mmap_write_unlock(&init_mm);
flush_tlb_kernel_range(start, end); flush_tlb_kernel_range(start, end);
#endif
return ret; return ret;
} }
@@ -158,36 +375,14 @@ int set_memory_nx(unsigned long addr, int numpages)
int set_direct_map_invalid_noflush(struct page *page) int set_direct_map_invalid_noflush(struct page *page)
{ {
int ret; return __set_memory((unsigned long)page_address(page), 1,
unsigned long start = (unsigned long)page_address(page); __pgprot(0), __pgprot(_PAGE_PRESENT));
unsigned long end = start + PAGE_SIZE;
struct pageattr_masks masks = {
.set_mask = __pgprot(0),
.clear_mask = __pgprot(_PAGE_PRESENT)
};
mmap_read_lock(&init_mm);
ret = walk_page_range(&init_mm, start, end, &pageattr_ops, &masks);
mmap_read_unlock(&init_mm);
return ret;
} }
int set_direct_map_default_noflush(struct page *page) int set_direct_map_default_noflush(struct page *page)
{ {
int ret; return __set_memory((unsigned long)page_address(page), 1,
unsigned long start = (unsigned long)page_address(page); PAGE_KERNEL, __pgprot(_PAGE_EXEC));
unsigned long end = start + PAGE_SIZE;
struct pageattr_masks masks = {
.set_mask = PAGE_KERNEL,
.clear_mask = __pgprot(0)
};
mmap_read_lock(&init_mm);
ret = walk_page_range(&init_mm, start, end, &pageattr_ops, &masks);
mmap_read_unlock(&init_mm);
return ret;
} }
#ifdef CONFIG_DEBUG_PAGEALLOC #ifdef CONFIG_DEBUG_PAGEALLOC

View File

@@ -11,6 +11,8 @@
/* I/O size constraints */ /* I/O size constraints */
#define ZPCI_MAX_READ_SIZE 8 #define ZPCI_MAX_READ_SIZE 8
#define ZPCI_MAX_WRITE_SIZE 128 #define ZPCI_MAX_WRITE_SIZE 128
#define ZPCI_BOUNDARY_SIZE (1 << 12)
#define ZPCI_BOUNDARY_MASK (ZPCI_BOUNDARY_SIZE - 1)
/* I/O Map */ /* I/O Map */
#define ZPCI_IOMAP_SHIFT 48 #define ZPCI_IOMAP_SHIFT 48
@@ -125,16 +127,18 @@ out:
int zpci_write_block(volatile void __iomem *dst, const void *src, int zpci_write_block(volatile void __iomem *dst, const void *src,
unsigned long len); unsigned long len);
static inline u8 zpci_get_max_write_size(u64 src, u64 dst, int len, int max) static inline int zpci_get_max_io_size(u64 src, u64 dst, int len, int max)
{ {
int count = len > max ? max : len, size = 1; int offset = dst & ZPCI_BOUNDARY_MASK;
int size;
while (!(src & 0x1) && !(dst & 0x1) && ((size << 1) <= count)) { size = min3(len, ZPCI_BOUNDARY_SIZE - offset, max);
dst = dst >> 1; if (IS_ALIGNED(src, 8) && IS_ALIGNED(dst, 8) && IS_ALIGNED(size, 8))
src = src >> 1; return size;
size = size << 1;
} if (size >= 8)
return size; return 8;
return rounddown_pow_of_two(size);
} }
static inline int zpci_memcpy_fromio(void *dst, static inline int zpci_memcpy_fromio(void *dst,
@@ -144,9 +148,9 @@ static inline int zpci_memcpy_fromio(void *dst,
int size, rc = 0; int size, rc = 0;
while (n > 0) { while (n > 0) {
size = zpci_get_max_write_size((u64 __force) src, size = zpci_get_max_io_size((u64 __force) src,
(u64) dst, n, (u64) dst, n,
ZPCI_MAX_READ_SIZE); ZPCI_MAX_READ_SIZE);
rc = zpci_read_single(dst, src, size); rc = zpci_read_single(dst, src, size);
if (rc) if (rc)
break; break;
@@ -166,9 +170,9 @@ static inline int zpci_memcpy_toio(volatile void __iomem *dst,
return -EINVAL; return -EINVAL;
while (n > 0) { while (n > 0) {
size = zpci_get_max_write_size((u64 __force) dst, size = zpci_get_max_io_size((u64 __force) dst,
(u64) src, n, (u64) src, n,
ZPCI_MAX_WRITE_SIZE); ZPCI_MAX_WRITE_SIZE);
if (size > 8) /* main path */ if (size > 8) /* main path */
rc = zpci_write_block(dst, src, size); rc = zpci_write_block(dst, src, size);
else else

View File

@@ -97,9 +97,9 @@ static inline int __memcpy_toio_inuser(void __iomem *dst,
return -EINVAL; return -EINVAL;
while (n > 0) { while (n > 0) {
size = zpci_get_max_write_size((u64 __force) dst, size = zpci_get_max_io_size((u64 __force) dst,
(u64 __force) src, n, (u64 __force) src, n,
ZPCI_MAX_WRITE_SIZE); ZPCI_MAX_WRITE_SIZE);
if (size > 8) /* main path */ if (size > 8) /* main path */
rc = __pcistb_mio_inuser(dst, src, size, &status); rc = __pcistb_mio_inuser(dst, src, size, &status);
else else
@@ -242,9 +242,9 @@ static inline int __memcpy_fromio_inuser(void __user *dst,
u8 status; u8 status;
while (n > 0) { while (n > 0) {
size = zpci_get_max_write_size((u64 __force) src, size = zpci_get_max_io_size((u64 __force) src,
(u64 __force) dst, n, (u64 __force) dst, n,
ZPCI_MAX_READ_SIZE); ZPCI_MAX_READ_SIZE);
rc = __pcilg_mio_inuser(dst, src, size, &status); rc = __pcilg_mio_inuser(dst, src, size, &status);
if (rc) if (rc)
break; break;

View File

@@ -747,6 +747,7 @@ static void check_hw_inj_possible(void)
wrmsrl_safe(mca_msr_reg(bank, MCA_STATUS), status); wrmsrl_safe(mca_msr_reg(bank, MCA_STATUS), status);
rdmsrl_safe(mca_msr_reg(bank, MCA_STATUS), &status); rdmsrl_safe(mca_msr_reg(bank, MCA_STATUS), &status);
wrmsrl_safe(mca_msr_reg(bank, MCA_STATUS), 0);
if (!status) { if (!status) {
hw_injection_possible = false; hw_injection_possible = false;

View File

@@ -24,8 +24,8 @@
static int kvmclock __initdata = 1; static int kvmclock __initdata = 1;
static int kvmclock_vsyscall __initdata = 1; static int kvmclock_vsyscall __initdata = 1;
static int msr_kvm_system_time __ro_after_init = MSR_KVM_SYSTEM_TIME; static int msr_kvm_system_time __ro_after_init;
static int msr_kvm_wall_clock __ro_after_init = MSR_KVM_WALL_CLOCK; static int msr_kvm_wall_clock __ro_after_init;
static u64 kvm_sched_clock_offset __ro_after_init; static u64 kvm_sched_clock_offset __ro_after_init;
static int __init parse_no_kvmclock(char *arg) static int __init parse_no_kvmclock(char *arg)
@@ -195,7 +195,8 @@ static void kvm_setup_secondary_clock(void)
void kvmclock_disable(void) void kvmclock_disable(void)
{ {
native_write_msr(msr_kvm_system_time, 0, 0); if (msr_kvm_system_time)
native_write_msr(msr_kvm_system_time, 0, 0);
} }
static void __init kvmclock_init_mem(void) static void __init kvmclock_init_mem(void)
@@ -294,7 +295,10 @@ void __init kvmclock_init(void)
if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE2)) { if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE2)) {
msr_kvm_system_time = MSR_KVM_SYSTEM_TIME_NEW; msr_kvm_system_time = MSR_KVM_SYSTEM_TIME_NEW;
msr_kvm_wall_clock = MSR_KVM_WALL_CLOCK_NEW; msr_kvm_wall_clock = MSR_KVM_WALL_CLOCK_NEW;
} else if (!kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE)) { } else if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE)) {
msr_kvm_system_time = MSR_KVM_SYSTEM_TIME;
msr_kvm_wall_clock = MSR_KVM_WALL_CLOCK;
} else {
return; return;
} }

View File

@@ -6,7 +6,7 @@
*/ */
int num_digits(int val) int num_digits(int val)
{ {
int m = 10; long long m = 10;
int d = 1; int d = 1;
if (val < 0) { if (val < 0) {

View File

@@ -1109,13 +1109,22 @@ bool bio_add_folio(struct bio *bio, struct folio *folio, size_t len,
void __bio_release_pages(struct bio *bio, bool mark_dirty) void __bio_release_pages(struct bio *bio, bool mark_dirty)
{ {
struct bvec_iter_all iter_all; struct folio_iter fi;
struct bio_vec *bvec;
bio_for_each_segment_all(bvec, bio, iter_all) { bio_for_each_folio_all(fi, bio) {
if (mark_dirty && !PageCompound(bvec->bv_page)) struct page *page;
set_page_dirty_lock(bvec->bv_page); size_t done = 0;
put_page(bvec->bv_page);
if (mark_dirty) {
folio_lock(fi.folio);
folio_mark_dirty(fi.folio);
folio_unlock(fi.folio);
}
page = folio_page(fi.folio, fi.offset / PAGE_SIZE);
do {
folio_put(fi.folio);
done += PAGE_SIZE;
} while (done < fi.length);
} }
} }
EXPORT_SYMBOL_GPL(__bio_release_pages); EXPORT_SYMBOL_GPL(__bio_release_pages);
@@ -1414,12 +1423,12 @@ EXPORT_SYMBOL(bio_free_pages);
*/ */
void bio_set_pages_dirty(struct bio *bio) void bio_set_pages_dirty(struct bio *bio)
{ {
struct bio_vec *bvec; struct folio_iter fi;
struct bvec_iter_all iter_all;
bio_for_each_segment_all(bvec, bio, iter_all) { bio_for_each_folio_all(fi, bio) {
if (!PageCompound(bvec->bv_page)) folio_lock(fi.folio);
set_page_dirty_lock(bvec->bv_page); folio_mark_dirty(fi.folio);
folio_unlock(fi.folio);
} }
} }
@@ -1462,12 +1471,11 @@ static void bio_dirty_fn(struct work_struct *work)
void bio_check_pages_dirty(struct bio *bio) void bio_check_pages_dirty(struct bio *bio)
{ {
struct bio_vec *bvec; struct folio_iter fi;
unsigned long flags; unsigned long flags;
struct bvec_iter_all iter_all;
bio_for_each_segment_all(bvec, bio, iter_all) { bio_for_each_folio_all(fi, bio) {
if (!PageDirty(bvec->bv_page) && !PageCompound(bvec->bv_page)) if (!folio_test_dirty(fi.folio))
goto defer; goto defer;
} }

View File

@@ -2946,12 +2946,6 @@ void blk_mq_submit_bio(struct bio *bio)
blk_status_t ret; blk_status_t ret;
bio = blk_queue_bounce(bio, q); bio = blk_queue_bounce(bio, q);
if (bio_may_exceed_limits(bio, &q->limits)) {
bio = __bio_split_to_limits(bio, &q->limits, &nr_segs);
if (!bio)
return;
}
bio_set_ioprio(bio); bio_set_ioprio(bio);
if (plug) { if (plug) {
@@ -2960,6 +2954,11 @@ void blk_mq_submit_bio(struct bio *bio)
rq = NULL; rq = NULL;
} }
if (rq) { if (rq) {
if (unlikely(bio_may_exceed_limits(bio, &q->limits))) {
bio = __bio_split_to_limits(bio, &q->limits, &nr_segs);
if (!bio)
return;
}
if (!bio_integrity_prep(bio)) if (!bio_integrity_prep(bio))
return; return;
if (blk_mq_attempt_bio_merge(q, bio, nr_segs)) if (blk_mq_attempt_bio_merge(q, bio, nr_segs))
@@ -2970,6 +2969,11 @@ void blk_mq_submit_bio(struct bio *bio)
} else { } else {
if (unlikely(bio_queue_enter(bio))) if (unlikely(bio_queue_enter(bio)))
return; return;
if (unlikely(bio_may_exceed_limits(bio, &q->limits))) {
bio = __bio_split_to_limits(bio, &q->limits, &nr_segs);
if (!bio)
goto fail;
}
if (!bio_integrity_prep(bio)) if (!bio_integrity_prep(bio))
goto fail; goto fail;
} }

View File

@@ -135,7 +135,7 @@ void blk_queue_max_hw_sectors(struct request_queue *q, unsigned int max_hw_secto
limits->max_hw_sectors = max_hw_sectors; limits->max_hw_sectors = max_hw_sectors;
max_sectors = min_not_zero(max_hw_sectors, limits->max_dev_sectors); max_sectors = min_not_zero(max_hw_sectors, limits->max_dev_sectors);
max_sectors = min_t(unsigned int, max_sectors, BLK_DEF_MAX_SECTORS); max_sectors = min(max_sectors, BLK_DEF_MAX_SECTORS);
max_sectors = round_down(max_sectors, max_sectors = round_down(max_sectors,
limits->logical_block_size >> SECTOR_SHIFT); limits->logical_block_size >> SECTOR_SHIFT);
limits->max_sectors = max_sectors; limits->max_sectors = max_sectors;

View File

@@ -444,7 +444,9 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
DISK_MAX_PARTS); DISK_MAX_PARTS);
disk->minors = DISK_MAX_PARTS; disk->minors = DISK_MAX_PARTS;
} }
if (disk->first_minor + disk->minors > MINORMASK + 1) if (disk->first_minor > MINORMASK ||
disk->minors > MINORMASK + 1 ||
disk->first_minor + disk->minors > MINORMASK + 1)
goto out_exit_elevator; goto out_exit_elevator;
} else { } else {
if (WARN_ON(disk->minors)) if (WARN_ON(disk->minors))
@@ -567,6 +569,7 @@ out_del_integrity:
out_del_block_link: out_del_block_link:
if (!sysfs_deprecated) if (!sysfs_deprecated)
sysfs_remove_link(block_depr, dev_name(ddev)); sysfs_remove_link(block_depr, dev_name(ddev));
pm_runtime_set_memalloc_noio(ddev, false);
out_device_del: out_device_del:
device_del(ddev); device_del(ddev);
out_free_ext_minor: out_free_ext_minor:

View File

@@ -18,7 +18,7 @@ static int blkpg_do_ioctl(struct block_device *bdev,
{ {
struct gendisk *disk = bdev->bd_disk; struct gendisk *disk = bdev->bd_disk;
struct blkpg_partition p; struct blkpg_partition p;
long long start, length; sector_t start, length;
if (disk->flags & GENHD_FL_NO_PART) if (disk->flags & GENHD_FL_NO_PART)
return -EINVAL; return -EINVAL;
@@ -35,14 +35,17 @@ static int blkpg_do_ioctl(struct block_device *bdev,
if (op == BLKPG_DEL_PARTITION) if (op == BLKPG_DEL_PARTITION)
return bdev_del_partition(disk, p.pno); return bdev_del_partition(disk, p.pno);
if (p.start < 0 || p.length <= 0 || p.start + p.length < 0)
return -EINVAL;
/* Check that the partition is aligned to the block size */
if (!IS_ALIGNED(p.start | p.length, bdev_logical_block_size(bdev)))
return -EINVAL;
start = p.start >> SECTOR_SHIFT; start = p.start >> SECTOR_SHIFT;
length = p.length >> SECTOR_SHIFT; length = p.length >> SECTOR_SHIFT;
switch (op) { switch (op) {
case BLKPG_ADD_PARTITION: case BLKPG_ADD_PARTITION:
/* check if partition is aligned to blocksize */
if (p.start & (bdev_logical_block_size(bdev) - 1))
return -EINVAL;
return bdev_add_partition(disk, p.pno, start, length); return bdev_add_partition(disk, p.pno, start, length);
case BLKPG_RESIZE_PARTITION: case BLKPG_RESIZE_PARTITION:
return bdev_resize_partition(disk, p.pno, start, length); return bdev_resize_partition(disk, p.pno, start, length);

View File

@@ -1045,9 +1045,13 @@ EXPORT_SYMBOL_GPL(af_alg_sendpage);
void af_alg_free_resources(struct af_alg_async_req *areq) void af_alg_free_resources(struct af_alg_async_req *areq)
{ {
struct sock *sk = areq->sk; struct sock *sk = areq->sk;
struct af_alg_ctx *ctx;
af_alg_free_areq_sgls(areq); af_alg_free_areq_sgls(areq);
sock_kfree_s(sk, areq, areq->areqlen); sock_kfree_s(sk, areq, areq->areqlen);
ctx = alg_sk(sk)->private;
ctx->inflight = false;
} }
EXPORT_SYMBOL_GPL(af_alg_free_resources); EXPORT_SYMBOL_GPL(af_alg_free_resources);
@@ -1117,11 +1121,19 @@ EXPORT_SYMBOL_GPL(af_alg_poll);
struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk, struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk,
unsigned int areqlen) unsigned int areqlen)
{ {
struct af_alg_async_req *areq = sock_kmalloc(sk, areqlen, GFP_KERNEL); struct af_alg_ctx *ctx = alg_sk(sk)->private;
struct af_alg_async_req *areq;
/* Only one AIO request can be in flight. */
if (ctx->inflight)
return ERR_PTR(-EBUSY);
areq = sock_kmalloc(sk, areqlen, GFP_KERNEL);
if (unlikely(!areq)) if (unlikely(!areq))
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
ctx->inflight = true;
areq->areqlen = areqlen; areq->areqlen = areqlen;
areq->sk = sk; areq->sk = sk;
areq->last_rsgl = NULL; areq->last_rsgl = NULL;

View File

@@ -124,6 +124,7 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
struct crypto_scomp *scomp = *tfm_ctx; struct crypto_scomp *scomp = *tfm_ctx;
void **ctx = acomp_request_ctx(req); void **ctx = acomp_request_ctx(req);
struct scomp_scratch *scratch; struct scomp_scratch *scratch;
unsigned int dlen;
int ret; int ret;
if (!req->src || !req->slen || req->slen > SCOMP_SCRATCH_SIZE) if (!req->src || !req->slen || req->slen > SCOMP_SCRATCH_SIZE)
@@ -135,6 +136,8 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
if (!req->dlen || req->dlen > SCOMP_SCRATCH_SIZE) if (!req->dlen || req->dlen > SCOMP_SCRATCH_SIZE)
req->dlen = SCOMP_SCRATCH_SIZE; req->dlen = SCOMP_SCRATCH_SIZE;
dlen = req->dlen;
scratch = raw_cpu_ptr(&scomp_scratch); scratch = raw_cpu_ptr(&scomp_scratch);
spin_lock(&scratch->lock); spin_lock(&scratch->lock);
@@ -152,6 +155,9 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
} }
} else if (req->dlen > dlen) {
ret = -ENOSPC;
goto out;
} }
scatterwalk_map_and_copy(scratch->dst, req->dst, 0, req->dlen, scatterwalk_map_and_copy(scratch->dst, req->dst, 0, req->dlen,
1); 1);

View File

@@ -145,9 +145,14 @@ static int extlog_print(struct notifier_block *nb, unsigned long val,
static u32 err_seq; static u32 err_seq;
estatus = extlog_elog_entry_check(cpu, bank); estatus = extlog_elog_entry_check(cpu, bank);
if (estatus == NULL || (mce->kflags & MCE_HANDLED_CEC)) if (!estatus)
return NOTIFY_DONE; return NOTIFY_DONE;
if (mce->kflags & MCE_HANDLED_CEC) {
estatus->block_status = 0;
return NOTIFY_DONE;
}
memcpy(elog_buf, (void *)estatus, ELOG_ENTRY_LEN); memcpy(elog_buf, (void *)estatus, ELOG_ENTRY_LEN);
/* clear record status to enable BIOS to update it again */ /* clear record status to enable BIOS to update it again */
estatus->block_status = 0; estatus->block_status = 0;

View File

@@ -98,7 +98,7 @@ static void lpit_update_residency(struct lpit_residency_info *info,
struct acpi_lpit_native *lpit_native) struct acpi_lpit_native *lpit_native)
{ {
info->frequency = lpit_native->counter_frequency ? info->frequency = lpit_native->counter_frequency ?
lpit_native->counter_frequency : tsc_khz * 1000; lpit_native->counter_frequency : mul_u32_u32(tsc_khz, 1000U);
if (!info->frequency) if (!info->frequency)
info->frequency = 1; info->frequency = 1;

View File

@@ -450,8 +450,9 @@ static int register_device_clock(struct acpi_device *adev,
if (!clk_name) if (!clk_name)
return -ENOMEM; return -ENOMEM;
clk = clk_register_fractional_divider(NULL, clk_name, parent, clk = clk_register_fractional_divider(NULL, clk_name, parent,
0, prv_base, 1, 15, 16, 15,
CLK_FRAC_DIVIDER_POWER_OF_TWO_PS, CLK_FRAC_DIVIDER_POWER_OF_TWO_PS,
prv_base, 1, 15, 16, 15, 0, NULL); NULL);
parent = clk_name; parent = clk_name;
clk_name = kasprintf(GFP_KERNEL, "%s-update", devname); clk_name = kasprintf(GFP_KERNEL, "%s-update", devname);

View File

@@ -1726,12 +1726,12 @@ static void acpi_video_dev_register_backlight(struct acpi_video_device *device)
return; return;
count++; count++;
acpi_get_parent(device->dev->handle, &acpi_parent); if (ACPI_SUCCESS(acpi_get_parent(device->dev->handle, &acpi_parent))) {
pdev = acpi_get_pci_dev(acpi_parent);
pdev = acpi_get_pci_dev(acpi_parent); if (pdev) {
if (pdev) { parent = &pdev->dev;
parent = &pdev->dev; pci_dev_put(pdev);
pci_dev_put(pdev); }
} }
memset(&props, 0, sizeof(struct backlight_properties)); memset(&props, 0, sizeof(struct backlight_properties));

View File

@@ -851,6 +851,7 @@ static int acpi_get_ref_args(struct fwnode_reference_args *args,
* @index: Index of the reference to return * @index: Index of the reference to return
* @num_args: Maximum number of arguments after each reference * @num_args: Maximum number of arguments after each reference
* @args: Location to store the returned reference with optional arguments * @args: Location to store the returned reference with optional arguments
* (may be NULL)
* *
* Find property with @name, verifify that it is a package containing at least * Find property with @name, verifify that it is a package containing at least
* one object reference and if so, store the ACPI device object pointer to the * one object reference and if so, store the ACPI device object pointer to the
@@ -907,6 +908,9 @@ int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
if (!device) if (!device)
return -EINVAL; return -EINVAL;
if (!args)
return 0;
args->fwnode = acpi_fwnode_handle(device); args->fwnode = acpi_fwnode_handle(device);
args->nargs = 0; args->nargs = 0;
return 0; return 0;

View File

@@ -271,7 +271,7 @@ static int binder_update_page_range(struct binder_alloc *alloc, int allocate,
} }
if (mm) { if (mm) {
mmap_write_unlock(mm); mmap_write_unlock(mm);
mmput(mm); mmput_async(mm);
} }
return 0; return 0;
@@ -304,7 +304,7 @@ err_page_ptr_cleared:
err_no_vma: err_no_vma:
if (mm) { if (mm) {
mmap_write_unlock(mm); mmap_write_unlock(mm);
mmput(mm); mmput_async(mm);
} }
return vma ? -ENOMEM : -ESRCH; return vma ? -ENOMEM : -ESRCH;
} }
@@ -344,8 +344,7 @@ static bool debug_low_async_space_locked(struct binder_alloc *alloc, int pid)
continue; continue;
if (!buffer->async_transaction) if (!buffer->async_transaction)
continue; continue;
total_alloc_size += binder_alloc_buffer_size(alloc, buffer) total_alloc_size += binder_alloc_buffer_size(alloc, buffer);
+ sizeof(struct binder_buffer);
num_buffers++; num_buffers++;
} }
@@ -407,17 +406,17 @@ static struct binder_buffer *binder_alloc_new_buf_locked(
alloc->pid, extra_buffers_size); alloc->pid, extra_buffers_size);
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
if (is_async &&
alloc->free_async_space < size + sizeof(struct binder_buffer)) { /* Pad 0-size buffers so they get assigned unique addresses */
size = max(size, sizeof(void *));
if (is_async && alloc->free_async_space < size) {
binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
"%d: binder_alloc_buf size %zd failed, no async space left\n", "%d: binder_alloc_buf size %zd failed, no async space left\n",
alloc->pid, size); alloc->pid, size);
return ERR_PTR(-ENOSPC); return ERR_PTR(-ENOSPC);
} }
/* Pad 0-size buffers so they get assigned unique addresses */
size = max(size, sizeof(void *));
while (n) { while (n) {
buffer = rb_entry(n, struct binder_buffer, rb_node); buffer = rb_entry(n, struct binder_buffer, rb_node);
BUG_ON(!buffer->free); BUG_ON(!buffer->free);
@@ -519,7 +518,7 @@ static struct binder_buffer *binder_alloc_new_buf_locked(
buffer->pid = pid; buffer->pid = pid;
buffer->oneway_spam_suspect = false; buffer->oneway_spam_suspect = false;
if (is_async) { if (is_async) {
alloc->free_async_space -= size + sizeof(struct binder_buffer); alloc->free_async_space -= size;
binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC,
"%d: binder_alloc_buf size %zd async free %zd\n", "%d: binder_alloc_buf size %zd async free %zd\n",
alloc->pid, size, alloc->free_async_space); alloc->pid, size, alloc->free_async_space);
@@ -657,8 +656,7 @@ static void binder_free_buf_locked(struct binder_alloc *alloc,
BUG_ON(buffer->user_data > alloc->buffer + alloc->buffer_size); BUG_ON(buffer->user_data > alloc->buffer + alloc->buffer_size);
if (buffer->async_transaction) { if (buffer->async_transaction) {
alloc->free_async_space += buffer_size + sizeof(struct binder_buffer); alloc->free_async_space += buffer_size;
binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC,
"%d: binder_free_buf size %zd async free %zd\n", "%d: binder_free_buf size %zd async free %zd\n",
alloc->pid, size, alloc->free_async_space); alloc->pid, size, alloc->free_async_space);

View File

@@ -859,11 +859,15 @@ int __register_one_node(int nid)
{ {
int error; int error;
int cpu; int cpu;
struct node *node;
node_devices[nid] = kzalloc(sizeof(struct node), GFP_KERNEL); node = kzalloc(sizeof(struct node), GFP_KERNEL);
if (!node_devices[nid]) if (!node)
return -ENOMEM; return -ENOMEM;
INIT_LIST_HEAD(&node->access_list);
node_devices[nid] = node;
error = register_node(node_devices[nid], nid); error = register_node(node_devices[nid], nid);
/* link cpu under this node */ /* link cpu under this node */
@@ -872,7 +876,6 @@ int __register_one_node(int nid)
register_cpu_under_node(cpu, nid); register_cpu_under_node(cpu, nid);
} }
INIT_LIST_HEAD(&node_devices[nid]->access_list);
node_init_caches(nid); node_init_caches(nid);
return error; return error;

View File

@@ -541,6 +541,9 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
if (nargs > NR_FWNODE_REFERENCE_ARGS) if (nargs > NR_FWNODE_REFERENCE_ARGS)
return -EINVAL; return -EINVAL;
if (!args)
return 0;
args->fwnode = software_node_get(refnode); args->fwnode = software_node_get(refnode);
args->nargs = nargs; args->nargs = nargs;

View File

@@ -165,39 +165,37 @@ static loff_t get_loop_size(struct loop_device *lo, struct file *file)
return get_size(lo->lo_offset, lo->lo_sizelimit, file); return get_size(lo->lo_offset, lo->lo_sizelimit, file);
} }
/*
* We support direct I/O only if lo_offset is aligned with the logical I/O size
* of backing device, and the logical block size of loop is bigger than that of
* the backing device.
*/
static bool lo_bdev_can_use_dio(struct loop_device *lo,
struct block_device *backing_bdev)
{
unsigned short sb_bsize = bdev_logical_block_size(backing_bdev);
if (queue_logical_block_size(lo->lo_queue) < sb_bsize)
return false;
if (lo->lo_offset & (sb_bsize - 1))
return false;
return true;
}
static void __loop_update_dio(struct loop_device *lo, bool dio) static void __loop_update_dio(struct loop_device *lo, bool dio)
{ {
struct file *file = lo->lo_backing_file; struct file *file = lo->lo_backing_file;
struct address_space *mapping = file->f_mapping; struct inode *inode = file->f_mapping->host;
struct inode *inode = mapping->host; struct block_device *backing_bdev = NULL;
unsigned short sb_bsize = 0;
unsigned dio_align = 0;
bool use_dio; bool use_dio;
if (inode->i_sb->s_bdev) { if (S_ISBLK(inode->i_mode))
sb_bsize = bdev_logical_block_size(inode->i_sb->s_bdev); backing_bdev = I_BDEV(inode);
dio_align = sb_bsize - 1; else if (inode->i_sb->s_bdev)
} backing_bdev = inode->i_sb->s_bdev;
/* use_dio = dio && (file->f_mode & FMODE_CAN_ODIRECT) &&
* We support direct I/O only if lo_offset is aligned with the (!backing_bdev || lo_bdev_can_use_dio(lo, backing_bdev));
* logical I/O size of backing device, and the logical block
* size of loop is bigger than the backing device's.
*
* TODO: the above condition may be loosed in the future, and
* direct I/O may be switched runtime at that time because most
* of requests in sane applications should be PAGE_SIZE aligned
*/
if (dio) {
if (queue_logical_block_size(lo->lo_queue) >= sb_bsize &&
!(lo->lo_offset & dio_align) &&
(file->f_mode & FMODE_CAN_ODIRECT))
use_dio = true;
else
use_dio = false;
} else {
use_dio = false;
}
if (lo->use_dio == use_dio) if (lo->use_dio == use_dio)
return; return;

View File

@@ -2114,11 +2114,8 @@ static int null_add_dev(struct nullb_device *dev)
blk_queue_logical_block_size(nullb->q, dev->blocksize); blk_queue_logical_block_size(nullb->q, dev->blocksize);
blk_queue_physical_block_size(nullb->q, dev->blocksize); blk_queue_physical_block_size(nullb->q, dev->blocksize);
if (!dev->max_sectors) if (dev->max_sectors)
dev->max_sectors = queue_max_hw_sectors(nullb->q); blk_queue_max_hw_sectors(nullb->q, dev->max_sectors);
dev->max_sectors = min_t(unsigned int, dev->max_sectors,
BLK_DEF_MAX_SECTORS);
blk_queue_max_hw_sectors(nullb->q, dev->max_sectors);
if (dev->virt_boundary) if (dev->virt_boundary)
blk_queue_virt_boundary(nullb->q, PAGE_SIZE - 1); blk_queue_virt_boundary(nullb->q, PAGE_SIZE - 1);
@@ -2218,12 +2215,6 @@ static int __init null_init(void)
g_bs = PAGE_SIZE; g_bs = PAGE_SIZE;
} }
if (g_max_sectors > BLK_DEF_MAX_SECTORS) {
pr_warn("invalid max sectors\n");
pr_warn("defaults max sectors to %u\n", BLK_DEF_MAX_SECTORS);
g_max_sectors = BLK_DEF_MAX_SECTORS;
}
if (g_home_node != NUMA_NO_NODE && g_home_node >= nr_online_nodes) { if (g_home_node != NUMA_NO_NODE && g_home_node >= nr_online_nodes) {
pr_err("invalid home_node value\n"); pr_err("invalid home_node value\n");
g_home_node = NUMA_NO_NODE; g_home_node = NUMA_NO_NODE;

View File

@@ -337,7 +337,7 @@ mtk_stp_split(struct btmtkuart_dev *bdev, const unsigned char *data, int count,
return data; return data;
} }
static int btmtkuart_recv(struct hci_dev *hdev, const u8 *data, size_t count) static void btmtkuart_recv(struct hci_dev *hdev, const u8 *data, size_t count)
{ {
struct btmtkuart_dev *bdev = hci_get_drvdata(hdev); struct btmtkuart_dev *bdev = hci_get_drvdata(hdev);
const unsigned char *p_left = data, *p_h4; const unsigned char *p_left = data, *p_h4;
@@ -376,25 +376,20 @@ static int btmtkuart_recv(struct hci_dev *hdev, const u8 *data, size_t count)
bt_dev_err(bdev->hdev, bt_dev_err(bdev->hdev,
"Frame reassembly failed (%d)", err); "Frame reassembly failed (%d)", err);
bdev->rx_skb = NULL; bdev->rx_skb = NULL;
return err; return;
} }
sz_left -= sz_h4; sz_left -= sz_h4;
p_left += sz_h4; p_left += sz_h4;
} }
return 0;
} }
static int btmtkuart_receive_buf(struct serdev_device *serdev, const u8 *data, static int btmtkuart_receive_buf(struct serdev_device *serdev, const u8 *data,
size_t count) size_t count)
{ {
struct btmtkuart_dev *bdev = serdev_device_get_drvdata(serdev); struct btmtkuart_dev *bdev = serdev_device_get_drvdata(serdev);
int err;
err = btmtkuart_recv(bdev->hdev, data, count); btmtkuart_recv(bdev->hdev, data, count);
if (err < 0)
return err;
bdev->hdev->stat.byte_rx += count; bdev->hdev->stat.byte_rx += count;

View File

@@ -892,10 +892,8 @@ static int si5341_output_clk_set_rate(struct clk_hw *hw, unsigned long rate,
r[0] = r_div ? (r_div & 0xff) : 1; r[0] = r_div ? (r_div & 0xff) : 1;
r[1] = (r_div >> 8) & 0xff; r[1] = (r_div >> 8) & 0xff;
r[2] = (r_div >> 16) & 0xff; r[2] = (r_div >> 16) & 0xff;
err = regmap_bulk_write(output->data->regmap, return regmap_bulk_write(output->data->regmap,
SI5341_OUT_R_REG(output), r, 3); SI5341_OUT_R_REG(output), r, 3);
return 0;
} }
static int si5341_output_reparent(struct clk_si5341_output *output, u8 index) static int si5341_output_reparent(struct clk_si5341_output *output, u8 index)

View File

@@ -37,8 +37,8 @@ static struct alpha_pll_config gpu_cc_pll1_config = {
.config_ctl_hi_val = 0x00002267, .config_ctl_hi_val = 0x00002267,
.config_ctl_hi1_val = 0x00000024, .config_ctl_hi1_val = 0x00000024,
.test_ctl_val = 0x00000000, .test_ctl_val = 0x00000000,
.test_ctl_hi_val = 0x00000002, .test_ctl_hi_val = 0x00000000,
.test_ctl_hi1_val = 0x00000000, .test_ctl_hi1_val = 0x00000020,
.user_ctl_val = 0x00000000, .user_ctl_val = 0x00000000,
.user_ctl_hi_val = 0x00000805, .user_ctl_hi_val = 0x00000805,
.user_ctl_hi1_val = 0x000000d0, .user_ctl_hi1_val = 0x000000d0,

View File

@@ -33,6 +33,7 @@ static struct alpha_pll_config video_pll0_config = {
.config_ctl_val = 0x20485699, .config_ctl_val = 0x20485699,
.config_ctl_hi_val = 0x00002267, .config_ctl_hi_val = 0x00002267,
.config_ctl_hi1_val = 0x00000024, .config_ctl_hi1_val = 0x00000024,
.test_ctl_hi1_val = 0x00000020,
.user_ctl_val = 0x00000000, .user_ctl_val = 0x00000000,
.user_ctl_hi_val = 0x00000805, .user_ctl_hi_val = 0x00000805,
.user_ctl_hi1_val = 0x000000D0, .user_ctl_hi1_val = 0x000000D0,
@@ -214,6 +215,10 @@ static const struct regmap_config video_cc_sm8150_regmap_config = {
static const struct qcom_reset_map video_cc_sm8150_resets[] = { static const struct qcom_reset_map video_cc_sm8150_resets[] = {
[VIDEO_CC_MVSC_CORE_CLK_BCR] = { 0x850, 2 }, [VIDEO_CC_MVSC_CORE_CLK_BCR] = { 0x850, 2 },
[VIDEO_CC_INTERFACE_BCR] = { 0x8f0 },
[VIDEO_CC_MVS0_BCR] = { 0x870 },
[VIDEO_CC_MVS1_BCR] = { 0x8b0 },
[VIDEO_CC_MVSC_BCR] = { 0x810 },
}; };
static const struct qcom_cc_desc video_cc_sm8150_desc = { static const struct qcom_cc_desc video_cc_sm8150_desc = {

View File

@@ -1115,41 +1115,33 @@ fail:
#define rcdev_to_priv(x) container_of(x, struct rzg2l_cpg_priv, rcdev) #define rcdev_to_priv(x) container_of(x, struct rzg2l_cpg_priv, rcdev)
static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
unsigned long id)
{
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
const struct rzg2l_cpg_info *info = priv->info;
unsigned int reg = info->resets[id].off;
u32 dis = BIT(info->resets[id].bit);
u32 we = dis << 16;
dev_dbg(rcdev->dev, "reset id:%ld offset:0x%x\n", id, CLK_RST_R(reg));
/* Reset module */
writel(we, priv->base + CLK_RST_R(reg));
/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
udelay(35);
/* Release module from reset state */
writel(we | dis, priv->base + CLK_RST_R(reg));
return 0;
}
static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev, static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
unsigned long id) unsigned long id)
{ {
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev); struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
const struct rzg2l_cpg_info *info = priv->info; const struct rzg2l_cpg_info *info = priv->info;
unsigned int reg = info->resets[id].off; unsigned int reg = info->resets[id].off;
u32 value = BIT(info->resets[id].bit) << 16; u32 mask = BIT(info->resets[id].bit);
s8 monbit = info->resets[id].monbit;
u32 value = mask << 16;
dev_dbg(rcdev->dev, "assert id:%ld offset:0x%x\n", id, CLK_RST_R(reg)); dev_dbg(rcdev->dev, "assert id:%ld offset:0x%x\n", id, CLK_RST_R(reg));
writel(value, priv->base + CLK_RST_R(reg)); writel(value, priv->base + CLK_RST_R(reg));
return 0;
if (info->has_clk_mon_regs) {
reg = CLK_MRST_R(reg);
} else if (monbit >= 0) {
reg = CPG_RST_MON;
mask = BIT(monbit);
} else {
/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
udelay(35);
return 0;
}
return readl_poll_timeout_atomic(priv->base + reg, value,
value & mask, 10, 200);
} }
static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev, static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
@@ -1158,14 +1150,40 @@ static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev); struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
const struct rzg2l_cpg_info *info = priv->info; const struct rzg2l_cpg_info *info = priv->info;
unsigned int reg = info->resets[id].off; unsigned int reg = info->resets[id].off;
u32 dis = BIT(info->resets[id].bit); u32 mask = BIT(info->resets[id].bit);
u32 value = (dis << 16) | dis; s8 monbit = info->resets[id].monbit;
u32 value = (mask << 16) | mask;
dev_dbg(rcdev->dev, "deassert id:%ld offset:0x%x\n", id, dev_dbg(rcdev->dev, "deassert id:%ld offset:0x%x\n", id,
CLK_RST_R(reg)); CLK_RST_R(reg));
writel(value, priv->base + CLK_RST_R(reg)); writel(value, priv->base + CLK_RST_R(reg));
return 0;
if (info->has_clk_mon_regs) {
reg = CLK_MRST_R(reg);
} else if (monbit >= 0) {
reg = CPG_RST_MON;
mask = BIT(monbit);
} else {
/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
udelay(35);
return 0;
}
return readl_poll_timeout_atomic(priv->base + reg, value,
!(value & mask), 10, 200);
}
static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
unsigned long id)
{
int ret;
ret = rzg2l_cpg_assert(rcdev, id);
if (ret)
return ret;
return rzg2l_cpg_deassert(rcdev, id);
} }
static int rzg2l_cpg_status(struct reset_controller_dev *rcdev, static int rzg2l_cpg_status(struct reset_controller_dev *rcdev,
@@ -1173,18 +1191,21 @@ static int rzg2l_cpg_status(struct reset_controller_dev *rcdev,
{ {
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev); struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
const struct rzg2l_cpg_info *info = priv->info; const struct rzg2l_cpg_info *info = priv->info;
unsigned int reg = info->resets[id].off;
u32 bitmask = BIT(info->resets[id].bit);
s8 monbit = info->resets[id].monbit; s8 monbit = info->resets[id].monbit;
unsigned int reg;
u32 bitmask;
if (info->has_clk_mon_regs) { if (info->has_clk_mon_regs) {
return !!(readl(priv->base + CLK_MRST_R(reg)) & bitmask); reg = CLK_MRST_R(info->resets[id].off);
bitmask = BIT(info->resets[id].bit);
} else if (monbit >= 0) { } else if (monbit >= 0) {
u32 monbitmask = BIT(monbit); reg = CPG_RST_MON;
bitmask = BIT(monbit);
return !!(readl(priv->base + CPG_RST_MON) & monbitmask); } else {
return -ENOTSUPP;
} }
return -ENOTSUPP;
return !!(readl(priv->base + reg) & bitmask);
} }
static const struct reset_control_ops rzg2l_cpg_reset_ops = { static const struct reset_control_ops rzg2l_cpg_reset_ops = {

View File

@@ -89,7 +89,7 @@ static int zynqmp_clk_mux_set_parent(struct clk_hw *hw, u8 index)
static const struct clk_ops zynqmp_clk_mux_ops = { static const struct clk_ops zynqmp_clk_mux_ops = {
.get_parent = zynqmp_clk_mux_get_parent, .get_parent = zynqmp_clk_mux_get_parent,
.set_parent = zynqmp_clk_mux_set_parent, .set_parent = zynqmp_clk_mux_set_parent,
.determine_rate = __clk_mux_determine_rate, .determine_rate = __clk_mux_determine_rate_closest,
}; };
static const struct clk_ops zynqmp_clk_mux_ro_ops = { static const struct clk_ops zynqmp_clk_mux_ro_ops = {

View File

@@ -110,52 +110,6 @@ static unsigned long zynqmp_clk_divider_recalc_rate(struct clk_hw *hw,
return DIV_ROUND_UP_ULL(parent_rate, value); return DIV_ROUND_UP_ULL(parent_rate, value);
} }
static void zynqmp_get_divider2_val(struct clk_hw *hw,
unsigned long rate,
struct zynqmp_clk_divider *divider,
u32 *bestdiv)
{
int div1;
int div2;
long error = LONG_MAX;
unsigned long div1_prate;
struct clk_hw *div1_parent_hw;
struct zynqmp_clk_divider *pdivider;
struct clk_hw *div2_parent_hw = clk_hw_get_parent(hw);
if (!div2_parent_hw)
return;
pdivider = to_zynqmp_clk_divider(div2_parent_hw);
if (!pdivider)
return;
div1_parent_hw = clk_hw_get_parent(div2_parent_hw);
if (!div1_parent_hw)
return;
div1_prate = clk_hw_get_rate(div1_parent_hw);
*bestdiv = 1;
for (div1 = 1; div1 <= pdivider->max_div;) {
for (div2 = 1; div2 <= divider->max_div;) {
long new_error = ((div1_prate / div1) / div2) - rate;
if (abs(new_error) < abs(error)) {
*bestdiv = div2;
error = new_error;
}
if (divider->flags & CLK_DIVIDER_POWER_OF_TWO)
div2 = div2 << 1;
else
div2++;
}
if (pdivider->flags & CLK_DIVIDER_POWER_OF_TWO)
div1 = div1 << 1;
else
div1++;
}
}
/** /**
* zynqmp_clk_divider_round_rate() - Round rate of divider clock * zynqmp_clk_divider_round_rate() - Round rate of divider clock
* @hw: handle between common and hardware-specific interfaces * @hw: handle between common and hardware-specific interfaces
@@ -174,6 +128,7 @@ static long zynqmp_clk_divider_round_rate(struct clk_hw *hw,
u32 div_type = divider->div_type; u32 div_type = divider->div_type;
u32 bestdiv; u32 bestdiv;
int ret; int ret;
u8 width;
/* if read only, just return current value */ /* if read only, just return current value */
if (divider->flags & CLK_DIVIDER_READ_ONLY) { if (divider->flags & CLK_DIVIDER_READ_ONLY) {
@@ -193,23 +148,12 @@ static long zynqmp_clk_divider_round_rate(struct clk_hw *hw,
return DIV_ROUND_UP_ULL((u64)*prate, bestdiv); return DIV_ROUND_UP_ULL((u64)*prate, bestdiv);
} }
bestdiv = zynqmp_divider_get_val(*prate, rate, divider->flags); width = fls(divider->max_div);
/* rate = divider_round_rate(hw, rate, prate, NULL, width, divider->flags);
* In case of two divisors, compute best divider values and return
* divider2 value based on compute value. div1 will be automatically
* set to optimum based on required total divider value.
*/
if (div_type == TYPE_DIV2 &&
(clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) {
zynqmp_get_divider2_val(hw, rate, divider, &bestdiv);
}
if ((clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) && divider->is_frac) if (divider->is_frac && (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) && (rate % *prate))
bestdiv = rate % *prate ? 1 : bestdiv; *prate = rate;
bestdiv = min_t(u32, bestdiv, divider->max_div);
*prate = rate * bestdiv;
return rate; return rate;
} }

View File

@@ -184,7 +184,7 @@ static inline u32 dmtimer_read(struct dmtimer *timer, u32 reg)
* dmtimer_write - write timer registers in posted and non-posted mode * dmtimer_write - write timer registers in posted and non-posted mode
* @timer: timer pointer over which write operation is to perform * @timer: timer pointer over which write operation is to perform
* @reg: lowest byte holds the register offset * @reg: lowest byte holds the register offset
* @value: data to write into the register * @val: data to write into the register
* *
* The posted mode bit is encoded in reg. Note that in posted mode, the write * The posted mode bit is encoded in reg. Note that in posted mode, the write
* pending bit must be checked. Otherwise a write on a register which has a * pending bit must be checked. Otherwise a write on a register which has a
@@ -937,7 +937,7 @@ static int omap_dm_timer_set_int_enable(struct omap_dm_timer *cookie,
/** /**
* omap_dm_timer_set_int_disable - disable timer interrupts * omap_dm_timer_set_int_disable - disable timer interrupts
* @timer: pointer to timer handle * @cookie: pointer to timer cookie
* @mask: bit mask of interrupts to be disabled * @mask: bit mask of interrupts to be disabled
* *
* Disables the specified timer interrupts for a timer. * Disables the specified timer interrupts for a timer.

View File

@@ -176,7 +176,7 @@ static bool __init cpu0_node_has_opp_v2_prop(void)
struct device_node *np = of_cpu_device_node_get(0); struct device_node *np = of_cpu_device_node_get(0);
bool ret = false; bool ret = false;
if (of_get_property(np, "operating-points-v2", NULL)) if (of_property_present(np, "operating-points-v2"))
ret = true; ret = true;
of_node_put(np); of_node_put(np);

View File

@@ -89,7 +89,7 @@ static int imx_cpufreq_dt_probe(struct platform_device *pdev)
cpu_dev = get_cpu_device(0); cpu_dev = get_cpu_device(0);
if (!of_find_property(cpu_dev->of_node, "cpu-supply", NULL)) if (!of_property_present(cpu_dev->of_node, "cpu-supply"))
return -ENODEV; return -ENODEV;
if (of_machine_is_compatible("fsl,imx7ulp")) { if (of_machine_is_compatible("fsl,imx7ulp")) {

View File

@@ -230,7 +230,7 @@ static int imx6q_opp_check_speed_grading(struct device *dev)
u32 val; u32 val;
int ret; int ret;
if (of_find_property(dev->of_node, "nvmem-cells", NULL)) { if (of_property_present(dev->of_node, "nvmem-cells")) {
ret = nvmem_cell_read_u32(dev, "speed_grade", &val); ret = nvmem_cell_read_u32(dev, "speed_grade", &val);
if (ret) if (ret)
return ret; return ret;
@@ -285,7 +285,7 @@ static int imx6ul_opp_check_speed_grading(struct device *dev)
u32 val; u32 val;
int ret = 0; int ret = 0;
if (of_find_property(dev->of_node, "nvmem-cells", NULL)) { if (of_property_present(dev->of_node, "nvmem-cells")) {
ret = nvmem_cell_read_u32(dev, "speed_grade", &val); ret = nvmem_cell_read_u32(dev, "speed_grade", &val);
if (ret) if (ret)
return ret; return ret;

View File

@@ -310,8 +310,11 @@ static int scmi_cpufreq_probe(struct scmi_device *sdev)
#ifdef CONFIG_COMMON_CLK #ifdef CONFIG_COMMON_CLK
/* dummy clock provider as needed by OPP if clocks property is used */ /* dummy clock provider as needed by OPP if clocks property is used */
if (of_find_property(dev->of_node, "#clock-cells", NULL)) if (of_property_present(dev->of_node, "#clock-cells")) {
devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, NULL); ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, NULL);
if (ret)
return dev_err_probe(dev, ret, "%s: registering clock provider failed\n", __func__);
}
#endif #endif
ret = cpufreq_register_driver(&scmi_cpufreq_driver); ret = cpufreq_register_driver(&scmi_cpufreq_driver);

View File

@@ -25,7 +25,7 @@ static bool cpu0_node_has_opp_v2_prop(void)
struct device_node *np = of_cpu_device_node_get(0); struct device_node *np = of_cpu_device_node_get(0);
bool ret = false; bool ret = false;
if (of_get_property(np, "operating-points-v2", NULL)) if (of_property_present(np, "operating-points-v2"))
ret = true; ret = true;
of_node_put(np); of_node_put(np);

View File

@@ -179,8 +179,11 @@ static int ccp_init_dm_workarea(struct ccp_dm_workarea *wa,
wa->dma.address = dma_map_single(wa->dev, wa->address, len, wa->dma.address = dma_map_single(wa->dev, wa->address, len,
dir); dir);
if (dma_mapping_error(wa->dev, wa->dma.address)) if (dma_mapping_error(wa->dev, wa->dma.address)) {
kfree(wa->address);
wa->address = NULL;
return -ENOMEM; return -ENOMEM;
}
wa->dma.length = len; wa->dma.length = len;
} }

View File

@@ -118,8 +118,6 @@
#define HPRE_DFX_COMMON2_LEN 0xE #define HPRE_DFX_COMMON2_LEN 0xE
#define HPRE_DFX_CORE_LEN 0x43 #define HPRE_DFX_CORE_LEN 0x43
#define HPRE_DEV_ALG_MAX_LEN 256
static const char hpre_name[] = "hisi_hpre"; static const char hpre_name[] = "hisi_hpre";
static struct dentry *hpre_debugfs_root; static struct dentry *hpre_debugfs_root;
static const struct pci_device_id hpre_dev_ids[] = { static const struct pci_device_id hpre_dev_ids[] = {
@@ -135,12 +133,7 @@ struct hpre_hw_error {
const char *msg; const char *msg;
}; };
struct hpre_dev_alg { static const struct qm_dev_alg hpre_dev_algs[] = {
u32 alg_msk;
const char *alg;
};
static const struct hpre_dev_alg hpre_dev_algs[] = {
{ {
.alg_msk = BIT(0), .alg_msk = BIT(0),
.alg = "rsa\n" .alg = "rsa\n"
@@ -233,6 +226,20 @@ static const struct hisi_qm_cap_info hpre_basic_info[] = {
{HPRE_CORE10_ALG_BITMAP_CAP, 0x3170, 0, GENMASK(31, 0), 0x0, 0x10, 0x10} {HPRE_CORE10_ALG_BITMAP_CAP, 0x3170, 0, GENMASK(31, 0), 0x0, 0x10, 0x10}
}; };
enum hpre_pre_store_cap_idx {
HPRE_CLUSTER_NUM_CAP_IDX = 0x0,
HPRE_CORE_ENABLE_BITMAP_CAP_IDX,
HPRE_DRV_ALG_BITMAP_CAP_IDX,
HPRE_DEV_ALG_BITMAP_CAP_IDX,
};
static const u32 hpre_pre_store_caps[] = {
HPRE_CLUSTER_NUM_CAP,
HPRE_CORE_ENABLE_BITMAP_CAP,
HPRE_DRV_ALG_BITMAP_CAP,
HPRE_DEV_ALG_BITMAP_CAP,
};
static const struct hpre_hw_error hpre_hw_errors[] = { static const struct hpre_hw_error hpre_hw_errors[] = {
{ {
.int_msk = BIT(0), .int_msk = BIT(0),
@@ -352,42 +359,13 @@ bool hpre_check_alg_support(struct hisi_qm *qm, u32 alg)
{ {
u32 cap_val; u32 cap_val;
cap_val = hisi_qm_get_hw_info(qm, hpre_basic_info, HPRE_DRV_ALG_BITMAP_CAP, qm->cap_ver); cap_val = qm->cap_tables.dev_cap_table[HPRE_DRV_ALG_BITMAP_CAP_IDX].cap_val;
if (alg & cap_val) if (alg & cap_val)
return true; return true;
return false; return false;
} }
static int hpre_set_qm_algs(struct hisi_qm *qm)
{
struct device *dev = &qm->pdev->dev;
char *algs, *ptr;
u32 alg_msk;
int i;
if (!qm->use_sva)
return 0;
algs = devm_kzalloc(dev, HPRE_DEV_ALG_MAX_LEN * sizeof(char), GFP_KERNEL);
if (!algs)
return -ENOMEM;
alg_msk = hisi_qm_get_hw_info(qm, hpre_basic_info, HPRE_DEV_ALG_BITMAP_CAP, qm->cap_ver);
for (i = 0; i < ARRAY_SIZE(hpre_dev_algs); i++)
if (alg_msk & hpre_dev_algs[i].alg_msk)
strcat(algs, hpre_dev_algs[i].alg);
ptr = strrchr(algs, '\n');
if (ptr)
*ptr = '\0';
qm->uacce->algs = algs;
return 0;
}
static int hpre_diff_regs_show(struct seq_file *s, void *unused) static int hpre_diff_regs_show(struct seq_file *s, void *unused)
{ {
struct hisi_qm *qm = s->private; struct hisi_qm *qm = s->private;
@@ -457,16 +435,6 @@ static u32 vfs_num;
module_param_cb(vfs_num, &vfs_num_ops, &vfs_num, 0444); module_param_cb(vfs_num, &vfs_num_ops, &vfs_num, 0444);
MODULE_PARM_DESC(vfs_num, "Number of VFs to enable(1-63), 0(default)"); MODULE_PARM_DESC(vfs_num, "Number of VFs to enable(1-63), 0(default)");
static inline int hpre_cluster_num(struct hisi_qm *qm)
{
return hisi_qm_get_hw_info(qm, hpre_basic_info, HPRE_CLUSTER_NUM_CAP, qm->cap_ver);
}
static inline int hpre_cluster_core_mask(struct hisi_qm *qm)
{
return hisi_qm_get_hw_info(qm, hpre_basic_info, HPRE_CORE_ENABLE_BITMAP_CAP, qm->cap_ver);
}
struct hisi_qp *hpre_create_qp(u8 type) struct hisi_qp *hpre_create_qp(u8 type)
{ {
int node = cpu_to_node(smp_processor_id()); int node = cpu_to_node(smp_processor_id());
@@ -533,13 +501,15 @@ static int hpre_cfg_by_dsm(struct hisi_qm *qm)
static int hpre_set_cluster(struct hisi_qm *qm) static int hpre_set_cluster(struct hisi_qm *qm)
{ {
u32 cluster_core_mask = hpre_cluster_core_mask(qm);
u8 clusters_num = hpre_cluster_num(qm);
struct device *dev = &qm->pdev->dev; struct device *dev = &qm->pdev->dev;
unsigned long offset; unsigned long offset;
u32 cluster_core_mask;
u8 clusters_num;
u32 val = 0; u32 val = 0;
int ret, i; int ret, i;
cluster_core_mask = qm->cap_tables.dev_cap_table[HPRE_CORE_ENABLE_BITMAP_CAP_IDX].cap_val;
clusters_num = qm->cap_tables.dev_cap_table[HPRE_CLUSTER_NUM_CAP_IDX].cap_val;
for (i = 0; i < clusters_num; i++) { for (i = 0; i < clusters_num; i++) {
offset = i * HPRE_CLSTR_ADDR_INTRVL; offset = i * HPRE_CLSTR_ADDR_INTRVL;
@@ -734,11 +704,12 @@ static int hpre_set_user_domain_and_cache(struct hisi_qm *qm)
static void hpre_cnt_regs_clear(struct hisi_qm *qm) static void hpre_cnt_regs_clear(struct hisi_qm *qm)
{ {
u8 clusters_num = hpre_cluster_num(qm);
unsigned long offset; unsigned long offset;
u8 clusters_num;
int i; int i;
/* clear clusterX/cluster_ctrl */ /* clear clusterX/cluster_ctrl */
clusters_num = qm->cap_tables.dev_cap_table[HPRE_CLUSTER_NUM_CAP_IDX].cap_val;
for (i = 0; i < clusters_num; i++) { for (i = 0; i < clusters_num; i++) {
offset = HPRE_CLSTR_BASE + i * HPRE_CLSTR_ADDR_INTRVL; offset = HPRE_CLSTR_BASE + i * HPRE_CLSTR_ADDR_INTRVL;
writel(0x0, qm->io_base + offset + HPRE_CLUSTER_INQURY); writel(0x0, qm->io_base + offset + HPRE_CLUSTER_INQURY);
@@ -1025,13 +996,14 @@ static int hpre_pf_comm_regs_debugfs_init(struct hisi_qm *qm)
static int hpre_cluster_debugfs_init(struct hisi_qm *qm) static int hpre_cluster_debugfs_init(struct hisi_qm *qm)
{ {
u8 clusters_num = hpre_cluster_num(qm);
struct device *dev = &qm->pdev->dev; struct device *dev = &qm->pdev->dev;
char buf[HPRE_DBGFS_VAL_MAX_LEN]; char buf[HPRE_DBGFS_VAL_MAX_LEN];
struct debugfs_regset32 *regset; struct debugfs_regset32 *regset;
struct dentry *tmp_d; struct dentry *tmp_d;
u8 clusters_num;
int i, ret; int i, ret;
clusters_num = qm->cap_tables.dev_cap_table[HPRE_CLUSTER_NUM_CAP_IDX].cap_val;
for (i = 0; i < clusters_num; i++) { for (i = 0; i < clusters_num; i++) {
ret = snprintf(buf, HPRE_DBGFS_VAL_MAX_LEN, "cluster%d", i); ret = snprintf(buf, HPRE_DBGFS_VAL_MAX_LEN, "cluster%d", i);
if (ret >= HPRE_DBGFS_VAL_MAX_LEN) if (ret >= HPRE_DBGFS_VAL_MAX_LEN)
@@ -1136,8 +1108,37 @@ static void hpre_debugfs_exit(struct hisi_qm *qm)
debugfs_remove_recursive(qm->debug.debug_root); debugfs_remove_recursive(qm->debug.debug_root);
} }
static int hpre_pre_store_cap_reg(struct hisi_qm *qm)
{
struct hisi_qm_cap_record *hpre_cap;
struct device *dev = &qm->pdev->dev;
size_t i, size;
size = ARRAY_SIZE(hpre_pre_store_caps);
hpre_cap = devm_kzalloc(dev, sizeof(*hpre_cap) * size, GFP_KERNEL);
if (!hpre_cap)
return -ENOMEM;
for (i = 0; i < size; i++) {
hpre_cap[i].type = hpre_pre_store_caps[i];
hpre_cap[i].cap_val = hisi_qm_get_hw_info(qm, hpre_basic_info,
hpre_pre_store_caps[i], qm->cap_ver);
}
if (hpre_cap[HPRE_CLUSTER_NUM_CAP_IDX].cap_val > HPRE_CLUSTERS_NUM_MAX) {
dev_err(dev, "Device cluster num %u is out of range for driver supports %d!\n",
hpre_cap[HPRE_CLUSTER_NUM_CAP_IDX].cap_val, HPRE_CLUSTERS_NUM_MAX);
return -EINVAL;
}
qm->cap_tables.dev_cap_table = hpre_cap;
return 0;
}
static int hpre_qm_init(struct hisi_qm *qm, struct pci_dev *pdev) static int hpre_qm_init(struct hisi_qm *qm, struct pci_dev *pdev)
{ {
u64 alg_msk;
int ret; int ret;
if (pdev->revision == QM_HW_V1) { if (pdev->revision == QM_HW_V1) {
@@ -1168,7 +1169,16 @@ static int hpre_qm_init(struct hisi_qm *qm, struct pci_dev *pdev)
return ret; return ret;
} }
ret = hpre_set_qm_algs(qm); /* Fetch and save the value of capability registers */
ret = hpre_pre_store_cap_reg(qm);
if (ret) {
pci_err(pdev, "Failed to pre-store capability registers!\n");
hisi_qm_uninit(qm);
return ret;
}
alg_msk = qm->cap_tables.dev_cap_table[HPRE_DEV_ALG_BITMAP_CAP_IDX].cap_val;
ret = hisi_qm_set_algs(qm, alg_msk, hpre_dev_algs, ARRAY_SIZE(hpre_dev_algs));
if (ret) { if (ret) {
pci_err(pdev, "Failed to set hpre algs!\n"); pci_err(pdev, "Failed to set hpre algs!\n");
hisi_qm_uninit(qm); hisi_qm_uninit(qm);
@@ -1181,11 +1191,12 @@ static int hpre_show_last_regs_init(struct hisi_qm *qm)
{ {
int cluster_dfx_regs_num = ARRAY_SIZE(hpre_cluster_dfx_regs); int cluster_dfx_regs_num = ARRAY_SIZE(hpre_cluster_dfx_regs);
int com_dfx_regs_num = ARRAY_SIZE(hpre_com_dfx_regs); int com_dfx_regs_num = ARRAY_SIZE(hpre_com_dfx_regs);
u8 clusters_num = hpre_cluster_num(qm);
struct qm_debug *debug = &qm->debug; struct qm_debug *debug = &qm->debug;
void __iomem *io_base; void __iomem *io_base;
u8 clusters_num;
int i, j, idx; int i, j, idx;
clusters_num = qm->cap_tables.dev_cap_table[HPRE_CLUSTER_NUM_CAP_IDX].cap_val;
debug->last_words = kcalloc(cluster_dfx_regs_num * clusters_num + debug->last_words = kcalloc(cluster_dfx_regs_num * clusters_num +
com_dfx_regs_num, sizeof(unsigned int), GFP_KERNEL); com_dfx_regs_num, sizeof(unsigned int), GFP_KERNEL);
if (!debug->last_words) if (!debug->last_words)
@@ -1222,10 +1233,10 @@ static void hpre_show_last_dfx_regs(struct hisi_qm *qm)
{ {
int cluster_dfx_regs_num = ARRAY_SIZE(hpre_cluster_dfx_regs); int cluster_dfx_regs_num = ARRAY_SIZE(hpre_cluster_dfx_regs);
int com_dfx_regs_num = ARRAY_SIZE(hpre_com_dfx_regs); int com_dfx_regs_num = ARRAY_SIZE(hpre_com_dfx_regs);
u8 clusters_num = hpre_cluster_num(qm);
struct qm_debug *debug = &qm->debug; struct qm_debug *debug = &qm->debug;
struct pci_dev *pdev = qm->pdev; struct pci_dev *pdev = qm->pdev;
void __iomem *io_base; void __iomem *io_base;
u8 clusters_num;
int i, j, idx; int i, j, idx;
u32 val; u32 val;
@@ -1240,6 +1251,7 @@ static void hpre_show_last_dfx_regs(struct hisi_qm *qm)
hpre_com_dfx_regs[i].name, debug->last_words[i], val); hpre_com_dfx_regs[i].name, debug->last_words[i], val);
} }
clusters_num = qm->cap_tables.dev_cap_table[HPRE_CLUSTER_NUM_CAP_IDX].cap_val;
for (i = 0; i < clusters_num; i++) { for (i = 0; i < clusters_num; i++) {
io_base = qm->io_base + hpre_cluster_offsets[i]; io_base = qm->io_base + hpre_cluster_offsets[i];
for (j = 0; j < cluster_dfx_regs_num; j++) { for (j = 0; j < cluster_dfx_regs_num; j++) {

View File

@@ -237,6 +237,8 @@
#define QM_QOS_MAX_CIR_S 11 #define QM_QOS_MAX_CIR_S 11
#define QM_AUTOSUSPEND_DELAY 3000 #define QM_AUTOSUSPEND_DELAY 3000
#define QM_DEV_ALG_MAX_LEN 256
#define QM_MK_CQC_DW3_V1(hop_num, pg_sz, buf_sz, cqe_sz) \ #define QM_MK_CQC_DW3_V1(hop_num, pg_sz, buf_sz, cqe_sz) \
(((hop_num) << QM_CQ_HOP_NUM_SHIFT) | \ (((hop_num) << QM_CQ_HOP_NUM_SHIFT) | \
((pg_sz) << QM_CQ_PAGE_SIZE_SHIFT) | \ ((pg_sz) << QM_CQ_PAGE_SIZE_SHIFT) | \
@@ -315,6 +317,13 @@ enum qm_basic_type {
QM_VF_IRQ_NUM_CAP, QM_VF_IRQ_NUM_CAP,
}; };
enum qm_pre_store_cap_idx {
QM_EQ_IRQ_TYPE_CAP_IDX = 0x0,
QM_AEQ_IRQ_TYPE_CAP_IDX,
QM_ABN_IRQ_TYPE_CAP_IDX,
QM_PF2VF_IRQ_TYPE_CAP_IDX,
};
static const struct hisi_qm_cap_info qm_cap_info_comm[] = { static const struct hisi_qm_cap_info qm_cap_info_comm[] = {
{QM_SUPPORT_DB_ISOLATION, 0x30, 0, BIT(0), 0x0, 0x0, 0x0}, {QM_SUPPORT_DB_ISOLATION, 0x30, 0, BIT(0), 0x0, 0x0, 0x0},
{QM_SUPPORT_FUNC_QOS, 0x3100, 0, BIT(8), 0x0, 0x0, 0x1}, {QM_SUPPORT_FUNC_QOS, 0x3100, 0, BIT(8), 0x0, 0x0, 0x1},
@@ -344,6 +353,13 @@ static const struct hisi_qm_cap_info qm_basic_info[] = {
{QM_VF_IRQ_NUM_CAP, 0x311c, 0, GENMASK(15, 0), 0x1, 0x2, 0x3}, {QM_VF_IRQ_NUM_CAP, 0x311c, 0, GENMASK(15, 0), 0x1, 0x2, 0x3},
}; };
static const u32 qm_pre_store_caps[] = {
QM_EQ_IRQ_TYPE_CAP,
QM_AEQ_IRQ_TYPE_CAP,
QM_ABN_IRQ_TYPE_CAP,
QM_PF2VF_IRQ_TYPE_CAP,
};
struct qm_mailbox { struct qm_mailbox {
__le16 w0; __le16 w0;
__le16 queue_num; __le16 queue_num;
@@ -781,6 +797,40 @@ static void qm_get_xqc_depth(struct hisi_qm *qm, u16 *low_bits,
*high_bits = (depth >> QM_XQ_DEPTH_SHIFT) & QM_XQ_DEPTH_MASK; *high_bits = (depth >> QM_XQ_DEPTH_SHIFT) & QM_XQ_DEPTH_MASK;
} }
int hisi_qm_set_algs(struct hisi_qm *qm, u64 alg_msk, const struct qm_dev_alg *dev_algs,
u32 dev_algs_size)
{
struct device *dev = &qm->pdev->dev;
char *algs, *ptr;
int i;
if (!qm->uacce)
return 0;
if (dev_algs_size >= QM_DEV_ALG_MAX_LEN) {
dev_err(dev, "algs size %u is equal or larger than %d.\n",
dev_algs_size, QM_DEV_ALG_MAX_LEN);
return -EINVAL;
}
algs = devm_kzalloc(dev, QM_DEV_ALG_MAX_LEN * sizeof(char), GFP_KERNEL);
if (!algs)
return -ENOMEM;
for (i = 0; i < dev_algs_size; i++)
if (alg_msk & dev_algs[i].alg_msk)
strcat(algs, dev_algs[i].alg);
ptr = strrchr(algs, '\n');
if (ptr) {
*ptr = '\0';
qm->uacce->algs = algs;
}
return 0;
}
EXPORT_SYMBOL_GPL(hisi_qm_set_algs);
static u32 qm_get_irq_num(struct hisi_qm *qm) static u32 qm_get_irq_num(struct hisi_qm *qm)
{ {
if (qm->fun_type == QM_HW_PF) if (qm->fun_type == QM_HW_PF)
@@ -4804,7 +4854,7 @@ static void qm_unregister_abnormal_irq(struct hisi_qm *qm)
if (qm->fun_type == QM_HW_VF) if (qm->fun_type == QM_HW_VF)
return; return;
val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_ABN_IRQ_TYPE_CAP, qm->cap_ver); val = qm->cap_tables.qm_cap_table[QM_ABN_IRQ_TYPE_CAP_IDX].cap_val;
if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK)) if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK))
return; return;
@@ -4821,7 +4871,7 @@ static int qm_register_abnormal_irq(struct hisi_qm *qm)
if (qm->fun_type == QM_HW_VF) if (qm->fun_type == QM_HW_VF)
return 0; return 0;
val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_ABN_IRQ_TYPE_CAP, qm->cap_ver); val = qm->cap_tables.qm_cap_table[QM_ABN_IRQ_TYPE_CAP_IDX].cap_val;
if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK)) if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_ABN_IRQ_TYPE_MASK))
return 0; return 0;
@@ -4838,7 +4888,7 @@ static void qm_unregister_mb_cmd_irq(struct hisi_qm *qm)
struct pci_dev *pdev = qm->pdev; struct pci_dev *pdev = qm->pdev;
u32 irq_vector, val; u32 irq_vector, val;
val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_PF2VF_IRQ_TYPE_CAP, qm->cap_ver); val = qm->cap_tables.qm_cap_table[QM_PF2VF_IRQ_TYPE_CAP_IDX].cap_val;
if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK))
return; return;
@@ -4852,7 +4902,7 @@ static int qm_register_mb_cmd_irq(struct hisi_qm *qm)
u32 irq_vector, val; u32 irq_vector, val;
int ret; int ret;
val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_PF2VF_IRQ_TYPE_CAP, qm->cap_ver); val = qm->cap_tables.qm_cap_table[QM_PF2VF_IRQ_TYPE_CAP_IDX].cap_val;
if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK))
return 0; return 0;
@@ -4869,7 +4919,7 @@ static void qm_unregister_aeq_irq(struct hisi_qm *qm)
struct pci_dev *pdev = qm->pdev; struct pci_dev *pdev = qm->pdev;
u32 irq_vector, val; u32 irq_vector, val;
val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_AEQ_IRQ_TYPE_CAP, qm->cap_ver); val = qm->cap_tables.qm_cap_table[QM_AEQ_IRQ_TYPE_CAP_IDX].cap_val;
if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK))
return; return;
@@ -4883,7 +4933,7 @@ static int qm_register_aeq_irq(struct hisi_qm *qm)
u32 irq_vector, val; u32 irq_vector, val;
int ret; int ret;
val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_AEQ_IRQ_TYPE_CAP, qm->cap_ver); val = qm->cap_tables.qm_cap_table[QM_AEQ_IRQ_TYPE_CAP_IDX].cap_val;
if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK))
return 0; return 0;
@@ -4901,7 +4951,7 @@ static void qm_unregister_eq_irq(struct hisi_qm *qm)
struct pci_dev *pdev = qm->pdev; struct pci_dev *pdev = qm->pdev;
u32 irq_vector, val; u32 irq_vector, val;
val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_EQ_IRQ_TYPE_CAP, qm->cap_ver); val = qm->cap_tables.qm_cap_table[QM_EQ_IRQ_TYPE_CAP_IDX].cap_val;
if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK))
return; return;
@@ -4915,7 +4965,7 @@ static int qm_register_eq_irq(struct hisi_qm *qm)
u32 irq_vector, val; u32 irq_vector, val;
int ret; int ret;
val = hisi_qm_get_hw_info(qm, qm_basic_info, QM_EQ_IRQ_TYPE_CAP, qm->cap_ver); val = qm->cap_tables.qm_cap_table[QM_EQ_IRQ_TYPE_CAP_IDX].cap_val;
if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK)) if (!((val >> QM_IRQ_TYPE_SHIFT) & QM_IRQ_TYPE_MASK))
return 0; return 0;
@@ -5003,7 +5053,29 @@ static int qm_get_qp_num(struct hisi_qm *qm)
return 0; return 0;
} }
static void qm_get_hw_caps(struct hisi_qm *qm) static int qm_pre_store_irq_type_caps(struct hisi_qm *qm)
{
struct hisi_qm_cap_record *qm_cap;
struct pci_dev *pdev = qm->pdev;
size_t i, size;
size = ARRAY_SIZE(qm_pre_store_caps);
qm_cap = devm_kzalloc(&pdev->dev, sizeof(*qm_cap) * size, GFP_KERNEL);
if (!qm_cap)
return -ENOMEM;
for (i = 0; i < size; i++) {
qm_cap[i].type = qm_pre_store_caps[i];
qm_cap[i].cap_val = hisi_qm_get_hw_info(qm, qm_basic_info,
qm_pre_store_caps[i], qm->cap_ver);
}
qm->cap_tables.qm_cap_table = qm_cap;
return 0;
}
static int qm_get_hw_caps(struct hisi_qm *qm)
{ {
const struct hisi_qm_cap_info *cap_info = qm->fun_type == QM_HW_PF ? const struct hisi_qm_cap_info *cap_info = qm->fun_type == QM_HW_PF ?
qm_cap_info_pf : qm_cap_info_vf; qm_cap_info_pf : qm_cap_info_vf;
@@ -5034,6 +5106,9 @@ static void qm_get_hw_caps(struct hisi_qm *qm)
if (val) if (val)
set_bit(cap_info[i].type, &qm->caps); set_bit(cap_info[i].type, &qm->caps);
} }
/* Fetch and save the value of irq type related capability registers */
return qm_pre_store_irq_type_caps(qm);
} }
static int qm_get_pci_res(struct hisi_qm *qm) static int qm_get_pci_res(struct hisi_qm *qm)
@@ -5055,7 +5130,10 @@ static int qm_get_pci_res(struct hisi_qm *qm)
goto err_request_mem_regions; goto err_request_mem_regions;
} }
qm_get_hw_caps(qm); ret = qm_get_hw_caps(qm);
if (ret)
goto err_ioremap;
if (test_bit(QM_SUPPORT_DB_ISOLATION, &qm->caps)) { if (test_bit(QM_SUPPORT_DB_ISOLATION, &qm->caps)) {
qm->db_interval = QM_QP_DB_INTERVAL; qm->db_interval = QM_QP_DB_INTERVAL;
qm->db_phys_base = pci_resource_start(pdev, PCI_BAR_4); qm->db_phys_base = pci_resource_start(pdev, PCI_BAR_4);

View File

@@ -220,6 +220,13 @@ enum sec_cap_type {
SEC_CORE4_ALG_BITMAP_HIGH, SEC_CORE4_ALG_BITMAP_HIGH,
}; };
enum sec_cap_reg_record_idx {
SEC_DRV_ALG_BITMAP_LOW_IDX = 0x0,
SEC_DRV_ALG_BITMAP_HIGH_IDX,
SEC_DEV_ALG_BITMAP_LOW_IDX,
SEC_DEV_ALG_BITMAP_HIGH_IDX,
};
void sec_destroy_qps(struct hisi_qp **qps, int qp_num); void sec_destroy_qps(struct hisi_qp **qps, int qp_num);
struct hisi_qp **sec_create_qps(void); struct hisi_qp **sec_create_qps(void);
int sec_register_to_crypto(struct hisi_qm *qm); int sec_register_to_crypto(struct hisi_qm *qm);

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