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:
commit
25c71db17a
@ -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",
|
||||||
|
@ -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
|
||||||
|
2
Makefile
2
Makefile
@ -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
265
android/abi_gki_aarch64_galaxy
Normal file
265
android/abi_gki_aarch64_galaxy
Normal 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
|
@ -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
|
||||||
|
@ -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>;
|
||||||
|
@ -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>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -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>;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -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 {
|
||||||
|
@ -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>;
|
||||||
};
|
};
|
||||||
|
@ -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";
|
||||||
};
|
};
|
||||||
|
@ -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>,
|
||||||
|
@ -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>;
|
||||||
};
|
};
|
||||||
|
@ -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>;
|
||||||
};
|
};
|
||||||
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
|
@ -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__ */
|
||||||
|
@ -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,
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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),
|
||||||
|
@ -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) },
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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, },
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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),
|
||||||
|
@ -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,
|
||||||
|
74
fs/attr.c
74
fs/attr.c
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
64
fs/inode.c
64
fs/inode.c
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user