mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
Merge 5.6-rc7 into android-mainline
Linux 5.6-rc7 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ic71eca628f179cd0084692e615c70a8c8241e744
This commit is contained in:
@@ -237,7 +237,7 @@ This is solely useful to speed up test compiles.
|
||||
KBUILD_EXTRA_SYMBOLS
|
||||
--------------------
|
||||
For modules that use symbols from other modules.
|
||||
See more details in modules.txt.
|
||||
See more details in modules.rst.
|
||||
|
||||
ALLSOURCE_ARCHS
|
||||
---------------
|
||||
|
||||
@@ -44,7 +44,7 @@ intermediate::
|
||||
def_bool y
|
||||
|
||||
Then, Kconfig moves onto the evaluation stage to resolve inter-symbol
|
||||
dependency as explained in kconfig-language.txt.
|
||||
dependency as explained in kconfig-language.rst.
|
||||
|
||||
|
||||
Variables
|
||||
|
||||
@@ -924,7 +924,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
$(KBUILD_AFLAGS_MODULE) is used to add arch-specific options that
|
||||
are used for assembler.
|
||||
|
||||
From commandline AFLAGS_MODULE shall be used (see kbuild.txt).
|
||||
From commandline AFLAGS_MODULE shall be used (see kbuild.rst).
|
||||
|
||||
KBUILD_CFLAGS_KERNEL
|
||||
$(CC) options specific for built-in
|
||||
@@ -937,7 +937,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
|
||||
$(KBUILD_CFLAGS_MODULE) is used to add arch-specific options that
|
||||
are used for $(CC).
|
||||
From commandline CFLAGS_MODULE shall be used (see kbuild.txt).
|
||||
From commandline CFLAGS_MODULE shall be used (see kbuild.rst).
|
||||
|
||||
KBUILD_LDFLAGS_MODULE
|
||||
Options for $(LD) when linking modules
|
||||
@@ -945,7 +945,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
$(KBUILD_LDFLAGS_MODULE) is used to add arch-specific options
|
||||
used when linking modules. This is often a linker script.
|
||||
|
||||
From commandline LDFLAGS_MODULE shall be used (see kbuild.txt).
|
||||
From commandline LDFLAGS_MODULE shall be used (see kbuild.rst).
|
||||
|
||||
KBUILD_LDS
|
||||
|
||||
|
||||
@@ -470,9 +470,9 @@ build.
|
||||
|
||||
The syntax of the Module.symvers file is::
|
||||
|
||||
<CRC> <Symbol> <Namespace> <Module> <Export Type>
|
||||
<CRC> <Symbol> <Module> <Export Type> <Namespace>
|
||||
|
||||
0xe1cc2a05 usb_stor_suspend USB_STORAGE drivers/usb/storage/usb-storage EXPORT_SYMBOL_GPL
|
||||
0xe1cc2a05 usb_stor_suspend drivers/usb/storage/usb-storage EXPORT_SYMBOL_GPL USB_STORAGE
|
||||
|
||||
The fields are separated by tabs and values may be empty (e.g.
|
||||
if no namespace is defined for an exported symbol).
|
||||
|
||||
4
Makefile
4
Makefile
@@ -2,7 +2,7 @@
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
# *DOCUMENTATION*
|
||||
@@ -1872,7 +1872,7 @@ existing-targets := $(wildcard $(sort $(targets)))
|
||||
|
||||
-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
|
||||
|
||||
endif # config-targets
|
||||
endif # config-build
|
||||
endif # mixed-build
|
||||
endif # need-sub-make
|
||||
|
||||
|
||||
@@ -307,13 +307,15 @@ endif
|
||||
ifeq ($(CONFIG_STACKPROTECTOR_PER_TASK),y)
|
||||
prepare: stack_protector_prepare
|
||||
stack_protector_prepare: prepare0
|
||||
$(eval KBUILD_CFLAGS += \
|
||||
$(eval SSP_PLUGIN_CFLAGS := \
|
||||
-fplugin-arg-arm_ssp_per_task_plugin-tso=$(shell \
|
||||
awk '{if ($$2 == "THREAD_SZ_ORDER") print $$3;}'\
|
||||
include/generated/asm-offsets.h) \
|
||||
-fplugin-arg-arm_ssp_per_task_plugin-offset=$(shell \
|
||||
awk '{if ($$2 == "TI_STACK_CANARY") print $$3;}'\
|
||||
include/generated/asm-offsets.h))
|
||||
$(eval KBUILD_CFLAGS += $(SSP_PLUGIN_CFLAGS))
|
||||
$(eval GCC_PLUGINS_CFLAGS += $(SSP_PLUGIN_CFLAGS))
|
||||
endif
|
||||
|
||||
all: $(notdir $(KBUILD_IMAGE))
|
||||
|
||||
@@ -101,7 +101,6 @@ clean-files += piggy_data lib1funcs.S ashldi3.S bswapsdi2.S \
|
||||
$(libfdt) $(libfdt_hdrs) hyp-stub.S
|
||||
|
||||
KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
|
||||
KBUILD_CFLAGS += $(DISABLE_ARM_SSP_PER_TASK_PLUGIN)
|
||||
|
||||
ifeq ($(CONFIG_FUNCTION_TRACER),y)
|
||||
ORIG_CFLAGS := $(KBUILD_CFLAGS)
|
||||
@@ -117,7 +116,8 @@ CFLAGS_fdt_ro.o := $(nossp-flags-y)
|
||||
CFLAGS_fdt_rw.o := $(nossp-flags-y)
|
||||
CFLAGS_fdt_wip.o := $(nossp-flags-y)
|
||||
|
||||
ccflags-y := -fpic $(call cc-option,-mno-single-pic-base,) -fno-builtin -I$(obj)
|
||||
ccflags-y := -fpic $(call cc-option,-mno-single-pic-base,) -fno-builtin \
|
||||
-I$(obj) $(DISABLE_ARM_SSP_PER_TASK_PLUGIN)
|
||||
asflags-y := -DZIMAGE
|
||||
|
||||
# Supply kernel BSS size to the decompressor via a linker symbol.
|
||||
|
||||
@@ -94,6 +94,8 @@ static bool __init cntvct_functional(void)
|
||||
* this.
|
||||
*/
|
||||
np = of_find_compatible_node(NULL, NULL, "arm,armv7-timer");
|
||||
if (!np)
|
||||
np = of_find_compatible_node(NULL, NULL, "arm,armv8-timer");
|
||||
if (!np)
|
||||
goto out_put;
|
||||
|
||||
|
||||
@@ -29,11 +29,9 @@ typedef struct {
|
||||
*/
|
||||
#define ASID(mm) ((mm)->context.id.counter & 0xffff)
|
||||
|
||||
extern bool arm64_use_ng_mappings;
|
||||
|
||||
static inline bool arm64_kernel_unmapped_at_el0(void)
|
||||
{
|
||||
return arm64_use_ng_mappings;
|
||||
return cpus_have_const_cap(ARM64_UNMAP_KERNEL_AT_EL0);
|
||||
}
|
||||
|
||||
typedef void (*bp_hardening_cb_t)(void);
|
||||
|
||||
@@ -23,11 +23,13 @@
|
||||
|
||||
#include <asm/pgtable-types.h>
|
||||
|
||||
extern bool arm64_use_ng_mappings;
|
||||
|
||||
#define _PROT_DEFAULT (PTE_TYPE_PAGE | PTE_AF | PTE_SHARED)
|
||||
#define _PROT_SECT_DEFAULT (PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S)
|
||||
|
||||
#define PTE_MAYBE_NG (arm64_kernel_unmapped_at_el0() ? PTE_NG : 0)
|
||||
#define PMD_MAYBE_NG (arm64_kernel_unmapped_at_el0() ? PMD_SECT_NG : 0)
|
||||
#define PTE_MAYBE_NG (arm64_use_ng_mappings ? PTE_NG : 0)
|
||||
#define PMD_MAYBE_NG (arm64_use_ng_mappings ? PMD_SECT_NG : 0)
|
||||
|
||||
#define PROT_DEFAULT (_PROT_DEFAULT | PTE_MAYBE_NG)
|
||||
#define PROT_SECT_DEFAULT (_PROT_SECT_DEFAULT | PMD_MAYBE_NG)
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
#define __NR_compat_gettimeofday 78
|
||||
#define __NR_compat_sigreturn 119
|
||||
#define __NR_compat_rt_sigreturn 173
|
||||
#define __NR_compat_clock_getres 247
|
||||
#define __NR_compat_clock_gettime 263
|
||||
#define __NR_compat_clock_getres 264
|
||||
#define __NR_compat_clock_gettime64 403
|
||||
#define __NR_compat_clock_getres_time64 406
|
||||
|
||||
|
||||
@@ -962,11 +962,22 @@ void tick_broadcast(const struct cpumask *mask)
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The number of CPUs online, not counting this CPU (which may not be
|
||||
* fully online and so not counted in num_online_cpus()).
|
||||
*/
|
||||
static inline unsigned int num_other_online_cpus(void)
|
||||
{
|
||||
unsigned int this_cpu_online = cpu_online(smp_processor_id());
|
||||
|
||||
return num_online_cpus() - this_cpu_online;
|
||||
}
|
||||
|
||||
void smp_send_stop(void)
|
||||
{
|
||||
unsigned long timeout;
|
||||
|
||||
if (num_online_cpus() > 1) {
|
||||
if (num_other_online_cpus()) {
|
||||
cpumask_t mask;
|
||||
|
||||
cpumask_copy(&mask, cpu_online_mask);
|
||||
@@ -979,10 +990,10 @@ void smp_send_stop(void)
|
||||
|
||||
/* Wait up to one second for other CPUs to stop */
|
||||
timeout = USEC_PER_SEC;
|
||||
while (num_online_cpus() > 1 && timeout--)
|
||||
while (num_other_online_cpus() && timeout--)
|
||||
udelay(1);
|
||||
|
||||
if (num_online_cpus() > 1)
|
||||
if (num_other_online_cpus())
|
||||
pr_warn("SMP: failed to stop secondary CPUs %*pbl\n",
|
||||
cpumask_pr_args(cpu_online_mask));
|
||||
|
||||
@@ -1005,7 +1016,11 @@ void crash_smp_send_stop(void)
|
||||
|
||||
cpus_stopped = 1;
|
||||
|
||||
if (num_online_cpus() == 1) {
|
||||
/*
|
||||
* If this cpu is the only one alive at this point in time, online or
|
||||
* not, there are no stop messages to be sent around, so just back out.
|
||||
*/
|
||||
if (num_other_online_cpus() == 0) {
|
||||
sdei_mask_local_cpu();
|
||||
return;
|
||||
}
|
||||
@@ -1013,7 +1028,7 @@ void crash_smp_send_stop(void)
|
||||
cpumask_copy(&mask, cpu_online_mask);
|
||||
cpumask_clear_cpu(smp_processor_id(), &mask);
|
||||
|
||||
atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
|
||||
atomic_set(&waiting_for_crash_ipi, num_other_online_cpus());
|
||||
|
||||
pr_crit("SMP: stopping secondary CPUs\n");
|
||||
smp_cross_call(&mask, IPI_CPU_CRASH_STOP);
|
||||
|
||||
@@ -1817,6 +1817,7 @@ static void kvmppc_core_vcpu_free_pr(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu);
|
||||
|
||||
kvmppc_mmu_destroy_pr(vcpu);
|
||||
free_page((unsigned long)vcpu->arch.shared & PAGE_MASK);
|
||||
#ifdef CONFIG_KVM_BOOK3S_32_HANDLER
|
||||
kfree(vcpu->arch.shadow_vcpu);
|
||||
|
||||
@@ -759,7 +759,6 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
|
||||
return 0;
|
||||
|
||||
out_vcpu_uninit:
|
||||
kvmppc_mmu_destroy(vcpu);
|
||||
kvmppc_subarch_vcpu_uninit(vcpu);
|
||||
return err;
|
||||
}
|
||||
@@ -792,7 +791,6 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
|
||||
|
||||
kvmppc_core_vcpu_free(vcpu);
|
||||
|
||||
kvmppc_mmu_destroy(vcpu);
|
||||
kvmppc_subarch_vcpu_uninit(vcpu);
|
||||
}
|
||||
|
||||
|
||||
@@ -120,12 +120,6 @@ static void __init kasan_unmap_early_shadow_vmalloc(void)
|
||||
unsigned long k_cur;
|
||||
phys_addr_t pa = __pa(kasan_early_shadow_page);
|
||||
|
||||
if (!early_mmu_has_feature(MMU_FTR_HPTE_TABLE)) {
|
||||
int ret = kasan_init_shadow_page_tables(k_start, k_end);
|
||||
|
||||
if (ret)
|
||||
panic("kasan: kasan_init_shadow_page_tables() failed");
|
||||
}
|
||||
for (k_cur = k_start & PAGE_MASK; k_cur < k_end; k_cur += PAGE_SIZE) {
|
||||
pmd_t *pmd = pmd_offset(pud_offset(pgd_offset_k(k_cur), k_cur), k_cur);
|
||||
pte_t *ptep = pte_offset_kernel(pmd, k_cur);
|
||||
@@ -143,7 +137,8 @@ void __init kasan_mmu_init(void)
|
||||
int ret;
|
||||
struct memblock_region *reg;
|
||||
|
||||
if (early_mmu_has_feature(MMU_FTR_HPTE_TABLE)) {
|
||||
if (early_mmu_has_feature(MMU_FTR_HPTE_TABLE) ||
|
||||
IS_ENABLED(CONFIG_KASAN_VMALLOC)) {
|
||||
ret = kasan_init_shadow_page_tables(KASAN_SHADOW_START, KASAN_SHADOW_END);
|
||||
|
||||
if (ret)
|
||||
|
||||
@@ -190,7 +190,7 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address)
|
||||
return pmd_k;
|
||||
}
|
||||
|
||||
void vmalloc_sync_all(void)
|
||||
static void vmalloc_sync(void)
|
||||
{
|
||||
unsigned long address;
|
||||
|
||||
@@ -217,6 +217,16 @@ void vmalloc_sync_all(void)
|
||||
}
|
||||
}
|
||||
|
||||
void vmalloc_sync_mappings(void)
|
||||
{
|
||||
vmalloc_sync();
|
||||
}
|
||||
|
||||
void vmalloc_sync_unmappings(void)
|
||||
{
|
||||
vmalloc_sync();
|
||||
}
|
||||
|
||||
/*
|
||||
* 32-bit:
|
||||
*
|
||||
@@ -319,11 +329,23 @@ out:
|
||||
|
||||
#else /* CONFIG_X86_64: */
|
||||
|
||||
void vmalloc_sync_all(void)
|
||||
void vmalloc_sync_mappings(void)
|
||||
{
|
||||
/*
|
||||
* 64-bit mappings might allocate new p4d/pud pages
|
||||
* that need to be propagated to all tasks' PGDs.
|
||||
*/
|
||||
sync_global_pgds(VMALLOC_START & PGDIR_MASK, VMALLOC_END);
|
||||
}
|
||||
|
||||
void vmalloc_sync_unmappings(void)
|
||||
{
|
||||
/*
|
||||
* Unmappings never allocate or free p4d/pud pages.
|
||||
* No work is required here.
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
* 64-bit:
|
||||
*
|
||||
|
||||
@@ -171,7 +171,7 @@ int ghes_estatus_pool_init(int num_ghes)
|
||||
* New allocation must be visible in all pgd before it can be found by
|
||||
* an NMI allocating from the pool.
|
||||
*/
|
||||
vmalloc_sync_all();
|
||||
vmalloc_sync_mappings();
|
||||
|
||||
rc = gen_pool_add(ghes_estatus_pool, addr, PAGE_ALIGN(len), -1);
|
||||
if (rc)
|
||||
|
||||
@@ -448,6 +448,7 @@ static int binderfs_binder_ctl_create(struct super_block *sb)
|
||||
inode->i_uid = info->root_uid;
|
||||
inode->i_gid = info->root_gid;
|
||||
|
||||
refcount_set(&device->ref, 1);
|
||||
device->binderfs_inode = inode;
|
||||
device->miscdev.minor = minor;
|
||||
|
||||
|
||||
@@ -781,11 +781,11 @@ static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
|
||||
ssize_t result = 0;
|
||||
uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data;
|
||||
|
||||
if (size & 3 || *pos & 3)
|
||||
if (size > 4096 || size & 3 || *pos & 3)
|
||||
return -EINVAL;
|
||||
|
||||
/* decode offset */
|
||||
offset = *pos & GENMASK_ULL(11, 0);
|
||||
offset = (*pos & GENMASK_ULL(11, 0)) >> 2;
|
||||
se = (*pos & GENMASK_ULL(19, 12)) >> 12;
|
||||
sh = (*pos & GENMASK_ULL(27, 20)) >> 20;
|
||||
cu = (*pos & GENMASK_ULL(35, 28)) >> 28;
|
||||
@@ -823,7 +823,7 @@ static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
|
||||
while (size) {
|
||||
uint32_t value;
|
||||
|
||||
value = data[offset++];
|
||||
value = data[result >> 2];
|
||||
r = put_user(value, (uint32_t *)buf);
|
||||
if (r) {
|
||||
result = r;
|
||||
|
||||
@@ -3913,6 +3913,8 @@ static int amdgpu_do_asic_reset(struct amdgpu_hive_info *hive,
|
||||
if (r)
|
||||
goto out;
|
||||
|
||||
amdgpu_fbdev_set_suspend(tmp_adev, 0);
|
||||
|
||||
/* must succeed. */
|
||||
amdgpu_ras_resume(tmp_adev);
|
||||
|
||||
@@ -4086,6 +4088,8 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
|
||||
*/
|
||||
amdgpu_unregister_gpu_instance(tmp_adev);
|
||||
|
||||
amdgpu_fbdev_set_suspend(adev, 1);
|
||||
|
||||
/* disable ras on ALL IPs */
|
||||
if (!(in_ras_intr && !use_baco) &&
|
||||
amdgpu_device_ip_need_full_reset(tmp_adev))
|
||||
|
||||
@@ -693,7 +693,7 @@ static int jpeg_v2_0_set_clockgating_state(void *handle,
|
||||
bool enable = (state == AMD_CG_STATE_GATE);
|
||||
|
||||
if (enable) {
|
||||
if (jpeg_v2_0_is_idle(handle))
|
||||
if (!jpeg_v2_0_is_idle(handle))
|
||||
return -EBUSY;
|
||||
jpeg_v2_0_enable_clock_gating(adev);
|
||||
} else {
|
||||
|
||||
@@ -477,7 +477,7 @@ static int jpeg_v2_5_set_clockgating_state(void *handle,
|
||||
continue;
|
||||
|
||||
if (enable) {
|
||||
if (jpeg_v2_5_is_idle(handle))
|
||||
if (!jpeg_v2_5_is_idle(handle))
|
||||
return -EBUSY;
|
||||
jpeg_v2_5_enable_clock_gating(adev, i);
|
||||
} else {
|
||||
|
||||
@@ -1352,7 +1352,7 @@ static int vcn_v1_0_set_clockgating_state(void *handle,
|
||||
|
||||
if (enable) {
|
||||
/* wait for STATUS to clear */
|
||||
if (vcn_v1_0_is_idle(handle))
|
||||
if (!vcn_v1_0_is_idle(handle))
|
||||
return -EBUSY;
|
||||
vcn_v1_0_enable_clock_gating(adev);
|
||||
} else {
|
||||
|
||||
@@ -1217,7 +1217,7 @@ static int vcn_v2_0_set_clockgating_state(void *handle,
|
||||
|
||||
if (enable) {
|
||||
/* wait for STATUS to clear */
|
||||
if (vcn_v2_0_is_idle(handle))
|
||||
if (!vcn_v2_0_is_idle(handle))
|
||||
return -EBUSY;
|
||||
vcn_v2_0_enable_clock_gating(adev);
|
||||
} else {
|
||||
|
||||
@@ -1672,7 +1672,7 @@ static int vcn_v2_5_set_clockgating_state(void *handle,
|
||||
return 0;
|
||||
|
||||
if (enable) {
|
||||
if (vcn_v2_5_is_idle(handle))
|
||||
if (!vcn_v2_5_is_idle(handle))
|
||||
return -EBUSY;
|
||||
vcn_v2_5_enable_clock_gating(adev);
|
||||
} else {
|
||||
|
||||
@@ -522,8 +522,9 @@ static void dm_dcn_crtc_high_irq(void *interrupt_params)
|
||||
|
||||
acrtc_state = to_dm_crtc_state(acrtc->base.state);
|
||||
|
||||
DRM_DEBUG_DRIVER("crtc:%d, vupdate-vrr:%d\n", acrtc->crtc_id,
|
||||
amdgpu_dm_vrr_active(acrtc_state));
|
||||
DRM_DEBUG_DRIVER("crtc:%d, vupdate-vrr:%d, planes:%d\n", acrtc->crtc_id,
|
||||
amdgpu_dm_vrr_active(acrtc_state),
|
||||
acrtc_state->active_planes);
|
||||
|
||||
amdgpu_dm_crtc_handle_crc_irq(&acrtc->base);
|
||||
drm_crtc_handle_vblank(&acrtc->base);
|
||||
@@ -543,7 +544,18 @@ static void dm_dcn_crtc_high_irq(void *interrupt_params)
|
||||
&acrtc_state->vrr_params.adjust);
|
||||
}
|
||||
|
||||
if (acrtc->pflip_status == AMDGPU_FLIP_SUBMITTED) {
|
||||
/*
|
||||
* If there aren't any active_planes then DCH HUBP may be clock-gated.
|
||||
* In that case, pageflip completion interrupts won't fire and pageflip
|
||||
* completion events won't get delivered. Prevent this by sending
|
||||
* pending pageflip events from here if a flip is still pending.
|
||||
*
|
||||
* If any planes are enabled, use dm_pflip_high_irq() instead, to
|
||||
* avoid race conditions between flip programming and completion,
|
||||
* which could cause too early flip completion events.
|
||||
*/
|
||||
if (acrtc->pflip_status == AMDGPU_FLIP_SUBMITTED &&
|
||||
acrtc_state->active_planes == 0) {
|
||||
if (acrtc->event) {
|
||||
drm_crtc_send_vblank_event(&acrtc->base, acrtc->event);
|
||||
acrtc->event = NULL;
|
||||
|
||||
@@ -3401,6 +3401,17 @@ static bool retrieve_link_cap(struct dc_link *link)
|
||||
sink_id.ieee_device_id,
|
||||
sizeof(sink_id.ieee_device_id));
|
||||
|
||||
/* Quirk Apple MBP 2017 15" Retina panel: Wrong DP_MAX_LINK_RATE */
|
||||
{
|
||||
uint8_t str_mbp_2017[] = { 101, 68, 21, 101, 98, 97 };
|
||||
|
||||
if ((link->dpcd_caps.sink_dev_id == 0x0010fa) &&
|
||||
!memcmp(link->dpcd_caps.sink_dev_id_str, str_mbp_2017,
|
||||
sizeof(str_mbp_2017))) {
|
||||
link->reported_link_cap.link_rate = 0x0c;
|
||||
}
|
||||
}
|
||||
|
||||
core_link_read_dpcd(
|
||||
link,
|
||||
DP_SINK_HW_REVISION_START,
|
||||
|
||||
@@ -108,7 +108,6 @@ static const struct hwseq_private_funcs dcn20_private_funcs = {
|
||||
.enable_power_gating_plane = dcn20_enable_power_gating_plane,
|
||||
.dpp_pg_control = dcn20_dpp_pg_control,
|
||||
.hubp_pg_control = dcn20_hubp_pg_control,
|
||||
.dsc_pg_control = NULL,
|
||||
.update_odm = dcn20_update_odm,
|
||||
.dsc_pg_control = dcn20_dsc_pg_control,
|
||||
.get_surface_visual_confirm_color = dcn10_get_surface_visual_confirm_color,
|
||||
|
||||
@@ -116,7 +116,6 @@ static const struct hwseq_private_funcs dcn21_private_funcs = {
|
||||
.enable_power_gating_plane = dcn20_enable_power_gating_plane,
|
||||
.dpp_pg_control = dcn20_dpp_pg_control,
|
||||
.hubp_pg_control = dcn20_hubp_pg_control,
|
||||
.dsc_pg_control = NULL,
|
||||
.update_odm = dcn20_update_odm,
|
||||
.dsc_pg_control = dcn20_dsc_pg_control,
|
||||
.get_surface_visual_confirm_color = dcn10_get_surface_visual_confirm_color,
|
||||
|
||||
@@ -146,14 +146,14 @@ static const struct of_device_id komeda_of_match[] = {
|
||||
|
||||
MODULE_DEVICE_TABLE(of, komeda_of_match);
|
||||
|
||||
static int komeda_rt_pm_suspend(struct device *dev)
|
||||
static int __maybe_unused komeda_rt_pm_suspend(struct device *dev)
|
||||
{
|
||||
struct komeda_drv *mdrv = dev_get_drvdata(dev);
|
||||
|
||||
return komeda_dev_suspend(mdrv->mdev);
|
||||
}
|
||||
|
||||
static int komeda_rt_pm_resume(struct device *dev)
|
||||
static int __maybe_unused komeda_rt_pm_resume(struct device *dev)
|
||||
{
|
||||
struct komeda_drv *mdrv = dev_get_drvdata(dev);
|
||||
|
||||
|
||||
@@ -156,10 +156,8 @@ int bochs_hw_init(struct drm_device *dev)
|
||||
size = min(size, mem);
|
||||
}
|
||||
|
||||
if (pci_request_region(pdev, 0, "bochs-drm") != 0) {
|
||||
DRM_ERROR("Cannot request framebuffer\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
if (pci_request_region(pdev, 0, "bochs-drm") != 0)
|
||||
DRM_WARN("Cannot request framebuffer, boot fb still active?\n");
|
||||
|
||||
bochs->fb_map = ioremap(addr, size);
|
||||
if (bochs->fb_map == NULL) {
|
||||
|
||||
@@ -1624,28 +1624,34 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
||||
frame.colorspace = HDMI_COLORSPACE_RGB;
|
||||
|
||||
/* Set up colorimetry */
|
||||
switch (hdmi->hdmi_data.enc_out_encoding) {
|
||||
case V4L2_YCBCR_ENC_601:
|
||||
if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV601)
|
||||
frame.colorimetry = HDMI_COLORIMETRY_EXTENDED;
|
||||
else
|
||||
if (!hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) {
|
||||
switch (hdmi->hdmi_data.enc_out_encoding) {
|
||||
case V4L2_YCBCR_ENC_601:
|
||||
if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV601)
|
||||
frame.colorimetry = HDMI_COLORIMETRY_EXTENDED;
|
||||
else
|
||||
frame.colorimetry = HDMI_COLORIMETRY_ITU_601;
|
||||
frame.extended_colorimetry =
|
||||
HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
||||
break;
|
||||
case V4L2_YCBCR_ENC_709:
|
||||
if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV709)
|
||||
frame.colorimetry = HDMI_COLORIMETRY_EXTENDED;
|
||||
else
|
||||
frame.colorimetry = HDMI_COLORIMETRY_ITU_709;
|
||||
frame.extended_colorimetry =
|
||||
HDMI_EXTENDED_COLORIMETRY_XV_YCC_709;
|
||||
break;
|
||||
default: /* Carries no data */
|
||||
frame.colorimetry = HDMI_COLORIMETRY_ITU_601;
|
||||
frame.extended_colorimetry =
|
||||
HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
frame.colorimetry = HDMI_COLORIMETRY_NONE;
|
||||
frame.extended_colorimetry =
|
||||
HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
||||
break;
|
||||
case V4L2_YCBCR_ENC_709:
|
||||
if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV709)
|
||||
frame.colorimetry = HDMI_COLORIMETRY_EXTENDED;
|
||||
else
|
||||
frame.colorimetry = HDMI_COLORIMETRY_ITU_709;
|
||||
frame.extended_colorimetry =
|
||||
HDMI_EXTENDED_COLORIMETRY_XV_YCC_709;
|
||||
break;
|
||||
default: /* Carries no data */
|
||||
frame.colorimetry = HDMI_COLORIMETRY_ITU_601;
|
||||
frame.extended_colorimetry =
|
||||
HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
||||
break;
|
||||
HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
||||
}
|
||||
|
||||
frame.scan_mode = HDMI_SCAN_MODE_NONE;
|
||||
|
||||
@@ -542,10 +542,12 @@ int drm_mode_create_lease_ioctl(struct drm_device *dev,
|
||||
}
|
||||
|
||||
DRM_DEBUG_LEASE("Creating lease\n");
|
||||
/* lessee will take the ownership of leases */
|
||||
lessee = drm_lease_create(lessor, &leases);
|
||||
|
||||
if (IS_ERR(lessee)) {
|
||||
ret = PTR_ERR(lessee);
|
||||
idr_destroy(&leases);
|
||||
goto out_leases;
|
||||
}
|
||||
|
||||
@@ -580,7 +582,6 @@ out_lessee:
|
||||
|
||||
out_leases:
|
||||
put_unused_fd(fd);
|
||||
idr_destroy(&leases);
|
||||
|
||||
DRM_DEBUG_LEASE("drm_mode_create_lease_ioctl failed: %d\n", ret);
|
||||
return ret;
|
||||
|
||||
@@ -1600,17 +1600,6 @@ static void virtual_xfer_breadcrumbs(struct virtual_engine *ve,
|
||||
spin_unlock(&old->breadcrumbs.irq_lock);
|
||||
}
|
||||
|
||||
static struct i915_request *
|
||||
last_active(const struct intel_engine_execlists *execlists)
|
||||
{
|
||||
struct i915_request * const *last = READ_ONCE(execlists->active);
|
||||
|
||||
while (*last && i915_request_completed(*last))
|
||||
last++;
|
||||
|
||||
return *last;
|
||||
}
|
||||
|
||||
#define for_each_waiter(p__, rq__) \
|
||||
list_for_each_entry_lockless(p__, \
|
||||
&(rq__)->sched.waiters_list, \
|
||||
@@ -1740,11 +1729,9 @@ static void record_preemption(struct intel_engine_execlists *execlists)
|
||||
(void)I915_SELFTEST_ONLY(execlists->preempt_hang.count++);
|
||||
}
|
||||
|
||||
static unsigned long active_preempt_timeout(struct intel_engine_cs *engine)
|
||||
static unsigned long active_preempt_timeout(struct intel_engine_cs *engine,
|
||||
const struct i915_request *rq)
|
||||
{
|
||||
struct i915_request *rq;
|
||||
|
||||
rq = last_active(&engine->execlists);
|
||||
if (!rq)
|
||||
return 0;
|
||||
|
||||
@@ -1755,13 +1742,14 @@ static unsigned long active_preempt_timeout(struct intel_engine_cs *engine)
|
||||
return READ_ONCE(engine->props.preempt_timeout_ms);
|
||||
}
|
||||
|
||||
static void set_preempt_timeout(struct intel_engine_cs *engine)
|
||||
static void set_preempt_timeout(struct intel_engine_cs *engine,
|
||||
const struct i915_request *rq)
|
||||
{
|
||||
if (!intel_engine_has_preempt_reset(engine))
|
||||
return;
|
||||
|
||||
set_timer_ms(&engine->execlists.preempt,
|
||||
active_preempt_timeout(engine));
|
||||
active_preempt_timeout(engine, rq));
|
||||
}
|
||||
|
||||
static inline void clear_ports(struct i915_request **ports, int count)
|
||||
@@ -1774,6 +1762,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
|
||||
struct intel_engine_execlists * const execlists = &engine->execlists;
|
||||
struct i915_request **port = execlists->pending;
|
||||
struct i915_request ** const last_port = port + execlists->port_mask;
|
||||
struct i915_request * const *active;
|
||||
struct i915_request *last;
|
||||
struct rb_node *rb;
|
||||
bool submit = false;
|
||||
@@ -1828,7 +1817,10 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
|
||||
* i.e. we will retrigger preemption following the ack in case
|
||||
* of trouble.
|
||||
*/
|
||||
last = last_active(execlists);
|
||||
active = READ_ONCE(execlists->active);
|
||||
while ((last = *active) && i915_request_completed(last))
|
||||
active++;
|
||||
|
||||
if (last) {
|
||||
if (need_preempt(engine, last, rb)) {
|
||||
ENGINE_TRACE(engine,
|
||||
@@ -2110,7 +2102,7 @@ done:
|
||||
* Skip if we ended up with exactly the same set of requests,
|
||||
* e.g. trying to timeslice a pair of ordered contexts
|
||||
*/
|
||||
if (!memcmp(execlists->active, execlists->pending,
|
||||
if (!memcmp(active, execlists->pending,
|
||||
(port - execlists->pending + 1) * sizeof(*port))) {
|
||||
do
|
||||
execlists_schedule_out(fetch_and_zero(port));
|
||||
@@ -2121,7 +2113,7 @@ done:
|
||||
clear_ports(port + 1, last_port - port);
|
||||
|
||||
execlists_submit_ports(engine);
|
||||
set_preempt_timeout(engine);
|
||||
set_preempt_timeout(engine, *active);
|
||||
} else {
|
||||
skip_submit:
|
||||
ring_set_paused(engine, 0);
|
||||
@@ -4008,26 +4000,6 @@ static int gen12_emit_flush_render(struct i915_request *request,
|
||||
|
||||
*cs++ = preparser_disable(false);
|
||||
intel_ring_advance(request, cs);
|
||||
|
||||
/*
|
||||
* Wa_1604544889:tgl
|
||||
*/
|
||||
if (IS_TGL_REVID(request->i915, TGL_REVID_A0, TGL_REVID_A0)) {
|
||||
flags = 0;
|
||||
flags |= PIPE_CONTROL_CS_STALL;
|
||||
flags |= PIPE_CONTROL_HDC_PIPELINE_FLUSH;
|
||||
|
||||
flags |= PIPE_CONTROL_STORE_DATA_INDEX;
|
||||
flags |= PIPE_CONTROL_QW_WRITE;
|
||||
|
||||
cs = intel_ring_begin(request, 6);
|
||||
if (IS_ERR(cs))
|
||||
return PTR_ERR(cs);
|
||||
|
||||
cs = gen8_emit_pipe_control(cs, flags,
|
||||
LRC_PPHWSP_SCRATCH_ADDR);
|
||||
intel_ring_advance(request, cs);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1529,15 +1529,34 @@ err_obj:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
static const struct {
|
||||
u32 start;
|
||||
u32 end;
|
||||
} mcr_ranges_gen8[] = {
|
||||
{ .start = 0x5500, .end = 0x55ff },
|
||||
{ .start = 0x7000, .end = 0x7fff },
|
||||
{ .start = 0x9400, .end = 0x97ff },
|
||||
{ .start = 0xb000, .end = 0xb3ff },
|
||||
{ .start = 0xe000, .end = 0xe7ff },
|
||||
{},
|
||||
};
|
||||
|
||||
static bool mcr_range(struct drm_i915_private *i915, u32 offset)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (INTEL_GEN(i915) < 8)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* Registers in this range are affected by the MCR selector
|
||||
* Registers in these ranges are affected by the MCR selector
|
||||
* which only controls CPU initiated MMIO. Routing does not
|
||||
* work for CS access so we cannot verify them on this path.
|
||||
*/
|
||||
if (INTEL_GEN(i915) >= 8 && (offset >= 0xb000 && offset <= 0xb4ff))
|
||||
return true;
|
||||
for (i = 0; mcr_ranges_gen8[i].start; i++)
|
||||
if (offset >= mcr_ranges_gen8[i].start &&
|
||||
offset <= mcr_ranges_gen8[i].end)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -532,6 +532,8 @@ static const struct hid_device_id hammer_devices[] = {
|
||||
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MAGNEMITE) },
|
||||
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
|
||||
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MASTERBALL) },
|
||||
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
|
||||
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MOONBALL) },
|
||||
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
|
||||
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_STAFF) },
|
||||
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
|
||||
|
||||
@@ -478,6 +478,7 @@
|
||||
#define USB_DEVICE_ID_GOOGLE_WHISKERS 0x5030
|
||||
#define USB_DEVICE_ID_GOOGLE_MASTERBALL 0x503c
|
||||
#define USB_DEVICE_ID_GOOGLE_MAGNEMITE 0x503d
|
||||
#define USB_DEVICE_ID_GOOGLE_MOONBALL 0x5044
|
||||
|
||||
#define USB_VENDOR_ID_GOTOP 0x08f2
|
||||
#define USB_DEVICE_ID_SUPER_Q2 0x007f
|
||||
@@ -726,6 +727,7 @@
|
||||
#define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085
|
||||
#define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3
|
||||
#define USB_DEVICE_ID_LENOVO_X1_TAB3 0x60b5
|
||||
#define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D 0x608d
|
||||
|
||||
#define USB_VENDOR_ID_LG 0x1fd2
|
||||
#define USB_DEVICE_ID_LG_MULTITOUCH 0x0064
|
||||
|
||||
@@ -458,9 +458,9 @@ static ssize_t picolcd_fb_update_rate_show(struct device *dev,
|
||||
if (ret >= PAGE_SIZE)
|
||||
break;
|
||||
else if (i == fb_update_rate)
|
||||
ret += snprintf(buf+ret, PAGE_SIZE-ret, "[%u] ", i);
|
||||
ret += scnprintf(buf+ret, PAGE_SIZE-ret, "[%u] ", i);
|
||||
else
|
||||
ret += snprintf(buf+ret, PAGE_SIZE-ret, "%u ", i);
|
||||
ret += scnprintf(buf+ret, PAGE_SIZE-ret, "%u ", i);
|
||||
if (ret > 0)
|
||||
buf[min(ret, (size_t)PAGE_SIZE)-1] = '\n';
|
||||
return ret;
|
||||
|
||||
@@ -103,6 +103,7 @@ static const struct hid_device_id hid_quirks[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912), HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406XE), HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C007), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C077), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KEYBOARD_G710_PLUS), HID_QUIRK_NOGET },
|
||||
|
||||
@@ -313,7 +313,7 @@ static ssize_t show_value(struct device *dev, struct device_attribute *attr,
|
||||
|
||||
while (i < ret) {
|
||||
if (i + attribute->size > ret) {
|
||||
len += snprintf(&buf[len],
|
||||
len += scnprintf(&buf[len],
|
||||
PAGE_SIZE - len,
|
||||
"%d ", values[i]);
|
||||
break;
|
||||
@@ -336,10 +336,10 @@ static ssize_t show_value(struct device *dev, struct device_attribute *attr,
|
||||
++i;
|
||||
break;
|
||||
}
|
||||
len += snprintf(&buf[len], PAGE_SIZE - len,
|
||||
len += scnprintf(&buf[len], PAGE_SIZE - len,
|
||||
"%lld ", value);
|
||||
}
|
||||
len += snprintf(&buf[len], PAGE_SIZE - len, "\n");
|
||||
len += scnprintf(&buf[len], PAGE_SIZE - len, "\n");
|
||||
|
||||
return len;
|
||||
} else if (input)
|
||||
|
||||
@@ -718,9 +718,6 @@ static int msc_win_set_lockout(struct msc_window *win,
|
||||
|
||||
if (old != expect) {
|
||||
ret = -EINVAL;
|
||||
dev_warn_ratelimited(msc_dev(win->msc),
|
||||
"expected lockout state %d, got %d\n",
|
||||
expect, old);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
@@ -741,6 +738,10 @@ unlock:
|
||||
/* from intel_th_msc_window_unlock(), don't warn if not locked */
|
||||
if (expect == WIN_LOCKED && old == new)
|
||||
return 0;
|
||||
|
||||
dev_warn_ratelimited(msc_dev(win->msc),
|
||||
"expected lockout state %d, got %d\n",
|
||||
expect, old);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -760,7 +761,7 @@ static int msc_configure(struct msc *msc)
|
||||
lockdep_assert_held(&msc->buf_mutex);
|
||||
|
||||
if (msc->mode > MSC_MODE_MULTI)
|
||||
return -ENOTSUPP;
|
||||
return -EINVAL;
|
||||
|
||||
if (msc->mode == MSC_MODE_MULTI) {
|
||||
if (msc_win_set_lockout(msc->cur_win, WIN_READY, WIN_INUSE))
|
||||
@@ -1294,7 +1295,7 @@ static int msc_buffer_alloc(struct msc *msc, unsigned long *nr_pages,
|
||||
} else if (msc->mode == MSC_MODE_MULTI) {
|
||||
ret = msc_buffer_multi_alloc(msc, nr_pages, nr_wins);
|
||||
} else {
|
||||
ret = -ENOTSUPP;
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
@@ -1530,7 +1531,7 @@ static ssize_t intel_th_msc_read(struct file *file, char __user *buf,
|
||||
if (ret >= 0)
|
||||
*ppos = iter->offset;
|
||||
} else {
|
||||
ret = -ENOTSUPP;
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
put_count:
|
||||
|
||||
@@ -234,6 +234,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Elkhart Lake CPU */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4529),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Elkhart Lake */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4b26),
|
||||
|
||||
@@ -238,7 +238,7 @@ static struct configfs_attribute *sys_t_policy_attrs[] = {
|
||||
static inline bool sys_t_need_ts(struct sys_t_output *op)
|
||||
{
|
||||
if (op->node.ts_interval &&
|
||||
time_after(op->ts_jiffies + op->node.ts_interval, jiffies)) {
|
||||
time_after(jiffies, op->ts_jiffies + op->node.ts_interval)) {
|
||||
op->ts_jiffies = jiffies;
|
||||
|
||||
return true;
|
||||
@@ -250,8 +250,8 @@ static inline bool sys_t_need_ts(struct sys_t_output *op)
|
||||
static bool sys_t_need_clock_sync(struct sys_t_output *op)
|
||||
{
|
||||
if (op->node.clocksync_interval &&
|
||||
time_after(op->clocksync_jiffies + op->node.clocksync_interval,
|
||||
jiffies)) {
|
||||
time_after(jiffies,
|
||||
op->clocksync_jiffies + op->node.clocksync_interval)) {
|
||||
op->clocksync_jiffies = jiffies;
|
||||
|
||||
return true;
|
||||
|
||||
@@ -237,6 +237,7 @@ static const struct adxl372_axis_lookup adxl372_axis_lookup_table[] = {
|
||||
.realbits = 12, \
|
||||
.storagebits = 16, \
|
||||
.shift = 4, \
|
||||
.endianness = IIO_BE, \
|
||||
}, \
|
||||
}
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ MODULE_DEVICE_TABLE(of, st_accel_of_match);
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static const struct acpi_device_id st_accel_acpi_match[] = {
|
||||
{"SMO8840", (kernel_ulong_t)LNG2DM_ACCEL_DEV_NAME},
|
||||
{"SMO8840", (kernel_ulong_t)LIS2DH12_ACCEL_DEV_NAME},
|
||||
{"SMO8A90", (kernel_ulong_t)LNG2DM_ACCEL_DEV_NAME},
|
||||
{ },
|
||||
};
|
||||
|
||||
@@ -723,6 +723,7 @@ static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state)
|
||||
|
||||
for_each_set_bit(bit, indio->active_scan_mask, indio->num_channels) {
|
||||
struct iio_chan_spec const *chan = at91_adc_chan_get(indio, bit);
|
||||
u32 cor;
|
||||
|
||||
if (!chan)
|
||||
continue;
|
||||
@@ -731,6 +732,20 @@ static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state)
|
||||
chan->type == IIO_PRESSURE)
|
||||
continue;
|
||||
|
||||
if (state) {
|
||||
cor = at91_adc_readl(st, AT91_SAMA5D2_COR);
|
||||
|
||||
if (chan->differential)
|
||||
cor |= (BIT(chan->channel) |
|
||||
BIT(chan->channel2)) <<
|
||||
AT91_SAMA5D2_COR_DIFF_OFFSET;
|
||||
else
|
||||
cor &= ~(BIT(chan->channel) <<
|
||||
AT91_SAMA5D2_COR_DIFF_OFFSET);
|
||||
|
||||
at91_adc_writel(st, AT91_SAMA5D2_COR, cor);
|
||||
}
|
||||
|
||||
if (state) {
|
||||
at91_adc_writel(st, AT91_SAMA5D2_CHER,
|
||||
BIT(chan->channel));
|
||||
|
||||
@@ -842,31 +842,6 @@ static inline void stm32_dfsdm_process_data(struct stm32_dfsdm_adc *adc,
|
||||
}
|
||||
}
|
||||
|
||||
static irqreturn_t stm32_dfsdm_adc_trigger_handler(int irq, void *p)
|
||||
{
|
||||
struct iio_poll_func *pf = p;
|
||||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
|
||||
int available = stm32_dfsdm_adc_dma_residue(adc);
|
||||
|
||||
while (available >= indio_dev->scan_bytes) {
|
||||
s32 *buffer = (s32 *)&adc->rx_buf[adc->bufi];
|
||||
|
||||
stm32_dfsdm_process_data(adc, buffer);
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, buffer,
|
||||
pf->timestamp);
|
||||
available -= indio_dev->scan_bytes;
|
||||
adc->bufi += indio_dev->scan_bytes;
|
||||
if (adc->bufi >= adc->buf_sz)
|
||||
adc->bufi = 0;
|
||||
}
|
||||
|
||||
iio_trigger_notify_done(indio_dev->trig);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void stm32_dfsdm_dma_buffer_done(void *data)
|
||||
{
|
||||
struct iio_dev *indio_dev = data;
|
||||
@@ -874,11 +849,6 @@ static void stm32_dfsdm_dma_buffer_done(void *data)
|
||||
int available = stm32_dfsdm_adc_dma_residue(adc);
|
||||
size_t old_pos;
|
||||
|
||||
if (indio_dev->currentmode & INDIO_BUFFER_TRIGGERED) {
|
||||
iio_trigger_poll_chained(indio_dev->trig);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: In Kernel interface does not support cyclic DMA buffer,and
|
||||
* offers only an interface to push data samples per samples.
|
||||
@@ -906,7 +876,15 @@ static void stm32_dfsdm_dma_buffer_done(void *data)
|
||||
adc->bufi = 0;
|
||||
old_pos = 0;
|
||||
}
|
||||
/* regular iio buffer without trigger */
|
||||
/*
|
||||
* In DMA mode the trigger services of IIO are not used
|
||||
* (e.g. no call to iio_trigger_poll).
|
||||
* Calling irq handler associated to the hardware trigger is not
|
||||
* relevant as the conversions have already been done. Data
|
||||
* transfers are performed directly in DMA callback instead.
|
||||
* This implementation avoids to call trigger irq handler that
|
||||
* may sleep, in an atomic context (DMA irq handler context).
|
||||
*/
|
||||
if (adc->dev_data->type == DFSDM_IIO)
|
||||
iio_push_to_buffers(indio_dev, buffer);
|
||||
}
|
||||
@@ -1536,8 +1514,7 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev)
|
||||
}
|
||||
|
||||
ret = iio_triggered_buffer_setup(indio_dev,
|
||||
&iio_pollfunc_store_time,
|
||||
&stm32_dfsdm_adc_trigger_handler,
|
||||
&iio_pollfunc_store_time, NULL,
|
||||
&stm32_dfsdm_buffer_setup_ops);
|
||||
if (ret) {
|
||||
stm32_dfsdm_dma_release(indio_dev);
|
||||
|
||||
@@ -91,6 +91,8 @@ config SPS30
|
||||
tristate "SPS30 particulate matter sensor"
|
||||
depends on I2C
|
||||
select CRC8
|
||||
select IIO_BUFFER
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
help
|
||||
Say Y here to build support for the Sensirion SPS30 particulate
|
||||
matter sensor.
|
||||
|
||||
@@ -167,16 +167,17 @@ static int vcnl4200_init(struct vcnl4000_data *data)
|
||||
data->vcnl4200_ps.reg = VCNL4200_PS_DATA;
|
||||
switch (id) {
|
||||
case VCNL4200_PROD_ID:
|
||||
/* Integration time is 50ms, but the experiments */
|
||||
/* show 54ms in total. */
|
||||
data->vcnl4200_al.sampling_rate = ktime_set(0, 54000 * 1000);
|
||||
data->vcnl4200_ps.sampling_rate = ktime_set(0, 4200 * 1000);
|
||||
/* Default wait time is 50ms, add 20% tolerance. */
|
||||
data->vcnl4200_al.sampling_rate = ktime_set(0, 60000 * 1000);
|
||||
/* Default wait time is 4.8ms, add 20% tolerance. */
|
||||
data->vcnl4200_ps.sampling_rate = ktime_set(0, 5760 * 1000);
|
||||
data->al_scale = 24000;
|
||||
break;
|
||||
case VCNL4040_PROD_ID:
|
||||
/* Integration time is 80ms, add 10ms. */
|
||||
data->vcnl4200_al.sampling_rate = ktime_set(0, 100000 * 1000);
|
||||
data->vcnl4200_ps.sampling_rate = ktime_set(0, 100000 * 1000);
|
||||
/* Default wait time is 80ms, add 20% tolerance. */
|
||||
data->vcnl4200_al.sampling_rate = ktime_set(0, 96000 * 1000);
|
||||
/* Default wait time is 5ms, add 20% tolerance. */
|
||||
data->vcnl4200_ps.sampling_rate = ktime_set(0, 6000 * 1000);
|
||||
data->al_scale = 120000;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -564,7 +564,7 @@ static int ak8974_read_raw(struct iio_dev *indio_dev,
|
||||
* We read all axes and discard all but one, for optimized
|
||||
* reading, use the triggered buffer.
|
||||
*/
|
||||
*val = le16_to_cpu(hw_values[chan->address]);
|
||||
*val = (s16)le16_to_cpu(hw_values[chan->address]);
|
||||
|
||||
ret = IIO_VAL_INT;
|
||||
}
|
||||
|
||||
@@ -269,7 +269,7 @@ static const struct iio_chan_spec ping_chan_spec[] = {
|
||||
|
||||
static const struct of_device_id of_ping_match[] = {
|
||||
{ .compatible = "parallax,ping", .data = &pa_ping_cfg},
|
||||
{ .compatible = "parallax,laserping", .data = &pa_ping_cfg},
|
||||
{ .compatible = "parallax,laserping", .data = &pa_laser_ping_cfg},
|
||||
{},
|
||||
};
|
||||
|
||||
|
||||
@@ -161,7 +161,8 @@ static int stm32_timer_start(struct stm32_timer_trigger *priv,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void stm32_timer_stop(struct stm32_timer_trigger *priv)
|
||||
static void stm32_timer_stop(struct stm32_timer_trigger *priv,
|
||||
struct iio_trigger *trig)
|
||||
{
|
||||
u32 ccer, cr1;
|
||||
|
||||
@@ -179,6 +180,12 @@ static void stm32_timer_stop(struct stm32_timer_trigger *priv)
|
||||
regmap_write(priv->regmap, TIM_PSC, 0);
|
||||
regmap_write(priv->regmap, TIM_ARR, 0);
|
||||
|
||||
/* Force disable master mode */
|
||||
if (stm32_timer_is_trgo2_name(trig->name))
|
||||
regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2, 0);
|
||||
else
|
||||
regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS, 0);
|
||||
|
||||
/* Make sure that registers are updated */
|
||||
regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG);
|
||||
}
|
||||
@@ -197,7 +204,7 @@ static ssize_t stm32_tt_store_frequency(struct device *dev,
|
||||
return ret;
|
||||
|
||||
if (freq == 0) {
|
||||
stm32_timer_stop(priv);
|
||||
stm32_timer_stop(priv, trig);
|
||||
} else {
|
||||
ret = stm32_timer_start(priv, trig, freq);
|
||||
if (ret)
|
||||
|
||||
@@ -394,7 +394,7 @@ static const struct pcr_ops rts522a_pcr_ops = {
|
||||
void rts522a_init_params(struct rtsx_pcr *pcr)
|
||||
{
|
||||
rts5227_init_params(pcr);
|
||||
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(20, 20, 11);
|
||||
pcr->reg_pm_ctrl3 = RTS522A_PM_CTRL3;
|
||||
|
||||
pcr->option.ocp_en = 1;
|
||||
|
||||
@@ -618,6 +618,7 @@ static const struct pcr_ops rts524a_pcr_ops = {
|
||||
void rts524a_init_params(struct rtsx_pcr *pcr)
|
||||
{
|
||||
rts5249_init_params(pcr);
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11);
|
||||
pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF;
|
||||
pcr->option.ltr_l1off_snooze_sspwrgate =
|
||||
LTR_L1OFF_SNOOZE_SSPWRGATE_5250_DEF;
|
||||
@@ -733,6 +734,7 @@ static const struct pcr_ops rts525a_pcr_ops = {
|
||||
void rts525a_init_params(struct rtsx_pcr *pcr)
|
||||
{
|
||||
rts5249_init_params(pcr);
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(25, 29, 11);
|
||||
pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF;
|
||||
pcr->option.ltr_l1off_snooze_sspwrgate =
|
||||
LTR_L1OFF_SNOOZE_SSPWRGATE_5250_DEF;
|
||||
|
||||
@@ -662,7 +662,7 @@ void rts5260_init_params(struct rtsx_pcr *pcr)
|
||||
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
||||
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
||||
pcr->aspm_en = ASPM_L1_EN;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(1, 29, 16);
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11);
|
||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
||||
|
||||
pcr->ic_version = rts5260_get_ic_version(pcr);
|
||||
|
||||
@@ -764,7 +764,7 @@ void rts5261_init_params(struct rtsx_pcr *pcr)
|
||||
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
||||
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
||||
pcr->aspm_en = ASPM_L1_EN;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(20, 27, 16);
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 11);
|
||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
||||
|
||||
pcr->ic_version = rts5261_get_ic_version(pcr);
|
||||
|
||||
@@ -606,19 +606,22 @@ static int sd_change_phase(struct realtek_pci_sdmmc *host,
|
||||
u8 sample_point, bool rx)
|
||||
{
|
||||
struct rtsx_pcr *pcr = host->pcr;
|
||||
|
||||
u16 SD_VP_CTL = 0;
|
||||
dev_dbg(sdmmc_dev(host), "%s(%s): sample_point = %d\n",
|
||||
__func__, rx ? "RX" : "TX", sample_point);
|
||||
|
||||
rtsx_pci_write_register(pcr, CLK_CTL, CHANGE_CLK, CHANGE_CLK);
|
||||
if (rx)
|
||||
if (rx) {
|
||||
SD_VP_CTL = SD_VPRX_CTL;
|
||||
rtsx_pci_write_register(pcr, SD_VPRX_CTL,
|
||||
PHASE_SELECT_MASK, sample_point);
|
||||
else
|
||||
} else {
|
||||
SD_VP_CTL = SD_VPTX_CTL;
|
||||
rtsx_pci_write_register(pcr, SD_VPTX_CTL,
|
||||
PHASE_SELECT_MASK, sample_point);
|
||||
rtsx_pci_write_register(pcr, SD_VPCLK0_CTL, PHASE_NOT_RESET, 0);
|
||||
rtsx_pci_write_register(pcr, SD_VPCLK0_CTL, PHASE_NOT_RESET,
|
||||
}
|
||||
rtsx_pci_write_register(pcr, SD_VP_CTL, PHASE_NOT_RESET, 0);
|
||||
rtsx_pci_write_register(pcr, SD_VP_CTL, PHASE_NOT_RESET,
|
||||
PHASE_NOT_RESET);
|
||||
rtsx_pci_write_register(pcr, CLK_CTL, CHANGE_CLK, 0);
|
||||
rtsx_pci_write_register(pcr, SD_CFG1, SD_ASYNC_FIFO_NOT_RST, 0);
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dmi.h>
|
||||
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/pm.h>
|
||||
@@ -72,9 +73,16 @@ struct sdhci_acpi_host {
|
||||
const struct sdhci_acpi_slot *slot;
|
||||
struct platform_device *pdev;
|
||||
bool use_runtime_pm;
|
||||
bool is_intel;
|
||||
bool reset_signal_volt_on_suspend;
|
||||
unsigned long private[0] ____cacheline_aligned;
|
||||
};
|
||||
|
||||
enum {
|
||||
DMI_QUIRK_RESET_SD_SIGNAL_VOLT_ON_SUSP = BIT(0),
|
||||
DMI_QUIRK_SD_NO_WRITE_PROTECT = BIT(1),
|
||||
};
|
||||
|
||||
static inline void *sdhci_acpi_priv(struct sdhci_acpi_host *c)
|
||||
{
|
||||
return (void *)c->private;
|
||||
@@ -391,6 +399,8 @@ static int intel_probe_slot(struct platform_device *pdev, struct acpi_device *ad
|
||||
host->mmc_host_ops.start_signal_voltage_switch =
|
||||
intel_start_signal_voltage_switch;
|
||||
|
||||
c->is_intel = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -647,6 +657,36 @@ static const struct acpi_device_id sdhci_acpi_ids[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, sdhci_acpi_ids);
|
||||
|
||||
static const struct dmi_system_id sdhci_acpi_quirks[] = {
|
||||
{
|
||||
/*
|
||||
* The Lenovo Miix 320-10ICR has a bug in the _PS0 method of
|
||||
* the SHC1 ACPI device, this bug causes it to reprogram the
|
||||
* wrong LDO (DLDO3) to 1.8V if 1.8V modes are used and the
|
||||
* card is (runtime) suspended + resumed. DLDO3 is used for
|
||||
* the LCD and setting it to 1.8V causes the LCD to go black.
|
||||
*/
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"),
|
||||
},
|
||||
.driver_data = (void *)DMI_QUIRK_RESET_SD_SIGNAL_VOLT_ON_SUSP,
|
||||
},
|
||||
{
|
||||
/*
|
||||
* The Acer Aspire Switch 10 (SW5-012) microSD slot always
|
||||
* reports the card being write-protected even though microSD
|
||||
* cards do not have a write-protect switch at all.
|
||||
*/
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"),
|
||||
},
|
||||
.driver_data = (void *)DMI_QUIRK_SD_NO_WRITE_PROTECT,
|
||||
},
|
||||
{} /* Terminating entry */
|
||||
};
|
||||
|
||||
static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(struct acpi_device *adev)
|
||||
{
|
||||
const struct sdhci_acpi_uid_slot *u;
|
||||
@@ -663,17 +703,23 @@ static int sdhci_acpi_probe(struct platform_device *pdev)
|
||||
struct device *dev = &pdev->dev;
|
||||
const struct sdhci_acpi_slot *slot;
|
||||
struct acpi_device *device, *child;
|
||||
const struct dmi_system_id *id;
|
||||
struct sdhci_acpi_host *c;
|
||||
struct sdhci_host *host;
|
||||
struct resource *iomem;
|
||||
resource_size_t len;
|
||||
size_t priv_size;
|
||||
int quirks = 0;
|
||||
int err;
|
||||
|
||||
device = ACPI_COMPANION(dev);
|
||||
if (!device)
|
||||
return -ENODEV;
|
||||
|
||||
id = dmi_first_match(sdhci_acpi_quirks);
|
||||
if (id)
|
||||
quirks = (long)id->driver_data;
|
||||
|
||||
slot = sdhci_acpi_get_slot(device);
|
||||
|
||||
/* Power on the SDHCI controller and its children */
|
||||
@@ -759,6 +805,12 @@ static int sdhci_acpi_probe(struct platform_device *pdev)
|
||||
dev_warn(dev, "failed to setup card detect gpio\n");
|
||||
c->use_runtime_pm = false;
|
||||
}
|
||||
|
||||
if (quirks & DMI_QUIRK_RESET_SD_SIGNAL_VOLT_ON_SUSP)
|
||||
c->reset_signal_volt_on_suspend = true;
|
||||
|
||||
if (quirks & DMI_QUIRK_SD_NO_WRITE_PROTECT)
|
||||
host->mmc->caps2 |= MMC_CAP2_NO_WRITE_PROTECT;
|
||||
}
|
||||
|
||||
err = sdhci_setup_host(host);
|
||||
@@ -823,17 +875,39 @@ static int sdhci_acpi_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __maybe_unused sdhci_acpi_reset_signal_voltage_if_needed(
|
||||
struct device *dev)
|
||||
{
|
||||
struct sdhci_acpi_host *c = dev_get_drvdata(dev);
|
||||
struct sdhci_host *host = c->host;
|
||||
|
||||
if (c->is_intel && c->reset_signal_volt_on_suspend &&
|
||||
host->mmc->ios.signal_voltage != MMC_SIGNAL_VOLTAGE_330) {
|
||||
struct intel_host *intel_host = sdhci_acpi_priv(c);
|
||||
unsigned int fn = INTEL_DSM_V33_SWITCH;
|
||||
u32 result = 0;
|
||||
|
||||
intel_dsm(intel_host, dev, fn, &result);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
||||
static int sdhci_acpi_suspend(struct device *dev)
|
||||
{
|
||||
struct sdhci_acpi_host *c = dev_get_drvdata(dev);
|
||||
struct sdhci_host *host = c->host;
|
||||
int ret;
|
||||
|
||||
if (host->tuning_mode != SDHCI_TUNING_MODE_3)
|
||||
mmc_retune_needed(host->mmc);
|
||||
|
||||
return sdhci_suspend_host(host);
|
||||
ret = sdhci_suspend_host(host);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
sdhci_acpi_reset_signal_voltage_if_needed(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sdhci_acpi_resume(struct device *dev)
|
||||
@@ -853,11 +927,17 @@ static int sdhci_acpi_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct sdhci_acpi_host *c = dev_get_drvdata(dev);
|
||||
struct sdhci_host *host = c->host;
|
||||
int ret;
|
||||
|
||||
if (host->tuning_mode != SDHCI_TUNING_MODE_3)
|
||||
mmc_retune_needed(host->mmc);
|
||||
|
||||
return sdhci_runtime_suspend_host(host);
|
||||
ret = sdhci_runtime_suspend_host(host);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
sdhci_acpi_reset_signal_voltage_if_needed(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sdhci_acpi_runtime_resume(struct device *dev)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/mmc.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
|
||||
#include "sdhci-pltfm.h"
|
||||
|
||||
@@ -235,6 +236,11 @@ static const struct sdhci_ops sdhci_cdns_ops = {
|
||||
.set_uhs_signaling = sdhci_cdns_set_uhs_signaling,
|
||||
};
|
||||
|
||||
static const struct sdhci_pltfm_data sdhci_cdns_uniphier_pltfm_data = {
|
||||
.ops = &sdhci_cdns_ops,
|
||||
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
|
||||
};
|
||||
|
||||
static const struct sdhci_pltfm_data sdhci_cdns_pltfm_data = {
|
||||
.ops = &sdhci_cdns_ops,
|
||||
};
|
||||
@@ -334,6 +340,7 @@ static void sdhci_cdns_hs400_enhanced_strobe(struct mmc_host *mmc,
|
||||
static int sdhci_cdns_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct sdhci_host *host;
|
||||
const struct sdhci_pltfm_data *data;
|
||||
struct sdhci_pltfm_host *pltfm_host;
|
||||
struct sdhci_cdns_priv *priv;
|
||||
struct clk *clk;
|
||||
@@ -350,8 +357,12 @@ static int sdhci_cdns_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
data = of_device_get_match_data(dev);
|
||||
if (!data)
|
||||
data = &sdhci_cdns_pltfm_data;
|
||||
|
||||
nr_phy_params = sdhci_cdns_phy_param_count(dev->of_node);
|
||||
host = sdhci_pltfm_init(pdev, &sdhci_cdns_pltfm_data,
|
||||
host = sdhci_pltfm_init(pdev, data,
|
||||
struct_size(priv, phy_params, nr_phy_params));
|
||||
if (IS_ERR(host)) {
|
||||
ret = PTR_ERR(host);
|
||||
@@ -431,7 +442,10 @@ static const struct dev_pm_ops sdhci_cdns_pm_ops = {
|
||||
};
|
||||
|
||||
static const struct of_device_id sdhci_cdns_match[] = {
|
||||
{ .compatible = "socionext,uniphier-sd4hc" },
|
||||
{
|
||||
.compatible = "socionext,uniphier-sd4hc",
|
||||
.data = &sdhci_cdns_uniphier_pltfm_data,
|
||||
},
|
||||
{ .compatible = "cdns,sd4hc" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
@@ -132,7 +132,8 @@ static void sdhci_at91_reset(struct sdhci_host *host, u8 mask)
|
||||
|
||||
sdhci_reset(host, mask);
|
||||
|
||||
if (host->mmc->caps & MMC_CAP_NONREMOVABLE)
|
||||
if ((host->mmc->caps & MMC_CAP_NONREMOVABLE)
|
||||
|| mmc_gpio_get_cd(host->mmc) >= 0)
|
||||
sdhci_at91_set_force_card_detect(host);
|
||||
|
||||
if (priv->cal_always_on && (mask & SDHCI_RESET_ALL))
|
||||
@@ -427,8 +428,11 @@ static int sdhci_at91_probe(struct platform_device *pdev)
|
||||
* detection procedure using the SDMCC_CD signal is bypassed.
|
||||
* This bit is reset when a software reset for all command is performed
|
||||
* so we need to implement our own reset function to set back this bit.
|
||||
*
|
||||
* WA: SAMA5D2 doesn't drive CMD if using CD GPIO line.
|
||||
*/
|
||||
if (host->mmc->caps & MMC_CAP_NONREMOVABLE)
|
||||
if ((host->mmc->caps & MMC_CAP_NONREMOVABLE)
|
||||
|| mmc_gpio_get_cd(host->mmc) >= 0)
|
||||
sdhci_at91_set_force_card_detect(host);
|
||||
|
||||
pm_runtime_put_autosuspend(&pdev->dev);
|
||||
|
||||
@@ -850,9 +850,11 @@ out_free_tagset:
|
||||
if (new)
|
||||
blk_mq_free_tag_set(ctrl->ctrl.admin_tagset);
|
||||
out_free_async_qe:
|
||||
nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe,
|
||||
sizeof(struct nvme_command), DMA_TO_DEVICE);
|
||||
ctrl->async_event_sqe.data = NULL;
|
||||
if (ctrl->async_event_sqe.data) {
|
||||
nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe,
|
||||
sizeof(struct nvme_command), DMA_TO_DEVICE);
|
||||
ctrl->async_event_sqe.data = NULL;
|
||||
}
|
||||
out_free_queue:
|
||||
nvme_rdma_free_queue(&ctrl->queues[0]);
|
||||
return error;
|
||||
|
||||
@@ -515,7 +515,7 @@ static int nvmet_try_send_data_pdu(struct nvmet_tcp_cmd *cmd)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd)
|
||||
static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd, bool last_in_batch)
|
||||
{
|
||||
struct nvmet_tcp_queue *queue = cmd->queue;
|
||||
int ret;
|
||||
@@ -523,9 +523,15 @@ static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd)
|
||||
while (cmd->cur_sg) {
|
||||
struct page *page = sg_page(cmd->cur_sg);
|
||||
u32 left = cmd->cur_sg->length - cmd->offset;
|
||||
int flags = MSG_DONTWAIT;
|
||||
|
||||
if ((!last_in_batch && cmd->queue->send_list_len) ||
|
||||
cmd->wbytes_done + left < cmd->req.transfer_len ||
|
||||
queue->data_digest || !queue->nvme_sq.sqhd_disabled)
|
||||
flags |= MSG_MORE;
|
||||
|
||||
ret = kernel_sendpage(cmd->queue->sock, page, cmd->offset,
|
||||
left, MSG_DONTWAIT | MSG_MORE);
|
||||
left, flags);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
|
||||
@@ -660,7 +666,7 @@ static int nvmet_tcp_try_send_one(struct nvmet_tcp_queue *queue,
|
||||
}
|
||||
|
||||
if (cmd->state == NVMET_TCP_SEND_DATA) {
|
||||
ret = nvmet_try_send_data(cmd);
|
||||
ret = nvmet_try_send_data(cmd, last_in_batch);
|
||||
if (ret <= 0)
|
||||
goto done_send;
|
||||
}
|
||||
|
||||
@@ -327,6 +327,7 @@ config RTC_DRV_MAX6900
|
||||
config RTC_DRV_MAX8907
|
||||
tristate "Maxim MAX8907"
|
||||
depends on MFD_MAX8907 || COMPILE_TEST
|
||||
select REGMAP_IRQ
|
||||
help
|
||||
If you say yes here you will get support for the
|
||||
RTC of Maxim MAX8907 PMIC.
|
||||
|
||||
@@ -1320,6 +1320,9 @@ static const struct of_device_id qcom_slim_ngd_dt_match[] = {
|
||||
{
|
||||
.compatible = "qcom,slim-ngd-v1.5.0",
|
||||
.data = &ngd_v1_5_offset_info,
|
||||
},{
|
||||
.compatible = "qcom,slim-ngd-v2.1.0",
|
||||
.data = &ngd_v1_5_offset_info,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <signal.h>
|
||||
|
||||
#define MAX_NUM_DEVICES 10
|
||||
#define MAX_SYSFS_PREFIX 0x80
|
||||
#define MAX_SYSFS_PATH 0x200
|
||||
#define CSV_MAX_LINE 0x1000
|
||||
#define SYSFS_MAX_INT 0x20
|
||||
@@ -67,7 +68,7 @@ struct loopback_results {
|
||||
};
|
||||
|
||||
struct loopback_device {
|
||||
char name[MAX_SYSFS_PATH];
|
||||
char name[MAX_STR_LEN];
|
||||
char sysfs_entry[MAX_SYSFS_PATH];
|
||||
char debugfs_entry[MAX_SYSFS_PATH];
|
||||
struct loopback_results results;
|
||||
@@ -93,8 +94,8 @@ struct loopback_test {
|
||||
int stop_all;
|
||||
int poll_count;
|
||||
char test_name[MAX_STR_LEN];
|
||||
char sysfs_prefix[MAX_SYSFS_PATH];
|
||||
char debugfs_prefix[MAX_SYSFS_PATH];
|
||||
char sysfs_prefix[MAX_SYSFS_PREFIX];
|
||||
char debugfs_prefix[MAX_SYSFS_PREFIX];
|
||||
struct timespec poll_timeout;
|
||||
struct loopback_device devices[MAX_NUM_DEVICES];
|
||||
struct loopback_results aggregate_results;
|
||||
@@ -637,7 +638,7 @@ baddir:
|
||||
static int open_poll_files(struct loopback_test *t)
|
||||
{
|
||||
struct loopback_device *dev;
|
||||
char buf[MAX_STR_LEN];
|
||||
char buf[MAX_SYSFS_PATH + MAX_STR_LEN];
|
||||
char dummy;
|
||||
int fds_idx = 0;
|
||||
int i;
|
||||
@@ -655,7 +656,7 @@ static int open_poll_files(struct loopback_test *t)
|
||||
goto err;
|
||||
}
|
||||
read(t->fds[fds_idx].fd, &dummy, 1);
|
||||
t->fds[fds_idx].events = EPOLLERR|EPOLLPRI;
|
||||
t->fds[fds_idx].events = POLLERR | POLLPRI;
|
||||
t->fds[fds_idx].revents = 0;
|
||||
fds_idx++;
|
||||
}
|
||||
@@ -748,7 +749,7 @@ static int wait_for_complete(struct loopback_test *t)
|
||||
}
|
||||
|
||||
for (i = 0; i < t->poll_count; i++) {
|
||||
if (t->fds[i].revents & EPOLLPRI) {
|
||||
if (t->fds[i].revents & POLLPRI) {
|
||||
/* Dummy read to clear the event */
|
||||
read(t->fds[i].fd, &dummy, 1);
|
||||
number_of_events++;
|
||||
@@ -907,10 +908,10 @@ int main(int argc, char *argv[])
|
||||
t.iteration_max = atoi(optarg);
|
||||
break;
|
||||
case 'S':
|
||||
snprintf(t.sysfs_prefix, MAX_SYSFS_PATH, "%s", optarg);
|
||||
snprintf(t.sysfs_prefix, MAX_SYSFS_PREFIX, "%s", optarg);
|
||||
break;
|
||||
case 'D':
|
||||
snprintf(t.debugfs_prefix, MAX_SYSFS_PATH, "%s", optarg);
|
||||
snprintf(t.debugfs_prefix, MAX_SYSFS_PREFIX, "%s", optarg);
|
||||
break;
|
||||
case 'm':
|
||||
t.mask = atol(optarg);
|
||||
@@ -961,10 +962,10 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
if (!strcmp(t.sysfs_prefix, ""))
|
||||
snprintf(t.sysfs_prefix, MAX_SYSFS_PATH, "%s", sysfs_prefix);
|
||||
snprintf(t.sysfs_prefix, MAX_SYSFS_PREFIX, "%s", sysfs_prefix);
|
||||
|
||||
if (!strcmp(t.debugfs_prefix, ""))
|
||||
snprintf(t.debugfs_prefix, MAX_SYSFS_PATH, "%s", debugfs_prefix);
|
||||
snprintf(t.debugfs_prefix, MAX_SYSFS_PREFIX, "%s", debugfs_prefix);
|
||||
|
||||
ret = find_loopback_devices(&t);
|
||||
if (ret)
|
||||
|
||||
@@ -38,6 +38,7 @@ static const struct usb_device_id rtw_usb_id_tbl[] = {
|
||||
{USB_DEVICE(0x2001, 0x331B)}, /* D-Link DWA-121 rev B1 */
|
||||
{USB_DEVICE(0x2357, 0x010c)}, /* TP-Link TL-WN722N v2 */
|
||||
{USB_DEVICE(0x2357, 0x0111)}, /* TP-Link TL-WN727N v5.21 */
|
||||
{USB_DEVICE(0x2C4E, 0x0102)}, /* MERCUSYS MW150US v2 */
|
||||
{USB_DEVICE(0x0df6, 0x0076)}, /* Sitecom N150 v2 */
|
||||
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0xffef)}, /* Rosewill RNX-N150NUB */
|
||||
{} /* Terminating entry */
|
||||
|
||||
@@ -561,7 +561,7 @@ static u_long get_word(struct vc_data *vc)
|
||||
return 0;
|
||||
} else if (tmpx < vc->vc_cols - 2 &&
|
||||
(ch == SPACE || ch == 0 || (ch < 0x100 && IS_WDLM(ch))) &&
|
||||
get_char(vc, (u_short *)&tmp_pos + 1, &temp) > SPACE) {
|
||||
get_char(vc, (u_short *)tmp_pos + 1, &temp) > SPACE) {
|
||||
tmp_pos += 2;
|
||||
tmpx++;
|
||||
} else {
|
||||
|
||||
@@ -140,6 +140,7 @@ int hif_shutdown(struct wfx_dev *wdev)
|
||||
else
|
||||
control_reg_write(wdev, 0);
|
||||
mutex_unlock(&wdev->hif_cmd.lock);
|
||||
mutex_unlock(&wdev->hif_cmd.key_renew_lock);
|
||||
kfree(hif);
|
||||
return ret;
|
||||
}
|
||||
@@ -289,7 +290,7 @@ int hif_stop_scan(struct wfx_vif *wvif)
|
||||
}
|
||||
|
||||
int hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf,
|
||||
const struct ieee80211_channel *channel, const u8 *ssidie)
|
||||
struct ieee80211_channel *channel, const u8 *ssid, int ssidlen)
|
||||
{
|
||||
int ret;
|
||||
struct hif_msg *hif;
|
||||
@@ -307,9 +308,9 @@ int hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf,
|
||||
body->basic_rate_set =
|
||||
cpu_to_le32(wfx_rate_mask_to_hw(wvif->wdev, conf->basic_rates));
|
||||
memcpy(body->bssid, conf->bssid, sizeof(body->bssid));
|
||||
if (!conf->ibss_joined && ssidie) {
|
||||
body->ssid_length = cpu_to_le32(ssidie[1]);
|
||||
memcpy(body->ssid, &ssidie[2], ssidie[1]);
|
||||
if (!conf->ibss_joined && ssid) {
|
||||
body->ssid_length = cpu_to_le32(ssidlen);
|
||||
memcpy(body->ssid, ssid, ssidlen);
|
||||
}
|
||||
wfx_fill_header(hif, wvif->id, HIF_REQ_ID_JOIN, sizeof(*body));
|
||||
ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false);
|
||||
@@ -427,9 +428,9 @@ int hif_start(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf,
|
||||
struct hif_msg *hif;
|
||||
struct hif_req_start *body = wfx_alloc_hif(sizeof(*body), &hif);
|
||||
|
||||
body->dtim_period = conf->dtim_period,
|
||||
body->short_preamble = conf->use_short_preamble,
|
||||
body->channel_number = cpu_to_le16(channel->hw_value),
|
||||
body->dtim_period = conf->dtim_period;
|
||||
body->short_preamble = conf->use_short_preamble;
|
||||
body->channel_number = cpu_to_le16(channel->hw_value);
|
||||
body->beacon_interval = cpu_to_le32(conf->beacon_int);
|
||||
body->basic_rate_set =
|
||||
cpu_to_le32(wfx_rate_mask_to_hw(wvif->wdev, conf->basic_rates));
|
||||
|
||||
@@ -46,7 +46,7 @@ int hif_scan(struct wfx_vif *wvif, struct cfg80211_scan_request *req80211,
|
||||
int chan_start, int chan_num);
|
||||
int hif_stop_scan(struct wfx_vif *wvif);
|
||||
int hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf,
|
||||
const struct ieee80211_channel *channel, const u8 *ssidie);
|
||||
struct ieee80211_channel *channel, const u8 *ssid, int ssidlen);
|
||||
int hif_set_pm(struct wfx_vif *wvif, bool ps, int dynamic_ps_timeout);
|
||||
int hif_set_bss_params(struct wfx_vif *wvif,
|
||||
const struct hif_req_set_bss_params *arg);
|
||||
|
||||
@@ -191,10 +191,10 @@ static inline int hif_set_block_ack_policy(struct wfx_vif *wvif,
|
||||
}
|
||||
|
||||
static inline int hif_set_association_mode(struct wfx_vif *wvif,
|
||||
struct ieee80211_bss_conf *info,
|
||||
struct ieee80211_sta_ht_cap *ht_cap)
|
||||
struct ieee80211_bss_conf *info)
|
||||
{
|
||||
int basic_rates = wfx_rate_mask_to_hw(wvif->wdev, info->basic_rates);
|
||||
struct ieee80211_sta *sta = NULL;
|
||||
struct hif_mib_set_association_mode val = {
|
||||
.preambtype_use = 1,
|
||||
.mode = 1,
|
||||
@@ -204,12 +204,17 @@ static inline int hif_set_association_mode(struct wfx_vif *wvif,
|
||||
.basic_rate_set = cpu_to_le32(basic_rates)
|
||||
};
|
||||
|
||||
rcu_read_lock(); // protect sta
|
||||
if (info->bssid && !info->ibss_joined)
|
||||
sta = ieee80211_find_sta(wvif->vif, info->bssid);
|
||||
|
||||
// FIXME: it is strange to not retrieve all information from bss_info
|
||||
if (ht_cap && ht_cap->ht_supported) {
|
||||
val.mpdu_start_spacing = ht_cap->ampdu_density;
|
||||
if (sta && sta->ht_cap.ht_supported) {
|
||||
val.mpdu_start_spacing = sta->ht_cap.ampdu_density;
|
||||
if (!(info->ht_operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT))
|
||||
val.greenfield = !!(ht_cap->cap & IEEE80211_HT_CAP_GRN_FLD);
|
||||
val.greenfield = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
return hif_write_mib(wvif->wdev, wvif->id,
|
||||
HIF_MIB_ID_SET_ASSOCIATION_MODE, &val, sizeof(val));
|
||||
|
||||
@@ -491,9 +491,11 @@ static void wfx_set_mfp(struct wfx_vif *wvif,
|
||||
static void wfx_do_join(struct wfx_vif *wvif)
|
||||
{
|
||||
int ret;
|
||||
const u8 *ssidie;
|
||||
struct ieee80211_bss_conf *conf = &wvif->vif->bss_conf;
|
||||
struct cfg80211_bss *bss = NULL;
|
||||
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
||||
const u8 *ssidie = NULL;
|
||||
int ssidlen = 0;
|
||||
|
||||
wfx_tx_lock_flush(wvif->wdev);
|
||||
|
||||
@@ -514,11 +516,14 @@ static void wfx_do_join(struct wfx_vif *wvif)
|
||||
if (!wvif->beacon_int)
|
||||
wvif->beacon_int = 1;
|
||||
|
||||
rcu_read_lock();
|
||||
rcu_read_lock(); // protect ssidie
|
||||
if (!conf->ibss_joined)
|
||||
ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID);
|
||||
else
|
||||
ssidie = NULL;
|
||||
if (ssidie) {
|
||||
ssidlen = ssidie[1];
|
||||
memcpy(ssid, &ssidie[2], ssidie[1]);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
wfx_tx_flush(wvif->wdev);
|
||||
|
||||
@@ -527,10 +532,8 @@ static void wfx_do_join(struct wfx_vif *wvif)
|
||||
|
||||
wfx_set_mfp(wvif, bss);
|
||||
|
||||
/* Perform actual join */
|
||||
wvif->wdev->tx_burst_idx = -1;
|
||||
ret = hif_join(wvif, conf, wvif->channel, ssidie);
|
||||
rcu_read_unlock();
|
||||
ret = hif_join(wvif, conf, wvif->channel, ssid, ssidlen);
|
||||
if (ret) {
|
||||
ieee80211_connection_loss(wvif->vif);
|
||||
wvif->join_complete_status = -1;
|
||||
@@ -605,7 +608,9 @@ int wfx_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sta_priv->buffered); i++)
|
||||
WARN(sta_priv->buffered[i], "release station while Tx is in progress");
|
||||
if (sta_priv->buffered[i])
|
||||
dev_warn(wvif->wdev->dev, "release station while %d pending frame on queue %d",
|
||||
sta_priv->buffered[i], i);
|
||||
// FIXME: see note in wfx_sta_add()
|
||||
if (vif->type == NL80211_IFTYPE_STATION)
|
||||
return 0;
|
||||
@@ -689,6 +694,7 @@ static void wfx_join_finalize(struct wfx_vif *wvif,
|
||||
wfx_rate_mask_to_hw(wvif->wdev, sta->supp_rates[wvif->channel->band]);
|
||||
else
|
||||
wvif->bss_params.operational_rate_set = -1;
|
||||
rcu_read_unlock();
|
||||
if (sta &&
|
||||
info->ht_operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT)
|
||||
hif_dual_cts_protection(wvif, true);
|
||||
@@ -701,8 +707,7 @@ static void wfx_join_finalize(struct wfx_vif *wvif,
|
||||
wvif->bss_params.beacon_lost_count = 20;
|
||||
wvif->bss_params.aid = info->aid;
|
||||
|
||||
hif_set_association_mode(wvif, info, sta ? &sta->ht_cap : NULL);
|
||||
rcu_read_unlock();
|
||||
hif_set_association_mode(wvif, info);
|
||||
|
||||
if (!info->ibss_joined) {
|
||||
hif_keep_alive_period(wvif, 30 /* sec */);
|
||||
|
||||
@@ -954,7 +954,7 @@ static bool tb_port_is_width_supported(struct tb_port *port, int width)
|
||||
ret = tb_port_read(port, &phy, TB_CFG_PORT,
|
||||
port->cap_phy + LANE_ADP_CS_0, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
return false;
|
||||
|
||||
widths = (phy & LANE_ADP_CS_0_SUPPORTED_WIDTH_MASK) >>
|
||||
LANE_ADP_CS_0_SUPPORTED_WIDTH_SHIFT;
|
||||
|
||||
@@ -1589,9 +1589,7 @@ void tty_kclose(struct tty_struct *tty)
|
||||
tty_debug_hangup(tty, "freeing structure\n");
|
||||
/*
|
||||
* The release_tty function takes care of the details of clearing
|
||||
* the slots and preserving the termios structure. The tty_unlock_pair
|
||||
* should be safe as we keep a kref while the tty is locked (so the
|
||||
* unlock never unlocks a freed tty).
|
||||
* the slots and preserving the termios structure.
|
||||
*/
|
||||
mutex_lock(&tty_mutex);
|
||||
tty_port_set_kopened(tty->port, 0);
|
||||
@@ -1621,9 +1619,7 @@ void tty_release_struct(struct tty_struct *tty, int idx)
|
||||
tty_debug_hangup(tty, "freeing structure\n");
|
||||
/*
|
||||
* The release_tty function takes care of the details of clearing
|
||||
* the slots and preserving the termios structure. The tty_unlock_pair
|
||||
* should be safe as we keep a kref while the tty is locked (so the
|
||||
* unlock never unlocks a freed tty).
|
||||
* the slots and preserving the termios structure.
|
||||
*/
|
||||
mutex_lock(&tty_mutex);
|
||||
release_tty(tty, idx);
|
||||
@@ -2734,9 +2730,11 @@ static int compat_tty_tiocgserial(struct tty_struct *tty,
|
||||
struct serial_struct32 v32;
|
||||
struct serial_struct v;
|
||||
int err;
|
||||
memset(&v, 0, sizeof(struct serial_struct));
|
||||
|
||||
if (!tty->ops->set_serial)
|
||||
memset(&v, 0, sizeof(v));
|
||||
memset(&v32, 0, sizeof(v32));
|
||||
|
||||
if (!tty->ops->get_serial)
|
||||
return -ENOTTY;
|
||||
err = tty->ops->get_serial(tty, &v);
|
||||
if (!err) {
|
||||
|
||||
@@ -1530,18 +1530,19 @@ static const struct usb_ep_ops usb_ep_ops = {
|
||||
static void ci_hdrc_gadget_connect(struct usb_gadget *_gadget, int is_active)
|
||||
{
|
||||
struct ci_hdrc *ci = container_of(_gadget, struct ci_hdrc, gadget);
|
||||
unsigned long flags;
|
||||
|
||||
if (is_active) {
|
||||
pm_runtime_get_sync(&_gadget->dev);
|
||||
hw_device_reset(ci);
|
||||
spin_lock_irqsave(&ci->lock, flags);
|
||||
spin_lock_irq(&ci->lock);
|
||||
if (ci->driver) {
|
||||
hw_device_state(ci, ci->ep0out->qh.dma);
|
||||
usb_gadget_set_state(_gadget, USB_STATE_POWERED);
|
||||
spin_unlock_irq(&ci->lock);
|
||||
usb_udc_vbus_handler(_gadget, true);
|
||||
} else {
|
||||
spin_unlock_irq(&ci->lock);
|
||||
}
|
||||
spin_unlock_irqrestore(&ci->lock, flags);
|
||||
} else {
|
||||
usb_udc_vbus_handler(_gadget, false);
|
||||
if (ci->driver)
|
||||
|
||||
@@ -896,10 +896,10 @@ static int get_serial_info(struct tty_struct *tty, struct serial_struct *ss)
|
||||
|
||||
ss->xmit_fifo_size = acm->writesize;
|
||||
ss->baud_base = le32_to_cpu(acm->line.dwDTERate);
|
||||
ss->close_delay = acm->port.close_delay / 10;
|
||||
ss->close_delay = jiffies_to_msecs(acm->port.close_delay) / 10;
|
||||
ss->closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ASYNC_CLOSING_WAIT_NONE :
|
||||
acm->port.closing_wait / 10;
|
||||
jiffies_to_msecs(acm->port.closing_wait) / 10;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -907,24 +907,32 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)
|
||||
{
|
||||
struct acm *acm = tty->driver_data;
|
||||
unsigned int closing_wait, close_delay;
|
||||
unsigned int old_closing_wait, old_close_delay;
|
||||
int retval = 0;
|
||||
|
||||
close_delay = ss->close_delay * 10;
|
||||
close_delay = msecs_to_jiffies(ss->close_delay * 10);
|
||||
closing_wait = ss->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ASYNC_CLOSING_WAIT_NONE : ss->closing_wait * 10;
|
||||
ASYNC_CLOSING_WAIT_NONE :
|
||||
msecs_to_jiffies(ss->closing_wait * 10);
|
||||
|
||||
/* we must redo the rounding here, so that the values match */
|
||||
old_close_delay = jiffies_to_msecs(acm->port.close_delay) / 10;
|
||||
old_closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ASYNC_CLOSING_WAIT_NONE :
|
||||
jiffies_to_msecs(acm->port.closing_wait) / 10;
|
||||
|
||||
mutex_lock(&acm->port.mutex);
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN)) {
|
||||
if ((close_delay != acm->port.close_delay) ||
|
||||
(closing_wait != acm->port.closing_wait))
|
||||
if ((ss->close_delay != old_close_delay) ||
|
||||
(ss->closing_wait != old_closing_wait)) {
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
retval = -EPERM;
|
||||
else
|
||||
retval = -EOPNOTSUPP;
|
||||
} else {
|
||||
acm->port.close_delay = close_delay;
|
||||
acm->port.closing_wait = closing_wait;
|
||||
}
|
||||
else {
|
||||
acm->port.close_delay = close_delay;
|
||||
acm->port.closing_wait = closing_wait;
|
||||
}
|
||||
} else
|
||||
retval = -EOPNOTSUPP;
|
||||
|
||||
mutex_unlock(&acm->port.mutex);
|
||||
return retval;
|
||||
|
||||
@@ -378,6 +378,12 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
{ USB_DEVICE(0x0b05, 0x17e0), .driver_info =
|
||||
USB_QUIRK_IGNORE_REMOTE_WAKEUP },
|
||||
|
||||
/* Realtek hub in Dell WD19 (Type-C) */
|
||||
{ USB_DEVICE(0x0bda, 0x0487), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* Generic RTL8153 based ethernet adapters */
|
||||
{ USB_DEVICE(0x0bda, 0x8153), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* Action Semiconductor flash disk */
|
||||
{ USB_DEVICE(0x10d6, 0x2200), .driver_info =
|
||||
USB_QUIRK_STRING_FETCH_255 },
|
||||
|
||||
@@ -135,7 +135,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
xhci->quirks |= XHCI_AMD_PLL_FIX;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_AMD &&
|
||||
(pdev->device == 0x15e0 ||
|
||||
(pdev->device == 0x145c ||
|
||||
pdev->device == 0x15e0 ||
|
||||
pdev->device == 0x15e1 ||
|
||||
pdev->device == 0x43bb))
|
||||
xhci->quirks |= XHCI_SUSPEND_DELAY;
|
||||
|
||||
@@ -445,6 +445,7 @@ MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match);
|
||||
static struct platform_driver usb_xhci_driver = {
|
||||
.probe = xhci_plat_probe,
|
||||
.remove = xhci_plat_remove,
|
||||
.shutdown = usb_hcd_platform_shutdown,
|
||||
.driver = {
|
||||
.name = "xhci-hcd",
|
||||
.pm = &xhci_plat_pm_ops,
|
||||
|
||||
@@ -289,23 +289,12 @@ DECLARE_EVENT_CLASS(xhci_log_urb,
|
||||
),
|
||||
TP_printk("ep%d%s-%s: urb %p pipe %u slot %d length %d/%d sgs %d/%d stream %d flags %08x",
|
||||
__entry->epnum, __entry->dir_in ? "in" : "out",
|
||||
({ char *s;
|
||||
switch (__entry->type) {
|
||||
case USB_ENDPOINT_XFER_INT:
|
||||
s = "intr";
|
||||
break;
|
||||
case USB_ENDPOINT_XFER_CONTROL:
|
||||
s = "control";
|
||||
break;
|
||||
case USB_ENDPOINT_XFER_BULK:
|
||||
s = "bulk";
|
||||
break;
|
||||
case USB_ENDPOINT_XFER_ISOC:
|
||||
s = "isoc";
|
||||
break;
|
||||
default:
|
||||
s = "UNKNOWN";
|
||||
} s; }), __entry->urb, __entry->pipe, __entry->slot_id,
|
||||
__print_symbolic(__entry->type,
|
||||
{ USB_ENDPOINT_XFER_INT, "intr" },
|
||||
{ USB_ENDPOINT_XFER_CONTROL, "control" },
|
||||
{ USB_ENDPOINT_XFER_BULK, "bulk" },
|
||||
{ USB_ENDPOINT_XFER_ISOC, "isoc" }),
|
||||
__entry->urb, __entry->pipe, __entry->slot_id,
|
||||
__entry->actual, __entry->length, __entry->num_mapped_sgs,
|
||||
__entry->num_sgs, __entry->stream, __entry->flags
|
||||
)
|
||||
|
||||
@@ -1183,6 +1183,8 @@ static const struct usb_device_id option_ids[] = {
|
||||
.driver_info = NCTRL(0) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110a, 0xff), /* Telit ME910G1 */
|
||||
.driver_info = NCTRL(0) | RSVD(3) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110b, 0xff), /* Telit ME910G1 (ECM) */
|
||||
.driver_info = NCTRL(0) },
|
||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910),
|
||||
.driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
|
||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4),
|
||||
|
||||
@@ -99,6 +99,7 @@ static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HP_VENDOR_ID, HP_LD220TA_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HP_VENDOR_ID, HP_LD381_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HP_VENDOR_ID, HP_LD960TA_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) },
|
||||
|
||||
@@ -130,6 +130,7 @@
|
||||
#define HP_LM920_PRODUCT_ID 0x026b
|
||||
#define HP_TD620_PRODUCT_ID 0x0956
|
||||
#define HP_LD960_PRODUCT_ID 0x0b39
|
||||
#define HP_LD381_PRODUCT_ID 0x0f7f
|
||||
#define HP_LCM220_PRODUCT_ID 0x3139
|
||||
#define HP_LCM960_PRODUCT_ID 0x3239
|
||||
#define HP_LD220_PRODUCT_ID 0x3524
|
||||
|
||||
@@ -271,6 +271,9 @@ void ucsi_displayport_remove_partner(struct typec_altmode *alt)
|
||||
return;
|
||||
|
||||
dp = typec_altmode_get_drvdata(alt);
|
||||
if (!dp)
|
||||
return;
|
||||
|
||||
dp->data.conf = 0;
|
||||
dp->data.status = 0;
|
||||
dp->initialized = false;
|
||||
@@ -285,6 +288,8 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con,
|
||||
struct typec_altmode *alt;
|
||||
struct ucsi_dp *dp;
|
||||
|
||||
mutex_lock(&con->lock);
|
||||
|
||||
/* We can't rely on the firmware with the capabilities. */
|
||||
desc->vdo |= DP_CAP_DP_SIGNALING | DP_CAP_RECEPTACLE;
|
||||
|
||||
@@ -293,12 +298,15 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con,
|
||||
desc->vdo |= all_assignments << 16;
|
||||
|
||||
alt = typec_port_register_altmode(con->port, desc);
|
||||
if (IS_ERR(alt))
|
||||
if (IS_ERR(alt)) {
|
||||
mutex_unlock(&con->lock);
|
||||
return alt;
|
||||
}
|
||||
|
||||
dp = devm_kzalloc(&alt->dev, sizeof(*dp), GFP_KERNEL);
|
||||
if (!dp) {
|
||||
typec_unregister_altmode(alt);
|
||||
mutex_unlock(&con->lock);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
@@ -311,5 +319,7 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con,
|
||||
alt->ops = &ucsi_displayport_ops;
|
||||
typec_altmode_set_drvdata(alt, dp);
|
||||
|
||||
mutex_unlock(&con->lock);
|
||||
|
||||
return alt;
|
||||
}
|
||||
|
||||
@@ -856,9 +856,9 @@ static void clear_incompat_bg_bits(struct btrfs_fs_info *fs_info, u64 flags)
|
||||
found_raid1c34 = true;
|
||||
up_read(&sinfo->groups_sem);
|
||||
}
|
||||
if (found_raid56)
|
||||
if (!found_raid56)
|
||||
btrfs_clear_fs_incompat(fs_info, RAID56);
|
||||
if (found_raid1c34)
|
||||
if (!found_raid1c34)
|
||||
btrfs_clear_fs_incompat(fs_info, RAID1C34);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9496,6 +9496,10 @@ out_fail:
|
||||
ret = btrfs_sync_log(trans, BTRFS_I(old_inode)->root, &ctx);
|
||||
if (ret)
|
||||
commit_transaction = true;
|
||||
} else if (sync_log) {
|
||||
mutex_lock(&root->log_mutex);
|
||||
list_del(&ctx.list);
|
||||
mutex_unlock(&root->log_mutex);
|
||||
}
|
||||
if (commit_transaction) {
|
||||
ret = btrfs_commit_transaction(trans);
|
||||
|
||||
@@ -1169,7 +1169,8 @@ try_again:
|
||||
rc = posix_lock_file(file, flock, NULL);
|
||||
up_write(&cinode->lock_sem);
|
||||
if (rc == FILE_LOCK_DEFERRED) {
|
||||
rc = wait_event_interruptible(flock->fl_wait, !flock->fl_blocker);
|
||||
rc = wait_event_interruptible(flock->fl_wait,
|
||||
list_empty(&flock->fl_blocked_member));
|
||||
if (!rc)
|
||||
goto try_again;
|
||||
locks_delete_block(flock);
|
||||
|
||||
@@ -2191,7 +2191,7 @@ int cifs_getattr(const struct path *path, struct kstat *stat,
|
||||
if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
|
||||
stat->gid = current_fsgid();
|
||||
}
|
||||
return rc;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
|
||||
|
||||
@@ -2222,6 +2222,8 @@ smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
goto qdf_free;
|
||||
}
|
||||
|
||||
atomic_inc(&tcon->num_remote_opens);
|
||||
|
||||
qd_rsp = (struct smb2_query_directory_rsp *)rsp_iov[1].iov_base;
|
||||
if (qd_rsp->sync_hdr.Status == STATUS_NO_MORE_FILES) {
|
||||
trace_smb3_query_dir_done(xid, fid->persistent_fid,
|
||||
@@ -3417,7 +3419,7 @@ static int smb3_fiemap(struct cifs_tcon *tcon,
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
if (out_data_len < sizeof(struct file_allocated_range_buffer)) {
|
||||
if (out_data_len && out_data_len < sizeof(struct file_allocated_range_buffer)) {
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1855,9 +1855,9 @@ fetch_events:
|
||||
waiter = true;
|
||||
init_waitqueue_entry(&wait, current);
|
||||
|
||||
spin_lock_irq(&ep->wq.lock);
|
||||
write_lock_irq(&ep->lock);
|
||||
__add_wait_queue_exclusive(&ep->wq, &wait);
|
||||
spin_unlock_irq(&ep->wq.lock);
|
||||
write_unlock_irq(&ep->lock);
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
@@ -1906,9 +1906,9 @@ send_events:
|
||||
goto fetch_events;
|
||||
|
||||
if (waiter) {
|
||||
spin_lock_irq(&ep->wq.lock);
|
||||
write_lock_irq(&ep->lock);
|
||||
__remove_wait_queue(&ep->wq, &wait);
|
||||
spin_unlock_irq(&ep->wq.lock);
|
||||
write_unlock_irq(&ep->lock);
|
||||
}
|
||||
|
||||
return res;
|
||||
|
||||
@@ -540,9 +540,14 @@ static int alloc_fd(unsigned start, unsigned flags)
|
||||
return __alloc_fd(current->files, start, rlimit(RLIMIT_NOFILE), flags);
|
||||
}
|
||||
|
||||
int __get_unused_fd_flags(unsigned flags, unsigned long nofile)
|
||||
{
|
||||
return __alloc_fd(current->files, 0, nofile, flags);
|
||||
}
|
||||
|
||||
int get_unused_fd_flags(unsigned flags)
|
||||
{
|
||||
return __alloc_fd(current->files, 0, rlimit(RLIMIT_NOFILE), flags);
|
||||
return __get_unused_fd_flags(flags, rlimit(RLIMIT_NOFILE));
|
||||
}
|
||||
EXPORT_SYMBOL(get_unused_fd_flags);
|
||||
|
||||
|
||||
@@ -343,6 +343,7 @@ struct io_accept {
|
||||
struct sockaddr __user *addr;
|
||||
int __user *addr_len;
|
||||
int flags;
|
||||
unsigned long nofile;
|
||||
};
|
||||
|
||||
struct io_sync {
|
||||
@@ -397,6 +398,7 @@ struct io_open {
|
||||
struct filename *filename;
|
||||
struct statx __user *buffer;
|
||||
struct open_how how;
|
||||
unsigned long nofile;
|
||||
};
|
||||
|
||||
struct io_files_update {
|
||||
@@ -2577,6 +2579,7 @@ static int io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
|
||||
return ret;
|
||||
}
|
||||
|
||||
req->open.nofile = rlimit(RLIMIT_NOFILE);
|
||||
req->flags |= REQ_F_NEED_CLEANUP;
|
||||
return 0;
|
||||
}
|
||||
@@ -2618,6 +2621,7 @@ static int io_openat2_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
|
||||
return ret;
|
||||
}
|
||||
|
||||
req->open.nofile = rlimit(RLIMIT_NOFILE);
|
||||
req->flags |= REQ_F_NEED_CLEANUP;
|
||||
return 0;
|
||||
}
|
||||
@@ -2636,7 +2640,7 @@ static int io_openat2(struct io_kiocb *req, struct io_kiocb **nxt,
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = get_unused_fd_flags(req->open.how.flags);
|
||||
ret = __get_unused_fd_flags(req->open.how.flags, req->open.nofile);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
@@ -3321,6 +3325,7 @@ static int io_accept_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
|
||||
accept->addr = u64_to_user_ptr(READ_ONCE(sqe->addr));
|
||||
accept->addr_len = u64_to_user_ptr(READ_ONCE(sqe->addr2));
|
||||
accept->flags = READ_ONCE(sqe->accept_flags);
|
||||
accept->nofile = rlimit(RLIMIT_NOFILE);
|
||||
return 0;
|
||||
#else
|
||||
return -EOPNOTSUPP;
|
||||
@@ -3337,7 +3342,8 @@ static int __io_accept(struct io_kiocb *req, struct io_kiocb **nxt,
|
||||
|
||||
file_flags = force_nonblock ? O_NONBLOCK : 0;
|
||||
ret = __sys_accept4_file(req->file, file_flags, accept->addr,
|
||||
accept->addr_len, accept->flags);
|
||||
accept->addr_len, accept->flags,
|
||||
accept->nofile);
|
||||
if (ret == -EAGAIN && force_nonblock)
|
||||
return -EAGAIN;
|
||||
if (ret == -ERESTARTSYS)
|
||||
@@ -4131,6 +4137,9 @@ static int io_req_defer_prep(struct io_kiocb *req,
|
||||
{
|
||||
ssize_t ret = 0;
|
||||
|
||||
if (!sqe)
|
||||
return 0;
|
||||
|
||||
if (io_op_defs[req->opcode].file_table) {
|
||||
ret = io_grab_files(req);
|
||||
if (unlikely(ret))
|
||||
@@ -4907,6 +4916,11 @@ err_req:
|
||||
if (sqe_flags & (IOSQE_IO_LINK|IOSQE_IO_HARDLINK)) {
|
||||
req->flags |= REQ_F_LINK;
|
||||
INIT_LIST_HEAD(&req->link_list);
|
||||
|
||||
if (io_alloc_async_ctx(req)) {
|
||||
ret = -EAGAIN;
|
||||
goto err_req;
|
||||
}
|
||||
ret = io_req_defer_prep(req, sqe);
|
||||
if (ret)
|
||||
req->flags |= REQ_F_FAIL_LINK;
|
||||
|
||||
54
fs/locks.c
54
fs/locks.c
@@ -725,7 +725,6 @@ static void __locks_delete_block(struct file_lock *waiter)
|
||||
{
|
||||
locks_delete_global_blocked(waiter);
|
||||
list_del_init(&waiter->fl_blocked_member);
|
||||
waiter->fl_blocker = NULL;
|
||||
}
|
||||
|
||||
static void __locks_wake_up_blocks(struct file_lock *blocker)
|
||||
@@ -740,6 +739,13 @@ static void __locks_wake_up_blocks(struct file_lock *blocker)
|
||||
waiter->fl_lmops->lm_notify(waiter);
|
||||
else
|
||||
wake_up(&waiter->fl_wait);
|
||||
|
||||
/*
|
||||
* The setting of fl_blocker to NULL marks the "done"
|
||||
* point in deleting a block. Paired with acquire at the top
|
||||
* of locks_delete_block().
|
||||
*/
|
||||
smp_store_release(&waiter->fl_blocker, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -753,11 +759,42 @@ int locks_delete_block(struct file_lock *waiter)
|
||||
{
|
||||
int status = -ENOENT;
|
||||
|
||||
/*
|
||||
* If fl_blocker is NULL, it won't be set again as this thread "owns"
|
||||
* the lock and is the only one that might try to claim the lock.
|
||||
*
|
||||
* We use acquire/release to manage fl_blocker so that we can
|
||||
* optimize away taking the blocked_lock_lock in many cases.
|
||||
*
|
||||
* The smp_load_acquire guarantees two things:
|
||||
*
|
||||
* 1/ that fl_blocked_requests can be tested locklessly. If something
|
||||
* was recently added to that list it must have been in a locked region
|
||||
* *before* the locked region when fl_blocker was set to NULL.
|
||||
*
|
||||
* 2/ that no other thread is accessing 'waiter', so it is safe to free
|
||||
* it. __locks_wake_up_blocks is careful not to touch waiter after
|
||||
* fl_blocker is released.
|
||||
*
|
||||
* If a lockless check of fl_blocker shows it to be NULL, we know that
|
||||
* no new locks can be inserted into its fl_blocked_requests list, and
|
||||
* can avoid doing anything further if the list is empty.
|
||||
*/
|
||||
if (!smp_load_acquire(&waiter->fl_blocker) &&
|
||||
list_empty(&waiter->fl_blocked_requests))
|
||||
return status;
|
||||
|
||||
spin_lock(&blocked_lock_lock);
|
||||
if (waiter->fl_blocker)
|
||||
status = 0;
|
||||
__locks_wake_up_blocks(waiter);
|
||||
__locks_delete_block(waiter);
|
||||
|
||||
/*
|
||||
* The setting of fl_blocker to NULL marks the "done" point in deleting
|
||||
* a block. Paired with acquire at the top of this function.
|
||||
*/
|
||||
smp_store_release(&waiter->fl_blocker, NULL);
|
||||
spin_unlock(&blocked_lock_lock);
|
||||
return status;
|
||||
}
|
||||
@@ -1350,7 +1387,8 @@ static int posix_lock_inode_wait(struct inode *inode, struct file_lock *fl)
|
||||
error = posix_lock_inode(inode, fl, NULL);
|
||||
if (error != FILE_LOCK_DEFERRED)
|
||||
break;
|
||||
error = wait_event_interruptible(fl->fl_wait, !fl->fl_blocker);
|
||||
error = wait_event_interruptible(fl->fl_wait,
|
||||
list_empty(&fl->fl_blocked_member));
|
||||
if (error)
|
||||
break;
|
||||
}
|
||||
@@ -1435,7 +1473,8 @@ int locks_mandatory_area(struct inode *inode, struct file *filp, loff_t start,
|
||||
error = posix_lock_inode(inode, &fl, NULL);
|
||||
if (error != FILE_LOCK_DEFERRED)
|
||||
break;
|
||||
error = wait_event_interruptible(fl.fl_wait, !fl.fl_blocker);
|
||||
error = wait_event_interruptible(fl.fl_wait,
|
||||
list_empty(&fl.fl_blocked_member));
|
||||
if (!error) {
|
||||
/*
|
||||
* If we've been sleeping someone might have
|
||||
@@ -1638,7 +1677,8 @@ restart:
|
||||
|
||||
locks_dispose_list(&dispose);
|
||||
error = wait_event_interruptible_timeout(new_fl->fl_wait,
|
||||
!new_fl->fl_blocker, break_time);
|
||||
list_empty(&new_fl->fl_blocked_member),
|
||||
break_time);
|
||||
|
||||
percpu_down_read(&file_rwsem);
|
||||
spin_lock(&ctx->flc_lock);
|
||||
@@ -2122,7 +2162,8 @@ static int flock_lock_inode_wait(struct inode *inode, struct file_lock *fl)
|
||||
error = flock_lock_inode(inode, fl);
|
||||
if (error != FILE_LOCK_DEFERRED)
|
||||
break;
|
||||
error = wait_event_interruptible(fl->fl_wait, !fl->fl_blocker);
|
||||
error = wait_event_interruptible(fl->fl_wait,
|
||||
list_empty(&fl->fl_blocked_member));
|
||||
if (error)
|
||||
break;
|
||||
}
|
||||
@@ -2399,7 +2440,8 @@ static int do_lock_file_wait(struct file *filp, unsigned int cmd,
|
||||
error = vfs_lock_file(filp, cmd, fl, NULL);
|
||||
if (error != FILE_LOCK_DEFERRED)
|
||||
break;
|
||||
error = wait_event_interruptible(fl->fl_wait, !fl->fl_blocker);
|
||||
error = wait_event_interruptible(fl->fl_wait,
|
||||
list_empty(&fl->fl_blocked_member));
|
||||
if (error)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -85,6 +85,7 @@ extern int f_dupfd(unsigned int from, struct file *file, unsigned flags);
|
||||
extern int replace_fd(unsigned fd, struct file *file, unsigned flags);
|
||||
extern void set_close_on_exec(unsigned int fd, int flag);
|
||||
extern bool get_close_on_exec(unsigned int fd);
|
||||
extern int __get_unused_fd_flags(unsigned flags, unsigned long nofile);
|
||||
extern int get_unused_fd_flags(unsigned flags);
|
||||
extern void put_unused_fd(unsigned int fd);
|
||||
|
||||
|
||||
@@ -311,7 +311,7 @@ static inline int TestClearPage##uname(struct page *page) { return 0; }
|
||||
|
||||
__PAGEFLAG(Locked, locked, PF_NO_TAIL)
|
||||
PAGEFLAG(Waiters, waiters, PF_ONLY_HEAD) __CLEARPAGEFLAG(Waiters, waiters, PF_ONLY_HEAD)
|
||||
PAGEFLAG(Error, error, PF_NO_COMPOUND) TESTCLEARFLAG(Error, error, PF_NO_COMPOUND)
|
||||
PAGEFLAG(Error, error, PF_NO_TAIL) TESTCLEARFLAG(Error, error, PF_NO_TAIL)
|
||||
PAGEFLAG(Referenced, referenced, PF_HEAD)
|
||||
TESTCLEARFLAG(Referenced, referenced, PF_HEAD)
|
||||
__SETPAGEFLAG(Referenced, referenced, PF_HEAD)
|
||||
|
||||
@@ -401,7 +401,8 @@ extern int __sys_sendto(int fd, void __user *buff, size_t len,
|
||||
int addr_len);
|
||||
extern int __sys_accept4_file(struct file *file, unsigned file_flags,
|
||||
struct sockaddr __user *upeer_sockaddr,
|
||||
int __user *upeer_addrlen, int flags);
|
||||
int __user *upeer_addrlen, int flags,
|
||||
unsigned long nofile);
|
||||
extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
|
||||
int __user *upeer_addrlen, int flags);
|
||||
extern int __sys_socket(int family, int type, int protocol);
|
||||
|
||||
@@ -141,8 +141,9 @@ extern int remap_vmalloc_range_partial(struct vm_area_struct *vma,
|
||||
|
||||
extern int remap_vmalloc_range(struct vm_area_struct *vma, void *addr,
|
||||
unsigned long pgoff);
|
||||
void vmalloc_sync_all(void);
|
||||
|
||||
void vmalloc_sync_mappings(void);
|
||||
void vmalloc_sync_unmappings(void);
|
||||
|
||||
/*
|
||||
* Lowlevel-APIs (not for driver use!)
|
||||
*/
|
||||
|
||||
@@ -770,8 +770,7 @@ config ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH
|
||||
bool
|
||||
|
||||
config CC_HAS_INT128
|
||||
def_bool y
|
||||
depends on !$(cc-option,-D__SIZEOF_INT128__=0)
|
||||
def_bool !$(cc-option,$(m64-flag) -D__SIZEOF_INT128__=0) && 64BIT
|
||||
|
||||
#
|
||||
# For architectures that know their GCC __int128 support is sound
|
||||
|
||||
@@ -519,7 +519,7 @@ NOKPROBE_SYMBOL(notify_die);
|
||||
|
||||
int register_die_notifier(struct notifier_block *nb)
|
||||
{
|
||||
vmalloc_sync_all();
|
||||
vmalloc_sync_mappings();
|
||||
return atomic_notifier_chain_register(&die_chain, nb);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(register_die_notifier);
|
||||
|
||||
12
mm/madvise.c
12
mm/madvise.c
@@ -335,12 +335,14 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd,
|
||||
}
|
||||
|
||||
page = pmd_page(orig_pmd);
|
||||
|
||||
/* Do not interfere with other mappings of this page */
|
||||
if (page_mapcount(page) != 1)
|
||||
goto huge_unlock;
|
||||
|
||||
if (next - addr != HPAGE_PMD_SIZE) {
|
||||
int err;
|
||||
|
||||
if (page_mapcount(page) != 1)
|
||||
goto huge_unlock;
|
||||
|
||||
get_page(page);
|
||||
spin_unlock(ptl);
|
||||
lock_page(page);
|
||||
@@ -426,6 +428,10 @@ regular_page:
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Do not interfere with other mappings of this page */
|
||||
if (page_mapcount(page) != 1)
|
||||
continue;
|
||||
|
||||
VM_BUG_ON_PAGE(PageTransCompound(page), page);
|
||||
|
||||
if (pte_young(ptent)) {
|
||||
|
||||
103
mm/memcontrol.c
103
mm/memcontrol.c
@@ -2297,28 +2297,41 @@ static void high_work_func(struct work_struct *work)
|
||||
#define MEMCG_DELAY_SCALING_SHIFT 14
|
||||
|
||||
/*
|
||||
* Scheduled by try_charge() to be executed from the userland return path
|
||||
* and reclaims memory over the high limit.
|
||||
* Get the number of jiffies that we should penalise a mischievous cgroup which
|
||||
* is exceeding its memory.high by checking both it and its ancestors.
|
||||
*/
|
||||
void mem_cgroup_handle_over_high(void)
|
||||
static unsigned long calculate_high_delay(struct mem_cgroup *memcg,
|
||||
unsigned int nr_pages)
|
||||
{
|
||||
unsigned long usage, high, clamped_high;
|
||||
unsigned long pflags;
|
||||
unsigned long penalty_jiffies, overage;
|
||||
unsigned int nr_pages = current->memcg_nr_pages_over_high;
|
||||
struct mem_cgroup *memcg;
|
||||
unsigned long penalty_jiffies;
|
||||
u64 max_overage = 0;
|
||||
|
||||
if (likely(!nr_pages))
|
||||
return;
|
||||
do {
|
||||
unsigned long usage, high;
|
||||
u64 overage;
|
||||
|
||||
memcg = get_mem_cgroup_from_mm(current->mm);
|
||||
reclaim_high(memcg, nr_pages, GFP_KERNEL);
|
||||
current->memcg_nr_pages_over_high = 0;
|
||||
usage = page_counter_read(&memcg->memory);
|
||||
high = READ_ONCE(memcg->high);
|
||||
|
||||
/*
|
||||
* Prevent division by 0 in overage calculation by acting as if
|
||||
* it was a threshold of 1 page
|
||||
*/
|
||||
high = max(high, 1UL);
|
||||
|
||||
overage = usage - high;
|
||||
overage <<= MEMCG_DELAY_PRECISION_SHIFT;
|
||||
overage = div64_u64(overage, high);
|
||||
|
||||
if (overage > max_overage)
|
||||
max_overage = overage;
|
||||
} while ((memcg = parent_mem_cgroup(memcg)) &&
|
||||
!mem_cgroup_is_root(memcg));
|
||||
|
||||
if (!max_overage)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* memory.high is breached and reclaim is unable to keep up. Throttle
|
||||
* allocators proactively to slow down excessive growth.
|
||||
*
|
||||
* We use overage compared to memory.high to calculate the number of
|
||||
* jiffies to sleep (penalty_jiffies). Ideally this value should be
|
||||
* fairly lenient on small overages, and increasingly harsh when the
|
||||
@@ -2326,24 +2339,9 @@ void mem_cgroup_handle_over_high(void)
|
||||
* its crazy behaviour, so we exponentially increase the delay based on
|
||||
* overage amount.
|
||||
*/
|
||||
|
||||
usage = page_counter_read(&memcg->memory);
|
||||
high = READ_ONCE(memcg->high);
|
||||
|
||||
if (usage <= high)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Prevent division by 0 in overage calculation by acting as if it was a
|
||||
* threshold of 1 page
|
||||
*/
|
||||
clamped_high = max(high, 1UL);
|
||||
|
||||
overage = div_u64((u64)(usage - high) << MEMCG_DELAY_PRECISION_SHIFT,
|
||||
clamped_high);
|
||||
|
||||
penalty_jiffies = ((u64)overage * overage * HZ)
|
||||
>> (MEMCG_DELAY_PRECISION_SHIFT + MEMCG_DELAY_SCALING_SHIFT);
|
||||
penalty_jiffies = max_overage * max_overage * HZ;
|
||||
penalty_jiffies >>= MEMCG_DELAY_PRECISION_SHIFT;
|
||||
penalty_jiffies >>= MEMCG_DELAY_SCALING_SHIFT;
|
||||
|
||||
/*
|
||||
* Factor in the task's own contribution to the overage, such that four
|
||||
@@ -2360,7 +2358,32 @@ void mem_cgroup_handle_over_high(void)
|
||||
* application moving forwards and also permit diagnostics, albeit
|
||||
* extremely slowly.
|
||||
*/
|
||||
penalty_jiffies = min(penalty_jiffies, MEMCG_MAX_HIGH_DELAY_JIFFIES);
|
||||
return min(penalty_jiffies, MEMCG_MAX_HIGH_DELAY_JIFFIES);
|
||||
}
|
||||
|
||||
/*
|
||||
* Scheduled by try_charge() to be executed from the userland return path
|
||||
* and reclaims memory over the high limit.
|
||||
*/
|
||||
void mem_cgroup_handle_over_high(void)
|
||||
{
|
||||
unsigned long penalty_jiffies;
|
||||
unsigned long pflags;
|
||||
unsigned int nr_pages = current->memcg_nr_pages_over_high;
|
||||
struct mem_cgroup *memcg;
|
||||
|
||||
if (likely(!nr_pages))
|
||||
return;
|
||||
|
||||
memcg = get_mem_cgroup_from_mm(current->mm);
|
||||
reclaim_high(memcg, nr_pages, GFP_KERNEL);
|
||||
current->memcg_nr_pages_over_high = 0;
|
||||
|
||||
/*
|
||||
* memory.high is breached and reclaim is unable to keep up. Throttle
|
||||
* allocators proactively to slow down excessive growth.
|
||||
*/
|
||||
penalty_jiffies = calculate_high_delay(memcg, nr_pages);
|
||||
|
||||
/*
|
||||
* Don't sleep if the amount of jiffies this memcg owes us is so low
|
||||
@@ -4027,7 +4050,7 @@ static void __mem_cgroup_usage_unregister_event(struct mem_cgroup *memcg,
|
||||
struct mem_cgroup_thresholds *thresholds;
|
||||
struct mem_cgroup_threshold_ary *new;
|
||||
unsigned long usage;
|
||||
int i, j, size;
|
||||
int i, j, size, entries;
|
||||
|
||||
mutex_lock(&memcg->thresholds_lock);
|
||||
|
||||
@@ -4047,14 +4070,20 @@ static void __mem_cgroup_usage_unregister_event(struct mem_cgroup *memcg,
|
||||
__mem_cgroup_threshold(memcg, type == _MEMSWAP);
|
||||
|
||||
/* Calculate new number of threshold */
|
||||
size = 0;
|
||||
size = entries = 0;
|
||||
for (i = 0; i < thresholds->primary->size; i++) {
|
||||
if (thresholds->primary->entries[i].eventfd != eventfd)
|
||||
size++;
|
||||
else
|
||||
entries++;
|
||||
}
|
||||
|
||||
new = thresholds->spare;
|
||||
|
||||
/* If no items related to eventfd have been cleared, nothing to do */
|
||||
if (!entries)
|
||||
goto unlock;
|
||||
|
||||
/* Set thresholds array to NULL if we don't have thresholds */
|
||||
if (!size) {
|
||||
kfree(new);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user