Merge "Merge android-4.19-stable.152 (13abe23
) into msm-4.19"
This commit is contained in:
commit
ba87aa9b05
486 changed files with 8553 additions and 3029 deletions
|
@ -250,7 +250,7 @@ High-level taskfile hooks
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
void (*qc_prep) (struct ata_queued_cmd *qc);
|
enum ata_completion_errors (*qc_prep) (struct ata_queued_cmd *qc);
|
||||||
int (*qc_issue) (struct ata_queued_cmd *qc);
|
int (*qc_issue) (struct ata_queued_cmd *qc);
|
||||||
|
|
||||||
|
|
||||||
|
|
87
Documentation/kbuild/llvm.rst
Normal file
87
Documentation/kbuild/llvm.rst
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
==============================
|
||||||
|
Building Linux with Clang/LLVM
|
||||||
|
==============================
|
||||||
|
|
||||||
|
This document covers how to build the Linux kernel with Clang and LLVM
|
||||||
|
utilities.
|
||||||
|
|
||||||
|
About
|
||||||
|
-----
|
||||||
|
|
||||||
|
The Linux kernel has always traditionally been compiled with GNU toolchains
|
||||||
|
such as GCC and binutils. Ongoing work has allowed for `Clang
|
||||||
|
<https://clang.llvm.org/>`_ and `LLVM <https://llvm.org/>`_ utilities to be
|
||||||
|
used as viable substitutes. Distributions such as `Android
|
||||||
|
<https://www.android.com/>`_, `ChromeOS
|
||||||
|
<https://www.chromium.org/chromium-os>`_, and `OpenMandriva
|
||||||
|
<https://www.openmandriva.org/>`_ use Clang built kernels. `LLVM is a
|
||||||
|
collection of toolchain components implemented in terms of C++ objects
|
||||||
|
<https://www.aosabook.org/en/llvm.html>`_. Clang is a front-end to LLVM that
|
||||||
|
supports C and the GNU C extensions required by the kernel, and is pronounced
|
||||||
|
"klang," not "see-lang."
|
||||||
|
|
||||||
|
Clang
|
||||||
|
-----
|
||||||
|
|
||||||
|
The compiler used can be swapped out via `CC=` command line argument to `make`.
|
||||||
|
`CC=` should be set when selecting a config and during a build.
|
||||||
|
|
||||||
|
make CC=clang defconfig
|
||||||
|
|
||||||
|
make CC=clang
|
||||||
|
|
||||||
|
Cross Compiling
|
||||||
|
---------------
|
||||||
|
|
||||||
|
A single Clang compiler binary will typically contain all supported backends,
|
||||||
|
which can help simplify cross compiling.
|
||||||
|
|
||||||
|
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make CC=clang
|
||||||
|
|
||||||
|
`CROSS_COMPILE` is not used to prefix the Clang compiler binary, instead
|
||||||
|
`CROSS_COMPILE` is used to set a command line flag: `--target <triple>`. For
|
||||||
|
example:
|
||||||
|
|
||||||
|
clang --target aarch64-linux-gnu foo.c
|
||||||
|
|
||||||
|
LLVM Utilities
|
||||||
|
--------------
|
||||||
|
|
||||||
|
LLVM has substitutes for GNU binutils utilities. Kbuild supports `LLVM=1`
|
||||||
|
to enable them.
|
||||||
|
|
||||||
|
make LLVM=1
|
||||||
|
|
||||||
|
They can be enabled individually. The full list of the parameters:
|
||||||
|
|
||||||
|
make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \\
|
||||||
|
OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump OBJSIZE=llvm-size \\
|
||||||
|
READELF=llvm-readelf HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar \\
|
||||||
|
HOSTLD=ld.lld
|
||||||
|
|
||||||
|
Currently, the integrated assembler is disabled by default. You can pass
|
||||||
|
`LLVM_IAS=1` to enable it.
|
||||||
|
|
||||||
|
Getting Help
|
||||||
|
------------
|
||||||
|
|
||||||
|
- `Website <https://clangbuiltlinux.github.io/>`_
|
||||||
|
- `Mailing List <https://groups.google.com/forum/#!forum/clang-built-linux>`_: <clang-built-linux@googlegroups.com>
|
||||||
|
- `Issue Tracker <https://github.com/ClangBuiltLinux/linux/issues>`_
|
||||||
|
- IRC: #clangbuiltlinux on chat.freenode.net
|
||||||
|
- `Telegram <https://t.me/ClangBuiltLinux>`_: @ClangBuiltLinux
|
||||||
|
- `Wiki <https://github.com/ClangBuiltLinux/linux/wiki>`_
|
||||||
|
- `Beginner Bugs <https://github.com/ClangBuiltLinux/linux/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22>`_
|
||||||
|
|
||||||
|
Getting LLVM
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- http://releases.llvm.org/download.html
|
||||||
|
- https://github.com/llvm/llvm-project
|
||||||
|
- https://llvm.org/docs/GettingStarted.html
|
||||||
|
- https://llvm.org/docs/CMake.html
|
||||||
|
- https://apt.llvm.org/
|
||||||
|
- https://www.archlinux.org/packages/extra/x86_64/llvm/
|
||||||
|
- https://github.com/ClangBuiltLinux/tc-build
|
||||||
|
- https://github.com/ClangBuiltLinux/linux/wiki/Building-Clang-from-source
|
||||||
|
- https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/
|
|
@ -3619,6 +3619,15 @@ M: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: .clang-format
|
F: .clang-format
|
||||||
|
|
||||||
|
CLANG/LLVM BUILD SUPPORT
|
||||||
|
L: clang-built-linux@googlegroups.com
|
||||||
|
W: https://clangbuiltlinux.github.io/
|
||||||
|
B: https://github.com/ClangBuiltLinux/linux/issues
|
||||||
|
C: irc://chat.freenode.net/clangbuiltlinux
|
||||||
|
S: Supported
|
||||||
|
K: \b(?i:clang|llvm)\b
|
||||||
|
F: Documentation/kbuild/llvm.rst
|
||||||
|
|
||||||
CLEANCACHE API
|
CLEANCACHE API
|
||||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
|
|
38
Makefile
38
Makefile
|
@ -1,7 +1,7 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 19
|
PATCHLEVEL = 19
|
||||||
SUBLEVEL = 146
|
SUBLEVEL = 152
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = "People's Front"
|
NAME = "People's Front"
|
||||||
|
|
||||||
|
@ -358,8 +358,13 @@ HOST_LFS_CFLAGS := $(shell getconf LFS_CFLAGS 2>/dev/null)
|
||||||
HOST_LFS_LDFLAGS := $(shell getconf LFS_LDFLAGS 2>/dev/null)
|
HOST_LFS_LDFLAGS := $(shell getconf LFS_LDFLAGS 2>/dev/null)
|
||||||
HOST_LFS_LIBS := $(shell getconf LFS_LIBS 2>/dev/null)
|
HOST_LFS_LIBS := $(shell getconf LFS_LIBS 2>/dev/null)
|
||||||
|
|
||||||
HOSTCC = gcc
|
ifneq ($(LLVM),)
|
||||||
HOSTCXX = g++
|
HOSTCC = clang
|
||||||
|
HOSTCXX = clang++
|
||||||
|
else
|
||||||
|
HOSTCC = gcc
|
||||||
|
HOSTCXX = g++
|
||||||
|
endif
|
||||||
KBUILD_HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \
|
KBUILD_HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \
|
||||||
-fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS) \
|
-fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS) \
|
||||||
$(HOSTCFLAGS)
|
$(HOSTCFLAGS)
|
||||||
|
@ -368,15 +373,28 @@ KBUILD_HOSTLDFLAGS := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS)
|
||||||
KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
|
KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
|
||||||
|
|
||||||
# Make variables (CC, etc...)
|
# Make variables (CC, etc...)
|
||||||
AS = $(CROSS_COMPILE)as
|
|
||||||
LD = $(CROSS_COMPILE)ld
|
|
||||||
REAL_CC = $(CROSS_COMPILE)gcc
|
|
||||||
CPP = $(CC) -E
|
CPP = $(CC) -E
|
||||||
|
ifneq ($(LLVM),)
|
||||||
|
CC = clang
|
||||||
|
LD = ld.lld
|
||||||
|
AR = llvm-ar
|
||||||
|
NM = llvm-nm
|
||||||
|
OBJCOPY = llvm-objcopy
|
||||||
|
OBJDUMP = llvm-objdump
|
||||||
|
READELF = llvm-readelf
|
||||||
|
OBJSIZE = llvm-size
|
||||||
|
STRIP = llvm-strip
|
||||||
|
else
|
||||||
|
REAL_CC = $(CROSS_COMPILE)gcc
|
||||||
|
LD = $(CROSS_COMPILE)ld
|
||||||
AR = $(CROSS_COMPILE)ar
|
AR = $(CROSS_COMPILE)ar
|
||||||
NM = $(CROSS_COMPILE)nm
|
NM = $(CROSS_COMPILE)nm
|
||||||
STRIP = $(CROSS_COMPILE)strip
|
|
||||||
OBJCOPY = $(CROSS_COMPILE)objcopy
|
OBJCOPY = $(CROSS_COMPILE)objcopy
|
||||||
OBJDUMP = $(CROSS_COMPILE)objdump
|
OBJDUMP = $(CROSS_COMPILE)objdump
|
||||||
|
READELF = $(CROSS_COMPILE)readelf
|
||||||
|
OBJSIZE = $(CROSS_COMPILE)size
|
||||||
|
STRIP = $(CROSS_COMPILE)strip
|
||||||
|
endif
|
||||||
LEX = flex
|
LEX = flex
|
||||||
YACC = bison
|
YACC = bison
|
||||||
AWK = awk
|
AWK = awk
|
||||||
|
@ -436,8 +454,8 @@ KBUILD_LDFLAGS :=
|
||||||
GCC_PLUGINS_CFLAGS :=
|
GCC_PLUGINS_CFLAGS :=
|
||||||
CLANG_FLAGS :=
|
CLANG_FLAGS :=
|
||||||
|
|
||||||
export ARCH SRCARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC
|
export ARCH SRCARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC
|
||||||
export CPP AR NM STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
|
export CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE READELF KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
|
||||||
export MAKE LEX YACC AWK GENKSYMS INSTALLKERNEL PERL PYTHON PYTHON2 PYTHON3 UTS_MACHINE
|
export MAKE LEX YACC AWK GENKSYMS INSTALLKERNEL PERL PYTHON PYTHON2 PYTHON3 UTS_MACHINE
|
||||||
export HOSTCXX KBUILD_HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
|
export HOSTCXX KBUILD_HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
|
||||||
|
|
||||||
|
@ -499,7 +517,9 @@ endif
|
||||||
ifneq ($(GCC_TOOLCHAIN),)
|
ifneq ($(GCC_TOOLCHAIN),)
|
||||||
CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN)
|
CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN)
|
||||||
endif
|
endif
|
||||||
|
ifneq ($(LLVM_IAS),1)
|
||||||
CLANG_FLAGS += -no-integrated-as
|
CLANG_FLAGS += -no-integrated-as
|
||||||
|
endif
|
||||||
CLANG_FLAGS += $(call cc-option, -Wno-misleading-indentation)
|
CLANG_FLAGS += $(call cc-option, -Wno-misleading-indentation)
|
||||||
CLANG_FLAGS += $(call cc-option, -Wno-bool-operation)
|
CLANG_FLAGS += $(call cc-option, -Wno-bool-operation)
|
||||||
CLANG_FLAGS += -Werror=unknown-warning-option
|
CLANG_FLAGS += -Werror=unknown-warning-option
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[abi_whitelist]
|
[abi_symbol_list]
|
||||||
# commonly used symbols
|
# commonly used symbols
|
||||||
__cfi_slowpath
|
__cfi_slowpath
|
||||||
__const_udelay
|
__const_udelay
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
||||||
[abi_whitelist]
|
[abi_symbol_list]
|
||||||
# commonly used symbols
|
# commonly used symbols
|
||||||
add_wait_queue
|
add_wait_queue
|
||||||
alloc_etherdev_mqs
|
alloc_etherdev_mqs
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[abi_whitelist]
|
[abi_symbol_list]
|
||||||
# commonly used symbols
|
# commonly used symbols
|
||||||
add_timer
|
add_timer
|
||||||
add_uevent_var
|
add_uevent_var
|
||||||
|
|
|
@ -120,7 +120,7 @@ ccflags-y := -fpic $(call cc-option,-mno-single-pic-base,) -fno-builtin -I$(obj)
|
||||||
asflags-y := -DZIMAGE
|
asflags-y := -DZIMAGE
|
||||||
|
|
||||||
# Supply kernel BSS size to the decompressor via a linker symbol.
|
# Supply kernel BSS size to the decompressor via a linker symbol.
|
||||||
KBSS_SZ = $(shell echo $$(($$($(CROSS_COMPILE)nm $(obj)/../../../../vmlinux | \
|
KBSS_SZ = $(shell echo $$(($$($(NM) $(obj)/../../../../vmlinux | \
|
||||||
sed -n -e 's/^\([^ ]*\) [AB] __bss_start$$/-0x\1/p' \
|
sed -n -e 's/^\([^ ]*\) [AB] __bss_start$$/-0x\1/p' \
|
||||||
-e 's/^\([^ ]*\) [AB] __bss_stop$$/+0x\1/p') )) )
|
-e 's/^\([^ ]*\) [AB] __bss_stop$$/+0x\1/p') )) )
|
||||||
LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ)
|
LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ)
|
||||||
|
@ -166,7 +166,7 @@ $(obj)/bswapsdi2.S: $(srctree)/arch/$(SRCARCH)/lib/bswapsdi2.S
|
||||||
# The .data section is already discarded by the linker script so no need
|
# The .data section is already discarded by the linker script so no need
|
||||||
# to bother about it here.
|
# to bother about it here.
|
||||||
check_for_bad_syms = \
|
check_for_bad_syms = \
|
||||||
bad_syms=$$($(CROSS_COMPILE)nm $@ | sed -n 's/^.\{8\} [bc] \(.*\)/\1/p') && \
|
bad_syms=$$($(NM) $@ | sed -n 's/^.\{8\} [bc] \(.*\)/\1/p') && \
|
||||||
[ -z "$$bad_syms" ] || \
|
[ -z "$$bad_syms" ] || \
|
||||||
( echo "following symbols must have non local/private scope:" >&2; \
|
( echo "following symbols must have non local/private scope:" >&2; \
|
||||||
echo "$$bad_syms" >&2; rm -f $@; false )
|
echo "$$bad_syms" >&2; rm -f $@; false )
|
||||||
|
|
|
@ -216,7 +216,7 @@ static inline int kvm_vcpu_dabt_get_rd(struct kvm_vcpu *vcpu)
|
||||||
return (kvm_vcpu_get_hsr(vcpu) & HSR_SRT_MASK) >> HSR_SRT_SHIFT;
|
return (kvm_vcpu_get_hsr(vcpu) & HSR_SRT_MASK) >> HSR_SRT_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool kvm_vcpu_dabt_iss1tw(struct kvm_vcpu *vcpu)
|
static inline bool kvm_vcpu_abt_iss1tw(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return kvm_vcpu_get_hsr(vcpu) & HSR_DABT_S1PTW;
|
return kvm_vcpu_get_hsr(vcpu) & HSR_DABT_S1PTW;
|
||||||
}
|
}
|
||||||
|
@ -248,16 +248,21 @@ static inline bool kvm_vcpu_trap_il_is32bit(struct kvm_vcpu *vcpu)
|
||||||
return kvm_vcpu_get_hsr(vcpu) & HSR_IL;
|
return kvm_vcpu_get_hsr(vcpu) & HSR_IL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u8 kvm_vcpu_trap_get_class(struct kvm_vcpu *vcpu)
|
static inline u8 kvm_vcpu_trap_get_class(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return kvm_vcpu_get_hsr(vcpu) >> HSR_EC_SHIFT;
|
return kvm_vcpu_get_hsr(vcpu) >> HSR_EC_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool kvm_vcpu_trap_is_iabt(struct kvm_vcpu *vcpu)
|
static inline bool kvm_vcpu_trap_is_iabt(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return kvm_vcpu_trap_get_class(vcpu) == HSR_EC_IABT;
|
return kvm_vcpu_trap_get_class(vcpu) == HSR_EC_IABT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool kvm_vcpu_trap_is_exec_fault(const struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return kvm_vcpu_trap_is_iabt(vcpu) && !kvm_vcpu_abt_iss1tw(vcpu);
|
||||||
|
}
|
||||||
|
|
||||||
static inline u8 kvm_vcpu_trap_get_fault(struct kvm_vcpu *vcpu)
|
static inline u8 kvm_vcpu_trap_get_fault(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return kvm_vcpu_get_hsr(vcpu) & HSR_FSC;
|
return kvm_vcpu_get_hsr(vcpu) & HSR_FSC;
|
||||||
|
|
|
@ -115,6 +115,8 @@ static int save_trace(struct stackframe *frame, void *d)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
regs = (struct pt_regs *)frame->sp;
|
regs = (struct pt_regs *)frame->sp;
|
||||||
|
if ((unsigned long)®s[1] > ALIGN(frame->sp, THREAD_SIZE))
|
||||||
|
return 0;
|
||||||
|
|
||||||
trace->entries[trace->nr_entries++] = regs->ARM_pc;
|
trace->entries[trace->nr_entries++] = regs->ARM_pc;
|
||||||
|
|
||||||
|
|
|
@ -68,14 +68,16 @@ static void dump_mem(const char *, const char *, unsigned long, unsigned long);
|
||||||
|
|
||||||
void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
|
void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
|
||||||
{
|
{
|
||||||
|
unsigned long end = frame + 4 + sizeof(struct pt_regs);
|
||||||
|
|
||||||
#ifdef CONFIG_KALLSYMS
|
#ifdef CONFIG_KALLSYMS
|
||||||
printk("[<%08lx>] (%ps) from [<%08lx>] (%pS)\n", where, (void *)where, from, (void *)from);
|
printk("[<%08lx>] (%ps) from [<%08lx>] (%pS)\n", where, (void *)where, from, (void *)from);
|
||||||
#else
|
#else
|
||||||
printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
|
printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (in_entry_text(from))
|
if (in_entry_text(from) && end <= ALIGN(frame, THREAD_SIZE))
|
||||||
dump_mem("", "Exception stack", frame + 4, frame + 4 + sizeof(struct pt_regs));
|
dump_mem("", "Exception stack", frame + 4, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_backtrace_stm(u32 *stack, u32 instruction)
|
void dump_backtrace_stm(u32 *stack, u32 instruction)
|
||||||
|
|
|
@ -10,12 +10,13 @@ obj-vdso := $(addprefix $(obj)/, $(obj-vdso))
|
||||||
ccflags-y := -fPIC -fno-common -fno-builtin -fno-stack-protector
|
ccflags-y := -fPIC -fno-common -fno-builtin -fno-stack-protector
|
||||||
ccflags-y += -DDISABLE_BRANCH_PROFILING
|
ccflags-y += -DDISABLE_BRANCH_PROFILING
|
||||||
|
|
||||||
VDSO_LDFLAGS := -Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname=linux-vdso.so.1
|
ldflags-$(CONFIG_CPU_ENDIAN_BE8) := --be8
|
||||||
VDSO_LDFLAGS += -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096
|
ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
|
||||||
VDSO_LDFLAGS += -nostdlib -shared
|
-z max-page-size=4096 -z common-page-size=4096 \
|
||||||
VDSO_LDFLAGS += $(call cc-ldoption, -Wl$(comma)--hash-style=sysv)
|
-nostdlib -shared $(ldflags-y) \
|
||||||
VDSO_LDFLAGS += $(call cc-ldoption, -Wl$(comma)--build-id)
|
$(call ld-option, --hash-style=sysv) \
|
||||||
VDSO_LDFLAGS += $(call cc-ldoption, -fuse-ld=bfd)
|
$(call ld-option, --build-id) \
|
||||||
|
-T
|
||||||
|
|
||||||
obj-$(CONFIG_VDSO) += vdso.o
|
obj-$(CONFIG_VDSO) += vdso.o
|
||||||
extra-$(CONFIG_VDSO) += vdso.lds
|
extra-$(CONFIG_VDSO) += vdso.lds
|
||||||
|
@ -37,8 +38,8 @@ KCOV_INSTRUMENT := n
|
||||||
$(obj)/vdso.o : $(obj)/vdso.so
|
$(obj)/vdso.o : $(obj)/vdso.so
|
||||||
|
|
||||||
# Link rule for the .so file
|
# Link rule for the .so file
|
||||||
$(obj)/vdso.so.raw: $(src)/vdso.lds $(obj-vdso) FORCE
|
$(obj)/vdso.so.raw: $(obj)/vdso.lds $(obj-vdso) FORCE
|
||||||
$(call if_changed,vdsold)
|
$(call if_changed,ld)
|
||||||
|
|
||||||
$(obj)/vdso.so.dbg: $(obj)/vdso.so.raw $(obj)/vdsomunge FORCE
|
$(obj)/vdso.so.dbg: $(obj)/vdso.so.raw $(obj)/vdsomunge FORCE
|
||||||
$(call if_changed,vdsomunge)
|
$(call if_changed,vdsomunge)
|
||||||
|
@ -48,11 +49,6 @@ $(obj)/%.so: OBJCOPYFLAGS := -S
|
||||||
$(obj)/%.so: $(obj)/%.so.dbg FORCE
|
$(obj)/%.so: $(obj)/%.so.dbg FORCE
|
||||||
$(call if_changed,objcopy)
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
# Actual build commands
|
|
||||||
quiet_cmd_vdsold = VDSO $@
|
|
||||||
cmd_vdsold = $(CC) $(c_flags) $(VDSO_LDFLAGS) \
|
|
||||||
-Wl,-T $(filter %.lds,$^) $(filter %.o,$^) -o $@
|
|
||||||
|
|
||||||
quiet_cmd_vdsomunge = MUNGE $@
|
quiet_cmd_vdsomunge = MUNGE $@
|
||||||
cmd_vdsomunge = $(objtree)/$(obj)/vdsomunge $< $@
|
cmd_vdsomunge = $(objtree)/$(obj)/vdsomunge $< $@
|
||||||
|
|
||||||
|
|
|
@ -151,6 +151,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&qspi {
|
&qspi {
|
||||||
|
status = "okay";
|
||||||
flash@0 {
|
flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
|
@ -303,7 +303,7 @@ static inline int kvm_vcpu_dabt_get_rd(const struct kvm_vcpu *vcpu)
|
||||||
return (kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT;
|
return (kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool kvm_vcpu_dabt_iss1tw(const struct kvm_vcpu *vcpu)
|
static inline bool kvm_vcpu_abt_iss1tw(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_S1PTW);
|
return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_S1PTW);
|
||||||
}
|
}
|
||||||
|
@ -311,7 +311,7 @@ static inline bool kvm_vcpu_dabt_iss1tw(const struct kvm_vcpu *vcpu)
|
||||||
static inline bool kvm_vcpu_dabt_iswrite(const struct kvm_vcpu *vcpu)
|
static inline bool kvm_vcpu_dabt_iswrite(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_WNR) ||
|
return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_WNR) ||
|
||||||
kvm_vcpu_dabt_iss1tw(vcpu); /* AF/DBM update */
|
kvm_vcpu_abt_iss1tw(vcpu); /* AF/DBM update */
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool kvm_vcpu_dabt_is_cm(const struct kvm_vcpu *vcpu)
|
static inline bool kvm_vcpu_dabt_is_cm(const struct kvm_vcpu *vcpu)
|
||||||
|
@ -340,6 +340,11 @@ static inline bool kvm_vcpu_trap_is_iabt(const struct kvm_vcpu *vcpu)
|
||||||
return kvm_vcpu_trap_get_class(vcpu) == ESR_ELx_EC_IABT_LOW;
|
return kvm_vcpu_trap_get_class(vcpu) == ESR_ELx_EC_IABT_LOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool kvm_vcpu_trap_is_exec_fault(const struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return kvm_vcpu_trap_is_iabt(vcpu) && !kvm_vcpu_abt_iss1tw(vcpu);
|
||||||
|
}
|
||||||
|
|
||||||
static inline u8 kvm_vcpu_trap_get_fault(const struct kvm_vcpu *vcpu)
|
static inline u8 kvm_vcpu_trap_get_fault(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return kvm_vcpu_get_hsr(vcpu) & ESR_ELx_FSC;
|
return kvm_vcpu_get_hsr(vcpu) & ESR_ELx_FSC;
|
||||||
|
|
|
@ -155,11 +155,10 @@ static const struct arm64_ftr_bits ftr_id_aa64pfr0[] = {
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_GIC_SHIFT, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_GIC_SHIFT, 4, 0),
|
||||||
S_ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_ASIMD_SHIFT, 4, ID_AA64PFR0_ASIMD_NI),
|
S_ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_ASIMD_SHIFT, 4, ID_AA64PFR0_ASIMD_NI),
|
||||||
S_ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_FP_SHIFT, 4, ID_AA64PFR0_FP_NI),
|
S_ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_FP_SHIFT, 4, ID_AA64PFR0_FP_NI),
|
||||||
/* Linux doesn't care about the EL3 */
|
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL3_SHIFT, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL3_SHIFT, 4, 0),
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL2_SHIFT, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL2_SHIFT, 4, 0),
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL1_SHIFT, 4, ID_AA64PFR0_EL1_64BIT_ONLY),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL1_SHIFT, 4, ID_AA64PFR0_EL1_64BIT_ONLY),
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL0_SHIFT, 4, ID_AA64PFR0_EL0_64BIT_ONLY),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL0_SHIFT, 4, ID_AA64PFR0_EL0_64BIT_ONLY),
|
||||||
ARM64_FTR_END,
|
ARM64_FTR_END,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -301,7 +300,7 @@ static const struct arm64_ftr_bits ftr_id_pfr0[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct arm64_ftr_bits ftr_id_dfr0[] = {
|
static const struct arm64_ftr_bits ftr_id_dfr0[] = {
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 28, 4, 0),
|
/* [31:28] TraceFilt */
|
||||||
S_ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 24, 4, 0xf), /* PerfMon */
|
S_ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 24, 4, 0xf), /* PerfMon */
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 20, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 20, 4, 0),
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 16, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 16, 4, 0),
|
||||||
|
@ -671,9 +670,6 @@ void update_cpu_features(int cpu,
|
||||||
taint |= check_update_ftr_reg(SYS_ID_AA64MMFR2_EL1, cpu,
|
taint |= check_update_ftr_reg(SYS_ID_AA64MMFR2_EL1, cpu,
|
||||||
info->reg_id_aa64mmfr2, boot->reg_id_aa64mmfr2);
|
info->reg_id_aa64mmfr2, boot->reg_id_aa64mmfr2);
|
||||||
|
|
||||||
/*
|
|
||||||
* EL3 is not our concern.
|
|
||||||
*/
|
|
||||||
taint |= check_update_ftr_reg(SYS_ID_AA64PFR0_EL1, cpu,
|
taint |= check_update_ftr_reg(SYS_ID_AA64PFR0_EL1, cpu,
|
||||||
info->reg_id_aa64pfr0, boot->reg_id_aa64pfr0);
|
info->reg_id_aa64pfr0, boot->reg_id_aa64pfr0);
|
||||||
taint |= check_update_ftr_reg(SYS_ID_AA64PFR1_EL1, cpu,
|
taint |= check_update_ftr_reg(SYS_ID_AA64PFR1_EL1, cpu,
|
||||||
|
|
|
@ -22,16 +22,21 @@ endif
|
||||||
|
|
||||||
CC_COMPAT ?= $(CC)
|
CC_COMPAT ?= $(CC)
|
||||||
CC_COMPAT += $(CC_COMPAT_CLANG_FLAGS)
|
CC_COMPAT += $(CC_COMPAT_CLANG_FLAGS)
|
||||||
|
|
||||||
|
ifeq ($(LLVM),1)
|
||||||
|
LD_COMPAT ?= $(LD)
|
||||||
|
else
|
||||||
|
LD_COMPAT ?= $(CROSS_COMPILE_COMPAT)ld
|
||||||
|
endif
|
||||||
else
|
else
|
||||||
CC_COMPAT ?= $(CROSS_COMPILE_COMPAT)gcc
|
CC_COMPAT ?= $(CROSS_COMPILE_COMPAT)gcc
|
||||||
|
LD_COMPAT ?= $(CROSS_COMPILE_COMPAT)ld
|
||||||
endif
|
endif
|
||||||
|
|
||||||
cc32-option = $(call try-run,\
|
cc32-option = $(call try-run,\
|
||||||
$(CC_COMPAT) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))
|
$(CC_COMPAT) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))
|
||||||
cc32-disable-warning = $(call try-run,\
|
cc32-disable-warning = $(call try-run,\
|
||||||
$(CC_COMPAT) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
|
$(CC_COMPAT) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
|
||||||
cc32-ldoption = $(call try-run,\
|
|
||||||
$(CC_COMPAT) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
|
|
||||||
cc32-as-instr = $(call try-run,\
|
cc32-as-instr = $(call try-run,\
|
||||||
printf "%b\n" "$(1)" | $(CC_COMPAT) $(VDSO_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3))
|
printf "%b\n" "$(1)" | $(CC_COMPAT) $(VDSO_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3))
|
||||||
|
|
||||||
|
@ -114,14 +119,10 @@ dmbinstr := $(call cc32-as-instr,dmb ishld,-DCONFIG_AS_DMB_ISHLD=1)
|
||||||
VDSO_CFLAGS += $(dmbinstr)
|
VDSO_CFLAGS += $(dmbinstr)
|
||||||
VDSO_AFLAGS += $(dmbinstr)
|
VDSO_AFLAGS += $(dmbinstr)
|
||||||
|
|
||||||
VDSO_LDFLAGS := $(VDSO_CPPFLAGS)
|
|
||||||
# From arm vDSO Makefile
|
# From arm vDSO Makefile
|
||||||
VDSO_LDFLAGS += -Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname=linux-vdso.so.1
|
VDSO_LDFLAGS += -Bsymbolic --no-undefined -soname=linux-vdso.so.1
|
||||||
VDSO_LDFLAGS += -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096
|
VDSO_LDFLAGS += -z max-page-size=4096 -z common-page-size=4096
|
||||||
VDSO_LDFLAGS += -nostdlib -shared -mfloat-abi=soft
|
VDSO_LDFLAGS += -nostdlib -shared --hash-style=sysv --build-id
|
||||||
VDSO_LDFLAGS += $(call cc32-ldoption,-Wl$(comma)--hash-style=sysv)
|
|
||||||
VDSO_LDFLAGS += $(call cc32-ldoption,-Wl$(comma)--build-id)
|
|
||||||
VDSO_LDFLAGS += $(call cc32-ldoption,-fuse-ld=bfd)
|
|
||||||
|
|
||||||
|
|
||||||
# Borrow vdsomunge.c from the arm vDSO
|
# Borrow vdsomunge.c from the arm vDSO
|
||||||
|
@ -182,8 +183,8 @@ quiet_cmd_vdsold_and_vdso_check = LD32 $@
|
||||||
cmd_vdsold_and_vdso_check = $(cmd_vdsold); $(cmd_vdso_check)
|
cmd_vdsold_and_vdso_check = $(cmd_vdsold); $(cmd_vdso_check)
|
||||||
|
|
||||||
quiet_cmd_vdsold = LD32 $@
|
quiet_cmd_vdsold = LD32 $@
|
||||||
cmd_vdsold = $(CC_COMPAT) -Wp,-MD,$(depfile) $(VDSO_LDFLAGS) \
|
cmd_vdsold = $(LD_COMPAT) $(VDSO_LDFLAGS) \
|
||||||
-Wl,-T $(filter %.lds,$^) $(filter %.o,$^) -o $@
|
-T $(filter %.lds,$^) $(filter %.o,$^) -o $@
|
||||||
quiet_cmd_vdsocc = CC32 $@
|
quiet_cmd_vdsocc = CC32 $@
|
||||||
cmd_vdsocc = $(CC_COMPAT) -Wp,-MD,$(depfile) $(VDSO_CFLAGS) -c -o $@ $<
|
cmd_vdsocc = $(CC_COMPAT) -Wp,-MD,$(depfile) $(VDSO_CFLAGS) -c -o $@ $<
|
||||||
quiet_cmd_vdsocc_gettimeofday = CC32 $@
|
quiet_cmd_vdsocc_gettimeofday = CC32 $@
|
||||||
|
|
|
@ -430,7 +430,7 @@ static bool __hyp_text fixup_guest_exit(struct kvm_vcpu *vcpu, u64 *exit_code)
|
||||||
kvm_vcpu_trap_get_fault_type(vcpu) == FSC_FAULT &&
|
kvm_vcpu_trap_get_fault_type(vcpu) == FSC_FAULT &&
|
||||||
kvm_vcpu_dabt_isvalid(vcpu) &&
|
kvm_vcpu_dabt_isvalid(vcpu) &&
|
||||||
!kvm_vcpu_dabt_isextabt(vcpu) &&
|
!kvm_vcpu_dabt_isextabt(vcpu) &&
|
||||||
!kvm_vcpu_dabt_iss1tw(vcpu);
|
!kvm_vcpu_abt_iss1tw(vcpu);
|
||||||
|
|
||||||
if (valid) {
|
if (valid) {
|
||||||
int ret = __vgic_v2_perform_cpuif_access(vcpu);
|
int ret = __vgic_v2_perform_cpuif_access(vcpu);
|
||||||
|
|
|
@ -499,7 +499,7 @@ virtual_memmap_init(u64 start, u64 end, void *arg)
|
||||||
if (map_start < map_end)
|
if (map_start < map_end)
|
||||||
memmap_init_zone((unsigned long)(map_end - map_start),
|
memmap_init_zone((unsigned long)(map_end - map_start),
|
||||||
args->nid, args->zone, page_to_pfn(map_start),
|
args->nid, args->zone, page_to_pfn(map_start),
|
||||||
MEMMAP_EARLY, NULL);
|
MEMINIT_EARLY, NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -508,8 +508,8 @@ memmap_init (unsigned long size, int nid, unsigned long zone,
|
||||||
unsigned long start_pfn)
|
unsigned long start_pfn)
|
||||||
{
|
{
|
||||||
if (!vmem_map) {
|
if (!vmem_map) {
|
||||||
memmap_init_zone(size, nid, zone, start_pfn, MEMMAP_EARLY,
|
memmap_init_zone(size, nid, zone, start_pfn,
|
||||||
NULL);
|
MEMINIT_EARLY, NULL);
|
||||||
} else {
|
} else {
|
||||||
struct page *start;
|
struct page *start;
|
||||||
struct memmap_init_callback_data args;
|
struct memmap_init_callback_data args;
|
||||||
|
|
|
@ -273,6 +273,7 @@ static int q40_get_rtc_pll(struct rtc_pll_info *pll)
|
||||||
{
|
{
|
||||||
int tmp = Q40_RTC_CTRL;
|
int tmp = Q40_RTC_CTRL;
|
||||||
|
|
||||||
|
pll->pll_ctrl = 0;
|
||||||
pll->pll_value = tmp & Q40_RTC_PLL_MASK;
|
pll->pll_value = tmp & Q40_RTC_PLL_MASK;
|
||||||
if (tmp & Q40_RTC_PLL_SIGN)
|
if (tmp & Q40_RTC_PLL_SIGN)
|
||||||
pll->pll_value = -pll->pll_value;
|
pll->pll_value = -pll->pll_value;
|
||||||
|
|
|
@ -854,6 +854,7 @@ config SNI_RM
|
||||||
select I8253
|
select I8253
|
||||||
select I8259
|
select I8259
|
||||||
select ISA
|
select ISA
|
||||||
|
select MIPS_L1_CACHE_SHIFT_6
|
||||||
select SWAP_IO_SPACE if CPU_BIG_ENDIAN
|
select SWAP_IO_SPACE if CPU_BIG_ENDIAN
|
||||||
select SYS_HAS_CPU_R4X00
|
select SYS_HAS_CPU_R4X00
|
||||||
select SYS_HAS_CPU_R5000
|
select SYS_HAS_CPU_R5000
|
||||||
|
|
|
@ -47,6 +47,7 @@ static inline int __pure __get_cpu_type(const int cpu_type)
|
||||||
case CPU_34K:
|
case CPU_34K:
|
||||||
case CPU_1004K:
|
case CPU_1004K:
|
||||||
case CPU_74K:
|
case CPU_74K:
|
||||||
|
case CPU_1074K:
|
||||||
case CPU_M14KC:
|
case CPU_M14KC:
|
||||||
case CPU_M14KEC:
|
case CPU_M14KEC:
|
||||||
case CPU_INTERAPTIV:
|
case CPU_INTERAPTIV:
|
||||||
|
|
|
@ -131,6 +131,8 @@ void kvm_arch_check_processor_compat(void *rtn)
|
||||||
int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case KVM_VM_MIPS_AUTO:
|
||||||
|
break;
|
||||||
#ifdef CONFIG_KVM_MIPS_VZ
|
#ifdef CONFIG_KVM_MIPS_VZ
|
||||||
case KVM_VM_MIPS_VZ:
|
case KVM_VM_MIPS_VZ:
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -143,7 +143,10 @@ static struct platform_device sc26xx_pdev = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static u32 a20r_ack_hwint(void)
|
/*
|
||||||
|
* Trigger chipset to update CPU's CAUSE IP field
|
||||||
|
*/
|
||||||
|
static u32 a20r_update_cause_ip(void)
|
||||||
{
|
{
|
||||||
u32 status = read_c0_status();
|
u32 status = read_c0_status();
|
||||||
|
|
||||||
|
@ -205,12 +208,14 @@ static void a20r_hwint(void)
|
||||||
int irq;
|
int irq;
|
||||||
|
|
||||||
clear_c0_status(IE_IRQ0);
|
clear_c0_status(IE_IRQ0);
|
||||||
status = a20r_ack_hwint();
|
status = a20r_update_cause_ip();
|
||||||
cause = read_c0_cause();
|
cause = read_c0_cause();
|
||||||
|
|
||||||
irq = ffs(((cause & status) >> 8) & 0xf8);
|
irq = ffs(((cause & status) >> 8) & 0xf8);
|
||||||
if (likely(irq > 0))
|
if (likely(irq > 0))
|
||||||
do_IRQ(SNI_A20R_IRQ_BASE + irq - 1);
|
do_IRQ(SNI_A20R_IRQ_BASE + irq - 1);
|
||||||
|
|
||||||
|
a20r_update_cause_ip();
|
||||||
set_c0_status(IE_IRQ0);
|
set_c0_status(IE_IRQ0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
static void cache_loop(struct page *page, const unsigned int reg)
|
static __always_inline void cache_loop(struct page *page, const unsigned int reg)
|
||||||
{
|
{
|
||||||
unsigned long paddr = page_to_pfn(page) << PAGE_SHIFT;
|
unsigned long paddr = page_to_pfn(page) << PAGE_SHIFT;
|
||||||
unsigned long line = paddr & ~(L1_CACHE_BYTES - 1);
|
unsigned long line = paddr & ~(L1_CACHE_BYTES - 1);
|
||||||
|
|
|
@ -163,4 +163,7 @@
|
||||||
|
|
||||||
#define KVM_INST_FETCH_FAILED -1
|
#define KVM_INST_FETCH_FAILED -1
|
||||||
|
|
||||||
|
/* Extract PO and XOP opcode fields */
|
||||||
|
#define PO_XOP_OPCODE_MASK 0xfc0007fe
|
||||||
|
|
||||||
#endif /* __POWERPC_KVM_ASM_H__ */
|
#endif /* __POWERPC_KVM_ASM_H__ */
|
||||||
|
|
|
@ -100,7 +100,8 @@ static u64 dma_iommu_get_required_mask(struct device *dev)
|
||||||
if (!tbl)
|
if (!tbl)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
mask = 1ULL < (fls_long(tbl->it_offset + tbl->it_size) - 1);
|
mask = 1ULL << (fls_long(tbl->it_offset + tbl->it_size) +
|
||||||
|
tbl->it_page_shift - 1);
|
||||||
mask += mask - 1;
|
mask += mask - 1;
|
||||||
|
|
||||||
return mask;
|
return mask;
|
||||||
|
|
|
@ -502,7 +502,7 @@ int eeh_dev_check_failure(struct eeh_dev *edev)
|
||||||
rc = 1;
|
rc = 1;
|
||||||
if (pe->state & EEH_PE_ISOLATED) {
|
if (pe->state & EEH_PE_ISOLATED) {
|
||||||
pe->check_count++;
|
pe->check_count++;
|
||||||
if (pe->check_count % EEH_MAX_FAILS == 0) {
|
if (pe->check_count == EEH_MAX_FAILS) {
|
||||||
dn = pci_device_to_OF_node(dev);
|
dn = pci_device_to_OF_node(dev);
|
||||||
if (dn)
|
if (dn)
|
||||||
location = of_get_property(dn, "ibm,loc-code",
|
location = of_get_property(dn, "ibm,loc-code",
|
||||||
|
|
|
@ -430,11 +430,11 @@ void system_reset_exception(struct pt_regs *regs)
|
||||||
#ifdef CONFIG_PPC_BOOK3S_64
|
#ifdef CONFIG_PPC_BOOK3S_64
|
||||||
BUG_ON(get_paca()->in_nmi == 0);
|
BUG_ON(get_paca()->in_nmi == 0);
|
||||||
if (get_paca()->in_nmi > 1)
|
if (get_paca()->in_nmi > 1)
|
||||||
nmi_panic(regs, "Unrecoverable nested System Reset");
|
die("Unrecoverable nested System Reset", regs, SIGABRT);
|
||||||
#endif
|
#endif
|
||||||
/* Must die if the interrupt is not recoverable */
|
/* Must die if the interrupt is not recoverable */
|
||||||
if (!(regs->msr & MSR_RI))
|
if (!(regs->msr & MSR_RI))
|
||||||
nmi_panic(regs, "Unrecoverable System Reset");
|
die("Unrecoverable System Reset", regs, SIGABRT);
|
||||||
|
|
||||||
if (!nested)
|
if (!nested)
|
||||||
nmi_exit();
|
nmi_exit();
|
||||||
|
@ -775,7 +775,7 @@ void machine_check_exception(struct pt_regs *regs)
|
||||||
|
|
||||||
/* Must die if the interrupt is not recoverable */
|
/* Must die if the interrupt is not recoverable */
|
||||||
if (!(regs->msr & MSR_RI))
|
if (!(regs->msr & MSR_RI))
|
||||||
nmi_panic(regs, "Unrecoverable Machine check");
|
die("Unrecoverable Machine check", regs, SIGBUS);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
|
|
||||||
#include <linux/kvm_host.h>
|
#include <linux/kvm_host.h>
|
||||||
|
|
||||||
#include <asm/kvm_ppc.h>
|
#include <asm/kvm_ppc.h>
|
||||||
|
@ -47,7 +49,18 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu)
|
||||||
u64 newmsr, bescr;
|
u64 newmsr, bescr;
|
||||||
int ra, rs;
|
int ra, rs;
|
||||||
|
|
||||||
switch (instr & 0xfc0007ff) {
|
/*
|
||||||
|
* rfid, rfebb, and mtmsrd encode bit 31 = 0 since it's a reserved bit
|
||||||
|
* in these instructions, so masking bit 31 out doesn't change these
|
||||||
|
* instructions. For treclaim., tsr., and trechkpt. instructions if bit
|
||||||
|
* 31 = 0 then they are per ISA invalid forms, however P9 UM, in section
|
||||||
|
* 4.6.10 Book II Invalid Forms, informs specifically that ignoring bit
|
||||||
|
* 31 is an acceptable way to handle these invalid forms that have
|
||||||
|
* bit 31 = 0. Moreover, for emulation purposes both forms (w/ and wo/
|
||||||
|
* bit 31 set) can generate a softpatch interrupt. Hence both forms
|
||||||
|
* are handled below for these instructions so they behave the same way.
|
||||||
|
*/
|
||||||
|
switch (instr & PO_XOP_OPCODE_MASK) {
|
||||||
case PPC_INST_RFID:
|
case PPC_INST_RFID:
|
||||||
/* XXX do we need to check for PR=0 here? */
|
/* XXX do we need to check for PR=0 here? */
|
||||||
newmsr = vcpu->arch.shregs.srr1;
|
newmsr = vcpu->arch.shregs.srr1;
|
||||||
|
@ -108,7 +121,8 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu)
|
||||||
vcpu->arch.shregs.msr = newmsr;
|
vcpu->arch.shregs.msr = newmsr;
|
||||||
return RESUME_GUEST;
|
return RESUME_GUEST;
|
||||||
|
|
||||||
case PPC_INST_TSR:
|
/* ignore bit 31, see comment above */
|
||||||
|
case (PPC_INST_TSR & PO_XOP_OPCODE_MASK):
|
||||||
/* check for PR=1 and arch 2.06 bit set in PCR */
|
/* check for PR=1 and arch 2.06 bit set in PCR */
|
||||||
if ((msr & MSR_PR) && (vcpu->arch.vcore->pcr & PCR_ARCH_206)) {
|
if ((msr & MSR_PR) && (vcpu->arch.vcore->pcr & PCR_ARCH_206)) {
|
||||||
/* generate an illegal instruction interrupt */
|
/* generate an illegal instruction interrupt */
|
||||||
|
@ -143,7 +157,8 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu)
|
||||||
vcpu->arch.shregs.msr = msr;
|
vcpu->arch.shregs.msr = msr;
|
||||||
return RESUME_GUEST;
|
return RESUME_GUEST;
|
||||||
|
|
||||||
case PPC_INST_TRECLAIM:
|
/* ignore bit 31, see comment above */
|
||||||
|
case (PPC_INST_TRECLAIM & PO_XOP_OPCODE_MASK):
|
||||||
/* check for TM disabled in the HFSCR or MSR */
|
/* check for TM disabled in the HFSCR or MSR */
|
||||||
if (!(vcpu->arch.hfscr & HFSCR_TM)) {
|
if (!(vcpu->arch.hfscr & HFSCR_TM)) {
|
||||||
/* generate an illegal instruction interrupt */
|
/* generate an illegal instruction interrupt */
|
||||||
|
@ -179,7 +194,8 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu)
|
||||||
vcpu->arch.shregs.msr &= ~MSR_TS_MASK;
|
vcpu->arch.shregs.msr &= ~MSR_TS_MASK;
|
||||||
return RESUME_GUEST;
|
return RESUME_GUEST;
|
||||||
|
|
||||||
case PPC_INST_TRECHKPT:
|
/* ignore bit 31, see comment above */
|
||||||
|
case (PPC_INST_TRECHKPT & PO_XOP_OPCODE_MASK):
|
||||||
/* XXX do we need to check for PR=0 here? */
|
/* XXX do we need to check for PR=0 here? */
|
||||||
/* check for TM disabled in the HFSCR or MSR */
|
/* check for TM disabled in the HFSCR or MSR */
|
||||||
if (!(vcpu->arch.hfscr & HFSCR_TM)) {
|
if (!(vcpu->arch.hfscr & HFSCR_TM)) {
|
||||||
|
@ -211,6 +227,8 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* What should we do here? We didn't recognize the instruction */
|
/* What should we do here? We didn't recognize the instruction */
|
||||||
WARN_ON_ONCE(1);
|
kvmppc_core_queue_program(vcpu, SRR1_PROGILL);
|
||||||
|
pr_warn_ratelimited("Unrecognized TM-related instruction %#x for emulation", instr);
|
||||||
|
|
||||||
return RESUME_GUEST;
|
return RESUME_GUEST;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,18 @@ int kvmhv_p9_tm_emulation_early(struct kvm_vcpu *vcpu)
|
||||||
u64 newmsr, msr, bescr;
|
u64 newmsr, msr, bescr;
|
||||||
int rs;
|
int rs;
|
||||||
|
|
||||||
switch (instr & 0xfc0007ff) {
|
/*
|
||||||
|
* rfid, rfebb, and mtmsrd encode bit 31 = 0 since it's a reserved bit
|
||||||
|
* in these instructions, so masking bit 31 out doesn't change these
|
||||||
|
* instructions. For the tsr. instruction if bit 31 = 0 then it is per
|
||||||
|
* ISA an invalid form, however P9 UM, in section 4.6.10 Book II Invalid
|
||||||
|
* Forms, informs specifically that ignoring bit 31 is an acceptable way
|
||||||
|
* to handle TM-related invalid forms that have bit 31 = 0. Moreover,
|
||||||
|
* for emulation purposes both forms (w/ and wo/ bit 31 set) can
|
||||||
|
* generate a softpatch interrupt. Hence both forms are handled below
|
||||||
|
* for tsr. to make them behave the same way.
|
||||||
|
*/
|
||||||
|
switch (instr & PO_XOP_OPCODE_MASK) {
|
||||||
case PPC_INST_RFID:
|
case PPC_INST_RFID:
|
||||||
/* XXX do we need to check for PR=0 here? */
|
/* XXX do we need to check for PR=0 here? */
|
||||||
newmsr = vcpu->arch.shregs.srr1;
|
newmsr = vcpu->arch.shregs.srr1;
|
||||||
|
@ -76,7 +87,8 @@ int kvmhv_p9_tm_emulation_early(struct kvm_vcpu *vcpu)
|
||||||
vcpu->arch.shregs.msr = newmsr;
|
vcpu->arch.shregs.msr = newmsr;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case PPC_INST_TSR:
|
/* ignore bit 31, see comment above */
|
||||||
|
case (PPC_INST_TSR & PO_XOP_OPCODE_MASK):
|
||||||
/* we know the MSR has the TS field = S (0b01) here */
|
/* we know the MSR has the TS field = S (0b01) here */
|
||||||
msr = vcpu->arch.shregs.msr;
|
msr = vcpu->arch.shregs.msr;
|
||||||
/* check for PR=1 and arch 2.06 bit set in PCR */
|
/* check for PR=1 and arch 2.06 bit set in PCR */
|
||||||
|
|
|
@ -63,4 +63,11 @@ do { \
|
||||||
* Let auipc+jalr be the basic *mcount unit*, so we make it 8 bytes here.
|
* Let auipc+jalr be the basic *mcount unit*, so we make it 8 bytes here.
|
||||||
*/
|
*/
|
||||||
#define MCOUNT_INSN_SIZE 8
|
#define MCOUNT_INSN_SIZE 8
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
struct dyn_ftrace;
|
||||||
|
int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec);
|
||||||
|
#define ftrace_init_nop ftrace_init_nop
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -88,6 +88,25 @@ int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec,
|
||||||
return __ftrace_modify_call(rec->ip, addr, false);
|
return __ftrace_modify_call(rec->ip, addr, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is called early on, and isn't wrapped by
|
||||||
|
* ftrace_arch_code_modify_{prepare,post_process}() and therefor doesn't hold
|
||||||
|
* text_mutex, which triggers a lockdep failure. SMP isn't running so we could
|
||||||
|
* just directly poke the text, but it's simpler to just take the lock
|
||||||
|
* ourselves.
|
||||||
|
*/
|
||||||
|
int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec)
|
||||||
|
{
|
||||||
|
int out;
|
||||||
|
|
||||||
|
ftrace_arch_code_modify_prepare();
|
||||||
|
out = ftrace_make_nop(mod, rec, MCOUNT_ADDR);
|
||||||
|
ftrace_arch_code_modify_post_process();
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
int ftrace_update_ftrace_func(ftrace_func_t func)
|
int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||||
{
|
{
|
||||||
int ret = __ftrace_modify_call((unsigned long)&ftrace_call,
|
int ret = __ftrace_modify_call((unsigned long)&ftrace_call,
|
||||||
|
|
|
@ -1377,8 +1377,8 @@ static int aux_output_begin(struct perf_output_handle *handle,
|
||||||
idx = aux->empty_mark + 1;
|
idx = aux->empty_mark + 1;
|
||||||
for (i = 0; i < range_scan; i++, idx++) {
|
for (i = 0; i < range_scan; i++, idx++) {
|
||||||
te = aux_sdb_trailer(aux, idx);
|
te = aux_sdb_trailer(aux, idx);
|
||||||
te->flags = te->flags & ~SDB_TE_BUFFER_FULL_MASK;
|
te->flags &= ~(SDB_TE_BUFFER_FULL_MASK |
|
||||||
te->flags = te->flags & ~SDB_TE_ALERT_REQ_MASK;
|
SDB_TE_ALERT_REQ_MASK);
|
||||||
te->overflow = 0;
|
te->overflow = 0;
|
||||||
}
|
}
|
||||||
/* Save the position of empty SDBs */
|
/* Save the position of empty SDBs */
|
||||||
|
@ -1425,8 +1425,7 @@ static bool aux_set_alert(struct aux_buffer *aux, unsigned long alert_index,
|
||||||
te = aux_sdb_trailer(aux, alert_index);
|
te = aux_sdb_trailer(aux, alert_index);
|
||||||
do {
|
do {
|
||||||
orig_flags = te->flags;
|
orig_flags = te->flags;
|
||||||
orig_overflow = te->overflow;
|
*overflow = orig_overflow = te->overflow;
|
||||||
*overflow = orig_overflow;
|
|
||||||
if (orig_flags & SDB_TE_BUFFER_FULL_MASK) {
|
if (orig_flags & SDB_TE_BUFFER_FULL_MASK) {
|
||||||
/*
|
/*
|
||||||
* SDB is already set by hardware.
|
* SDB is already set by hardware.
|
||||||
|
@ -1660,7 +1659,7 @@ static void *aux_buffer_setup(struct perf_event *event, void **pages,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate aux_buffer struct for the event */
|
/* Allocate aux_buffer struct for the event */
|
||||||
aux = kmalloc(sizeof(struct aux_buffer), GFP_KERNEL);
|
aux = kzalloc(sizeof(struct aux_buffer), GFP_KERNEL);
|
||||||
if (!aux)
|
if (!aux)
|
||||||
goto no_aux;
|
goto no_aux;
|
||||||
sfb = &aux->sfb;
|
sfb = &aux->sfb;
|
||||||
|
|
|
@ -537,7 +537,7 @@ static struct notifier_block kdump_mem_nb = {
|
||||||
/*
|
/*
|
||||||
* Make sure that the area behind memory_end is protected
|
* Make sure that the area behind memory_end is protected
|
||||||
*/
|
*/
|
||||||
static void reserve_memory_end(void)
|
static void __init reserve_memory_end(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_CRASH_DUMP
|
#ifdef CONFIG_CRASH_DUMP
|
||||||
if (ipl_info.type == IPL_TYPE_FCP_DUMP &&
|
if (ipl_info.type == IPL_TYPE_FCP_DUMP &&
|
||||||
|
@ -555,7 +555,7 @@ static void reserve_memory_end(void)
|
||||||
/*
|
/*
|
||||||
* Make sure that oldmem, where the dump is stored, is protected
|
* Make sure that oldmem, where the dump is stored, is protected
|
||||||
*/
|
*/
|
||||||
static void reserve_oldmem(void)
|
static void __init reserve_oldmem(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_CRASH_DUMP
|
#ifdef CONFIG_CRASH_DUMP
|
||||||
if (OLDMEM_BASE)
|
if (OLDMEM_BASE)
|
||||||
|
@ -567,7 +567,7 @@ static void reserve_oldmem(void)
|
||||||
/*
|
/*
|
||||||
* Make sure that oldmem, where the dump is stored, is protected
|
* Make sure that oldmem, where the dump is stored, is protected
|
||||||
*/
|
*/
|
||||||
static void remove_oldmem(void)
|
static void __init remove_oldmem(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_CRASH_DUMP
|
#ifdef CONFIG_CRASH_DUMP
|
||||||
if (OLDMEM_BASE)
|
if (OLDMEM_BASE)
|
||||||
|
|
|
@ -38,6 +38,8 @@ KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector)
|
||||||
KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
|
KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
|
||||||
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
|
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
|
||||||
KBUILD_CFLAGS += -Wno-pointer-sign
|
KBUILD_CFLAGS += -Wno-pointer-sign
|
||||||
|
# Disable relocation relaxation in case the link is not PIE.
|
||||||
|
KBUILD_CFLAGS += $(call as-option,-Wa$(comma)-mrelax-relocations=no)
|
||||||
|
|
||||||
KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
|
KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
|
||||||
GCOV_PROFILE := n
|
GCOV_PROFILE := n
|
||||||
|
@ -100,7 +102,7 @@ vmlinux-objs-$(CONFIG_EFI_MIXED) += $(obj)/efi_thunk_$(BITS).o
|
||||||
quiet_cmd_check_data_rel = DATAREL $@
|
quiet_cmd_check_data_rel = DATAREL $@
|
||||||
define cmd_check_data_rel
|
define cmd_check_data_rel
|
||||||
for obj in $(filter %.o,$^); do \
|
for obj in $(filter %.o,$^); do \
|
||||||
${CROSS_COMPILE}readelf -S $$obj | grep -qF .rel.local && { \
|
$(READELF) -S $$obj | grep -qF .rel.local && { \
|
||||||
echo "error: $$obj has data relocations!" >&2; \
|
echo "error: $$obj has data relocations!" >&2; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
} || true; \
|
} || true; \
|
||||||
|
|
|
@ -245,6 +245,7 @@ CONFIG_USB_HIDDEV=y
|
||||||
CONFIG_USB=y
|
CONFIG_USB=y
|
||||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||||
CONFIG_USB_MON=y
|
CONFIG_USB_MON=y
|
||||||
|
CONFIG_USB_XHCI_HCD=y
|
||||||
CONFIG_USB_EHCI_HCD=y
|
CONFIG_USB_EHCI_HCD=y
|
||||||
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
||||||
CONFIG_USB_OHCI_HCD=y
|
CONFIG_USB_OHCI_HCD=y
|
||||||
|
|
|
@ -241,6 +241,7 @@ CONFIG_USB_HIDDEV=y
|
||||||
CONFIG_USB=y
|
CONFIG_USB=y
|
||||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||||
CONFIG_USB_MON=y
|
CONFIG_USB_MON=y
|
||||||
|
CONFIG_USB_XHCI_HCD=y
|
||||||
CONFIG_USB_EHCI_HCD=y
|
CONFIG_USB_EHCI_HCD=y
|
||||||
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
||||||
CONFIG_USB_OHCI_HCD=y
|
CONFIG_USB_OHCI_HCD=y
|
||||||
|
|
|
@ -330,7 +330,7 @@ DECLARE_STATIC_KEY_FALSE(mds_idle_clear);
|
||||||
* combination with microcode which triggers a CPU buffer flush when the
|
* combination with microcode which triggers a CPU buffer flush when the
|
||||||
* instruction is executed.
|
* instruction is executed.
|
||||||
*/
|
*/
|
||||||
static inline void mds_clear_cpu_buffers(void)
|
static __always_inline void mds_clear_cpu_buffers(void)
|
||||||
{
|
{
|
||||||
static const u16 ds = __KERNEL_DS;
|
static const u16 ds = __KERNEL_DS;
|
||||||
|
|
||||||
|
@ -351,7 +351,7 @@ static inline void mds_clear_cpu_buffers(void)
|
||||||
*
|
*
|
||||||
* Clear CPU buffers if the corresponding static key is enabled
|
* Clear CPU buffers if the corresponding static key is enabled
|
||||||
*/
|
*/
|
||||||
static inline void mds_user_clear_cpu_buffers(void)
|
static __always_inline void mds_user_clear_cpu_buffers(void)
|
||||||
{
|
{
|
||||||
if (static_branch_likely(&mds_user_clear))
|
if (static_branch_likely(&mds_user_clear))
|
||||||
mds_clear_cpu_buffers();
|
mds_clear_cpu_buffers();
|
||||||
|
|
|
@ -4,6 +4,11 @@
|
||||||
|
|
||||||
#define ARCH_DEFAULT_PKEY 0
|
#define ARCH_DEFAULT_PKEY 0
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If more than 16 keys are ever supported, a thorough audit
|
||||||
|
* will be necessary to ensure that the types that store key
|
||||||
|
* numbers and masks have sufficient capacity.
|
||||||
|
*/
|
||||||
#define arch_max_pkey() (boot_cpu_has(X86_FEATURE_OSPKE) ? 16 : 1)
|
#define arch_max_pkey() (boot_cpu_has(X86_FEATURE_OSPKE) ? 16 : 1)
|
||||||
|
|
||||||
extern int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
|
extern int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
|
||||||
|
|
|
@ -2250,6 +2250,7 @@ static inline void __init check_timer(void)
|
||||||
legacy_pic->init(0);
|
legacy_pic->init(0);
|
||||||
legacy_pic->make_irq(0);
|
legacy_pic->make_irq(0);
|
||||||
apic_write(APIC_LVT0, APIC_DM_EXTINT);
|
apic_write(APIC_LVT0, APIC_DM_EXTINT);
|
||||||
|
legacy_pic->unmask(0);
|
||||||
|
|
||||||
unlock_ExtINT_logic();
|
unlock_ExtINT_logic();
|
||||||
|
|
||||||
|
|
|
@ -907,8 +907,6 @@ const void *get_xsave_field_ptr(int xsave_state)
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_HAS_PKEYS
|
#ifdef CONFIG_ARCH_HAS_PKEYS
|
||||||
|
|
||||||
#define NR_VALID_PKRU_BITS (CONFIG_NR_PROTECTION_KEYS * 2)
|
|
||||||
#define PKRU_VALID_MASK (NR_VALID_PKRU_BITS - 1)
|
|
||||||
/*
|
/*
|
||||||
* This will go out and modify PKRU register to set the access
|
* This will go out and modify PKRU register to set the access
|
||||||
* rights for @pkey to @init_val.
|
* rights for @pkey to @init_val.
|
||||||
|
@ -927,6 +925,13 @@ int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
|
||||||
if (!boot_cpu_has(X86_FEATURE_OSPKE))
|
if (!boot_cpu_has(X86_FEATURE_OSPKE))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This code should only be called with valid 'pkey'
|
||||||
|
* values originating from in-kernel users. Complain
|
||||||
|
* if a bad value is observed.
|
||||||
|
*/
|
||||||
|
WARN_ON_ONCE(pkey >= arch_max_pkey());
|
||||||
|
|
||||||
/* Set the bits we need in PKRU: */
|
/* Set the bits we need in PKRU: */
|
||||||
if (init_val & PKEY_DISABLE_ACCESS)
|
if (init_val & PKEY_DISABLE_ACCESS)
|
||||||
new_pkru_bits |= PKRU_AD_BIT;
|
new_pkru_bits |= PKRU_AD_BIT;
|
||||||
|
|
|
@ -339,7 +339,7 @@ TRACE_EVENT(
|
||||||
/* These depend on page entry type, so compute them now. */
|
/* These depend on page entry type, so compute them now. */
|
||||||
__field(bool, r)
|
__field(bool, r)
|
||||||
__field(bool, x)
|
__field(bool, x)
|
||||||
__field(u8, u)
|
__field(signed char, u)
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
|
|
|
@ -3942,6 +3942,12 @@ static int iret_interception(struct vcpu_svm *svm)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int invd_interception(struct vcpu_svm *svm)
|
||||||
|
{
|
||||||
|
/* Treat an INVD instruction as a NOP and just skip it. */
|
||||||
|
return kvm_skip_emulated_instruction(&svm->vcpu);
|
||||||
|
}
|
||||||
|
|
||||||
static int invlpg_interception(struct vcpu_svm *svm)
|
static int invlpg_interception(struct vcpu_svm *svm)
|
||||||
{
|
{
|
||||||
if (!static_cpu_has(X86_FEATURE_DECODEASSISTS))
|
if (!static_cpu_has(X86_FEATURE_DECODEASSISTS))
|
||||||
|
@ -4831,7 +4837,7 @@ static int (*const svm_exit_handlers[])(struct vcpu_svm *svm) = {
|
||||||
[SVM_EXIT_RDPMC] = rdpmc_interception,
|
[SVM_EXIT_RDPMC] = rdpmc_interception,
|
||||||
[SVM_EXIT_CPUID] = cpuid_interception,
|
[SVM_EXIT_CPUID] = cpuid_interception,
|
||||||
[SVM_EXIT_IRET] = iret_interception,
|
[SVM_EXIT_IRET] = iret_interception,
|
||||||
[SVM_EXIT_INVD] = emulate_on_interception,
|
[SVM_EXIT_INVD] = invd_interception,
|
||||||
[SVM_EXIT_PAUSE] = pause_interception,
|
[SVM_EXIT_PAUSE] = pause_interception,
|
||||||
[SVM_EXIT_HLT] = halt_interception,
|
[SVM_EXIT_HLT] = halt_interception,
|
||||||
[SVM_EXIT_INVLPG] = invlpg_interception,
|
[SVM_EXIT_INVLPG] = invlpg_interception,
|
||||||
|
|
|
@ -858,6 +858,7 @@ int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||||
unsigned long old_cr4 = kvm_read_cr4(vcpu);
|
unsigned long old_cr4 = kvm_read_cr4(vcpu);
|
||||||
unsigned long pdptr_bits = X86_CR4_PGE | X86_CR4_PSE | X86_CR4_PAE |
|
unsigned long pdptr_bits = X86_CR4_PGE | X86_CR4_PSE | X86_CR4_PAE |
|
||||||
X86_CR4_SMEP;
|
X86_CR4_SMEP;
|
||||||
|
unsigned long mmu_role_bits = pdptr_bits | X86_CR4_SMAP | X86_CR4_PKE;
|
||||||
|
|
||||||
if (kvm_valid_cr4(vcpu, cr4))
|
if (kvm_valid_cr4(vcpu, cr4))
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -885,7 +886,7 @@ int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||||
if (kvm_x86_ops->set_cr4(vcpu, cr4))
|
if (kvm_x86_ops->set_cr4(vcpu, cr4))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (((cr4 ^ old_cr4) & pdptr_bits) ||
|
if (((cr4 ^ old_cr4) & mmu_role_bits) ||
|
||||||
(!(cr4 & X86_CR4_PCIDE) && (old_cr4 & X86_CR4_PCIDE)))
|
(!(cr4 & X86_CR4_PCIDE) && (old_cr4 & X86_CR4_PCIDE)))
|
||||||
kvm_mmu_reset_context(vcpu);
|
kvm_mmu_reset_context(vcpu);
|
||||||
|
|
||||||
|
@ -4668,10 +4669,13 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
||||||
r = -EFAULT;
|
r = -EFAULT;
|
||||||
if (copy_from_user(&u.ps, argp, sizeof u.ps))
|
if (copy_from_user(&u.ps, argp, sizeof u.ps))
|
||||||
goto out;
|
goto out;
|
||||||
|
mutex_lock(&kvm->lock);
|
||||||
r = -ENXIO;
|
r = -ENXIO;
|
||||||
if (!kvm->arch.vpit)
|
if (!kvm->arch.vpit)
|
||||||
goto out;
|
goto set_pit_out;
|
||||||
r = kvm_vm_ioctl_set_pit(kvm, &u.ps);
|
r = kvm_vm_ioctl_set_pit(kvm, &u.ps);
|
||||||
|
set_pit_out:
|
||||||
|
mutex_unlock(&kvm->lock);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case KVM_GET_PIT2: {
|
case KVM_GET_PIT2: {
|
||||||
|
@ -4691,10 +4695,13 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
||||||
r = -EFAULT;
|
r = -EFAULT;
|
||||||
if (copy_from_user(&u.ps2, argp, sizeof(u.ps2)))
|
if (copy_from_user(&u.ps2, argp, sizeof(u.ps2)))
|
||||||
goto out;
|
goto out;
|
||||||
|
mutex_lock(&kvm->lock);
|
||||||
r = -ENXIO;
|
r = -ENXIO;
|
||||||
if (!kvm->arch.vpit)
|
if (!kvm->arch.vpit)
|
||||||
goto out;
|
goto set_pit2_out;
|
||||||
r = kvm_vm_ioctl_set_pit2(kvm, &u.ps2);
|
r = kvm_vm_ioctl_set_pit2(kvm, &u.ps2);
|
||||||
|
set_pit2_out:
|
||||||
|
mutex_unlock(&kvm->lock);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case KVM_REINJECT_CONTROL: {
|
case KVM_REINJECT_CONTROL: {
|
||||||
|
|
|
@ -139,7 +139,7 @@ long __copy_user_flushcache(void *dst, const void __user *src, unsigned size)
|
||||||
*/
|
*/
|
||||||
if (size < 8) {
|
if (size < 8) {
|
||||||
if (!IS_ALIGNED(dest, 4) || size != 4)
|
if (!IS_ALIGNED(dest, 4) || size != 4)
|
||||||
clean_cache_range(dst, 1);
|
clean_cache_range(dst, size);
|
||||||
} else {
|
} else {
|
||||||
if (!IS_ALIGNED(dest, 8)) {
|
if (!IS_ALIGNED(dest, 8)) {
|
||||||
dest = ALIGN(dest, boot_cpu_data.x86_clflush_size);
|
dest = ALIGN(dest, boot_cpu_data.x86_clflush_size);
|
||||||
|
|
|
@ -2,7 +2,7 @@ ARCH=arm64
|
||||||
|
|
||||||
CLANG_TRIPLE=aarch64-linux-gnu-
|
CLANG_TRIPLE=aarch64-linux-gnu-
|
||||||
CROSS_COMPILE=aarch64-linux-androidkernel-
|
CROSS_COMPILE=aarch64-linux-androidkernel-
|
||||||
CROSS_COMPILE_COMPAT=arm-linux-androideabi-
|
CROSS_COMPILE_COMPAT=arm-linux-androidkernel-
|
||||||
LINUX_GCC_CROSS_COMPILE_PREBUILTS_BIN=prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
|
LINUX_GCC_CROSS_COMPILE_PREBUILTS_BIN=prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
|
||||||
LINUX_GCC_CROSS_COMPILE_COMPAT_PREBUILTS_BIN=prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/
|
LINUX_GCC_CROSS_COMPILE_COMPAT_PREBUILTS_BIN=prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.aarch64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.aarch64
|
||||||
. ${ROOT_DIR}/common/build.config.allmodconfig
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.allmodconfig
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.arm
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.arm
|
||||||
. ${ROOT_DIR}/common/build.config.allmodconfig
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.allmodconfig
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.x86_64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.x86_64
|
||||||
. ${ROOT_DIR}/common/build.config.allmodconfig
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.allmodconfig
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,7 @@
|
||||||
BRANCH=android-4.19-stable
|
BRANCH=android-4.19-stable
|
||||||
KMI_GENERATION=0
|
KMI_GENERATION=0
|
||||||
KERNEL_DIR=common
|
|
||||||
|
|
||||||
CC=clang
|
LLVM=1
|
||||||
LD=ld.lld
|
|
||||||
NM=llvm-nm
|
|
||||||
OBJCOPY=llvm-objcopy
|
|
||||||
DEPMOD=depmod
|
DEPMOD=depmod
|
||||||
CLANG_PREBUILT_BIN=prebuilts-master/clang/host/linux-x86/clang-r383902/bin
|
CLANG_PREBUILT_BIN=prebuilts-master/clang/host/linux-x86/clang-r383902/bin
|
||||||
BUILDTOOLS_PREBUILT_BIN=build/build-tools/path/linux-x86
|
BUILDTOOLS_PREBUILT_BIN=build/build-tools/path/linux-x86
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
. ${ROOT_DIR}/common/build.config.gki.aarch64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki.aarch64
|
||||||
TRIM_NONLISTED_KMI=""
|
TRIM_NONLISTED_KMI=""
|
||||||
KMI_SYMBOL_LIST_STRICT_MODE=""
|
KMI_SYMBOL_LIST_STRICT_MODE=""
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
. ${ROOT_DIR}/common/build.config.gki.x86_64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki.x86_64
|
||||||
TRIM_NONLISTED_KMI=""
|
TRIM_NONLISTED_KMI=""
|
||||||
KMI_SYMBOL_LIST_STRICT_MODE=""
|
KMI_SYMBOL_LIST_STRICT_MODE=""
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.aarch64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.aarch64
|
||||||
. ${ROOT_DIR}/common/build.config.gki
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki
|
||||||
|
|
||||||
ABI_DEFINITION=android/abi_gki_aarch64.xml
|
ABI_DEFINITION=android/abi_gki_aarch64.xml
|
||||||
KMI_SYMBOL_LIST=android/abi_gki_aarch64
|
KMI_SYMBOL_LIST=android/abi_gki_aarch64
|
||||||
|
@ -9,5 +9,6 @@ android/abi_gki_aarch64_cuttlefish
|
||||||
android/abi_gki_aarch64_qcom
|
android/abi_gki_aarch64_qcom
|
||||||
"
|
"
|
||||||
TRIM_NONLISTED_KMI=1
|
TRIM_NONLISTED_KMI=1
|
||||||
|
KMI_SYMBOL_LIST_ADD_ONLY=1
|
||||||
KMI_SYMBOL_LIST_STRICT_MODE=1
|
KMI_SYMBOL_LIST_STRICT_MODE=1
|
||||||
KMI_ENFORCED=1
|
KMI_ENFORCED=1
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.x86_64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.x86_64
|
||||||
. ${ROOT_DIR}/common/build.config.gki
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
DEFCONFIG=gki_defconfig
|
DEFCONFIG=gki_defconfig
|
||||||
POST_DEFCONFIG_CMDS="check_defconfig && update_kasan_config"
|
POST_DEFCONFIG_CMDS="check_defconfig && update_kasan_config"
|
||||||
KERNEL_DIR=common
|
|
||||||
function update_kasan_config() {
|
function update_kasan_config() {
|
||||||
${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
|
${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
|
||||||
-e CONFIG_KASAN \
|
-e CONFIG_KASAN \
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.aarch64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.aarch64
|
||||||
. ${ROOT_DIR}/common/build.config.gki_kasan
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki_kasan
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.x86_64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.x86_64
|
||||||
. ${ROOT_DIR}/common/build.config.gki_kasan
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki_kasan
|
||||||
|
|
||||||
|
|
|
@ -1080,29 +1080,21 @@ void acpi_ec_dispatch_gpe(void)
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
Event Management
|
Event Management
|
||||||
-------------------------------------------------------------------------- */
|
-------------------------------------------------------------------------- */
|
||||||
static struct acpi_ec_query_handler *
|
|
||||||
acpi_ec_get_query_handler(struct acpi_ec_query_handler *handler)
|
|
||||||
{
|
|
||||||
if (handler)
|
|
||||||
kref_get(&handler->kref);
|
|
||||||
return handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct acpi_ec_query_handler *
|
static struct acpi_ec_query_handler *
|
||||||
acpi_ec_get_query_handler_by_value(struct acpi_ec *ec, u8 value)
|
acpi_ec_get_query_handler_by_value(struct acpi_ec *ec, u8 value)
|
||||||
{
|
{
|
||||||
struct acpi_ec_query_handler *handler;
|
struct acpi_ec_query_handler *handler;
|
||||||
bool found = false;
|
|
||||||
|
|
||||||
mutex_lock(&ec->mutex);
|
mutex_lock(&ec->mutex);
|
||||||
list_for_each_entry(handler, &ec->list, node) {
|
list_for_each_entry(handler, &ec->list, node) {
|
||||||
if (value == handler->query_bit) {
|
if (value == handler->query_bit) {
|
||||||
found = true;
|
kref_get(&handler->kref);
|
||||||
break;
|
mutex_unlock(&ec->mutex);
|
||||||
|
return handler;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mutex_unlock(&ec->mutex);
|
mutex_unlock(&ec->mutex);
|
||||||
return found ? acpi_ec_get_query_handler(handler) : NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void acpi_ec_query_handler_release(struct kref *kref)
|
static void acpi_ec_query_handler_release(struct kref *kref)
|
||||||
|
|
|
@ -72,7 +72,7 @@ struct acard_sg {
|
||||||
__le32 size; /* bit 31 (EOT) max==0x10000 (64k) */
|
__le32 size; /* bit 31 (EOT) max==0x10000 (64k) */
|
||||||
};
|
};
|
||||||
|
|
||||||
static void acard_ahci_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors acard_ahci_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static bool acard_ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
|
static bool acard_ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
|
||||||
static int acard_ahci_port_start(struct ata_port *ap);
|
static int acard_ahci_port_start(struct ata_port *ap);
|
||||||
static int acard_ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
static int acard_ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
||||||
|
@ -257,7 +257,7 @@ static unsigned int acard_ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl)
|
||||||
return si;
|
return si;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void acard_ahci_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors acard_ahci_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct ahci_port_priv *pp = ap->private_data;
|
struct ahci_port_priv *pp = ap->private_data;
|
||||||
|
@ -295,6 +295,8 @@ static void acard_ahci_qc_prep(struct ata_queued_cmd *qc)
|
||||||
opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH;
|
opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH;
|
||||||
|
|
||||||
ahci_fill_cmd_slot(pp, qc->hw_tag, opts);
|
ahci_fill_cmd_slot(pp, qc->hw_tag, opts);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool acard_ahci_qc_fill_rtf(struct ata_queued_cmd *qc)
|
static bool acard_ahci_qc_fill_rtf(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -73,7 +73,7 @@ static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
||||||
static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
|
static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
|
||||||
static int ahci_port_start(struct ata_port *ap);
|
static int ahci_port_start(struct ata_port *ap);
|
||||||
static void ahci_port_stop(struct ata_port *ap);
|
static void ahci_port_stop(struct ata_port *ap);
|
||||||
static void ahci_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors ahci_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static int ahci_pmp_qc_defer(struct ata_queued_cmd *qc);
|
static int ahci_pmp_qc_defer(struct ata_queued_cmd *qc);
|
||||||
static void ahci_freeze(struct ata_port *ap);
|
static void ahci_freeze(struct ata_port *ap);
|
||||||
static void ahci_thaw(struct ata_port *ap);
|
static void ahci_thaw(struct ata_port *ap);
|
||||||
|
@ -1640,7 +1640,7 @@ static int ahci_pmp_qc_defer(struct ata_queued_cmd *qc)
|
||||||
return sata_pmp_qc_defer_cmd_switch(qc);
|
return sata_pmp_qc_defer_cmd_switch(qc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ahci_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors ahci_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct ahci_port_priv *pp = ap->private_data;
|
struct ahci_port_priv *pp = ap->private_data;
|
||||||
|
@ -1676,6 +1676,8 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc)
|
||||||
opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH;
|
opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH;
|
||||||
|
|
||||||
ahci_fill_cmd_slot(pp, qc->hw_tag, opts);
|
ahci_fill_cmd_slot(pp, qc->hw_tag, opts);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ahci_fbs_dec_intr(struct ata_port *ap)
|
static void ahci_fbs_dec_intr(struct ata_port *ap)
|
||||||
|
|
|
@ -4996,7 +4996,10 @@ int ata_std_qc_defer(struct ata_queued_cmd *qc)
|
||||||
return ATA_DEFER_LINK;
|
return ATA_DEFER_LINK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ata_noop_qc_prep(struct ata_queued_cmd *qc) { }
|
enum ata_completion_errors ata_noop_qc_prep(struct ata_queued_cmd *qc)
|
||||||
|
{
|
||||||
|
return AC_ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ata_sg_init - Associate command with scatter-gather table.
|
* ata_sg_init - Associate command with scatter-gather table.
|
||||||
|
@ -5483,7 +5486,9 @@ void ata_qc_issue(struct ata_queued_cmd *qc)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ap->ops->qc_prep(qc);
|
qc->err_mask |= ap->ops->qc_prep(qc);
|
||||||
|
if (unlikely(qc->err_mask))
|
||||||
|
goto err;
|
||||||
trace_ata_qc_issue(qc);
|
trace_ata_qc_issue(qc);
|
||||||
qc->err_mask |= ap->ops->qc_issue(qc);
|
qc->err_mask |= ap->ops->qc_issue(qc);
|
||||||
if (unlikely(qc->err_mask))
|
if (unlikely(qc->err_mask))
|
||||||
|
|
|
@ -2695,12 +2695,14 @@ static void ata_bmdma_fill_sg_dumb(struct ata_queued_cmd *qc)
|
||||||
* LOCKING:
|
* LOCKING:
|
||||||
* spin_lock_irqsave(host lock)
|
* spin_lock_irqsave(host lock)
|
||||||
*/
|
*/
|
||||||
void ata_bmdma_qc_prep(struct ata_queued_cmd *qc)
|
enum ata_completion_errors ata_bmdma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
ata_bmdma_fill_sg(qc);
|
ata_bmdma_fill_sg(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ata_bmdma_qc_prep);
|
EXPORT_SYMBOL_GPL(ata_bmdma_qc_prep);
|
||||||
|
|
||||||
|
@ -2713,12 +2715,14 @@ EXPORT_SYMBOL_GPL(ata_bmdma_qc_prep);
|
||||||
* LOCKING:
|
* LOCKING:
|
||||||
* spin_lock_irqsave(host lock)
|
* spin_lock_irqsave(host lock)
|
||||||
*/
|
*/
|
||||||
void ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc)
|
enum ata_completion_errors ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
ata_bmdma_fill_sg_dumb(qc);
|
ata_bmdma_fill_sg_dumb(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ata_bmdma_dumb_qc_prep);
|
EXPORT_SYMBOL_GPL(ata_bmdma_dumb_qc_prep);
|
||||||
|
|
||||||
|
|
|
@ -507,7 +507,7 @@ static int pata_macio_cable_detect(struct ata_port *ap)
|
||||||
return ATA_CBL_PATA40;
|
return ATA_CBL_PATA40;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pata_macio_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors pata_macio_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
unsigned int write = (qc->tf.flags & ATA_TFLAG_WRITE);
|
unsigned int write = (qc->tf.flags & ATA_TFLAG_WRITE);
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
|
@ -520,7 +520,7 @@ static void pata_macio_qc_prep(struct ata_queued_cmd *qc)
|
||||||
__func__, qc, qc->flags, write, qc->dev->devno);
|
__func__, qc, qc->flags, write, qc->dev->devno);
|
||||||
|
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
table = (struct dbdma_cmd *) priv->dma_table_cpu;
|
table = (struct dbdma_cmd *) priv->dma_table_cpu;
|
||||||
|
|
||||||
|
@ -565,6 +565,8 @@ static void pata_macio_qc_prep(struct ata_queued_cmd *qc)
|
||||||
table->command = cpu_to_le16(DBDMA_STOP);
|
table->command = cpu_to_le16(DBDMA_STOP);
|
||||||
|
|
||||||
dev_dbgdma(priv->dev, "%s: %d DMA list entries\n", __func__, pi);
|
dev_dbgdma(priv->dev, "%s: %d DMA list entries\n", __func__, pi);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -58,25 +58,27 @@ static void pxa_ata_dma_irq(void *d)
|
||||||
/*
|
/*
|
||||||
* Prepare taskfile for submission.
|
* Prepare taskfile for submission.
|
||||||
*/
|
*/
|
||||||
static void pxa_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors pxa_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct pata_pxa_data *pd = qc->ap->private_data;
|
struct pata_pxa_data *pd = qc->ap->private_data;
|
||||||
struct dma_async_tx_descriptor *tx;
|
struct dma_async_tx_descriptor *tx;
|
||||||
enum dma_transfer_direction dir;
|
enum dma_transfer_direction dir;
|
||||||
|
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
dir = (qc->dma_dir == DMA_TO_DEVICE ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM);
|
dir = (qc->dma_dir == DMA_TO_DEVICE ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM);
|
||||||
tx = dmaengine_prep_slave_sg(pd->dma_chan, qc->sg, qc->n_elem, dir,
|
tx = dmaengine_prep_slave_sg(pd->dma_chan, qc->sg, qc->n_elem, dir,
|
||||||
DMA_PREP_INTERRUPT);
|
DMA_PREP_INTERRUPT);
|
||||||
if (!tx) {
|
if (!tx) {
|
||||||
ata_dev_err(qc->dev, "prep_slave_sg() failed\n");
|
ata_dev_err(qc->dev, "prep_slave_sg() failed\n");
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
tx->callback = pxa_ata_dma_irq;
|
tx->callback = pxa_ata_dma_irq;
|
||||||
tx->callback_param = pd;
|
tx->callback_param = pd;
|
||||||
pd->dma_cookie = dmaengine_submit(tx);
|
pd->dma_cookie = dmaengine_submit(tx);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -132,7 +132,7 @@ static int adma_ata_init_one(struct pci_dev *pdev,
|
||||||
const struct pci_device_id *ent);
|
const struct pci_device_id *ent);
|
||||||
static int adma_port_start(struct ata_port *ap);
|
static int adma_port_start(struct ata_port *ap);
|
||||||
static void adma_port_stop(struct ata_port *ap);
|
static void adma_port_stop(struct ata_port *ap);
|
||||||
static void adma_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors adma_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static unsigned int adma_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int adma_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static int adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
static int adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
||||||
static void adma_freeze(struct ata_port *ap);
|
static void adma_freeze(struct ata_port *ap);
|
||||||
|
@ -311,7 +311,7 @@ static int adma_fill_sg(struct ata_queued_cmd *qc)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void adma_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors adma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct adma_port_priv *pp = qc->ap->private_data;
|
struct adma_port_priv *pp = qc->ap->private_data;
|
||||||
u8 *buf = pp->pkt;
|
u8 *buf = pp->pkt;
|
||||||
|
@ -322,7 +322,7 @@ static void adma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
adma_enter_reg_mode(qc->ap);
|
adma_enter_reg_mode(qc->ap);
|
||||||
if (qc->tf.protocol != ATA_PROT_DMA)
|
if (qc->tf.protocol != ATA_PROT_DMA)
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
buf[i++] = 0; /* Response flags */
|
buf[i++] = 0; /* Response flags */
|
||||||
buf[i++] = 0; /* reserved */
|
buf[i++] = 0; /* reserved */
|
||||||
|
@ -387,6 +387,7 @@ static void adma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
printk("%s\n", obuf);
|
printk("%s\n", obuf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void adma_packet_start(struct ata_queued_cmd *qc)
|
static inline void adma_packet_start(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -507,7 +507,7 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc,
|
||||||
return num_prde;
|
return num_prde;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sata_fsl_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors sata_fsl_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct sata_fsl_port_priv *pp = ap->private_data;
|
struct sata_fsl_port_priv *pp = ap->private_data;
|
||||||
|
@ -553,6 +553,8 @@ static void sata_fsl_qc_prep(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
VPRINTK("SATA FSL : xx_qc_prep, di = 0x%x, ttl = %d, num_prde = %d\n",
|
VPRINTK("SATA FSL : xx_qc_prep, di = 0x%x, ttl = %d, num_prde = %d\n",
|
||||||
desc_info, ttl_dwords, num_prde);
|
desc_info, ttl_dwords, num_prde);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int sata_fsl_qc_issue(struct ata_queued_cmd *qc)
|
static unsigned int sata_fsl_qc_issue(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -472,7 +472,7 @@ static void inic_fill_sg(struct inic_prd *prd, struct ata_queued_cmd *qc)
|
||||||
prd[-1].flags |= PRD_END;
|
prd[-1].flags |= PRD_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void inic_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors inic_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct inic_port_priv *pp = qc->ap->private_data;
|
struct inic_port_priv *pp = qc->ap->private_data;
|
||||||
struct inic_pkt *pkt = pp->pkt;
|
struct inic_pkt *pkt = pp->pkt;
|
||||||
|
@ -532,6 +532,8 @@ static void inic_qc_prep(struct ata_queued_cmd *qc)
|
||||||
inic_fill_sg(prd, qc);
|
inic_fill_sg(prd, qc);
|
||||||
|
|
||||||
pp->cpb_tbl[0] = pp->pkt_dma;
|
pp->cpb_tbl[0] = pp->pkt_dma;
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int inic_qc_issue(struct ata_queued_cmd *qc)
|
static unsigned int inic_qc_issue(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -605,8 +605,8 @@ static int mv5_scr_write(struct ata_link *link, unsigned int sc_reg_in, u32 val)
|
||||||
static int mv_port_start(struct ata_port *ap);
|
static int mv_port_start(struct ata_port *ap);
|
||||||
static void mv_port_stop(struct ata_port *ap);
|
static void mv_port_stop(struct ata_port *ap);
|
||||||
static int mv_qc_defer(struct ata_queued_cmd *qc);
|
static int mv_qc_defer(struct ata_queued_cmd *qc);
|
||||||
static void mv_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors mv_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static void mv_qc_prep_iie(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors mv_qc_prep_iie(struct ata_queued_cmd *qc);
|
||||||
static unsigned int mv_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int mv_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static int mv_hardreset(struct ata_link *link, unsigned int *class,
|
static int mv_hardreset(struct ata_link *link, unsigned int *class,
|
||||||
unsigned long deadline);
|
unsigned long deadline);
|
||||||
|
@ -2044,7 +2044,7 @@ static void mv_rw_multi_errata_sata24(struct ata_queued_cmd *qc)
|
||||||
* LOCKING:
|
* LOCKING:
|
||||||
* Inherited from caller.
|
* Inherited from caller.
|
||||||
*/
|
*/
|
||||||
static void mv_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors mv_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct mv_port_priv *pp = ap->private_data;
|
struct mv_port_priv *pp = ap->private_data;
|
||||||
|
@ -2056,15 +2056,15 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
||||||
switch (tf->protocol) {
|
switch (tf->protocol) {
|
||||||
case ATA_PROT_DMA:
|
case ATA_PROT_DMA:
|
||||||
if (tf->command == ATA_CMD_DSM)
|
if (tf->command == ATA_CMD_DSM)
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
/* fall-thru */
|
/* fall-thru */
|
||||||
case ATA_PROT_NCQ:
|
case ATA_PROT_NCQ:
|
||||||
break; /* continue below */
|
break; /* continue below */
|
||||||
case ATA_PROT_PIO:
|
case ATA_PROT_PIO:
|
||||||
mv_rw_multi_errata_sata24(qc);
|
mv_rw_multi_errata_sata24(qc);
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
default:
|
default:
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fill in command request block
|
/* Fill in command request block
|
||||||
|
@ -2111,12 +2111,10 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
||||||
* non-NCQ mode are: [RW] STREAM DMA and W DMA FUA EXT, none
|
* non-NCQ mode are: [RW] STREAM DMA and W DMA FUA EXT, none
|
||||||
* of which are defined/used by Linux. If we get here, this
|
* of which are defined/used by Linux. If we get here, this
|
||||||
* driver needs work.
|
* driver needs work.
|
||||||
*
|
|
||||||
* FIXME: modify libata to give qc_prep a return value and
|
|
||||||
* return error here.
|
|
||||||
*/
|
*/
|
||||||
BUG_ON(tf->command);
|
ata_port_err(ap, "%s: unsupported command: %.2x\n", __func__,
|
||||||
break;
|
tf->command);
|
||||||
|
return AC_ERR_INVALID;
|
||||||
}
|
}
|
||||||
mv_crqb_pack_cmd(cw++, tf->nsect, ATA_REG_NSECT, 0);
|
mv_crqb_pack_cmd(cw++, tf->nsect, ATA_REG_NSECT, 0);
|
||||||
mv_crqb_pack_cmd(cw++, tf->hob_lbal, ATA_REG_LBAL, 0);
|
mv_crqb_pack_cmd(cw++, tf->hob_lbal, ATA_REG_LBAL, 0);
|
||||||
|
@ -2129,8 +2127,10 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
||||||
mv_crqb_pack_cmd(cw++, tf->command, ATA_REG_CMD, 1); /* last */
|
mv_crqb_pack_cmd(cw++, tf->command, ATA_REG_CMD, 1); /* last */
|
||||||
|
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
mv_fill_sg(qc);
|
mv_fill_sg(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2145,7 +2145,7 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
||||||
* LOCKING:
|
* LOCKING:
|
||||||
* Inherited from caller.
|
* Inherited from caller.
|
||||||
*/
|
*/
|
||||||
static void mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct mv_port_priv *pp = ap->private_data;
|
struct mv_port_priv *pp = ap->private_data;
|
||||||
|
@ -2156,9 +2156,9 @@ static void mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
if ((tf->protocol != ATA_PROT_DMA) &&
|
if ((tf->protocol != ATA_PROT_DMA) &&
|
||||||
(tf->protocol != ATA_PROT_NCQ))
|
(tf->protocol != ATA_PROT_NCQ))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
if (tf->command == ATA_CMD_DSM)
|
if (tf->command == ATA_CMD_DSM)
|
||||||
return; /* use bmdma for this */
|
return AC_ERR_OK; /* use bmdma for this */
|
||||||
|
|
||||||
/* Fill in Gen IIE command request block */
|
/* Fill in Gen IIE command request block */
|
||||||
if (!(tf->flags & ATA_TFLAG_WRITE))
|
if (!(tf->flags & ATA_TFLAG_WRITE))
|
||||||
|
@ -2199,8 +2199,10 @@ static void mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
mv_fill_sg(qc);
|
mv_fill_sg(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -313,7 +313,7 @@ static void nv_ck804_freeze(struct ata_port *ap);
|
||||||
static void nv_ck804_thaw(struct ata_port *ap);
|
static void nv_ck804_thaw(struct ata_port *ap);
|
||||||
static int nv_adma_slave_config(struct scsi_device *sdev);
|
static int nv_adma_slave_config(struct scsi_device *sdev);
|
||||||
static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
||||||
static void nv_adma_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors nv_adma_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance);
|
static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance);
|
||||||
static void nv_adma_irq_clear(struct ata_port *ap);
|
static void nv_adma_irq_clear(struct ata_port *ap);
|
||||||
|
@ -335,7 +335,7 @@ static void nv_mcp55_freeze(struct ata_port *ap);
|
||||||
static void nv_swncq_error_handler(struct ata_port *ap);
|
static void nv_swncq_error_handler(struct ata_port *ap);
|
||||||
static int nv_swncq_slave_config(struct scsi_device *sdev);
|
static int nv_swncq_slave_config(struct scsi_device *sdev);
|
||||||
static int nv_swncq_port_start(struct ata_port *ap);
|
static int nv_swncq_port_start(struct ata_port *ap);
|
||||||
static void nv_swncq_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors nv_swncq_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc);
|
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc);
|
||||||
static unsigned int nv_swncq_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int nv_swncq_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static void nv_swncq_irq_clear(struct ata_port *ap, u16 fis);
|
static void nv_swncq_irq_clear(struct ata_port *ap, u16 fis);
|
||||||
|
@ -1365,7 +1365,7 @@ static int nv_adma_use_reg_mode(struct ata_queued_cmd *qc)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct nv_adma_port_priv *pp = qc->ap->private_data;
|
struct nv_adma_port_priv *pp = qc->ap->private_data;
|
||||||
struct nv_adma_cpb *cpb = &pp->cpb[qc->hw_tag];
|
struct nv_adma_cpb *cpb = &pp->cpb[qc->hw_tag];
|
||||||
|
@ -1377,7 +1377,7 @@ static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
(qc->flags & ATA_QCFLAG_DMAMAP));
|
(qc->flags & ATA_QCFLAG_DMAMAP));
|
||||||
nv_adma_register_mode(qc->ap);
|
nv_adma_register_mode(qc->ap);
|
||||||
ata_bmdma_qc_prep(qc);
|
ata_bmdma_qc_prep(qc);
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpb->resp_flags = NV_CPB_RESP_DONE;
|
cpb->resp_flags = NV_CPB_RESP_DONE;
|
||||||
|
@ -1409,6 +1409,8 @@ static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
cpb->ctl_flags = ctl_flags;
|
cpb->ctl_flags = ctl_flags;
|
||||||
wmb();
|
wmb();
|
||||||
cpb->resp_flags = 0;
|
cpb->resp_flags = 0;
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc)
|
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc)
|
||||||
|
@ -1972,17 +1974,19 @@ static int nv_swncq_port_start(struct ata_port *ap)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nv_swncq_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors nv_swncq_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
if (qc->tf.protocol != ATA_PROT_NCQ) {
|
if (qc->tf.protocol != ATA_PROT_NCQ) {
|
||||||
ata_bmdma_qc_prep(qc);
|
ata_bmdma_qc_prep(qc);
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
nv_swncq_fill_sg(qc);
|
nv_swncq_fill_sg(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc)
|
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -155,7 +155,7 @@ static int pdc_sata_scr_write(struct ata_link *link, unsigned int sc_reg, u32 va
|
||||||
static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
||||||
static int pdc_common_port_start(struct ata_port *ap);
|
static int pdc_common_port_start(struct ata_port *ap);
|
||||||
static int pdc_sata_port_start(struct ata_port *ap);
|
static int pdc_sata_port_start(struct ata_port *ap);
|
||||||
static void pdc_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors pdc_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||||
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||||
static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
|
static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
|
||||||
|
@ -649,7 +649,7 @@ static void pdc_fill_sg(struct ata_queued_cmd *qc)
|
||||||
prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pdc_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors pdc_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct pdc_port_priv *pp = qc->ap->private_data;
|
struct pdc_port_priv *pp = qc->ap->private_data;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -681,6 +681,8 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pdc_is_sataii_tx4(unsigned long flags)
|
static int pdc_is_sataii_tx4(unsigned long flags)
|
||||||
|
|
|
@ -116,7 +116,7 @@ static int qs_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
||||||
static int qs_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
static int qs_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
||||||
static int qs_port_start(struct ata_port *ap);
|
static int qs_port_start(struct ata_port *ap);
|
||||||
static void qs_host_stop(struct ata_host *host);
|
static void qs_host_stop(struct ata_host *host);
|
||||||
static void qs_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors qs_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static unsigned int qs_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int qs_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static int qs_check_atapi_dma(struct ata_queued_cmd *qc);
|
static int qs_check_atapi_dma(struct ata_queued_cmd *qc);
|
||||||
static void qs_freeze(struct ata_port *ap);
|
static void qs_freeze(struct ata_port *ap);
|
||||||
|
@ -276,7 +276,7 @@ static unsigned int qs_fill_sg(struct ata_queued_cmd *qc)
|
||||||
return si;
|
return si;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qs_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors qs_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct qs_port_priv *pp = qc->ap->private_data;
|
struct qs_port_priv *pp = qc->ap->private_data;
|
||||||
u8 dflags = QS_DF_PORD, *buf = pp->pkt;
|
u8 dflags = QS_DF_PORD, *buf = pp->pkt;
|
||||||
|
@ -288,7 +288,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
qs_enter_reg_mode(qc->ap);
|
qs_enter_reg_mode(qc->ap);
|
||||||
if (qc->tf.protocol != ATA_PROT_DMA)
|
if (qc->tf.protocol != ATA_PROT_DMA)
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
nelem = qs_fill_sg(qc);
|
nelem = qs_fill_sg(qc);
|
||||||
|
|
||||||
|
@ -311,6 +311,8 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
/* frame information structure (FIS) */
|
/* frame information structure (FIS) */
|
||||||
ata_tf_to_fis(&qc->tf, 0, 1, &buf[32]);
|
ata_tf_to_fis(&qc->tf, 0, 1, &buf[32]);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void qs_packet_start(struct ata_queued_cmd *qc)
|
static inline void qs_packet_start(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -554,12 +554,14 @@ static void sata_rcar_bmdma_fill_sg(struct ata_queued_cmd *qc)
|
||||||
prd[si - 1].addr |= cpu_to_le32(SATA_RCAR_DTEND);
|
prd[si - 1].addr |= cpu_to_le32(SATA_RCAR_DTEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sata_rcar_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors sata_rcar_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
sata_rcar_bmdma_fill_sg(qc);
|
sata_rcar_bmdma_fill_sg(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sata_rcar_bmdma_setup(struct ata_queued_cmd *qc)
|
static void sata_rcar_bmdma_setup(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -119,7 +119,7 @@ static void sil_dev_config(struct ata_device *dev);
|
||||||
static int sil_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
|
static int sil_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
|
||||||
static int sil_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
static int sil_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
||||||
static int sil_set_mode(struct ata_link *link, struct ata_device **r_failed);
|
static int sil_set_mode(struct ata_link *link, struct ata_device **r_failed);
|
||||||
static void sil_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors sil_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static void sil_bmdma_setup(struct ata_queued_cmd *qc);
|
static void sil_bmdma_setup(struct ata_queued_cmd *qc);
|
||||||
static void sil_bmdma_start(struct ata_queued_cmd *qc);
|
static void sil_bmdma_start(struct ata_queued_cmd *qc);
|
||||||
static void sil_bmdma_stop(struct ata_queued_cmd *qc);
|
static void sil_bmdma_stop(struct ata_queued_cmd *qc);
|
||||||
|
@ -333,12 +333,14 @@ static void sil_fill_sg(struct ata_queued_cmd *qc)
|
||||||
last_prd->flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
last_prd->flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sil_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors sil_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
sil_fill_sg(qc);
|
sil_fill_sg(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char sil_get_device_cache_line(struct pci_dev *pdev)
|
static unsigned char sil_get_device_cache_line(struct pci_dev *pdev)
|
||||||
|
|
|
@ -336,7 +336,7 @@ static void sil24_dev_config(struct ata_device *dev);
|
||||||
static int sil24_scr_read(struct ata_link *link, unsigned sc_reg, u32 *val);
|
static int sil24_scr_read(struct ata_link *link, unsigned sc_reg, u32 *val);
|
||||||
static int sil24_scr_write(struct ata_link *link, unsigned sc_reg, u32 val);
|
static int sil24_scr_write(struct ata_link *link, unsigned sc_reg, u32 val);
|
||||||
static int sil24_qc_defer(struct ata_queued_cmd *qc);
|
static int sil24_qc_defer(struct ata_queued_cmd *qc);
|
||||||
static void sil24_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors sil24_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static bool sil24_qc_fill_rtf(struct ata_queued_cmd *qc);
|
static bool sil24_qc_fill_rtf(struct ata_queued_cmd *qc);
|
||||||
static void sil24_pmp_attach(struct ata_port *ap);
|
static void sil24_pmp_attach(struct ata_port *ap);
|
||||||
|
@ -840,7 +840,7 @@ static int sil24_qc_defer(struct ata_queued_cmd *qc)
|
||||||
return ata_std_qc_defer(qc);
|
return ata_std_qc_defer(qc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sil24_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors sil24_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct sil24_port_priv *pp = ap->private_data;
|
struct sil24_port_priv *pp = ap->private_data;
|
||||||
|
@ -884,6 +884,8 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
if (qc->flags & ATA_QCFLAG_DMAMAP)
|
if (qc->flags & ATA_QCFLAG_DMAMAP)
|
||||||
sil24_fill_sg(qc, sge);
|
sil24_fill_sg(qc, sge);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc)
|
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -218,7 +218,7 @@ static void pdc_error_handler(struct ata_port *ap);
|
||||||
static void pdc_freeze(struct ata_port *ap);
|
static void pdc_freeze(struct ata_port *ap);
|
||||||
static void pdc_thaw(struct ata_port *ap);
|
static void pdc_thaw(struct ata_port *ap);
|
||||||
static int pdc_port_start(struct ata_port *ap);
|
static int pdc_port_start(struct ata_port *ap);
|
||||||
static void pdc20621_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors pdc20621_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||||
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||||
static unsigned int pdc20621_dimm_init(struct ata_host *host);
|
static unsigned int pdc20621_dimm_init(struct ata_host *host);
|
||||||
|
@ -546,7 +546,7 @@ static void pdc20621_nodata_prep(struct ata_queued_cmd *qc)
|
||||||
VPRINTK("ata pkt buf ofs %u, mmio copied\n", i);
|
VPRINTK("ata pkt buf ofs %u, mmio copied\n", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pdc20621_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors pdc20621_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
switch (qc->tf.protocol) {
|
switch (qc->tf.protocol) {
|
||||||
case ATA_PROT_DMA:
|
case ATA_PROT_DMA:
|
||||||
|
@ -558,6 +558,8 @@ static void pdc20621_qc_prep(struct ata_queued_cmd *qc)
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __pdc20621_push_hdma(struct ata_queued_cmd *qc,
|
static void __pdc20621_push_hdma(struct ata_queued_cmd *qc,
|
||||||
|
|
|
@ -2243,7 +2243,7 @@ static int eni_init_one(struct pci_dev *pci_dev,
|
||||||
|
|
||||||
rc = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32));
|
rc = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32));
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto out;
|
goto err_disable;
|
||||||
|
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
eni_dev = kmalloc(sizeof(struct eni_dev), GFP_KERNEL);
|
eni_dev = kmalloc(sizeof(struct eni_dev), GFP_KERNEL);
|
||||||
|
|
|
@ -493,7 +493,8 @@ static int really_probe(struct device *dev, struct device_driver *drv)
|
||||||
drv->bus->name, __func__, drv->name, dev_name(dev));
|
drv->bus->name, __func__, drv->name, dev_name(dev));
|
||||||
if (!list_empty(&dev->devres_head)) {
|
if (!list_empty(&dev->devres_head)) {
|
||||||
dev_crit(dev, "Resources present before probing\n");
|
dev_crit(dev, "Resources present before probing\n");
|
||||||
return -EBUSY;
|
ret = -EBUSY;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
re_probe:
|
re_probe:
|
||||||
|
@ -600,7 +601,7 @@ static int really_probe(struct device *dev, struct device_driver *drv)
|
||||||
ret = 0;
|
ret = 0;
|
||||||
done:
|
done:
|
||||||
atomic_dec(&probe_count);
|
atomic_dec(&probe_count);
|
||||||
wake_up(&probe_waitqueue);
|
wake_up_all(&probe_waitqueue);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -414,10 +414,32 @@ static int __ref get_nid_for_pfn(unsigned long pfn)
|
||||||
return pfn_to_nid(pfn);
|
return pfn_to_nid(pfn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* register memory section under specified node if it spans that node */
|
static int do_register_memory_block_under_node(int nid,
|
||||||
int register_mem_sect_under_node(struct memory_block *mem_blk, void *arg)
|
struct memory_block *mem_blk)
|
||||||
{
|
{
|
||||||
int ret, nid = *(int *)arg;
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If this memory block spans multiple nodes, we only indicate
|
||||||
|
* the last processed node.
|
||||||
|
*/
|
||||||
|
mem_blk->nid = nid;
|
||||||
|
|
||||||
|
ret = sysfs_create_link_nowarn(&node_devices[nid]->dev.kobj,
|
||||||
|
&mem_blk->dev.kobj,
|
||||||
|
kobject_name(&mem_blk->dev.kobj));
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return sysfs_create_link_nowarn(&mem_blk->dev.kobj,
|
||||||
|
&node_devices[nid]->dev.kobj,
|
||||||
|
kobject_name(&node_devices[nid]->dev.kobj));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* register memory section under specified node if it spans that node */
|
||||||
|
int register_mem_block_under_node_early(struct memory_block *mem_blk, void *arg)
|
||||||
|
{
|
||||||
|
int nid = *(int *)arg;
|
||||||
unsigned long pfn, sect_start_pfn, sect_end_pfn;
|
unsigned long pfn, sect_start_pfn, sect_end_pfn;
|
||||||
|
|
||||||
sect_start_pfn = section_nr_to_pfn(mem_blk->start_section_nr);
|
sect_start_pfn = section_nr_to_pfn(mem_blk->start_section_nr);
|
||||||
|
@ -437,38 +459,33 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, void *arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need to check if page belongs to nid only for the boot
|
* We need to check if page belongs to nid only at the boot
|
||||||
* case, during hotplug we know that all pages in the memory
|
* case because node's ranges can be interleaved.
|
||||||
* block belong to the same node.
|
|
||||||
*/
|
*/
|
||||||
if (system_state == SYSTEM_BOOTING) {
|
page_nid = get_nid_for_pfn(pfn);
|
||||||
page_nid = get_nid_for_pfn(pfn);
|
if (page_nid < 0)
|
||||||
if (page_nid < 0)
|
continue;
|
||||||
continue;
|
if (page_nid != nid)
|
||||||
if (page_nid != nid)
|
continue;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
return do_register_memory_block_under_node(nid, mem_blk);
|
||||||
* If this memory block spans multiple nodes, we only indicate
|
|
||||||
* the last processed node.
|
|
||||||
*/
|
|
||||||
mem_blk->nid = nid;
|
|
||||||
|
|
||||||
ret = sysfs_create_link_nowarn(&node_devices[nid]->dev.kobj,
|
|
||||||
&mem_blk->dev.kobj,
|
|
||||||
kobject_name(&mem_blk->dev.kobj));
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
return sysfs_create_link_nowarn(&mem_blk->dev.kobj,
|
|
||||||
&node_devices[nid]->dev.kobj,
|
|
||||||
kobject_name(&node_devices[nid]->dev.kobj));
|
|
||||||
}
|
}
|
||||||
/* mem section does not span the specified node */
|
/* mem section does not span the specified node */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* During hotplug we know that all pages in the memory block belong to the same
|
||||||
|
* node.
|
||||||
|
*/
|
||||||
|
static int register_mem_block_under_node_hotplug(struct memory_block *mem_blk,
|
||||||
|
void *arg)
|
||||||
|
{
|
||||||
|
int nid = *(int *)arg;
|
||||||
|
|
||||||
|
return do_register_memory_block_under_node(nid, mem_blk);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unregister a memory block device under the node it spans. Memory blocks
|
* Unregister a memory block device under the node it spans. Memory blocks
|
||||||
* with multiple nodes cannot be offlined and therefore also never be removed.
|
* with multiple nodes cannot be offlined and therefore also never be removed.
|
||||||
|
@ -484,10 +501,17 @@ void unregister_memory_block_under_nodes(struct memory_block *mem_blk)
|
||||||
kobject_name(&node_devices[mem_blk->nid]->dev.kobj));
|
kobject_name(&node_devices[mem_blk->nid]->dev.kobj));
|
||||||
}
|
}
|
||||||
|
|
||||||
int link_mem_sections(int nid, unsigned long start_pfn, unsigned long end_pfn)
|
int link_mem_sections(int nid, unsigned long start_pfn, unsigned long end_pfn,
|
||||||
|
enum meminit_context context)
|
||||||
{
|
{
|
||||||
return walk_memory_range(start_pfn, end_pfn, (void *)&nid,
|
walk_memory_blocks_func_t func;
|
||||||
register_mem_sect_under_node);
|
|
||||||
|
if (context == MEMINIT_HOTPLUG)
|
||||||
|
func = register_mem_block_under_node_hotplug;
|
||||||
|
else
|
||||||
|
func = register_mem_block_under_node_early;
|
||||||
|
|
||||||
|
return walk_memory_range(start_pfn, end_pfn, (void *)&nid, func);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_HUGETLBFS
|
#ifdef CONFIG_HUGETLBFS
|
||||||
|
|
|
@ -2367,7 +2367,7 @@ int regmap_raw_write_async(struct regmap *map, unsigned int reg,
|
||||||
EXPORT_SYMBOL_GPL(regmap_raw_write_async);
|
EXPORT_SYMBOL_GPL(regmap_raw_write_async);
|
||||||
|
|
||||||
static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
|
static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
|
||||||
unsigned int val_len)
|
unsigned int val_len, bool noinc)
|
||||||
{
|
{
|
||||||
struct regmap_range_node *range;
|
struct regmap_range_node *range;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -2380,7 +2380,7 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
|
||||||
range = _regmap_range_lookup(map, reg);
|
range = _regmap_range_lookup(map, reg);
|
||||||
if (range) {
|
if (range) {
|
||||||
ret = _regmap_select_page(map, ®, range,
|
ret = _regmap_select_page(map, ®, range,
|
||||||
val_len / map->format.val_bytes);
|
noinc ? 1 : val_len / map->format.val_bytes);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -2418,7 +2418,7 @@ static int _regmap_bus_read(void *context, unsigned int reg,
|
||||||
if (!map->format.parse_val)
|
if (!map->format.parse_val)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
ret = _regmap_raw_read(map, reg, work_val, map->format.val_bytes);
|
ret = _regmap_raw_read(map, reg, work_val, map->format.val_bytes, false);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
*val = map->format.parse_val(work_val);
|
*val = map->format.parse_val(work_val);
|
||||||
|
|
||||||
|
@ -2536,7 +2536,7 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
|
||||||
|
|
||||||
/* Read bytes that fit into whole chunks */
|
/* Read bytes that fit into whole chunks */
|
||||||
for (i = 0; i < chunk_count; i++) {
|
for (i = 0; i < chunk_count; i++) {
|
||||||
ret = _regmap_raw_read(map, reg, val, chunk_bytes);
|
ret = _regmap_raw_read(map, reg, val, chunk_bytes, false);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -2547,7 +2547,7 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
|
||||||
|
|
||||||
/* Read remaining bytes */
|
/* Read remaining bytes */
|
||||||
if (val_len) {
|
if (val_len) {
|
||||||
ret = _regmap_raw_read(map, reg, val, val_len);
|
ret = _regmap_raw_read(map, reg, val, val_len, false);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -2622,7 +2622,7 @@ int regmap_noinc_read(struct regmap *map, unsigned int reg,
|
||||||
read_len = map->max_raw_read;
|
read_len = map->max_raw_read;
|
||||||
else
|
else
|
||||||
read_len = val_len;
|
read_len = val_len;
|
||||||
ret = _regmap_raw_read(map, reg, val, read_len);
|
ret = _regmap_raw_read(map, reg, val, read_len, true);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
val = ((u8 *)val) + read_len;
|
val = ((u8 *)val) + read_len;
|
||||||
|
|
|
@ -343,11 +343,11 @@ static int rtlbt_parse_firmware(struct hci_dev *hdev,
|
||||||
* the end.
|
* the end.
|
||||||
*/
|
*/
|
||||||
len = patch_length;
|
len = patch_length;
|
||||||
buf = kmemdup(btrtl_dev->fw_data + patch_offset, patch_length,
|
buf = kvmalloc(patch_length, GFP_KERNEL);
|
||||||
GFP_KERNEL);
|
|
||||||
if (!buf)
|
if (!buf)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
memcpy(buf, btrtl_dev->fw_data + patch_offset, patch_length - 4);
|
||||||
memcpy(buf + patch_length - 4, &epatch_info->fw_version, 4);
|
memcpy(buf + patch_length - 4, &epatch_info->fw_version, 4);
|
||||||
|
|
||||||
*_buf = buf;
|
*_buf = buf;
|
||||||
|
@ -415,8 +415,10 @@ static int rtl_load_file(struct hci_dev *hdev, const char *name, u8 **buff)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
ret = fw->size;
|
ret = fw->size;
|
||||||
*buff = kmemdup(fw->data, ret, GFP_KERNEL);
|
*buff = kvmalloc(fw->size, GFP_KERNEL);
|
||||||
if (!*buff)
|
if (*buff)
|
||||||
|
memcpy(*buff, fw->data, ret);
|
||||||
|
else
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
|
@ -454,14 +456,14 @@ static int btrtl_setup_rtl8723b(struct hci_dev *hdev,
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (btrtl_dev->cfg_len > 0) {
|
if (btrtl_dev->cfg_len > 0) {
|
||||||
tbuff = kzalloc(ret + btrtl_dev->cfg_len, GFP_KERNEL);
|
tbuff = kvzalloc(ret + btrtl_dev->cfg_len, GFP_KERNEL);
|
||||||
if (!tbuff) {
|
if (!tbuff) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(tbuff, fw_data, ret);
|
memcpy(tbuff, fw_data, ret);
|
||||||
kfree(fw_data);
|
kvfree(fw_data);
|
||||||
|
|
||||||
memcpy(tbuff + ret, btrtl_dev->cfg_data, btrtl_dev->cfg_len);
|
memcpy(tbuff + ret, btrtl_dev->cfg_data, btrtl_dev->cfg_len);
|
||||||
ret += btrtl_dev->cfg_len;
|
ret += btrtl_dev->cfg_len;
|
||||||
|
@ -474,7 +476,7 @@ static int btrtl_setup_rtl8723b(struct hci_dev *hdev,
|
||||||
ret = rtl_download_firmware(hdev, fw_data, ret);
|
ret = rtl_download_firmware(hdev, fw_data, ret);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
kfree(fw_data);
|
kvfree(fw_data);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,8 +503,8 @@ static struct sk_buff *btrtl_read_local_version(struct hci_dev *hdev)
|
||||||
|
|
||||||
void btrtl_free(struct btrtl_device_info *btrtl_dev)
|
void btrtl_free(struct btrtl_device_info *btrtl_dev)
|
||||||
{
|
{
|
||||||
kfree(btrtl_dev->fw_data);
|
kvfree(btrtl_dev->fw_data);
|
||||||
kfree(btrtl_dev->cfg_data);
|
kvfree(btrtl_dev->cfg_data);
|
||||||
kfree(btrtl_dev);
|
kfree(btrtl_dev);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(btrtl_free);
|
EXPORT_SYMBOL_GPL(btrtl_free);
|
||||||
|
|
|
@ -358,6 +358,26 @@ static int hisi_lpc_acpi_xlat_io_res(struct acpi_device *adev,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Released firmware describes the IO port max address as 0x3fff, which is
|
||||||
|
* the max host bus address. Fixup to a proper range. This will probably
|
||||||
|
* never be fixed in firmware.
|
||||||
|
*/
|
||||||
|
static void hisi_lpc_acpi_fixup_child_resource(struct device *hostdev,
|
||||||
|
struct resource *r)
|
||||||
|
{
|
||||||
|
if (r->end != 0x3fff)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (r->start == 0xe4)
|
||||||
|
r->end = 0xe4 + 0x04 - 1;
|
||||||
|
else if (r->start == 0x2f8)
|
||||||
|
r->end = 0x2f8 + 0x08 - 1;
|
||||||
|
else
|
||||||
|
dev_warn(hostdev, "unrecognised resource %pR to fixup, ignoring\n",
|
||||||
|
r);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hisi_lpc_acpi_set_io_res - set the resources for a child
|
* hisi_lpc_acpi_set_io_res - set the resources for a child
|
||||||
* @child: the device node to be updated the I/O resource
|
* @child: the device node to be updated the I/O resource
|
||||||
|
@ -419,8 +439,11 @@ static int hisi_lpc_acpi_set_io_res(struct device *child,
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
count = 0;
|
count = 0;
|
||||||
list_for_each_entry(rentry, &resource_list, node)
|
list_for_each_entry(rentry, &resource_list, node) {
|
||||||
resources[count++] = *rentry->res;
|
resources[count] = *rentry->res;
|
||||||
|
hisi_lpc_acpi_fixup_child_resource(hostdev, &resources[count]);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
acpi_dev_free_resource_list(&resource_list);
|
acpi_dev_free_resource_list(&resource_list);
|
||||||
|
|
||||||
|
|
|
@ -1142,14 +1142,14 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
|
||||||
* We take into account the first, second and third-order deltas
|
* We take into account the first, second and third-order deltas
|
||||||
* in order to make our estimate.
|
* in order to make our estimate.
|
||||||
*/
|
*/
|
||||||
delta = sample.jiffies - state->last_time;
|
delta = sample.jiffies - READ_ONCE(state->last_time);
|
||||||
state->last_time = sample.jiffies;
|
WRITE_ONCE(state->last_time, sample.jiffies);
|
||||||
|
|
||||||
delta2 = delta - state->last_delta;
|
delta2 = delta - READ_ONCE(state->last_delta);
|
||||||
state->last_delta = delta;
|
WRITE_ONCE(state->last_delta, delta);
|
||||||
|
|
||||||
delta3 = delta2 - state->last_delta2;
|
delta3 = delta2 - READ_ONCE(state->last_delta2);
|
||||||
state->last_delta2 = delta2;
|
WRITE_ONCE(state->last_delta2, delta2);
|
||||||
|
|
||||||
if (delta < 0)
|
if (delta < 0)
|
||||||
delta = -delta;
|
delta = -delta;
|
||||||
|
|
|
@ -776,18 +776,22 @@ static int __init tlclk_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = register_chrdev(tlclk_major, "telco_clock", &tlclk_fops);
|
telclk_interrupt = (inb(TLCLK_REG7) & 0x0f);
|
||||||
if (ret < 0) {
|
|
||||||
printk(KERN_ERR "tlclk: can't get major %d.\n", tlclk_major);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
tlclk_major = ret;
|
|
||||||
alarm_events = kzalloc( sizeof(struct tlclk_alarms), GFP_KERNEL);
|
alarm_events = kzalloc( sizeof(struct tlclk_alarms), GFP_KERNEL);
|
||||||
if (!alarm_events) {
|
if (!alarm_events) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out1;
|
goto out1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = register_chrdev(tlclk_major, "telco_clock", &tlclk_fops);
|
||||||
|
if (ret < 0) {
|
||||||
|
printk(KERN_ERR "tlclk: can't get major %d.\n", tlclk_major);
|
||||||
|
kfree(alarm_events);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
tlclk_major = ret;
|
||||||
|
|
||||||
/* Read telecom clock IRQ number (Set by BIOS) */
|
/* Read telecom clock IRQ number (Set by BIOS) */
|
||||||
if (!request_region(TLCLK_BASE, 8, "telco_clock")) {
|
if (!request_region(TLCLK_BASE, 8, "telco_clock")) {
|
||||||
printk(KERN_ERR "tlclk: request_region 0x%X failed.\n",
|
printk(KERN_ERR "tlclk: request_region 0x%X failed.\n",
|
||||||
|
@ -795,7 +799,6 @@ static int __init tlclk_init(void)
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
goto out2;
|
goto out2;
|
||||||
}
|
}
|
||||||
telclk_interrupt = (inb(TLCLK_REG7) & 0x0f);
|
|
||||||
|
|
||||||
if (0x0F == telclk_interrupt ) { /* not MCPBL0010 ? */
|
if (0x0F == telclk_interrupt ) { /* not MCPBL0010 ? */
|
||||||
printk(KERN_ERR "telclk_interrupt = 0x%x non-mcpbl0010 hw.\n",
|
printk(KERN_ERR "telclk_interrupt = 0x%x non-mcpbl0010 hw.\n",
|
||||||
|
@ -836,8 +839,8 @@ static int __init tlclk_init(void)
|
||||||
release_region(TLCLK_BASE, 8);
|
release_region(TLCLK_BASE, 8);
|
||||||
out2:
|
out2:
|
||||||
kfree(alarm_events);
|
kfree(alarm_events);
|
||||||
out1:
|
|
||||||
unregister_chrdev(tlclk_major, "telco_clock");
|
unregister_chrdev(tlclk_major, "telco_clock");
|
||||||
|
out1:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include "tpm.h"
|
#include "tpm.h"
|
||||||
|
|
||||||
#define ACPI_SIG_TPM2 "TPM2"
|
#define ACPI_SIG_TPM2 "TPM2"
|
||||||
|
#define TPM_CRB_MAX_RESOURCES 3
|
||||||
|
|
||||||
static const guid_t crb_acpi_start_guid =
|
static const guid_t crb_acpi_start_guid =
|
||||||
GUID_INIT(0x6BBF6CAB, 0x5463, 0x4714,
|
GUID_INIT(0x6BBF6CAB, 0x5463, 0x4714,
|
||||||
|
@ -95,7 +96,6 @@ enum crb_status {
|
||||||
struct crb_priv {
|
struct crb_priv {
|
||||||
u32 sm;
|
u32 sm;
|
||||||
const char *hid;
|
const char *hid;
|
||||||
void __iomem *iobase;
|
|
||||||
struct crb_regs_head __iomem *regs_h;
|
struct crb_regs_head __iomem *regs_h;
|
||||||
struct crb_regs_tail __iomem *regs_t;
|
struct crb_regs_tail __iomem *regs_t;
|
||||||
u8 __iomem *cmd;
|
u8 __iomem *cmd;
|
||||||
|
@ -438,21 +438,27 @@ static const struct tpm_class_ops tpm_crb = {
|
||||||
|
|
||||||
static int crb_check_resource(struct acpi_resource *ares, void *data)
|
static int crb_check_resource(struct acpi_resource *ares, void *data)
|
||||||
{
|
{
|
||||||
struct resource *io_res = data;
|
struct resource *iores_array = data;
|
||||||
struct resource_win win;
|
struct resource_win win;
|
||||||
struct resource *res = &(win.res);
|
struct resource *res = &(win.res);
|
||||||
|
int i;
|
||||||
|
|
||||||
if (acpi_dev_resource_memory(ares, res) ||
|
if (acpi_dev_resource_memory(ares, res) ||
|
||||||
acpi_dev_resource_address_space(ares, &win)) {
|
acpi_dev_resource_address_space(ares, &win)) {
|
||||||
*io_res = *res;
|
for (i = 0; i < TPM_CRB_MAX_RESOURCES + 1; ++i) {
|
||||||
io_res->name = NULL;
|
if (resource_type(iores_array + i) != IORESOURCE_MEM) {
|
||||||
|
iores_array[i] = *res;
|
||||||
|
iores_array[i].name = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __iomem *crb_map_res(struct device *dev, struct crb_priv *priv,
|
static void __iomem *crb_map_res(struct device *dev, struct resource *iores,
|
||||||
struct resource *io_res, u64 start, u32 size)
|
void __iomem **iobase_ptr, u64 start, u32 size)
|
||||||
{
|
{
|
||||||
struct resource new_res = {
|
struct resource new_res = {
|
||||||
.start = start,
|
.start = start,
|
||||||
|
@ -464,10 +470,16 @@ static void __iomem *crb_map_res(struct device *dev, struct crb_priv *priv,
|
||||||
if (start != new_res.start)
|
if (start != new_res.start)
|
||||||
return (void __iomem *) ERR_PTR(-EINVAL);
|
return (void __iomem *) ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
if (!resource_contains(io_res, &new_res))
|
if (!iores)
|
||||||
return devm_ioremap_resource(dev, &new_res);
|
return devm_ioremap_resource(dev, &new_res);
|
||||||
|
|
||||||
return priv->iobase + (new_res.start - io_res->start);
|
if (!*iobase_ptr) {
|
||||||
|
*iobase_ptr = devm_ioremap_resource(dev, iores);
|
||||||
|
if (IS_ERR(*iobase_ptr))
|
||||||
|
return *iobase_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *iobase_ptr + (new_res.start - iores->start);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -494,9 +506,13 @@ static u64 crb_fixup_cmd_size(struct device *dev, struct resource *io_res,
|
||||||
static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
struct acpi_table_tpm2 *buf)
|
struct acpi_table_tpm2 *buf)
|
||||||
{
|
{
|
||||||
struct list_head resources;
|
struct list_head acpi_resource_list;
|
||||||
struct resource io_res;
|
struct resource iores_array[TPM_CRB_MAX_RESOURCES + 1] = { {0} };
|
||||||
|
void __iomem *iobase_array[TPM_CRB_MAX_RESOURCES] = {NULL};
|
||||||
struct device *dev = &device->dev;
|
struct device *dev = &device->dev;
|
||||||
|
struct resource *iores;
|
||||||
|
void __iomem **iobase_ptr;
|
||||||
|
int i;
|
||||||
u32 pa_high, pa_low;
|
u32 pa_high, pa_low;
|
||||||
u64 cmd_pa;
|
u64 cmd_pa;
|
||||||
u32 cmd_size;
|
u32 cmd_size;
|
||||||
|
@ -505,21 +521,41 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
u32 rsp_size;
|
u32 rsp_size;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&resources);
|
INIT_LIST_HEAD(&acpi_resource_list);
|
||||||
ret = acpi_dev_get_resources(device, &resources, crb_check_resource,
|
ret = acpi_dev_get_resources(device, &acpi_resource_list,
|
||||||
&io_res);
|
crb_check_resource, iores_array);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
acpi_dev_free_resource_list(&resources);
|
acpi_dev_free_resource_list(&acpi_resource_list);
|
||||||
|
|
||||||
if (resource_type(&io_res) != IORESOURCE_MEM) {
|
if (resource_type(iores_array) != IORESOURCE_MEM) {
|
||||||
dev_err(dev, FW_BUG "TPM2 ACPI table does not define a memory resource\n");
|
dev_err(dev, FW_BUG "TPM2 ACPI table does not define a memory resource\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
} else if (resource_type(iores_array + TPM_CRB_MAX_RESOURCES) ==
|
||||||
|
IORESOURCE_MEM) {
|
||||||
|
dev_warn(dev, "TPM2 ACPI table defines too many memory resources\n");
|
||||||
|
memset(iores_array + TPM_CRB_MAX_RESOURCES,
|
||||||
|
0, sizeof(*iores_array));
|
||||||
|
iores_array[TPM_CRB_MAX_RESOURCES].flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->iobase = devm_ioremap_resource(dev, &io_res);
|
iores = NULL;
|
||||||
if (IS_ERR(priv->iobase))
|
iobase_ptr = NULL;
|
||||||
return PTR_ERR(priv->iobase);
|
for (i = 0; resource_type(iores_array + i) == IORESOURCE_MEM; ++i) {
|
||||||
|
if (buf->control_address >= iores_array[i].start &&
|
||||||
|
buf->control_address + sizeof(struct crb_regs_tail) - 1 <=
|
||||||
|
iores_array[i].end) {
|
||||||
|
iores = iores_array + i;
|
||||||
|
iobase_ptr = iobase_array + i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
priv->regs_t = crb_map_res(dev, iores, iobase_ptr, buf->control_address,
|
||||||
|
sizeof(struct crb_regs_tail));
|
||||||
|
|
||||||
|
if (IS_ERR(priv->regs_t))
|
||||||
|
return PTR_ERR(priv->regs_t);
|
||||||
|
|
||||||
/* The ACPI IO region starts at the head area and continues to include
|
/* The ACPI IO region starts at the head area and continues to include
|
||||||
* the control area, as one nice sane region except for some older
|
* the control area, as one nice sane region except for some older
|
||||||
|
@ -527,9 +563,10 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
*/
|
*/
|
||||||
if ((priv->sm == ACPI_TPM2_COMMAND_BUFFER) ||
|
if ((priv->sm == ACPI_TPM2_COMMAND_BUFFER) ||
|
||||||
(priv->sm == ACPI_TPM2_MEMORY_MAPPED)) {
|
(priv->sm == ACPI_TPM2_MEMORY_MAPPED)) {
|
||||||
if (buf->control_address == io_res.start +
|
if (iores &&
|
||||||
|
buf->control_address == iores->start +
|
||||||
sizeof(*priv->regs_h))
|
sizeof(*priv->regs_h))
|
||||||
priv->regs_h = priv->iobase;
|
priv->regs_h = *iobase_ptr;
|
||||||
else
|
else
|
||||||
dev_warn(dev, FW_BUG "Bad ACPI memory layout");
|
dev_warn(dev, FW_BUG "Bad ACPI memory layout");
|
||||||
}
|
}
|
||||||
|
@ -538,13 +575,6 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
priv->regs_t = crb_map_res(dev, priv, &io_res, buf->control_address,
|
|
||||||
sizeof(struct crb_regs_tail));
|
|
||||||
if (IS_ERR(priv->regs_t)) {
|
|
||||||
ret = PTR_ERR(priv->regs_t);
|
|
||||||
goto out_relinquish_locality;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PTT HW bug w/a: wake up the device to access
|
* PTT HW bug w/a: wake up the device to access
|
||||||
* possibly not retained registers.
|
* possibly not retained registers.
|
||||||
|
@ -556,13 +586,26 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
pa_high = ioread32(&priv->regs_t->ctrl_cmd_pa_high);
|
pa_high = ioread32(&priv->regs_t->ctrl_cmd_pa_high);
|
||||||
pa_low = ioread32(&priv->regs_t->ctrl_cmd_pa_low);
|
pa_low = ioread32(&priv->regs_t->ctrl_cmd_pa_low);
|
||||||
cmd_pa = ((u64)pa_high << 32) | pa_low;
|
cmd_pa = ((u64)pa_high << 32) | pa_low;
|
||||||
cmd_size = crb_fixup_cmd_size(dev, &io_res, cmd_pa,
|
cmd_size = ioread32(&priv->regs_t->ctrl_cmd_size);
|
||||||
ioread32(&priv->regs_t->ctrl_cmd_size));
|
|
||||||
|
iores = NULL;
|
||||||
|
iobase_ptr = NULL;
|
||||||
|
for (i = 0; iores_array[i].end; ++i) {
|
||||||
|
if (cmd_pa >= iores_array[i].start &&
|
||||||
|
cmd_pa <= iores_array[i].end) {
|
||||||
|
iores = iores_array + i;
|
||||||
|
iobase_ptr = iobase_array + i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iores)
|
||||||
|
cmd_size = crb_fixup_cmd_size(dev, iores, cmd_pa, cmd_size);
|
||||||
|
|
||||||
dev_dbg(dev, "cmd_hi = %X cmd_low = %X cmd_size %X\n",
|
dev_dbg(dev, "cmd_hi = %X cmd_low = %X cmd_size %X\n",
|
||||||
pa_high, pa_low, cmd_size);
|
pa_high, pa_low, cmd_size);
|
||||||
|
|
||||||
priv->cmd = crb_map_res(dev, priv, &io_res, cmd_pa, cmd_size);
|
priv->cmd = crb_map_res(dev, iores, iobase_ptr, cmd_pa, cmd_size);
|
||||||
if (IS_ERR(priv->cmd)) {
|
if (IS_ERR(priv->cmd)) {
|
||||||
ret = PTR_ERR(priv->cmd);
|
ret = PTR_ERR(priv->cmd);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -570,11 +613,25 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
|
|
||||||
memcpy_fromio(&__rsp_pa, &priv->regs_t->ctrl_rsp_pa, 8);
|
memcpy_fromio(&__rsp_pa, &priv->regs_t->ctrl_rsp_pa, 8);
|
||||||
rsp_pa = le64_to_cpu(__rsp_pa);
|
rsp_pa = le64_to_cpu(__rsp_pa);
|
||||||
rsp_size = crb_fixup_cmd_size(dev, &io_res, rsp_pa,
|
rsp_size = ioread32(&priv->regs_t->ctrl_rsp_size);
|
||||||
ioread32(&priv->regs_t->ctrl_rsp_size));
|
|
||||||
|
iores = NULL;
|
||||||
|
iobase_ptr = NULL;
|
||||||
|
for (i = 0; resource_type(iores_array + i) == IORESOURCE_MEM; ++i) {
|
||||||
|
if (rsp_pa >= iores_array[i].start &&
|
||||||
|
rsp_pa <= iores_array[i].end) {
|
||||||
|
iores = iores_array + i;
|
||||||
|
iobase_ptr = iobase_array + i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iores)
|
||||||
|
rsp_size = crb_fixup_cmd_size(dev, iores, rsp_pa, rsp_size);
|
||||||
|
|
||||||
if (cmd_pa != rsp_pa) {
|
if (cmd_pa != rsp_pa) {
|
||||||
priv->rsp = crb_map_res(dev, priv, &io_res, rsp_pa, rsp_size);
|
priv->rsp = crb_map_res(dev, iores, iobase_ptr,
|
||||||
|
rsp_pa, rsp_size);
|
||||||
ret = PTR_ERR_OR_ZERO(priv->rsp);
|
ret = PTR_ERR_OR_ZERO(priv->rsp);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -588,6 +588,7 @@ static irqreturn_t ibmvtpm_interrupt(int irq, void *vtpm_instance)
|
||||||
*/
|
*/
|
||||||
while ((crq = ibmvtpm_crq_get_next(ibmvtpm)) != NULL) {
|
while ((crq = ibmvtpm_crq_get_next(ibmvtpm)) != NULL) {
|
||||||
ibmvtpm_crq_process(crq, ibmvtpm);
|
ibmvtpm_crq_process(crq, ibmvtpm);
|
||||||
|
wake_up_interruptible(&ibmvtpm->crq_queue.wq);
|
||||||
crq->valid = 0;
|
crq->valid = 0;
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
}
|
}
|
||||||
|
@ -635,6 +636,7 @@ static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
crq_q->num_entry = CRQ_RES_BUF_SIZE / sizeof(*crq_q->crq_addr);
|
crq_q->num_entry = CRQ_RES_BUF_SIZE / sizeof(*crq_q->crq_addr);
|
||||||
|
init_waitqueue_head(&crq_q->wq);
|
||||||
ibmvtpm->crq_dma_handle = dma_map_single(dev, crq_q->crq_addr,
|
ibmvtpm->crq_dma_handle = dma_map_single(dev, crq_q->crq_addr,
|
||||||
CRQ_RES_BUF_SIZE,
|
CRQ_RES_BUF_SIZE,
|
||||||
DMA_BIDIRECTIONAL);
|
DMA_BIDIRECTIONAL);
|
||||||
|
@ -687,6 +689,13 @@ static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,
|
||||||
if (rc)
|
if (rc)
|
||||||
goto init_irq_cleanup;
|
goto init_irq_cleanup;
|
||||||
|
|
||||||
|
if (!wait_event_timeout(ibmvtpm->crq_queue.wq,
|
||||||
|
ibmvtpm->rtce_buf != NULL,
|
||||||
|
HZ)) {
|
||||||
|
dev_err(dev, "CRQ response timed out\n");
|
||||||
|
goto init_irq_cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
return tpm_chip_register(chip);
|
return tpm_chip_register(chip);
|
||||||
init_irq_cleanup:
|
init_irq_cleanup:
|
||||||
do {
|
do {
|
||||||
|
|
|
@ -31,6 +31,7 @@ struct ibmvtpm_crq_queue {
|
||||||
struct ibmvtpm_crq *crq_addr;
|
struct ibmvtpm_crq *crq_addr;
|
||||||
u32 index;
|
u32 index;
|
||||||
u32 num_entry;
|
u32 num_entry;
|
||||||
|
wait_queue_head_t wq;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ibmvtpm_dev {
|
struct ibmvtpm_dev {
|
||||||
|
|
|
@ -491,7 +491,7 @@ struct clk *davinci_pll_clk_register(struct device *dev,
|
||||||
parent_name = postdiv_name;
|
parent_name = postdiv_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
pllen = kzalloc(sizeof(*pllout), GFP_KERNEL);
|
pllen = kzalloc(sizeof(*pllen), GFP_KERNEL);
|
||||||
if (!pllen) {
|
if (!pllen) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_unregister_postdiv;
|
goto err_unregister_postdiv;
|
||||||
|
|
|
@ -144,7 +144,7 @@ PNAME(mux_usb480m_p) = { "usb480m_phy", "xin24m" };
|
||||||
PNAME(mux_hdmiphy_p) = { "hdmiphy_phy", "xin24m" };
|
PNAME(mux_hdmiphy_p) = { "hdmiphy_phy", "xin24m" };
|
||||||
PNAME(mux_aclk_cpu_src_p) = { "cpll_aclk_cpu", "gpll_aclk_cpu", "hdmiphy_aclk_cpu" };
|
PNAME(mux_aclk_cpu_src_p) = { "cpll_aclk_cpu", "gpll_aclk_cpu", "hdmiphy_aclk_cpu" };
|
||||||
|
|
||||||
PNAME(mux_pll_src_4plls_p) = { "cpll", "gpll", "hdmiphy" "usb480m" };
|
PNAME(mux_pll_src_4plls_p) = { "cpll", "gpll", "hdmiphy", "usb480m" };
|
||||||
PNAME(mux_pll_src_3plls_p) = { "cpll", "gpll", "hdmiphy" };
|
PNAME(mux_pll_src_3plls_p) = { "cpll", "gpll", "hdmiphy" };
|
||||||
PNAME(mux_pll_src_2plls_p) = { "cpll", "gpll" };
|
PNAME(mux_pll_src_2plls_p) = { "cpll", "gpll" };
|
||||||
PNAME(mux_sclk_hdmi_cec_p) = { "cpll", "gpll", "xin24m" };
|
PNAME(mux_sclk_hdmi_cec_p) = { "cpll", "gpll", "xin24m" };
|
||||||
|
|
|
@ -1072,7 +1072,7 @@ static const struct samsung_gate_clock exynos4210_gate_clks[] __initconst = {
|
||||||
GATE(CLK_PCIE, "pcie", "aclk133", GATE_IP_FSYS, 14, 0, 0),
|
GATE(CLK_PCIE, "pcie", "aclk133", GATE_IP_FSYS, 14, 0, 0),
|
||||||
GATE(CLK_SMMU_PCIE, "smmu_pcie", "aclk133", GATE_IP_FSYS, 18, 0, 0),
|
GATE(CLK_SMMU_PCIE, "smmu_pcie", "aclk133", GATE_IP_FSYS, 18, 0, 0),
|
||||||
GATE(CLK_MODEMIF, "modemif", "aclk100", GATE_IP_PERIL, 28, 0, 0),
|
GATE(CLK_MODEMIF, "modemif", "aclk100", GATE_IP_PERIL, 28, 0, 0),
|
||||||
GATE(CLK_CHIPID, "chipid", "aclk100", E4210_GATE_IP_PERIR, 0, 0, 0),
|
GATE(CLK_CHIPID, "chipid", "aclk100", E4210_GATE_IP_PERIR, 0, CLK_IGNORE_UNUSED, 0),
|
||||||
GATE(CLK_SYSREG, "sysreg", "aclk100", E4210_GATE_IP_PERIR, 0,
|
GATE(CLK_SYSREG, "sysreg", "aclk100", E4210_GATE_IP_PERIR, 0,
|
||||||
CLK_IGNORE_UNUSED, 0),
|
CLK_IGNORE_UNUSED, 0),
|
||||||
GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk100", E4210_GATE_IP_PERIR, 11, 0,
|
GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk100", E4210_GATE_IP_PERIR, 11, 0,
|
||||||
|
@ -1113,7 +1113,7 @@ static const struct samsung_gate_clock exynos4x12_gate_clks[] __initconst = {
|
||||||
0),
|
0),
|
||||||
GATE(CLK_TSADC, "tsadc", "aclk133", E4X12_GATE_BUS_FSYS1, 16, 0, 0),
|
GATE(CLK_TSADC, "tsadc", "aclk133", E4X12_GATE_BUS_FSYS1, 16, 0, 0),
|
||||||
GATE(CLK_MIPI_HSI, "mipi_hsi", "aclk133", GATE_IP_FSYS, 10, 0, 0),
|
GATE(CLK_MIPI_HSI, "mipi_hsi", "aclk133", GATE_IP_FSYS, 10, 0, 0),
|
||||||
GATE(CLK_CHIPID, "chipid", "aclk100", E4X12_GATE_IP_PERIR, 0, 0, 0),
|
GATE(CLK_CHIPID, "chipid", "aclk100", E4X12_GATE_IP_PERIR, 0, CLK_IGNORE_UNUSED, 0),
|
||||||
GATE(CLK_SYSREG, "sysreg", "aclk100", E4X12_GATE_IP_PERIR, 1,
|
GATE(CLK_SYSREG, "sysreg", "aclk100", E4X12_GATE_IP_PERIR, 1,
|
||||||
CLK_IGNORE_UNUSED, 0),
|
CLK_IGNORE_UNUSED, 0),
|
||||||
GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk100", E4X12_GATE_IP_PERIR, 11, 0,
|
GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk100", E4X12_GATE_IP_PERIR, 11, 0,
|
||||||
|
|
|
@ -38,7 +38,9 @@ static unsigned long clk_pll_recalc_rate(struct clk_hw *hwclk,
|
||||||
/* read VCO1 reg for numerator and denominator */
|
/* read VCO1 reg for numerator and denominator */
|
||||||
reg = readl(socfpgaclk->hw.reg);
|
reg = readl(socfpgaclk->hw.reg);
|
||||||
refdiv = (reg & SOCFPGA_PLL_REFDIV_MASK) >> SOCFPGA_PLL_REFDIV_SHIFT;
|
refdiv = (reg & SOCFPGA_PLL_REFDIV_MASK) >> SOCFPGA_PLL_REFDIV_SHIFT;
|
||||||
vco_freq = (unsigned long long)parent_rate / refdiv;
|
|
||||||
|
vco_freq = parent_rate;
|
||||||
|
do_div(vco_freq, refdiv);
|
||||||
|
|
||||||
/* Read mdiv and fdiv from the fdbck register */
|
/* Read mdiv and fdiv from the fdbck register */
|
||||||
reg = readl(socfpgaclk->hw.reg + 0x4);
|
reg = readl(socfpgaclk->hw.reg + 0x4);
|
||||||
|
|
|
@ -107,7 +107,7 @@ static const struct stratix10_perip_cnt_clock s10_main_perip_cnt_clks[] = {
|
||||||
{ STRATIX10_EMAC_B_FREE_CLK, "emacb_free_clk", NULL, emacb_free_mux, ARRAY_SIZE(emacb_free_mux),
|
{ STRATIX10_EMAC_B_FREE_CLK, "emacb_free_clk", NULL, emacb_free_mux, ARRAY_SIZE(emacb_free_mux),
|
||||||
0, 0, 2, 0xB0, 1},
|
0, 0, 2, 0xB0, 1},
|
||||||
{ STRATIX10_EMAC_PTP_FREE_CLK, "emac_ptp_free_clk", NULL, emac_ptp_free_mux,
|
{ STRATIX10_EMAC_PTP_FREE_CLK, "emac_ptp_free_clk", NULL, emac_ptp_free_mux,
|
||||||
ARRAY_SIZE(emac_ptp_free_mux), 0, 0, 4, 0xB0, 2},
|
ARRAY_SIZE(emac_ptp_free_mux), 0, 0, 2, 0xB0, 2},
|
||||||
{ STRATIX10_GPIO_DB_FREE_CLK, "gpio_db_free_clk", NULL, gpio_db_free_mux,
|
{ STRATIX10_GPIO_DB_FREE_CLK, "gpio_db_free_clk", NULL, gpio_db_free_mux,
|
||||||
ARRAY_SIZE(gpio_db_free_mux), 0, 0, 0, 0xB0, 3},
|
ARRAY_SIZE(gpio_db_free_mux), 0, 0, 0, 0xB0, 3},
|
||||||
{ STRATIX10_SDMMC_FREE_CLK, "sdmmc_free_clk", NULL, sdmmc_free_mux,
|
{ STRATIX10_SDMMC_FREE_CLK, "sdmmc_free_clk", NULL, sdmmc_free_mux,
|
||||||
|
|
|
@ -193,15 +193,8 @@ static const char *ti_adpll_clk_get_name(struct ti_adpll_data *d,
|
||||||
if (err)
|
if (err)
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} else {
|
||||||
const char *base_name = "adpll";
|
name = devm_kasprintf(d->dev, GFP_KERNEL, "%08lx.adpll.%s",
|
||||||
char *buf;
|
d->pa, postfix);
|
||||||
|
|
||||||
buf = devm_kzalloc(d->dev, 8 + 1 + strlen(base_name) + 1 +
|
|
||||||
strlen(postfix), GFP_KERNEL);
|
|
||||||
if (!buf)
|
|
||||||
return NULL;
|
|
||||||
sprintf(buf, "%08lx.%s.%s", d->pa, base_name, postfix);
|
|
||||||
name = buf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
|
|
|
@ -169,7 +169,7 @@ static int __init h8300_8timer_init(struct device_node *node)
|
||||||
return PTR_ERR(clk);
|
return PTR_ERR(clk);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ENXIO;
|
ret = -ENXIO;
|
||||||
base = of_iomap(node, 0);
|
base = of_iomap(node, 0);
|
||||||
if (!base) {
|
if (!base) {
|
||||||
pr_err("failed to map registers for clockevent\n");
|
pr_err("failed to map registers for clockevent\n");
|
||||||
|
|
|
@ -903,6 +903,7 @@ static struct notifier_block powernv_cpufreq_reboot_nb = {
|
||||||
void powernv_cpufreq_work_fn(struct work_struct *work)
|
void powernv_cpufreq_work_fn(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct chip *chip = container_of(work, struct chip, throttle);
|
struct chip *chip = container_of(work, struct chip, throttle);
|
||||||
|
struct cpufreq_policy *policy;
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
cpumask_t mask;
|
cpumask_t mask;
|
||||||
|
|
||||||
|
@ -917,12 +918,14 @@ void powernv_cpufreq_work_fn(struct work_struct *work)
|
||||||
chip->restore = false;
|
chip->restore = false;
|
||||||
for_each_cpu(cpu, &mask) {
|
for_each_cpu(cpu, &mask) {
|
||||||
int index;
|
int index;
|
||||||
struct cpufreq_policy policy;
|
|
||||||
|
|
||||||
cpufreq_get_policy(&policy, cpu);
|
policy = cpufreq_cpu_get(cpu);
|
||||||
index = cpufreq_table_find_index_c(&policy, policy.cur);
|
if (!policy)
|
||||||
powernv_cpufreq_target_index(&policy, index);
|
continue;
|
||||||
cpumask_andnot(&mask, &mask, policy.cpus);
|
index = cpufreq_table_find_index_c(policy, policy->cur);
|
||||||
|
powernv_cpufreq_target_index(policy, index);
|
||||||
|
cpumask_andnot(&mask, &mask, policy->cpus);
|
||||||
|
cpufreq_cpu_put(policy);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
put_online_cpus();
|
put_online_cpus();
|
||||||
|
|
|
@ -2980,7 +2980,6 @@ static int aead_gcm_ccm_setkey(struct crypto_aead *cipher,
|
||||||
|
|
||||||
ctx->enckeylen = keylen;
|
ctx->enckeylen = keylen;
|
||||||
ctx->authkeylen = 0;
|
ctx->authkeylen = 0;
|
||||||
memcpy(ctx->enckey, key, ctx->enckeylen);
|
|
||||||
|
|
||||||
switch (ctx->enckeylen) {
|
switch (ctx->enckeylen) {
|
||||||
case AES_KEYSIZE_128:
|
case AES_KEYSIZE_128:
|
||||||
|
@ -2996,6 +2995,8 @@ static int aead_gcm_ccm_setkey(struct crypto_aead *cipher,
|
||||||
goto badkey;
|
goto badkey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memcpy(ctx->enckey, key, ctx->enckeylen);
|
||||||
|
|
||||||
flow_log(" enckeylen:%u authkeylen:%u\n", ctx->enckeylen,
|
flow_log(" enckeylen:%u authkeylen:%u\n", ctx->enckeylen,
|
||||||
ctx->authkeylen);
|
ctx->authkeylen);
|
||||||
flow_dump(" enc: ", ctx->enckey, ctx->enckeylen);
|
flow_dump(" enc: ", ctx->enckey, ctx->enckeylen);
|
||||||
|
@ -3056,6 +3057,10 @@ static int aead_gcm_esp_setkey(struct crypto_aead *cipher,
|
||||||
struct iproc_ctx_s *ctx = crypto_aead_ctx(cipher);
|
struct iproc_ctx_s *ctx = crypto_aead_ctx(cipher);
|
||||||
|
|
||||||
flow_log("%s\n", __func__);
|
flow_log("%s\n", __func__);
|
||||||
|
|
||||||
|
if (keylen < GCM_ESP_SALT_SIZE)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ctx->salt_len = GCM_ESP_SALT_SIZE;
|
ctx->salt_len = GCM_ESP_SALT_SIZE;
|
||||||
ctx->salt_offset = GCM_ESP_SALT_OFFSET;
|
ctx->salt_offset = GCM_ESP_SALT_OFFSET;
|
||||||
memcpy(ctx->salt, key + keylen - GCM_ESP_SALT_SIZE, GCM_ESP_SALT_SIZE);
|
memcpy(ctx->salt, key + keylen - GCM_ESP_SALT_SIZE, GCM_ESP_SALT_SIZE);
|
||||||
|
@ -3084,6 +3089,10 @@ static int rfc4543_gcm_esp_setkey(struct crypto_aead *cipher,
|
||||||
struct iproc_ctx_s *ctx = crypto_aead_ctx(cipher);
|
struct iproc_ctx_s *ctx = crypto_aead_ctx(cipher);
|
||||||
|
|
||||||
flow_log("%s\n", __func__);
|
flow_log("%s\n", __func__);
|
||||||
|
|
||||||
|
if (keylen < GCM_ESP_SALT_SIZE)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ctx->salt_len = GCM_ESP_SALT_SIZE;
|
ctx->salt_len = GCM_ESP_SALT_SIZE;
|
||||||
ctx->salt_offset = GCM_ESP_SALT_OFFSET;
|
ctx->salt_offset = GCM_ESP_SALT_OFFSET;
|
||||||
memcpy(ctx->salt, key + keylen - GCM_ESP_SALT_SIZE, GCM_ESP_SALT_SIZE);
|
memcpy(ctx->salt, key + keylen - GCM_ESP_SALT_SIZE, GCM_ESP_SALT_SIZE);
|
||||||
|
@ -3113,6 +3122,10 @@ static int aead_ccm_esp_setkey(struct crypto_aead *cipher,
|
||||||
struct iproc_ctx_s *ctx = crypto_aead_ctx(cipher);
|
struct iproc_ctx_s *ctx = crypto_aead_ctx(cipher);
|
||||||
|
|
||||||
flow_log("%s\n", __func__);
|
flow_log("%s\n", __func__);
|
||||||
|
|
||||||
|
if (keylen < CCM_ESP_SALT_SIZE)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ctx->salt_len = CCM_ESP_SALT_SIZE;
|
ctx->salt_len = CCM_ESP_SALT_SIZE;
|
||||||
ctx->salt_offset = CCM_ESP_SALT_OFFSET;
|
ctx->salt_offset = CCM_ESP_SALT_OFFSET;
|
||||||
memcpy(ctx->salt, key + keylen - CCM_ESP_SALT_SIZE, CCM_ESP_SALT_SIZE);
|
memcpy(ctx->salt, key + keylen - CCM_ESP_SALT_SIZE, CCM_ESP_SALT_SIZE);
|
||||||
|
|
|
@ -2419,8 +2419,9 @@ int chcr_aead_dma_map(struct device *dev,
|
||||||
else
|
else
|
||||||
reqctx->b0_dma = 0;
|
reqctx->b0_dma = 0;
|
||||||
if (req->src == req->dst) {
|
if (req->src == req->dst) {
|
||||||
error = dma_map_sg(dev, req->src, sg_nents(req->src),
|
error = dma_map_sg(dev, req->src,
|
||||||
DMA_BIDIRECTIONAL);
|
sg_nents_for_len(req->src, dst_size),
|
||||||
|
DMA_BIDIRECTIONAL);
|
||||||
if (!error)
|
if (!error)
|
||||||
goto err;
|
goto err;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1449,7 +1449,7 @@ static int chtls_pt_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
csk->wr_max_credits))
|
csk->wr_max_credits))
|
||||||
sk->sk_write_space(sk);
|
sk->sk_write_space(sk);
|
||||||
|
|
||||||
if (copied >= target && !sk->sk_backlog.tail)
|
if (copied >= target && !READ_ONCE(sk->sk_backlog.tail))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (copied) {
|
if (copied) {
|
||||||
|
@ -1482,7 +1482,7 @@ static int chtls_pt_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sk->sk_backlog.tail) {
|
if (READ_ONCE(sk->sk_backlog.tail)) {
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
chtls_cleanup_rbuf(sk, copied);
|
chtls_cleanup_rbuf(sk, copied);
|
||||||
|
@ -1627,7 +1627,7 @@ static int peekmsg(struct sock *sk, struct msghdr *msg,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sk->sk_backlog.tail) {
|
if (READ_ONCE(sk->sk_backlog.tail)) {
|
||||||
/* Do not sleep, just process backlog. */
|
/* Do not sleep, just process backlog. */
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
|
@ -1759,7 +1759,7 @@ int chtls_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
csk->wr_max_credits))
|
csk->wr_max_credits))
|
||||||
sk->sk_write_space(sk);
|
sk->sk_write_space(sk);
|
||||||
|
|
||||||
if (copied >= target && !sk->sk_backlog.tail)
|
if (copied >= target && !READ_ONCE(sk->sk_backlog.tail))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (copied) {
|
if (copied) {
|
||||||
|
@ -1790,7 +1790,7 @@ int chtls_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sk->sk_backlog.tail) {
|
if (READ_ONCE(sk->sk_backlog.tail)) {
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
chtls_cleanup_rbuf(sk, copied);
|
chtls_cleanup_rbuf(sk, copied);
|
||||||
|
|
|
@ -828,6 +828,11 @@ static int qat_alg_aead_dec(struct aead_request *areq)
|
||||||
struct icp_qat_fw_la_bulk_req *msg;
|
struct icp_qat_fw_la_bulk_req *msg;
|
||||||
int digst_size = crypto_aead_authsize(aead_tfm);
|
int digst_size = crypto_aead_authsize(aead_tfm);
|
||||||
int ret, ctr = 0;
|
int ret, ctr = 0;
|
||||||
|
u32 cipher_len;
|
||||||
|
|
||||||
|
cipher_len = areq->cryptlen - digst_size;
|
||||||
|
if (cipher_len % AES_BLOCK_SIZE != 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ret = qat_alg_sgl_to_bufl(ctx->inst, areq->src, areq->dst, qat_req);
|
ret = qat_alg_sgl_to_bufl(ctx->inst, areq->src, areq->dst, qat_req);
|
||||||
if (unlikely(ret))
|
if (unlikely(ret))
|
||||||
|
@ -842,7 +847,7 @@ static int qat_alg_aead_dec(struct aead_request *areq)
|
||||||
qat_req->req.comn_mid.src_data_addr = qat_req->buf.blp;
|
qat_req->req.comn_mid.src_data_addr = qat_req->buf.blp;
|
||||||
qat_req->req.comn_mid.dest_data_addr = qat_req->buf.bloutp;
|
qat_req->req.comn_mid.dest_data_addr = qat_req->buf.bloutp;
|
||||||
cipher_param = (void *)&qat_req->req.serv_specif_rqpars;
|
cipher_param = (void *)&qat_req->req.serv_specif_rqpars;
|
||||||
cipher_param->cipher_length = areq->cryptlen - digst_size;
|
cipher_param->cipher_length = cipher_len;
|
||||||
cipher_param->cipher_offset = areq->assoclen;
|
cipher_param->cipher_offset = areq->assoclen;
|
||||||
memcpy(cipher_param->u.cipher_IV_array, areq->iv, AES_BLOCK_SIZE);
|
memcpy(cipher_param->u.cipher_IV_array, areq->iv, AES_BLOCK_SIZE);
|
||||||
auth_param = (void *)((uint8_t *)cipher_param + sizeof(*cipher_param));
|
auth_param = (void *)((uint8_t *)cipher_param + sizeof(*cipher_param));
|
||||||
|
@ -871,6 +876,9 @@ static int qat_alg_aead_enc(struct aead_request *areq)
|
||||||
uint8_t *iv = areq->iv;
|
uint8_t *iv = areq->iv;
|
||||||
int ret, ctr = 0;
|
int ret, ctr = 0;
|
||||||
|
|
||||||
|
if (areq->cryptlen % AES_BLOCK_SIZE != 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ret = qat_alg_sgl_to_bufl(ctx->inst, areq->src, areq->dst, qat_req);
|
ret = qat_alg_sgl_to_bufl(ctx->inst, areq->src, areq->dst, qat_req);
|
||||||
if (unlikely(ret))
|
if (unlikely(ret))
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -80,6 +80,8 @@
|
||||||
|
|
||||||
#define KHZ 1000
|
#define KHZ 1000
|
||||||
|
|
||||||
|
#define KHZ_MAX (ULONG_MAX / KHZ)
|
||||||
|
|
||||||
/* Assume that the bus is saturated if the utilization is 25% */
|
/* Assume that the bus is saturated if the utilization is 25% */
|
||||||
#define BUS_SATURATION_RATIO 25
|
#define BUS_SATURATION_RATIO 25
|
||||||
|
|
||||||
|
@ -180,7 +182,7 @@ struct tegra_actmon_emc_ratio {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct tegra_actmon_emc_ratio actmon_emc_ratios[] = {
|
static struct tegra_actmon_emc_ratio actmon_emc_ratios[] = {
|
||||||
{ 1400000, ULONG_MAX },
|
{ 1400000, KHZ_MAX },
|
||||||
{ 1200000, 750000 },
|
{ 1200000, 750000 },
|
||||||
{ 1100000, 600000 },
|
{ 1100000, 600000 },
|
||||||
{ 1000000, 500000 },
|
{ 1000000, 500000 },
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue