Merge remote-tracking branch 'origin/mirror-android14-6.1' into HEAD

* origin/mirror-android14-6.1:
  ANDROID: usb: gadget: f_accessory: update to usb_gstrings_attach
  ANDROID: abi_gki_aarch64_qcom: whitelist some vm symbols
  ANDROID: ABI: Update QCOM symbol list
  ANDROID: Add initial symbols list for galaxy
  ANDROID: printk: export symbol for tracepoint_console
  Linux 6.1.15
  USB: core: Don't hold device lock while reading the "descriptors" sysfs file
  scripts/tags.sh: fix incompatibility with PCRE2
  fs: use consistent setgid checks in is_sxid()
  attr: use consistent sgid stripping checks
  attr: add setattr_should_drop_sgid()
  fs: move should_remove_suid()
  attr: add in_group_or_capable()
  drm/amd/display: Properly reuse completion structure
  usb: typec: pd: Remove usb_suspend_supported sysfs from sink PDO
  arm64: dts: uniphier: Fix property name in PXs3 USB node
  usb: gadget: u_serial: Add null pointer check in gserial_resume
  USB: serial: option: add support for VW/Skoda "Carstick LTE"
  usb: dwc3: pci: add support for the Intel Meteor Lake-M
  drm/amd/display: Fix race condition in DPIA AUX transfer
  drm/amd/display: Move DCN314 DOMAIN power control to DMCUB
  vc_screen: don't clobber return value in vcs_read
  net: Remove WARN_ON_ONCE(sk->sk_forward_alloc) from sk_stream_kill_queues().
  bpf: bpf_fib_lookup should not return neigh in NUD_FAILED state
  PM: sleep: Avoid using pr_cont() in the tasks freezing code
  x86/cpu: Add Lunar Lake M
  selftests: ocelot: tc_flower_chains: make test_vlan_ingress_modify() more comprehensive
  HID: Ignore battery for ELAN touchscreen 29DF on HP
  ASoC: codecs: es8326: Fix DTS properties reading
  HID: core: Fix deadloop in hid_apply_multiplier.
  neigh: make sure used and confirmed times are valid
  ARM: dts: stihxxx-b2120: fix polarity of reset line of tsin0 port
  ASoC: SOF: amd: Fix for handling spurious interrupts from DSP
  powerpc: Don't select ARCH_WANTS_NO_INSTR
  IB/hfi1: Assign npages earlier
  ASoC: rt715-sdca: fix clock stop prepare timeout issue
  arm64: dts: rockchip: align rk3399 DMC OPP table with bindings
  btrfs: send: limit number of clones and allocated memory size
  pinctrl: amd: Fix debug output for debounce time
  ACPI: NFIT: fix a potential deadlock during NFIT teardown
  HID: Ignore battery for Elan touchscreen on Asus TP420IA
  HID: elecom: add support for TrackBall 056E:011C
  arm64: dts: rockchip: fix probe of analog sound card on rock-3a
  arm64: dts: rockchip: add missing #interrupt-cells to rk356x pcie2x1
  ARM: dts: rockchip: add power-domains property to dp node on rk3288
  arm64: dts: rockchip: drop unused LED mode property from rk3328-roc-cc
  arm64: dts: rockchip: reduce thermal limits on rk3399-pinephone-pro
  Fix XFRM-I support for nested ESP tunnels

Change-Id: If8282a015820c3513dffe48231bec2517e9feb55
This commit is contained in:
Maria Yu 2023-03-06 13:51:25 +08:00
commit 25c71db17a
61 changed files with 1742 additions and 237 deletions

View File

@ -15,6 +15,7 @@ package(
_aarch64_additional_kmi_symbol_lists = [ _aarch64_additional_kmi_symbol_lists = [
# keep sorted # keep sorted
"android/abi_gki_aarch64_db845c", "android/abi_gki_aarch64_db845c",
"android/abi_gki_aarch64_galaxy",
"android/abi_gki_aarch64_pixel", "android/abi_gki_aarch64_pixel",
"android/abi_gki_aarch64_qcom", "android/abi_gki_aarch64_qcom",
"android/abi_gki_aarch64_virtual_device", "android/abi_gki_aarch64_virtual_device",

View File

@ -2940,7 +2940,7 @@ Produces::
bash-1994 [000] .... 4342.324898: ima_get_action <-process_measurement bash-1994 [000] .... 4342.324898: ima_get_action <-process_measurement
bash-1994 [000] .... 4342.324898: ima_match_policy <-ima_get_action bash-1994 [000] .... 4342.324898: ima_match_policy <-ima_get_action
bash-1994 [000] .... 4342.324899: do_truncate <-do_last bash-1994 [000] .... 4342.324899: do_truncate <-do_last
bash-1994 [000] .... 4342.324899: should_remove_suid <-do_truncate bash-1994 [000] .... 4342.324899: setattr_should_drop_suidgid <-do_truncate
bash-1994 [000] .... 4342.324899: notify_change <-do_truncate bash-1994 [000] .... 4342.324899: notify_change <-do_truncate
bash-1994 [000] .... 4342.324900: current_fs_time <-notify_change bash-1994 [000] .... 4342.324900: current_fs_time <-notify_change
bash-1994 [000] .... 4342.324900: current_kernel_time <-current_fs_time bash-1994 [000] .... 4342.324900: current_kernel_time <-current_fs_time

View File

@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 6 VERSION = 6
PATCHLEVEL = 1 PATCHLEVEL = 1
SUBLEVEL = 14 SUBLEVEL = 15
EXTRAVERSION = EXTRAVERSION =
NAME = Hurr durr I'ma ninja sloth NAME = Hurr durr I'ma ninja sloth

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,265 @@
[abi_symbol_list]
adjust_managed_page_count
alloc_pages_exact
alt_cb_patch_nops
__arch_copy_from_user
__arch_copy_to_user
arm64_use_ng_mappings
atomic_notifier_call_chain
atomic_notifier_chain_register
atomic_notifier_chain_unregister
__bitmap_weight
bitmap_zalloc
blkdev_get_by_dev
blkdev_get_by_path
blkdev_issue_flush
blkdev_put
cache_line_size
cancel_delayed_work_sync
__check_object_size
__class_create
class_find_device
__const_udelay
copy_from_kernel_nofault
cpu_hwcaps
cpu_number
__cpu_online_mask
__cpu_possible_mask
__cpu_present_mask
crypto_alloc_base
crypto_comp_compress
crypto_comp_decompress
crypto_destroy_tfm
_ctype
debugfs_create_file
debugfs_remove
delayed_work_timer_fn
del_timer
_dev_err
device_create
device_destroy
device_register
device_unregister
_dev_info
__devm_alloc_percpu
devm_gen_pool_create
devm_ioremap
devm_ioremap_wc
devm_kfree
devm_kmalloc
devm_kmemdup
devm_kstrdup
devm_kstrdup_const
dev_set_name
_dev_warn
dma_alloc_attrs
dma_free_attrs
down_write
file_ra_state_init
file_write_and_wait_range
_find_next_bit
fixed_size_llseek
fortify_panic
__free_pages
free_pages
free_pages_exact
generic_file_read_iter
generic_perform_write
generic_write_checks
gen_pool_add_owner
gen_pool_alloc_algo_owner
gen_pool_destroy
gen_pool_free_owner
gen_pool_virt_to_phys
getboottime64
get_random_u64
__get_task_ioprio
get_zeroed_page
gic_nonsecure_priorities
gpiochip_find
gpiod_get_raw_value
gpio_to_desc
I_BDEV
init_task
init_timer_key
input_close_device
input_open_device
input_register_handle
input_register_handler
input_unregister_handle
input_unregister_handler
ioremap_prot
iounmap
iov_iter_kvec
jiffies
kasan_flag_enabled
kasprintf
kernel_cpustat
kernfs_find_and_get_ns
kfree
kimage_vaddr
kimage_voffset
__kmalloc
kmalloc_caches
kmalloc_large
kmalloc_trace
kmsg_dump_get_line
kmsg_dump_rewind
kobject_create_and_add
kobject_put
kstrdup
kstrtoint
kstrtouint
kstrtoull
kthread_create_on_node
ktime_get_real_ts64
kvfree
kvmalloc_node
__list_add_valid
__list_del_entry_valid
log_post_read_mmio
log_read_mmio
memblock_free
memcpy
__memcpy_fromio
__memcpy_toio
memparse
memset
__memset_io
memstart_addr
mod_timer
__msecs_to_jiffies
msleep
__mutex_init
mutex_lock
mutex_unlock
name_to_dev_t
nr_cpu_ids
nsec_to_clock_t
of_address_to_resource
of_find_compatible_node
of_find_node_opts_by_path
of_find_property
__of_get_address
of_get_property
of_iomap
of_n_addr_cells
of_n_size_cells
__of_parse_phandle_with_args
of_property_count_elems_of_size
of_property_match_string
of_property_read_string
of_property_read_string_helper
of_property_read_u32_index
of_property_read_variable_u32_array
of_reserved_mem_device_init_by_idx
of_reserved_mem_lookup
of_root
panic
panic_notifier_list
param_get_uint
param_ops_charp
param_ops_uint
param_ops_ullong
param_set_uint
__per_cpu_offset
__platform_driver_register
platform_driver_unregister
preempt_schedule
print_hex_dump
_printk
proc_create
proc_create_data
proc_remove
proc_set_size
pstore_register
pstore_unregister
queue_delayed_work_on
queue_work_on
___ratelimit
raw_notifier_call_chain
raw_notifier_chain_register
raw_notifier_chain_unregister
_raw_spin_lock
_raw_spin_lock_irqsave
_raw_spin_unlock
_raw_spin_unlock_irqrestore
register_console
register_die_notifier
register_reboot_notifier
register_restart_handler
register_syscore_ops
remove_cpu
rtc_class_open
rtc_read_time
rtc_time64_to_tm
rtc_tm_to_time64
runqueues
sched_clock
sched_show_task
scnprintf
seq_hex_dump
seq_lseek
seq_printf
seq_puts
seq_read
seq_release
simple_strtol
single_open
single_release
snprintf
sprintf
sscanf
__stack_chk_fail
strcmp
strim
strlcat
strlcpy
strlen
strncasecmp
strncmp
strncpy
strnlen
strnstr
strsep
strstr
sysfs_create_file_ns
sysfs_create_group
sysfs_remove_file_ns
sysfs_remove_group
sysfs_streq
system_long_wq
system_unbound_wq
sys_tz
time64_to_tm
__traceiter_android_vh_ipi_stop
__traceiter_android_vh_is_fpsimd_save
__traceiter_console
__traceiter_hrtimer_expire_entry
__traceiter_hrtimer_expire_exit
__traceiter_irq_handler_entry
__traceiter_irq_handler_exit
__traceiter_sched_switch
__traceiter_workqueue_execute_start
__tracepoint_android_vh_ipi_stop
__tracepoint_android_vh_is_fpsimd_save
__tracepoint_console
__tracepoint_hrtimer_expire_entry
__tracepoint_hrtimer_expire_exit
__tracepoint_irq_handler_entry
__tracepoint_irq_handler_exit
tracepoint_probe_register
tracepoint_probe_unregister
__tracepoint_sched_switch
__tracepoint_workqueue_execute_start
unregister_console
unregister_die_notifier
unregister_reboot_notifier
unregister_restart_handler
unregister_syscore_ops
up_write
vfree
vfs_fsync_range
vmalloc
vsnprintf
wake_up_process

View File

@ -341,6 +341,7 @@
cgroup_taskset_first cgroup_taskset_first
cgroup_taskset_next cgroup_taskset_next
__check_object_size __check_object_size
check_move_unevictable_pages
check_preempt_curr check_preempt_curr
check_zeroed_user check_zeroed_user
__class_create __class_create
@ -2356,6 +2357,7 @@
page_pool_destroy page_pool_destroy
page_pool_put_defragged_page page_pool_put_defragged_page
page_pool_release_page page_pool_release_page
__pagevec_release
panic panic
panic_notifier_list panic_notifier_list
panic_timeout panic_timeout
@ -2726,6 +2728,7 @@
rcuwait_wake_up rcuwait_wake_up
rdev_get_drvdata rdev_get_drvdata
reboot_mode reboot_mode
reclaim_shmem_address_space
rebuild_sched_domains rebuild_sched_domains
refcount_dec_and_lock refcount_dec_and_lock
refcount_dec_and_mutex_lock refcount_dec_and_mutex_lock
@ -3458,6 +3461,8 @@
__traceiter_android_vh_binder_set_priority __traceiter_android_vh_binder_set_priority
__traceiter_android_vh_binder_wakeup_ilocked __traceiter_android_vh_binder_wakeup_ilocked
__traceiter_android_vh_build_sched_domains __traceiter_android_vh_build_sched_domains
__traceiter_android_vh_check_uninterrupt_tasks
__traceiter_android_vh_check_uninterrupt_tasks_done
__traceiter_android_vh_cpufreq_fast_switch __traceiter_android_vh_cpufreq_fast_switch
__traceiter_android_vh_cpufreq_resolve_freq __traceiter_android_vh_cpufreq_resolve_freq
__traceiter_android_vh_cpufreq_target __traceiter_android_vh_cpufreq_target
@ -3578,6 +3583,8 @@
__tracepoint_android_vh_binder_set_priority __tracepoint_android_vh_binder_set_priority
__tracepoint_android_vh_binder_wakeup_ilocked __tracepoint_android_vh_binder_wakeup_ilocked
__tracepoint_android_vh_build_sched_domains __tracepoint_android_vh_build_sched_domains
__tracepoint_android_vh_check_uninterrupt_tasks
__tracepoint_android_vh_check_uninterrupt_tasks_done
__tracepoint_android_vh_cpufreq_fast_switch __tracepoint_android_vh_cpufreq_fast_switch
__tracepoint_android_vh_cpufreq_resolve_freq __tracepoint_android_vh_cpufreq_resolve_freq
__tracepoint_android_vh_cpufreq_target __tracepoint_android_vh_cpufreq_target

View File

@ -1181,6 +1181,7 @@ edp: dp@ff970000 {
clock-names = "dp", "pclk"; clock-names = "dp", "pclk";
phys = <&edp_phy>; phys = <&edp_phy>;
phy-names = "dp"; phy-names = "dp";
power-domains = <&power RK3288_PD_VIO>;
resets = <&cru SRST_EDP>; resets = <&cru SRST_EDP>;
reset-names = "dp"; reset-names = "dp";
rockchip,grf = <&grf>; rockchip,grf = <&grf>;

View File

@ -178,7 +178,7 @@ tsin0: port {
tsin-num = <0>; tsin-num = <0>;
serial-not-parallel; serial-not-parallel;
i2c-bus = <&ssc2>; i2c-bus = <&ssc2>;
reset-gpios = <&pio15 4 GPIO_ACTIVE_HIGH>; reset-gpios = <&pio15 4 GPIO_ACTIVE_LOW>;
dvb-card = <STV0367_TDA18212_NIMA_1>; dvb-card = <STV0367_TDA18212_NIMA_1>;
}; };
}; };

View File

@ -96,7 +96,6 @@ power_led: led-0 {
linux,default-trigger = "heartbeat"; linux,default-trigger = "heartbeat";
gpios = <&rk805 1 GPIO_ACTIVE_LOW>; gpios = <&rk805 1 GPIO_ACTIVE_LOW>;
default-state = "on"; default-state = "on";
mode = <0x23>;
}; };
user_led: led-1 { user_led: led-1 {
@ -104,7 +103,6 @@ user_led: led-1 {
linux,default-trigger = "mmc1"; linux,default-trigger = "mmc1";
gpios = <&rk805 0 GPIO_ACTIVE_LOW>; gpios = <&rk805 0 GPIO_ACTIVE_LOW>;
default-state = "off"; default-state = "off";
mode = <0x05>;
}; };
}; };
}; };

View File

@ -111,7 +111,7 @@ opp05 {
}; };
}; };
dmc_opp_table: dmc_opp_table { dmc_opp_table: opp-table-3 {
compatible = "operating-points-v2"; compatible = "operating-points-v2";
opp00 { opp00 {

View File

@ -83,6 +83,13 @@ vcc1v8_codec: vcc1v8-codec-regulator {
}; };
}; };
&cpu_alert0 {
temperature = <65000>;
};
&cpu_alert1 {
temperature = <68000>;
};
&cpu_l0 { &cpu_l0 {
cpu-supply = <&vdd_cpu_l>; cpu-supply = <&vdd_cpu_l>;
}; };

View File

@ -521,6 +521,8 @@ &i2s0_8ch {
}; };
&i2s1_8ch { &i2s1_8ch {
pinctrl-names = "default";
pinctrl-0 = <&i2s1m0_sclktx &i2s1m0_lrcktx &i2s1m0_sdi0 &i2s1m0_sdo0>;
rockchip,trcm-sync-tx-only; rockchip,trcm-sync-tx-only;
status = "okay"; status = "okay";
}; };

View File

@ -966,6 +966,7 @@ pcie2x1: pcie@fe260000 {
clock-names = "aclk_mst", "aclk_slv", clock-names = "aclk_mst", "aclk_slv",
"aclk_dbi", "pclk", "aux"; "aclk_dbi", "pclk", "aux";
device_type = "pci"; device_type = "pci";
#interrupt-cells = <1>;
interrupt-map-mask = <0 0 0 7>; interrupt-map-mask = <0 0 0 7>;
interrupt-map = <0 0 0 1 &pcie_intc 0>, interrupt-map = <0 0 0 1 &pcie_intc 0>,
<0 0 0 2 &pcie_intc 1>, <0 0 0 2 &pcie_intc 1>,

View File

@ -24,7 +24,7 @@ &usb0 {
snps,dis_enblslpm_quirk; snps,dis_enblslpm_quirk;
snps,dis_u2_susphy_quirk; snps,dis_u2_susphy_quirk;
snps,dis_u3_susphy_quirk; snps,dis_u3_susphy_quirk;
snps,usb2_gadget_lpm_disable; snps,usb2-gadget-lpm-disable;
phy-names = "usb2-phy", "usb3-phy"; phy-names = "usb2-phy", "usb3-phy";
phys = <&usb0_hsphy0>, <&usb0_ssphy0>; phys = <&usb0_hsphy0>, <&usb0_ssphy0>;
}; };

View File

@ -24,7 +24,7 @@ &usb1 {
snps,dis_enblslpm_quirk; snps,dis_enblslpm_quirk;
snps,dis_u2_susphy_quirk; snps,dis_u2_susphy_quirk;
snps,dis_u3_susphy_quirk; snps,dis_u3_susphy_quirk;
snps,usb2_gadget_lpm_disable; snps,usb2-gadget-lpm-disable;
phy-names = "usb2-phy", "usb3-phy"; phy-names = "usb2-phy", "usb3-phy";
phys = <&usb1_hsphy0>, <&usb1_ssphy0>; phys = <&usb1_hsphy0>, <&usb1_ssphy0>;
}; };

View File

@ -161,7 +161,6 @@ config PPC
select ARCH_WANT_IRQS_OFF_ACTIVATE_MM select ARCH_WANT_IRQS_OFF_ACTIVATE_MM
select ARCH_WANT_LD_ORPHAN_WARN select ARCH_WANT_LD_ORPHAN_WARN
select ARCH_WANTS_MODULES_DATA_IN_VMALLOC if PPC_BOOK3S_32 || PPC_8xx select ARCH_WANTS_MODULES_DATA_IN_VMALLOC if PPC_BOOK3S_32 || PPC_8xx
select ARCH_WANTS_NO_INSTR
select ARCH_WEAK_RELEASE_ACQUIRE select ARCH_WEAK_RELEASE_ACQUIRE
select BINFMT_ELF select BINFMT_ELF
select BUILDTIME_TABLE_SORT select BUILDTIME_TABLE_SORT

View File

@ -123,6 +123,8 @@
#define INTEL_FAM6_METEORLAKE 0xAC #define INTEL_FAM6_METEORLAKE 0xAC
#define INTEL_FAM6_METEORLAKE_L 0xAA #define INTEL_FAM6_METEORLAKE_L 0xAA
#define INTEL_FAM6_LUNARLAKE_M 0xBD
/* "Small Core" Processors (Atom/E-Core) */ /* "Small Core" Processors (Atom/E-Core) */
#define INTEL_FAM6_ATOM_BONNELL 0x1C /* Diamondville, Pineview */ #define INTEL_FAM6_ATOM_BONNELL 0x1C /* Diamondville, Pineview */

View File

@ -3297,8 +3297,8 @@ void acpi_nfit_shutdown(void *data)
mutex_lock(&acpi_desc->init_mutex); mutex_lock(&acpi_desc->init_mutex);
set_bit(ARS_CANCEL, &acpi_desc->scrub_flags); set_bit(ARS_CANCEL, &acpi_desc->scrub_flags);
cancel_delayed_work_sync(&acpi_desc->dwork);
mutex_unlock(&acpi_desc->init_mutex); mutex_unlock(&acpi_desc->init_mutex);
cancel_delayed_work_sync(&acpi_desc->dwork);
/* /*
* Bounce the nvdimm bus lock to make sure any in-flight * Bounce the nvdimm bus lock to make sure any in-flight

View File

@ -147,14 +147,6 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
/* Number of bytes in PSP footer for firmware. */ /* Number of bytes in PSP footer for firmware. */
#define PSP_FOOTER_BYTES 0x100 #define PSP_FOOTER_BYTES 0x100
/*
* DMUB Async to Sync Mechanism Status
*/
#define DMUB_ASYNC_TO_SYNC_ACCESS_FAIL 1
#define DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT 2
#define DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS 3
#define DMUB_ASYNC_TO_SYNC_ACCESS_INVALID 4
/** /**
* DOC: overview * DOC: overview
* *
@ -1456,6 +1448,7 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
memset(&init_params, 0, sizeof(init_params)); memset(&init_params, 0, sizeof(init_params));
#endif #endif
mutex_init(&adev->dm.dpia_aux_lock);
mutex_init(&adev->dm.dc_lock); mutex_init(&adev->dm.dc_lock);
mutex_init(&adev->dm.audio_lock); mutex_init(&adev->dm.audio_lock);
spin_lock_init(&adev->dm.vblank_lock); spin_lock_init(&adev->dm.vblank_lock);
@ -1816,6 +1809,7 @@ static void amdgpu_dm_fini(struct amdgpu_device *adev)
mutex_destroy(&adev->dm.audio_lock); mutex_destroy(&adev->dm.audio_lock);
mutex_destroy(&adev->dm.dc_lock); mutex_destroy(&adev->dm.dc_lock);
mutex_destroy(&adev->dm.dpia_aux_lock);
return; return;
} }
@ -10200,91 +10194,95 @@ uint32_t dm_read_reg_func(const struct dc_context *ctx, uint32_t address,
return value; return value;
} }
static int amdgpu_dm_set_dmub_async_sync_status(bool is_cmd_aux, int amdgpu_dm_process_dmub_aux_transfer_sync(
struct dc_context *ctx, struct dc_context *ctx,
uint8_t status_type, unsigned int link_index,
uint32_t *operation_result) struct aux_payload *payload,
enum aux_return_code_type *operation_result)
{ {
struct amdgpu_device *adev = ctx->driver_context; struct amdgpu_device *adev = ctx->driver_context;
int return_status = -1;
struct dmub_notification *p_notify = adev->dm.dmub_notify; struct dmub_notification *p_notify = adev->dm.dmub_notify;
int ret = -1;
if (is_cmd_aux) { mutex_lock(&adev->dm.dpia_aux_lock);
if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS) { if (!dc_process_dmub_aux_transfer_async(ctx->dc, link_index, payload)) {
return_status = p_notify->aux_reply.length; *operation_result = AUX_RET_ERROR_ENGINE_ACQUIRE;
*operation_result = p_notify->result; goto out;
} else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT) { }
*operation_result = AUX_RET_ERROR_TIMEOUT;
} else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_FAIL) { if (!wait_for_completion_timeout(&adev->dm.dmub_aux_transfer_done, 10 * HZ)) {
*operation_result = AUX_RET_ERROR_ENGINE_ACQUIRE; DRM_ERROR("wait_for_completion_timeout timeout!");
} else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_INVALID) { *operation_result = AUX_RET_ERROR_TIMEOUT;
*operation_result = AUX_RET_ERROR_INVALID_REPLY; goto out;
} else {
*operation_result = AUX_RET_ERROR_UNKNOWN;
}
} else {
if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS) {
return_status = 0;
*operation_result = p_notify->sc_status;
} else {
*operation_result = SET_CONFIG_UNKNOWN_ERROR;
}
} }
return return_status; if (p_notify->result != AUX_RET_SUCCESS) {
/*
* Transient states before tunneling is enabled could
* lead to this error. We can ignore this for now.
*/
if (p_notify->result != AUX_RET_ERROR_PROTOCOL_ERROR) {
DRM_WARN("DPIA AUX failed on 0x%x(%d), error %d\n",
payload->address, payload->length,
p_notify->result);
}
*operation_result = AUX_RET_ERROR_INVALID_REPLY;
goto out;
}
payload->reply[0] = adev->dm.dmub_notify->aux_reply.command;
if (!payload->write && p_notify->aux_reply.length &&
(payload->reply[0] == AUX_TRANSACTION_REPLY_AUX_ACK)) {
if (payload->length != p_notify->aux_reply.length) {
DRM_WARN("invalid read length %d from DPIA AUX 0x%x(%d)!\n",
p_notify->aux_reply.length,
payload->address, payload->length);
*operation_result = AUX_RET_ERROR_INVALID_REPLY;
goto out;
}
memcpy(payload->data, p_notify->aux_reply.data,
p_notify->aux_reply.length);
}
/* success */
ret = p_notify->aux_reply.length;
*operation_result = p_notify->result;
out:
reinit_completion(&adev->dm.dmub_aux_transfer_done);
mutex_unlock(&adev->dm.dpia_aux_lock);
return ret;
} }
int amdgpu_dm_process_dmub_aux_transfer_sync(bool is_cmd_aux, struct dc_context *ctx, int amdgpu_dm_process_dmub_set_config_sync(
unsigned int link_index, void *cmd_payload, void *operation_result) struct dc_context *ctx,
unsigned int link_index,
struct set_config_cmd_payload *payload,
enum set_config_status *operation_result)
{ {
struct amdgpu_device *adev = ctx->driver_context; struct amdgpu_device *adev = ctx->driver_context;
int ret = 0; bool is_cmd_complete;
int ret;
if (is_cmd_aux) { mutex_lock(&adev->dm.dpia_aux_lock);
dc_process_dmub_aux_transfer_async(ctx->dc, is_cmd_complete = dc_process_dmub_set_config_async(ctx->dc,
link_index, (struct aux_payload *)cmd_payload); link_index, payload, adev->dm.dmub_notify);
} else if (dc_process_dmub_set_config_async(ctx->dc, link_index,
(struct set_config_cmd_payload *)cmd_payload,
adev->dm.dmub_notify)) {
return amdgpu_dm_set_dmub_async_sync_status(is_cmd_aux,
ctx, DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS,
(uint32_t *)operation_result);
}
ret = wait_for_completion_timeout(&adev->dm.dmub_aux_transfer_done, 10 * HZ); if (is_cmd_complete || wait_for_completion_timeout(&adev->dm.dmub_aux_transfer_done, 10 * HZ)) {
if (ret == 0) { ret = 0;
*operation_result = adev->dm.dmub_notify->sc_status;
} else {
DRM_ERROR("wait_for_completion_timeout timeout!"); DRM_ERROR("wait_for_completion_timeout timeout!");
return amdgpu_dm_set_dmub_async_sync_status(is_cmd_aux, ret = -1;
ctx, DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT, *operation_result = SET_CONFIG_UNKNOWN_ERROR;
(uint32_t *)operation_result);
} }
if (is_cmd_aux) { if (!is_cmd_complete)
if (adev->dm.dmub_notify->result == AUX_RET_SUCCESS) { reinit_completion(&adev->dm.dmub_aux_transfer_done);
struct aux_payload *payload = (struct aux_payload *)cmd_payload; mutex_unlock(&adev->dm.dpia_aux_lock);
return ret;
payload->reply[0] = adev->dm.dmub_notify->aux_reply.command;
if (!payload->write && adev->dm.dmub_notify->aux_reply.length &&
payload->reply[0] == AUX_TRANSACTION_REPLY_AUX_ACK) {
if (payload->length != adev->dm.dmub_notify->aux_reply.length) {
DRM_WARN("invalid read from DPIA AUX %x(%d) got length %d!\n",
payload->address, payload->length,
adev->dm.dmub_notify->aux_reply.length);
return amdgpu_dm_set_dmub_async_sync_status(is_cmd_aux, ctx,
DMUB_ASYNC_TO_SYNC_ACCESS_INVALID,
(uint32_t *)operation_result);
}
memcpy(payload->data, adev->dm.dmub_notify->aux_reply.data,
adev->dm.dmub_notify->aux_reply.length);
}
}
}
return amdgpu_dm_set_dmub_async_sync_status(is_cmd_aux,
ctx, DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS,
(uint32_t *)operation_result);
} }
/* /*

View File

@ -59,7 +59,9 @@
#include "signal_types.h" #include "signal_types.h"
#include "amdgpu_dm_crc.h" #include "amdgpu_dm_crc.h"
struct aux_payload; struct aux_payload;
struct set_config_cmd_payload;
enum aux_return_code_type; enum aux_return_code_type;
enum set_config_status;
/* Forward declarations */ /* Forward declarations */
struct amdgpu_device; struct amdgpu_device;
@ -549,6 +551,13 @@ struct amdgpu_display_manager {
* occurred on certain intel platform * occurred on certain intel platform
*/ */
bool aux_hpd_discon_quirk; bool aux_hpd_discon_quirk;
/**
* @dpia_aux_lock:
*
* Guards access to DPIA AUX
*/
struct mutex dpia_aux_lock;
}; };
enum dsc_clock_force_state { enum dsc_clock_force_state {
@ -792,9 +801,11 @@ void amdgpu_dm_update_connector_after_detect(
extern const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs; extern const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs;
int amdgpu_dm_process_dmub_aux_transfer_sync(bool is_cmd_aux, int amdgpu_dm_process_dmub_aux_transfer_sync(struct dc_context *ctx, unsigned int link_index,
struct dc_context *ctx, unsigned int link_index, struct aux_payload *payload, enum aux_return_code_type *operation_result);
void *payload, void *operation_result);
int amdgpu_dm_process_dmub_set_config_sync(struct dc_context *ctx, unsigned int link_index,
struct set_config_cmd_payload *payload, enum set_config_status *operation_result);
bool check_seamless_boot_capability(struct amdgpu_device *adev); bool check_seamless_boot_capability(struct amdgpu_device *adev);

View File

@ -844,9 +844,8 @@ int dm_helper_dmub_aux_transfer_sync(
struct aux_payload *payload, struct aux_payload *payload,
enum aux_return_code_type *operation_result) enum aux_return_code_type *operation_result)
{ {
return amdgpu_dm_process_dmub_aux_transfer_sync(true, ctx, return amdgpu_dm_process_dmub_aux_transfer_sync(ctx, link->link_index, payload,
link->link_index, (void *)payload, operation_result);
(void *)operation_result);
} }
int dm_helpers_dmub_set_config_sync(struct dc_context *ctx, int dm_helpers_dmub_set_config_sync(struct dc_context *ctx,
@ -854,9 +853,8 @@ int dm_helpers_dmub_set_config_sync(struct dc_context *ctx,
struct set_config_cmd_payload *payload, struct set_config_cmd_payload *payload,
enum set_config_status *operation_result) enum set_config_status *operation_result)
{ {
return amdgpu_dm_process_dmub_aux_transfer_sync(false, ctx, return amdgpu_dm_process_dmub_set_config_sync(ctx, link->link_index, payload,
link->link_index, (void *)payload, operation_result);
(void *)operation_result);
} }
void dm_set_dcn_clocks(struct dc_context *ctx, struct dc_clocks *clks) void dm_set_dcn_clocks(struct dc_context *ctx, struct dc_clocks *clks)

View File

@ -391,3 +391,27 @@ void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx)
pipe_ctx->stream_res.stream_enc->funcs->set_input_mode(pipe_ctx->stream_res.stream_enc, pipe_ctx->stream_res.stream_enc->funcs->set_input_mode(pipe_ctx->stream_res.stream_enc,
pix_per_cycle); pix_per_cycle);
} }
void dcn314_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool power_on)
{
struct dc_context *ctx = hws->ctx;
union dmub_rb_cmd cmd;
if (hws->ctx->dc->debug.disable_hubp_power_gate)
return;
PERF_TRACE();
memset(&cmd, 0, sizeof(cmd));
cmd.domain_control.header.type = DMUB_CMD__VBIOS;
cmd.domain_control.header.sub_type = DMUB_CMD__VBIOS_DOMAIN_CONTROL;
cmd.domain_control.header.payload_bytes = sizeof(cmd.domain_control.data);
cmd.domain_control.data.inst = hubp_inst;
cmd.domain_control.data.power_gate = !power_on;
dc_dmub_srv_cmd_queue(ctx->dmub_srv, &cmd);
dc_dmub_srv_cmd_execute(ctx->dmub_srv);
dc_dmub_srv_wait_idle(ctx->dmub_srv);
PERF_TRACE();
}

View File

@ -41,4 +41,6 @@ unsigned int dcn314_calculate_dccg_k1_k2_values(struct pipe_ctx *pipe_ctx, unsig
void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx); void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx);
void dcn314_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool power_on);
#endif /* __DC_HWSS_DCN314_H__ */ #endif /* __DC_HWSS_DCN314_H__ */

View File

@ -137,7 +137,7 @@ static const struct hwseq_private_funcs dcn314_private_funcs = {
.plane_atomic_disable = dcn20_plane_atomic_disable, .plane_atomic_disable = dcn20_plane_atomic_disable,
.plane_atomic_power_down = dcn10_plane_atomic_power_down, .plane_atomic_power_down = dcn10_plane_atomic_power_down,
.enable_power_gating_plane = dcn314_enable_power_gating_plane, .enable_power_gating_plane = dcn314_enable_power_gating_plane,
.hubp_pg_control = dcn31_hubp_pg_control, .hubp_pg_control = dcn314_hubp_pg_control,
.program_all_writeback_pipes_in_tree = dcn30_program_all_writeback_pipes_in_tree, .program_all_writeback_pipes_in_tree = dcn30_program_all_writeback_pipes_in_tree,
.update_odm = dcn314_update_odm, .update_odm = dcn314_update_odm,
.dsc_pg_control = dcn314_dsc_pg_control, .dsc_pg_control = dcn314_dsc_pg_control,

View File

@ -450,6 +450,10 @@ enum dmub_cmd_vbios_type {
* Query DP alt status on a transmitter. * Query DP alt status on a transmitter.
*/ */
DMUB_CMD__VBIOS_TRANSMITTER_QUERY_DP_ALT = 26, DMUB_CMD__VBIOS_TRANSMITTER_QUERY_DP_ALT = 26,
/**
* Controls domain power gating
*/
DMUB_CMD__VBIOS_DOMAIN_CONTROL = 28,
}; };
//============================================================================== //==============================================================================
@ -1191,6 +1195,23 @@ struct dmub_rb_cmd_dig1_transmitter_control {
union dmub_cmd_dig1_transmitter_control_data transmitter_control; /**< payload */ union dmub_cmd_dig1_transmitter_control_data transmitter_control; /**< payload */
}; };
/**
* struct dmub_rb_cmd_domain_control_data - Data for DOMAIN power control
*/
struct dmub_rb_cmd_domain_control_data {
uint8_t inst : 6; /**< DOMAIN instance to control */
uint8_t power_gate : 1; /**< 1=power gate, 0=power up */
uint8_t reserved[3]; /**< Reserved for future use */
};
/**
* struct dmub_rb_cmd_domain_control - Controls DOMAIN power gating
*/
struct dmub_rb_cmd_domain_control {
struct dmub_cmd_header header; /**< header */
struct dmub_rb_cmd_domain_control_data data; /**< payload */
};
/** /**
* DPIA tunnel command parameters. * DPIA tunnel command parameters.
*/ */
@ -3187,6 +3208,10 @@ union dmub_rb_cmd {
* Definition of a DMUB_CMD__VBIOS_DIG1_TRANSMITTER_CONTROL command. * Definition of a DMUB_CMD__VBIOS_DIG1_TRANSMITTER_CONTROL command.
*/ */
struct dmub_rb_cmd_dig1_transmitter_control dig1_transmitter_control; struct dmub_rb_cmd_dig1_transmitter_control dig1_transmitter_control;
/**
* Definition of a DMUB_CMD__VBIOS_DOMAIN_CONTROL command.
*/
struct dmub_rb_cmd_domain_control domain_control;
/** /**
* Definition of a DMUB_CMD__PSR_SET_VERSION command. * Definition of a DMUB_CMD__PSR_SET_VERSION command.
*/ */

View File

@ -1202,6 +1202,7 @@ int hid_open_report(struct hid_device *device)
__u8 *end; __u8 *end;
__u8 *next; __u8 *next;
int ret; int ret;
int i;
static int (*dispatch_type[])(struct hid_parser *parser, static int (*dispatch_type[])(struct hid_parser *parser,
struct hid_item *item) = { struct hid_item *item) = {
hid_parser_main, hid_parser_main,
@ -1252,6 +1253,8 @@ int hid_open_report(struct hid_device *device)
goto err; goto err;
} }
device->collection_size = HID_DEFAULT_NUM_COLLECTIONS; device->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
for (i = 0; i < HID_DEFAULT_NUM_COLLECTIONS; i++)
device->collection[i].parent_idx = -1;
ret = -EINVAL; ret = -EINVAL;
while ((next = fetch_item(start, end, &item)) != NULL) { while ((next = fetch_item(start, end, &item)) != NULL) {

View File

@ -12,6 +12,7 @@
* Copyright (c) 2017 Alex Manoussakis <amanou@gnu.org> * Copyright (c) 2017 Alex Manoussakis <amanou@gnu.org>
* Copyright (c) 2017 Tomasz Kramkowski <tk@the-tk.com> * Copyright (c) 2017 Tomasz Kramkowski <tk@the-tk.com>
* Copyright (c) 2020 YOSHIOKA Takuma <lo48576@hard-wi.red> * Copyright (c) 2020 YOSHIOKA Takuma <lo48576@hard-wi.red>
* Copyright (c) 2022 Takahiro Fujii <fujii@xaxxi.net>
*/ */
/* /*
@ -89,7 +90,7 @@ static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
case USB_DEVICE_ID_ELECOM_M_DT1URBK: case USB_DEVICE_ID_ELECOM_M_DT1URBK:
case USB_DEVICE_ID_ELECOM_M_DT1DRBK: case USB_DEVICE_ID_ELECOM_M_DT1DRBK:
case USB_DEVICE_ID_ELECOM_M_HT1URBK: case USB_DEVICE_ID_ELECOM_M_HT1URBK:
case USB_DEVICE_ID_ELECOM_M_HT1DRBK: case USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D:
/* /*
* Report descriptor format: * Report descriptor format:
* 12: button bit count * 12: button bit count
@ -99,6 +100,16 @@ static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
*/ */
mouse_button_fixup(hdev, rdesc, *rsize, 12, 30, 14, 20, 8); mouse_button_fixup(hdev, rdesc, *rsize, 12, 30, 14, 20, 8);
break; break;
case USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C:
/*
* Report descriptor format:
* 22: button bit count
* 30: padding bit count
* 24: button report size
* 16: button usage maximum
*/
mouse_button_fixup(hdev, rdesc, *rsize, 22, 30, 24, 16, 8);
break;
} }
return rdesc; return rdesc;
} }
@ -112,7 +123,8 @@ static const struct hid_device_id elecom_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) }, { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1DRBK) }, { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1DRBK) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1URBK) }, { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1URBK) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK) }, { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C) },
{ } { }
}; };
MODULE_DEVICE_TABLE(hid, elecom_devices); MODULE_DEVICE_TABLE(hid, elecom_devices);

View File

@ -413,6 +413,8 @@
#define I2C_DEVICE_ID_HP_ENVY_X360_15T_DR100 0x29CF #define I2C_DEVICE_ID_HP_ENVY_X360_15T_DR100 0x29CF
#define I2C_DEVICE_ID_HP_ENVY_X360_EU0009NV 0x2CF9 #define I2C_DEVICE_ID_HP_ENVY_X360_EU0009NV 0x2CF9
#define I2C_DEVICE_ID_HP_SPECTRE_X360_15 0x2817 #define I2C_DEVICE_ID_HP_SPECTRE_X360_15 0x2817
#define I2C_DEVICE_ID_HP_SPECTRE_X360_13_AW0020NG 0x29DF
#define I2C_DEVICE_ID_ASUS_TP420IA_TOUCHSCREEN 0x2BC8
#define USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN 0x2544 #define USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN 0x2544
#define USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN 0x2706 #define USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN 0x2706
#define I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN 0x261A #define I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN 0x261A
@ -428,7 +430,8 @@
#define USB_DEVICE_ID_ELECOM_M_DT1URBK 0x00fe #define USB_DEVICE_ID_ELECOM_M_DT1URBK 0x00fe
#define USB_DEVICE_ID_ELECOM_M_DT1DRBK 0x00ff #define USB_DEVICE_ID_ELECOM_M_DT1DRBK 0x00ff
#define USB_DEVICE_ID_ELECOM_M_HT1URBK 0x010c #define USB_DEVICE_ID_ELECOM_M_HT1URBK 0x010c
#define USB_DEVICE_ID_ELECOM_M_HT1DRBK 0x010d #define USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D 0x010d
#define USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C 0x011c
#define USB_VENDOR_ID_DREAM_CHEEKY 0x1d34 #define USB_VENDOR_ID_DREAM_CHEEKY 0x1d34
#define USB_DEVICE_ID_DREAM_CHEEKY_WN 0x0004 #define USB_DEVICE_ID_DREAM_CHEEKY_WN 0x0004

View File

@ -370,6 +370,8 @@ static const struct hid_device_id hid_battery_quirks[] = {
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
USB_DEVICE_ID_LOGITECH_DINOVO_EDGE_KBD), USB_DEVICE_ID_LOGITECH_DINOVO_EDGE_KBD),
HID_BATTERY_QUIRK_IGNORE }, HID_BATTERY_QUIRK_IGNORE },
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_ASUS_TP420IA_TOUCHSCREEN),
HID_BATTERY_QUIRK_IGNORE },
{ HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN), { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN),
HID_BATTERY_QUIRK_IGNORE }, HID_BATTERY_QUIRK_IGNORE },
{ HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN), { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN),
@ -384,6 +386,8 @@ static const struct hid_device_id hid_battery_quirks[] = {
HID_BATTERY_QUIRK_IGNORE }, HID_BATTERY_QUIRK_IGNORE },
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_SPECTRE_X360_15), { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_SPECTRE_X360_15),
HID_BATTERY_QUIRK_IGNORE }, HID_BATTERY_QUIRK_IGNORE },
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_SPECTRE_X360_13_AW0020NG),
HID_BATTERY_QUIRK_IGNORE },
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN), { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN),
HID_BATTERY_QUIRK_IGNORE }, HID_BATTERY_QUIRK_IGNORE },
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_SURFACE_GO2_TOUCHSCREEN), { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_SURFACE_GO2_TOUCHSCREEN),

View File

@ -393,7 +393,8 @@ static const struct hid_device_id hid_have_special_driver[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) }, { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1DRBK) }, { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1DRBK) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1URBK) }, { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1URBK) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK) }, { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C) },
#endif #endif
#if IS_ENABLED(CONFIG_HID_ELO) #if IS_ENABLED(CONFIG_HID_ELO)
{ HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0009) }, { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0009) },

View File

@ -160,16 +160,11 @@ static void unpin_rcv_pages(struct hfi1_filedata *fd,
static int pin_rcv_pages(struct hfi1_filedata *fd, struct tid_user_buf *tidbuf) static int pin_rcv_pages(struct hfi1_filedata *fd, struct tid_user_buf *tidbuf)
{ {
int pinned; int pinned;
unsigned int npages; unsigned int npages = tidbuf->npages;
unsigned long vaddr = tidbuf->vaddr; unsigned long vaddr = tidbuf->vaddr;
struct page **pages = NULL; struct page **pages = NULL;
struct hfi1_devdata *dd = fd->uctxt->dd; struct hfi1_devdata *dd = fd->uctxt->dd;
/* Get the number of pages the user buffer spans */
npages = num_user_pages(vaddr, tidbuf->length);
if (!npages)
return -EINVAL;
if (npages > fd->uctxt->expected_count) { if (npages > fd->uctxt->expected_count) {
dd_dev_err(dd, "Expected buffer too big\n"); dd_dev_err(dd, "Expected buffer too big\n");
return -EINVAL; return -EINVAL;
@ -196,7 +191,6 @@ static int pin_rcv_pages(struct hfi1_filedata *fd, struct tid_user_buf *tidbuf)
return pinned; return pinned;
} }
tidbuf->pages = pages; tidbuf->pages = pages;
tidbuf->npages = npages;
fd->tid_n_pinned += pinned; fd->tid_n_pinned += pinned;
return pinned; return pinned;
} }
@ -274,6 +268,7 @@ int hfi1_user_exp_rcv_setup(struct hfi1_filedata *fd,
mutex_init(&tidbuf->cover_mutex); mutex_init(&tidbuf->cover_mutex);
tidbuf->vaddr = tinfo->vaddr; tidbuf->vaddr = tinfo->vaddr;
tidbuf->length = tinfo->length; tidbuf->length = tinfo->length;
tidbuf->npages = num_user_pages(tidbuf->vaddr, tidbuf->length);
tidbuf->psets = kcalloc(uctxt->expected_count, sizeof(*tidbuf->psets), tidbuf->psets = kcalloc(uctxt->expected_count, sizeof(*tidbuf->psets),
GFP_KERNEL); GFP_KERNEL);
if (!tidbuf->psets) { if (!tidbuf->psets) {

View File

@ -365,6 +365,7 @@ static void amd_gpio_dbg_show(struct seq_file *s, struct gpio_chip *gc)
} else { } else {
debounce_enable = ""; debounce_enable = "";
time = 0;
} }
snprintf(debounce_value, sizeof(debounce_value), "%u", time * unit); snprintf(debounce_value, sizeof(debounce_value), "%u", time * unit);
seq_printf(s, "debounce %s (🕑 %sus)| ", debounce_enable, debounce_value); seq_printf(s, "debounce %s (🕑 %sus)| ", debounce_enable, debounce_value);

View File

@ -403,10 +403,11 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
unsigned int this_round, skip = 0; unsigned int this_round, skip = 0;
int size; int size;
ret = -ENXIO;
vc = vcs_vc(inode, &viewed); vc = vcs_vc(inode, &viewed);
if (!vc) if (!vc) {
goto unlock_out; ret = -ENXIO;
break;
}
/* Check whether we are above size each round, /* Check whether we are above size each round,
* as copy_to_user at the end of this loop * as copy_to_user at the end of this loop

View File

@ -2389,9 +2389,8 @@ static int usb_enumerate_device_otg(struct usb_device *udev)
* usb_enumerate_device - Read device configs/intfs/otg (usbcore-internal) * usb_enumerate_device - Read device configs/intfs/otg (usbcore-internal)
* @udev: newly addressed device (in ADDRESS state) * @udev: newly addressed device (in ADDRESS state)
* *
* This is only called by usb_new_device() and usb_authorize_device() * This is only called by usb_new_device() -- all comments that apply there
* and FIXME -- all comments that apply to them apply here wrt to * apply here wrt to environment.
* environment.
* *
* If the device is WUSB and not authorized, we don't attempt to read * If the device is WUSB and not authorized, we don't attempt to read
* the string descriptors, as they will be errored out by the device * the string descriptors, as they will be errored out by the device

View File

@ -868,11 +868,7 @@ read_descriptors(struct file *filp, struct kobject *kobj,
size_t srclen, n; size_t srclen, n;
int cfgno; int cfgno;
void *src; void *src;
int retval;
retval = usb_lock_device_interruptible(udev);
if (retval < 0)
return -EINTR;
/* The binary attribute begins with the device descriptor. /* The binary attribute begins with the device descriptor.
* Following that are the raw descriptor entries for all the * Following that are the raw descriptor entries for all the
* configurations (config plus subsidiary descriptors). * configurations (config plus subsidiary descriptors).
@ -897,7 +893,6 @@ read_descriptors(struct file *filp, struct kobject *kobj,
off -= srclen; off -= srclen;
} }
} }
usb_unlock_device(udev);
return count - nleft; return count - nleft;
} }

View File

@ -47,6 +47,7 @@
#define PCI_DEVICE_ID_INTEL_ADLS 0x7ae1 #define PCI_DEVICE_ID_INTEL_ADLS 0x7ae1
#define PCI_DEVICE_ID_INTEL_RPL 0xa70e #define PCI_DEVICE_ID_INTEL_RPL 0xa70e
#define PCI_DEVICE_ID_INTEL_RPLS 0x7a61 #define PCI_DEVICE_ID_INTEL_RPLS 0x7a61
#define PCI_DEVICE_ID_INTEL_MTLM 0x7eb1
#define PCI_DEVICE_ID_INTEL_MTLP 0x7ec1 #define PCI_DEVICE_ID_INTEL_MTLP 0x7ec1
#define PCI_DEVICE_ID_INTEL_MTL 0x7e7e #define PCI_DEVICE_ID_INTEL_MTL 0x7e7e
#define PCI_DEVICE_ID_INTEL_TGL 0x9a15 #define PCI_DEVICE_ID_INTEL_TGL 0x9a15
@ -467,6 +468,9 @@ static const struct pci_device_id dwc3_pci_id_table[] = {
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_RPLS), { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_RPLS),
(kernel_ulong_t) &dwc3_pci_intel_swnode, }, (kernel_ulong_t) &dwc3_pci_intel_swnode, },
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MTLM),
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MTLP), { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MTLP),
(kernel_ulong_t) &dwc3_pci_intel_swnode, }, (kernel_ulong_t) &dwc3_pci_intel_swnode, },

View File

@ -29,6 +29,7 @@
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/freezer.h> #include <linux/freezer.h>
#include <linux/kref.h> #include <linux/kref.h>
#include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/file.h> #include <linux/file.h>
@ -1090,6 +1091,7 @@ __acc_function_bind(struct usb_configuration *c,
struct usb_function *f, bool configfs) struct usb_function *f, bool configfs)
{ {
struct usb_composite_dev *cdev = c->cdev; struct usb_composite_dev *cdev = c->cdev;
struct usb_string *us;
struct acc_dev *dev = func_to_dev(f); struct acc_dev *dev = func_to_dev(f);
int id; int id;
int ret; int ret;
@ -1097,13 +1099,11 @@ __acc_function_bind(struct usb_configuration *c,
DBG(cdev, "acc_function_bind dev: %p\n", dev); DBG(cdev, "acc_function_bind dev: %p\n", dev);
if (configfs) { if (configfs) {
if (acc_string_defs[INTERFACE_STRING_INDEX].id == 0) { us = usb_gstrings_attach(cdev, acc_strings, ARRAY_SIZE(acc_string_defs));
ret = usb_string_id(c->cdev); if (IS_ERR(us))
if (ret < 0) return PTR_ERR(us);
return ret; ret = us[INTERFACE_STRING_INDEX].id;
acc_string_defs[INTERFACE_STRING_INDEX].id = ret; acc_interface_desc.iInterface = ret;
acc_interface_desc.iInterface = ret;
}
dev->cdev = c->cdev; dev->cdev = c->cdev;
} }
ret = hid_register_driver(&acc_hid_driver); ret = hid_register_driver(&acc_hid_driver);

View File

@ -81,6 +81,9 @@
#define WRITE_BUF_SIZE 8192 /* TX only */ #define WRITE_BUF_SIZE 8192 /* TX only */
#define GS_CONSOLE_BUF_SIZE 8192 #define GS_CONSOLE_BUF_SIZE 8192
/* Prevents race conditions while accessing gser->ioport */
static DEFINE_SPINLOCK(serial_port_lock);
/* console info */ /* console info */
struct gs_console { struct gs_console {
struct console console; struct console console;
@ -1374,8 +1377,10 @@ void gserial_disconnect(struct gserial *gser)
if (!port) if (!port)
return; return;
spin_lock_irqsave(&serial_port_lock, flags);
/* tell the TTY glue not to do I/O here any more */ /* tell the TTY glue not to do I/O here any more */
spin_lock_irqsave(&port->port_lock, flags); spin_lock(&port->port_lock);
gs_console_disconnect(port); gs_console_disconnect(port);
@ -1390,7 +1395,8 @@ void gserial_disconnect(struct gserial *gser)
tty_hangup(port->port.tty); tty_hangup(port->port.tty);
} }
port->suspended = false; port->suspended = false;
spin_unlock_irqrestore(&port->port_lock, flags); spin_unlock(&port->port_lock);
spin_unlock_irqrestore(&serial_port_lock, flags);
/* disable endpoints, aborting down any active I/O */ /* disable endpoints, aborting down any active I/O */
usb_ep_disable(gser->out); usb_ep_disable(gser->out);
@ -1424,10 +1430,19 @@ EXPORT_SYMBOL_GPL(gserial_suspend);
void gserial_resume(struct gserial *gser) void gserial_resume(struct gserial *gser)
{ {
struct gs_port *port = gser->ioport; struct gs_port *port;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&port->port_lock, flags); spin_lock_irqsave(&serial_port_lock, flags);
port = gser->ioport;
if (!port) {
spin_unlock_irqrestore(&serial_port_lock, flags);
return;
}
spin_lock(&port->port_lock);
spin_unlock(&serial_port_lock);
port->suspended = false; port->suspended = false;
if (!port->start_delayed) { if (!port->start_delayed) {
spin_unlock_irqrestore(&port->port_lock, flags); spin_unlock_irqrestore(&port->port_lock, flags);

View File

@ -402,6 +402,8 @@ static void option_instat_callback(struct urb *urb);
#define LONGCHEER_VENDOR_ID 0x1c9e #define LONGCHEER_VENDOR_ID 0x1c9e
/* 4G Systems products */ /* 4G Systems products */
/* This one was sold as the VW and Skoda "Carstick LTE" */
#define FOUR_G_SYSTEMS_PRODUCT_CARSTICK_LTE 0x7605
/* This is the 4G XS Stick W14 a.k.a. Mobilcom Debitel Surf-Stick * /* This is the 4G XS Stick W14 a.k.a. Mobilcom Debitel Surf-Stick *
* It seems to contain a Qualcomm QSC6240/6290 chipset */ * It seems to contain a Qualcomm QSC6240/6290 chipset */
#define FOUR_G_SYSTEMS_PRODUCT_W14 0x9603 #define FOUR_G_SYSTEMS_PRODUCT_W14 0x9603
@ -1976,6 +1978,8 @@ static const struct usb_device_id option_ids[] = {
.driver_info = RSVD(2) }, .driver_info = RSVD(2) },
{ USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) },
{ USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) },
{ USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_CARSTICK_LTE),
.driver_info = RSVD(0) },
{ USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14),
.driver_info = NCTRL(0) | NCTRL(1) }, .driver_info = NCTRL(0) | NCTRL(1) },
{ USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W100), { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W100),

View File

@ -161,7 +161,6 @@ static struct device_type source_fixed_supply_type = {
static struct attribute *sink_fixed_supply_attrs[] = { static struct attribute *sink_fixed_supply_attrs[] = {
&dev_attr_dual_role_power.attr, &dev_attr_dual_role_power.attr,
&dev_attr_usb_suspend_supported.attr,
&dev_attr_unconstrained_power.attr, &dev_attr_unconstrained_power.attr,
&dev_attr_usb_communication_capable.attr, &dev_attr_usb_communication_capable.attr,
&dev_attr_dual_role_data.attr, &dev_attr_dual_role_data.attr,

View File

@ -18,6 +18,70 @@
#include <linux/evm.h> #include <linux/evm.h>
#include <linux/ima.h> #include <linux/ima.h>
#include "internal.h"
/**
* setattr_should_drop_sgid - determine whether the setgid bit needs to be
* removed
* @mnt_userns: user namespace of the mount @inode was found from
* @inode: inode to check
*
* This function determines whether the setgid bit needs to be removed.
* We retain backwards compatibility and require setgid bit to be removed
* unconditionally if S_IXGRP is set. Otherwise we have the exact same
* requirements as setattr_prepare() and setattr_copy().
*
* Return: ATTR_KILL_SGID if setgid bit needs to be removed, 0 otherwise.
*/
int setattr_should_drop_sgid(struct user_namespace *mnt_userns,
const struct inode *inode)
{
umode_t mode = inode->i_mode;
if (!(mode & S_ISGID))
return 0;
if (mode & S_IXGRP)
return ATTR_KILL_SGID;
if (!in_group_or_capable(mnt_userns, inode,
i_gid_into_vfsgid(mnt_userns, inode)))
return ATTR_KILL_SGID;
return 0;
}
/**
* setattr_should_drop_suidgid - determine whether the set{g,u}id bit needs to
* be dropped
* @mnt_userns: user namespace of the mount @inode was found from
* @inode: inode to check
*
* This function determines whether the set{g,u}id bits need to be removed.
* If the setuid bit needs to be removed ATTR_KILL_SUID is returned. If the
* setgid bit needs to be removed ATTR_KILL_SGID is returned. If both
* set{g,u}id bits need to be removed the corresponding mask of both flags is
* returned.
*
* Return: A mask of ATTR_KILL_S{G,U}ID indicating which - if any - setid bits
* to remove, 0 otherwise.
*/
int setattr_should_drop_suidgid(struct user_namespace *mnt_userns,
struct inode *inode)
{
umode_t mode = inode->i_mode;
int kill = 0;
/* suid always must be killed */
if (unlikely(mode & S_ISUID))
kill = ATTR_KILL_SUID;
kill |= setattr_should_drop_sgid(mnt_userns, inode);
if (unlikely(kill && !capable(CAP_FSETID) && S_ISREG(mode)))
return kill;
return 0;
}
EXPORT_SYMBOL(setattr_should_drop_suidgid);
/** /**
* chown_ok - verify permissions to chown inode * chown_ok - verify permissions to chown inode
* @mnt_userns: user namespace of the mount @inode was found from * @mnt_userns: user namespace of the mount @inode was found from
@ -140,8 +204,7 @@ int setattr_prepare(struct user_namespace *mnt_userns, struct dentry *dentry,
vfsgid = i_gid_into_vfsgid(mnt_userns, inode); vfsgid = i_gid_into_vfsgid(mnt_userns, inode);
/* Also check the setgid bit! */ /* Also check the setgid bit! */
if (!vfsgid_in_group_p(vfsgid) && if (!in_group_or_capable(mnt_userns, inode, vfsgid))
!capable_wrt_inode_uidgid(mnt_userns, inode, CAP_FSETID))
attr->ia_mode &= ~S_ISGID; attr->ia_mode &= ~S_ISGID;
} }
@ -251,9 +314,8 @@ void setattr_copy(struct user_namespace *mnt_userns, struct inode *inode,
inode->i_ctime = attr->ia_ctime; inode->i_ctime = attr->ia_ctime;
if (ia_valid & ATTR_MODE) { if (ia_valid & ATTR_MODE) {
umode_t mode = attr->ia_mode; umode_t mode = attr->ia_mode;
vfsgid_t vfsgid = i_gid_into_vfsgid(mnt_userns, inode); if (!in_group_or_capable(mnt_userns, inode,
if (!vfsgid_in_group_p(vfsgid) && i_gid_into_vfsgid(mnt_userns, inode)))
!capable_wrt_inode_uidgid(mnt_userns, inode, CAP_FSETID))
mode &= ~S_ISGID; mode &= ~S_ISGID;
inode->i_mode = mode; inode->i_mode = mode;
} }
@ -375,7 +437,7 @@ int notify_change(struct user_namespace *mnt_userns, struct dentry *dentry,
} }
} }
if (ia_valid & ATTR_KILL_SGID) { if (ia_valid & ATTR_KILL_SGID) {
if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { if (mode & S_ISGID) {
if (!(ia_valid & ATTR_MODE)) { if (!(ia_valid & ATTR_MODE)) {
ia_valid = attr->ia_valid |= ATTR_MODE; ia_valid = attr->ia_valid |= ATTR_MODE;
attr->ia_mode = inode->i_mode; attr->ia_mode = inode->i_mode;

View File

@ -7839,10 +7839,10 @@ long btrfs_ioctl_send(struct inode *inode, struct btrfs_ioctl_send_args *arg)
/* /*
* Check that we don't overflow at later allocations, we request * Check that we don't overflow at later allocations, we request
* clone_sources_count + 1 items, and compare to unsigned long inside * clone_sources_count + 1 items, and compare to unsigned long inside
* access_ok. * access_ok. Also set an upper limit for allocation size so this can't
* easily exhaust memory. Max number of clone sources is about 200K.
*/ */
if (arg->clone_sources_count > if (arg->clone_sources_count > SZ_8M / sizeof(struct clone_root)) {
ULONG_MAX / sizeof(struct clone_root) - 1) {
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }

View File

@ -1363,7 +1363,7 @@ static ssize_t fuse_cache_write_iter(struct kiocb *iocb, struct iov_iter *from)
return err; return err;
if (fc->handle_killpriv_v2 && if (fc->handle_killpriv_v2 &&
should_remove_suid(file_dentry(file))) { setattr_should_drop_suidgid(&init_user_ns, file_inode(file))) {
goto writethrough; goto writethrough;
} }

View File

@ -1948,41 +1948,13 @@ void touch_atime(const struct path *path)
} }
EXPORT_SYMBOL(touch_atime); EXPORT_SYMBOL(touch_atime);
/*
* The logic we want is
*
* if suid or (sgid and xgrp)
* remove privs
*/
int should_remove_suid(struct dentry *dentry)
{
umode_t mode = d_inode(dentry)->i_mode;
int kill = 0;
/* suid always must be killed */
if (unlikely(mode & S_ISUID))
kill = ATTR_KILL_SUID;
/*
* sgid without any exec bits is just a mandatory locking mark; leave
* it alone. If some exec bits are set, it's a real sgid; kill it.
*/
if (unlikely((mode & S_ISGID) && (mode & S_IXGRP)))
kill |= ATTR_KILL_SGID;
if (unlikely(kill && !capable(CAP_FSETID) && S_ISREG(mode)))
return kill;
return 0;
}
EXPORT_SYMBOL(should_remove_suid);
/* /*
* Return mask of changes for notify_change() that need to be done as a * Return mask of changes for notify_change() that need to be done as a
* response to write or truncate. Return 0 if nothing has to be changed. * response to write or truncate. Return 0 if nothing has to be changed.
* Negative value on error (change should be denied). * Negative value on error (change should be denied).
*/ */
int dentry_needs_remove_privs(struct dentry *dentry) int dentry_needs_remove_privs(struct user_namespace *mnt_userns,
struct dentry *dentry)
{ {
struct inode *inode = d_inode(dentry); struct inode *inode = d_inode(dentry);
int mask = 0; int mask = 0;
@ -1991,7 +1963,7 @@ int dentry_needs_remove_privs(struct dentry *dentry)
if (IS_NOSEC(inode)) if (IS_NOSEC(inode))
return 0; return 0;
mask = should_remove_suid(dentry); mask = setattr_should_drop_suidgid(mnt_userns, inode);
ret = security_inode_need_killpriv(dentry); ret = security_inode_need_killpriv(dentry);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -2023,7 +1995,7 @@ static int __file_remove_privs(struct file *file, unsigned int flags)
if (IS_NOSEC(inode) || !S_ISREG(inode->i_mode)) if (IS_NOSEC(inode) || !S_ISREG(inode->i_mode))
return 0; return 0;
kill = dentry_needs_remove_privs(dentry); kill = dentry_needs_remove_privs(file_mnt_user_ns(file), dentry);
if (kill < 0) if (kill < 0)
return kill; return kill;
@ -2487,6 +2459,28 @@ struct timespec64 current_time(struct inode *inode)
} }
EXPORT_SYMBOL(current_time); EXPORT_SYMBOL(current_time);
/**
* in_group_or_capable - check whether caller is CAP_FSETID privileged
* @mnt_userns: user namespace of the mount @inode was found from
* @inode: inode to check
* @vfsgid: the new/current vfsgid of @inode
*
* Check wether @vfsgid is in the caller's group list or if the caller is
* privileged with CAP_FSETID over @inode. This can be used to determine
* whether the setgid bit can be kept or must be dropped.
*
* Return: true if the caller is sufficiently privileged, false if not.
*/
bool in_group_or_capable(struct user_namespace *mnt_userns,
const struct inode *inode, vfsgid_t vfsgid)
{
if (vfsgid_in_group_p(vfsgid))
return true;
if (capable_wrt_inode_uidgid(mnt_userns, inode, CAP_FSETID))
return true;
return false;
}
/** /**
* mode_strip_sgid - handle the sgid bit for non-directories * mode_strip_sgid - handle the sgid bit for non-directories
* @mnt_userns: User namespace of the mount the inode was created from * @mnt_userns: User namespace of the mount the inode was created from
@ -2508,11 +2502,9 @@ umode_t mode_strip_sgid(struct user_namespace *mnt_userns,
return mode; return mode;
if (S_ISDIR(mode) || !dir || !(dir->i_mode & S_ISGID)) if (S_ISDIR(mode) || !dir || !(dir->i_mode & S_ISGID))
return mode; return mode;
if (in_group_p(i_gid_into_mnt(mnt_userns, dir))) if (in_group_or_capable(mnt_userns, dir,
i_gid_into_vfsgid(mnt_userns, dir)))
return mode; return mode;
if (capable_wrt_inode_uidgid(mnt_userns, dir, CAP_FSETID))
return mode;
return mode & ~S_ISGID; return mode & ~S_ISGID;
} }
EXPORT_SYMBOL(mode_strip_sgid); EXPORT_SYMBOL(mode_strip_sgid);

View File

@ -150,7 +150,9 @@ extern int vfs_open(const struct path *, struct file *);
* inode.c * inode.c
*/ */
extern long prune_icache_sb(struct super_block *sb, struct shrink_control *sc); extern long prune_icache_sb(struct super_block *sb, struct shrink_control *sc);
extern int dentry_needs_remove_privs(struct dentry *dentry); int dentry_needs_remove_privs(struct user_namespace *, struct dentry *dentry);
bool in_group_or_capable(struct user_namespace *mnt_userns,
const struct inode *inode, vfsgid_t vfsgid);
/* /*
* fs-writeback.c * fs-writeback.c
@ -234,3 +236,9 @@ int do_setxattr(struct user_namespace *mnt_userns, struct dentry *dentry,
struct xattr_ctx *ctx); struct xattr_ctx *ctx);
ssize_t __kernel_write_iter(struct file *file, struct iov_iter *from, loff_t *pos); ssize_t __kernel_write_iter(struct file *file, struct iov_iter *from, loff_t *pos);
/*
* fs/attr.c
*/
int setattr_should_drop_sgid(struct user_namespace *mnt_userns,
const struct inode *inode);

View File

@ -1991,7 +1991,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
} }
} }
if (file && should_remove_suid(file->f_path.dentry)) { if (file && setattr_should_drop_suidgid(&init_user_ns, file_inode(file))) {
ret = __ocfs2_write_remove_suid(inode, di_bh); ret = __ocfs2_write_remove_suid(inode, di_bh);
if (ret) { if (ret) {
mlog_errno(ret); mlog_errno(ret);
@ -2279,7 +2279,7 @@ static int ocfs2_prepare_inode_for_write(struct file *file,
* inode. There's also the dinode i_size state which * inode. There's also the dinode i_size state which
* can be lost via setattr during extending writes (we * can be lost via setattr during extending writes (we
* set inode->i_size at the end of a write. */ * set inode->i_size at the end of a write. */
if (should_remove_suid(dentry)) { if (setattr_should_drop_suidgid(&init_user_ns, inode)) {
if (meta_level == 0) { if (meta_level == 0) {
ocfs2_inode_unlock_for_extent_tree(inode, ocfs2_inode_unlock_for_extent_tree(inode,
&di_bh, &di_bh,

View File

@ -55,7 +55,7 @@ int do_truncate(struct user_namespace *mnt_userns, struct dentry *dentry,
} }
/* Remove suid, sgid, and file capabilities on truncate too */ /* Remove suid, sgid, and file capabilities on truncate too */
ret = dentry_needs_remove_privs(dentry); ret = dentry_needs_remove_privs(mnt_userns, dentry);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (ret) if (ret)
@ -724,10 +724,10 @@ int chown_common(const struct path *path, uid_t user, gid_t group)
return -EINVAL; return -EINVAL;
if ((group != (gid_t)-1) && !setattr_vfsgid(&newattrs, gid)) if ((group != (gid_t)-1) && !setattr_vfsgid(&newattrs, gid))
return -EINVAL; return -EINVAL;
if (!S_ISDIR(inode->i_mode))
newattrs.ia_valid |=
ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
inode_lock(inode); inode_lock(inode);
if (!S_ISDIR(inode->i_mode))
newattrs.ia_valid |= ATTR_KILL_SUID | ATTR_KILL_PRIV |
setattr_should_drop_sgid(mnt_userns, inode);
/* Continue to send actual fs values, not the mount values. */ /* Continue to send actual fs values, not the mount values. */
error = security_path_chown( error = security_path_chown(
path, path,

View File

@ -3118,7 +3118,7 @@ extern void __destroy_inode(struct inode *);
extern struct inode *new_inode_pseudo(struct super_block *sb); extern struct inode *new_inode_pseudo(struct super_block *sb);
extern struct inode *new_inode(struct super_block *sb); extern struct inode *new_inode(struct super_block *sb);
extern void free_inode_nonrcu(struct inode *inode); extern void free_inode_nonrcu(struct inode *inode);
extern int should_remove_suid(struct dentry *); extern int setattr_should_drop_suidgid(struct user_namespace *, struct inode *);
extern int file_remove_privs(struct file *); extern int file_remove_privs(struct file *);
/* /*
@ -3554,7 +3554,7 @@ int __init list_bdev_fs_names(char *buf, size_t size);
static inline bool is_sxid(umode_t mode) static inline bool is_sxid(umode_t mode)
{ {
return (mode & S_ISUID) || ((mode & S_ISGID) && (mode & S_IXGRP)); return mode & (S_ISUID | S_ISGID);
} }
static inline int check_sticky(struct user_namespace *mnt_userns, static inline int check_sticky(struct user_namespace *mnt_userns,

View File

@ -27,6 +27,8 @@ unsigned int __read_mostly freeze_timeout_msecs = 20 * MSEC_PER_SEC;
static int try_to_freeze_tasks(bool user_only) static int try_to_freeze_tasks(bool user_only)
{ {
const char *what = user_only ? "user space processes" :
"remaining freezable tasks";
struct task_struct *g, *p; struct task_struct *g, *p;
unsigned long end_time; unsigned long end_time;
unsigned int todo; unsigned int todo;
@ -36,6 +38,8 @@ static int try_to_freeze_tasks(bool user_only)
bool wakeup = false; bool wakeup = false;
int sleep_usecs = USEC_PER_MSEC; int sleep_usecs = USEC_PER_MSEC;
pr_info("Freezing %s\n", what);
start = ktime_get_boottime(); start = ktime_get_boottime();
end_time = jiffies + msecs_to_jiffies(freeze_timeout_msecs); end_time = jiffies + msecs_to_jiffies(freeze_timeout_msecs);
@ -82,11 +86,9 @@ static int try_to_freeze_tasks(bool user_only)
elapsed_msecs = ktime_to_ms(elapsed); elapsed_msecs = ktime_to_ms(elapsed);
if (wakeup) { if (wakeup) {
pr_cont("\n");
pr_err("Freezing of tasks aborted after %d.%03d seconds", pr_err("Freezing of tasks aborted after %d.%03d seconds",
elapsed_msecs / 1000, elapsed_msecs % 1000); elapsed_msecs / 1000, elapsed_msecs % 1000);
} else if (todo) { } else if (todo) {
pr_cont("\n");
pr_err("Freezing of tasks failed after %d.%03d seconds" pr_err("Freezing of tasks failed after %d.%03d seconds"
" (%d tasks refusing to freeze, wq_busy=%d):\n", " (%d tasks refusing to freeze, wq_busy=%d):\n",
elapsed_msecs / 1000, elapsed_msecs % 1000, elapsed_msecs / 1000, elapsed_msecs % 1000,
@ -104,8 +106,8 @@ static int try_to_freeze_tasks(bool user_only)
read_unlock(&tasklist_lock); read_unlock(&tasklist_lock);
} }
} else { } else {
pr_cont("(elapsed %d.%03d seconds) ", elapsed_msecs / 1000, pr_info("Freezing %s completed (elapsed %d.%03d seconds)\n",
elapsed_msecs % 1000); what, elapsed_msecs / 1000, elapsed_msecs % 1000);
} }
return todo ? -EBUSY : 0; return todo ? -EBUSY : 0;
@ -133,14 +135,11 @@ int freeze_processes(void)
static_branch_inc(&freezer_active); static_branch_inc(&freezer_active);
pm_wakeup_clear(0); pm_wakeup_clear(0);
pr_info("Freezing user space processes ... ");
pm_freezing = true; pm_freezing = true;
error = try_to_freeze_tasks(true); error = try_to_freeze_tasks(true);
if (!error) { if (!error)
__usermodehelper_set_disable_depth(UMH_DISABLED); __usermodehelper_set_disable_depth(UMH_DISABLED);
pr_cont("done.");
}
pr_cont("\n");
BUG_ON(in_atomic()); BUG_ON(in_atomic());
/* /*
@ -169,14 +168,9 @@ int freeze_kernel_threads(void)
{ {
int error; int error;
pr_info("Freezing remaining freezable tasks ... ");
pm_nosig_freezing = true; pm_nosig_freezing = true;
error = try_to_freeze_tasks(false); error = try_to_freeze_tasks(false);
if (!error)
pr_cont("done.");
pr_cont("\n");
BUG_ON(in_atomic()); BUG_ON(in_atomic());
if (error) if (error)

View File

@ -2112,6 +2112,8 @@ static u16 printk_sprint(char *text, u16 size, int facility,
return text_len; return text_len;
} }
EXPORT_TRACEPOINT_SYMBOL_GPL(console);
__printf(4, 0) __printf(4, 0)
int vprintk_store(int facility, int level, int vprintk_store(int facility, int level,
const struct dev_printk_info *dev_info, const struct dev_printk_info *dev_info,

View File

@ -1015,6 +1015,7 @@ static void caif_sock_destructor(struct sock *sk)
return; return;
} }
sk_stream_kill_queues(&cf_sk->sk); sk_stream_kill_queues(&cf_sk->sk);
WARN_ON_ONCE(sk->sk_forward_alloc);
caif_free_client(&cf_sk->layer); caif_free_client(&cf_sk->layer);
} }

View File

@ -5807,7 +5807,7 @@ static int bpf_ipv4_fib_lookup(struct net *net, struct bpf_fib_lookup *params,
neigh = __ipv6_neigh_lookup_noref_stub(dev, dst); neigh = __ipv6_neigh_lookup_noref_stub(dev, dst);
} }
if (!neigh) if (!neigh || !(neigh->nud_state & NUD_VALID))
return BPF_FIB_LKUP_RET_NO_NEIGH; return BPF_FIB_LKUP_RET_NO_NEIGH;
return bpf_fib_set_fwd_params(params, neigh, dev, mtu); return bpf_fib_set_fwd_params(params, neigh, dev, mtu);
@ -5922,7 +5922,7 @@ static int bpf_ipv6_fib_lookup(struct net *net, struct bpf_fib_lookup *params,
* not needed here. * not needed here.
*/ */
neigh = __ipv6_neigh_lookup_noref_stub(dev, dst); neigh = __ipv6_neigh_lookup_noref_stub(dev, dst);
if (!neigh) if (!neigh || !(neigh->nud_state & NUD_VALID))
return BPF_FIB_LKUP_RET_NO_NEIGH; return BPF_FIB_LKUP_RET_NO_NEIGH;
return bpf_fib_set_fwd_params(params, neigh, dev, mtu); return bpf_fib_set_fwd_params(params, neigh, dev, mtu);

View File

@ -269,7 +269,7 @@ static int neigh_forced_gc(struct neigh_table *tbl)
(n->nud_state == NUD_NOARP) || (n->nud_state == NUD_NOARP) ||
(tbl->is_multicast && (tbl->is_multicast &&
tbl->is_multicast(n->primary_key)) || tbl->is_multicast(n->primary_key)) ||
time_after(tref, n->updated)) !time_in_range(n->updated, tref, jiffies))
remove = true; remove = true;
write_unlock(&n->lock); write_unlock(&n->lock);
@ -289,7 +289,17 @@ static int neigh_forced_gc(struct neigh_table *tbl)
static void neigh_add_timer(struct neighbour *n, unsigned long when) static void neigh_add_timer(struct neighbour *n, unsigned long when)
{ {
/* Use safe distance from the jiffies - LONG_MAX point while timer
* is running in DELAY/PROBE state but still show to user space
* large times in the past.
*/
unsigned long mint = jiffies - (LONG_MAX - 86400 * HZ);
neigh_hold(n); neigh_hold(n);
if (!time_in_range(n->confirmed, mint, jiffies))
n->confirmed = mint;
if (time_before(n->used, n->confirmed))
n->used = n->confirmed;
if (unlikely(mod_timer(&n->timer, when))) { if (unlikely(mod_timer(&n->timer, when))) {
printk("NEIGH: BUG, double timer add, state is %x\n", printk("NEIGH: BUG, double timer add, state is %x\n",
n->nud_state); n->nud_state);
@ -1001,12 +1011,14 @@ static void neigh_periodic_work(struct work_struct *work)
goto next_elt; goto next_elt;
} }
if (time_before(n->used, n->confirmed)) if (time_before(n->used, n->confirmed) &&
time_is_before_eq_jiffies(n->confirmed))
n->used = n->confirmed; n->used = n->confirmed;
if (refcount_read(&n->refcnt) == 1 && if (refcount_read(&n->refcnt) == 1 &&
(state == NUD_FAILED || (state == NUD_FAILED ||
time_after(jiffies, n->used + NEIGH_VAR(n->parms, GC_STALETIME)))) { !time_in_range_open(jiffies, n->used,
n->used + NEIGH_VAR(n->parms, GC_STALETIME)))) {
*np = n->next; *np = n->next;
neigh_mark_dead(n); neigh_mark_dead(n);
write_unlock(&n->lock); write_unlock(&n->lock);

View File

@ -209,7 +209,6 @@ void sk_stream_kill_queues(struct sock *sk)
sk_mem_reclaim_final(sk); sk_mem_reclaim_final(sk);
WARN_ON_ONCE(sk->sk_wmem_queued); WARN_ON_ONCE(sk->sk_wmem_queued);
WARN_ON_ONCE(sk->sk_forward_alloc);
/* It is _impossible_ for the backlog to contain anything /* It is _impossible_ for the backlog to contain anything
* when we get here. All user references to this socket * when we get here. All user references to this socket

View File

@ -310,6 +310,52 @@ static void xfrmi_scrub_packet(struct sk_buff *skb, bool xnet)
skb->mark = 0; skb->mark = 0;
} }
static int xfrmi_input(struct sk_buff *skb, int nexthdr, __be32 spi,
int encap_type, unsigned short family)
{
struct sec_path *sp;
sp = skb_sec_path(skb);
if (sp && (sp->len || sp->olen) &&
!xfrm_policy_check(NULL, XFRM_POLICY_IN, skb, family))
goto discard;
XFRM_SPI_SKB_CB(skb)->family = family;
if (family == AF_INET) {
XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct iphdr, daddr);
XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4 = NULL;
} else {
XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct ipv6hdr, daddr);
XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6 = NULL;
}
return xfrm_input(skb, nexthdr, spi, encap_type);
discard:
kfree_skb(skb);
return 0;
}
static int xfrmi4_rcv(struct sk_buff *skb)
{
return xfrmi_input(skb, ip_hdr(skb)->protocol, 0, 0, AF_INET);
}
static int xfrmi6_rcv(struct sk_buff *skb)
{
return xfrmi_input(skb, skb_network_header(skb)[IP6CB(skb)->nhoff],
0, 0, AF_INET6);
}
static int xfrmi4_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
{
return xfrmi_input(skb, nexthdr, spi, encap_type, AF_INET);
}
static int xfrmi6_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
{
return xfrmi_input(skb, nexthdr, spi, encap_type, AF_INET6);
}
static int xfrmi_rcv_cb(struct sk_buff *skb, int err) static int xfrmi_rcv_cb(struct sk_buff *skb, int err)
{ {
const struct xfrm_mode *inner_mode; const struct xfrm_mode *inner_mode;
@ -937,8 +983,8 @@ static struct pernet_operations xfrmi_net_ops = {
}; };
static struct xfrm6_protocol xfrmi_esp6_protocol __read_mostly = { static struct xfrm6_protocol xfrmi_esp6_protocol __read_mostly = {
.handler = xfrm6_rcv, .handler = xfrmi6_rcv,
.input_handler = xfrm_input, .input_handler = xfrmi6_input,
.cb_handler = xfrmi_rcv_cb, .cb_handler = xfrmi_rcv_cb,
.err_handler = xfrmi6_err, .err_handler = xfrmi6_err,
.priority = 10, .priority = 10,
@ -988,8 +1034,8 @@ static struct xfrm6_tunnel xfrmi_ip6ip_handler __read_mostly = {
#endif #endif
static struct xfrm4_protocol xfrmi_esp4_protocol __read_mostly = { static struct xfrm4_protocol xfrmi_esp4_protocol __read_mostly = {
.handler = xfrm4_rcv, .handler = xfrmi4_rcv,
.input_handler = xfrm_input, .input_handler = xfrmi4_input,
.cb_handler = xfrmi_rcv_cb, .cb_handler = xfrmi_rcv_cb,
.err_handler = xfrmi4_err, .err_handler = xfrmi4_err,
.priority = 10, .priority = 10,

View File

@ -3670,6 +3670,9 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
goto reject; goto reject;
} }
if (if_id)
secpath_reset(skb);
xfrm_pols_put(pols, npols); xfrm_pols_put(pols, npols);
return 1; return 1;
} }

View File

@ -91,7 +91,7 @@ all_compiled_sources()
{ {
echo include/generated/autoconf.h echo include/generated/autoconf.h
find $ignore -name "*.cmd" -exec \ find $ignore -name "*.cmd" -exec \
grep -Poh '(?(?=^source_.* \K).*|(?=^ \K\S).*(?= \\))' {} \+ | sed -n -E 's/^source_.* (.*)/\1/p; s/^ (\S.*) \\/\1/p' {} \+ |
awk '!a[$0]++' awk '!a[$0]++'
} | xargs realpath -esq $([ -z "$KBUILD_ABS_SRCTREE" ] && echo --relative-to=.) | } | xargs realpath -esq $([ -z "$KBUILD_ABS_SRCTREE" ] && echo --relative-to=.) |
sort -u sort -u

View File

@ -729,14 +729,16 @@ static int es8326_probe(struct snd_soc_component *component)
} }
dev_dbg(component->dev, "jack-pol %x", es8326->jack_pol); dev_dbg(component->dev, "jack-pol %x", es8326->jack_pol);
ret = device_property_read_u8(component->dev, "everest,interrupt-src", &es8326->jack_pol); ret = device_property_read_u8(component->dev, "everest,interrupt-src",
&es8326->interrupt_src);
if (ret != 0) { if (ret != 0) {
dev_dbg(component->dev, "interrupt-src return %d", ret); dev_dbg(component->dev, "interrupt-src return %d", ret);
es8326->interrupt_src = ES8326_HP_DET_SRC_PIN9; es8326->interrupt_src = ES8326_HP_DET_SRC_PIN9;
} }
dev_dbg(component->dev, "interrupt-src %x", es8326->interrupt_src); dev_dbg(component->dev, "interrupt-src %x", es8326->interrupt_src);
ret = device_property_read_u8(component->dev, "everest,interrupt-clk", &es8326->jack_pol); ret = device_property_read_u8(component->dev, "everest,interrupt-clk",
&es8326->interrupt_clk);
if (ret != 0) { if (ret != 0) {
dev_dbg(component->dev, "interrupt-clk return %d", ret); dev_dbg(component->dev, "interrupt-clk return %d", ret);
es8326->interrupt_clk = 0x45; es8326->interrupt_clk = 0x45;

View File

@ -167,7 +167,7 @@ static int rt715_sdca_read_prop(struct sdw_slave *slave)
} }
/* set the timeout values */ /* set the timeout values */
prop->clk_stop_timeout = 20; prop->clk_stop_timeout = 200;
return 0; return 0;
} }

View File

@ -316,7 +316,6 @@ static irqreturn_t acp_irq_thread(int irq, void *context)
{ {
struct snd_sof_dev *sdev = context; struct snd_sof_dev *sdev = context;
const struct sof_amd_acp_desc *desc = get_chip_info(sdev->pdata); const struct sof_amd_acp_desc *desc = get_chip_info(sdev->pdata);
unsigned int base = desc->dsp_intr_base;
unsigned int val, count = ACP_HW_SEM_RETRY_COUNT; unsigned int val, count = ACP_HW_SEM_RETRY_COUNT;
val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, desc->ext_intr_stat); val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, desc->ext_intr_stat);
@ -326,28 +325,20 @@ static irqreturn_t acp_irq_thread(int irq, void *context)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, base + DSP_SW_INTR_STAT_OFFSET); while (snd_sof_dsp_read(sdev, ACP_DSP_BAR, desc->hw_semaphore_offset)) {
if (val & ACP_DSP_TO_HOST_IRQ) { /* Wait until acquired HW Semaphore lock or timeout */
while (snd_sof_dsp_read(sdev, ACP_DSP_BAR, desc->hw_semaphore_offset)) { count--;
/* Wait until acquired HW Semaphore lock or timeout */ if (!count) {
count--; dev_err(sdev->dev, "%s: Failed to acquire HW lock\n", __func__);
if (!count) { return IRQ_NONE;
dev_err(sdev->dev, "%s: Failed to acquire HW lock\n", __func__);
return IRQ_NONE;
}
} }
sof_ops(sdev)->irq_thread(irq, sdev);
val |= ACP_DSP_TO_HOST_IRQ;
snd_sof_dsp_write(sdev, ACP_DSP_BAR, base + DSP_SW_INTR_STAT_OFFSET, val);
/* Unlock or Release HW Semaphore */
snd_sof_dsp_write(sdev, ACP_DSP_BAR, desc->hw_semaphore_offset, 0x0);
return IRQ_HANDLED;
} }
return IRQ_NONE; sof_ops(sdev)->irq_thread(irq, sdev);
/* Unlock or Release HW Semaphore */
snd_sof_dsp_write(sdev, ACP_DSP_BAR, desc->hw_semaphore_offset, 0x0);
return IRQ_HANDLED;
}; };
static irqreturn_t acp_irq_handler(int irq, void *dev_id) static irqreturn_t acp_irq_handler(int irq, void *dev_id)
@ -358,8 +349,11 @@ static irqreturn_t acp_irq_handler(int irq, void *dev_id)
unsigned int val; unsigned int val;
val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, base + DSP_SW_INTR_STAT_OFFSET); val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, base + DSP_SW_INTR_STAT_OFFSET);
if (val) if (val) {
val |= ACP_DSP_TO_HOST_IRQ;
snd_sof_dsp_write(sdev, ACP_DSP_BAR, base + DSP_SW_INTR_STAT_OFFSET, val);
return IRQ_WAKE_THREAD; return IRQ_WAKE_THREAD;
}
return IRQ_NONE; return IRQ_NONE;
} }

View File

@ -246,7 +246,7 @@ test_vlan_ingress_modify()
bridge vlan add dev $swp2 vid 300 bridge vlan add dev $swp2 vid 300
tc filter add dev $swp1 ingress chain $(IS1 2) pref 3 \ tc filter add dev $swp1 ingress chain $(IS1 2) pref 3 \
protocol 802.1Q flower skip_sw vlan_id 200 \ protocol 802.1Q flower skip_sw vlan_id 200 src_mac $h1_mac \
action vlan modify id 300 \ action vlan modify id 300 \
action goto chain $(IS2 0 0) action goto chain $(IS2 0 0)