mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2026-01-27 12:47:24 +01:00
Merge branch 'v5.15/standard/base' into v5.15/standard/cn-sdkv5.15/octeon
This commit is contained in:
commit
59580602f6
134
Documentation/devicetree/bindings/pci/amlogic,axg-pcie.yaml
Normal file
134
Documentation/devicetree/bindings/pci/amlogic,axg-pcie.yaml
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/pci/amlogic,axg-pcie.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Amlogic Meson AXG DWC PCIe SoC controller
|
||||
|
||||
maintainers:
|
||||
- Neil Armstrong <neil.armstrong@linaro.org>
|
||||
|
||||
description:
|
||||
Amlogic Meson PCIe host controller is based on the Synopsys DesignWare PCI core.
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/pci/pci-bus.yaml#
|
||||
- $ref: /schemas/pci/snps,dw-pcie-common.yaml#
|
||||
|
||||
# We need a select here so we don't match all nodes with 'snps,dw-pcie'
|
||||
select:
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- amlogic,axg-pcie
|
||||
- amlogic,g12a-pcie
|
||||
required:
|
||||
- compatible
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- amlogic,axg-pcie
|
||||
- amlogic,g12a-pcie
|
||||
- const: snps,dw-pcie
|
||||
|
||||
reg:
|
||||
items:
|
||||
- description: Data Bus Interface registers
|
||||
- description: Meson designed configuration registers
|
||||
- description: PCIe configuration space
|
||||
|
||||
reg-names:
|
||||
items:
|
||||
- const: dbi
|
||||
- const: cfg
|
||||
- const: config
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: PCIe GEN 100M PLL clock
|
||||
- description: PCIe RC clock gate
|
||||
- description: PCIe PHY clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: pclk
|
||||
- const: port
|
||||
- const: general
|
||||
|
||||
phys:
|
||||
maxItems: 1
|
||||
|
||||
phy-names:
|
||||
const: pcie
|
||||
|
||||
resets:
|
||||
items:
|
||||
- description: Port Reset
|
||||
- description: Shared APB reset
|
||||
|
||||
reset-names:
|
||||
items:
|
||||
- const: port
|
||||
- const: apb
|
||||
|
||||
num-lanes:
|
||||
const: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- reg-names
|
||||
- interrupts
|
||||
- clock
|
||||
- clock-names
|
||||
- "#address-cells"
|
||||
- "#size-cells"
|
||||
- "#interrupt-cells"
|
||||
- interrupt-map
|
||||
- interrupt-map-mask
|
||||
- ranges
|
||||
- bus-range
|
||||
- device_type
|
||||
- num-lanes
|
||||
- phys
|
||||
- phy-names
|
||||
- resets
|
||||
- reset-names
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
pcie: pcie@f9800000 {
|
||||
compatible = "amlogic,axg-pcie", "snps,dw-pcie";
|
||||
reg = <0xf9800000 0x400000>, <0xff646000 0x2000>, <0xf9f00000 0x100000>;
|
||||
reg-names = "dbi", "cfg", "config";
|
||||
interrupts = <GIC_SPI 177 IRQ_TYPE_EDGE_RISING>;
|
||||
clocks = <&pclk>, <&clk_port>, <&clk_phy>;
|
||||
clock-names = "pclk", "port", "general";
|
||||
resets = <&reset_pcie_port>, <&reset_pcie_apb>;
|
||||
reset-names = "port", "apb";
|
||||
phys = <&pcie_phy>;
|
||||
phy-names = "pcie";
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &gic GIC_SPI 179 IRQ_TYPE_EDGE_RISING>;
|
||||
bus-range = <0x0 0xff>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
num-lanes = <1>;
|
||||
ranges = <0x82000000 0 0 0xf9c00000 0 0x00300000>;
|
||||
};
|
||||
...
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
Amlogic Meson AXG DWC PCIE SoC controller
|
||||
|
||||
Amlogic Meson PCIe host controller is based on the Synopsys DesignWare PCI core.
|
||||
It shares common functions with the PCIe DesignWare core driver and
|
||||
inherits common properties defined in
|
||||
Documentation/devicetree/bindings/pci/snps,dw-pcie.yaml.
|
||||
|
||||
Additional properties are described here:
|
||||
|
||||
Required properties:
|
||||
- compatible:
|
||||
should contain :
|
||||
- "amlogic,axg-pcie" for AXG SoC Family
|
||||
- "amlogic,g12a-pcie" for G12A SoC Family
|
||||
to identify the core.
|
||||
- reg:
|
||||
should contain the configuration address space.
|
||||
- reg-names: Must be
|
||||
- "elbi" External local bus interface registers
|
||||
- "cfg" Meson specific registers
|
||||
- "config" PCIe configuration space
|
||||
- reset-gpios: The GPIO to generate PCIe PERST# assert and deassert signal.
|
||||
- clocks: Must contain an entry for each entry in clock-names.
|
||||
- clock-names: Must include the following entries:
|
||||
- "pclk" PCIe GEN 100M PLL clock
|
||||
- "port" PCIe_x(A or B) RC clock gate
|
||||
- "general" PCIe Phy clock
|
||||
- resets: phandle to the reset lines.
|
||||
- reset-names: must contain "port" and "apb"
|
||||
- "port" Port A or B reset
|
||||
- "apb" Share APB reset
|
||||
- phys: should contain a phandle to the PCIE phy
|
||||
- phy-names: must contain "pcie"
|
||||
|
||||
- device_type:
|
||||
should be "pci". As specified in snps,dw-pcie.yaml
|
||||
|
||||
|
||||
Example configuration:
|
||||
|
||||
pcie: pcie@f9800000 {
|
||||
compatible = "amlogic,axg-pcie", "snps,dw-pcie";
|
||||
reg = <0x0 0xf9800000 0x0 0x400000
|
||||
0x0 0xff646000 0x0 0x2000
|
||||
0x0 0xf9f00000 0x0 0x100000>;
|
||||
reg-names = "elbi", "cfg", "config";
|
||||
reset-gpios = <&gpio GPIOX_19 GPIO_ACTIVE_HIGH>;
|
||||
interrupts = <GIC_SPI 177 IRQ_TYPE_EDGE_RISING>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &gic GIC_SPI 179 IRQ_TYPE_EDGE_RISING>;
|
||||
bus-range = <0x0 0xff>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges = <0x82000000 0 0 0x0 0xf9c00000 0 0x00300000>;
|
||||
|
||||
clocks = <&clkc CLKID_USB
|
||||
&clkc CLKID_PCIE_A
|
||||
&clkc CLKID_PCIE_CML_EN0>;
|
||||
clock-names = "general",
|
||||
"pclk",
|
||||
"port";
|
||||
resets = <&reset RESET_PCIE_A>,
|
||||
<&reset RESET_PCIE_APB>;
|
||||
reset-names = "port",
|
||||
"apb";
|
||||
phys = <&pcie_phy>;
|
||||
phy-names = "pcie";
|
||||
};
|
||||
|
|
@ -79,7 +79,6 @@ context. This is represented by the fs_context structure::
|
|||
unsigned int sb_flags;
|
||||
unsigned int sb_flags_mask;
|
||||
unsigned int s_iflags;
|
||||
unsigned int lsm_flags;
|
||||
enum fs_context_purpose purpose:8;
|
||||
...
|
||||
};
|
||||
|
|
|
|||
|
|
@ -104,8 +104,10 @@ kernels go out with a handful of known regressions though, hopefully, none
|
|||
of them are serious.
|
||||
|
||||
Once a stable release is made, its ongoing maintenance is passed off to the
|
||||
"stable team," currently Greg Kroah-Hartman. The stable team will release
|
||||
occasional updates to the stable release using the 5.x.y numbering scheme.
|
||||
"stable team," currently consists of Greg Kroah-Hartman and Sasha Levin. The
|
||||
stable team will release occasional updates to the stable release using the
|
||||
5.x.y numbering scheme.
|
||||
|
||||
To be considered for an update release, a patch must (1) fix a significant
|
||||
bug, and (2) already be merged into the mainline for the next development
|
||||
kernel. Kernels will typically receive stable updates for a little more
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 15
|
||||
SUBLEVEL = 197
|
||||
SUBLEVEL = 198
|
||||
EXTRAVERSION =
|
||||
NAME = Trick or Treat
|
||||
|
||||
|
|
|
|||
|
|
@ -23,10 +23,10 @@
|
|||
#define TCSETSW _IOW('t', 21, struct termios)
|
||||
#define TCSETSF _IOW('t', 22, struct termios)
|
||||
|
||||
#define TCGETA _IOR('t', 23, struct termio)
|
||||
#define TCSETA _IOW('t', 24, struct termio)
|
||||
#define TCSETAW _IOW('t', 25, struct termio)
|
||||
#define TCSETAF _IOW('t', 28, struct termio)
|
||||
#define TCGETA 0x40127417
|
||||
#define TCSETA 0x80127418
|
||||
#define TCSETAW 0x80127419
|
||||
#define TCSETAF 0x8012741c
|
||||
|
||||
#define TCSBRK _IO('t', 29)
|
||||
#define TCXONC _IO('t', 30)
|
||||
|
|
|
|||
|
|
@ -1473,7 +1473,7 @@ config HIGHMEM
|
|||
|
||||
config HIGHPTE
|
||||
bool "Allocate 2nd-level pagetables from highmem" if EXPERT
|
||||
depends on HIGHMEM
|
||||
depends on HIGHMEM && !PREEMPT_RT
|
||||
default y
|
||||
help
|
||||
The VM uses one page of physical memory for each page table.
|
||||
|
|
|
|||
|
|
@ -335,7 +335,7 @@
|
|||
pinctrl-0 = <&pinctrl_rtc>;
|
||||
reg = <0x32>;
|
||||
interrupt-parent = <&gpio4>;
|
||||
interrupts = <10 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts = <10 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -375,7 +375,7 @@
|
|||
dma-names = "tx", "rx";
|
||||
atmel,use-dma-rx;
|
||||
atmel,use-dma-tx;
|
||||
atmel,fifo-size = <16>;
|
||||
atmel,fifo-size = <32>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
|
@ -400,7 +400,7 @@
|
|||
dma-names = "tx", "rx";
|
||||
atmel,use-dma-rx;
|
||||
atmel,use-dma-tx;
|
||||
atmel,fifo-size = <16>;
|
||||
atmel,fifo-size = <32>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ static inline unsigned long find_zero(unsigned long mask)
|
|||
*/
|
||||
static inline unsigned long load_unaligned_zeropad(const void *addr)
|
||||
{
|
||||
unsigned long ret, offset;
|
||||
unsigned long ret, tmp;
|
||||
|
||||
/* Load word from unaligned pointer addr */
|
||||
asm(
|
||||
|
|
@ -74,9 +74,9 @@ static inline unsigned long load_unaligned_zeropad(const void *addr)
|
|||
"2:\n"
|
||||
" .pushsection .text.fixup,\"ax\"\n"
|
||||
" .align 2\n"
|
||||
"3: and %1, %2, #0x3\n"
|
||||
" bic %2, %2, #0x3\n"
|
||||
" ldr %0, [%2]\n"
|
||||
"3: bic %1, %2, #0x3\n"
|
||||
" ldr %0, [%1]\n"
|
||||
" and %1, %2, #0x3\n"
|
||||
" lsl %1, %1, #0x3\n"
|
||||
#ifndef __ARMEB__
|
||||
" lsr %0, %0, %1\n"
|
||||
|
|
@ -89,7 +89,7 @@ static inline unsigned long load_unaligned_zeropad(const void *addr)
|
|||
" .align 3\n"
|
||||
" .long 1b, 3b\n"
|
||||
" .popsection"
|
||||
: "=&r" (ret), "=&r" (offset)
|
||||
: "=&r" (ret), "=&r" (tmp)
|
||||
: "r" (addr), "Qo" (*(unsigned long *)addr));
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -259,17 +259,6 @@
|
|||
>;
|
||||
};
|
||||
|
||||
pinctrl_usdhc1: usdhc1grp {
|
||||
fsl,pins = <
|
||||
MX8MM_IOMUXC_SD1_CLK_USDHC1_CLK 0x190
|
||||
MX8MM_IOMUXC_SD1_CMD_USDHC1_CMD 0x1d0
|
||||
MX8MM_IOMUXC_SD1_DATA0_USDHC1_DATA0 0x1d0
|
||||
MX8MM_IOMUXC_SD1_DATA1_USDHC1_DATA1 0x1d0
|
||||
MX8MM_IOMUXC_SD1_DATA2_USDHC1_DATA2 0x1d0
|
||||
MX8MM_IOMUXC_SD1_DATA3_USDHC1_DATA3 0x1d0
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_usdhc2: usdhc2grp {
|
||||
fsl,pins = <
|
||||
MX8MM_IOMUXC_SD2_CLK_USDHC2_CLK 0x190
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
regulator-max-microvolt = <3000000>;
|
||||
gpio = <&lsio_gpio4 7 GPIO_ACTIVE_HIGH>;
|
||||
enable-active-high;
|
||||
off-on-delay-us = <4800>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -25,3 +25,6 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \
|
|||
vgic/vgic-its.o vgic/vgic-debug.o
|
||||
|
||||
kvm-$(CONFIG_HW_PERF_EVENTS) += pmu-emul.o
|
||||
|
||||
# Work around a false positive Clang 22 -Wuninitialized-const-pointer warning
|
||||
CFLAGS_sys_regs.o := $(call cc-disable-warning, uninitialized-const-pointer)
|
||||
|
|
|
|||
|
|
@ -341,7 +341,7 @@ static void __maybe_unused build_bhb_mitigation(struct jit_ctx *ctx)
|
|||
arm64_get_spectre_v2_state() == SPECTRE_VULNERABLE)
|
||||
return;
|
||||
|
||||
if (capable(CAP_SYS_ADMIN))
|
||||
if (ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN))
|
||||
return;
|
||||
|
||||
if (supports_clearbhb(SCOPE_SYSTEM)) {
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@ static inline void csky_cmpxchg_fixup(struct pt_regs *regs)
|
|||
if (trap_no(regs) != VEC_TLBMODIFIED)
|
||||
return;
|
||||
|
||||
if (instruction_pointer(regs) == csky_cmpxchg_stw)
|
||||
instruction_pointer_set(regs, csky_cmpxchg_ldw);
|
||||
if (instruction_pointer(regs) == (unsigned long)&csky_cmpxchg_stw)
|
||||
instruction_pointer_set(regs, (unsigned long)&csky_cmpxchg_ldw);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -260,6 +260,8 @@ int main(void)
|
|||
BLANK();
|
||||
DEFINE(TIF_BLOCKSTEP_PA_BIT, 31-TIF_BLOCKSTEP);
|
||||
DEFINE(TIF_SINGLESTEP_PA_BIT, 31-TIF_SINGLESTEP);
|
||||
DEFINE(TIF_32BIT_PA_BIT, 31-TIF_32BIT);
|
||||
|
||||
BLANK();
|
||||
DEFINE(ASM_PMD_SHIFT, PMD_SHIFT);
|
||||
DEFINE(ASM_PGDIR_SHIFT, PGDIR_SHIFT);
|
||||
|
|
|
|||
|
|
@ -1072,8 +1072,6 @@ ENTRY_CFI(intr_save) /* for os_hpmc */
|
|||
STREG %r17, PT_IOR(%r29)
|
||||
|
||||
#if defined(CONFIG_64BIT)
|
||||
b,n intr_save2
|
||||
|
||||
skip_save_ior:
|
||||
/* We have a itlb miss, and when executing code above 4 Gb on ILP64, we
|
||||
* need to adjust iasq/iaoq here in the same way we adjusted isr/ior
|
||||
|
|
@ -1082,10 +1080,17 @@ skip_save_ior:
|
|||
bb,COND(>=),n %r8,PSW_W_BIT,intr_save2
|
||||
LDREG PT_IASQ0(%r29), %r16
|
||||
LDREG PT_IAOQ0(%r29), %r17
|
||||
/* adjust iasq/iaoq */
|
||||
/* adjust iasq0/iaoq0 */
|
||||
space_adjust %r16,%r17,%r1
|
||||
STREG %r16, PT_IASQ0(%r29)
|
||||
STREG %r17, PT_IAOQ0(%r29)
|
||||
|
||||
LDREG PT_IASQ1(%r29), %r16
|
||||
LDREG PT_IAOQ1(%r29), %r17
|
||||
/* adjust iasq1/iaoq1 */
|
||||
space_adjust %r16,%r17,%r1
|
||||
STREG %r16, PT_IASQ1(%r29)
|
||||
STREG %r17, PT_IAOQ1(%r29)
|
||||
#else
|
||||
skip_save_ior:
|
||||
#endif
|
||||
|
|
@ -1908,6 +1913,10 @@ syscall_restore_rfi:
|
|||
extru,= %r19,TIF_BLOCKSTEP_PA_BIT,1,%r0
|
||||
depi -1,7,1,%r20 /* T bit */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
extru,<> %r19,TIF_32BIT_PA_BIT,1,%r0
|
||||
depi -1,4,1,%r20 /* W bit */
|
||||
#endif
|
||||
STREG %r20,TASK_PT_PSW(%r1)
|
||||
|
||||
/* Always store space registers, since sr3 can be changed (e.g. fork) */
|
||||
|
|
@ -1921,7 +1930,6 @@ syscall_restore_rfi:
|
|||
STREG %r25,TASK_PT_IASQ0(%r1)
|
||||
STREG %r25,TASK_PT_IASQ1(%r1)
|
||||
|
||||
/* XXX W bit??? */
|
||||
/* Now if old D bit is clear, it means we didn't save all registers
|
||||
* on syscall entry, so do that now. This only happens on TRACEME
|
||||
* calls, or if someone attached to us while we were on a syscall.
|
||||
|
|
|
|||
|
|
@ -68,8 +68,8 @@ static int e_class = ELFCLASS32;
|
|||
#define PUT_16BE(off, v)(buf[off] = ((v) >> 8) & 0xff, \
|
||||
buf[(off) + 1] = (v) & 0xff)
|
||||
#define PUT_32BE(off, v)(PUT_16BE((off), (v) >> 16L), PUT_16BE((off) + 2, (v)))
|
||||
#define PUT_64BE(off, v)((PUT_32BE((off), (v) >> 32L), \
|
||||
PUT_32BE((off) + 4, (v))))
|
||||
#define PUT_64BE(off, v)((PUT_32BE((off), (unsigned long long)(v) >> 32L), \
|
||||
PUT_32BE((off) + 4, (unsigned long long)(v))))
|
||||
|
||||
#define GET_16LE(off) ((buf[off]) + (buf[(off)+1] << 8))
|
||||
#define GET_32LE(off) (GET_16LE(off) + (GET_16LE((off)+2U) << 16U))
|
||||
|
|
@ -78,7 +78,8 @@ static int e_class = ELFCLASS32;
|
|||
#define PUT_16LE(off, v) (buf[off] = (v) & 0xff, \
|
||||
buf[(off) + 1] = ((v) >> 8) & 0xff)
|
||||
#define PUT_32LE(off, v) (PUT_16LE((off), (v)), PUT_16LE((off) + 2, (v) >> 16L))
|
||||
#define PUT_64LE(off, v) (PUT_32LE((off), (v)), PUT_32LE((off) + 4, (v) >> 32L))
|
||||
#define PUT_64LE(off, v) (PUT_32LE((off), (unsigned long long)(v)), \
|
||||
PUT_32LE((off) + 4, (unsigned long long)(v) >> 32L))
|
||||
|
||||
#define GET_16(off) (e_data == ELFDATA2MSB ? GET_16BE(off) : GET_16LE(off))
|
||||
#define GET_32(off) (e_data == ELFDATA2MSB ? GET_32BE(off) : GET_32LE(off))
|
||||
|
|
|
|||
|
|
@ -524,7 +524,6 @@ void slb_dump_contents(struct slb_entry *slb_ptr);
|
|||
|
||||
extern void slb_vmalloc_update(void);
|
||||
extern void slb_set_size(u16 size);
|
||||
void preload_new_slb_context(unsigned long start, unsigned long sp);
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -314,10 +314,9 @@ interrupt_return:
|
|||
mtspr SPRN_SRR1,r12
|
||||
|
||||
BEGIN_FTR_SECTION
|
||||
lwarx r0,0,r1
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX)
|
||||
stwcx. r0,0,r1 /* to clear the reservation */
|
||||
FTR_SECTION_ELSE
|
||||
lwarx r0,0,r1
|
||||
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
|
||||
|
||||
lwz r3,_CCR(r1)
|
||||
lwz r4,_LINK(r1)
|
||||
|
|
@ -360,10 +359,9 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
|
|||
mtspr SPRN_SRR1,r12
|
||||
|
||||
BEGIN_FTR_SECTION
|
||||
lwarx r0,0,r1
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX)
|
||||
stwcx. r0,0,r1 /* to clear the reservation */
|
||||
FTR_SECTION_ELSE
|
||||
lwarx r0,0,r1
|
||||
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
|
||||
|
||||
lwz r3,_LINK(r1)
|
||||
lwz r4,_CTR(r1)
|
||||
|
|
|
|||
|
|
@ -1794,8 +1794,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
|||
return 0;
|
||||
}
|
||||
|
||||
void preload_new_slb_context(unsigned long start, unsigned long sp);
|
||||
|
||||
/*
|
||||
* Set up a thread for executing a new program
|
||||
*/
|
||||
|
|
@ -1803,9 +1801,6 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
|
|||
{
|
||||
#ifdef CONFIG_PPC64
|
||||
unsigned long load_addr = regs->gpr[2]; /* saved by ELF_PLAT_INIT */
|
||||
|
||||
if (IS_ENABLED(CONFIG_PPC_BOOK3S_64) && !radix_enabled())
|
||||
preload_new_slb_context(start, sp);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ static inline bool stress_slb(void)
|
|||
return static_branch_unlikely(&stress_slb_key);
|
||||
}
|
||||
|
||||
void slb_setup_new_exec(void);
|
||||
|
||||
void exit_lazy_flush_tlb(struct mm_struct *mm, bool always_flush);
|
||||
|
||||
|
|
|
|||
|
|
@ -147,8 +147,6 @@ static int hash__init_new_context(struct mm_struct *mm)
|
|||
void hash__setup_new_exec(void)
|
||||
{
|
||||
slice_setup_new_exec();
|
||||
|
||||
slb_setup_new_exec();
|
||||
}
|
||||
|
||||
static int radix__init_new_context(struct mm_struct *mm)
|
||||
|
|
|
|||
|
|
@ -329,94 +329,6 @@ static void preload_age(struct thread_info *ti)
|
|||
ti->slb_preload_tail = (ti->slb_preload_tail + 1) % SLB_PRELOAD_NR;
|
||||
}
|
||||
|
||||
void slb_setup_new_exec(void)
|
||||
{
|
||||
struct thread_info *ti = current_thread_info();
|
||||
struct mm_struct *mm = current->mm;
|
||||
unsigned long exec = 0x10000000;
|
||||
|
||||
WARN_ON(irqs_disabled());
|
||||
|
||||
/*
|
||||
* preload cache can only be used to determine whether a SLB
|
||||
* entry exists if it does not start to overflow.
|
||||
*/
|
||||
if (ti->slb_preload_nr + 2 > SLB_PRELOAD_NR)
|
||||
return;
|
||||
|
||||
hard_irq_disable();
|
||||
|
||||
/*
|
||||
* We have no good place to clear the slb preload cache on exec,
|
||||
* flush_thread is about the earliest arch hook but that happens
|
||||
* after we switch to the mm and have aleady preloaded the SLBEs.
|
||||
*
|
||||
* For the most part that's probably okay to use entries from the
|
||||
* previous exec, they will age out if unused. It may turn out to
|
||||
* be an advantage to clear the cache before switching to it,
|
||||
* however.
|
||||
*/
|
||||
|
||||
/*
|
||||
* preload some userspace segments into the SLB.
|
||||
* Almost all 32 and 64bit PowerPC executables are linked at
|
||||
* 0x10000000 so it makes sense to preload this segment.
|
||||
*/
|
||||
if (!is_kernel_addr(exec)) {
|
||||
if (preload_add(ti, exec))
|
||||
slb_allocate_user(mm, exec);
|
||||
}
|
||||
|
||||
/* Libraries and mmaps. */
|
||||
if (!is_kernel_addr(mm->mmap_base)) {
|
||||
if (preload_add(ti, mm->mmap_base))
|
||||
slb_allocate_user(mm, mm->mmap_base);
|
||||
}
|
||||
|
||||
/* see switch_slb */
|
||||
asm volatile("isync" : : : "memory");
|
||||
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
void preload_new_slb_context(unsigned long start, unsigned long sp)
|
||||
{
|
||||
struct thread_info *ti = current_thread_info();
|
||||
struct mm_struct *mm = current->mm;
|
||||
unsigned long heap = mm->start_brk;
|
||||
|
||||
WARN_ON(irqs_disabled());
|
||||
|
||||
/* see above */
|
||||
if (ti->slb_preload_nr + 3 > SLB_PRELOAD_NR)
|
||||
return;
|
||||
|
||||
hard_irq_disable();
|
||||
|
||||
/* Userspace entry address. */
|
||||
if (!is_kernel_addr(start)) {
|
||||
if (preload_add(ti, start))
|
||||
slb_allocate_user(mm, start);
|
||||
}
|
||||
|
||||
/* Top of stack, grows down. */
|
||||
if (!is_kernel_addr(sp)) {
|
||||
if (preload_add(ti, sp))
|
||||
slb_allocate_user(mm, sp);
|
||||
}
|
||||
|
||||
/* Bottom of heap, grows up. */
|
||||
if (heap && !is_kernel_addr(heap)) {
|
||||
if (preload_add(ti, heap))
|
||||
slb_allocate_user(mm, heap);
|
||||
}
|
||||
|
||||
/* see switch_slb */
|
||||
asm volatile("isync" : : : "memory");
|
||||
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
static void slb_cache_slbie_kernel(unsigned int index)
|
||||
{
|
||||
unsigned long slbie_data = get_paca()->slb_cache[index];
|
||||
|
|
|
|||
|
|
@ -216,6 +216,8 @@ static int native_find(unsigned long ea, int psize, bool primary, u64 *v, u64
|
|||
vpn = hpt_vpn(ea, vsid, ssize);
|
||||
hash = hpt_hash(vpn, shift, ssize);
|
||||
want_v = hpte_encode_avpn(vpn, psize, ssize);
|
||||
if (cpu_has_feature(CPU_FTR_ARCH_300))
|
||||
want_v = hpte_old_to_new_v(want_v);
|
||||
|
||||
/* to check in the secondary hash table, we invert the hash */
|
||||
if (!primary)
|
||||
|
|
@ -229,6 +231,10 @@ static int native_find(unsigned long ea, int psize, bool primary, u64 *v, u64
|
|||
/* HPTE matches */
|
||||
*v = be64_to_cpu(hptep->v);
|
||||
*r = be64_to_cpu(hptep->r);
|
||||
if (cpu_has_feature(CPU_FTR_ARCH_300)) {
|
||||
*v = hpte_new_to_old_v(*v, *r);
|
||||
*r = hpte_new_to_old_r(*r);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
++hpte_group;
|
||||
|
|
|
|||
|
|
@ -550,7 +550,7 @@ static int cmm_migratepage(struct balloon_dev_info *b_dev_info,
|
|||
|
||||
spin_lock_irqsave(&b_dev_info->pages_lock, flags);
|
||||
balloon_page_insert(b_dev_info, newpage);
|
||||
balloon_page_delete(page);
|
||||
__count_vm_event(BALLOON_MIGRATE);
|
||||
b_dev_info->isolated_pages--;
|
||||
spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
|
||||
|
||||
|
|
@ -560,6 +560,7 @@ static int cmm_migratepage(struct balloon_dev_info *b_dev_info,
|
|||
*/
|
||||
plpar_page_set_active(page);
|
||||
|
||||
balloon_page_finalize(page);
|
||||
/* balloon page list reference */
|
||||
put_page(page);
|
||||
|
||||
|
|
@ -570,7 +571,6 @@ static int cmm_balloon_compaction_init(void)
|
|||
{
|
||||
int rc;
|
||||
|
||||
balloon_devinfo_init(&b_dev_info);
|
||||
b_dev_info.migratepage = cmm_migratepage;
|
||||
|
||||
balloon_mnt = kern_mount(&balloon_fs);
|
||||
|
|
@ -624,6 +624,7 @@ static int cmm_init(void)
|
|||
if (!firmware_has_feature(FW_FEATURE_CMO) && !simulate)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
balloon_devinfo_init(&b_dev_info);
|
||||
rc = cmm_balloon_compaction_init();
|
||||
if (rc)
|
||||
return rc;
|
||||
|
|
|
|||
|
|
@ -754,6 +754,7 @@ static void __ref smp_get_core_info(struct sclp_core_info *info, int early)
|
|||
continue;
|
||||
info->core[info->configured].core_id =
|
||||
address >> smp_cpu_mt_shift;
|
||||
info->core[info->configured].type = boot_core_type;
|
||||
info->configured++;
|
||||
}
|
||||
info->combined = info->configured;
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ SYM_FUNC_START(blake2s_compress_ssse3)
|
|||
movdqa ROT16(%rip),%xmm12
|
||||
movdqa ROR328(%rip),%xmm13
|
||||
movdqu 0x20(%rdi),%xmm14
|
||||
movq %rcx,%xmm15
|
||||
movd %ecx,%xmm15
|
||||
leaq SIGMA+0xa0(%rip),%r8
|
||||
jmp .Lbeginofloop
|
||||
.align 32
|
||||
|
|
@ -179,7 +179,7 @@ SYM_FUNC_START(blake2s_compress_avx512)
|
|||
vmovdqu (%rdi),%xmm0
|
||||
vmovdqu 0x10(%rdi),%xmm1
|
||||
vmovdqu 0x20(%rdi),%xmm4
|
||||
vmovq %rcx,%xmm5
|
||||
vmovd %ecx,%xmm5
|
||||
vmovdqa IV(%rip),%xmm14
|
||||
vmovdqa IV+16(%rip),%xmm15
|
||||
jmp .Lblake2s_compress_avx512_mainloop
|
||||
|
|
|
|||
|
|
@ -2790,7 +2790,7 @@ perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs *re
|
|||
static inline int
|
||||
valid_user_frame(const void __user *fp, unsigned long size)
|
||||
{
|
||||
return (__range_not_ok(fp, size, TASK_SIZE) == 0);
|
||||
return __access_ok(fp, size);
|
||||
}
|
||||
|
||||
static unsigned long get_segment_base(unsigned int segment)
|
||||
|
|
|
|||
|
|
@ -3639,7 +3639,9 @@ static unsigned long intel_pmu_large_pebs_flags(struct perf_event *event)
|
|||
if (!event->attr.exclude_kernel)
|
||||
flags &= ~PERF_SAMPLE_REGS_USER;
|
||||
if (event->attr.sample_regs_user & ~PEBS_GP_REGS)
|
||||
flags &= ~(PERF_SAMPLE_REGS_USER | PERF_SAMPLE_REGS_INTR);
|
||||
flags &= ~PERF_SAMPLE_REGS_USER;
|
||||
if (event->attr.sample_regs_intr & ~PEBS_GP_REGS)
|
||||
flags &= ~PERF_SAMPLE_REGS_INTR;
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -109,12 +109,12 @@ convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs);
|
|||
extern void send_sigtrap(struct pt_regs *regs, int error_code, int si_code);
|
||||
|
||||
|
||||
static inline unsigned long regs_return_value(struct pt_regs *regs)
|
||||
static __always_inline unsigned long regs_return_value(struct pt_regs *regs)
|
||||
{
|
||||
return regs->ax;
|
||||
}
|
||||
|
||||
static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
|
||||
static __always_inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
|
||||
{
|
||||
regs->ax = rc;
|
||||
}
|
||||
|
|
@ -195,34 +195,34 @@ static inline bool ip_within_syscall_gap(struct pt_regs *regs)
|
|||
}
|
||||
#endif
|
||||
|
||||
static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
|
||||
static __always_inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
|
||||
{
|
||||
return regs->sp;
|
||||
}
|
||||
|
||||
static inline unsigned long instruction_pointer(struct pt_regs *regs)
|
||||
static __always_inline unsigned long instruction_pointer(struct pt_regs *regs)
|
||||
{
|
||||
return regs->ip;
|
||||
}
|
||||
|
||||
static inline void instruction_pointer_set(struct pt_regs *regs,
|
||||
unsigned long val)
|
||||
static __always_inline
|
||||
void instruction_pointer_set(struct pt_regs *regs, unsigned long val)
|
||||
{
|
||||
regs->ip = val;
|
||||
}
|
||||
|
||||
static inline unsigned long frame_pointer(struct pt_regs *regs)
|
||||
static __always_inline unsigned long frame_pointer(struct pt_regs *regs)
|
||||
{
|
||||
return regs->bp;
|
||||
}
|
||||
|
||||
static inline unsigned long user_stack_pointer(struct pt_regs *regs)
|
||||
static __always_inline unsigned long user_stack_pointer(struct pt_regs *regs)
|
||||
{
|
||||
return regs->sp;
|
||||
}
|
||||
|
||||
static inline void user_stack_pointer_set(struct pt_regs *regs,
|
||||
unsigned long val)
|
||||
static __always_inline
|
||||
void user_stack_pointer_set(struct pt_regs *regs, unsigned long val)
|
||||
{
|
||||
regs->sp = val;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,8 +16,10 @@
|
|||
* Test whether a block of memory is a valid user space address.
|
||||
* Returns 0 if the range is valid, nonzero otherwise.
|
||||
*/
|
||||
static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size, unsigned long limit)
|
||||
static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size)
|
||||
{
|
||||
unsigned long limit = TASK_SIZE_MAX;
|
||||
|
||||
/*
|
||||
* If we have used "sizeof()" for the size,
|
||||
* we know it won't overflow the limit (but
|
||||
|
|
@ -35,10 +37,10 @@ static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size, un
|
|||
return unlikely(addr > limit);
|
||||
}
|
||||
|
||||
#define __range_not_ok(addr, size, limit) \
|
||||
#define __access_ok(addr, size) \
|
||||
({ \
|
||||
__chk_user_ptr(addr); \
|
||||
__chk_range_not_ok((unsigned long __force)(addr), size, limit); \
|
||||
!__chk_range_not_ok((unsigned long __force)(addr), size); \
|
||||
})
|
||||
|
||||
#ifdef CONFIG_DEBUG_ATOMIC_SLEEP
|
||||
|
|
@ -69,7 +71,7 @@ static inline bool pagefault_disabled(void);
|
|||
#define access_ok(addr, size) \
|
||||
({ \
|
||||
WARN_ON_IN_IRQ(); \
|
||||
likely(!__range_not_ok(addr, size, TASK_SIZE_MAX)); \
|
||||
likely(__access_ok(addr, size)); \
|
||||
})
|
||||
|
||||
extern int __get_user_1(void);
|
||||
|
|
|
|||
|
|
@ -81,12 +81,6 @@ static int copy_code(struct pt_regs *regs, u8 *buf, unsigned long src,
|
|||
/* The user space code from other tasks cannot be accessed. */
|
||||
if (regs != task_pt_regs(current))
|
||||
return -EPERM;
|
||||
/*
|
||||
* Make sure userspace isn't trying to trick us into dumping kernel
|
||||
* memory by pointing the userspace instruction pointer at it.
|
||||
*/
|
||||
if (__chk_range_not_ok(src, nbytes, TASK_SIZE_MAX))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Even if named copy_from_user_nmi() this can be invoked from
|
||||
|
|
@ -183,8 +177,14 @@ static void show_regs_if_on_stack(struct stack_info *info, struct pt_regs *regs,
|
|||
}
|
||||
}
|
||||
|
||||
static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long *stack, const char *log_lvl)
|
||||
/*
|
||||
* This function reads pointers from the stack and dereferences them. The
|
||||
* pointers may not have their KMSAN shadow set up properly, which may result
|
||||
* in false positive reports. Disable instrumentation to avoid those.
|
||||
*/
|
||||
__no_kmsan_checks
|
||||
static void __show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long *stack, const char *log_lvl)
|
||||
{
|
||||
struct unwind_state state;
|
||||
struct stack_info stack_info = {0};
|
||||
|
|
@ -305,6 +305,25 @@ next:
|
|||
}
|
||||
}
|
||||
|
||||
static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long *stack, const char *log_lvl)
|
||||
{
|
||||
/*
|
||||
* Disable KASAN to avoid false positives during walking another
|
||||
* task's stacks, as values on these stacks may change concurrently
|
||||
* with task execution.
|
||||
*/
|
||||
bool disable_kasan = task && task != current;
|
||||
|
||||
if (disable_kasan)
|
||||
kasan_disable_current();
|
||||
|
||||
__show_trace_log_lvl(task, regs, stack, log_lvl);
|
||||
|
||||
if (disable_kasan)
|
||||
kasan_enable_current();
|
||||
}
|
||||
|
||||
void show_stack(struct task_struct *task, unsigned long *sp,
|
||||
const char *loglvl)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ copy_stack_frame(const struct stack_frame_user __user *fp,
|
|||
{
|
||||
int ret;
|
||||
|
||||
if (__range_not_ok(fp, sizeof(*frame), TASK_SIZE))
|
||||
if (!__access_ok(fp, sizeof(*frame)))
|
||||
return 0;
|
||||
|
||||
ret = 1;
|
||||
|
|
|
|||
|
|
@ -183,6 +183,16 @@ static struct pt_regs *decode_frame_pointer(unsigned long *bp)
|
|||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* While walking the stack, KMSAN may stomp on stale locals from other
|
||||
* functions that were marked as uninitialized upon function exit, and
|
||||
* now hold the call frame information for the current function (e.g. the frame
|
||||
* pointer). Because KMSAN does not specifically mark call frames as
|
||||
* initialized, false positive reports are possible. To prevent such reports,
|
||||
* we mark the functions scanning the stack (here and below) with
|
||||
* __no_kmsan_checks.
|
||||
*/
|
||||
__no_kmsan_checks
|
||||
static bool update_stack_state(struct unwind_state *state,
|
||||
unsigned long *next_bp)
|
||||
{
|
||||
|
|
@ -251,6 +261,7 @@ static bool update_stack_state(struct unwind_state *state,
|
|||
return true;
|
||||
}
|
||||
|
||||
__no_kmsan_checks
|
||||
bool unwind_next_frame(struct unwind_state *state)
|
||||
{
|
||||
struct pt_regs *regs;
|
||||
|
|
|
|||
|
|
@ -1803,15 +1803,33 @@ static void advance_periodic_target_expiration(struct kvm_lapic *apic)
|
|||
ktime_t delta;
|
||||
|
||||
/*
|
||||
* Synchronize both deadlines to the same time source or
|
||||
* differences in the periods (caused by differences in the
|
||||
* underlying clocks or numerical approximation errors) will
|
||||
* cause the two to drift apart over time as the errors
|
||||
* accumulate.
|
||||
* Use kernel time as the time source for both the hrtimer deadline and
|
||||
* TSC-based deadline so that they stay synchronized. Computing each
|
||||
* deadline independently will cause the two deadlines to drift apart
|
||||
* over time as differences in the periods accumulate, e.g. due to
|
||||
* differences in the underlying clocks or numerical approximation errors.
|
||||
*/
|
||||
apic->lapic_timer.target_expiration =
|
||||
ktime_add_ns(apic->lapic_timer.target_expiration,
|
||||
apic->lapic_timer.period);
|
||||
|
||||
/*
|
||||
* If the new expiration is in the past, e.g. because userspace stopped
|
||||
* running the VM for an extended duration, then force the expiration
|
||||
* to "now" and don't try to play catch-up with the missed events. KVM
|
||||
* will only deliver a single interrupt regardless of how many events
|
||||
* are pending, i.e. restarting the timer with an expiration in the
|
||||
* past will do nothing more than waste host cycles, and can even lead
|
||||
* to a hard lockup in extreme cases.
|
||||
*/
|
||||
if (ktime_before(apic->lapic_timer.target_expiration, now))
|
||||
apic->lapic_timer.target_expiration = now;
|
||||
|
||||
/*
|
||||
* Note, ensuring the expiration isn't in the past also prevents delta
|
||||
* from going negative, which could cause the TSC deadline to become
|
||||
* excessively large due to it an unsigned value.
|
||||
*/
|
||||
delta = ktime_sub(apic->lapic_timer.target_expiration, now);
|
||||
apic->lapic_timer.tscdeadline = kvm_read_l1_tsc(apic->vcpu, tscl) +
|
||||
nsec_to_cycles(apic->vcpu, delta);
|
||||
|
|
@ -2449,9 +2467,9 @@ static enum hrtimer_restart apic_timer_fn(struct hrtimer *data)
|
|||
|
||||
apic_timer_expired(apic, true);
|
||||
|
||||
if (lapic_is_periodic(apic)) {
|
||||
if (lapic_is_periodic(apic) && !WARN_ON_ONCE(!apic->lapic_timer.period)) {
|
||||
advance_periodic_target_expiration(apic);
|
||||
hrtimer_add_expires_ns(&ktimer->timer, ktimer->period);
|
||||
hrtimer_set_expires(&ktimer->timer, ktimer->target_expiration);
|
||||
return HRTIMER_RESTART;
|
||||
} else
|
||||
return HRTIMER_NORESTART;
|
||||
|
|
|
|||
|
|
@ -456,6 +456,7 @@ static void nested_vmcb02_prepare_save(struct vcpu_svm *svm, struct vmcb *vmcb12
|
|||
bool new_vmcb12 = false;
|
||||
|
||||
nested_vmcb02_compute_g_pat(svm);
|
||||
vmcb_mark_dirty(svm->vmcb, VMCB_NPT);
|
||||
|
||||
/* Load the nested guest state */
|
||||
if (svm->nested.vmcb12_gpa != svm->nested.last_vmcb12_gpa) {
|
||||
|
|
@ -667,7 +668,7 @@ int nested_svm_vmrun(struct kvm_vcpu *vcpu)
|
|||
if (!nested_vmcb_valid_sregs(vcpu, &vmcb12->save) ||
|
||||
!nested_vmcb_check_controls(vcpu, &svm->nested.ctl)) {
|
||||
vmcb12->control.exit_code = SVM_EXIT_ERR;
|
||||
vmcb12->control.exit_code_hi = 0;
|
||||
vmcb12->control.exit_code_hi = -1u;
|
||||
vmcb12->control.exit_info_1 = 0;
|
||||
vmcb12->control.exit_info_2 = 0;
|
||||
goto out;
|
||||
|
|
@ -698,7 +699,7 @@ out_exit_err:
|
|||
svm->nested.nested_run_pending = 0;
|
||||
|
||||
svm->vmcb->control.exit_code = SVM_EXIT_ERR;
|
||||
svm->vmcb->control.exit_code_hi = 0;
|
||||
svm->vmcb->control.exit_code_hi = -1u;
|
||||
svm->vmcb->control.exit_info_1 = 0;
|
||||
svm->vmcb->control.exit_info_2 = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -2496,6 +2496,7 @@ static bool check_selective_cr0_intercepted(struct kvm_vcpu *vcpu,
|
|||
|
||||
if (cr0 ^ val) {
|
||||
svm->vmcb->control.exit_code = SVM_EXIT_CR0_SEL_WRITE;
|
||||
svm->vmcb->control.exit_code_hi = 0;
|
||||
ret = (nested_svm_exit_handled(svm) == NESTED_EXIT_DONE);
|
||||
}
|
||||
|
||||
|
|
@ -4214,20 +4215,20 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu,
|
|||
INTERCEPT_SELECTIVE_CR0)))
|
||||
break;
|
||||
|
||||
cr0 = vcpu->arch.cr0 & ~SVM_CR0_SELECTIVE_MASK;
|
||||
val = info->src_val & ~SVM_CR0_SELECTIVE_MASK;
|
||||
|
||||
/* LMSW always triggers INTERCEPT_SELECTIVE_CR0 */
|
||||
if (info->intercept == x86_intercept_lmsw) {
|
||||
cr0 &= 0xfUL;
|
||||
val &= 0xfUL;
|
||||
/* lmsw can't clear PE - catch this here */
|
||||
if (cr0 & X86_CR0_PE)
|
||||
val |= X86_CR0_PE;
|
||||
icpt_info.exit_code = SVM_EXIT_CR0_SEL_WRITE;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* MOV-to-CR0 only triggers INTERCEPT_SELECTIVE_CR0 if any bit
|
||||
* other than SVM_CR0_SELECTIVE_MASK is changed.
|
||||
*/
|
||||
cr0 = vcpu->arch.cr0 & ~SVM_CR0_SELECTIVE_MASK;
|
||||
val = info->src_val & ~SVM_CR0_SELECTIVE_MASK;
|
||||
if (cr0 ^ val)
|
||||
icpt_info.exit_code = SVM_EXIT_CR0_SEL_WRITE;
|
||||
|
||||
break;
|
||||
}
|
||||
case SVM_EXIT_READ_DR0:
|
||||
|
|
@ -4288,6 +4289,7 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu,
|
|||
if (static_cpu_has(X86_FEATURE_NRIPS))
|
||||
vmcb->control.next_rip = info->next_rip;
|
||||
vmcb->control.exit_code = icpt_info.exit_code;
|
||||
vmcb->control.exit_code_hi = 0;
|
||||
vmexit = nested_svm_exit_handled(svm);
|
||||
|
||||
ret = (vmexit == NESTED_EXIT_DONE) ? X86EMUL_INTERCEPTED
|
||||
|
|
|
|||
|
|
@ -474,9 +474,10 @@ int nested_svm_vmexit(struct vcpu_svm *svm);
|
|||
|
||||
static inline int nested_svm_simple_vmexit(struct vcpu_svm *svm, u32 exit_code)
|
||||
{
|
||||
svm->vmcb->control.exit_code = exit_code;
|
||||
svm->vmcb->control.exit_info_1 = 0;
|
||||
svm->vmcb->control.exit_info_2 = 0;
|
||||
svm->vmcb->control.exit_code = exit_code;
|
||||
svm->vmcb->control.exit_code_hi = 0;
|
||||
svm->vmcb->control.exit_info_1 = 0;
|
||||
svm->vmcb->control.exit_info_2 = 0;
|
||||
return nested_svm_vmexit(svm);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4684,7 +4684,7 @@ void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 vm_exit_reason,
|
|||
|
||||
if (vmx->nested.update_vmcs01_apicv_status) {
|
||||
vmx->nested.update_vmcs01_apicv_status = false;
|
||||
kvm_make_request(KVM_REQ_APICV_UPDATE, vcpu);
|
||||
vmx_refresh_apicv_exec_ctrl(vcpu);
|
||||
}
|
||||
|
||||
if ((vm_exit_reason != -1) &&
|
||||
|
|
|
|||
|
|
@ -4217,7 +4217,7 @@ static u32 vmx_vmexit_ctrl(void)
|
|||
~(VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | VM_EXIT_LOAD_IA32_EFER);
|
||||
}
|
||||
|
||||
static void vmx_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu)
|
||||
void vmx_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||
|
||||
|
|
|
|||
|
|
@ -386,6 +386,7 @@ void __vmx_set_segment(struct kvm_vcpu *vcpu, struct kvm_segment *var, int seg);
|
|||
u64 construct_eptp(struct kvm_vcpu *vcpu, hpa_t root_hpa, int root_level);
|
||||
|
||||
bool vmx_guest_inject_ac(struct kvm_vcpu *vcpu);
|
||||
void vmx_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu);
|
||||
void vmx_update_exception_bitmap(struct kvm_vcpu *vcpu);
|
||||
bool vmx_nmi_blocked(struct kvm_vcpu *vcpu);
|
||||
bool __vmx_interrupt_blocked(struct kvm_vcpu *vcpu);
|
||||
|
|
|
|||
|
|
@ -5294,7 +5294,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
|||
if (copy_from_user(&events, argp, sizeof(struct kvm_vcpu_events)))
|
||||
break;
|
||||
|
||||
vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
|
||||
r = kvm_vcpu_ioctl_x86_set_vcpu_events(vcpu, &events);
|
||||
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
|
||||
break;
|
||||
}
|
||||
case KVM_GET_DEBUGREGS: {
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ copy_from_user_nmi(void *to, const void __user *from, unsigned long n)
|
|||
{
|
||||
unsigned long ret;
|
||||
|
||||
if (__range_not_ok(from, n, TASK_SIZE))
|
||||
if (!__access_ok(from, n))
|
||||
return n;
|
||||
|
||||
if (!nmi_uaccess_okay())
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/sched/sysctl.h>
|
||||
#include <linux/sched/topology.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/crash_dump.h>
|
||||
#include <linux/prefetch.h>
|
||||
|
|
@ -2585,6 +2586,7 @@ static int blk_mq_hctx_notify_offline(unsigned int cpu, struct hlist_node *node)
|
|||
{
|
||||
struct blk_mq_hw_ctx *hctx = hlist_entry_safe(node,
|
||||
struct blk_mq_hw_ctx, cpuhp_online);
|
||||
int ret = 0;
|
||||
|
||||
if (!cpumask_test_cpu(cpu, hctx->cpumask) ||
|
||||
!blk_mq_last_cpu_in_hctx(cpu, hctx))
|
||||
|
|
@ -2606,12 +2608,24 @@ static int blk_mq_hctx_notify_offline(unsigned int cpu, struct hlist_node *node)
|
|||
* frozen and there are no requests.
|
||||
*/
|
||||
if (percpu_ref_tryget(&hctx->queue->q_usage_counter)) {
|
||||
while (blk_mq_hctx_has_requests(hctx))
|
||||
while (blk_mq_hctx_has_requests(hctx)) {
|
||||
/*
|
||||
* The wakeup capable IRQ handler of block device is
|
||||
* not called during suspend. Skip the loop by checking
|
||||
* pm_wakeup_pending to prevent the deadlock and improve
|
||||
* suspend latency.
|
||||
*/
|
||||
if (pm_wakeup_pending()) {
|
||||
clear_bit(BLK_MQ_S_INACTIVE, &hctx->state);
|
||||
ret = -EBUSY;
|
||||
break;
|
||||
}
|
||||
msleep(5);
|
||||
}
|
||||
percpu_ref_put(&hctx->queue->q_usage_counter);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int blk_mq_hctx_notify_online(unsigned int cpu, struct hlist_node *node)
|
||||
|
|
|
|||
|
|
@ -2222,8 +2222,10 @@ bool blk_throtl_bio(struct bio *bio)
|
|||
rcu_read_lock();
|
||||
|
||||
/* see throtl_charge_bio() */
|
||||
if (bio_flagged(bio, BIO_THROTTLED))
|
||||
goto out;
|
||||
if (bio_flagged(bio, BIO_THROTTLED)) {
|
||||
rcu_read_unlock();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!cgroup_subsys_on_dfl(io_cgrp_subsys)) {
|
||||
blkg_rwstat_add(&tg->stat_bytes, bio->bi_opf,
|
||||
|
|
@ -2231,8 +2233,10 @@ bool blk_throtl_bio(struct bio *bio)
|
|||
blkg_rwstat_add(&tg->stat_ios, bio->bi_opf, 1);
|
||||
}
|
||||
|
||||
if (!tg->has_rules[rw])
|
||||
goto out;
|
||||
if (!tg->has_rules[rw]) {
|
||||
rcu_read_unlock();
|
||||
return false;
|
||||
}
|
||||
|
||||
spin_lock_irq(&q->queue_lock);
|
||||
|
||||
|
|
@ -2316,14 +2320,14 @@ again:
|
|||
}
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_irq(&q->queue_lock);
|
||||
out:
|
||||
bio_set_flag(bio, BIO_THROTTLED);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_THROTTLING_LOW
|
||||
if (throttled || !td->track_bio_latency)
|
||||
bio->bi_issue.value |= BIO_ISSUE_THROTL_SKIP_LATENCY;
|
||||
#endif
|
||||
spin_unlock_irq(&q->queue_lock);
|
||||
|
||||
rcu_read_unlock();
|
||||
return throttled;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ bool set_capacity_and_notify(struct gendisk *disk, sector_t size)
|
|||
(disk->flags & GENHD_FL_HIDDEN))
|
||||
return false;
|
||||
|
||||
pr_info("%s: detected capacity change from %lld to %lld\n",
|
||||
pr_info_ratelimited("%s: detected capacity change from %lld to %lld\n",
|
||||
disk->disk_name, capacity, size);
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1139,14 +1139,13 @@ struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk,
|
|||
if (unlikely(!areq))
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
memset(areq, 0, areqlen);
|
||||
|
||||
ctx->inflight = true;
|
||||
|
||||
areq->areqlen = areqlen;
|
||||
areq->sk = sk;
|
||||
areq->last_rsgl = NULL;
|
||||
INIT_LIST_HEAD(&areq->rsgl_list);
|
||||
areq->tsgl = NULL;
|
||||
areq->tsgl_entries = 0;
|
||||
|
||||
return areq;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -423,9 +423,8 @@ static int hash_accept_parent_nokey(void *private, struct sock *sk)
|
|||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
ctx->result = NULL;
|
||||
memset(ctx, 0, len);
|
||||
ctx->len = len;
|
||||
ctx->more = false;
|
||||
crypto_init_wait(&ctx->wait);
|
||||
|
||||
ask->private = ctx;
|
||||
|
|
|
|||
|
|
@ -250,9 +250,8 @@ static int rng_accept_parent(void *private, struct sock *sk)
|
|||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(ctx, 0, len);
|
||||
ctx->len = len;
|
||||
ctx->addtl = NULL;
|
||||
ctx->addtl_len = 0;
|
||||
|
||||
/*
|
||||
* No seeding done at that point -- if multiple accepts are
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include <crypto/public_key.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/overflow.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <keys/system_keyring.h>
|
||||
|
|
@ -138,12 +139,17 @@ struct asymmetric_key_id *asymmetric_key_generate_id(const void *val_1,
|
|||
size_t len_2)
|
||||
{
|
||||
struct asymmetric_key_id *kid;
|
||||
size_t kid_sz;
|
||||
size_t len;
|
||||
|
||||
kid = kmalloc(sizeof(struct asymmetric_key_id) + len_1 + len_2,
|
||||
GFP_KERNEL);
|
||||
if (check_add_overflow(len_1, len_2, &len))
|
||||
return ERR_PTR(-EOVERFLOW);
|
||||
if (check_add_overflow(sizeof(struct asymmetric_key_id), len, &kid_sz))
|
||||
return ERR_PTR(-EOVERFLOW);
|
||||
kid = kmalloc(kid_sz, GFP_KERNEL);
|
||||
if (!kid)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
kid->len = len_1 + len_2;
|
||||
kid->len = len;
|
||||
memcpy(kid->data, val_1, len_1);
|
||||
memcpy(kid->data + len_1, val_2, len_2);
|
||||
return kid;
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ static int seqiv_aead_encrypt(struct aead_request *req)
|
|||
struct aead_geniv_ctx *ctx = crypto_aead_ctx(geniv);
|
||||
struct aead_request *subreq = aead_request_ctx(req);
|
||||
crypto_completion_t compl;
|
||||
bool unaligned_info;
|
||||
void *data;
|
||||
u8 *info;
|
||||
unsigned int ivsize = 8;
|
||||
|
|
@ -80,8 +81,9 @@ static int seqiv_aead_encrypt(struct aead_request *req)
|
|||
return err;
|
||||
}
|
||||
|
||||
if (unlikely(!IS_ALIGNED((unsigned long)info,
|
||||
crypto_aead_alignmask(geniv) + 1))) {
|
||||
unaligned_info = !IS_ALIGNED((unsigned long)info,
|
||||
crypto_aead_alignmask(geniv) + 1);
|
||||
if (unlikely(unaligned_info)) {
|
||||
info = kmemdup(req->iv, ivsize, req->base.flags &
|
||||
CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL :
|
||||
GFP_ATOMIC);
|
||||
|
|
@ -101,7 +103,7 @@ static int seqiv_aead_encrypt(struct aead_request *req)
|
|||
scatterwalk_map_and_copy(info, req->dst, req->assoclen, ivsize, 1);
|
||||
|
||||
err = crypto_aead_encrypt(subreq);
|
||||
if (unlikely(info != req->iv))
|
||||
if (unlikely(unaligned_info))
|
||||
seqiv_aead_encrypt_complete2(req, err);
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -169,9 +169,12 @@ acpi_ns_walk_namespace(acpi_object_type type,
|
|||
|
||||
if (start_node == ACPI_ROOT_OBJECT) {
|
||||
start_node = acpi_gbl_root_node;
|
||||
if (!start_node) {
|
||||
return_ACPI_STATUS(AE_NO_NAMESPACE);
|
||||
}
|
||||
}
|
||||
|
||||
/* Avoid walking the namespace if the StartNode is NULL */
|
||||
|
||||
if (!start_node) {
|
||||
return_ACPI_STATUS(AE_NO_NAMESPACE);
|
||||
}
|
||||
|
||||
/* Null child means "get first node" */
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/moduleparam.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/timer.h>
|
||||
|
|
@ -500,6 +501,7 @@ static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata,
|
|||
{
|
||||
struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata);
|
||||
int flags = sync ? MF_ACTION_REQUIRED : 0;
|
||||
char error_type[120];
|
||||
bool queued = false;
|
||||
int sec_sev, i;
|
||||
char *p;
|
||||
|
|
@ -513,9 +515,8 @@ static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata,
|
|||
p = (char *)(err + 1);
|
||||
for (i = 0; i < err->err_info_num; i++) {
|
||||
struct cper_arm_err_info *err_info = (struct cper_arm_err_info *)p;
|
||||
bool is_cache = (err_info->type == CPER_ARM_CACHE_ERROR);
|
||||
bool is_cache = err_info->type & CPER_ARM_CACHE_ERROR;
|
||||
bool has_pa = (err_info->validation_bits & CPER_ARM_INFO_VALID_PHYSICAL_ADDR);
|
||||
const char *error_type = "unknown error";
|
||||
|
||||
/*
|
||||
* The field (err_info->error_info & BIT(26)) is fixed to set to
|
||||
|
|
@ -529,12 +530,15 @@ static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata,
|
|||
continue;
|
||||
}
|
||||
|
||||
if (err_info->type < ARRAY_SIZE(cper_proc_error_type_strs))
|
||||
error_type = cper_proc_error_type_strs[err_info->type];
|
||||
cper_bits_to_str(error_type, sizeof(error_type),
|
||||
FIELD_GET(CPER_ARM_ERR_TYPE_MASK, err_info->type),
|
||||
cper_proc_error_type_strs,
|
||||
ARRAY_SIZE(cper_proc_error_type_strs));
|
||||
|
||||
pr_warn_ratelimited(FW_WARN GHES_PFX
|
||||
"Unhandled processor error type: %s\n",
|
||||
error_type);
|
||||
"Unhandled processor error type 0x%02x: %s%s\n",
|
||||
err_info->type, error_type,
|
||||
(err_info->type & ~CPER_ARM_ERR_TYPE_MASK) ? " with reserved bit(s)" : "");
|
||||
p += err_info->length;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1185,7 +1185,8 @@ int cppc_get_perf_caps(int cpunum, struct cppc_perf_caps *perf_caps)
|
|||
/* Are any of the regs PCC ?*/
|
||||
if (CPC_IN_PCC(highest_reg) || CPC_IN_PCC(lowest_reg) ||
|
||||
CPC_IN_PCC(lowest_non_linear_reg) || CPC_IN_PCC(nominal_reg) ||
|
||||
CPC_IN_PCC(low_freq_reg) || CPC_IN_PCC(nom_freq_reg)) {
|
||||
CPC_IN_PCC(low_freq_reg) || CPC_IN_PCC(nom_freq_reg) ||
|
||||
CPC_IN_PCC(guaranteed_reg)) {
|
||||
if (pcc_ss_id < 0) {
|
||||
pr_debug("Invalid pcc_ss_id\n");
|
||||
return -ENODEV;
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ static int map_x2apic_id(struct acpi_subtable_header *entry,
|
|||
if (!(apic->lapic_flags & ACPI_MADT_ENABLED))
|
||||
return -ENODEV;
|
||||
|
||||
if (device_declaration && (apic->uid == acpi_id)) {
|
||||
if (apic->uid == acpi_id && (device_declaration || acpi_id < 255)) {
|
||||
*apic_id = apic->local_apic_id;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1168,7 +1168,7 @@ static struct fwnode_handle *acpi_graph_get_next_endpoint(
|
|||
|
||||
if (!prev) {
|
||||
do {
|
||||
port = fwnode_get_next_child_node(fwnode, port);
|
||||
port = acpi_get_next_subnode(fwnode, port);
|
||||
/*
|
||||
* The names of the port nodes begin with "port@"
|
||||
* followed by the number of the port node and they also
|
||||
|
|
@ -1186,13 +1186,13 @@ static struct fwnode_handle *acpi_graph_get_next_endpoint(
|
|||
if (!port)
|
||||
return NULL;
|
||||
|
||||
endpoint = fwnode_get_next_child_node(port, prev);
|
||||
endpoint = acpi_get_next_subnode(port, prev);
|
||||
while (!endpoint) {
|
||||
port = fwnode_get_next_child_node(fwnode, port);
|
||||
port = acpi_get_next_subnode(fwnode, port);
|
||||
if (!port)
|
||||
break;
|
||||
if (is_acpi_graph_node(port, "port"))
|
||||
endpoint = fwnode_get_next_child_node(port, NULL);
|
||||
endpoint = acpi_get_next_subnode(port, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1402,6 +1402,7 @@ static int acpi_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
|
|||
if (fwnode_property_read_u32(fwnode, "reg", &endpoint->id))
|
||||
fwnode_property_read_u32(fwnode, "endpoint", &endpoint->id);
|
||||
|
||||
fwnode_handle_put(port_fwnode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -144,6 +144,7 @@ int tegra_ahb_enable_smmu(struct device_node *dn)
|
|||
if (!dev)
|
||||
return -EPROBE_DEFER;
|
||||
ahb = dev_get_drvdata(dev);
|
||||
put_device(dev);
|
||||
val = gizmo_readl(ahb, AHB_ARBITRATION_XBAR_CTRL);
|
||||
val |= AHB_ARBITRATION_XBAR_CTRL_SMMU_INIT_DONE;
|
||||
gizmo_writel(ahb, val, AHB_ARBITRATION_XBAR_CTRL);
|
||||
|
|
|
|||
|
|
@ -1590,7 +1590,8 @@ he_stop(struct he_dev *he_dev)
|
|||
he_dev->tbrq_base, he_dev->tbrq_phys);
|
||||
|
||||
if (he_dev->tpdrq_base)
|
||||
dma_free_coherent(&he_dev->pci_dev->dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq),
|
||||
dma_free_coherent(&he_dev->pci_dev->dev,
|
||||
CONFIG_TPDRQ_SIZE * sizeof(struct he_tpdrq),
|
||||
he_dev->tpdrq_base, he_dev->tpdrq_phys);
|
||||
|
||||
dma_pool_destroy(he_dev->tpd_pool);
|
||||
|
|
|
|||
|
|
@ -1747,16 +1747,18 @@ void pm_runtime_init(struct device *dev)
|
|||
*/
|
||||
void pm_runtime_reinit(struct device *dev)
|
||||
{
|
||||
if (!pm_runtime_enabled(dev)) {
|
||||
if (dev->power.runtime_status == RPM_ACTIVE)
|
||||
pm_runtime_set_suspended(dev);
|
||||
if (dev->power.irq_safe) {
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
dev->power.irq_safe = 0;
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
if (dev->parent)
|
||||
pm_runtime_put(dev->parent);
|
||||
}
|
||||
if (pm_runtime_enabled(dev))
|
||||
return;
|
||||
|
||||
if (dev->power.runtime_status == RPM_ACTIVE)
|
||||
pm_runtime_set_suspended(dev);
|
||||
|
||||
if (dev->power.irq_safe) {
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
dev->power.irq_safe = 0;
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
if (dev->parent)
|
||||
pm_runtime_put(dev->parent);
|
||||
}
|
||||
/*
|
||||
* Clear power.needs_force_resume in case it has been set by
|
||||
|
|
|
|||
|
|
@ -331,7 +331,7 @@ static bool initialized;
|
|||
* This default is used whenever the current disk size is unknown.
|
||||
* [Now it is rather a minimum]
|
||||
*/
|
||||
#define MAX_DISK_SIZE 4 /* 3984 */
|
||||
#define MAX_DISK_SIZE (PAGE_SIZE / 1024)
|
||||
|
||||
/*
|
||||
* globals used by 'result()'
|
||||
|
|
|
|||
|
|
@ -487,7 +487,8 @@ done:
|
|||
}
|
||||
|
||||
/*
|
||||
* Send or receive packet.
|
||||
* Send or receive packet. Return a positive value on success and
|
||||
* negtive value on failue, and never return 0.
|
||||
*/
|
||||
static int sock_xmit(struct nbd_device *nbd, int index, int send,
|
||||
struct iov_iter *iter, int msg_flags, int *sent)
|
||||
|
|
@ -613,7 +614,7 @@ static int nbd_send_cmd(struct nbd_device *nbd, struct nbd_cmd *cmd, int index)
|
|||
result = sock_xmit(nbd, index, 1, &from,
|
||||
(type == NBD_CMD_WRITE) ? MSG_MORE : 0, &sent);
|
||||
trace_nbd_header_sent(req, handle);
|
||||
if (result <= 0) {
|
||||
if (result < 0) {
|
||||
if (was_interrupted(result)) {
|
||||
/* If we havne't sent anything we can just return BUSY,
|
||||
* however if we have sent something we need to make
|
||||
|
|
@ -657,7 +658,7 @@ send_pages:
|
|||
skip = 0;
|
||||
}
|
||||
result = sock_xmit(nbd, index, 1, &from, flags, &sent);
|
||||
if (result <= 0) {
|
||||
if (result < 0) {
|
||||
if (was_interrupted(result)) {
|
||||
/* We've already sent the header, we
|
||||
* have no choice but to set pending and
|
||||
|
|
@ -691,38 +692,45 @@ out:
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* NULL returned = something went wrong, inform userspace */
|
||||
static struct nbd_cmd *nbd_read_stat(struct nbd_device *nbd, int index)
|
||||
static int nbd_read_reply(struct nbd_device *nbd, int index,
|
||||
struct nbd_reply *reply)
|
||||
{
|
||||
struct kvec iov = {.iov_base = reply, .iov_len = sizeof(*reply)};
|
||||
struct iov_iter to;
|
||||
int result;
|
||||
|
||||
reply->magic = 0;
|
||||
iov_iter_kvec(&to, READ, &iov, 1, sizeof(*reply));
|
||||
result = sock_xmit(nbd, index, 0, &to, MSG_WAITALL, NULL);
|
||||
if (result < 0) {
|
||||
if (!nbd_disconnected(nbd->config))
|
||||
dev_err(disk_to_dev(nbd->disk),
|
||||
"Receive control failed (result %d)\n", result);
|
||||
return result;
|
||||
}
|
||||
|
||||
if (ntohl(reply->magic) != NBD_REPLY_MAGIC) {
|
||||
dev_err(disk_to_dev(nbd->disk), "Wrong magic (0x%lx)\n",
|
||||
(unsigned long)ntohl(reply->magic));
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* NULL returned = something went wrong, inform userspace */
|
||||
static struct nbd_cmd *nbd_handle_reply(struct nbd_device *nbd, int index,
|
||||
struct nbd_reply *reply)
|
||||
{
|
||||
struct nbd_config *config = nbd->config;
|
||||
int result;
|
||||
struct nbd_reply reply;
|
||||
struct nbd_cmd *cmd;
|
||||
struct request *req = NULL;
|
||||
u64 handle;
|
||||
u16 hwq;
|
||||
u32 tag;
|
||||
struct kvec iov = {.iov_base = &reply, .iov_len = sizeof(reply)};
|
||||
struct iov_iter to;
|
||||
int ret = 0;
|
||||
|
||||
reply.magic = 0;
|
||||
iov_iter_kvec(&to, READ, &iov, 1, sizeof(reply));
|
||||
result = sock_xmit(nbd, index, 0, &to, MSG_WAITALL, NULL);
|
||||
if (result <= 0) {
|
||||
if (!nbd_disconnected(config))
|
||||
dev_err(disk_to_dev(nbd->disk),
|
||||
"Receive control failed (result %d)\n", result);
|
||||
return ERR_PTR(result);
|
||||
}
|
||||
|
||||
if (ntohl(reply.magic) != NBD_REPLY_MAGIC) {
|
||||
dev_err(disk_to_dev(nbd->disk), "Wrong magic (0x%lx)\n",
|
||||
(unsigned long)ntohl(reply.magic));
|
||||
return ERR_PTR(-EPROTO);
|
||||
}
|
||||
|
||||
memcpy(&handle, reply.handle, sizeof(handle));
|
||||
memcpy(&handle, reply->handle, sizeof(handle));
|
||||
tag = nbd_handle_to_tag(handle);
|
||||
hwq = blk_mq_unique_tag_to_hwq(tag);
|
||||
if (hwq < nbd->tag_set.nr_hw_queues)
|
||||
|
|
@ -755,9 +763,9 @@ static struct nbd_cmd *nbd_read_stat(struct nbd_device *nbd, int index)
|
|||
ret = -ENOENT;
|
||||
goto out;
|
||||
}
|
||||
if (ntohl(reply.error)) {
|
||||
if (ntohl(reply->error)) {
|
||||
dev_err(disk_to_dev(nbd->disk), "Other side returned error (%d)\n",
|
||||
ntohl(reply.error));
|
||||
ntohl(reply->error));
|
||||
cmd->status = BLK_STS_IOERR;
|
||||
goto out;
|
||||
}
|
||||
|
|
@ -766,11 +774,12 @@ static struct nbd_cmd *nbd_read_stat(struct nbd_device *nbd, int index)
|
|||
if (rq_data_dir(req) != WRITE) {
|
||||
struct req_iterator iter;
|
||||
struct bio_vec bvec;
|
||||
struct iov_iter to;
|
||||
|
||||
rq_for_each_segment(bvec, req, iter) {
|
||||
iov_iter_bvec(&to, READ, &bvec, 1, bvec.bv_len);
|
||||
result = sock_xmit(nbd, index, 0, &to, MSG_WAITALL, NULL);
|
||||
if (result <= 0) {
|
||||
if (result < 0) {
|
||||
dev_err(disk_to_dev(nbd->disk), "Receive data failed (result %d)\n",
|
||||
result);
|
||||
/*
|
||||
|
|
@ -779,7 +788,7 @@ static struct nbd_cmd *nbd_read_stat(struct nbd_device *nbd, int index)
|
|||
* and let the timeout stuff handle resubmitting
|
||||
* this request onto another connection.
|
||||
*/
|
||||
if (nbd_disconnected(config)) {
|
||||
if (nbd_disconnected(nbd->config)) {
|
||||
cmd->status = BLK_STS_IOERR;
|
||||
goto out;
|
||||
}
|
||||
|
|
@ -803,27 +812,33 @@ static void recv_work(struct work_struct *work)
|
|||
work);
|
||||
struct nbd_device *nbd = args->nbd;
|
||||
struct nbd_config *config = nbd->config;
|
||||
struct nbd_sock *nsock;
|
||||
struct nbd_cmd *cmd;
|
||||
struct request *rq;
|
||||
|
||||
while (1) {
|
||||
cmd = nbd_read_stat(nbd, args->index);
|
||||
if (IS_ERR(cmd)) {
|
||||
struct nbd_sock *nsock = config->socks[args->index];
|
||||
struct nbd_reply reply;
|
||||
|
||||
mutex_lock(&nsock->tx_lock);
|
||||
nbd_mark_nsock_dead(nbd, nsock, 1);
|
||||
mutex_unlock(&nsock->tx_lock);
|
||||
if (nbd_read_reply(nbd, args->index, &reply))
|
||||
break;
|
||||
|
||||
cmd = nbd_handle_reply(nbd, args->index, &reply);
|
||||
if (IS_ERR(cmd))
|
||||
break;
|
||||
}
|
||||
|
||||
rq = blk_mq_rq_from_pdu(cmd);
|
||||
if (likely(!blk_should_fake_timeout(rq->q)))
|
||||
blk_mq_complete_request(rq);
|
||||
}
|
||||
nbd_config_put(nbd);
|
||||
|
||||
nsock = config->socks[args->index];
|
||||
mutex_lock(&nsock->tx_lock);
|
||||
nbd_mark_nsock_dead(nbd, nsock, 1);
|
||||
mutex_unlock(&nsock->tx_lock);
|
||||
|
||||
atomic_dec(&config->recv_threads);
|
||||
wake_up(&config->recv_wq);
|
||||
nbd_config_put(nbd);
|
||||
kfree(args);
|
||||
}
|
||||
|
||||
|
|
@ -1216,7 +1231,7 @@ static void send_disconnects(struct nbd_device *nbd)
|
|||
iov_iter_kvec(&from, WRITE, &iov, 1, sizeof(request));
|
||||
mutex_lock(&nsock->tx_lock);
|
||||
ret = sock_xmit(nbd, i, 1, &from, 0, NULL);
|
||||
if (ret <= 0)
|
||||
if (ret < 0)
|
||||
dev_err(disk_to_dev(nbd->disk),
|
||||
"Send disconnect failed %d\n", ret);
|
||||
mutex_unlock(&nsock->tx_lock);
|
||||
|
|
@ -2030,12 +2045,13 @@ again:
|
|||
|
||||
ret = nbd_start_device(nbd);
|
||||
out:
|
||||
mutex_unlock(&nbd->config_lock);
|
||||
if (!ret) {
|
||||
set_bit(NBD_RT_HAS_CONFIG_REF, &config->runtime_flags);
|
||||
refcount_inc(&nbd->config_refs);
|
||||
nbd_connect_reply(info, nbd->index);
|
||||
}
|
||||
mutex_unlock(&nbd->config_lock);
|
||||
|
||||
nbd_config_put(nbd);
|
||||
if (put_dev)
|
||||
nbd_put(nbd);
|
||||
|
|
|
|||
|
|
@ -85,10 +85,14 @@ static void ps3disk_scatter_gather(struct ps3_storage_device *dev,
|
|||
struct bio_vec bvec;
|
||||
|
||||
rq_for_each_segment(bvec, req, iter) {
|
||||
dev_dbg(&dev->sbd.core, "%s:%u: %u sectors from %llu\n",
|
||||
__func__, __LINE__, bio_sectors(iter.bio),
|
||||
iter.bio->bi_iter.bi_sector);
|
||||
if (gather)
|
||||
memcpy_from_bvec(dev->bounce_buf + offset, &bvec);
|
||||
else
|
||||
memcpy_to_bvec(&bvec, dev->bounce_buf + offset);
|
||||
offset += bvec.bv_len;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -403,6 +403,8 @@ static const struct usb_device_id blacklist_table[] = {
|
|||
/* Realtek 8821CE Bluetooth devices */
|
||||
{ USB_DEVICE(0x13d3, 0x3529), .driver_info = BTUSB_REALTEK |
|
||||
BTUSB_WIDEBAND_SPEECH },
|
||||
{ USB_DEVICE(0x13d3, 0x3533), .driver_info = BTUSB_REALTEK |
|
||||
BTUSB_WIDEBAND_SPEECH },
|
||||
|
||||
/* Realtek 8822CE Bluetooth devices */
|
||||
{ USB_DEVICE(0x0bda, 0xb00c), .driver_info = BTUSB_REALTEK |
|
||||
|
|
@ -3786,7 +3788,7 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL);
|
||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -3809,8 +3811,10 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
}
|
||||
}
|
||||
|
||||
if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep)
|
||||
if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep) {
|
||||
kfree(data);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (id->driver_info & BTUSB_AMP) {
|
||||
data->cmdreq_type = USB_TYPE_CLASS | 0x01;
|
||||
|
|
@ -3853,8 +3857,10 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
data->recv_acl = hci_recv_frame;
|
||||
|
||||
hdev = hci_alloc_dev_priv(priv_size);
|
||||
if (!hdev)
|
||||
if (!hdev) {
|
||||
kfree(data);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
hdev->bus = HCI_USB;
|
||||
hci_set_drvdata(hdev, data);
|
||||
|
|
@ -4102,6 +4108,7 @@ out_free_dev:
|
|||
if (data->reset_gpio)
|
||||
gpiod_put(data->reset_gpio);
|
||||
hci_free_dev(hdev);
|
||||
kfree(data);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -4147,6 +4154,7 @@ static void btusb_disconnect(struct usb_interface *intf)
|
|||
}
|
||||
|
||||
hci_free_dev(hdev);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ enum sysc_soc {
|
|||
SOC_UNKNOWN,
|
||||
SOC_2420,
|
||||
SOC_2430,
|
||||
SOC_AM33,
|
||||
SOC_3430,
|
||||
SOC_AM35,
|
||||
SOC_3630,
|
||||
|
|
@ -2946,6 +2947,7 @@ static void ti_sysc_idle(struct work_struct *work)
|
|||
static const struct soc_device_attribute sysc_soc_match[] = {
|
||||
SOC_FLAG("OMAP242*", SOC_2420),
|
||||
SOC_FLAG("OMAP243*", SOC_2430),
|
||||
SOC_FLAG("AM33*", SOC_AM33),
|
||||
SOC_FLAG("AM35*", SOC_AM35),
|
||||
SOC_FLAG("OMAP3[45]*", SOC_3430),
|
||||
SOC_FLAG("OMAP3[67]*", SOC_3630),
|
||||
|
|
@ -3153,10 +3155,15 @@ static int sysc_check_active_timer(struct sysc *ddata)
|
|||
* can be dropped if we stop supporting old beagleboard revisions
|
||||
* A to B4 at some point.
|
||||
*/
|
||||
if (sysc_soc->soc == SOC_3430 || sysc_soc->soc == SOC_AM35)
|
||||
switch (sysc_soc->soc) {
|
||||
case SOC_AM33:
|
||||
case SOC_3430:
|
||||
case SOC_AM35:
|
||||
error = -ENXIO;
|
||||
else
|
||||
break;
|
||||
default:
|
||||
error = -EBUSY;
|
||||
}
|
||||
|
||||
if ((ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT) &&
|
||||
(ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE))
|
||||
|
|
|
|||
|
|
@ -836,7 +836,10 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
ret = -ENOTTY;
|
||||
break;
|
||||
}
|
||||
Dummy = readb(apbs[IndexCard].RamIO + VERS);
|
||||
|
||||
if (cmd != 6)
|
||||
Dummy = readb(apbs[IndexCard].RamIO + VERS);
|
||||
|
||||
kfree(adgl);
|
||||
mutex_unlock(&ac_mutex);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -593,7 +593,8 @@ static void __ipmi_bmc_unregister(struct ipmi_smi *intf);
|
|||
static int __ipmi_bmc_register(struct ipmi_smi *intf,
|
||||
struct ipmi_device_id *id,
|
||||
bool guid_set, guid_t *guid, int intf_num);
|
||||
static int __scan_channels(struct ipmi_smi *intf, struct ipmi_device_id *id);
|
||||
static int __scan_channels(struct ipmi_smi *intf,
|
||||
struct ipmi_device_id *id, bool rescan);
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -2543,7 +2544,7 @@ retry_bmc_lock:
|
|||
if (__ipmi_bmc_register(intf, &id, guid_set, &guid, intf_num))
|
||||
need_waiter(intf); /* Retry later on an error. */
|
||||
else
|
||||
__scan_channels(intf, &id);
|
||||
__scan_channels(intf, &id, false);
|
||||
|
||||
|
||||
if (!intf_set) {
|
||||
|
|
@ -2563,7 +2564,7 @@ retry_bmc_lock:
|
|||
goto out_noprocessing;
|
||||
} else if (memcmp(&bmc->fetch_id, &bmc->id, sizeof(bmc->id)))
|
||||
/* Version info changes, scan the channels again. */
|
||||
__scan_channels(intf, &bmc->fetch_id);
|
||||
__scan_channels(intf, &bmc->fetch_id, true);
|
||||
|
||||
bmc->dyn_id_expiry = jiffies + IPMI_DYN_DEV_ID_EXPIRY;
|
||||
|
||||
|
|
@ -3292,8 +3293,6 @@ channel_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg)
|
|||
intf->channels_ready = true;
|
||||
wake_up(&intf->waitq);
|
||||
} else {
|
||||
intf->channel_list = intf->wchannels + set;
|
||||
intf->channels_ready = true;
|
||||
rv = send_channel_info_cmd(intf, intf->curr_channel);
|
||||
}
|
||||
|
||||
|
|
@ -3315,10 +3314,17 @@ channel_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg)
|
|||
/*
|
||||
* Must be holding intf->bmc_reg_mutex to call this.
|
||||
*/
|
||||
static int __scan_channels(struct ipmi_smi *intf, struct ipmi_device_id *id)
|
||||
static int __scan_channels(struct ipmi_smi *intf,
|
||||
struct ipmi_device_id *id,
|
||||
bool rescan)
|
||||
{
|
||||
int rv;
|
||||
|
||||
if (rescan) {
|
||||
/* Clear channels_ready to force channels rescan. */
|
||||
intf->channels_ready = false;
|
||||
}
|
||||
|
||||
if (ipmi_version_major(id) > 1
|
||||
|| (ipmi_version_major(id) == 1
|
||||
&& ipmi_version_minor(id) >= 5)) {
|
||||
|
|
@ -3490,7 +3496,7 @@ int ipmi_add_smi(struct module *owner,
|
|||
}
|
||||
|
||||
mutex_lock(&intf->bmc_reg_mutex);
|
||||
rv = __scan_channels(intf, &id);
|
||||
rv = __scan_channels(intf, &id, false);
|
||||
mutex_unlock(&intf->bmc_reg_mutex);
|
||||
if (rv)
|
||||
goto out_err_bmc_reg;
|
||||
|
|
|
|||
|
|
@ -269,7 +269,6 @@ static void tpm_dev_release(struct device *dev)
|
|||
|
||||
kfree(chip->work_space.context_buf);
|
||||
kfree(chip->work_space.session_buf);
|
||||
kfree(chip->allocated_banks);
|
||||
kfree(chip);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -794,11 +794,6 @@ int tpm1_pm_suspend(struct tpm_chip *chip, u32 tpm_suspend_pcr)
|
|||
*/
|
||||
int tpm1_get_pcr_allocation(struct tpm_chip *chip)
|
||||
{
|
||||
chip->allocated_banks = kcalloc(1, sizeof(*chip->allocated_banks),
|
||||
GFP_KERNEL);
|
||||
if (!chip->allocated_banks)
|
||||
return -ENOMEM;
|
||||
|
||||
chip->allocated_banks[0].alg_id = TPM_ALG_SHA1;
|
||||
chip->allocated_banks[0].digest_size = hash_digest_size[HASH_ALGO_SHA1];
|
||||
chip->allocated_banks[0].crypto_id = HASH_ALGO_SHA1;
|
||||
|
|
|
|||
|
|
@ -574,11 +574,9 @@ ssize_t tpm2_get_pcr_allocation(struct tpm_chip *chip)
|
|||
|
||||
nr_possible_banks = be32_to_cpup(
|
||||
(__be32 *)&buf.data[TPM_HEADER_SIZE + 5]);
|
||||
|
||||
chip->allocated_banks = kcalloc(nr_possible_banks,
|
||||
sizeof(*chip->allocated_banks),
|
||||
GFP_KERNEL);
|
||||
if (!chip->allocated_banks) {
|
||||
if (nr_possible_banks > TPM2_MAX_PCR_BANKS) {
|
||||
pr_err("tpm: out of bank capacity: %u > %u\n",
|
||||
nr_possible_banks, TPM2_MAX_PCR_BANKS);
|
||||
rc = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1614,8 +1614,8 @@ static void handle_control_message(struct virtio_device *vdev,
|
|||
break;
|
||||
case VIRTIO_CONSOLE_RESIZE: {
|
||||
struct {
|
||||
__virtio16 rows;
|
||||
__virtio16 cols;
|
||||
__virtio16 rows;
|
||||
} size;
|
||||
|
||||
if (!is_console_port(port))
|
||||
|
|
|
|||
|
|
@ -110,6 +110,25 @@ static const char * const gate_base_names[] = {
|
|||
[CP110_GATE_EIP197] = "eip197"
|
||||
};
|
||||
|
||||
static unsigned long gate_flags(const u8 bit_idx)
|
||||
{
|
||||
switch (bit_idx) {
|
||||
case CP110_GATE_PCIE_X1_0:
|
||||
case CP110_GATE_PCIE_X1_1:
|
||||
case CP110_GATE_PCIE_X4:
|
||||
/*
|
||||
* If a port had an active link at boot time, stopping
|
||||
* the clock creates a failed state from which controller
|
||||
* driver can not recover.
|
||||
* Prevent stopping this clock till after a driver has taken
|
||||
* ownership.
|
||||
*/
|
||||
return CLK_IGNORE_UNUSED;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
struct cp110_gate_clk {
|
||||
struct clk_hw hw;
|
||||
struct regmap *regmap;
|
||||
|
|
@ -171,6 +190,7 @@ static struct clk_hw *cp110_register_gate(const char *name,
|
|||
init.ops = &cp110_gate_ops;
|
||||
init.parent_names = &parent_name;
|
||||
init.num_parents = 1;
|
||||
init.flags = gate_flags(bit_idx);
|
||||
|
||||
gate->regmap = regmap;
|
||||
gate->bit_idx = bit_idx;
|
||||
|
|
|
|||
|
|
@ -918,9 +918,10 @@ static int __init r9a06g032_clocks_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(mclk))
|
||||
return PTR_ERR(mclk);
|
||||
|
||||
clocks->reg = of_iomap(np, 0);
|
||||
if (WARN_ON(!clocks->reg))
|
||||
return -ENOMEM;
|
||||
clocks->reg = devm_of_iomap(dev, np, 0, NULL);
|
||||
if (IS_ERR(clocks->reg))
|
||||
return PTR_ERR(clocks->reg);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(r9a06g032_clocks); ++i) {
|
||||
const struct r9a06g032_clkdesc *d = &r9a06g032_clocks[i];
|
||||
const char *parent_name = d->source ?
|
||||
|
|
|
|||
|
|
@ -2966,7 +2966,12 @@ static int compat_chaninfo(struct file *file, unsigned long arg)
|
|||
chaninfo.rangelist = compat_ptr(chaninfo32.rangelist);
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
err = do_chaninfo_ioctl(dev, &chaninfo);
|
||||
if (!dev->attached) {
|
||||
dev_dbg(dev->class_dev, "no driver attached\n");
|
||||
err = -ENODEV;
|
||||
} else {
|
||||
err = do_chaninfo_ioctl(dev, &chaninfo);
|
||||
}
|
||||
mutex_unlock(&dev->mutex);
|
||||
return err;
|
||||
}
|
||||
|
|
@ -2987,7 +2992,12 @@ static int compat_rangeinfo(struct file *file, unsigned long arg)
|
|||
rangeinfo.range_ptr = compat_ptr(rangeinfo32.range_ptr);
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
err = do_rangeinfo_ioctl(dev, &rangeinfo);
|
||||
if (!dev->attached) {
|
||||
dev_dbg(dev->class_dev, "no driver attached\n");
|
||||
err = -ENODEV;
|
||||
} else {
|
||||
err = do_rangeinfo_ioctl(dev, &rangeinfo);
|
||||
}
|
||||
mutex_unlock(&dev->mutex);
|
||||
return err;
|
||||
}
|
||||
|
|
@ -3063,7 +3073,12 @@ static int compat_cmd(struct file *file, unsigned long arg)
|
|||
return rc;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
rc = do_cmd_ioctl(dev, &cmd, ©, file);
|
||||
if (!dev->attached) {
|
||||
dev_dbg(dev->class_dev, "no driver attached\n");
|
||||
rc = -ENODEV;
|
||||
} else {
|
||||
rc = do_cmd_ioctl(dev, &cmd, ©, file);
|
||||
}
|
||||
mutex_unlock(&dev->mutex);
|
||||
if (copy) {
|
||||
/* Special case: copy cmd back to user. */
|
||||
|
|
@ -3088,7 +3103,12 @@ static int compat_cmdtest(struct file *file, unsigned long arg)
|
|||
return rc;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
rc = do_cmdtest_ioctl(dev, &cmd, ©, file);
|
||||
if (!dev->attached) {
|
||||
dev_dbg(dev->class_dev, "no driver attached\n");
|
||||
rc = -ENODEV;
|
||||
} else {
|
||||
rc = do_cmdtest_ioctl(dev, &cmd, ©, file);
|
||||
}
|
||||
mutex_unlock(&dev->mutex);
|
||||
if (copy) {
|
||||
err = put_compat_cmd(compat_ptr(arg), &cmd);
|
||||
|
|
@ -3148,7 +3168,12 @@ static int compat_insnlist(struct file *file, unsigned long arg)
|
|||
}
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
rc = do_insnlist_ioctl(dev, insns, insnlist32.n_insns, file);
|
||||
if (!dev->attached) {
|
||||
dev_dbg(dev->class_dev, "no driver attached\n");
|
||||
rc = -ENODEV;
|
||||
} else {
|
||||
rc = do_insnlist_ioctl(dev, insns, insnlist32.n_insns, file);
|
||||
}
|
||||
mutex_unlock(&dev->mutex);
|
||||
kfree(insns);
|
||||
return rc;
|
||||
|
|
@ -3167,7 +3192,12 @@ static int compat_insn(struct file *file, unsigned long arg)
|
|||
return rc;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
rc = do_insn_ioctl(dev, &insn, file);
|
||||
if (!dev->attached) {
|
||||
dev_dbg(dev->class_dev, "no driver attached\n");
|
||||
rc = -ENODEV;
|
||||
} else {
|
||||
rc = do_insn_ioctl(dev, &insn, file);
|
||||
}
|
||||
mutex_unlock(&dev->mutex);
|
||||
return rc;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -250,9 +250,6 @@ static int c6xdigio_attach(struct comedi_device *dev,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Make sure that PnP ports get activated */
|
||||
pnp_register_driver(&c6xdigio_pnp_driver);
|
||||
|
||||
s = &dev->subdevices[0];
|
||||
/* pwm output subdevice */
|
||||
s->type = COMEDI_SUBD_PWM;
|
||||
|
|
@ -279,19 +276,46 @@ static int c6xdigio_attach(struct comedi_device *dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void c6xdigio_detach(struct comedi_device *dev)
|
||||
{
|
||||
comedi_legacy_detach(dev);
|
||||
pnp_unregister_driver(&c6xdigio_pnp_driver);
|
||||
}
|
||||
|
||||
static struct comedi_driver c6xdigio_driver = {
|
||||
.driver_name = "c6xdigio",
|
||||
.module = THIS_MODULE,
|
||||
.attach = c6xdigio_attach,
|
||||
.detach = c6xdigio_detach,
|
||||
.detach = comedi_legacy_detach,
|
||||
};
|
||||
module_comedi_driver(c6xdigio_driver);
|
||||
|
||||
static bool c6xdigio_pnp_registered = false;
|
||||
|
||||
static int __init c6xdigio_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = comedi_driver_register(&c6xdigio_driver);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (IS_ENABLED(CONFIG_PNP)) {
|
||||
/* Try to activate the PnP ports */
|
||||
ret = pnp_register_driver(&c6xdigio_pnp_driver);
|
||||
if (ret) {
|
||||
pr_warn("failed to register pnp driver - err %d\n",
|
||||
ret);
|
||||
ret = 0; /* ignore the error. */
|
||||
} else {
|
||||
c6xdigio_pnp_registered = true;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
module_init(c6xdigio_module_init);
|
||||
|
||||
static void __exit c6xdigio_module_exit(void)
|
||||
{
|
||||
if (c6xdigio_pnp_registered)
|
||||
pnp_unregister_driver(&c6xdigio_pnp_driver);
|
||||
comedi_driver_unregister(&c6xdigio_driver);
|
||||
}
|
||||
module_exit(c6xdigio_module_exit);
|
||||
|
||||
MODULE_AUTHOR("Comedi https://www.comedi.org");
|
||||
MODULE_DESCRIPTION("Comedi driver for the C6x_DIGIO DSP daughter card");
|
||||
|
|
|
|||
|
|
@ -68,6 +68,11 @@
|
|||
#define MULTIQ3_TRSFRCNTR_OL 0x10 /* xfer CNTR to OL (x and y) */
|
||||
#define MULTIQ3_EFLAG_RESET 0x06 /* reset E bit of flag reg */
|
||||
|
||||
/*
|
||||
* Limit on the number of optional encoder channels
|
||||
*/
|
||||
#define MULTIQ3_MAX_ENC_CHANS 8
|
||||
|
||||
static void multiq3_set_ctrl(struct comedi_device *dev, unsigned int bits)
|
||||
{
|
||||
/*
|
||||
|
|
@ -313,6 +318,10 @@ static int multiq3_attach(struct comedi_device *dev,
|
|||
s->insn_read = multiq3_encoder_insn_read;
|
||||
s->insn_config = multiq3_encoder_insn_config;
|
||||
|
||||
/* sanity check for number of encoder channels */
|
||||
if (s->n_chan > MULTIQ3_MAX_ENC_CHANS)
|
||||
s->n_chan = MULTIQ3_MAX_ENC_CHANS;
|
||||
|
||||
for (i = 0; i < s->n_chan; i++)
|
||||
multiq3_encoder_reset(dev, i);
|
||||
|
||||
|
|
|
|||
|
|
@ -1113,10 +1113,9 @@ static void pcl818_detach(struct comedi_device *dev)
|
|||
{
|
||||
struct pcl818_private *devpriv = dev->private;
|
||||
|
||||
if (devpriv) {
|
||||
pcl818_ai_cancel(dev, dev->read_subdev);
|
||||
if (devpriv)
|
||||
pcl818_reset(dev);
|
||||
}
|
||||
|
||||
pcl818_free_dma(dev);
|
||||
comedi_legacy_detach(dev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -208,8 +208,7 @@ static int interrupt_cnt_probe(struct platform_device *pdev)
|
|||
|
||||
irq_set_status_flags(priv->irq, IRQ_NOAUTOEN);
|
||||
ret = devm_request_irq(dev, priv->irq, interrupt_cnt_isr,
|
||||
IRQF_TRIGGER_RISING | IRQF_NO_THREAD,
|
||||
dev_name(dev), priv);
|
||||
IRQF_TRIGGER_RISING, dev_name(dev), priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
|||
|
|
@ -145,6 +145,8 @@ static unsigned int nforce2_fsb_read(int bootfsb)
|
|||
pci_read_config_dword(nforce2_sub5, NFORCE2_BOOTFSB, &fsb);
|
||||
fsb /= 1000000;
|
||||
|
||||
pci_dev_put(nforce2_sub5);
|
||||
|
||||
/* Check if PLL register is already set */
|
||||
pci_read_config_byte(nforce2_dev, NFORCE2_PLLENABLE, (u8 *)&temp);
|
||||
|
||||
|
|
@ -432,6 +434,7 @@ static int __init nforce2_init(void)
|
|||
static void __exit nforce2_exit(void)
|
||||
{
|
||||
cpufreq_unregister_driver(&nforce2_driver);
|
||||
pci_dev_put(nforce2_dev);
|
||||
}
|
||||
|
||||
module_init(nforce2_init);
|
||||
|
|
|
|||
|
|
@ -518,7 +518,7 @@ static int s5pv210_cpu_init(struct cpufreq_policy *policy)
|
|||
|
||||
if (policy->cpu != 0) {
|
||||
ret = -EINVAL;
|
||||
goto out_dmc1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -530,7 +530,7 @@ static int s5pv210_cpu_init(struct cpufreq_policy *policy)
|
|||
if ((mem_type != LPDDR) && (mem_type != LPDDR2)) {
|
||||
pr_err("CPUFreq doesn't support this memory type\n");
|
||||
ret = -EINVAL;
|
||||
goto out_dmc1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Find current refresh counter and frequency each DMC */
|
||||
|
|
@ -544,6 +544,8 @@ static int s5pv210_cpu_init(struct cpufreq_policy *policy)
|
|||
cpufreq_generic_init(policy, s5pv210_freq_table, 40000);
|
||||
return 0;
|
||||
|
||||
out:
|
||||
clk_put(dmc1_clk);
|
||||
out_dmc1:
|
||||
clk_put(dmc0_clk);
|
||||
out_dmc0:
|
||||
|
|
|
|||
|
|
@ -1235,6 +1235,7 @@ int cc_map_hash_request_update(struct cc_drvdata *drvdata, void *ctx,
|
|||
int rc = 0;
|
||||
u32 dummy = 0;
|
||||
u32 mapped_nents = 0;
|
||||
int sg_nents;
|
||||
|
||||
dev_dbg(dev, " update params : curr_buff=%pK curr_buff_cnt=0x%X nbytes=0x%X src=%pK curr_index=%u\n",
|
||||
curr_buff, *curr_buff_cnt, nbytes, src, areq_ctx->buff_index);
|
||||
|
|
@ -1248,7 +1249,10 @@ int cc_map_hash_request_update(struct cc_drvdata *drvdata, void *ctx,
|
|||
if (total_in_len < block_size) {
|
||||
dev_dbg(dev, " less than one block: curr_buff=%pK *curr_buff_cnt=0x%X copy_to=%pK\n",
|
||||
curr_buff, *curr_buff_cnt, &curr_buff[*curr_buff_cnt]);
|
||||
areq_ctx->in_nents = sg_nents_for_len(src, nbytes);
|
||||
sg_nents = sg_nents_for_len(src, nbytes);
|
||||
if (sg_nents < 0)
|
||||
return sg_nents;
|
||||
areq_ctx->in_nents = sg_nents;
|
||||
sg_copy_to_buffer(src, areq_ctx->in_nents,
|
||||
&curr_buff[*curr_buff_cnt], nbytes);
|
||||
*curr_buff_cnt += nbytes;
|
||||
|
|
|
|||
|
|
@ -4010,6 +4010,7 @@ static int qm_clear_vft_config(struct hisi_qm *qm)
|
|||
static int qm_func_shaper_enable(struct hisi_qm *qm, u32 fun_index, u32 qos)
|
||||
{
|
||||
struct device *dev = &qm->pdev->dev;
|
||||
struct qm_shaper_factor t_factor;
|
||||
u32 ir = qos * QM_QOS_RATE;
|
||||
int ret, total_vfs, i;
|
||||
|
||||
|
|
@ -4017,6 +4018,7 @@ static int qm_func_shaper_enable(struct hisi_qm *qm, u32 fun_index, u32 qos)
|
|||
if (fun_index > total_vfs)
|
||||
return -EINVAL;
|
||||
|
||||
memcpy(&t_factor, &qm->factor[fun_index], sizeof(t_factor));
|
||||
qm->factor[fun_index].func_qos = qos;
|
||||
|
||||
ret = qm_get_shaper_para(ir, &qm->factor[fun_index]);
|
||||
|
|
@ -4030,11 +4032,21 @@ static int qm_func_shaper_enable(struct hisi_qm *qm, u32 fun_index, u32 qos)
|
|||
ret = qm_set_vft_common(qm, SHAPER_VFT, fun_index, i, 1);
|
||||
if (ret) {
|
||||
dev_err(dev, "type: %d, failed to set shaper vft!\n", i);
|
||||
return -EINVAL;
|
||||
goto back_func_qos;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
back_func_qos:
|
||||
memcpy(&qm->factor[fun_index], &t_factor, sizeof(t_factor));
|
||||
for (i--; i >= ALG_TYPE_0; i--) {
|
||||
ret = qm_set_vft_common(qm, SHAPER_VFT, fun_index, i, 1);
|
||||
if (ret)
|
||||
dev_err(dev, "failed to restore shaper vft during rollback!\n");
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static u32 qm_get_shaper_vft_qos(struct hisi_qm *qm, u32 fun_index)
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@
|
|||
|
||||
static char driver_name[] = KBUILD_MODNAME;
|
||||
|
||||
#define RCV_BUFFER_SIZE (16 * 1024)
|
||||
|
||||
/* this is the physical layout of a PCL, its size is 128 bytes */
|
||||
struct pcl {
|
||||
__le32 next;
|
||||
|
|
@ -517,16 +519,14 @@ remove_card(struct pci_dev *dev)
|
|||
lynx->rcv_start_pcl, lynx->rcv_start_pcl_bus);
|
||||
dma_free_coherent(&lynx->pci_device->dev, sizeof(struct pcl),
|
||||
lynx->rcv_pcl, lynx->rcv_pcl_bus);
|
||||
dma_free_coherent(&lynx->pci_device->dev, PAGE_SIZE, lynx->rcv_buffer,
|
||||
lynx->rcv_buffer_bus);
|
||||
dma_free_coherent(&lynx->pci_device->dev, RCV_BUFFER_SIZE,
|
||||
lynx->rcv_buffer, lynx->rcv_buffer_bus);
|
||||
|
||||
iounmap(lynx->registers);
|
||||
pci_disable_device(dev);
|
||||
lynx_put(lynx);
|
||||
}
|
||||
|
||||
#define RCV_BUFFER_SIZE (16 * 1024)
|
||||
|
||||
static int
|
||||
add_card(struct pci_dev *dev, const struct pci_device_id *unused)
|
||||
{
|
||||
|
|
@ -680,7 +680,7 @@ fail_deallocate_buffers:
|
|||
dma_free_coherent(&lynx->pci_device->dev, sizeof(struct pcl),
|
||||
lynx->rcv_pcl, lynx->rcv_pcl_bus);
|
||||
if (lynx->rcv_buffer)
|
||||
dma_free_coherent(&lynx->pci_device->dev, PAGE_SIZE,
|
||||
dma_free_coherent(&lynx->pci_device->dev, RCV_BUFFER_SIZE,
|
||||
lynx->rcv_buffer, lynx->rcv_buffer_bus);
|
||||
iounmap(lynx->registers);
|
||||
|
||||
|
|
|
|||
|
|
@ -1539,6 +1539,7 @@ static int scmi_devm_notifier_unregister(struct scmi_device *sdev,
|
|||
dres.handle = sdev->handle;
|
||||
dres.proto_id = proto_id;
|
||||
dres.evt_id = evt_id;
|
||||
dres.nb = nb;
|
||||
if (src_id) {
|
||||
dres.__src_id = *src_id;
|
||||
dres.src_id = &dres.__src_id;
|
||||
|
|
|
|||
|
|
@ -94,15 +94,11 @@ static void cper_print_arm_err_info(const char *pfx, u32 type,
|
|||
bool proc_context_corrupt, corrected, precise_pc, restartable_pc;
|
||||
bool time_out, access_mode;
|
||||
|
||||
/* If the type is unknown, bail. */
|
||||
if (type > CPER_ARM_MAX_TYPE)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Vendor type errors have error information values that are vendor
|
||||
* specific.
|
||||
*/
|
||||
if (type == CPER_ARM_VENDOR_ERROR)
|
||||
if (type & CPER_ARM_VENDOR_ERROR)
|
||||
return;
|
||||
|
||||
if (error_info & CPER_ARM_ERR_VALID_TRANSACTION_TYPE) {
|
||||
|
|
@ -117,43 +113,38 @@ static void cper_print_arm_err_info(const char *pfx, u32 type,
|
|||
if (error_info & CPER_ARM_ERR_VALID_OPERATION_TYPE) {
|
||||
op_type = ((error_info >> CPER_ARM_ERR_OPERATION_SHIFT)
|
||||
& CPER_ARM_ERR_OPERATION_MASK);
|
||||
switch (type) {
|
||||
case CPER_ARM_CACHE_ERROR:
|
||||
if (type & CPER_ARM_CACHE_ERROR) {
|
||||
if (op_type < ARRAY_SIZE(arm_cache_err_op_strs)) {
|
||||
printk("%soperation type: %s\n", pfx,
|
||||
printk("%scache error, operation type: %s\n", pfx,
|
||||
arm_cache_err_op_strs[op_type]);
|
||||
}
|
||||
break;
|
||||
case CPER_ARM_TLB_ERROR:
|
||||
}
|
||||
if (type & CPER_ARM_TLB_ERROR) {
|
||||
if (op_type < ARRAY_SIZE(arm_tlb_err_op_strs)) {
|
||||
printk("%soperation type: %s\n", pfx,
|
||||
printk("%sTLB error, operation type: %s\n", pfx,
|
||||
arm_tlb_err_op_strs[op_type]);
|
||||
}
|
||||
break;
|
||||
case CPER_ARM_BUS_ERROR:
|
||||
}
|
||||
if (type & CPER_ARM_BUS_ERROR) {
|
||||
if (op_type < ARRAY_SIZE(arm_bus_err_op_strs)) {
|
||||
printk("%soperation type: %s\n", pfx,
|
||||
printk("%sbus error, operation type: %s\n", pfx,
|
||||
arm_bus_err_op_strs[op_type]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (error_info & CPER_ARM_ERR_VALID_LEVEL) {
|
||||
level = ((error_info >> CPER_ARM_ERR_LEVEL_SHIFT)
|
||||
& CPER_ARM_ERR_LEVEL_MASK);
|
||||
switch (type) {
|
||||
case CPER_ARM_CACHE_ERROR:
|
||||
if (type & CPER_ARM_CACHE_ERROR)
|
||||
printk("%scache level: %d\n", pfx, level);
|
||||
break;
|
||||
case CPER_ARM_TLB_ERROR:
|
||||
|
||||
if (type & CPER_ARM_TLB_ERROR)
|
||||
printk("%sTLB level: %d\n", pfx, level);
|
||||
break;
|
||||
case CPER_ARM_BUS_ERROR:
|
||||
|
||||
if (type & CPER_ARM_BUS_ERROR)
|
||||
printk("%saffinity level at which the bus error occurred: %d\n",
|
||||
pfx, level);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (error_info & CPER_ARM_ERR_VALID_PROC_CONTEXT_CORRUPT) {
|
||||
|
|
@ -241,7 +232,8 @@ void cper_print_proc_arm(const char *pfx,
|
|||
int i, len, max_ctx_type;
|
||||
struct cper_arm_err_info *err_info;
|
||||
struct cper_arm_ctx_info *ctx_info;
|
||||
char newpfx[64], infopfx[64];
|
||||
char newpfx[64], infopfx[ARRAY_SIZE(newpfx) + 1];
|
||||
char error_type[120];
|
||||
|
||||
printk("%sMIDR: 0x%016llx\n", pfx, proc->midr);
|
||||
|
||||
|
|
@ -290,9 +282,15 @@ void cper_print_proc_arm(const char *pfx,
|
|||
newpfx);
|
||||
}
|
||||
|
||||
printk("%serror_type: %d, %s\n", newpfx, err_info->type,
|
||||
err_info->type < ARRAY_SIZE(cper_proc_error_type_strs) ?
|
||||
cper_proc_error_type_strs[err_info->type] : "unknown");
|
||||
cper_bits_to_str(error_type, sizeof(error_type),
|
||||
FIELD_GET(CPER_ARM_ERR_TYPE_MASK, err_info->type),
|
||||
cper_proc_error_type_strs,
|
||||
ARRAY_SIZE(cper_proc_error_type_strs));
|
||||
|
||||
printk("%serror_type: 0x%02x: %s%s\n", newpfx, err_info->type,
|
||||
error_type,
|
||||
(err_info->type & ~CPER_ARM_ERR_TYPE_MASK) ? " with reserved bit(s)" : "");
|
||||
|
||||
if (err_info->validation_bits & CPER_ARM_INFO_VALID_ERR_INFO) {
|
||||
printk("%serror_info: 0x%016llx\n", newpfx,
|
||||
err_info->error_info);
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
* Specification version 2.4.
|
||||
*/
|
||||
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/time.h>
|
||||
|
|
@ -105,6 +106,65 @@ void cper_print_bits(const char *pfx, unsigned int bits,
|
|||
printk("%s\n", buf);
|
||||
}
|
||||
|
||||
/**
|
||||
* cper_bits_to_str - return a string for set bits
|
||||
* @buf: buffer to store the output string
|
||||
* @buf_size: size of the output string buffer
|
||||
* @bits: bit mask
|
||||
* @strs: string array, indexed by bit position
|
||||
* @strs_size: size of the string array: @strs
|
||||
*
|
||||
* Add to @buf the bitmask in hexadecimal. Then, for each set bit in @bits,
|
||||
* add the corresponding string describing the bit in @strs to @buf.
|
||||
*
|
||||
* A typical example is::
|
||||
*
|
||||
* const char * const bits[] = {
|
||||
* "bit 3 name",
|
||||
* "bit 4 name",
|
||||
* "bit 5 name",
|
||||
* };
|
||||
* char str[120];
|
||||
* unsigned int bitmask = BIT(3) | BIT(5);
|
||||
* #define MASK GENMASK(5,3)
|
||||
*
|
||||
* cper_bits_to_str(str, sizeof(str), FIELD_GET(MASK, bitmask),
|
||||
* bits, ARRAY_SIZE(bits));
|
||||
*
|
||||
* The above code fills the string ``str`` with ``bit 3 name|bit 5 name``.
|
||||
*
|
||||
* Return: number of bytes stored or an error code if lower than zero.
|
||||
*/
|
||||
int cper_bits_to_str(char *buf, int buf_size, unsigned long bits,
|
||||
const char * const strs[], unsigned int strs_size)
|
||||
{
|
||||
int len = buf_size;
|
||||
char *str = buf;
|
||||
int i, size;
|
||||
|
||||
*buf = '\0';
|
||||
|
||||
for_each_set_bit(i, &bits, strs_size) {
|
||||
if (!(bits & BIT_ULL(i)))
|
||||
continue;
|
||||
|
||||
if (*buf && len > 0) {
|
||||
*str = '|';
|
||||
len--;
|
||||
str++;
|
||||
}
|
||||
|
||||
size = strscpy(str, strs[i], len);
|
||||
if (size < 0)
|
||||
return size;
|
||||
|
||||
len -= size;
|
||||
str += size;
|
||||
}
|
||||
return buf_size - len;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cper_bits_to_str);
|
||||
|
||||
static const char * const proc_type_strs[] = {
|
||||
"IA32/X64",
|
||||
"IA64",
|
||||
|
|
|
|||
|
|
@ -137,6 +137,18 @@ int imx_scu_enable_general_irq_channel(struct device *dev)
|
|||
struct mbox_chan *ch;
|
||||
int ret = 0, i = 0;
|
||||
|
||||
if (!of_parse_phandle_with_args(dev->of_node, "mboxes",
|
||||
"#mbox-cells", 0, &spec)) {
|
||||
i = of_alias_get_id(spec.np, "mu");
|
||||
of_node_put(spec.np);
|
||||
}
|
||||
|
||||
/* use mu1 as general mu irq channel if failed */
|
||||
if (i < 0)
|
||||
i = 1;
|
||||
|
||||
mu_resource_id = IMX_SC_R_MU_0A + i;
|
||||
|
||||
ret = imx_scu_get_handle(&imx_sc_irq_ipc_handle);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
@ -148,6 +160,8 @@ int imx_scu_enable_general_irq_channel(struct device *dev)
|
|||
cl->dev = dev;
|
||||
cl->rx_callback = imx_scu_irq_callback;
|
||||
|
||||
INIT_WORK(&imx_sc_irq_work, imx_scu_irq_work_handler);
|
||||
|
||||
/* SCU general IRQ uses general interrupt channel 3 */
|
||||
ch = mbox_request_channel_byname(cl, "gip3");
|
||||
if (IS_ERR(ch)) {
|
||||
|
|
@ -157,18 +171,6 @@ int imx_scu_enable_general_irq_channel(struct device *dev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
INIT_WORK(&imx_sc_irq_work, imx_scu_irq_work_handler);
|
||||
|
||||
if (!of_parse_phandle_with_args(dev->of_node, "mboxes",
|
||||
"#mbox-cells", 0, &spec))
|
||||
i = of_alias_get_id(spec.np, "mu");
|
||||
|
||||
/* use mu1 as general mu irq channel if failed */
|
||||
if (i < 0)
|
||||
i = 1;
|
||||
|
||||
mu_resource_id = IMX_SC_R_MU_0A + i;
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(imx_scu_enable_general_irq_channel);
|
||||
|
|
|
|||
|
|
@ -1156,10 +1156,10 @@ static enum bp_result get_embedded_panel_info_v2_1(
|
|||
/* not provided by VBIOS */
|
||||
info->lcd_timing.misc_info.HORIZONTAL_CUT_OFF = 0;
|
||||
|
||||
info->lcd_timing.misc_info.H_SYNC_POLARITY = ~(uint32_t) (lvds->lcd_timing.miscinfo
|
||||
& ATOM_HSYNC_POLARITY);
|
||||
info->lcd_timing.misc_info.V_SYNC_POLARITY = ~(uint32_t) (lvds->lcd_timing.miscinfo
|
||||
& ATOM_VSYNC_POLARITY);
|
||||
info->lcd_timing.misc_info.H_SYNC_POLARITY = !(lvds->lcd_timing.miscinfo &
|
||||
ATOM_HSYNC_POLARITY);
|
||||
info->lcd_timing.misc_info.V_SYNC_POLARITY = !(lvds->lcd_timing.miscinfo &
|
||||
ATOM_VSYNC_POLARITY);
|
||||
|
||||
/* not provided by VBIOS */
|
||||
info->lcd_timing.misc_info.VERTICAL_CUT_OFF = 0;
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ void enable_surface_flip_reporting(struct dc_plane_state *plane_state,
|
|||
struct dc_plane_state *dc_create_plane_state(struct dc *dc)
|
||||
{
|
||||
struct dc_plane_state *plane_state = kvzalloc(sizeof(*plane_state),
|
||||
GFP_KERNEL);
|
||||
GFP_ATOMIC);
|
||||
|
||||
if (NULL == plane_state)
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -35,47 +35,6 @@ static const struct drm_framebuffer_funcs psb_fb_funcs = {
|
|||
.create_handle = drm_gem_fb_create_handle,
|
||||
};
|
||||
|
||||
#define CMAP_TOHW(_val, _width) ((((_val) << (_width)) + 0x7FFF - (_val)) >> 16)
|
||||
|
||||
static int psbfb_setcolreg(unsigned regno, unsigned red, unsigned green,
|
||||
unsigned blue, unsigned transp,
|
||||
struct fb_info *info)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = info->par;
|
||||
struct drm_framebuffer *fb = fb_helper->fb;
|
||||
uint32_t v;
|
||||
|
||||
if (!fb)
|
||||
return -ENOMEM;
|
||||
|
||||
if (regno > 255)
|
||||
return 1;
|
||||
|
||||
red = CMAP_TOHW(red, info->var.red.length);
|
||||
blue = CMAP_TOHW(blue, info->var.blue.length);
|
||||
green = CMAP_TOHW(green, info->var.green.length);
|
||||
transp = CMAP_TOHW(transp, info->var.transp.length);
|
||||
|
||||
v = (red << info->var.red.offset) |
|
||||
(green << info->var.green.offset) |
|
||||
(blue << info->var.blue.offset) |
|
||||
(transp << info->var.transp.offset);
|
||||
|
||||
if (regno < 16) {
|
||||
switch (fb->format->cpp[0] * 8) {
|
||||
case 16:
|
||||
((uint32_t *) info->pseudo_palette)[regno] = v;
|
||||
break;
|
||||
case 24:
|
||||
case 32:
|
||||
((uint32_t *) info->pseudo_palette)[regno] = v;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static vm_fault_t psbfb_vm_fault(struct vm_fault *vmf)
|
||||
{
|
||||
struct vm_area_struct *vma = vmf->vma;
|
||||
|
|
@ -147,7 +106,6 @@ static int psbfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
|
|||
static const struct fb_ops psbfb_unaccel_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
DRM_FB_HELPER_DEFAULT_OPS,
|
||||
.fb_setcolreg = psbfb_setcolreg,
|
||||
.fb_fillrect = drm_fb_helper_cfb_fillrect,
|
||||
.fb_copyarea = drm_fb_helper_cfb_copyarea,
|
||||
.fb_imageblit = drm_fb_helper_cfb_imageblit,
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ static int igt_dmabuf_import_same_driver_lmem(void *arg)
|
|||
obj = __i915_gem_object_create_user(i915, PAGE_SIZE, &lmem, 1);
|
||||
if (IS_ERR(obj)) {
|
||||
pr_err("__i915_gem_object_create_user failed with err=%ld\n",
|
||||
PTR_ERR(dmabuf));
|
||||
PTR_ERR(obj));
|
||||
err = PTR_ERR(obj);
|
||||
goto out_ret;
|
||||
}
|
||||
|
|
@ -158,7 +158,7 @@ static int igt_dmabuf_import_same_driver(struct drm_i915_private *i915,
|
|||
regions, num_regions);
|
||||
if (IS_ERR(obj)) {
|
||||
pr_err("__i915_gem_object_create_user failed with err=%ld\n",
|
||||
PTR_ERR(dmabuf));
|
||||
PTR_ERR(obj));
|
||||
err = PTR_ERR(obj);
|
||||
goto out_ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -715,7 +715,7 @@ static int pot_hole(struct i915_address_space *vm,
|
|||
u64 addr;
|
||||
|
||||
for (addr = round_up(hole_start + I915_GTT_PAGE_SIZE, step) - I915_GTT_PAGE_SIZE;
|
||||
addr <= round_down(hole_end - 2*I915_GTT_PAGE_SIZE, step) - I915_GTT_PAGE_SIZE;
|
||||
hole_end > addr && hole_end - addr >= 2 * I915_GTT_PAGE_SIZE;
|
||||
addr += step) {
|
||||
err = i915_vma_pin(vma, 0, 0, addr | flags);
|
||||
if (err) {
|
||||
|
|
|
|||
|
|
@ -85,27 +85,6 @@ void mtk_ccorr_stop(struct device *dev)
|
|||
writel_relaxed(0x0, ccorr->regs + DISP_CCORR_EN);
|
||||
}
|
||||
|
||||
/* Converts a DRM S31.32 value to the HW S1.n format. */
|
||||
static u16 mtk_ctm_s31_32_to_s1_n(u64 in, u32 n)
|
||||
{
|
||||
u16 r;
|
||||
|
||||
/* Sign bit. */
|
||||
r = in & BIT_ULL(63) ? BIT(n + 1) : 0;
|
||||
|
||||
if ((in & GENMASK_ULL(62, 33)) > 0) {
|
||||
/* identity value 0x100000000 -> 0x400(mt8183), */
|
||||
/* identity value 0x100000000 -> 0x800(mt8192), */
|
||||
/* if bigger this, set it to max 0x7ff. */
|
||||
r |= GENMASK(n, 0);
|
||||
} else {
|
||||
/* take the n+1 most important bits. */
|
||||
r |= (in >> (32 - n)) & GENMASK(n, 0);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
void mtk_ccorr_ctm_set(struct device *dev, struct drm_crtc_state *state)
|
||||
{
|
||||
struct mtk_disp_ccorr *ccorr = dev_get_drvdata(dev);
|
||||
|
|
@ -124,7 +103,7 @@ void mtk_ccorr_ctm_set(struct device *dev, struct drm_crtc_state *state)
|
|||
input = ctm->matrix;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(coeffs); i++)
|
||||
coeffs[i] = mtk_ctm_s31_32_to_s1_n(input[i], matrix_bits);
|
||||
coeffs[i] = drm_color_ctm_s31_32_to_qm_n(input[i], 2, matrix_bits);
|
||||
|
||||
mtk_ddp_write(cmdq_pkt, coeffs[0] << 16 | coeffs[1],
|
||||
&ccorr->cmdq_reg, ccorr->regs, DISP_CCORR_COEF_0);
|
||||
|
|
|
|||
|
|
@ -794,7 +794,7 @@ static void a6xx_get_gmu_registers(struct msm_gpu *gpu,
|
|||
return;
|
||||
|
||||
/* Set the fence to ALLOW mode so we can access the registers */
|
||||
gpu_write(gpu, REG_A6XX_GMU_AO_AHB_FENCE_CTRL, 0);
|
||||
gmu_write(&a6xx_gpu->gmu, REG_A6XX_GMU_AO_AHB_FENCE_CTRL, 0);
|
||||
|
||||
_a6xx_get_gmu_registers(gpu, a6xx_state, &a6xx_gmu_reglist[2],
|
||||
&a6xx_state->gmu_registers[2], false);
|
||||
|
|
|
|||
|
|
@ -152,8 +152,21 @@ static inline struct nv50_head_atom *
|
|||
nv50_head_atom_get(struct drm_atomic_state *state, struct drm_crtc *crtc)
|
||||
{
|
||||
struct drm_crtc_state *statec = drm_atomic_get_crtc_state(state, crtc);
|
||||
|
||||
if (IS_ERR(statec))
|
||||
return (void *)statec;
|
||||
|
||||
return nv50_head_atom(statec);
|
||||
}
|
||||
|
||||
static inline struct nv50_head_atom *
|
||||
nv50_head_atom_get_new(struct drm_atomic_state *state, struct drm_crtc *crtc)
|
||||
{
|
||||
struct drm_crtc_state *statec = drm_atomic_get_new_crtc_state(state, crtc);
|
||||
|
||||
if (!statec)
|
||||
return NULL;
|
||||
|
||||
return nv50_head_atom(statec);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -565,7 +565,7 @@ nv50_wndw_prepare_fb(struct drm_plane *plane, struct drm_plane_state *state)
|
|||
asyw->image.offset[0] = nvbo->offset;
|
||||
|
||||
if (wndw->func->prepare) {
|
||||
asyh = nv50_head_atom_get(asyw->state.state, asyw->state.crtc);
|
||||
asyh = nv50_head_atom_get_new(asyw->state.state, asyw->state.crtc);
|
||||
if (IS_ERR(asyh))
|
||||
return PTR_ERR(asyh);
|
||||
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ static int visionox_rm69299_unprepare(struct drm_panel *panel)
|
|||
struct visionox_rm69299 *ctx = panel_to_ctx(panel);
|
||||
int ret;
|
||||
|
||||
ctx->dsi->mode_flags = 0;
|
||||
ctx->dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
|
||||
|
||||
ret = mipi_dsi_dcs_write(ctx->dsi, MIPI_DCS_SET_DISPLAY_OFF, NULL, 0);
|
||||
if (ret < 0)
|
||||
|
|
|
|||
|
|
@ -297,7 +297,7 @@ static int pl111_amba_probe(struct amba_device *amba_dev,
|
|||
variant->name, priv);
|
||||
if (ret != 0) {
|
||||
dev_err(dev, "%s failed irq %d\n", __func__, ret);
|
||||
return ret;
|
||||
goto dev_put;
|
||||
}
|
||||
|
||||
ret = pl111_modeset_init(drm);
|
||||
|
|
|
|||
|
|
@ -427,6 +427,11 @@ int ttm_bo_vm_access(struct vm_area_struct *vma, unsigned long addr,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!bo->resource) {
|
||||
ret = -ENODATA;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
switch (bo->resource->mem_type) {
|
||||
case TTM_PL_SYSTEM:
|
||||
fallthrough;
|
||||
|
|
@ -441,6 +446,7 @@ int ttm_bo_vm_access(struct vm_area_struct *vma, unsigned long addr,
|
|||
ret = -EIO;
|
||||
}
|
||||
|
||||
unlock:
|
||||
ttm_bo_unreserve(bo);
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ static struct dma_fence *vgem_fence_create(struct vgem_file *vfile,
|
|||
dma_fence_init(&fence->base, &vgem_fence_ops, &fence->lock,
|
||||
dma_fence_context_alloc(1), 1);
|
||||
|
||||
timer_setup(&fence->timer, vgem_fence_timeout, 0);
|
||||
timer_setup(&fence->timer, vgem_fence_timeout, TIMER_IRQSAFE);
|
||||
|
||||
/* We force the fence to expire within 10s to prevent driver hangs */
|
||||
mod_timer(&fence->timer, jiffies + VGEM_FENCE_TIMEOUT);
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user