mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-04 18:19:28 +09:00
Merge 749a916a9c ("usb: dwc3: ep0: Don't clear ep0 DWC3_EP_TRANSFER_STARTED") into android14-6.1-lts
Steps on the way to 6.1.121
Resolves merge conflicts in:
fs/f2fs/file.c
fs/f2fs/segment.c
Change-Id: Ib221190cc792a39283e1aac50f5038484f2ef1a2
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -311,10 +311,13 @@ Description: Do background GC aggressively when set. Set to 0 by default.
|
||||
GC approach and turns SSR mode on.
|
||||
gc urgent low(2): lowers the bar of checking I/O idling in
|
||||
order to process outstanding discard commands and GC a
|
||||
little bit aggressively. uses cost benefit GC approach.
|
||||
little bit aggressively. always uses cost benefit GC approach,
|
||||
and will override age-threshold GC approach if ATGC is enabled
|
||||
at the same time.
|
||||
gc urgent mid(3): does GC forcibly in a period of given
|
||||
gc_urgent_sleep_time and executes a mid level of I/O idling check.
|
||||
uses cost benefit GC approach.
|
||||
always uses cost benefit GC approach, and will override
|
||||
age-threshold GC approach if ATGC is enabled at the same time.
|
||||
|
||||
What: /sys/fs/f2fs/<disk>/gc_urgent_sleep_time
|
||||
Date: August 2017
|
||||
|
||||
@@ -26,9 +26,21 @@ properties:
|
||||
description:
|
||||
Specifies the reference clock(s) from which the output frequency is
|
||||
derived. This must either reference one clock if only the first clock
|
||||
input is connected or two if both clock inputs are connected.
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
input is connected or two if both clock inputs are connected. The last
|
||||
clock is the AXI bus clock that needs to be enabled so we can access the
|
||||
core registers.
|
||||
minItems: 2
|
||||
maxItems: 3
|
||||
|
||||
clock-names:
|
||||
oneOf:
|
||||
- items:
|
||||
- const: clkin1
|
||||
- const: s_axi_aclk
|
||||
- items:
|
||||
- const: clkin1
|
||||
- const: clkin2
|
||||
- const: s_axi_aclk
|
||||
|
||||
'#clock-cells':
|
||||
const: 0
|
||||
@@ -40,6 +52,7 @@ required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- '#clock-cells'
|
||||
|
||||
additionalProperties: false
|
||||
@@ -50,5 +63,6 @@ examples:
|
||||
compatible = "adi,axi-clkgen-2.00.a";
|
||||
#clock-cells = <0>;
|
||||
reg = <0xff000000 0x1000>;
|
||||
clocks = <&osc 1>;
|
||||
clocks = <&osc 1>, <&clkc 15>;
|
||||
clock-names = "clkin1", "s_axi_aclk";
|
||||
};
|
||||
|
||||
@@ -26,7 +26,7 @@ properties:
|
||||
maxItems: 1
|
||||
|
||||
spi-max-frequency:
|
||||
maximum: 30000000
|
||||
maximum: 66000000
|
||||
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
|
||||
@@ -18,16 +18,15 @@ properties:
|
||||
description: prop-encoded-array <a b>
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
items:
|
||||
items:
|
||||
- description: Delay between rts signal and beginning of data sent in
|
||||
milliseconds. It corresponds to the delay before sending data.
|
||||
default: 0
|
||||
maximum: 100
|
||||
- description: Delay between end of data sent and rts signal in milliseconds.
|
||||
It corresponds to the delay after sending data and actual release
|
||||
of the line.
|
||||
default: 0
|
||||
maximum: 100
|
||||
- description: Delay between rts signal and beginning of data sent in
|
||||
milliseconds. It corresponds to the delay before sending data.
|
||||
default: 0
|
||||
maximum: 100
|
||||
- description: Delay between end of data sent and rts signal in milliseconds.
|
||||
It corresponds to the delay after sending data and actual release
|
||||
of the line.
|
||||
default: 0
|
||||
maximum: 100
|
||||
|
||||
rs485-rts-active-low:
|
||||
description: drive RTS low when sending (default is high).
|
||||
|
||||
@@ -778,7 +778,8 @@ process the parameters it is given.
|
||||
|
||||
* ::
|
||||
|
||||
bool fs_validate_description(const struct fs_parameter_description *desc);
|
||||
bool fs_validate_description(const char *name,
|
||||
const struct fs_parameter_description *desc);
|
||||
|
||||
This performs some validation checks on a parameter description. It
|
||||
returns true if the description is good and false if it is not. It will
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <asm/tls.h>
|
||||
#include <asm/system_info.h>
|
||||
#include <asm/uaccess-asm.h>
|
||||
#include <asm/kasan_def.h>
|
||||
|
||||
#include "entry-header.S"
|
||||
#include <asm/probes.h>
|
||||
@@ -787,6 +788,13 @@ ENTRY(__switch_to)
|
||||
@ entries covering the vmalloc region.
|
||||
@
|
||||
ldr r2, [ip]
|
||||
#ifdef CONFIG_KASAN_VMALLOC
|
||||
@ Also dummy read from the KASAN shadow memory for the new stack if we
|
||||
@ are using KASAN
|
||||
mov_l r2, KASAN_SHADOW_OFFSET
|
||||
add r2, r2, ip, lsr #KASAN_SHADOW_SCALE_SHIFT
|
||||
ldr r2, [r2]
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ When CONFIG_THREAD_INFO_IN_TASK=n, the update of SP itself is what
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/kasan.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/io.h>
|
||||
@@ -115,16 +116,40 @@ int ioremap_page(unsigned long virt, unsigned long phys,
|
||||
}
|
||||
EXPORT_SYMBOL(ioremap_page);
|
||||
|
||||
#ifdef CONFIG_KASAN
|
||||
static unsigned long arm_kasan_mem_to_shadow(unsigned long addr)
|
||||
{
|
||||
return (unsigned long)kasan_mem_to_shadow((void *)addr);
|
||||
}
|
||||
#else
|
||||
static unsigned long arm_kasan_mem_to_shadow(unsigned long addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void memcpy_pgd(struct mm_struct *mm, unsigned long start,
|
||||
unsigned long end)
|
||||
{
|
||||
end = ALIGN(end, PGDIR_SIZE);
|
||||
memcpy(pgd_offset(mm, start), pgd_offset_k(start),
|
||||
sizeof(pgd_t) * (pgd_index(end) - pgd_index(start)));
|
||||
}
|
||||
|
||||
void __check_vmalloc_seq(struct mm_struct *mm)
|
||||
{
|
||||
int seq;
|
||||
|
||||
do {
|
||||
seq = atomic_read(&init_mm.context.vmalloc_seq);
|
||||
memcpy(pgd_offset(mm, VMALLOC_START),
|
||||
pgd_offset_k(VMALLOC_START),
|
||||
sizeof(pgd_t) * (pgd_index(VMALLOC_END) -
|
||||
pgd_index(VMALLOC_START)));
|
||||
seq = atomic_read_acquire(&init_mm.context.vmalloc_seq);
|
||||
memcpy_pgd(mm, VMALLOC_START, VMALLOC_END);
|
||||
if (IS_ENABLED(CONFIG_KASAN_VMALLOC)) {
|
||||
unsigned long start =
|
||||
arm_kasan_mem_to_shadow(VMALLOC_START);
|
||||
unsigned long end =
|
||||
arm_kasan_mem_to_shadow(VMALLOC_END);
|
||||
memcpy_pgd(mm, start, end);
|
||||
}
|
||||
/*
|
||||
* Use a store-release so that other CPUs that observe the
|
||||
* counter's new value are guaranteed to see the results of the
|
||||
|
||||
@@ -202,6 +202,9 @@
|
||||
interrupts = <7 5 IRQ_TYPE_EDGE_RISING>; /* PH5 */
|
||||
vdd-supply = <®_dldo1>;
|
||||
vddio-supply = <®_dldo1>;
|
||||
mount-matrix = "0", "1", "0",
|
||||
"-1", "0", "0",
|
||||
"0", "0", "1";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-name = "+V3.3_SD";
|
||||
startup-delay-us = <2000>;
|
||||
startup-delay-us = <20000>;
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-name = "+V3.3_SD";
|
||||
startup-delay-us = <2000>;
|
||||
startup-delay-us = <20000>;
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
|
||||
@@ -906,6 +906,7 @@
|
||||
|
||||
vusb33-supply = <&mt6359_vusb_ldo_reg>;
|
||||
vbus-supply = <&usb_vbus>;
|
||||
mediatek,u3p-dis-msk = <1>;
|
||||
};
|
||||
|
||||
&xhci2 {
|
||||
@@ -922,7 +923,6 @@
|
||||
usb2-lpm-disable;
|
||||
vusb33-supply = <&mt6359_vusb_ldo_reg>;
|
||||
vbus-supply = <&usb_vbus>;
|
||||
mediatek,u3p-dis-msk = <1>;
|
||||
};
|
||||
|
||||
#include <arm/cros-ec-keyboard.dtsi>
|
||||
|
||||
@@ -429,7 +429,7 @@ static void tls_thread_switch(struct task_struct *next)
|
||||
|
||||
if (is_compat_thread(task_thread_info(next)))
|
||||
write_sysreg(next->thread.uw.tp_value, tpidrro_el0);
|
||||
else if (!arm64_kernel_unmapped_at_el0())
|
||||
else
|
||||
write_sysreg(0, tpidrro_el0);
|
||||
|
||||
write_sysreg(*task_user_tls(next), tpidr_el0);
|
||||
|
||||
@@ -1003,7 +1003,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
|
||||
|
||||
if (run->exit_reason == KVM_EXIT_MMIO) {
|
||||
ret = kvm_handle_mmio_return(vcpu);
|
||||
if (ret)
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -72,6 +72,31 @@ unsigned long kvm_mmio_read_buf(const void *buf, unsigned int len)
|
||||
return data;
|
||||
}
|
||||
|
||||
static bool kvm_pending_sync_exception(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
if (!vcpu_get_flag(vcpu, PENDING_EXCEPTION))
|
||||
return false;
|
||||
|
||||
if (vcpu_el1_is_32bit(vcpu)) {
|
||||
switch (vcpu_get_flag(vcpu, EXCEPT_MASK)) {
|
||||
case unpack_vcpu_flag(EXCEPT_AA32_UND):
|
||||
case unpack_vcpu_flag(EXCEPT_AA32_IABT):
|
||||
case unpack_vcpu_flag(EXCEPT_AA32_DABT):
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
switch (vcpu_get_flag(vcpu, EXCEPT_MASK)) {
|
||||
case unpack_vcpu_flag(EXCEPT_AA64_EL1_SYNC):
|
||||
case unpack_vcpu_flag(EXCEPT_AA64_EL2_SYNC):
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* kvm_handle_mmio_return -- Handle MMIO loads after user space emulation
|
||||
* or in-kernel IO emulation
|
||||
@@ -84,9 +109,12 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu)
|
||||
unsigned int len;
|
||||
int mask;
|
||||
|
||||
/* Detect an already handled MMIO return */
|
||||
if (unlikely(!vcpu->mmio_needed))
|
||||
return 0;
|
||||
/*
|
||||
* Detect if the MMIO return was already handled or if userspace aborted
|
||||
* the MMIO access.
|
||||
*/
|
||||
if (unlikely(!vcpu->mmio_needed || kvm_pending_sync_exception(vcpu)))
|
||||
return 1;
|
||||
|
||||
vcpu->mmio_needed = 0;
|
||||
|
||||
@@ -117,7 +145,7 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu)
|
||||
*/
|
||||
kvm_incr_pc(vcpu);
|
||||
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int io_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa)
|
||||
|
||||
@@ -294,7 +294,6 @@ static u64 kvm_pmu_overflow_status(struct kvm_vcpu *vcpu)
|
||||
|
||||
if ((__vcpu_sys_reg(vcpu, PMCR_EL0) & ARMV8_PMU_PMCR_E)) {
|
||||
reg = __vcpu_sys_reg(vcpu, PMOVSSET_EL0);
|
||||
reg &= __vcpu_sys_reg(vcpu, PMCNTENSET_EL0);
|
||||
reg &= __vcpu_sys_reg(vcpu, PMINTENSET_EL1);
|
||||
}
|
||||
|
||||
|
||||
@@ -555,6 +555,7 @@ static void vgic_mmio_write_invlpi(struct kvm_vcpu *vcpu,
|
||||
unsigned long val)
|
||||
{
|
||||
struct vgic_irq *irq;
|
||||
u32 intid;
|
||||
|
||||
/*
|
||||
* If the guest wrote only to the upper 32bit part of the
|
||||
@@ -566,9 +567,13 @@ static void vgic_mmio_write_invlpi(struct kvm_vcpu *vcpu,
|
||||
if ((addr & 4) || !vgic_lpis_enabled(vcpu))
|
||||
return;
|
||||
|
||||
intid = lower_32_bits(val);
|
||||
if (intid < VGIC_MIN_LPI)
|
||||
return;
|
||||
|
||||
vgic_set_rdist_busy(vcpu, true);
|
||||
|
||||
irq = vgic_get_irq(vcpu->kvm, NULL, lower_32_bits(val));
|
||||
irq = vgic_get_irq(vcpu->kvm, NULL, intid);
|
||||
if (irq) {
|
||||
vgic_its_inv_lpi(vcpu->kvm, irq);
|
||||
vgic_put_irq(vcpu->kvm, irq);
|
||||
|
||||
@@ -41,8 +41,8 @@ ld-emul = $(64bit-emul)
|
||||
cflags-y += -mabi=lp64s
|
||||
endif
|
||||
|
||||
cflags-y += -G0 -pipe -msoft-float
|
||||
LDFLAGS_vmlinux += -G0 -static -n -nostdlib
|
||||
cflags-y += -pipe -msoft-float
|
||||
LDFLAGS_vmlinux += -static -n -nostdlib
|
||||
|
||||
# When the assembler supports explicit relocation hint, we must use it.
|
||||
# GCC may have -mexplicit-relocs off by default if it was built with an old
|
||||
@@ -51,13 +51,18 @@ LDFLAGS_vmlinux += -G0 -static -n -nostdlib
|
||||
# When the assembler does not supports explicit relocation hint, we can't use
|
||||
# it. Disable it if the compiler supports it.
|
||||
#
|
||||
# If you've seen "unknown reloc hint" message building the kernel and you are
|
||||
# now wondering why "-mexplicit-relocs" is not wrapped with cc-option: the
|
||||
# combination of a "new" assembler and "old" compiler is not supported. Either
|
||||
# upgrade the compiler or downgrade the assembler.
|
||||
# The combination of a "new" assembler and "old" GCC is not supported, given
|
||||
# the rarity of this combo and the extra complexity needed to make it work.
|
||||
# Either upgrade the compiler or downgrade the assembler; the build will error
|
||||
# out if it is the case (by probing for the model attribute; all supported
|
||||
# compilers in this case would have support).
|
||||
#
|
||||
# Also, -mdirect-extern-access is useful in case of building with explicit
|
||||
# relocs, for avoiding unnecessary GOT accesses. It is harmless to not have
|
||||
# support though.
|
||||
ifdef CONFIG_AS_HAS_EXPLICIT_RELOCS
|
||||
cflags-y += -mexplicit-relocs
|
||||
KBUILD_CFLAGS_KERNEL += -mdirect-extern-access
|
||||
cflags-y += $(call cc-option,-mexplicit-relocs)
|
||||
KBUILD_CFLAGS_KERNEL += $(call cc-option,-mdirect-extern-access)
|
||||
else
|
||||
cflags-y += $(call cc-option,-mno-explicit-relocs)
|
||||
KBUILD_AFLAGS_KERNEL += -Wa,-mla-global-with-pcrel
|
||||
|
||||
@@ -14,7 +14,11 @@
|
||||
* loaded. Tell the compiler this fact when using explicit relocs.
|
||||
*/
|
||||
#if defined(MODULE) && defined(CONFIG_AS_HAS_EXPLICIT_RELOCS)
|
||||
#define PER_CPU_ATTRIBUTES __attribute__((model("extreme")))
|
||||
# if __has_attribute(model)
|
||||
# define PER_CPU_ATTRIBUTES __attribute__((model("extreme")))
|
||||
# else
|
||||
# error compiler support for the model attribute is necessary when a recent assembler is used
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Use r21 for fast access */
|
||||
|
||||
@@ -179,7 +179,7 @@ static void __build_epilogue(struct jit_ctx *ctx, bool is_tail_call)
|
||||
|
||||
if (!is_tail_call) {
|
||||
/* Set return value */
|
||||
move_reg(ctx, LOONGARCH_GPR_A0, regmap[BPF_REG_0]);
|
||||
emit_insn(ctx, addiw, LOONGARCH_GPR_A0, regmap[BPF_REG_0], 0);
|
||||
/* Return to the caller */
|
||||
emit_insn(ctx, jirl, LOONGARCH_GPR_RA, LOONGARCH_GPR_ZERO, 0);
|
||||
} else {
|
||||
|
||||
@@ -23,7 +23,7 @@ endif
|
||||
cflags-vdso := $(ccflags-vdso) \
|
||||
-isystem $(shell $(CC) -print-file-name=include) \
|
||||
$(filter -W%,$(filter-out -Wa$(comma)%,$(KBUILD_CFLAGS))) \
|
||||
-O2 -g -fno-strict-aliasing -fno-common -fno-builtin -G0 \
|
||||
-std=gnu11 -O2 -g -fno-strict-aliasing -fno-common -fno-builtin \
|
||||
-fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \
|
||||
$(call cc-option, -fno-asynchronous-unwind-tables) \
|
||||
$(call cc-option, -fno-stack-protector)
|
||||
|
||||
@@ -93,7 +93,7 @@ static struct platform_device mcf_uart = {
|
||||
.dev.platform_data = mcf_uart_platform_data,
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_FEC)
|
||||
#ifdef MCFFEC_BASE0
|
||||
|
||||
#ifdef CONFIG_M5441x
|
||||
#define FEC_NAME "enet-fec"
|
||||
@@ -145,6 +145,7 @@ static struct platform_device mcf_fec0 = {
|
||||
.platform_data = FEC_PDATA,
|
||||
}
|
||||
};
|
||||
#endif /* MCFFEC_BASE0 */
|
||||
|
||||
#ifdef MCFFEC_BASE1
|
||||
static struct resource mcf_fec1_resources[] = {
|
||||
@@ -182,7 +183,6 @@ static struct platform_device mcf_fec1 = {
|
||||
}
|
||||
};
|
||||
#endif /* MCFFEC_BASE1 */
|
||||
#endif /* CONFIG_FEC */
|
||||
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
/*
|
||||
@@ -624,12 +624,12 @@ static struct platform_device mcf_flexcan0 = {
|
||||
|
||||
static struct platform_device *mcf_devices[] __initdata = {
|
||||
&mcf_uart,
|
||||
#if IS_ENABLED(CONFIG_FEC)
|
||||
#ifdef MCFFEC_BASE0
|
||||
&mcf_fec0,
|
||||
#endif
|
||||
#ifdef MCFFEC_BASE1
|
||||
&mcf_fec1,
|
||||
#endif
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
&mcf_qspi,
|
||||
#endif
|
||||
|
||||
@@ -144,7 +144,7 @@ static inline void gpio_free(unsigned gpio)
|
||||
* read-modify-write as well as those controlled by the EPORT and GPIO modules.
|
||||
*/
|
||||
#define MCFGPIO_SCR_START 40
|
||||
#elif defined(CONFIGM5441x)
|
||||
#elif defined(CONFIG_M5441x)
|
||||
/* The m5441x EPORT doesn't have its own GPIO port, uses PORT C */
|
||||
#define MCFGPIO_SCR_START 0
|
||||
#else
|
||||
|
||||
@@ -87,7 +87,7 @@ int ftrace_enable_ftrace_graph_caller(void)
|
||||
|
||||
int ftrace_disable_ftrace_graph_caller(void)
|
||||
{
|
||||
static_key_enable(&ftrace_graph_enable.key);
|
||||
static_key_disable(&ftrace_graph_enable.key);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -253,8 +253,8 @@ config PPC
|
||||
select HAVE_RSEQ
|
||||
select HAVE_SETUP_PER_CPU_AREA if PPC64
|
||||
select HAVE_SOFTIRQ_ON_OWN_STACK
|
||||
select HAVE_STACKPROTECTOR if PPC32 && $(cc-option,-mstack-protector-guard=tls -mstack-protector-guard-reg=r2)
|
||||
select HAVE_STACKPROTECTOR if PPC64 && $(cc-option,-mstack-protector-guard=tls -mstack-protector-guard-reg=r13)
|
||||
select HAVE_STACKPROTECTOR if PPC32 && $(cc-option,$(m32-flag) -mstack-protector-guard=tls -mstack-protector-guard-reg=r2 -mstack-protector-guard-offset=0)
|
||||
select HAVE_STACKPROTECTOR if PPC64 && $(cc-option,$(m64-flag) -mstack-protector-guard=tls -mstack-protector-guard-reg=r13 -mstack-protector-guard-offset=0)
|
||||
select HAVE_STATIC_CALL if PPC32
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HAVE_VIRT_CPU_ACCOUNTING
|
||||
|
||||
@@ -89,13 +89,6 @@ KBUILD_AFLAGS += -m$(BITS)
|
||||
KBUILD_LDFLAGS += -m elf$(BITS)$(LDEMULATION)
|
||||
endif
|
||||
|
||||
cflags-$(CONFIG_STACKPROTECTOR) += -mstack-protector-guard=tls
|
||||
ifdef CONFIG_PPC64
|
||||
cflags-$(CONFIG_STACKPROTECTOR) += -mstack-protector-guard-reg=r13
|
||||
else
|
||||
cflags-$(CONFIG_STACKPROTECTOR) += -mstack-protector-guard-reg=r2
|
||||
endif
|
||||
|
||||
LDFLAGS_vmlinux-y := -Bstatic
|
||||
LDFLAGS_vmlinux-$(CONFIG_RELOCATABLE) := -pie
|
||||
LDFLAGS_vmlinux-$(CONFIG_RELOCATABLE) += -z notext
|
||||
@@ -383,9 +376,11 @@ prepare: stack_protector_prepare
|
||||
PHONY += stack_protector_prepare
|
||||
stack_protector_prepare: prepare0
|
||||
ifdef CONFIG_PPC64
|
||||
$(eval KBUILD_CFLAGS += -mstack-protector-guard-offset=$(shell awk '{if ($$2 == "PACA_CANARY") print $$3;}' include/generated/asm-offsets.h))
|
||||
$(eval KBUILD_CFLAGS += -mstack-protector-guard=tls -mstack-protector-guard-reg=r13 \
|
||||
-mstack-protector-guard-offset=$(shell awk '{if ($$2 == "PACA_CANARY") print $$3;}' include/generated/asm-offsets.h))
|
||||
else
|
||||
$(eval KBUILD_CFLAGS += -mstack-protector-guard-offset=$(shell awk '{if ($$2 == "TASK_CANARY") print $$3;}' include/generated/asm-offsets.h))
|
||||
$(eval KBUILD_CFLAGS += -mstack-protector-guard=tls -mstack-protector-guard-reg=r2 \
|
||||
-mstack-protector-guard-offset=$(shell awk '{if ($$2 == "TASK_CANARY") print $$3;}' include/generated/asm-offsets.h))
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
@@ -33,6 +33,10 @@
|
||||
|
||||
#define IFETCH_ALIGN_BYTES (1 << IFETCH_ALIGN_SHIFT)
|
||||
|
||||
#ifdef CONFIG_NOT_COHERENT_CACHE
|
||||
#define ARCH_DMA_MINALIGN L1_CACHE_BYTES
|
||||
#endif
|
||||
|
||||
#if !defined(__ASSEMBLY__)
|
||||
#ifdef CONFIG_PPC64
|
||||
|
||||
|
||||
@@ -12,10 +12,6 @@
|
||||
|
||||
#define VM_DATA_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS32
|
||||
|
||||
#ifdef CONFIG_NOT_COHERENT_CACHE
|
||||
#define ARCH_DMA_MINALIGN L1_CACHE_BYTES
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PPC_256K_PAGES) || \
|
||||
(defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES))
|
||||
#define PTE_SHIFT (PAGE_SHIFT - PTE_T_LOG2 - 2) /* 1/4 of a page */
|
||||
|
||||
@@ -173,9 +173,4 @@ int emulate_step(struct pt_regs *regs, ppc_inst_t instr);
|
||||
*/
|
||||
extern int emulate_loadstore(struct pt_regs *regs, struct instruction_op *op);
|
||||
|
||||
extern void emulate_vsx_load(struct instruction_op *op, union vsx_reg *reg,
|
||||
const void *mem, bool cross_endian);
|
||||
extern void emulate_vsx_store(struct instruction_op *op,
|
||||
const union vsx_reg *reg, void *mem,
|
||||
bool cross_endian);
|
||||
extern int emulate_dcbz(unsigned long ea, struct pt_regs *regs);
|
||||
|
||||
@@ -924,6 +924,7 @@ static int __init disable_hardlockup_detector(void)
|
||||
hardlockup_detector_disable();
|
||||
#else
|
||||
if (firmware_has_feature(FW_FEATURE_LPAR)) {
|
||||
check_kvm_guest();
|
||||
if (is_kvm_guest())
|
||||
hardlockup_detector_disable();
|
||||
}
|
||||
|
||||
@@ -911,13 +911,18 @@ int setup_purgatory_ppc64(struct kimage *image, const void *slave_code,
|
||||
if (dn) {
|
||||
u64 val;
|
||||
|
||||
of_property_read_u64(dn, "opal-base-address", &val);
|
||||
ret = of_property_read_u64(dn, "opal-base-address", &val);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = kexec_purgatory_get_set_symbol(image, "opal_base", &val,
|
||||
sizeof(val), false);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
of_property_read_u64(dn, "opal-entry-address", &val);
|
||||
ret = of_property_read_u64(dn, "opal-entry-address", &val);
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = kexec_purgatory_get_set_symbol(image, "opal_entry", &val,
|
||||
sizeof(val), false);
|
||||
}
|
||||
|
||||
@@ -4062,6 +4062,15 @@ static int kvmhv_vcpu_entry_p9_nested(struct kvm_vcpu *vcpu, u64 time_limit, uns
|
||||
}
|
||||
hvregs.hdec_expiry = time_limit;
|
||||
|
||||
/*
|
||||
* hvregs has the doorbell status, so zero it here which
|
||||
* enables us to receive doorbells when H_ENTER_NESTED is
|
||||
* in progress for this vCPU
|
||||
*/
|
||||
|
||||
if (vcpu->arch.doorbell_request)
|
||||
vcpu->arch.doorbell_request = 0;
|
||||
|
||||
/*
|
||||
* When setting DEC, we must always deal with irq_work_raise
|
||||
* via NMI vs setting DEC. The problem occurs right as we
|
||||
@@ -4644,7 +4653,6 @@ int kvmhv_run_single_vcpu(struct kvm_vcpu *vcpu, u64 time_limit,
|
||||
lpcr |= LPCR_MER;
|
||||
}
|
||||
} else if (vcpu->arch.pending_exceptions ||
|
||||
vcpu->arch.doorbell_request ||
|
||||
xive_interrupt_pending(vcpu)) {
|
||||
vcpu->arch.ret = RESUME_HOST;
|
||||
goto out;
|
||||
|
||||
@@ -32,7 +32,7 @@ void kvmhv_save_hv_regs(struct kvm_vcpu *vcpu, struct hv_guest_state *hr)
|
||||
struct kvmppc_vcore *vc = vcpu->arch.vcore;
|
||||
|
||||
hr->pcr = vc->pcr | PCR_MASK;
|
||||
hr->dpdes = vc->dpdes;
|
||||
hr->dpdes = vcpu->arch.doorbell_request;
|
||||
hr->hfscr = vcpu->arch.hfscr;
|
||||
hr->tb_offset = vc->tb_offset;
|
||||
hr->dawr0 = vcpu->arch.dawr0;
|
||||
@@ -105,7 +105,7 @@ static void save_hv_return_state(struct kvm_vcpu *vcpu,
|
||||
{
|
||||
struct kvmppc_vcore *vc = vcpu->arch.vcore;
|
||||
|
||||
hr->dpdes = vc->dpdes;
|
||||
hr->dpdes = vcpu->arch.doorbell_request;
|
||||
hr->purr = vcpu->arch.purr;
|
||||
hr->spurr = vcpu->arch.spurr;
|
||||
hr->ic = vcpu->arch.ic;
|
||||
@@ -143,7 +143,7 @@ static void restore_hv_regs(struct kvm_vcpu *vcpu, const struct hv_guest_state *
|
||||
struct kvmppc_vcore *vc = vcpu->arch.vcore;
|
||||
|
||||
vc->pcr = hr->pcr | PCR_MASK;
|
||||
vc->dpdes = hr->dpdes;
|
||||
vcpu->arch.doorbell_request = hr->dpdes;
|
||||
vcpu->arch.hfscr = hr->hfscr;
|
||||
vcpu->arch.dawr0 = hr->dawr0;
|
||||
vcpu->arch.dawrx0 = hr->dawrx0;
|
||||
@@ -170,7 +170,13 @@ void kvmhv_restore_hv_return_state(struct kvm_vcpu *vcpu,
|
||||
{
|
||||
struct kvmppc_vcore *vc = vcpu->arch.vcore;
|
||||
|
||||
vc->dpdes = hr->dpdes;
|
||||
/*
|
||||
* This L2 vCPU might have received a doorbell while H_ENTER_NESTED was being handled.
|
||||
* Make sure we preserve the doorbell if it was either:
|
||||
* a) Sent after H_ENTER_NESTED was called on this vCPU (arch.doorbell_request would be 1)
|
||||
* b) Doorbell was not handled and L2 exited for some other reason (hr->dpdes would be 1)
|
||||
*/
|
||||
vcpu->arch.doorbell_request = vcpu->arch.doorbell_request | hr->dpdes;
|
||||
vcpu->arch.hfscr = hr->hfscr;
|
||||
vcpu->arch.purr = hr->purr;
|
||||
vcpu->arch.spurr = hr->spurr;
|
||||
|
||||
@@ -780,8 +780,8 @@ static nokprobe_inline int emulate_stq(struct pt_regs *regs, unsigned long ea,
|
||||
#endif /* __powerpc64 */
|
||||
|
||||
#ifdef CONFIG_VSX
|
||||
void emulate_vsx_load(struct instruction_op *op, union vsx_reg *reg,
|
||||
const void *mem, bool rev)
|
||||
static nokprobe_inline void emulate_vsx_load(struct instruction_op *op, union vsx_reg *reg,
|
||||
const void *mem, bool rev)
|
||||
{
|
||||
int size, read_size;
|
||||
int i, j;
|
||||
@@ -863,11 +863,9 @@ void emulate_vsx_load(struct instruction_op *op, union vsx_reg *reg,
|
||||
break;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(emulate_vsx_load);
|
||||
NOKPROBE_SYMBOL(emulate_vsx_load);
|
||||
|
||||
void emulate_vsx_store(struct instruction_op *op, const union vsx_reg *reg,
|
||||
void *mem, bool rev)
|
||||
static nokprobe_inline void emulate_vsx_store(struct instruction_op *op, const union vsx_reg *reg,
|
||||
void *mem, bool rev)
|
||||
{
|
||||
int size, write_size;
|
||||
int i, j;
|
||||
@@ -955,8 +953,6 @@ void emulate_vsx_store(struct instruction_op *op, const union vsx_reg *reg,
|
||||
break;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(emulate_vsx_store);
|
||||
NOKPROBE_SYMBOL(emulate_vsx_store);
|
||||
|
||||
static nokprobe_inline int do_vsx_load(struct instruction_op *op,
|
||||
unsigned long ea, struct pt_regs *regs,
|
||||
|
||||
@@ -484,9 +484,13 @@ ENTRY(\name)
|
||||
ENDPROC(\name)
|
||||
.endm
|
||||
|
||||
.section .irqentry.text, "ax"
|
||||
|
||||
INT_HANDLER ext_int_handler,__LC_EXT_OLD_PSW,do_ext_irq
|
||||
INT_HANDLER io_int_handler,__LC_IO_OLD_PSW,do_io_irq
|
||||
|
||||
.section .kprobes.text, "ax"
|
||||
|
||||
/*
|
||||
* Load idle PSW.
|
||||
*/
|
||||
|
||||
@@ -549,6 +549,12 @@ int __init arch_init_kprobes(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init arch_populate_kprobe_blacklist(void)
|
||||
{
|
||||
return kprobe_add_area_blacklist((unsigned long)__irqentry_text_start,
|
||||
(unsigned long)__irqentry_text_end);
|
||||
}
|
||||
|
||||
int arch_trampoline_kprobe(struct kprobe *p)
|
||||
{
|
||||
return 0;
|
||||
|
||||
@@ -132,7 +132,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
||||
|
||||
static void *c_start(struct seq_file *m, loff_t *pos)
|
||||
{
|
||||
return *pos < NR_CPUS ? cpu_data + *pos : NULL;
|
||||
return *pos < nr_cpu_ids ? cpu_data + *pos : NULL;
|
||||
}
|
||||
static void *c_next(struct seq_file *m, void *v, loff_t *pos)
|
||||
{
|
||||
|
||||
@@ -336,7 +336,7 @@ static struct platform_driver uml_net_driver = {
|
||||
|
||||
static void net_device_release(struct device *dev)
|
||||
{
|
||||
struct uml_net *device = dev_get_drvdata(dev);
|
||||
struct uml_net *device = container_of(dev, struct uml_net, pdev.dev);
|
||||
struct net_device *netdev = device->dev;
|
||||
struct uml_net_private *lp = netdev_priv(netdev);
|
||||
|
||||
|
||||
@@ -799,7 +799,7 @@ static int ubd_open_dev(struct ubd *ubd_dev)
|
||||
|
||||
static void ubd_device_release(struct device *dev)
|
||||
{
|
||||
struct ubd *ubd_dev = dev_get_drvdata(dev);
|
||||
struct ubd *ubd_dev = container_of(dev, struct ubd, pdev.dev);
|
||||
|
||||
blk_mq_free_tag_set(&ubd_dev->tag_set);
|
||||
*ubd_dev = ((struct ubd) DEFAULT_UBD);
|
||||
|
||||
@@ -823,7 +823,8 @@ static struct platform_driver uml_net_driver = {
|
||||
|
||||
static void vector_device_release(struct device *dev)
|
||||
{
|
||||
struct vector_device *device = dev_get_drvdata(dev);
|
||||
struct vector_device *device =
|
||||
container_of(dev, struct vector_device, pdev.dev);
|
||||
struct net_device *netdev = device->dev;
|
||||
|
||||
list_del(&device->list);
|
||||
|
||||
@@ -80,10 +80,10 @@ void __init setup_physmem(unsigned long start, unsigned long reserve_end,
|
||||
unsigned long len, unsigned long long highmem)
|
||||
{
|
||||
unsigned long reserve = reserve_end - start;
|
||||
long map_size = len - reserve;
|
||||
unsigned long map_size = len - reserve;
|
||||
int err;
|
||||
|
||||
if(map_size <= 0) {
|
||||
if (len <= reserve) {
|
||||
os_warn("Too few physical memory! Needed=%lu, given=%lu\n",
|
||||
reserve, len);
|
||||
exit(1);
|
||||
@@ -94,7 +94,7 @@ void __init setup_physmem(unsigned long start, unsigned long reserve_end,
|
||||
err = os_map_memory((void *) reserve_end, physmem_fd, reserve,
|
||||
map_size, 1, 1, 1);
|
||||
if (err < 0) {
|
||||
os_warn("setup_physmem - mapping %ld bytes of memory at 0x%p "
|
||||
os_warn("setup_physmem - mapping %lu bytes of memory at 0x%p "
|
||||
"failed - errno = %d\n", map_size,
|
||||
(void *) reserve_end, err);
|
||||
exit(1);
|
||||
|
||||
@@ -397,6 +397,6 @@ int elf_core_copy_fpregs(struct task_struct *t, elf_fpregset_t *fpu)
|
||||
{
|
||||
int cpu = current_thread_info()->cpu;
|
||||
|
||||
return save_i387_registers(userspace_pid[cpu], (unsigned long *) fpu);
|
||||
return save_i387_registers(userspace_pid[cpu], (unsigned long *) fpu) == 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -53,5 +53,5 @@ void show_stack(struct task_struct *task, unsigned long *stack,
|
||||
}
|
||||
|
||||
printk("%sCall Trace:\n", loglvl);
|
||||
dump_trace(current, &stackops, (void *)loglvl);
|
||||
dump_trace(task ?: current, &stackops, (void *)loglvl);
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#define T1 %xmm7
|
||||
|
||||
#define STATEP %rdi
|
||||
#define LEN %rsi
|
||||
#define LEN %esi
|
||||
#define SRC %rdx
|
||||
#define DST %rcx
|
||||
|
||||
@@ -76,32 +76,32 @@ SYM_FUNC_START_LOCAL(__load_partial)
|
||||
xor %r9d, %r9d
|
||||
pxor MSG, MSG
|
||||
|
||||
mov LEN, %r8
|
||||
mov LEN, %r8d
|
||||
and $0x1, %r8
|
||||
jz .Lld_partial_1
|
||||
|
||||
mov LEN, %r8
|
||||
mov LEN, %r8d
|
||||
and $0x1E, %r8
|
||||
add SRC, %r8
|
||||
mov (%r8), %r9b
|
||||
|
||||
.Lld_partial_1:
|
||||
mov LEN, %r8
|
||||
mov LEN, %r8d
|
||||
and $0x2, %r8
|
||||
jz .Lld_partial_2
|
||||
|
||||
mov LEN, %r8
|
||||
mov LEN, %r8d
|
||||
and $0x1C, %r8
|
||||
add SRC, %r8
|
||||
shl $0x10, %r9
|
||||
mov (%r8), %r9w
|
||||
|
||||
.Lld_partial_2:
|
||||
mov LEN, %r8
|
||||
mov LEN, %r8d
|
||||
and $0x4, %r8
|
||||
jz .Lld_partial_4
|
||||
|
||||
mov LEN, %r8
|
||||
mov LEN, %r8d
|
||||
and $0x18, %r8
|
||||
add SRC, %r8
|
||||
shl $32, %r9
|
||||
@@ -111,11 +111,11 @@ SYM_FUNC_START_LOCAL(__load_partial)
|
||||
.Lld_partial_4:
|
||||
movq %r9, MSG
|
||||
|
||||
mov LEN, %r8
|
||||
mov LEN, %r8d
|
||||
and $0x8, %r8
|
||||
jz .Lld_partial_8
|
||||
|
||||
mov LEN, %r8
|
||||
mov LEN, %r8d
|
||||
and $0x10, %r8
|
||||
add SRC, %r8
|
||||
pslldq $8, MSG
|
||||
@@ -139,7 +139,7 @@ SYM_FUNC_END(__load_partial)
|
||||
* %r10
|
||||
*/
|
||||
SYM_FUNC_START_LOCAL(__store_partial)
|
||||
mov LEN, %r8
|
||||
mov LEN, %r8d
|
||||
mov DST, %r9
|
||||
|
||||
movq T0, %r10
|
||||
@@ -677,7 +677,7 @@ SYM_TYPED_FUNC_START(crypto_aegis128_aesni_dec_tail)
|
||||
call __store_partial
|
||||
|
||||
/* mask with byte count: */
|
||||
movq LEN, T0
|
||||
movd LEN, T0
|
||||
punpcklbw T0, T0
|
||||
punpcklbw T0, T0
|
||||
punpcklbw T0, T0
|
||||
@@ -702,7 +702,8 @@ SYM_FUNC_END(crypto_aegis128_aesni_dec_tail)
|
||||
|
||||
/*
|
||||
* void crypto_aegis128_aesni_final(void *state, void *tag_xor,
|
||||
* u64 assoclen, u64 cryptlen);
|
||||
* unsigned int assoclen,
|
||||
* unsigned int cryptlen);
|
||||
*/
|
||||
SYM_FUNC_START(crypto_aegis128_aesni_final)
|
||||
FRAME_BEGIN
|
||||
@@ -715,8 +716,8 @@ SYM_FUNC_START(crypto_aegis128_aesni_final)
|
||||
movdqu 0x40(STATEP), STATE4
|
||||
|
||||
/* prepare length block: */
|
||||
movq %rdx, MSG
|
||||
movq %rcx, T0
|
||||
movd %edx, MSG
|
||||
movd %ecx, T0
|
||||
pslldq $8, T0
|
||||
pxor T0, MSG
|
||||
psllq $3, MSG /* multiply by 8 (to get bit count) */
|
||||
|
||||
@@ -5409,8 +5409,22 @@ default_is_visible(struct kobject *kobj, struct attribute *attr, int i)
|
||||
return attr->mode;
|
||||
}
|
||||
|
||||
static umode_t
|
||||
td_is_visible(struct kobject *kobj, struct attribute *attr, int i)
|
||||
{
|
||||
/*
|
||||
* Hide the perf metrics topdown events
|
||||
* if the feature is not enumerated.
|
||||
*/
|
||||
if (x86_pmu.num_topdown_events)
|
||||
return x86_pmu.intel_cap.perf_metrics ? attr->mode : 0;
|
||||
|
||||
return attr->mode;
|
||||
}
|
||||
|
||||
static struct attribute_group group_events_td = {
|
||||
.name = "events",
|
||||
.is_visible = td_is_visible,
|
||||
};
|
||||
|
||||
static struct attribute_group group_events_mem = {
|
||||
@@ -5587,9 +5601,27 @@ static umode_t hybrid_format_is_visible(struct kobject *kobj,
|
||||
return (cpu >= 0) && (pmu->cpu_type & pmu_attr->pmu_type) ? attr->mode : 0;
|
||||
}
|
||||
|
||||
static umode_t hybrid_td_is_visible(struct kobject *kobj,
|
||||
struct attribute *attr, int i)
|
||||
{
|
||||
struct device *dev = kobj_to_dev(kobj);
|
||||
struct x86_hybrid_pmu *pmu =
|
||||
container_of(dev_get_drvdata(dev), struct x86_hybrid_pmu, pmu);
|
||||
|
||||
if (!is_attr_for_this_pmu(kobj, attr))
|
||||
return 0;
|
||||
|
||||
|
||||
/* Only the big core supports perf metrics */
|
||||
if (pmu->cpu_type == hybrid_big)
|
||||
return pmu->intel_cap.perf_metrics ? attr->mode : 0;
|
||||
|
||||
return attr->mode;
|
||||
}
|
||||
|
||||
static struct attribute_group hybrid_group_events_td = {
|
||||
.name = "events",
|
||||
.is_visible = hybrid_events_is_visible,
|
||||
.is_visible = hybrid_td_is_visible,
|
||||
};
|
||||
|
||||
static struct attribute_group hybrid_group_events_mem = {
|
||||
|
||||
@@ -827,11 +827,13 @@ static void pt_buffer_advance(struct pt_buffer *buf)
|
||||
buf->cur_idx++;
|
||||
|
||||
if (buf->cur_idx == buf->cur->last) {
|
||||
if (buf->cur == buf->last)
|
||||
if (buf->cur == buf->last) {
|
||||
buf->cur = buf->first;
|
||||
else
|
||||
buf->wrapped = true;
|
||||
} else {
|
||||
buf->cur = list_entry(buf->cur->list.next, struct topa,
|
||||
list);
|
||||
}
|
||||
buf->cur_idx = 0;
|
||||
}
|
||||
}
|
||||
@@ -845,8 +847,11 @@ static void pt_buffer_advance(struct pt_buffer *buf)
|
||||
static void pt_update_head(struct pt *pt)
|
||||
{
|
||||
struct pt_buffer *buf = perf_get_aux(&pt->handle);
|
||||
bool wrapped = buf->wrapped;
|
||||
u64 topa_idx, base, old;
|
||||
|
||||
buf->wrapped = false;
|
||||
|
||||
if (buf->single) {
|
||||
local_set(&buf->data_size, buf->output_off);
|
||||
return;
|
||||
@@ -864,7 +869,7 @@ static void pt_update_head(struct pt *pt)
|
||||
} else {
|
||||
old = (local64_xchg(&buf->head, base) &
|
||||
((buf->nr_pages << PAGE_SHIFT) - 1));
|
||||
if (base < old)
|
||||
if (base < old || (base == old && wrapped))
|
||||
base += buf->nr_pages << PAGE_SHIFT;
|
||||
|
||||
local_add(base - old, &buf->data_size);
|
||||
|
||||
@@ -65,6 +65,7 @@ struct pt_pmu {
|
||||
* @head: logical write offset inside the buffer
|
||||
* @snapshot: if this is for a snapshot/overwrite counter
|
||||
* @single: use Single Range Output instead of ToPA
|
||||
* @wrapped: buffer advance wrapped back to the first topa table
|
||||
* @stop_pos: STOP topa entry index
|
||||
* @intr_pos: INT topa entry index
|
||||
* @stop_te: STOP topa entry pointer
|
||||
@@ -82,6 +83,7 @@ struct pt_buffer {
|
||||
local64_t head;
|
||||
bool snapshot;
|
||||
bool single;
|
||||
bool wrapped;
|
||||
long stop_pos, intr_pos;
|
||||
struct topa_entry *stop_te, *intr_te;
|
||||
void **data_pages;
|
||||
|
||||
@@ -194,12 +194,20 @@ bool make_spte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
|
||||
spte |= PT_WRITABLE_MASK | shadow_mmu_writable_mask;
|
||||
|
||||
/*
|
||||
* Optimization: for pte sync, if spte was writable the hash
|
||||
* lookup is unnecessary (and expensive). Write protection
|
||||
* is responsibility of kvm_mmu_get_page / kvm_mmu_sync_roots.
|
||||
* Same reasoning can be applied to dirty page accounting.
|
||||
* When overwriting an existing leaf SPTE, and the old SPTE was
|
||||
* writable, skip trying to unsync shadow pages as any relevant
|
||||
* shadow pages must already be unsync, i.e. the hash lookup is
|
||||
* unnecessary (and expensive).
|
||||
*
|
||||
* The same reasoning applies to dirty page/folio accounting;
|
||||
* KVM will mark the folio dirty using the old SPTE, thus
|
||||
* there's no need to immediately mark the new SPTE as dirty.
|
||||
*
|
||||
* Note, both cases rely on KVM not changing PFNs without first
|
||||
* zapping the old SPTE, which is guaranteed by both the shadow
|
||||
* MMU and the TDP MMU.
|
||||
*/
|
||||
if (is_writable_pte(old_spte))
|
||||
if (is_last_spte(old_spte, level) && is_writable_pte(old_spte))
|
||||
goto out;
|
||||
|
||||
/*
|
||||
|
||||
@@ -2474,6 +2474,12 @@ void blk_mq_start_stopped_hw_queue(struct blk_mq_hw_ctx *hctx, bool async)
|
||||
return;
|
||||
|
||||
clear_bit(BLK_MQ_S_STOPPED, &hctx->state);
|
||||
/*
|
||||
* Pairs with the smp_mb() in blk_mq_hctx_stopped() to order the
|
||||
* clearing of BLK_MQ_S_STOPPED above and the checking of dispatch
|
||||
* list in the subsequent routine.
|
||||
*/
|
||||
smp_mb__after_atomic();
|
||||
blk_mq_run_hw_queue(hctx, async);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(blk_mq_start_stopped_hw_queue);
|
||||
|
||||
@@ -178,6 +178,19 @@ static inline struct blk_mq_tags *blk_mq_tags_from_data(struct blk_mq_alloc_data
|
||||
|
||||
static inline bool blk_mq_hctx_stopped(struct blk_mq_hw_ctx *hctx)
|
||||
{
|
||||
/* Fast path: hardware queue is not stopped most of the time. */
|
||||
if (likely(!test_bit(BLK_MQ_S_STOPPED, &hctx->state)))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* This barrier is used to order adding of dispatch list before and
|
||||
* the test of BLK_MQ_S_STOPPED below. Pairs with the memory barrier
|
||||
* in blk_mq_start_stopped_hw_queue() so that dispatch code could
|
||||
* either see BLK_MQ_S_STOPPED is cleared or dispatch list is not
|
||||
* empty to avoid missing dispatching requests.
|
||||
*/
|
||||
smp_mb();
|
||||
|
||||
return test_bit(BLK_MQ_S_STOPPED, &hctx->state);
|
||||
}
|
||||
|
||||
|
||||
63
crypto/api.c
63
crypto/api.c
@@ -408,6 +408,7 @@ struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type,
|
||||
goto out_err;
|
||||
|
||||
tfm->__crt_alg = alg;
|
||||
refcount_set(&tfm->refcnt, 1);
|
||||
|
||||
err = crypto_init_ops(tfm, type, mask);
|
||||
if (err)
|
||||
@@ -487,26 +488,43 @@ err:
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(crypto_alloc_base);
|
||||
|
||||
void *crypto_create_tfm_node(struct crypto_alg *alg,
|
||||
const struct crypto_type *frontend,
|
||||
int node)
|
||||
static void *crypto_alloc_tfmmem(struct crypto_alg *alg,
|
||||
const struct crypto_type *frontend, int node,
|
||||
gfp_t gfp)
|
||||
{
|
||||
char *mem;
|
||||
struct crypto_tfm *tfm = NULL;
|
||||
struct crypto_tfm *tfm;
|
||||
unsigned int tfmsize;
|
||||
unsigned int total;
|
||||
int err = -ENOMEM;
|
||||
char *mem;
|
||||
|
||||
tfmsize = frontend->tfmsize;
|
||||
total = tfmsize + sizeof(*tfm) + frontend->extsize(alg);
|
||||
|
||||
mem = kzalloc_node(total, GFP_KERNEL, node);
|
||||
mem = kzalloc_node(total, gfp, node);
|
||||
if (mem == NULL)
|
||||
goto out_err;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
tfm = (struct crypto_tfm *)(mem + tfmsize);
|
||||
tfm->__crt_alg = alg;
|
||||
tfm->node = node;
|
||||
refcount_set(&tfm->refcnt, 1);
|
||||
|
||||
return mem;
|
||||
}
|
||||
|
||||
void *crypto_create_tfm_node(struct crypto_alg *alg,
|
||||
const struct crypto_type *frontend,
|
||||
int node)
|
||||
{
|
||||
struct crypto_tfm *tfm;
|
||||
char *mem;
|
||||
int err;
|
||||
|
||||
mem = crypto_alloc_tfmmem(alg, frontend, node, GFP_KERNEL);
|
||||
if (IS_ERR(mem))
|
||||
goto out;
|
||||
|
||||
tfm = (struct crypto_tfm *)(mem + frontend->tfmsize);
|
||||
|
||||
err = frontend->init_tfm(tfm);
|
||||
if (err)
|
||||
@@ -523,13 +541,38 @@ out_free_tfm:
|
||||
if (err == -EAGAIN)
|
||||
crypto_shoot_alg(alg);
|
||||
kfree(mem);
|
||||
out_err:
|
||||
mem = ERR_PTR(err);
|
||||
out:
|
||||
return mem;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(crypto_create_tfm_node);
|
||||
|
||||
void *crypto_clone_tfm(const struct crypto_type *frontend,
|
||||
struct crypto_tfm *otfm)
|
||||
{
|
||||
struct crypto_alg *alg = otfm->__crt_alg;
|
||||
struct crypto_tfm *tfm;
|
||||
char *mem;
|
||||
|
||||
mem = ERR_PTR(-ESTALE);
|
||||
if (unlikely(!crypto_mod_get(alg)))
|
||||
goto out;
|
||||
|
||||
mem = crypto_alloc_tfmmem(alg, frontend, otfm->node, GFP_ATOMIC);
|
||||
if (IS_ERR(mem)) {
|
||||
crypto_mod_put(alg);
|
||||
goto out;
|
||||
}
|
||||
|
||||
tfm = (struct crypto_tfm *)(mem + frontend->tfmsize);
|
||||
tfm->crt_flags = otfm->crt_flags;
|
||||
tfm->exit = otfm->exit;
|
||||
|
||||
out:
|
||||
return mem;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(crypto_clone_tfm);
|
||||
|
||||
struct crypto_alg *crypto_find_alg(const char *alg_name,
|
||||
const struct crypto_type *frontend,
|
||||
u32 type, u32 mask)
|
||||
@@ -619,6 +662,8 @@ void crypto_destroy_tfm(void *mem, struct crypto_tfm *tfm)
|
||||
if (IS_ERR_OR_NULL(mem))
|
||||
return;
|
||||
|
||||
if (!refcount_dec_and_test(&tfm->refcnt))
|
||||
return;
|
||||
alg = tfm->__crt_alg;
|
||||
|
||||
if (!tfm->exit && alg->cra_exit)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
#include <crypto/algapi.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/jump_label.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
@@ -103,6 +104,8 @@ struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type,
|
||||
u32 mask);
|
||||
void *crypto_create_tfm_node(struct crypto_alg *alg,
|
||||
const struct crypto_type *frontend, int node);
|
||||
void *crypto_clone_tfm(const struct crypto_type *frontend,
|
||||
struct crypto_tfm *otfm);
|
||||
|
||||
static inline void *crypto_create_tfm(struct crypto_alg *alg,
|
||||
const struct crypto_type *frontend)
|
||||
@@ -184,5 +187,10 @@ static inline int crypto_is_test_larval(struct crypto_larval *larval)
|
||||
return larval->alg.cra_driver_name[0];
|
||||
}
|
||||
|
||||
static inline struct crypto_tfm *crypto_tfm_get(struct crypto_tfm *tfm)
|
||||
{
|
||||
return refcount_inc_not_zero(&tfm->refcnt) ? tfm : ERR_PTR(-EOVERFLOW);
|
||||
}
|
||||
|
||||
#endif /* _CRYPTO_INTERNAL_H */
|
||||
|
||||
|
||||
@@ -853,6 +853,8 @@ bus_devices_fail:
|
||||
bus_remove_file(bus, &bus_attr_uevent);
|
||||
bus_uevent_fail:
|
||||
kset_unregister(&bus->p->subsys);
|
||||
/* Above kset_unregister() will kfree @bus->p */
|
||||
bus->p = NULL;
|
||||
out:
|
||||
kfree(bus->p);
|
||||
bus->p = NULL;
|
||||
|
||||
@@ -325,12 +325,21 @@ static inline char *ublk_queue_cmd_buf(struct ublk_device *ub, int q_id)
|
||||
return ublk_get_queue(ub, q_id)->io_cmd_buf;
|
||||
}
|
||||
|
||||
static inline int __ublk_queue_cmd_buf_size(int depth)
|
||||
{
|
||||
return round_up(depth * sizeof(struct ublksrv_io_desc), PAGE_SIZE);
|
||||
}
|
||||
|
||||
static inline int ublk_queue_cmd_buf_size(struct ublk_device *ub, int q_id)
|
||||
{
|
||||
struct ublk_queue *ubq = ublk_get_queue(ub, q_id);
|
||||
|
||||
return round_up(ubq->q_depth * sizeof(struct ublksrv_io_desc),
|
||||
PAGE_SIZE);
|
||||
return __ublk_queue_cmd_buf_size(ubq->q_depth);
|
||||
}
|
||||
|
||||
static int ublk_max_cmd_buf_size(void)
|
||||
{
|
||||
return __ublk_queue_cmd_buf_size(UBLK_MAX_QUEUE_DEPTH);
|
||||
}
|
||||
|
||||
static inline bool ublk_queue_can_use_recovery_reissue(
|
||||
@@ -930,7 +939,7 @@ static int ublk_ch_mmap(struct file *filp, struct vm_area_struct *vma)
|
||||
{
|
||||
struct ublk_device *ub = filp->private_data;
|
||||
size_t sz = vma->vm_end - vma->vm_start;
|
||||
unsigned max_sz = UBLK_MAX_QUEUE_DEPTH * sizeof(struct ublksrv_io_desc);
|
||||
unsigned max_sz = ublk_max_cmd_buf_size();
|
||||
unsigned long pfn, end, phys_off = vma->vm_pgoff << PAGE_SHIFT;
|
||||
int q_id, ret = 0;
|
||||
|
||||
@@ -2046,7 +2055,7 @@ static int ublk_ctrl_uring_cmd(struct io_uring_cmd *cmd,
|
||||
ret = ublk_ctrl_end_recovery(ub, cmd);
|
||||
break;
|
||||
default:
|
||||
ret = -ENOTSUPP;
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
if (ub)
|
||||
|
||||
@@ -297,6 +297,9 @@ static int applnco_probe(struct platform_device *pdev)
|
||||
memset(&init, 0, sizeof(init));
|
||||
init.name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
||||
"%s-%d", np->name, i);
|
||||
if (!init.name)
|
||||
return -ENOMEM;
|
||||
|
||||
init.ops = &applnco_ops;
|
||||
init.parent_data = &pdata;
|
||||
init.num_parents = 1;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/io.h>
|
||||
@@ -510,6 +511,7 @@ static int axi_clkgen_probe(struct platform_device *pdev)
|
||||
struct clk_init_data init;
|
||||
const char *parent_names[2];
|
||||
const char *clk_name;
|
||||
struct clk *axi_clk;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
@@ -526,8 +528,24 @@ static int axi_clkgen_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(axi_clkgen->base);
|
||||
|
||||
init.num_parents = of_clk_get_parent_count(pdev->dev.of_node);
|
||||
if (init.num_parents < 1 || init.num_parents > 2)
|
||||
return -EINVAL;
|
||||
|
||||
axi_clk = devm_clk_get_enabled(&pdev->dev, "s_axi_aclk");
|
||||
if (!IS_ERR(axi_clk)) {
|
||||
if (init.num_parents < 2 || init.num_parents > 3)
|
||||
return -EINVAL;
|
||||
|
||||
init.num_parents -= 1;
|
||||
} else {
|
||||
/*
|
||||
* Legacy... So that old DTs which do not have clock-names still
|
||||
* work. In this case we don't explicitly enable the AXI bus
|
||||
* clock.
|
||||
*/
|
||||
if (PTR_ERR(axi_clk) != -ENOENT)
|
||||
return PTR_ERR(axi_clk);
|
||||
if (init.num_parents < 1 || init.num_parents > 2)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < init.num_parents; i++) {
|
||||
parent_names[i] = of_clk_get_parent_name(pdev->dev.of_node, i);
|
||||
|
||||
@@ -353,6 +353,7 @@ static struct clk_alpha_pll gpll1_out_main = {
|
||||
/* 930MHz configuration */
|
||||
static const struct alpha_pll_config gpll3_config = {
|
||||
.l = 48,
|
||||
.alpha_hi = 0x70,
|
||||
.alpha = 0x0,
|
||||
.alpha_en_mask = BIT(24),
|
||||
.post_div_mask = 0xf << 8,
|
||||
|
||||
@@ -2402,6 +2402,18 @@ static int comedi_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
|
||||
start += PAGE_SIZE;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
/*
|
||||
* Leaving behind a partial mapping of a buffer we're about to
|
||||
* drop is unsafe, see remap_pfn_range_notrack().
|
||||
* We need to zap the range here ourselves instead of relying
|
||||
* on the automatic zapping in remap_pfn_range() because we call
|
||||
* remap_pfn_range() in a loop.
|
||||
*/
|
||||
if (retval)
|
||||
zap_vma_ptes(vma, vma->vm_start, size);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (retval == 0) {
|
||||
|
||||
@@ -195,11 +195,17 @@ static int stm32_count_enable_write(struct counter_device *counter,
|
||||
{
|
||||
struct stm32_timer_cnt *const priv = counter_priv(counter);
|
||||
u32 cr1;
|
||||
int ret;
|
||||
|
||||
if (enable) {
|
||||
regmap_read(priv->regmap, TIM_CR1, &cr1);
|
||||
if (!(cr1 & TIM_CR1_CEN))
|
||||
clk_enable(priv->clk);
|
||||
if (!(cr1 & TIM_CR1_CEN)) {
|
||||
ret = clk_enable(priv->clk);
|
||||
if (ret) {
|
||||
dev_err(counter->parent, "Cannot enable clock %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN,
|
||||
TIM_CR1_CEN);
|
||||
@@ -380,7 +386,11 @@ static int __maybe_unused stm32_timer_cnt_resume(struct device *dev)
|
||||
return ret;
|
||||
|
||||
if (priv->enabled) {
|
||||
clk_enable(priv->clk);
|
||||
ret = clk_enable(priv->clk);
|
||||
if (ret) {
|
||||
dev_err(dev, "Cannot enable clock %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Restore registers that may have been lost */
|
||||
regmap_write(priv->regmap, TIM_SMCR, priv->bak.smcr);
|
||||
|
||||
@@ -576,8 +576,13 @@ static int ecap_cnt_resume(struct device *dev)
|
||||
{
|
||||
struct counter_device *counter_dev = dev_get_drvdata(dev);
|
||||
struct ecap_cnt_dev *ecap_dev = counter_priv(counter_dev);
|
||||
int ret;
|
||||
|
||||
clk_enable(ecap_dev->clk);
|
||||
ret = clk_enable(ecap_dev->clk);
|
||||
if (ret) {
|
||||
dev_err(dev, "Cannot enable clock %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ecap_cnt_capture_set_evmode(counter_dev, ecap_dev->pm_ctx.ev_mode);
|
||||
|
||||
|
||||
@@ -423,7 +423,7 @@ static int cppc_get_cpu_power(struct device *cpu_dev,
|
||||
|
||||
policy = cpufreq_cpu_get_raw(cpu_dev->id);
|
||||
if (!policy)
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
|
||||
cpu_data = policy->driver_data;
|
||||
perf_caps = &cpu_data->perf_caps;
|
||||
@@ -493,7 +493,7 @@ static int cppc_get_cpu_cost(struct device *cpu_dev, unsigned long KHz,
|
||||
|
||||
policy = cpufreq_cpu_get_raw(cpu_dev->id);
|
||||
if (!policy)
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
|
||||
cpu_data = policy->driver_data;
|
||||
perf_caps = &cpu_data->perf_caps;
|
||||
|
||||
@@ -62,7 +62,7 @@ mtk_cpufreq_get_cpu_power(struct device *cpu_dev, unsigned long *uW,
|
||||
|
||||
policy = cpufreq_cpu_get_raw(cpu_dev->id);
|
||||
if (!policy)
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
|
||||
data = policy->driver_data;
|
||||
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
obj-$(CONFIG_DEV_DAX_PMEM) += dax_pmem.o
|
||||
obj-$(CONFIG_DEV_DAX_PMEM) += dax_pmem_core.o
|
||||
|
||||
dax_pmem-y := pmem.o
|
||||
dax_pmem_core-y := core.o
|
||||
dax_pmem_compat-y := compat.o
|
||||
@@ -1,10 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright(c) 2016 - 2018 Intel Corporation. All rights reserved. */
|
||||
#include <linux/percpu-refcount.h>
|
||||
#include <linux/memremap.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pfn_t.h>
|
||||
#include <linux/nd.h>
|
||||
#include "../bus.h"
|
||||
|
||||
|
||||
@@ -99,11 +99,13 @@ static void exar_set_value(struct gpio_chip *chip, unsigned int offset,
|
||||
struct exar_gpio_chip *exar_gpio = gpiochip_get_data(chip);
|
||||
unsigned int addr = exar_offset_to_lvl_addr(exar_gpio, offset);
|
||||
unsigned int bit = exar_offset_to_bit(exar_gpio, offset);
|
||||
unsigned int bit_value = value ? BIT(bit) : 0;
|
||||
|
||||
if (value)
|
||||
regmap_set_bits(exar_gpio->regmap, addr, BIT(bit));
|
||||
else
|
||||
regmap_clear_bits(exar_gpio->regmap, addr, BIT(bit));
|
||||
/*
|
||||
* regmap_write_bits() forces value to be written when an external
|
||||
* pull up/down might otherwise indicate value was already set.
|
||||
*/
|
||||
regmap_write_bits(exar_gpio->regmap, addr, BIT(bit), bit_value);
|
||||
}
|
||||
|
||||
static int exar_direction_output(struct gpio_chip *chip, unsigned int offset,
|
||||
|
||||
@@ -328,6 +328,7 @@ static const struct irq_domain_ops grgpio_irq_domain_ops = {
|
||||
static int grgpio_probe(struct platform_device *ofdev)
|
||||
{
|
||||
struct device_node *np = ofdev->dev.of_node;
|
||||
struct device *dev = &ofdev->dev;
|
||||
void __iomem *regs;
|
||||
struct gpio_chip *gc;
|
||||
struct grgpio_priv *priv;
|
||||
@@ -337,7 +338,7 @@ static int grgpio_probe(struct platform_device *ofdev)
|
||||
int size;
|
||||
int i;
|
||||
|
||||
priv = devm_kzalloc(&ofdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -346,28 +347,31 @@ static int grgpio_probe(struct platform_device *ofdev)
|
||||
return PTR_ERR(regs);
|
||||
|
||||
gc = &priv->gc;
|
||||
err = bgpio_init(gc, &ofdev->dev, 4, regs + GRGPIO_DATA,
|
||||
err = bgpio_init(gc, dev, 4, regs + GRGPIO_DATA,
|
||||
regs + GRGPIO_OUTPUT, NULL, regs + GRGPIO_DIR, NULL,
|
||||
BGPIOF_BIG_ENDIAN_BYTE_ORDER);
|
||||
if (err) {
|
||||
dev_err(&ofdev->dev, "bgpio_init() failed\n");
|
||||
dev_err(dev, "bgpio_init() failed\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
priv->regs = regs;
|
||||
priv->imask = gc->read_reg(regs + GRGPIO_IMASK);
|
||||
priv->dev = &ofdev->dev;
|
||||
priv->dev = dev;
|
||||
|
||||
gc->owner = THIS_MODULE;
|
||||
gc->to_irq = grgpio_to_irq;
|
||||
gc->label = devm_kasprintf(&ofdev->dev, GFP_KERNEL, "%pOF", np);
|
||||
gc->label = devm_kasprintf(dev, GFP_KERNEL, "%pOF", np);
|
||||
if (!gc->label)
|
||||
return -ENOMEM;
|
||||
|
||||
gc->base = -1;
|
||||
|
||||
err = of_property_read_u32(np, "nbits", &prop);
|
||||
if (err || prop <= 0 || prop > GRGPIO_MAX_NGPIO) {
|
||||
gc->ngpio = GRGPIO_MAX_NGPIO;
|
||||
dev_dbg(&ofdev->dev,
|
||||
"No or invalid nbits property: assume %d\n", gc->ngpio);
|
||||
dev_dbg(dev, "No or invalid nbits property: assume %d\n",
|
||||
gc->ngpio);
|
||||
} else {
|
||||
gc->ngpio = prop;
|
||||
}
|
||||
@@ -379,7 +383,7 @@ static int grgpio_probe(struct platform_device *ofdev)
|
||||
irqmap = (s32 *)of_get_property(np, "irqmap", &size);
|
||||
if (irqmap) {
|
||||
if (size < gc->ngpio) {
|
||||
dev_err(&ofdev->dev,
|
||||
dev_err(dev,
|
||||
"irqmap shorter than ngpio (%d < %d)\n",
|
||||
size, gc->ngpio);
|
||||
return -EINVAL;
|
||||
@@ -389,7 +393,7 @@ static int grgpio_probe(struct platform_device *ofdev)
|
||||
&grgpio_irq_domain_ops,
|
||||
priv);
|
||||
if (!priv->domain) {
|
||||
dev_err(&ofdev->dev, "Could not add irq domain\n");
|
||||
dev_err(dev, "Could not add irq domain\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -419,13 +423,13 @@ static int grgpio_probe(struct platform_device *ofdev)
|
||||
|
||||
err = gpiochip_add_data(gc, priv);
|
||||
if (err) {
|
||||
dev_err(&ofdev->dev, "Could not add gpiochip\n");
|
||||
dev_err(dev, "Could not add gpiochip\n");
|
||||
if (priv->domain)
|
||||
irq_domain_remove(priv->domain);
|
||||
return err;
|
||||
}
|
||||
|
||||
dev_info(&ofdev->dev, "regs=0x%p, base=%d, ngpio=%d, irqs=%s\n",
|
||||
dev_info(dev, "regs=0x%p, base=%d, ngpio=%d, irqs=%s\n",
|
||||
priv->regs, gc->base, gc->ngpio, priv->domain ? "on" : "off");
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -856,7 +856,8 @@ bool dcn20_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
|
||||
/*
|
||||
* if above if is not executed then 'params' equal to 0 and set in bypass
|
||||
*/
|
||||
mpc->funcs->set_output_gamma(mpc, mpcc_id, params);
|
||||
if (mpc->funcs->set_output_gamma)
|
||||
mpc->funcs->set_output_gamma(mpc, mpcc_id, params);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -448,7 +448,7 @@ void dcn30_init_hw(struct dc *dc)
|
||||
int edp_num;
|
||||
uint32_t backlight = MAX_BACKLIGHT_LEVEL;
|
||||
|
||||
if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)
|
||||
if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->init_clocks)
|
||||
dc->clk_mgr->funcs->init_clocks(dc->clk_mgr);
|
||||
|
||||
// Initialize the dccg
|
||||
@@ -631,11 +631,12 @@ void dcn30_init_hw(struct dc *dc)
|
||||
if (!dcb->funcs->is_accelerated_mode(dcb) && dc->res_pool->hubbub->funcs->init_watermarks)
|
||||
dc->res_pool->hubbub->funcs->init_watermarks(dc->res_pool->hubbub);
|
||||
|
||||
if (dc->clk_mgr->funcs->notify_wm_ranges)
|
||||
if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->notify_wm_ranges)
|
||||
dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr);
|
||||
|
||||
//if softmax is enabled then hardmax will be set by a different call
|
||||
if (dc->clk_mgr->funcs->set_hard_max_memclk && !dc->clk_mgr->dc_mode_softmax_enabled)
|
||||
if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->set_hard_max_memclk &&
|
||||
!dc->clk_mgr->dc_mode_softmax_enabled)
|
||||
dc->clk_mgr->funcs->set_hard_max_memclk(dc->clk_mgr);
|
||||
|
||||
if (dc->res_pool->hubbub->funcs->force_pstate_change_control)
|
||||
|
||||
@@ -811,7 +811,7 @@ void dcn32_init_hw(struct dc *dc)
|
||||
int edp_num;
|
||||
uint32_t backlight = MAX_BACKLIGHT_LEVEL;
|
||||
|
||||
if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)
|
||||
if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->init_clocks)
|
||||
dc->clk_mgr->funcs->init_clocks(dc->clk_mgr);
|
||||
|
||||
// Initialize the dccg
|
||||
@@ -970,10 +970,11 @@ void dcn32_init_hw(struct dc *dc)
|
||||
if (!dcb->funcs->is_accelerated_mode(dcb) && dc->res_pool->hubbub->funcs->init_watermarks)
|
||||
dc->res_pool->hubbub->funcs->init_watermarks(dc->res_pool->hubbub);
|
||||
|
||||
if (dc->clk_mgr->funcs->notify_wm_ranges)
|
||||
if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->notify_wm_ranges)
|
||||
dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr);
|
||||
|
||||
if (dc->clk_mgr->funcs->set_hard_max_memclk && !dc->clk_mgr->dc_mode_softmax_enabled)
|
||||
if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->set_hard_max_memclk &&
|
||||
!dc->clk_mgr->dc_mode_softmax_enabled)
|
||||
dc->clk_mgr->funcs->set_hard_max_memclk(dc->clk_mgr);
|
||||
|
||||
if (dc->res_pool->hubbub->funcs->force_pstate_change_control)
|
||||
|
||||
@@ -1796,6 +1796,9 @@ void dcn32_add_phantom_pipes(struct dc *dc, struct dc_state *context,
|
||||
// be a valid candidate for SubVP (i.e. has a plane, stream, doesn't
|
||||
// already have phantom pipe assigned, etc.) by previous checks.
|
||||
phantom_stream = dcn32_enable_phantom_stream(dc, context, pipes, pipe_cnt, index);
|
||||
if (!phantom_stream)
|
||||
return;
|
||||
|
||||
dcn32_enable_phantom_plane(dc, context, phantom_stream, index);
|
||||
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
|
||||
@@ -1314,6 +1314,8 @@ static ssize_t smu_v13_0_7_get_gpu_metrics(struct smu_context *smu,
|
||||
gpu_metrics->average_dclk1_frequency = metrics->AverageDclk1Frequency;
|
||||
|
||||
gpu_metrics->current_gfxclk = metrics->CurrClock[PPCLK_GFXCLK];
|
||||
gpu_metrics->current_socclk = metrics->CurrClock[PPCLK_SOCCLK];
|
||||
gpu_metrics->current_uclk = metrics->CurrClock[PPCLK_UCLK];
|
||||
gpu_metrics->current_vclk0 = metrics->CurrClock[PPCLK_VCLK_0];
|
||||
gpu_metrics->current_dclk0 = metrics->CurrClock[PPCLK_DCLK_0];
|
||||
gpu_metrics->current_vclk1 = metrics->CurrClock[PPCLK_VCLK_1];
|
||||
|
||||
@@ -481,7 +481,8 @@ void etnaviv_buffer_queue(struct etnaviv_gpu *gpu, u32 exec_state,
|
||||
} else {
|
||||
CMD_LOAD_STATE(buffer, VIVS_GL_FLUSH_CACHE,
|
||||
VIVS_GL_FLUSH_CACHE_DEPTH |
|
||||
VIVS_GL_FLUSH_CACHE_COLOR);
|
||||
VIVS_GL_FLUSH_CACHE_COLOR |
|
||||
VIVS_GL_FLUSH_CACHE_SHADER_L1);
|
||||
if (has_blt) {
|
||||
CMD_LOAD_STATE(buffer, VIVS_BLT_ENABLE, 0x1);
|
||||
CMD_LOAD_STATE(buffer, VIVS_BLT_SET_COMMAND, 0x1);
|
||||
|
||||
@@ -200,6 +200,9 @@ static int sti_cursor_atomic_check(struct drm_plane *drm_plane,
|
||||
return 0;
|
||||
|
||||
crtc_state = drm_atomic_get_crtc_state(state, crtc);
|
||||
if (IS_ERR(crtc_state))
|
||||
return PTR_ERR(crtc_state);
|
||||
|
||||
mode = &crtc_state->mode;
|
||||
dst_x = new_plane_state->crtc_x;
|
||||
dst_y = new_plane_state->crtc_y;
|
||||
|
||||
@@ -638,6 +638,9 @@ static int sti_gdp_atomic_check(struct drm_plane *drm_plane,
|
||||
|
||||
mixer = to_sti_mixer(crtc);
|
||||
crtc_state = drm_atomic_get_crtc_state(state, crtc);
|
||||
if (IS_ERR(crtc_state))
|
||||
return PTR_ERR(crtc_state);
|
||||
|
||||
mode = &crtc_state->mode;
|
||||
dst_x = new_plane_state->crtc_x;
|
||||
dst_y = new_plane_state->crtc_y;
|
||||
|
||||
@@ -1037,6 +1037,9 @@ static int sti_hqvdp_atomic_check(struct drm_plane *drm_plane,
|
||||
return 0;
|
||||
|
||||
crtc_state = drm_atomic_get_crtc_state(state, crtc);
|
||||
if (IS_ERR(crtc_state))
|
||||
return PTR_ERR(crtc_state);
|
||||
|
||||
mode = &crtc_state->mode;
|
||||
dst_x = new_plane_state->crtc_x;
|
||||
dst_y = new_plane_state->crtc_y;
|
||||
|
||||
@@ -1396,9 +1396,9 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
|
||||
rotation -= 1800;
|
||||
|
||||
input_report_abs(pen_input, ABS_TILT_X,
|
||||
(char)frame[7]);
|
||||
(signed char)frame[7]);
|
||||
input_report_abs(pen_input, ABS_TILT_Y,
|
||||
(char)frame[8]);
|
||||
(signed char)frame[8]);
|
||||
input_report_abs(pen_input, ABS_Z, rotation);
|
||||
input_report_abs(pen_input, ABS_WHEEL,
|
||||
get_unaligned_le16(&frame[11]));
|
||||
|
||||
@@ -132,7 +132,7 @@ static int tps23861_read_temp(struct tps23861_data *data, long *val)
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
*val = (regval * TEMPERATURE_LSB) - 20000;
|
||||
*val = ((long)regval * TEMPERATURE_LSB) - 20000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1281,7 +1281,7 @@ static void i3c_master_put_i3c_addrs(struct i3c_dev_desc *dev)
|
||||
I3C_ADDR_SLOT_FREE);
|
||||
|
||||
if (dev->boardinfo && dev->boardinfo->init_dyn_addr)
|
||||
i3c_bus_set_addr_slot_status(&master->bus, dev->info.dyn_addr,
|
||||
i3c_bus_set_addr_slot_status(&master->bus, dev->boardinfo->init_dyn_addr,
|
||||
I3C_ADDR_SLOT_FREE);
|
||||
}
|
||||
|
||||
|
||||
@@ -1639,8 +1639,8 @@ static int svc_i3c_master_probe(struct platform_device *pdev)
|
||||
rpm_disable:
|
||||
pm_runtime_dont_use_autosuspend(&pdev->dev);
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
|
||||
err_disable_clks:
|
||||
svc_i3c_master_unprepare_clks(master);
|
||||
|
||||
@@ -152,7 +152,7 @@ static int ad7780_write_raw(struct iio_dev *indio_dev,
|
||||
|
||||
switch (m) {
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
if (val != 0)
|
||||
if (val != 0 || val2 == 0)
|
||||
return -EINVAL;
|
||||
|
||||
vref = st->int_vref_mv * 1000000LL;
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
struct ad7923_state {
|
||||
struct spi_device *spi;
|
||||
struct spi_transfer ring_xfer[5];
|
||||
struct spi_transfer ring_xfer[9];
|
||||
struct spi_transfer scan_single_xfer[2];
|
||||
struct spi_message ring_msg;
|
||||
struct spi_message scan_single_msg;
|
||||
@@ -64,7 +64,7 @@ struct ad7923_state {
|
||||
* Length = 8 channels + 4 extra for 8 byte timestamp
|
||||
*/
|
||||
__be16 rx_buf[12] __aligned(IIO_DMA_MINALIGN);
|
||||
__be16 tx_buf[4];
|
||||
__be16 tx_buf[8];
|
||||
};
|
||||
|
||||
struct ad7923_chip_info {
|
||||
|
||||
@@ -276,7 +276,7 @@ struct iio_channel *fwnode_iio_channel_get_by_name(struct fwnode_handle *fwnode,
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
chan = __fwnode_iio_channel_get_by_name(fwnode, name);
|
||||
chan = __fwnode_iio_channel_get_by_name(parent, name);
|
||||
if (!IS_ERR(chan) || PTR_ERR(chan) != -ENODEV) {
|
||||
fwnode_handle_put(parent);
|
||||
return chan;
|
||||
|
||||
@@ -87,7 +87,12 @@ static int al3010_init(struct al3010_data *data)
|
||||
int ret;
|
||||
|
||||
ret = al3010_set_pwr(data->client, true);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = devm_add_action_or_reset(&data->client->dev,
|
||||
al3010_set_pwr_off,
|
||||
data);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -191,12 +196,6 @@ static int al3010_probe(struct i2c_client *client,
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_add_action_or_reset(&client->dev,
|
||||
al3010_set_pwr_off,
|
||||
data);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return devm_iio_device_register(&client->dev, indio_dev);
|
||||
}
|
||||
|
||||
|
||||
@@ -578,7 +578,7 @@ static inline int set_rc_wqe(struct hns_roce_qp *qp,
|
||||
if (WARN_ON(ret))
|
||||
return ret;
|
||||
|
||||
hr_reg_write(rc_sq_wqe, RC_SEND_WQE_FENCE,
|
||||
hr_reg_write(rc_sq_wqe, RC_SEND_WQE_SO,
|
||||
(wr->send_flags & IB_SEND_FENCE) ? 1 : 0);
|
||||
|
||||
hr_reg_write(rc_sq_wqe, RC_SEND_WQE_SE,
|
||||
|
||||
@@ -926,6 +926,7 @@ struct hns_roce_v2_rc_send_wqe {
|
||||
#define RC_SEND_WQE_OWNER RC_SEND_WQE_FIELD_LOC(7, 7)
|
||||
#define RC_SEND_WQE_CQE RC_SEND_WQE_FIELD_LOC(8, 8)
|
||||
#define RC_SEND_WQE_FENCE RC_SEND_WQE_FIELD_LOC(9, 9)
|
||||
#define RC_SEND_WQE_SO RC_SEND_WQE_FIELD_LOC(10, 10)
|
||||
#define RC_SEND_WQE_SE RC_SEND_WQE_FIELD_LOC(11, 11)
|
||||
#define RC_SEND_WQE_INLINE RC_SEND_WQE_FIELD_LOC(12, 12)
|
||||
#define RC_SEND_WQE_WQE_INDEX RC_SEND_WQE_FIELD_LOC(30, 15)
|
||||
|
||||
@@ -415,15 +415,16 @@ static int hns_roce_set_page(struct ib_mr *ibmr, u64 addr)
|
||||
}
|
||||
|
||||
int hns_roce_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
|
||||
unsigned int *sg_offset)
|
||||
unsigned int *sg_offset_p)
|
||||
{
|
||||
unsigned int sg_offset = sg_offset_p ? *sg_offset_p : 0;
|
||||
struct hns_roce_dev *hr_dev = to_hr_dev(ibmr->device);
|
||||
struct ib_device *ibdev = &hr_dev->ib_dev;
|
||||
struct hns_roce_mr *mr = to_hr_mr(ibmr);
|
||||
struct hns_roce_mtr *mtr = &mr->pbl_mtr;
|
||||
int ret, sg_num = 0;
|
||||
|
||||
if (!IS_ALIGNED(*sg_offset, HNS_ROCE_FRMR_ALIGN_SIZE) ||
|
||||
if (!IS_ALIGNED(sg_offset, HNS_ROCE_FRMR_ALIGN_SIZE) ||
|
||||
ibmr->page_size < HNS_HW_PAGE_SIZE ||
|
||||
ibmr->page_size > HNS_HW_MAX_PAGE_SIZE)
|
||||
return sg_num;
|
||||
@@ -434,7 +435,7 @@ int hns_roce_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
|
||||
if (!mr->page_list)
|
||||
return sg_num;
|
||||
|
||||
sg_num = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, hns_roce_set_page);
|
||||
sg_num = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset_p, hns_roce_set_page);
|
||||
if (sg_num < 1) {
|
||||
ibdev_err(ibdev, "failed to store sg pages %u %u, cnt = %d.\n",
|
||||
mr->npages, mr->pbl_mtr.hem_cfg.buf_pg_count, sg_num);
|
||||
|
||||
@@ -184,6 +184,18 @@ static phys_addr_t iopte_to_paddr(arm_lpae_iopte pte,
|
||||
return (paddr | (paddr << (48 - 12))) & (ARM_LPAE_PTE_ADDR_MASK << 4);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert an index returned by ARM_LPAE_PGD_IDX(), which can point into
|
||||
* a concatenated PGD, into the maximum number of entries that can be
|
||||
* mapped in the same table page.
|
||||
*/
|
||||
static inline int arm_lpae_max_entries(int i, struct arm_lpae_io_pgtable *data)
|
||||
{
|
||||
int ptes_per_table = ARM_LPAE_PTES_PER_TABLE(data);
|
||||
|
||||
return ptes_per_table - (i & (ptes_per_table - 1));
|
||||
}
|
||||
|
||||
static bool selftest_running = false;
|
||||
|
||||
static dma_addr_t __arm_lpae_dma_addr(void *pages)
|
||||
@@ -361,7 +373,7 @@ static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova,
|
||||
|
||||
/* If we can install a leaf entry at this level, then do so */
|
||||
if (size == block_size) {
|
||||
max_entries = ARM_LPAE_PTES_PER_TABLE(data) - map_idx_start;
|
||||
max_entries = arm_lpae_max_entries(map_idx_start, data);
|
||||
num_entries = min_t(int, pgcount, max_entries);
|
||||
ret = arm_lpae_init_pte(data, iova, paddr, prot, lvl, num_entries, ptep);
|
||||
if (!ret && mapped)
|
||||
@@ -578,7 +590,7 @@ static size_t arm_lpae_split_blk_unmap(struct arm_lpae_io_pgtable *data,
|
||||
|
||||
if (size == split_sz) {
|
||||
unmap_idx_start = ARM_LPAE_LVL_IDX(iova, lvl, data);
|
||||
max_entries = ptes_per_table - unmap_idx_start;
|
||||
max_entries = arm_lpae_max_entries(unmap_idx_start, data);
|
||||
num_entries = min_t(int, pgcount, max_entries);
|
||||
}
|
||||
|
||||
@@ -636,7 +648,7 @@ static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data,
|
||||
|
||||
/* If the size matches this level, we're in the right place */
|
||||
if (size == ARM_LPAE_BLOCK_SIZE(lvl, data)) {
|
||||
max_entries = ARM_LPAE_PTES_PER_TABLE(data) - unmap_idx_start;
|
||||
max_entries = arm_lpae_max_entries(unmap_idx_start, data);
|
||||
num_entries = min_t(int, pgcount, max_entries);
|
||||
|
||||
while (i < num_entries) {
|
||||
|
||||
@@ -580,9 +580,6 @@ static int lp55xx_parse_common_child(struct device_node *np,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (*chan_nr < 0 || *chan_nr > cfg->max_channel)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -500,7 +500,7 @@ static const struct mhuv2_protocol_ops mhuv2_data_transfer_ops = {
|
||||
static struct mbox_chan *get_irq_chan_comb(struct mhuv2 *mhu, u32 __iomem *reg)
|
||||
{
|
||||
struct mbox_chan *chans = mhu->mbox.chans;
|
||||
int channel = 0, i, offset = 0, windows, protocol, ch_wn;
|
||||
int channel = 0, i, j, offset = 0, windows, protocol, ch_wn;
|
||||
u32 stat;
|
||||
|
||||
for (i = 0; i < MHUV2_CMB_INT_ST_REG_CNT; i++) {
|
||||
@@ -510,9 +510,9 @@ static struct mbox_chan *get_irq_chan_comb(struct mhuv2 *mhu, u32 __iomem *reg)
|
||||
|
||||
ch_wn = i * MHUV2_STAT_BITS + __builtin_ctz(stat);
|
||||
|
||||
for (i = 0; i < mhu->length; i += 2) {
|
||||
protocol = mhu->protocols[i];
|
||||
windows = mhu->protocols[i + 1];
|
||||
for (j = 0; j < mhu->length; j += 2) {
|
||||
protocol = mhu->protocols[j];
|
||||
windows = mhu->protocols[j + 1];
|
||||
|
||||
if (ch_wn >= offset + windows) {
|
||||
if (protocol == DOORBELL)
|
||||
|
||||
@@ -605,18 +605,18 @@ static int cmdq_probe(struct platform_device *pdev)
|
||||
cmdq->mbox.chans[i].con_priv = (void *)&cmdq->thread[i];
|
||||
}
|
||||
|
||||
err = devm_mbox_controller_register(dev, &cmdq->mbox);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "failed to register mailbox: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, cmdq);
|
||||
|
||||
WARN_ON(clk_bulk_prepare(cmdq->gce_num, cmdq->clocks));
|
||||
|
||||
cmdq_init(cmdq);
|
||||
|
||||
err = devm_mbox_controller_register(dev, &cmdq->mbox);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "failed to register mailbox: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -2457,6 +2457,7 @@ static void pool_work_wait(struct pool_work *pw, struct pool *pool,
|
||||
init_completion(&pw->complete);
|
||||
queue_work(pool->wq, &pw->worker);
|
||||
wait_for_completion(&pw->complete);
|
||||
destroy_work_on_stack(&pw->worker);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
|
||||
@@ -554,13 +554,19 @@ static int ts2020_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct ts2020_config *pdata = client->dev.platform_data;
|
||||
struct dvb_frontend *fe = pdata->fe;
|
||||
struct dvb_frontend *fe;
|
||||
struct ts2020_priv *dev;
|
||||
int ret;
|
||||
u8 u8tmp;
|
||||
unsigned int utmp;
|
||||
char *chip_str;
|
||||
|
||||
if (!pdata) {
|
||||
dev_err(&client->dev, "platform data is mandatory\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
fe = pdata->fe;
|
||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (!dev) {
|
||||
ret = -ENOMEM;
|
||||
|
||||
@@ -1405,12 +1405,13 @@ static int stdi2dv_timings(struct v4l2_subdev *sd,
|
||||
if (v4l2_detect_cvt(stdi->lcf + 1, hfreq, stdi->lcvs, 0,
|
||||
(stdi->hs_pol == '+' ? V4L2_DV_HSYNC_POS_POL : 0) |
|
||||
(stdi->vs_pol == '+' ? V4L2_DV_VSYNC_POS_POL : 0),
|
||||
false, timings))
|
||||
false, adv76xx_get_dv_timings_cap(sd, -1), timings))
|
||||
return 0;
|
||||
if (v4l2_detect_gtf(stdi->lcf + 1, hfreq, stdi->lcvs,
|
||||
(stdi->hs_pol == '+' ? V4L2_DV_HSYNC_POS_POL : 0) |
|
||||
(stdi->vs_pol == '+' ? V4L2_DV_VSYNC_POS_POL : 0),
|
||||
false, state->aspect_ratio, timings))
|
||||
false, state->aspect_ratio,
|
||||
adv76xx_get_dv_timings_cap(sd, -1), timings))
|
||||
return 0;
|
||||
|
||||
v4l2_dbg(2, debug, sd,
|
||||
|
||||
@@ -1431,14 +1431,15 @@ static int stdi2dv_timings(struct v4l2_subdev *sd,
|
||||
}
|
||||
|
||||
if (v4l2_detect_cvt(stdi->lcf + 1, hfreq, stdi->lcvs, 0,
|
||||
(stdi->hs_pol == '+' ? V4L2_DV_HSYNC_POS_POL : 0) |
|
||||
(stdi->vs_pol == '+' ? V4L2_DV_VSYNC_POS_POL : 0),
|
||||
false, timings))
|
||||
(stdi->hs_pol == '+' ? V4L2_DV_HSYNC_POS_POL : 0) |
|
||||
(stdi->vs_pol == '+' ? V4L2_DV_VSYNC_POS_POL : 0),
|
||||
false, adv7842_get_dv_timings_cap(sd), timings))
|
||||
return 0;
|
||||
if (v4l2_detect_gtf(stdi->lcf + 1, hfreq, stdi->lcvs,
|
||||
(stdi->hs_pol == '+' ? V4L2_DV_HSYNC_POS_POL : 0) |
|
||||
(stdi->vs_pol == '+' ? V4L2_DV_VSYNC_POS_POL : 0),
|
||||
false, state->aspect_ratio, timings))
|
||||
(stdi->hs_pol == '+' ? V4L2_DV_HSYNC_POS_POL : 0) |
|
||||
(stdi->vs_pol == '+' ? V4L2_DV_VSYNC_POS_POL : 0),
|
||||
false, state->aspect_ratio,
|
||||
adv7842_get_dv_timings_cap(sd), timings))
|
||||
return 0;
|
||||
|
||||
v4l2_dbg(2, debug, sd,
|
||||
|
||||
@@ -476,10 +476,9 @@ static int dw9768_probe(struct i2c_client *client)
|
||||
* to be powered on in an ACPI system. Similarly for power off in
|
||||
* remove.
|
||||
*/
|
||||
pm_runtime_enable(dev);
|
||||
full_power = (is_acpi_node(dev_fwnode(dev)) &&
|
||||
acpi_dev_state_d0(dev)) ||
|
||||
(is_of_node(dev_fwnode(dev)) && !pm_runtime_enabled(dev));
|
||||
(is_of_node(dev_fwnode(dev)) && !IS_ENABLED(CONFIG_PM));
|
||||
if (full_power) {
|
||||
ret = dw9768_runtime_resume(dev);
|
||||
if (ret < 0) {
|
||||
@@ -489,6 +488,7 @@ static int dw9768_probe(struct i2c_client *client)
|
||||
pm_runtime_set_active(dev);
|
||||
}
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
ret = v4l2_async_register_subdev(&dw9768->sd);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to register V4L2 subdev: %d", ret);
|
||||
@@ -500,12 +500,12 @@ static int dw9768_probe(struct i2c_client *client)
|
||||
return 0;
|
||||
|
||||
err_power_off:
|
||||
pm_runtime_disable(dev);
|
||||
if (full_power) {
|
||||
dw9768_runtime_suspend(dev);
|
||||
pm_runtime_set_suspended(dev);
|
||||
}
|
||||
err_clean_entity:
|
||||
pm_runtime_disable(dev);
|
||||
media_entity_cleanup(&dw9768->sd.entity);
|
||||
err_free_handler:
|
||||
v4l2_ctrl_handler_free(&dw9768->ctrls);
|
||||
@@ -522,12 +522,12 @@ static void dw9768_remove(struct i2c_client *client)
|
||||
v4l2_async_unregister_subdev(&dw9768->sd);
|
||||
v4l2_ctrl_handler_free(&dw9768->ctrls);
|
||||
media_entity_cleanup(&dw9768->sd.entity);
|
||||
pm_runtime_disable(dev);
|
||||
if ((is_acpi_node(dev_fwnode(dev)) && acpi_dev_state_d0(dev)) ||
|
||||
(is_of_node(dev_fwnode(dev)) && !pm_runtime_enabled(dev))) {
|
||||
(is_of_node(dev_fwnode(dev)) && !IS_ENABLED(CONFIG_PM))) {
|
||||
dw9768_runtime_suspend(dev);
|
||||
pm_runtime_set_suspended(dev);
|
||||
}
|
||||
pm_runtime_disable(dev);
|
||||
}
|
||||
|
||||
static const struct of_device_id dw9768_of_table[] = {
|
||||
|
||||
@@ -2162,8 +2162,10 @@ static int tc358743_probe(struct i2c_client *client)
|
||||
|
||||
err_work_queues:
|
||||
cec_unregister_adapter(state->cec_adap);
|
||||
if (!state->i2c_client->irq)
|
||||
if (!state->i2c_client->irq) {
|
||||
del_timer(&state->timer);
|
||||
flush_work(&state->work_i2c_poll);
|
||||
}
|
||||
cancel_delayed_work(&state->delayed_work_enable_hotplug);
|
||||
mutex_destroy(&state->confctl_mutex);
|
||||
err_hdl:
|
||||
|
||||
@@ -1510,8 +1510,10 @@ static int allocate_buffers_internal(struct allegro_channel *channel,
|
||||
INIT_LIST_HEAD(&buffer->head);
|
||||
|
||||
err = allegro_alloc_buffer(dev, buffer, size);
|
||||
if (err)
|
||||
if (err) {
|
||||
kfree(buffer);
|
||||
goto err;
|
||||
}
|
||||
list_add(&buffer->head, list);
|
||||
}
|
||||
|
||||
|
||||
@@ -151,8 +151,8 @@ err_add_decoder:
|
||||
media_device_cleanup(&vpu->mdev);
|
||||
v4l2_device_unregister(&vpu->v4l2_dev);
|
||||
err_vpu_deinit:
|
||||
pm_runtime_set_suspended(dev);
|
||||
pm_runtime_disable(dev);
|
||||
pm_runtime_set_suspended(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -740,6 +740,7 @@ int vpu_add_func(struct vpu_dev *vpu, struct vpu_func *func)
|
||||
vfd->fops = vdec_get_fops();
|
||||
vfd->ioctl_ops = vdec_get_ioctl_ops();
|
||||
}
|
||||
video_set_drvdata(vfd, vpu);
|
||||
|
||||
ret = video_register_device(vfd, VFL_TYPE_VIDEO, -1);
|
||||
if (ret) {
|
||||
@@ -747,7 +748,6 @@ int vpu_add_func(struct vpu_dev *vpu, struct vpu_func *func)
|
||||
v4l2_m2m_release(func->m2m_dev);
|
||||
return ret;
|
||||
}
|
||||
video_set_drvdata(vfd, vpu);
|
||||
func->vfd = vfd;
|
||||
|
||||
ret = v4l2_m2m_register_media_controller(func->m2m_dev, func->vfd, func->function);
|
||||
|
||||
@@ -1047,7 +1047,7 @@ static void aspeed_video_get_resolution(struct aspeed_video *video)
|
||||
static void aspeed_video_set_resolution(struct aspeed_video *video)
|
||||
{
|
||||
struct v4l2_bt_timings *act = &video->active_timings;
|
||||
unsigned int size = act->width * act->height;
|
||||
unsigned int size = act->width * ALIGN(act->height, 8);
|
||||
|
||||
/* Set capture/compression frame sizes */
|
||||
aspeed_video_calc_compressed_size(video, size);
|
||||
@@ -1064,7 +1064,7 @@ static void aspeed_video_set_resolution(struct aspeed_video *video)
|
||||
u32 width = ALIGN(act->width, 64);
|
||||
|
||||
aspeed_video_write(video, VE_CAP_WINDOW, width << 16 | act->height);
|
||||
size = width * act->height;
|
||||
size = width * ALIGN(act->height, 8);
|
||||
} else {
|
||||
aspeed_video_write(video, VE_CAP_WINDOW,
|
||||
act->width << 16 | act->height);
|
||||
|
||||
@@ -2097,6 +2097,8 @@ static void mxc_jpeg_detach_pm_domains(struct mxc_jpeg_dev *jpeg)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < jpeg->num_domains; i++) {
|
||||
if (jpeg->pd_dev[i] && !pm_runtime_suspended(jpeg->pd_dev[i]))
|
||||
pm_runtime_force_suspend(jpeg->pd_dev[i]);
|
||||
if (jpeg->pd_link[i] && !IS_ERR(jpeg->pd_link[i]))
|
||||
device_link_del(jpeg->pd_link[i]);
|
||||
if (jpeg->pd_dev[i] && !IS_ERR(jpeg->pd_dev[i]))
|
||||
@@ -2252,6 +2254,7 @@ static int mxc_jpeg_probe(struct platform_device *pdev)
|
||||
jpeg->dec_vdev->vfl_dir = VFL_DIR_M2M;
|
||||
jpeg->dec_vdev->device_caps = V4L2_CAP_STREAMING |
|
||||
V4L2_CAP_VIDEO_M2M_MPLANE;
|
||||
video_set_drvdata(jpeg->dec_vdev, jpeg);
|
||||
if (mode == MXC_JPEG_ENCODE) {
|
||||
v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_DECODER_CMD);
|
||||
v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_TRY_DECODER_CMD);
|
||||
@@ -2264,7 +2267,6 @@ static int mxc_jpeg_probe(struct platform_device *pdev)
|
||||
dev_err(dev, "failed to register video device\n");
|
||||
goto err_vdev_register;
|
||||
}
|
||||
video_set_drvdata(jpeg->dec_vdev, jpeg);
|
||||
if (mode == MXC_JPEG_ENCODE)
|
||||
v4l2_info(&jpeg->v4l2_dev,
|
||||
"encoder device registered as /dev/video%d (%d,%d)\n",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user