mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 05:55:44 +02:00
Linux 5.11-rc5
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAmAOFRIeHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiG4lcH/jFAG+AXR6T2K3dG adJmdAWQKdDj71Ruoyefx5GSbD0B+rM1UcxOQgmZem2127RJgfDBBVYyjSwh7H1F LRJdN6+NKReL2OW/HMnufvpVMvWICTWHInyvsqKqp+Yo4GC5z46OtsmzSayYgTaP v2G9auC/rSUlzmQux9EAbTKDeNGMum3dt2rfsmnIDymBSHoPbizXF93/2hoo9jwx BZQCq0nYBCa9pEdsmgvqKkb/Y5+CSFoe02qdUZFIuwh6qd/XPfeDPSu4O3z4J9g6 x8G+f7doeU0nzsAP+K0lG7ulAygxRHm5Bn2rwVdlYfihAuPNyF+Ua3duxBvjOBEY 7w/UQ64= =ZWS9 -----END PGP SIGNATURE----- Merge v5.11-rc5 into android-mainline Linux 5.11-rc5 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I779e8036e716416924f47e985d89ffe72e75dafc
This commit is contained in:
commit
64efebc63c
|
|
@ -5,8 +5,8 @@ Description:
|
|||
Provide a place in sysfs for the device link objects in the
|
||||
kernel at any given time. The name of a device link directory,
|
||||
denoted as ... above, is of the form <supplier>--<consumer>
|
||||
where <supplier> is the supplier device name and <consumer> is
|
||||
the consumer device name.
|
||||
where <supplier> is the supplier bus:device name and <consumer>
|
||||
is the consumer bus:device name.
|
||||
|
||||
What: /sys/class/devlink/.../auto_remove_on
|
||||
Date: May 2020
|
||||
|
|
|
|||
|
|
@ -4,5 +4,6 @@ Contact: Saravana Kannan <saravanak@google.com>
|
|||
Description:
|
||||
The /sys/devices/.../consumer:<consumer> are symlinks to device
|
||||
links where this device is the supplier. <consumer> denotes the
|
||||
name of the consumer in that device link. There can be zero or
|
||||
more of these symlinks for a given device.
|
||||
name of the consumer in that device link and is of the form
|
||||
bus:device name. There can be zero or more of these symlinks
|
||||
for a given device.
|
||||
|
|
|
|||
|
|
@ -4,5 +4,6 @@ Contact: Saravana Kannan <saravanak@google.com>
|
|||
Description:
|
||||
The /sys/devices/.../supplier:<supplier> are symlinks to device
|
||||
links where this device is the consumer. <supplier> denotes the
|
||||
name of the supplier in that device link. There can be zero or
|
||||
more of these symlinks for a given device.
|
||||
name of the supplier in that device link and is of the form
|
||||
bus:device name. There can be zero or more of these symlinks
|
||||
for a given device.
|
||||
|
|
|
|||
|
|
@ -160,29 +160,14 @@ intended for use in production as a security mitigation. Therefore it supports
|
|||
boot parameters that allow to disable KASAN competely or otherwise control
|
||||
particular KASAN features.
|
||||
|
||||
The things that can be controlled are:
|
||||
- ``kasan=off`` or ``=on`` controls whether KASAN is enabled (default: ``on``).
|
||||
|
||||
1. Whether KASAN is enabled at all.
|
||||
2. Whether KASAN collects and saves alloc/free stacks.
|
||||
3. Whether KASAN panics on a detected bug or not.
|
||||
- ``kasan.stacktrace=off`` or ``=on`` disables or enables alloc and free stack
|
||||
traces collection (default: ``on`` for ``CONFIG_DEBUG_KERNEL=y``, otherwise
|
||||
``off``).
|
||||
|
||||
The ``kasan.mode`` boot parameter allows to choose one of three main modes:
|
||||
|
||||
- ``kasan.mode=off`` - KASAN is disabled, no tag checks are performed
|
||||
- ``kasan.mode=prod`` - only essential production features are enabled
|
||||
- ``kasan.mode=full`` - all KASAN features are enabled
|
||||
|
||||
The chosen mode provides default control values for the features mentioned
|
||||
above. However it's also possible to override the default values by providing:
|
||||
|
||||
- ``kasan.stacktrace=off`` or ``=on`` - enable alloc/free stack collection
|
||||
(default: ``on`` for ``mode=full``,
|
||||
otherwise ``off``)
|
||||
- ``kasan.fault=report`` or ``=panic`` - only print KASAN report or also panic
|
||||
(default: ``report``)
|
||||
|
||||
If ``kasan.mode`` parameter is not provided, it defaults to ``full`` when
|
||||
``CONFIG_DEBUG_KERNEL`` is enabled, and to ``prod`` otherwise.
|
||||
- ``kasan.fault=report`` or ``=panic`` controls whether to only print a KASAN
|
||||
report or also panic the kernel (default: ``report``).
|
||||
|
||||
For developers
|
||||
~~~~~~~~~~~~~~
|
||||
|
|
|
|||
|
|
@ -16,8 +16,8 @@ description:
|
|||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- bosch,bmc150
|
||||
- bosch,bmi055
|
||||
- bosch,bmc150_accel
|
||||
- bosch,bmi055_accel
|
||||
- bosch,bma255
|
||||
- bosch,bma250e
|
||||
- bosch,bma222
|
||||
|
|
|
|||
|
|
@ -3879,7 +3879,7 @@ F: Documentation/devicetree/bindings/mtd/cadence-nand-controller.txt
|
|||
F: drivers/mtd/nand/raw/cadence-nand-controller.c
|
||||
|
||||
CADENCE USB3 DRD IP DRIVER
|
||||
M: Peter Chen <peter.chen@nxp.com>
|
||||
M: Peter Chen <peter.chen@kernel.org>
|
||||
M: Pawel Laszczak <pawell@cadence.com>
|
||||
R: Roger Quadros <rogerq@kernel.org>
|
||||
R: Aswath Govindraju <a-govindraju@ti.com>
|
||||
|
|
@ -4161,7 +4161,7 @@ S: Maintained
|
|||
F: Documentation/translations/zh_CN/
|
||||
|
||||
CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER
|
||||
M: Peter Chen <Peter.Chen@nxp.com>
|
||||
M: Peter Chen <peter.chen@kernel.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git
|
||||
|
|
@ -4311,7 +4311,9 @@ W: https://clangbuiltlinux.github.io/
|
|||
B: https://github.com/ClangBuiltLinux/linux/issues
|
||||
C: irc://chat.freenode.net/clangbuiltlinux
|
||||
F: Documentation/kbuild/llvm.rst
|
||||
F: include/linux/compiler-clang.h
|
||||
F: scripts/clang-tools/
|
||||
F: scripts/clang-version.sh
|
||||
F: scripts/lld-version.sh
|
||||
K: \b(?i:clang|llvm)\b
|
||||
|
||||
|
|
@ -18433,7 +18435,7 @@ F: Documentation/usb/ohci.rst
|
|||
F: drivers/usb/host/ohci*
|
||||
|
||||
USB OTG FSM (Finite State Machine)
|
||||
M: Peter Chen <Peter.Chen@nxp.com>
|
||||
M: Peter Chen <peter.chen@kernel.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -2,7 +2,7 @@
|
|||
VERSION = 5
|
||||
PATCHLEVEL = 11
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ extern void kmap_flush_tlb(unsigned long addr);
|
|||
|
||||
#define flush_cache_kmaps() BUG_ON(cpu_has_dc_aliases)
|
||||
|
||||
#define arch_kmap_local_set_pte(mm, vaddr, ptep, ptev) set_pte(ptep, ptev)
|
||||
#define arch_kmap_local_post_map(vaddr, pteval) local_flush_tlb_one(vaddr)
|
||||
#define arch_kmap_local_post_unmap(vaddr) local_flush_tlb_one(vaddr)
|
||||
|
||||
|
|
|
|||
|
|
@ -63,6 +63,12 @@
|
|||
nop; \
|
||||
nop;
|
||||
|
||||
#define SCV_ENTRY_FLUSH_SLOT \
|
||||
SCV_ENTRY_FLUSH_FIXUP_SECTION; \
|
||||
nop; \
|
||||
nop; \
|
||||
nop;
|
||||
|
||||
/*
|
||||
* r10 must be free to use, r13 must be paca
|
||||
*/
|
||||
|
|
@ -70,6 +76,13 @@
|
|||
STF_ENTRY_BARRIER_SLOT; \
|
||||
ENTRY_FLUSH_SLOT
|
||||
|
||||
/*
|
||||
* r10, ctr must be free to use, r13 must be paca
|
||||
*/
|
||||
#define SCV_INTERRUPT_TO_KERNEL \
|
||||
STF_ENTRY_BARRIER_SLOT; \
|
||||
SCV_ENTRY_FLUSH_SLOT
|
||||
|
||||
/*
|
||||
* Macros for annotating the expected destination of (h)rfid
|
||||
*
|
||||
|
|
|
|||
|
|
@ -240,6 +240,14 @@ label##3: \
|
|||
FTR_ENTRY_OFFSET 957b-958b; \
|
||||
.popsection;
|
||||
|
||||
#define SCV_ENTRY_FLUSH_FIXUP_SECTION \
|
||||
957: \
|
||||
.pushsection __scv_entry_flush_fixup,"a"; \
|
||||
.align 2; \
|
||||
958: \
|
||||
FTR_ENTRY_OFFSET 957b-958b; \
|
||||
.popsection;
|
||||
|
||||
#define RFI_FLUSH_FIXUP_SECTION \
|
||||
951: \
|
||||
.pushsection __rfi_flush_fixup,"a"; \
|
||||
|
|
@ -273,10 +281,12 @@ label##3: \
|
|||
|
||||
extern long stf_barrier_fallback;
|
||||
extern long entry_flush_fallback;
|
||||
extern long scv_entry_flush_fallback;
|
||||
extern long __start___stf_entry_barrier_fixup, __stop___stf_entry_barrier_fixup;
|
||||
extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup;
|
||||
extern long __start___uaccess_flush_fixup, __stop___uaccess_flush_fixup;
|
||||
extern long __start___entry_flush_fixup, __stop___entry_flush_fixup;
|
||||
extern long __start___scv_entry_flush_fixup, __stop___scv_entry_flush_fixup;
|
||||
extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup;
|
||||
extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup;
|
||||
extern long __start__btb_flush_fixup, __stop__btb_flush_fixup;
|
||||
|
|
|
|||
|
|
@ -58,6 +58,8 @@ extern pte_t *pkmap_page_table;
|
|||
|
||||
#define flush_cache_kmaps() flush_cache_all()
|
||||
|
||||
#define arch_kmap_local_set_pte(mm, vaddr, ptep, ptev) \
|
||||
__set_pte_at(mm, vaddr, ptep, ptev, 1)
|
||||
#define arch_kmap_local_post_map(vaddr, pteval) \
|
||||
local_flush_tlb_page(NULL, vaddr)
|
||||
#define arch_kmap_local_post_unmap(vaddr) \
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ BEGIN_FTR_SECTION
|
|||
bne .Ltabort_syscall
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_TM)
|
||||
#endif
|
||||
INTERRUPT_TO_KERNEL
|
||||
SCV_INTERRUPT_TO_KERNEL
|
||||
mr r10,r1
|
||||
ld r1,PACAKSAVE(r13)
|
||||
std r10,0(r1)
|
||||
|
|
|
|||
|
|
@ -2993,6 +2993,25 @@ TRAMP_REAL_BEGIN(entry_flush_fallback)
|
|||
ld r11,PACA_EXRFI+EX_R11(r13)
|
||||
blr
|
||||
|
||||
/*
|
||||
* The SCV entry flush happens with interrupts enabled, so it must disable
|
||||
* to prevent EXRFI being clobbered by NMIs (e.g., soft_nmi_common). r10
|
||||
* (containing LR) does not need to be preserved here because scv entry
|
||||
* puts 0 in the pt_regs, CTR can be clobbered for the same reason.
|
||||
*/
|
||||
TRAMP_REAL_BEGIN(scv_entry_flush_fallback)
|
||||
li r10,0
|
||||
mtmsrd r10,1
|
||||
lbz r10,PACAIRQHAPPENED(r13)
|
||||
ori r10,r10,PACA_IRQ_HARD_DIS
|
||||
stb r10,PACAIRQHAPPENED(r13)
|
||||
std r11,PACA_EXRFI+EX_R11(r13)
|
||||
L1D_DISPLACEMENT_FLUSH
|
||||
ld r11,PACA_EXRFI+EX_R11(r13)
|
||||
li r10,MSR_RI
|
||||
mtmsrd r10,1
|
||||
blr
|
||||
|
||||
TRAMP_REAL_BEGIN(rfi_flush_fallback)
|
||||
SET_SCRATCH0(r13);
|
||||
GET_PACA(r13);
|
||||
|
|
|
|||
|
|
@ -145,6 +145,13 @@ SECTIONS
|
|||
__stop___entry_flush_fixup = .;
|
||||
}
|
||||
|
||||
. = ALIGN(8);
|
||||
__scv_entry_flush_fixup : AT(ADDR(__scv_entry_flush_fixup) - LOAD_OFFSET) {
|
||||
__start___scv_entry_flush_fixup = .;
|
||||
*(__scv_entry_flush_fixup)
|
||||
__stop___scv_entry_flush_fixup = .;
|
||||
}
|
||||
|
||||
. = ALIGN(8);
|
||||
__stf_exit_barrier_fixup : AT(ADDR(__stf_exit_barrier_fixup) - LOAD_OFFSET) {
|
||||
__start___stf_exit_barrier_fixup = .;
|
||||
|
|
|
|||
|
|
@ -290,9 +290,6 @@ void do_entry_flush_fixups(enum l1d_flush_type types)
|
|||
long *start, *end;
|
||||
int i;
|
||||
|
||||
start = PTRRELOC(&__start___entry_flush_fixup);
|
||||
end = PTRRELOC(&__stop___entry_flush_fixup);
|
||||
|
||||
instrs[0] = 0x60000000; /* nop */
|
||||
instrs[1] = 0x60000000; /* nop */
|
||||
instrs[2] = 0x60000000; /* nop */
|
||||
|
|
@ -312,6 +309,8 @@ void do_entry_flush_fixups(enum l1d_flush_type types)
|
|||
if (types & L1D_FLUSH_MTTRIG)
|
||||
instrs[i++] = 0x7c12dba6; /* mtspr TRIG2,r0 (SPR #882) */
|
||||
|
||||
start = PTRRELOC(&__start___entry_flush_fixup);
|
||||
end = PTRRELOC(&__stop___entry_flush_fixup);
|
||||
for (i = 0; start < end; start++, i++) {
|
||||
dest = (void *)start + *start;
|
||||
|
||||
|
|
@ -328,6 +327,25 @@ void do_entry_flush_fixups(enum l1d_flush_type types)
|
|||
patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
|
||||
}
|
||||
|
||||
start = PTRRELOC(&__start___scv_entry_flush_fixup);
|
||||
end = PTRRELOC(&__stop___scv_entry_flush_fixup);
|
||||
for (; start < end; start++, i++) {
|
||||
dest = (void *)start + *start;
|
||||
|
||||
pr_devel("patching dest %lx\n", (unsigned long)dest);
|
||||
|
||||
patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
|
||||
|
||||
if (types == L1D_FLUSH_FALLBACK)
|
||||
patch_branch((struct ppc_inst *)(dest + 1), (unsigned long)&scv_entry_flush_fallback,
|
||||
BRANCH_SET_LINK);
|
||||
else
|
||||
patch_instruction((struct ppc_inst *)(dest + 1), ppc_inst(instrs[1]));
|
||||
|
||||
patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
|
||||
}
|
||||
|
||||
|
||||
printk(KERN_DEBUG "entry-flush: patched %d locations (%s flush)\n", i,
|
||||
(types == L1D_FLUSH_NONE) ? "no" :
|
||||
(types == L1D_FLUSH_FALLBACK) ? "fallback displacement" :
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@ config SUPERH
|
|||
select HAVE_ARCH_KGDB
|
||||
select HAVE_ARCH_SECCOMP_FILTER
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_COPY_THREAD_TLS
|
||||
select HAVE_DEBUG_BUGVERBOSE
|
||||
select HAVE_DEBUG_KMEMLEAK
|
||||
select HAVE_DYNAMIC_FTRACE
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/rtc.h>
|
||||
|
|
|
|||
|
|
@ -27,13 +27,12 @@ CONFIG_NETFILTER=y
|
|||
CONFIG_ATALK=m
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_BLK_DEV_OFFBOARD=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_AEC62XX=y
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_PATA_ATP867X=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=m
|
||||
|
|
|
|||
|
|
@ -20,8 +20,6 @@ CONFIG_IP_PNP=y
|
|||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_FW_LOADER is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_SMC91X=y
|
||||
|
|
|
|||
|
|
@ -44,16 +44,14 @@ CONFIG_NET_SCHED=y
|
|||
CONFIG_PARPORT=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_BLK_DEV_PLATFORM=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_SPI_ATTRS=y
|
||||
CONFIG_SCSI_FC_ATTRS=y
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_PATA_PLATFORM=y
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_DM=y
|
||||
CONFIG_NETDEVICES=y
|
||||
|
|
|
|||
|
|
@ -116,9 +116,6 @@ CONFIG_MTD_UBI_GLUEBI=m
|
|||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_BLK_DEV_PLATFORM=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@ CONFIG_MTD_BLOCK=y
|
|||
CONFIG_MTD_CFI=y
|
||||
CONFIG_MTD_CFI_AMDSTD=y
|
||||
CONFIG_MTD_ROM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
|
|
|
|||
|
|
@ -39,9 +39,6 @@ CONFIG_IP_PNP_RARP=y
|
|||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_NBD=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=m
|
||||
CONFIG_BLK_DEV_IDETAPE=m
|
||||
CONFIG_SCSI=m
|
||||
CONFIG_BLK_DEV_SD=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
|
|
|
|||
|
|
@ -63,8 +63,7 @@ config PVR2_DMA
|
|||
|
||||
config G2_DMA
|
||||
tristate "G2 Bus DMA support"
|
||||
depends on SH_DREAMCAST
|
||||
select SH_DMA_API
|
||||
depends on SH_DREAMCAST && SH_DMA_API
|
||||
help
|
||||
This enables support for the DMA controller for the Dreamcast's
|
||||
G2 bus. Drivers that want this will generally enable this on
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@
|
|||
#include <cpu/gpio.h>
|
||||
#endif
|
||||
|
||||
#define ARCH_NR_GPIOS 512
|
||||
#include <asm-generic/gpio.h>
|
||||
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@
|
|||
#include <cpu/mmu_context.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/thread_info.h>
|
||||
|
||||
! NOTE:
|
||||
! GNU as (as of 2.9.1) changes bf/s into bt/s and bra, when the address
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ config VSYSCALL
|
|||
(the default value) say Y.
|
||||
|
||||
config NUMA
|
||||
bool "Non Uniform Memory Access (NUMA) Support"
|
||||
bool "Non-Uniform Memory Access (NUMA) Support"
|
||||
depends on MMU && SYS_SUPPORTS_NUMA
|
||||
select ARCH_WANT_NUMA_VARIABLE_LOCALITY
|
||||
default n
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
#include <asm/processor.h>
|
||||
#include <asm/mmu_context.h>
|
||||
|
||||
static int asids_seq_show(struct seq_file *file, void *iter)
|
||||
static int asids_debugfs_show(struct seq_file *file, void *iter)
|
||||
{
|
||||
struct task_struct *p;
|
||||
|
||||
|
|
@ -48,18 +48,7 @@ static int asids_seq_show(struct seq_file *file, void *iter)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int asids_debugfs_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, asids_seq_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations asids_debugfs_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = asids_debugfs_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
DEFINE_SHOW_ATTRIBUTE(asids_debugfs);
|
||||
|
||||
static int __init asids_debugfs_init(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ enum cache_type {
|
|||
CACHE_TYPE_UNIFIED,
|
||||
};
|
||||
|
||||
static int cache_seq_show(struct seq_file *file, void *iter)
|
||||
static int cache_debugfs_show(struct seq_file *file, void *iter)
|
||||
{
|
||||
unsigned int cache_type = (unsigned int)file->private;
|
||||
struct cache_info *cache;
|
||||
|
|
@ -94,18 +94,7 @@ static int cache_seq_show(struct seq_file *file, void *iter)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cache_debugfs_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, cache_seq_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations cache_debugfs_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = cache_debugfs_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
DEFINE_SHOW_ATTRIBUTE(cache_debugfs);
|
||||
|
||||
static int __init cache_debugfs_init(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -812,7 +812,7 @@ bool __in_29bit_mode(void)
|
|||
return (__raw_readl(PMB_PASCR) & PASCR_SE) == 0;
|
||||
}
|
||||
|
||||
static int pmb_seq_show(struct seq_file *file, void *iter)
|
||||
static int pmb_debugfs_show(struct seq_file *file, void *iter)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
@ -846,18 +846,7 @@ static int pmb_seq_show(struct seq_file *file, void *iter)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pmb_debugfs_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, pmb_seq_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations pmb_debugfs_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = pmb_debugfs_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
DEFINE_SHOW_ATTRIBUTE(pmb_debugfs);
|
||||
|
||||
static int __init pmb_debugfs_init(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -50,10 +50,11 @@ extern pte_t *pkmap_page_table;
|
|||
|
||||
#define flush_cache_kmaps() flush_cache_all()
|
||||
|
||||
/* FIXME: Use __flush_tlb_one(vaddr) instead of flush_cache_all() -- Anton */
|
||||
#define arch_kmap_local_post_map(vaddr, pteval) flush_cache_all()
|
||||
#define arch_kmap_local_post_unmap(vaddr) flush_cache_all()
|
||||
|
||||
/* FIXME: Use __flush_*_one(vaddr) instead of flush_*_all() -- Anton */
|
||||
#define arch_kmap_local_pre_map(vaddr, pteval) flush_cache_all()
|
||||
#define arch_kmap_local_pre_unmap(vaddr) flush_cache_all()
|
||||
#define arch_kmap_local_post_map(vaddr, pteval) flush_tlb_all()
|
||||
#define arch_kmap_local_post_unmap(vaddr) flush_tlb_all()
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
|
|
|||
|
|
@ -73,10 +73,8 @@ static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs,
|
|||
unsigned int nr)
|
||||
{
|
||||
if (likely(nr < IA32_NR_syscalls)) {
|
||||
instrumentation_begin();
|
||||
nr = array_index_nospec(nr, IA32_NR_syscalls);
|
||||
regs->ax = ia32_sys_call_table[nr](regs);
|
||||
instrumentation_end();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -91,8 +89,11 @@ __visible noinstr void do_int80_syscall_32(struct pt_regs *regs)
|
|||
* or may not be necessary, but it matches the old asm behavior.
|
||||
*/
|
||||
nr = (unsigned int)syscall_enter_from_user_mode(regs, nr);
|
||||
instrumentation_begin();
|
||||
|
||||
do_syscall_32_irqs_on(regs, nr);
|
||||
|
||||
instrumentation_end();
|
||||
syscall_exit_to_user_mode(regs);
|
||||
}
|
||||
|
||||
|
|
@ -121,11 +122,12 @@ static noinstr bool __do_fast_syscall_32(struct pt_regs *regs)
|
|||
res = get_user(*(u32 *)®s->bp,
|
||||
(u32 __user __force *)(unsigned long)(u32)regs->sp);
|
||||
}
|
||||
instrumentation_end();
|
||||
|
||||
if (res) {
|
||||
/* User code screwed up. */
|
||||
regs->ax = -EFAULT;
|
||||
|
||||
instrumentation_end();
|
||||
syscall_exit_to_user_mode(regs);
|
||||
return false;
|
||||
}
|
||||
|
|
@ -135,6 +137,8 @@ static noinstr bool __do_fast_syscall_32(struct pt_regs *regs)
|
|||
|
||||
/* Now this is just like a normal syscall. */
|
||||
do_syscall_32_irqs_on(regs, nr);
|
||||
|
||||
instrumentation_end();
|
||||
syscall_exit_to_user_mode(regs);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,14 +16,25 @@
|
|||
* Use kernel_fpu_begin/end() if you intend to use FPU in kernel context. It
|
||||
* disables preemption so be careful if you intend to use it for long periods
|
||||
* of time.
|
||||
* If you intend to use the FPU in softirq you need to check first with
|
||||
* If you intend to use the FPU in irq/softirq you need to check first with
|
||||
* irq_fpu_usable() if it is possible.
|
||||
*/
|
||||
extern void kernel_fpu_begin(void);
|
||||
|
||||
/* Kernel FPU states to initialize in kernel_fpu_begin_mask() */
|
||||
#define KFPU_387 _BITUL(0) /* 387 state will be initialized */
|
||||
#define KFPU_MXCSR _BITUL(1) /* MXCSR will be initialized */
|
||||
|
||||
extern void kernel_fpu_begin_mask(unsigned int kfpu_mask);
|
||||
extern void kernel_fpu_end(void);
|
||||
extern bool irq_fpu_usable(void);
|
||||
extern void fpregs_mark_activate(void);
|
||||
|
||||
/* Code that is unaware of kernel_fpu_begin_mask() can use this */
|
||||
static inline void kernel_fpu_begin(void)
|
||||
{
|
||||
kernel_fpu_begin_mask(KFPU_387 | KFPU_MXCSR);
|
||||
}
|
||||
|
||||
/*
|
||||
* Use fpregs_lock() while editing CPU's FPU registers or fpu->state.
|
||||
* A context switch will (and softirq might) save CPU's FPU registers to
|
||||
|
|
|
|||
|
|
@ -97,6 +97,7 @@
|
|||
|
||||
#define INTEL_FAM6_LAKEFIELD 0x8A
|
||||
#define INTEL_FAM6_ALDERLAKE 0x97
|
||||
#define INTEL_FAM6_ALDERLAKE_L 0x9A
|
||||
|
||||
/* "Small Core" Processors (Atom) */
|
||||
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ static inline void do_trace_rdpmc(unsigned int msr, u64 val, int failed) {}
|
|||
* think of extending them - you will be slapped with a stinking trout or a frozen
|
||||
* shark will reach you, wherever you are! You've been warned.
|
||||
*/
|
||||
static inline unsigned long long notrace __rdmsr(unsigned int msr)
|
||||
static __always_inline unsigned long long __rdmsr(unsigned int msr)
|
||||
{
|
||||
DECLARE_ARGS(val, low, high);
|
||||
|
||||
|
|
@ -98,7 +98,7 @@ static inline unsigned long long notrace __rdmsr(unsigned int msr)
|
|||
return EAX_EDX_VAL(val, low, high);
|
||||
}
|
||||
|
||||
static inline void notrace __wrmsr(unsigned int msr, u32 low, u32 high)
|
||||
static __always_inline void __wrmsr(unsigned int msr, u32 low, u32 high)
|
||||
{
|
||||
asm volatile("1: wrmsr\n"
|
||||
"2:\n"
|
||||
|
|
|
|||
|
|
@ -110,6 +110,8 @@ extern const struct cpumask *cpu_coregroup_mask(int cpu);
|
|||
#define topology_die_id(cpu) (cpu_data(cpu).cpu_die_id)
|
||||
#define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id)
|
||||
|
||||
extern unsigned int __max_die_per_package;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define topology_die_cpumask(cpu) (per_cpu(cpu_die_map, cpu))
|
||||
#define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu))
|
||||
|
|
@ -118,8 +120,6 @@ extern const struct cpumask *cpu_coregroup_mask(int cpu);
|
|||
extern unsigned int __max_logical_packages;
|
||||
#define topology_max_packages() (__max_logical_packages)
|
||||
|
||||
extern unsigned int __max_die_per_package;
|
||||
|
||||
static inline int topology_max_die_per_package(void)
|
||||
{
|
||||
return __max_die_per_package;
|
||||
|
|
|
|||
|
|
@ -542,12 +542,12 @@ static void bsp_init_amd(struct cpuinfo_x86 *c)
|
|||
u32 ecx;
|
||||
|
||||
ecx = cpuid_ecx(0x8000001e);
|
||||
nodes_per_socket = ((ecx >> 8) & 7) + 1;
|
||||
__max_die_per_package = nodes_per_socket = ((ecx >> 8) & 7) + 1;
|
||||
} else if (boot_cpu_has(X86_FEATURE_NODEID_MSR)) {
|
||||
u64 value;
|
||||
|
||||
rdmsrl(MSR_FAM10H_NODE_ID, value);
|
||||
nodes_per_socket = ((value >> 3) & 7) + 1;
|
||||
__max_die_per_package = nodes_per_socket = ((value >> 3) & 7) + 1;
|
||||
}
|
||||
|
||||
if (!boot_cpu_has(X86_FEATURE_AMD_SSBD) &&
|
||||
|
|
|
|||
|
|
@ -1992,10 +1992,9 @@ static __always_inline void exc_machine_check_kernel(struct pt_regs *regs)
|
|||
* that out because it's an indirect call. Annotate it.
|
||||
*/
|
||||
instrumentation_begin();
|
||||
trace_hardirqs_off_finish();
|
||||
|
||||
machine_check_vector(regs);
|
||||
if (regs->flags & X86_EFLAGS_IF)
|
||||
trace_hardirqs_on_prepare();
|
||||
|
||||
instrumentation_end();
|
||||
irqentry_nmi_exit(regs, irq_state);
|
||||
}
|
||||
|
|
@ -2004,7 +2003,9 @@ static __always_inline void exc_machine_check_user(struct pt_regs *regs)
|
|||
{
|
||||
irqentry_enter_from_user_mode(regs);
|
||||
instrumentation_begin();
|
||||
|
||||
machine_check_vector(regs);
|
||||
|
||||
instrumentation_end();
|
||||
irqentry_exit_to_user_mode(regs);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,10 +25,10 @@
|
|||
#define BITS_SHIFT_NEXT_LEVEL(eax) ((eax) & 0x1f)
|
||||
#define LEVEL_MAX_SIBLINGS(ebx) ((ebx) & 0xffff)
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
unsigned int __max_die_per_package __read_mostly = 1;
|
||||
EXPORT_SYMBOL(__max_die_per_package);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/*
|
||||
* Check if given CPUID extended toplogy "leaf" is implemented
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ int copy_fpregs_to_fpstate(struct fpu *fpu)
|
|||
}
|
||||
EXPORT_SYMBOL(copy_fpregs_to_fpstate);
|
||||
|
||||
void kernel_fpu_begin(void)
|
||||
void kernel_fpu_begin_mask(unsigned int kfpu_mask)
|
||||
{
|
||||
preempt_disable();
|
||||
|
||||
|
|
@ -141,13 +141,14 @@ void kernel_fpu_begin(void)
|
|||
}
|
||||
__cpu_invalidate_fpregs_state();
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_XMM))
|
||||
/* Put sane initial values into the control registers. */
|
||||
if (likely(kfpu_mask & KFPU_MXCSR) && boot_cpu_has(X86_FEATURE_XMM))
|
||||
ldmxcsr(MXCSR_DEFAULT);
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_FPU))
|
||||
if (unlikely(kfpu_mask & KFPU_387) && boot_cpu_has(X86_FEATURE_FPU))
|
||||
asm volatile ("fninit");
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kernel_fpu_begin);
|
||||
EXPORT_SYMBOL_GPL(kernel_fpu_begin_mask);
|
||||
|
||||
void kernel_fpu_end(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -660,17 +660,6 @@ static void __init trim_platform_memory_ranges(void)
|
|||
|
||||
static void __init trim_bios_range(void)
|
||||
{
|
||||
/*
|
||||
* A special case is the first 4Kb of memory;
|
||||
* This is a BIOS owned area, not kernel ram, but generally
|
||||
* not listed as such in the E820 table.
|
||||
*
|
||||
* This typically reserves additional memory (64KiB by default)
|
||||
* since some BIOSes are known to corrupt low memory. See the
|
||||
* Kconfig help text for X86_RESERVE_LOW.
|
||||
*/
|
||||
e820__range_update(0, PAGE_SIZE, E820_TYPE_RAM, E820_TYPE_RESERVED);
|
||||
|
||||
/*
|
||||
* special case: Some BIOSes report the PC BIOS
|
||||
* area (640Kb -> 1Mb) as RAM even though it is not.
|
||||
|
|
@ -728,6 +717,15 @@ early_param("reservelow", parse_reservelow);
|
|||
|
||||
static void __init trim_low_memory_range(void)
|
||||
{
|
||||
/*
|
||||
* A special case is the first 4Kb of memory;
|
||||
* This is a BIOS owned area, not kernel ram, but generally
|
||||
* not listed as such in the E820 table.
|
||||
*
|
||||
* This typically reserves additional memory (64KiB by default)
|
||||
* since some BIOSes are known to corrupt low memory. See the
|
||||
* Kconfig help text for X86_RESERVE_LOW.
|
||||
*/
|
||||
memblock_reserve(0, ALIGN(reserve_low, PAGE_SIZE));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ static inline u64 sev_es_rd_ghcb_msr(void)
|
|||
return __rdmsr(MSR_AMD64_SEV_ES_GHCB);
|
||||
}
|
||||
|
||||
static inline void sev_es_wr_ghcb_msr(u64 val)
|
||||
static __always_inline void sev_es_wr_ghcb_msr(u64 val)
|
||||
{
|
||||
u32 low, high;
|
||||
|
||||
|
|
@ -286,6 +286,12 @@ static enum es_result vc_write_mem(struct es_em_ctxt *ctxt,
|
|||
u16 d2;
|
||||
u8 d1;
|
||||
|
||||
/* If instruction ran in kernel mode and the I/O buffer is in kernel space */
|
||||
if (!user_mode(ctxt->regs) && !access_ok(target, size)) {
|
||||
memcpy(dst, buf, size);
|
||||
return ES_OK;
|
||||
}
|
||||
|
||||
switch (size) {
|
||||
case 1:
|
||||
memcpy(&d1, buf, 1);
|
||||
|
|
@ -335,6 +341,12 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt,
|
|||
u16 d2;
|
||||
u8 d1;
|
||||
|
||||
/* If instruction ran in kernel mode and the I/O buffer is in kernel space */
|
||||
if (!user_mode(ctxt->regs) && !access_ok(s, size)) {
|
||||
memcpy(buf, src, size);
|
||||
return ES_OK;
|
||||
}
|
||||
|
||||
switch (size) {
|
||||
case 1:
|
||||
if (get_user(d1, s))
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@
|
|||
#include <linux/numa.h>
|
||||
#include <linux/pgtable.h>
|
||||
#include <linux/overflow.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
#include <asm/acpi.h>
|
||||
#include <asm/desc.h>
|
||||
|
|
@ -2083,6 +2084,23 @@ static void init_counter_refs(void)
|
|||
this_cpu_write(arch_prev_mperf, mperf);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static struct syscore_ops freq_invariance_syscore_ops = {
|
||||
.resume = init_counter_refs,
|
||||
};
|
||||
|
||||
static void register_freq_invariance_syscore_ops(void)
|
||||
{
|
||||
/* Bail out if registered already. */
|
||||
if (freq_invariance_syscore_ops.node.prev)
|
||||
return;
|
||||
|
||||
register_syscore_ops(&freq_invariance_syscore_ops);
|
||||
}
|
||||
#else
|
||||
static inline void register_freq_invariance_syscore_ops(void) {}
|
||||
#endif
|
||||
|
||||
static void init_freq_invariance(bool secondary, bool cppc_ready)
|
||||
{
|
||||
bool ret = false;
|
||||
|
|
@ -2109,6 +2127,7 @@ static void init_freq_invariance(bool secondary, bool cppc_ready)
|
|||
if (ret) {
|
||||
init_counter_refs();
|
||||
static_branch_enable(&arch_scale_freq_key);
|
||||
register_freq_invariance_syscore_ops();
|
||||
pr_info("Estimated ratio of average max frequency by base frequency (times 1024): %llu\n", arch_max_freq_ratio);
|
||||
} else {
|
||||
pr_debug("Couldn't determine max cpu frequency, necessary for scale-invariant accounting.\n");
|
||||
|
|
|
|||
|
|
@ -26,6 +26,16 @@
|
|||
#include <asm/fpu/api.h>
|
||||
#include <asm/asm.h>
|
||||
|
||||
/*
|
||||
* Use KFPU_387. MMX instructions are not affected by MXCSR,
|
||||
* but both AMD and Intel documentation states that even integer MMX
|
||||
* operations will result in #MF if an exception is pending in FCW.
|
||||
*
|
||||
* EMMS is not needed afterwards because, after calling kernel_fpu_end(),
|
||||
* any subsequent user of the 387 stack will reinitialize it using
|
||||
* KFPU_387.
|
||||
*/
|
||||
|
||||
void *_mmx_memcpy(void *to, const void *from, size_t len)
|
||||
{
|
||||
void *p;
|
||||
|
|
@ -37,7 +47,7 @@ void *_mmx_memcpy(void *to, const void *from, size_t len)
|
|||
p = to;
|
||||
i = len >> 6; /* len/64 */
|
||||
|
||||
kernel_fpu_begin();
|
||||
kernel_fpu_begin_mask(KFPU_387);
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"1: prefetch (%0)\n" /* This set is 28 bytes */
|
||||
|
|
@ -127,7 +137,7 @@ static void fast_clear_page(void *page)
|
|||
{
|
||||
int i;
|
||||
|
||||
kernel_fpu_begin();
|
||||
kernel_fpu_begin_mask(KFPU_387);
|
||||
|
||||
__asm__ __volatile__ (
|
||||
" pxor %%mm0, %%mm0\n" : :
|
||||
|
|
@ -160,7 +170,7 @@ static void fast_copy_page(void *to, void *from)
|
|||
{
|
||||
int i;
|
||||
|
||||
kernel_fpu_begin();
|
||||
kernel_fpu_begin_mask(KFPU_387);
|
||||
|
||||
/*
|
||||
* maybe the prefetch stuff can go before the expensive fnsave...
|
||||
|
|
@ -247,7 +257,7 @@ static void fast_clear_page(void *page)
|
|||
{
|
||||
int i;
|
||||
|
||||
kernel_fpu_begin();
|
||||
kernel_fpu_begin_mask(KFPU_387);
|
||||
|
||||
__asm__ __volatile__ (
|
||||
" pxor %%mm0, %%mm0\n" : :
|
||||
|
|
@ -282,7 +292,7 @@ static void fast_copy_page(void *to, void *from)
|
|||
{
|
||||
int i;
|
||||
|
||||
kernel_fpu_begin();
|
||||
kernel_fpu_begin_mask(KFPU_387);
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"1: prefetch (%0)\n"
|
||||
|
|
|
|||
|
|
@ -208,6 +208,16 @@ int device_links_read_lock_held(void)
|
|||
#endif
|
||||
#endif /* !CONFIG_SRCU */
|
||||
|
||||
static bool device_is_ancestor(struct device *dev, struct device *target)
|
||||
{
|
||||
while (target->parent) {
|
||||
target = target->parent;
|
||||
if (dev == target)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* device_is_dependent - Check if one device depends on another one
|
||||
* @dev: Device to check dependencies for.
|
||||
|
|
@ -221,7 +231,12 @@ int device_is_dependent(struct device *dev, void *target)
|
|||
struct device_link *link;
|
||||
int ret;
|
||||
|
||||
if (dev == target)
|
||||
/*
|
||||
* The "ancestors" check is needed to catch the case when the target
|
||||
* device has not been completely initialized yet and it is still
|
||||
* missing from the list of children of its parent device.
|
||||
*/
|
||||
if (dev == target || device_is_ancestor(dev, target))
|
||||
return 1;
|
||||
|
||||
ret = device_for_each_child(dev, target, device_is_dependent);
|
||||
|
|
@ -456,7 +471,9 @@ static int devlink_add_symlinks(struct device *dev,
|
|||
struct device *con = link->consumer;
|
||||
char *buf;
|
||||
|
||||
len = max(strlen(dev_name(sup)), strlen(dev_name(con)));
|
||||
len = max(strlen(dev_bus_name(sup)) + strlen(dev_name(sup)),
|
||||
strlen(dev_bus_name(con)) + strlen(dev_name(con)));
|
||||
len += strlen(":");
|
||||
len += strlen("supplier:") + 1;
|
||||
buf = kzalloc(len, GFP_KERNEL);
|
||||
if (!buf)
|
||||
|
|
@ -470,12 +487,12 @@ static int devlink_add_symlinks(struct device *dev,
|
|||
if (ret)
|
||||
goto err_con;
|
||||
|
||||
snprintf(buf, len, "consumer:%s", dev_name(con));
|
||||
snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
|
||||
ret = sysfs_create_link(&sup->kobj, &link->link_dev.kobj, buf);
|
||||
if (ret)
|
||||
goto err_con_dev;
|
||||
|
||||
snprintf(buf, len, "supplier:%s", dev_name(sup));
|
||||
snprintf(buf, len, "supplier:%s:%s", dev_bus_name(sup), dev_name(sup));
|
||||
ret = sysfs_create_link(&con->kobj, &link->link_dev.kobj, buf);
|
||||
if (ret)
|
||||
goto err_sup_dev;
|
||||
|
|
@ -483,7 +500,7 @@ static int devlink_add_symlinks(struct device *dev,
|
|||
goto out;
|
||||
|
||||
err_sup_dev:
|
||||
snprintf(buf, len, "consumer:%s", dev_name(con));
|
||||
snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
|
||||
sysfs_remove_link(&sup->kobj, buf);
|
||||
err_con_dev:
|
||||
sysfs_remove_link(&link->link_dev.kobj, "consumer");
|
||||
|
|
@ -506,7 +523,9 @@ static void devlink_remove_symlinks(struct device *dev,
|
|||
sysfs_remove_link(&link->link_dev.kobj, "consumer");
|
||||
sysfs_remove_link(&link->link_dev.kobj, "supplier");
|
||||
|
||||
len = max(strlen(dev_name(sup)), strlen(dev_name(con)));
|
||||
len = max(strlen(dev_bus_name(sup)) + strlen(dev_name(sup)),
|
||||
strlen(dev_bus_name(con)) + strlen(dev_name(con)));
|
||||
len += strlen(":");
|
||||
len += strlen("supplier:") + 1;
|
||||
buf = kzalloc(len, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
|
|
@ -514,9 +533,9 @@ static void devlink_remove_symlinks(struct device *dev,
|
|||
return;
|
||||
}
|
||||
|
||||
snprintf(buf, len, "supplier:%s", dev_name(sup));
|
||||
snprintf(buf, len, "supplier:%s:%s", dev_bus_name(sup), dev_name(sup));
|
||||
sysfs_remove_link(&con->kobj, buf);
|
||||
snprintf(buf, len, "consumer:%s", dev_name(con));
|
||||
snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
|
||||
sysfs_remove_link(&sup->kobj, buf);
|
||||
kfree(buf);
|
||||
}
|
||||
|
|
@ -737,8 +756,9 @@ struct device_link *device_link_add(struct device *consumer,
|
|||
|
||||
link->link_dev.class = &devlink_class;
|
||||
device_set_pm_not_required(&link->link_dev);
|
||||
dev_set_name(&link->link_dev, "%s--%s",
|
||||
dev_name(supplier), dev_name(consumer));
|
||||
dev_set_name(&link->link_dev, "%s:%s--%s:%s",
|
||||
dev_bus_name(supplier), dev_name(supplier),
|
||||
dev_bus_name(consumer), dev_name(consumer));
|
||||
if (device_register(&link->link_dev)) {
|
||||
put_device(consumer);
|
||||
put_device(supplier);
|
||||
|
|
@ -1808,9 +1828,7 @@ const char *dev_driver_string(const struct device *dev)
|
|||
* never change once they are set, so they don't need special care.
|
||||
*/
|
||||
drv = READ_ONCE(dev->driver);
|
||||
return drv ? drv->name :
|
||||
(dev->bus ? dev->bus->name :
|
||||
(dev->class ? dev->class->name : ""));
|
||||
return drv ? drv->name : dev_bus_name(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(dev_driver_string);
|
||||
|
||||
|
|
|
|||
|
|
@ -370,13 +370,6 @@ static void driver_bound(struct device *dev)
|
|||
|
||||
device_pm_check_callbacks(dev);
|
||||
|
||||
/*
|
||||
* Reorder successfully probed devices to the end of the device list.
|
||||
* This ensures that suspend/resume order matches probe order, which
|
||||
* is usually what drivers rely on.
|
||||
*/
|
||||
device_pm_move_to_tail(dev);
|
||||
|
||||
/*
|
||||
* Make sure the device is no longer in one of the deferred lists and
|
||||
* kick off retrying all pending devices
|
||||
|
|
@ -619,6 +612,8 @@ static int really_probe(struct device *dev, struct device_driver *drv)
|
|||
else if (drv->remove)
|
||||
drv->remove(dev);
|
||||
probe_failed:
|
||||
kfree(dev->dma_range_map);
|
||||
dev->dma_range_map = NULL;
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_DRIVER_NOT_BOUND, dev);
|
||||
|
|
|
|||
|
|
@ -366,6 +366,8 @@ int devm_platform_get_irqs_affinity(struct platform_device *dev,
|
|||
return -ERANGE;
|
||||
|
||||
nvec = platform_irq_count(dev);
|
||||
if (nvec < 0)
|
||||
return nvec;
|
||||
|
||||
if (nvec < minvec)
|
||||
return -ENOSPC;
|
||||
|
|
|
|||
|
|
@ -235,36 +235,6 @@ static ssize_t ti_eqep_position_ceiling_write(struct counter_device *counter,
|
|||
return len;
|
||||
}
|
||||
|
||||
static ssize_t ti_eqep_position_floor_read(struct counter_device *counter,
|
||||
struct counter_count *count,
|
||||
void *ext_priv, char *buf)
|
||||
{
|
||||
struct ti_eqep_cnt *priv = counter->priv;
|
||||
u32 qposinit;
|
||||
|
||||
regmap_read(priv->regmap32, QPOSINIT, &qposinit);
|
||||
|
||||
return sprintf(buf, "%u\n", qposinit);
|
||||
}
|
||||
|
||||
static ssize_t ti_eqep_position_floor_write(struct counter_device *counter,
|
||||
struct counter_count *count,
|
||||
void *ext_priv, const char *buf,
|
||||
size_t len)
|
||||
{
|
||||
struct ti_eqep_cnt *priv = counter->priv;
|
||||
int err;
|
||||
u32 res;
|
||||
|
||||
err = kstrtouint(buf, 0, &res);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
regmap_write(priv->regmap32, QPOSINIT, res);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static ssize_t ti_eqep_position_enable_read(struct counter_device *counter,
|
||||
struct counter_count *count,
|
||||
void *ext_priv, char *buf)
|
||||
|
|
@ -301,11 +271,6 @@ static struct counter_count_ext ti_eqep_position_ext[] = {
|
|||
.read = ti_eqep_position_ceiling_read,
|
||||
.write = ti_eqep_position_ceiling_write,
|
||||
},
|
||||
{
|
||||
.name = "floor",
|
||||
.read = ti_eqep_position_floor_read,
|
||||
.write = ti_eqep_position_floor_write,
|
||||
},
|
||||
{
|
||||
.name = "enable",
|
||||
.read = ti_eqep_position_enable_read,
|
||||
|
|
|
|||
|
|
@ -268,6 +268,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
|
|||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7aa6),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Alder Lake-P */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x51a6),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Alder Lake CPU */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x466f),
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ static void stm_heartbeat_unlink(struct stm_source_data *data)
|
|||
|
||||
static int stm_heartbeat_init(void)
|
||||
{
|
||||
int i, ret = -ENOMEM;
|
||||
int i, ret;
|
||||
|
||||
if (nr_devs < 0 || nr_devs > STM_HEARTBEAT_MAX)
|
||||
return -EINVAL;
|
||||
|
|
@ -72,8 +72,10 @@ static int stm_heartbeat_init(void)
|
|||
for (i = 0; i < nr_devs; i++) {
|
||||
stm_heartbeat[i].data.name =
|
||||
kasprintf(GFP_KERNEL, "heartbeat.%d", i);
|
||||
if (!stm_heartbeat[i].data.name)
|
||||
if (!stm_heartbeat[i].data.name) {
|
||||
ret = -ENOMEM;
|
||||
goto fail_unregister;
|
||||
}
|
||||
|
||||
stm_heartbeat[i].data.nr_chans = 1;
|
||||
stm_heartbeat[i].data.link = stm_heartbeat_link;
|
||||
|
|
|
|||
|
|
@ -397,16 +397,12 @@ static int tiadc_iio_buffered_hardware_setup(struct device *dev,
|
|||
ret = devm_request_threaded_irq(dev, irq, pollfunc_th, pollfunc_bh,
|
||||
flags, indio_dev->name, indio_dev);
|
||||
if (ret)
|
||||
goto error_kfifo_free;
|
||||
return ret;
|
||||
|
||||
indio_dev->setup_ops = setup_ops;
|
||||
indio_dev->modes |= INDIO_BUFFER_SOFTWARE;
|
||||
|
||||
return 0;
|
||||
|
||||
error_kfifo_free:
|
||||
iio_kfifo_free(indio_dev->buffer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const char * const chan_name_ain[] = {
|
||||
|
|
|
|||
|
|
@ -23,35 +23,31 @@
|
|||
* @sdata: Sensor data.
|
||||
*
|
||||
* returns:
|
||||
* 0 - no new samples available
|
||||
* 1 - new samples available
|
||||
* negative - error or unknown
|
||||
* false - no new samples available or read error
|
||||
* true - new samples available
|
||||
*/
|
||||
static int st_sensors_new_samples_available(struct iio_dev *indio_dev,
|
||||
struct st_sensor_data *sdata)
|
||||
static bool st_sensors_new_samples_available(struct iio_dev *indio_dev,
|
||||
struct st_sensor_data *sdata)
|
||||
{
|
||||
int ret, status;
|
||||
|
||||
/* How would I know if I can't check it? */
|
||||
if (!sdata->sensor_settings->drdy_irq.stat_drdy.addr)
|
||||
return -EINVAL;
|
||||
return true;
|
||||
|
||||
/* No scan mask, no interrupt */
|
||||
if (!indio_dev->active_scan_mask)
|
||||
return 0;
|
||||
return false;
|
||||
|
||||
ret = regmap_read(sdata->regmap,
|
||||
sdata->sensor_settings->drdy_irq.stat_drdy.addr,
|
||||
&status);
|
||||
if (ret < 0) {
|
||||
dev_err(sdata->dev, "error checking samples available\n");
|
||||
return ret;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (status & sdata->sensor_settings->drdy_irq.stat_drdy.mask)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
return !!(status & sdata->sensor_settings->drdy_irq.stat_drdy.mask);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -180,9 +176,15 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
|
|||
|
||||
/* Tell the interrupt handler that we're dealing with edges */
|
||||
if (irq_trig == IRQF_TRIGGER_FALLING ||
|
||||
irq_trig == IRQF_TRIGGER_RISING)
|
||||
irq_trig == IRQF_TRIGGER_RISING) {
|
||||
if (!sdata->sensor_settings->drdy_irq.stat_drdy.addr) {
|
||||
dev_err(&indio_dev->dev,
|
||||
"edge IRQ not supported w/o stat register.\n");
|
||||
err = -EOPNOTSUPP;
|
||||
goto iio_trigger_free;
|
||||
}
|
||||
sdata->edge_irq = true;
|
||||
else
|
||||
} else {
|
||||
/*
|
||||
* If we're not using edges (i.e. level interrupts) we
|
||||
* just mask off the IRQ, handle one interrupt, then
|
||||
|
|
@ -190,6 +192,7 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
|
|||
* interrupt handler top half again and start over.
|
||||
*/
|
||||
irq_trig |= IRQF_ONESHOT;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the interrupt pin is Open Drain, by definition this
|
||||
|
|
|
|||
|
|
@ -187,9 +187,9 @@ static ssize_t ad5504_write_dac_powerdown(struct iio_dev *indio_dev,
|
|||
return ret;
|
||||
|
||||
if (pwr_down)
|
||||
st->pwr_down_mask |= (1 << chan->channel);
|
||||
else
|
||||
st->pwr_down_mask &= ~(1 << chan->channel);
|
||||
else
|
||||
st->pwr_down_mask |= (1 << chan->channel);
|
||||
|
||||
ret = ad5504_spi_write(st, AD5504_ADDR_CTRL,
|
||||
AD5504_DAC_PWRDWN_MODE(st->pwr_down_mode) |
|
||||
|
|
|
|||
|
|
@ -601,7 +601,7 @@ static int sx9310_read_thresh(struct sx9310_data *data,
|
|||
return ret;
|
||||
|
||||
regval = FIELD_GET(SX9310_REG_PROX_CTRL8_9_PTHRESH_MASK, regval);
|
||||
if (regval > ARRAY_SIZE(sx9310_pthresh_codes))
|
||||
if (regval >= ARRAY_SIZE(sx9310_pthresh_codes))
|
||||
return -EINVAL;
|
||||
|
||||
*val = sx9310_pthresh_codes[regval];
|
||||
|
|
@ -1305,7 +1305,8 @@ sx9310_get_default_reg(struct sx9310_data *data, int i,
|
|||
if (ret)
|
||||
break;
|
||||
|
||||
pos = min(max(ilog2(pos), 3), 10) - 3;
|
||||
/* Powers of 2, except for a gap between 16 and 64 */
|
||||
pos = clamp(ilog2(pos), 3, 11) - (pos >= 32 ? 4 : 3);
|
||||
reg_def->def &= ~SX9310_REG_PROX_CTRL7_AVGPOSFILT_MASK;
|
||||
reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL7_AVGPOSFILT_MASK,
|
||||
pos);
|
||||
|
|
|
|||
|
|
@ -248,6 +248,12 @@ static int mlx90632_set_meas_type(struct regmap *regmap, u8 type)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Give the mlx90632 some time to reset properly before sending a new I2C command
|
||||
* if this is not done, the following I2C command(s) will not be accepted.
|
||||
*/
|
||||
usleep_range(150, 200);
|
||||
|
||||
ret = regmap_write_bits(regmap, MLX90632_REG_CONTROL,
|
||||
(MLX90632_CFG_MTYP_MASK | MLX90632_CFG_PWR_MASK),
|
||||
(MLX90632_MTYP_STATUS(type) | MLX90632_PWR_STATUS_HALT));
|
||||
|
|
|
|||
|
|
@ -494,8 +494,9 @@ config TI_SCI_INTA_IRQCHIP
|
|||
TI System Controller, say Y here. Otherwise, say N.
|
||||
|
||||
config TI_PRUSS_INTC
|
||||
tristate "TI PRU-ICSS Interrupt Controller"
|
||||
depends on ARCH_DAVINCI || SOC_AM33XX || SOC_AM43XX || SOC_DRA7XX || ARCH_KEYSTONE || ARCH_K3
|
||||
tristate
|
||||
depends on TI_PRUSS
|
||||
default TI_PRUSS
|
||||
select IRQ_DOMAIN
|
||||
help
|
||||
This enables support for the PRU-ICSS Local Interrupt Controller
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@ static void bcm2836_arm_irqchip_handle_ipi(struct irq_desc *desc)
|
|||
chained_irq_exit(chip, desc);
|
||||
}
|
||||
|
||||
static void bcm2836_arm_irqchip_ipi_eoi(struct irq_data *d)
|
||||
static void bcm2836_arm_irqchip_ipi_ack(struct irq_data *d)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
|
||||
|
|
@ -195,7 +195,7 @@ static struct irq_chip bcm2836_arm_irqchip_ipi = {
|
|||
.name = "IPI",
|
||||
.irq_mask = bcm2836_arm_irqchip_dummy_op,
|
||||
.irq_unmask = bcm2836_arm_irqchip_dummy_op,
|
||||
.irq_eoi = bcm2836_arm_irqchip_ipi_eoi,
|
||||
.irq_ack = bcm2836_arm_irqchip_ipi_ack,
|
||||
.ipi_send_mask = bcm2836_arm_irqchip_ipi_send_mask,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -142,8 +142,8 @@ static void liointc_resume(struct irq_chip_generic *gc)
|
|||
|
||||
static const char * const parent_names[] = {"int0", "int1", "int2", "int3"};
|
||||
|
||||
int __init liointc_of_init(struct device_node *node,
|
||||
struct device_node *parent)
|
||||
static int __init liointc_of_init(struct device_node *node,
|
||||
struct device_node *parent)
|
||||
{
|
||||
struct irq_chip_generic *gc;
|
||||
struct irq_domain *domain;
|
||||
|
|
|
|||
|
|
@ -197,6 +197,13 @@ static int mips_cpu_ipi_alloc(struct irq_domain *domain, unsigned int virq,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = irq_domain_set_hwirq_and_chip(domain->parent, virq + i, hwirq,
|
||||
&mips_mt_cpu_irq_controller,
|
||||
NULL);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = irq_set_irq_type(virq + i, IRQ_TYPE_LEVEL_HIGH);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ static int sl28cpld_intc_probe(struct platform_device *pdev)
|
|||
irqchip->chip.num_regs = 1;
|
||||
irqchip->chip.status_base = base + INTC_IP;
|
||||
irqchip->chip.mask_base = base + INTC_IE;
|
||||
irqchip->chip.mask_invert = true,
|
||||
irqchip->chip.mask_invert = true;
|
||||
irqchip->chip.ack_base = base + INTC_IP;
|
||||
|
||||
return devm_regmap_add_irq_chip_fwnode(dev, dev_fwnode(dev),
|
||||
|
|
|
|||
|
|
@ -844,11 +844,10 @@ static int nvm_bb_chunk_sense(struct nvm_dev *dev, struct ppa_addr ppa)
|
|||
rqd.ppa_addr = generic_to_dev_addr(dev, ppa);
|
||||
|
||||
ret = nvm_submit_io_sync_raw(dev, &rqd);
|
||||
__free_page(page);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
__free_page(page);
|
||||
|
||||
return rqd.error;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -639,8 +639,10 @@ static void md_submit_flush_data(struct work_struct *ws)
|
|||
* could wait for this and below md_handle_request could wait for those
|
||||
* bios because of suspend check
|
||||
*/
|
||||
spin_lock_irq(&mddev->lock);
|
||||
mddev->prev_flush_start = mddev->start_flush;
|
||||
mddev->flush_bio = NULL;
|
||||
spin_unlock_irq(&mddev->lock);
|
||||
wake_up(&mddev->sb_wait);
|
||||
|
||||
if (bio->bi_iter.bi_size == 0) {
|
||||
|
|
|
|||
|
|
@ -1512,6 +1512,7 @@ static int rtsx_pci_probe(struct pci_dev *pcidev,
|
|||
struct pcr_handle *handle;
|
||||
u32 base, len;
|
||||
int ret, i, bar = 0;
|
||||
u8 val;
|
||||
|
||||
dev_dbg(&(pcidev->dev),
|
||||
": Realtek PCI-E Card Reader found at %s [%04x:%04x] (rev %x)\n",
|
||||
|
|
@ -1577,7 +1578,11 @@ static int rtsx_pci_probe(struct pci_dev *pcidev,
|
|||
pcr->host_cmds_addr = pcr->rtsx_resv_buf_addr;
|
||||
pcr->host_sg_tbl_ptr = pcr->rtsx_resv_buf + HOST_CMDS_BUF_LEN;
|
||||
pcr->host_sg_tbl_addr = pcr->rtsx_resv_buf_addr + HOST_CMDS_BUF_LEN;
|
||||
|
||||
rtsx_pci_read_register(pcr, ASPM_FORCE_CTL, &val);
|
||||
if (val & FORCE_ASPM_CTL0 && val & FORCE_ASPM_CTL1)
|
||||
pcr->aspm_enabled = false;
|
||||
else
|
||||
pcr->aspm_enabled = true;
|
||||
pcr->card_inserted = 0;
|
||||
pcr->card_removed = 0;
|
||||
INIT_DELAYED_WORK(&pcr->carddet_work, rtsx_pci_card_detect);
|
||||
|
|
|
|||
|
|
@ -1037,7 +1037,7 @@ int hl_device_reset(struct hl_device *hdev, bool hard_reset,
|
|||
|
||||
if (hard_reset) {
|
||||
/* Release kernel context */
|
||||
if (hl_ctx_put(hdev->kernel_ctx) == 1)
|
||||
if (hdev->kernel_ctx && hl_ctx_put(hdev->kernel_ctx) == 1)
|
||||
hdev->kernel_ctx = NULL;
|
||||
hl_vm_fini(hdev);
|
||||
hl_mmu_fini(hdev);
|
||||
|
|
@ -1487,6 +1487,15 @@ void hl_device_fini(struct hl_device *hdev)
|
|||
}
|
||||
}
|
||||
|
||||
/* Disable PCI access from device F/W so it won't send us additional
|
||||
* interrupts. We disable MSI/MSI-X at the halt_engines function and we
|
||||
* can't have the F/W sending us interrupts after that. We need to
|
||||
* disable the access here because if the device is marked disable, the
|
||||
* message won't be send. Also, in case of heartbeat, the device CPU is
|
||||
* marked as disable so this message won't be sent
|
||||
*/
|
||||
hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS);
|
||||
|
||||
/* Mark device as disabled */
|
||||
hdev->disabled = true;
|
||||
|
||||
|
|
|
|||
|
|
@ -402,6 +402,10 @@ int hl_fw_cpucp_pci_counters_get(struct hl_device *hdev,
|
|||
}
|
||||
counters->rx_throughput = result;
|
||||
|
||||
memset(&pkt, 0, sizeof(pkt));
|
||||
pkt.ctl = cpu_to_le32(CPUCP_PACKET_PCIE_THROUGHPUT_GET <<
|
||||
CPUCP_PKT_CTL_OPCODE_SHIFT);
|
||||
|
||||
/* Fetch PCI tx counter */
|
||||
pkt.index = cpu_to_le32(cpucp_pcie_throughput_tx);
|
||||
rc = hdev->asic_funcs->send_cpu_message(hdev, (u32 *) &pkt, sizeof(pkt),
|
||||
|
|
@ -414,6 +418,7 @@ int hl_fw_cpucp_pci_counters_get(struct hl_device *hdev,
|
|||
counters->tx_throughput = result;
|
||||
|
||||
/* Fetch PCI replay counter */
|
||||
memset(&pkt, 0, sizeof(pkt));
|
||||
pkt.ctl = cpu_to_le32(CPUCP_PACKET_PCIE_REPLAY_CNT_GET <<
|
||||
CPUCP_PKT_CTL_OPCODE_SHIFT);
|
||||
|
||||
|
|
|
|||
|
|
@ -2182,6 +2182,7 @@ void hl_mmu_v1_set_funcs(struct hl_device *hdev, struct hl_mmu_funcs *mmu);
|
|||
int hl_mmu_va_to_pa(struct hl_ctx *ctx, u64 virt_addr, u64 *phys_addr);
|
||||
int hl_mmu_get_tlb_info(struct hl_ctx *ctx, u64 virt_addr,
|
||||
struct hl_mmu_hop_info *hops);
|
||||
bool hl_is_dram_va(struct hl_device *hdev, u64 virt_addr);
|
||||
|
||||
int hl_fw_load_fw_to_device(struct hl_device *hdev, const char *fw_name,
|
||||
void __iomem *dst, u32 src_offset, u32 size);
|
||||
|
|
|
|||
|
|
@ -133,6 +133,8 @@ static int hw_idle(struct hl_device *hdev, struct hl_info_args *args)
|
|||
|
||||
hw_idle.is_idle = hdev->asic_funcs->is_device_idle(hdev,
|
||||
&hw_idle.busy_engines_mask_ext, NULL);
|
||||
hw_idle.busy_engines_mask =
|
||||
lower_32_bits(hw_idle.busy_engines_mask_ext);
|
||||
|
||||
return copy_to_user(out, &hw_idle,
|
||||
min((size_t) max_size, sizeof(hw_idle))) ? -EFAULT : 0;
|
||||
|
|
|
|||
|
|
@ -886,8 +886,10 @@ static void unmap_phys_pg_pack(struct hl_ctx *ctx, u64 vaddr,
|
|||
{
|
||||
struct hl_device *hdev = ctx->hdev;
|
||||
u64 next_vaddr, i;
|
||||
bool is_host_addr;
|
||||
u32 page_size;
|
||||
|
||||
is_host_addr = !hl_is_dram_va(hdev, vaddr);
|
||||
page_size = phys_pg_pack->page_size;
|
||||
next_vaddr = vaddr;
|
||||
|
||||
|
|
@ -900,9 +902,13 @@ static void unmap_phys_pg_pack(struct hl_ctx *ctx, u64 vaddr,
|
|||
/*
|
||||
* unmapping on Palladium can be really long, so avoid a CPU
|
||||
* soft lockup bug by sleeping a little between unmapping pages
|
||||
*
|
||||
* In addition, when unmapping host memory we pass through
|
||||
* the Linux kernel to unpin the pages and that takes a long
|
||||
* time. Therefore, sleep every 32K pages to avoid soft lockup
|
||||
*/
|
||||
if (hdev->pldm)
|
||||
usleep_range(500, 1000);
|
||||
if (hdev->pldm || (is_host_addr && (i & 0x7FFF) == 0))
|
||||
usleep_range(50, 200);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
#include "habanalabs.h"
|
||||
|
||||
static bool is_dram_va(struct hl_device *hdev, u64 virt_addr)
|
||||
bool hl_is_dram_va(struct hl_device *hdev, u64 virt_addr)
|
||||
{
|
||||
struct asic_fixed_properties *prop = &hdev->asic_prop;
|
||||
|
||||
|
|
@ -156,7 +156,7 @@ int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size,
|
|||
if (!hdev->mmu_enable)
|
||||
return 0;
|
||||
|
||||
is_dram_addr = is_dram_va(hdev, virt_addr);
|
||||
is_dram_addr = hl_is_dram_va(hdev, virt_addr);
|
||||
|
||||
if (is_dram_addr)
|
||||
mmu_prop = &prop->dmmu;
|
||||
|
|
@ -236,7 +236,7 @@ int hl_mmu_map_page(struct hl_ctx *ctx, u64 virt_addr, u64 phys_addr,
|
|||
if (!hdev->mmu_enable)
|
||||
return 0;
|
||||
|
||||
is_dram_addr = is_dram_va(hdev, virt_addr);
|
||||
is_dram_addr = hl_is_dram_va(hdev, virt_addr);
|
||||
|
||||
if (is_dram_addr)
|
||||
mmu_prop = &prop->dmmu;
|
||||
|
|
|
|||
|
|
@ -467,8 +467,16 @@ static void hl_mmu_v1_fini(struct hl_device *hdev)
|
|||
{
|
||||
/* MMU H/W fini was already done in device hw_fini() */
|
||||
|
||||
kvfree(hdev->mmu_priv.dr.mmu_shadow_hop0);
|
||||
gen_pool_destroy(hdev->mmu_priv.dr.mmu_pgt_pool);
|
||||
if (!ZERO_OR_NULL_PTR(hdev->mmu_priv.hr.mmu_shadow_hop0)) {
|
||||
kvfree(hdev->mmu_priv.dr.mmu_shadow_hop0);
|
||||
gen_pool_destroy(hdev->mmu_priv.dr.mmu_pgt_pool);
|
||||
}
|
||||
|
||||
/* Make sure that if we arrive here again without init was called we
|
||||
* won't cause kernel panic. This can happen for example if we fail
|
||||
* during hard reset code at certain points
|
||||
*/
|
||||
hdev->mmu_priv.dr.mmu_shadow_hop0 = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -4002,7 +4002,8 @@ static int gaudi_cb_mmap(struct hl_device *hdev, struct vm_area_struct *vma,
|
|||
vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
|
||||
VM_DONTCOPY | VM_NORESERVE;
|
||||
|
||||
rc = dma_mmap_coherent(hdev->dev, vma, cpu_addr, dma_addr, size);
|
||||
rc = dma_mmap_coherent(hdev->dev, vma, cpu_addr,
|
||||
(dma_addr - HOST_PHYS_BASE), size);
|
||||
if (rc)
|
||||
dev_err(hdev->dev, "dma_mmap_coherent error %d", rc);
|
||||
|
||||
|
|
|
|||
|
|
@ -2719,7 +2719,8 @@ static int goya_cb_mmap(struct hl_device *hdev, struct vm_area_struct *vma,
|
|||
vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
|
||||
VM_DONTCOPY | VM_NORESERVE;
|
||||
|
||||
rc = dma_mmap_coherent(hdev->dev, vma, cpu_addr, dma_addr, size);
|
||||
rc = dma_mmap_coherent(hdev->dev, vma, cpu_addr,
|
||||
(dma_addr - HOST_PHYS_BASE), size);
|
||||
if (rc)
|
||||
dev_err(hdev->dev, "dma_mmap_coherent error %d", rc);
|
||||
|
||||
|
|
|
|||
|
|
@ -1543,8 +1543,21 @@ static int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *uio)
|
|||
}
|
||||
|
||||
length = (io.nblocks + 1) << ns->lba_shift;
|
||||
meta_len = (io.nblocks + 1) * ns->ms;
|
||||
metadata = nvme_to_user_ptr(io.metadata);
|
||||
|
||||
if ((io.control & NVME_RW_PRINFO_PRACT) &&
|
||||
ns->ms == sizeof(struct t10_pi_tuple)) {
|
||||
/*
|
||||
* Protection information is stripped/inserted by the
|
||||
* controller.
|
||||
*/
|
||||
if (nvme_to_user_ptr(io.metadata))
|
||||
return -EINVAL;
|
||||
meta_len = 0;
|
||||
metadata = NULL;
|
||||
} else {
|
||||
meta_len = (io.nblocks + 1) * ns->ms;
|
||||
metadata = nvme_to_user_ptr(io.metadata);
|
||||
}
|
||||
|
||||
if (ns->features & NVME_NS_EXT_LBAS) {
|
||||
length += meta_len;
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/t10-pi.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/io-64-nonatomic-lo-hi.h>
|
||||
#include <linux/io-64-nonatomic-hi-lo.h>
|
||||
#include <linux/sed-opal.h>
|
||||
#include <linux/pci-p2pdma.h>
|
||||
|
||||
|
|
@ -542,50 +543,71 @@ static inline bool nvme_pci_use_sgls(struct nvme_dev *dev, struct request *req)
|
|||
return true;
|
||||
}
|
||||
|
||||
static void nvme_unmap_data(struct nvme_dev *dev, struct request *req)
|
||||
static void nvme_free_prps(struct nvme_dev *dev, struct request *req)
|
||||
{
|
||||
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
|
||||
const int last_prp = NVME_CTRL_PAGE_SIZE / sizeof(__le64) - 1;
|
||||
dma_addr_t dma_addr = iod->first_dma, next_dma_addr;
|
||||
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
|
||||
dma_addr_t dma_addr = iod->first_dma;
|
||||
int i;
|
||||
|
||||
if (iod->dma_len) {
|
||||
dma_unmap_page(dev->dev, dma_addr, iod->dma_len,
|
||||
rq_dma_dir(req));
|
||||
return;
|
||||
for (i = 0; i < iod->npages; i++) {
|
||||
__le64 *prp_list = nvme_pci_iod_list(req)[i];
|
||||
dma_addr_t next_dma_addr = le64_to_cpu(prp_list[last_prp]);
|
||||
|
||||
dma_pool_free(dev->prp_page_pool, prp_list, dma_addr);
|
||||
dma_addr = next_dma_addr;
|
||||
}
|
||||
|
||||
WARN_ON_ONCE(!iod->nents);
|
||||
}
|
||||
|
||||
static void nvme_free_sgls(struct nvme_dev *dev, struct request *req)
|
||||
{
|
||||
const int last_sg = SGES_PER_PAGE - 1;
|
||||
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
|
||||
dma_addr_t dma_addr = iod->first_dma;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < iod->npages; i++) {
|
||||
struct nvme_sgl_desc *sg_list = nvme_pci_iod_list(req)[i];
|
||||
dma_addr_t next_dma_addr = le64_to_cpu((sg_list[last_sg]).addr);
|
||||
|
||||
dma_pool_free(dev->prp_page_pool, sg_list, dma_addr);
|
||||
dma_addr = next_dma_addr;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void nvme_unmap_sg(struct nvme_dev *dev, struct request *req)
|
||||
{
|
||||
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
|
||||
|
||||
if (is_pci_p2pdma_page(sg_page(iod->sg)))
|
||||
pci_p2pdma_unmap_sg(dev->dev, iod->sg, iod->nents,
|
||||
rq_dma_dir(req));
|
||||
else
|
||||
dma_unmap_sg(dev->dev, iod->sg, iod->nents, rq_dma_dir(req));
|
||||
}
|
||||
|
||||
static void nvme_unmap_data(struct nvme_dev *dev, struct request *req)
|
||||
{
|
||||
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
|
||||
|
||||
if (iod->npages == 0)
|
||||
dma_pool_free(dev->prp_small_pool, nvme_pci_iod_list(req)[0],
|
||||
dma_addr);
|
||||
|
||||
for (i = 0; i < iod->npages; i++) {
|
||||
void *addr = nvme_pci_iod_list(req)[i];
|
||||
|
||||
if (iod->use_sgl) {
|
||||
struct nvme_sgl_desc *sg_list = addr;
|
||||
|
||||
next_dma_addr =
|
||||
le64_to_cpu((sg_list[SGES_PER_PAGE - 1]).addr);
|
||||
} else {
|
||||
__le64 *prp_list = addr;
|
||||
|
||||
next_dma_addr = le64_to_cpu(prp_list[last_prp]);
|
||||
}
|
||||
|
||||
dma_pool_free(dev->prp_page_pool, addr, dma_addr);
|
||||
dma_addr = next_dma_addr;
|
||||
if (iod->dma_len) {
|
||||
dma_unmap_page(dev->dev, iod->first_dma, iod->dma_len,
|
||||
rq_dma_dir(req));
|
||||
return;
|
||||
}
|
||||
|
||||
WARN_ON_ONCE(!iod->nents);
|
||||
|
||||
nvme_unmap_sg(dev, req);
|
||||
if (iod->npages == 0)
|
||||
dma_pool_free(dev->prp_small_pool, nvme_pci_iod_list(req)[0],
|
||||
iod->first_dma);
|
||||
else if (iod->use_sgl)
|
||||
nvme_free_sgls(dev, req);
|
||||
else
|
||||
nvme_free_prps(dev, req);
|
||||
mempool_free(iod->sg, dev->iod_mempool);
|
||||
}
|
||||
|
||||
|
|
@ -661,7 +683,7 @@ static blk_status_t nvme_pci_setup_prps(struct nvme_dev *dev,
|
|||
__le64 *old_prp_list = prp_list;
|
||||
prp_list = dma_pool_alloc(pool, GFP_ATOMIC, &prp_dma);
|
||||
if (!prp_list)
|
||||
return BLK_STS_RESOURCE;
|
||||
goto free_prps;
|
||||
list[iod->npages++] = prp_list;
|
||||
prp_list[0] = old_prp_list[i - 1];
|
||||
old_prp_list[i - 1] = cpu_to_le64(prp_dma);
|
||||
|
|
@ -681,14 +703,14 @@ static blk_status_t nvme_pci_setup_prps(struct nvme_dev *dev,
|
|||
dma_addr = sg_dma_address(sg);
|
||||
dma_len = sg_dma_len(sg);
|
||||
}
|
||||
|
||||
done:
|
||||
cmnd->dptr.prp1 = cpu_to_le64(sg_dma_address(iod->sg));
|
||||
cmnd->dptr.prp2 = cpu_to_le64(iod->first_dma);
|
||||
|
||||
return BLK_STS_OK;
|
||||
|
||||
bad_sgl:
|
||||
free_prps:
|
||||
nvme_free_prps(dev, req);
|
||||
return BLK_STS_RESOURCE;
|
||||
bad_sgl:
|
||||
WARN(DO_ONCE(nvme_print_sgl, iod->sg, iod->nents),
|
||||
"Invalid SGL for payload:%d nents:%d\n",
|
||||
blk_rq_payload_bytes(req), iod->nents);
|
||||
|
|
@ -760,7 +782,7 @@ static blk_status_t nvme_pci_setup_sgls(struct nvme_dev *dev,
|
|||
|
||||
sg_list = dma_pool_alloc(pool, GFP_ATOMIC, &sgl_dma);
|
||||
if (!sg_list)
|
||||
return BLK_STS_RESOURCE;
|
||||
goto free_sgls;
|
||||
|
||||
i = 0;
|
||||
nvme_pci_iod_list(req)[iod->npages++] = sg_list;
|
||||
|
|
@ -773,6 +795,9 @@ static blk_status_t nvme_pci_setup_sgls(struct nvme_dev *dev,
|
|||
} while (--entries > 0);
|
||||
|
||||
return BLK_STS_OK;
|
||||
free_sgls:
|
||||
nvme_free_sgls(dev, req);
|
||||
return BLK_STS_RESOURCE;
|
||||
}
|
||||
|
||||
static blk_status_t nvme_setup_prp_simple(struct nvme_dev *dev,
|
||||
|
|
@ -841,7 +866,7 @@ static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req,
|
|||
sg_init_table(iod->sg, blk_rq_nr_phys_segments(req));
|
||||
iod->nents = blk_rq_map_sg(req->q, req, iod->sg);
|
||||
if (!iod->nents)
|
||||
goto out;
|
||||
goto out_free_sg;
|
||||
|
||||
if (is_pci_p2pdma_page(sg_page(iod->sg)))
|
||||
nr_mapped = pci_p2pdma_map_sg_attrs(dev->dev, iod->sg,
|
||||
|
|
@ -850,16 +875,21 @@ static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req,
|
|||
nr_mapped = dma_map_sg_attrs(dev->dev, iod->sg, iod->nents,
|
||||
rq_dma_dir(req), DMA_ATTR_NO_WARN);
|
||||
if (!nr_mapped)
|
||||
goto out;
|
||||
goto out_free_sg;
|
||||
|
||||
iod->use_sgl = nvme_pci_use_sgls(dev, req);
|
||||
if (iod->use_sgl)
|
||||
ret = nvme_pci_setup_sgls(dev, req, &cmnd->rw, nr_mapped);
|
||||
else
|
||||
ret = nvme_pci_setup_prps(dev, req, &cmnd->rw);
|
||||
out:
|
||||
if (ret != BLK_STS_OK)
|
||||
nvme_unmap_data(dev, req);
|
||||
goto out_unmap_sg;
|
||||
return BLK_STS_OK;
|
||||
|
||||
out_unmap_sg:
|
||||
nvme_unmap_sg(dev, req);
|
||||
out_free_sg:
|
||||
mempool_free(iod->sg, dev->iod_mempool);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1795,6 +1825,9 @@ static void nvme_map_cmb(struct nvme_dev *dev)
|
|||
if (dev->cmb_size)
|
||||
return;
|
||||
|
||||
if (NVME_CAP_CMBS(dev->ctrl.cap))
|
||||
writel(NVME_CMBMSC_CRE, dev->bar + NVME_REG_CMBMSC);
|
||||
|
||||
dev->cmbsz = readl(dev->bar + NVME_REG_CMBSZ);
|
||||
if (!dev->cmbsz)
|
||||
return;
|
||||
|
|
@ -1808,6 +1841,16 @@ static void nvme_map_cmb(struct nvme_dev *dev)
|
|||
if (offset > bar_size)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Tell the controller about the host side address mapping the CMB,
|
||||
* and enable CMB decoding for the NVMe 1.4+ scheme:
|
||||
*/
|
||||
if (NVME_CAP_CMBS(dev->ctrl.cap)) {
|
||||
hi_lo_writeq(NVME_CMBMSC_CRE | NVME_CMBMSC_CMSE |
|
||||
(pci_bus_address(pdev, bar) + offset),
|
||||
dev->bar + NVME_REG_CMBMSC);
|
||||
}
|
||||
|
||||
/*
|
||||
* Controllers may support a CMB size larger than their BAR,
|
||||
* for example, due to being behind a bridge. Reduce the CMB to
|
||||
|
|
|
|||
|
|
@ -97,6 +97,7 @@ struct nvme_rdma_queue {
|
|||
struct completion cm_done;
|
||||
bool pi_support;
|
||||
int cq_size;
|
||||
struct mutex queue_lock;
|
||||
};
|
||||
|
||||
struct nvme_rdma_ctrl {
|
||||
|
|
@ -579,6 +580,7 @@ static int nvme_rdma_alloc_queue(struct nvme_rdma_ctrl *ctrl,
|
|||
int ret;
|
||||
|
||||
queue = &ctrl->queues[idx];
|
||||
mutex_init(&queue->queue_lock);
|
||||
queue->ctrl = ctrl;
|
||||
if (idx && ctrl->ctrl.max_integrity_segments)
|
||||
queue->pi_support = true;
|
||||
|
|
@ -598,7 +600,8 @@ static int nvme_rdma_alloc_queue(struct nvme_rdma_ctrl *ctrl,
|
|||
if (IS_ERR(queue->cm_id)) {
|
||||
dev_info(ctrl->ctrl.device,
|
||||
"failed to create CM ID: %ld\n", PTR_ERR(queue->cm_id));
|
||||
return PTR_ERR(queue->cm_id);
|
||||
ret = PTR_ERR(queue->cm_id);
|
||||
goto out_destroy_mutex;
|
||||
}
|
||||
|
||||
if (ctrl->ctrl.opts->mask & NVMF_OPT_HOST_TRADDR)
|
||||
|
|
@ -628,6 +631,8 @@ static int nvme_rdma_alloc_queue(struct nvme_rdma_ctrl *ctrl,
|
|||
out_destroy_cm_id:
|
||||
rdma_destroy_id(queue->cm_id);
|
||||
nvme_rdma_destroy_queue_ib(queue);
|
||||
out_destroy_mutex:
|
||||
mutex_destroy(&queue->queue_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -639,9 +644,10 @@ static void __nvme_rdma_stop_queue(struct nvme_rdma_queue *queue)
|
|||
|
||||
static void nvme_rdma_stop_queue(struct nvme_rdma_queue *queue)
|
||||
{
|
||||
if (!test_and_clear_bit(NVME_RDMA_Q_LIVE, &queue->flags))
|
||||
return;
|
||||
__nvme_rdma_stop_queue(queue);
|
||||
mutex_lock(&queue->queue_lock);
|
||||
if (test_and_clear_bit(NVME_RDMA_Q_LIVE, &queue->flags))
|
||||
__nvme_rdma_stop_queue(queue);
|
||||
mutex_unlock(&queue->queue_lock);
|
||||
}
|
||||
|
||||
static void nvme_rdma_free_queue(struct nvme_rdma_queue *queue)
|
||||
|
|
@ -651,6 +657,7 @@ static void nvme_rdma_free_queue(struct nvme_rdma_queue *queue)
|
|||
|
||||
nvme_rdma_destroy_queue_ib(queue);
|
||||
rdma_destroy_id(queue->cm_id);
|
||||
mutex_destroy(&queue->queue_lock);
|
||||
}
|
||||
|
||||
static void nvme_rdma_free_io_queues(struct nvme_rdma_ctrl *ctrl)
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ struct nvme_tcp_queue {
|
|||
struct work_struct io_work;
|
||||
int io_cpu;
|
||||
|
||||
struct mutex queue_lock;
|
||||
struct mutex send_mutex;
|
||||
struct llist_head req_list;
|
||||
struct list_head send_list;
|
||||
|
|
@ -1219,6 +1220,7 @@ static void nvme_tcp_free_queue(struct nvme_ctrl *nctrl, int qid)
|
|||
|
||||
sock_release(queue->sock);
|
||||
kfree(queue->pdu);
|
||||
mutex_destroy(&queue->queue_lock);
|
||||
}
|
||||
|
||||
static int nvme_tcp_init_connection(struct nvme_tcp_queue *queue)
|
||||
|
|
@ -1380,6 +1382,7 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl,
|
|||
struct nvme_tcp_queue *queue = &ctrl->queues[qid];
|
||||
int ret, rcv_pdu_size;
|
||||
|
||||
mutex_init(&queue->queue_lock);
|
||||
queue->ctrl = ctrl;
|
||||
init_llist_head(&queue->req_list);
|
||||
INIT_LIST_HEAD(&queue->send_list);
|
||||
|
|
@ -1398,7 +1401,7 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl,
|
|||
if (ret) {
|
||||
dev_err(nctrl->device,
|
||||
"failed to create socket: %d\n", ret);
|
||||
return ret;
|
||||
goto err_destroy_mutex;
|
||||
}
|
||||
|
||||
/* Single syn retry */
|
||||
|
|
@ -1507,6 +1510,8 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl,
|
|||
err_sock:
|
||||
sock_release(queue->sock);
|
||||
queue->sock = NULL;
|
||||
err_destroy_mutex:
|
||||
mutex_destroy(&queue->queue_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1534,9 +1539,10 @@ static void nvme_tcp_stop_queue(struct nvme_ctrl *nctrl, int qid)
|
|||
struct nvme_tcp_ctrl *ctrl = to_tcp_ctrl(nctrl);
|
||||
struct nvme_tcp_queue *queue = &ctrl->queues[qid];
|
||||
|
||||
if (!test_and_clear_bit(NVME_TCP_Q_LIVE, &queue->flags))
|
||||
return;
|
||||
__nvme_tcp_stop_queue(queue);
|
||||
mutex_lock(&queue->queue_lock);
|
||||
if (test_and_clear_bit(NVME_TCP_Q_LIVE, &queue->flags))
|
||||
__nvme_tcp_stop_queue(queue);
|
||||
mutex_unlock(&queue->queue_lock);
|
||||
}
|
||||
|
||||
static int nvme_tcp_start_queue(struct nvme_ctrl *nctrl, int idx)
|
||||
|
|
|
|||
|
|
@ -487,8 +487,10 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req)
|
|||
|
||||
/* return an all zeroed buffer if we can't find an active namespace */
|
||||
ns = nvmet_find_namespace(ctrl, req->cmd->identify.nsid);
|
||||
if (!ns)
|
||||
if (!ns) {
|
||||
status = NVME_SC_INVALID_NS;
|
||||
goto done;
|
||||
}
|
||||
|
||||
nvmet_ns_revalidate(ns);
|
||||
|
||||
|
|
@ -541,7 +543,9 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req)
|
|||
id->nsattr |= (1 << 0);
|
||||
nvmet_put_namespace(ns);
|
||||
done:
|
||||
status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id));
|
||||
if (!status)
|
||||
status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id));
|
||||
|
||||
kfree(id);
|
||||
out:
|
||||
nvmet_req_complete(req, status);
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
obj-y += phy-ingenic-usb.o
|
||||
obj-$(CONFIG_PHY_INGENIC_USB) += phy-ingenic-usb.o
|
||||
|
|
|
|||
|
|
@ -49,7 +49,9 @@ config PHY_MTK_HDMI
|
|||
|
||||
config PHY_MTK_MIPI_DSI
|
||||
tristate "MediaTek MIPI-DSI Driver"
|
||||
depends on ARCH_MEDIATEK && OF
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
depends on COMMON_CLK
|
||||
depends on OF
|
||||
select GENERIC_PHY
|
||||
help
|
||||
Support MIPI DSI for Mediatek SoCs.
|
||||
|
|
|
|||
|
|
@ -662,35 +662,42 @@ static int cpcap_usb_phy_probe(struct platform_device *pdev)
|
|||
generic_phy = devm_phy_create(ddata->dev, NULL, &ops);
|
||||
if (IS_ERR(generic_phy)) {
|
||||
error = PTR_ERR(generic_phy);
|
||||
return PTR_ERR(generic_phy);
|
||||
goto out_reg_disable;
|
||||
}
|
||||
|
||||
phy_set_drvdata(generic_phy, ddata);
|
||||
|
||||
phy_provider = devm_of_phy_provider_register(ddata->dev,
|
||||
of_phy_simple_xlate);
|
||||
if (IS_ERR(phy_provider))
|
||||
return PTR_ERR(phy_provider);
|
||||
if (IS_ERR(phy_provider)) {
|
||||
error = PTR_ERR(phy_provider);
|
||||
goto out_reg_disable;
|
||||
}
|
||||
|
||||
error = cpcap_usb_init_optional_pins(ddata);
|
||||
if (error)
|
||||
return error;
|
||||
goto out_reg_disable;
|
||||
|
||||
cpcap_usb_init_optional_gpios(ddata);
|
||||
|
||||
error = cpcap_usb_init_iio(ddata);
|
||||
if (error)
|
||||
return error;
|
||||
goto out_reg_disable;
|
||||
|
||||
error = cpcap_usb_init_interrupts(pdev, ddata);
|
||||
if (error)
|
||||
return error;
|
||||
goto out_reg_disable;
|
||||
|
||||
usb_add_phy_dev(&ddata->phy);
|
||||
atomic_set(&ddata->active, 1);
|
||||
schedule_delayed_work(&ddata->detect_work, msecs_to_jiffies(1));
|
||||
|
||||
return 0;
|
||||
|
||||
out_reg_disable:
|
||||
regulator_disable(ddata->vusb);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int cpcap_usb_phy_remove(struct platform_device *pdev)
|
||||
|
|
|
|||
|
|
@ -214,7 +214,7 @@ int __init register_intc_controller(struct intc_desc *desc)
|
|||
d->window[k].phys = res->start;
|
||||
d->window[k].size = resource_size(res);
|
||||
d->window[k].virt = ioremap(res->start,
|
||||
resource_size(res));
|
||||
resource_size(res));
|
||||
if (!d->window[k].virt)
|
||||
goto err2;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
#include <linux/debugfs.h>
|
||||
#include "internals.h"
|
||||
|
||||
static int intc_irq_xlate_debug(struct seq_file *m, void *priv)
|
||||
static int intc_irq_xlate_show(struct seq_file *m, void *priv)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
@ -37,17 +37,7 @@ static int intc_irq_xlate_debug(struct seq_file *m, void *priv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int intc_irq_xlate_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, intc_irq_xlate_debug, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations intc_irq_xlate_fops = {
|
||||
.open = intc_irq_xlate_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
DEFINE_SHOW_ATTRIBUTE(intc_irq_xlate);
|
||||
|
||||
static int __init intc_irq_xlate_init(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2316,7 +2316,7 @@ static int icm_usb4_switch_nvm_authenticate_status(struct tb_switch *sw,
|
|||
|
||||
if (auth && auth->reply.route_hi == sw->config.route_hi &&
|
||||
auth->reply.route_lo == sw->config.route_lo) {
|
||||
tb_dbg(tb, "NVM_AUTH found for %llx flags 0x%#x status %#x\n",
|
||||
tb_dbg(tb, "NVM_AUTH found for %llx flags %#x status %#x\n",
|
||||
tb_route(sw), auth->reply.hdr.flags, auth->reply.status);
|
||||
if (auth->reply.hdr.flags & ICM_FLAGS_ERROR)
|
||||
ret = -EIO;
|
||||
|
|
|
|||
|
|
@ -648,6 +648,14 @@ static void wait_for_xmitr(struct uart_port *port)
|
|||
(val & STAT_TX_RDY(port)), 1, 10000);
|
||||
}
|
||||
|
||||
static void wait_for_xmite(struct uart_port *port)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
readl_poll_timeout_atomic(port->membase + UART_STAT, val,
|
||||
(val & STAT_TX_EMP), 1, 10000);
|
||||
}
|
||||
|
||||
static void mvebu_uart_console_putchar(struct uart_port *port, int ch)
|
||||
{
|
||||
wait_for_xmitr(port);
|
||||
|
|
@ -675,7 +683,7 @@ static void mvebu_uart_console_write(struct console *co, const char *s,
|
|||
|
||||
uart_console_write(port, s, count, mvebu_uart_console_putchar);
|
||||
|
||||
wait_for_xmitr(port);
|
||||
wait_for_xmite(port);
|
||||
|
||||
if (ier)
|
||||
writel(ier, port->membase + UART_CTRL(port));
|
||||
|
|
|
|||
|
|
@ -143,9 +143,8 @@ LIST_HEAD(tty_drivers); /* linked list of tty drivers */
|
|||
DEFINE_MUTEX(tty_mutex);
|
||||
|
||||
static ssize_t tty_read(struct file *, char __user *, size_t, loff_t *);
|
||||
static ssize_t tty_write(struct file *, const char __user *, size_t, loff_t *);
|
||||
ssize_t redirected_tty_write(struct file *, const char __user *,
|
||||
size_t, loff_t *);
|
||||
static ssize_t tty_write(struct kiocb *, struct iov_iter *);
|
||||
ssize_t redirected_tty_write(struct kiocb *, struct iov_iter *);
|
||||
static __poll_t tty_poll(struct file *, poll_table *);
|
||||
static int tty_open(struct inode *, struct file *);
|
||||
long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
||||
|
|
@ -438,8 +437,7 @@ static ssize_t hung_up_tty_read(struct file *file, char __user *buf,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t hung_up_tty_write(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
static ssize_t hung_up_tty_write(struct kiocb *iocb, struct iov_iter *from)
|
||||
{
|
||||
return -EIO;
|
||||
}
|
||||
|
|
@ -478,7 +476,8 @@ static void tty_show_fdinfo(struct seq_file *m, struct file *file)
|
|||
static const struct file_operations tty_fops = {
|
||||
.llseek = no_llseek,
|
||||
.read = tty_read,
|
||||
.write = tty_write,
|
||||
.write_iter = tty_write,
|
||||
.splice_write = iter_file_splice_write,
|
||||
.poll = tty_poll,
|
||||
.unlocked_ioctl = tty_ioctl,
|
||||
.compat_ioctl = tty_compat_ioctl,
|
||||
|
|
@ -491,7 +490,8 @@ static const struct file_operations tty_fops = {
|
|||
static const struct file_operations console_fops = {
|
||||
.llseek = no_llseek,
|
||||
.read = tty_read,
|
||||
.write = redirected_tty_write,
|
||||
.write_iter = redirected_tty_write,
|
||||
.splice_write = iter_file_splice_write,
|
||||
.poll = tty_poll,
|
||||
.unlocked_ioctl = tty_ioctl,
|
||||
.compat_ioctl = tty_compat_ioctl,
|
||||
|
|
@ -503,7 +503,7 @@ static const struct file_operations console_fops = {
|
|||
static const struct file_operations hung_up_tty_fops = {
|
||||
.llseek = no_llseek,
|
||||
.read = hung_up_tty_read,
|
||||
.write = hung_up_tty_write,
|
||||
.write_iter = hung_up_tty_write,
|
||||
.poll = hung_up_tty_poll,
|
||||
.unlocked_ioctl = hung_up_tty_ioctl,
|
||||
.compat_ioctl = hung_up_tty_compat_ioctl,
|
||||
|
|
@ -606,9 +606,9 @@ static void __tty_hangup(struct tty_struct *tty, int exit_session)
|
|||
/* This breaks for file handles being sent over AF_UNIX sockets ? */
|
||||
list_for_each_entry(priv, &tty->tty_files, list) {
|
||||
filp = priv->file;
|
||||
if (filp->f_op->write == redirected_tty_write)
|
||||
if (filp->f_op->write_iter == redirected_tty_write)
|
||||
cons_filp = filp;
|
||||
if (filp->f_op->write != tty_write)
|
||||
if (filp->f_op->write_iter != tty_write)
|
||||
continue;
|
||||
closecount++;
|
||||
__tty_fasync(-1, filp, 0); /* can't block */
|
||||
|
|
@ -901,9 +901,9 @@ static inline ssize_t do_tty_write(
|
|||
ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t),
|
||||
struct tty_struct *tty,
|
||||
struct file *file,
|
||||
const char __user *buf,
|
||||
size_t count)
|
||||
struct iov_iter *from)
|
||||
{
|
||||
size_t count = iov_iter_count(from);
|
||||
ssize_t ret, written = 0;
|
||||
unsigned int chunk;
|
||||
|
||||
|
|
@ -955,14 +955,20 @@ static inline ssize_t do_tty_write(
|
|||
size_t size = count;
|
||||
if (size > chunk)
|
||||
size = chunk;
|
||||
|
||||
ret = -EFAULT;
|
||||
if (copy_from_user(tty->write_buf, buf, size))
|
||||
if (copy_from_iter(tty->write_buf, size, from) != size)
|
||||
break;
|
||||
|
||||
ret = write(tty, file, tty->write_buf, size);
|
||||
if (ret <= 0)
|
||||
break;
|
||||
|
||||
/* FIXME! Have Al check this! */
|
||||
if (ret != size)
|
||||
iov_iter_revert(from, size-ret);
|
||||
|
||||
written += ret;
|
||||
buf += ret;
|
||||
count -= ret;
|
||||
if (!count)
|
||||
break;
|
||||
|
|
@ -1022,9 +1028,9 @@ void tty_write_message(struct tty_struct *tty, char *msg)
|
|||
* write method will not be invoked in parallel for each device.
|
||||
*/
|
||||
|
||||
static ssize_t tty_write(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
static ssize_t tty_write(struct kiocb *iocb, struct iov_iter *from)
|
||||
{
|
||||
struct file *file = iocb->ki_filp;
|
||||
struct tty_struct *tty = file_tty(file);
|
||||
struct tty_ldisc *ld;
|
||||
ssize_t ret;
|
||||
|
|
@ -1038,17 +1044,16 @@ static ssize_t tty_write(struct file *file, const char __user *buf,
|
|||
tty_err(tty, "missing write_room method\n");
|
||||
ld = tty_ldisc_ref_wait(tty);
|
||||
if (!ld)
|
||||
return hung_up_tty_write(file, buf, count, ppos);
|
||||
return hung_up_tty_write(iocb, from);
|
||||
if (!ld->ops->write)
|
||||
ret = -EIO;
|
||||
else
|
||||
ret = do_tty_write(ld->ops->write, tty, file, buf, count);
|
||||
ret = do_tty_write(ld->ops->write, tty, file, from);
|
||||
tty_ldisc_deref(ld);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ssize_t redirected_tty_write(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
ssize_t redirected_tty_write(struct kiocb *iocb, struct iov_iter *iter)
|
||||
{
|
||||
struct file *p = NULL;
|
||||
|
||||
|
|
@ -1059,11 +1064,11 @@ ssize_t redirected_tty_write(struct file *file, const char __user *buf,
|
|||
|
||||
if (p) {
|
||||
ssize_t res;
|
||||
res = vfs_write(p, buf, count, &p->f_pos);
|
||||
res = vfs_iocb_iter_write(p, iocb, iter);
|
||||
fput(p);
|
||||
return res;
|
||||
}
|
||||
return tty_write(file, buf, count, ppos);
|
||||
return tty_write(iocb, iter);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -2295,7 +2300,7 @@ static int tioccons(struct file *file)
|
|||
{
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
if (file->f_op->write == redirected_tty_write) {
|
||||
if (file->f_op->write_iter == redirected_tty_write) {
|
||||
struct file *f;
|
||||
spin_lock(&redirect_lock);
|
||||
f = redirect;
|
||||
|
|
|
|||
|
|
@ -185,7 +185,11 @@ static int cdns_imx_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
data->num_clks = ARRAY_SIZE(imx_cdns3_core_clks);
|
||||
data->clks = (struct clk_bulk_data *)imx_cdns3_core_clks;
|
||||
data->clks = devm_kmemdup(dev, imx_cdns3_core_clks,
|
||||
sizeof(imx_cdns3_core_clks), GFP_KERNEL);
|
||||
if (!data->clks)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = devm_clk_bulk_get(dev, data->num_clks, data->clks);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
@ -214,20 +218,16 @@ static int cdns_imx_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int cdns_imx_remove_core(struct device *dev, void *data)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
|
||||
platform_device_unregister(pdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cdns_imx_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct cdns_imx *data = dev_get_drvdata(dev);
|
||||
|
||||
device_for_each_child(dev, NULL, cdns_imx_remove_core);
|
||||
pm_runtime_get_sync(dev);
|
||||
of_platform_depopulate(dev);
|
||||
clk_bulk_disable_unprepare(data->num_clks, data->clks);
|
||||
pm_runtime_disable(dev);
|
||||
pm_runtime_put_noidle(dev);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -420,7 +420,10 @@ static void ast_vhub_stop_active_req(struct ast_vhub_ep *ep,
|
|||
u32 state, reg, loops;
|
||||
|
||||
/* Stop DMA activity */
|
||||
writel(0, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);
|
||||
if (ep->epn.desc_mode)
|
||||
writel(VHUB_EP_DMA_CTRL_RESET, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);
|
||||
else
|
||||
writel(0, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);
|
||||
|
||||
/* Wait for it to complete */
|
||||
for (loops = 0; loops < 1000; loops++) {
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ if USB_BDC_UDC
|
|||
comment "Platform Support"
|
||||
config USB_BDC_PCI
|
||||
tristate "BDC support for PCIe based platforms"
|
||||
depends on USB_PCI
|
||||
depends on USB_PCI && BROKEN
|
||||
default USB_BDC_UDC
|
||||
help
|
||||
Enable support for platforms which have BDC connected through PCIe, such as Lego3 FPGA platform.
|
||||
|
|
|
|||
|
|
@ -1529,10 +1529,13 @@ static ssize_t soft_connect_store(struct device *dev,
|
|||
struct device_attribute *attr, const char *buf, size_t n)
|
||||
{
|
||||
struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
|
||||
ssize_t ret;
|
||||
|
||||
mutex_lock(&udc_lock);
|
||||
if (!udc->driver) {
|
||||
dev_err(dev, "soft-connect without a gadget driver\n");
|
||||
return -EOPNOTSUPP;
|
||||
ret = -EOPNOTSUPP;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (sysfs_streq(buf, "connect")) {
|
||||
|
|
@ -1543,10 +1546,14 @@ static ssize_t soft_connect_store(struct device *dev,
|
|||
usb_gadget_udc_stop(udc);
|
||||
} else {
|
||||
dev_err(dev, "unsupported command '%s'\n", buf);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
return n;
|
||||
ret = n;
|
||||
out:
|
||||
mutex_unlock(&udc_lock);
|
||||
return ret;
|
||||
}
|
||||
static DEVICE_ATTR_WO(soft_connect);
|
||||
|
||||
|
|
|
|||
|
|
@ -2270,17 +2270,20 @@ static int dummy_hub_control(
|
|||
}
|
||||
fallthrough;
|
||||
case USB_PORT_FEAT_RESET:
|
||||
if (!(dum_hcd->port_status & USB_PORT_STAT_CONNECTION))
|
||||
break;
|
||||
/* if it's already enabled, disable */
|
||||
if (hcd->speed == HCD_USB3) {
|
||||
dum_hcd->port_status = 0;
|
||||
dum_hcd->port_status =
|
||||
(USB_SS_PORT_STAT_POWER |
|
||||
USB_PORT_STAT_CONNECTION |
|
||||
USB_PORT_STAT_RESET);
|
||||
} else
|
||||
} else {
|
||||
dum_hcd->port_status &= ~(USB_PORT_STAT_ENABLE
|
||||
| USB_PORT_STAT_LOW_SPEED
|
||||
| USB_PORT_STAT_HIGH_SPEED);
|
||||
dum_hcd->port_status |= USB_PORT_STAT_RESET;
|
||||
}
|
||||
/*
|
||||
* We want to reset device status. All but the
|
||||
* Self powered feature
|
||||
|
|
@ -2292,7 +2295,8 @@ static int dummy_hub_control(
|
|||
* interval? Is it still 50msec as for HS?
|
||||
*/
|
||||
dum_hcd->re_timeout = jiffies + msecs_to_jiffies(50);
|
||||
fallthrough;
|
||||
set_link_state(dum_hcd);
|
||||
break;
|
||||
case USB_PORT_FEAT_C_CONNECTION:
|
||||
case USB_PORT_FEAT_C_RESET:
|
||||
case USB_PORT_FEAT_C_ENABLE:
|
||||
|
|
|
|||
|
|
@ -574,6 +574,7 @@ static int ehci_run (struct usb_hcd *hcd)
|
|||
struct ehci_hcd *ehci = hcd_to_ehci (hcd);
|
||||
u32 temp;
|
||||
u32 hcc_params;
|
||||
int rc;
|
||||
|
||||
hcd->uses_new_polling = 1;
|
||||
|
||||
|
|
@ -629,9 +630,20 @@ static int ehci_run (struct usb_hcd *hcd)
|
|||
down_write(&ehci_cf_port_reset_rwsem);
|
||||
ehci->rh_state = EHCI_RH_RUNNING;
|
||||
ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag);
|
||||
|
||||
/* Wait until HC become operational */
|
||||
ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */
|
||||
msleep(5);
|
||||
rc = ehci_handshake(ehci, &ehci->regs->status, STS_HALT, 0, 100 * 1000);
|
||||
|
||||
up_write(&ehci_cf_port_reset_rwsem);
|
||||
|
||||
if (rc) {
|
||||
ehci_err(ehci, "USB %x.%x, controller refused to start: %d\n",
|
||||
((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
ehci->last_periodic_enable = ktime_get_real();
|
||||
|
||||
temp = HC_VERSION(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase));
|
||||
|
|
|
|||
|
|
@ -345,6 +345,9 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
|
|||
|
||||
unlink_empty_async_suspended(ehci);
|
||||
|
||||
/* Some Synopsys controllers mistakenly leave IAA turned on */
|
||||
ehci_writel(ehci, STS_IAA, &ehci->regs->status);
|
||||
|
||||
/* Any IAA cycle that started before the suspend is now invalid */
|
||||
end_iaa_cycle(ehci);
|
||||
ehci_handle_start_intr_unlinks(ehci);
|
||||
|
|
|
|||
|
|
@ -2931,6 +2931,8 @@ static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring,
|
|||
trb->field[0] = cpu_to_le32(field1);
|
||||
trb->field[1] = cpu_to_le32(field2);
|
||||
trb->field[2] = cpu_to_le32(field3);
|
||||
/* make sure TRB is fully written before giving it to the controller */
|
||||
wmb();
|
||||
trb->field[3] = cpu_to_le32(field4);
|
||||
|
||||
trace_xhci_queue_trb(ring, trb);
|
||||
|
|
|
|||
|
|
@ -623,6 +623,13 @@ static void tegra_xusb_mbox_handle(struct tegra_xusb *tegra,
|
|||
enable);
|
||||
if (err < 0)
|
||||
break;
|
||||
|
||||
/*
|
||||
* wait 500us for LFPS detector to be disabled before
|
||||
* sending ACK
|
||||
*/
|
||||
if (!enable)
|
||||
usleep_range(500, 1000);
|
||||
}
|
||||
|
||||
if (err < 0) {
|
||||
|
|
|
|||
|
|
@ -2195,7 +2195,7 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
|
|||
if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)
|
||||
tcon->nohandlecache = ctx->nohandlecache;
|
||||
else
|
||||
tcon->nohandlecache = 1;
|
||||
tcon->nohandlecache = true;
|
||||
tcon->nodelete = ctx->nodelete;
|
||||
tcon->local_lease = ctx->local_lease;
|
||||
INIT_LIST_HEAD(&tcon->pending_opens);
|
||||
|
|
@ -2628,7 +2628,7 @@ void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
|
|||
} else if (ctx)
|
||||
tcon->unix_ext = 1; /* Unix Extensions supported */
|
||||
|
||||
if (tcon->unix_ext == 0) {
|
||||
if (!tcon->unix_ext) {
|
||||
cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -338,7 +338,7 @@ __smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
|
|||
if (ssocket == NULL)
|
||||
return -EAGAIN;
|
||||
|
||||
if (signal_pending(current)) {
|
||||
if (fatal_signal_pending(current)) {
|
||||
cifs_dbg(FYI, "signal pending before send request\n");
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
|
|
@ -429,7 +429,7 @@ __smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
|
|||
|
||||
if (signal_pending(current) && (total_len != send_length)) {
|
||||
cifs_dbg(FYI, "signal is pending after attempt to send\n");
|
||||
rc = -EINTR;
|
||||
rc = -ERESTARTSYS;
|
||||
}
|
||||
|
||||
/* uncork it */
|
||||
|
|
|
|||
|
|
@ -1025,6 +1025,7 @@ static ssize_t io_import_iovec(int rw, struct io_kiocb *req,
|
|||
static int io_setup_async_rw(struct io_kiocb *req, const struct iovec *iovec,
|
||||
const struct iovec *fast_iov,
|
||||
struct iov_iter *iter, bool force);
|
||||
static void io_req_drop_files(struct io_kiocb *req);
|
||||
|
||||
static struct kmem_cache *req_cachep;
|
||||
|
||||
|
|
@ -1048,8 +1049,7 @@ EXPORT_SYMBOL(io_uring_get_socket);
|
|||
|
||||
static inline void io_clean_op(struct io_kiocb *req)
|
||||
{
|
||||
if (req->flags & (REQ_F_NEED_CLEANUP | REQ_F_BUFFER_SELECTED |
|
||||
REQ_F_INFLIGHT))
|
||||
if (req->flags & (REQ_F_NEED_CLEANUP | REQ_F_BUFFER_SELECTED))
|
||||
__io_clean_op(req);
|
||||
}
|
||||
|
||||
|
|
@ -1075,8 +1075,11 @@ static bool io_match_task(struct io_kiocb *head,
|
|||
return true;
|
||||
|
||||
io_for_each_link(req, head) {
|
||||
if ((req->flags & REQ_F_WORK_INITIALIZED) &&
|
||||
(req->work.flags & IO_WQ_WORK_FILES) &&
|
||||
if (!(req->flags & REQ_F_WORK_INITIALIZED))
|
||||
continue;
|
||||
if (req->file && req->file->f_op == &io_uring_fops)
|
||||
return true;
|
||||
if ((req->work.flags & IO_WQ_WORK_FILES) &&
|
||||
req->work.identity->files == files)
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1394,6 +1397,8 @@ static void io_req_clean_work(struct io_kiocb *req)
|
|||
free_fs_struct(fs);
|
||||
req->work.flags &= ~IO_WQ_WORK_FS;
|
||||
}
|
||||
if (req->flags & REQ_F_INFLIGHT)
|
||||
io_req_drop_files(req);
|
||||
|
||||
io_put_identity(req->task->io_uring, req);
|
||||
}
|
||||
|
|
@ -1503,11 +1508,14 @@ static bool io_grab_identity(struct io_kiocb *req)
|
|||
return false;
|
||||
atomic_inc(&id->files->count);
|
||||
get_nsproxy(id->nsproxy);
|
||||
req->flags |= REQ_F_INFLIGHT;
|
||||
|
||||
spin_lock_irq(&ctx->inflight_lock);
|
||||
list_add(&req->inflight_entry, &ctx->inflight_list);
|
||||
spin_unlock_irq(&ctx->inflight_lock);
|
||||
if (!(req->flags & REQ_F_INFLIGHT)) {
|
||||
req->flags |= REQ_F_INFLIGHT;
|
||||
|
||||
spin_lock_irq(&ctx->inflight_lock);
|
||||
list_add(&req->inflight_entry, &ctx->inflight_list);
|
||||
spin_unlock_irq(&ctx->inflight_lock);
|
||||
}
|
||||
req->work.flags |= IO_WQ_WORK_FILES;
|
||||
}
|
||||
if (!(req->work.flags & IO_WQ_WORK_MM) &&
|
||||
|
|
@ -2270,6 +2278,8 @@ static void io_req_free_batch_finish(struct io_ring_ctx *ctx,
|
|||
struct io_uring_task *tctx = rb->task->io_uring;
|
||||
|
||||
percpu_counter_sub(&tctx->inflight, rb->task_refs);
|
||||
if (atomic_read(&tctx->in_idle))
|
||||
wake_up(&tctx->wait);
|
||||
put_task_struct_many(rb->task, rb->task_refs);
|
||||
rb->task = NULL;
|
||||
}
|
||||
|
|
@ -2288,6 +2298,8 @@ static void io_req_free_batch(struct req_batch *rb, struct io_kiocb *req)
|
|||
struct io_uring_task *tctx = rb->task->io_uring;
|
||||
|
||||
percpu_counter_sub(&tctx->inflight, rb->task_refs);
|
||||
if (atomic_read(&tctx->in_idle))
|
||||
wake_up(&tctx->wait);
|
||||
put_task_struct_many(rb->task, rb->task_refs);
|
||||
}
|
||||
rb->task = req->task;
|
||||
|
|
@ -3548,7 +3560,7 @@ static int io_read(struct io_kiocb *req, bool force_nonblock,
|
|||
|
||||
/* read it all, or we did blocking attempt. no retry. */
|
||||
if (!iov_iter_count(iter) || !force_nonblock ||
|
||||
(req->file->f_flags & O_NONBLOCK))
|
||||
(req->file->f_flags & O_NONBLOCK) || !(req->flags & REQ_F_ISREG))
|
||||
goto done;
|
||||
|
||||
io_size -= ret;
|
||||
|
|
@ -4468,7 +4480,6 @@ static int io_close_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
|
|||
* io_wq_work.flags, so initialize io_wq_work firstly.
|
||||
*/
|
||||
io_req_init_async(req);
|
||||
req->work.flags |= IO_WQ_WORK_NO_CANCEL;
|
||||
|
||||
if (unlikely(req->ctx->flags & IORING_SETUP_IOPOLL))
|
||||
return -EINVAL;
|
||||
|
|
@ -4501,6 +4512,8 @@ static int io_close(struct io_kiocb *req, bool force_nonblock,
|
|||
|
||||
/* if the file has a flush method, be safe and punt to async */
|
||||
if (close->put_file->f_op->flush && force_nonblock) {
|
||||
/* not safe to cancel at this point */
|
||||
req->work.flags |= IO_WQ_WORK_NO_CANCEL;
|
||||
/* was never set, but play safe */
|
||||
req->flags &= ~REQ_F_NOWAIT;
|
||||
/* avoid grabbing files - we don't need the files */
|
||||
|
|
@ -6157,8 +6170,10 @@ static void io_req_drop_files(struct io_kiocb *req)
|
|||
struct io_uring_task *tctx = req->task->io_uring;
|
||||
unsigned long flags;
|
||||
|
||||
put_files_struct(req->work.identity->files);
|
||||
put_nsproxy(req->work.identity->nsproxy);
|
||||
if (req->work.flags & IO_WQ_WORK_FILES) {
|
||||
put_files_struct(req->work.identity->files);
|
||||
put_nsproxy(req->work.identity->nsproxy);
|
||||
}
|
||||
spin_lock_irqsave(&ctx->inflight_lock, flags);
|
||||
list_del(&req->inflight_entry);
|
||||
spin_unlock_irqrestore(&ctx->inflight_lock, flags);
|
||||
|
|
@ -6225,9 +6240,6 @@ static void __io_clean_op(struct io_kiocb *req)
|
|||
}
|
||||
req->flags &= ~REQ_F_NEED_CLEANUP;
|
||||
}
|
||||
|
||||
if (req->flags & REQ_F_INFLIGHT)
|
||||
io_req_drop_files(req);
|
||||
}
|
||||
|
||||
static int io_issue_sqe(struct io_kiocb *req, bool force_nonblock,
|
||||
|
|
@ -6446,6 +6458,15 @@ static struct file *io_file_get(struct io_submit_state *state,
|
|||
file = __io_file_get(state, fd);
|
||||
}
|
||||
|
||||
if (file && file->f_op == &io_uring_fops) {
|
||||
io_req_init_async(req);
|
||||
req->flags |= REQ_F_INFLIGHT;
|
||||
|
||||
spin_lock_irq(&ctx->inflight_lock);
|
||||
list_add(&req->inflight_entry, &ctx->inflight_list);
|
||||
spin_unlock_irq(&ctx->inflight_lock);
|
||||
}
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
|
|
@ -8856,8 +8877,7 @@ static void io_uring_cancel_files(struct io_ring_ctx *ctx,
|
|||
|
||||
spin_lock_irq(&ctx->inflight_lock);
|
||||
list_for_each_entry(req, &ctx->inflight_list, inflight_entry) {
|
||||
if (req->task != task ||
|
||||
req->work.identity->files != files)
|
||||
if (!io_match_task(req, task, files))
|
||||
continue;
|
||||
found = true;
|
||||
break;
|
||||
|
|
@ -8874,6 +8894,7 @@ static void io_uring_cancel_files(struct io_ring_ctx *ctx,
|
|||
io_wq_cancel_cb(ctx->io_wq, io_cancel_task_cb, &cancel, true);
|
||||
io_poll_remove_all(ctx, task, files);
|
||||
io_kill_timeouts(ctx, task, files);
|
||||
io_cqring_overflow_flush(ctx, true, task, files);
|
||||
/* cancellations _may_ trigger task work */
|
||||
io_run_task_work();
|
||||
schedule();
|
||||
|
|
@ -8914,8 +8935,6 @@ static void __io_uring_cancel_task_requests(struct io_ring_ctx *ctx,
|
|||
|
||||
static void io_disable_sqo_submit(struct io_ring_ctx *ctx)
|
||||
{
|
||||
WARN_ON_ONCE(ctx->sqo_task != current);
|
||||
|
||||
mutex_lock(&ctx->uring_lock);
|
||||
ctx->sqo_dead = 1;
|
||||
mutex_unlock(&ctx->uring_lock);
|
||||
|
|
@ -8937,6 +8956,7 @@ static void io_uring_cancel_task_requests(struct io_ring_ctx *ctx,
|
|||
|
||||
if ((ctx->flags & IORING_SETUP_SQPOLL) && ctx->sq_data) {
|
||||
/* for SQPOLL only sqo_task has task notes */
|
||||
WARN_ON_ONCE(ctx->sqo_task != current);
|
||||
io_disable_sqo_submit(ctx);
|
||||
task = ctx->sq_data->thread;
|
||||
atomic_inc(&task->io_uring->in_idle);
|
||||
|
|
@ -9082,6 +9102,10 @@ void __io_uring_task_cancel(void)
|
|||
/* make sure overflow events are dropped */
|
||||
atomic_inc(&tctx->in_idle);
|
||||
|
||||
/* trigger io_disable_sqo_submit() */
|
||||
if (tctx->sqpoll)
|
||||
__io_uring_files_cancel(NULL);
|
||||
|
||||
do {
|
||||
/* read completions before cancelations */
|
||||
inflight = tctx_inflight(tctx);
|
||||
|
|
@ -9128,7 +9152,10 @@ static int io_uring_flush(struct file *file, void *data)
|
|||
|
||||
if (ctx->flags & IORING_SETUP_SQPOLL) {
|
||||
/* there is only one file note, which is owned by sqo_task */
|
||||
WARN_ON_ONCE((ctx->sqo_task == current) ==
|
||||
WARN_ON_ONCE(ctx->sqo_task != current &&
|
||||
xa_load(&tctx->xa, (unsigned long)file));
|
||||
/* sqo_dead check is for when this happens after cancellation */
|
||||
WARN_ON_ONCE(ctx->sqo_task == current && !ctx->sqo_dead &&
|
||||
!xa_load(&tctx->xa, (unsigned long)file));
|
||||
|
||||
io_disable_sqo_submit(ctx);
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/pagemap.h>
|
||||
#include <linux/sched/mm.h>
|
||||
#include <linux/fsnotify.h>
|
||||
#include <linux/uio.h>
|
||||
|
||||
#include "kernfs-internal.h"
|
||||
|
||||
|
|
@ -180,11 +181,10 @@ static const struct seq_operations kernfs_seq_ops = {
|
|||
* it difficult to use seq_file. Implement simplistic custom buffering for
|
||||
* bin files.
|
||||
*/
|
||||
static ssize_t kernfs_file_direct_read(struct kernfs_open_file *of,
|
||||
char __user *user_buf, size_t count,
|
||||
loff_t *ppos)
|
||||
static ssize_t kernfs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
{
|
||||
ssize_t len = min_t(size_t, count, PAGE_SIZE);
|
||||
struct kernfs_open_file *of = kernfs_of(iocb->ki_filp);
|
||||
ssize_t len = min_t(size_t, iov_iter_count(iter), PAGE_SIZE);
|
||||
const struct kernfs_ops *ops;
|
||||
char *buf;
|
||||
|
||||
|
|
@ -210,7 +210,7 @@ static ssize_t kernfs_file_direct_read(struct kernfs_open_file *of,
|
|||
of->event = atomic_read(&of->kn->attr.open->event);
|
||||
ops = kernfs_ops(of->kn);
|
||||
if (ops->read)
|
||||
len = ops->read(of, buf, len, *ppos);
|
||||
len = ops->read(of, buf, len, iocb->ki_pos);
|
||||
else
|
||||
len = -EINVAL;
|
||||
|
||||
|
|
@ -220,12 +220,12 @@ static ssize_t kernfs_file_direct_read(struct kernfs_open_file *of,
|
|||
if (len < 0)
|
||||
goto out_free;
|
||||
|
||||
if (copy_to_user(user_buf, buf, len)) {
|
||||
if (copy_to_iter(buf, len, iter) != len) {
|
||||
len = -EFAULT;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
*ppos += len;
|
||||
iocb->ki_pos += len;
|
||||
|
||||
out_free:
|
||||
if (buf == of->prealloc_buf)
|
||||
|
|
@ -235,31 +235,14 @@ static ssize_t kernfs_file_direct_read(struct kernfs_open_file *of,
|
|||
return len;
|
||||
}
|
||||
|
||||
/**
|
||||
* kernfs_fop_read - kernfs vfs read callback
|
||||
* @file: file pointer
|
||||
* @user_buf: data to write
|
||||
* @count: number of bytes
|
||||
* @ppos: starting offset
|
||||
*/
|
||||
static ssize_t kernfs_fop_read(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
static ssize_t kernfs_fop_read_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
{
|
||||
struct kernfs_open_file *of = kernfs_of(file);
|
||||
|
||||
if (of->kn->flags & KERNFS_HAS_SEQ_SHOW)
|
||||
return seq_read(file, user_buf, count, ppos);
|
||||
else
|
||||
return kernfs_file_direct_read(of, user_buf, count, ppos);
|
||||
if (kernfs_of(iocb->ki_filp)->kn->flags & KERNFS_HAS_SEQ_SHOW)
|
||||
return seq_read_iter(iocb, iter);
|
||||
return kernfs_file_read_iter(iocb, iter);
|
||||
}
|
||||
|
||||
/**
|
||||
* kernfs_fop_write - kernfs vfs write callback
|
||||
* @file: file pointer
|
||||
* @user_buf: data to write
|
||||
* @count: number of bytes
|
||||
* @ppos: starting offset
|
||||
*
|
||||
/*
|
||||
* Copy data in from userland and pass it to the matching kernfs write
|
||||
* operation.
|
||||
*
|
||||
|
|
@ -269,20 +252,18 @@ static ssize_t kernfs_fop_read(struct file *file, char __user *user_buf,
|
|||
* modify only the the value you're changing, then write entire buffer
|
||||
* back.
|
||||
*/
|
||||
static ssize_t kernfs_fop_write(struct file *file, const char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
static ssize_t kernfs_fop_write_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
{
|
||||
struct kernfs_open_file *of = kernfs_of(file);
|
||||
struct kernfs_open_file *of = kernfs_of(iocb->ki_filp);
|
||||
ssize_t len = iov_iter_count(iter);
|
||||
const struct kernfs_ops *ops;
|
||||
ssize_t len;
|
||||
char *buf;
|
||||
|
||||
if (of->atomic_write_len) {
|
||||
len = count;
|
||||
if (len > of->atomic_write_len)
|
||||
return -E2BIG;
|
||||
} else {
|
||||
len = min_t(size_t, count, PAGE_SIZE);
|
||||
len = min_t(size_t, len, PAGE_SIZE);
|
||||
}
|
||||
|
||||
buf = of->prealloc_buf;
|
||||
|
|
@ -293,7 +274,7 @@ static ssize_t kernfs_fop_write(struct file *file, const char __user *user_buf,
|
|||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
if (copy_from_user(buf, user_buf, len)) {
|
||||
if (copy_from_iter(buf, len, iter) != len) {
|
||||
len = -EFAULT;
|
||||
goto out_free;
|
||||
}
|
||||
|
|
@ -312,7 +293,7 @@ static ssize_t kernfs_fop_write(struct file *file, const char __user *user_buf,
|
|||
|
||||
ops = kernfs_ops(of->kn);
|
||||
if (ops->write)
|
||||
len = ops->write(of, buf, len, *ppos);
|
||||
len = ops->write(of, buf, len, iocb->ki_pos);
|
||||
else
|
||||
len = -EINVAL;
|
||||
|
||||
|
|
@ -320,7 +301,7 @@ static ssize_t kernfs_fop_write(struct file *file, const char __user *user_buf,
|
|||
mutex_unlock(&of->mutex);
|
||||
|
||||
if (len > 0)
|
||||
*ppos += len;
|
||||
iocb->ki_pos += len;
|
||||
|
||||
out_free:
|
||||
if (buf == of->prealloc_buf)
|
||||
|
|
@ -673,7 +654,7 @@ static int kernfs_fop_open(struct inode *inode, struct file *file)
|
|||
|
||||
/*
|
||||
* Write path needs to atomic_write_len outside active reference.
|
||||
* Cache it in open_file. See kernfs_fop_write() for details.
|
||||
* Cache it in open_file. See kernfs_fop_write_iter() for details.
|
||||
*/
|
||||
of->atomic_write_len = ops->atomic_write_len;
|
||||
|
||||
|
|
@ -960,14 +941,16 @@ void kernfs_notify(struct kernfs_node *kn)
|
|||
EXPORT_SYMBOL_GPL(kernfs_notify);
|
||||
|
||||
const struct file_operations kernfs_file_fops = {
|
||||
.read = kernfs_fop_read,
|
||||
.write = kernfs_fop_write,
|
||||
.read_iter = kernfs_fop_read_iter,
|
||||
.write_iter = kernfs_fop_write_iter,
|
||||
.llseek = generic_file_llseek,
|
||||
.mmap = kernfs_fop_mmap,
|
||||
.open = kernfs_fop_open,
|
||||
.release = kernfs_fop_release,
|
||||
.poll = kernfs_fop_poll,
|
||||
.fsync = noop_fsync,
|
||||
.splice_read = generic_file_splice_read,
|
||||
.splice_write = iter_file_splice_write,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1770,6 +1770,12 @@ static int process_sysctl_arg(char *param, char *val,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (!val)
|
||||
return -EINVAL;
|
||||
len = strlen(val);
|
||||
if (len == 0)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* To set sysctl options, we use a temporary mount of proc, look up the
|
||||
* respective sys/ file and write to it. To avoid mounting it when no
|
||||
|
|
@ -1811,7 +1817,6 @@ static int process_sysctl_arg(char *param, char *val,
|
|||
file, param, val);
|
||||
goto out;
|
||||
}
|
||||
len = strlen(val);
|
||||
wret = kernel_write(file, val, len, &pos);
|
||||
if (wret < 0) {
|
||||
err = wret;
|
||||
|
|
|
|||
|
|
@ -609,6 +609,18 @@ static inline const char *dev_name(const struct device *dev)
|
|||
return kobject_name(&dev->kobj);
|
||||
}
|
||||
|
||||
/**
|
||||
* dev_bus_name - Return a device's bus/class name, if at all possible
|
||||
* @dev: struct device to get the bus/class name of
|
||||
*
|
||||
* Will return the name of the bus/class the device is attached to. If it is
|
||||
* not attached to a bus/class, an empty string will be returned.
|
||||
*/
|
||||
static inline const char *dev_bus_name(const struct device *dev)
|
||||
{
|
||||
return dev->bus ? dev->bus->name : (dev->class ? dev->class->name : "");
|
||||
}
|
||||
|
||||
__printf(2, 3) int dev_set_name(struct device *dev, const char *name, ...);
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user