mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
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:
@@ -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>;
|
||||||
|
|||||||
@@ -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,7 +84,7 @@ 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>;
|
||||||
@@ -92,4 +96,5 @@ examples:
|
|||||||
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>;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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,7 +72,7 @@ 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>;
|
||||||
@@ -77,4 +81,5 @@ examples:
|
|||||||
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>;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -90,13 +90,14 @@ 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
|
||||||
|
|
||||||
|
properties:
|
||||||
|
bus-type:
|
||||||
|
enum: [5, 6]
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- bus-type
|
- bus-type
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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>;
|
||||||
|
|||||||
@@ -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>,
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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>;
|
||||||
|
|||||||
@@ -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 */
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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";
|
||||||
};
|
};
|
||||||
@@ -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>,
|
||||||
@@ -669,7 +670,7 @@
|
|||||||
|
|
||||||
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";
|
||||||
@@ -684,7 +685,7 @@
|
|||||||
|
|
||||||
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";
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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>,
|
||||||
|
|||||||
@@ -125,6 +125,9 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&hscif0 {
|
&hscif0 {
|
||||||
|
pinctrl-0 = <&hscif0_pins>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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>;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 \
|
||||||
|
|||||||
@@ -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 \
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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]);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 = .;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
|
||||||
size = size << 1;
|
|
||||||
}
|
|
||||||
return size;
|
return size;
|
||||||
|
|
||||||
|
if (size >= 8)
|
||||||
|
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,7 +148,7 @@ 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);
|
||||||
@@ -166,7 +170,7 @@ 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 */
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ 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 */
|
||||||
@@ -242,7 +242,7 @@ 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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,6 +195,7 @@ static void kvm_setup_secondary_clock(void)
|
|||||||
|
|
||||||
void kvmclock_disable(void)
|
void kvmclock_disable(void)
|
||||||
{
|
{
|
||||||
|
if (msr_kvm_system_time)
|
||||||
native_write_msr(msr_kvm_system_time, 0, 0);
|
native_write_msr(msr_kvm_system_time, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
38
block/bio.c
38
block/bio.c
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -1726,13 +1726,13 @@ 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));
|
||||||
props.type = BACKLIGHT_FIRMWARE;
|
props.type = BACKLIGHT_FIRMWARE;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -2114,10 +2114,7 @@ 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);
|
|
||||||
dev->max_sectors = min_t(unsigned int, dev->max_sectors,
|
|
||||||
BLK_DEF_MAX_SECTORS);
|
|
||||||
blk_queue_max_hw_sectors(nullb->q, dev->max_sectors);
|
blk_queue_max_hw_sectors(nullb->q, dev->max_sectors);
|
||||||
|
|
||||||
if (dev->virt_boundary)
|
if (dev->virt_boundary)
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|
||||||
|
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 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));
|
||||||
|
|
||||||
|
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 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 = {
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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")) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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++) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user