From 013b24b970f324c1bc000f5c3771b493dcb5a9fa Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Sat, 13 Aug 2022 16:26:03 -0400 Subject: [PATCH] Fixes for 5.10 Signed-off-by: Sasha Levin --- ...acpi-apei-fix-_einj-vs-efi_memory_sp.patch | 41 ++ ...p-the-ec_flags_ignore_dsdt_gpe-quirk.patch | 211 +++++++++ ...uplicate-thinkpad-x1-carbon-6th-entr.patch | 42 ++ ...ssing-check-in-register_device_clock.patch | 36 ++ ...pm-save-nvs-memory-for-lenovo-g40-45.patch | 44 ++ ...dle-annotate-more-functions-to-live-.patch | 63 +++ ...x-refcount-leak-in-bcm_kona_smc_init.patch | 36 ++ ...dts-ast2500-evb-fix-board-compatible.patch | 35 ++ ...dts-ast2600-evb-fix-board-compatible.patch | 35 ++ ...-dts-bcm5301x-add-dt-for-meraki-mr26.patch | 260 +++++++++++ ...x6ul-add-missing-properties-for-sram.patch | 39 ++ ...hange-operating-points-to-uint32-mat.patch | 63 +++ ...m-dts-imx6ul-fix-csi-node-compatible.patch | 40 ++ ...arm-dts-imx6ul-fix-keypad-compatible.patch | 41 ++ ...dts-imx6ul-fix-lcdif-node-compatible.patch | 42 ++ ...-dts-imx6ul-fix-qspi-node-compatible.patch | 42 ++ ...s-imx7d-colibri-emmc-add-cpu1-supply.patch | 38 ++ ...om-mdm9615-add-missing-pmic-gpio-reg.patch | 36 ++ ...841-add-required-thermal-sensor-cell.patch | 35 ++ .../arm-findbit-fix-overflowing-offset.patch | 76 ++++ ...-omap2-display-fix-refcount-leak-bug.patch | 36 ++ ...fcount-leak-in-omap3xxx_prm_late_ini.patch | 37 ++ ...fix-refcount-leak-in-omapdss_init_of.patch | 45 ++ ...r-gen2-increase-refcount-for-new-ref.patch | 60 +++ ...-allow-different-pmu-versions-in-id_.patch | 61 +++ ...get-syscall-when-starting-a-new-thre.patch | 40 ++ ...ner-a64-orangepi-win-fix-led-node-na.patch | 37 ++ ...64-dts-mt7622-fix-bpi-r64-wps-button.patch | 52 +++ ...-dts-qcom-ipq8074-fix-nand-node-name.patch | 37 ++ ...sm8916-fix-typo-in-pronto-remoteproc.patch | 42 ++ ...sm8916-use-power-domains-for-mss-wcn.patch | 82 ++++ ...cs404-fix-incorrect-usb2-phys-assign.patch | 63 +++ ...esas-beacon-fix-regulator-node-names.patch | 60 +++ ...s-fix-thermal-sensors-on-single-zone.patch | 67 +++ ...n-concurrently-setting-insn_emulatio.patch | 93 ++++ .../arm64-tegra-fix-sdmmc1-cd-on-p2888.patch | 39 ++ ...ph-card-add-of_node_put-in-fail-path.patch | 40 ++ ...-da7210-add-check-for-i2c_add_driver.patch | 41 ++ ...916-wcd-digital-move-gains-from-sx_t.patch | 102 +++++ ...335-move-gains-from-sx_tlv-to-s8_tlv.patch | 118 +++++ ...ec-fix-refcount-leak-in-cros_ec_code.patch | 40 ++ ...se-snd_pcm_format_t-type-for-sample_.patch | 107 +++++ ...x-disable-end-of-block-interrupt-on-.patch | 59 +++ ...8173-fix-refcount-leak-in-mt8173_rt5.patch | 67 +++ ...8173-rt5650-fix-refcount-leak-in-mt8.patch | 67 +++ ...51-fix-refcount-leak-in-mt6797_mt635.patch | 49 ++ ...ssing-of_node_put-in-asoc_qcom_lpass.patch | 38 ++ ...fix-an-off-by-one-in-q6adm_alloc_cop.patch | 37 ++ ...nge-gpiod_speaker_power-and-rx1950_a.patch | 52 +++ ...-error-handling-in-aries_audio_probe.patch | 44 ++ ...40_uda1380-include-proepr-gpio-consu.patch | 37 ++ ...o-not-enforce-interrupt-trigger-type.patch | 58 +++ ...1k-fix-incorrect-debug_mask-mappings.patch | 45 ++ queue-5.10/ath11k-fix-netdev-open-race.patch | 109 +++++ ...se-after-free-in-ath9k_hif_usb_rx_cb.patch | 94 ++++ ...ate-hctx-debugfs-dir-until-q-debugfs.patch | 44 ++ ...ce-trace-remapped-requests-correctly.patch | 43 ++ ...nfinite-loop-for-invalid-zone-append.patch | 45 ++ ...-request_queue-to-argument-request-b.patch | 388 ++++++++++++++++ ...tel-add-check-for-platform_driver_re.patch | 41 ++ ...pf-fix-subprog-names-in-stack-traces.patch | 50 +++ ...-missing-platform_device_put-in-hisi.patch | 75 ++++ ...y-the-values-of-data-5.7-of-can-erro.patch | 49 ++ ...t-report-txerr-and-rxerr-during-bus-.patch | 47 ++ ...ydra-do-not-report-txerr-and-rxerr-d.patch | 55 +++ ...eaf-do-not-report-txerr-and-rxerr-du.patch | 42 ++ ...ot-report-txerr-and-rxerr-during-bus.patch | 48 ++ ...can_error-initialize-errc-before-usi.patch | 58 +++ ...not-report-txerr-and-rxerr-during-bu.patch | 51 +++ ...ot-report-txerr-and-rxerr-during-bus.patch | 49 ++ ...-not-report-txerr-and-rxerr-during-b.patch | 52 +++ ...not-report-txerr-and-rxerr-during-bu.patch | 42 ++ ...k-reset-fix-written-reset-bit-offset.patch | 56 +++ ...dm845-fix-topology-around-titan_top-.patch | 55 +++ ...ait-unlock-spin-after-mux-completion.patch | 47 ++ ...8939-add-missing-system_mm_noc_bfdcd.patch | 42 ++ ...add-missing-system_mm_noc_bfdcd.patch-4005 | 61 +++ ...8939-fix-bimc_ddr_clk_src-rcgr-base-.patch | 37 ++ ...8939-fix-weird-field-spacing-in-ftbl.patch | 39 ++ ...8939-point-mm-peripherals-to-system_.patch | 107 +++++ .../clk-qcom-ipq8074-fix-nss-core-pll-s.patch | 92 ++++ ...pq8074-fix-nss-port-frequency-tables.patch | 76 ++++ ...-set-branch_halt_delay-flag-for-ubi-.patch | 113 +++++ ...074-sw-workaround-for-ubi32-pll-lock.patch | 47 ++ ...sas-r9a06g032-fix-uart-clkgrp-bitsel.patch | 54 +++ ...x-refcount-leak-in-zynq_get_revision.patch | 37 ++ ...4-gcm-select-aead-for-ghash_arm64_ce.patch | 39 ++ ...g-shutdown-check-sev-data-pointer-be.patch | 44 ++ ...-hpre-don-t-use-gfp_kernel-to-alloc-.patch | 37 ++ ...-kunpeng916-crypto-driver-don-t-slee.patch | 97 ++++ ...icon-sec-don-t-sleep-when-in-softirq.patch | 180 ++++++++ ...isilicon-sec-fix-auth-key-size-error.patch | 60 +++ ...isilicon-sec-fixes-some-coding-style.patch | 420 ++++++++++++++++++ ...cure-add-missing-module_device_table.patch | 41 ++ ...do-not-allocate-memory-when-handling.patch | 103 +++++ ...ss-fix-error-codes-in-allocate_flows.patch | 68 +++ ...fix-infinite-loop-in-sun8i_ss_setup_.patch | 38 ++ ...olicy_full-and-dccp_qpolicy_push-in-.patch | 71 +++ ...from-dm_pr_call-if-dm-device-is-susp.patch | 38 ++ ...a-fix-edma-rd-wr-channels-and-dma-di.patch | 100 +++++ ...a-add-multithread-support-for-a-dma-.patch | 140 ++++++ ...a-apply-proper-spinlock-flags-in-sf_.patch | 52 +++ ...potential-deadlock-in-__driver_attac.patch | 120 +++++ ..._spe-fix-consistency-of-sys_pmscr_el.patch | 103 +++++ ...ride-i2c-address-of-cec-before-acces.patch | 63 +++ ...11-add-check-for-mipi_dsi_driver_reg.patch | 57 +++ ...idge-sii8620-fix-possible-off-by-one.patch | 52 +++ ...767-make-sure-refclk-clock-are-enabl.patch | 92 ++++ ...767-move-e-dp-bridge-endpoint-parsin.patch | 87 ++++ ...s7_drm_decon-free-resources-when-clk.patch | 75 ++++ ...e-fix-refcount-leak-in-mcde_dsi_bind.patch | 38 ++ ...-pull-down-mipi-operation-in-mtk_dsi.patch | 49 ++ ...-only-enable-dpi-after-the-bridge-is.patch | 48 ++ ...atek-dpi-remove-output-format-of-yuv.patch | 73 +++ ...odify-dsi-funcs-to-atomic-operations.patch | 59 +++ ...arate-poweron-poweroff-from-enable-d.patch | 130 ++++++ ...align-max_chunk-to-2-in-spi_transfer.patch | 51 +++ ...ble-core-vcc-core-vdda-supply-for-89.patch | 40 ++ ...m-mdp5-fix-global-state-lock-backoff.patch | 85 ++++ ...-incorrrect-spdx-license-identifiers.patch | 65 +++ ...otential-buffer-overflow-in-ni_set_m.patch | 61 +++ ...-an-error-handling-path-rockchip_dp_.patch | 45 ++ ...-don-t-crash-for-invalid-duplicate_s.patch | 42 ++ ...module-autoloading-for-okaya-rh12812.patch | 51 +++ ...rv-remove-the-dsi-pointer-in-vc4_drv.patch | 76 ++++ ...correct-stop-condition-to-vc4_dsi_en.patch | 43 ++ ...dsi-correct-dsi-divider-calculations.patch | 51 +++ ...vc4-dsi-correct-pixel-order-for-dsi0.patch | 40 ++ ...m-vc4-dsi-fix-dsi0-interrupt-support.patch | 201 +++++++++ ...c4-dsi-introduce-a-variant-structure.patch | 199 +++++++++ ...ster-dsi0-as-the-correct-vc4-encoder.patch | 41 ++ ...snprintf-for-the-phy-clocks-instead-.patch | 73 +++ ...mi-avoid-full-hdmi-audio-fifo-writes.patch | 46 ++ ...rect-hdmi-timing-registers-for-inter.patch | 46 ++ ...hdmi-create-a-custom-connector-state.patch | 101 +++++ ...-t-access-the-connector-state-in-res.patch | 46 ++ ...dmi-fix-timings-for-interlaced-modes.patch | 98 ++++ ...it-the-bcm2711-to-the-max-without-sc.patch | 55 +++ ...ove-firmware-logic-for-mai-threshold.patch | 58 +++ ...x-margin-calculations-for-the-right-.patch | 51 +++ ...ne-remove-subpixel-positioning-check.patch | 76 ++++ ...te-qcom-usb-subsystem-maintainer-inf.patch | 93 ++++ ...sx-uninitialized-data-in-idt_dbgfs_c.patch | 55 +++ ...ecutive-detection-for-highmem-memory.patch | 59 +++ ...ore-validity-checks-for-inode-counts.patch | 55 +++ ...m-seed-of-tmp_inode-after-migrating-.patch | 76 ++++ ...set-gc_failure_pin-for-background-gc.patch | 36 ++ ...ve-f2fs_compr_fl-and-tag-f2fs_nocomp.patch | 83 ++++ .../f2fs-write-checkpoint-during-fg_gc.patch | 75 ++++ ...ix-error-check-return-value-of-debug.patch | 69 +++ ...p-fix-unsigned-comparison-with-less-.patch | 40 ++ ...seek-to-control-internal-pipe-splici.patch | 58 +++ ...-the-control-interface-for-virtio-fs.patch | 50 +++ ...libcrypto_support-not-the-never-defi.patch | 59 +++ ...urn-error-on-missing-optional-irq_re.patch | 42 ++ ...enirq-generic_irq_ipi-depends-on-smp.patch | 51 +++ ...fix-refcount-bugs-in-of_mm_gpiochip_.patch | 53 +++ ...agon-select-arch_want_ld_orphan_warn.patch | 42 ++ ...ps-declare-u1_unicorn_legacy-support.patch | 36 ++ ...ent-a-buffer-overflow-in-cp2112_xfer.patch | 47 ++ ...ent-a-buffer-overflow-in-mcp_smbus_w.patch | 44 ++ ...c-use-the-bitmap-api-when-applicable.patch | 56 +++ .../hwmon-drivetemp-add-module-alias.patch | 33 ++ ...wrong-assumptions-in-device-remove-c.patch | 78 ++++ ...nce-support-pec-for-smbus-block-read.patch | 77 ++++ .../i2c-fix-a-potential-use-after-free.patch | 40 ++ ...d-of_node_put-when-breaking-out-of-l.patch | 37 ++ ...i2c-npcm-correct-slave-role-behavior.patch | 55 +++ ...npcm-remove-own-slave-addresses-2-10.patch | 133 ++++++ queue-5.10/iavf-fix-max_rate-limiting.patch | 104 +++++ ...-fix-the-scale-min-and-max-macro-val.patch | 59 +++ ...el-bma400-reordering-of-header-files.patch | 45 ++ ...nce-sk-sk_bound_dev_if-in-inet_match.patch | 160 +++++++ ...mxt_ts-fix-up-inverted-reset-handler.patch | 204 +++++++++ ...esource-leak-in-an-error-handling-pa.patch | 55 +++ .../intel_th-msu-fix-vmalloced-buffers.patch | 74 +++ ...k-potential-dereference-of-null-poin.patch | 41 ++ .../interconnect-imx-fix-max_node_id.patch | 51 +++ ...com_iommu-add-of_node_put-when-break.patch | 45 ++ ...dle-failed-iommu-device-registration.patch | 51 +++ ...ce-sk-sk_bound_dev_if-in-inet6_match.patch | 125 ++++++ ...-check-the-return-value-of-ioremap-i.patch | 40 ++ ...-only-register-ipi-domain-when-smp-i.patch | 181 ++++++++ ...on-jh-b_frozen_data-null-failure-whe.patch | 110 +++++ ...ding-credits-assert-in-jbd2_journal_.patch | 75 ++++ .../kfifo-fix-kfifo_to_user-return-type.patch | 44 ++ ...robing-on-trampoline-and-bpf-code-ar.patch | 52 +++ ...rm64-don-t-return-from-void-function.patch | 54 +++ ...et-accessed-dirty-bits-for-zero_page.patch | 64 +++ ...-the-topmost-page-table-when-destroy.patch | 173 ++++++++ ...bitmap-order-includes-alphabetically.patch | 67 +++ ...de-devm_bitmap_alloc-and-devm_bitmap.patch | 99 +++++ ...r_id-fix-imbalanced-instrumentation_.patch | 42 ++ .../libbpf-fix-the-name-of-a-reused-map.patch | 74 +++ ...kdep-fix-lockdep_init_map_-confusion.patch | 101 +++++ ...hevc-add-check-for-invalid-timestamp.patch | 45 ++ ...ix-error-value-returns-in-hdpvr_read.patch | 44 ++ ...tk-mdp-fix-mdp_ipi_comm-structure-al.patch | 57 +++ ...fix-memory-leak-in-tw686x_video_init.patch | 41 ++ ...register-the-irq-at-the-end-of-probe.patch | 82 ++++ ...em-prevent-pollerr-when-last_buffer_.patch | 44 ++ ...c80211-fix-missing-of_node_put-in-mt.patch | 36 ++ .../memstick-ms_block-fix-a-memory-leak.patch | 39 ++ ...k-fix-some-incorrect-memory-allocati.patch | 65 +++ ...-fix-refcount-leak-in-meson_mx_socin.patch | 38 ++ ...-refcount-leak-in-max77620_initialis.patch | 42 ++ ...l66xb-drop-platform-disable-callback.patch | 70 +++ ...-error-handling-path-in-rtsx_pci_pro.patch | 51 +++ ...ssing-call-to-vm_unacct_memory-in-mm.patch | 40 ++ ...-add-single-read-for-4k-sector-cards.patch | 129 ++++++ ...n-add-of_node_put-when-breaking-out-.patch | 38 ++ ...erx-add-of_node_put-when-breaking-ou.patch | 42 ++ ...1-fix-set_uhs_signaling-rewriting-of.patch | 48 ++ ...hc-fix-refcount-leak-in-esdhc_signal.patch | 38 ++ ...x-possible-memory-leak-in-__mt76x02u.patch | 37 ++ ...s-fix-refcount-leak-in-ap_flash_init.patch | 38 ++ ...count-leak-in-of_flash_probe_versati.patch | 38 ++ ...ix-refcount-leak-in-parse_redboot_of.patch | 38 ++ ...on-fix-a-potential-double-free-issue.patch | 46 ++ ...eadlock-caused-by-cancel_work_sync-i.patch | 53 +++ ...dd-a-clk_disable_unprepare-in-.probe.patch | 49 ++ ...p-in-atomic-context-bugs-caused-by-d.patch | 173 ++++++++ ...tcoex-events-from-the-88w8897-firmwa.patch | 81 ++++ ...d-socket-for-packets-in-vrf-when-tcp.patch | 126 ++++++ ...schedule-and-sk_rmem_schedule-errors.patch | 58 +++ ...oid-kernel-hung-in-hinic_get_stats64.patch | 98 ++++ ...fix-bug-that-ethtool-get-wrong-stats.patch | 271 +++++++++++ ...ror-check-for-vlan-flags-in-ionic_se.patch | 42 ++ ...x-the-value-of-mlx5e_max_rq_num_mtts.patch | 40 ++ ...-warn_on-when-trying-to-offload-an-u.patch | 43 ++ ...et-rose-fix-netdev-reference-changes.patch | 110 +++++ ...allocation-warnings-triggered-from-u.patch | 54 +++ ...les-add-rescheduling-points-during-l.patch | 53 +++ ...r-xtables-bring-spdx-identifier-back.patch | 67 +++ ...rt-fix-missed-tick-reenabling-bug-in.patch | 118 +++++ ...x-ida-error-handling-in-null_add_dev.patch | 62 +++ ..._id-instead-of-req-tag-in-trace_nvme.patch | 40 ++ ...ror-check-in-dev_pm_opp_attach_genpd.patch | 39 ++ ...ll-iatu-space-support-to-dw_pcie_dis.patch | 71 +++ ...nable-cdm-check-if-snps-enable-cdm-c.patch | 62 +++ ...te-epc-memory-on-dw_pcie_ep_init-err.patch | 66 +++ ...-t-stop-controller-when-unbinding-en.patch | 41 ++ ...t-disable-aer-reporting-in-get_port_.patch | 106 +++++ ...rev-2.1.0-parf_phy-before-enabling-c.patch | 68 +++ ...-tegra194-fix-link-up-retry-sequence.patch | 37 ++ ...-pm-error-handling-in-tegra_pcie_con.patch | 40 ++ ...194-fix-root-port-interrupt-handling.patch | 115 +++++ ...-symbol-fail-to-read-phdr-workaround.patch | 107 +++++ ...x-dso_id-inode-generation-comparison.patch | 57 +++ ...cros_ec-always-expose-last-resume-re.patch | 64 +++ ...x-uninitialized-data-in-debugfs-writ.patch | 50 +++ ...er-device-probing-when-resuming-from.patch | 106 +++++ ...t-allow-selection-of-e5500-or-e6500-.patch | 48 ++ ...ble-stack-variable-initialisation-fo.patch | 55 +++ ...n_msi-fix-refcount-leak-in-setup_msi.patch | 37 ++ ...-phb-numbering-when-using-opal-phbid.patch | 61 +++ ...er-pci-domain-assignment-via-dt-linu.patch | 88 ++++ ...imize-clearing-the-pending-pmi-and-r.patch | 157 +++++++ ...x-refcount-leak-in-spufs_init_isolat.patch | 38 ++ ...x-refcount-leak-in-xive_get_max_prio.patch | 37 ++ ...x-shift-too-large-makes-kernel-panic.patch | 91 ++++ ...citly-allocate-pwm-chip-base-dynamic.patch | 41 ++ ...convert-to-devm_platform_ioremap_res.patch | 47 ++ ...-check-the-return-code-of-pwmchip_re.patch | 52 +++ ...e-the-clk-is-enabled-exactly-once-pe.patch | 116 +++++ ...down-hardware-only-after-pwmchip_rem.patch | 50 +++ ...ify-offset-calculation-for-pwmcmp-re.patch | 74 +++ ...tential-memory-leak-in-setup_base_ct.patch | 45 ++ ...orrect-clearing-of-interrupt-status-.patch | 41 ++ ...ssing-check-for-return-value-in-get-.patch | 46 ++ ...tential-memory-leak-in-__qedr_alloc_.patch | 67 +++ ...e-error-logs-for-rdma_alloc_tid-erro.patch | 68 +++ ...wtautological-constant-out-of-range-.patch | 60 +++ .../rdma-rtrs-define-min_chunk_size.patch | 53 +++ ...srv-fix-modinfo-output-for-stringify.patch | 65 +++ ...xe-fix-error-unwind-in-rxe_create_qp.patch | 69 +++ ...licated-reported-iw_cm_event_connect.patch | 73 +++ ...dma-srpt-duplicate-port-name-members.patch | 85 ++++ .../rdma-srpt-fix-a-use-after-free.patch | 306 +++++++++++++ ...uce-a-reference-count-in-struct-srpt.patch | 94 ++++ ...-refcount-leak-bug-in-of_get_regulat.patch | 43 ++ ...lator-qcom_smd-fix-pm8916_pldo-range.patch | 55 +++ ...-fix-refcount-leak-in-k3_r5_cluster_.patch | 48 ++ ...proc-qcom-wcnss-fix-handling-of-irqs.patch | 60 +++ ...on-wait-for-ssctl-service-to-come-up.patch | 78 ++++ ...pmsg-fix-circular-locking-dependency.patch | 126 ++++++ ...ix-refcount-leak-in-qcom_smd_parse_e.patch | 36 ++ ...d-lowcore-virtual-vs-physical-addres.patch | 82 ++++ ...ace-when-reading-from-hardware-syste.patch | 84 ++++ ...-dl_cpu_busy-panic-due-to-empty-cs-c.patch | 109 +++++ ...erge-dl_task_can_attach-and-dl_cpu_b.patch | 164 +++++++ ...heck-of-nr_running-at-queue-wakelist.patch | 54 +++ ...2line-fix-vmlinux-detection-on-arm64.patch | 47 ++ ...-fix-dma-direction-for-raid-requests.patch | 68 +++ ...bpf-fix-a-test-for-snprintf-overflow.patch | 39 ++ .../selftests-kvm-set-rax-before-vmcall.patch | 45 ++ ...tch-better-synchronize-test_klp_call.patch | 79 ++++ ...mp-fix-compile-warning-when-cc-clang.patch | 47 ++ ...-clocksource-switch-fix-passing-erro.patch | 43 ++ ...-valid-adjtimex-build-fix-for-newer-.patch | 42 ++ ...stroy-bpf-resources-only-when-ctx-re.patch | 77 ++++ ...inux-add-boundary-check-in-put_entry.patch | 35 ++ ...rt-icr-access-helpers-for-internal-u.patch | 110 +++++ ...tore-lsr-into-lsr_saved_flags-in-dw8.patch | 54 +++ ..._fsl-don-t-report-fe-pe-and-oe-twice.patch | 68 +++ ...store-interrupt-state-in-sysrq-helpe.patch | 246 ++++++++++ queue-5.10/series | 375 ++++++++++++++++ ...refcount-leak-in-meson-secure-pwrc.c.patch | 42 ++ ...guts-machine-variable-might-be-unset.patch | 37 ++ ...x-refcount-leak-in-qmp_cooling_devic.patch | 43 ++ ...oc-qcom-make-qcom_rpmpd-depend-on-pm.patch | 37 ++ ...em-fix-refcount-leak-in-of_get_ocmem.patch | 49 ++ ...79a0-sysc-fix-a2dp1-and-a2cv-2357-pd.patch | 46 ++ ...type-fix-remove-and-shutdown-support.patch | 54 +++ ...spi-fix-pio-fallback-on-rz-platforms.patch | 47 ++ ...er-add-missing-clk_disable_unprepare.patch | 35 ++ ...-fix-sleep-in-atomic-context-bug-in-.patch | 150 +++++++ ...aces-around-sysctl_tcp_l3mdev_accept.patch | 59 +++ ...smitted-skb-fit-into-the-send-window.patch | 112 +++++ ...dev_if-once-in-inet_request_bound_de.patch | 46 ++ ...st_bpf-fix-incorrect-netdev-features.patch | 42 ++ ...on-include-pthread-and-time-headers-.patch | 62 +++ ...hermal-fix-possible-path-truncations.patch | 109 +++++ ...-gsmtty-open-sabm-frame-when-config-.patch | 51 +++ queue-5.10/tty-n_gsm-fix-dm-command.patch | 42 ++ ...x-missing-corner-cases-in-gsmld_poll.patch | 49 ++ ...n-flow-control-frames-during-mux-flo.patch | 116 +++++ ...cket-re-transmission-without-open-co.patch | 40 ++ ...sm-fix-race-condition-in-gsmld_write.patch | 62 +++ ...er-open-not-possible-at-responder-un.patch | 109 +++++ ...ong-queuing-behavior-in-gsm_dlci_dat.patch | 127 ++++++ ...sm-fix-wrong-t1-retry-count-handling.patch | 55 +++ ...-t-initialise-hwrng-struct-with-zero.patch | 46 ++ ...fix-refcount-leak-bug-in-ast_vhub_in.patch | 40 ++ ...-place-of-priv_ep-assignment-in-cdns.patch | 68 +++ ...use-priv_dev-uninitialized-in-cdns3_.patch | 82 ++++ ...c3-core-deprecate-gctl.coresoftreset.patch | 39 ++ ...-not-perform-gctl_core_softreset-dur.patch | 56 +++ ...om-fix-missing-optional-irq-warnings.patch | 44 ++ ...-xudc-fix-error-check-in-tegra_xudc_.patch | 49 ++ ...adget-udc-amd5536-depends-on-has_dma.patch | 49 ++ ...fcount-leak-in-ehci_hcd_ppc_of_probe.patch | 38 ++ ...xhci-use-snprintf-in-xhci_decode_trb.patch | 42 ++ ...-refcount-leak-in-ohci_hcd_nxp_probe.patch | 38 ++ ...al-fix-tty-port-initialized-comments.patch | 66 +++ .../usb-xhci-tegra-fix-error-check.patch | 49 ++ ...change-fsm-state-in-subchannel-event.patch | 61 +++ ...-to_mdev_device-into-a-static-inline.patch | 45 ++ ...ra-put-gets-around-vfio_device-group.patch | 113 +++++ ...y-the-lifetime-logic-for-vfio_device.patch | 224 ++++++++++ ...ion-of-a-vfio_device-into-init-and-r.patch | 357 +++++++++++++++ ...dev-amba-clcd-fix-refcount-leak-bugs.patch | 78 ++++ ...b-check-the-size-of-screen-before-me.patch | 50 +++ ...b-fix-a-divide-by-zero-bug-in-ark_se.patch | 59 +++ ...-check-the-size-of-screen-before-mem.patch | 49 ++ ...fbdev-sis-fix-typos-in-sis_getmodeid.patch | 47 ++ ...23fb-check-the-size-of-screen-before.patch | 50 +++ ...-missing-check-to-avoid-null-derefer.patch | 46 ++ ...wait_event_hrtimeout-for-rt-dl-tasks.patch | 62 +++ ...37xx_wdt-check-the-return-value-of-d.patch | 42 ++ ...65-fix-potential-off-by-one-overflow.patch | 64 +++ ...-fix-double-list_add-at-iwl_mvm_mac_.patch | 70 +++ ...x-possible-refcount-leak-in-if_usb_p.patch | 37 ++ ...add-missing-parentheses-in-p54_flush.patch | 45 ++ ...-error-handling-path-in-p54spi_probe.patch | 52 +++ ...-error-codes-in-rtl_debugfs_set_writ.patch | 57 +++ ...ugfs-fix-info-leak-in-wil_write_file.patch | 52 +++ ...ugfs-fix-uninitialized-variable-use-.patch | 59 +++ ...dips-don-t-corrupt-stack-when-detect.patch | 95 ++++ ...-ratelimiter-use-hrtimer-in-selftest.patch | 137 ++++++ ...thunk_-bits-only-if-config_preemptio.patch | 111 +++++ ...nomwait-cmdline-properly-for-x86_idl.patch | 97 ++++ ...mask_available-instead-of-hardcoded-.patch | 76 ++++ ...x-platform-device-leak-in-error-path.patch | 41 ++ ...andling-error-cases-in-iss_net_confi.patch | 111 +++++ ...iss-network-provide-release-callback.patch | 50 +++ 376 files changed, 26384 insertions(+) create mode 100644 queue-5.10/acpi-apei-fix-_einj-vs-efi_memory_sp.patch create mode 100644 queue-5.10/acpi-ec-drop-the-ec_flags_ignore_dsdt_gpe-quirk.patch create mode 100644 queue-5.10/acpi-ec-remove-duplicate-thinkpad-x1-carbon-6th-entr.patch create mode 100644 queue-5.10/acpi-lpss-fix-missing-check-in-register_device_clock.patch create mode 100644 queue-5.10/acpi-pm-save-nvs-memory-for-lenovo-g40-45.patch create mode 100644 queue-5.10/acpi-processor-idle-annotate-more-functions-to-live-.patch create mode 100644 queue-5.10/arm-bcm-fix-refcount-leak-in-bcm_kona_smc_init.patch create mode 100644 queue-5.10/arm-dts-ast2500-evb-fix-board-compatible.patch create mode 100644 queue-5.10/arm-dts-ast2600-evb-fix-board-compatible.patch create mode 100644 queue-5.10/arm-dts-bcm5301x-add-dt-for-meraki-mr26.patch create mode 100644 queue-5.10/arm-dts-imx6ul-add-missing-properties-for-sram.patch create mode 100644 queue-5.10/arm-dts-imx6ul-change-operating-points-to-uint32-mat.patch create mode 100644 queue-5.10/arm-dts-imx6ul-fix-csi-node-compatible.patch create mode 100644 queue-5.10/arm-dts-imx6ul-fix-keypad-compatible.patch create mode 100644 queue-5.10/arm-dts-imx6ul-fix-lcdif-node-compatible.patch create mode 100644 queue-5.10/arm-dts-imx6ul-fix-qspi-node-compatible.patch create mode 100644 queue-5.10/arm-dts-imx7d-colibri-emmc-add-cpu1-supply.patch create mode 100644 queue-5.10/arm-dts-qcom-mdm9615-add-missing-pmic-gpio-reg.patch create mode 100644 queue-5.10/arm-dts-qcom-pm8841-add-required-thermal-sensor-cell.patch create mode 100644 queue-5.10/arm-findbit-fix-overflowing-offset.patch create mode 100644 queue-5.10/arm-omap2-display-fix-refcount-leak-bug.patch create mode 100644 queue-5.10/arm-omap2-fix-refcount-leak-in-omap3xxx_prm_late_ini.patch create mode 100644 queue-5.10/arm-omap2-fix-refcount-leak-in-omapdss_init_of.patch create mode 100644 queue-5.10/arm-shmobile-rcar-gen2-increase-refcount-for-new-ref.patch create mode 100644 queue-5.10/arm64-cpufeature-allow-different-pmu-versions-in-id_.patch create mode 100644 queue-5.10/arm64-do-not-forget-syscall-when-starting-a-new-thre.patch create mode 100644 queue-5.10/arm64-dts-allwinner-a64-orangepi-win-fix-led-node-na.patch create mode 100644 queue-5.10/arm64-dts-mt7622-fix-bpi-r64-wps-button.patch create mode 100644 queue-5.10/arm64-dts-qcom-ipq8074-fix-nand-node-name.patch create mode 100644 queue-5.10/arm64-dts-qcom-msm8916-fix-typo-in-pronto-remoteproc.patch create mode 100644 queue-5.10/arm64-dts-qcom-msm8916-use-power-domains-for-mss-wcn.patch create mode 100644 queue-5.10/arm64-dts-qcom-qcs404-fix-incorrect-usb2-phys-assign.patch create mode 100644 queue-5.10/arm64-dts-renesas-beacon-fix-regulator-node-names.patch create mode 100644 queue-5.10/arm64-dts-renesas-fix-thermal-sensors-on-single-zone.patch create mode 100644 queue-5.10/arm64-fix-oops-in-concurrently-setting-insn_emulatio.patch create mode 100644 queue-5.10/arm64-tegra-fix-sdmmc1-cd-on-p2888.patch create mode 100644 queue-5.10/asoc-audio-graph-card-add-of_node_put-in-fail-path.patch create mode 100644 queue-5.10/asoc-codecs-da7210-add-check-for-i2c_add_driver.patch create mode 100644 queue-5.10/asoc-codecs-msm8916-wcd-digital-move-gains-from-sx_t.patch create mode 100644 queue-5.10/asoc-codecs-wcd9335-move-gains-from-sx_tlv-to-s8_tlv.patch create mode 100644 queue-5.10/asoc-cros_ec_codec-fix-refcount-leak-in-cros_ec_code.patch create mode 100644 queue-5.10/asoc-fsl_easrc-use-snd_pcm_format_t-type-for-sample_.patch create mode 100644 queue-5.10/asoc-mchp-spdifrx-disable-end-of-block-interrupt-on-.patch create mode 100644 queue-5.10/asoc-mediatek-mt8173-fix-refcount-leak-in-mt8173_rt5.patch create mode 100644 queue-5.10/asoc-mediatek-mt8173-rt5650-fix-refcount-leak-in-mt8.patch create mode 100644 queue-5.10/asoc-mt6797-mt6351-fix-refcount-leak-in-mt6797_mt635.patch create mode 100644 queue-5.10/asoc-qcom-fix-missing-of_node_put-in-asoc_qcom_lpass.patch create mode 100644 queue-5.10/asoc-qcom-q6dsp-fix-an-off-by-one-in-q6adm_alloc_cop.patch create mode 100644 queue-5.10/asoc-samsung-change-gpiod_speaker_power-and-rx1950_a.patch create mode 100644 queue-5.10/asoc-samsung-fix-error-handling-in-aries_audio_probe.patch create mode 100644 queue-5.10/asoc-samsung-h1940_uda1380-include-proepr-gpio-consu.patch create mode 100644 queue-5.10/ath10k-do-not-enforce-interrupt-trigger-type.patch create mode 100644 queue-5.10/ath11k-fix-incorrect-debug_mask-mappings.patch create mode 100644 queue-5.10/ath11k-fix-netdev-open-race.patch create mode 100644 queue-5.10/ath9k-fix-use-after-free-in-ath9k_hif_usb_rx_cb.patch create mode 100644 queue-5.10/blk-mq-don-t-create-hctx-debugfs-dir-until-q-debugfs.patch create mode 100644 queue-5.10/blktrace-trace-remapped-requests-correctly.patch create mode 100644 queue-5.10/block-fix-infinite-loop-for-invalid-zone-append.patch create mode 100644 queue-5.10/block-remove-the-request_queue-to-argument-request-b.patch create mode 100644 queue-5.10/bluetooth-hci_intel-add-check-for-platform_driver_re.patch create mode 100644 queue-5.10/bpf-fix-subprog-names-in-stack-traces.patch create mode 100644 queue-5.10/bus-hisi_lpc-fix-missing-platform_device_put-in-hisi.patch create mode 100644 queue-5.10/can-error-specify-the-values-of-data-5.7-of-can-erro.patch create mode 100644 queue-5.10/can-hi311x-do-not-report-txerr-and-rxerr-during-bus-.patch create mode 100644 queue-5.10/can-kvaser_usb_hydra-do-not-report-txerr-and-rxerr-d.patch create mode 100644 queue-5.10/can-kvaser_usb_leaf-do-not-report-txerr-and-rxerr-du.patch create mode 100644 queue-5.10/can-pch_can-do-not-report-txerr-and-rxerr-during-bus.patch create mode 100644 queue-5.10/can-pch_can-pch_can_error-initialize-errc-before-usi.patch create mode 100644 queue-5.10/can-rcar_can-do-not-report-txerr-and-rxerr-during-bu.patch create mode 100644 queue-5.10/can-sja1000-do-not-report-txerr-and-rxerr-during-bus.patch create mode 100644 queue-5.10/can-sun4i_can-do-not-report-txerr-and-rxerr-during-b.patch create mode 100644 queue-5.10/can-usb_8dev-do-not-report-txerr-and-rxerr-during-bu.patch create mode 100644 queue-5.10/clk-mediatek-reset-fix-written-reset-bit-offset.patch create mode 100644 queue-5.10/clk-qcom-camcc-sdm845-fix-topology-around-titan_top-.patch create mode 100644 queue-5.10/clk-qcom-clk-krait-unlock-spin-after-mux-completion.patch create mode 100644 queue-5.10/clk-qcom-gcc-msm8939-add-missing-system_mm_noc_bfdcd.patch create mode 100644 queue-5.10/clk-qcom-gcc-msm8939-add-missing-system_mm_noc_bfdcd.patch-4005 create mode 100644 queue-5.10/clk-qcom-gcc-msm8939-fix-bimc_ddr_clk_src-rcgr-base-.patch create mode 100644 queue-5.10/clk-qcom-gcc-msm8939-fix-weird-field-spacing-in-ftbl.patch create mode 100644 queue-5.10/clk-qcom-gcc-msm8939-point-mm-peripherals-to-system_.patch create mode 100644 queue-5.10/clk-qcom-ipq8074-fix-nss-core-pll-s.patch create mode 100644 queue-5.10/clk-qcom-ipq8074-fix-nss-port-frequency-tables.patch create mode 100644 queue-5.10/clk-qcom-ipq8074-set-branch_halt_delay-flag-for-ubi-.patch create mode 100644 queue-5.10/clk-qcom-ipq8074-sw-workaround-for-ubi32-pll-lock.patch create mode 100644 queue-5.10/clk-renesas-r9a06g032-fix-uart-clkgrp-bitsel.patch create mode 100644 queue-5.10/cpufreq-zynq-fix-refcount-leak-in-zynq_get_revision.patch create mode 100644 queue-5.10/crypto-arm64-gcm-select-aead-for-ghash_arm64_ce.patch create mode 100644 queue-5.10/crypto-ccp-during-shutdown-check-sev-data-pointer-be.patch create mode 100644 queue-5.10/crypto-hisilicon-hpre-don-t-use-gfp_kernel-to-alloc-.patch create mode 100644 queue-5.10/crypto-hisilicon-kunpeng916-crypto-driver-don-t-slee.patch create mode 100644 queue-5.10/crypto-hisilicon-sec-don-t-sleep-when-in-softirq.patch create mode 100644 queue-5.10/crypto-hisilicon-sec-fix-auth-key-size-error.patch create mode 100644 queue-5.10/crypto-hisilicon-sec-fixes-some-coding-style.patch create mode 100644 queue-5.10/crypto-inside-secure-add-missing-module_device_table.patch create mode 100644 queue-5.10/crypto-sun8i-ss-do-not-allocate-memory-when-handling.patch create mode 100644 queue-5.10/crypto-sun8i-ss-fix-error-codes-in-allocate_flows.patch create mode 100644 queue-5.10/crypto-sun8i-ss-fix-infinite-loop-in-sun8i_ss_setup_.patch create mode 100644 queue-5.10/dccp-put-dccp_qpolicy_full-and-dccp_qpolicy_push-in-.patch create mode 100644 queue-5.10/dm-return-early-from-dm_pr_call-if-dm-device-is-susp.patch create mode 100644 queue-5.10/dmaengine-dw-edma-fix-edma-rd-wr-channels-and-dma-di.patch create mode 100644 queue-5.10/dmaengine-sf-pdma-add-multithread-support-for-a-dma-.patch create mode 100644 queue-5.10/dmaengine-sf-pdma-apply-proper-spinlock-flags-in-sf_.patch create mode 100644 queue-5.10/driver-core-fix-potential-deadlock-in-__driver_attac.patch create mode 100644 queue-5.10/drivers-perf-arm_spe-fix-consistency-of-sys_pmscr_el.patch create mode 100644 queue-5.10/drm-adv7511-override-i2c-address-of-cec-before-acces.patch create mode 100644 queue-5.10/drm-bridge-adv7511-add-check-for-mipi_dsi_driver_reg.patch create mode 100644 queue-5.10/drm-bridge-sii8620-fix-possible-off-by-one.patch create mode 100644 queue-5.10/drm-bridge-tc358767-make-sure-refclk-clock-are-enabl.patch create mode 100644 queue-5.10/drm-bridge-tc358767-move-e-dp-bridge-endpoint-parsin.patch create mode 100644 queue-5.10/drm-exynos-exynos7_drm_decon-free-resources-when-clk.patch create mode 100644 queue-5.10/drm-mcde-fix-refcount-leak-in-mcde_dsi_bind.patch create mode 100644 queue-5.10/drm-mediatek-add-pull-down-mipi-operation-in-mtk_dsi.patch create mode 100644 queue-5.10/drm-mediatek-dpi-only-enable-dpi-after-the-bridge-is.patch create mode 100644 queue-5.10/drm-mediatek-dpi-remove-output-format-of-yuv.patch create mode 100644 queue-5.10/drm-mediatek-modify-dsi-funcs-to-atomic-operations.patch create mode 100644 queue-5.10/drm-mediatek-separate-poweron-poweroff-from-enable-d.patch create mode 100644 queue-5.10/drm-mipi-dbi-align-max_chunk-to-2-in-spi_transfer.patch create mode 100644 queue-5.10/drm-msm-hdmi-enable-core-vcc-core-vdda-supply-for-89.patch create mode 100644 queue-5.10/drm-msm-mdp5-fix-global-state-lock-backoff.patch create mode 100644 queue-5.10/drm-radeon-fix-incorrrect-spdx-license-identifiers.patch create mode 100644 queue-5.10/drm-radeon-fix-potential-buffer-overflow-in-ni_set_m.patch create mode 100644 queue-5.10/drm-rockchip-fix-an-error-handling-path-rockchip_dp_.patch create mode 100644 queue-5.10/drm-rockchip-vop-don-t-crash-for-invalid-duplicate_s.patch create mode 100644 queue-5.10/drm-st7735r-fix-module-autoloading-for-okaya-rh12812.patch create mode 100644 queue-5.10/drm-vc4-drv-remove-the-dsi-pointer-in-vc4_drv.patch create mode 100644 queue-5.10/drm-vc4-dsi-add-correct-stop-condition-to-vc4_dsi_en.patch create mode 100644 queue-5.10/drm-vc4-dsi-correct-dsi-divider-calculations.patch create mode 100644 queue-5.10/drm-vc4-dsi-correct-pixel-order-for-dsi0.patch create mode 100644 queue-5.10/drm-vc4-dsi-fix-dsi0-interrupt-support.patch create mode 100644 queue-5.10/drm-vc4-dsi-introduce-a-variant-structure.patch create mode 100644 queue-5.10/drm-vc4-dsi-register-dsi0-as-the-correct-vc4-encoder.patch create mode 100644 queue-5.10/drm-vc4-dsi-use-snprintf-for-the-phy-clocks-instead-.patch create mode 100644 queue-5.10/drm-vc4-hdmi-avoid-full-hdmi-audio-fifo-writes.patch create mode 100644 queue-5.10/drm-vc4-hdmi-correct-hdmi-timing-registers-for-inter.patch create mode 100644 queue-5.10/drm-vc4-hdmi-create-a-custom-connector-state.patch create mode 100644 queue-5.10/drm-vc4-hdmi-don-t-access-the-connector-state-in-res.patch create mode 100644 queue-5.10/drm-vc4-hdmi-fix-timings-for-interlaced-modes.patch create mode 100644 queue-5.10/drm-vc4-hdmi-limit-the-bcm2711-to-the-max-without-sc.patch create mode 100644 queue-5.10/drm-vc4-hdmi-remove-firmware-logic-for-mai-threshold.patch create mode 100644 queue-5.10/drm-vc4-plane-fix-margin-calculations-for-the-right-.patch create mode 100644 queue-5.10/drm-vc4-plane-remove-subpixel-positioning-check.patch create mode 100644 queue-5.10/dt-bindings-update-qcom-usb-subsystem-maintainer-inf.patch create mode 100644 queue-5.10/eeprom-idt_89hpesx-uninitialized-data-in-idt_dbgfs_c.patch create mode 100644 queue-5.10/erofs-avoid-consecutive-detection-for-highmem-memory.patch create mode 100644 queue-5.10/ext2-add-more-validity-checks-for-inode-counts.patch create mode 100644 queue-5.10/ext4-recover-csum-seed-of-tmp_inode-after-migrating-.patch create mode 100644 queue-5.10/f2fs-don-t-set-gc_failure_pin-for-background-gc.patch create mode 100644 queue-5.10/f2fs-fix-to-remove-f2fs_compr_fl-and-tag-f2fs_nocomp.patch create mode 100644 queue-5.10/f2fs-write-checkpoint-during-fg_gc.patch create mode 100644 queue-5.10/firmware-tegra-fix-error-check-return-value-of-debug.patch create mode 100644 queue-5.10/fpga-altera-pr-ip-fix-unsigned-comparison-with-less-.patch create mode 100644 queue-5.10/fs-check-fmode_lseek-to-control-internal-pipe-splici.patch create mode 100644 queue-5.10/fuse-remove-the-control-interface-for-virtio-fs.patch create mode 100644 queue-5.10/genelf-use-have_libcrypto_support-not-the-never-defi.patch create mode 100644 queue-5.10/genirq-don-t-return-error-on-missing-optional-irq_re.patch create mode 100644 queue-5.10/genirq-generic_irq_ipi-depends-on-smp.patch create mode 100644 queue-5.10/gpio-gpiolib-of-fix-refcount-bugs-in-of_mm_gpiochip_.patch create mode 100644 queue-5.10/hexagon-select-arch_want_ld_orphan_warn.patch create mode 100644 queue-5.10/hid-alps-declare-u1_unicorn_legacy-support.patch create mode 100644 queue-5.10/hid-cp2112-prevent-a-buffer-overflow-in-cp2112_xfer.patch create mode 100644 queue-5.10/hid-mcp2221-prevent-a-buffer-overflow-in-mcp_smbus_w.patch create mode 100644 queue-5.10/hinic-use-the-bitmap-api-when-applicable.patch create mode 100644 queue-5.10/hwmon-drivetemp-add-module-alias.patch create mode 100644 queue-5.10/hwmon-sht15-fix-wrong-assumptions-in-device-remove-c.patch create mode 100644 queue-5.10/i2c-cadence-support-pec-for-smbus-block-read.patch create mode 100644 queue-5.10/i2c-fix-a-potential-use-after-free.patch create mode 100644 queue-5.10/i2c-mux-gpmux-add-of_node_put-when-breaking-out-of-l.patch create mode 100644 queue-5.10/i2c-npcm-correct-slave-role-behavior.patch create mode 100644 queue-5.10/i2c-npcm-remove-own-slave-addresses-2-10.patch create mode 100644 queue-5.10/iavf-fix-max_rate-limiting.patch create mode 100644 queue-5.10/iio-accel-bma400-fix-the-scale-min-and-max-macro-val.patch create mode 100644 queue-5.10/iio-accel-bma400-reordering-of-header-files.patch create mode 100644 queue-5.10/inet-add-read_once-sk-sk_bound_dev_if-in-inet_match.patch create mode 100644 queue-5.10/input-atmel_mxt_ts-fix-up-inverted-reset-handler.patch create mode 100644 queue-5.10/intel_th-fix-a-resource-leak-in-an-error-handling-pa.patch create mode 100644 queue-5.10/intel_th-msu-fix-vmalloced-buffers.patch create mode 100644 queue-5.10/intel_th-msu-sink-potential-dereference-of-null-poin.patch create mode 100644 queue-5.10/interconnect-imx-fix-max_node_id.patch create mode 100644 queue-5.10/iommu-arm-smmu-qcom_iommu-add-of_node_put-when-break.patch create mode 100644 queue-5.10/iommu-exynos-handle-failed-iommu-device-registration.patch create mode 100644 queue-5.10/ipv6-add-read_once-sk-sk_bound_dev_if-in-inet6_match.patch create mode 100644 queue-5.10/irqchip-mips-gic-check-the-return-value-of-ioremap-i.patch create mode 100644 queue-5.10/irqchip-mips-gic-only-register-ipi-domain-when-smp-i.patch create mode 100644 queue-5.10/jbd2-fix-assertion-jh-b_frozen_data-null-failure-whe.patch create mode 100644 queue-5.10/jbd2-fix-outstanding-credits-assert-in-jbd2_journal_.patch create mode 100644 queue-5.10/kfifo-fix-kfifo_to_user-return-type.patch create mode 100644 queue-5.10/kprobes-forbid-probing-on-trampoline-and-bpf-code-ar.patch create mode 100644 queue-5.10/kvm-arm64-don-t-return-from-void-function.patch create mode 100644 queue-5.10/kvm-don-t-set-accessed-dirty-bits-for-zero_page.patch create mode 100644 queue-5.10/kvm-s390-pv-leak-the-topmost-page-table-when-destroy.patch create mode 100644 queue-5.10/lib-bitmap-order-includes-alphabetically.patch create mode 100644 queue-5.10/lib-bitmap-provide-devm_bitmap_alloc-and-devm_bitmap.patch create mode 100644 queue-5.10/lib-smp_processor_id-fix-imbalanced-instrumentation_.patch create mode 100644 queue-5.10/libbpf-fix-the-name-of-a-reused-map.patch create mode 100644 queue-5.10/locking-lockdep-fix-lockdep_init_map_-confusion.patch create mode 100644 queue-5.10/media-cedrus-hevc-add-check-for-invalid-timestamp.patch create mode 100644 queue-5.10/media-hdpvr-fix-error-value-returns-in-hdpvr_read.patch create mode 100644 queue-5.10/media-platform-mtk-mdp-fix-mdp_ipi_comm-structure-al.patch create mode 100644 queue-5.10/media-tw686x-fix-memory-leak-in-tw686x_video_init.patch create mode 100644 queue-5.10/media-tw686x-register-the-irq-at-the-end-of-probe.patch create mode 100644 queue-5.10/media-v4l2-mem2mem-prevent-pollerr-when-last_buffer_.patch create mode 100644 queue-5.10/mediatek-mt76-mac80211-fix-missing-of_node_put-in-mt.patch create mode 100644 queue-5.10/memstick-ms_block-fix-a-memory-leak.patch create mode 100644 queue-5.10/memstick-ms_block-fix-some-incorrect-memory-allocati.patch create mode 100644 queue-5.10/meson-mx-socinfo-fix-refcount-leak-in-meson_mx_socin.patch create mode 100644 queue-5.10/mfd-max77620-fix-refcount-leak-in-max77620_initialis.patch create mode 100644 queue-5.10/mfd-t7l66xb-drop-platform-disable-callback.patch create mode 100644 queue-5.10/misc-rtsx-fix-an-error-handling-path-in-rtsx_pci_pro.patch create mode 100644 queue-5.10/mm-mmap.c-fix-missing-call-to-vm_unacct_memory-in-mm.patch create mode 100644 queue-5.10/mmc-block-add-single-read-for-4k-sector-cards.patch create mode 100644 queue-5.10/mmc-cavium-octeon-add-of_node_put-when-breaking-out-.patch create mode 100644 queue-5.10/mmc-cavium-thunderx-add-of_node_put-when-breaking-ou.patch create mode 100644 queue-5.10/mmc-sdhci-of-at91-fix-set_uhs_signaling-rewriting-of.patch create mode 100644 queue-5.10/mmc-sdhci-of-esdhc-fix-refcount-leak-in-esdhc_signal.patch create mode 100644 queue-5.10/mt76-mt76x02u-fix-possible-memory-leak-in-__mt76x02u.patch create mode 100644 queue-5.10/mtd-maps-fix-refcount-leak-in-ap_flash_init.patch create mode 100644 queue-5.10/mtd-maps-fix-refcount-leak-in-of_flash_probe_versati.patch create mode 100644 queue-5.10/mtd-partitions-fix-refcount-leak-in-parse_redboot_of.patch create mode 100644 queue-5.10/mtd-rawnand-meson-fix-a-potential-double-free-issue.patch create mode 100644 queue-5.10/mtd-sm_ftl-fix-deadlock-caused-by-cancel_work_sync-i.patch create mode 100644 queue-5.10/mtd-st_spi_fsm-add-a-clk_disable_unprepare-in-.probe.patch create mode 100644 queue-5.10/mwifiex-fix-sleep-in-atomic-context-bugs-caused-by-d.patch create mode 100644 queue-5.10/mwifiex-ignore-btcoex-events-from-the-88w8897-firmwa.patch create mode 100644 queue-5.10/net-allow-unbound-socket-for-packets-in-vrf-when-tcp.patch create mode 100644 queue-5.10/net-fix-sk_wmem_schedule-and-sk_rmem_schedule-errors.patch create mode 100644 queue-5.10/net-hinic-avoid-kernel-hung-in-hinic_get_stats64.patch create mode 100644 queue-5.10/net-hinic-fix-bug-that-ethtool-get-wrong-stats.patch create mode 100644 queue-5.10/net-ionic-fix-error-check-for-vlan-flags-in-ionic_se.patch create mode 100644 queue-5.10/net-mlx5e-fix-the-value-of-mlx5e_max_rq_num_mtts.patch create mode 100644 queue-5.10/net-mlx5e-remove-warn_on-when-trying-to-offload-an-u.patch create mode 100644 queue-5.10/net-rose-fix-netdev-reference-changes.patch create mode 100644 queue-5.10/netdevsim-avoid-allocation-warnings-triggered-from-u.patch create mode 100644 queue-5.10/netfilter-nf_tables-add-rescheduling-points-during-l.patch create mode 100644 queue-5.10/netfilter-xtables-bring-spdx-identifier-back.patch create mode 100644 queue-5.10/nohz-full-sched-rt-fix-missed-tick-reenabling-bug-in.patch create mode 100644 queue-5.10/null_blk-fix-ida-error-handling-in-null_add_dev.patch create mode 100644 queue-5.10/nvme-use-command_id-instead-of-req-tag-in-trace_nvme.patch create mode 100644 queue-5.10/opp-fix-error-check-in-dev_pm_opp_attach_genpd.patch create mode 100644 queue-5.10/pci-dwc-add-unroll-iatu-space-support-to-dw_pcie_dis.patch create mode 100644 queue-5.10/pci-dwc-always-enable-cdm-check-if-snps-enable-cdm-c.patch create mode 100644 queue-5.10/pci-dwc-deallocate-epc-memory-on-dw_pcie_ep_init-err.patch create mode 100644 queue-5.10/pci-endpoint-don-t-stop-controller-when-unbinding-en.patch create mode 100644 queue-5.10/pci-portdrv-don-t-disable-aer-reporting-in-get_port_.patch create mode 100644 queue-5.10/pci-qcom-set-up-rev-2.1.0-parf_phy-before-enabling-c.patch create mode 100644 queue-5.10/pci-tegra194-fix-link-up-retry-sequence.patch create mode 100644 queue-5.10/pci-tegra194-fix-pm-error-handling-in-tegra_pcie_con.patch create mode 100644 queue-5.10/pci-tegra194-fix-root-port-interrupt-handling.patch create mode 100644 queue-5.10/perf-symbol-fail-to-read-phdr-workaround.patch create mode 100644 queue-5.10/perf-tools-fix-dso_id-inode-generation-comparison.patch create mode 100644 queue-5.10/platform-chrome-cros_ec-always-expose-last-resume-re.patch create mode 100644 queue-5.10/platform-olpc-fix-uninitialized-data-in-debugfs-writ.patch create mode 100644 queue-5.10/pm-hibernate-defer-device-probing-when-resuming-from.patch create mode 100644 queue-5.10/powerpc-32-do-not-allow-selection-of-e5500-or-e6500-.patch create mode 100644 queue-5.10/powerpc-64s-disable-stack-variable-initialisation-fo.patch create mode 100644 queue-5.10/powerpc-cell-axon_msi-fix-refcount-leak-in-setup_msi.patch create mode 100644 queue-5.10/powerpc-pci-fix-phb-numbering-when-using-opal-phbid.patch create mode 100644 queue-5.10/powerpc-pci-prefer-pci-domain-assignment-via-dt-linu.patch create mode 100644 queue-5.10/powerpc-perf-optimize-clearing-the-pending-pmi-and-r.patch create mode 100644 queue-5.10/powerpc-spufs-fix-refcount-leak-in-spufs_init_isolat.patch create mode 100644 queue-5.10/powerpc-xive-fix-refcount-leak-in-xive_get_max_prio.patch create mode 100644 queue-5.10/profiling-fix-shift-too-large-makes-kernel-panic.patch create mode 100644 queue-5.10/pwm-ab8500-explicitly-allocate-pwm-chip-base-dynamic.patch create mode 100644 queue-5.10/pwm-lpc18xx-sct-convert-to-devm_platform_ioremap_res.patch create mode 100644 queue-5.10/pwm-sifive-don-t-check-the-return-code-of-pwmchip_re.patch create mode 100644 queue-5.10/pwm-sifive-ensure-the-clk-is-enabled-exactly-once-pe.patch create mode 100644 queue-5.10/pwm-sifive-shut-down-hardware-only-after-pwmchip_rem.patch create mode 100644 queue-5.10/pwm-sifive-simplify-offset-calculation-for-pwmcmp-re.patch create mode 100644 queue-5.10/rdma-hfi1-fix-potential-memory-leak-in-setup_base_ct.patch create mode 100644 queue-5.10/rdma-hns-fix-incorrect-clearing-of-interrupt-status-.patch create mode 100644 queue-5.10/rdma-mlx5-add-missing-check-for-return-value-in-get-.patch create mode 100644 queue-5.10/rdma-qedr-fix-potential-memory-leak-in-__qedr_alloc_.patch create mode 100644 queue-5.10/rdma-qedr-improve-error-logs-for-rdma_alloc_tid-erro.patch create mode 100644 queue-5.10/rdma-rtrs-avoid-wtautological-constant-out-of-range-.patch create mode 100644 queue-5.10/rdma-rtrs-define-min_chunk_size.patch create mode 100644 queue-5.10/rdma-rtrs-srv-fix-modinfo-output-for-stringify.patch create mode 100644 queue-5.10/rdma-rxe-fix-error-unwind-in-rxe_create_qp.patch create mode 100644 queue-5.10/rdma-siw-fix-duplicated-reported-iw_cm_event_connect.patch create mode 100644 queue-5.10/rdma-srpt-duplicate-port-name-members.patch create mode 100644 queue-5.10/rdma-srpt-fix-a-use-after-free.patch create mode 100644 queue-5.10/rdma-srpt-introduce-a-reference-count-in-struct-srpt.patch create mode 100644 queue-5.10/regulator-of-fix-refcount-leak-bug-in-of_get_regulat.patch create mode 100644 queue-5.10/regulator-qcom_smd-fix-pm8916_pldo-range.patch create mode 100644 queue-5.10/remoteproc-k3-r5-fix-refcount-leak-in-k3_r5_cluster_.patch create mode 100644 queue-5.10/remoteproc-qcom-wcnss-fix-handling-of-irqs.patch create mode 100644 queue-5.10/remoteproc-sysmon-wait-for-ssctl-service-to-come-up.patch create mode 100644 queue-5.10/rpmsg-mtk_rpmsg-fix-circular-locking-dependency.patch create mode 100644 queue-5.10/rpmsg-qcom_smd-fix-refcount-leak-in-qcom_smd_parse_e.patch create mode 100644 queue-5.10/s390-dump-fix-old-lowcore-virtual-vs-physical-addres.patch create mode 100644 queue-5.10/s390-zcore-fix-race-when-reading-from-hardware-syste.patch create mode 100644 queue-5.10/sched-cpuset-fix-dl_cpu_busy-panic-due-to-empty-cs-c.patch create mode 100644 queue-5.10/sched-deadline-merge-dl_task_can_attach-and-dl_cpu_b.patch create mode 100644 queue-5.10/sched-fix-the-check-of-nr_running-at-queue-wakelist.patch create mode 100644 queue-5.10/scripts-faddr2line-fix-vmlinux-detection-on-arm64.patch create mode 100644 queue-5.10/scsi-smartpqi-fix-dma-direction-for-raid-requests.patch create mode 100644 queue-5.10/selftests-bpf-fix-a-test-for-snprintf-overflow.patch create mode 100644 queue-5.10/selftests-kvm-set-rax-before-vmcall.patch create mode 100644 queue-5.10/selftests-livepatch-better-synchronize-test_klp_call.patch create mode 100644 queue-5.10/selftests-seccomp-fix-compile-warning-when-cc-clang.patch create mode 100644 queue-5.10/selftests-timers-clocksource-switch-fix-passing-erro.patch create mode 100644 queue-5.10/selftests-timers-valid-adjtimex-build-fix-for-newer-.patch create mode 100644 queue-5.10/selftests-xsk-destroy-bpf-resources-only-when-ctx-re.patch create mode 100644 queue-5.10/selinux-add-boundary-check-in-put_entry.patch create mode 100644 queue-5.10/serial-8250-export-icr-access-helpers-for-internal-u.patch create mode 100644 queue-5.10/serial-8250_dw-store-lsr-into-lsr_saved_flags-in-dw8.patch create mode 100644 queue-5.10/serial-8250_fsl-don-t-report-fe-pe-and-oe-twice.patch create mode 100644 queue-5.10/serial-do-not-restore-interrupt-state-in-sysrq-helpe.patch create mode 100644 queue-5.10/soc-amlogic-fix-refcount-leak-in-meson-secure-pwrc.c.patch create mode 100644 queue-5.10/soc-fsl-guts-machine-variable-might-be-unset.patch create mode 100644 queue-5.10/soc-qcom-aoss-fix-refcount-leak-in-qmp_cooling_devic.patch create mode 100644 queue-5.10/soc-qcom-make-qcom_rpmpd-depend-on-pm.patch create mode 100644 queue-5.10/soc-qcom-ocmem-fix-refcount-leak-in-of_get_ocmem.patch create mode 100644 queue-5.10/soc-renesas-r8a779a0-sysc-fix-a2dp1-and-a2cv-2357-pd.patch create mode 100644 queue-5.10/soundwire-bus_type-fix-remove-and-shutdown-support.patch create mode 100644 queue-5.10/spi-spi-rspi-fix-pio-fallback-on-rz-platforms.patch create mode 100644 queue-5.10/spi-synquacer-add-missing-clk_disable_unprepare.patch create mode 100644 queue-5.10/staging-rtl8192u-fix-sleep-in-atomic-context-bug-in-.patch create mode 100644 queue-5.10/tcp-fix-data-races-around-sysctl_tcp_l3mdev_accept.patch create mode 100644 queue-5.10/tcp-make-retransmitted-skb-fit-into-the-send-window.patch create mode 100644 queue-5.10/tcp-sk-sk_bound_dev_if-once-in-inet_request_bound_de.patch create mode 100644 queue-5.10/test_bpf-fix-incorrect-netdev-features.patch create mode 100644 queue-5.10/thermal-tools-tmon-include-pthread-and-time-headers-.patch create mode 100644 queue-5.10/tools-thermal-fix-possible-path-truncations.patch create mode 100644 queue-5.10/tty-n_gsm-delete-gsmtty-open-sabm-frame-when-config-.patch create mode 100644 queue-5.10/tty-n_gsm-fix-dm-command.patch create mode 100644 queue-5.10/tty-n_gsm-fix-missing-corner-cases-in-gsmld_poll.patch create mode 100644 queue-5.10/tty-n_gsm-fix-non-flow-control-frames-during-mux-flo.patch create mode 100644 queue-5.10/tty-n_gsm-fix-packet-re-transmission-without-open-co.patch create mode 100644 queue-5.10/tty-n_gsm-fix-race-condition-in-gsmld_write.patch create mode 100644 queue-5.10/tty-n_gsm-fix-user-open-not-possible-at-responder-un.patch create mode 100644 queue-5.10/tty-n_gsm-fix-wrong-queuing-behavior-in-gsm_dlci_dat.patch create mode 100644 queue-5.10/tty-n_gsm-fix-wrong-t1-retry-count-handling.patch create mode 100644 queue-5.10/um-random-don-t-initialise-hwrng-struct-with-zero.patch create mode 100644 queue-5.10/usb-aspeed-vhub-fix-refcount-leak-bug-in-ast_vhub_in.patch create mode 100644 queue-5.10/usb-cdns3-change-place-of-priv_ep-assignment-in-cdns.patch create mode 100644 queue-5.10/usb-cdns3-don-t-use-priv_dev-uninitialized-in-cdns3_.patch create mode 100644 queue-5.10/usb-dwc3-core-deprecate-gctl.coresoftreset.patch create mode 100644 queue-5.10/usb-dwc3-core-do-not-perform-gctl_core_softreset-dur.patch create mode 100644 queue-5.10/usb-dwc3-qcom-fix-missing-optional-irq-warnings.patch create mode 100644 queue-5.10/usb-gadget-tegra-xudc-fix-error-check-in-tegra_xudc_.patch create mode 100644 queue-5.10/usb-gadget-udc-amd5536-depends-on-has_dma.patch create mode 100644 queue-5.10/usb-host-fix-refcount-leak-in-ehci_hcd_ppc_of_probe.patch create mode 100644 queue-5.10/usb-host-xhci-use-snprintf-in-xhci_decode_trb.patch create mode 100644 queue-5.10/usb-ohci-nxp-fix-refcount-leak-in-ohci_hcd_nxp_probe.patch create mode 100644 queue-5.10/usb-serial-fix-tty-port-initialized-comments.patch create mode 100644 queue-5.10/usb-xhci-tegra-fix-error-check.patch create mode 100644 queue-5.10/vfio-ccw-do-not-change-fsm-state-in-subchannel-event.patch create mode 100644 queue-5.10/vfio-mdev-make-to_mdev_device-into-a-static-inline.patch create mode 100644 queue-5.10/vfio-remove-extra-put-gets-around-vfio_device-group.patch create mode 100644 queue-5.10/vfio-simplify-the-lifetime-logic-for-vfio_device.patch create mode 100644 queue-5.10/vfio-split-creation-of-a-vfio_device-into-init-and-r.patch create mode 100644 queue-5.10/video-fbdev-amba-clcd-fix-refcount-leak-bugs.patch create mode 100644 queue-5.10/video-fbdev-arkfb-check-the-size-of-screen-before-me.patch create mode 100644 queue-5.10/video-fbdev-arkfb-fix-a-divide-by-zero-bug-in-ark_se.patch create mode 100644 queue-5.10/video-fbdev-s3fb-check-the-size-of-screen-before-mem.patch create mode 100644 queue-5.10/video-fbdev-sis-fix-typos-in-sis_getmodeid.patch create mode 100644 queue-5.10/video-fbdev-vt8623fb-check-the-size-of-screen-before.patch create mode 100644 queue-5.10/virtio-gpu-fix-a-missing-check-to-avoid-null-derefer.patch create mode 100644 queue-5.10/wait-fix-__wait_event_hrtimeout-for-rt-dl-tasks.patch create mode 100644 queue-5.10/watchdog-armada_37xx_wdt-check-the-return-value-of-d.patch create mode 100644 queue-5.10/wifi-iwlegacy-4965-fix-potential-off-by-one-overflow.patch create mode 100644 queue-5.10/wifi-iwlwifi-mvm-fix-double-list_add-at-iwl_mvm_mac_.patch create mode 100644 queue-5.10/wifi-libertas-fix-possible-refcount-leak-in-if_usb_p.patch create mode 100644 queue-5.10/wifi-p54-add-missing-parentheses-in-p54_flush.patch create mode 100644 queue-5.10/wifi-p54-fix-an-error-handling-path-in-p54spi_probe.patch create mode 100644 queue-5.10/wifi-rtlwifi-fix-error-codes-in-rtl_debugfs_set_writ.patch create mode 100644 queue-5.10/wifi-wil6210-debugfs-fix-info-leak-in-wil_write_file.patch create mode 100644 queue-5.10/wifi-wil6210-debugfs-fix-uninitialized-variable-use-.patch create mode 100644 queue-5.10/wireguard-allowedips-don-t-corrupt-stack-when-detect.patch create mode 100644 queue-5.10/wireguard-ratelimiter-use-hrtimer-in-selftest.patch create mode 100644 queue-5.10/x86-entry-build-thunk_-bits-only-if-config_preemptio.patch create mode 100644 queue-5.10/x86-handle-idle-nomwait-cmdline-properly-for-x86_idl.patch create mode 100644 queue-5.10/x86-numa-use-cpumask_available-instead-of-hardcoded-.patch create mode 100644 queue-5.10/x86-pmem-fix-platform-device-leak-in-error-path.patch create mode 100644 queue-5.10/xtensa-iss-fix-handling-error-cases-in-iss_net_confi.patch create mode 100644 queue-5.10/xtensa-iss-network-provide-release-callback.patch diff --git a/queue-5.10/acpi-apei-fix-_einj-vs-efi_memory_sp.patch b/queue-5.10/acpi-apei-fix-_einj-vs-efi_memory_sp.patch new file mode 100644 index 00000000000..98543ab0527 --- /dev/null +++ b/queue-5.10/acpi-apei-fix-_einj-vs-efi_memory_sp.patch @@ -0,0 +1,41 @@ +From c285ecce5f21fd8f40a3aee206cbddc41c25545c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Jun 2022 16:05:26 -0700 +Subject: ACPI: APEI: Fix _EINJ vs EFI_MEMORY_SP + +From: Dan Williams + +[ Upstream commit b13a3e5fd40b7d1b394c5ecbb5eb301a4c38e7b2 ] + +When a platform marks a memory range as "special purpose" it is not +onlined as System RAM by default. However, it is still suitable for +error injection. Add IORES_DESC_SOFT_RESERVED to einj_error_inject() as +a permissible memory type in the sanity checking of the arguments to +_EINJ. + +Fixes: 262b45ae3ab4 ("x86/efi: EFI soft reservation to E820 enumeration") +Reviewed-by: Tony Luck +Reported-by: Omar Avelar +Signed-off-by: Dan Williams +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/apei/einj.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/acpi/apei/einj.c b/drivers/acpi/apei/einj.c +index 133156759551..c281d5b339d3 100644 +--- a/drivers/acpi/apei/einj.c ++++ b/drivers/acpi/apei/einj.c +@@ -544,6 +544,8 @@ static int einj_error_inject(u32 type, u32 flags, u64 param1, u64 param2, + ((region_intersects(base_addr, size, IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE) + != REGION_INTERSECTS) && + (region_intersects(base_addr, size, IORESOURCE_MEM, IORES_DESC_PERSISTENT_MEMORY) ++ != REGION_INTERSECTS) && ++ (region_intersects(base_addr, size, IORESOURCE_MEM, IORES_DESC_SOFT_RESERVED) + != REGION_INTERSECTS))) + return -EINVAL; + +-- +2.35.1 + diff --git a/queue-5.10/acpi-ec-drop-the-ec_flags_ignore_dsdt_gpe-quirk.patch b/queue-5.10/acpi-ec-drop-the-ec_flags_ignore_dsdt_gpe-quirk.patch new file mode 100644 index 00000000000..d4418957c4c --- /dev/null +++ b/queue-5.10/acpi-ec-drop-the-ec_flags_ignore_dsdt_gpe-quirk.patch @@ -0,0 +1,211 @@ +From 97ed40de0961e864894d2c684fa66fc094dabbf3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Jun 2022 11:25:44 +0200 +Subject: ACPI: EC: Drop the EC_FLAGS_IGNORE_DSDT_GPE quirk + +From: Hans de Goede + +[ Upstream commit f7090e0ef360d674f08a22fab90e4e209fb1f658 ] + +It seems that these quirks are no longer necessary since +commit 69b957c26b32 ("ACPI: EC: Fix possible issues related to EC +initialization order"), which has fixed this in a generic manner. + +There are 3 commits adding DMI entries with this quirk (adding multiple +DMI entries per commit). 2/3 commits are from before the generic fix. + +Which leaves commit 6306f0431914 ("ACPI: EC: Make more Asus laptops +use ECDT _GPE"), which was committed way after the generic fix. +But this was just due to slow upstreaming of it. This commit stems +from Endless from 15 Aug 2017 (committed upstream 20 May 2021): +https://github.com/endlessm/linux/pull/288 + +The current code should work fine without this: + + 1. The EC_FLAGS_IGNORE_DSDT_GPE flag is only checked in ec_parse_device(), + like this: + + if (boot_ec && boot_ec_is_ecdt && EC_FLAGS_IGNORE_DSDT_GPE) { + ec->gpe = boot_ec->gpe; + } else { + /* parse GPE */ + } + + 2. ec_parse_device() is only called from acpi_ec_add() and + acpi_ec_dsdt_probe() + + 3. acpi_ec_dsdt_probe() starts with: + + if (boot_ec) + return; + + so it only calls ec_parse_device() when boot_ec == NULL, meaning that + the quirk never triggers for this call. So only the call in + acpi_ec_add() matters. + + 4. acpi_ec_add() does the following after the ec_parse_device() call: + + if (boot_ec && ec->command_addr == boot_ec->command_addr && + ec->data_addr == boot_ec->data_addr && + !EC_FLAGS_TRUST_DSDT_GPE) { + /* + * Trust PNP0C09 namespace location rather than + * ECDT ID. But trust ECDT GPE rather than _GPE + * because of ASUS quirks, so do not change + * boot_ec->gpe to ec->gpe. + */ + boot_ec->handle = ec->handle; + acpi_handle_debug(ec->handle, "duplicated.\n"); + acpi_ec_free(ec); + ec = boot_ec; + } + +The quirk only matters if boot_ec != NULL and EC_FLAGS_TRUST_DSDT_GPE +is never set at the same time as EC_FLAGS_IGNORE_DSDT_GPE. + +That means that if the addresses match we always enter this if block and +then only the ec->handle part of the data stored in ec by ec_parse_device() +is used and the rest is thrown away, after which ec is made to point +to boot_ec, at which point ec->gpe == boot_ec->gpe, so the same result +as with the quirk set, independent of the value of the quirk. + +Also note the comment in this block which indicates that the gpe result +from ec_parse_device() is deliberately not taken to deal with buggy +Asus laptops and all DMI quirks setting EC_FLAGS_IGNORE_DSDT_GPE are for +Asus laptops. + +Based on the above I believe that unless on some quirked laptops +the ECDT and DSDT EC addresses do not match we can drop the quirk. + +I've checked dmesg output to ensure the ECDT and DSDT EC addresses match +for quirked models using https://linux-hardware.org hw-probe reports. + +I've been able to confirm that the addresses match for the following +models this way: GL702VMK, X505BA, X505BP, X550VXK, X580VD. +Whereas for the following models I could find any dmesg output: +FX502VD, FX502VE, X542BA, X542BP. + +Note the models without dmesg all were submitted in patches with a batch +of models and other models from the same batch checkout ok. + +This, combined with that all the code adding the quirks was written before +the generic fix makes me believe that it is safe to remove this quirk now. + +Signed-off-by: Hans de Goede +Reviewed-by: Daniel Drake +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/ec.c | 75 ++++++----------------------------------------- + 1 file changed, 9 insertions(+), 66 deletions(-) + +diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c +index 7305cfc8e146..4707d1808ca5 100644 +--- a/drivers/acpi/ec.c ++++ b/drivers/acpi/ec.c +@@ -183,7 +183,6 @@ static struct workqueue_struct *ec_wq; + static struct workqueue_struct *ec_query_wq; + + static int EC_FLAGS_CORRECT_ECDT; /* Needs ECDT port address correction */ +-static int EC_FLAGS_IGNORE_DSDT_GPE; /* Needs ECDT GPE as correction setting */ + static int EC_FLAGS_TRUST_DSDT_GPE; /* Needs DSDT GPE as correction setting */ + static int EC_FLAGS_CLEAR_ON_RESUME; /* Needs acpi_ec_clear() on boot/resume */ + +@@ -1405,24 +1404,16 @@ ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval) + if (ec->data_addr == 0 || ec->command_addr == 0) + return AE_OK; + +- if (boot_ec && boot_ec_is_ecdt && EC_FLAGS_IGNORE_DSDT_GPE) { +- /* +- * Always inherit the GPE number setting from the ECDT +- * EC. +- */ +- ec->gpe = boot_ec->gpe; +- } else { +- /* Get GPE bit assignment (EC events). */ +- /* TODO: Add support for _GPE returning a package */ +- status = acpi_evaluate_integer(handle, "_GPE", NULL, &tmp); +- if (ACPI_SUCCESS(status)) +- ec->gpe = tmp; ++ /* Get GPE bit assignment (EC events). */ ++ /* TODO: Add support for _GPE returning a package */ ++ status = acpi_evaluate_integer(handle, "_GPE", NULL, &tmp); ++ if (ACPI_SUCCESS(status)) ++ ec->gpe = tmp; ++ /* ++ * Errors are non-fatal, allowing for ACPI Reduced Hardware ++ * platforms which use GpioInt instead of GPE. ++ */ + +- /* +- * Errors are non-fatal, allowing for ACPI Reduced Hardware +- * platforms which use GpioInt instead of GPE. +- */ +- } + /* Use the global lock for all EC transactions? */ + tmp = 0; + acpi_evaluate_integer(handle, "_GLK", NULL, &tmp); +@@ -1860,60 +1851,12 @@ static int ec_honor_dsdt_gpe(const struct dmi_system_id *id) + return 0; + } + +-/* +- * Some DSDTs contain wrong GPE setting. +- * Asus FX502VD/VE, GL702VMK, X550VXK, X580VD +- * https://bugzilla.kernel.org/show_bug.cgi?id=195651 +- */ +-static int ec_honor_ecdt_gpe(const struct dmi_system_id *id) +-{ +- pr_debug("Detected system needing ignore DSDT GPE setting.\n"); +- EC_FLAGS_IGNORE_DSDT_GPE = 1; +- return 0; +-} +- + static const struct dmi_system_id ec_dmi_table[] __initconst = { + { + ec_correct_ecdt, "MSI MS-171F", { + DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star"), + DMI_MATCH(DMI_PRODUCT_NAME, "MS-171F"),}, NULL}, + { +- ec_honor_ecdt_gpe, "ASUS FX502VD", { +- DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +- DMI_MATCH(DMI_PRODUCT_NAME, "FX502VD"),}, NULL}, +- { +- ec_honor_ecdt_gpe, "ASUS FX502VE", { +- DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +- DMI_MATCH(DMI_PRODUCT_NAME, "FX502VE"),}, NULL}, +- { +- ec_honor_ecdt_gpe, "ASUS GL702VMK", { +- DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +- DMI_MATCH(DMI_PRODUCT_NAME, "GL702VMK"),}, NULL}, +- { +- ec_honor_ecdt_gpe, "ASUSTeK COMPUTER INC. X505BA", { +- DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +- DMI_MATCH(DMI_PRODUCT_NAME, "X505BA"),}, NULL}, +- { +- ec_honor_ecdt_gpe, "ASUSTeK COMPUTER INC. X505BP", { +- DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +- DMI_MATCH(DMI_PRODUCT_NAME, "X505BP"),}, NULL}, +- { +- ec_honor_ecdt_gpe, "ASUSTeK COMPUTER INC. X542BA", { +- DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +- DMI_MATCH(DMI_PRODUCT_NAME, "X542BA"),}, NULL}, +- { +- ec_honor_ecdt_gpe, "ASUSTeK COMPUTER INC. X542BP", { +- DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +- DMI_MATCH(DMI_PRODUCT_NAME, "X542BP"),}, NULL}, +- { +- ec_honor_ecdt_gpe, "ASUS X550VXK", { +- DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +- DMI_MATCH(DMI_PRODUCT_NAME, "X550VXK"),}, NULL}, +- { +- ec_honor_ecdt_gpe, "ASUS X580VD", { +- DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +- DMI_MATCH(DMI_PRODUCT_NAME, "X580VD"),}, NULL}, +- { + /* https://bugzilla.kernel.org/show_bug.cgi?id=209989 */ + ec_honor_dsdt_gpe, "HP Pavilion Gaming Laptop 15-cx0xxx", { + DMI_MATCH(DMI_SYS_VENDOR, "HP"), +-- +2.35.1 + diff --git a/queue-5.10/acpi-ec-remove-duplicate-thinkpad-x1-carbon-6th-entr.patch b/queue-5.10/acpi-ec-remove-duplicate-thinkpad-x1-carbon-6th-entr.patch new file mode 100644 index 00000000000..d7d1b8dd477 --- /dev/null +++ b/queue-5.10/acpi-ec-remove-duplicate-thinkpad-x1-carbon-6th-entr.patch @@ -0,0 +1,42 @@ +From ee75c8294a386f2c9eba4d425108d15dcff62c15 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Jun 2022 11:25:43 +0200 +Subject: ACPI: EC: Remove duplicate ThinkPad X1 Carbon 6th entry from DMI + quirks + +From: Hans de Goede + +[ Upstream commit 0dd6db359e5f206cbf1dd1fd40dd211588cd2725 ] + +Somehow the "ThinkPad X1 Carbon 6th" entry ended up twice in the +struct dmi_system_id acpi_ec_no_wakeup[] array. Remove one of +the entries. + +Signed-off-by: Hans de Goede +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/ec.c | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c +index 3f2e5ea9ab6b..7305cfc8e146 100644 +--- a/drivers/acpi/ec.c ++++ b/drivers/acpi/ec.c +@@ -2180,13 +2180,6 @@ static const struct dmi_system_id acpi_ec_no_wakeup[] = { + DMI_MATCH(DMI_PRODUCT_FAMILY, "Thinkpad X1 Carbon 6th"), + }, + }, +- { +- .ident = "ThinkPad X1 Carbon 6th", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), +- DMI_MATCH(DMI_PRODUCT_FAMILY, "ThinkPad X1 Carbon 6th"), +- }, +- }, + { + .ident = "ThinkPad X1 Yoga 3rd", + .matches = { +-- +2.35.1 + diff --git a/queue-5.10/acpi-lpss-fix-missing-check-in-register_device_clock.patch b/queue-5.10/acpi-lpss-fix-missing-check-in-register_device_clock.patch new file mode 100644 index 00000000000..127f93f8442 --- /dev/null +++ b/queue-5.10/acpi-lpss-fix-missing-check-in-register_device_clock.patch @@ -0,0 +1,36 @@ +From 39139927d0e534e133e985d7916a0e1421d10331 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 23 Jun 2022 21:21:27 +0800 +Subject: ACPI: LPSS: Fix missing check in register_device_clock() + +From: huhai + +[ Upstream commit b4f1f61ed5928b1128e60e38d0dffa16966f06dc ] + +register_device_clock() misses a check for platform_device_register_simple(). +Add a check to fix it. + +Signed-off-by: huhai +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/acpi_lpss.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c +index be73974ce449..6ff81027c69d 100644 +--- a/drivers/acpi/acpi_lpss.c ++++ b/drivers/acpi/acpi_lpss.c +@@ -401,6 +401,9 @@ static int register_device_clock(struct acpi_device *adev, + if (!lpss_clk_dev) + lpt_register_clock_device(); + ++ if (IS_ERR(lpss_clk_dev)) ++ return PTR_ERR(lpss_clk_dev); ++ + clk_data = platform_get_drvdata(lpss_clk_dev); + if (!clk_data) + return -ENODEV; +-- +2.35.1 + diff --git a/queue-5.10/acpi-pm-save-nvs-memory-for-lenovo-g40-45.patch b/queue-5.10/acpi-pm-save-nvs-memory-for-lenovo-g40-45.patch new file mode 100644 index 00000000000..b140bfb6188 --- /dev/null +++ b/queue-5.10/acpi-pm-save-nvs-memory-for-lenovo-g40-45.patch @@ -0,0 +1,44 @@ +From 7b0565b1725ee9704fa44aede0ba7575eda3f6a5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 22 Jun 2022 15:42:48 +0800 +Subject: ACPI: PM: save NVS memory for Lenovo G40-45 + +From: Manyi Li + +[ Upstream commit 4b7ef7b05afcde44142225c184bf43a0cd9e2178 ] + +[821d6f0359b0614792ab8e2fb93b503e25a65079] is to make machines +produced from 2012 to now not saving NVS region to accelerate S3. + +But, Lenovo G40-45, a platform released in 2015, still needs NVS memory +saving during S3. A quirk is introduced for this platform. + +Signed-off-by: Manyi Li +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/sleep.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c +index cfda5720de02..097a5b5f46ab 100644 +--- a/drivers/acpi/sleep.c ++++ b/drivers/acpi/sleep.c +@@ -364,6 +364,14 @@ static const struct dmi_system_id acpisleep_dmi_table[] __initconst = { + DMI_MATCH(DMI_PRODUCT_NAME, "80E3"), + }, + }, ++ { ++ .callback = init_nvs_save_s3, ++ .ident = "Lenovo G40-45", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "80E1"), ++ }, ++ }, + /* + * ThinkPad X1 Tablet(2016) cannot do suspend-to-idle using + * the Low Power S0 Idle firmware interface (see +-- +2.35.1 + diff --git a/queue-5.10/acpi-processor-idle-annotate-more-functions-to-live-.patch b/queue-5.10/acpi-processor-idle-annotate-more-functions-to-live-.patch new file mode 100644 index 00000000000..5faa95fa9a4 --- /dev/null +++ b/queue-5.10/acpi-processor-idle-annotate-more-functions-to-live-.patch @@ -0,0 +1,63 @@ +From 65e8165fc777328ec986f588e2b4c42bc2b8f896 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 Jun 2022 19:24:58 -0300 +Subject: ACPI: processor/idle: Annotate more functions to live in cpuidle + section + +From: Guilherme G. Piccoli + +[ Upstream commit 409dfdcaffb266acfc1f33529a26b1443c9332d4 ] + +Commit 6727ad9e206c ("nmi_backtrace: generate one-line reports for idle cpus") +introduced a new text section called cpuidle; with that, we have a mechanism +to add idling functions in such section and skip them from nmi_backtrace +output, since they're useless and potentially flooding for such report. + +Happens that inlining might cause some real idle functions to end-up +outside of such section; this is currently the case of ACPI processor_idle +driver; the functions acpi_idle_enter_* do inline acpi_idle_do_entry(), +hence they stay out of the cpuidle section. +Fix that by marking such functions to also live in the cpuidle section. + +Fixes: 6727ad9e206c ("nmi_backtrace: generate one-line reports for idle cpus") +Signed-off-by: Guilherme G. Piccoli +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/processor_idle.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c +index 9921b481c7ee..e5dd87ddc6b3 100644 +--- a/drivers/acpi/processor_idle.c ++++ b/drivers/acpi/processor_idle.c +@@ -609,7 +609,7 @@ static DEFINE_RAW_SPINLOCK(c3_lock); + * @cx: Target state context + * @index: index of target state + */ +-static int acpi_idle_enter_bm(struct cpuidle_driver *drv, ++static int __cpuidle acpi_idle_enter_bm(struct cpuidle_driver *drv, + struct acpi_processor *pr, + struct acpi_processor_cx *cx, + int index) +@@ -666,7 +666,7 @@ static int acpi_idle_enter_bm(struct cpuidle_driver *drv, + return index; + } + +-static int acpi_idle_enter(struct cpuidle_device *dev, ++static int __cpuidle acpi_idle_enter(struct cpuidle_device *dev, + struct cpuidle_driver *drv, int index) + { + struct acpi_processor_cx *cx = per_cpu(acpi_cstate[index], dev->cpu); +@@ -695,7 +695,7 @@ static int acpi_idle_enter(struct cpuidle_device *dev, + return index; + } + +-static int acpi_idle_enter_s2idle(struct cpuidle_device *dev, ++static int __cpuidle acpi_idle_enter_s2idle(struct cpuidle_device *dev, + struct cpuidle_driver *drv, int index) + { + struct acpi_processor_cx *cx = per_cpu(acpi_cstate[index], dev->cpu); +-- +2.35.1 + diff --git a/queue-5.10/arm-bcm-fix-refcount-leak-in-bcm_kona_smc_init.patch b/queue-5.10/arm-bcm-fix-refcount-leak-in-bcm_kona_smc_init.patch new file mode 100644 index 00000000000..0269a9839e0 --- /dev/null +++ b/queue-5.10/arm-bcm-fix-refcount-leak-in-bcm_kona_smc_init.patch @@ -0,0 +1,36 @@ +From afc832f198b93951f7cffeab629b8d1ee67a9da5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 May 2022 12:13:25 +0400 +Subject: ARM: bcm: Fix refcount leak in bcm_kona_smc_init + +From: Miaoqian Lin + +[ Upstream commit cb23389a2458c2e4bfd6c86a513cbbe1c4d35e76 ] + +of_find_matching_node() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak. + +Fixes: b8eb35fd594a ("ARM: bcm281xx: Add L2 cache enable code") +Signed-off-by: Miaoqian Lin +Signed-off-by: Florian Fainelli +Signed-off-by: Sasha Levin +--- + arch/arm/mach-bcm/bcm_kona_smc.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm/mach-bcm/bcm_kona_smc.c b/arch/arm/mach-bcm/bcm_kona_smc.c +index 43a16f922b53..513efea655ba 100644 +--- a/arch/arm/mach-bcm/bcm_kona_smc.c ++++ b/arch/arm/mach-bcm/bcm_kona_smc.c +@@ -54,6 +54,7 @@ int __init bcm_kona_smc_init(void) + return -ENODEV; + + prop_val = of_get_address(node, 0, &prop_size, NULL); ++ of_node_put(node); + if (!prop_val) + return -EINVAL; + +-- +2.35.1 + diff --git a/queue-5.10/arm-dts-ast2500-evb-fix-board-compatible.patch b/queue-5.10/arm-dts-ast2500-evb-fix-board-compatible.patch new file mode 100644 index 00000000000..73f10e6119b --- /dev/null +++ b/queue-5.10/arm-dts-ast2500-evb-fix-board-compatible.patch @@ -0,0 +1,35 @@ +From 63f9bf3a1bf0cee48e3312ada117e60c90836dd7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 29 May 2022 12:49:25 +0200 +Subject: ARM: dts: ast2500-evb: fix board compatible + +From: Krzysztof Kozlowski + +[ Upstream commit 30b276fca5c0644f3cb17bceb1bd6a626c670184 ] + +The AST2500 EVB board should have dedicated compatible. + +Fixes: 02440622656d ("arm/dst: Add Aspeed ast2500 device tree") +Signed-off-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20220529104928.79636-4-krzysztof.kozlowski@linaro.org +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/aspeed-ast2500-evb.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/aspeed-ast2500-evb.dts b/arch/arm/boot/dts/aspeed-ast2500-evb.dts +index 8bec21ed0de5..7a874debb7d5 100644 +--- a/arch/arm/boot/dts/aspeed-ast2500-evb.dts ++++ b/arch/arm/boot/dts/aspeed-ast2500-evb.dts +@@ -5,7 +5,7 @@ + + / { + model = "AST2500 EVB"; +- compatible = "aspeed,ast2500"; ++ compatible = "aspeed,ast2500-evb", "aspeed,ast2500"; + + aliases { + serial4 = &uart5; +-- +2.35.1 + diff --git a/queue-5.10/arm-dts-ast2600-evb-fix-board-compatible.patch b/queue-5.10/arm-dts-ast2600-evb-fix-board-compatible.patch new file mode 100644 index 00000000000..f6472e1d6cf --- /dev/null +++ b/queue-5.10/arm-dts-ast2600-evb-fix-board-compatible.patch @@ -0,0 +1,35 @@ +From c2be98a76bed88d5e4b5bc4e4a75f76e03b3d404 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 29 May 2022 12:49:26 +0200 +Subject: ARM: dts: ast2600-evb: fix board compatible + +From: Krzysztof Kozlowski + +[ Upstream commit aa5e06208500a0db41473caebdee5a2e81d5a277 ] + +The AST2600 EVB board should have dedicated compatible. + +Fixes: 2ca5646b5c2f ("ARM: dts: aspeed: Add AST2600 and EVB") +Signed-off-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20220529104928.79636-5-krzysztof.kozlowski@linaro.org +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/aspeed-ast2600-evb.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/aspeed-ast2600-evb.dts b/arch/arm/boot/dts/aspeed-ast2600-evb.dts +index 8d0f4656aa05..892814c02aa9 100644 +--- a/arch/arm/boot/dts/aspeed-ast2600-evb.dts ++++ b/arch/arm/boot/dts/aspeed-ast2600-evb.dts +@@ -7,7 +7,7 @@ + + / { + model = "AST2600 EVB"; +- compatible = "aspeed,ast2600"; ++ compatible = "aspeed,ast2600-evb-a1", "aspeed,ast2600"; + + aliases { + serial4 = &uart5; +-- +2.35.1 + diff --git a/queue-5.10/arm-dts-bcm5301x-add-dt-for-meraki-mr26.patch b/queue-5.10/arm-dts-bcm5301x-add-dt-for-meraki-mr26.patch new file mode 100644 index 00000000000..6a3f0297e98 --- /dev/null +++ b/queue-5.10/arm-dts-bcm5301x-add-dt-for-meraki-mr26.patch @@ -0,0 +1,260 @@ +From 480e02f5f2ad365c2db01a627dacf448bca570e4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 18 Jun 2022 00:00:29 +0200 +Subject: ARM: dts: BCM5301X: Add DT for Meraki MR26 + +From: Christian Lamparter + +[ Upstream commit 935327a73553001f8d81375c76985d05f604507f ] + +Meraki MR26 is an EOL wireless access point featuring a +PoE ethernet port and two dual-band 3x3 MIMO 802.11n +radios and 1x1 dual-band WIFI dedicated to scanning. + +Thank you Amir for the unit and PSU. + +Hardware info: +SOC : Broadcom BCM53015A1KFEBG (dual-core Cortex-A9 CPU at 800 MHz) +RAM : SK Hynix Inc. H5TQ1G63EFR, 1 GBit DDR3 SDRAM = 128 MiB +NAND : Spansion S34ML01G100TF100, 1 GBit SLC NAND Flash = 128 MiB +ETH : 1 GBit Ethernet Port - PoE (TPS23754 PoE Interface) +WIFI0 : Broadcom BCM43431KMLG, BCM43431 802.11 abgn (3x3:3) +WIFI1 : Broadcom BCM43431KMLG, BCM43431 802.11 abgn (3x3:3) +WIFI2 : Broadcom BCM43428 "Air Marshal" 802.11 abgn (1x1:1) +BUTTON: One reset key behind a small hole next to the Ethernet Port +LEDS : One amber (fault), one white (indicator) LED, separate RGB-LED +MISC : Atmel AT24C64 8KiB EEPROM i2c + : Ti INA219 26V, 12-bit, i2c output current/voltage/power monitor + +SERIAL: + WARNING: The serial port needs a TTL/RS-232 3V3 level converter! + The Serial setting is 115200-8-N-1. The board has a populated + right angle 1x4 0.1" pinheader. + The pinout is: VCC (next to J3, has the pin 1 indicator), RX, TX, GND. + +Odd stuff: + +- uboot does not support lzma compression, but gzip'd uImage/DTB work. +- uboot claims to support FIT, but fails to pass the DTB to the kernel. + Appending the dtb after the kernel image works. +- RGB-controller is supported through an external userspace program. +- The ubi partition contains a "board-config" volume. It stores the + MAC Address (0x66 in binary) and Serial No. (0x7c alpha-numerical). +- SoC's temperature sensor always reports that it is on fire. + This causes the system to immediately shutdown! Looking at reported + "418 degree Celsius" suggests that this sensor is not working. + +WIFI: +b43 is able to initialize all three WIFIs @ 802.11bg. +| b43-phy0: Broadcom 43431 WLAN found (core revision 29) +| bcma-pci-bridge 0000:01:00.0: bus1: Switched to core: 0x812 +| b43-phy0: Found PHY: Analog 9, Type 7 (HT), Revision 1 +| b43-phy0: Found Radio: Manuf 0x17F, ID 0x2059, Revision 0, Version 1 +| b43-phy0 warning: 5 GHz band is unsupported on this PHY +| b43-phy1: Broadcom 43431 WLAN found (core revision 29) +| bcma-pci-bridge 0001:01:00.0: bus2: Switched to core: 0x812 +| b43-phy1: Found PHY: Analog 9, Type 7 (HT), Revision 1 +| b43-phy1: Found Radio: Manuf 0x17F, ID 0x2059, Revision 0, Version 1 +| b43-phy1 warning: 5 GHz band is unsupported on this PHY +| b43-phy2: Broadcom 43228 WLAN found (core revision 30) +| bcma-pci-bridge 0002:01:00.0: bus3: Switched to core: 0x812 +| b43-phy2: Found PHY: Analog 9, Type 4 (N), Revision 16 +| b43-phy2: Found Radio: Manuf 0x17F, ID 0x2057, Revision 9, Version 1 +| Broadcom 43xx driver loaded [ Features: NL ] + +Signed-off-by: Christian Lamparter +Signed-off-by: Florian Fainelli +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/Makefile | 1 + + arch/arm/boot/dts/bcm53015-meraki-mr26.dts | 166 +++++++++++++++++++++ + 2 files changed, 167 insertions(+) + create mode 100644 arch/arm/boot/dts/bcm53015-meraki-mr26.dts + +diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile +index 7e8151681597..d93f01dddc3f 100644 +--- a/arch/arm/boot/dts/Makefile ++++ b/arch/arm/boot/dts/Makefile +@@ -128,6 +128,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \ + bcm47094-luxul-xwr-3150-v1.dtb \ + bcm47094-netgear-r8500.dtb \ + bcm47094-phicomm-k3.dtb \ ++ bcm53015-meraki-mr26.dtb \ + bcm53016-meraki-mr32.dtb \ + bcm94708.dtb \ + bcm94709.dtb \ +diff --git a/arch/arm/boot/dts/bcm53015-meraki-mr26.dts b/arch/arm/boot/dts/bcm53015-meraki-mr26.dts +new file mode 100644 +index 000000000000..14f58033efeb +--- /dev/null ++++ b/arch/arm/boot/dts/bcm53015-meraki-mr26.dts +@@ -0,0 +1,166 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later OR MIT ++/* ++ * Broadcom BCM470X / BCM5301X ARM platform code. ++ * DTS for Meraki MR26 / Codename: Venom ++ * ++ * Copyright (C) 2022 Christian Lamparter ++ */ ++ ++/dts-v1/; ++ ++#include "bcm4708.dtsi" ++#include "bcm5301x-nand-cs0-bch8.dtsi" ++#include ++ ++/ { ++ compatible = "meraki,mr26", "brcm,bcm53015", "brcm,bcm4708"; ++ model = "Meraki MR26"; ++ ++ memory@0 { ++ reg = <0x00000000 0x08000000>; ++ device_type = "memory"; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ ++ led-0 { ++ function = LED_FUNCTION_FAULT; ++ color = ; ++ gpios = <&chipcommon 13 GPIO_ACTIVE_HIGH>; ++ panic-indicator; ++ }; ++ led-1 { ++ function = LED_FUNCTION_INDICATOR; ++ color = ; ++ gpios = <&chipcommon 12 GPIO_ACTIVE_HIGH>; ++ }; ++ }; ++ ++ keys { ++ compatible = "gpio-keys"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ key-restart { ++ label = "Reset"; ++ linux,code = ; ++ gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++}; ++ ++&uart0 { ++ clock-frequency = <50000000>; ++ /delete-property/ clocks; ++}; ++ ++&uart1 { ++ status = "disabled"; ++}; ++ ++&gmac0 { ++ status = "okay"; ++}; ++ ++&gmac1 { ++ status = "disabled"; ++}; ++&gmac2 { ++ status = "disabled"; ++}; ++&gmac3 { ++ status = "disabled"; ++}; ++ ++&nandcs { ++ nand-ecc-algo = "hw"; ++ ++ partitions { ++ compatible = "fixed-partitions"; ++ #address-cells = <0x1>; ++ #size-cells = <0x1>; ++ ++ partition@0 { ++ label = "u-boot"; ++ reg = <0x0 0x200000>; ++ read-only; ++ }; ++ ++ partition@200000 { ++ label = "u-boot-env"; ++ reg = <0x200000 0x200000>; ++ /* empty */ ++ }; ++ ++ partition@400000 { ++ label = "u-boot-backup"; ++ reg = <0x400000 0x200000>; ++ /* empty */ ++ }; ++ ++ partition@600000 { ++ label = "u-boot-env-backup"; ++ reg = <0x600000 0x200000>; ++ /* empty */ ++ }; ++ ++ partition@800000 { ++ label = "ubi"; ++ reg = <0x800000 0x7780000>; ++ }; ++ }; ++}; ++ ++&srab { ++ status = "okay"; ++ ++ ports { ++ port@0 { ++ reg = <0>; ++ label = "poe"; ++ }; ++ ++ port@5 { ++ reg = <5>; ++ label = "cpu"; ++ ethernet = <&gmac0>; ++ ++ fixed-link { ++ speed = <1000>; ++ duplex-full; ++ }; ++ }; ++ }; ++}; ++ ++&i2c0 { ++ status = "okay"; ++ ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinmux_i2c>; ++ ++ clock-frequency = <100000>; ++ ++ ina219@40 { ++ compatible = "ti,ina219"; /* PoE power */ ++ reg = <0x40>; ++ shunt-resistor = <60000>; /* = 60 mOhms */ ++ }; ++ ++ eeprom@56 { ++ compatible = "atmel,24c64"; ++ reg = <0x56>; ++ pagesize = <32>; ++ read-only; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ /* it's empty */ ++ }; ++}; ++ ++&thermal { ++ status = "disabled"; ++ /* does not work, reads 418 degree Celsius */ ++}; +-- +2.35.1 + diff --git a/queue-5.10/arm-dts-imx6ul-add-missing-properties-for-sram.patch b/queue-5.10/arm-dts-imx6ul-add-missing-properties-for-sram.patch new file mode 100644 index 00000000000..e9bb523362e --- /dev/null +++ b/queue-5.10/arm-dts-imx6ul-add-missing-properties-for-sram.patch @@ -0,0 +1,39 @@ +From 38b9449424c1dd30c73941839ac34996dd869c4b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 14:33:51 +0200 +Subject: ARM: dts: imx6ul: add missing properties for sram + +From: Alexander Stein + +[ Upstream commit 5655699cf5cff9f4c4ee703792156bdd05d1addf ] + +All 3 properties are required by sram.yaml. Fixes the dtbs_check +warning: +sram@900000: '#address-cells' is a required property +sram@900000: '#size-cells' is a required property +sram@900000: 'ranges' is a required property + +Signed-off-by: Alexander Stein +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6ul.dtsi | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi +index d7d9f3e46b92..34eccc1db12c 100644 +--- a/arch/arm/boot/dts/imx6ul.dtsi ++++ b/arch/arm/boot/dts/imx6ul.dtsi +@@ -147,6 +147,9 @@ soc { + ocram: sram@900000 { + compatible = "mmio-sram"; + reg = <0x00900000 0x20000>; ++ ranges = <0 0x00900000 0x20000>; ++ #address-cells = <1>; ++ #size-cells = <1>; + }; + + intc: interrupt-controller@a01000 { +-- +2.35.1 + diff --git a/queue-5.10/arm-dts-imx6ul-change-operating-points-to-uint32-mat.patch b/queue-5.10/arm-dts-imx6ul-change-operating-points-to-uint32-mat.patch new file mode 100644 index 00000000000..c57395eb88c --- /dev/null +++ b/queue-5.10/arm-dts-imx6ul-change-operating-points-to-uint32-mat.patch @@ -0,0 +1,63 @@ +From 7cde71e3e471c0d96e0a282e456e8d42d5b04dfe Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 14:33:52 +0200 +Subject: ARM: dts: imx6ul: change operating-points to uint32-matrix + +From: Alexander Stein + +[ Upstream commit edb67843983bbdf61b4c8c3c50618003d38bb4ae ] + +operating-points is a uint32-matrix as per opp-v1.yaml. Change it +accordingly. While at it, change fsl,soc-operating-points as well, +although there is no bindings file (yet). But they should have the same +format. Fixes the dt_binding_check warning: +cpu@0: operating-points:0: [696000, 1275000, 528000, 1175000, 396000, +1025000, 198000, 950000] is too long +cpu@0: operating-points:0: Additional items are not allowed (528000, +1175000, 396000, 1025000, 198000, 950000 were unexpected) + +Signed-off-by: Alexander Stein +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6ul.dtsi | 22 ++++++++++------------ + 1 file changed, 10 insertions(+), 12 deletions(-) + +diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi +index 34eccc1db12c..02640c19c1ec 100644 +--- a/arch/arm/boot/dts/imx6ul.dtsi ++++ b/arch/arm/boot/dts/imx6ul.dtsi +@@ -62,20 +62,18 @@ cpu0: cpu@0 { + clock-frequency = <696000000>; + clock-latency = <61036>; /* two CLK32 periods */ + #cooling-cells = <2>; +- operating-points = < ++ operating-points = + /* kHz uV */ +- 696000 1275000 +- 528000 1175000 +- 396000 1025000 +- 198000 950000 +- >; +- fsl,soc-operating-points = < ++ <696000 1275000>, ++ <528000 1175000>, ++ <396000 1025000>, ++ <198000 950000>; ++ fsl,soc-operating-points = + /* KHz uV */ +- 696000 1275000 +- 528000 1175000 +- 396000 1175000 +- 198000 1175000 +- >; ++ <696000 1275000>, ++ <528000 1175000>, ++ <396000 1175000>, ++ <198000 1175000>; + clocks = <&clks IMX6UL_CLK_ARM>, + <&clks IMX6UL_CLK_PLL2_BUS>, + <&clks IMX6UL_CLK_PLL2_PFD2>, +-- +2.35.1 + diff --git a/queue-5.10/arm-dts-imx6ul-fix-csi-node-compatible.patch b/queue-5.10/arm-dts-imx6ul-fix-csi-node-compatible.patch new file mode 100644 index 00000000000..faf1955325e --- /dev/null +++ b/queue-5.10/arm-dts-imx6ul-fix-csi-node-compatible.patch @@ -0,0 +1,40 @@ +From a8e8298d9ff7db06ff1473e4aa77fc57d2473d6c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 14:33:55 +0200 +Subject: ARM: dts: imx6ul: fix csi node compatible + +From: Alexander Stein + +[ Upstream commit e0aca931a2c7c29c88ebf37f9c3cd045e083483d ] + +"fsl,imx6ul-csi" was never listed as compatible to "fsl,imx7-csi", neither +in yaml bindings, nor previous txt binding. Remove the imx7 part. Fixes +the dt schema check warning: +csi@21c4000: compatible: 'oneOf' conditional failed, one must be fixed: +['fsl,imx6ul-csi', 'fsl,imx7-csi'] is too long +Additional items are not allowed ('fsl,imx7-csi' was unexpected) +'fsl,imx8mm-csi' was expected + +Signed-off-by: Alexander Stein +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6ul.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi +index 1474985b9908..8e6079a68022 100644 +--- a/arch/arm/boot/dts/imx6ul.dtsi ++++ b/arch/arm/boot/dts/imx6ul.dtsi +@@ -995,7 +995,7 @@ cpu_speed_grade: speed-grade@10 { + }; + + csi: csi@21c4000 { +- compatible = "fsl,imx6ul-csi", "fsl,imx7-csi"; ++ compatible = "fsl,imx6ul-csi"; + reg = <0x021c4000 0x4000>; + interrupts = ; + clocks = <&clks IMX6UL_CLK_CSI>; +-- +2.35.1 + diff --git a/queue-5.10/arm-dts-imx6ul-fix-keypad-compatible.patch b/queue-5.10/arm-dts-imx6ul-fix-keypad-compatible.patch new file mode 100644 index 00000000000..5f363a92e0b --- /dev/null +++ b/queue-5.10/arm-dts-imx6ul-fix-keypad-compatible.patch @@ -0,0 +1,41 @@ +From 63104aab4a633bd88d9bc8e7ae18f94730bedfca Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 14:33:53 +0200 +Subject: ARM: dts: imx6ul: fix keypad compatible + +From: Alexander Stein + +[ Upstream commit 7d15e0c9a515494af2e3199741cdac7002928a0e ] + +According to binding, the compatible shall only contain imx6ul and imx21 +compatibles. Fixes the dt_binding_check warning: +keypad@20b8000: compatible: 'oneOf' conditional failed, one must be fixed: +['fsl,imx6ul-kpp', 'fsl,imx6q-kpp', 'fsl,imx21-kpp'] is too long +Additional items are not allowed ('fsl,imx6q-kpp', 'fsl,imx21-kpp' were +unexpected) +Additional items are not allowed ('fsl,imx21-kpp' was unexpected) +'fsl,imx21-kpp' was expected + +Signed-off-by: Alexander Stein +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6ul.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi +index 02640c19c1ec..1474985b9908 100644 +--- a/arch/arm/boot/dts/imx6ul.dtsi ++++ b/arch/arm/boot/dts/imx6ul.dtsi +@@ -541,7 +541,7 @@ fec2: ethernet@20b4000 { + }; + + kpp: keypad@20b8000 { +- compatible = "fsl,imx6ul-kpp", "fsl,imx6q-kpp", "fsl,imx21-kpp"; ++ compatible = "fsl,imx6ul-kpp", "fsl,imx21-kpp"; + reg = <0x020b8000 0x4000>; + interrupts = ; + clocks = <&clks IMX6UL_CLK_KPP>; +-- +2.35.1 + diff --git a/queue-5.10/arm-dts-imx6ul-fix-lcdif-node-compatible.patch b/queue-5.10/arm-dts-imx6ul-fix-lcdif-node-compatible.patch new file mode 100644 index 00000000000..d3904afabd2 --- /dev/null +++ b/queue-5.10/arm-dts-imx6ul-fix-lcdif-node-compatible.patch @@ -0,0 +1,42 @@ +From 10d6fb44960769a09de750d130de111c59723b28 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 14:33:56 +0200 +Subject: ARM: dts: imx6ul: fix lcdif node compatible + +From: Alexander Stein + +[ Upstream commit 1a884d17ca324531634cce82e9f64c0302bdf7de ] + +In yaml binding "fsl,imx6ul-lcdif" is listed as compatible to imx6sx-lcdif, +but not imx28-lcdif. Change the list accordingly. Fixes the +dt_binding_check warning: +lcdif@21c8000: compatible: 'oneOf' conditional failed, one must be fixed: +['fsl,imx6ul-lcdif', 'fsl,imx28-lcdif'] is too long +Additional items are not allowed ('fsl,imx28-lcdif' was unexpected) +'fsl,imx6ul-lcdif' is not one of ['fsl,imx23-lcdif', 'fsl,imx28-lcdif', +'fsl,imx6sx-lcdif'] +'fsl,imx6sx-lcdif' was expected + +Signed-off-by: Alexander Stein +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6ul.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi +index 8e6079a68022..51de36b4125a 100644 +--- a/arch/arm/boot/dts/imx6ul.dtsi ++++ b/arch/arm/boot/dts/imx6ul.dtsi +@@ -1004,7 +1004,7 @@ csi: csi@21c4000 { + }; + + lcdif: lcdif@21c8000 { +- compatible = "fsl,imx6ul-lcdif", "fsl,imx28-lcdif"; ++ compatible = "fsl,imx6ul-lcdif", "fsl,imx6sx-lcdif"; + reg = <0x021c8000 0x4000>; + interrupts = ; + clocks = <&clks IMX6UL_CLK_LCDIF_PIX>, +-- +2.35.1 + diff --git a/queue-5.10/arm-dts-imx6ul-fix-qspi-node-compatible.patch b/queue-5.10/arm-dts-imx6ul-fix-qspi-node-compatible.patch new file mode 100644 index 00000000000..ed76a284faf --- /dev/null +++ b/queue-5.10/arm-dts-imx6ul-fix-qspi-node-compatible.patch @@ -0,0 +1,42 @@ +From 3c51841c84feb656e6f5f71521dfde27c97b6019 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 14:33:57 +0200 +Subject: ARM: dts: imx6ul: fix qspi node compatible + +From: Alexander Stein + +[ Upstream commit 0c6cf86e1ab433b2d421880fdd9c6e954f404948 ] + +imx6ul is not compatible to imx6sx, both have different erratas. +Fixes the dt_binding_check warning: +spi@21e0000: compatible: 'oneOf' conditional failed, one must be fixed: +['fsl,imx6ul-qspi', 'fsl,imx6sx-qspi'] is too long +Additional items are not allowed ('fsl,imx6sx-qspi' was unexpected) +'fsl,imx6ul-qspi' is not one of ['fsl,ls1043a-qspi'] +'fsl,imx6ul-qspi' is not one of ['fsl,imx8mq-qspi'] +'fsl,ls1021a-qspi' was expected +'fsl,imx7d-qspi' was expected + +Signed-off-by: Alexander Stein +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6ul.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi +index 51de36b4125a..c40684ad11b8 100644 +--- a/arch/arm/boot/dts/imx6ul.dtsi ++++ b/arch/arm/boot/dts/imx6ul.dtsi +@@ -1025,7 +1025,7 @@ pxp: pxp@21cc000 { + qspi: spi@21e0000 { + #address-cells = <1>; + #size-cells = <0>; +- compatible = "fsl,imx6ul-qspi", "fsl,imx6sx-qspi"; ++ compatible = "fsl,imx6ul-qspi"; + reg = <0x021e0000 0x4000>, <0x60000000 0x10000000>; + reg-names = "QuadSPI", "QuadSPI-memory"; + interrupts = ; +-- +2.35.1 + diff --git a/queue-5.10/arm-dts-imx7d-colibri-emmc-add-cpu1-supply.patch b/queue-5.10/arm-dts-imx7d-colibri-emmc-add-cpu1-supply.patch new file mode 100644 index 00000000000..ceb071b26ad --- /dev/null +++ b/queue-5.10/arm-dts-imx7d-colibri-emmc-add-cpu1-supply.patch @@ -0,0 +1,38 @@ +From 340393f21e57109a2fedae64078137ae3016a38d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 16 May 2022 15:47:23 +0200 +Subject: ARM: dts: imx7d-colibri-emmc: add cpu1 supply + +From: Marcel Ziswiler + +[ Upstream commit ba28db60d34271e8a3cf4d7158d71607e8b1e57f ] + +Each cpu-core is supposed to list its supply separately, add supply for +cpu1. + +Fixes: 2d7401f8632f ("ARM: dts: imx7d: Add cpu1 supply") +Signed-off-by: Marcel Ziswiler +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx7d-colibri-emmc.dtsi | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/arch/arm/boot/dts/imx7d-colibri-emmc.dtsi b/arch/arm/boot/dts/imx7d-colibri-emmc.dtsi +index af39e5370fa1..045e4413d339 100644 +--- a/arch/arm/boot/dts/imx7d-colibri-emmc.dtsi ++++ b/arch/arm/boot/dts/imx7d-colibri-emmc.dtsi +@@ -13,6 +13,10 @@ memory@80000000 { + }; + }; + ++&cpu1 { ++ cpu-supply = <®_DCDC2>; ++}; ++ + &gpio6 { + gpio-line-names = "", + "", +-- +2.35.1 + diff --git a/queue-5.10/arm-dts-qcom-mdm9615-add-missing-pmic-gpio-reg.patch b/queue-5.10/arm-dts-qcom-mdm9615-add-missing-pmic-gpio-reg.patch new file mode 100644 index 00000000000..cbdff5acf6b --- /dev/null +++ b/queue-5.10/arm-dts-qcom-mdm9615-add-missing-pmic-gpio-reg.patch @@ -0,0 +1,36 @@ +From e593eb8f5cbe3f4a14181fa24ba098bb85f1f1c7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 7 May 2022 21:49:12 +0200 +Subject: ARM: dts: qcom: mdm9615: add missing PMIC GPIO reg + +From: Krzysztof Kozlowski + +[ Upstream commit dc590cdc31f636ea15658f1206c3e380a53fb78e ] + +'reg' property is required in SSBI children: + qcom-mdm9615-wp8548-mangoh-green.dtb: gpio@150: 'reg' is a required property + +Fixes: 2c5e596524e7 ("ARM: dts: Add MDM9615 dtsi") +Signed-off-by: Krzysztof Kozlowski +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220507194913.261121-11-krzysztof.kozlowski@linaro.org +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/qcom-mdm9615.dtsi | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm/boot/dts/qcom-mdm9615.dtsi b/arch/arm/boot/dts/qcom-mdm9615.dtsi +index dda2ceec6591..ad9b52d53ef9 100644 +--- a/arch/arm/boot/dts/qcom-mdm9615.dtsi ++++ b/arch/arm/boot/dts/qcom-mdm9615.dtsi +@@ -324,6 +324,7 @@ rtc@11d { + + pmicgpio: gpio@150 { + compatible = "qcom,pm8018-gpio", "qcom,ssbi-gpio"; ++ reg = <0x150>; + interrupt-controller; + #interrupt-cells = <2>; + gpio-controller; +-- +2.35.1 + diff --git a/queue-5.10/arm-dts-qcom-pm8841-add-required-thermal-sensor-cell.patch b/queue-5.10/arm-dts-qcom-pm8841-add-required-thermal-sensor-cell.patch new file mode 100644 index 00000000000..67c3081bc0a --- /dev/null +++ b/queue-5.10/arm-dts-qcom-pm8841-add-required-thermal-sensor-cell.patch @@ -0,0 +1,35 @@ +From 7df90eeffe574180ebbb50b3b95fd39483186456 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Jun 2022 13:27:02 +0200 +Subject: ARM: dts: qcom: pm8841: add required thermal-sensor-cells + +From: Krzysztof Kozlowski + +[ Upstream commit e2759fa0676c9a32bbddb9aff955b54bb35066ad ] + +The PM8841 temperature sensor has to define thermal-sensor-cells. + +Fixes: dab8134ca072 ("ARM: dts: qcom: Add PM8841 functions device nodes") +Signed-off-by: Krzysztof Kozlowski +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220608112702.80873-2-krzysztof.kozlowski@linaro.org +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/qcom-pm8841.dtsi | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm/boot/dts/qcom-pm8841.dtsi b/arch/arm/boot/dts/qcom-pm8841.dtsi +index 2fd59c440903..c73e5b149ac5 100644 +--- a/arch/arm/boot/dts/qcom-pm8841.dtsi ++++ b/arch/arm/boot/dts/qcom-pm8841.dtsi +@@ -25,6 +25,7 @@ temp-alarm@2400 { + compatible = "qcom,spmi-temp-alarm"; + reg = <0x2400>; + interrupts = <4 0x24 0 IRQ_TYPE_EDGE_RISING>; ++ #thermal-sensor-cells = <0>; + }; + }; + +-- +2.35.1 + diff --git a/queue-5.10/arm-findbit-fix-overflowing-offset.patch b/queue-5.10/arm-findbit-fix-overflowing-offset.patch new file mode 100644 index 00000000000..9a4f8a8dd79 --- /dev/null +++ b/queue-5.10/arm-findbit-fix-overflowing-offset.patch @@ -0,0 +1,76 @@ +From 8250a166ede771441aff2bd5522133a4f2d73b0b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Jul 2022 23:51:48 +0100 +Subject: ARM: findbit: fix overflowing offset + +From: Russell King (Oracle) + +[ Upstream commit ec85bd369fd2bfaed6f45dd678706429d4f75b48 ] + +When offset is larger than the size of the bit array, we should not +attempt to access the array as we can perform an access beyond the +end of the array. Fix this by changing the pre-condition. + +Using "cmp r2, r1; bhs ..." covers us for the size == 0 case, since +this will always take the branch when r1 is zero, irrespective of +the value of r2. This means we can fix this bug without adding any +additional code! + +Tested-by: Guenter Roeck +Signed-off-by: Russell King (Oracle) +Signed-off-by: Sasha Levin +--- + arch/arm/lib/findbit.S | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/arch/arm/lib/findbit.S b/arch/arm/lib/findbit.S +index b5e8b9ae4c7d..7fd3600db8ef 100644 +--- a/arch/arm/lib/findbit.S ++++ b/arch/arm/lib/findbit.S +@@ -40,8 +40,8 @@ ENDPROC(_find_first_zero_bit_le) + * Prototype: int find_next_zero_bit(void *addr, unsigned int maxbit, int offset) + */ + ENTRY(_find_next_zero_bit_le) +- teq r1, #0 +- beq 3b ++ cmp r2, r1 ++ bhs 3b + ands ip, r2, #7 + beq 1b @ If new byte, goto old routine + ARM( ldrb r3, [r0, r2, lsr #3] ) +@@ -81,8 +81,8 @@ ENDPROC(_find_first_bit_le) + * Prototype: int find_next_zero_bit(void *addr, unsigned int maxbit, int offset) + */ + ENTRY(_find_next_bit_le) +- teq r1, #0 +- beq 3b ++ cmp r2, r1 ++ bhs 3b + ands ip, r2, #7 + beq 1b @ If new byte, goto old routine + ARM( ldrb r3, [r0, r2, lsr #3] ) +@@ -115,8 +115,8 @@ ENTRY(_find_first_zero_bit_be) + ENDPROC(_find_first_zero_bit_be) + + ENTRY(_find_next_zero_bit_be) +- teq r1, #0 +- beq 3b ++ cmp r2, r1 ++ bhs 3b + ands ip, r2, #7 + beq 1b @ If new byte, goto old routine + eor r3, r2, #0x18 @ big endian byte ordering +@@ -149,8 +149,8 @@ ENTRY(_find_first_bit_be) + ENDPROC(_find_first_bit_be) + + ENTRY(_find_next_bit_be) +- teq r1, #0 +- beq 3b ++ cmp r2, r1 ++ bhs 3b + ands ip, r2, #7 + beq 1b @ If new byte, goto old routine + eor r3, r2, #0x18 @ big endian byte ordering +-- +2.35.1 + diff --git a/queue-5.10/arm-omap2-display-fix-refcount-leak-bug.patch b/queue-5.10/arm-omap2-display-fix-refcount-leak-bug.patch new file mode 100644 index 00000000000..8b6df36e16c --- /dev/null +++ b/queue-5.10/arm-omap2-display-fix-refcount-leak-bug.patch @@ -0,0 +1,36 @@ +From 547d59d3f762d56e3c6f768d20fa7c0e7bdd438e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 Jun 2022 22:58:03 +0800 +Subject: ARM: OMAP2+: display: Fix refcount leak bug + +From: Liang He + +[ Upstream commit 50b87a32a79bca6e275918a711fb8cc55e16d739 ] + +In omapdss_init_fbdev(), of_find_node_by_name() will return a node +pointer with refcount incremented. We should use of_node_put() when +it is not used anymore. + +Signed-off-by: Liang He +Message-Id: <20220617145803.4050918-1-windhl@126.com> +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/mach-omap2/display.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c +index 6098666e928d..fc635eed73ab 100644 +--- a/arch/arm/mach-omap2/display.c ++++ b/arch/arm/mach-omap2/display.c +@@ -211,6 +211,7 @@ static int __init omapdss_init_fbdev(void) + node = of_find_node_by_name(NULL, "omap4_padconf_global"); + if (node) + omap4_dsi_mux_syscon = syscon_node_to_regmap(node); ++ of_node_put(node); + + return 0; + } +-- +2.35.1 + diff --git a/queue-5.10/arm-omap2-fix-refcount-leak-in-omap3xxx_prm_late_ini.patch b/queue-5.10/arm-omap2-fix-refcount-leak-in-omap3xxx_prm_late_ini.patch new file mode 100644 index 00000000000..be1753e8559 --- /dev/null +++ b/queue-5.10/arm-omap2-fix-refcount-leak-in-omap3xxx_prm_late_ini.patch @@ -0,0 +1,37 @@ +From 68028930adc451b9bede06ba9138960fa460afa0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 May 2022 11:37:24 +0400 +Subject: ARM: OMAP2+: Fix refcount leak in omap3xxx_prm_late_init + +From: Miaoqian Lin + +[ Upstream commit 942228fbf5d4901112178b93d41225be7c0dd9de ] + +of_find_matching_node() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak. + +Fixes: 1e037794f7f0 ("ARM: OMAP3+: PRM: register interrupt information from DT") +Signed-off-by: Miaoqian Lin +Message-Id: <20220526073724.21169-1-linmq006@gmail.com> +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/mach-omap2/prm3xxx.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm/mach-omap2/prm3xxx.c b/arch/arm/mach-omap2/prm3xxx.c +index 1b442b128569..63e73e9b82bc 100644 +--- a/arch/arm/mach-omap2/prm3xxx.c ++++ b/arch/arm/mach-omap2/prm3xxx.c +@@ -708,6 +708,7 @@ static int omap3xxx_prm_late_init(void) + } + + irq_num = of_irq_get(np, 0); ++ of_node_put(np); + if (irq_num == -EPROBE_DEFER) + return irq_num; + +-- +2.35.1 + diff --git a/queue-5.10/arm-omap2-fix-refcount-leak-in-omapdss_init_of.patch b/queue-5.10/arm-omap2-fix-refcount-leak-in-omapdss_init_of.patch new file mode 100644 index 00000000000..0a79204121f --- /dev/null +++ b/queue-5.10/arm-omap2-fix-refcount-leak-in-omapdss_init_of.patch @@ -0,0 +1,45 @@ +From 52df0cbb5bfb82f5e048dbbb4e878344d3f0d74f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 1 Jun 2022 08:48:58 +0400 +Subject: ARM: OMAP2+: Fix refcount leak in omapdss_init_of + +From: Miaoqian Lin + +[ Upstream commit 9705db1eff38d6b9114121f9e253746199b759c9 ] + +omapdss_find_dss_of_node() calls of_find_compatible_node() to get device +node. of_find_compatible_node() returns a node pointer with refcount +incremented, we should use of_node_put() on it when done. +Add missing of_node_put() in later error path and normal path. + +Fixes: e0c827aca0730 ("drm/omap: Populate DSS children in omapdss driver") +Signed-off-by: Miaoqian Lin +Message-Id: <20220601044858.3352-1-linmq006@gmail.com> +Reviewed-by: Laurent Pinchart +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/mach-omap2/display.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c +index fc635eed73ab..f24d4e56ddfc 100644 +--- a/arch/arm/mach-omap2/display.c ++++ b/arch/arm/mach-omap2/display.c +@@ -260,11 +260,13 @@ static int __init omapdss_init_of(void) + + if (!pdev) { + pr_err("Unable to find DSS platform device\n"); ++ of_node_put(node); + return -ENODEV; + } + + r = of_platform_populate(node, NULL, NULL, &pdev->dev); + put_device(&pdev->dev); ++ of_node_put(node); + if (r) { + pr_err("Unable to populate DSS submodule devices\n"); + return r; +-- +2.35.1 + diff --git a/queue-5.10/arm-shmobile-rcar-gen2-increase-refcount-for-new-ref.patch b/queue-5.10/arm-shmobile-rcar-gen2-increase-refcount-for-new-ref.patch new file mode 100644 index 00000000000..dc828a76b5d --- /dev/null +++ b/queue-5.10/arm-shmobile-rcar-gen2-increase-refcount-for-new-ref.patch @@ -0,0 +1,60 @@ +From 3d326d5ecdb544e46ca5ea40cbb08c1a57d32cdb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 20:18:04 +0800 +Subject: ARM: shmobile: rcar-gen2: Increase refcount for new reference + +From: Liang He + +[ Upstream commit 75a185fb92e58ccd3670258d8d3b826bd2fa6d29 ] + +In rcar_gen2_regulator_quirk(), for_each_matching_node_and_match() will +automatically increase and decrease the refcount. However, we should +call of_node_get() for the new reference created in 'quirk->np'. +Besides, we also should call of_node_put() before the 'quirk' being +freed. + +Signed-off-by: Liang He +Link: https://lore.kernel.org/r/20220701121804.234223-1-windhl@126.com +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Sasha Levin +--- + arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c b/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c +index 09ef73b99dd8..ba44cec5e59a 100644 +--- a/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c ++++ b/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c +@@ -125,6 +125,7 @@ static int regulator_quirk_notify(struct notifier_block *nb, + + list_for_each_entry_safe(pos, tmp, &quirk_list, list) { + list_del(&pos->list); ++ of_node_put(pos->np); + kfree(pos); + } + +@@ -174,11 +175,12 @@ static int __init rcar_gen2_regulator_quirk(void) + memcpy(&quirk->i2c_msg, id->data, sizeof(quirk->i2c_msg)); + + quirk->id = id; +- quirk->np = np; ++ quirk->np = of_node_get(np); + quirk->i2c_msg.addr = addr; + + ret = of_irq_parse_one(np, 0, argsa); + if (ret) { /* Skip invalid entry and continue */ ++ of_node_put(np); + kfree(quirk); + continue; + } +@@ -225,6 +227,7 @@ static int __init rcar_gen2_regulator_quirk(void) + err_mem: + list_for_each_entry_safe(pos, tmp, &quirk_list, list) { + list_del(&pos->list); ++ of_node_put(pos->np); + kfree(pos); + } + +-- +2.35.1 + diff --git a/queue-5.10/arm64-cpufeature-allow-different-pmu-versions-in-id_.patch b/queue-5.10/arm64-cpufeature-allow-different-pmu-versions-in-id_.patch new file mode 100644 index 00000000000..92247cec23a --- /dev/null +++ b/queue-5.10/arm64-cpufeature-allow-different-pmu-versions-in-id_.patch @@ -0,0 +1,61 @@ +From 1cf0f40d40e28c5668cb49d5f40f5bd4097cd006 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 Jun 2022 12:13:32 +0100 +Subject: arm64: cpufeature: Allow different PMU versions in ID_DFR0_EL1 + +From: Alexandru Elisei + +[ Upstream commit 506506cad3947b942425b119ffa2b06715d5d804 ] + +Commit b20d1ba3cf4b ("arm64: cpufeature: allow for version discrepancy in +PMU implementations") made it possible to run Linux on a machine with PMUs +with different versions without tainting the kernel. The patch relaxed the +restriction only for the ID_AA64DFR0_EL1.PMUVer field, and missed doing the +same for ID_DFR0_EL1.PerfMon , which also reports the PMU version, but for +the AArch32 state. + +For example, with Linux running on two clusters with different PMU +versions, the kernel is tainted when bringing up secondaries with the +following message: + +[ 0.097027] smp: Bringing up secondary CPUs ... +[..] +[ 0.142805] Detected PIPT I-cache on CPU4 +[ 0.142805] CPU features: SANITY CHECK: Unexpected variation in SYS_ID_DFR0_EL1. Boot CPU: 0x00000004011088, CPU4: 0x00000005011088 +[ 0.143555] CPU features: Unsupported CPU feature variation detected. +[ 0.143702] GICv3: CPU4: found redistributor 10000 region 0:0x000000002f180000 +[ 0.143702] GICv3: CPU4: using allocated LPI pending table @0x00000008800d0000 +[ 0.144888] CPU4: Booted secondary processor 0x0000010000 [0x410fd0f0] + +The boot CPU implements FEAT_PMUv3p1 (ID_DFR0_EL1.PerfMon, bits 27:24, is +0b0100), but CPU4, part of the other cluster, implements FEAT_PMUv3p4 +(ID_DFR0_EL1.PerfMon = 0b0101). + +Treat the PerfMon field as FTR_NONSTRICT and FTR_EXACT to pass the sanity +check and to match how PMUVer is treated for the 64bit ID register. + +Fixes: b20d1ba3cf4b ("arm64: cpufeature: allow for version discrepancy in PMU implementations") +Signed-off-by: Alexandru Elisei +Link: https://lore.kernel.org/r/20220617111332.203061-1-alexandru.elisei@arm.com +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + arch/arm64/kernel/cpufeature.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c +index c9108ed40645..4087e2d1f39e 100644 +--- a/arch/arm64/kernel/cpufeature.c ++++ b/arch/arm64/kernel/cpufeature.c +@@ -508,7 +508,7 @@ static const struct arm64_ftr_bits ftr_id_pfr2[] = { + + static const struct arm64_ftr_bits ftr_id_dfr0[] = { + /* [31:28] TraceFilt */ +- S_ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_PERFMON_SHIFT, 4, 0xf), ++ S_ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_EXACT, ID_DFR0_PERFMON_SHIFT, 4, 0), + ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_MPROFDBG_SHIFT, 4, 0), + ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_MMAPTRC_SHIFT, 4, 0), + ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_COPTRC_SHIFT, 4, 0), +-- +2.35.1 + diff --git a/queue-5.10/arm64-do-not-forget-syscall-when-starting-a-new-thre.patch b/queue-5.10/arm64-do-not-forget-syscall-when-starting-a-new-thre.patch new file mode 100644 index 00000000000..4c5e96bc45d --- /dev/null +++ b/queue-5.10/arm64-do-not-forget-syscall-when-starting-a-new-thre.patch @@ -0,0 +1,40 @@ +From b943f7216899f11cee815930a8335ec932a4a302 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Jun 2022 17:24:46 +0100 +Subject: arm64: Do not forget syscall when starting a new thread. + +From: Francis Laniel + +[ Upstream commit de6921856f99c11d3986c6702d851e1328d4f7f6 ] + +Enable tracing of the execve*() system calls with the +syscalls:sys_exit_execve tracepoint by removing the call to +forget_syscall() when starting a new thread and preserving the value of +regs->syscallno across exec. + +Signed-off-by: Francis Laniel +Link: https://lore.kernel.org/r/20220608162447.666494-2-flaniel@linux.microsoft.com +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + arch/arm64/include/asm/processor.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h +index fce8cbecd6bc..7c546c3487c9 100644 +--- a/arch/arm64/include/asm/processor.h ++++ b/arch/arm64/include/asm/processor.h +@@ -194,8 +194,9 @@ void tls_preserve_current_state(void); + + static inline void start_thread_common(struct pt_regs *regs, unsigned long pc) + { ++ s32 previous_syscall = regs->syscallno; + memset(regs, 0, sizeof(*regs)); +- forget_syscall(regs); ++ regs->syscallno = previous_syscall; + regs->pc = pc; + + if (system_uses_irq_prio_masking()) +-- +2.35.1 + diff --git a/queue-5.10/arm64-dts-allwinner-a64-orangepi-win-fix-led-node-na.patch b/queue-5.10/arm64-dts-allwinner-a64-orangepi-win-fix-led-node-na.patch new file mode 100644 index 00000000000..8aed49fb820 --- /dev/null +++ b/queue-5.10/arm64-dts-allwinner-a64-orangepi-win-fix-led-node-na.patch @@ -0,0 +1,37 @@ +From 4b490dc39e9b0d13bfd66c1f9469a8eddfe0be06 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Jul 2022 08:28:15 -0500 +Subject: arm64: dts: allwinner: a64: orangepi-win: Fix LED node name + +From: Samuel Holland + +[ Upstream commit b8eb2df19fbf97aa1e950cf491232c2e3bef8357 ] + +"status" does not match any pattern in the gpio-leds binding. Rename the +node to the preferred pattern. This fixes a `make dtbs_check` error. + +Signed-off-by: Samuel Holland +Reviewed-by: Jernej Skrabec +Signed-off-by: Jernej Skrabec +Link: https://lore.kernel.org/r/20220702132816.46456-1-samuel@sholland.org +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts +index 70e31743f0ba..3c08497568ea 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts +@@ -40,7 +40,7 @@ hdmi_con_in: endpoint { + leds { + compatible = "gpio-leds"; + +- status { ++ led-0 { + label = "orangepi:green:status"; + gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>; /* PH11 */ + }; +-- +2.35.1 + diff --git a/queue-5.10/arm64-dts-mt7622-fix-bpi-r64-wps-button.patch b/queue-5.10/arm64-dts-mt7622-fix-bpi-r64-wps-button.patch new file mode 100644 index 00000000000..7f1daa831b6 --- /dev/null +++ b/queue-5.10/arm64-dts-mt7622-fix-bpi-r64-wps-button.patch @@ -0,0 +1,52 @@ +From 1cd9573fe1a0e56cf70ce9d42875eac47122913c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 30 Jun 2022 13:16:57 +0200 +Subject: arm64: dts: mt7622: fix BPI-R64 WPS button + +From: Nick Hainke + +[ Upstream commit c98e6e683632386a3bd284acda4342e68aec4c41 ] + +The bananapi R64 (BPI-R64) experiences wrong WPS button signals. +In OpenWrt pushing the WPS button while powering on the device will set +it to recovery mode. Currently, this also happens without any user +interaction. In particular, the wrong signals appear while booting the +device or restarting it, e.g. after doing a system upgrade. If the +device is in recovery mode the user needs to manually power cycle or +restart it. + +The official BPI-R64 sources set the WPS button to GPIO_ACTIVE_LOW in +the device tree. This setting seems to suppress the unwanted WPS button +press signals. So this commit changes the button from GPIO_ACTIVE_HIGH to +GPIO_ACTIVE_LOW. + +The official BPI-R64 sources can be found on +https://github.com/BPI-SINOVOIP/BPI-R64-openwrt + +Fixes: 0b6286dd96c0 ("arm64: dts: mt7622: add bananapi BPI-R64 board") + +Suggested-by: INAGAKI Hiroshi +Signed-off-by: Nick Hainke +Link: https://lore.kernel.org/r/20220630111746.4098-1-vincent@systemli.org +Signed-off-by: Matthias Brugger +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +index 9a11e5c60c26..3053f484c8cc 100644 +--- a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts ++++ b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +@@ -49,7 +49,7 @@ factory { + wps { + label = "wps"; + linux,code = ; +- gpios = <&pio 102 GPIO_ACTIVE_HIGH>; ++ gpios = <&pio 102 GPIO_ACTIVE_LOW>; + }; + }; + +-- +2.35.1 + diff --git a/queue-5.10/arm64-dts-qcom-ipq8074-fix-nand-node-name.patch b/queue-5.10/arm64-dts-qcom-ipq8074-fix-nand-node-name.patch new file mode 100644 index 00000000000..55dee371ec6 --- /dev/null +++ b/queue-5.10/arm64-dts-qcom-ipq8074-fix-nand-node-name.patch @@ -0,0 +1,37 @@ +From 8af344ce313f9d6c552204009fa25761f9f62c41 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 21 Jun 2022 14:06:42 +0200 +Subject: arm64: dts: qcom: ipq8074: fix NAND node name + +From: Robert Marko + +[ Upstream commit b39961659ffc3c3a9e3d0d43b0476547b5f35d49 ] + +Per schema it should be nand-controller@79b0000 instead of nand@79b0000. +Fix it to match nand-controller.yaml requirements. + +Signed-off-by: Robert Marko +Reviewed-by: Krzysztof Kozlowski +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220621120642.518575-1-robimarko@gmail.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/ipq8074.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/qcom/ipq8074.dtsi b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +index dca040f66f5f..99e2488b92dc 100644 +--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +@@ -383,7 +383,7 @@ qpic_bam: dma@7984000 { + status = "disabled"; + }; + +- qpic_nand: nand@79b0000 { ++ qpic_nand: nand-controller@79b0000 { + compatible = "qcom,ipq8074-nand"; + reg = <0x079b0000 0x10000>; + #address-cells = <1>; +-- +2.35.1 + diff --git a/queue-5.10/arm64-dts-qcom-msm8916-fix-typo-in-pronto-remoteproc.patch b/queue-5.10/arm64-dts-qcom-msm8916-fix-typo-in-pronto-remoteproc.patch new file mode 100644 index 00000000000..9c3eb29a2cb --- /dev/null +++ b/queue-5.10/arm64-dts-qcom-msm8916-fix-typo-in-pronto-remoteproc.patch @@ -0,0 +1,42 @@ +From 42eeda577be6ac22a01af6156f112e38f0adda79 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 May 2022 19:47:40 +0530 +Subject: arm64: dts: qcom: msm8916: Fix typo in pronto remoteproc node + +From: Sireesh Kodali + +[ Upstream commit 5458d6f2827cd30218570f266b8d238417461f2f ] + +The smem-state properties for the pronto node were incorrectly labelled, +reading `qcom,state*` rather than `qcom,smem-state*`. Fix that, allowing +the stop state to be used. + +Fixes: 88106096cbf8 ("ARM: dts: msm8916: Add and enable wcnss node") +Signed-off-by: Sireesh Kodali +Reviewed-by: Krzysztof Kozlowski +Reviewed-by: Stephan Gerhold +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220526141740.15834-3-sireeshkodali1@gmail.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/msm8916.dtsi | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi +index 72bc01ad9166..ab86971e8e6e 100644 +--- a/arch/arm64/boot/dts/qcom/msm8916.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi +@@ -1675,8 +1675,8 @@ pronto: remoteproc@a21b000 { + <&rpmpd MSM8916_VDDMX>; + power-domain-names = "cx", "mx"; + +- qcom,state = <&wcnss_smp2p_out 0>; +- qcom,state-names = "stop"; ++ qcom,smem-states = <&wcnss_smp2p_out 0>; ++ qcom,smem-state-names = "stop"; + + pinctrl-names = "default"; + pinctrl-0 = <&wcnss_pin_a>; +-- +2.35.1 + diff --git a/queue-5.10/arm64-dts-qcom-msm8916-use-power-domains-for-mss-wcn.patch b/queue-5.10/arm64-dts-qcom-msm8916-use-power-domains-for-mss-wcn.patch new file mode 100644 index 00000000000..f6d9b12e72b --- /dev/null +++ b/queue-5.10/arm64-dts-qcom-msm8916-use-power-domains-for-mss-wcn.patch @@ -0,0 +1,82 @@ +From 7780ae3f3651db602c3bd5f04a456d7c7ba995fe Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 16 Sep 2020 12:41:34 +0200 +Subject: arm64: dts: qcom: msm8916: Use power domains for MSS/WCNSS + remoteprocs + +From: Stephan Gerhold + +[ Upstream commit 809f299a969873581c832bbcb1b8cccaf8af2eeb ] + +So far we have been making proxy votes for the remote processors +through the regulator interface. Now that we have rpmpd it's better +to vote for performance states through the power domain interface. + +This also allows us to move these supplies back to msm8916.dtsi +because the device tree binding for RPMPD is independent of the +underlying regulator/PMIC. + +Signed-off-by: Stephan Gerhold +Link: https://lore.kernel.org/r/20200916104135.25085-10-stephan@gerhold.net +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/msm8916-pm8916.dtsi | 3 --- + arch/arm64/boot/dts/qcom/msm8916.dtsi | 9 +++++++++ + 2 files changed, 9 insertions(+), 3 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/msm8916-pm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916-pm8916.dtsi +index cd626e7db599..513e433aa5f3 100644 +--- a/arch/arm64/boot/dts/qcom/msm8916-pm8916.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8916-pm8916.dtsi +@@ -17,13 +17,10 @@ &dsi_phy0 { + }; + + &mpss { +- cx-supply = <&pm8916_s1>; +- mx-supply = <&pm8916_l3>; + pll-supply = <&pm8916_l7>; + }; + + &pronto { +- vddmx-supply = <&pm8916_l3>; + vddpx-supply = <&pm8916_l7>; + + iris { +diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi +index 291276a38d7c..72bc01ad9166 100644 +--- a/arch/arm64/boot/dts/qcom/msm8916.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -1263,6 +1264,10 @@ mpss: remoteproc@4080000 { + interrupt-names = "wdog", "fatal", "ready", + "handover", "stop-ack"; + ++ power-domains = <&rpmpd MSM8916_VDDCX>, ++ <&rpmpd MSM8916_VDDMX>; ++ power-domain-names = "cx", "mx"; ++ + clocks = <&gcc GCC_MSS_CFG_AHB_CLK>, + <&gcc GCC_MSS_Q6_BIMC_AXI_CLK>, + <&gcc GCC_BOOT_ROM_AHB_CLK>, +@@ -1666,6 +1671,10 @@ pronto: remoteproc@a21b000 { + <&wcnss_smp2p_in 3 IRQ_TYPE_EDGE_RISING>; + interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack"; + ++ power-domains = <&rpmpd MSM8916_VDDCX>, ++ <&rpmpd MSM8916_VDDMX>; ++ power-domain-names = "cx", "mx"; ++ + qcom,state = <&wcnss_smp2p_out 0>; + qcom,state-names = "stop"; + +-- +2.35.1 + diff --git a/queue-5.10/arm64-dts-qcom-qcs404-fix-incorrect-usb2-phys-assign.patch b/queue-5.10/arm64-dts-qcom-qcs404-fix-incorrect-usb2-phys-assign.patch new file mode 100644 index 00000000000..4f2923411f3 --- /dev/null +++ b/queue-5.10/arm64-dts-qcom-qcs404-fix-incorrect-usb2-phys-assign.patch @@ -0,0 +1,63 @@ +From 0cc644880969c05711acb25be10eaa797bc2f7a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jul 2022 14:00:38 +0530 +Subject: arm64: dts: qcom: qcs404: Fix incorrect USB2 PHYs assignment + +From: Sumit Garg + +[ Upstream commit 58577966a42fc0b660b5e2c7c9e5a2241363ea83 ] + +Currently the DT for QCS404 SoC has setup for 2 USB2 PHYs with one each +assigned to USB3 controller and USB2 controller. This assignment is +incorrect which only works by luck: as when each USB HCI comes up it +configures the *other* controllers PHY which is enough to make them +happy. If, for any reason, we were to disable one of the controllers then +both would stop working. + +This was a difficult inconsistency to be caught which was found while +trying to enable USB support in u-boot. So with all the required drivers +ported to u-boot, I couldn't get the same USB storage device enumerated +in u-boot which was being enumerated fine by the kernel. + +The root cause of the problem came out to be that I wasn't enabling USB2 +PHY: "usb2_phy_prim" in u-boot. Then I realised that via simply disabling +the same USB2 PHY currently assigned to USB2 host controller in the +kernel disabled enumeration for USB3 host controller as well. + +So fix this inconsistency by correctly assigning USB2 PHYs. + +Fixes: 9375e7d719b3 ("arm64: dts: qcom: qcs404: Add USB devices and PHYs") +Signed-off-by: Sumit Garg +Reviewed-by: Daniel Thompson +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220711083038.1518529-1-sumit.garg@linaro.org +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/qcs404.dtsi | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/qcs404.dtsi b/arch/arm64/boot/dts/qcom/qcs404.dtsi +index b654b802e95c..7bddc5ebc6aa 100644 +--- a/arch/arm64/boot/dts/qcom/qcs404.dtsi ++++ b/arch/arm64/boot/dts/qcom/qcs404.dtsi +@@ -548,7 +548,7 @@ dwc3@7580000 { + compatible = "snps,dwc3"; + reg = <0x07580000 0xcd00>; + interrupts = ; +- phys = <&usb2_phy_sec>, <&usb3_phy>; ++ phys = <&usb2_phy_prim>, <&usb3_phy>; + phy-names = "usb2-phy", "usb3-phy"; + snps,has-lpm-erratum; + snps,hird-threshold = /bits/ 8 <0x10>; +@@ -577,7 +577,7 @@ dwc3@78c0000 { + compatible = "snps,dwc3"; + reg = <0x078c0000 0xcc00>; + interrupts = ; +- phys = <&usb2_phy_prim>; ++ phys = <&usb2_phy_sec>; + phy-names = "usb2-phy"; + snps,has-lpm-erratum; + snps,hird-threshold = /bits/ 8 <0x10>; +-- +2.35.1 + diff --git a/queue-5.10/arm64-dts-renesas-beacon-fix-regulator-node-names.patch b/queue-5.10/arm64-dts-renesas-beacon-fix-regulator-node-names.patch new file mode 100644 index 00000000000..54be0278629 --- /dev/null +++ b/queue-5.10/arm64-dts-renesas-beacon-fix-regulator-node-names.patch @@ -0,0 +1,60 @@ +From aa52b2b34a2dd8c3709e9c6e58f7eebcb622013a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 11 May 2022 12:14:06 +0200 +Subject: arm64: dts: renesas: beacon: Fix regulator node names + +From: Geert Uytterhoeven + +[ Upstream commit 7512af9f78dedea7e04225f665dad6750df7d095 ] + +Currently there are two nodes named "regulator_camera". This causes the +former to be overwritten by the latter. + +Fix this by renaming them to unique names, using the preferred hyphen +instead of an underscore. + +While at it, update the name of the audio regulator (which was added in +the same commit) to use a hyphen. + +Fixes: a1d8a344f1ca0709 ("arm64: dts: renesas: Introduce r8a774a1-beacon-rzg2m-kit") +Signed-off-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/a9ac82bdf108162487289d091c53a9b3de393f13.1652263918.git.geert+renesas@glider.be +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/renesas/beacon-renesom-baseboard.dtsi | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/arch/arm64/boot/dts/renesas/beacon-renesom-baseboard.dtsi b/arch/arm64/boot/dts/renesas/beacon-renesom-baseboard.dtsi +index bc4bb5dd8bae..53e1d43cbecf 100644 +--- a/arch/arm64/boot/dts/renesas/beacon-renesom-baseboard.dtsi ++++ b/arch/arm64/boot/dts/renesas/beacon-renesom-baseboard.dtsi +@@ -145,7 +145,7 @@ rgb_panel: endpoint { + }; + }; + +- reg_audio: regulator_audio { ++ reg_audio: regulator-audio { + compatible = "regulator-fixed"; + regulator-name = "audio-1.8V"; + regulator-min-microvolt = <1800000>; +@@ -173,7 +173,7 @@ reg_lcd_reset: regulator-lcd-reset { + vin-supply = <®_lcd>; + }; + +- reg_cam0: regulator_camera { ++ reg_cam0: regulator-cam0 { + compatible = "regulator-fixed"; + regulator-name = "reg_cam0"; + regulator-min-microvolt = <1800000>; +@@ -182,7 +182,7 @@ reg_cam0: regulator_camera { + enable-active-high; + }; + +- reg_cam1: regulator_camera { ++ reg_cam1: regulator-cam1 { + compatible = "regulator-fixed"; + regulator-name = "reg_cam1"; + regulator-min-microvolt = <1800000>; +-- +2.35.1 + diff --git a/queue-5.10/arm64-dts-renesas-fix-thermal-sensors-on-single-zone.patch b/queue-5.10/arm64-dts-renesas-fix-thermal-sensors-on-single-zone.patch new file mode 100644 index 00000000000..9a4f1dad88b --- /dev/null +++ b/queue-5.10/arm64-dts-renesas-fix-thermal-sensors-on-single-zone.patch @@ -0,0 +1,67 @@ +From 083234ec957aa15ee8426df145efd08b09dc08bf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 Jun 2022 16:04:26 +0200 +Subject: arm64: dts: renesas: Fix thermal-sensors on single-zone sensors +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Geert Uytterhoeven + +[ Upstream commit 62e8a53431145e06e503b71625a34eaa87b72b2c ] + +"make dtbs_check": + + arch/arm64/boot/dts/renesas/r8a774c0-cat874.dtb: thermal-zones: cpu-thermal:thermal-sensors: [[74], [0]] is too long + arch/arm64/boot/dts/renesas/r8a774c0-ek874.dtb: thermal-zones: cpu-thermal:thermal-sensors: [[79], [0]] is too long + arch/arm64/boot/dts/renesas/r8a774c0-ek874-idk-2121wr.dtb: thermal-zones: cpu-thermal:thermal-sensors: [[82], [0]] is too long + arch/arm64/boot/dts/renesas/r8a774c0-ek874-mipi-2.1.dtb: thermal-zones: cpu-thermal:thermal-sensors: [[87], [0]] is too long + arch/arm64/boot/dts/renesas/r8a77990-ebisu.dtb: thermal-zones: cpu-thermal:thermal-sensors: [[105], [0]] is too long + From schema: Documentation/devicetree/bindings/thermal/thermal-zones.yaml + +Indeed, the thermal sensors on R-Car E3 and RZ/G2E support only a single +zone, hence #thermal-sensor-cells = <0>. + +Fix this by dropping the bogus zero cell from the thermal sensor +specifiers. + +Fixes: 8fa7d18f9ee2dc20 ("arm64: dts: renesas: r8a77990: Create thermal zone to support IPA") +Fixes: 8438bfda9d768157 ("arm64: dts: renesas: r8a774c0: Create thermal zone to support IPA") +Signed-off-by: Geert Uytterhoeven +Reviewed-by: Niklas Söderlund +Link: https://lore.kernel.org/r/28b812fdd1fc3698311fac984ab8b91d3d655c1c.1655301684.git.geert+renesas@glider.be +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/renesas/r8a774c0.dtsi | 2 +- + arch/arm64/boot/dts/renesas/r8a77990.dtsi | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/boot/dts/renesas/r8a774c0.dtsi b/arch/arm64/boot/dts/renesas/r8a774c0.dtsi +index e0e54342cd4c..4c7d7e8f8e28 100644 +--- a/arch/arm64/boot/dts/renesas/r8a774c0.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a774c0.dtsi +@@ -1929,7 +1929,7 @@ thermal-zones { + cpu-thermal { + polling-delay-passive = <250>; + polling-delay = <0>; +- thermal-sensors = <&thermal 0>; ++ thermal-sensors = <&thermal>; + sustainable-power = <717>; + + cooling-maps { +diff --git a/arch/arm64/boot/dts/renesas/r8a77990.dtsi b/arch/arm64/boot/dts/renesas/r8a77990.dtsi +index 33d7e657bd9c..37159b9408e8 100644 +--- a/arch/arm64/boot/dts/renesas/r8a77990.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a77990.dtsi +@@ -2029,7 +2029,7 @@ thermal-zones { + cpu-thermal { + polling-delay-passive = <250>; + polling-delay = <0>; +- thermal-sensors = <&thermal 0>; ++ thermal-sensors = <&thermal>; + sustainable-power = <717>; + + cooling-maps { +-- +2.35.1 + diff --git a/queue-5.10/arm64-fix-oops-in-concurrently-setting-insn_emulatio.patch b/queue-5.10/arm64-fix-oops-in-concurrently-setting-insn_emulatio.patch new file mode 100644 index 00000000000..2ec53dd03fc --- /dev/null +++ b/queue-5.10/arm64-fix-oops-in-concurrently-setting-insn_emulatio.patch @@ -0,0 +1,93 @@ +From 8d5e5292fde35b9c42eb1254ffb33c7ac8912c20 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Jul 2022 05:43:19 +0000 +Subject: arm64: fix oops in concurrently setting insn_emulation sysctls +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: haibinzhang (张海斌) + +[ Upstream commit af483947d472eccb79e42059276c4deed76f99a6 ] + +emulation_proc_handler() changes table->data for proc_dointvec_minmax +and can generate the following Oops if called concurrently with itself: + + | Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010 + | Internal error: Oops: 96000006 [#1] SMP + | Call trace: + | update_insn_emulation_mode+0xc0/0x148 + | emulation_proc_handler+0x64/0xb8 + | proc_sys_call_handler+0x9c/0xf8 + | proc_sys_write+0x18/0x20 + | __vfs_write+0x20/0x48 + | vfs_write+0xe4/0x1d0 + | ksys_write+0x70/0xf8 + | __arm64_sys_write+0x20/0x28 + | el0_svc_common.constprop.0+0x7c/0x1c0 + | el0_svc_handler+0x2c/0xa0 + | el0_svc+0x8/0x200 + +To fix this issue, keep the table->data as &insn->current_mode and +use container_of() to retrieve the insn pointer. Another mutex is +used to protect against the current_mode update but not for retrieving +insn_emulation as table->data is no longer changing. + +Co-developed-by: hewenliang +Signed-off-by: hewenliang +Signed-off-by: Haibin Zhang +Reviewed-by: Catalin Marinas +Link: https://lore.kernel.org/r/20220128090324.2727688-1-hewenliang4@huawei.com +Link: https://lore.kernel.org/r/9A004C03-250B-46C5-BF39-782D7551B00E@tencent.com +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + arch/arm64/kernel/armv8_deprecated.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/arch/arm64/kernel/armv8_deprecated.c b/arch/arm64/kernel/armv8_deprecated.c +index 7364de008bab..91b8a8378ba3 100644 +--- a/arch/arm64/kernel/armv8_deprecated.c ++++ b/arch/arm64/kernel/armv8_deprecated.c +@@ -59,6 +59,7 @@ struct insn_emulation { + static LIST_HEAD(insn_emulation); + static int nr_insn_emulated __initdata; + static DEFINE_RAW_SPINLOCK(insn_emulation_lock); ++static DEFINE_MUTEX(insn_emulation_mutex); + + static void register_emulation_hooks(struct insn_emulation_ops *ops) + { +@@ -207,10 +208,10 @@ static int emulation_proc_handler(struct ctl_table *table, int write, + loff_t *ppos) + { + int ret = 0; +- struct insn_emulation *insn = (struct insn_emulation *) table->data; ++ struct insn_emulation *insn = container_of(table->data, struct insn_emulation, current_mode); + enum insn_emulation_mode prev_mode = insn->current_mode; + +- table->data = &insn->current_mode; ++ mutex_lock(&insn_emulation_mutex); + ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); + + if (ret || !write || prev_mode == insn->current_mode) +@@ -223,7 +224,7 @@ static int emulation_proc_handler(struct ctl_table *table, int write, + update_insn_emulation_mode(insn, INSN_UNDEF); + } + ret: +- table->data = insn; ++ mutex_unlock(&insn_emulation_mutex); + return ret; + } + +@@ -247,7 +248,7 @@ static void __init register_insn_emulation_sysctl(void) + sysctl->maxlen = sizeof(int); + + sysctl->procname = insn->ops->name; +- sysctl->data = insn; ++ sysctl->data = &insn->current_mode; + sysctl->extra1 = &insn->min; + sysctl->extra2 = &insn->max; + sysctl->proc_handler = emulation_proc_handler; +-- +2.35.1 + diff --git a/queue-5.10/arm64-tegra-fix-sdmmc1-cd-on-p2888.patch b/queue-5.10/arm64-tegra-fix-sdmmc1-cd-on-p2888.patch new file mode 100644 index 00000000000..0268866cdff --- /dev/null +++ b/queue-5.10/arm64-tegra-fix-sdmmc1-cd-on-p2888.patch @@ -0,0 +1,39 @@ +From 908c1c64a25be95faca76ed414cf0614667ff8dc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 12 Jun 2022 14:59:45 +0000 +Subject: arm64: tegra: Fix SDMMC1 CD on P2888 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Tamás Szűcs + +[ Upstream commit b415bb7c976f1d595ed752001c0938f702645dab ] + +Hook SDMMC1 CD up with CVM GPIO02 (SOC_GPIO11) used for card detection on J4 +(uSD socket) on the carrier. + +Fixes: ef633bfc21e9 ("arm64: tegra: Enable card detect for SD card on P2888") +Signed-off-by: Tamás Szűcs +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi b/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi +index d71b7a1140fe..216dc30fa26c 100644 +--- a/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi ++++ b/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi +@@ -75,7 +75,7 @@ eeprom@50 { + + /* SDMMC1 (SD/MMC) */ + mmc@3400000 { +- cd-gpios = <&gpio TEGRA194_MAIN_GPIO(A, 0) GPIO_ACTIVE_LOW>; ++ cd-gpios = <&gpio TEGRA194_MAIN_GPIO(G, 7) GPIO_ACTIVE_LOW>; + }; + + /* SDMMC4 (eMMC) */ +-- +2.35.1 + diff --git a/queue-5.10/asoc-audio-graph-card-add-of_node_put-in-fail-path.patch b/queue-5.10/asoc-audio-graph-card-add-of_node_put-in-fail-path.patch new file mode 100644 index 00000000000..62f6a30974a --- /dev/null +++ b/queue-5.10/asoc-audio-graph-card-add-of_node_put-in-fail-path.patch @@ -0,0 +1,40 @@ +From c750cc4a9696d78e2f9041f16033f9635d58795c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jul 2022 22:43:08 +0800 +Subject: ASoC: audio-graph-card: Add of_node_put() in fail path + +From: Liang He + +[ Upstream commit 65fb8e2ef3531a6e950060fca6e551c923fb0f0e ] + +In asoc_simple_parse_dai(), we should call of_node_put() for the +reference returned by of_graph_get_port_parent() in fail path. + +Fixes: ae30a694da4c ("ASoC: simple-card-utils: add asoc_simple_card_parse_dai()") +Signed-off-by: Liang He +Link: https://lore.kernel.org/r/20220721144308.1301587-1-windhl@126.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/generic/audio-graph-card.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/sound/soc/generic/audio-graph-card.c b/sound/soc/generic/audio-graph-card.c +index 0c640308ed80..bfbee2d716f3 100644 +--- a/sound/soc/generic/audio-graph-card.c ++++ b/sound/soc/generic/audio-graph-card.c +@@ -149,8 +149,10 @@ static int asoc_simple_parse_dai(struct device_node *ep, + * if he unbinded CPU or Codec. + */ + ret = snd_soc_get_dai_name(&args, &dlc->dai_name); +- if (ret < 0) ++ if (ret < 0) { ++ of_node_put(node); + return ret; ++ } + + dlc->of_node = node; + +-- +2.35.1 + diff --git a/queue-5.10/asoc-codecs-da7210-add-check-for-i2c_add_driver.patch b/queue-5.10/asoc-codecs-da7210-add-check-for-i2c_add_driver.patch new file mode 100644 index 00000000000..7ae30fcb679 --- /dev/null +++ b/queue-5.10/asoc-codecs-da7210-add-check-for-i2c_add_driver.patch @@ -0,0 +1,41 @@ +From a7566391d81349387b1be7a7871b0040e4b1de32 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 31 May 2022 17:47:12 +0800 +Subject: ASoC: codecs: da7210: add check for i2c_add_driver + +From: Jiasheng Jiang + +[ Upstream commit 82fa8f581a954ddeec1602bed9f8b4a09d100e6e ] + +As i2c_add_driver could return error if fails, it should be +better to check the return value. +However, if the CONFIG_I2C and CONFIG_SPI_MASTER are both true, +the return value of i2c_add_driver will be covered by +spi_register_driver. +Therefore, it is necessary to add check and return error if fails. + +Fixes: aa0e25caafb7 ("ASoC: da7210: Add support for spi regmap") +Signed-off-by: Jiasheng Jiang +Link: https://lore.kernel.org/r/20220531094712.2376759-1-jiasheng@iscas.ac.cn +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/da7210.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/sound/soc/codecs/da7210.c b/sound/soc/codecs/da7210.c +index 3d05c37f676e..4544ed8741b6 100644 +--- a/sound/soc/codecs/da7210.c ++++ b/sound/soc/codecs/da7210.c +@@ -1336,6 +1336,8 @@ static int __init da7210_modinit(void) + int ret = 0; + #if IS_ENABLED(CONFIG_I2C) + ret = i2c_add_driver(&da7210_i2c_driver); ++ if (ret) ++ return ret; + #endif + #if defined(CONFIG_SPI_MASTER) + ret = spi_register_driver(&da7210_spi_driver); +-- +2.35.1 + diff --git a/queue-5.10/asoc-codecs-msm8916-wcd-digital-move-gains-from-sx_t.patch b/queue-5.10/asoc-codecs-msm8916-wcd-digital-move-gains-from-sx_t.patch new file mode 100644 index 00000000000..2871de8b86f --- /dev/null +++ b/queue-5.10/asoc-codecs-msm8916-wcd-digital-move-gains-from-sx_t.patch @@ -0,0 +1,102 @@ +From a67ae455e0867cf5c42ad41c2bd848d4d7a24c09 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Jun 2022 12:19:00 +0100 +Subject: ASoC: codecs: msm8916-wcd-digital: move gains from SX_TLV to S8_TLV + +From: Srinivas Kandagatla + +[ Upstream commit 5babb012c847beb6c8c7108fd78f650b7a2c6054 ] + +move all the digital gains form using SX_TLV to S8_TLV, these gains are +actually 8 bit gains with 7th signed bit and ranges from -84dB to +40dB + +rest of the Qualcomm wcd codecs uses these properly. + +Fixes: ef8a4757a6db ("ASoC: msm8916-wcd-digital: Add sidetone support") +Fixes: 150db8c5afa1 ("ASoC: codecs: Add msm8916-wcd digital codec") +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220609111901.318047-2-srinivas.kandagatla@linaro.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/msm8916-wcd-digital.c | 46 +++++++++++++------------- + 1 file changed, 23 insertions(+), 23 deletions(-) + +diff --git a/sound/soc/codecs/msm8916-wcd-digital.c b/sound/soc/codecs/msm8916-wcd-digital.c +index 20a07c92b2fc..098a58990f07 100644 +--- a/sound/soc/codecs/msm8916-wcd-digital.c ++++ b/sound/soc/codecs/msm8916-wcd-digital.c +@@ -328,8 +328,8 @@ static const struct snd_kcontrol_new rx1_mix2_inp1_mux = SOC_DAPM_ENUM( + static const struct snd_kcontrol_new rx2_mix2_inp1_mux = SOC_DAPM_ENUM( + "RX2 MIX2 INP1 Mux", rx2_mix2_inp1_chain_enum); + +-/* Digital Gain control -38.4 dB to +38.4 dB in 0.3 dB steps */ +-static const DECLARE_TLV_DB_SCALE(digital_gain, -3840, 30, 0); ++/* Digital Gain control -84 dB to +40 dB in 1 dB steps */ ++static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400); + + /* Cutoff Freq for High Pass Filter at -3dB */ + static const char * const hpf_cutoff_text[] = { +@@ -510,15 +510,15 @@ static int wcd_iir_filter_info(struct snd_kcontrol *kcontrol, + + static const struct snd_kcontrol_new msm8916_wcd_digital_snd_controls[] = { + SOC_SINGLE_S8_TLV("RX1 Digital Volume", LPASS_CDC_RX1_VOL_CTL_B2_CTL, +- -128, 127, digital_gain), ++ -84, 40, digital_gain), + SOC_SINGLE_S8_TLV("RX2 Digital Volume", LPASS_CDC_RX2_VOL_CTL_B2_CTL, +- -128, 127, digital_gain), ++ -84, 40, digital_gain), + SOC_SINGLE_S8_TLV("RX3 Digital Volume", LPASS_CDC_RX3_VOL_CTL_B2_CTL, +- -128, 127, digital_gain), ++ -84, 40, digital_gain), + SOC_SINGLE_S8_TLV("TX1 Digital Volume", LPASS_CDC_TX1_VOL_CTL_GAIN, +- -128, 127, digital_gain), ++ -84, 40, digital_gain), + SOC_SINGLE_S8_TLV("TX2 Digital Volume", LPASS_CDC_TX2_VOL_CTL_GAIN, +- -128, 127, digital_gain), ++ -84, 40, digital_gain), + SOC_ENUM("TX1 HPF Cutoff", tx1_hpf_cutoff_enum), + SOC_ENUM("TX2 HPF Cutoff", tx2_hpf_cutoff_enum), + SOC_SINGLE("TX1 HPF Switch", LPASS_CDC_TX1_MUX_CTL, 3, 1, 0), +@@ -553,22 +553,22 @@ static const struct snd_kcontrol_new msm8916_wcd_digital_snd_controls[] = { + WCD_IIR_FILTER_CTL("IIR2 Band3", IIR2, BAND3), + WCD_IIR_FILTER_CTL("IIR2 Band4", IIR2, BAND4), + WCD_IIR_FILTER_CTL("IIR2 Band5", IIR2, BAND5), +- SOC_SINGLE_SX_TLV("IIR1 INP1 Volume", LPASS_CDC_IIR1_GAIN_B1_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("IIR1 INP2 Volume", LPASS_CDC_IIR1_GAIN_B2_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("IIR1 INP3 Volume", LPASS_CDC_IIR1_GAIN_B3_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("IIR1 INP4 Volume", LPASS_CDC_IIR1_GAIN_B4_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("IIR2 INP1 Volume", LPASS_CDC_IIR2_GAIN_B1_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("IIR2 INP2 Volume", LPASS_CDC_IIR2_GAIN_B2_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("IIR2 INP3 Volume", LPASS_CDC_IIR2_GAIN_B3_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("IIR2 INP4 Volume", LPASS_CDC_IIR2_GAIN_B4_CTL, +- 0, -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("IIR1 INP1 Volume", LPASS_CDC_IIR1_GAIN_B1_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("IIR1 INP2 Volume", LPASS_CDC_IIR1_GAIN_B2_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("IIR1 INP3 Volume", LPASS_CDC_IIR1_GAIN_B3_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("IIR1 INP4 Volume", LPASS_CDC_IIR1_GAIN_B4_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("IIR2 INP1 Volume", LPASS_CDC_IIR2_GAIN_B1_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("IIR2 INP2 Volume", LPASS_CDC_IIR2_GAIN_B2_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("IIR2 INP3 Volume", LPASS_CDC_IIR2_GAIN_B3_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("IIR2 INP4 Volume", LPASS_CDC_IIR2_GAIN_B4_CTL, ++ -84, 40, digital_gain), + + }; + +-- +2.35.1 + diff --git a/queue-5.10/asoc-codecs-wcd9335-move-gains-from-sx_tlv-to-s8_tlv.patch b/queue-5.10/asoc-codecs-wcd9335-move-gains-from-sx_tlv-to-s8_tlv.patch new file mode 100644 index 00000000000..61c603e8530 --- /dev/null +++ b/queue-5.10/asoc-codecs-wcd9335-move-gains-from-sx_tlv-to-s8_tlv.patch @@ -0,0 +1,118 @@ +From df1b4b32754b79dd8a03e8e45bce9bf1abdbdcef Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Jun 2022 12:19:01 +0100 +Subject: ASoC: codecs: wcd9335: move gains from SX_TLV to S8_TLV + +From: Srinivas Kandagatla + +[ Upstream commit 2fbe0953732e06b471cdedbf6f615b84235580d8 ] + +move all the digital gains form using SX_TLV to S8_TLV, these gains are +actually 8 bit gains with 7th signed bit and ranges from -84dB to +40dB + +rest of the Qualcomm wcd codecs uses these properly. + +Fixes: 8c4f021d806a ("ASoC: wcd9335: add basic controls") +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20220609111901.318047-3-srinivas.kandagatla@linaro.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/wcd9335.c | 81 +++++++++++++++++--------------------- + 1 file changed, 36 insertions(+), 45 deletions(-) + +diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c +index 2677d0c3b19b..8f4ed39c49de 100644 +--- a/sound/soc/codecs/wcd9335.c ++++ b/sound/soc/codecs/wcd9335.c +@@ -2252,51 +2252,42 @@ static int wcd9335_rx_hph_mode_put(struct snd_kcontrol *kc, + + static const struct snd_kcontrol_new wcd9335_snd_controls[] = { + /* -84dB min - 40dB max */ +- SOC_SINGLE_SX_TLV("RX0 Digital Volume", WCD9335_CDC_RX0_RX_VOL_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX1 Digital Volume", WCD9335_CDC_RX1_RX_VOL_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX2 Digital Volume", WCD9335_CDC_RX2_RX_VOL_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX3 Digital Volume", WCD9335_CDC_RX3_RX_VOL_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX4 Digital Volume", WCD9335_CDC_RX4_RX_VOL_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX5 Digital Volume", WCD9335_CDC_RX5_RX_VOL_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX6 Digital Volume", WCD9335_CDC_RX6_RX_VOL_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX7 Digital Volume", WCD9335_CDC_RX7_RX_VOL_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX8 Digital Volume", WCD9335_CDC_RX8_RX_VOL_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX0 Mix Digital Volume", +- WCD9335_CDC_RX0_RX_VOL_MIX_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX1 Mix Digital Volume", +- WCD9335_CDC_RX1_RX_VOL_MIX_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX2 Mix Digital Volume", +- WCD9335_CDC_RX2_RX_VOL_MIX_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX3 Mix Digital Volume", +- WCD9335_CDC_RX3_RX_VOL_MIX_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX4 Mix Digital Volume", +- WCD9335_CDC_RX4_RX_VOL_MIX_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX5 Mix Digital Volume", +- WCD9335_CDC_RX5_RX_VOL_MIX_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX6 Mix Digital Volume", +- WCD9335_CDC_RX6_RX_VOL_MIX_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX7 Mix Digital Volume", +- WCD9335_CDC_RX7_RX_VOL_MIX_CTL, +- 0, -84, 40, digital_gain), +- SOC_SINGLE_SX_TLV("RX8 Mix Digital Volume", +- WCD9335_CDC_RX8_RX_VOL_MIX_CTL, +- 0, -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX0 Digital Volume", WCD9335_CDC_RX0_RX_VOL_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX1 Digital Volume", WCD9335_CDC_RX1_RX_VOL_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX2 Digital Volume", WCD9335_CDC_RX2_RX_VOL_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX3 Digital Volume", WCD9335_CDC_RX3_RX_VOL_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX4 Digital Volume", WCD9335_CDC_RX4_RX_VOL_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX5 Digital Volume", WCD9335_CDC_RX5_RX_VOL_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX6 Digital Volume", WCD9335_CDC_RX6_RX_VOL_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX7 Digital Volume", WCD9335_CDC_RX7_RX_VOL_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX8 Digital Volume", WCD9335_CDC_RX8_RX_VOL_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX0 Mix Digital Volume", WCD9335_CDC_RX0_RX_VOL_MIX_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX1 Mix Digital Volume", WCD9335_CDC_RX1_RX_VOL_MIX_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX2 Mix Digital Volume", WCD9335_CDC_RX2_RX_VOL_MIX_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX3 Mix Digital Volume", WCD9335_CDC_RX3_RX_VOL_MIX_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX4 Mix Digital Volume", WCD9335_CDC_RX4_RX_VOL_MIX_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX5 Mix Digital Volume", WCD9335_CDC_RX5_RX_VOL_MIX_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX6 Mix Digital Volume", WCD9335_CDC_RX6_RX_VOL_MIX_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX7 Mix Digital Volume", WCD9335_CDC_RX7_RX_VOL_MIX_CTL, ++ -84, 40, digital_gain), ++ SOC_SINGLE_S8_TLV("RX8 Mix Digital Volume", WCD9335_CDC_RX8_RX_VOL_MIX_CTL, ++ -84, 40, digital_gain), + SOC_ENUM("RX INT0_1 HPF cut off", cf_int0_1_enum), + SOC_ENUM("RX INT0_2 HPF cut off", cf_int0_2_enum), + SOC_ENUM("RX INT1_1 HPF cut off", cf_int1_1_enum), +-- +2.35.1 + diff --git a/queue-5.10/asoc-cros_ec_codec-fix-refcount-leak-in-cros_ec_code.patch b/queue-5.10/asoc-cros_ec_codec-fix-refcount-leak-in-cros_ec_code.patch new file mode 100644 index 00000000000..641f26dafe5 --- /dev/null +++ b/queue-5.10/asoc-cros_ec_codec-fix-refcount-leak-in-cros_ec_code.patch @@ -0,0 +1,40 @@ +From 2fb72748aff557be4b81bd0adc7a12ff957eb8f0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 3 Jun 2022 17:10:43 +0400 +Subject: ASoC: cros_ec_codec: Fix refcount leak in + cros_ec_codec_platform_probe + +From: Miaoqian Lin + +[ Upstream commit 0a034d93ee929a9ea89f3fa5f1d8492435b9ee6e ] + +of_parse_phandle() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak. + +Fixes: b6bc07d4360d ("ASoC: cros_ec_codec: support WoV") +Signed-off-by: Miaoqian Lin +Reviewed-by: Tzung-Bi Shih +Reviewed-by: Guenter Roeck +Link: https://lore.kernel.org/r/20220603131043.38907-1-linmq006@gmail.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/cros_ec_codec.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sound/soc/codecs/cros_ec_codec.c b/sound/soc/codecs/cros_ec_codec.c +index 5c3b7e5e55d2..dedbaba83792 100644 +--- a/sound/soc/codecs/cros_ec_codec.c ++++ b/sound/soc/codecs/cros_ec_codec.c +@@ -994,6 +994,7 @@ static int cros_ec_codec_platform_probe(struct platform_device *pdev) + dev_dbg(dev, "ap_shm_phys_addr=%#llx len=%#x\n", + priv->ap_shm_phys_addr, priv->ap_shm_len); + } ++ of_node_put(node); + } + #endif + +-- +2.35.1 + diff --git a/queue-5.10/asoc-fsl_easrc-use-snd_pcm_format_t-type-for-sample_.patch b/queue-5.10/asoc-fsl_easrc-use-snd_pcm_format_t-type-for-sample_.patch new file mode 100644 index 00000000000..42b8f9aae4e --- /dev/null +++ b/queue-5.10/asoc-fsl_easrc-use-snd_pcm_format_t-type-for-sample_.patch @@ -0,0 +1,107 @@ +From 4a5916f27f57ad62eb33848e19dd8e5d94251a3a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jul 2022 18:29:52 +0800 +Subject: ASoC: fsl_easrc: use snd_pcm_format_t type for sample_format + +From: Shengjiu Wang + +[ Upstream commit de27216cf2d645c2fd14e513707bdcd54e5b1de4 ] + +Fix sparse warning: +sound/soc/fsl/fsl_easrc.c:562:33: sparse: warning: restricted snd_pcm_format_t degrades to integer +sound/soc/fsl/fsl_easrc.c:563:34: sparse: warning: restricted snd_pcm_format_t degrades to integer +sound/soc/fsl/fsl_easrc.c:565:38: sparse: warning: restricted snd_pcm_format_t degrades to integer +sound/soc/fsl/fsl_easrc.c:566:39: sparse: warning: restricted snd_pcm_format_t degrades to integer +sound/soc/fsl/fsl_easrc.c:608:33: sparse: warning: restricted snd_pcm_format_t degrades to integer +sound/soc/fsl/fsl_easrc.c:609:34: sparse: warning: restricted snd_pcm_format_t degrades to integer +sound/soc/fsl/fsl_easrc.c:615:40: sparse: warning: restricted snd_pcm_format_t degrades to integer +sound/soc/fsl/fsl_easrc.c:616:41: sparse: warning: restricted snd_pcm_format_t degrades to integer + +sound/soc/fsl/fsl_easrc.c:1465:51: sparse: warning: incorrect type in assignment (different base types) +sound/soc/fsl/fsl_easrc.c:1465:51: sparse: expected unsigned int sample_format +sound/soc/fsl/fsl_easrc.c:1465:51: sparse: got restricted snd_pcm_format_t [usertype] format +sound/soc/fsl/fsl_easrc.c:1467:52: sparse: warning: incorrect type in assignment (different base types) +sound/soc/fsl/fsl_easrc.c:1467:52: sparse: expected unsigned int sample_format +sound/soc/fsl/fsl_easrc.c:1467:52: sparse: got restricted snd_pcm_format_t [usertype] asrc_format +sound/soc/fsl/fsl_easrc.c:1470:52: sparse: warning: incorrect type in assignment (different base types) +sound/soc/fsl/fsl_easrc.c:1470:52: sparse: expected unsigned int sample_format +sound/soc/fsl/fsl_easrc.c:1470:52: sparse: got restricted snd_pcm_format_t [usertype] format +sound/soc/fsl/fsl_easrc.c:1472:51: sparse: warning: incorrect type in assignment (different base types) +sound/soc/fsl/fsl_easrc.c:1472:51: sparse: expected unsigned int sample_format +sound/soc/fsl/fsl_easrc.c:1472:51: sparse: got restricted snd_pcm_format_t [usertype] asrc_format +sound/soc/fsl/fsl_easrc.c:1484:41: sparse: warning: incorrect type in argument 2 (different base types) +sound/soc/fsl/fsl_easrc.c:1484:41: sparse: expected restricted snd_pcm_format_t [usertype] *in_raw_format +sound/soc/fsl/fsl_easrc.c:1484:41: sparse: got unsigned int * +sound/soc/fsl/fsl_easrc.c:1485:41: sparse: warning: incorrect type in argument 3 (different base types) +sound/soc/fsl/fsl_easrc.c:1485:41: sparse: expected restricted snd_pcm_format_t [usertype] *out_raw_format +sound/soc/fsl/fsl_easrc.c:1485:41: sparse: got unsigned int * +sound/soc/fsl/fsl_easrc.c:1937:60: sparse: warning: incorrect type in argument 3 (different base types) +sound/soc/fsl/fsl_easrc.c:1937:60: sparse: expected unsigned int [usertype] *out_value +sound/soc/fsl/fsl_easrc.c:1937:60: sparse: got restricted snd_pcm_format_t * +sound/soc/fsl/fsl_easrc.c:1943:49: sparse: warning: restricted snd_pcm_format_t degrades to integer + +Fixes: 955ac624058f ("ASoC: fsl_easrc: Add EASRC ASoC CPU DAI drivers") +Signed-off-by: Shengjiu Wang +Link: https://lore.kernel.org/r/1658399393-28777-5-git-send-email-shengjiu.wang@nxp.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/fsl/fsl_easrc.c | 9 ++++++--- + sound/soc/fsl/fsl_easrc.h | 2 +- + 2 files changed, 7 insertions(+), 4 deletions(-) + +diff --git a/sound/soc/fsl/fsl_easrc.c b/sound/soc/fsl/fsl_easrc.c +index 60951a8aabd3..3cf1f40e6892 100644 +--- a/sound/soc/fsl/fsl_easrc.c ++++ b/sound/soc/fsl/fsl_easrc.c +@@ -476,7 +476,8 @@ static int fsl_easrc_prefilter_config(struct fsl_asrc *easrc, + struct fsl_asrc_pair *ctx; + struct device *dev; + u32 inrate, outrate, offset = 0; +- u32 in_s_rate, out_s_rate, in_s_fmt, out_s_fmt; ++ u32 in_s_rate, out_s_rate; ++ snd_pcm_format_t in_s_fmt, out_s_fmt; + int ret, i; + + if (!easrc) +@@ -1873,6 +1874,7 @@ static int fsl_easrc_probe(struct platform_device *pdev) + struct resource *res; + struct device_node *np; + void __iomem *regs; ++ u32 asrc_fmt = 0; + int ret, irq; + + easrc = devm_kzalloc(dev, sizeof(*easrc), GFP_KERNEL); +@@ -1939,13 +1941,14 @@ static int fsl_easrc_probe(struct platform_device *pdev) + return ret; + } + +- ret = of_property_read_u32(np, "fsl,asrc-format", &easrc->asrc_format); ++ ret = of_property_read_u32(np, "fsl,asrc-format", &asrc_fmt); ++ easrc->asrc_format = (__force snd_pcm_format_t)asrc_fmt; + if (ret) { + dev_err(dev, "failed to asrc format\n"); + return ret; + } + +- if (!(FSL_EASRC_FORMATS & (1ULL << easrc->asrc_format))) { ++ if (!(FSL_EASRC_FORMATS & (pcm_format_to_bits(easrc->asrc_format)))) { + dev_warn(dev, "unsupported format, switching to S24_LE\n"); + easrc->asrc_format = SNDRV_PCM_FORMAT_S24_LE; + } +diff --git a/sound/soc/fsl/fsl_easrc.h b/sound/soc/fsl/fsl_easrc.h +index 30620d56252c..5b8469757c12 100644 +--- a/sound/soc/fsl/fsl_easrc.h ++++ b/sound/soc/fsl/fsl_easrc.h +@@ -569,7 +569,7 @@ struct fsl_easrc_io_params { + unsigned int access_len; + unsigned int fifo_wtmk; + unsigned int sample_rate; +- unsigned int sample_format; ++ snd_pcm_format_t sample_format; + unsigned int norm_rate; + }; + +-- +2.35.1 + diff --git a/queue-5.10/asoc-mchp-spdifrx-disable-end-of-block-interrupt-on-.patch b/queue-5.10/asoc-mchp-spdifrx-disable-end-of-block-interrupt-on-.patch new file mode 100644 index 00000000000..c2aed80687b --- /dev/null +++ b/queue-5.10/asoc-mchp-spdifrx-disable-end-of-block-interrupt-on-.patch @@ -0,0 +1,59 @@ +From aff74243e426718ae975dcf38cf64d14f3cb1b3c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jul 2022 12:08:13 +0300 +Subject: ASoC: mchp-spdifrx: disable end of block interrupt on failures + +From: Claudiu Beznea + +[ Upstream commit 768ac4f12ca0fda935f58eb8c5120e9d795bc6e3 ] + +Disable end of block interrupt in case of wait for completion timeout +or errors to undo previously enable operation (done in +mchp_spdifrx_isr_blockend_en()). Otherwise we can end up with an +unbalanced reference counter for this interrupt. + +Fixes: ef265c55c1ac ("ASoC: mchp-spdifrx: add driver for SPDIF RX") +Signed-off-by: Claudiu Beznea +Link: https://lore.kernel.org/r/20220727090814.2446111-2-claudiu.beznea@microchip.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/atmel/mchp-spdifrx.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/sound/soc/atmel/mchp-spdifrx.c b/sound/soc/atmel/mchp-spdifrx.c +index e6ded6f8453f..46f3407ed0e8 100644 +--- a/sound/soc/atmel/mchp-spdifrx.c ++++ b/sound/soc/atmel/mchp-spdifrx.c +@@ -288,15 +288,17 @@ static void mchp_spdifrx_isr_blockend_en(struct mchp_spdifrx_dev *dev) + spin_unlock_irqrestore(&dev->blockend_lock, flags); + } + +-/* called from atomic context only */ ++/* called from atomic/non-atomic context */ + static void mchp_spdifrx_isr_blockend_dis(struct mchp_spdifrx_dev *dev) + { +- spin_lock(&dev->blockend_lock); ++ unsigned long flags; ++ ++ spin_lock_irqsave(&dev->blockend_lock, flags); + dev->blockend_refcount--; + /* don't enable BLOCKEND interrupt if it's already enabled */ + if (dev->blockend_refcount == 0) + regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_BLOCKEND); +- spin_unlock(&dev->blockend_lock); ++ spin_unlock_irqrestore(&dev->blockend_lock, flags); + } + + static irqreturn_t mchp_spdif_interrupt(int irq, void *dev_id) +@@ -575,6 +577,7 @@ static int mchp_spdifrx_subcode_ch_get(struct mchp_spdifrx_dev *dev, + if (ret <= 0) { + dev_dbg(dev->dev, "user data for channel %d timeout\n", + channel); ++ mchp_spdifrx_isr_blockend_dis(dev); + return ret; + } + +-- +2.35.1 + diff --git a/queue-5.10/asoc-mediatek-mt8173-fix-refcount-leak-in-mt8173_rt5.patch b/queue-5.10/asoc-mediatek-mt8173-fix-refcount-leak-in-mt8173_rt5.patch new file mode 100644 index 00000000000..bc3780f7fdf --- /dev/null +++ b/queue-5.10/asoc-mediatek-mt8173-fix-refcount-leak-in-mt8173_rt5.patch @@ -0,0 +1,67 @@ +From 5123013829db77282320514e7fe59f6441a793ea Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Jun 2022 07:41:42 +0400 +Subject: ASoC: mediatek: mt8173: Fix refcount leak in + mt8173_rt5650_rt5676_dev_probe + +From: Miaoqian Lin + +[ Upstream commit ae4f11c1ed2d67192fdf3d89db719ee439827c11 ] + +of_parse_phandle() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Fix missing of_node_put() in error paths. + +Fixes: 94319ba10eca ("ASoC: mediatek: Use platform_of_node for machine drivers") +Signed-off-by: Miaoqian Lin +Link: https://lore.kernel.org/r/20220602034144.60159-1-linmq006@gmail.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c b/sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c +index c8e4e85e1057..94a9bbf144d1 100644 +--- a/sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c ++++ b/sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c +@@ -256,14 +256,16 @@ static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev) + if (!mt8173_rt5650_rt5676_dais[DAI_LINK_CODEC_I2S].codecs[0].of_node) { + dev_err(&pdev->dev, + "Property 'audio-codec' missing or invalid\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto put_node; + } + mt8173_rt5650_rt5676_dais[DAI_LINK_CODEC_I2S].codecs[1].of_node = + of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 1); + if (!mt8173_rt5650_rt5676_dais[DAI_LINK_CODEC_I2S].codecs[1].of_node) { + dev_err(&pdev->dev, + "Property 'audio-codec' missing or invalid\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto put_node; + } + mt8173_rt5650_rt5676_codec_conf[0].dlc.of_node = + mt8173_rt5650_rt5676_dais[DAI_LINK_CODEC_I2S].codecs[1].of_node; +@@ -276,7 +278,8 @@ static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev) + if (!mt8173_rt5650_rt5676_dais[DAI_LINK_HDMI_I2S].codecs->of_node) { + dev_err(&pdev->dev, + "Property 'audio-codec' missing or invalid\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto put_node; + } + + card->dev = &pdev->dev; +@@ -286,6 +289,7 @@ static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev) + dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n", + __func__, ret); + ++put_node: + of_node_put(platform_node); + return ret; + } +-- +2.35.1 + diff --git a/queue-5.10/asoc-mediatek-mt8173-rt5650-fix-refcount-leak-in-mt8.patch b/queue-5.10/asoc-mediatek-mt8173-rt5650-fix-refcount-leak-in-mt8.patch new file mode 100644 index 00000000000..e11a2ac51f2 --- /dev/null +++ b/queue-5.10/asoc-mediatek-mt8173-rt5650-fix-refcount-leak-in-mt8.patch @@ -0,0 +1,67 @@ +From 4dc088c423900afb4ec6eff48319a41f8560fc20 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 3 Jun 2022 16:42:41 +0400 +Subject: ASoC: mediatek: mt8173-rt5650: Fix refcount leak in + mt8173_rt5650_dev_probe + +From: Miaoqian Lin + +[ Upstream commit efe2178d1a32492f99e7f1f2568eea5c88a85729 ] + +of_parse_phandle() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Fix refcount leak in some error paths. + +Fixes: 0f83f9296d5c ("ASoC: mediatek: Add machine driver for ALC5650 codec") +Signed-off-by: Miaoqian Lin +Link: https://lore.kernel.org/r/20220603124243.31358-1-linmq006@gmail.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/mediatek/mt8173/mt8173-rt5650.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/sound/soc/mediatek/mt8173/mt8173-rt5650.c b/sound/soc/mediatek/mt8173/mt8173-rt5650.c +index e168d31f4445..1de9dab218c6 100644 +--- a/sound/soc/mediatek/mt8173/mt8173-rt5650.c ++++ b/sound/soc/mediatek/mt8173/mt8173-rt5650.c +@@ -280,7 +280,8 @@ static int mt8173_rt5650_dev_probe(struct platform_device *pdev) + if (!mt8173_rt5650_dais[DAI_LINK_CODEC_I2S].codecs[0].of_node) { + dev_err(&pdev->dev, + "Property 'audio-codec' missing or invalid\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto put_platform_node; + } + mt8173_rt5650_dais[DAI_LINK_CODEC_I2S].codecs[1].of_node = + mt8173_rt5650_dais[DAI_LINK_CODEC_I2S].codecs[0].of_node; +@@ -293,7 +294,7 @@ static int mt8173_rt5650_dev_probe(struct platform_device *pdev) + dev_err(&pdev->dev, + "%s codec_capture_dai name fail %d\n", + __func__, ret); +- return ret; ++ goto put_platform_node; + } + mt8173_rt5650_dais[DAI_LINK_CODEC_I2S].codecs[1].dai_name = + codec_capture_dai; +@@ -315,7 +316,8 @@ static int mt8173_rt5650_dev_probe(struct platform_device *pdev) + if (!mt8173_rt5650_dais[DAI_LINK_HDMI_I2S].codecs->of_node) { + dev_err(&pdev->dev, + "Property 'audio-codec' missing or invalid\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto put_platform_node; + } + card->dev = &pdev->dev; + +@@ -324,6 +326,7 @@ static int mt8173_rt5650_dev_probe(struct platform_device *pdev) + dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n", + __func__, ret); + ++put_platform_node: + of_node_put(platform_node); + return ret; + } +-- +2.35.1 + diff --git a/queue-5.10/asoc-mt6797-mt6351-fix-refcount-leak-in-mt6797_mt635.patch b/queue-5.10/asoc-mt6797-mt6351-fix-refcount-leak-in-mt6797_mt635.patch new file mode 100644 index 00000000000..3902cdd854a --- /dev/null +++ b/queue-5.10/asoc-mt6797-mt6351-fix-refcount-leak-in-mt6797_mt635.patch @@ -0,0 +1,49 @@ +From 3eba4cc5ec2e193f4cb737fe62955fe8f87b7e62 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 3 Jun 2022 12:34:15 +0400 +Subject: ASoC: mt6797-mt6351: Fix refcount leak in mt6797_mt6351_dev_probe + +From: Miaoqian Lin + +[ Upstream commit 7472eb8d7dd12b6b9b1a4f4527719cc9c7f5965f ] + +of_parse_phandle() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak. + +Fixes: f0ab0bf250da ("ASoC: add mt6797-mt6351 driver and config option") +Signed-off-by: Miaoqian Lin +Link: https://lore.kernel.org/r/20220603083417.9011-1-linmq006@gmail.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/mediatek/mt6797/mt6797-mt6351.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/sound/soc/mediatek/mt6797/mt6797-mt6351.c b/sound/soc/mediatek/mt6797/mt6797-mt6351.c +index 496f32bcfb5e..d2f6213a6bfc 100644 +--- a/sound/soc/mediatek/mt6797/mt6797-mt6351.c ++++ b/sound/soc/mediatek/mt6797/mt6797-mt6351.c +@@ -217,7 +217,8 @@ static int mt6797_mt6351_dev_probe(struct platform_device *pdev) + if (!codec_node) { + dev_err(&pdev->dev, + "Property 'audio-codec' missing or invalid\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto put_platform_node; + } + for_each_card_prelinks(card, i, dai_link) { + if (dai_link->codecs->name) +@@ -230,6 +231,9 @@ static int mt6797_mt6351_dev_probe(struct platform_device *pdev) + dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n", + __func__, ret); + ++ of_node_put(codec_node); ++put_platform_node: ++ of_node_put(platform_node); + return ret; + } + +-- +2.35.1 + diff --git a/queue-5.10/asoc-qcom-fix-missing-of_node_put-in-asoc_qcom_lpass.patch b/queue-5.10/asoc-qcom-fix-missing-of_node_put-in-asoc_qcom_lpass.patch new file mode 100644 index 00000000000..1db64e541f5 --- /dev/null +++ b/queue-5.10/asoc-qcom-fix-missing-of_node_put-in-asoc_qcom_lpass.patch @@ -0,0 +1,38 @@ +From 9ab38abacc5f816ae4b40d5fd58c3ab9bb80c4a6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Jul 2022 10:01:09 +0800 +Subject: ASoC: qcom: Fix missing of_node_put() in + asoc_qcom_lpass_cpu_platform_probe() + +From: Liang He + +[ Upstream commit f507c0c67dac57d2bcd5dcae4b6139b0305d8957 ] + +We should call of_node_put() for the reference 'dsp_of_node' returned by +of_parse_phandle() which will increase the refcount. + +Fixes: 9bae4880acee ("ASoC: qcom: move ipq806x specific bits out of lpass driver.") +Co-authored-by: Miaoqian Lin +Signed-off-by: Liang He +Link: https://lore.kernel.org/r/20220702020109.263980-1-windhl@126.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/qcom/lpass-cpu.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sound/soc/qcom/lpass-cpu.c b/sound/soc/qcom/lpass-cpu.c +index e620a62ef534..03abb3d719d0 100644 +--- a/sound/soc/qcom/lpass-cpu.c ++++ b/sound/soc/qcom/lpass-cpu.c +@@ -846,6 +846,7 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev) + dsp_of_node = of_parse_phandle(pdev->dev.of_node, "qcom,adsp", 0); + if (dsp_of_node) { + dev_err(dev, "DSP exists and holds audio resources\n"); ++ of_node_put(dsp_of_node); + return -EBUSY; + } + +-- +2.35.1 + diff --git a/queue-5.10/asoc-qcom-q6dsp-fix-an-off-by-one-in-q6adm_alloc_cop.patch b/queue-5.10/asoc-qcom-q6dsp-fix-an-off-by-one-in-q6adm_alloc_cop.patch new file mode 100644 index 00000000000..203598ee6b4 --- /dev/null +++ b/queue-5.10/asoc-qcom-q6dsp-fix-an-off-by-one-in-q6adm_alloc_cop.patch @@ -0,0 +1,37 @@ +From 4589cb0cd1d3c783f0a557ce4634af858e9158ea Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jul 2022 11:02:22 +0200 +Subject: ASoC: qcom: q6dsp: Fix an off-by-one in q6adm_alloc_copp() + +From: Christophe JAILLET + +[ Upstream commit 673f58f62ca6fc98979d1cf3fe89c3ff33f29b2e ] + +find_first_zero_bit() returns MAX_COPPS_PER_PORT at max here. +So 'idx' should be tested with ">=" or the test can't match. + +Fixes: 7b20b2be51e1 ("ASoC: qdsp6: q6adm: Add q6adm driver") +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/0fca3271649736053eb9649d87e1ca01b056be40.1658394124.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/qcom/qdsp6/q6adm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sound/soc/qcom/qdsp6/q6adm.c b/sound/soc/qcom/qdsp6/q6adm.c +index 72f29720398c..182d36a34faf 100644 +--- a/sound/soc/qcom/qdsp6/q6adm.c ++++ b/sound/soc/qcom/qdsp6/q6adm.c +@@ -217,7 +217,7 @@ static struct q6copp *q6adm_alloc_copp(struct q6adm *adm, int port_idx) + idx = find_first_zero_bit(&adm->copp_bitmap[port_idx], + MAX_COPPS_PER_PORT); + +- if (idx > MAX_COPPS_PER_PORT) ++ if (idx >= MAX_COPPS_PER_PORT) + return ERR_PTR(-EBUSY); + + c = kzalloc(sizeof(*c), GFP_ATOMIC); +-- +2.35.1 + diff --git a/queue-5.10/asoc-samsung-change-gpiod_speaker_power-and-rx1950_a.patch b/queue-5.10/asoc-samsung-change-gpiod_speaker_power-and-rx1950_a.patch new file mode 100644 index 00000000000..a9bbfad2a3b --- /dev/null +++ b/queue-5.10/asoc-samsung-change-gpiod_speaker_power-and-rx1950_a.patch @@ -0,0 +1,52 @@ +From e50caacf70999b58e4f88ce502584c367714ddd0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 29 Jun 2022 14:53:45 -0400 +Subject: ASoC: samsung: change gpiod_speaker_power and rx1950_audio from + global to static variables + +From: Tom Rix + +[ Upstream commit d2294461b90e0c5b3bbfaaf2c8baff4fd3e2bb13 ] + +sparse reports +sound/soc/samsung/rx1950_uda1380.c:131:18: warning: symbol 'gpiod_speaker_power' was not declared. Should it be static? +sound/soc/samsung/rx1950_uda1380.c:231:24: warning: symbol 'rx1950_audio' was not declared. Should it be static? + +Both gpiod_speaker_power and rx1950_audio are only used in rx1950_uda1380.c, +so their storage class specifiers should be static. + +Fixes: 83d74e354200 ("ASoC: samsung: rx1950: turn into platform driver") +Signed-off-by: Tom Rix +Reviewed-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20220629185345.910406-1-trix@redhat.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/samsung/rx1950_uda1380.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/sound/soc/samsung/rx1950_uda1380.c b/sound/soc/samsung/rx1950_uda1380.c +index 400a7f77c711..354f379268d9 100644 +--- a/sound/soc/samsung/rx1950_uda1380.c ++++ b/sound/soc/samsung/rx1950_uda1380.c +@@ -128,7 +128,7 @@ static int rx1950_startup(struct snd_pcm_substream *substream) + &hw_rates); + } + +-struct gpio_desc *gpiod_speaker_power; ++static struct gpio_desc *gpiod_speaker_power; + + static int rx1950_spk_power(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +@@ -227,7 +227,7 @@ static int rx1950_probe(struct platform_device *pdev) + return devm_snd_soc_register_card(dev, &rx1950_asoc); + } + +-struct platform_driver rx1950_audio = { ++static struct platform_driver rx1950_audio = { + .driver = { + .name = "rx1950-audio", + .pm = &snd_soc_pm_ops, +-- +2.35.1 + diff --git a/queue-5.10/asoc-samsung-fix-error-handling-in-aries_audio_probe.patch b/queue-5.10/asoc-samsung-fix-error-handling-in-aries_audio_probe.patch new file mode 100644 index 00000000000..d5a8c3199a5 --- /dev/null +++ b/queue-5.10/asoc-samsung-fix-error-handling-in-aries_audio_probe.patch @@ -0,0 +1,44 @@ +From bc713fac52843ceb9698e97752ba7d3203524cde Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 3 Jun 2022 17:06:39 +0400 +Subject: ASoC: samsung: Fix error handling in aries_audio_probe + +From: Miaoqian Lin + +[ Upstream commit 3e2649c5e8643bea0867bb1dd970fedadb0eb7f3 ] + +of_get_child_by_name() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +This function is missing of_node_put(cpu) in the error path. +Fix this by goto out label. of_node_put() will check NULL pointer. + +Fixes: 7a3a7671fa6c ("ASoC: samsung: Add driver for Aries boards") +Signed-off-by: Miaoqian Lin +Reviewed-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20220603130640.37624-1-linmq006@gmail.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/samsung/aries_wm8994.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/sound/soc/samsung/aries_wm8994.c b/sound/soc/samsung/aries_wm8994.c +index 18458192aff1..d2908c1ea835 100644 +--- a/sound/soc/samsung/aries_wm8994.c ++++ b/sound/soc/samsung/aries_wm8994.c +@@ -628,8 +628,10 @@ static int aries_audio_probe(struct platform_device *pdev) + return -EINVAL; + + codec = of_get_child_by_name(dev->of_node, "codec"); +- if (!codec) +- return -EINVAL; ++ if (!codec) { ++ ret = -EINVAL; ++ goto out; ++ } + + for_each_card_prelinks(card, i, dai_link) { + dai_link->codecs->of_node = of_parse_phandle(codec, +-- +2.35.1 + diff --git a/queue-5.10/asoc-samsung-h1940_uda1380-include-proepr-gpio-consu.patch b/queue-5.10/asoc-samsung-h1940_uda1380-include-proepr-gpio-consu.patch new file mode 100644 index 00000000000..f4b67c326d5 --- /dev/null +++ b/queue-5.10/asoc-samsung-h1940_uda1380-include-proepr-gpio-consu.patch @@ -0,0 +1,37 @@ +From 24823e8fb7204aec689a85cf4d6aab5f2ca91cbe Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 27 Jun 2022 16:19:00 +0200 +Subject: ASoC: samsung: h1940_uda1380: include proepr GPIO consumer header + +From: Krzysztof Kozlowski + +[ Upstream commit bd10b0dafdcf0ec1677cad70101e1f97b9e28f2e ] + +h1940_uda1380 uses gpiod*/GPIOD* so it should include GPIO consumer +header. + +Fixes: 9666e27f90b9 ("ASoC: samsung: h1940: turn into platform driver") +Signed-off-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20220627141900.470469-1-krzysztof.kozlowski@linaro.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/samsung/h1940_uda1380.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sound/soc/samsung/h1940_uda1380.c b/sound/soc/samsung/h1940_uda1380.c +index 8aa78ff640f5..adb6b661c799 100644 +--- a/sound/soc/samsung/h1940_uda1380.c ++++ b/sound/soc/samsung/h1940_uda1380.c +@@ -8,7 +8,7 @@ + // Based on version from Arnaud Patard + + #include +-#include ++#include + #include + + #include +-- +2.35.1 + diff --git a/queue-5.10/ath10k-do-not-enforce-interrupt-trigger-type.patch b/queue-5.10/ath10k-do-not-enforce-interrupt-trigger-type.patch new file mode 100644 index 00000000000..2036b661d7d --- /dev/null +++ b/queue-5.10/ath10k-do-not-enforce-interrupt-trigger-type.patch @@ -0,0 +1,58 @@ +From f4277dee5fcde8b945157b06575b4cb967437eb5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 18 May 2022 10:27:26 +0300 +Subject: ath10k: do not enforce interrupt trigger type + +From: Krzysztof Kozlowski + +[ Upstream commit 1ee6c5abebd3cacf2ac4378d0ed4f57fd4850421 ] + +Interrupt line can be configured on different hardware in different way, +even inverted. Therefore driver should not enforce specific trigger +type - edge rising - but instead rely on Devicetree to configure it. + +All Qualcomm DTSI with WCN3990 define the interrupt type as level high, +so the mismatch between DTSI and driver causes rebind issues: + + $ echo 18800000.wifi > /sys/bus/platform/drivers/ath10k_snoc/unbind + $ echo 18800000.wifi > /sys/bus/platform/drivers/ath10k_snoc/bind + [ 44.763114] irq: type mismatch, failed to map hwirq-446 for interrupt-controller@17a00000! + [ 44.763130] ath10k_snoc 18800000.wifi: error -ENXIO: IRQ index 0 not found + [ 44.763140] ath10k_snoc 18800000.wifi: failed to initialize resource: -6 + +Tested-on: WCN3990 hw1.0 SNOC WLAN.HL.3.2.0.c8-00009-QCAHLSWSC8180XMTPLZ-1 +Tested-on: WCN3990 hw1.0 SNOC WLAN.HL.2.0-01387-QCAHLSWMTPLZ-1 + +Fixes: c963a683e701 ("ath10k: add resource init and deinit for WCN3990") +Signed-off-by: Krzysztof Kozlowski +Tested-by: Steev Klimaszewski +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20220513151516.357549-1-krzysztof.kozlowski@linaro.org +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath10k/snoc.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/wireless/ath/ath10k/snoc.c b/drivers/net/wireless/ath/ath10k/snoc.c +index e5a296039f71..4870a3dab0de 100644 +--- a/drivers/net/wireless/ath/ath10k/snoc.c ++++ b/drivers/net/wireless/ath/ath10k/snoc.c +@@ -1205,13 +1205,12 @@ static void ath10k_snoc_init_napi(struct ath10k *ar) + static int ath10k_snoc_request_irq(struct ath10k *ar) + { + struct ath10k_snoc *ar_snoc = ath10k_snoc_priv(ar); +- int irqflags = IRQF_TRIGGER_RISING; + int ret, id; + + for (id = 0; id < CE_COUNT_MAX; id++) { + ret = request_irq(ar_snoc->ce_irqs[id].irq_line, +- ath10k_snoc_per_engine_handler, +- irqflags, ce_name[id], ar); ++ ath10k_snoc_per_engine_handler, 0, ++ ce_name[id], ar); + if (ret) { + ath10k_err(ar, + "failed to register IRQ handler for CE %d: %d\n", +-- +2.35.1 + diff --git a/queue-5.10/ath11k-fix-incorrect-debug_mask-mappings.patch b/queue-5.10/ath11k-fix-incorrect-debug_mask-mappings.patch new file mode 100644 index 00000000000..95f2eef5a11 --- /dev/null +++ b/queue-5.10/ath11k-fix-incorrect-debug_mask-mappings.patch @@ -0,0 +1,45 @@ +From c0d3fc29e745dad683ad2880b2ba3271ba216c13 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Jun 2022 17:26:21 +0530 +Subject: ath11k: Fix incorrect debug_mask mappings + +From: Manikanta Pubbisetty + +[ Upstream commit 9331f7d3c54a263bede5055e106e40b28d0bd937 ] + +Currently a couple of debug_mask entries are mapped to the same value, +this could enable unintended driver logging. If enabling DP_TX logs was +the intention, then this could also enable PCI logs flooding the dmesg +buffer or vice versa. Fix this by correctly assigning the debug masks. + +Found during code review. + +Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 + +Fixes: aa2092a9bab3f ("ath11k: add raw mode and software crypto support") +Signed-off-by: Manikanta Pubbisetty +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20220602115621.15339-1-quic_mpubbise@quicinc.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath11k/debug.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/ath/ath11k/debug.h b/drivers/net/wireless/ath/ath11k/debug.h +index 659a275e2eb3..694ebba17fad 100644 +--- a/drivers/net/wireless/ath/ath11k/debug.h ++++ b/drivers/net/wireless/ath/ath11k/debug.h +@@ -23,8 +23,8 @@ enum ath11k_debug_mask { + ATH11K_DBG_TESTMODE = 0x00000400, + ATH11k_DBG_HAL = 0x00000800, + ATH11K_DBG_PCI = 0x00001000, +- ATH11K_DBG_DP_TX = 0x00001000, +- ATH11K_DBG_DP_RX = 0x00002000, ++ ATH11K_DBG_DP_TX = 0x00002000, ++ ATH11K_DBG_DP_RX = 0x00004000, + ATH11K_DBG_ANY = 0xffffffff, + }; + +-- +2.35.1 + diff --git a/queue-5.10/ath11k-fix-netdev-open-race.patch b/queue-5.10/ath11k-fix-netdev-open-race.patch new file mode 100644 index 00000000000..223851e25d8 --- /dev/null +++ b/queue-5.10/ath11k-fix-netdev-open-race.patch @@ -0,0 +1,109 @@ +From 0820183c1f15e66caaef35d7fdb4f9e6288d5100 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 22 May 2022 15:33:16 +0300 +Subject: ath11k: fix netdev open race + +From: Johan Hovold + +[ Upstream commit d4ba1ff87b17e81686ada8f429300876f55f95ad ] + +Make sure to allocate resources needed before registering the device. + +This specifically avoids having a racing open() trigger a BUG_ON() in +mod_timer() when ath11k_mac_op_start() is called before the +mon_reap_timer as been set up. + +I did not see this issue with next-20220310, but I hit it on every probe +with next-20220511. Perhaps some timing changed in between. + +Here's the backtrace: + +[ 51.346947] kernel BUG at kernel/time/timer.c:990! +[ 51.346958] Internal error: Oops - BUG: 0 [#1] PREEMPT SMP +... +[ 51.578225] Call trace: +[ 51.583293] __mod_timer+0x298/0x390 +[ 51.589518] mod_timer+0x14/0x20 +[ 51.595368] ath11k_mac_op_start+0x41c/0x4a0 [ath11k] +[ 51.603165] drv_start+0x38/0x60 [mac80211] +[ 51.610110] ieee80211_do_open+0x29c/0x7d0 [mac80211] +[ 51.617945] ieee80211_open+0x60/0xb0 [mac80211] +[ 51.625311] __dev_open+0x100/0x1c0 +[ 51.631420] __dev_change_flags+0x194/0x210 +[ 51.638214] dev_change_flags+0x24/0x70 +[ 51.644646] do_setlink+0x228/0xdb0 +[ 51.650723] __rtnl_newlink+0x460/0x830 +[ 51.657162] rtnl_newlink+0x4c/0x80 +[ 51.663229] rtnetlink_rcv_msg+0x124/0x390 +[ 51.669917] netlink_rcv_skb+0x58/0x130 +[ 51.676314] rtnetlink_rcv+0x18/0x30 +[ 51.682460] netlink_unicast+0x250/0x310 +[ 51.688960] netlink_sendmsg+0x19c/0x3e0 +[ 51.695458] ____sys_sendmsg+0x220/0x290 +[ 51.701938] ___sys_sendmsg+0x7c/0xc0 +[ 51.708148] __sys_sendmsg+0x68/0xd0 +[ 51.714254] __arm64_sys_sendmsg+0x28/0x40 +[ 51.720900] invoke_syscall+0x48/0x120 + +Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3 + +Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices") +Fixes: 840c36fa727a ("ath11k: dp: stop rx pktlog before suspend") +Signed-off-by: Johan Hovold +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20220517103436.15867-1-johan+linaro@kernel.org +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath11k/core.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c +index 28de2c7ae899..473d92240a82 100644 +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -476,23 +476,23 @@ static int ath11k_core_pdev_create(struct ath11k_base *ab) + return ret; + } + +- ret = ath11k_mac_register(ab); ++ ret = ath11k_dp_pdev_alloc(ab); + if (ret) { +- ath11k_err(ab, "failed register the radio with mac80211: %d\n", ret); ++ ath11k_err(ab, "failed to attach DP pdev: %d\n", ret); + goto err_pdev_debug; + } + +- ret = ath11k_dp_pdev_alloc(ab); ++ ret = ath11k_mac_register(ab); + if (ret) { +- ath11k_err(ab, "failed to attach DP pdev: %d\n", ret); +- goto err_mac_unregister; ++ ath11k_err(ab, "failed register the radio with mac80211: %d\n", ret); ++ goto err_dp_pdev_free; + } + + ret = ath11k_thermal_register(ab); + if (ret) { + ath11k_err(ab, "could not register thermal device: %d\n", + ret); +- goto err_dp_pdev_free; ++ goto err_mac_unregister; + } + + ret = ath11k_spectral_init(ab); +@@ -505,10 +505,10 @@ static int ath11k_core_pdev_create(struct ath11k_base *ab) + + err_thermal_unregister: + ath11k_thermal_unregister(ab); +-err_dp_pdev_free: +- ath11k_dp_pdev_free(ab); + err_mac_unregister: + ath11k_mac_unregister(ab); ++err_dp_pdev_free: ++ ath11k_dp_pdev_free(ab); + err_pdev_debug: + ath11k_debugfs_pdev_destroy(ab); + +-- +2.35.1 + diff --git a/queue-5.10/ath9k-fix-use-after-free-in-ath9k_hif_usb_rx_cb.patch b/queue-5.10/ath9k-fix-use-after-free-in-ath9k_hif_usb_rx_cb.patch new file mode 100644 index 00000000000..6d889328171 --- /dev/null +++ b/queue-5.10/ath9k-fix-use-after-free-in-ath9k_hif_usb_rx_cb.patch @@ -0,0 +1,94 @@ +From 9dbf7cfd80ca4894546599289b83a792023a4ca7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 21:43:59 +0300 +Subject: ath9k: fix use-after-free in ath9k_hif_usb_rx_cb +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Pavel Skripkin + +[ Upstream commit 0ac4827f78c7ffe8eef074bc010e7e34bc22f533 ] + +Syzbot reported use-after-free Read in ath9k_hif_usb_rx_cb() [0]. The +problem was in incorrect htc_handle->drv_priv initialization. + +Probable call trace which can trigger use-after-free: + +ath9k_htc_probe_device() + /* htc_handle->drv_priv = priv; */ + ath9k_htc_wait_for_target() <--- Failed + ieee80211_free_hw() <--- priv pointer is freed + + +... +ath9k_hif_usb_rx_cb() + ath9k_hif_usb_rx_stream() + RX_STAT_INC() <--- htc_handle->drv_priv access + +In order to not add fancy protection for drv_priv we can move +htc_handle->drv_priv initialization at the end of the +ath9k_htc_probe_device() and add helper macro to make +all *_STAT_* macros NULL safe, since syzbot has reported related NULL +deref in that macros [1] + +Link: https://syzkaller.appspot.com/bug?id=6ead44e37afb6866ac0c7dd121b4ce07cb665f60 [0] +Link: https://syzkaller.appspot.com/bug?id=b8101ffcec107c0567a0cd8acbbacec91e9ee8de [1] +Fixes: fb9987d0f748 ("ath9k_htc: Support for AR9271 chipset.") +Reported-and-tested-by: syzbot+03110230a11411024147@syzkaller.appspotmail.com +Reported-and-tested-by: syzbot+c6dde1f690b60e0b9fbe@syzkaller.appspotmail.com +Signed-off-by: Pavel Skripkin +Acked-by: Toke Høiland-Jørgensen +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/d57bbedc857950659bfacac0ab48790c1eda00c8.1655145743.git.paskripkin@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath9k/htc.h | 10 +++++----- + drivers/net/wireless/ath/ath9k/htc_drv_init.c | 3 ++- + 2 files changed, 7 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h +index 6b45e63fae4b..e3d546ef71dd 100644 +--- a/drivers/net/wireless/ath/ath9k/htc.h ++++ b/drivers/net/wireless/ath/ath9k/htc.h +@@ -327,11 +327,11 @@ static inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb) + } + + #ifdef CONFIG_ATH9K_HTC_DEBUGFS +- +-#define TX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c++) +-#define TX_STAT_ADD(c, a) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c += a) +-#define RX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.skbrx_stats.c++) +-#define RX_STAT_ADD(c, a) (hif_dev->htc_handle->drv_priv->debug.skbrx_stats.c += a) ++#define __STAT_SAFE(expr) (hif_dev->htc_handle->drv_priv ? (expr) : 0) ++#define TX_STAT_INC(c) __STAT_SAFE(hif_dev->htc_handle->drv_priv->debug.tx_stats.c++) ++#define TX_STAT_ADD(c, a) __STAT_SAFE(hif_dev->htc_handle->drv_priv->debug.tx_stats.c += a) ++#define RX_STAT_INC(c) __STAT_SAFE(hif_dev->htc_handle->drv_priv->debug.skbrx_stats.c++) ++#define RX_STAT_ADD(c, a) __STAT_SAFE(hif_dev->htc_handle->drv_priv->debug.skbrx_stats.c += a) + #define CAB_STAT_INC priv->debug.tx_stats.cab_queued++ + + #define TX_QSTAT_INC(q) (priv->debug.tx_stats.queue_stats[q]++) +diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c +index ff61ae34ecdf..07ac88fb1c57 100644 +--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c ++++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c +@@ -944,7 +944,6 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev, + priv->hw = hw; + priv->htc = htc_handle; + priv->dev = dev; +- htc_handle->drv_priv = priv; + SET_IEEE80211_DEV(hw, priv->dev); + + ret = ath9k_htc_wait_for_target(priv); +@@ -965,6 +964,8 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev, + if (ret) + goto err_init; + ++ htc_handle->drv_priv = priv; ++ + return 0; + + err_init: +-- +2.35.1 + diff --git a/queue-5.10/blk-mq-don-t-create-hctx-debugfs-dir-until-q-debugfs.patch b/queue-5.10/blk-mq-don-t-create-hctx-debugfs-dir-until-q-debugfs.patch new file mode 100644 index 00000000000..cda05e205ed --- /dev/null +++ b/queue-5.10/blk-mq-don-t-create-hctx-debugfs-dir-until-q-debugfs.patch @@ -0,0 +1,44 @@ +From 0889d9553eeacb52795ee634966918a62e0ec4f1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jul 2022 17:08:08 +0800 +Subject: blk-mq: don't create hctx debugfs dir until q->debugfs_dir is created + +From: Ming Lei + +[ Upstream commit f3ec5d11554778c24ac8915e847223ed71d104fc ] + +blk_mq_debugfs_register_hctx() can be called by blk_mq_update_nr_hw_queues +when gendisk isn't added yet, such as nvme tcp. + +Fixes the warning of 'debugfs: Directory 'hctx0' with parent '/' already present!' +which can be observed reliably when running blktests nvme/005. + +Fixes: 6cfc0081b046 ("blk-mq: no need to check return value of debugfs_create functions") +Reported-by: Yi Zhang +Signed-off-by: Ming Lei +Tested-by: Yi Zhang +Reviewed-by: Christoph Hellwig +Link: https://lore.kernel.org/r/20220711090808.259682-1-ming.lei@redhat.com +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + block/blk-mq-debugfs.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c +index b5f26082b959..212e1e795469 100644 +--- a/block/blk-mq-debugfs.c ++++ b/block/blk-mq-debugfs.c +@@ -881,6 +881,9 @@ void blk_mq_debugfs_register_hctx(struct request_queue *q, + char name[20]; + int i; + ++ if (!q->debugfs_dir) ++ return; ++ + snprintf(name, sizeof(name), "hctx%u", hctx->queue_num); + hctx->debugfs_dir = debugfs_create_dir(name, q->debugfs_dir); + +-- +2.35.1 + diff --git a/queue-5.10/blktrace-trace-remapped-requests-correctly.patch b/queue-5.10/blktrace-trace-remapped-requests-correctly.patch new file mode 100644 index 00000000000..e0da2f5448d --- /dev/null +++ b/queue-5.10/blktrace-trace-remapped-requests-correctly.patch @@ -0,0 +1,43 @@ +From f96dd3edbca0448c46407fed76c0ea8703a3d0bf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jul 2022 11:06:36 -0700 +Subject: blktrace: Trace remapped requests correctly + +From: Bart Van Assche + +[ Upstream commit 22c80aac882f712897b88b7ea8f5a74ea19019df ] + +Trace the remapped operation and its flags instead of only the data +direction of remapped operations. This issue was detected by analyzing +the warnings reported by sparse related to the new blk_opf_t type. + +Reviewed-by: Jun'ichi Nomura +Cc: Mike Snitzer +Cc: Mike Christie +Cc: Li Zefan +Cc: Chaitanya Kulkarni +Fixes: 1b9a9ab78b0a ("blktrace: use op accessors") +Signed-off-by: Bart Van Assche +Link: https://lore.kernel.org/r/20220714180729.1065367-11-bvanassche@acm.org +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + kernel/trace/blktrace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c +index 7f625400763b..15a376f85e09 100644 +--- a/kernel/trace/blktrace.c ++++ b/kernel/trace/blktrace.c +@@ -1100,7 +1100,7 @@ static void blk_add_trace_rq_remap(void *ignore, struct request *rq, dev_t dev, + r.sector_from = cpu_to_be64(from); + + __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), +- rq_data_dir(rq), 0, BLK_TA_REMAP, 0, ++ req_op(rq), rq->cmd_flags, BLK_TA_REMAP, 0, + sizeof(r), &r, blk_trace_request_get_cgid(rq)); + rcu_read_unlock(); + } +-- +2.35.1 + diff --git a/queue-5.10/block-fix-infinite-loop-for-invalid-zone-append.patch b/queue-5.10/block-fix-infinite-loop-for-invalid-zone-append.patch new file mode 100644 index 00000000000..da77f8166ec --- /dev/null +++ b/queue-5.10/block-fix-infinite-loop-for-invalid-zone-append.patch @@ -0,0 +1,45 @@ +From fc6eaa08f88e0042edd03856f32dfa0bace09812 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 Jun 2022 12:58:20 -0700 +Subject: block: fix infinite loop for invalid zone append + +From: Keith Busch + +[ Upstream commit b82d9fa257cb3725c49d94d2aeafc4677c34448a ] + +Returning 0 early from __bio_iov_append_get_pages() for the +max_append_sectors warning just creates an infinite loop since 0 means +success, and the bio will never fill from the unadvancing iov_iter. We +could turn the return into an error value, but it will already be turned +into an error value later on, so just remove the warning. Clearly no one +ever hit it anyway. + +Fixes: 0512a75b98f84 ("block: Introduce REQ_OP_ZONE_APPEND") +Signed-off-by: Keith Busch +Reviewed-by: Damien Le Moal +Reviewed-by: Christoph Hellwig +Reviewed-by: Johannes Thumshirn +Link: https://lore.kernel.org/r/20220610195830.3574005-2-kbusch@fb.com +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + block/bio.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/block/bio.c b/block/bio.c +index f8d26ce7b61b..6d6e7b96b002 100644 +--- a/block/bio.c ++++ b/block/bio.c +@@ -1057,9 +1057,6 @@ static int __bio_iov_append_get_pages(struct bio *bio, struct iov_iter *iter) + size_t offset; + int ret = 0; + +- if (WARN_ON_ONCE(!max_append_sectors)) +- return 0; +- + /* + * Move page array up in the allocated memory for the bio vecs as far as + * possible so that we can start filling biovecs from the beginning +-- +2.35.1 + diff --git a/queue-5.10/block-remove-the-request_queue-to-argument-request-b.patch b/queue-5.10/block-remove-the-request_queue-to-argument-request-b.patch new file mode 100644 index 00000000000..1b0f2afd3d9 --- /dev/null +++ b/queue-5.10/block-remove-the-request_queue-to-argument-request-b.patch @@ -0,0 +1,388 @@ +From 046372e2f8e99a04033477e296e911672caffaeb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Dec 2020 17:21:39 +0100 +Subject: block: remove the request_queue to argument request based tracepoints + +From: Christoph Hellwig + +[ Upstream commit a54895fa057c67700270777f7661d8d3c7fda88a ] + +The request_queue can trivially be derived from the request. + +Signed-off-by: Christoph Hellwig +Reviewed-by: Damien Le Moal +Reviewed-by: Hannes Reinecke +Reviewed-by: Chaitanya Kulkarni +Acked-by: Tejun Heo +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + block/blk-merge.c | 2 +- + block/blk-mq-sched.c | 2 +- + block/blk-mq.c | 8 +++---- + drivers/md/dm-rq.c | 2 +- + drivers/s390/scsi/zfcp_fsf.c | 3 +-- + include/linux/blktrace_api.h | 5 ++-- + include/trace/events/block.h | 30 ++++++++++-------------- + kernel/trace/blktrace.c | 44 ++++++++++++++---------------------- + 8 files changed, 39 insertions(+), 57 deletions(-) + +diff --git a/block/blk-merge.c b/block/blk-merge.c +index 006b1f0a59bc..fbba277364f0 100644 +--- a/block/blk-merge.c ++++ b/block/blk-merge.c +@@ -806,7 +806,7 @@ static struct request *attempt_merge(struct request_queue *q, + */ + blk_account_io_merge_request(next); + +- trace_block_rq_merge(q, next); ++ trace_block_rq_merge(next); + + /* + * ownership of bio passed from next to req, return 'next' for +diff --git a/block/blk-mq-sched.c b/block/blk-mq-sched.c +index e0117f5f969d..72e64ba661fc 100644 +--- a/block/blk-mq-sched.c ++++ b/block/blk-mq-sched.c +@@ -396,7 +396,7 @@ EXPORT_SYMBOL_GPL(blk_mq_sched_try_insert_merge); + + void blk_mq_sched_request_inserted(struct request *rq) + { +- trace_block_rq_insert(rq->q, rq); ++ trace_block_rq_insert(rq); + } + EXPORT_SYMBOL_GPL(blk_mq_sched_request_inserted); + +diff --git a/block/blk-mq.c b/block/blk-mq.c +index c5d82b21a1cc..90f64bb42fbd 100644 +--- a/block/blk-mq.c ++++ b/block/blk-mq.c +@@ -733,7 +733,7 @@ void blk_mq_start_request(struct request *rq) + { + struct request_queue *q = rq->q; + +- trace_block_rq_issue(q, rq); ++ trace_block_rq_issue(rq); + + if (test_bit(QUEUE_FLAG_STATS, &q->queue_flags)) { + rq->io_start_time_ns = ktime_get_ns(); +@@ -760,7 +760,7 @@ static void __blk_mq_requeue_request(struct request *rq) + + blk_mq_put_driver_tag(rq); + +- trace_block_rq_requeue(q, rq); ++ trace_block_rq_requeue(rq); + rq_qos_requeue(q, rq); + + if (blk_mq_request_started(rq)) { +@@ -1806,7 +1806,7 @@ static inline void __blk_mq_insert_req_list(struct blk_mq_hw_ctx *hctx, + + lockdep_assert_held(&ctx->lock); + +- trace_block_rq_insert(hctx->queue, rq); ++ trace_block_rq_insert(rq); + + if (at_head) + list_add(&rq->queuelist, &ctx->rq_lists[type]); +@@ -1863,7 +1863,7 @@ void blk_mq_insert_requests(struct blk_mq_hw_ctx *hctx, struct blk_mq_ctx *ctx, + */ + list_for_each_entry(rq, list, queuelist) { + BUG_ON(rq->mq_ctx != ctx); +- trace_block_rq_insert(hctx->queue, rq); ++ trace_block_rq_insert(rq); + } + + spin_lock(&ctx->lock); +diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c +index 4833f4b20b2c..5f933dbb0152 100644 +--- a/drivers/md/dm-rq.c ++++ b/drivers/md/dm-rq.c +@@ -397,7 +397,7 @@ static int map_request(struct dm_rq_target_io *tio) + } + + /* The target has remapped the I/O so dispatch it */ +- trace_block_rq_remap(clone->q, clone, disk_devt(dm_disk(md)), ++ trace_block_rq_remap(clone, disk_devt(dm_disk(md)), + blk_rq_pos(rq)); + ret = dm_dispatch_clone_request(clone, rq); + if (ret == BLK_STS_RESOURCE || ret == BLK_STS_DEV_RESOURCE) { +diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c +index 6cb963a06777..37d450f46952 100644 +--- a/drivers/s390/scsi/zfcp_fsf.c ++++ b/drivers/s390/scsi/zfcp_fsf.c +@@ -2359,8 +2359,7 @@ static void zfcp_fsf_req_trace(struct zfcp_fsf_req *req, struct scsi_cmnd *scsi) + } + } + +- blk_add_driver_data(scsi->request->q, scsi->request, &blktrc, +- sizeof(blktrc)); ++ blk_add_driver_data(scsi->request, &blktrc, sizeof(blktrc)); + } + + /** +diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h +index 3b6ff5902edc..05556573b896 100644 +--- a/include/linux/blktrace_api.h ++++ b/include/linux/blktrace_api.h +@@ -75,8 +75,7 @@ static inline bool blk_trace_note_message_enabled(struct request_queue *q) + return ret; + } + +-extern void blk_add_driver_data(struct request_queue *q, struct request *rq, +- void *data, size_t len); ++extern void blk_add_driver_data(struct request *rq, void *data, size_t len); + extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev, + struct block_device *bdev, + char __user *arg); +@@ -90,7 +89,7 @@ extern struct attribute_group blk_trace_attr_group; + #else /* !CONFIG_BLK_DEV_IO_TRACE */ + # define blk_trace_ioctl(bdev, cmd, arg) (-ENOTTY) + # define blk_trace_shutdown(q) do { } while (0) +-# define blk_add_driver_data(q, rq, data, len) do {} while (0) ++# define blk_add_driver_data(rq, data, len) do {} while (0) + # define blk_trace_setup(q, name, dev, bdev, arg) (-ENOTTY) + # define blk_trace_startstop(q, start) (-ENOTTY) + # define blk_trace_remove(q) (-ENOTTY) +diff --git a/include/trace/events/block.h b/include/trace/events/block.h +index 34d64ca306b1..76a6b3bbc01f 100644 +--- a/include/trace/events/block.h ++++ b/include/trace/events/block.h +@@ -64,7 +64,6 @@ DEFINE_EVENT(block_buffer, block_dirty_buffer, + + /** + * block_rq_requeue - place block IO request back on a queue +- * @q: queue holding operation + * @rq: block IO operation request + * + * The block operation request @rq is being placed back into queue +@@ -73,9 +72,9 @@ DEFINE_EVENT(block_buffer, block_dirty_buffer, + */ + TRACE_EVENT(block_rq_requeue, + +- TP_PROTO(struct request_queue *q, struct request *rq), ++ TP_PROTO(struct request *rq), + +- TP_ARGS(q, rq), ++ TP_ARGS(rq), + + TP_STRUCT__entry( + __field( dev_t, dev ) +@@ -147,9 +146,9 @@ TRACE_EVENT(block_rq_complete, + + DECLARE_EVENT_CLASS(block_rq, + +- TP_PROTO(struct request_queue *q, struct request *rq), ++ TP_PROTO(struct request *rq), + +- TP_ARGS(q, rq), ++ TP_ARGS(rq), + + TP_STRUCT__entry( + __field( dev_t, dev ) +@@ -181,7 +180,6 @@ DECLARE_EVENT_CLASS(block_rq, + + /** + * block_rq_insert - insert block operation request into queue +- * @q: target queue + * @rq: block IO operation request + * + * Called immediately before block operation request @rq is inserted +@@ -191,14 +189,13 @@ DECLARE_EVENT_CLASS(block_rq, + */ + DEFINE_EVENT(block_rq, block_rq_insert, + +- TP_PROTO(struct request_queue *q, struct request *rq), ++ TP_PROTO(struct request *rq), + +- TP_ARGS(q, rq) ++ TP_ARGS(rq) + ); + + /** + * block_rq_issue - issue pending block IO request operation to device driver +- * @q: queue holding operation + * @rq: block IO operation operation request + * + * Called when block operation request @rq from queue @q is sent to a +@@ -206,14 +203,13 @@ DEFINE_EVENT(block_rq, block_rq_insert, + */ + DEFINE_EVENT(block_rq, block_rq_issue, + +- TP_PROTO(struct request_queue *q, struct request *rq), ++ TP_PROTO(struct request *rq), + +- TP_ARGS(q, rq) ++ TP_ARGS(rq) + ); + + /** + * block_rq_merge - merge request with another one in the elevator +- * @q: queue holding operation + * @rq: block IO operation operation request + * + * Called when block operation request @rq from queue @q is merged to another +@@ -221,9 +217,9 @@ DEFINE_EVENT(block_rq, block_rq_issue, + */ + DEFINE_EVENT(block_rq, block_rq_merge, + +- TP_PROTO(struct request_queue *q, struct request *rq), ++ TP_PROTO(struct request *rq), + +- TP_ARGS(q, rq) ++ TP_ARGS(rq) + ); + + /** +@@ -605,7 +601,6 @@ TRACE_EVENT(block_bio_remap, + + /** + * block_rq_remap - map request for a block operation request +- * @q: queue holding the operation + * @rq: block IO operation request + * @dev: device for the operation + * @from: original sector for the operation +@@ -616,10 +611,9 @@ TRACE_EVENT(block_bio_remap, + */ + TRACE_EVENT(block_rq_remap, + +- TP_PROTO(struct request_queue *q, struct request *rq, dev_t dev, +- sector_t from), ++ TP_PROTO(struct request *rq, dev_t dev, sector_t from), + +- TP_ARGS(q, rq, dev, from), ++ TP_ARGS(rq, dev, from), + + TP_STRUCT__entry( + __field( dev_t, dev ) +diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c +index b89ff188a618..7f625400763b 100644 +--- a/kernel/trace/blktrace.c ++++ b/kernel/trace/blktrace.c +@@ -800,12 +800,12 @@ static u64 blk_trace_bio_get_cgid(struct request_queue *q, struct bio *bio) + #endif + + static u64 +-blk_trace_request_get_cgid(struct request_queue *q, struct request *rq) ++blk_trace_request_get_cgid(struct request *rq) + { + if (!rq->bio) + return 0; + /* Use the first bio */ +- return blk_trace_bio_get_cgid(q, rq->bio); ++ return blk_trace_bio_get_cgid(rq->q, rq->bio); + } + + /* +@@ -846,40 +846,35 @@ static void blk_add_trace_rq(struct request *rq, int error, + rcu_read_unlock(); + } + +-static void blk_add_trace_rq_insert(void *ignore, +- struct request_queue *q, struct request *rq) ++static void blk_add_trace_rq_insert(void *ignore, struct request *rq) + { + blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_INSERT, +- blk_trace_request_get_cgid(q, rq)); ++ blk_trace_request_get_cgid(rq)); + } + +-static void blk_add_trace_rq_issue(void *ignore, +- struct request_queue *q, struct request *rq) ++static void blk_add_trace_rq_issue(void *ignore, struct request *rq) + { + blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_ISSUE, +- blk_trace_request_get_cgid(q, rq)); ++ blk_trace_request_get_cgid(rq)); + } + +-static void blk_add_trace_rq_merge(void *ignore, +- struct request_queue *q, struct request *rq) ++static void blk_add_trace_rq_merge(void *ignore, struct request *rq) + { + blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_BACKMERGE, +- blk_trace_request_get_cgid(q, rq)); ++ blk_trace_request_get_cgid(rq)); + } + +-static void blk_add_trace_rq_requeue(void *ignore, +- struct request_queue *q, +- struct request *rq) ++static void blk_add_trace_rq_requeue(void *ignore, struct request *rq) + { + blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_REQUEUE, +- blk_trace_request_get_cgid(q, rq)); ++ blk_trace_request_get_cgid(rq)); + } + + static void blk_add_trace_rq_complete(void *ignore, struct request *rq, + int error, unsigned int nr_bytes) + { + blk_add_trace_rq(rq, error, nr_bytes, BLK_TA_COMPLETE, +- blk_trace_request_get_cgid(rq->q, rq)); ++ blk_trace_request_get_cgid(rq)); + } + + /** +@@ -1087,16 +1082,14 @@ static void blk_add_trace_bio_remap(void *ignore, + * Add a trace for that action. + * + **/ +-static void blk_add_trace_rq_remap(void *ignore, +- struct request_queue *q, +- struct request *rq, dev_t dev, ++static void blk_add_trace_rq_remap(void *ignore, struct request *rq, dev_t dev, + sector_t from) + { + struct blk_trace *bt; + struct blk_io_trace_remap r; + + rcu_read_lock(); +- bt = rcu_dereference(q->blk_trace); ++ bt = rcu_dereference(rq->q->blk_trace); + if (likely(!bt)) { + rcu_read_unlock(); + return; +@@ -1108,13 +1101,12 @@ static void blk_add_trace_rq_remap(void *ignore, + + __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), + rq_data_dir(rq), 0, BLK_TA_REMAP, 0, +- sizeof(r), &r, blk_trace_request_get_cgid(q, rq)); ++ sizeof(r), &r, blk_trace_request_get_cgid(rq)); + rcu_read_unlock(); + } + + /** + * blk_add_driver_data - Add binary message with driver-specific data +- * @q: queue the io is for + * @rq: io request + * @data: driver-specific data + * @len: length of driver-specific data +@@ -1123,14 +1115,12 @@ static void blk_add_trace_rq_remap(void *ignore, + * Some drivers might want to write driver-specific data per request. + * + **/ +-void blk_add_driver_data(struct request_queue *q, +- struct request *rq, +- void *data, size_t len) ++void blk_add_driver_data(struct request *rq, void *data, size_t len) + { + struct blk_trace *bt; + + rcu_read_lock(); +- bt = rcu_dereference(q->blk_trace); ++ bt = rcu_dereference(rq->q->blk_trace); + if (likely(!bt)) { + rcu_read_unlock(); + return; +@@ -1138,7 +1128,7 @@ void blk_add_driver_data(struct request_queue *q, + + __blk_add_trace(bt, blk_rq_trace_sector(rq), blk_rq_bytes(rq), 0, 0, + BLK_TA_DRV_DATA, 0, len, data, +- blk_trace_request_get_cgid(q, rq)); ++ blk_trace_request_get_cgid(rq)); + rcu_read_unlock(); + } + EXPORT_SYMBOL_GPL(blk_add_driver_data); +-- +2.35.1 + diff --git a/queue-5.10/bluetooth-hci_intel-add-check-for-platform_driver_re.patch b/queue-5.10/bluetooth-hci_intel-add-check-for-platform_driver_re.patch new file mode 100644 index 00000000000..83ae50cdb99 --- /dev/null +++ b/queue-5.10/bluetooth-hci_intel-add-check-for-platform_driver_re.patch @@ -0,0 +1,41 @@ +From a75d0858667cf8b6688427b248512bfd9f66e5ae Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 3 Jun 2022 09:24:36 +0800 +Subject: Bluetooth: hci_intel: Add check for platform_driver_register + +From: Jiasheng Jiang + +[ Upstream commit ab2d2a982ff721f4b029282d9a40602ea46a745e ] + +As platform_driver_register() could fail, it should be better +to deal with the return value in order to maintain the code +consisitency. + +Fixes: 1ab1f239bf17 ("Bluetooth: hci_intel: Add support for platform driver") +Signed-off-by: Jiasheng Jiang +Signed-off-by: Marcel Holtmann +Signed-off-by: Sasha Levin +--- + drivers/bluetooth/hci_intel.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/bluetooth/hci_intel.c b/drivers/bluetooth/hci_intel.c +index b20a40fab83e..d5d2feef6c52 100644 +--- a/drivers/bluetooth/hci_intel.c ++++ b/drivers/bluetooth/hci_intel.c +@@ -1214,7 +1214,11 @@ static struct platform_driver intel_driver = { + + int __init intel_init(void) + { +- platform_driver_register(&intel_driver); ++ int err; ++ ++ err = platform_driver_register(&intel_driver); ++ if (err) ++ return err; + + return hci_uart_register_proto(&intel_proto); + } +-- +2.35.1 + diff --git a/queue-5.10/bpf-fix-subprog-names-in-stack-traces.patch b/queue-5.10/bpf-fix-subprog-names-in-stack-traces.patch new file mode 100644 index 00000000000..efdcba90f1a --- /dev/null +++ b/queue-5.10/bpf-fix-subprog-names-in-stack-traces.patch @@ -0,0 +1,50 @@ +From 05cfbb337182ad7e631f3031cafd9d4879d14e91 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jul 2022 14:16:37 -0700 +Subject: bpf: Fix subprog names in stack traces. + +From: Alexei Starovoitov + +[ Upstream commit 9c7c48d6a1e2eb5192ad5294c1c4dbd42a88e88b ] + +The commit 7337224fc150 ("bpf: Improve the info.func_info and info.func_info_rec_size behavior") +accidently made bpf_prog_ksym_set_name() conservative for bpf subprograms. +Fixed it so instead of "bpf_prog_tag_F" the stack traces print "bpf_prog_tag_full_subprog_name". + +Fixes: 7337224fc150 ("bpf: Improve the info.func_info and info.func_info_rec_size behavior") +Reported-by: Tejun Heo +Signed-off-by: Alexei Starovoitov +Signed-off-by: Andrii Nakryiko +Acked-by: Martin KaFai Lau +Acked-by: Yonghong Song +Link: https://lore.kernel.org/bpf/20220714211637.17150-1-alexei.starovoitov@gmail.com +Signed-off-by: Sasha Levin +--- + kernel/bpf/verifier.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c +index 15ddc4292bc0..de636b7445b1 100644 +--- a/kernel/bpf/verifier.c ++++ b/kernel/bpf/verifier.c +@@ -11152,6 +11152,7 @@ static int jit_subprogs(struct bpf_verifier_env *env) + /* Below members will be freed only at prog->aux */ + func[i]->aux->btf = prog->aux->btf; + func[i]->aux->func_info = prog->aux->func_info; ++ func[i]->aux->func_info_cnt = prog->aux->func_info_cnt; + func[i]->aux->poke_tab = prog->aux->poke_tab; + func[i]->aux->size_poke_tab = prog->aux->size_poke_tab; + +@@ -11164,9 +11165,6 @@ static int jit_subprogs(struct bpf_verifier_env *env) + poke->aux = func[i]->aux; + } + +- /* Use bpf_prog_F_tag to indicate functions in stack traces. +- * Long term would need debug info to populate names +- */ + func[i]->aux->name[0] = 'F'; + func[i]->aux->stack_depth = env->subprog_info[i].stack_depth; + func[i]->jit_requested = 1; +-- +2.35.1 + diff --git a/queue-5.10/bus-hisi_lpc-fix-missing-platform_device_put-in-hisi.patch b/queue-5.10/bus-hisi_lpc-fix-missing-platform_device_put-in-hisi.patch new file mode 100644 index 00000000000..c787b4e0c63 --- /dev/null +++ b/queue-5.10/bus-hisi_lpc-fix-missing-platform_device_put-in-hisi.patch @@ -0,0 +1,75 @@ +From c4795d87619b04902ef1ddada4a74963a6fcad9b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 17:43:52 +0800 +Subject: bus: hisi_lpc: fix missing platform_device_put() in + hisi_lpc_acpi_probe() + +From: Yang Yingliang + +[ Upstream commit 54872fea6a5ac967ec2272aea525d1438ac6735a ] + +In error case in hisi_lpc_acpi_probe() after calling platform_device_add(), +hisi_lpc_acpi_remove() can't release the failed 'pdev', so it will be leak, +call platform_device_put() to fix this problem. +I'v constructed this error case and tested this patch on D05 board. + +Fixes: 99c0228d6ff1 ("HISI LPC: Re-Add ACPI child enumeration support") +Reported-by: Hulk Robot +Signed-off-by: Yang Yingliang +Acked-by: John Garry +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/bus/hisi_lpc.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/drivers/bus/hisi_lpc.c b/drivers/bus/hisi_lpc.c +index 378f5d62a991..e7eaa8784fee 100644 +--- a/drivers/bus/hisi_lpc.c ++++ b/drivers/bus/hisi_lpc.c +@@ -503,13 +503,13 @@ static int hisi_lpc_acpi_probe(struct device *hostdev) + { + struct acpi_device *adev = ACPI_COMPANION(hostdev); + struct acpi_device *child; ++ struct platform_device *pdev; + int ret; + + /* Only consider the children of the host */ + list_for_each_entry(child, &adev->children, node) { + const char *hid = acpi_device_hid(child); + const struct hisi_lpc_acpi_cell *cell; +- struct platform_device *pdev; + const struct resource *res; + bool found = false; + int num_res; +@@ -571,22 +571,24 @@ static int hisi_lpc_acpi_probe(struct device *hostdev) + + ret = platform_device_add_resources(pdev, res, num_res); + if (ret) +- goto fail; ++ goto fail_put_device; + + ret = platform_device_add_data(pdev, cell->pdata, + cell->pdata_size); + if (ret) +- goto fail; ++ goto fail_put_device; + + ret = platform_device_add(pdev); + if (ret) +- goto fail; ++ goto fail_put_device; + + acpi_device_set_enumerated(child); + } + + return 0; + ++fail_put_device: ++ platform_device_put(pdev); + fail: + hisi_lpc_acpi_remove(hostdev); + return ret; +-- +2.35.1 + diff --git a/queue-5.10/can-error-specify-the-values-of-data-5.7-of-can-erro.patch b/queue-5.10/can-error-specify-the-values-of-data-5.7-of-can-erro.patch new file mode 100644 index 00000000000..bf3c03d36a6 --- /dev/null +++ b/queue-5.10/can-error-specify-the-values-of-data-5.7-of-can-erro.patch @@ -0,0 +1,49 @@ +From d841c85d591d992f42edc5007ffc92a6d431fd7a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 23:35:48 +0900 +Subject: can: error: specify the values of data[5..7] of CAN error frames + +From: Vincent Mailhol + +[ Upstream commit e70a3263a7eed768d5f947b8f2aff8d2a79c9d97 ] + +Currently, data[5..7] of struct can_frame, when used as a CAN error +frame, are defined as being "controller specific". Device specific +behaviours are problematic because it prevents someone from writing +code which is portable between devices. + +As a matter of fact, data[5] is never used, data[6] is always used to +report TX error counter and data[7] is always used to report RX error +counter. can-utils also relies on this. + +This patch updates the comment in the uapi header to specify that +data[5] is reserved (and thus should not be used) and that data[6..7] +are used for error counters. + +Fixes: 0d66548a10cb ("[CAN]: Add PF_CAN core module") +Link: https://lore.kernel.org/all/20220719143550.3681-11-mailhol.vincent@wanadoo.fr +Signed-off-by: Vincent Mailhol +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + include/uapi/linux/can/error.h | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/include/uapi/linux/can/error.h b/include/uapi/linux/can/error.h +index 34633283de64..a1000cb63063 100644 +--- a/include/uapi/linux/can/error.h ++++ b/include/uapi/linux/can/error.h +@@ -120,6 +120,9 @@ + #define CAN_ERR_TRX_CANL_SHORT_TO_GND 0x70 /* 0111 0000 */ + #define CAN_ERR_TRX_CANL_SHORT_TO_CANH 0x80 /* 1000 0000 */ + +-/* controller specific additional information / data[5..7] */ ++/* data[5] is reserved (do not use) */ ++ ++/* TX error counter / data[6] */ ++/* RX error counter / data[7] */ + + #endif /* _UAPI_CAN_ERROR_H */ +-- +2.35.1 + diff --git a/queue-5.10/can-hi311x-do-not-report-txerr-and-rxerr-during-bus-.patch b/queue-5.10/can-hi311x-do-not-report-txerr-and-rxerr-during-bus-.patch new file mode 100644 index 00000000000..8acf5ddf336 --- /dev/null +++ b/queue-5.10/can-hi311x-do-not-report-txerr-and-rxerr-during-bus-.patch @@ -0,0 +1,47 @@ +From 3ca5a30a701513160df237cf5c00e3314774da57 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 23:35:43 +0900 +Subject: can: hi311x: do not report txerr and rxerr during bus-off + +From: Vincent Mailhol + +[ Upstream commit a22bd630cfff496b270211745536e50e98eb3a45 ] + +During bus off, the error count is greater than 255 and can not fit in +a u8. + +Fixes: 57e83fb9b746 ("can: hi311x: Add Holt HI-311x CAN driver") +Link: https://lore.kernel.org/all/20220719143550.3681-6-mailhol.vincent@wanadoo.fr +Signed-off-by: Vincent Mailhol +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + drivers/net/can/spi/hi311x.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/can/spi/hi311x.c b/drivers/net/can/spi/hi311x.c +index 7d2315c8cacb..28273e84171a 100644 +--- a/drivers/net/can/spi/hi311x.c ++++ b/drivers/net/can/spi/hi311x.c +@@ -670,8 +670,6 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id) + + txerr = hi3110_read(spi, HI3110_READ_TEC); + rxerr = hi3110_read(spi, HI3110_READ_REC); +- cf->data[6] = txerr; +- cf->data[7] = rxerr; + tx_state = txerr >= rxerr ? new_state : 0; + rx_state = txerr <= rxerr ? new_state : 0; + can_change_state(net, cf, tx_state, rx_state); +@@ -684,6 +682,9 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id) + hi3110_hw_sleep(spi); + break; + } ++ } else { ++ cf->data[6] = txerr; ++ cf->data[7] = rxerr; + } + } + +-- +2.35.1 + diff --git a/queue-5.10/can-kvaser_usb_hydra-do-not-report-txerr-and-rxerr-d.patch b/queue-5.10/can-kvaser_usb_hydra-do-not-report-txerr-and-rxerr-d.patch new file mode 100644 index 00000000000..ce664b27703 --- /dev/null +++ b/queue-5.10/can-kvaser_usb_hydra-do-not-report-txerr-and-rxerr-d.patch @@ -0,0 +1,55 @@ +From 93879cca7334ea5bf63c84bf431d0b52ecb8e6f0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 23:35:45 +0900 +Subject: can: kvaser_usb_hydra: do not report txerr and rxerr during bus-off + +From: Vincent Mailhol + +[ Upstream commit 936e90595376e64b6247c72d3ea8b8b164b7ac96 ] + +During bus off, the error count is greater than 255 and can not fit in +a u8. + +Fixes: aec5fb2268b7 ("can: kvaser_usb: Add support for Kvaser USB hydra family") +Link: https://lore.kernel.org/all/20220719143550.3681-8-mailhol.vincent@wanadoo.fr +CC: Jimmy Assarsson +Signed-off-by: Vincent Mailhol +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c +index a7c408acb0c0..01d4a731b579 100644 +--- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c ++++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c +@@ -890,8 +890,10 @@ static void kvaser_usb_hydra_update_state(struct kvaser_usb_net_priv *priv, + new_state < CAN_STATE_BUS_OFF) + priv->can.can_stats.restarts++; + +- cf->data[6] = bec->txerr; +- cf->data[7] = bec->rxerr; ++ if (new_state != CAN_STATE_BUS_OFF) { ++ cf->data[6] = bec->txerr; ++ cf->data[7] = bec->rxerr; ++ } + + stats = &netdev->stats; + stats->rx_packets++; +@@ -1045,8 +1047,10 @@ kvaser_usb_hydra_error_frame(struct kvaser_usb_net_priv *priv, + shhwtstamps->hwtstamp = hwtstamp; + + cf->can_id |= CAN_ERR_BUSERROR; +- cf->data[6] = bec.txerr; +- cf->data[7] = bec.rxerr; ++ if (new_state != CAN_STATE_BUS_OFF) { ++ cf->data[6] = bec.txerr; ++ cf->data[7] = bec.rxerr; ++ } + + stats->rx_packets++; + stats->rx_bytes += cf->can_dlc; +-- +2.35.1 + diff --git a/queue-5.10/can-kvaser_usb_leaf-do-not-report-txerr-and-rxerr-du.patch b/queue-5.10/can-kvaser_usb_leaf-do-not-report-txerr-and-rxerr-du.patch new file mode 100644 index 00000000000..e35872e7bc4 --- /dev/null +++ b/queue-5.10/can-kvaser_usb_leaf-do-not-report-txerr-and-rxerr-du.patch @@ -0,0 +1,42 @@ +From b2b79b51ab0b543d04e7846dfe00f65404fcdfae Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 23:35:46 +0900 +Subject: can: kvaser_usb_leaf: do not report txerr and rxerr during bus-off + +From: Vincent Mailhol + +[ Upstream commit a57732084e06791d37ea1ea447cca46220737abd ] + +During bus off, the error count is greater than 255 and can not fit in +a u8. + +Fixes: 7259124eac7d1 ("can: kvaser_usb: Split driver into kvaser_usb_core.c and kvaser_usb_leaf.c") +Link: https://lore.kernel.org/all/20220719143550.3681-9-mailhol.vincent@wanadoo.fr +CC: Jimmy Assarsson +Signed-off-by: Vincent Mailhol +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c +index 0e0403dd0550..5e281249ad5f 100644 +--- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c ++++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c +@@ -857,8 +857,10 @@ static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev, + break; + } + +- cf->data[6] = es->txerr; +- cf->data[7] = es->rxerr; ++ if (new_state != CAN_STATE_BUS_OFF) { ++ cf->data[6] = es->txerr; ++ cf->data[7] = es->rxerr; ++ } + + stats->rx_packets++; + stats->rx_bytes += cf->can_dlc; +-- +2.35.1 + diff --git a/queue-5.10/can-pch_can-do-not-report-txerr-and-rxerr-during-bus.patch b/queue-5.10/can-pch_can-do-not-report-txerr-and-rxerr-during-bus.patch new file mode 100644 index 00000000000..6d023493838 --- /dev/null +++ b/queue-5.10/can-pch_can-do-not-report-txerr-and-rxerr-during-bus.patch @@ -0,0 +1,48 @@ +From 8c40125e1217a463af2013b68a31a25c34b66116 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 23:35:39 +0900 +Subject: can: pch_can: do not report txerr and rxerr during bus-off + +From: Vincent Mailhol + +[ Upstream commit 3a5c7e4611ddcf0ef37a3a17296b964d986161a6 ] + +During bus off, the error count is greater than 255 and can not fit in +a u8. + +Fixes: 0c78ab76a05c ("pch_can: Add setting TEC/REC statistics processing") +Link: https://lore.kernel.org/all/20220719143550.3681-2-mailhol.vincent@wanadoo.fr +Signed-off-by: Vincent Mailhol +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + drivers/net/can/pch_can.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/can/pch_can.c b/drivers/net/can/pch_can.c +index 79d9abdcc65a..1adfcc0b9424 100644 +--- a/drivers/net/can/pch_can.c ++++ b/drivers/net/can/pch_can.c +@@ -496,6 +496,9 @@ static void pch_can_error(struct net_device *ndev, u32 status) + cf->can_id |= CAN_ERR_BUSOFF; + priv->can.can_stats.bus_off++; + can_bus_off(ndev); ++ } else { ++ cf->data[6] = errc & PCH_TEC; ++ cf->data[7] = (errc & PCH_REC) >> 8; + } + + errc = ioread32(&priv->regs->errc); +@@ -556,9 +559,6 @@ static void pch_can_error(struct net_device *ndev, u32 status) + break; + } + +- cf->data[6] = errc & PCH_TEC; +- cf->data[7] = (errc & PCH_REC) >> 8; +- + priv->can.state = state; + netif_receive_skb(skb); + +-- +2.35.1 + diff --git a/queue-5.10/can-pch_can-pch_can_error-initialize-errc-before-usi.patch b/queue-5.10/can-pch_can-pch_can_error-initialize-errc-before-usi.patch new file mode 100644 index 00000000000..b735d1416fc --- /dev/null +++ b/queue-5.10/can-pch_can-pch_can_error-initialize-errc-before-usi.patch @@ -0,0 +1,58 @@ +From 01425c18f64221d2946f90167b650911c2d655dc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jul 2022 01:00:32 +0900 +Subject: can: pch_can: pch_can_error(): initialize errc before using it + +From: Vincent Mailhol + +[ Upstream commit 9950f11211331180269867aef848c7cf56861742 ] + +After commit 3a5c7e4611dd, the variable errc is accessed before being +initialized, c.f. below W=2 warning: + +| In function 'pch_can_error', +| inlined from 'pch_can_poll' at drivers/net/can/pch_can.c:739:4: +| drivers/net/can/pch_can.c:501:29: warning: 'errc' may be used uninitialized [-Wmaybe-uninitialized] +| 501 | cf->data[6] = errc & PCH_TEC; +| | ^ +| drivers/net/can/pch_can.c: In function 'pch_can_poll': +| drivers/net/can/pch_can.c:484:13: note: 'errc' was declared here +| 484 | u32 errc, lec; +| | ^~~~ + +Moving errc initialization up solves this issue. + +Fixes: 3a5c7e4611dd ("can: pch_can: do not report txerr and rxerr during bus-off") +Reported-by: Nathan Chancellor +Signed-off-by: Vincent Mailhol +Reviewed-by: Nathan Chancellor +Link: https://lore.kernel.org/all/20220721160032.9348-1-mailhol.vincent@wanadoo.fr +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + drivers/net/can/pch_can.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/can/pch_can.c b/drivers/net/can/pch_can.c +index 1adfcc0b9424..1272ec793a8d 100644 +--- a/drivers/net/can/pch_can.c ++++ b/drivers/net/can/pch_can.c +@@ -489,6 +489,7 @@ static void pch_can_error(struct net_device *ndev, u32 status) + if (!skb) + return; + ++ errc = ioread32(&priv->regs->errc); + if (status & PCH_BUS_OFF) { + pch_can_set_tx_all(priv, 0); + pch_can_set_rx_all(priv, 0); +@@ -501,7 +502,6 @@ static void pch_can_error(struct net_device *ndev, u32 status) + cf->data[7] = (errc & PCH_REC) >> 8; + } + +- errc = ioread32(&priv->regs->errc); + /* Warning interrupt. */ + if (status & PCH_EWARN) { + state = CAN_STATE_ERROR_WARNING; +-- +2.35.1 + diff --git a/queue-5.10/can-rcar_can-do-not-report-txerr-and-rxerr-during-bu.patch b/queue-5.10/can-rcar_can-do-not-report-txerr-and-rxerr-during-bu.patch new file mode 100644 index 00000000000..3306e353b43 --- /dev/null +++ b/queue-5.10/can-rcar_can-do-not-report-txerr-and-rxerr-during-bu.patch @@ -0,0 +1,51 @@ +From 4cb674c4fd2afbab78f3f329d20fe4701f8ea269 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 23:35:40 +0900 +Subject: can: rcar_can: do not report txerr and rxerr during bus-off + +From: Vincent Mailhol + +[ Upstream commit a37b7245e831a641df360ca41db6a71c023d3746 ] + +During bus off, the error count is greater than 255 and can not fit in +a u8. + +Fixes: fd1159318e55 ("can: add Renesas R-Car CAN driver") +Link: https://lore.kernel.org/all/20220719143550.3681-3-mailhol.vincent@wanadoo.fr +Signed-off-by: Vincent Mailhol +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + drivers/net/can/rcar/rcar_can.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/can/rcar/rcar_can.c b/drivers/net/can/rcar/rcar_can.c +index 3570a4de0085..134eda66f0dc 100644 +--- a/drivers/net/can/rcar/rcar_can.c ++++ b/drivers/net/can/rcar/rcar_can.c +@@ -235,11 +235,8 @@ static void rcar_can_error(struct net_device *ndev) + if (eifr & (RCAR_CAN_EIFR_EWIF | RCAR_CAN_EIFR_EPIF)) { + txerr = readb(&priv->regs->tecr); + rxerr = readb(&priv->regs->recr); +- if (skb) { ++ if (skb) + cf->can_id |= CAN_ERR_CRTL; +- cf->data[6] = txerr; +- cf->data[7] = rxerr; +- } + } + if (eifr & RCAR_CAN_EIFR_BEIF) { + int rx_errors = 0, tx_errors = 0; +@@ -339,6 +336,9 @@ static void rcar_can_error(struct net_device *ndev) + can_bus_off(ndev); + if (skb) + cf->can_id |= CAN_ERR_BUSOFF; ++ } else if (skb) { ++ cf->data[6] = txerr; ++ cf->data[7] = rxerr; + } + if (eifr & RCAR_CAN_EIFR_ORIF) { + netdev_dbg(priv->ndev, "Receive overrun error interrupt\n"); +-- +2.35.1 + diff --git a/queue-5.10/can-sja1000-do-not-report-txerr-and-rxerr-during-bus.patch b/queue-5.10/can-sja1000-do-not-report-txerr-and-rxerr-during-bus.patch new file mode 100644 index 00000000000..35d083073f1 --- /dev/null +++ b/queue-5.10/can-sja1000-do-not-report-txerr-and-rxerr-during-bus.patch @@ -0,0 +1,49 @@ +From aa13a261918c38a34a118fe21dfb3e64172ab516 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 23:35:41 +0900 +Subject: can: sja1000: do not report txerr and rxerr during bus-off + +From: Vincent Mailhol + +[ Upstream commit 164d7cb2d5a30f1b3a5ab4fab1a27731fb1494a8 ] + +During bus off, the error count is greater than 255 and can not fit in +a u8. + +Fixes: 215db1856e83 ("can: sja1000: Consolidate and unify state change handling") +Link: https://lore.kernel.org/all/20220719143550.3681-4-mailhol.vincent@wanadoo.fr +Signed-off-by: Vincent Mailhol +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + drivers/net/can/sja1000/sja1000.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c +index 25a4d7d0b349..ee34baeb2afe 100644 +--- a/drivers/net/can/sja1000/sja1000.c ++++ b/drivers/net/can/sja1000/sja1000.c +@@ -405,9 +405,6 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) + txerr = priv->read_reg(priv, SJA1000_TXERR); + rxerr = priv->read_reg(priv, SJA1000_RXERR); + +- cf->data[6] = txerr; +- cf->data[7] = rxerr; +- + if (isrc & IRQ_DOI) { + /* data overrun interrupt */ + netdev_dbg(dev, "data overrun interrupt\n"); +@@ -429,6 +426,10 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) + else + state = CAN_STATE_ERROR_ACTIVE; + } ++ if (state != CAN_STATE_BUS_OFF) { ++ cf->data[6] = txerr; ++ cf->data[7] = rxerr; ++ } + if (isrc & IRQ_BEI) { + /* bus error interrupt */ + priv->can.can_stats.bus_error++; +-- +2.35.1 + diff --git a/queue-5.10/can-sun4i_can-do-not-report-txerr-and-rxerr-during-b.patch b/queue-5.10/can-sun4i_can-do-not-report-txerr-and-rxerr-during-b.patch new file mode 100644 index 00000000000..da19c67b4c0 --- /dev/null +++ b/queue-5.10/can-sun4i_can-do-not-report-txerr-and-rxerr-during-b.patch @@ -0,0 +1,52 @@ +From 00f921cc0eaf01fbf820d8bf3fb2adf5105f03b6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 23:35:44 +0900 +Subject: can: sun4i_can: do not report txerr and rxerr during bus-off + +From: Vincent Mailhol + +[ Upstream commit 0ac15a8f661b941519379831d09bfb12271b23ee ] + +During bus off, the error count is greater than 255 and can not fit in +a u8. + +Fixes: 0738eff14d81 ("can: Allwinner A10/A20 CAN Controller support - Kernel module") +Link: https://lore.kernel.org/all/20220719143550.3681-7-mailhol.vincent@wanadoo.fr +CC: Chen-Yu Tsai +Signed-off-by: Vincent Mailhol +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + drivers/net/can/sun4i_can.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/can/sun4i_can.c b/drivers/net/can/sun4i_can.c +index b3f2f4fe5ee0..39ddb3d849dd 100644 +--- a/drivers/net/can/sun4i_can.c ++++ b/drivers/net/can/sun4i_can.c +@@ -525,11 +525,6 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status) + rxerr = (errc >> 16) & 0xFF; + txerr = errc & 0xFF; + +- if (skb) { +- cf->data[6] = txerr; +- cf->data[7] = rxerr; +- } +- + if (isrc & SUN4I_INT_DATA_OR) { + /* data overrun interrupt */ + netdev_dbg(dev, "data overrun interrupt\n"); +@@ -560,6 +555,10 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status) + else + state = CAN_STATE_ERROR_ACTIVE; + } ++ if (skb && state != CAN_STATE_BUS_OFF) { ++ cf->data[6] = txerr; ++ cf->data[7] = rxerr; ++ } + if (isrc & SUN4I_INT_BUS_ERR) { + /* bus error interrupt */ + netdev_dbg(dev, "bus error interrupt\n"); +-- +2.35.1 + diff --git a/queue-5.10/can-usb_8dev-do-not-report-txerr-and-rxerr-during-bu.patch b/queue-5.10/can-usb_8dev-do-not-report-txerr-and-rxerr-during-bu.patch new file mode 100644 index 00000000000..8281dc130fe --- /dev/null +++ b/queue-5.10/can-usb_8dev-do-not-report-txerr-and-rxerr-during-bu.patch @@ -0,0 +1,42 @@ +From 5cc733ac9b74834d12a7d61edde9cbd09f8b728b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 23:35:47 +0900 +Subject: can: usb_8dev: do not report txerr and rxerr during bus-off + +From: Vincent Mailhol + +[ Upstream commit aebe8a2433cd090ccdc222861f44bddb75eb01de ] + +During bus off, the error count is greater than 255 and can not fit in +a u8. + +Fixes: 0024d8ad1639 ("can: usb_8dev: Add support for USB2CAN interface from 8 devices") +Link: https://lore.kernel.org/all/20220719143550.3681-10-mailhol.vincent@wanadoo.fr +Signed-off-by: Vincent Mailhol +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + drivers/net/can/usb/usb_8dev.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/can/usb/usb_8dev.c b/drivers/net/can/usb/usb_8dev.c +index 985e00aee4ee..885c54c6f81a 100644 +--- a/drivers/net/can/usb/usb_8dev.c ++++ b/drivers/net/can/usb/usb_8dev.c +@@ -442,9 +442,10 @@ static void usb_8dev_rx_err_msg(struct usb_8dev_priv *priv, + + if (rx_errors) + stats->rx_errors++; +- +- cf->data[6] = txerr; +- cf->data[7] = rxerr; ++ if (priv->can.state != CAN_STATE_BUS_OFF) { ++ cf->data[6] = txerr; ++ cf->data[7] = rxerr; ++ } + + priv->bec.txerr = txerr; + priv->bec.rxerr = rxerr; +-- +2.35.1 + diff --git a/queue-5.10/clk-mediatek-reset-fix-written-reset-bit-offset.patch b/queue-5.10/clk-mediatek-reset-fix-written-reset-bit-offset.patch new file mode 100644 index 00000000000..811f5a9d687 --- /dev/null +++ b/queue-5.10/clk-mediatek-reset-fix-written-reset-bit-offset.patch @@ -0,0 +1,56 @@ +From ea0c3213fc1ff8a35cb0a2d2d262511cb5101ea2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 23 May 2022 17:33:29 +0800 +Subject: clk: mediatek: reset: Fix written reset bit offset +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Rex-BC Chen + +[ Upstream commit edabcf71d100fd433a0fc2d0c97057c446c33b2a ] + +Original assert/deassert bit is BIT(0), but it's more resonable to modify +them to BIT(id % 32) which is based on id. + +This patch will not influence any previous driver because the reset is +only used for thermal. The id (MT8183_INFRACFG_AO_THERM_SW_RST) is 0. + +Fixes: 64ebb57a3df6 ("clk: reset: Modify reset-controller driver") +Signed-off-by: Rex-BC Chen +Reviewed-by: Chen-Yu Tsai +Reviewed-by: AngeloGioacchino Del Regno +Reviewed-by: Nícolas F. R. A. Prado +Tested-by: Nícolas F. R. A. Prado +Link: https://lore.kernel.org/r/20220523093346.28493-3-rex-bc.chen@mediatek.com +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + drivers/clk/mediatek/reset.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/clk/mediatek/reset.c b/drivers/clk/mediatek/reset.c +index cb939c071b0c..89916acf0bc3 100644 +--- a/drivers/clk/mediatek/reset.c ++++ b/drivers/clk/mediatek/reset.c +@@ -25,7 +25,7 @@ static int mtk_reset_assert_set_clr(struct reset_controller_dev *rcdev, + struct mtk_reset *data = container_of(rcdev, struct mtk_reset, rcdev); + unsigned int reg = data->regofs + ((id / 32) << 4); + +- return regmap_write(data->regmap, reg, 1); ++ return regmap_write(data->regmap, reg, BIT(id % 32)); + } + + static int mtk_reset_deassert_set_clr(struct reset_controller_dev *rcdev, +@@ -34,7 +34,7 @@ static int mtk_reset_deassert_set_clr(struct reset_controller_dev *rcdev, + struct mtk_reset *data = container_of(rcdev, struct mtk_reset, rcdev); + unsigned int reg = data->regofs + ((id / 32) << 4) + 0x4; + +- return regmap_write(data->regmap, reg, 1); ++ return regmap_write(data->regmap, reg, BIT(id % 32)); + } + + static int mtk_reset_assert(struct reset_controller_dev *rcdev, +-- +2.35.1 + diff --git a/queue-5.10/clk-qcom-camcc-sdm845-fix-topology-around-titan_top-.patch b/queue-5.10/clk-qcom-camcc-sdm845-fix-topology-around-titan_top-.patch new file mode 100644 index 00000000000..8534403d404 --- /dev/null +++ b/queue-5.10/clk-qcom-camcc-sdm845-fix-topology-around-titan_top-.patch @@ -0,0 +1,55 @@ +From ab85af06dfcb9fc69bd7dc17f0f554c926af2f78 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 May 2022 00:41:32 +0300 +Subject: clk: qcom: camcc-sdm845: Fix topology around titan_top power domain + +From: Vladimir Zapolskiy + +[ Upstream commit 103dd2338bbff567bce7acd00fc5a09c806b38ec ] + +On SDM845 two found VFE GDSC power domains shall not be operated, if +titan top is turned off, thus the former power domains will be set as +subdomains by a GDSC registration routine. + +Fixes: 78412c262004 ("clk: qcom: Add camera clock controller driver for SDM845") +Signed-off-by: Vladimir Zapolskiy +Reviewed-by: Robert Foss +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220519214133.1728979-2-vladimir.zapolskiy@linaro.org +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/camcc-sdm845.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/clk/qcom/camcc-sdm845.c b/drivers/clk/qcom/camcc-sdm845.c +index 1b2cefef7431..a8a2cfa83290 100644 +--- a/drivers/clk/qcom/camcc-sdm845.c ++++ b/drivers/clk/qcom/camcc-sdm845.c +@@ -1521,6 +1521,8 @@ static struct clk_branch cam_cc_sys_tmr_clk = { + }, + }; + ++static struct gdsc titan_top_gdsc; ++ + static struct gdsc bps_gdsc = { + .gdscr = 0x6004, + .pd = { +@@ -1554,6 +1556,7 @@ static struct gdsc ife_0_gdsc = { + .name = "ife_0_gdsc", + }, + .flags = POLL_CFG_GDSCR, ++ .parent = &titan_top_gdsc.pd, + .pwrsts = PWRSTS_OFF_ON, + }; + +@@ -1563,6 +1566,7 @@ static struct gdsc ife_1_gdsc = { + .name = "ife_1_gdsc", + }, + .flags = POLL_CFG_GDSCR, ++ .parent = &titan_top_gdsc.pd, + .pwrsts = PWRSTS_OFF_ON, + }; + +-- +2.35.1 + diff --git a/queue-5.10/clk-qcom-clk-krait-unlock-spin-after-mux-completion.patch b/queue-5.10/clk-qcom-clk-krait-unlock-spin-after-mux-completion.patch new file mode 100644 index 00000000000..6b0211eee30 --- /dev/null +++ b/queue-5.10/clk-qcom-clk-krait-unlock-spin-after-mux-completion.patch @@ -0,0 +1,47 @@ +From 5501141bbc10054fe6af4edb764cd0eba21bb068 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 30 Apr 2022 07:44:57 +0200 +Subject: clk: qcom: clk-krait: unlock spin after mux completion + +From: Ansuel Smith + +[ Upstream commit df83d2c9e72910416f650ade1e07cc314ff02731 ] + +Unlock spinlock after the mux switch is completed to prevent any corner +case of mux request while the switch still needs to be done. + +Fixes: 4d7dc77babfe ("clk: qcom: Add support for Krait clocks") +Signed-off-by: Ansuel Smith +Reviewed-by: Dmitry Baryshkov +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220430054458.31321-3-ansuelsmth@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/clk-krait.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/clk/qcom/clk-krait.c b/drivers/clk/qcom/clk-krait.c +index 59f1af415b58..90046428693c 100644 +--- a/drivers/clk/qcom/clk-krait.c ++++ b/drivers/clk/qcom/clk-krait.c +@@ -32,11 +32,16 @@ static void __krait_mux_set_sel(struct krait_mux_clk *mux, int sel) + regval |= (sel & mux->mask) << (mux->shift + LPL_SHIFT); + } + krait_set_l2_indirect_reg(mux->offset, regval); +- spin_unlock_irqrestore(&krait_clock_reg_lock, flags); + + /* Wait for switch to complete. */ + mb(); + udelay(1); ++ ++ /* ++ * Unlock now to make sure the mux register is not ++ * modified while switching to the new parent. ++ */ ++ spin_unlock_irqrestore(&krait_clock_reg_lock, flags); + } + + static int krait_mux_set_parent(struct clk_hw *hw, u8 index) +-- +2.35.1 + diff --git a/queue-5.10/clk-qcom-gcc-msm8939-add-missing-system_mm_noc_bfdcd.patch b/queue-5.10/clk-qcom-gcc-msm8939-add-missing-system_mm_noc_bfdcd.patch new file mode 100644 index 00000000000..03aa34b34a9 --- /dev/null +++ b/queue-5.10/clk-qcom-gcc-msm8939-add-missing-system_mm_noc_bfdcd.patch @@ -0,0 +1,42 @@ +From 65cf2355e440f7257fd0ffbb8e7b054eedaf348e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 4 May 2022 17:38:32 +0100 +Subject: clk: qcom: gcc-msm8939: Add missing SYSTEM_MM_NOC_BFDCD_CLK_SRC + +From: Bryan O'Donoghue + +[ Upstream commit 07e7fcf1714c5f9930ad27613fea940aedba68da ] + +When adding in the indexes for this clock-controller we missed +SYSTEM_MM_NOC_BFDCD_CLK_SRC. + +Add it in now. + +Fixes: 4c71d6abc4fc ("clk: qcom: Add DT bindings for MSM8939 GCC") +Cc: Rob Herring +Cc: Krzysztof Kozlowski +Cc: devicetree@vger.kernel.org +Signed-off-by: Bryan O'Donoghue +Acked-by: Krzysztof Kozlowski +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220504163835.40130-2-bryan.odonoghue@linaro.org +Signed-off-by: Sasha Levin +--- + include/dt-bindings/clock/qcom,gcc-msm8939.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/include/dt-bindings/clock/qcom,gcc-msm8939.h b/include/dt-bindings/clock/qcom,gcc-msm8939.h +index 0634467c4ce5..2d545ed0d35a 100644 +--- a/include/dt-bindings/clock/qcom,gcc-msm8939.h ++++ b/include/dt-bindings/clock/qcom,gcc-msm8939.h +@@ -192,6 +192,7 @@ + #define GCC_VENUS0_CORE0_VCODEC0_CLK 183 + #define GCC_VENUS0_CORE1_VCODEC0_CLK 184 + #define GCC_OXILI_TIMER_CLK 185 ++#define SYSTEM_MM_NOC_BFDCD_CLK_SRC 186 + + /* Indexes for GDSCs */ + #define BIMC_GDSC 0 +-- +2.35.1 + diff --git a/queue-5.10/clk-qcom-gcc-msm8939-add-missing-system_mm_noc_bfdcd.patch-4005 b/queue-5.10/clk-qcom-gcc-msm8939-add-missing-system_mm_noc_bfdcd.patch-4005 new file mode 100644 index 00000000000..466740b3f03 --- /dev/null +++ b/queue-5.10/clk-qcom-gcc-msm8939-add-missing-system_mm_noc_bfdcd.patch-4005 @@ -0,0 +1,61 @@ +From 4be4cb7df713f26247be0136c20287eb52f8a2ee Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 4 May 2022 17:38:34 +0100 +Subject: clk: qcom: gcc-msm8939: Add missing system_mm_noc_bfdcd_clk_src + +From: Bryan O'Donoghue + +[ Upstream commit dd363e2f7196278e7a30f509a0e8a841cb763b14 ] + +The msm8939 has an additional higher operating point for the multi-media +peripherals. The higher throughput MM componets operate off of the +system-mm noc not the system noc. + +system_mm_noc_bfdcd_clk_src is the source clock for the higher frequency +capable system noc mm. + +Maximum frequency for the MM SNOC is 400 MHz. + +Fixes: 1664014e4679 ("clk: qcom: gcc-msm8939: Add MSM8939 Generic Clock Controller") +Signed-off-by: Bryan O'Donoghue +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220504163835.40130-4-bryan.odonoghue@linaro.org +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gcc-msm8939.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/drivers/clk/qcom/gcc-msm8939.c b/drivers/clk/qcom/gcc-msm8939.c +index 31568658d23d..12bab9067ea8 100644 +--- a/drivers/clk/qcom/gcc-msm8939.c ++++ b/drivers/clk/qcom/gcc-msm8939.c +@@ -644,6 +644,18 @@ static struct clk_rcg2 bimc_ddr_clk_src = { + }, + }; + ++static struct clk_rcg2 system_mm_noc_bfdcd_clk_src = { ++ .cmd_rcgr = 0x2600c, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll6a_map, ++ .clkr.hw.init = &(struct clk_init_data){ ++ .name = "system_mm_noc_bfdcd_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll6a_parent_data, ++ .num_parents = 3, ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ + static const struct freq_tbl ftbl_gcc_camss_ahb_clk[] = { + F(40000000, P_GPLL0, 10, 1, 2), + F(80000000, P_GPLL0, 10, 0, 0), +@@ -3623,6 +3635,7 @@ static struct clk_regmap *gcc_msm8939_clocks[] = { + [GPLL2_VOTE] = &gpll2_vote, + [PCNOC_BFDCD_CLK_SRC] = &pcnoc_bfdcd_clk_src.clkr, + [SYSTEM_NOC_BFDCD_CLK_SRC] = &system_noc_bfdcd_clk_src.clkr, ++ [SYSTEM_MM_NOC_BFDCD_CLK_SRC] = &system_mm_noc_bfdcd_clk_src.clkr, + [CAMSS_AHB_CLK_SRC] = &camss_ahb_clk_src.clkr, + [APSS_AHB_CLK_SRC] = &apss_ahb_clk_src.clkr, + [CSI0_CLK_SRC] = &csi0_clk_src.clkr, +-- +2.35.1 + diff --git a/queue-5.10/clk-qcom-gcc-msm8939-fix-bimc_ddr_clk_src-rcgr-base-.patch b/queue-5.10/clk-qcom-gcc-msm8939-fix-bimc_ddr_clk_src-rcgr-base-.patch new file mode 100644 index 00000000000..b86c3257996 --- /dev/null +++ b/queue-5.10/clk-qcom-gcc-msm8939-fix-bimc_ddr_clk_src-rcgr-base-.patch @@ -0,0 +1,37 @@ +From 52dcd10dcd4eb5864d3e950092dafc5b44023f24 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 4 May 2022 17:38:33 +0100 +Subject: clk: qcom: gcc-msm8939: Fix bimc_ddr_clk_src rcgr base address + +From: Bryan O'Donoghue + +[ Upstream commit 63d42708320d6d2ca9ed505123d50ff4a542c36f ] + +Reviewing qcom docs for the 8939 we can see the command rcgr is pointing to +the wrong address. bimc_ddr_clk_src_rcgr is @ 0x01832024 not 0x01832004. + +Fixes: 1664014e4679 ("clk: qcom: gcc-msm8939: Add MSM8939 Generic Clock Controller") +Signed-off-by: Bryan O'Donoghue +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220504163835.40130-3-bryan.odonoghue@linaro.org +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gcc-msm8939.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/clk/qcom/gcc-msm8939.c b/drivers/clk/qcom/gcc-msm8939.c +index 39ebb443ae3d..31568658d23d 100644 +--- a/drivers/clk/qcom/gcc-msm8939.c ++++ b/drivers/clk/qcom/gcc-msm8939.c +@@ -632,7 +632,7 @@ static struct clk_rcg2 system_noc_bfdcd_clk_src = { + }; + + static struct clk_rcg2 bimc_ddr_clk_src = { +- .cmd_rcgr = 0x32004, ++ .cmd_rcgr = 0x32024, + .hid_width = 5, + .parent_map = gcc_xo_gpll0_bimc_map, + .clkr.hw.init = &(struct clk_init_data){ +-- +2.35.1 + diff --git a/queue-5.10/clk-qcom-gcc-msm8939-fix-weird-field-spacing-in-ftbl.patch b/queue-5.10/clk-qcom-gcc-msm8939-fix-weird-field-spacing-in-ftbl.patch new file mode 100644 index 00000000000..d875e95aafd --- /dev/null +++ b/queue-5.10/clk-qcom-gcc-msm8939-fix-weird-field-spacing-in-ftbl.patch @@ -0,0 +1,39 @@ +From 8977a56562943cea2d507d14206b6d9654c3e3e0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Jul 2022 13:59:17 +0100 +Subject: clk: qcom: gcc-msm8939: Fix weird field spacing in + ftbl_gcc_camss_cci_clk + +From: Bryan O'Donoghue + +[ Upstream commit 2bc308ebc453ba22f3f120f777b9ac48f973ee80 ] + +Adding a new item to this frequency table I see the existing indentation is +incorrect. + +Fixes: 1664014e4679 ("clk: qcom: gcc-msm8939: Add MSM8939 Generic Clock Controller") +Signed-off-by: Bryan O'Donoghue +Reviewed-by: Konrad Dybcio +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220712125922.3461675-2-bryan.odonoghue@linaro.org +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gcc-msm8939.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/clk/qcom/gcc-msm8939.c b/drivers/clk/qcom/gcc-msm8939.c +index c7377ec0f423..de0022e5450d 100644 +--- a/drivers/clk/qcom/gcc-msm8939.c ++++ b/drivers/clk/qcom/gcc-msm8939.c +@@ -1014,7 +1014,7 @@ static struct clk_rcg2 blsp1_uart2_apps_clk_src = { + }; + + static const struct freq_tbl ftbl_gcc_camss_cci_clk[] = { +- F(19200000, P_XO, 1, 0, 0), ++ F(19200000, P_XO, 1, 0, 0), + { } + }; + +-- +2.35.1 + diff --git a/queue-5.10/clk-qcom-gcc-msm8939-point-mm-peripherals-to-system_.patch b/queue-5.10/clk-qcom-gcc-msm8939-point-mm-peripherals-to-system_.patch new file mode 100644 index 00000000000..144c4ee85ba --- /dev/null +++ b/queue-5.10/clk-qcom-gcc-msm8939-point-mm-peripherals-to-system_.patch @@ -0,0 +1,107 @@ +From d90f43abbc04e6c7ebf565c3d50fde422e260e5f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 4 May 2022 17:38:35 +0100 +Subject: clk: qcom: gcc-msm8939: Point MM peripherals to system_mm_noc clock + +From: Bryan O'Donoghue + +[ Upstream commit 05eed0990927aa9634682fec58660e30f7b7ae30 ] + +Qcom docs indciate the following peripherals operating from System NOC +MM not from System NOC clocks. + +- MDP +- VFE +- JPEGe +- Venus + +Switch over the relevant parent pointers. + +Fixes: 1664014e4679 ("clk: qcom: gcc-msm8939: Add MSM8939 Generic Clock Controller") +Signed-off-by: Bryan O'Donoghue +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220504163835.40130-5-bryan.odonoghue@linaro.org +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gcc-msm8939.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/drivers/clk/qcom/gcc-msm8939.c b/drivers/clk/qcom/gcc-msm8939.c +index 12bab9067ea8..c7377ec0f423 100644 +--- a/drivers/clk/qcom/gcc-msm8939.c ++++ b/drivers/clk/qcom/gcc-msm8939.c +@@ -2453,7 +2453,7 @@ static struct clk_branch gcc_camss_jpeg_axi_clk = { + .hw.init = &(struct clk_init_data){ + .name = "gcc_camss_jpeg_axi_clk", + .parent_data = &(const struct clk_parent_data){ +- .hw = &system_noc_bfdcd_clk_src.clkr.hw, ++ .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw, + }, + .num_parents = 1, + .flags = CLK_SET_RATE_PARENT, +@@ -2657,7 +2657,7 @@ static struct clk_branch gcc_camss_vfe_axi_clk = { + .hw.init = &(struct clk_init_data){ + .name = "gcc_camss_vfe_axi_clk", + .parent_data = &(const struct clk_parent_data){ +- .hw = &system_noc_bfdcd_clk_src.clkr.hw, ++ .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw, + }, + .num_parents = 1, + .flags = CLK_SET_RATE_PARENT, +@@ -2813,7 +2813,7 @@ static struct clk_branch gcc_mdss_axi_clk = { + .hw.init = &(struct clk_init_data){ + .name = "gcc_mdss_axi_clk", + .parent_data = &(const struct clk_parent_data){ +- .hw = &system_noc_bfdcd_clk_src.clkr.hw, ++ .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw, + }, + .num_parents = 1, + .flags = CLK_SET_RATE_PARENT, +@@ -3205,7 +3205,7 @@ static struct clk_branch gcc_mdp_tbu_clk = { + .hw.init = &(struct clk_init_data){ + .name = "gcc_mdp_tbu_clk", + .parent_data = &(const struct clk_parent_data){ +- .hw = &system_noc_bfdcd_clk_src.clkr.hw, ++ .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw, + }, + .num_parents = 1, + .flags = CLK_SET_RATE_PARENT, +@@ -3223,7 +3223,7 @@ static struct clk_branch gcc_venus_tbu_clk = { + .hw.init = &(struct clk_init_data){ + .name = "gcc_venus_tbu_clk", + .parent_data = &(const struct clk_parent_data){ +- .hw = &system_noc_bfdcd_clk_src.clkr.hw, ++ .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw, + }, + .num_parents = 1, + .flags = CLK_SET_RATE_PARENT, +@@ -3241,7 +3241,7 @@ static struct clk_branch gcc_vfe_tbu_clk = { + .hw.init = &(struct clk_init_data){ + .name = "gcc_vfe_tbu_clk", + .parent_data = &(const struct clk_parent_data){ +- .hw = &system_noc_bfdcd_clk_src.clkr.hw, ++ .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw, + }, + .num_parents = 1, + .flags = CLK_SET_RATE_PARENT, +@@ -3259,7 +3259,7 @@ static struct clk_branch gcc_jpeg_tbu_clk = { + .hw.init = &(struct clk_init_data){ + .name = "gcc_jpeg_tbu_clk", + .parent_data = &(const struct clk_parent_data){ +- .hw = &system_noc_bfdcd_clk_src.clkr.hw, ++ .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw, + }, + .num_parents = 1, + .flags = CLK_SET_RATE_PARENT, +@@ -3496,7 +3496,7 @@ static struct clk_branch gcc_venus0_axi_clk = { + .hw.init = &(struct clk_init_data){ + .name = "gcc_venus0_axi_clk", + .parent_data = &(const struct clk_parent_data){ +- .hw = &system_noc_bfdcd_clk_src.clkr.hw, ++ .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw, + }, + .num_parents = 1, + .flags = CLK_SET_RATE_PARENT, +-- +2.35.1 + diff --git a/queue-5.10/clk-qcom-ipq8074-fix-nss-core-pll-s.patch b/queue-5.10/clk-qcom-ipq8074-fix-nss-core-pll-s.patch new file mode 100644 index 00000000000..129c2227f4f --- /dev/null +++ b/queue-5.10/clk-qcom-ipq8074-fix-nss-core-pll-s.patch @@ -0,0 +1,92 @@ +From 88622bd4acdca057b7dc315696afc2364676a02a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 15 May 2022 23:00:38 +0200 +Subject: clk: qcom: ipq8074: fix NSS core PLL-s +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Robert Marko + +[ Upstream commit ca41ec1b30434636c56c5600b24a8d964d359d9c ] + +Like in IPQ6018 the NSS related Alpha PLL-s require initial configuration +to work. + +So, obtain the regmap that is required for the Alpha PLL configuration +and thus utilize the qcom_cc_really_probe() as we already have the regmap. +Then utilize the Alpha PLL configs from the downstream QCA 5.4 based +kernel to configure them. + +This fixes the UBI32 and NSS crypto PLL-s failing to get enabled by the +kernel. + +Fixes: b8e7e519625f ("clk: qcom: ipq8074: add remaining PLL’s") +Signed-off-by: Robert Marko +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220515210048.483898-1-robimarko@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gcc-ipq8074.c | 39 +++++++++++++++++++++++++++++++++- + 1 file changed, 38 insertions(+), 1 deletion(-) + +diff --git a/drivers/clk/qcom/gcc-ipq8074.c b/drivers/clk/qcom/gcc-ipq8074.c +index 541016db3c4b..1a5141da7e23 100644 +--- a/drivers/clk/qcom/gcc-ipq8074.c ++++ b/drivers/clk/qcom/gcc-ipq8074.c +@@ -4371,6 +4371,33 @@ static struct clk_branch gcc_pcie0_axi_s_bridge_clk = { + }, + }; + ++static const struct alpha_pll_config ubi32_pll_config = { ++ .l = 0x4e, ++ .config_ctl_val = 0x200d4aa8, ++ .config_ctl_hi_val = 0x3c2, ++ .main_output_mask = BIT(0), ++ .aux_output_mask = BIT(1), ++ .pre_div_val = 0x0, ++ .pre_div_mask = BIT(12), ++ .post_div_val = 0x0, ++ .post_div_mask = GENMASK(9, 8), ++}; ++ ++static const struct alpha_pll_config nss_crypto_pll_config = { ++ .l = 0x3e, ++ .alpha = 0x0, ++ .alpha_hi = 0x80, ++ .config_ctl_val = 0x4001055b, ++ .main_output_mask = BIT(0), ++ .pre_div_val = 0x0, ++ .pre_div_mask = GENMASK(14, 12), ++ .post_div_val = 0x1 << 8, ++ .post_div_mask = GENMASK(11, 8), ++ .vco_mask = GENMASK(21, 20), ++ .vco_val = 0x0, ++ .alpha_en_mask = BIT(24), ++}; ++ + static struct clk_hw *gcc_ipq8074_hws[] = { + &gpll0_out_main_div2.hw, + &gpll6_out_main_div2.hw, +@@ -4772,7 +4799,17 @@ static const struct qcom_cc_desc gcc_ipq8074_desc = { + + static int gcc_ipq8074_probe(struct platform_device *pdev) + { +- return qcom_cc_probe(pdev, &gcc_ipq8074_desc); ++ struct regmap *regmap; ++ ++ regmap = qcom_cc_map(pdev, &gcc_ipq8074_desc); ++ if (IS_ERR(regmap)) ++ return PTR_ERR(regmap); ++ ++ clk_alpha_pll_configure(&ubi32_pll_main, regmap, &ubi32_pll_config); ++ clk_alpha_pll_configure(&nss_crypto_pll_main, regmap, ++ &nss_crypto_pll_config); ++ ++ return qcom_cc_really_probe(pdev, &gcc_ipq8074_desc, regmap); + } + + static struct platform_driver gcc_ipq8074_driver = { +-- +2.35.1 + diff --git a/queue-5.10/clk-qcom-ipq8074-fix-nss-port-frequency-tables.patch b/queue-5.10/clk-qcom-ipq8074-fix-nss-port-frequency-tables.patch new file mode 100644 index 00000000000..4983b2cee1b --- /dev/null +++ b/queue-5.10/clk-qcom-ipq8074-fix-nss-port-frequency-tables.patch @@ -0,0 +1,76 @@ +From 6281e930ba355ec7cb6b3fa95a0d23bb1564ec91 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 15 May 2022 23:00:40 +0200 +Subject: clk: qcom: ipq8074: fix NSS port frequency tables + +From: Robert Marko + +[ Upstream commit 0e9e61a2815b5cd34f1b495b2d72e8127ce9b794 ] + +NSS port 5 and 6 frequency tables are currently broken and are causing a +wide ranges of issue like 1G not working at all on port 6 or port 5 being +clocked with 312 instead of 125 MHz as UNIPHY1 gets selected. + +So, update the frequency tables with the ones from the downstream QCA 5.4 +based kernel which has already fixed this. + +Fixes: 7117a51ed303 ("clk: qcom: ipq8074: add NSS ethernet port clocks") +Signed-off-by: Robert Marko +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220515210048.483898-3-robimarko@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gcc-ipq8074.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/clk/qcom/gcc-ipq8074.c b/drivers/clk/qcom/gcc-ipq8074.c +index b4291ba53c78..f1017f2e61bd 100644 +--- a/drivers/clk/qcom/gcc-ipq8074.c ++++ b/drivers/clk/qcom/gcc-ipq8074.c +@@ -1788,8 +1788,10 @@ static struct clk_regmap_div nss_port4_tx_div_clk_src = { + static const struct freq_tbl ftbl_nss_port5_rx_clk_src[] = { + F(19200000, P_XO, 1, 0, 0), + F(25000000, P_UNIPHY1_RX, 12.5, 0, 0), ++ F(25000000, P_UNIPHY0_RX, 5, 0, 0), + F(78125000, P_UNIPHY1_RX, 4, 0, 0), + F(125000000, P_UNIPHY1_RX, 2.5, 0, 0), ++ F(125000000, P_UNIPHY0_RX, 1, 0, 0), + F(156250000, P_UNIPHY1_RX, 2, 0, 0), + F(312500000, P_UNIPHY1_RX, 1, 0, 0), + { } +@@ -1828,8 +1830,10 @@ static struct clk_regmap_div nss_port5_rx_div_clk_src = { + static const struct freq_tbl ftbl_nss_port5_tx_clk_src[] = { + F(19200000, P_XO, 1, 0, 0), + F(25000000, P_UNIPHY1_TX, 12.5, 0, 0), ++ F(25000000, P_UNIPHY0_TX, 5, 0, 0), + F(78125000, P_UNIPHY1_TX, 4, 0, 0), + F(125000000, P_UNIPHY1_TX, 2.5, 0, 0), ++ F(125000000, P_UNIPHY0_TX, 1, 0, 0), + F(156250000, P_UNIPHY1_TX, 2, 0, 0), + F(312500000, P_UNIPHY1_TX, 1, 0, 0), + { } +@@ -1867,8 +1871,10 @@ static struct clk_regmap_div nss_port5_tx_div_clk_src = { + + static const struct freq_tbl ftbl_nss_port6_rx_clk_src[] = { + F(19200000, P_XO, 1, 0, 0), ++ F(25000000, P_UNIPHY2_RX, 5, 0, 0), + F(25000000, P_UNIPHY2_RX, 12.5, 0, 0), + F(78125000, P_UNIPHY2_RX, 4, 0, 0), ++ F(125000000, P_UNIPHY2_RX, 1, 0, 0), + F(125000000, P_UNIPHY2_RX, 2.5, 0, 0), + F(156250000, P_UNIPHY2_RX, 2, 0, 0), + F(312500000, P_UNIPHY2_RX, 1, 0, 0), +@@ -1907,8 +1913,10 @@ static struct clk_regmap_div nss_port6_rx_div_clk_src = { + + static const struct freq_tbl ftbl_nss_port6_tx_clk_src[] = { + F(19200000, P_XO, 1, 0, 0), ++ F(25000000, P_UNIPHY2_TX, 5, 0, 0), + F(25000000, P_UNIPHY2_TX, 12.5, 0, 0), + F(78125000, P_UNIPHY2_TX, 4, 0, 0), ++ F(125000000, P_UNIPHY2_TX, 1, 0, 0), + F(125000000, P_UNIPHY2_TX, 2.5, 0, 0), + F(156250000, P_UNIPHY2_TX, 2, 0, 0), + F(312500000, P_UNIPHY2_TX, 1, 0, 0), +-- +2.35.1 + diff --git a/queue-5.10/clk-qcom-ipq8074-set-branch_halt_delay-flag-for-ubi-.patch b/queue-5.10/clk-qcom-ipq8074-set-branch_halt_delay-flag-for-ubi-.patch new file mode 100644 index 00000000000..21df4d6d3fb --- /dev/null +++ b/queue-5.10/clk-qcom-ipq8074-set-branch_halt_delay-flag-for-ubi-.patch @@ -0,0 +1,113 @@ +From 3e69935479b096bcaa66e79fbb9615df49de4431 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 15 May 2022 23:00:43 +0200 +Subject: clk: qcom: ipq8074: set BRANCH_HALT_DELAY flag for UBI clocks + +From: Robert Marko + +[ Upstream commit 2bd357e698207e2e65db03007e4be65bf9d6a7b3 ] + +Currently, attempting to enable the UBI clocks will cause the stuck at +off warning to be printed and clk_enable will fail. + +[ 14.936694] gcc_ubi1_ahb_clk status stuck at 'off' + +Downstream 5.4 QCA kernel has fixed this by seting the BRANCH_HALT_DELAY +flag on UBI clocks, so lets do the same. + +Fixes: 5736294aef83 ("clk: qcom: ipq8074: add NSS clocks") +Signed-off-by: Robert Marko +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220515210048.483898-6-robimarko@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gcc-ipq8074.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/drivers/clk/qcom/gcc-ipq8074.c b/drivers/clk/qcom/gcc-ipq8074.c +index f1017f2e61bd..2c2ecfc5e61f 100644 +--- a/drivers/clk/qcom/gcc-ipq8074.c ++++ b/drivers/clk/qcom/gcc-ipq8074.c +@@ -3354,6 +3354,7 @@ static struct clk_branch gcc_nssnoc_ubi1_ahb_clk = { + + static struct clk_branch gcc_ubi0_ahb_clk = { + .halt_reg = 0x6820c, ++ .halt_check = BRANCH_HALT_DELAY, + .clkr = { + .enable_reg = 0x6820c, + .enable_mask = BIT(0), +@@ -3371,6 +3372,7 @@ static struct clk_branch gcc_ubi0_ahb_clk = { + + static struct clk_branch gcc_ubi0_axi_clk = { + .halt_reg = 0x68200, ++ .halt_check = BRANCH_HALT_DELAY, + .clkr = { + .enable_reg = 0x68200, + .enable_mask = BIT(0), +@@ -3388,6 +3390,7 @@ static struct clk_branch gcc_ubi0_axi_clk = { + + static struct clk_branch gcc_ubi0_nc_axi_clk = { + .halt_reg = 0x68204, ++ .halt_check = BRANCH_HALT_DELAY, + .clkr = { + .enable_reg = 0x68204, + .enable_mask = BIT(0), +@@ -3405,6 +3408,7 @@ static struct clk_branch gcc_ubi0_nc_axi_clk = { + + static struct clk_branch gcc_ubi0_core_clk = { + .halt_reg = 0x68210, ++ .halt_check = BRANCH_HALT_DELAY, + .clkr = { + .enable_reg = 0x68210, + .enable_mask = BIT(0), +@@ -3422,6 +3426,7 @@ static struct clk_branch gcc_ubi0_core_clk = { + + static struct clk_branch gcc_ubi0_mpt_clk = { + .halt_reg = 0x68208, ++ .halt_check = BRANCH_HALT_DELAY, + .clkr = { + .enable_reg = 0x68208, + .enable_mask = BIT(0), +@@ -3439,6 +3444,7 @@ static struct clk_branch gcc_ubi0_mpt_clk = { + + static struct clk_branch gcc_ubi1_ahb_clk = { + .halt_reg = 0x6822c, ++ .halt_check = BRANCH_HALT_DELAY, + .clkr = { + .enable_reg = 0x6822c, + .enable_mask = BIT(0), +@@ -3456,6 +3462,7 @@ static struct clk_branch gcc_ubi1_ahb_clk = { + + static struct clk_branch gcc_ubi1_axi_clk = { + .halt_reg = 0x68220, ++ .halt_check = BRANCH_HALT_DELAY, + .clkr = { + .enable_reg = 0x68220, + .enable_mask = BIT(0), +@@ -3473,6 +3480,7 @@ static struct clk_branch gcc_ubi1_axi_clk = { + + static struct clk_branch gcc_ubi1_nc_axi_clk = { + .halt_reg = 0x68224, ++ .halt_check = BRANCH_HALT_DELAY, + .clkr = { + .enable_reg = 0x68224, + .enable_mask = BIT(0), +@@ -3490,6 +3498,7 @@ static struct clk_branch gcc_ubi1_nc_axi_clk = { + + static struct clk_branch gcc_ubi1_core_clk = { + .halt_reg = 0x68230, ++ .halt_check = BRANCH_HALT_DELAY, + .clkr = { + .enable_reg = 0x68230, + .enable_mask = BIT(0), +@@ -3507,6 +3516,7 @@ static struct clk_branch gcc_ubi1_core_clk = { + + static struct clk_branch gcc_ubi1_mpt_clk = { + .halt_reg = 0x68228, ++ .halt_check = BRANCH_HALT_DELAY, + .clkr = { + .enable_reg = 0x68228, + .enable_mask = BIT(0), +-- +2.35.1 + diff --git a/queue-5.10/clk-qcom-ipq8074-sw-workaround-for-ubi32-pll-lock.patch b/queue-5.10/clk-qcom-ipq8074-sw-workaround-for-ubi32-pll-lock.patch new file mode 100644 index 00000000000..ad6c36166b9 --- /dev/null +++ b/queue-5.10/clk-qcom-ipq8074-sw-workaround-for-ubi32-pll-lock.patch @@ -0,0 +1,47 @@ +From 419e12cab1931feefeedad4906852862bad1e6bd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 15 May 2022 23:00:39 +0200 +Subject: clk: qcom: ipq8074: SW workaround for UBI32 PLL lock +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Robert Marko + +[ Upstream commit 3401ea2856ef84f39b75f0dc5ebcaeda81cb90ec ] + +UBI32 Huayra PLL fails to lock in 5 us in some SoC silicon and thus it +will cause the wait_for_pll() to timeout and thus return the error +indicating that the PLL failed to lock. + +This is bug in Huayra PLL HW for which SW workaround +is to set bit 26 of TEST_CTL register. + +This is ported from the QCA 5.4 based downstream kernel. + +Fixes: b8e7e519625f ("clk: qcom: ipq8074: add remaining PLL’s") +Signed-off-by: Robert Marko +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220515210048.483898-2-robimarko@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gcc-ipq8074.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/clk/qcom/gcc-ipq8074.c b/drivers/clk/qcom/gcc-ipq8074.c +index 1a5141da7e23..b4291ba53c78 100644 +--- a/drivers/clk/qcom/gcc-ipq8074.c ++++ b/drivers/clk/qcom/gcc-ipq8074.c +@@ -4805,6 +4805,9 @@ static int gcc_ipq8074_probe(struct platform_device *pdev) + if (IS_ERR(regmap)) + return PTR_ERR(regmap); + ++ /* SW Workaround for UBI32 Huayra PLL */ ++ regmap_update_bits(regmap, 0x2501c, BIT(26), BIT(26)); ++ + clk_alpha_pll_configure(&ubi32_pll_main, regmap, &ubi32_pll_config); + clk_alpha_pll_configure(&nss_crypto_pll_main, regmap, + &nss_crypto_pll_config); +-- +2.35.1 + diff --git a/queue-5.10/clk-renesas-r9a06g032-fix-uart-clkgrp-bitsel.patch b/queue-5.10/clk-renesas-r9a06g032-fix-uart-clkgrp-bitsel.patch new file mode 100644 index 00000000000..4448838566f --- /dev/null +++ b/queue-5.10/clk-renesas-r9a06g032-fix-uart-clkgrp-bitsel.patch @@ -0,0 +1,54 @@ +From 88cce4965a2876aaa81bb8d3de8853535bff14c3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 18 May 2022 14:25:27 -0400 +Subject: clk: renesas: r9a06g032: Fix UART clkgrp bitsel + +From: Ralph Siemsen + +[ Upstream commit 2dee50ab9e72a3cae75b65e5934c8dd3e9bf01bc ] + +There are two UART clock groups, each having a mux to select its +upstream clock source. The register/bit definitions for accessing these +two muxes appear to have been reversed since introduction. Correct them +so as to match the hardware manual. + +Fixes: 4c3d88526eba ("clk: renesas: Renesas R9A06G032 clock driver") + +Signed-off-by: Ralph Siemsen +Reviewed-by: Phil Edworthy +Link: https://lore.kernel.org/r/20220518182527.1693156-1-ralph.siemsen@linaro.org +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Sasha Levin +--- + drivers/clk/renesas/r9a06g032-clocks.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/clk/renesas/r9a06g032-clocks.c b/drivers/clk/renesas/r9a06g032-clocks.c +index 892e91b92f2c..245150a5484a 100644 +--- a/drivers/clk/renesas/r9a06g032-clocks.c ++++ b/drivers/clk/renesas/r9a06g032-clocks.c +@@ -286,8 +286,8 @@ static const struct r9a06g032_clkdesc r9a06g032_clocks[] = { + .name = "uart_group_012", + .type = K_BITSEL, + .source = 1 + R9A06G032_DIV_UART, +- /* R9A06G032_SYSCTRL_REG_PWRCTRL_PG1_PR2 */ +- .dual.sel = ((0xec / 4) << 5) | 24, ++ /* R9A06G032_SYSCTRL_REG_PWRCTRL_PG0_0 */ ++ .dual.sel = ((0x34 / 4) << 5) | 30, + .dual.group = 0, + }, + { +@@ -295,8 +295,8 @@ static const struct r9a06g032_clkdesc r9a06g032_clocks[] = { + .name = "uart_group_34567", + .type = K_BITSEL, + .source = 1 + R9A06G032_DIV_P2_PG, +- /* R9A06G032_SYSCTRL_REG_PWRCTRL_PG0_0 */ +- .dual.sel = ((0x34 / 4) << 5) | 30, ++ /* R9A06G032_SYSCTRL_REG_PWRCTRL_PG1_PR2 */ ++ .dual.sel = ((0xec / 4) << 5) | 24, + .dual.group = 1, + }, + D_UGATE(CLK_UART0, "clk_uart0", UART_GROUP_012, 0, 0, 0x1b2, 0x1b3, 0x1b4, 0x1b5), +-- +2.35.1 + diff --git a/queue-5.10/cpufreq-zynq-fix-refcount-leak-in-zynq_get_revision.patch b/queue-5.10/cpufreq-zynq-fix-refcount-leak-in-zynq_get_revision.patch new file mode 100644 index 00000000000..1f4cf30df07 --- /dev/null +++ b/queue-5.10/cpufreq-zynq-fix-refcount-leak-in-zynq_get_revision.patch @@ -0,0 +1,37 @@ +From 2599052951a76117574dc2eebb2b20010c7271af Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 5 Jun 2022 12:28:07 +0400 +Subject: cpufreq: zynq: Fix refcount leak in zynq_get_revision + +From: Miaoqian Lin + +[ Upstream commit d1ff2559cef0f6f8d97fba6337b28adb10689e16 ] + +of_find_compatible_node() returns a node pointer with refcount +incremented, we should use of_node_put() on it when done. +Add missing of_node_put() to avoid refcount leak. + +Fixes: 00f7dc636366 ("ARM: zynq: Add support for SOC_BUS") +Signed-off-by: Miaoqian Lin +Link: https://lore.kernel.org/r/20220605082807.21526-1-linmq006@gmail.com +Signed-off-by: Michal Simek +Signed-off-by: Sasha Levin +--- + arch/arm/mach-zynq/common.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm/mach-zynq/common.c b/arch/arm/mach-zynq/common.c +index e1ca6a5732d2..15e8a321a713 100644 +--- a/arch/arm/mach-zynq/common.c ++++ b/arch/arm/mach-zynq/common.c +@@ -77,6 +77,7 @@ static int __init zynq_get_revision(void) + } + + zynq_devcfg_base = of_iomap(np, 0); ++ of_node_put(np); + if (!zynq_devcfg_base) { + pr_err("%s: Unable to map I/O memory\n", __func__); + return -1; +-- +2.35.1 + diff --git a/queue-5.10/crypto-arm64-gcm-select-aead-for-ghash_arm64_ce.patch b/queue-5.10/crypto-arm64-gcm-select-aead-for-ghash_arm64_ce.patch new file mode 100644 index 00000000000..d6dbdc6341e --- /dev/null +++ b/queue-5.10/crypto-arm64-gcm-select-aead-for-ghash_arm64_ce.patch @@ -0,0 +1,39 @@ +From 78275c50807b83e58fa5553565a801e66a114441 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Jun 2022 07:13:38 -0400 +Subject: crypto: arm64/gcm - Select AEAD for GHASH_ARM64_CE + +From: Qian Cai + +[ Upstream commit fac76f2260893dde5aa05bb693b4c13e8ed0454b ] + +Otherwise, we could fail to compile. + +ld: arch/arm64/crypto/ghash-ce-glue.o: in function 'ghash_ce_mod_exit': +ghash-ce-glue.c:(.exit.text+0x24): undefined reference to 'crypto_unregister_aead' +ld: arch/arm64/crypto/ghash-ce-glue.o: in function 'ghash_ce_mod_init': +ghash-ce-glue.c:(.init.text+0x34): undefined reference to 'crypto_register_aead' + +Fixes: 537c1445ab0b ("crypto: arm64/gcm - implement native driver using v8 Crypto Extensions") +Signed-off-by: Qian Cai +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + arch/arm64/crypto/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm64/crypto/Kconfig b/arch/arm64/crypto/Kconfig +index b8eb0453123d..6bd4e749a946 100644 +--- a/arch/arm64/crypto/Kconfig ++++ b/arch/arm64/crypto/Kconfig +@@ -59,6 +59,7 @@ config CRYPTO_GHASH_ARM64_CE + select CRYPTO_HASH + select CRYPTO_GF128MUL + select CRYPTO_LIB_AES ++ select CRYPTO_AEAD + + config CRYPTO_CRCT10DIF_ARM64_CE + tristate "CRCT10DIF digest algorithm using PMULL instructions" +-- +2.35.1 + diff --git a/queue-5.10/crypto-ccp-during-shutdown-check-sev-data-pointer-be.patch b/queue-5.10/crypto-ccp-during-shutdown-check-sev-data-pointer-be.patch new file mode 100644 index 00000000000..09394ac6636 --- /dev/null +++ b/queue-5.10/crypto-ccp-during-shutdown-check-sev-data-pointer-be.patch @@ -0,0 +1,44 @@ +From 30d310589b32ed9dba800128fefbf41df919738a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 16 Jun 2022 10:26:18 -0500 +Subject: crypto: ccp - During shutdown, check SEV data pointer before using + +From: Tom Lendacky + +[ Upstream commit 1b05ece0c931536c0a38a9385e243a7962e933f6 ] + +On shutdown, each CCP device instance performs shutdown processing. +However, __sev_platform_shutdown_locked() uses the controlling psp +structure to obtain the pointer to the sev_device structure. However, +during driver initialization, it is possible that an error can be received +from the firmware that results in the sev_data pointer being cleared from +the controlling psp structure. The __sev_platform_shutdown_locked() +function does not check for this situation and will segfault. + +While not common, this scenario should be accounted for. Add a check for a +NULL sev_device structure before attempting to use it. + +Fixes: 5441a07a127f ("crypto: ccp - shutdown SEV firmware on kexec") +Signed-off-by: Tom Lendacky +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/ccp/sev-dev.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c +index 57b57d4db500..ed39a22e1b2b 100644 +--- a/drivers/crypto/ccp/sev-dev.c ++++ b/drivers/crypto/ccp/sev-dev.c +@@ -278,7 +278,7 @@ static int __sev_platform_shutdown_locked(int *error) + struct sev_device *sev = psp_master->sev_data; + int ret; + +- if (sev->state == SEV_STATE_UNINIT) ++ if (!sev || sev->state == SEV_STATE_UNINIT) + return 0; + + ret = __sev_do_cmd_locked(SEV_CMD_SHUTDOWN, NULL, error); +-- +2.35.1 + diff --git a/queue-5.10/crypto-hisilicon-hpre-don-t-use-gfp_kernel-to-alloc-.patch b/queue-5.10/crypto-hisilicon-hpre-don-t-use-gfp_kernel-to-alloc-.patch new file mode 100644 index 00000000000..28026728a99 --- /dev/null +++ b/queue-5.10/crypto-hisilicon-hpre-don-t-use-gfp_kernel-to-alloc-.patch @@ -0,0 +1,37 @@ +From 250595dbe8f6ef7f28138d862cce70c66ee64491 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 12:23:23 +0800 +Subject: crypto: hisilicon/hpre - don't use GFP_KERNEL to alloc mem during + softirq + +From: Zhengchao Shao + +[ Upstream commit 98dfa9343f37bdd4112966292751e3a93aaf2e56 ] + +The hpre encryption driver may be used to encrypt and decrypt packets +during the rx softirq, it is not allowed to use GFP_KERNEL. + +Fixes: c8b4b477079d ("crypto: hisilicon - add HiSilicon HPRE accelerator") +Signed-off-by: Zhengchao Shao +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/hisilicon/hpre/hpre_crypto.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/crypto/hisilicon/hpre/hpre_crypto.c b/drivers/crypto/hisilicon/hpre/hpre_crypto.c +index a87f9904087a..90c13ebe7e83 100644 +--- a/drivers/crypto/hisilicon/hpre/hpre_crypto.c ++++ b/drivers/crypto/hisilicon/hpre/hpre_crypto.c +@@ -210,7 +210,7 @@ static int hpre_prepare_dma_buf(struct hpre_asym_request *hpre_req, + if (unlikely(shift < 0)) + return -EINVAL; + +- ptr = dma_alloc_coherent(dev, ctx->key_sz, tmp, GFP_KERNEL); ++ ptr = dma_alloc_coherent(dev, ctx->key_sz, tmp, GFP_ATOMIC); + if (unlikely(!ptr)) + return -ENOMEM; + +-- +2.35.1 + diff --git a/queue-5.10/crypto-hisilicon-kunpeng916-crypto-driver-don-t-slee.patch b/queue-5.10/crypto-hisilicon-kunpeng916-crypto-driver-don-t-slee.patch new file mode 100644 index 00000000000..dff1f9adc93 --- /dev/null +++ b/queue-5.10/crypto-hisilicon-kunpeng916-crypto-driver-don-t-slee.patch @@ -0,0 +1,97 @@ +From 89d03028ae0db5b83745b942749758a3abd868d0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 09:59:54 +0800 +Subject: crypto: hisilicon - Kunpeng916 crypto driver don't sleep when in + softirq + +From: Zhengchao Shao + +[ Upstream commit 68740ab505431f268dc1ee26a54b871e75f0ddaa ] + +When kunpeng916 encryption driver is used to deencrypt and decrypt +packets during the softirq, it is not allowed to use mutex lock. + +Fixes: 915e4e8413da ("crypto: hisilicon - SEC security accelerator driver") +Signed-off-by: Zhengchao Shao +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/hisilicon/sec/sec_algs.c | 14 +++++++------- + drivers/crypto/hisilicon/sec/sec_drv.h | 2 +- + 2 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/drivers/crypto/hisilicon/sec/sec_algs.c b/drivers/crypto/hisilicon/sec/sec_algs.c +index 8ca945ac297e..2066f8d40c5a 100644 +--- a/drivers/crypto/hisilicon/sec/sec_algs.c ++++ b/drivers/crypto/hisilicon/sec/sec_algs.c +@@ -449,7 +449,7 @@ static void sec_skcipher_alg_callback(struct sec_bd_info *sec_resp, + */ + } + +- mutex_lock(&ctx->queue->queuelock); ++ spin_lock_bh(&ctx->queue->queuelock); + /* Put the IV in place for chained cases */ + switch (ctx->cipher_alg) { + case SEC_C_AES_CBC_128: +@@ -509,7 +509,7 @@ static void sec_skcipher_alg_callback(struct sec_bd_info *sec_resp, + list_del(&backlog_req->backlog_head); + } + } +- mutex_unlock(&ctx->queue->queuelock); ++ spin_unlock_bh(&ctx->queue->queuelock); + + mutex_lock(&sec_req->lock); + list_del(&sec_req_el->head); +@@ -798,7 +798,7 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq, + */ + + /* Grab a big lock for a long time to avoid concurrency issues */ +- mutex_lock(&queue->queuelock); ++ spin_lock_bh(&queue->queuelock); + + /* + * Can go on to queue if we have space in either: +@@ -814,15 +814,15 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq, + ret = -EBUSY; + if ((skreq->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) { + list_add_tail(&sec_req->backlog_head, &ctx->backlog); +- mutex_unlock(&queue->queuelock); ++ spin_unlock_bh(&queue->queuelock); + goto out; + } + +- mutex_unlock(&queue->queuelock); ++ spin_unlock_bh(&queue->queuelock); + goto err_free_elements; + } + ret = sec_send_request(sec_req, queue); +- mutex_unlock(&queue->queuelock); ++ spin_unlock_bh(&queue->queuelock); + if (ret) + goto err_free_elements; + +@@ -881,7 +881,7 @@ static int sec_alg_skcipher_init(struct crypto_skcipher *tfm) + if (IS_ERR(ctx->queue)) + return PTR_ERR(ctx->queue); + +- mutex_init(&ctx->queue->queuelock); ++ spin_lock_init(&ctx->queue->queuelock); + ctx->queue->havesoftqueue = false; + + return 0; +diff --git a/drivers/crypto/hisilicon/sec/sec_drv.h b/drivers/crypto/hisilicon/sec/sec_drv.h +index 4d9063a8b10b..0bf4d7c3856c 100644 +--- a/drivers/crypto/hisilicon/sec/sec_drv.h ++++ b/drivers/crypto/hisilicon/sec/sec_drv.h +@@ -347,7 +347,7 @@ struct sec_queue { + DECLARE_BITMAP(unprocessed, SEC_QUEUE_LEN); + DECLARE_KFIFO_PTR(softqueue, typeof(struct sec_request_el *)); + bool havesoftqueue; +- struct mutex queuelock; ++ spinlock_t queuelock; + void *shadow[SEC_QUEUE_LEN]; + }; + +-- +2.35.1 + diff --git a/queue-5.10/crypto-hisilicon-sec-don-t-sleep-when-in-softirq.patch b/queue-5.10/crypto-hisilicon-sec-don-t-sleep-when-in-softirq.patch new file mode 100644 index 00000000000..d32623f68b1 --- /dev/null +++ b/queue-5.10/crypto-hisilicon-sec-don-t-sleep-when-in-softirq.patch @@ -0,0 +1,180 @@ +From 1dbe04c6cb4c5a9cf50b356a394c6676ede93c16 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 09:55:11 +0800 +Subject: crypto: hisilicon/sec - don't sleep when in softirq + +From: Zhengchao Shao + +[ Upstream commit 02884a4f12de11f54d4ca67a07dd1f111d96fdbd ] + +When kunpeng920 encryption driver is used to deencrypt and decrypt +packets during the softirq, it is not allowed to use mutex lock. The +kernel will report the following error: + +BUG: scheduling while atomic: swapper/57/0/0x00000300 +Call trace: +dump_backtrace+0x0/0x1e4 +show_stack+0x20/0x2c +dump_stack+0xd8/0x140 +__schedule_bug+0x68/0x80 +__schedule+0x728/0x840 +schedule+0x50/0xe0 +schedule_preempt_disabled+0x18/0x24 +__mutex_lock.constprop.0+0x594/0x5dc +__mutex_lock_slowpath+0x1c/0x30 +mutex_lock+0x50/0x60 +sec_request_init+0x8c/0x1a0 [hisi_sec2] +sec_process+0x28/0x1ac [hisi_sec2] +sec_skcipher_crypto+0xf4/0x1d4 [hisi_sec2] +sec_skcipher_encrypt+0x1c/0x30 [hisi_sec2] +crypto_skcipher_encrypt+0x2c/0x40 +crypto_authenc_encrypt+0xc8/0xfc [authenc] +crypto_aead_encrypt+0x2c/0x40 +echainiv_encrypt+0x144/0x1a0 [echainiv] +crypto_aead_encrypt+0x2c/0x40 +esp_output_tail+0x348/0x5c0 [esp4] +esp_output+0x120/0x19c [esp4] +xfrm_output_one+0x25c/0x4d4 +xfrm_output_resume+0x6c/0x1fc +xfrm_output+0xac/0x3c0 +xfrm4_output+0x64/0x130 +ip_build_and_send_pkt+0x158/0x20c +tcp_v4_send_synack+0xdc/0x1f0 +tcp_conn_request+0x7d0/0x994 +tcp_v4_conn_request+0x58/0x6c +tcp_v6_conn_request+0xf0/0x100 +tcp_rcv_state_process+0x1cc/0xd60 +tcp_v4_do_rcv+0x10c/0x250 +tcp_v4_rcv+0xfc4/0x10a4 +ip_protocol_deliver_rcu+0xf4/0x200 +ip_local_deliver_finish+0x58/0x70 +ip_local_deliver+0x68/0x120 +ip_sublist_rcv_finish+0x70/0x94 +ip_list_rcv_finish.constprop.0+0x17c/0x1d0 +ip_sublist_rcv+0x40/0xb0 +ip_list_rcv+0x140/0x1dc +__netif_receive_skb_list_core+0x154/0x28c +__netif_receive_skb_list+0x120/0x1a0 +netif_receive_skb_list_internal+0xe4/0x1f0 +napi_complete_done+0x70/0x1f0 +gro_cell_poll+0x9c/0xb0 +napi_poll+0xcc/0x264 +net_rx_action+0xd4/0x21c +__do_softirq+0x130/0x358 +irq_exit+0x11c/0x13c +__handle_domain_irq+0x88/0xf0 +gic_handle_irq+0x78/0x2c0 +el1_irq+0xb8/0x140 +arch_cpu_idle+0x18/0x40 +default_idle_call+0x5c/0x1c0 +cpuidle_idle_call+0x174/0x1b0 +do_idle+0xc8/0x160 +cpu_startup_entry+0x30/0x11c +secondary_start_kernel+0x158/0x1e4 +softirq: huh, entered softirq 3 NET_RX 0000000093774ee4 with +preempt_count 00000100, exited with fffffe00? + +Fixes: 416d82204df4 ("crypto: hisilicon - add HiSilicon SEC V2 driver") +Signed-off-by: Zhengchao Shao +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/hisilicon/sec2/sec.h | 2 +- + drivers/crypto/hisilicon/sec2/sec_crypto.c | 20 ++++++++++---------- + 2 files changed, 11 insertions(+), 11 deletions(-) + +diff --git a/drivers/crypto/hisilicon/sec2/sec.h b/drivers/crypto/hisilicon/sec2/sec.h +index 5c35043f980f..249735b7ceca 100644 +--- a/drivers/crypto/hisilicon/sec2/sec.h ++++ b/drivers/crypto/hisilicon/sec2/sec.h +@@ -103,7 +103,7 @@ struct sec_qp_ctx { + struct idr req_idr; + struct sec_alg_res res[QM_Q_DEPTH]; + struct sec_ctx *ctx; +- struct mutex req_lock; ++ spinlock_t req_lock; + struct list_head backlog; + struct hisi_acc_sgl_pool *c_in_pool; + struct hisi_acc_sgl_pool *c_out_pool; +diff --git a/drivers/crypto/hisilicon/sec2/sec_crypto.c b/drivers/crypto/hisilicon/sec2/sec_crypto.c +index 0b674a771ee0..39d2af84d953 100644 +--- a/drivers/crypto/hisilicon/sec2/sec_crypto.c ++++ b/drivers/crypto/hisilicon/sec2/sec_crypto.c +@@ -88,11 +88,11 @@ static int sec_alloc_req_id(struct sec_req *req, struct sec_qp_ctx *qp_ctx) + { + int req_id; + +- mutex_lock(&qp_ctx->req_lock); ++ spin_lock_bh(&qp_ctx->req_lock); + + req_id = idr_alloc_cyclic(&qp_ctx->req_idr, NULL, + 0, QM_Q_DEPTH, GFP_ATOMIC); +- mutex_unlock(&qp_ctx->req_lock); ++ spin_unlock_bh(&qp_ctx->req_lock); + if (unlikely(req_id < 0)) { + dev_err(req->ctx->dev, "alloc req id fail!\n"); + return req_id; +@@ -116,9 +116,9 @@ static void sec_free_req_id(struct sec_req *req) + qp_ctx->req_list[req_id] = NULL; + req->qp_ctx = NULL; + +- mutex_lock(&qp_ctx->req_lock); ++ spin_lock_bh(&qp_ctx->req_lock); + idr_remove(&qp_ctx->req_idr, req_id); +- mutex_unlock(&qp_ctx->req_lock); ++ spin_unlock_bh(&qp_ctx->req_lock); + } + + static int sec_aead_verify(struct sec_req *req) +@@ -201,7 +201,7 @@ static int sec_bd_send(struct sec_ctx *ctx, struct sec_req *req) + !(req->flag & CRYPTO_TFM_REQ_MAY_BACKLOG)) + return -EBUSY; + +- mutex_lock(&qp_ctx->req_lock); ++ spin_lock_bh(&qp_ctx->req_lock); + ret = hisi_qp_send(qp_ctx->qp, &req->sec_sqe); + + if (ctx->fake_req_limit <= +@@ -209,10 +209,10 @@ static int sec_bd_send(struct sec_ctx *ctx, struct sec_req *req) + list_add_tail(&req->backlog_head, &qp_ctx->backlog); + atomic64_inc(&ctx->sec->debug.dfx.send_cnt); + atomic64_inc(&ctx->sec->debug.dfx.send_busy_cnt); +- mutex_unlock(&qp_ctx->req_lock); ++ spin_unlock_bh(&qp_ctx->req_lock); + return -EBUSY; + } +- mutex_unlock(&qp_ctx->req_lock); ++ spin_unlock_bh(&qp_ctx->req_lock); + + if (unlikely(ret == -EBUSY)) + return -ENOBUFS; +@@ -382,7 +382,7 @@ static int sec_create_qp_ctx(struct hisi_qm *qm, struct sec_ctx *ctx, + qp_ctx->qp = qp; + qp_ctx->ctx = ctx; + +- mutex_init(&qp_ctx->req_lock); ++ spin_lock_init(&qp_ctx->req_lock); + idr_init(&qp_ctx->req_idr); + INIT_LIST_HEAD(&qp_ctx->backlog); + +@@ -1067,7 +1067,7 @@ static struct sec_req *sec_back_req_clear(struct sec_ctx *ctx, + { + struct sec_req *backlog_req = NULL; + +- mutex_lock(&qp_ctx->req_lock); ++ spin_lock_bh(&qp_ctx->req_lock); + if (ctx->fake_req_limit >= + atomic_read(&qp_ctx->qp->qp_status.used) && + !list_empty(&qp_ctx->backlog)) { +@@ -1075,7 +1075,7 @@ static struct sec_req *sec_back_req_clear(struct sec_ctx *ctx, + typeof(*backlog_req), backlog_head); + list_del(&backlog_req->backlog_head); + } +- mutex_unlock(&qp_ctx->req_lock); ++ spin_unlock_bh(&qp_ctx->req_lock); + + return backlog_req; + } +-- +2.35.1 + diff --git a/queue-5.10/crypto-hisilicon-sec-fix-auth-key-size-error.patch b/queue-5.10/crypto-hisilicon-sec-fix-auth-key-size-error.patch new file mode 100644 index 00000000000..70f0091990b --- /dev/null +++ b/queue-5.10/crypto-hisilicon-sec-fix-auth-key-size-error.patch @@ -0,0 +1,60 @@ +From 8aa0e92e97ccf2b7f7254f609288a872640a5965 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jul 2022 10:18:31 +0800 +Subject: crypto: hisilicon/sec - fix auth key size error + +From: Kai Ye + +[ Upstream commit 45f5d0176d8426cc1ab0bab84fbd8ef5c57526c6 ] + +The authentication algorithm supports a maximum of 128-byte keys. +The allocated key memory is insufficient. + +Fixes: 2f072d75d1ab ("crypto: hisilicon - Add aead support on SEC2") +Signed-off-by: Kai Ye +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/hisilicon/sec2/sec_crypto.c | 6 +++--- + drivers/crypto/hisilicon/sec2/sec_crypto.h | 1 + + 2 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/crypto/hisilicon/sec2/sec_crypto.c b/drivers/crypto/hisilicon/sec2/sec_crypto.c +index 39d2af84d953..2dbec638cca8 100644 +--- a/drivers/crypto/hisilicon/sec2/sec_crypto.c ++++ b/drivers/crypto/hisilicon/sec2/sec_crypto.c +@@ -516,7 +516,7 @@ static int sec_auth_init(struct sec_ctx *ctx) + { + struct sec_auth_ctx *a_ctx = &ctx->a_ctx; + +- a_ctx->a_key = dma_alloc_coherent(ctx->dev, SEC_MAX_KEY_SIZE, ++ a_ctx->a_key = dma_alloc_coherent(ctx->dev, SEC_MAX_AKEY_SIZE, + &a_ctx->a_key_dma, GFP_KERNEL); + if (!a_ctx->a_key) + return -ENOMEM; +@@ -528,8 +528,8 @@ static void sec_auth_uninit(struct sec_ctx *ctx) + { + struct sec_auth_ctx *a_ctx = &ctx->a_ctx; + +- memzero_explicit(a_ctx->a_key, SEC_MAX_KEY_SIZE); +- dma_free_coherent(ctx->dev, SEC_MAX_KEY_SIZE, ++ memzero_explicit(a_ctx->a_key, SEC_MAX_AKEY_SIZE); ++ dma_free_coherent(ctx->dev, SEC_MAX_AKEY_SIZE, + a_ctx->a_key, a_ctx->a_key_dma); + } + +diff --git a/drivers/crypto/hisilicon/sec2/sec_crypto.h b/drivers/crypto/hisilicon/sec2/sec_crypto.h +index 1db2ae4b7b66..20f11e5bbf1d 100644 +--- a/drivers/crypto/hisilicon/sec2/sec_crypto.h ++++ b/drivers/crypto/hisilicon/sec2/sec_crypto.h +@@ -6,6 +6,7 @@ + + #define SEC_IV_SIZE 24 + #define SEC_MAX_KEY_SIZE 64 ++#define SEC_MAX_AKEY_SIZE 128 + #define SEC_COMM_SCENE 0 + + enum sec_calg { +-- +2.35.1 + diff --git a/queue-5.10/crypto-hisilicon-sec-fixes-some-coding-style.patch b/queue-5.10/crypto-hisilicon-sec-fixes-some-coding-style.patch new file mode 100644 index 00000000000..2146a4006ff --- /dev/null +++ b/queue-5.10/crypto-hisilicon-sec-fixes-some-coding-style.patch @@ -0,0 +1,420 @@ +From 2f70e1d77eab0047d4a61e69c16f8f2130c06209 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 13 Mar 2021 15:28:24 +0800 +Subject: crypto: hisilicon/sec - fixes some coding style + +From: Longfang Liu + +[ Upstream commit a44dce504bce620daff97a3e77650b7b579e8753 ] + +1.delete the original complex method of obtaining the +current device and replace it with the initialized +device pointer. +2.fixes some coding style + +Signed-off-by: Longfang Liu +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/hisilicon/sec2/sec.h | 5 +- + drivers/crypto/hisilicon/sec2/sec_crypto.c | 75 +++++++++++----------- + drivers/crypto/hisilicon/sec2/sec_crypto.h | 2 - + 3 files changed, 39 insertions(+), 43 deletions(-) + +diff --git a/drivers/crypto/hisilicon/sec2/sec.h b/drivers/crypto/hisilicon/sec2/sec.h +index 037762b531e2..5c35043f980f 100644 +--- a/drivers/crypto/hisilicon/sec2/sec.h ++++ b/drivers/crypto/hisilicon/sec2/sec.h +@@ -4,8 +4,6 @@ + #ifndef __HISI_SEC_V2_H + #define __HISI_SEC_V2_H + +-#include +- + #include "../qm.h" + #include "sec_crypto.h" + +@@ -50,7 +48,7 @@ struct sec_req { + + int err_type; + int req_id; +- int flag; ++ u32 flag; + + /* Status of the SEC request */ + bool fake_busy; +@@ -140,6 +138,7 @@ struct sec_ctx { + bool pbuf_supported; + struct sec_cipher_ctx c_ctx; + struct sec_auth_ctx a_ctx; ++ struct device *dev; + }; + + enum sec_endian { +diff --git a/drivers/crypto/hisilicon/sec2/sec_crypto.c b/drivers/crypto/hisilicon/sec2/sec_crypto.c +index 630dcb59ad56..0b674a771ee0 100644 +--- a/drivers/crypto/hisilicon/sec2/sec_crypto.c ++++ b/drivers/crypto/hisilicon/sec2/sec_crypto.c +@@ -42,7 +42,6 @@ + + #define SEC_TOTAL_IV_SZ (SEC_IV_SIZE * QM_Q_DEPTH) + #define SEC_SGL_SGE_NR 128 +-#define SEC_CTX_DEV(ctx) (&(ctx)->sec->qm.pdev->dev) + #define SEC_CIPHER_AUTH 0xfe + #define SEC_AUTH_CIPHER 0x1 + #define SEC_MAX_MAC_LEN 64 +@@ -95,7 +94,7 @@ static int sec_alloc_req_id(struct sec_req *req, struct sec_qp_ctx *qp_ctx) + 0, QM_Q_DEPTH, GFP_ATOMIC); + mutex_unlock(&qp_ctx->req_lock); + if (unlikely(req_id < 0)) { +- dev_err(SEC_CTX_DEV(req->ctx), "alloc req id fail!\n"); ++ dev_err(req->ctx->dev, "alloc req id fail!\n"); + return req_id; + } + +@@ -110,7 +109,7 @@ static void sec_free_req_id(struct sec_req *req) + int req_id = req->req_id; + + if (unlikely(req_id < 0 || req_id >= QM_Q_DEPTH)) { +- dev_err(SEC_CTX_DEV(req->ctx), "free request id invalid!\n"); ++ dev_err(req->ctx->dev, "free request id invalid!\n"); + return; + } + +@@ -136,7 +135,7 @@ static int sec_aead_verify(struct sec_req *req) + aead_req->cryptlen + aead_req->assoclen - + authsize); + if (unlikely(sz != authsize || memcmp(mac_out, mac, sz))) { +- dev_err(SEC_CTX_DEV(req->ctx), "aead verify failure!\n"); ++ dev_err(req->ctx->dev, "aead verify failure!\n"); + return -EBADMSG; + } + +@@ -175,7 +174,7 @@ static void sec_req_cb(struct hisi_qp *qp, void *resp) + if (unlikely(req->err_type || done != SEC_SQE_DONE || + (ctx->alg_type == SEC_SKCIPHER && flag != SEC_SQE_CFLAG) || + (ctx->alg_type == SEC_AEAD && flag != SEC_SQE_AEAD_FLAG))) { +- dev_err(SEC_CTX_DEV(ctx), ++ dev_err_ratelimited(ctx->dev, + "err_type[%d],done[%d],flag[%d]\n", + req->err_type, done, flag); + err = -EIO; +@@ -323,8 +322,8 @@ static int sec_alloc_pbuf_resource(struct device *dev, struct sec_alg_res *res) + static int sec_alg_resource_alloc(struct sec_ctx *ctx, + struct sec_qp_ctx *qp_ctx) + { +- struct device *dev = SEC_CTX_DEV(ctx); + struct sec_alg_res *res = qp_ctx->res; ++ struct device *dev = ctx->dev; + int ret; + + ret = sec_alloc_civ_resource(dev, res); +@@ -357,7 +356,7 @@ static int sec_alg_resource_alloc(struct sec_ctx *ctx, + static void sec_alg_resource_free(struct sec_ctx *ctx, + struct sec_qp_ctx *qp_ctx) + { +- struct device *dev = SEC_CTX_DEV(ctx); ++ struct device *dev = ctx->dev; + + sec_free_civ_resource(dev, qp_ctx->res); + +@@ -370,7 +369,7 @@ static void sec_alg_resource_free(struct sec_ctx *ctx, + static int sec_create_qp_ctx(struct hisi_qm *qm, struct sec_ctx *ctx, + int qp_ctx_id, int alg_type) + { +- struct device *dev = SEC_CTX_DEV(ctx); ++ struct device *dev = ctx->dev; + struct sec_qp_ctx *qp_ctx; + struct hisi_qp *qp; + int ret = -ENOMEM; +@@ -426,7 +425,7 @@ static int sec_create_qp_ctx(struct hisi_qm *qm, struct sec_ctx *ctx, + static void sec_release_qp_ctx(struct sec_ctx *ctx, + struct sec_qp_ctx *qp_ctx) + { +- struct device *dev = SEC_CTX_DEV(ctx); ++ struct device *dev = ctx->dev; + + hisi_qm_stop_qp(qp_ctx->qp); + sec_alg_resource_free(ctx, qp_ctx); +@@ -450,6 +449,7 @@ static int sec_ctx_base_init(struct sec_ctx *ctx) + + sec = container_of(ctx->qps[0]->qm, struct sec_dev, qm); + ctx->sec = sec; ++ ctx->dev = &sec->qm.pdev->dev; + ctx->hlf_q_num = sec->ctx_q_num >> 1; + + ctx->pbuf_supported = ctx->sec->iommu_used; +@@ -474,11 +474,9 @@ static int sec_ctx_base_init(struct sec_ctx *ctx) + err_sec_release_qp_ctx: + for (i = i - 1; i >= 0; i--) + sec_release_qp_ctx(ctx, &ctx->qp_ctx[i]); +- + kfree(ctx->qp_ctx); + err_destroy_qps: + sec_destroy_qps(ctx->qps, sec->ctx_q_num); +- + return ret; + } + +@@ -497,7 +495,7 @@ static int sec_cipher_init(struct sec_ctx *ctx) + { + struct sec_cipher_ctx *c_ctx = &ctx->c_ctx; + +- c_ctx->c_key = dma_alloc_coherent(SEC_CTX_DEV(ctx), SEC_MAX_KEY_SIZE, ++ c_ctx->c_key = dma_alloc_coherent(ctx->dev, SEC_MAX_KEY_SIZE, + &c_ctx->c_key_dma, GFP_KERNEL); + if (!c_ctx->c_key) + return -ENOMEM; +@@ -510,7 +508,7 @@ static void sec_cipher_uninit(struct sec_ctx *ctx) + struct sec_cipher_ctx *c_ctx = &ctx->c_ctx; + + memzero_explicit(c_ctx->c_key, SEC_MAX_KEY_SIZE); +- dma_free_coherent(SEC_CTX_DEV(ctx), SEC_MAX_KEY_SIZE, ++ dma_free_coherent(ctx->dev, SEC_MAX_KEY_SIZE, + c_ctx->c_key, c_ctx->c_key_dma); + } + +@@ -518,7 +516,7 @@ static int sec_auth_init(struct sec_ctx *ctx) + { + struct sec_auth_ctx *a_ctx = &ctx->a_ctx; + +- a_ctx->a_key = dma_alloc_coherent(SEC_CTX_DEV(ctx), SEC_MAX_KEY_SIZE, ++ a_ctx->a_key = dma_alloc_coherent(ctx->dev, SEC_MAX_KEY_SIZE, + &a_ctx->a_key_dma, GFP_KERNEL); + if (!a_ctx->a_key) + return -ENOMEM; +@@ -531,7 +529,7 @@ static void sec_auth_uninit(struct sec_ctx *ctx) + struct sec_auth_ctx *a_ctx = &ctx->a_ctx; + + memzero_explicit(a_ctx->a_key, SEC_MAX_KEY_SIZE); +- dma_free_coherent(SEC_CTX_DEV(ctx), SEC_MAX_KEY_SIZE, ++ dma_free_coherent(ctx->dev, SEC_MAX_KEY_SIZE, + a_ctx->a_key, a_ctx->a_key_dma); + } + +@@ -631,12 +629,13 @@ static int sec_skcipher_setkey(struct crypto_skcipher *tfm, const u8 *key, + { + struct sec_ctx *ctx = crypto_skcipher_ctx(tfm); + struct sec_cipher_ctx *c_ctx = &ctx->c_ctx; ++ struct device *dev = ctx->dev; + int ret; + + if (c_mode == SEC_CMODE_XTS) { + ret = xts_verify_key(tfm, key, keylen); + if (ret) { +- dev_err(SEC_CTX_DEV(ctx), "xts mode key err!\n"); ++ dev_err(dev, "xts mode key err!\n"); + return ret; + } + } +@@ -657,7 +656,7 @@ static int sec_skcipher_setkey(struct crypto_skcipher *tfm, const u8 *key, + } + + if (ret) { +- dev_err(SEC_CTX_DEV(ctx), "set sec key err!\n"); ++ dev_err(dev, "set sec key err!\n"); + return ret; + } + +@@ -689,7 +688,7 @@ static int sec_cipher_pbuf_map(struct sec_ctx *ctx, struct sec_req *req, + struct aead_request *aead_req = req->aead_req.aead_req; + struct sec_cipher_req *c_req = &req->c_req; + struct sec_qp_ctx *qp_ctx = req->qp_ctx; +- struct device *dev = SEC_CTX_DEV(ctx); ++ struct device *dev = ctx->dev; + int copy_size, pbuf_length; + int req_id = req->req_id; + +@@ -699,9 +698,8 @@ static int sec_cipher_pbuf_map(struct sec_ctx *ctx, struct sec_req *req, + copy_size = c_req->c_len; + + pbuf_length = sg_copy_to_buffer(src, sg_nents(src), +- qp_ctx->res[req_id].pbuf, +- copy_size); +- ++ qp_ctx->res[req_id].pbuf, ++ copy_size); + if (unlikely(pbuf_length != copy_size)) { + dev_err(dev, "copy src data to pbuf error!\n"); + return -EINVAL; +@@ -725,7 +723,7 @@ static void sec_cipher_pbuf_unmap(struct sec_ctx *ctx, struct sec_req *req, + struct aead_request *aead_req = req->aead_req.aead_req; + struct sec_cipher_req *c_req = &req->c_req; + struct sec_qp_ctx *qp_ctx = req->qp_ctx; +- struct device *dev = SEC_CTX_DEV(ctx); ++ struct device *dev = ctx->dev; + int copy_size, pbuf_length; + int req_id = req->req_id; + +@@ -737,7 +735,6 @@ static void sec_cipher_pbuf_unmap(struct sec_ctx *ctx, struct sec_req *req, + pbuf_length = sg_copy_from_buffer(dst, sg_nents(dst), + qp_ctx->res[req_id].pbuf, + copy_size); +- + if (unlikely(pbuf_length != copy_size)) + dev_err(dev, "copy pbuf data to dst error!\n"); + +@@ -750,7 +747,7 @@ static int sec_cipher_map(struct sec_ctx *ctx, struct sec_req *req, + struct sec_aead_req *a_req = &req->aead_req; + struct sec_qp_ctx *qp_ctx = req->qp_ctx; + struct sec_alg_res *res = &qp_ctx->res[req->req_id]; +- struct device *dev = SEC_CTX_DEV(ctx); ++ struct device *dev = ctx->dev; + int ret; + + if (req->use_pbuf) { +@@ -805,7 +802,7 @@ static void sec_cipher_unmap(struct sec_ctx *ctx, struct sec_req *req, + struct scatterlist *src, struct scatterlist *dst) + { + struct sec_cipher_req *c_req = &req->c_req; +- struct device *dev = SEC_CTX_DEV(ctx); ++ struct device *dev = ctx->dev; + + if (req->use_pbuf) { + sec_cipher_pbuf_unmap(ctx, req, dst); +@@ -889,6 +886,7 @@ static int sec_aead_setkey(struct crypto_aead *tfm, const u8 *key, + { + struct sec_ctx *ctx = crypto_aead_ctx(tfm); + struct sec_cipher_ctx *c_ctx = &ctx->c_ctx; ++ struct device *dev = ctx->dev; + struct crypto_authenc_keys keys; + int ret; + +@@ -902,13 +900,13 @@ static int sec_aead_setkey(struct crypto_aead *tfm, const u8 *key, + + ret = sec_aead_aes_set_key(c_ctx, &keys); + if (ret) { +- dev_err(SEC_CTX_DEV(ctx), "set sec cipher key err!\n"); ++ dev_err(dev, "set sec cipher key err!\n"); + goto bad_key; + } + + ret = sec_aead_auth_set_key(&ctx->a_ctx, &keys); + if (ret) { +- dev_err(SEC_CTX_DEV(ctx), "set sec auth key err!\n"); ++ dev_err(dev, "set sec auth key err!\n"); + goto bad_key; + } + +@@ -1061,7 +1059,7 @@ static void sec_update_iv(struct sec_req *req, enum sec_alg_type alg_type) + sz = sg_pcopy_to_buffer(sgl, sg_nents(sgl), iv, iv_size, + cryptlen - iv_size); + if (unlikely(sz != iv_size)) +- dev_err(SEC_CTX_DEV(req->ctx), "copy output iv error!\n"); ++ dev_err(req->ctx->dev, "copy output iv error!\n"); + } + + static struct sec_req *sec_back_req_clear(struct sec_ctx *ctx, +@@ -1160,7 +1158,7 @@ static int sec_aead_bd_fill(struct sec_ctx *ctx, struct sec_req *req) + + ret = sec_skcipher_bd_fill(ctx, req); + if (unlikely(ret)) { +- dev_err(SEC_CTX_DEV(ctx), "skcipher bd fill is error!\n"); ++ dev_err(ctx->dev, "skcipher bd fill is error!\n"); + return ret; + } + +@@ -1194,7 +1192,7 @@ static void sec_aead_callback(struct sec_ctx *c, struct sec_req *req, int err) + a_req->assoclen); + + if (unlikely(sz != authsize)) { +- dev_err(SEC_CTX_DEV(req->ctx), "copy out mac err!\n"); ++ dev_err(c->dev, "copy out mac err!\n"); + err = -EINVAL; + } + } +@@ -1259,7 +1257,7 @@ static int sec_process(struct sec_ctx *ctx, struct sec_req *req) + ret = ctx->req_op->bd_send(ctx, req); + if (unlikely((ret != -EBUSY && ret != -EINPROGRESS) || + (ret == -EBUSY && !(req->flag & CRYPTO_TFM_REQ_MAY_BACKLOG)))) { +- dev_err_ratelimited(SEC_CTX_DEV(ctx), "send sec request failed!\n"); ++ dev_err_ratelimited(ctx->dev, "send sec request failed!\n"); + goto err_send_req; + } + +@@ -1326,7 +1324,7 @@ static int sec_aead_init(struct crypto_aead *tfm) + ctx->alg_type = SEC_AEAD; + ctx->c_ctx.ivsize = crypto_aead_ivsize(tfm); + if (ctx->c_ctx.ivsize > SEC_IV_SIZE) { +- dev_err(SEC_CTX_DEV(ctx), "get error aead iv size!\n"); ++ dev_err(ctx->dev, "get error aead iv size!\n"); + return -EINVAL; + } + +@@ -1376,7 +1374,7 @@ static int sec_aead_ctx_init(struct crypto_aead *tfm, const char *hash_name) + + auth_ctx->hash_tfm = crypto_alloc_shash(hash_name, 0, 0); + if (IS_ERR(auth_ctx->hash_tfm)) { +- dev_err(SEC_CTX_DEV(ctx), "aead alloc shash error!\n"); ++ dev_err(ctx->dev, "aead alloc shash error!\n"); + sec_aead_exit(tfm); + return PTR_ERR(auth_ctx->hash_tfm); + } +@@ -1410,7 +1408,7 @@ static int sec_aead_sha512_ctx_init(struct crypto_aead *tfm) + static int sec_skcipher_param_check(struct sec_ctx *ctx, struct sec_req *sreq) + { + struct skcipher_request *sk_req = sreq->c_req.sk_req; +- struct device *dev = SEC_CTX_DEV(ctx); ++ struct device *dev = ctx->dev; + u8 c_alg = ctx->c_ctx.c_alg; + + if (unlikely(!sk_req->src || !sk_req->dst)) { +@@ -1533,14 +1531,15 @@ static struct skcipher_alg sec_skciphers[] = { + + static int sec_aead_param_check(struct sec_ctx *ctx, struct sec_req *sreq) + { +- u8 c_alg = ctx->c_ctx.c_alg; + struct aead_request *req = sreq->aead_req.aead_req; + struct crypto_aead *tfm = crypto_aead_reqtfm(req); + size_t authsize = crypto_aead_authsize(tfm); ++ struct device *dev = ctx->dev; ++ u8 c_alg = ctx->c_ctx.c_alg; + + if (unlikely(!req->src || !req->dst || !req->cryptlen || + req->assoclen > SEC_MAX_AAD_LEN)) { +- dev_err(SEC_CTX_DEV(ctx), "aead input param error!\n"); ++ dev_err(dev, "aead input param error!\n"); + return -EINVAL; + } + +@@ -1552,7 +1551,7 @@ static int sec_aead_param_check(struct sec_ctx *ctx, struct sec_req *sreq) + + /* Support AES only */ + if (unlikely(c_alg != SEC_CALG_AES)) { +- dev_err(SEC_CTX_DEV(ctx), "aead crypto alg error!\n"); ++ dev_err(dev, "aead crypto alg error!\n"); + return -EINVAL; + + } +@@ -1562,7 +1561,7 @@ static int sec_aead_param_check(struct sec_ctx *ctx, struct sec_req *sreq) + sreq->c_req.c_len = req->cryptlen - authsize; + + if (unlikely(sreq->c_req.c_len & (AES_BLOCK_SIZE - 1))) { +- dev_err(SEC_CTX_DEV(ctx), "aead crypto length error!\n"); ++ dev_err(dev, "aead crypto length error!\n"); + return -EINVAL; + } + +diff --git a/drivers/crypto/hisilicon/sec2/sec_crypto.h b/drivers/crypto/hisilicon/sec2/sec_crypto.h +index b2786e17d8fe..1db2ae4b7b66 100644 +--- a/drivers/crypto/hisilicon/sec2/sec_crypto.h ++++ b/drivers/crypto/hisilicon/sec2/sec_crypto.h +@@ -64,7 +64,6 @@ enum sec_addr_type { + }; + + struct sec_sqe_type2 { +- + /* + * mac_len: 0~4 bits + * a_key_len: 5~10 bits +@@ -120,7 +119,6 @@ struct sec_sqe_type2 { + /* c_pad_len_field: 0~1 bits */ + __le16 c_pad_len_field; + +- + __le64 long_a_data_len; + __le64 a_ivin_addr; + __le64 a_key_addr; +-- +2.35.1 + diff --git a/queue-5.10/crypto-inside-secure-add-missing-module_device_table.patch b/queue-5.10/crypto-inside-secure-add-missing-module_device_table.patch new file mode 100644 index 00000000000..2c738a51ae1 --- /dev/null +++ b/queue-5.10/crypto-inside-secure-add-missing-module_device_table.patch @@ -0,0 +1,41 @@ +From a0c631abd7db350aeb72af4d07871d53c46d46ba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 09:54:03 +0200 +Subject: crypto: inside-secure - Add missing MODULE_DEVICE_TABLE for of +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Pali Rohár + +[ Upstream commit fa4d57b85786ec0e16565c75a51c208834b0c24d ] + +Without MODULE_DEVICE_TABLE, crypto_safexcel.ko module is not automatically +loaded on platforms where inside-secure crypto HW is specified in device +tree (e.g. Armada 3720). So add missing MODULE_DEVICE_TABLE for of. + +Fixes: 1b44c5a60c13 ("crypto: inside-secure - add SafeXcel EIP197 crypto engine driver") +Signed-off-by: Pali Rohár +Acked-by: Marek Behún +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/inside-secure/safexcel.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/crypto/inside-secure/safexcel.c b/drivers/crypto/inside-secure/safexcel.c +index 2e1562108a85..fbcf52e46d17 100644 +--- a/drivers/crypto/inside-secure/safexcel.c ++++ b/drivers/crypto/inside-secure/safexcel.c +@@ -1834,6 +1834,8 @@ static const struct of_device_id safexcel_of_match_table[] = { + {}, + }; + ++MODULE_DEVICE_TABLE(of, safexcel_of_match_table); ++ + static struct platform_driver crypto_safexcel = { + .probe = safexcel_probe, + .remove = safexcel_remove, +-- +2.35.1 + diff --git a/queue-5.10/crypto-sun8i-ss-do-not-allocate-memory-when-handling.patch b/queue-5.10/crypto-sun8i-ss-do-not-allocate-memory-when-handling.patch new file mode 100644 index 00000000000..edd6c34dfa5 --- /dev/null +++ b/queue-5.10/crypto-sun8i-ss-do-not-allocate-memory-when-handling.patch @@ -0,0 +1,103 @@ +From 4f49883849fa431d824da122471f738fbd6594cc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 2 May 2022 20:19:19 +0000 +Subject: crypto: sun8i-ss - do not allocate memory when handling hash requests + +From: Corentin Labbe + +[ Upstream commit 8eec4563f152981a441693fc97c5459843dc5e6e ] + +Instead of allocate memory on each requests, it is easier to +pre-allocate buffers. +This made error path easier. + +Signed-off-by: Corentin Labbe +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c | 10 ++++++++++ + drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c | 15 +++------------ + drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h | 4 ++++ + 3 files changed, 17 insertions(+), 12 deletions(-) + +diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +index 657530578643..786b6f5cf300 100644 +--- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c ++++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +@@ -486,6 +486,16 @@ static int allocate_flows(struct sun8i_ss_dev *ss) + goto error_engine; + } + ++ /* the padding could be up to two block. */ ++ ss->flows[i].pad = devm_kmalloc(ss->dev, SHA256_BLOCK_SIZE * 2, ++ GFP_KERNEL | GFP_DMA); ++ if (!ss->flows[i].pad) ++ goto error_engine; ++ ss->flows[i].result = devm_kmalloc(ss->dev, SHA256_DIGEST_SIZE, ++ GFP_KERNEL | GFP_DMA); ++ if (!ss->flows[i].result) ++ goto error_engine; ++ + ss->flows[i].engine = crypto_engine_alloc_init(ss->dev, true); + if (!ss->flows[i].engine) { + dev_err(ss->dev, "Cannot allocate engine\n"); +diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +index 55d652cd468b..98040794acdc 100644 +--- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c ++++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +@@ -341,18 +341,11 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, void *breq) + if (digestsize == SHA224_DIGEST_SIZE) + digestsize = SHA256_DIGEST_SIZE; + +- /* the padding could be up to two block. */ +- pad = kzalloc(algt->alg.hash.halg.base.cra_blocksize * 2, GFP_KERNEL | GFP_DMA); +- if (!pad) +- return -ENOMEM; ++ result = ss->flows[rctx->flow].result; ++ pad = ss->flows[rctx->flow].pad; ++ memset(pad, 0, algt->alg.hash.halg.base.cra_blocksize * 2); + bf = (__le32 *)pad; + +- result = kzalloc(digestsize, GFP_KERNEL | GFP_DMA); +- if (!result) { +- kfree(pad); +- return -ENOMEM; +- } +- + for (i = 0; i < MAX_SG; i++) { + rctx->t_dst[i].addr = 0; + rctx->t_dst[i].len = 0; +@@ -447,8 +440,6 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, void *breq) + + memcpy(areq->result, result, algt->alg.hash.halg.digestsize); + theend: +- kfree(pad); +- kfree(result); + local_bh_disable(); + crypto_finalize_hash_request(engine, breq, err); + local_bh_enable(); +diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h +index 49147195ecf6..a97a790ae451 100644 +--- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h ++++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h +@@ -122,6 +122,8 @@ struct sginfo { + * @stat_req: number of request done by this flow + * @iv: list of IV to use for each step + * @biv: buffer which contain the backuped IV ++ * @pad: padding buffer for hash operations ++ * @result: buffer for storing the result of hash operations + */ + struct sun8i_ss_flow { + struct crypto_engine *engine; +@@ -129,6 +131,8 @@ struct sun8i_ss_flow { + int status; + u8 *iv[MAX_SG]; + u8 *biv; ++ void *pad; ++ void *result; + #ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG + unsigned long stat_req; + #endif +-- +2.35.1 + diff --git a/queue-5.10/crypto-sun8i-ss-fix-error-codes-in-allocate_flows.patch b/queue-5.10/crypto-sun8i-ss-fix-error-codes-in-allocate_flows.patch new file mode 100644 index 00000000000..311a8d2af15 --- /dev/null +++ b/queue-5.10/crypto-sun8i-ss-fix-error-codes-in-allocate_flows.patch @@ -0,0 +1,68 @@ +From efc92ca15e306761a28c2e7bb47cfb82ff8ff4ff Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 18 May 2022 20:33:44 +0300 +Subject: crypto: sun8i-ss - fix error codes in allocate_flows() + +From: Dan Carpenter + +[ Upstream commit d2765e1b9ac4b2d5a5d5bf17f468c9b3566c3770 ] + +These failure paths should return -ENOMEM. Currently they return +success. + +Fixes: 359e893e8af4 ("crypto: sun8i-ss - rework handling of IV") +Fixes: 8eec4563f152 ("crypto: sun8i-ss - do not allocate memory when handling hash requests") +Signed-off-by: Dan Carpenter +Acked-by: Corentin Labbe +Tested-by: Corentin Labbe +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + .../crypto/allwinner/sun8i-ss/sun8i-ss-core.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +index 786b6f5cf300..47b5828e35c3 100644 +--- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c ++++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +@@ -476,25 +476,33 @@ static int allocate_flows(struct sun8i_ss_dev *ss) + + ss->flows[i].biv = devm_kmalloc(ss->dev, AES_BLOCK_SIZE, + GFP_KERNEL | GFP_DMA); +- if (!ss->flows[i].biv) ++ if (!ss->flows[i].biv) { ++ err = -ENOMEM; + goto error_engine; ++ } + + for (j = 0; j < MAX_SG; j++) { + ss->flows[i].iv[j] = devm_kmalloc(ss->dev, AES_BLOCK_SIZE, + GFP_KERNEL | GFP_DMA); +- if (!ss->flows[i].iv[j]) ++ if (!ss->flows[i].iv[j]) { ++ err = -ENOMEM; + goto error_engine; ++ } + } + + /* the padding could be up to two block. */ + ss->flows[i].pad = devm_kmalloc(ss->dev, SHA256_BLOCK_SIZE * 2, + GFP_KERNEL | GFP_DMA); +- if (!ss->flows[i].pad) ++ if (!ss->flows[i].pad) { ++ err = -ENOMEM; + goto error_engine; ++ } + ss->flows[i].result = devm_kmalloc(ss->dev, SHA256_DIGEST_SIZE, + GFP_KERNEL | GFP_DMA); +- if (!ss->flows[i].result) ++ if (!ss->flows[i].result) { ++ err = -ENOMEM; + goto error_engine; ++ } + + ss->flows[i].engine = crypto_engine_alloc_init(ss->dev, true); + if (!ss->flows[i].engine) { +-- +2.35.1 + diff --git a/queue-5.10/crypto-sun8i-ss-fix-infinite-loop-in-sun8i_ss_setup_.patch b/queue-5.10/crypto-sun8i-ss-fix-infinite-loop-in-sun8i_ss_setup_.patch new file mode 100644 index 00000000000..4c6993a7601 --- /dev/null +++ b/queue-5.10/crypto-sun8i-ss-fix-infinite-loop-in-sun8i_ss_setup_.patch @@ -0,0 +1,38 @@ +From f2933fee3ab30571c3772468aaf8b572a3ae2509 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 Jun 2022 21:27:15 +0300 +Subject: crypto: sun8i-ss - fix infinite loop in sun8i_ss_setup_ivs() + +From: Alexey Khoroshilov + +[ Upstream commit d61a7b3decf7f0cf4121a7204303deefd2c7151b ] + +There is no i decrement in while (i >= 0) loop. + +Found by Linux Verification Center (linuxtesting.org) with SVACE. + +Signed-off-by: Alexey Khoroshilov +Fixes: 359e893e8af4 ("crypto: sun8i-ss - rework handling of IV") +Acked-by: Corentin Labbe +Tested-by: Corentin Labbe +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +index 7b3be3dc2210..d0954993e2e3 100644 +--- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c ++++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +@@ -151,6 +151,7 @@ static int sun8i_ss_setup_ivs(struct skcipher_request *areq) + while (i >= 0) { + dma_unmap_single(ss->dev, rctx->p_iv[i], ivsize, DMA_TO_DEVICE); + memzero_explicit(sf->iv[i], ivsize); ++ i--; + } + return err; + } +-- +2.35.1 + diff --git a/queue-5.10/dccp-put-dccp_qpolicy_full-and-dccp_qpolicy_push-in-.patch b/queue-5.10/dccp-put-dccp_qpolicy_full-and-dccp_qpolicy_push-in-.patch new file mode 100644 index 00000000000..958493ae6e4 --- /dev/null +++ b/queue-5.10/dccp-put-dccp_qpolicy_full-and-dccp_qpolicy_push-in-.patch @@ -0,0 +1,71 @@ +From 09e351d48ef451e47bee160e3f12e4ee15a39de4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Jul 2022 19:00:27 +0800 +Subject: dccp: put dccp_qpolicy_full() and dccp_qpolicy_push() in the same + lock + +From: Hangyu Hua + +[ Upstream commit a41b17ff9dacd22f5f118ee53d82da0f3e52d5e3 ] + +In the case of sk->dccps_qpolicy == DCCPQ_POLICY_PRIO, dccp_qpolicy_full +will drop a skb when qpolicy is full. And the lock in dccp_sendmsg is +released before sock_alloc_send_skb and then relocked after +sock_alloc_send_skb. The following conditions may lead dccp_qpolicy_push +to add skb to an already full sk_write_queue: + +thread1--->lock +thread1--->dccp_qpolicy_full: queue is full. drop a skb +thread1--->unlock +thread2--->lock +thread2--->dccp_qpolicy_full: queue is not full. no need to drop. +thread2--->unlock +thread1--->lock +thread1--->dccp_qpolicy_push: add a skb. queue is full. +thread1--->unlock +thread2--->lock +thread2--->dccp_qpolicy_push: add a skb! +thread2--->unlock + +Fix this by moving dccp_qpolicy_full. + +Fixes: b1308dc015eb ("[DCCP]: Set TX Queue Length Bounds via Sysctl") +Signed-off-by: Hangyu Hua +Link: https://lore.kernel.org/r/20220729110027.40569-1-hbh25y@gmail.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/dccp/proto.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/net/dccp/proto.c b/net/dccp/proto.c +index 548cf0135647..65e81e0199b0 100644 +--- a/net/dccp/proto.c ++++ b/net/dccp/proto.c +@@ -747,11 +747,6 @@ int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) + + lock_sock(sk); + +- if (dccp_qpolicy_full(sk)) { +- rc = -EAGAIN; +- goto out_release; +- } +- + timeo = sock_sndtimeo(sk, noblock); + + /* +@@ -770,6 +765,11 @@ int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) + if (skb == NULL) + goto out_release; + ++ if (dccp_qpolicy_full(sk)) { ++ rc = -EAGAIN; ++ goto out_discard; ++ } ++ + if (sk->sk_state == DCCP_CLOSED) { + rc = -ENOTCONN; + goto out_discard; +-- +2.35.1 + diff --git a/queue-5.10/dm-return-early-from-dm_pr_call-if-dm-device-is-susp.patch b/queue-5.10/dm-return-early-from-dm_pr_call-if-dm-device-is-susp.patch new file mode 100644 index 00000000000..e4e1b503d02 --- /dev/null +++ b/queue-5.10/dm-return-early-from-dm_pr_call-if-dm-device-is-susp.patch @@ -0,0 +1,38 @@ +From d55ce52232f13c24a5fb93c70712e2a1a33927b0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jul 2022 15:31:23 -0400 +Subject: dm: return early from dm_pr_call() if DM device is suspended + +From: Mike Snitzer + +[ Upstream commit e120a5f1e78fab6223544e425015f393d90d6f0d ] + +Otherwise PR ops may be issued while the broader DM device is being +reconfigured, etc. + +Fixes: 9c72bad1f31a ("dm: call PR reserve/unreserve on each underlying device") +Signed-off-by: Mike Snitzer +Signed-off-by: Sasha Levin +--- + drivers/md/dm.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/md/dm.c b/drivers/md/dm.c +index ab0e2338e47e..1005abf76860 100644 +--- a/drivers/md/dm.c ++++ b/drivers/md/dm.c +@@ -3003,6 +3003,11 @@ static int dm_call_pr(struct block_device *bdev, iterate_devices_callout_fn fn, + goto out; + ti = dm_table_get_target(table, 0); + ++ if (dm_suspended_md(md)) { ++ ret = -EAGAIN; ++ goto out; ++ } ++ + ret = -EINVAL; + if (!ti->type->iterate_devices) + goto out; +-- +2.35.1 + diff --git a/queue-5.10/dmaengine-dw-edma-fix-edma-rd-wr-channels-and-dma-di.patch b/queue-5.10/dmaengine-dw-edma-fix-edma-rd-wr-channels-and-dma-di.patch new file mode 100644 index 00000000000..0d3e99b390d --- /dev/null +++ b/queue-5.10/dmaengine-dw-edma-fix-edma-rd-wr-channels-and-dma-di.patch @@ -0,0 +1,100 @@ +From 733aeee37a820bee1d0451277f2024f59f5a6cf1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 May 2022 10:21:57 -0500 +Subject: dmaengine: dw-edma: Fix eDMA Rd/Wr-channels and DMA-direction + semantics + +From: Serge Semin + +[ Upstream commit c1e33979171da63cf47e56243ccb8ba82363c7d3 ] + +In accordance with [1, 2] the DW eDMA controller has been created to be +part of the DW PCIe Root Port and DW PCIe End-point controllers and to +offload the transferring of large blocks of data between application and +remote PCIe domains leaving the system CPU free for other tasks. In the +first case (eDMA being part of DW PCIe Root Port) the eDMA controller is +always accessible via the CPU DBI interface and never over the PCIe wire. + +The latter case is more complex. Depending on the DW PCIe End-Point IP-core +synthesize parameters it's possible to have the eDMA registers accessible +not only from the application CPU side, but also via mapping the eDMA CSRs +over a dedicated endpoint BAR. So based on the specifics denoted above the +eDMA driver is supposed to support two types of the DMA controller setups: + + 1) eDMA embedded into the DW PCIe Root Port/End-point and accessible over + the local CPU from the application side. + + 2) eDMA embedded into the DW PCIe End-point and accessible via the PCIe + wire with MWr/MRd TLPs generated by the CPU PCIe host controller. + +Since the CPU memory resides different sides in these cases the semantics +of the MEM_TO_DEV and DEV_TO_MEM operations is flipped with respect to the +Tx and Rx DMA channels. So MEM_TO_DEV/DEV_TO_MEM corresponds to the Tx/Rx +channels in setup 1) and to the Rx/Tx channels in case of setup 2). + +The DW eDMA driver has supported the case 2) since e63d79d1ffcd +("dmaengine: Add Synopsys eDMA IP core driver") in the framework of the +drivers/dma/dw-edma/dw-edma-pcie.c driver. + +The case 1) support was added later by bd96f1b2f43a ("dmaengine: dw-edma: +support local dma device transfer semantics"). Afterwards the driver was +supposed to cover the both possible eDMA setups, but the latter commit +turned out to be not fully correct. + +The problem was that the commit together with the new functionality support +also changed the channel direction semantics so the eDMA Read-channel +(corresponding to the DMA_DEV_TO_MEM direction for case 1) now uses the +sgl/cyclic base addresses as the Source addresses of the DMA transfers and +dma_slave_config.dst_addr as the Destination address of the DMA transfers. + +Similarly the eDMA Write-channel (corresponding to the DMA_MEM_TO_DEV +direction for case 1) now uses dma_slave_config.src_addr as a source +address of the DMA transfers and sgl/cyclic base address as the Destination +address of the DMA transfers. This contradicts the logic of the +DMA-interface, which implies that DEV side is supposed to belong to the +PCIe device memory and MEM - to the CPU/Application memory. Indeed it seems +irrational to have the SG-list defined in the PCIe bus space, while +expecting a contiguous buffer allocated in the CPU memory. Moreover the +passed SG-list and cyclic DMA buffers are supposed to be mapped in a way so +to be seen by the DW eDMA Application (CPU) interface. + +So in order to have the correct DW eDMA interface we need to invert the +eDMA Rd/Wr-channels and DMA-slave directions semantics by selecting the +src/dst addresses based on the DMA transfer direction instead of using the +channel direction capability. + +[1] DesignWare Cores PCI Express Controller Databook - DWC PCIe Root Port, + v.5.40a, March 2019, p.1092 +[2] DesignWare Cores PCI Express Controller Databook - DWC PCIe Endpoint, + v.5.40a, March 2019, p.1189 + +Co-developed-by: Manivannan Sadhasivam +Fixes: bd96f1b2f43a ("dmaengine: dw-edma: support local dma device transfer semantics") +Link: https://lore.kernel.org/r/20220524152159.2370739-7-Frank.Li@nxp.com +Tested-by: Manivannan Sadhasivam +Signed-off-by: Manivannan Sadhasivam +Signed-off-by: Serge Semin +Signed-off-by: Frank Li +Signed-off-by: Bjorn Helgaas +Acked-By: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/dma/dw-edma/dw-edma-core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-edma-core.c +index 58c8cc8fe0e1..d7ed50f8b929 100644 +--- a/drivers/dma/dw-edma/dw-edma-core.c ++++ b/drivers/dma/dw-edma/dw-edma-core.c +@@ -400,7 +400,7 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) + chunk->ll_region.sz += burst->sz; + desc->alloc_sz += burst->sz; + +- if (chan->dir == EDMA_DIR_WRITE) { ++ if (dir == DMA_DEV_TO_MEM) { + burst->sar = src_addr; + if (xfer->cyclic) { + burst->dar = xfer->xfer.cyclic.paddr; +-- +2.35.1 + diff --git a/queue-5.10/dmaengine-sf-pdma-add-multithread-support-for-a-dma-.patch b/queue-5.10/dmaengine-sf-pdma-add-multithread-support-for-a-dma-.patch new file mode 100644 index 00000000000..b3c7bd44799 --- /dev/null +++ b/queue-5.10/dmaengine-sf-pdma-add-multithread-support-for-a-dma-.patch @@ -0,0 +1,140 @@ +From 1b311ee1fcbcd9d39cff8c2a2093ca82e324ce47 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 11:29:42 +0300 +Subject: dmaengine: sf-pdma: Add multithread support for a DMA channel + +From: Viacheslav Mitrofanov + +[ Upstream commit b2cc5c465c2cb8ab697c3fd6583c614e3f6cfbcc ] + +When we get a DMA channel and try to use it in multiple threads it +will cause oops and hanging the system. + +% echo 64 > /sys/module/dmatest/parameters/threads_per_chan +% echo 10000 > /sys/module/dmatest/parameters/iterations +% echo 1 > /sys/module/dmatest/parameters/run +[ 89.480664] Unable to handle kernel NULL pointer dereference at virtual + address 00000000000000a0 +[ 89.488725] Oops [#1] +[ 89.494708] CPU: 2 PID: 1008 Comm: dma0chan0-copy0 Not tainted + 5.17.0-rc5 +[ 89.509385] epc : vchan_find_desc+0x32/0x46 +[ 89.513553] ra : sf_pdma_tx_status+0xca/0xd6 + +This happens because of data race. Each thread rewrite channels's +descriptor as soon as device_prep_dma_memcpy() is called. It leads to the +situation when the driver thinks that it uses right descriptor that +actually is freed or substituted for other one. + +With current fixes a descriptor changes its value only when it has +been used. A new descriptor is acquired from vc->desc_issued queue that +is already filled with descriptors that are ready to be sent. Threads +have no direct access to DMA channel descriptor. Now it is just possible +to queue a descriptor for further processing. + +Fixes: 6973886ad58e ("dmaengine: sf-pdma: add platform DMA support for HiFive Unleashed A00") +Signed-off-by: Viacheslav Mitrofanov +Link: https://lore.kernel.org/r/20220701082942.12835-1-v.v.mitrofanov@yadro.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/dma/sf-pdma/sf-pdma.c | 44 ++++++++++++++++++++++++----------- + 1 file changed, 30 insertions(+), 14 deletions(-) + +diff --git a/drivers/dma/sf-pdma/sf-pdma.c b/drivers/dma/sf-pdma/sf-pdma.c +index 1cd2d7df9715..5c615a8b514b 100644 +--- a/drivers/dma/sf-pdma/sf-pdma.c ++++ b/drivers/dma/sf-pdma/sf-pdma.c +@@ -52,16 +52,6 @@ static inline struct sf_pdma_desc *to_sf_pdma_desc(struct virt_dma_desc *vd) + static struct sf_pdma_desc *sf_pdma_alloc_desc(struct sf_pdma_chan *chan) + { + struct sf_pdma_desc *desc; +- unsigned long flags; +- +- spin_lock_irqsave(&chan->lock, flags); +- +- if (chan->desc && !chan->desc->in_use) { +- spin_unlock_irqrestore(&chan->lock, flags); +- return chan->desc; +- } +- +- spin_unlock_irqrestore(&chan->lock, flags); + + desc = kzalloc(sizeof(*desc), GFP_NOWAIT); + if (!desc) +@@ -111,7 +101,6 @@ sf_pdma_prep_dma_memcpy(struct dma_chan *dchan, dma_addr_t dest, dma_addr_t src, + desc->async_tx = vchan_tx_prep(&chan->vchan, &desc->vdesc, flags); + + spin_lock_irqsave(&chan->vchan.lock, iflags); +- chan->desc = desc; + sf_pdma_fill_desc(desc, dest, src, len); + spin_unlock_irqrestore(&chan->vchan.lock, iflags); + +@@ -170,11 +159,17 @@ static size_t sf_pdma_desc_residue(struct sf_pdma_chan *chan, + unsigned long flags; + u64 residue = 0; + struct sf_pdma_desc *desc; +- struct dma_async_tx_descriptor *tx; ++ struct dma_async_tx_descriptor *tx = NULL; + + spin_lock_irqsave(&chan->vchan.lock, flags); + +- tx = &chan->desc->vdesc.tx; ++ list_for_each_entry(vd, &chan->vchan.desc_submitted, node) ++ if (vd->tx.cookie == cookie) ++ tx = &vd->tx; ++ ++ if (!tx) ++ goto out; ++ + if (cookie == tx->chan->completed_cookie) + goto out; + +@@ -241,6 +236,19 @@ static void sf_pdma_enable_request(struct sf_pdma_chan *chan) + writel(v, regs->ctrl); + } + ++static struct sf_pdma_desc *sf_pdma_get_first_pending_desc(struct sf_pdma_chan *chan) ++{ ++ struct virt_dma_chan *vchan = &chan->vchan; ++ struct virt_dma_desc *vdesc; ++ ++ if (list_empty(&vchan->desc_issued)) ++ return NULL; ++ ++ vdesc = list_first_entry(&vchan->desc_issued, struct virt_dma_desc, node); ++ ++ return container_of(vdesc, struct sf_pdma_desc, vdesc); ++} ++ + static void sf_pdma_xfer_desc(struct sf_pdma_chan *chan) + { + struct sf_pdma_desc *desc = chan->desc; +@@ -268,8 +276,11 @@ static void sf_pdma_issue_pending(struct dma_chan *dchan) + + spin_lock_irqsave(&chan->vchan.lock, flags); + +- if (vchan_issue_pending(&chan->vchan) && chan->desc) ++ if (!chan->desc && vchan_issue_pending(&chan->vchan)) { ++ /* vchan_issue_pending has made a check that desc in not NULL */ ++ chan->desc = sf_pdma_get_first_pending_desc(chan); + sf_pdma_xfer_desc(chan); ++ } + + spin_unlock_irqrestore(&chan->vchan.lock, flags); + } +@@ -298,6 +309,11 @@ static void sf_pdma_donebh_tasklet(struct tasklet_struct *t) + spin_lock_irqsave(&chan->vchan.lock, flags); + list_del(&chan->desc->vdesc.node); + vchan_cookie_complete(&chan->desc->vdesc); ++ ++ chan->desc = sf_pdma_get_first_pending_desc(chan); ++ if (chan->desc) ++ sf_pdma_xfer_desc(chan); ++ + spin_unlock_irqrestore(&chan->vchan.lock, flags); + } + +-- +2.35.1 + diff --git a/queue-5.10/dmaengine-sf-pdma-apply-proper-spinlock-flags-in-sf_.patch b/queue-5.10/dmaengine-sf-pdma-apply-proper-spinlock-flags-in-sf_.patch new file mode 100644 index 00000000000..4f2892f4f32 --- /dev/null +++ b/queue-5.10/dmaengine-sf-pdma-apply-proper-spinlock-flags-in-sf_.patch @@ -0,0 +1,52 @@ +From b15e1e7218a5e933ce2efd3af83b67086a729f75 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 11 Jun 2021 07:53:36 +0100 +Subject: dmaengine: sf-pdma: apply proper spinlock flags in + sf_pdma_prep_dma_memcpy() + +From: Austin Kim + +[ Upstream commit 94b4cd7c5fc0dd6858a046b00ca729fb0512b9ba ] + +The second parameter of spinlock_irq[save/restore] function is flags, +which is the last input parameter of sf_pdma_prep_dma_memcpy(). + +So declare local variable 'iflags' to be used as the second parameter of +spinlock_irq[save/restore] function. + +Signed-off-by: Austin Kim +Link: https://lore.kernel.org/r/20210611065336.GA1121@raspberrypi +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/dma/sf-pdma/sf-pdma.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/dma/sf-pdma/sf-pdma.c b/drivers/dma/sf-pdma/sf-pdma.c +index 528deb5d9f31..1cd2d7df9715 100644 +--- a/drivers/dma/sf-pdma/sf-pdma.c ++++ b/drivers/dma/sf-pdma/sf-pdma.c +@@ -94,6 +94,7 @@ sf_pdma_prep_dma_memcpy(struct dma_chan *dchan, dma_addr_t dest, dma_addr_t src, + { + struct sf_pdma_chan *chan = to_sf_pdma_chan(dchan); + struct sf_pdma_desc *desc; ++ unsigned long iflags; + + if (chan && (!len || !dest || !src)) { + dev_err(chan->pdma->dma_dev.dev, +@@ -109,10 +110,10 @@ sf_pdma_prep_dma_memcpy(struct dma_chan *dchan, dma_addr_t dest, dma_addr_t src, + desc->dirn = DMA_MEM_TO_MEM; + desc->async_tx = vchan_tx_prep(&chan->vchan, &desc->vdesc, flags); + +- spin_lock_irqsave(&chan->vchan.lock, flags); ++ spin_lock_irqsave(&chan->vchan.lock, iflags); + chan->desc = desc; + sf_pdma_fill_desc(desc, dest, src, len); +- spin_unlock_irqrestore(&chan->vchan.lock, flags); ++ spin_unlock_irqrestore(&chan->vchan.lock, iflags); + + return desc->async_tx; + } +-- +2.35.1 + diff --git a/queue-5.10/driver-core-fix-potential-deadlock-in-__driver_attac.patch b/queue-5.10/driver-core-fix-potential-deadlock-in-__driver_attac.patch new file mode 100644 index 00000000000..7fc246c4418 --- /dev/null +++ b/queue-5.10/driver-core-fix-potential-deadlock-in-__driver_attac.patch @@ -0,0 +1,120 @@ +From 06517056f2bd35e1d51d09902ff3b2049e65b6d9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 22 Jun 2022 15:43:27 +0800 +Subject: driver core: fix potential deadlock in __driver_attach + +From: Zhang Wensheng + +[ Upstream commit 70fe758352cafdee72a7b13bf9db065f9613ced8 ] + +In __driver_attach function, There are also AA deadlock problem, +like the commit b232b02bf3c2 ("driver core: fix deadlock in +__device_attach"). + +stack like commit b232b02bf3c2 ("driver core: fix deadlock in +__device_attach"). +list below: + In __driver_attach function, The lock holding logic is as follows: + ... + __driver_attach + if (driver_allows_async_probing(drv)) + device_lock(dev) // get lock dev + async_schedule_dev(__driver_attach_async_helper, dev); // func + async_schedule_node + async_schedule_node_domain(func) + entry = kzalloc(sizeof(struct async_entry), GFP_ATOMIC); + /* when fail or work limit, sync to execute func, but + __driver_attach_async_helper will get lock dev as + will, which will lead to A-A deadlock. */ + if (!entry || atomic_read(&entry_count) > MAX_WORK) { + func; + else + queue_work_node(node, system_unbound_wq, &entry->work) + device_unlock(dev) + + As above show, when it is allowed to do async probes, because of + out of memory or work limit, async work is not be allowed, to do + sync execute instead. it will lead to A-A deadlock because of + __driver_attach_async_helper getting lock dev. + +Reproduce: +and it can be reproduce by make the condition +(if (!entry || atomic_read(&entry_count) > MAX_WORK)) untenable, like +below: + +[ 370.785650] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables +this message. +[ 370.787154] task:swapper/0 state:D stack: 0 pid: 1 ppid: +0 flags:0x00004000 +[ 370.788865] Call Trace: +[ 370.789374] +[ 370.789841] __schedule+0x482/0x1050 +[ 370.790613] schedule+0x92/0x1a0 +[ 370.791290] schedule_preempt_disabled+0x2c/0x50 +[ 370.792256] __mutex_lock.isra.0+0x757/0xec0 +[ 370.793158] __mutex_lock_slowpath+0x1f/0x30 +[ 370.794079] mutex_lock+0x50/0x60 +[ 370.794795] __device_driver_lock+0x2f/0x70 +[ 370.795677] ? driver_probe_device+0xd0/0xd0 +[ 370.796576] __driver_attach_async_helper+0x1d/0xd0 +[ 370.797318] ? driver_probe_device+0xd0/0xd0 +[ 370.797957] async_schedule_node_domain+0xa5/0xc0 +[ 370.798652] async_schedule_node+0x19/0x30 +[ 370.799243] __driver_attach+0x246/0x290 +[ 370.799828] ? driver_allows_async_probing+0xa0/0xa0 +[ 370.800548] bus_for_each_dev+0x9d/0x130 +[ 370.801132] driver_attach+0x22/0x30 +[ 370.801666] bus_add_driver+0x290/0x340 +[ 370.802246] driver_register+0x88/0x140 +[ 370.802817] ? virtio_scsi_init+0x116/0x116 +[ 370.803425] scsi_register_driver+0x1a/0x30 +[ 370.804057] init_sd+0x184/0x226 +[ 370.804533] do_one_initcall+0x71/0x3a0 +[ 370.805107] kernel_init_freeable+0x39a/0x43a +[ 370.805759] ? rest_init+0x150/0x150 +[ 370.806283] kernel_init+0x26/0x230 +[ 370.806799] ret_from_fork+0x1f/0x30 + +To fix the deadlock, move the async_schedule_dev outside device_lock, +as we can see, in async_schedule_node_domain, the parameter of +queue_work_node is system_unbound_wq, so it can accept concurrent +operations. which will also not change the code logic, and will +not lead to deadlock. + +Fixes: ef0ff68351be ("driver core: Probe devices asynchronously instead of the driver") +Signed-off-by: Zhang Wensheng +Link: https://lore.kernel.org/r/20220622074327.497102-1-zhangwensheng5@huawei.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/base/dd.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/base/dd.c b/drivers/base/dd.c +index f9d9f1ad9215..b5441741274b 100644 +--- a/drivers/base/dd.c ++++ b/drivers/base/dd.c +@@ -1056,6 +1056,7 @@ static void __driver_attach_async_helper(void *_dev, async_cookie_t cookie) + static int __driver_attach(struct device *dev, void *data) + { + struct device_driver *drv = data; ++ bool async = false; + int ret; + + /* +@@ -1093,9 +1094,11 @@ static int __driver_attach(struct device *dev, void *data) + if (!dev->driver) { + get_device(dev); + dev->p->async_driver = drv; +- async_schedule_dev(__driver_attach_async_helper, dev); ++ async = true; + } + device_unlock(dev); ++ if (async) ++ async_schedule_dev(__driver_attach_async_helper, dev); + return 0; + } + +-- +2.35.1 + diff --git a/queue-5.10/drivers-perf-arm_spe-fix-consistency-of-sys_pmscr_el.patch b/queue-5.10/drivers-perf-arm_spe-fix-consistency-of-sys_pmscr_el.patch new file mode 100644 index 00000000000..1be7689869c --- /dev/null +++ b/queue-5.10/drivers-perf-arm_spe-fix-consistency-of-sys_pmscr_el.patch @@ -0,0 +1,103 @@ +From 890e8d6b19c65efbbde8bd00af0ad245001a203f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jul 2022 11:43:02 +0530 +Subject: drivers/perf: arm_spe: Fix consistency of SYS_PMSCR_EL1.CX + +From: Anshuman Khandual + +[ Upstream commit 92f2b8bafa3d6e89c750e9d301a8b7ab76aaa8b6 ] + +The arm_spe_pmu driver will enable SYS_PMSCR_EL1.CX in order to add CONTEXT +packets into the traces, if the owner of the perf event runs with required +capabilities i.e CAP_PERFMON or CAP_SYS_ADMIN via perfmon_capable() helper. + +The value of this bit is computed in the arm_spe_event_to_pmscr() function +but the check for capabilities happens in the pmu event init callback i.e +arm_spe_pmu_event_init(). This suggests that the value of the CX bit should +remain consistent for the duration of the perf session. + +However, the function arm_spe_event_to_pmscr() may be called later during +the event start callback i.e arm_spe_pmu_start() when the "current" process +is not the owner of the perf session, hence the CX bit setting is currently +not consistent. + +One way to fix this, is by caching the required value of the CX bit during +the initialization of the PMU event, so that it remains consistent for the +duration of the session. It uses currently unused 'event->hw.flags' element +to cache perfmon_capable() value, which can be referred during event start +callback to compute SYS_PMSCR_EL1.CX. This ensures consistent availability +of context packets in the trace as per event owner capabilities. + +Drop BIT(SYS_PMSCR_EL1_CX_SHIFT) check in arm_spe_pmu_event_init(), because +now CX bit cannot be set in arm_spe_event_to_pmscr() with perfmon_capable() +disabled. + +Cc: Will Deacon +Cc: Mark Rutland +Cc: Alexey Budankov +Cc: linux-arm-kernel@lists.infradead.org +Cc: linux-kernel@vger.kernel.org +Fixes: d5d9696b0380 ("drivers/perf: Add support for ARMv8.2 Statistical Profiling Extension") +Reported-by: German Gomez +Signed-off-by: Anshuman Khandual +Reviewed-by: Suzuki K Poulose +Link: https://lore.kernel.org/r/20220714061302.2715102-1-anshuman.khandual@arm.com +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + drivers/perf/arm_spe_pmu.c | 22 ++++++++++++++++++++-- + 1 file changed, 20 insertions(+), 2 deletions(-) + +diff --git a/drivers/perf/arm_spe_pmu.c b/drivers/perf/arm_spe_pmu.c +index cc00915ad6d1..6fbfcab4918c 100644 +--- a/drivers/perf/arm_spe_pmu.c ++++ b/drivers/perf/arm_spe_pmu.c +@@ -39,6 +39,24 @@ + #include + #include + ++/* ++ * Cache if the event is allowed to trace Context information. ++ * This allows us to perform the check, i.e, perfmon_capable(), ++ * in the context of the event owner, once, during the event_init(). ++ */ ++#define SPE_PMU_HW_FLAGS_CX BIT(0) ++ ++static void set_spe_event_has_cx(struct perf_event *event) ++{ ++ if (IS_ENABLED(CONFIG_PID_IN_CONTEXTIDR) && perfmon_capable()) ++ event->hw.flags |= SPE_PMU_HW_FLAGS_CX; ++} ++ ++static bool get_spe_event_has_cx(struct perf_event *event) ++{ ++ return !!(event->hw.flags & SPE_PMU_HW_FLAGS_CX); ++} ++ + #define ARM_SPE_BUF_PAD_BYTE 0 + + struct arm_spe_pmu_buf { +@@ -274,7 +292,7 @@ static u64 arm_spe_event_to_pmscr(struct perf_event *event) + if (!attr->exclude_kernel) + reg |= BIT(SYS_PMSCR_EL1_E1SPE_SHIFT); + +- if (IS_ENABLED(CONFIG_PID_IN_CONTEXTIDR) && perfmon_capable()) ++ if (get_spe_event_has_cx(event)) + reg |= BIT(SYS_PMSCR_EL1_CX_SHIFT); + + return reg; +@@ -699,10 +717,10 @@ static int arm_spe_pmu_event_init(struct perf_event *event) + !(spe_pmu->features & SPE_PMU_FEAT_FILT_LAT)) + return -EOPNOTSUPP; + ++ set_spe_event_has_cx(event); + reg = arm_spe_event_to_pmscr(event); + if (!perfmon_capable() && + (reg & (BIT(SYS_PMSCR_EL1_PA_SHIFT) | +- BIT(SYS_PMSCR_EL1_CX_SHIFT) | + BIT(SYS_PMSCR_EL1_PCT_SHIFT)))) + return -EACCES; + +-- +2.35.1 + diff --git a/queue-5.10/drm-adv7511-override-i2c-address-of-cec-before-acces.patch b/queue-5.10/drm-adv7511-override-i2c-address-of-cec-before-acces.patch new file mode 100644 index 00000000000..ed65d1bb4ad --- /dev/null +++ b/queue-5.10/drm-adv7511-override-i2c-address-of-cec-before-acces.patch @@ -0,0 +1,63 @@ +From 4cb898a217c4fdf34db4713de8fd250f356654c9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 Jun 2022 23:31:44 +0200 +Subject: drm: adv7511: override i2c address of cec before accessing it + +From: Antonio Borneo + +[ Upstream commit 9cc4853e4781bf0dd0f35355dc92d97c9da02f5d ] + +Commit 680532c50bca ("drm: adv7511: Add support for +i2c_new_secondary_device") allows a device tree node to override +the default addresses of the secondary i2c devices. This is useful +for solving address conflicts on the i2c bus. + +In adv7511_init_cec_regmap() the new i2c address of cec device is +read from device tree and immediately accessed, well before it is +written in the proper register to override the default address. +This can cause an i2c error during probe and a consequent probe +failure. + +Once the new i2c address is read from the device tree, override +the default address before any attempt to access the cec. + +Tested with adv7533 and stm32mp157f. + +Signed-off-by: Antonio Borneo +Fixes: 680532c50bca ("drm: adv7511: Add support for i2c_new_secondary_device") +Reviewed-by: Kieran Bingham +Signed-off-by: Robert Foss +Link: https://patchwork.freedesktop.org/patch/msgid/20220607213144.427177-1-antonio.borneo@foss.st.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +index aca2f14f04c2..8bac392cab79 100644 +--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c ++++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +@@ -1063,6 +1063,10 @@ static int adv7511_init_cec_regmap(struct adv7511 *adv) + ADV7511_CEC_I2C_ADDR_DEFAULT); + if (IS_ERR(adv->i2c_cec)) + return PTR_ERR(adv->i2c_cec); ++ ++ regmap_write(adv->regmap, ADV7511_REG_CEC_I2C_ADDR, ++ adv->i2c_cec->addr << 1); ++ + i2c_set_clientdata(adv->i2c_cec, adv); + + adv->regmap_cec = devm_regmap_init_i2c(adv->i2c_cec, +@@ -1267,9 +1271,6 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id) + if (ret) + goto err_i2c_unregister_packet; + +- regmap_write(adv7511->regmap, ADV7511_REG_CEC_I2C_ADDR, +- adv7511->i2c_cec->addr << 1); +- + INIT_WORK(&adv7511->hpd_work, adv7511_hpd_work); + + if (i2c->irq) { +-- +2.35.1 + diff --git a/queue-5.10/drm-bridge-adv7511-add-check-for-mipi_dsi_driver_reg.patch b/queue-5.10/drm-bridge-adv7511-add-check-for-mipi_dsi_driver_reg.patch new file mode 100644 index 00000000000..22e8f3f9cd2 --- /dev/null +++ b/queue-5.10/drm-bridge-adv7511-add-check-for-mipi_dsi_driver_reg.patch @@ -0,0 +1,57 @@ +From 0cd4c5efd681ff5deb2dd41c7979f0b55e7af408 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Jun 2022 18:34:01 +0800 +Subject: drm: bridge: adv7511: Add check for mipi_dsi_driver_register + +From: Jiasheng Jiang + +[ Upstream commit 831463667b5f4f1e5bce9c3b94e9e794d2bc8923 ] + +As mipi_dsi_driver_register could return error if fails, +it should be better to check the return value and return error +if fails. +Moreover, if i2c_add_driver fails, mipi_dsi_driver_register +should be reverted. + +Fixes: 1e4d58cd7f88 ("drm/bridge: adv7533: Create a MIPI DSI device") +Signed-off-by: Jiasheng Jiang +Reviewed-by: Laurent Pinchart +Signed-off-by: Sam Ravnborg +Link: https://patchwork.freedesktop.org/patch/msgid/20220602103401.2980938-1-jiasheng@iscas.ac.cn +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +index 8bac392cab79..430c5e8f0388 100644 +--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c ++++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +@@ -1381,10 +1381,21 @@ static struct i2c_driver adv7511_driver = { + + static int __init adv7511_init(void) + { +- if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) +- mipi_dsi_driver_register(&adv7533_dsi_driver); ++ int ret; ++ ++ if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) { ++ ret = mipi_dsi_driver_register(&adv7533_dsi_driver); ++ if (ret) ++ return ret; ++ } + +- return i2c_add_driver(&adv7511_driver); ++ ret = i2c_add_driver(&adv7511_driver); ++ if (ret) { ++ if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) ++ mipi_dsi_driver_unregister(&adv7533_dsi_driver); ++ } ++ ++ return ret; + } + module_init(adv7511_init); + +-- +2.35.1 + diff --git a/queue-5.10/drm-bridge-sii8620-fix-possible-off-by-one.patch b/queue-5.10/drm-bridge-sii8620-fix-possible-off-by-one.patch new file mode 100644 index 00000000000..709ec5bf4ed --- /dev/null +++ b/queue-5.10/drm-bridge-sii8620-fix-possible-off-by-one.patch @@ -0,0 +1,52 @@ +From 21115eb33ffca8273a57b1012a7c4ecc8027def8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 18 May 2022 14:58:56 +0800 +Subject: drm: bridge: sii8620: fix possible off-by-one + +From: Hangyu Hua + +[ Upstream commit 21779cc21c732c5eff8ea1624be6590450baa30f ] + +The next call to sii8620_burst_get_tx_buf will result in off-by-one +When ctx->burst.tx_count + size == ARRAY_SIZE(ctx->burst.tx_buf). The same +thing happens in sii8620_burst_get_rx_buf. + +This patch also change tx_count and tx_buf to rx_count and rx_buf in +sii8620_burst_get_rx_buf. It is unreasonable to check tx_buf's size and +use rx_buf. + +Fixes: e19e9c692f81 ("drm/bridge/sii8620: add support for burst eMSC transmissions") +Signed-off-by: Hangyu Hua +Reviewed-by: Andrzej Hajda +Signed-off-by: Robert Foss +Link: https://patchwork.freedesktop.org/patch/msgid/20220518065856.18936-1-hbh25y@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/bridge/sil-sii8620.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/bridge/sil-sii8620.c b/drivers/gpu/drm/bridge/sil-sii8620.c +index ec7745c31da0..ab0bce4a988c 100644 +--- a/drivers/gpu/drm/bridge/sil-sii8620.c ++++ b/drivers/gpu/drm/bridge/sil-sii8620.c +@@ -605,7 +605,7 @@ static void *sii8620_burst_get_tx_buf(struct sii8620 *ctx, int len) + u8 *buf = &ctx->burst.tx_buf[ctx->burst.tx_count]; + int size = len + 2; + +- if (ctx->burst.tx_count + size > ARRAY_SIZE(ctx->burst.tx_buf)) { ++ if (ctx->burst.tx_count + size >= ARRAY_SIZE(ctx->burst.tx_buf)) { + dev_err(ctx->dev, "TX-BLK buffer exhausted\n"); + ctx->error = -EINVAL; + return NULL; +@@ -622,7 +622,7 @@ static u8 *sii8620_burst_get_rx_buf(struct sii8620 *ctx, int len) + u8 *buf = &ctx->burst.rx_buf[ctx->burst.rx_count]; + int size = len + 1; + +- if (ctx->burst.tx_count + size > ARRAY_SIZE(ctx->burst.tx_buf)) { ++ if (ctx->burst.rx_count + size >= ARRAY_SIZE(ctx->burst.rx_buf)) { + dev_err(ctx->dev, "RX-BLK buffer exhausted\n"); + ctx->error = -EINVAL; + return NULL; +-- +2.35.1 + diff --git a/queue-5.10/drm-bridge-tc358767-make-sure-refclk-clock-are-enabl.patch b/queue-5.10/drm-bridge-tc358767-make-sure-refclk-clock-are-enabl.patch new file mode 100644 index 00000000000..1a856c2b48b --- /dev/null +++ b/queue-5.10/drm-bridge-tc358767-make-sure-refclk-clock-are-enabl.patch @@ -0,0 +1,92 @@ +From ce2b1aeb24d0b4ad863139149865249bf1709f25 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 May 2022 14:15:43 +0200 +Subject: drm/bridge: tc358767: Make sure Refclk clock are enabled + +From: Marek Vasut + +[ Upstream commit 0b4c48f3e315d172e4cc06e10f2c8ba180788baf ] + +The Refclk may be supplied by SoC clock output instead of crystal +oscillator, make sure the clock are enabled before any other action +is performed with the bridge chip, otherwise it may either fail to +operate at all, or miss reset GPIO toggle. + +Reviewed-by: Lucas Stach +Fixes: 7caff0fc4296e ("drm/bridge: tc358767: Add DPI to eDP bridge driver") +Signed-off-by: Marek Vasut +Cc: Jonas Karlman +Cc: Laurent Pinchart +Cc: Lucas Stach +Cc: Marek Vasut +Cc: Maxime Ripard +Cc: Neil Armstrong +Cc: Robert Foss +Cc: Sam Ravnborg +Reviewed-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20220520121543.11550-1-marex@denx.de +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/bridge/tc358767.c | 32 ++++++++++++++++++++++++------- + 1 file changed, 25 insertions(+), 7 deletions(-) + +diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c +index 9af564cf92e5..3e365cd7d0a3 100644 +--- a/drivers/gpu/drm/bridge/tc358767.c ++++ b/drivers/gpu/drm/bridge/tc358767.c +@@ -1562,6 +1562,13 @@ static int tc_probe_edp_bridge_endpoint(struct tc_data *tc) + return ret; + } + ++static void tc_clk_disable(void *data) ++{ ++ struct clk *refclk = data; ++ ++ clk_disable_unprepare(refclk); ++} ++ + static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id) + { + struct device *dev = &client->dev; +@@ -1578,6 +1585,24 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id) + if (ret) + return ret; + ++ tc->refclk = devm_clk_get(dev, "ref"); ++ if (IS_ERR(tc->refclk)) { ++ ret = PTR_ERR(tc->refclk); ++ dev_err(dev, "Failed to get refclk: %d\n", ret); ++ return ret; ++ } ++ ++ ret = clk_prepare_enable(tc->refclk); ++ if (ret) ++ return ret; ++ ++ ret = devm_add_action_or_reset(dev, tc_clk_disable, tc->refclk); ++ if (ret) ++ return ret; ++ ++ /* tRSTW = 100 cycles , at 13 MHz that is ~7.69 us */ ++ usleep_range(10, 15); ++ + /* Shut down GPIO is optional */ + tc->sd_gpio = devm_gpiod_get_optional(dev, "shutdown", GPIOD_OUT_HIGH); + if (IS_ERR(tc->sd_gpio)) +@@ -1598,13 +1623,6 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id) + usleep_range(5000, 10000); + } + +- tc->refclk = devm_clk_get(dev, "ref"); +- if (IS_ERR(tc->refclk)) { +- ret = PTR_ERR(tc->refclk); +- dev_err(dev, "Failed to get refclk: %d\n", ret); +- return ret; +- } +- + tc->regmap = devm_regmap_init_i2c(client, &tc_regmap_config); + if (IS_ERR(tc->regmap)) { + ret = PTR_ERR(tc->regmap); +-- +2.35.1 + diff --git a/queue-5.10/drm-bridge-tc358767-move-e-dp-bridge-endpoint-parsin.patch b/queue-5.10/drm-bridge-tc358767-move-e-dp-bridge-endpoint-parsin.patch new file mode 100644 index 00000000000..6ac8b642bdf --- /dev/null +++ b/queue-5.10/drm-bridge-tc358767-move-e-dp-bridge-endpoint-parsin.patch @@ -0,0 +1,87 @@ +From fb0488eabf8575cf64ea395cc481ab6bf076bdc0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 29 Mar 2022 10:50:10 +0200 +Subject: drm/bridge: tc358767: Move (e)DP bridge endpoint parsing into + dedicated function + +From: Marek Vasut + +[ Upstream commit 8478095a8c4bcea3c83b0767d6c9127434160761 ] + +The TC358767/TC358867/TC9595 are all capable of operating in multiple +modes, DPI-to-(e)DP, DSI-to-(e)DP, DSI-to-DPI. Only the first mode is +currently supported. In order to support the rest of the modes without +making the tc_probe() overly long, split the bridge endpoint parsing +into dedicated function, where the necessary logic to detect the bridge +mode based on which endpoints are connected, can be implemented. + +Reviewed-by: Lucas Stach +Tested-by: Lucas Stach # In both DPI to eDP and DSI to DPI mode. +Signed-off-by: Marek Vasut +Cc: Jonas Karlman +Cc: Laurent Pinchart +Cc: Maxime Ripard +Cc: Neil Armstrong +Cc: Sam Ravnborg +Signed-off-by: Robert Foss +Link: https://patchwork.freedesktop.org/patch/msgid/20220329085015.39159-7-marex@denx.de +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/bridge/tc358767.c | 30 +++++++++++++++++++++--------- + 1 file changed, 21 insertions(+), 9 deletions(-) + +diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c +index 34a3e4e9f717..9af564cf92e5 100644 +--- a/drivers/gpu/drm/bridge/tc358767.c ++++ b/drivers/gpu/drm/bridge/tc358767.c +@@ -1535,19 +1535,12 @@ static irqreturn_t tc_irq_handler(int irq, void *arg) + return IRQ_HANDLED; + } + +-static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id) ++static int tc_probe_edp_bridge_endpoint(struct tc_data *tc) + { +- struct device *dev = &client->dev; ++ struct device *dev = tc->dev; + struct drm_panel *panel; +- struct tc_data *tc; + int ret; + +- tc = devm_kzalloc(dev, sizeof(*tc), GFP_KERNEL); +- if (!tc) +- return -ENOMEM; +- +- tc->dev = dev; +- + /* port@2 is the output port */ + ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &panel, NULL); + if (ret && ret != -ENODEV) +@@ -1566,6 +1559,25 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id) + tc->bridge.type = DRM_MODE_CONNECTOR_DisplayPort; + } + ++ return ret; ++} ++ ++static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id) ++{ ++ struct device *dev = &client->dev; ++ struct tc_data *tc; ++ int ret; ++ ++ tc = devm_kzalloc(dev, sizeof(*tc), GFP_KERNEL); ++ if (!tc) ++ return -ENOMEM; ++ ++ tc->dev = dev; ++ ++ ret = tc_probe_edp_bridge_endpoint(tc); ++ if (ret) ++ return ret; ++ + /* Shut down GPIO is optional */ + tc->sd_gpio = devm_gpiod_get_optional(dev, "shutdown", GPIOD_OUT_HIGH); + if (IS_ERR(tc->sd_gpio)) +-- +2.35.1 + diff --git a/queue-5.10/drm-exynos-exynos7_drm_decon-free-resources-when-clk.patch b/queue-5.10/drm-exynos-exynos7_drm_decon-free-resources-when-clk.patch new file mode 100644 index 00000000000..0f9e7bec6bd --- /dev/null +++ b/queue-5.10/drm-exynos-exynos7_drm_decon-free-resources-when-clk.patch @@ -0,0 +1,75 @@ +From 87722378f66eaf4f8bb744969439dbe520a68ad7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Jul 2022 13:56:11 +0900 +Subject: drm/exynos/exynos7_drm_decon: free resources when clk_set_parent() + failed. + +From: Jian Zhang + +[ Upstream commit 48b927770f8ad3f8cf4a024a552abf272af9f592 ] + +In exynos7_decon_resume, When it fails, we must use clk_disable_unprepare() +to free resource that have been used. + +Fixes: 6f83d20838c09 ("drm/exynos: use DRM_DEV_ERROR to print out error +message") +Reported-by: Hulk Robot +Signed-off-by: Jian Zhang +Signed-off-by: Inki Dae +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/exynos/exynos7_drm_decon.c | 17 +++++++++++++---- + 1 file changed, 13 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c +index f2d87a7445c7..1c04c232dce1 100644 +--- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c ++++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c +@@ -800,31 +800,40 @@ static int exynos7_decon_resume(struct device *dev) + if (ret < 0) { + DRM_DEV_ERROR(dev, "Failed to prepare_enable the pclk [%d]\n", + ret); +- return ret; ++ goto err_pclk_enable; + } + + ret = clk_prepare_enable(ctx->aclk); + if (ret < 0) { + DRM_DEV_ERROR(dev, "Failed to prepare_enable the aclk [%d]\n", + ret); +- return ret; ++ goto err_aclk_enable; + } + + ret = clk_prepare_enable(ctx->eclk); + if (ret < 0) { + DRM_DEV_ERROR(dev, "Failed to prepare_enable the eclk [%d]\n", + ret); +- return ret; ++ goto err_eclk_enable; + } + + ret = clk_prepare_enable(ctx->vclk); + if (ret < 0) { + DRM_DEV_ERROR(dev, "Failed to prepare_enable the vclk [%d]\n", + ret); +- return ret; ++ goto err_vclk_enable; + } + + return 0; ++ ++err_vclk_enable: ++ clk_disable_unprepare(ctx->eclk); ++err_eclk_enable: ++ clk_disable_unprepare(ctx->aclk); ++err_aclk_enable: ++ clk_disable_unprepare(ctx->pclk); ++err_pclk_enable: ++ return ret; + } + #endif + +-- +2.35.1 + diff --git a/queue-5.10/drm-mcde-fix-refcount-leak-in-mcde_dsi_bind.patch b/queue-5.10/drm-mcde-fix-refcount-leak-in-mcde_dsi_bind.patch new file mode 100644 index 00000000000..c7fb584a785 --- /dev/null +++ b/queue-5.10/drm-mcde-fix-refcount-leak-in-mcde_dsi_bind.patch @@ -0,0 +1,38 @@ +From 9968a84d5e75b51a97591f73f348dea0237512ce Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 25 May 2022 15:54:11 +0400 +Subject: drm/mcde: Fix refcount leak in mcde_dsi_bind + +From: Miaoqian Lin + +[ Upstream commit 3a149169e4a2f9127022fec6ef5d71b4e804b3b9 ] + +Every iteration of for_each_available_child_of_node() decrements +the reference counter of the previous node. There is no decrement +when break out from the loop and results in refcount leak. +Add missing of_node_put() to fix this. + +Fixes: 5fc537bfd000 ("drm/mcde: Add new driver for ST-Ericsson MCDE") +Signed-off-by: Miaoqian Lin +Signed-off-by: Linus Walleij +Link: https://patchwork.freedesktop.org/patch/msgid/20220525115411.65455-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/mcde/mcde_dsi.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/gpu/drm/mcde/mcde_dsi.c b/drivers/gpu/drm/mcde/mcde_dsi.c +index 5275b2723293..64e6fb806290 100644 +--- a/drivers/gpu/drm/mcde/mcde_dsi.c ++++ b/drivers/gpu/drm/mcde/mcde_dsi.c +@@ -1118,6 +1118,7 @@ static int mcde_dsi_bind(struct device *dev, struct device *master, + bridge = of_drm_find_bridge(child); + if (!bridge) { + dev_err(dev, "failed to find bridge\n"); ++ of_node_put(child); + return -EINVAL; + } + } +-- +2.35.1 + diff --git a/queue-5.10/drm-mediatek-add-pull-down-mipi-operation-in-mtk_dsi.patch b/queue-5.10/drm-mediatek-add-pull-down-mipi-operation-in-mtk_dsi.patch new file mode 100644 index 00000000000..c1f4b7a8d38 --- /dev/null +++ b/queue-5.10/drm-mediatek-add-pull-down-mipi-operation-in-mtk_dsi.patch @@ -0,0 +1,49 @@ +From 4fd2c34a1c0644c3a6495d67a98dfe4d9a227cca Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 May 2022 10:00:07 +0800 +Subject: drm/mediatek: Add pull-down MIPI operation in mtk_dsi_poweroff + function + +From: Xinlei Lee + +[ Upstream commit fa5d0a0205c34734c5b8daa77e39ac2817f63a10 ] + +In the dsi_enable function, mtk_dsi_rxtx_control is to +pull up the MIPI signal operation. Before dsi_disable, +MIPI should also be pulled down by writing a register +instead of disabling dsi. + +If disable dsi without pulling the mipi signal low, the value of +the register will still maintain the setting of the mipi signal being +pulled high. +After resume, even if the mipi signal is not pulled high, it will still +be in the high state. + +Fixes: 2e54c14e310f ("drm/mediatek: Add DSI sub driver") + +Link: https://patchwork.kernel.org/project/linux-mediatek/patch/1653012007-11854-5-git-send-email-xinlei.lee@mediatek.com/ +Signed-off-by: Jitao Shi +Signed-off-by: Xinlei Lee +Reviewed-by: Rex-BC Chen +Signed-off-by: Chun-Kuang Hu +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/mediatek/mtk_dsi.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c +index 1b13e429e9d9..f39785934999 100644 +--- a/drivers/gpu/drm/mediatek/mtk_dsi.c ++++ b/drivers/gpu/drm/mediatek/mtk_dsi.c +@@ -677,6 +677,8 @@ static void mtk_dsi_poweroff(struct mtk_dsi *dsi) + mtk_dsi_reset_engine(dsi); + mtk_dsi_lane0_ulp_mode_enter(dsi); + mtk_dsi_clk_ulp_mode_enter(dsi); ++ /* set the lane number as 0 to pull down mipi */ ++ writel(0, dsi->regs + DSI_TXRX_CTRL); + + mtk_dsi_disable(dsi); + +-- +2.35.1 + diff --git a/queue-5.10/drm-mediatek-dpi-only-enable-dpi-after-the-bridge-is.patch b/queue-5.10/drm-mediatek-dpi-only-enable-dpi-after-the-bridge-is.patch new file mode 100644 index 00000000000..1e2b7a6bac2 --- /dev/null +++ b/queue-5.10/drm-mediatek-dpi-only-enable-dpi-after-the-bridge-is.patch @@ -0,0 +1,48 @@ +From 84df5295f8ee2babd6bad88e00e5ae4a83ef9a1e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 11:58:44 +0800 +Subject: drm/mediatek: dpi: Only enable dpi after the bridge is enabled + +From: Guillaume Ranquet + +[ Upstream commit aed61ef6beb911cc043af0f2f291167663995065 ] + +Enabling the dpi too early causes glitches on screen. + +Move the call to mtk_dpi_enable() at the end of the bridge_enable +callback to ensure everything is setup properly before enabling dpi. + +Fixes: 9e629c17aa8d ("drm/mediatek: Add DPI sub driver") +Signed-off-by: Guillaume Ranquet +Signed-off-by: Bo-Chen Chen +Tested-by: AngeloGioacchino Del Regno +Link: https://patchwork.kernel.org/project/linux-mediatek/patch/20220701035845.16458-16-rex-bc.chen@mediatek.com/ +Signed-off-by: Chun-Kuang Hu +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/mediatek/mtk_dpi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c +index 554ad60af4e9..c1ae336df683 100644 +--- a/drivers/gpu/drm/mediatek/mtk_dpi.c ++++ b/drivers/gpu/drm/mediatek/mtk_dpi.c +@@ -397,7 +397,6 @@ static int mtk_dpi_power_on(struct mtk_dpi *dpi) + if (dpi->pinctrl && dpi->pins_dpi) + pinctrl_select_state(dpi->pinctrl, dpi->pins_dpi); + +- mtk_dpi_enable(dpi); + return 0; + + err_pixel: +@@ -534,6 +533,7 @@ static void mtk_dpi_bridge_enable(struct drm_bridge *bridge) + + mtk_dpi_power_on(dpi); + mtk_dpi_set_display_mode(dpi, &dpi->mode); ++ mtk_dpi_enable(dpi); + } + + static const struct drm_bridge_funcs mtk_dpi_bridge_funcs = { +-- +2.35.1 + diff --git a/queue-5.10/drm-mediatek-dpi-remove-output-format-of-yuv.patch b/queue-5.10/drm-mediatek-dpi-remove-output-format-of-yuv.patch new file mode 100644 index 00000000000..9bcc4832eb2 --- /dev/null +++ b/queue-5.10/drm-mediatek-dpi-remove-output-format-of-yuv.patch @@ -0,0 +1,73 @@ +From 523529e5c90c9d1cf65b9266151805136fc35712 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 11:58:33 +0800 +Subject: drm/mediatek: dpi: Remove output format of YUV + +From: Bo-Chen Chen + +[ Upstream commit c9ed0713b3c35fc45677707ba47f432cad95da56 ] + +DPI is not support output format as YUV, but there is the setting of +configuring output YUV. Therefore, remove them in this patch. + +Fixes: 9e629c17aa8d ("drm/mediatek: Add DPI sub driver") +Signed-off-by: Bo-Chen Chen +Link: https://patchwork.kernel.org/project/linux-mediatek/patch/20220701035845.16458-5-rex-bc.chen@mediatek.com/ +Signed-off-by: Chun-Kuang Hu +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/mediatek/mtk_dpi.c | 31 ++++++------------------------ + 1 file changed, 6 insertions(+), 25 deletions(-) + +diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c +index 52f11a63a330..554ad60af4e9 100644 +--- a/drivers/gpu/drm/mediatek/mtk_dpi.c ++++ b/drivers/gpu/drm/mediatek/mtk_dpi.c +@@ -52,13 +52,7 @@ enum mtk_dpi_out_channel_swap { + }; + + enum mtk_dpi_out_color_format { +- MTK_DPI_COLOR_FORMAT_RGB, +- MTK_DPI_COLOR_FORMAT_RGB_FULL, +- MTK_DPI_COLOR_FORMAT_YCBCR_444, +- MTK_DPI_COLOR_FORMAT_YCBCR_422, +- MTK_DPI_COLOR_FORMAT_XV_YCC, +- MTK_DPI_COLOR_FORMAT_YCBCR_444_FULL, +- MTK_DPI_COLOR_FORMAT_YCBCR_422_FULL ++ MTK_DPI_COLOR_FORMAT_RGB + }; + + struct mtk_dpi { +@@ -358,24 +352,11 @@ static void mtk_dpi_config_disable_edge(struct mtk_dpi *dpi) + static void mtk_dpi_config_color_format(struct mtk_dpi *dpi, + enum mtk_dpi_out_color_format format) + { +- if ((format == MTK_DPI_COLOR_FORMAT_YCBCR_444) || +- (format == MTK_DPI_COLOR_FORMAT_YCBCR_444_FULL)) { +- mtk_dpi_config_yuv422_enable(dpi, false); +- mtk_dpi_config_csc_enable(dpi, true); +- mtk_dpi_config_swap_input(dpi, false); +- mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_BGR); +- } else if ((format == MTK_DPI_COLOR_FORMAT_YCBCR_422) || +- (format == MTK_DPI_COLOR_FORMAT_YCBCR_422_FULL)) { +- mtk_dpi_config_yuv422_enable(dpi, true); +- mtk_dpi_config_csc_enable(dpi, true); +- mtk_dpi_config_swap_input(dpi, true); +- mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_RGB); +- } else { +- mtk_dpi_config_yuv422_enable(dpi, false); +- mtk_dpi_config_csc_enable(dpi, false); +- mtk_dpi_config_swap_input(dpi, false); +- mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_RGB); +- } ++ /* only support RGB888 */ ++ mtk_dpi_config_yuv422_enable(dpi, false); ++ mtk_dpi_config_csc_enable(dpi, false); ++ mtk_dpi_config_swap_input(dpi, false); ++ mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_RGB); + } + + static void mtk_dpi_power_off(struct mtk_dpi *dpi) +-- +2.35.1 + diff --git a/queue-5.10/drm-mediatek-modify-dsi-funcs-to-atomic-operations.patch b/queue-5.10/drm-mediatek-modify-dsi-funcs-to-atomic-operations.patch new file mode 100644 index 00000000000..9652575d260 --- /dev/null +++ b/queue-5.10/drm-mediatek-modify-dsi-funcs-to-atomic-operations.patch @@ -0,0 +1,59 @@ +From 33c4010076745b5ee6c4eebe523f51119907c4a0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 May 2022 10:00:04 +0800 +Subject: drm/mediatek: Modify dsi funcs to atomic operations + +From: Xinlei Lee + +[ Upstream commit 7f6335c6a258edf4d5ff1b904bc033188dc7b48b ] + +Because .enable & .disable are deprecated. +Use .atomic_enable & .atomic_disable instead. + +Link: https://patchwork.kernel.org/project/linux-mediatek/patch/1653012007-11854-2-git-send-email-xinlei.lee@mediatek.com/ +Signed-off-by: Jitao Shi +Signed-off-by: Xinlei Lee +Reviewed-by: Rex-BC Chen +Signed-off-by: Chun-Kuang Hu +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/mediatek/mtk_dsi.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c +index 65fd99c528af..2c09b43705ef 100644 +--- a/drivers/gpu/drm/mediatek/mtk_dsi.c ++++ b/drivers/gpu/drm/mediatek/mtk_dsi.c +@@ -746,14 +746,16 @@ static void mtk_dsi_bridge_mode_set(struct drm_bridge *bridge, + drm_display_mode_to_videomode(adjusted, &dsi->vm); + } + +-static void mtk_dsi_bridge_disable(struct drm_bridge *bridge) ++static void mtk_dsi_bridge_atomic_disable(struct drm_bridge *bridge, ++ struct drm_bridge_state *old_bridge_state) + { + struct mtk_dsi *dsi = bridge_to_dsi(bridge); + + mtk_output_dsi_disable(dsi); + } + +-static void mtk_dsi_bridge_enable(struct drm_bridge *bridge) ++static void mtk_dsi_bridge_atomic_enable(struct drm_bridge *bridge, ++ struct drm_bridge_state *old_bridge_state) + { + struct mtk_dsi *dsi = bridge_to_dsi(bridge); + +@@ -762,8 +764,8 @@ static void mtk_dsi_bridge_enable(struct drm_bridge *bridge) + + static const struct drm_bridge_funcs mtk_dsi_bridge_funcs = { + .attach = mtk_dsi_bridge_attach, +- .disable = mtk_dsi_bridge_disable, +- .enable = mtk_dsi_bridge_enable, ++ .atomic_disable = mtk_dsi_bridge_atomic_disable, ++ .atomic_enable = mtk_dsi_bridge_atomic_enable, + .mode_set = mtk_dsi_bridge_mode_set, + }; + +-- +2.35.1 + diff --git a/queue-5.10/drm-mediatek-separate-poweron-poweroff-from-enable-d.patch b/queue-5.10/drm-mediatek-separate-poweron-poweroff-from-enable-d.patch new file mode 100644 index 00000000000..0bfc5ee9d8a --- /dev/null +++ b/queue-5.10/drm-mediatek-separate-poweron-poweroff-from-enable-d.patch @@ -0,0 +1,130 @@ +From a2623a07bbabea74f85403c2a4fb1dd52c7d37d1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 May 2022 10:00:05 +0800 +Subject: drm/mediatek: Separate poweron/poweroff from enable/disable and + define new funcs + +From: Jitao Shi + +[ Upstream commit cde7e2e35c2866d22a3a012e72a41052dfcc255d ] + +In order to match the changes of "Use the drm_panel_bridge API", +the poweron/poweroff of dsi is extracted from enable/disable and +defined as new funcs (atomic_pre_enable/atomic_post_disable). + +Since dsi_poweron is moved from dsi_enable to pre_enable function, in +order to avoid poweron failure, the operation of dsi register fails to +cause bus hang. Therefore, the protection mechanism is added to the +dsi_enable function. + +Fixes: 2dd8075d2185 ("drm/mediatek: mtk_dsi: Use the drm_panel_bridge API") + +Link: https://patchwork.kernel.org/project/linux-mediatek/patch/1653012007-11854-3-git-send-email-xinlei.lee@mediatek.com/ +Signed-off-by: Jitao Shi +Signed-off-by: Xinlei Lee +Reviewed-by: AngeloGioacchino Del Regno +Reviewed-by: Rex-BC Chen +Signed-off-by: Chun-Kuang Hu +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/mediatek/mtk_dsi.c | 53 +++++++++++++++++++----------- + 1 file changed, 34 insertions(+), 19 deletions(-) + +diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c +index 2c09b43705ef..1b13e429e9d9 100644 +--- a/drivers/gpu/drm/mediatek/mtk_dsi.c ++++ b/drivers/gpu/drm/mediatek/mtk_dsi.c +@@ -674,16 +674,6 @@ static void mtk_dsi_poweroff(struct mtk_dsi *dsi) + if (--dsi->refcount != 0) + return; + +- /* +- * mtk_dsi_stop() and mtk_dsi_start() is asymmetric, since +- * mtk_dsi_stop() should be called after mtk_drm_crtc_atomic_disable(), +- * which needs irq for vblank, and mtk_dsi_stop() will disable irq. +- * mtk_dsi_start() needs to be called in mtk_output_dsi_enable(), +- * after dsi is fully set. +- */ +- mtk_dsi_stop(dsi); +- +- mtk_dsi_switch_to_cmd_mode(dsi, VM_DONE_INT_FLAG, 500); + mtk_dsi_reset_engine(dsi); + mtk_dsi_lane0_ulp_mode_enter(dsi); + mtk_dsi_clk_ulp_mode_enter(dsi); +@@ -698,17 +688,9 @@ static void mtk_dsi_poweroff(struct mtk_dsi *dsi) + + static void mtk_output_dsi_enable(struct mtk_dsi *dsi) + { +- int ret; +- + if (dsi->enabled) + return; + +- ret = mtk_dsi_poweron(dsi); +- if (ret < 0) { +- DRM_ERROR("failed to power on dsi\n"); +- return; +- } +- + mtk_dsi_set_mode(dsi); + mtk_dsi_clk_hs_mode(dsi, 1); + +@@ -722,7 +704,16 @@ static void mtk_output_dsi_disable(struct mtk_dsi *dsi) + if (!dsi->enabled) + return; + +- mtk_dsi_poweroff(dsi); ++ /* ++ * mtk_dsi_stop() and mtk_dsi_start() is asymmetric, since ++ * mtk_dsi_stop() should be called after mtk_drm_crtc_atomic_disable(), ++ * which needs irq for vblank, and mtk_dsi_stop() will disable irq. ++ * mtk_dsi_start() needs to be called in mtk_output_dsi_enable(), ++ * after dsi is fully set. ++ */ ++ mtk_dsi_stop(dsi); ++ ++ mtk_dsi_switch_to_cmd_mode(dsi, VM_DONE_INT_FLAG, 500); + + dsi->enabled = false; + } +@@ -759,13 +750,37 @@ static void mtk_dsi_bridge_atomic_enable(struct drm_bridge *bridge, + { + struct mtk_dsi *dsi = bridge_to_dsi(bridge); + ++ if (dsi->refcount == 0) ++ return; ++ + mtk_output_dsi_enable(dsi); + } + ++static void mtk_dsi_bridge_atomic_pre_enable(struct drm_bridge *bridge, ++ struct drm_bridge_state *old_bridge_state) ++{ ++ struct mtk_dsi *dsi = bridge_to_dsi(bridge); ++ int ret; ++ ++ ret = mtk_dsi_poweron(dsi); ++ if (ret < 0) ++ DRM_ERROR("failed to power on dsi\n"); ++} ++ ++static void mtk_dsi_bridge_atomic_post_disable(struct drm_bridge *bridge, ++ struct drm_bridge_state *old_bridge_state) ++{ ++ struct mtk_dsi *dsi = bridge_to_dsi(bridge); ++ ++ mtk_dsi_poweroff(dsi); ++} ++ + static const struct drm_bridge_funcs mtk_dsi_bridge_funcs = { + .attach = mtk_dsi_bridge_attach, + .atomic_disable = mtk_dsi_bridge_atomic_disable, + .atomic_enable = mtk_dsi_bridge_atomic_enable, ++ .atomic_pre_enable = mtk_dsi_bridge_atomic_pre_enable, ++ .atomic_post_disable = mtk_dsi_bridge_atomic_post_disable, + .mode_set = mtk_dsi_bridge_mode_set, + }; + +-- +2.35.1 + diff --git a/queue-5.10/drm-mipi-dbi-align-max_chunk-to-2-in-spi_transfer.patch b/queue-5.10/drm-mipi-dbi-align-max_chunk-to-2-in-spi_transfer.patch new file mode 100644 index 00000000000..f8644a97c11 --- /dev/null +++ b/queue-5.10/drm-mipi-dbi-align-max_chunk-to-2-in-spi_transfer.patch @@ -0,0 +1,51 @@ +From b135a42205f361977f19a833132f08a147411766 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 10 May 2022 11:02:19 +0800 +Subject: drm/mipi-dbi: align max_chunk to 2 in spi_transfer +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Yunhao Tian + +[ Upstream commit 435c249008cba04ed6a7975e9411f3b934620204 ] + +In __spi_validate, there's a validation that no partial transfers +are accepted (xfer->len % w_size must be zero). When +max_chunk is not a multiple of bpw (e.g. max_chunk = 65535, +bpw = 16), the transfer will be rejected. + +This patch aligns max_chunk to 2 bytes (the maximum value of bpw is 16), +so that no partial transfer will occur. + +Fixes: d23d4d4dac01 ("drm/tinydrm: Move tinydrm_spi_transfer()") + +Signed-off-by: Yunhao Tian +Signed-off-by: Noralf Trønnes +Link: https://patchwork.freedesktop.org/patch/msgid/20220510030219.2486687-1-t123yh.xyz@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/drm_mipi_dbi.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/gpu/drm/drm_mipi_dbi.c b/drivers/gpu/drm/drm_mipi_dbi.c +index 230c4fd7131c..9f132229aed1 100644 +--- a/drivers/gpu/drm/drm_mipi_dbi.c ++++ b/drivers/gpu/drm/drm_mipi_dbi.c +@@ -1137,6 +1137,13 @@ int mipi_dbi_spi_transfer(struct spi_device *spi, u32 speed_hz, + size_t chunk; + int ret; + ++ /* In __spi_validate, there's a validation that no partial transfers ++ * are accepted (xfer->len % w_size must be zero). ++ * Here we align max_chunk to multiple of 2 (16bits), ++ * to prevent transfers from being rejected. ++ */ ++ max_chunk = ALIGN_DOWN(max_chunk, 2); ++ + spi_message_init_with_transfers(&m, &tr, 1); + + while (len) { +-- +2.35.1 + diff --git a/queue-5.10/drm-msm-hdmi-enable-core-vcc-core-vdda-supply-for-89.patch b/queue-5.10/drm-msm-hdmi-enable-core-vcc-core-vdda-supply-for-89.patch new file mode 100644 index 00000000000..bd8891babeb --- /dev/null +++ b/queue-5.10/drm-msm-hdmi-enable-core-vcc-core-vdda-supply-for-89.patch @@ -0,0 +1,40 @@ +From a7ca16c9f4afcf5ef31a1f4848eb55ebb8d65d12 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Jun 2022 15:23:43 +0300 +Subject: drm/msm/hdmi: enable core-vcc/core-vdda-supply for 8996 platform + +From: Dmitry Baryshkov + +[ Upstream commit 1f88301794595ff4c28a1f1befe690e8dbac72a2 ] + +DB820c makes use of core-vcc-supply and core-vdda-supply, however the +driver code doesn't support these regulators. Enable them for HDMI on +8996 platform. + +Fixes: 0afbe59edd3f ("drm/msm/hdmi: Add basic HDMI support for msm8996") +Signed-off-by: Dmitry Baryshkov +Reviewed-by: Stephen Boyd +Patchwork: https://patchwork.freedesktop.org/patch/488857/ +Link: https://lore.kernel.org/r/20220609122350.3157529-8-dmitry.baryshkov@linaro.org +Signed-off-by: Dmitry Baryshkov +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/msm/hdmi/hdmi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c +index 28b33b35a30c..3d397f331f32 100644 +--- a/drivers/gpu/drm/msm/hdmi/hdmi.c ++++ b/drivers/gpu/drm/msm/hdmi/hdmi.c +@@ -411,7 +411,7 @@ static struct hdmi_platform_config hdmi_tx_8994_config = { + }; + + static struct hdmi_platform_config hdmi_tx_8996_config = { +- HDMI_CFG(pwr_reg, none), ++ HDMI_CFG(pwr_reg, 8x74), + HDMI_CFG(hpd_reg, none), + HDMI_CFG(pwr_clk, 8x74), + HDMI_CFG(hpd_clk, 8x74), +-- +2.35.1 + diff --git a/queue-5.10/drm-msm-mdp5-fix-global-state-lock-backoff.patch b/queue-5.10/drm-msm-mdp5-fix-global-state-lock-backoff.patch new file mode 100644 index 00000000000..05edffc0f42 --- /dev/null +++ b/queue-5.10/drm-msm-mdp5-fix-global-state-lock-backoff.patch @@ -0,0 +1,85 @@ +From 2c16c1b45c7a2c3cd0de3834a1d10d6a40ac4da7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jul 2022 09:20:37 -0700 +Subject: drm/msm/mdp5: Fix global state lock backoff + +From: Rob Clark + +[ Upstream commit 92ef86ab513593c6329d04146e61f9a670e72fc5 ] + +We need to grab the lock after the early return for !hwpipe case. +Otherwise, we could have hit contention yet still returned 0. + +Fixes an issue that the new CONFIG_DRM_DEBUG_MODESET_LOCK stuff flagged +in CI: + + WARNING: CPU: 0 PID: 282 at drivers/gpu/drm/drm_modeset_lock.c:296 drm_modeset_lock+0xf8/0x154 + Modules linked in: + CPU: 0 PID: 282 Comm: kms_cursor_lega Tainted: G W 5.19.0-rc2-15930-g875cc8bc536a #1 + Hardware name: Qualcomm Technologies, Inc. DB820c (DT) + pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) + pc : drm_modeset_lock+0xf8/0x154 + lr : drm_atomic_get_private_obj_state+0x84/0x170 + sp : ffff80000cfab6a0 + x29: ffff80000cfab6a0 x28: 0000000000000000 x27: ffff000083bc4d00 + x26: 0000000000000038 x25: 0000000000000000 x24: ffff80000957ca58 + x23: 0000000000000000 x22: ffff000081ace080 x21: 0000000000000001 + x20: ffff000081acec18 x19: ffff80000cfabb80 x18: 0000000000000038 + x17: 0000000000000000 x16: 0000000000000000 x15: fffffffffffea0d0 + x14: 0000000000000000 x13: 284e4f5f4e524157 x12: 5f534b434f4c5f47 + x11: ffff80000a386aa8 x10: 0000000000000029 x9 : ffff80000cfab610 + x8 : 0000000000000029 x7 : 0000000000000014 x6 : 0000000000000000 + x5 : 0000000000000001 x4 : ffff8000081ad904 x3 : 0000000000000029 + x2 : ffff0000801db4c0 x1 : ffff80000cfabb80 x0 : ffff000081aceb58 + Call trace: + drm_modeset_lock+0xf8/0x154 + drm_atomic_get_private_obj_state+0x84/0x170 + mdp5_get_global_state+0x54/0x6c + mdp5_pipe_release+0x2c/0xd4 + mdp5_plane_atomic_check+0x2ec/0x414 + drm_atomic_helper_check_planes+0xd8/0x210 + drm_atomic_helper_check+0x54/0xb0 + ... + ---[ end trace 0000000000000000 ]--- + drm_modeset_lock attempting to lock a contended lock without backoff: + drm_modeset_lock+0x148/0x154 + mdp5_get_global_state+0x30/0x6c + mdp5_pipe_release+0x2c/0xd4 + mdp5_plane_atomic_check+0x290/0x414 + drm_atomic_helper_check_planes+0xd8/0x210 + drm_atomic_helper_check+0x54/0xb0 + drm_atomic_check_only+0x4b0/0x8f4 + drm_atomic_commit+0x68/0xe0 + +Fixes: d59be579fa93 ("drm/msm/mdp5: Return error code in mdp5_pipe_release when deadlock is detected") +Signed-off-by: Rob Clark +Reviewed-by: Abhinav Kumar +Patchwork: https://patchwork.freedesktop.org/patch/492701/ +Link: https://lore.kernel.org/r/20220707162040.1594855-1-robdclark@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c +index a4f5cb90f3e8..e4b8a789835a 100644 +--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c ++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c +@@ -123,12 +123,13 @@ int mdp5_pipe_release(struct drm_atomic_state *s, struct mdp5_hw_pipe *hwpipe) + { + struct msm_drm_private *priv = s->dev->dev_private; + struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms)); +- struct mdp5_global_state *state = mdp5_get_global_state(s); ++ struct mdp5_global_state *state; + struct mdp5_hw_pipe_state *new_state; + + if (!hwpipe) + return 0; + ++ state = mdp5_get_global_state(s); + if (IS_ERR(state)) + return PTR_ERR(state); + +-- +2.35.1 + diff --git a/queue-5.10/drm-radeon-fix-incorrrect-spdx-license-identifiers.patch b/queue-5.10/drm-radeon-fix-incorrrect-spdx-license-identifiers.patch new file mode 100644 index 00000000000..d95c7532d40 --- /dev/null +++ b/queue-5.10/drm-radeon-fix-incorrrect-spdx-license-identifiers.patch @@ -0,0 +1,65 @@ +From 2c6396665c4ea7bc37b5141a9f9f5dbe9b6d10bc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 Jun 2022 12:02:08 -0400 +Subject: drm/radeon: fix incorrrect SPDX-License-Identifiers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Alex Deucher + +[ Upstream commit 1f43b8903f3aae4a26a603c36f6d5dd25d6edb51 ] + +radeon is MIT. This were incorrectly changed in +commit b24413180f56 ("License cleanup: add SPDX GPL-2.0 license identifier to files with no license") +and +commit d198b34f3855 (".gitignore: add SPDX License Identifier") +and: +commit ec8f24b7faaf ("treewide: Add SPDX license identifier - Makefile/Kconfig") + +Fixes: d198b34f3855 (".gitignore: add SPDX License Identifier") +Fixes: ec8f24b7faaf ("treewide: Add SPDX license identifier - Makefile/Kconfig") +Fixes: b24413180f56 ("License cleanup: add SPDX GPL-2.0 license identifier to files with no license") +Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/2053 +Reviewed-by: Christian König +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/radeon/.gitignore | 2 +- + drivers/gpu/drm/radeon/Kconfig | 2 +- + drivers/gpu/drm/radeon/Makefile | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/radeon/.gitignore b/drivers/gpu/drm/radeon/.gitignore +index 9c1a94153983..d8777383a64a 100644 +--- a/drivers/gpu/drm/radeon/.gitignore ++++ b/drivers/gpu/drm/radeon/.gitignore +@@ -1,4 +1,4 @@ +-# SPDX-License-Identifier: GPL-2.0-only ++# SPDX-License-Identifier: MIT + mkregtable + *_reg_safe.h + +diff --git a/drivers/gpu/drm/radeon/Kconfig b/drivers/gpu/drm/radeon/Kconfig +index 6f60f4840cc5..52819e7f1fca 100644 +--- a/drivers/gpu/drm/radeon/Kconfig ++++ b/drivers/gpu/drm/radeon/Kconfig +@@ -1,4 +1,4 @@ +-# SPDX-License-Identifier: GPL-2.0-only ++# SPDX-License-Identifier: MIT + config DRM_RADEON_USERPTR + bool "Always enable userptr support" + depends on DRM_RADEON +diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile +index 11c97edde54d..3d502f1bbfcb 100644 +--- a/drivers/gpu/drm/radeon/Makefile ++++ b/drivers/gpu/drm/radeon/Makefile +@@ -1,4 +1,4 @@ +-# SPDX-License-Identifier: GPL-2.0 ++# SPDX-License-Identifier: MIT + # + # Makefile for the drm device driver. This driver provides support for the + # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. +-- +2.35.1 + diff --git a/queue-5.10/drm-radeon-fix-potential-buffer-overflow-in-ni_set_m.patch b/queue-5.10/drm-radeon-fix-potential-buffer-overflow-in-ni_set_m.patch new file mode 100644 index 00000000000..6bf6c9e2751 --- /dev/null +++ b/queue-5.10/drm-radeon-fix-potential-buffer-overflow-in-ni_set_m.patch @@ -0,0 +1,61 @@ +From fac190b900eadf0cd0f80dc75452cf7da38d71e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Jun 2022 16:50:54 +0300 +Subject: drm/radeon: fix potential buffer overflow in + ni_set_mc_special_registers() + +From: Alexey Kodanev + +[ Upstream commit 136f614931a2bb73616b292cf542da3a18daefd5 ] + +The last case label can write two buffers 'mc_reg_address[j]' and +'mc_data[j]' with 'j' offset equal to SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE +since there are no checks for this value in both case labels after the +last 'j++'. + +Instead of changing '>' to '>=' there, add the bounds check at the start +of the second 'case' (the first one already has it). + +Also, remove redundant last checks for 'j' index bigger than array size. +The expression is always false. Moreover, before or after the patch +'table->last' can be equal to SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE and it +seems it can be a valid value. + +Detected using the static analysis tool - Svace. +Fixes: 69e0b57a91ad ("drm/radeon/kms: add dpm support for cayman (v5)") +Signed-off-by: Alexey Kodanev +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/radeon/ni_dpm.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c +index 59cdadcece15..a5218747742b 100644 +--- a/drivers/gpu/drm/radeon/ni_dpm.c ++++ b/drivers/gpu/drm/radeon/ni_dpm.c +@@ -2740,10 +2740,10 @@ static int ni_set_mc_special_registers(struct radeon_device *rdev, + table->mc_reg_table_entry[k].mc_data[j] |= 0x100; + } + j++; +- if (j > SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE) +- return -EINVAL; + break; + case MC_SEQ_RESERVE_M >> 2: ++ if (j >= SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE) ++ return -EINVAL; + temp_reg = RREG32(MC_PMG_CMD_MRS1); + table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS1 >> 2; + table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS1_LP >> 2; +@@ -2752,8 +2752,6 @@ static int ni_set_mc_special_registers(struct radeon_device *rdev, + (temp_reg & 0xffff0000) | + (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff); + j++; +- if (j > SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE) +- return -EINVAL; + break; + default: + break; +-- +2.35.1 + diff --git a/queue-5.10/drm-rockchip-fix-an-error-handling-path-rockchip_dp_.patch b/queue-5.10/drm-rockchip-fix-an-error-handling-path-rockchip_dp_.patch new file mode 100644 index 00000000000..429b61313c8 --- /dev/null +++ b/queue-5.10/drm-rockchip-fix-an-error-handling-path-rockchip_dp_.patch @@ -0,0 +1,45 @@ +From 77e45b68143846d00d663ec8c759d4eb982324d6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 18 Jun 2022 19:08:05 +0200 +Subject: drm/rockchip: Fix an error handling path rockchip_dp_probe() + +From: Christophe JAILLET + +[ Upstream commit 5074376822fe99fa4ce344b851c5016d00c0444f ] + +Should component_add() fail, we should call analogix_dp_remove() in the +error handling path, as already done in the remove function. + +Fixes: 152cce0006ab ("drm/bridge: analogix_dp: Split bind() into probe() and real bind()") +Signed-off-by: Christophe JAILLET +Signed-off-by: Heiko Stuebner +Link: https://patchwork.freedesktop.org/patch/msgid/b719d9061bb97eb85145fbd3c5e63f4549f2e13e.1655572071.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +index ade2327a10e2..512581698a1e 100644 +--- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c ++++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +@@ -398,7 +398,15 @@ static int rockchip_dp_probe(struct platform_device *pdev) + if (IS_ERR(dp->adp)) + return PTR_ERR(dp->adp); + +- return component_add(dev, &rockchip_dp_component_ops); ++ ret = component_add(dev, &rockchip_dp_component_ops); ++ if (ret) ++ goto err_dp_remove; ++ ++ return 0; ++ ++err_dp_remove: ++ analogix_dp_remove(dp->adp); ++ return ret; + } + + static int rockchip_dp_remove(struct platform_device *pdev) +-- +2.35.1 + diff --git a/queue-5.10/drm-rockchip-vop-don-t-crash-for-invalid-duplicate_s.patch b/queue-5.10/drm-rockchip-vop-don-t-crash-for-invalid-duplicate_s.patch new file mode 100644 index 00000000000..7241e5a648e --- /dev/null +++ b/queue-5.10/drm-rockchip-vop-don-t-crash-for-invalid-duplicate_s.patch @@ -0,0 +1,42 @@ +From 108a6bd5b8ee2f76b98978b2850c905ec5c651d9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 Jun 2022 17:26:52 -0700 +Subject: drm/rockchip: vop: Don't crash for invalid duplicate_state() + +From: Brian Norris + +[ Upstream commit 1449110b0dade8b638d2c17ab7c5b0ff696bfccb ] + +It's possible for users to try to duplicate the CRTC state even when the +state doesn't exist. drm_atomic_helper_crtc_duplicate_state() (and other +users of __drm_atomic_helper_crtc_duplicate_state()) already guard this +with a WARN_ON() instead of crashing, so let's do that here too. + +Fixes: 4e257d9eee23 ("drm/rockchip: get rid of rockchip_drm_crtc_mode_config") +Signed-off-by: Brian Norris +Reviewed-by: Sean Paul +Reviewed-by: Douglas Anderson +Signed-off-by: Heiko Stuebner +Link: https://patchwork.freedesktop.org/patch/msgid/20220617172623.1.I62db228170b1559ada60b8d3e1637e1688424926@changeid +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +index 91568f166a8a..af98bfcde518 100644 +--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c ++++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +@@ -1530,6 +1530,9 @@ static struct drm_crtc_state *vop_crtc_duplicate_state(struct drm_crtc *crtc) + { + struct rockchip_crtc_state *rockchip_state; + ++ if (WARN_ON(!crtc->state)) ++ return NULL; ++ + rockchip_state = kzalloc(sizeof(*rockchip_state), GFP_KERNEL); + if (!rockchip_state) + return NULL; +-- +2.35.1 + diff --git a/queue-5.10/drm-st7735r-fix-module-autoloading-for-okaya-rh12812.patch b/queue-5.10/drm-st7735r-fix-module-autoloading-for-okaya-rh12812.patch new file mode 100644 index 00000000000..3fabefffea7 --- /dev/null +++ b/queue-5.10/drm-st7735r-fix-module-autoloading-for-okaya-rh12812.patch @@ -0,0 +1,51 @@ +From 2fda24183d0a3cd496ecd142df39d6a5bca9a179 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 May 2022 11:16:02 +0200 +Subject: drm/st7735r: Fix module autoloading for Okaya RH128128T + +From: Javier Martinez Canillas + +[ Upstream commit 9ad6f181ad9a19a26bda73a7b199df44ccfcdaba ] + +The SPI core always reports a "MODALIAS=spi:", even if the device was +registered via OF. This means that the st7735r.ko module won't autoload if +a DT has a node with a compatible "okaya,rh128128t" string. + +In that case, kmod expects a "MODALIAS=of:N*T*Cokaya,rh128128t" uevent but +instead will get a "MODALIAS=spi:rh128128t", which is not present in the +list of aliases: + + $ modinfo drivers/gpu/drm/tiny/st7735r.ko | grep alias + alias: of:N*T*Cokaya,rh128128tC* + alias: of:N*T*Cokaya,rh128128t + alias: of:N*T*Cjianda,jd-t18003-t01C* + alias: of:N*T*Cjianda,jd-t18003-t01 + alias: spi:jd-t18003-t01 + +To workaround this issue, add in the SPI table an entry for that device. + +Fixes: d1d511d516f7 ("drm: tiny: st7735r: Add support for Okaya RH128128T") +Signed-off-by: Javier Martinez Canillas +Reviewed-by: Geert Uytterhoeven +Acked-by: David Lechner +Link: https://patchwork.freedesktop.org/patch/msgid/20220520091602.179078-1-javierm@redhat.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/tiny/st7735r.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/gpu/drm/tiny/st7735r.c b/drivers/gpu/drm/tiny/st7735r.c +index c0bc2a18edde..9d0c127bdb0c 100644 +--- a/drivers/gpu/drm/tiny/st7735r.c ++++ b/drivers/gpu/drm/tiny/st7735r.c +@@ -175,6 +175,7 @@ MODULE_DEVICE_TABLE(of, st7735r_of_match); + + static const struct spi_device_id st7735r_id[] = { + { "jd-t18003-t01", (uintptr_t)&jd_t18003_t01_cfg }, ++ { "rh128128t", (uintptr_t)&rh128128t_cfg }, + { }, + }; + MODULE_DEVICE_TABLE(spi, st7735r_id); +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-drv-remove-the-dsi-pointer-in-vc4_drv.patch b/queue-5.10/drm-vc4-drv-remove-the-dsi-pointer-in-vc4_drv.patch new file mode 100644 index 00000000000..3dce84ae0b9 --- /dev/null +++ b/queue-5.10/drm-vc4-drv-remove-the-dsi-pointer-in-vc4_drv.patch @@ -0,0 +1,76 @@ +From ef6c2ddc9c6d7fe392d566341bfe195186bfcf94 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Dec 2020 14:25:36 +0100 +Subject: drm/vc4: drv: Remove the DSI pointer in vc4_drv + +From: Maxime Ripard + +[ Upstream commit 51f4fcd9c4ea867c3b4fe58111f342ad0e80642a ] + +That pointer isn't used anywhere, so there's no point in keeping it. + +Reviewed-by: Dave Stevenson +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20201203132543.861591-2-maxime@cerno.tech +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_drv.h | 1 - + drivers/gpu/drm/vc4/vc4_dsi.c | 9 --------- + 2 files changed, 10 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h +index 9809c3a856c6..921463625d82 100644 +--- a/drivers/gpu/drm/vc4/vc4_drv.h ++++ b/drivers/gpu/drm/vc4/vc4_drv.h +@@ -77,7 +77,6 @@ struct vc4_dev { + struct vc4_hvs *hvs; + struct vc4_v3d *v3d; + struct vc4_dpi *dpi; +- struct vc4_dsi *dsi1; + struct vc4_vec *vec; + struct vc4_txp *txp; + +diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c +index 153ad9048db5..6222e4058c85 100644 +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -1449,7 +1449,6 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + { + struct platform_device *pdev = to_platform_device(dev); + struct drm_device *drm = dev_get_drvdata(master); +- struct vc4_dev *vc4 = to_vc4_dev(drm); + struct vc4_dsi *dsi = dev_get_drvdata(dev); + struct vc4_dsi_encoder *vc4_dsi_encoder; + struct drm_panel *panel; +@@ -1602,9 +1601,6 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + if (ret) + return ret; + +- if (dsi->port == 1) +- vc4->dsi1 = dsi; +- + drm_simple_encoder_init(drm, dsi->encoder, DRM_MODE_ENCODER_DSI); + drm_encoder_helper_add(dsi->encoder, &vc4_dsi_encoder_helper_funcs); + +@@ -1633,8 +1629,6 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + static void vc4_dsi_unbind(struct device *dev, struct device *master, + void *data) + { +- struct drm_device *drm = dev_get_drvdata(master); +- struct vc4_dev *vc4 = to_vc4_dev(drm); + struct vc4_dsi *dsi = dev_get_drvdata(dev); + + if (dsi->bridge) +@@ -1646,9 +1640,6 @@ static void vc4_dsi_unbind(struct device *dev, struct device *master, + */ + list_splice_init(&dsi->bridge_chain, &dsi->encoder->bridge_chain); + drm_encoder_cleanup(dsi->encoder); +- +- if (dsi->port == 1) +- vc4->dsi1 = NULL; + } + + static const struct component_ops vc4_dsi_ops = { +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-dsi-add-correct-stop-condition-to-vc4_dsi_en.patch b/queue-5.10/drm-vc4-dsi-add-correct-stop-condition-to-vc4_dsi_en.patch new file mode 100644 index 00000000000..ac994165242 --- /dev/null +++ b/queue-5.10/drm-vc4-dsi-add-correct-stop-condition-to-vc4_dsi_en.patch @@ -0,0 +1,43 @@ +From f6b13e059637e99a9dea163c8b538ca25988c0c4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 16:47:43 +0200 +Subject: drm/vc4: dsi: Add correct stop condition to vc4_dsi_encoder_disable + iteration + +From: Dave Stevenson + +[ Upstream commit 7bcb9c8d0bc9f3cab8ac2634b056c2e6b63945ca ] + +vc4_dsi_encoder_disable is partially an open coded version of +drm_bridge_chain_disable, but it missed a termination condition +in the loop for ->disable which meant that no post_disable +calls were made. + +Add in the termination clause. + +Fixes: 033bfe7538a1 ("drm/vc4: dsi: Fix bridge chain handling") +Signed-off-by: Dave Stevenson +Link: https://lore.kernel.org/r/20220613144800.326124-17-maxime@cerno.tech +Signed-off-by: Maxime Ripard +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c +index 43e86f0b5541..0bda40c2d787 100644 +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -803,6 +803,9 @@ static void vc4_dsi_encoder_disable(struct drm_encoder *encoder) + list_for_each_entry_reverse(iter, &dsi->bridge_chain, chain_node) { + if (iter->funcs->disable) + iter->funcs->disable(iter); ++ ++ if (iter == dsi->bridge) ++ break; + } + + vc4_dsi_ulps(dsi, true); +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-dsi-correct-dsi-divider-calculations.patch b/queue-5.10/drm-vc4-dsi-correct-dsi-divider-calculations.patch new file mode 100644 index 00000000000..899133d3874 --- /dev/null +++ b/queue-5.10/drm-vc4-dsi-correct-dsi-divider-calculations.patch @@ -0,0 +1,51 @@ +From 13a680d6f8225436b094664a0d41cd932170c84d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 16:47:39 +0200 +Subject: drm/vc4: dsi: Correct DSI divider calculations + +From: Dave Stevenson + +[ Upstream commit 3b45eee87da171caa28f61240ddb5c21170cda53 ] + +The divider calculations tried to find the divider just faster than the +clock requested. However if it required a divider of 7 then the for loop +aborted without handling the "error" case, and could end up with a clock +lower than requested. + +The integer divider from parent PLL to DSI clock is also capable of +going up to /255, not just /7 that the driver was trying. This allows +for slower link frequencies on the DSI bus where the resolution permits. + +Correct the loop so that we always have a clock greater than requested, +and covering the whole range of dividers. + +Fixes: 86c1b9eff3f2 ("drm/vc4: Adjust modes in DSI to work around the integer PLL divider.") +Signed-off-by: Dave Stevenson +Link: https://lore.kernel.org/r/20220613144800.326124-13-maxime@cerno.tech +Signed-off-by: Maxime Ripard +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c +index ad84b56f4091..153ad9048db5 100644 +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -794,11 +794,9 @@ static bool vc4_dsi_encoder_mode_fixup(struct drm_encoder *encoder, + /* Find what divider gets us a faster clock than the requested + * pixel clock. + */ +- for (divider = 1; divider < 8; divider++) { +- if (parent_rate / divider < pll_clock) { +- divider--; ++ for (divider = 1; divider < 255; divider++) { ++ if (parent_rate / (divider + 1) < pll_clock) + break; +- } + } + + /* Now that we've picked a PLL divider, calculate back to its +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-dsi-correct-pixel-order-for-dsi0.patch b/queue-5.10/drm-vc4-dsi-correct-pixel-order-for-dsi0.patch new file mode 100644 index 00000000000..0b5d95d7f56 --- /dev/null +++ b/queue-5.10/drm-vc4-dsi-correct-pixel-order-for-dsi0.patch @@ -0,0 +1,40 @@ +From e11e8e25d6f733cb2cf3ab23efd7d79854c051d2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 16:47:40 +0200 +Subject: drm/vc4: dsi: Correct pixel order for DSI0 + +From: Dave Stevenson + +[ Upstream commit edfe84ae0df16be1251b5a8e840d95f1f3827500 ] + +For slightly unknown reasons, dsi0 takes a different pixel format +to dsi1, and that has to be set in the pixel valve. + +Amend the setup accordingly. + +Fixes: a86773d120d7 ("drm/vc4: Add support for feeding DSI encoders from the pixel valve.") +Signed-off-by: Dave Stevenson +Link: https://lore.kernel.org/r/20220613144800.326124-14-maxime@cerno.tech +Signed-off-by: Maxime Ripard +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_crtc.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c +index f4ccca922e44..f4e64db07d4e 100644 +--- a/drivers/gpu/drm/vc4/vc4_crtc.c ++++ b/drivers/gpu/drm/vc4/vc4_crtc.c +@@ -319,7 +319,8 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc) + u32 pixel_rep = (mode->flags & DRM_MODE_FLAG_DBLCLK) ? 2 : 1; + bool is_dsi = (vc4_encoder->type == VC4_ENCODER_TYPE_DSI0 || + vc4_encoder->type == VC4_ENCODER_TYPE_DSI1); +- u32 format = is_dsi ? PV_CONTROL_FORMAT_DSIV_24 : PV_CONTROL_FORMAT_24; ++ bool is_dsi1 = vc4_encoder->type == VC4_ENCODER_TYPE_DSI1; ++ u32 format = is_dsi1 ? PV_CONTROL_FORMAT_DSIV_24 : PV_CONTROL_FORMAT_24; + u8 ppc = pv_data->pixels_per_clock; + bool debug_dump_regs = false; + +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-dsi-fix-dsi0-interrupt-support.patch b/queue-5.10/drm-vc4-dsi-fix-dsi0-interrupt-support.patch new file mode 100644 index 00000000000..5b7f8086386 --- /dev/null +++ b/queue-5.10/drm-vc4-dsi-fix-dsi0-interrupt-support.patch @@ -0,0 +1,201 @@ +From 3500f8b092ea0ffaaedda74a19fcc9e477334460 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 16:47:42 +0200 +Subject: drm/vc4: dsi: Fix dsi0 interrupt support + +From: Dave Stevenson + +[ Upstream commit bc5b815e06f90cccdb6461aba1e49fdc2f3c8cd1 ] + +DSI0 seemingly had very little or no testing as a load of +the register mappings were incorrect/missing, so host +transfers always timed out due to enabling/checking incorrect +bits in the interrupt enable and status registers. + +Fixes: 4078f5757144 ("drm/vc4: Add DSI driver") +Signed-off-by: Dave Stevenson +Link: https://lore.kernel.org/r/20220613144800.326124-16-maxime@cerno.tech +Signed-off-by: Maxime Ripard +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 111 ++++++++++++++++++++++++++-------- + 1 file changed, 85 insertions(+), 26 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c +index 8e2d5c4237ae..43e86f0b5541 100644 +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -181,8 +181,50 @@ + + #define DSI0_TXPKT_PIX_FIFO 0x20 /* AKA PIX_FIFO */ + +-#define DSI0_INT_STAT 0x24 +-#define DSI0_INT_EN 0x28 ++#define DSI0_INT_STAT 0x24 ++#define DSI0_INT_EN 0x28 ++# define DSI0_INT_FIFO_ERR BIT(25) ++# define DSI0_INT_CMDC_DONE_MASK VC4_MASK(24, 23) ++# define DSI0_INT_CMDC_DONE_SHIFT 23 ++# define DSI0_INT_CMDC_DONE_NO_REPEAT 1 ++# define DSI0_INT_CMDC_DONE_REPEAT 3 ++# define DSI0_INT_PHY_DIR_RTF BIT(22) ++# define DSI0_INT_PHY_D1_ULPS BIT(21) ++# define DSI0_INT_PHY_D1_STOP BIT(20) ++# define DSI0_INT_PHY_RXLPDT BIT(19) ++# define DSI0_INT_PHY_RXTRIG BIT(18) ++# define DSI0_INT_PHY_D0_ULPS BIT(17) ++# define DSI0_INT_PHY_D0_LPDT BIT(16) ++# define DSI0_INT_PHY_D0_FTR BIT(15) ++# define DSI0_INT_PHY_D0_STOP BIT(14) ++/* Signaled when the clock lane enters the given state. */ ++# define DSI0_INT_PHY_CLK_ULPS BIT(13) ++# define DSI0_INT_PHY_CLK_HS BIT(12) ++# define DSI0_INT_PHY_CLK_FTR BIT(11) ++/* Signaled on timeouts */ ++# define DSI0_INT_PR_TO BIT(10) ++# define DSI0_INT_TA_TO BIT(9) ++# define DSI0_INT_LPRX_TO BIT(8) ++# define DSI0_INT_HSTX_TO BIT(7) ++/* Contention on a line when trying to drive the line low */ ++# define DSI0_INT_ERR_CONT_LP1 BIT(6) ++# define DSI0_INT_ERR_CONT_LP0 BIT(5) ++/* Control error: incorrect line state sequence on data lane 0. */ ++# define DSI0_INT_ERR_CONTROL BIT(4) ++# define DSI0_INT_ERR_SYNC_ESC BIT(3) ++# define DSI0_INT_RX2_PKT BIT(2) ++# define DSI0_INT_RX1_PKT BIT(1) ++# define DSI0_INT_CMD_PKT BIT(0) ++ ++#define DSI0_INTERRUPTS_ALWAYS_ENABLED (DSI0_INT_ERR_SYNC_ESC | \ ++ DSI0_INT_ERR_CONTROL | \ ++ DSI0_INT_ERR_CONT_LP0 | \ ++ DSI0_INT_ERR_CONT_LP1 | \ ++ DSI0_INT_HSTX_TO | \ ++ DSI0_INT_LPRX_TO | \ ++ DSI0_INT_TA_TO | \ ++ DSI0_INT_PR_TO) ++ + # define DSI1_INT_PHY_D3_ULPS BIT(30) + # define DSI1_INT_PHY_D3_STOP BIT(29) + # define DSI1_INT_PHY_D2_ULPS BIT(28) +@@ -892,6 +934,9 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) + + DSI_PORT_WRITE(PHY_AFEC0, afec0); + ++ /* AFEC reset hold time */ ++ mdelay(1); ++ + DSI_PORT_WRITE(PHY_AFEC1, + VC4_SET_FIELD(6, DSI0_PHY_AFEC1_IDR_DLANE1) | + VC4_SET_FIELD(6, DSI0_PHY_AFEC1_IDR_DLANE0) | +@@ -1058,12 +1103,9 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) + DSI_PORT_WRITE(CTRL, DSI_PORT_READ(CTRL) | DSI1_CTRL_EN); + + /* Bring AFE out of reset. */ +- if (dsi->variant->port == 0) { +- } else { +- DSI_PORT_WRITE(PHY_AFEC0, +- DSI_PORT_READ(PHY_AFEC0) & +- ~DSI1_PHY_AFEC0_RESET); +- } ++ DSI_PORT_WRITE(PHY_AFEC0, ++ DSI_PORT_READ(PHY_AFEC0) & ++ ~DSI_PORT_BIT(PHY_AFEC0_RESET)); + + vc4_dsi_ulps(dsi, false); + +@@ -1182,13 +1224,28 @@ static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host, + /* Enable the appropriate interrupt for the transfer completion. */ + dsi->xfer_result = 0; + reinit_completion(&dsi->xfer_completion); +- DSI_PORT_WRITE(INT_STAT, DSI1_INT_TXPKT1_DONE | DSI1_INT_PHY_DIR_RTF); +- if (msg->rx_len) { +- DSI_PORT_WRITE(INT_EN, (DSI1_INTERRUPTS_ALWAYS_ENABLED | +- DSI1_INT_PHY_DIR_RTF)); ++ if (dsi->variant->port == 0) { ++ DSI_PORT_WRITE(INT_STAT, ++ DSI0_INT_CMDC_DONE_MASK | DSI1_INT_PHY_DIR_RTF); ++ if (msg->rx_len) { ++ DSI_PORT_WRITE(INT_EN, (DSI0_INTERRUPTS_ALWAYS_ENABLED | ++ DSI0_INT_PHY_DIR_RTF)); ++ } else { ++ DSI_PORT_WRITE(INT_EN, ++ (DSI0_INTERRUPTS_ALWAYS_ENABLED | ++ VC4_SET_FIELD(DSI0_INT_CMDC_DONE_NO_REPEAT, ++ DSI0_INT_CMDC_DONE))); ++ } + } else { +- DSI_PORT_WRITE(INT_EN, (DSI1_INTERRUPTS_ALWAYS_ENABLED | +- DSI1_INT_TXPKT1_DONE)); ++ DSI_PORT_WRITE(INT_STAT, ++ DSI1_INT_TXPKT1_DONE | DSI1_INT_PHY_DIR_RTF); ++ if (msg->rx_len) { ++ DSI_PORT_WRITE(INT_EN, (DSI1_INTERRUPTS_ALWAYS_ENABLED | ++ DSI1_INT_PHY_DIR_RTF)); ++ } else { ++ DSI_PORT_WRITE(INT_EN, (DSI1_INTERRUPTS_ALWAYS_ENABLED | ++ DSI1_INT_TXPKT1_DONE)); ++ } + } + + /* Send the packet. */ +@@ -1205,7 +1262,7 @@ static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host, + ret = dsi->xfer_result; + } + +- DSI_PORT_WRITE(INT_EN, DSI1_INTERRUPTS_ALWAYS_ENABLED); ++ DSI_PORT_WRITE(INT_EN, DSI_PORT_BIT(INTERRUPTS_ALWAYS_ENABLED)); + + if (ret) + goto reset_fifo_and_return; +@@ -1251,7 +1308,7 @@ static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host, + DSI_PORT_BIT(CTRL_RESET_FIFOS)); + + DSI_PORT_WRITE(TXPKT1C, 0); +- DSI_PORT_WRITE(INT_EN, DSI1_INTERRUPTS_ALWAYS_ENABLED); ++ DSI_PORT_WRITE(INT_EN, DSI_PORT_BIT(INTERRUPTS_ALWAYS_ENABLED)); + return ret; + } + +@@ -1368,26 +1425,28 @@ static irqreturn_t vc4_dsi_irq_handler(int irq, void *data) + DSI_PORT_WRITE(INT_STAT, stat); + + dsi_handle_error(dsi, &ret, stat, +- DSI1_INT_ERR_SYNC_ESC, "LPDT sync"); ++ DSI_PORT_BIT(INT_ERR_SYNC_ESC), "LPDT sync"); + dsi_handle_error(dsi, &ret, stat, +- DSI1_INT_ERR_CONTROL, "data lane 0 sequence"); ++ DSI_PORT_BIT(INT_ERR_CONTROL), "data lane 0 sequence"); + dsi_handle_error(dsi, &ret, stat, +- DSI1_INT_ERR_CONT_LP0, "LP0 contention"); ++ DSI_PORT_BIT(INT_ERR_CONT_LP0), "LP0 contention"); + dsi_handle_error(dsi, &ret, stat, +- DSI1_INT_ERR_CONT_LP1, "LP1 contention"); ++ DSI_PORT_BIT(INT_ERR_CONT_LP1), "LP1 contention"); + dsi_handle_error(dsi, &ret, stat, +- DSI1_INT_HSTX_TO, "HSTX timeout"); ++ DSI_PORT_BIT(INT_HSTX_TO), "HSTX timeout"); + dsi_handle_error(dsi, &ret, stat, +- DSI1_INT_LPRX_TO, "LPRX timeout"); ++ DSI_PORT_BIT(INT_LPRX_TO), "LPRX timeout"); + dsi_handle_error(dsi, &ret, stat, +- DSI1_INT_TA_TO, "turnaround timeout"); ++ DSI_PORT_BIT(INT_TA_TO), "turnaround timeout"); + dsi_handle_error(dsi, &ret, stat, +- DSI1_INT_PR_TO, "peripheral reset timeout"); ++ DSI_PORT_BIT(INT_PR_TO), "peripheral reset timeout"); + +- if (stat & (DSI1_INT_TXPKT1_DONE | DSI1_INT_PHY_DIR_RTF)) { ++ if (stat & ((dsi->variant->port ? DSI1_INT_TXPKT1_DONE : ++ DSI0_INT_CMDC_DONE_MASK) | ++ DSI_PORT_BIT(INT_PHY_DIR_RTF))) { + complete(&dsi->xfer_completion); + ret = IRQ_HANDLED; +- } else if (stat & DSI1_INT_HSTX_TO) { ++ } else if (stat & DSI_PORT_BIT(INT_HSTX_TO)) { + complete(&dsi->xfer_completion); + dsi->xfer_result = -ETIMEDOUT; + ret = IRQ_HANDLED; +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-dsi-introduce-a-variant-structure.patch b/queue-5.10/drm-vc4-dsi-introduce-a-variant-structure.patch new file mode 100644 index 00000000000..513fc37dc3b --- /dev/null +++ b/queue-5.10/drm-vc4-dsi-introduce-a-variant-structure.patch @@ -0,0 +1,199 @@ +From d20fd46188d61c99ee8397f8929bbf43dc3f81b2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Dec 2020 14:25:39 +0100 +Subject: drm/vc4: dsi: Introduce a variant structure + +From: Maxime Ripard + +[ Upstream commit d1d195ce26a14ec0a87816c09ae514e1c40e97f7 ] + +Most of the differences between DSI0 and DSI1 are handled through the +ID. However, the BCM2711 DSI is going to introduce one more variable to +the mix and will break some expectations of the earlier, simpler, test. + +Let's add a variant structure that will address most of the differences +between those three controllers. + +Reviewed-by: Dave Stevenson +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20201203132543.861591-5-maxime@cerno.tech +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 63 ++++++++++++++++++++--------------- + 1 file changed, 37 insertions(+), 26 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c +index 80cd2599c57b..2cedf1cf6758 100644 +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -493,6 +493,18 @@ + */ + #define DSI1_ID 0x8c + ++struct vc4_dsi_variant { ++ /* Whether we're on bcm2835's DSI0 or DSI1. */ ++ unsigned int port; ++ ++ bool broken_axi_workaround; ++ ++ const char *debugfs_name; ++ const struct debugfs_reg32 *regs; ++ size_t nregs; ++ ++}; ++ + /* General DSI hardware state. */ + struct vc4_dsi { + struct platform_device *pdev; +@@ -509,8 +521,7 @@ struct vc4_dsi { + u32 *reg_dma_mem; + dma_addr_t reg_paddr; + +- /* Whether we're on bcm2835's DSI0 or DSI1. */ +- int port; ++ const struct vc4_dsi_variant *variant; + + /* DSI channel for the panel we're connected to. */ + u32 channel; +@@ -586,10 +597,10 @@ dsi_dma_workaround_write(struct vc4_dsi *dsi, u32 offset, u32 val) + #define DSI_READ(offset) readl(dsi->regs + (offset)) + #define DSI_WRITE(offset, val) dsi_dma_workaround_write(dsi, offset, val) + #define DSI_PORT_READ(offset) \ +- DSI_READ(dsi->port ? DSI1_##offset : DSI0_##offset) ++ DSI_READ(dsi->variant->port ? DSI1_##offset : DSI0_##offset) + #define DSI_PORT_WRITE(offset, val) \ +- DSI_WRITE(dsi->port ? DSI1_##offset : DSI0_##offset, val) +-#define DSI_PORT_BIT(bit) (dsi->port ? DSI1_##bit : DSI0_##bit) ++ DSI_WRITE(dsi->variant->port ? DSI1_##offset : DSI0_##offset, val) ++#define DSI_PORT_BIT(bit) (dsi->variant->port ? DSI1_##bit : DSI0_##bit) + + /* VC4 DSI encoder KMS struct */ + struct vc4_dsi_encoder { +@@ -835,7 +846,7 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) + + ret = pm_runtime_resume_and_get(dev); + if (ret) { +- DRM_ERROR("Failed to runtime PM enable on DSI%d\n", dsi->port); ++ DRM_ERROR("Failed to runtime PM enable on DSI%d\n", dsi->variant->port); + return; + } + +@@ -869,7 +880,7 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) + DSI_PORT_WRITE(STAT, DSI_PORT_READ(STAT)); + + /* Set AFE CTR00/CTR1 to release powerdown of analog. */ +- if (dsi->port == 0) { ++ if (dsi->variant->port == 0) { + u32 afec0 = (VC4_SET_FIELD(7, DSI_PHY_AFEC0_PTATADJ) | + VC4_SET_FIELD(7, DSI_PHY_AFEC0_CTATADJ)); + +@@ -1015,7 +1026,7 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) + DSI_PORT_BIT(PHYC_CLANE_ENABLE) | + ((dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) ? + 0 : DSI_PORT_BIT(PHYC_HS_CLK_CONTINUOUS)) | +- (dsi->port == 0 ? ++ (dsi->variant->port == 0 ? + VC4_SET_FIELD(lpx - 1, DSI0_PHYC_ESC_CLK_LPDT) : + VC4_SET_FIELD(lpx - 1, DSI1_PHYC_ESC_CLK_LPDT))); + +@@ -1041,13 +1052,13 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) + DSI_DISP1_ENABLE); + + /* Ungate the block. */ +- if (dsi->port == 0) ++ if (dsi->variant->port == 0) + DSI_PORT_WRITE(CTRL, DSI_PORT_READ(CTRL) | DSI0_CTRL_CTRL0); + else + DSI_PORT_WRITE(CTRL, DSI_PORT_READ(CTRL) | DSI1_CTRL_EN); + + /* Bring AFE out of reset. */ +- if (dsi->port == 0) { ++ if (dsi->variant->port == 0) { + } else { + DSI_PORT_WRITE(PHY_AFEC0, + DSI_PORT_READ(PHY_AFEC0) & +@@ -1303,8 +1314,16 @@ static const struct drm_encoder_helper_funcs vc4_dsi_encoder_helper_funcs = { + .mode_fixup = vc4_dsi_encoder_mode_fixup, + }; + ++static const struct vc4_dsi_variant bcm2835_dsi1_variant = { ++ .port = 1, ++ .broken_axi_workaround = true, ++ .debugfs_name = "dsi1_regs", ++ .regs = dsi1_regs, ++ .nregs = ARRAY_SIZE(dsi1_regs), ++}; ++ + static const struct of_device_id vc4_dsi_dt_match[] = { +- { .compatible = "brcm,bcm2835-dsi1", (void *)(uintptr_t)1 }, ++ { .compatible = "brcm,bcm2835-dsi1", &bcm2835_dsi1_variant }, + {} + }; + +@@ -1315,7 +1334,7 @@ static void dsi_handle_error(struct vc4_dsi *dsi, + if (!(stat & bit)) + return; + +- DRM_ERROR("DSI%d: %s error\n", dsi->port, type); ++ DRM_ERROR("DSI%d: %s error\n", dsi->variant->port, type); + *ret = IRQ_HANDLED; + } + +@@ -1413,7 +1432,7 @@ vc4_dsi_init_phy_clocks(struct vc4_dsi *dsi) + int ret; + + snprintf(clk_name, sizeof(clk_name), +- "dsi%u_%s", dsi->port, phy_clocks[i].name); ++ "dsi%u_%s", dsi->variant->port, phy_clocks[i].name); + + /* We just use core fixed factor clock ops for the PHY + * clocks. The clocks are actually gated by the +@@ -1461,7 +1480,7 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + if (!match) + return -ENODEV; + +- dsi->port = (uintptr_t)match->data; ++ dsi->variant = match->data; + + vc4_dsi_encoder = devm_kzalloc(dev, sizeof(*vc4_dsi_encoder), + GFP_KERNEL); +@@ -1478,13 +1497,8 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + return PTR_ERR(dsi->regs); + + dsi->regset.base = dsi->regs; +- if (dsi->port == 0) { +- dsi->regset.regs = dsi0_regs; +- dsi->regset.nregs = ARRAY_SIZE(dsi0_regs); +- } else { +- dsi->regset.regs = dsi1_regs; +- dsi->regset.nregs = ARRAY_SIZE(dsi1_regs); +- } ++ dsi->regset.regs = dsi->variant->regs; ++ dsi->regset.nregs = dsi->variant->nregs; + + if (DSI_PORT_READ(ID) != DSI_ID_VALUE) { + dev_err(dev, "Port returned 0x%08x for ID instead of 0x%08x\n", +@@ -1496,7 +1510,7 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + * from the ARM. It does handle writes from the DMA engine, + * so set up a channel for talking to it. + */ +- if (dsi->port == 1) { ++ if (dsi->variant->broken_axi_workaround) { + dsi->reg_dma_mem = dma_alloc_coherent(dev, 4, + &dsi->reg_dma_paddr, + GFP_KERNEL); +@@ -1617,10 +1631,7 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + */ + list_splice_init(&dsi->encoder->bridge_chain, &dsi->bridge_chain); + +- if (dsi->port == 0) +- vc4_debugfs_add_regset32(drm, "dsi0_regs", &dsi->regset); +- else +- vc4_debugfs_add_regset32(drm, "dsi1_regs", &dsi->regset); ++ vc4_debugfs_add_regset32(drm, dsi->variant->debugfs_name, &dsi->regset); + + pm_runtime_enable(dev); + +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-dsi-register-dsi0-as-the-correct-vc4-encoder.patch b/queue-5.10/drm-vc4-dsi-register-dsi0-as-the-correct-vc4-encoder.patch new file mode 100644 index 00000000000..cc9affc92cf --- /dev/null +++ b/queue-5.10/drm-vc4-dsi-register-dsi0-as-the-correct-vc4-encoder.patch @@ -0,0 +1,41 @@ +From ea18fa94fad814e181a14a5c4a27e2b5b503db58 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 16:47:41 +0200 +Subject: drm/vc4: dsi: Register dsi0 as the correct vc4 encoder type + +From: Dave Stevenson + +[ Upstream commit 4d9273c978d4c1af15d7874c10c732ec83d444d0 ] + +vc4_dsi was registering both dsi0 and dsi1 as VC4_ENCODER_TYPE_DSI1 +which seemed to work OK for a single DSI display, but fails +if there are two DSI displays connected. + +Update to register the correct type. + +Fixes: 4078f5757144 ("drm/vc4: Add DSI driver") +Signed-off-by: Dave Stevenson +Link: https://lore.kernel.org/r/20220613144800.326124-15-maxime@cerno.tech +Signed-off-by: Maxime Ripard +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c +index 2cedf1cf6758..8e2d5c4237ae 100644 +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -1488,7 +1488,8 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + return -ENOMEM; + + INIT_LIST_HEAD(&dsi->bridge_chain); +- vc4_dsi_encoder->base.type = VC4_ENCODER_TYPE_DSI1; ++ vc4_dsi_encoder->base.type = dsi->variant->port ? ++ VC4_ENCODER_TYPE_DSI1 : VC4_ENCODER_TYPE_DSI0; + vc4_dsi_encoder->dsi = dsi; + dsi->encoder = &vc4_dsi_encoder->base.base; + +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-dsi-use-snprintf-for-the-phy-clocks-instead-.patch b/queue-5.10/drm-vc4-dsi-use-snprintf-for-the-phy-clocks-instead-.patch new file mode 100644 index 00000000000..e1ee2d2c3af --- /dev/null +++ b/queue-5.10/drm-vc4-dsi-use-snprintf-for-the-phy-clocks-instead-.patch @@ -0,0 +1,73 @@ +From 8e9a42f3fd91d9fb5992443eba9c85a74e2efb0b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Dec 2020 14:25:38 +0100 +Subject: drm/vc4: dsi: Use snprintf for the PHY clocks instead of an array + +From: Maxime Ripard + +[ Upstream commit dc0bf36401e891c853e0a25baeb4e0b4e6f3626d ] + +The DSI clocks setup function has been using an array to store the clock +name of either the DSI0 or DSI1 blocks, using the port ID to choose the +proper one. + +Let's switch to an snprintf call to do the same thing and simplify the +array a bit. + +Reviewed-by: Dave Stevenson +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20201203132543.861591-4-maxime@cerno.tech +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c +index 6222e4058c85..80cd2599c57b 100644 +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -1388,12 +1388,12 @@ vc4_dsi_init_phy_clocks(struct vc4_dsi *dsi) + struct device *dev = &dsi->pdev->dev; + const char *parent_name = __clk_get_name(dsi->pll_phy_clock); + static const struct { +- const char *dsi0_name, *dsi1_name; ++ const char *name; + int div; + } phy_clocks[] = { +- { "dsi0_byte", "dsi1_byte", 8 }, +- { "dsi0_ddr2", "dsi1_ddr2", 4 }, +- { "dsi0_ddr", "dsi1_ddr", 2 }, ++ { "byte", 8 }, ++ { "ddr2", 4 }, ++ { "ddr", 2 }, + }; + int i; + +@@ -1409,8 +1409,12 @@ vc4_dsi_init_phy_clocks(struct vc4_dsi *dsi) + for (i = 0; i < ARRAY_SIZE(phy_clocks); i++) { + struct clk_fixed_factor *fix = &dsi->phy_clocks[i]; + struct clk_init_data init; ++ char clk_name[16]; + int ret; + ++ snprintf(clk_name, sizeof(clk_name), ++ "dsi%u_%s", dsi->port, phy_clocks[i].name); ++ + /* We just use core fixed factor clock ops for the PHY + * clocks. The clocks are actually gated by the + * PHY_AFEC0_DDRCLK_EN bits, which we should be +@@ -1427,10 +1431,7 @@ vc4_dsi_init_phy_clocks(struct vc4_dsi *dsi) + memset(&init, 0, sizeof(init)); + init.parent_names = &parent_name; + init.num_parents = 1; +- if (dsi->port == 1) +- init.name = phy_clocks[i].dsi1_name; +- else +- init.name = phy_clocks[i].dsi0_name; ++ init.name = clk_name; + init.ops = &clk_fixed_factor_ops; + + ret = devm_clk_hw_register(dev, &fix->hw); +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-hdmi-avoid-full-hdmi-audio-fifo-writes.patch b/queue-5.10/drm-vc4-hdmi-avoid-full-hdmi-audio-fifo-writes.patch new file mode 100644 index 00000000000..71adcb0f2c7 --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-avoid-full-hdmi-audio-fifo-writes.patch @@ -0,0 +1,46 @@ +From 5e9ed1f40712989cd05a110f6a02104ab01c0160 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 16:47:47 +0200 +Subject: drm/vc4: hdmi: Avoid full hdmi audio fifo writes + +From: Dom Cobley + +[ Upstream commit 1c594eeccf92368177c2e22f1d3ee4933dfb8567 ] + +We are getting occasional VC4_HD_MAI_CTL_ERRORF in +HDMI_MAI_CTL which seem to correspond with audio dropouts. + +Reduce the threshold where we deassert DREQ to avoid the fifo +overfilling + +Fixes: bb7d78568814 ("drm/vc4: Add HDMI audio support") +Signed-off-by: Dom Cobley +Link: https://lore.kernel.org/r/20220613144800.326124-21-maxime@cerno.tech +Signed-off-by: Maxime Ripard +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index 6acc34f1e095..9a90f22df3d2 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -1033,10 +1033,10 @@ static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream, + + /* Set the MAI threshold */ + HDMI_WRITE(HDMI_MAI_THR, +- VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICHIGH) | +- VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICLOW) | +- VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_DREQHIGH) | +- VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_DREQLOW)); ++ VC4_SET_FIELD(0x08, VC4_HD_MAI_THR_PANICHIGH) | ++ VC4_SET_FIELD(0x08, VC4_HD_MAI_THR_PANICLOW) | ++ VC4_SET_FIELD(0x06, VC4_HD_MAI_THR_DREQHIGH) | ++ VC4_SET_FIELD(0x08, VC4_HD_MAI_THR_DREQLOW)); + + HDMI_WRITE(HDMI_MAI_CONFIG, + VC4_HDMI_MAI_CONFIG_BIT_REVERSE | +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-hdmi-correct-hdmi-timing-registers-for-inter.patch b/queue-5.10/drm-vc4-hdmi-correct-hdmi-timing-registers-for-inter.patch new file mode 100644 index 00000000000..7cfad48f9a9 --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-correct-hdmi-timing-registers-for-inter.patch @@ -0,0 +1,46 @@ +From ccac1f93b1f9c5dc520c1c65604f5393ca429175 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 16:47:59 +0200 +Subject: drm/vc4: hdmi: Correct HDMI timing registers for interlaced modes + +From: Dave Stevenson + +[ Upstream commit fb10dc451c0f15e3c19798a2f41d357f3f7576f5 ] + +For interlaced modes the timings were not being correctly +programmed into the HDMI block, so correct them. + +Fixes: 8323989140f3 ("drm/vc4: hdmi: Support the BCM2711 HDMI controllers") +Signed-off-by: Dave Stevenson +Link: https://lore.kernel.org/r/20220613144800.326124-33-maxime@cerno.tech +Signed-off-by: Maxime Ripard +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index e3cd3432867a..3085eed2afe2 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -592,13 +592,13 @@ static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, + VC4_SET_FIELD(mode->crtc_vsync_start - mode->crtc_vdisplay, + VC5_HDMI_VERTA_VFP) | + VC4_SET_FIELD(mode->crtc_vdisplay, VC5_HDMI_VERTA_VAL)); +- u32 vertb = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) | +- VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end + +- interlaced, ++ u32 vertb = (VC4_SET_FIELD(mode->htotal >> (2 - pixel_rep), ++ VC5_HDMI_VERTB_VSPO) | ++ VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end, + VC4_HDMI_VERTB_VBP)); + u32 vertb_even = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) | + VC4_SET_FIELD(mode->crtc_vtotal - +- mode->crtc_vsync_end, ++ mode->crtc_vsync_end - interlaced, + VC4_HDMI_VERTB_VBP)); + + HDMI_WRITE(HDMI_VEC_INTERFACE_XBAR, 0x354021); +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-hdmi-create-a-custom-connector-state.patch b/queue-5.10/drm-vc4-hdmi-create-a-custom-connector-state.patch new file mode 100644 index 00000000000..0c40d1b0b07 --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-create-a-custom-connector-state.patch @@ -0,0 +1,101 @@ +From 0570b898a56093a94f406728092be37c33bbee6e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 15 Dec 2020 16:42:39 +0100 +Subject: drm/vc4: hdmi: Create a custom connector state + +From: Maxime Ripard + +[ Upstream commit fbe7271e47bebd7600fec171bce9d5bf066275f8 ] + +When run with a higher bpc than 8, the clock of the HDMI controller needs +to be adjusted. Let's create a connector state that will be used at +atomic_check and atomic_enable to compute and store the clock rate +associated to the state. + +Acked-by: Thomas Zimmermann +Signed-off-by: Maxime Ripard +Reviewed-by: Dave Stevenson +Link: https://patchwork.freedesktop.org/patch/msgid/20201215154243.540115-6-maxime@cerno.tech +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 33 ++++++++++++++++++++++++++++++--- + drivers/gpu/drm/vc4/vc4_hdmi.h | 10 ++++++++++ + 2 files changed, 40 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index 978afe706ee2..2d76f094c2d2 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -208,10 +208,37 @@ static int vc4_hdmi_connector_get_modes(struct drm_connector *connector) + + static void vc4_hdmi_connector_reset(struct drm_connector *connector) + { +- drm_atomic_helper_connector_reset(connector); ++ struct vc4_hdmi_connector_state *old_state = ++ conn_state_to_vc4_hdmi_conn_state(connector->state); ++ struct vc4_hdmi_connector_state *new_state = ++ kzalloc(sizeof(*new_state), GFP_KERNEL); + + if (connector->state) +- drm_atomic_helper_connector_tv_reset(connector); ++ __drm_atomic_helper_connector_destroy_state(connector->state); ++ ++ kfree(old_state); ++ __drm_atomic_helper_connector_reset(connector, &new_state->base); ++ ++ if (!new_state) ++ return; ++ ++ drm_atomic_helper_connector_tv_reset(connector); ++} ++ ++static struct drm_connector_state * ++vc4_hdmi_connector_duplicate_state(struct drm_connector *connector) ++{ ++ struct drm_connector_state *conn_state = connector->state; ++ struct vc4_hdmi_connector_state *vc4_state = conn_state_to_vc4_hdmi_conn_state(conn_state); ++ struct vc4_hdmi_connector_state *new_state; ++ ++ new_state = kzalloc(sizeof(*new_state), GFP_KERNEL); ++ if (!new_state) ++ return NULL; ++ ++ __drm_atomic_helper_connector_duplicate_state(connector, &new_state->base); ++ ++ return &new_state->base; + } + + static const struct drm_connector_funcs vc4_hdmi_connector_funcs = { +@@ -219,7 +246,7 @@ static const struct drm_connector_funcs vc4_hdmi_connector_funcs = { + .fill_modes = drm_helper_probe_single_connector_modes, + .destroy = vc4_hdmi_connector_destroy, + .reset = vc4_hdmi_connector_reset, +- .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, ++ .atomic_duplicate_state = vc4_hdmi_connector_duplicate_state, + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, + }; + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h +index 0526a9cf608a..2cf5362052e2 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.h ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.h +@@ -180,6 +180,16 @@ encoder_to_vc4_hdmi(struct drm_encoder *encoder) + return container_of(_encoder, struct vc4_hdmi, encoder); + } + ++struct vc4_hdmi_connector_state { ++ struct drm_connector_state base; ++}; ++ ++static inline struct vc4_hdmi_connector_state * ++conn_state_to_vc4_hdmi_conn_state(struct drm_connector_state *conn_state) ++{ ++ return container_of(conn_state, struct vc4_hdmi_connector_state, base); ++} ++ + void vc4_hdmi_phy_init(struct vc4_hdmi *vc4_hdmi, + struct drm_display_mode *mode); + void vc4_hdmi_phy_disable(struct vc4_hdmi *vc4_hdmi); +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-hdmi-don-t-access-the-connector-state-in-res.patch b/queue-5.10/drm-vc4-hdmi-don-t-access-the-connector-state-in-res.patch new file mode 100644 index 00000000000..ac123407cef --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-don-t-access-the-connector-state-in-res.patch @@ -0,0 +1,46 @@ +From 616c4681ecdbff65413d51f25bf184f1324d41cd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 15 Dec 2020 16:42:38 +0100 +Subject: drm/vc4: hdmi: Don't access the connector state in reset if kmalloc + fails + +From: Maxime Ripard + +[ Upstream commit e55a07751146ef8ebc2c561564437b78f46405d3 ] + +drm_atomic_helper_connector_reset uses kmalloc which, from an API +standpoint, can fail, and thus setting connector->state to NULL. +However, our reset hook then calls drm_atomic_helper_connector_tv_reset +that will access connector->state without checking if it's a valid +pointer or not. + +Make sure we don't end up accessing a NULL pointer. + +Acked-by: Thomas Zimmermann +Reviewed-by: Dave Stevenson +Suggested-by: Dave Stevenson +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20201215154243.540115-5-maxime@cerno.tech +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index 9a90f22df3d2..978afe706ee2 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -209,7 +209,9 @@ static int vc4_hdmi_connector_get_modes(struct drm_connector *connector) + static void vc4_hdmi_connector_reset(struct drm_connector *connector) + { + drm_atomic_helper_connector_reset(connector); +- drm_atomic_helper_connector_tv_reset(connector); ++ ++ if (connector->state) ++ drm_atomic_helper_connector_tv_reset(connector); + } + + static const struct drm_connector_funcs vc4_hdmi_connector_funcs = { +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-hdmi-fix-timings-for-interlaced-modes.patch b/queue-5.10/drm-vc4-hdmi-fix-timings-for-interlaced-modes.patch new file mode 100644 index 00000000000..3b60d9b7dcd --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-fix-timings-for-interlaced-modes.patch @@ -0,0 +1,98 @@ +From 211490123450b373e7e08505e543592b26d1b1c0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 16:47:57 +0200 +Subject: drm/vc4: hdmi: Fix timings for interlaced modes + +From: Mateusz Kwiatkowski + +[ Upstream commit 0ee5a40152b15f200ed3a0d51e8aa782ea979c6a ] + +Increase the number of post-sync blanking lines on odd fields instead of +decreasing it on even fields. This makes the total number of lines +properly match the modelines. + +Additionally fix the value of PV_VCONTROL_ODD_DELAY, which did not take +pixels_per_clock into account, causing some displays to invert the +fields when driven by bcm2711. + +Fixes: 682e62c45406 ("drm/vc4: Fix support for interlaced modes on HDMI.") +Signed-off-by: Mateusz Kwiatkowski +Link: https://lore.kernel.org/r/20220613144800.326124-31-maxime@cerno.tech +Signed-off-by: Maxime Ripard +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_crtc.c | 7 ++++--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 12 ++++++------ + 2 files changed, 10 insertions(+), 9 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c +index f4e64db07d4e..79724fddfb4b 100644 +--- a/drivers/gpu/drm/vc4/vc4_crtc.c ++++ b/drivers/gpu/drm/vc4/vc4_crtc.c +@@ -346,7 +346,8 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc) + PV_HORZB_HACTIVE)); + + CRTC_WRITE(PV_VERTA, +- VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end, ++ VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end + ++ interlace, + PV_VERTA_VBP) | + VC4_SET_FIELD(mode->crtc_vsync_end - mode->crtc_vsync_start, + PV_VERTA_VSYNC)); +@@ -358,7 +359,7 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc) + if (interlace) { + CRTC_WRITE(PV_VERTA_EVEN, + VC4_SET_FIELD(mode->crtc_vtotal - +- mode->crtc_vsync_end - 1, ++ mode->crtc_vsync_end, + PV_VERTA_VBP) | + VC4_SET_FIELD(mode->crtc_vsync_end - + mode->crtc_vsync_start, +@@ -378,7 +379,7 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc) + PV_VCONTROL_CONTINUOUS | + (is_dsi ? PV_VCONTROL_DSI : 0) | + PV_VCONTROL_INTERLACE | +- VC4_SET_FIELD(mode->htotal * pixel_rep / 2, ++ VC4_SET_FIELD(mode->htotal * pixel_rep / (2 * ppc), + PV_VCONTROL_ODD_DELAY)); + CRTC_WRITE(PV_VSYNCD_EVEN, 0); + } else { +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index 153bf0907bbd..e3cd3432867a 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -549,12 +549,12 @@ static void vc4_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, + VC4_HDMI_VERTA_VFP) | + VC4_SET_FIELD(mode->crtc_vdisplay, VC4_HDMI_VERTA_VAL)); + u32 vertb = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) | +- VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end, ++ VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end + ++ interlaced, + VC4_HDMI_VERTB_VBP)); + u32 vertb_even = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) | + VC4_SET_FIELD(mode->crtc_vtotal - +- mode->crtc_vsync_end - +- interlaced, ++ mode->crtc_vsync_end, + VC4_HDMI_VERTB_VBP)); + + HDMI_WRITE(HDMI_HORZA, +@@ -593,12 +593,12 @@ static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, + VC5_HDMI_VERTA_VFP) | + VC4_SET_FIELD(mode->crtc_vdisplay, VC5_HDMI_VERTA_VAL)); + u32 vertb = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) | +- VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end, ++ VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end + ++ interlaced, + VC4_HDMI_VERTB_VBP)); + u32 vertb_even = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) | + VC4_SET_FIELD(mode->crtc_vtotal - +- mode->crtc_vsync_end - +- interlaced, ++ mode->crtc_vsync_end, + VC4_HDMI_VERTB_VBP)); + + HDMI_WRITE(HDMI_VEC_INTERFACE_XBAR, 0x354021); +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-hdmi-limit-the-bcm2711-to-the-max-without-sc.patch b/queue-5.10/drm-vc4-hdmi-limit-the-bcm2711-to-the-max-without-sc.patch new file mode 100644 index 00000000000..562a6edc3ee --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-limit-the-bcm2711-to-the-max-without-sc.patch @@ -0,0 +1,55 @@ +From d1abc83cf8244a56a8b8beaa1eb846cd9695e3df Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 15 Dec 2020 16:42:42 +0100 +Subject: drm/vc4: hdmi: Limit the BCM2711 to the max without scrambling + +From: Maxime Ripard + +[ Upstream commit 24169a2b0533a6c4030c91a7a074039e7c98fde6 ] + +Unlike the previous generations, the HSM clock limitation is way above +what we can reach without scrambling, so let's move the maximum +frequency we support to the maximum clock frequency without scrambling. + +Reviewed-by: Dave Stevenson +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20201215154243.540115-9-maxime@cerno.tech +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index 2d76f094c2d2..153bf0907bbd 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -83,6 +83,8 @@ + #define CEC_CLOCK_FREQ 40000 + #define VC4_HSM_MID_CLOCK 149985000 + ++#define HDMI_14_MAX_TMDS_CLK (340 * 1000 * 1000) ++ + static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused) + { + struct drm_info_node *node = (struct drm_info_node *)m->private; +@@ -1966,7 +1968,7 @@ static const struct vc4_hdmi_variant bcm2711_hdmi0_variant = { + .encoder_type = VC4_ENCODER_TYPE_HDMI0, + .debugfs_name = "hdmi0_regs", + .card_name = "vc4-hdmi-0", +- .max_pixel_clock = 297000000, ++ .max_pixel_clock = HDMI_14_MAX_TMDS_CLK, + .registers = vc5_hdmi_hdmi0_fields, + .num_registers = ARRAY_SIZE(vc5_hdmi_hdmi0_fields), + .phy_lane_mapping = { +@@ -1992,7 +1994,7 @@ static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = { + .encoder_type = VC4_ENCODER_TYPE_HDMI1, + .debugfs_name = "hdmi1_regs", + .card_name = "vc4-hdmi-1", +- .max_pixel_clock = 297000000, ++ .max_pixel_clock = HDMI_14_MAX_TMDS_CLK, + .registers = vc5_hdmi_hdmi1_fields, + .num_registers = ARRAY_SIZE(vc5_hdmi_hdmi1_fields), + .phy_lane_mapping = { +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-hdmi-remove-firmware-logic-for-mai-threshold.patch b/queue-5.10/drm-vc4-hdmi-remove-firmware-logic-for-mai-threshold.patch new file mode 100644 index 00000000000..21ef740b9b2 --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-remove-firmware-logic-for-mai-threshold.patch @@ -0,0 +1,58 @@ +From 7d6398d04966991e4819504f6afa56def5cbd2e3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 25 May 2021 15:23:51 +0200 +Subject: drm/vc4: hdmi: Remove firmware logic for MAI threshold setting + +From: Dom Cobley + +[ Upstream commit 8434111ccfec8fc0549ec325a632067232d38e14 ] + +This was a workaround for bugs in hardware on earlier Pi models +and wasn't totally successful. + +It makes audio quality worse on a Pi4 at the higher sample rates + +Signed-off-by: Dom Cobley +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20210525132354.297468-10-maxime@cerno.tech +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 22 ++++++---------------- + 1 file changed, 6 insertions(+), 16 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index d5822878b5a7..6acc34f1e095 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -1031,22 +1031,12 @@ static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream, + audio_packet_config |= VC4_SET_FIELD(channel_mask, + VC4_HDMI_AUDIO_PACKET_CEA_MASK); + +- /* Set the MAI threshold. This logic mimics the firmware's. */ +- if (vc4_hdmi->audio.samplerate > 96000) { +- HDMI_WRITE(HDMI_MAI_THR, +- VC4_SET_FIELD(0x12, VC4_HD_MAI_THR_DREQHIGH) | +- VC4_SET_FIELD(0x12, VC4_HD_MAI_THR_DREQLOW)); +- } else if (vc4_hdmi->audio.samplerate > 48000) { +- HDMI_WRITE(HDMI_MAI_THR, +- VC4_SET_FIELD(0x14, VC4_HD_MAI_THR_DREQHIGH) | +- VC4_SET_FIELD(0x12, VC4_HD_MAI_THR_DREQLOW)); +- } else { +- HDMI_WRITE(HDMI_MAI_THR, +- VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICHIGH) | +- VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICLOW) | +- VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_DREQHIGH) | +- VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_DREQLOW)); +- } ++ /* Set the MAI threshold */ ++ HDMI_WRITE(HDMI_MAI_THR, ++ VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICHIGH) | ++ VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICLOW) | ++ VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_DREQHIGH) | ++ VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_DREQLOW)); + + HDMI_WRITE(HDMI_MAI_CONFIG, + VC4_HDMI_MAI_CONFIG_BIT_REVERSE | +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-plane-fix-margin-calculations-for-the-right-.patch b/queue-5.10/drm-vc4-plane-fix-margin-calculations-for-the-right-.patch new file mode 100644 index 00000000000..7edc4124d7e --- /dev/null +++ b/queue-5.10/drm-vc4-plane-fix-margin-calculations-for-the-right-.patch @@ -0,0 +1,51 @@ +From bde83c3e2b6894878ad1c60b95cdfae33287b55f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 16:47:32 +0200 +Subject: drm/vc4: plane: Fix margin calculations for the right/bottom edges + +From: Dave Stevenson + +[ Upstream commit b7c3d6821627861f4ea3e1f2b595d0ed9e80aac8 ] + +The current plane margin calculation code clips the right and bottom +edges of the range based using the left and top margins. + +This is obviously wrong, so let's fix it. + +Fixes: 666e73587f90 ("drm/vc4: Take margin setup into account when updating planes") +Signed-off-by: Dave Stevenson +Link: https://lore.kernel.org/r/20220613144800.326124-6-maxime@cerno.tech +Signed-off-by: Maxime Ripard +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_plane.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c +index bdf16554cf68..4df222a83049 100644 +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -303,16 +303,16 @@ static int vc4_plane_margins_adj(struct drm_plane_state *pstate) + adjhdisplay, + crtc_state->mode.hdisplay); + vc4_pstate->crtc_x += left; +- if (vc4_pstate->crtc_x > crtc_state->mode.hdisplay - left) +- vc4_pstate->crtc_x = crtc_state->mode.hdisplay - left; ++ if (vc4_pstate->crtc_x > crtc_state->mode.hdisplay - right) ++ vc4_pstate->crtc_x = crtc_state->mode.hdisplay - right; + + adjvdisplay = crtc_state->mode.vdisplay - (top + bottom); + vc4_pstate->crtc_y = DIV_ROUND_CLOSEST(vc4_pstate->crtc_y * + adjvdisplay, + crtc_state->mode.vdisplay); + vc4_pstate->crtc_y += top; +- if (vc4_pstate->crtc_y > crtc_state->mode.vdisplay - top) +- vc4_pstate->crtc_y = crtc_state->mode.vdisplay - top; ++ if (vc4_pstate->crtc_y > crtc_state->mode.vdisplay - bottom) ++ vc4_pstate->crtc_y = crtc_state->mode.vdisplay - bottom; + + vc4_pstate->crtc_w = DIV_ROUND_CLOSEST(vc4_pstate->crtc_w * + adjhdisplay, +-- +2.35.1 + diff --git a/queue-5.10/drm-vc4-plane-remove-subpixel-positioning-check.patch b/queue-5.10/drm-vc4-plane-remove-subpixel-positioning-check.patch new file mode 100644 index 00000000000..057f5529b0f --- /dev/null +++ b/queue-5.10/drm-vc4-plane-remove-subpixel-positioning-check.patch @@ -0,0 +1,76 @@ +From f4ef4696c0c8aac454f345b07d5584404c521f3e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 16:47:31 +0200 +Subject: drm/vc4: plane: Remove subpixel positioning check + +From: Dom Cobley + +[ Upstream commit 517db1ab1566dba3093dbdb8de4263ba4aa66416 ] + +There is little harm in ignoring fractional coordinates +(they just get truncated). + +Without this: +modetest -M vc4 -F tiles,gradient -s 32:1920x1080-60 -P89@74:1920x1080*.1.1@XR24 + +is rejected. We have the same issue in Kodi when trying to +use zoom options on video. + +Note: even if all coordinates are fully integer. e.g. +src:[0,0,1920,1080] dest:[-10,-10,1940,1100] + +it will still get rejected as drm_atomic_helper_check_plane_state +uses drm_rect_clip_scaled which transforms this to fractional src coords + +Fixes: 21af94cf1a4c ("drm/vc4: Add support for scaling of display planes.") +Signed-off-by: Dom Cobley +Link: https://lore.kernel.org/r/20220613144800.326124-5-maxime@cerno.tech +Signed-off-by: Maxime Ripard +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_plane.c | 22 +++++++++------------- + 1 file changed, 9 insertions(+), 13 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c +index af4b8944a603..bdf16554cf68 100644 +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -332,7 +332,6 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state) + struct vc4_plane_state *vc4_state = to_vc4_plane_state(state); + struct drm_framebuffer *fb = state->fb; + struct drm_gem_cma_object *bo = drm_fb_cma_get_gem_obj(fb, 0); +- u32 subpixel_src_mask = (1 << 16) - 1; + int num_planes = fb->format->num_planes; + struct drm_crtc_state *crtc_state; + u32 h_subsample = fb->format->hsub; +@@ -354,18 +353,15 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state) + for (i = 0; i < num_planes; i++) + vc4_state->offsets[i] = bo->paddr + fb->offsets[i]; + +- /* We don't support subpixel source positioning for scaling. */ +- if ((state->src.x1 & subpixel_src_mask) || +- (state->src.x2 & subpixel_src_mask) || +- (state->src.y1 & subpixel_src_mask) || +- (state->src.y2 & subpixel_src_mask)) { +- return -EINVAL; +- } +- +- vc4_state->src_x = state->src.x1 >> 16; +- vc4_state->src_y = state->src.y1 >> 16; +- vc4_state->src_w[0] = (state->src.x2 - state->src.x1) >> 16; +- vc4_state->src_h[0] = (state->src.y2 - state->src.y1) >> 16; ++ /* ++ * We don't support subpixel source positioning for scaling, ++ * but fractional coordinates can be generated by clipping ++ * so just round for now ++ */ ++ vc4_state->src_x = DIV_ROUND_CLOSEST(state->src.x1, 1 << 16); ++ vc4_state->src_y = DIV_ROUND_CLOSEST(state->src.y1, 1 << 16); ++ vc4_state->src_w[0] = DIV_ROUND_CLOSEST(state->src.x2, 1 << 16) - vc4_state->src_x; ++ vc4_state->src_h[0] = DIV_ROUND_CLOSEST(state->src.y2, 1 << 16) - vc4_state->src_y; + + vc4_state->crtc_x = state->dst.x1; + vc4_state->crtc_y = state->dst.y1; +-- +2.35.1 + diff --git a/queue-5.10/dt-bindings-update-qcom-usb-subsystem-maintainer-inf.patch b/queue-5.10/dt-bindings-update-qcom-usb-subsystem-maintainer-inf.patch new file mode 100644 index 00000000000..a084f4709d5 --- /dev/null +++ b/queue-5.10/dt-bindings-update-qcom-usb-subsystem-maintainer-inf.patch @@ -0,0 +1,93 @@ +From fb1e87961b858f2f3f10dd30105749b4f2d2247b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Jun 2022 19:14:32 -0700 +Subject: dt-bindings: Update QCOM USB subsystem maintainer information + +From: Wesley Cheng + +[ Upstream commit e059da384ffdc93778e69a5f212c2ac7357ec09a ] + +Update devicetree binding files with the proper maintainer, and updated +contact email. + +Signed-off-by: Wesley Cheng +Acked-by: Krzysztof Kozlowski +Signed-off-by: Rob Herring +Link: https://lore.kernel.org/r/20220603021432.13365-1-quic_wcheng@quicinc.com +Signed-off-by: Sasha Levin +--- + Documentation/devicetree/bindings/phy/qcom,qmp-usb3-dp-phy.yaml | 2 +- + Documentation/devicetree/bindings/phy/qcom,qusb2-phy.yaml | 2 +- + .../devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml | 2 +- + .../devicetree/bindings/regulator/qcom,usb-vbus-regulator.yaml | 2 +- + Documentation/devicetree/bindings/usb/qcom,dwc3.yaml | 2 +- + 5 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/Documentation/devicetree/bindings/phy/qcom,qmp-usb3-dp-phy.yaml b/Documentation/devicetree/bindings/phy/qcom,qmp-usb3-dp-phy.yaml +index 33974ad10afe..1b5257cac54d 100644 +--- a/Documentation/devicetree/bindings/phy/qcom,qmp-usb3-dp-phy.yaml ++++ b/Documentation/devicetree/bindings/phy/qcom,qmp-usb3-dp-phy.yaml +@@ -8,7 +8,7 @@ $schema: "http://devicetree.org/meta-schemas/core.yaml#" + title: Qualcomm QMP USB3 DP PHY controller + + maintainers: +- - Manu Gautam ++ - Wesley Cheng + + properties: + compatible: +diff --git a/Documentation/devicetree/bindings/phy/qcom,qusb2-phy.yaml b/Documentation/devicetree/bindings/phy/qcom,qusb2-phy.yaml +index d457fb6a4779..6f5c6cd37426 100644 +--- a/Documentation/devicetree/bindings/phy/qcom,qusb2-phy.yaml ++++ b/Documentation/devicetree/bindings/phy/qcom,qusb2-phy.yaml +@@ -8,7 +8,7 @@ $schema: "http://devicetree.org/meta-schemas/core.yaml#" + title: Qualcomm QUSB2 phy controller + + maintainers: +- - Manu Gautam ++ - Wesley Cheng + + description: + QUSB2 controller supports LS/FS/HS usb connectivity on Qualcomm chipsets. +diff --git a/Documentation/devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml b/Documentation/devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml +index 4949a2851532..cfa71351485b 100644 +--- a/Documentation/devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml ++++ b/Documentation/devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml +@@ -7,7 +7,7 @@ $schema: "http://devicetree.org/meta-schemas/core.yaml#" + title: Qualcomm Synopsys Femto High-Speed USB PHY V2 + + maintainers: +- - Wesley Cheng ++ - Wesley Cheng + + description: | + Qualcomm High-Speed USB PHY +diff --git a/Documentation/devicetree/bindings/regulator/qcom,usb-vbus-regulator.yaml b/Documentation/devicetree/bindings/regulator/qcom,usb-vbus-regulator.yaml +index 12ed98c28aaa..dbe78cd4adba 100644 +--- a/Documentation/devicetree/bindings/regulator/qcom,usb-vbus-regulator.yaml ++++ b/Documentation/devicetree/bindings/regulator/qcom,usb-vbus-regulator.yaml +@@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml# + title: The Qualcomm PMIC VBUS output regulator driver + + maintainers: +- - Wesley Cheng ++ - Wesley Cheng + + description: | + This regulator driver controls the VBUS output by the Qualcomm PMIC. This +diff --git a/Documentation/devicetree/bindings/usb/qcom,dwc3.yaml b/Documentation/devicetree/bindings/usb/qcom,dwc3.yaml +index 2cf525d21e05..5b23b80b8c4e 100644 +--- a/Documentation/devicetree/bindings/usb/qcom,dwc3.yaml ++++ b/Documentation/devicetree/bindings/usb/qcom,dwc3.yaml +@@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml# + title: Qualcomm SuperSpeed DWC3 USB SoC controller + + maintainers: +- - Manu Gautam ++ - Wesley Cheng + + properties: + compatible: +-- +2.35.1 + diff --git a/queue-5.10/eeprom-idt_89hpesx-uninitialized-data-in-idt_dbgfs_c.patch b/queue-5.10/eeprom-idt_89hpesx-uninitialized-data-in-idt_dbgfs_c.patch new file mode 100644 index 00000000000..5f662181260 --- /dev/null +++ b/queue-5.10/eeprom-idt_89hpesx-uninitialized-data-in-idt_dbgfs_c.patch @@ -0,0 +1,55 @@ +From ef0766510ccf678b722ba29ad5aafc468cb0ebb2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 Jul 2022 16:46:38 +0300 +Subject: eeprom: idt_89hpesx: uninitialized data in idt_dbgfs_csr_write() + +From: Dan Carpenter + +[ Upstream commit 71d46f1ff2212ced4852c7e77c5176382a1bdcec ] + +The simple_write_to_buffer() function will return positive/success if it +is able to write a single byte anywhere within the buffer. However that +potentially leaves a lot of the buffer uninitialized. + +In this code it's better to return 0 if the offset is non-zero. This +code is not written to support partial writes. And then return -EFAULT +if the buffer is not completely initialized. + +Fixes: cfad6425382e ("eeprom: Add IDT 89HPESx EEPROM/CSR driver") +Reviewed-by: Serge Semin +Signed-off-by: Dan Carpenter +Link: https://lore.kernel.org/r/Ysg1Pu/nzSMe3r1q@kili +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/misc/eeprom/idt_89hpesx.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/drivers/misc/eeprom/idt_89hpesx.c b/drivers/misc/eeprom/idt_89hpesx.c +index 3e4a594c110b..6a456645efb0 100644 +--- a/drivers/misc/eeprom/idt_89hpesx.c ++++ b/drivers/misc/eeprom/idt_89hpesx.c +@@ -940,14 +940,18 @@ static ssize_t idt_dbgfs_csr_write(struct file *filep, const char __user *ubuf, + u32 csraddr, csrval; + char *buf; + ++ if (*offp) ++ return 0; ++ + /* Copy data from User-space */ + buf = kmalloc(count + 1, GFP_KERNEL); + if (!buf) + return -ENOMEM; + +- ret = simple_write_to_buffer(buf, count, offp, ubuf, count); +- if (ret < 0) ++ if (copy_from_user(buf, ubuf, count)) { ++ ret = -EFAULT; + goto free_buf; ++ } + buf[count] = 0; + + /* Find position of colon in the buffer */ +-- +2.35.1 + diff --git a/queue-5.10/erofs-avoid-consecutive-detection-for-highmem-memory.patch b/queue-5.10/erofs-avoid-consecutive-detection-for-highmem-memory.patch new file mode 100644 index 00000000000..9a32c58f6c2 --- /dev/null +++ b/queue-5.10/erofs-avoid-consecutive-detection-for-highmem-memory.patch @@ -0,0 +1,59 @@ +From 441791599365aa6229063ec0e657171318a19b53 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 Jul 2022 18:10:01 +0800 +Subject: erofs: avoid consecutive detection for Highmem memory + +From: Gao Xiang + +[ Upstream commit 448b5a1548d87c246c3d0c3df8480d3c6eb6c11a ] + +Currently, vmap()s are avoided if physical addresses are +consecutive for decompressed buffers. + +I observed that is very common for 4KiB pclusters since the +numbers of decompressed pages are almost 2 or 3. + +However, such detection doesn't work for Highmem pages on +32-bit machines, let's fix it now. + +Reported-by: Liu Jinbao +Fixes: 7fc45dbc938a ("staging: erofs: introduce generic decompression backend") +Link: https://lore.kernel.org/r/20220708101001.21242-1-hsiangkao@linux.alibaba.com +Signed-off-by: Gao Xiang +Signed-off-by: Sasha Levin +--- + fs/erofs/decompressor.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c +index 8a6260aac26c..f921580b56cb 100644 +--- a/fs/erofs/decompressor.c ++++ b/fs/erofs/decompressor.c +@@ -56,14 +56,18 @@ static int z_erofs_lz4_prepare_destpages(struct z_erofs_decompress_req *rq, + + if (page) { + __clear_bit(j, bounced); +- if (kaddr) { +- if (kaddr + PAGE_SIZE == page_address(page)) ++ if (!PageHighMem(page)) { ++ if (!i) { ++ kaddr = page_address(page); ++ continue; ++ } ++ if (kaddr && ++ kaddr + PAGE_SIZE == page_address(page)) { + kaddr += PAGE_SIZE; +- else +- kaddr = NULL; +- } else if (!i) { +- kaddr = page_address(page); ++ continue; ++ } + } ++ kaddr = NULL; + continue; + } + kaddr = NULL; +-- +2.35.1 + diff --git a/queue-5.10/ext2-add-more-validity-checks-for-inode-counts.patch b/queue-5.10/ext2-add-more-validity-checks-for-inode-counts.patch new file mode 100644 index 00000000000..1faaee1a458 --- /dev/null +++ b/queue-5.10/ext2-add-more-validity-checks-for-inode-counts.patch @@ -0,0 +1,55 @@ +From 9957f839008ae91db41d02958d147e9e99b3352d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Jul 2022 13:13:50 +0200 +Subject: ext2: Add more validity checks for inode counts + +From: Jan Kara + +[ Upstream commit fa78f336937240d1bc598db817d638086060e7e9 ] + +Add checks verifying number of inodes stored in the superblock matches +the number computed from number of inodes per group. Also verify we have +at least one block worth of inodes per group. This prevents crashes on +corrupted filesystems. + +Reported-by: syzbot+d273f7d7f58afd93be48@syzkaller.appspotmail.com +Signed-off-by: Jan Kara +Signed-off-by: Sasha Levin +--- + fs/ext2/super.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/fs/ext2/super.c b/fs/ext2/super.c +index b6314d3c6a87..9a6475b2ab28 100644 +--- a/fs/ext2/super.c ++++ b/fs/ext2/super.c +@@ -1060,9 +1060,10 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) + sbi->s_frags_per_group); + goto failed_mount; + } +- if (sbi->s_inodes_per_group > sb->s_blocksize * 8) { ++ if (sbi->s_inodes_per_group < sbi->s_inodes_per_block || ++ sbi->s_inodes_per_group > sb->s_blocksize * 8) { + ext2_msg(sb, KERN_ERR, +- "error: #inodes per group too big: %lu", ++ "error: invalid #inodes per group: %lu", + sbi->s_inodes_per_group); + goto failed_mount; + } +@@ -1072,6 +1073,13 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) + sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) - + le32_to_cpu(es->s_first_data_block) - 1) + / EXT2_BLOCKS_PER_GROUP(sb)) + 1; ++ if ((u64)sbi->s_groups_count * sbi->s_inodes_per_group != ++ le32_to_cpu(es->s_inodes_count)) { ++ ext2_msg(sb, KERN_ERR, "error: invalid #inodes: %u vs computed %llu", ++ le32_to_cpu(es->s_inodes_count), ++ (u64)sbi->s_groups_count * sbi->s_inodes_per_group); ++ goto failed_mount; ++ } + db_count = (sbi->s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) / + EXT2_DESC_PER_BLOCK(sb); + sbi->s_group_desc = kmalloc_array (db_count, +-- +2.35.1 + diff --git a/queue-5.10/ext4-recover-csum-seed-of-tmp_inode-after-migrating-.patch b/queue-5.10/ext4-recover-csum-seed-of-tmp_inode-after-migrating-.patch new file mode 100644 index 00000000000..6a0d1071cb3 --- /dev/null +++ b/queue-5.10/ext4-recover-csum-seed-of-tmp_inode-after-migrating-.patch @@ -0,0 +1,76 @@ +From 2e44cd3c06ac2fbf2c3911f2c53ec7ee047cd811 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 Jun 2022 14:25:15 +0800 +Subject: ext4: recover csum seed of tmp_inode after migrating to extents + +From: Li Lingfeng + +[ Upstream commit 07ea7a617d6b278fb7acedb5cbe1a81ce2de7d0c ] + +When migrating to extents, the checksum seed of temporary inode +need to be replaced by inode's, otherwise the inode checksums +will be incorrect when swapping the inodes data. + +However, the temporary inode can not match it's checksum to +itself since it has lost it's own checksum seed. + +mkfs.ext4 -F /dev/sdc +mount /dev/sdc /mnt/sdc +xfs_io -fc "pwrite 4k 4k" -c "fsync" /mnt/sdc/testfile +chattr -e /mnt/sdc/testfile +chattr +e /mnt/sdc/testfile +umount /dev/sdc +fsck -fn /dev/sdc + +======== +... +Pass 1: Checking inodes, blocks, and sizes +Inode 13 passes checks, but checksum does not match inode. Fix? no +... +======== + +The fix is simple, save the checksum seed of temporary inode, and +recover it after migrating to extents. + +Fixes: e81c9302a6c3 ("ext4: set csum seed in tmp inode while migrating to extents") +Signed-off-by: Li Lingfeng +Reviewed-by: Jan Kara +Link: https://lore.kernel.org/r/20220617062515.2113438-1-lilingfeng3@huawei.com +Signed-off-by: Theodore Ts'o +Signed-off-by: Sasha Levin +--- + fs/ext4/migrate.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c +index 49912814f3d8..04320715d61f 100644 +--- a/fs/ext4/migrate.c ++++ b/fs/ext4/migrate.c +@@ -417,7 +417,7 @@ int ext4_ext_migrate(struct inode *inode) + struct inode *tmp_inode = NULL; + struct migrate_struct lb; + unsigned long max_entries; +- __u32 goal; ++ __u32 goal, tmp_csum_seed; + uid_t owner[2]; + + /* +@@ -465,6 +465,7 @@ int ext4_ext_migrate(struct inode *inode) + * the migration. + */ + ei = EXT4_I(inode); ++ tmp_csum_seed = EXT4_I(tmp_inode)->i_csum_seed; + EXT4_I(tmp_inode)->i_csum_seed = ei->i_csum_seed; + i_size_write(tmp_inode, i_size_read(inode)); + /* +@@ -575,6 +576,7 @@ int ext4_ext_migrate(struct inode *inode) + * the inode is not visible to user space. + */ + tmp_inode->i_blocks = 0; ++ EXT4_I(tmp_inode)->i_csum_seed = tmp_csum_seed; + + /* Reset the extent details */ + ext4_ext_tree_init(handle, tmp_inode); +-- +2.35.1 + diff --git a/queue-5.10/f2fs-don-t-set-gc_failure_pin-for-background-gc.patch b/queue-5.10/f2fs-don-t-set-gc_failure_pin-for-background-gc.patch new file mode 100644 index 00000000000..f834e60e442 --- /dev/null +++ b/queue-5.10/f2fs-don-t-set-gc_failure_pin-for-background-gc.patch @@ -0,0 +1,36 @@ +From 776a88de5a5ed93b884c68db0d4e47b084a7cca2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 20 Mar 2022 23:11:18 +0800 +Subject: f2fs: don't set GC_FAILURE_PIN for background GC + +From: Chao Yu + +[ Upstream commit 642c0969916eaa4878cb74f36752108e590b0389 ] + +So that it can reduce the possibility that file be unpinned forcely by +foreground GC due to .i_gc_failures[GC_FAILURE_PIN] exceeds threshold. + +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/gc.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c +index 24e93fb254c5..22bb5e07f656 100644 +--- a/fs/f2fs/gc.c ++++ b/fs/f2fs/gc.c +@@ -1158,7 +1158,8 @@ static int move_data_block(struct inode *inode, block_t bidx, + } + + if (f2fs_is_pinned_file(inode)) { +- f2fs_pin_file_control(inode, true); ++ if (gc_type == FG_GC) ++ f2fs_pin_file_control(inode, true); + err = -EAGAIN; + goto out; + } +-- +2.35.1 + diff --git a/queue-5.10/f2fs-fix-to-remove-f2fs_compr_fl-and-tag-f2fs_nocomp.patch b/queue-5.10/f2fs-fix-to-remove-f2fs_compr_fl-and-tag-f2fs_nocomp.patch new file mode 100644 index 00000000000..0b1c35864b7 --- /dev/null +++ b/queue-5.10/f2fs-fix-to-remove-f2fs_compr_fl-and-tag-f2fs_nocomp.patch @@ -0,0 +1,83 @@ +From dec5b494f857f8522d6edb700e3d73c3b340da45 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Jul 2022 18:16:33 +0800 +Subject: f2fs: fix to remove F2FS_COMPR_FL and tag F2FS_NOCOMP_FL at the same + time + +From: Chao Liu + +[ Upstream commit 8ee236dcaa690d09ca612622e8bc8d09c302021d ] + +If the inode has the compress flag, it will fail to use +'chattr -c +m' to remove its compress flag and tag no compress flag. +However, the same command will be successful when executed again, +as shown below: + + $ touch foo.txt + $ chattr +c foo.txt + $ chattr -c +m foo.txt + chattr: Invalid argument while setting flags on foo.txt + $ chattr -c +m foo.txt + $ f2fs_io getflags foo.txt + get a flag on foo.txt ret=0, flags=nocompression,inline_data + +Fix this by removing some checks in f2fs_setflags_common() +that do not affect the original logic. I go through all the +possible scenarios, and the results are as follows. Bold is +the only thing that has changed. + ++---------------+-----------+-----------+----------+ +| | file flags | ++ command +-----------+-----------+----------+ +| | no flag | compr | nocompr | ++---------------+-----------+-----------+----------+ +| chattr +c | compr | compr | -EINVAL | +| chattr -c | no flag | no flag | nocompr | +| chattr +m | nocompr | -EINVAL | nocompr | +| chattr -m | no flag | compr | no flag | +| chattr +c +m | -EINVAL | -EINVAL | -EINVAL | +| chattr +c -m | compr | compr | compr | +| chattr -c +m | nocompr | *nocompr* | nocompr | +| chattr -c -m | no flag | no flag | no flag | ++---------------+-----------+-----------+----------+ + +Link: https://lore.kernel.org/linux-f2fs-devel/20220621064833.1079383-1-chaoliu719@gmail.com/ +Fixes: 4c8ff7095bef ("f2fs: support data compression") +Reviewed-by: Chao Yu +Signed-off-by: Chao Liu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/file.c | 9 +-------- + 1 file changed, 1 insertion(+), 8 deletions(-) + +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index defa068b4c7c..d56fcace1821 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -1844,10 +1844,7 @@ static int f2fs_setflags_common(struct inode *inode, u32 iflags, u32 mask) + if (masked_flags & F2FS_COMPR_FL) { + if (!f2fs_disable_compressed_file(inode)) + return -EINVAL; +- } +- if (iflags & F2FS_NOCOMP_FL) +- return -EINVAL; +- if (iflags & F2FS_COMPR_FL) { ++ } else { + if (!f2fs_may_compress(inode)) + return -EINVAL; + if (S_ISREG(inode->i_mode) && inode->i_size) +@@ -1856,10 +1853,6 @@ static int f2fs_setflags_common(struct inode *inode, u32 iflags, u32 mask) + set_compress_context(inode); + } + } +- if ((iflags ^ masked_flags) & F2FS_NOCOMP_FL) { +- if (masked_flags & F2FS_COMPR_FL) +- return -EINVAL; +- } + + fi->i_flags = iflags | (fi->i_flags & ~mask); + f2fs_bug_on(F2FS_I_SB(inode), (fi->i_flags & F2FS_COMPR_FL) && +-- +2.35.1 + diff --git a/queue-5.10/f2fs-write-checkpoint-during-fg_gc.patch b/queue-5.10/f2fs-write-checkpoint-during-fg_gc.patch new file mode 100644 index 00000000000..7db0979c605 --- /dev/null +++ b/queue-5.10/f2fs-write-checkpoint-during-fg_gc.patch @@ -0,0 +1,75 @@ +From dab7f8e6e9fc3e6d08385a6749d63e3097dce159 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Apr 2022 13:29:53 -0700 +Subject: f2fs: write checkpoint during FG_GC + +From: Byungki Lee + +[ Upstream commit a9163b947ae8f7af7cb8d63606cd87b9facbfe74 ] + +If there's not enough free sections each of which consistis of large segments, +we can hit no free section for upcoming section allocation. Let's reclaim some +prefree segments by writing checkpoints. + +Signed-off-by: Byungki Lee +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/gc.c | 38 +++++++++++++++++++++++--------------- + 1 file changed, 23 insertions(+), 15 deletions(-) + +diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c +index 22bb5e07f656..3b53fdebf03d 100644 +--- a/fs/f2fs/gc.c ++++ b/fs/f2fs/gc.c +@@ -1741,23 +1741,31 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, + if (sync) + goto stop; + +- if (has_not_enough_free_secs(sbi, sec_freed, 0)) { +- if (skipped_round <= MAX_SKIP_GC_COUNT || +- skipped_round * 2 < round) { +- segno = NULL_SEGNO; +- goto gc_more; +- } ++ if (!has_not_enough_free_secs(sbi, sec_freed, 0)) ++ goto stop; + +- if (first_skipped < last_skipped && +- (last_skipped - first_skipped) > +- sbi->skipped_gc_rwsem) { +- f2fs_drop_inmem_pages_all(sbi, true); +- segno = NULL_SEGNO; +- goto gc_more; +- } +- if (gc_type == FG_GC && !is_sbi_flag_set(sbi, SBI_CP_DISABLED)) ++ if (skipped_round <= MAX_SKIP_GC_COUNT || skipped_round * 2 < round) { ++ ++ /* Write checkpoint to reclaim prefree segments */ ++ if (free_sections(sbi) < NR_CURSEG_PERSIST_TYPE && ++ prefree_segments(sbi) && ++ !is_sbi_flag_set(sbi, SBI_CP_DISABLED)) { + ret = f2fs_write_checkpoint(sbi, &cpc); +- } ++ if (ret) ++ goto stop; ++ } ++ segno = NULL_SEGNO; ++ goto gc_more; ++ } ++ if (first_skipped < last_skipped && ++ (last_skipped - first_skipped) > ++ sbi->skipped_gc_rwsem) { ++ f2fs_drop_inmem_pages_all(sbi, true); ++ segno = NULL_SEGNO; ++ goto gc_more; ++ } ++ if (gc_type == FG_GC && !is_sbi_flag_set(sbi, SBI_CP_DISABLED)) ++ ret = f2fs_write_checkpoint(sbi, &cpc); + stop: + SIT_I(sbi)->last_victim[ALLOC_NEXT] = 0; + SIT_I(sbi)->last_victim[FLUSH_DEVICE] = init_segno; +-- +2.35.1 + diff --git a/queue-5.10/firmware-tegra-fix-error-check-return-value-of-debug.patch b/queue-5.10/firmware-tegra-fix-error-check-return-value-of-debug.patch new file mode 100644 index 00000000000..90155838eeb --- /dev/null +++ b/queue-5.10/firmware-tegra-fix-error-check-return-value-of-debug.patch @@ -0,0 +1,69 @@ +From cd1694fdba54f6a5a4613924007e9e9a80123779 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Apr 2022 01:36:48 +0000 +Subject: firmware: tegra: Fix error check return value of + debugfs_create_file() + +From: Lv Ruyi + +[ Upstream commit afcdb8e55c91c6ff0700ab272fd0f74e899ab884 ] + +If an error occurs, debugfs_create_file() will return ERR_PTR(-ERROR), +so use IS_ERR() to check it. + +Reported-by: Zeal Robot +Signed-off-by: Lv Ruyi +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/firmware/tegra/bpmp-debugfs.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/firmware/tegra/bpmp-debugfs.c b/drivers/firmware/tegra/bpmp-debugfs.c +index 440d99c63638..fad97ec8e81f 100644 +--- a/drivers/firmware/tegra/bpmp-debugfs.c ++++ b/drivers/firmware/tegra/bpmp-debugfs.c +@@ -429,7 +429,7 @@ static int bpmp_populate_debugfs_inband(struct tegra_bpmp *bpmp, + mode |= attrs & DEBUGFS_S_IWUSR ? 0200 : 0; + dentry = debugfs_create_file(name, mode, parent, bpmp, + &bpmp_debug_fops); +- if (!dentry) { ++ if (IS_ERR(dentry)) { + err = -ENOMEM; + goto out; + } +@@ -680,7 +680,7 @@ static int bpmp_populate_dir(struct tegra_bpmp *bpmp, struct seqbuf *seqbuf, + + if (t & DEBUGFS_S_ISDIR) { + dentry = debugfs_create_dir(name, parent); +- if (!dentry) ++ if (IS_ERR(dentry)) + return -ENOMEM; + err = bpmp_populate_dir(bpmp, seqbuf, dentry, depth+1); + if (err < 0) +@@ -693,7 +693,7 @@ static int bpmp_populate_dir(struct tegra_bpmp *bpmp, struct seqbuf *seqbuf, + dentry = debugfs_create_file(name, mode, + parent, bpmp, + &debugfs_fops); +- if (!dentry) ++ if (IS_ERR(dentry)) + return -ENOMEM; + } + } +@@ -743,11 +743,11 @@ int tegra_bpmp_init_debugfs(struct tegra_bpmp *bpmp) + return 0; + + root = debugfs_create_dir("bpmp", NULL); +- if (!root) ++ if (IS_ERR(root)) + return -ENOMEM; + + bpmp->debugfs_mirror = debugfs_create_dir("debug", root); +- if (!bpmp->debugfs_mirror) { ++ if (IS_ERR(bpmp->debugfs_mirror)) { + err = -ENOMEM; + goto out; + } +-- +2.35.1 + diff --git a/queue-5.10/fpga-altera-pr-ip-fix-unsigned-comparison-with-less-.patch b/queue-5.10/fpga-altera-pr-ip-fix-unsigned-comparison-with-less-.patch new file mode 100644 index 00000000000..e98ba0d584b --- /dev/null +++ b/queue-5.10/fpga-altera-pr-ip-fix-unsigned-comparison-with-less-.patch @@ -0,0 +1,40 @@ +From 4f23efff2b45d2e7ff47db3c5a31a386343decc4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Jun 2022 16:05:19 +0200 +Subject: fpga: altera-pr-ip: fix unsigned comparison with less than zero + +From: Marco Pagani + +[ Upstream commit 2df84a757d87fd62869fc401119d429735377ec5 ] + +Fix the "comparison with less than zero" warning reported by +cppcheck for the unsigned (size_t) parameter count of the +alt_pr_fpga_write() function. + +Fixes: d201cc17a8a3 ("fpga pr ip: Core driver support for Altera Partial Reconfiguration IP") +Reviewed-by: Tom Rix +Acked-by: Xu Yilun +Signed-off-by: Marco Pagani +Link: https://lore.kernel.org/r/20220609140520.42662-1-marpagan@redhat.com +Signed-off-by: Xu Yilun +Signed-off-by: Sasha Levin +--- + drivers/fpga/altera-pr-ip-core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/fpga/altera-pr-ip-core.c b/drivers/fpga/altera-pr-ip-core.c +index 2cf25fd5e897..75b4b3ec933a 100644 +--- a/drivers/fpga/altera-pr-ip-core.c ++++ b/drivers/fpga/altera-pr-ip-core.c +@@ -108,7 +108,7 @@ static int alt_pr_fpga_write(struct fpga_manager *mgr, const char *buf, + u32 *buffer_32 = (u32 *)buf; + size_t i = 0; + +- if (count <= 0) ++ if (!count) + return -EINVAL; + + /* Write out the complete 32-bit chunks */ +-- +2.35.1 + diff --git a/queue-5.10/fs-check-fmode_lseek-to-control-internal-pipe-splici.patch b/queue-5.10/fs-check-fmode_lseek-to-control-internal-pipe-splici.patch new file mode 100644 index 00000000000..f8565281b3a --- /dev/null +++ b/queue-5.10/fs-check-fmode_lseek-to-control-internal-pipe-splici.patch @@ -0,0 +1,58 @@ +From 637aaa6ee18e6dfcaa79d0a4f2ae2a2778d369f8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 29 Jun 2022 15:06:58 +0200 +Subject: fs: check FMODE_LSEEK to control internal pipe splicing + +From: Jason A. Donenfeld + +[ Upstream commit 97ef77c52b789ec1411d360ed99dca1efe4b2c81 ] + +The original direct splicing mechanism from Jens required the input to +be a regular file because it was avoiding the special socket case. It +also recognized blkdevs as being close enough to a regular file. But it +forgot about chardevs, which behave the same way and work fine here. + +This is an okayish heuristic, but it doesn't totally work. For example, +a few chardevs should be spliceable here. And a few regular files +shouldn't. This patch fixes this by instead checking whether FMODE_LSEEK +is set, which represents decently enough what we need rewinding for when +splicing to internal pipes. + +Fixes: b92ce5589374 ("[PATCH] splice: add direct fd <-> fd splicing support") +Cc: Jens Axboe +Signed-off-by: Jason A. Donenfeld +Signed-off-by: Al Viro +Signed-off-by: Sasha Levin +--- + fs/splice.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +diff --git a/fs/splice.c b/fs/splice.c +index 866d5c2367b2..6610e55c0e2a 100644 +--- a/fs/splice.c ++++ b/fs/splice.c +@@ -806,17 +806,15 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, + { + struct pipe_inode_info *pipe; + long ret, bytes; +- umode_t i_mode; + size_t len; + int i, flags, more; + + /* +- * We require the input being a regular file, as we don't want to +- * randomly drop data for eg socket -> socket splicing. Use the +- * piped splicing for that! ++ * We require the input to be seekable, as we don't want to randomly ++ * drop data for eg socket -> socket splicing. Use the piped splicing ++ * for that! + */ +- i_mode = file_inode(in)->i_mode; +- if (unlikely(!S_ISREG(i_mode) && !S_ISBLK(i_mode))) ++ if (unlikely(!(in->f_mode & FMODE_LSEEK))) + return -EINVAL; + + /* +-- +2.35.1 + diff --git a/queue-5.10/fuse-remove-the-control-interface-for-virtio-fs.patch b/queue-5.10/fuse-remove-the-control-interface-for-virtio-fs.patch new file mode 100644 index 00000000000..f5f970c62b8 --- /dev/null +++ b/queue-5.10/fuse-remove-the-control-interface-for-virtio-fs.patch @@ -0,0 +1,50 @@ +From a2f6b7222dd9304ef22577268cda1e1d0c0cb893 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jul 2022 16:50:12 +0800 +Subject: fuse: Remove the control interface for virtio-fs + +From: Xie Yongji + +[ Upstream commit c64797809a64c73497082aa05e401a062ec1af34 ] + +The commit 15c8e72e88e0 ("fuse: allow skipping control interface and forced +unmount") tries to remove the control interface for virtio-fs since it does +not support aborting requests which are being processed. But it doesn't +work now. + +This patch fixes it by skipping creating the control interface if +fuse_conn->no_control is set. + +Fixes: 15c8e72e88e0 ("fuse: allow skipping control interface and forced unmount") +Signed-off-by: Xie Yongji +Signed-off-by: Miklos Szeredi +Signed-off-by: Sasha Levin +--- + fs/fuse/control.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/fs/fuse/control.c b/fs/fuse/control.c +index cc7e94d73c6c..24b4d9db231d 100644 +--- a/fs/fuse/control.c ++++ b/fs/fuse/control.c +@@ -275,7 +275,7 @@ int fuse_ctl_add_conn(struct fuse_conn *fc) + struct dentry *parent; + char name[32]; + +- if (!fuse_control_sb) ++ if (!fuse_control_sb || fc->no_control) + return 0; + + parent = fuse_control_sb->s_root; +@@ -313,7 +313,7 @@ void fuse_ctl_remove_conn(struct fuse_conn *fc) + { + int i; + +- if (!fuse_control_sb) ++ if (!fuse_control_sb || fc->no_control) + return; + + for (i = fc->ctl_ndents - 1; i >= 0; i--) { +-- +2.35.1 + diff --git a/queue-5.10/genelf-use-have_libcrypto_support-not-the-never-defi.patch b/queue-5.10/genelf-use-have_libcrypto_support-not-the-never-defi.patch new file mode 100644 index 00000000000..2c2c2ad326b --- /dev/null +++ b/queue-5.10/genelf-use-have_libcrypto_support-not-the-never-defi.patch @@ -0,0 +1,59 @@ +From b5e02cea6c3ae104b4f1678ec45821f982b2cb77 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Aug 2022 15:13:22 -0300 +Subject: genelf: Use HAVE_LIBCRYPTO_SUPPORT, not the never defined + HAVE_LIBCRYPTO +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Arnaldo Carvalho de Melo + +[ Upstream commit 91cea6be90e436c55cde8770a15e4dac9d3032d0 ] + +When genelf was introduced it tested for HAVE_LIBCRYPTO not +HAVE_LIBCRYPTO_SUPPORT, which is the define the feature test for openssl +defines, fix it. + +This also adds disables the deprecation warning, someone has to fix this +to build with openssl 3.0 before the warning becomes a hard error. + +Fixes: 9b07e27f88b9cd78 ("perf inject: Add jitdump mmap injection support") +Reported-by: 谭梓煊 +Cc: Alexei Starovoitov +Cc: Andrii Nakryiko +Cc: Daniel Borkmann +Cc: Jiri Olsa +Cc: John Fastabend +Cc: KP Singh +Cc: Martin KaFai Lau +Cc: Nick Terrell +Cc: Song Liu +Cc: Stephane Eranian +Link: http://lore.kernel.org/lkml/YulpPqXSOG0Q4J1o@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/genelf.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/tools/perf/util/genelf.c b/tools/perf/util/genelf.c +index aed49806a09b..953338b9e887 100644 +--- a/tools/perf/util/genelf.c ++++ b/tools/perf/util/genelf.c +@@ -30,7 +30,11 @@ + + #define BUILD_ID_URANDOM /* different uuid for each run */ + +-#ifdef HAVE_LIBCRYPTO ++// FIXME, remove this and fix the deprecation warnings before its removed and ++// We'll break for good here... ++#pragma GCC diagnostic ignored "-Wdeprecated-declarations" ++ ++#ifdef HAVE_LIBCRYPTO_SUPPORT + + #define BUILD_ID_MD5 + #undef BUILD_ID_SHA /* does not seem to work well when linked with Java */ +-- +2.35.1 + diff --git a/queue-5.10/genirq-don-t-return-error-on-missing-optional-irq_re.patch b/queue-5.10/genirq-don-t-return-error-on-missing-optional-irq_re.patch new file mode 100644 index 00000000000..4a89408788a --- /dev/null +++ b/queue-5.10/genirq-don-t-return-error-on-missing-optional-irq_re.patch @@ -0,0 +1,42 @@ +From 924bcb268fc7f36aa6d1f6aadd301b6045f2f884 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 12 May 2022 18:05:44 +0200 +Subject: genirq: Don't return error on missing optional + irq_request_resources() + +From: Antonio Borneo + +[ Upstream commit 95001b756467ecc9f5973eb5e74e97699d9bbdf1 ] + +Function irq_chip::irq_request_resources() is reported as optional +in the declaration of struct irq_chip. +If the parent irq_chip does not implement it, we should ignore it +and return. + +Don't return error if the functions is missing. + +Signed-off-by: Antonio Borneo +Signed-off-by: Marc Zyngier +Link: https://lore.kernel.org/r/20220512160544.13561-1-antonio.borneo@foss.st.com +Signed-off-by: Sasha Levin +--- + kernel/irq/chip.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c +index 0b70811fd956..621d8dd157bc 100644 +--- a/kernel/irq/chip.c ++++ b/kernel/irq/chip.c +@@ -1543,7 +1543,8 @@ int irq_chip_request_resources_parent(struct irq_data *data) + if (data->chip->irq_request_resources) + return data->chip->irq_request_resources(data); + +- return -ENOSYS; ++ /* no error on missing optional irq_chip::irq_request_resources */ ++ return 0; + } + EXPORT_SYMBOL_GPL(irq_chip_request_resources_parent); + +-- +2.35.1 + diff --git a/queue-5.10/genirq-generic_irq_ipi-depends-on-smp.patch b/queue-5.10/genirq-generic_irq_ipi-depends-on-smp.patch new file mode 100644 index 00000000000..68e997a59c9 --- /dev/null +++ b/queue-5.10/genirq-generic_irq_ipi-depends-on-smp.patch @@ -0,0 +1,51 @@ +From 05465ea7c479972b03cf83050ad098f2ea2a038c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 15:00:50 -0500 +Subject: genirq: GENERIC_IRQ_IPI depends on SMP + +From: Samuel Holland + +[ Upstream commit 0f5209fee90b4544c58b4278d944425292789967 ] + +The generic IPI code depends on the IRQ affinity mask being allocated +and initialized. This will not be the case if SMP is disabled. Fix up +the remaining driver that selected GENERIC_IRQ_IPI in a non-SMP config. + +Reported-by: kernel test robot +Signed-off-by: Samuel Holland +Signed-off-by: Marc Zyngier +Link: https://lore.kernel.org/r/20220701200056.46555-3-samuel@sholland.org +Signed-off-by: Sasha Levin +--- + drivers/irqchip/Kconfig | 2 +- + kernel/irq/Kconfig | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig +index c4b971cd239d..3c24bf45263c 100644 +--- a/drivers/irqchip/Kconfig ++++ b/drivers/irqchip/Kconfig +@@ -178,7 +178,7 @@ config MADERA_IRQ + config IRQ_MIPS_CPU + bool + select GENERIC_IRQ_CHIP +- select GENERIC_IRQ_IPI if SYS_SUPPORTS_MULTITHREADING ++ select GENERIC_IRQ_IPI if SMP && SYS_SUPPORTS_MULTITHREADING + select IRQ_DOMAIN + select GENERIC_IRQ_EFFECTIVE_AFF_MASK + +diff --git a/kernel/irq/Kconfig b/kernel/irq/Kconfig +index 164a031cfdb6..0f2a44fc0971 100644 +--- a/kernel/irq/Kconfig ++++ b/kernel/irq/Kconfig +@@ -82,6 +82,7 @@ config IRQ_FASTEOI_HIERARCHY_HANDLERS + # Generic IRQ IPI support + config GENERIC_IRQ_IPI + bool ++ depends on SMP + select IRQ_DOMAIN_HIERARCHY + + # Generic MSI interrupt support +-- +2.35.1 + diff --git a/queue-5.10/gpio-gpiolib-of-fix-refcount-bugs-in-of_mm_gpiochip_.patch b/queue-5.10/gpio-gpiolib-of-fix-refcount-bugs-in-of_mm_gpiochip_.patch new file mode 100644 index 00000000000..3bc0b82fd82 --- /dev/null +++ b/queue-5.10/gpio-gpiolib-of-fix-refcount-bugs-in-of_mm_gpiochip_.patch @@ -0,0 +1,53 @@ +From c8c3abd8ca1911d33bcdd9a655d53f9c0e3d8fd3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jul 2022 20:52:38 +0800 +Subject: gpio: gpiolib-of: Fix refcount bugs in of_mm_gpiochip_add_data() + +From: Liang He + +[ Upstream commit 5d07a692f9562f9c06e62cce369e9dd108173a0f ] + +We should use of_node_get() when a new reference of device_node +is created. It is noted that the old reference stored in +'mm_gc->gc.of_node' should also be decreased. + +This patch is based on the fact that there is a call site in function +'qe_add_gpiochips()' of src file 'drivers\soc\fsl\qe\gpio.c'. In this +function, of_mm_gpiochip_add_data() is contained in an iteration of +for_each_compatible_node() which will automatically increase and +decrease the refcount. So we need additional of_node_get() for the +reference escape in of_mm_gpiochip_add_data(). + +Fixes: a19e3da5bc5f ("of/gpio: Kill of_gpio_chip and add members directly to gpio_chip") +Signed-off-by: Liang He +Signed-off-by: Bartosz Golaszewski +Signed-off-by: Sasha Levin +--- + drivers/gpio/gpiolib-of.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c +index 01424af654db..2e63274a4c2c 100644 +--- a/drivers/gpio/gpiolib-of.c ++++ b/drivers/gpio/gpiolib-of.c +@@ -863,7 +863,8 @@ int of_mm_gpiochip_add_data(struct device_node *np, + if (mm_gc->save_regs) + mm_gc->save_regs(mm_gc); + +- mm_gc->gc.of_node = np; ++ of_node_put(mm_gc->gc.of_node); ++ mm_gc->gc.of_node = of_node_get(np); + + ret = gpiochip_add_data(gc, data); + if (ret) +@@ -871,6 +872,7 @@ int of_mm_gpiochip_add_data(struct device_node *np, + + return 0; + err2: ++ of_node_put(np); + iounmap(mm_gc->regs); + err1: + kfree(gc->label); +-- +2.35.1 + diff --git a/queue-5.10/hexagon-select-arch_want_ld_orphan_warn.patch b/queue-5.10/hexagon-select-arch_want_ld_orphan_warn.patch new file mode 100644 index 00000000000..5a8623423b9 --- /dev/null +++ b/queue-5.10/hexagon-select-arch_want_ld_orphan_warn.patch @@ -0,0 +1,42 @@ +From c93c5f75962b1efdd6da74e27d4cfac77f122d37 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 7 Jul 2021 18:07:44 -0700 +Subject: hexagon: select ARCH_WANT_LD_ORPHAN_WARN + +From: Nathan Chancellor + +[ Upstream commit 113616ec5b64b23a1c9b663adafadabdfbec0f51 ] + +Now that we handle all of the sections in a Hexagon defconfig, select +ARCH_WANT_LD_ORPHAN_WARN so that unhandled sections are warned about by +default. + +Link: https://lkml.kernel.org/r/20210521011239.1332345-4-nathan@kernel.org +Signed-off-by: Nathan Chancellor +Reviewed-by: Nick Desaulniers +Acked-by: Brian Cain +Cc: David Rientjes +Cc: Oliver Glitta +Cc: Vlastimil Babka +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + arch/hexagon/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/hexagon/Kconfig b/arch/hexagon/Kconfig +index f2afabbadd43..cc2c1ae48e62 100644 +--- a/arch/hexagon/Kconfig ++++ b/arch/hexagon/Kconfig +@@ -32,6 +32,7 @@ config HEXAGON + select MODULES_USE_ELF_RELA + select GENERIC_CPU_DEVICES + select SET_FS ++ select ARCH_WANT_LD_ORPHAN_WARN + help + Qualcomm Hexagon is a processor architecture designed for high + performance and low power across a wide variety of applications. +-- +2.35.1 + diff --git a/queue-5.10/hid-alps-declare-u1_unicorn_legacy-support.patch b/queue-5.10/hid-alps-declare-u1_unicorn_legacy-support.patch new file mode 100644 index 00000000000..647caa5d064 --- /dev/null +++ b/queue-5.10/hid-alps-declare-u1_unicorn_legacy-support.patch @@ -0,0 +1,36 @@ +From 1e9b91788ce17a4b5c0cf69549ef486ace755584 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 17:53:24 +0300 +Subject: HID: alps: Declare U1_UNICORN_LEGACY support + +From: Artem Borisov + +[ Upstream commit 1117d182c5d72abd7eb8b7d5e7b8c3373181c3ab ] + +U1_UNICORN_LEGACY id was added to the driver, but was not declared +in the device id table, making it impossible to use. + +Fixes: 640e403 ("HID: alps: Add AUI1657 device ID") +Signed-off-by: Artem Borisov +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + drivers/hid/hid-alps.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/hid/hid-alps.c b/drivers/hid/hid-alps.c +index 6b665931147d..ef73fef1b3e3 100644 +--- a/drivers/hid/hid-alps.c ++++ b/drivers/hid/hid-alps.c +@@ -830,6 +830,8 @@ static const struct hid_device_id alps_id[] = { + USB_VENDOR_ID_ALPS_JP, HID_DEVICE_ID_ALPS_U1_DUAL) }, + { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, + USB_VENDOR_ID_ALPS_JP, HID_DEVICE_ID_ALPS_U1) }, ++ { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, ++ USB_VENDOR_ID_ALPS_JP, HID_DEVICE_ID_ALPS_U1_UNICORN_LEGACY) }, + { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, + USB_VENDOR_ID_ALPS_JP, HID_DEVICE_ID_ALPS_T4_BTNLESS) }, + { } +-- +2.35.1 + diff --git a/queue-5.10/hid-cp2112-prevent-a-buffer-overflow-in-cp2112_xfer.patch b/queue-5.10/hid-cp2112-prevent-a-buffer-overflow-in-cp2112_xfer.patch new file mode 100644 index 00000000000..3d729a39ab9 --- /dev/null +++ b/queue-5.10/hid-cp2112-prevent-a-buffer-overflow-in-cp2112_xfer.patch @@ -0,0 +1,47 @@ +From 0ea5f0b4b44bf1f5fdfccb9624fb08c49d9f85c1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Jun 2022 05:26:09 -0700 +Subject: HID: cp2112: prevent a buffer overflow in cp2112_xfer() + +From: Harshit Mogalapalli + +[ Upstream commit 381583845d19cb4bd21c8193449385f3fefa9caf ] + +Smatch warnings: +drivers/hid/hid-cp2112.c:793 cp2112_xfer() error: __memcpy() +'data->block[1]' too small (33 vs 255) +drivers/hid/hid-cp2112.c:793 cp2112_xfer() error: __memcpy() 'buf' too +small (64 vs 255) + +The 'read_length' variable is provided by 'data->block[0]' which comes +from user and it(read_length) can take a value between 0-255. Add an +upper bound to 'read_length' variable to prevent a buffer overflow in +memcpy(). + +Fixes: 542134c0375b ("HID: cp2112: Fix I2C_BLOCK_DATA transactions") +Signed-off-by: Harshit Mogalapalli +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + drivers/hid/hid-cp2112.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c +index 477baa30889c..172f20e88c6c 100644 +--- a/drivers/hid/hid-cp2112.c ++++ b/drivers/hid/hid-cp2112.c +@@ -788,6 +788,11 @@ static int cp2112_xfer(struct i2c_adapter *adap, u16 addr, + data->word = le16_to_cpup((__le16 *)buf); + break; + case I2C_SMBUS_I2C_BLOCK_DATA: ++ if (read_length > I2C_SMBUS_BLOCK_MAX) { ++ ret = -EINVAL; ++ goto power_normal; ++ } ++ + memcpy(data->block + 1, buf, read_length); + break; + case I2C_SMBUS_BLOCK_DATA: +-- +2.35.1 + diff --git a/queue-5.10/hid-mcp2221-prevent-a-buffer-overflow-in-mcp_smbus_w.patch b/queue-5.10/hid-mcp2221-prevent-a-buffer-overflow-in-mcp_smbus_w.patch new file mode 100644 index 00000000000..0d76b19f905 --- /dev/null +++ b/queue-5.10/hid-mcp2221-prevent-a-buffer-overflow-in-mcp_smbus_w.patch @@ -0,0 +1,44 @@ +From cb9e4d90dc4c2f6b7a9b51b5c6c71aa2393524b8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Jun 2022 09:28:24 -0700 +Subject: HID: mcp2221: prevent a buffer overflow in mcp_smbus_write() + +From: Harshit Mogalapalli + +[ Upstream commit 62ac2473553a00229e67bdf3cb023b62cf7f5a9a ] + +Smatch Warning: +drivers/hid/hid-mcp2221.c:388 mcp_smbus_write() error: __memcpy() +'&mcp->txbuf[5]' too small (59 vs 255) +drivers/hid/hid-mcp2221.c:388 mcp_smbus_write() error: __memcpy() 'buf' +too small (34 vs 255) + +The 'len' variable can take a value between 0-255 as it can come from +data->block[0] and it is user data. So add an bound check to prevent a +buffer overflow in memcpy(). + +Fixes: 67a95c21463d ("HID: mcp2221: add usb to i2c-smbus host bridge") +Signed-off-by: Harshit Mogalapalli +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + drivers/hid/hid-mcp2221.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/hid/hid-mcp2221.c b/drivers/hid/hid-mcp2221.c +index 4211b9839209..de52e9f7bb8c 100644 +--- a/drivers/hid/hid-mcp2221.c ++++ b/drivers/hid/hid-mcp2221.c +@@ -385,6 +385,9 @@ static int mcp_smbus_write(struct mcp2221 *mcp, u16 addr, + data_len = 7; + break; + default: ++ if (len > I2C_SMBUS_BLOCK_MAX) ++ return -EINVAL; ++ + memcpy(&mcp->txbuf[5], buf, len); + data_len = len + 5; + } +-- +2.35.1 + diff --git a/queue-5.10/hinic-use-the-bitmap-api-when-applicable.patch b/queue-5.10/hinic-use-the-bitmap-api-when-applicable.patch new file mode 100644 index 00000000000..4c070e0ade7 --- /dev/null +++ b/queue-5.10/hinic-use-the-bitmap-api-when-applicable.patch @@ -0,0 +1,56 @@ +From 514b794a8b8b5ee05692b1806cfe5d3d0f2dc62a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 26 Jun 2022 18:27:45 +0200 +Subject: hinic: Use the bitmap API when applicable + +From: Christophe JAILLET + +[ Upstream commit 7c2c57263af41cfd8b5022274e6801542831bb69 ] + +'vlan_bitmap' is a bitmap and is used as such. So allocate it with +devm_bitmap_zalloc() and its explicit bit size (i.e. VLAN_N_VID). + +This avoids the need of the VLAN_BITMAP_SIZE macro which: + - needlessly has a 'nic_dev' parameter + - should be "long" (and not byte) aligned, so that the bitmap semantic + is respected + +This is in fact not an issue because VLAN_N_VID is 4096 at the time +being, but devm_bitmap_zalloc() is less verbose and easier to understand. + +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/6ff7b7d21414240794a77dc2456914412718a145.1656260842.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/huawei/hinic/hinic_main.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_main.c b/drivers/net/ethernet/huawei/hinic/hinic_main.c +index ace949fe6233..2376edf6c263 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_main.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_main.c +@@ -62,8 +62,6 @@ MODULE_PARM_DESC(rx_weight, "Number Rx packets for NAPI budget (default=64)"); + + #define HINIC_LRO_RX_TIMER_DEFAULT 16 + +-#define VLAN_BITMAP_SIZE(nic_dev) (ALIGN(VLAN_N_VID, 8) / 8) +- + #define work_to_rx_mode_work(work) \ + container_of(work, struct hinic_rx_mode_work, work) + +@@ -1248,9 +1246,8 @@ static int nic_dev_init(struct pci_dev *pdev) + u64_stats_init(&tx_stats->syncp); + u64_stats_init(&rx_stats->syncp); + +- nic_dev->vlan_bitmap = devm_kzalloc(&pdev->dev, +- VLAN_BITMAP_SIZE(nic_dev), +- GFP_KERNEL); ++ nic_dev->vlan_bitmap = devm_bitmap_zalloc(&pdev->dev, VLAN_N_VID, ++ GFP_KERNEL); + if (!nic_dev->vlan_bitmap) { + err = -ENOMEM; + goto err_vlan_bitmap; +-- +2.35.1 + diff --git a/queue-5.10/hwmon-drivetemp-add-module-alias.patch b/queue-5.10/hwmon-drivetemp-add-module-alias.patch new file mode 100644 index 00000000000..d4e4cfc7c27 --- /dev/null +++ b/queue-5.10/hwmon-drivetemp-add-module-alias.patch @@ -0,0 +1,33 @@ +From ce264948870f0202e0b88a65a2d396988b690092 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Jul 2022 23:46:24 +0200 +Subject: hwmon: (drivetemp) Add module alias + +From: Linus Walleij + +[ Upstream commit 5918036cfa8ded7aa8094db70295011ce2275447 ] + +Adding a MODULE_ALIAS() to drivetemp will make the driver easier +for modprobe to autoprobe. + +Signed-off-by: Linus Walleij +Link: https://lore.kernel.org/r/20220712214624.1845158-1-linus.walleij@linaro.org +Fixes: 5b46903d8bf3 ("hwmon: Driver for disk and solid state drives with temperature sensors") +Signed-off-by: Guenter Roeck +Signed-off-by: Sasha Levin +--- + drivers/hwmon/drivetemp.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/hwmon/drivetemp.c b/drivers/hwmon/drivetemp.c +index 72c760373957..00303af82a77 100644 +--- a/drivers/hwmon/drivetemp.c ++++ b/drivers/hwmon/drivetemp.c +@@ -621,3 +621,4 @@ module_exit(drivetemp_exit); + MODULE_AUTHOR("Guenter Roeck "); + MODULE_DESCRIPTION("Hard drive temperature monitor"); + MODULE_LICENSE("GPL"); ++MODULE_ALIAS("platform:drivetemp"); +-- +2.35.1 + diff --git a/queue-5.10/hwmon-sht15-fix-wrong-assumptions-in-device-remove-c.patch b/queue-5.10/hwmon-sht15-fix-wrong-assumptions-in-device-remove-c.patch new file mode 100644 index 00000000000..e2a918f41c1 --- /dev/null +++ b/queue-5.10/hwmon-sht15-fix-wrong-assumptions-in-device-remove-c.patch @@ -0,0 +1,78 @@ +From eeb2c8e54dd37082a17c4486e5e54c4de8e3040f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Jul 2022 21:43:44 +0200 +Subject: hwmon: (sht15) Fix wrong assumptions in device remove callback +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit 7d4edccc9bbfe1dcdff641343f7b0c6763fbe774 ] + +Taking a lock at the beginning of .remove() doesn't prevent new readers. +With the existing approach it can happen, that a read occurs just when +the lock was taken blocking the reader until the lock is released at the +end of the remove callback which then accessed *data that is already +freed then. + +To actually fix this problem the hwmon core needs some adaption. Until +this is implemented take the optimistic approach of assuming that all +readers are gone after hwmon_device_unregister() and +sysfs_remove_group() as most other drivers do. (And once the core +implements that, taking the lock would deadlock.) + +So drop the lock, move the reset to after device unregistration to keep +the device in a workable state until it's deregistered. Also add a error +message in case the reset fails and return 0 anyhow. (Returning an error +code, doesn't stop the platform device unregistration and only results +in a little helpful error message before the devm cleanup handlers are +called.) + +Signed-off-by: Uwe Kleine-König +Link: https://lore.kernel.org/r/20220725194344.150098-1-u.kleine-koenig@pengutronix.de +Signed-off-by: Guenter Roeck +Signed-off-by: Sasha Levin +--- + drivers/hwmon/sht15.c | 17 ++++++----------- + 1 file changed, 6 insertions(+), 11 deletions(-) + +diff --git a/drivers/hwmon/sht15.c b/drivers/hwmon/sht15.c +index 7f4a63959730..ae4d14257a11 100644 +--- a/drivers/hwmon/sht15.c ++++ b/drivers/hwmon/sht15.c +@@ -1020,25 +1020,20 @@ static int sht15_probe(struct platform_device *pdev) + static int sht15_remove(struct platform_device *pdev) + { + struct sht15_data *data = platform_get_drvdata(pdev); ++ int ret; + +- /* +- * Make sure any reads from the device are done and +- * prevent new ones beginning +- */ +- mutex_lock(&data->read_lock); +- if (sht15_soft_reset(data)) { +- mutex_unlock(&data->read_lock); +- return -EFAULT; +- } + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&pdev->dev.kobj, &sht15_attr_group); ++ ++ ret = sht15_soft_reset(data); ++ if (ret) ++ dev_err(&pdev->dev, "Failed to reset device (%pe)\n", ERR_PTR(ret)); ++ + if (!IS_ERR(data->reg)) { + regulator_unregister_notifier(data->reg, &data->nb); + regulator_disable(data->reg); + } + +- mutex_unlock(&data->read_lock); +- + return 0; + } + +-- +2.35.1 + diff --git a/queue-5.10/i2c-cadence-support-pec-for-smbus-block-read.patch b/queue-5.10/i2c-cadence-support-pec-for-smbus-block-read.patch new file mode 100644 index 00000000000..d29bcee9d68 --- /dev/null +++ b/queue-5.10/i2c-cadence-support-pec-for-smbus-block-read.patch @@ -0,0 +1,77 @@ +From 2212a74a6cec0ff509f60e22d48b1545bed74207 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 17 Jul 2022 16:52:44 +0200 +Subject: i2c: cadence: Support PEC for SMBus block read + +From: Lars-Peter Clausen + +[ Upstream commit 9fdf6d97f03035ad5298e2d1635036c74c2090ed ] + +SMBus packet error checking (PEC) is implemented by appending one +additional byte of checksum data at the end of the message. This provides +additional protection and allows to detect data corruption on the I2C bus. + +SMBus block reads support variable length reads. The first byte in the read +message is the number of available data bytes. + +The combination of PEC and block read is currently not supported by the +Cadence I2C driver. + * When PEC is enabled the maximum transfer length for block reads + increases from 33 to 34 bytes. + * The I2C core smbus emulation layer relies on the driver updating the + `i2c_msg` `len` field with the number of received bytes. The updated + length is used when checking the PEC. + +Add support to the Cadence I2C driver for handling SMBus block reads with +PEC. To determine the maximum transfer length uses the initial `len` value +of the `i2c_msg`. When PEC is enabled this will be 2, when it is disabled +it will be 1. + +Once a read transfer is done also increment the `len` field by the amount +of received data bytes. + +This change has been tested with a UCM90320 PMBus power monitor, which +requires block reads to access certain data fields, but also has PEC +enabled by default. + +Fixes: df8eb5691c48 ("i2c: Add driver for Cadence I2C controller") +Signed-off-by: Lars-Peter Clausen +Tested-by: Shubhrajyoti Datta +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-cadence.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c +index 0abce487ead7..50928216b3f2 100644 +--- a/drivers/i2c/busses/i2c-cadence.c ++++ b/drivers/i2c/busses/i2c-cadence.c +@@ -566,8 +566,13 @@ static void cdns_i2c_mrecv(struct cdns_i2c *id) + ctrl_reg = cdns_i2c_readreg(CDNS_I2C_CR_OFFSET); + ctrl_reg |= CDNS_I2C_CR_RW | CDNS_I2C_CR_CLR_FIFO; + ++ /* ++ * Receive up to I2C_SMBUS_BLOCK_MAX data bytes, plus one message length ++ * byte, plus one checksum byte if PEC is enabled. p_msg->len will be 2 if ++ * PEC is enabled, otherwise 1. ++ */ + if (id->p_msg->flags & I2C_M_RECV_LEN) +- id->recv_count = I2C_SMBUS_BLOCK_MAX + 1; ++ id->recv_count = I2C_SMBUS_BLOCK_MAX + id->p_msg->len; + + id->curr_recv_count = id->recv_count; + +@@ -753,6 +758,9 @@ static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg, + if (id->err_status & CDNS_I2C_IXR_ARB_LOST) + return -EAGAIN; + ++ if (msg->flags & I2C_M_RECV_LEN) ++ msg->len += min_t(unsigned int, msg->buf[0], I2C_SMBUS_BLOCK_MAX); ++ + return 0; + } + +-- +2.35.1 + diff --git a/queue-5.10/i2c-fix-a-potential-use-after-free.patch b/queue-5.10/i2c-fix-a-potential-use-after-free.patch new file mode 100644 index 00000000000..545386fc26c --- /dev/null +++ b/queue-5.10/i2c-fix-a-potential-use-after-free.patch @@ -0,0 +1,40 @@ +From d71e8ec23c4a5c78f804c3b904393fc023a8738e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 27 Dec 2019 09:34:32 +0000 +Subject: i2c: Fix a potential use after free + +From: Xu Wang + +[ Upstream commit e4c72c06c367758a14f227c847f9d623f1994ecf ] + +Free the adap structure only after we are done using it. +This patch just moves the put_device() down a bit to avoid the +use after free. + +Fixes: 611e12ea0f12 ("i2c: core: manage i2c bus device refcount in i2c_[get|put]_adapter") +Signed-off-by: Xu Wang +[wsa: added comment to the code, added Fixes tag] +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/i2c-core-base.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c +index bdce6d3e5327..34fecf97a355 100644 +--- a/drivers/i2c/i2c-core-base.c ++++ b/drivers/i2c/i2c-core-base.c +@@ -2405,8 +2405,9 @@ void i2c_put_adapter(struct i2c_adapter *adap) + if (!adap) + return; + +- put_device(&adap->dev); + module_put(adap->owner); ++ /* Should be last, otherwise we risk use-after-free with 'adap' */ ++ put_device(&adap->dev); + } + EXPORT_SYMBOL(i2c_put_adapter); + +-- +2.35.1 + diff --git a/queue-5.10/i2c-mux-gpmux-add-of_node_put-when-breaking-out-of-l.patch b/queue-5.10/i2c-mux-gpmux-add-of_node_put-when-breaking-out-of-l.patch new file mode 100644 index 00000000000..d7775c0c249 --- /dev/null +++ b/queue-5.10/i2c-mux-gpmux-add-of_node_put-when-breaking-out-of-l.patch @@ -0,0 +1,37 @@ +From b3bc888402084e35375373d077d397ba5523a354 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jul 2022 09:24:01 +0800 +Subject: i2c: mux-gpmux: Add of_node_put() when breaking out of loop + +From: Liang He + +[ Upstream commit 6435319c34704994e19b0767f6a4e6f37439867b ] + +In i2c_mux_probe(), we should call of_node_put() when breaking out +of for_each_child_of_node() which will automatically increase and +decrease the refcount. + +Fixes: ac8498f0ce53 ("i2c: i2c-mux-gpmux: new driver") +Signed-off-by: Liang He +Acked-by: Peter Rosin +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/muxes/i2c-mux-gpmux.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/i2c/muxes/i2c-mux-gpmux.c b/drivers/i2c/muxes/i2c-mux-gpmux.c +index d3acd8d66c32..33024acaac02 100644 +--- a/drivers/i2c/muxes/i2c-mux-gpmux.c ++++ b/drivers/i2c/muxes/i2c-mux-gpmux.c +@@ -134,6 +134,7 @@ static int i2c_mux_probe(struct platform_device *pdev) + return 0; + + err_children: ++ of_node_put(child); + i2c_mux_del_adapters(muxc); + err_parent: + i2c_put_adapter(parent); +-- +2.35.1 + diff --git a/queue-5.10/i2c-npcm-correct-slave-role-behavior.patch b/queue-5.10/i2c-npcm-correct-slave-role-behavior.patch new file mode 100644 index 00000000000..af95f3eb4e8 --- /dev/null +++ b/queue-5.10/i2c-npcm-correct-slave-role-behavior.patch @@ -0,0 +1,55 @@ +From 0402134d250f7c9d14584fb529d417a995c90c92 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 25 May 2022 11:23:39 +0800 +Subject: i2c: npcm: Correct slave role behavior + +From: Tali Perry + +[ Upstream commit d7aa1b149b8fc04d802879cf4662010aa4a42deb ] + +Correct the slave transaction logic to be compatible with the generic +slave backend driver. + +Fixes: 56a1485b102e ("i2c: npcm7xx: Add Nuvoton NPCM I2C controller driver") +Signed-off-by: Tali Perry +Signed-off-by: Tyrone Ting +Reviewed-by: Andy Shevchenko +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-npcm7xx.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-npcm7xx.c b/drivers/i2c/busses/i2c-npcm7xx.c +index ab31e7fb4cc9..31e3d2c9d6bc 100644 +--- a/drivers/i2c/busses/i2c-npcm7xx.c ++++ b/drivers/i2c/busses/i2c-npcm7xx.c +@@ -912,11 +912,15 @@ static int npcm_i2c_slave_get_wr_buf(struct npcm_i2c *bus) + for (i = 0; i < I2C_HW_FIFO_SIZE; i++) { + if (bus->slv_wr_size >= I2C_HW_FIFO_SIZE) + break; +- i2c_slave_event(bus->slave, I2C_SLAVE_READ_REQUESTED, &value); ++ if (bus->state == I2C_SLAVE_MATCH) { ++ i2c_slave_event(bus->slave, I2C_SLAVE_READ_REQUESTED, &value); ++ bus->state = I2C_OPER_STARTED; ++ } else { ++ i2c_slave_event(bus->slave, I2C_SLAVE_READ_PROCESSED, &value); ++ } + ind = (bus->slv_wr_ind + bus->slv_wr_size) % I2C_HW_FIFO_SIZE; + bus->slv_wr_buf[ind] = value; + bus->slv_wr_size++; +- i2c_slave_event(bus->slave, I2C_SLAVE_READ_PROCESSED, &value); + } + return I2C_HW_FIFO_SIZE - ret; + } +@@ -964,7 +968,6 @@ static void npcm_i2c_slave_xmit(struct npcm_i2c *bus, u16 nwrite, + if (nwrite == 0) + return; + +- bus->state = I2C_OPER_STARTED; + bus->operation = I2C_WRITE_OPER; + + /* get the next buffer */ +-- +2.35.1 + diff --git a/queue-5.10/i2c-npcm-remove-own-slave-addresses-2-10.patch b/queue-5.10/i2c-npcm-remove-own-slave-addresses-2-10.patch new file mode 100644 index 00000000000..cddfb3f0cd4 --- /dev/null +++ b/queue-5.10/i2c-npcm-remove-own-slave-addresses-2-10.patch @@ -0,0 +1,133 @@ +From 1c76704a92432408ab92f7c33c56f730d06a8cea Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 25 May 2022 11:23:38 +0800 +Subject: i2c: npcm: Remove own slave addresses 2:10 + +From: Tali Perry + +[ Upstream commit 47d506d1a28fd10a9fb1f33df5622d88fae72095 ] + +NPCM can support up to 10 own slave addresses. In practice, only one +address is actually being used. In order to access addresses 2 and above, +need to switch register banks. The switch needs spinlock. +To avoid using spinlock for this useless feature removed support of SA >= +2. Also fix returned slave event enum. + +Remove some comment since the bank selection is not required. The bank +selection is not required since the supported slave addresses are reduced. + +Fixes: 56a1485b102e ("i2c: npcm7xx: Add Nuvoton NPCM I2C controller driver") +Signed-off-by: Tali Perry +Signed-off-by: Tyrone Ting +Reviewed-by: Andy Shevchenko +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-npcm7xx.c | 41 +++++++++++++------------------- + 1 file changed, 16 insertions(+), 25 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-npcm7xx.c b/drivers/i2c/busses/i2c-npcm7xx.c +index d9ac62c1ac25..ab31e7fb4cc9 100644 +--- a/drivers/i2c/busses/i2c-npcm7xx.c ++++ b/drivers/i2c/busses/i2c-npcm7xx.c +@@ -123,11 +123,11 @@ enum i2c_addr { + * Since the addr regs are sprinkled all over the address space, + * use this array to get the address or each register. + */ +-#define I2C_NUM_OWN_ADDR 10 ++#define I2C_NUM_OWN_ADDR 2 ++#define I2C_NUM_OWN_ADDR_SUPPORTED 2 ++ + static const int npcm_i2caddr[I2C_NUM_OWN_ADDR] = { +- NPCM_I2CADDR1, NPCM_I2CADDR2, NPCM_I2CADDR3, NPCM_I2CADDR4, +- NPCM_I2CADDR5, NPCM_I2CADDR6, NPCM_I2CADDR7, NPCM_I2CADDR8, +- NPCM_I2CADDR9, NPCM_I2CADDR10, ++ NPCM_I2CADDR1, NPCM_I2CADDR2, + }; + #endif + +@@ -391,14 +391,10 @@ static void npcm_i2c_disable(struct npcm_i2c *bus) + #if IS_ENABLED(CONFIG_I2C_SLAVE) + int i; + +- /* select bank 0 for I2C addresses */ +- npcm_i2c_select_bank(bus, I2C_BANK_0); +- + /* Slave addresses removal */ +- for (i = I2C_SLAVE_ADDR1; i < I2C_NUM_OWN_ADDR; i++) ++ for (i = I2C_SLAVE_ADDR1; i < I2C_NUM_OWN_ADDR_SUPPORTED; i++) + iowrite8(0, bus->reg + npcm_i2caddr[i]); + +- npcm_i2c_select_bank(bus, I2C_BANK_1); + #endif + /* Disable module */ + i2cctl2 = ioread8(bus->reg + NPCM_I2CCTL2); +@@ -603,8 +599,7 @@ static int npcm_i2c_slave_enable(struct npcm_i2c *bus, enum i2c_addr addr_type, + i2cctl1 &= ~NPCM_I2CCTL1_GCMEN; + iowrite8(i2cctl1, bus->reg + NPCM_I2CCTL1); + return 0; +- } +- if (addr_type == I2C_ARP_ADDR) { ++ } else if (addr_type == I2C_ARP_ADDR) { + i2cctl3 = ioread8(bus->reg + NPCM_I2CCTL3); + if (enable) + i2cctl3 |= I2CCTL3_ARPMEN; +@@ -613,16 +608,16 @@ static int npcm_i2c_slave_enable(struct npcm_i2c *bus, enum i2c_addr addr_type, + iowrite8(i2cctl3, bus->reg + NPCM_I2CCTL3); + return 0; + } ++ if (addr_type > I2C_SLAVE_ADDR2 && addr_type <= I2C_SLAVE_ADDR10) ++ dev_err(bus->dev, "try to enable more than 2 SA not supported\n"); ++ + if (addr_type >= I2C_ARP_ADDR) + return -EFAULT; +- /* select bank 0 for address 3 to 10 */ +- if (addr_type > I2C_SLAVE_ADDR2) +- npcm_i2c_select_bank(bus, I2C_BANK_0); ++ + /* Set and enable the address */ + iowrite8(sa_reg, bus->reg + npcm_i2caddr[addr_type]); + npcm_i2c_slave_int_enable(bus, enable); +- if (addr_type > I2C_SLAVE_ADDR2) +- npcm_i2c_select_bank(bus, I2C_BANK_1); ++ + return 0; + } + #endif +@@ -843,15 +838,11 @@ static u8 npcm_i2c_get_slave_addr(struct npcm_i2c *bus, enum i2c_addr addr_type) + { + u8 slave_add; + +- /* select bank 0 for address 3 to 10 */ +- if (addr_type > I2C_SLAVE_ADDR2) +- npcm_i2c_select_bank(bus, I2C_BANK_0); ++ if (addr_type > I2C_SLAVE_ADDR2 && addr_type <= I2C_SLAVE_ADDR10) ++ dev_err(bus->dev, "get slave: try to use more than 2 SA not supported\n"); + + slave_add = ioread8(bus->reg + npcm_i2caddr[(int)addr_type]); + +- if (addr_type > I2C_SLAVE_ADDR2) +- npcm_i2c_select_bank(bus, I2C_BANK_1); +- + return slave_add; + } + +@@ -861,12 +852,12 @@ static int npcm_i2c_remove_slave_addr(struct npcm_i2c *bus, u8 slave_add) + + /* Set the enable bit */ + slave_add |= 0x80; +- npcm_i2c_select_bank(bus, I2C_BANK_0); +- for (i = I2C_SLAVE_ADDR1; i < I2C_NUM_OWN_ADDR; i++) { ++ ++ for (i = I2C_SLAVE_ADDR1; i < I2C_NUM_OWN_ADDR_SUPPORTED; i++) { + if (ioread8(bus->reg + npcm_i2caddr[i]) == slave_add) + iowrite8(0, bus->reg + npcm_i2caddr[i]); + } +- npcm_i2c_select_bank(bus, I2C_BANK_1); ++ + return 0; + } + +-- +2.35.1 + diff --git a/queue-5.10/iavf-fix-max_rate-limiting.patch b/queue-5.10/iavf-fix-max_rate-limiting.patch new file mode 100644 index 00000000000..775dc373901 --- /dev/null +++ b/queue-5.10/iavf-fix-max_rate-limiting.patch @@ -0,0 +1,104 @@ +From 988cee019ae40aee1fb73cab431179df0f1d9082 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Jun 2022 18:41:23 -0400 +Subject: iavf: Fix max_rate limiting + +From: Przemyslaw Patynowski + +[ Upstream commit ec60d54cb9a3d43a02c5612a03093c18233e6601 ] + +Fix max_rate option in TC, check for proper quanta boundaries. +Check for minimum value provided and if it fits expected 50Mbps +quanta. + +Without this patch, iavf could send settings for max_rate limiting +that would be accepted from by PF even the max_rate option is less +than expected 50Mbps quanta. It results in no rate limiting +on traffic as rate limiting will be floored to 0. + +Example: +tc qdisc add dev $vf root mqprio num_tc 3 map 0 2 1 queues \ +2@0 2@2 2@4 hw 1 mode channel shaper bw_rlimit \ +max_rate 50Mbps 500Mbps 500Mbps + +Should limit TC0 to circa 50 Mbps + +tc qdisc add dev $vf root mqprio num_tc 3 map 0 2 1 queues \ +2@0 2@2 2@4 hw 1 mode channel shaper bw_rlimit \ +max_rate 0Mbps 100Kbit 500Mbps + +Should return error + +Fixes: d5b33d024496 ("i40evf: add ndo_setup_tc callback to i40evf") +Signed-off-by: Przemyslaw Patynowski +Signed-off-by: Jun Zhang +Tested-by: Bharathi Sreenivas +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/iavf/iavf.h | 1 + + drivers/net/ethernet/intel/iavf/iavf_main.c | 25 +++++++++++++++++++-- + 2 files changed, 24 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h +index ce1e2fb22e09..a994a2970ab2 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf.h ++++ b/drivers/net/ethernet/intel/iavf/iavf.h +@@ -86,6 +86,7 @@ struct iavf_vsi { + #define IAVF_HKEY_ARRAY_SIZE ((IAVF_VFQF_HKEY_MAX_INDEX + 1) * 4) + #define IAVF_HLUT_ARRAY_SIZE ((IAVF_VFQF_HLUT_MAX_INDEX + 1) * 4) + #define IAVF_MBPS_DIVISOR 125000 /* divisor to convert to Mbps */ ++#define IAVF_MBPS_QUANTA 50 + + #define IAVF_VIRTCHNL_VF_RESOURCE_SIZE (sizeof(struct virtchnl_vf_resource) + \ + (IAVF_MAX_VF_VSI * \ +diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c +index bd1fb3774769..a9cea7ccdd86 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf_main.c ++++ b/drivers/net/ethernet/intel/iavf/iavf_main.c +@@ -2578,6 +2578,7 @@ static int iavf_validate_ch_config(struct iavf_adapter *adapter, + struct tc_mqprio_qopt_offload *mqprio_qopt) + { + u64 total_max_rate = 0; ++ u32 tx_rate_rem = 0; + int i, num_qps = 0; + u64 tx_rate = 0; + int ret = 0; +@@ -2592,12 +2593,32 @@ static int iavf_validate_ch_config(struct iavf_adapter *adapter, + return -EINVAL; + if (mqprio_qopt->min_rate[i]) { + dev_err(&adapter->pdev->dev, +- "Invalid min tx rate (greater than 0) specified\n"); ++ "Invalid min tx rate (greater than 0) specified for TC%d\n", ++ i); + return -EINVAL; + } +- /*convert to Mbps */ ++ ++ /* convert to Mbps */ + tx_rate = div_u64(mqprio_qopt->max_rate[i], + IAVF_MBPS_DIVISOR); ++ ++ if (mqprio_qopt->max_rate[i] && ++ tx_rate < IAVF_MBPS_QUANTA) { ++ dev_err(&adapter->pdev->dev, ++ "Invalid max tx rate for TC%d, minimum %dMbps\n", ++ i, IAVF_MBPS_QUANTA); ++ return -EINVAL; ++ } ++ ++ (void)div_u64_rem(tx_rate, IAVF_MBPS_QUANTA, &tx_rate_rem); ++ ++ if (tx_rate_rem != 0) { ++ dev_err(&adapter->pdev->dev, ++ "Invalid max tx rate for TC%d, not divisible by %d\n", ++ i, IAVF_MBPS_QUANTA); ++ return -EINVAL; ++ } ++ + total_max_rate += tx_rate; + num_qps += mqprio_qopt->qopt.count[i]; + } +-- +2.35.1 + diff --git a/queue-5.10/iio-accel-bma400-fix-the-scale-min-and-max-macro-val.patch b/queue-5.10/iio-accel-bma400-fix-the-scale-min-and-max-macro-val.patch new file mode 100644 index 00000000000..4b0a1956d02 --- /dev/null +++ b/queue-5.10/iio-accel-bma400-fix-the-scale-min-and-max-macro-val.patch @@ -0,0 +1,59 @@ +From 689632afbf04e0a6e4e753d4af824d50c75c263c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 5 May 2022 19:00:12 +0530 +Subject: iio: accel: bma400: Fix the scale min and max macro values + +From: Jagath Jog J + +[ Upstream commit 747c7cf1592e226d40543231b26502b332d0ea2f ] + +Changing the scale macro values to match the bma400 sensitivity +for 1 LSB of all the available ranges. + +Fixes: 465c811f1f20 ("iio: accel: Add driver for the BMA400") +Signed-off-by: Jagath Jog J +Reviewed-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20220505133021.22362-2-jagathjog1996@gmail.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/accel/bma400.h | 23 +++++++++++++++++++++-- + 1 file changed, 21 insertions(+), 2 deletions(-) + +diff --git a/drivers/iio/accel/bma400.h b/drivers/iio/accel/bma400.h +index 5ad10db9819f..416090c6b1e8 100644 +--- a/drivers/iio/accel/bma400.h ++++ b/drivers/iio/accel/bma400.h +@@ -83,8 +83,27 @@ + #define BMA400_ACC_ODR_MIN_WHOLE_HZ 25 + #define BMA400_ACC_ODR_MIN_HZ 12 + +-#define BMA400_SCALE_MIN 38357 +-#define BMA400_SCALE_MAX 306864 ++/* ++ * BMA400_SCALE_MIN macro value represents m/s^2 for 1 LSB before ++ * converting to micro values for +-2g range. ++ * ++ * For +-2g - 1 LSB = 0.976562 milli g = 0.009576 m/s^2 ++ * For +-4g - 1 LSB = 1.953125 milli g = 0.019153 m/s^2 ++ * For +-16g - 1 LSB = 7.8125 milli g = 0.076614 m/s^2 ++ * ++ * The raw value which is used to select the different ranges is determined ++ * by the first bit set position from the scale value, so BMA400_SCALE_MIN ++ * should be odd. ++ * ++ * Scale values for +-2g, +-4g, +-8g and +-16g are populated into bma400_scales ++ * array by left shifting BMA400_SCALE_MIN. ++ * e.g.: ++ * To select +-2g = 9577 << 0 = raw value to write is 0. ++ * To select +-8g = 9577 << 2 = raw value to write is 2. ++ * To select +-16g = 9577 << 3 = raw value to write is 3. ++ */ ++#define BMA400_SCALE_MIN 9577 ++#define BMA400_SCALE_MAX 76617 + + #define BMA400_NUM_REGULATORS 2 + #define BMA400_VDD_REGULATOR 0 +-- +2.35.1 + diff --git a/queue-5.10/iio-accel-bma400-reordering-of-header-files.patch b/queue-5.10/iio-accel-bma400-reordering-of-header-files.patch new file mode 100644 index 00000000000..48a3e0cdbd5 --- /dev/null +++ b/queue-5.10/iio-accel-bma400-reordering-of-header-files.patch @@ -0,0 +1,45 @@ +From 47bd5797adc670cd0854ac4ab094e0c5018acae3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 5 May 2022 19:00:13 +0530 +Subject: iio: accel: bma400: Reordering of header files + +From: Jagath Jog J + +[ Upstream commit 1bd2dc6ea863690aee5c45ebf09c9194c7a42c0d ] + +Reordering of header files and removing the iio/sysfs.h since +custom attributes are not being used in the driver. + +Signed-off-by: Jagath Jog J +Reviewed-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20220505133021.22362-3-jagathjog1996@gmail.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/accel/bma400_core.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/iio/accel/bma400_core.c b/drivers/iio/accel/bma400_core.c +index 7eeba80e32cb..58aa6a0e1180 100644 +--- a/drivers/iio/accel/bma400_core.c ++++ b/drivers/iio/accel/bma400_core.c +@@ -13,14 +13,14 @@ + + #include + #include +-#include +-#include + #include + #include + #include + #include + #include + ++#include ++ + #include "bma400.h" + + /* +-- +2.35.1 + diff --git a/queue-5.10/inet-add-read_once-sk-sk_bound_dev_if-in-inet_match.patch b/queue-5.10/inet-add-read_once-sk-sk_bound_dev_if-in-inet_match.patch new file mode 100644 index 00000000000..4eec7d8d8b5 --- /dev/null +++ b/queue-5.10/inet-add-read_once-sk-sk_bound_dev_if-in-inet_match.patch @@ -0,0 +1,160 @@ +From 387df893857cdab2fe02af471a3e892db404c36d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 12 May 2022 09:56:01 -0700 +Subject: inet: add READ_ONCE(sk->sk_bound_dev_if) in INET_MATCH() + +From: Eric Dumazet + +[ Upstream commit 4915d50e300e96929d2462041d6f6c6f061167fd ] + +INET_MATCH() runs without holding a lock on the socket. + +We probably need to annotate most reads. + +This patch makes INET_MATCH() an inline function +to ease our changes. + +v2: + +We remove the 32bit version of it, as modern compilers +should generate the same code really, no need to +try to be smarter. + +Also make 'struct net *net' the first argument. + +Signed-off-by: Eric Dumazet +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + include/net/inet_hashtables.h | 35 ++++++++++++++++------------------- + include/net/sock.h | 3 --- + net/ipv4/inet_hashtables.c | 15 +++++---------- + net/ipv4/udp.c | 3 +-- + 4 files changed, 22 insertions(+), 34 deletions(-) + +diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h +index d4d611064a76..816851807fa8 100644 +--- a/include/net/inet_hashtables.h ++++ b/include/net/inet_hashtables.h +@@ -289,7 +289,6 @@ static inline struct sock *inet_lookup_listener(struct net *net, + ((__force __portpair)(((__u32)(__dport) << 16) | (__force __u32)(__be16)(__sport))) + #endif + +-#if (BITS_PER_LONG == 64) + #ifdef __BIG_ENDIAN + #define INET_ADDR_COOKIE(__name, __saddr, __daddr) \ + const __addrpair __name = (__force __addrpair) ( \ +@@ -301,24 +300,22 @@ static inline struct sock *inet_lookup_listener(struct net *net, + (((__force __u64)(__be32)(__daddr)) << 32) | \ + ((__force __u64)(__be32)(__saddr))) + #endif /* __BIG_ENDIAN */ +-#define INET_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif, __sdif) \ +- (((__sk)->sk_portpair == (__ports)) && \ +- ((__sk)->sk_addrpair == (__cookie)) && \ +- (((__sk)->sk_bound_dev_if == (__dif)) || \ +- ((__sk)->sk_bound_dev_if == (__sdif))) && \ +- net_eq(sock_net(__sk), (__net))) +-#else /* 32-bit arch */ +-#define INET_ADDR_COOKIE(__name, __saddr, __daddr) \ +- const int __name __deprecated __attribute__((unused)) +- +-#define INET_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif, __sdif) \ +- (((__sk)->sk_portpair == (__ports)) && \ +- ((__sk)->sk_daddr == (__saddr)) && \ +- ((__sk)->sk_rcv_saddr == (__daddr)) && \ +- (((__sk)->sk_bound_dev_if == (__dif)) || \ +- ((__sk)->sk_bound_dev_if == (__sdif))) && \ +- net_eq(sock_net(__sk), (__net))) +-#endif /* 64-bit arch */ ++ ++static inline bool INET_MATCH(struct net *net, const struct sock *sk, ++ const __addrpair cookie, const __portpair ports, ++ int dif, int sdif) ++{ ++ int bound_dev_if; ++ ++ if (!net_eq(sock_net(sk), net) || ++ sk->sk_portpair != ports || ++ sk->sk_addrpair != cookie) ++ return false; ++ ++ /* Paired with WRITE_ONCE() from sock_bindtoindex_locked() */ ++ bound_dev_if = READ_ONCE(sk->sk_bound_dev_if); ++ return bound_dev_if == dif || bound_dev_if == sdif; ++} + + /* Sockets in TCP_CLOSE state are _always_ taken out of the hash, so we need + * not check it for lookups anymore, thanks Alexey. -DaveM +diff --git a/include/net/sock.h b/include/net/sock.h +index c72b0fc4c752..333131f47ac1 100644 +--- a/include/net/sock.h ++++ b/include/net/sock.h +@@ -160,9 +160,6 @@ typedef __u64 __bitwise __addrpair; + * for struct sock and struct inet_timewait_sock. + */ + struct sock_common { +- /* skc_daddr and skc_rcv_saddr must be grouped on a 8 bytes aligned +- * address on 64bit arches : cf INET_MATCH() +- */ + union { + __addrpair skc_addrpair; + struct { +diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c +index f38b71cc3edb..7dbe80e30b9d 100644 +--- a/net/ipv4/inet_hashtables.c ++++ b/net/ipv4/inet_hashtables.c +@@ -410,13 +410,11 @@ struct sock *__inet_lookup_established(struct net *net, + sk_nulls_for_each_rcu(sk, node, &head->chain) { + if (sk->sk_hash != hash) + continue; +- if (likely(INET_MATCH(sk, net, acookie, +- saddr, daddr, ports, dif, sdif))) { ++ if (likely(INET_MATCH(net, sk, acookie, ports, dif, sdif))) { + if (unlikely(!refcount_inc_not_zero(&sk->sk_refcnt))) + goto out; +- if (unlikely(!INET_MATCH(sk, net, acookie, +- saddr, daddr, ports, +- dif, sdif))) { ++ if (unlikely(!INET_MATCH(net, sk, acookie, ++ ports, dif, sdif))) { + sock_gen_put(sk); + goto begin; + } +@@ -465,8 +463,7 @@ static int __inet_check_established(struct inet_timewait_death_row *death_row, + if (sk2->sk_hash != hash) + continue; + +- if (likely(INET_MATCH(sk2, net, acookie, +- saddr, daddr, ports, dif, sdif))) { ++ if (likely(INET_MATCH(net, sk2, acookie, ports, dif, sdif))) { + if (sk2->sk_state == TCP_TIME_WAIT) { + tw = inet_twsk(sk2); + if (twsk_unique(sk, sk2, twp)) +@@ -532,9 +529,7 @@ static bool inet_ehash_lookup_by_sk(struct sock *sk, + if (esk->sk_hash != sk->sk_hash) + continue; + if (sk->sk_family == AF_INET) { +- if (unlikely(INET_MATCH(esk, net, acookie, +- sk->sk_daddr, +- sk->sk_rcv_saddr, ++ if (unlikely(INET_MATCH(net, esk, acookie, + ports, dif, sdif))) { + return true; + } +diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c +index 6056d5609167..e498c7666ec6 100644 +--- a/net/ipv4/udp.c ++++ b/net/ipv4/udp.c +@@ -2490,8 +2490,7 @@ static struct sock *__udp4_lib_demux_lookup(struct net *net, + struct sock *sk; + + udp_portaddr_for_each_entry_rcu(sk, &hslot2->head) { +- if (INET_MATCH(sk, net, acookie, rmt_addr, +- loc_addr, ports, dif, sdif)) ++ if (INET_MATCH(net, sk, acookie, ports, dif, sdif)) + return sk; + /* Only check first socket in chain */ + break; +-- +2.35.1 + diff --git a/queue-5.10/input-atmel_mxt_ts-fix-up-inverted-reset-handler.patch b/queue-5.10/input-atmel_mxt_ts-fix-up-inverted-reset-handler.patch new file mode 100644 index 00000000000..78c0f131d6f --- /dev/null +++ b/queue-5.10/input-atmel_mxt_ts-fix-up-inverted-reset-handler.patch @@ -0,0 +1,204 @@ +From a9d8b0dad7ce580f2a42328f60d95c6569d4658b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 9 Nov 2020 18:00:06 -0800 +Subject: Input: atmel_mxt_ts - fix up inverted RESET handler + +From: Linus Walleij + +[ Upstream commit feedaacdadfc332e1a6e436f3adfbc67e244db47 ] + +This driver uses GPIO descriptors to drive the touchscreen RESET line. In +the existing device trees this has in conflict with intution been flagged +as GPIO_ACTIVE_HIGH and the driver then applies the reverse action by +driving the line low (setting to 0) to enter reset state and driving the +line high (setting to 1) to get out of reset state. + +The correct way to handle active low GPIO lines is to provide the +GPIO_ACTIVE_LOW in the device tree (thus properly describing the hardware) +and letting the GPIO framework invert the assertion (driving high) to a +low level and vice versa. + +This is considered a bug since the device trees are incorrectly +mis-specifying the line as active high. + +Fix the driver and all device trees specifying a reset line. + +Signed-off-by: Linus Walleij +Reviewed-by: Philippe Schenker +Acked-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20201104153032.1387747-1-linus.walleij@linaro.org +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx53-ppd.dts | 2 +- + arch/arm/boot/dts/imx6dl-colibri-eval-v3.dts | 2 +- + arch/arm/boot/dts/imx6q-apalis-eval.dts | 2 +- + arch/arm/boot/dts/imx6q-apalis-ixora-v1.1.dts | 2 +- + arch/arm/boot/dts/imx6q-apalis-ixora.dts | 2 +- + arch/arm/boot/dts/imx7-colibri-aster.dtsi | 2 +- + arch/arm/boot/dts/imx7-colibri-eval-v3.dtsi | 2 +- + arch/arm/boot/dts/motorola-mapphone-common.dtsi | 2 +- + arch/arm/boot/dts/s5pv210-aries.dtsi | 2 +- + arch/arm/boot/dts/tegra20-acer-a500-picasso.dts | 2 +- + drivers/input/touchscreen/atmel_mxt_ts.c | 6 ++++-- + 11 files changed, 14 insertions(+), 12 deletions(-) + +diff --git a/arch/arm/boot/dts/imx53-ppd.dts b/arch/arm/boot/dts/imx53-ppd.dts +index 6d9a5ede94aa..006fbd7f5432 100644 +--- a/arch/arm/boot/dts/imx53-ppd.dts ++++ b/arch/arm/boot/dts/imx53-ppd.dts +@@ -592,7 +592,7 @@ &i2c2 { + + touchscreen@4b { + compatible = "atmel,maxtouch"; +- reset-gpio = <&gpio5 19 GPIO_ACTIVE_HIGH>; ++ reset-gpio = <&gpio5 19 GPIO_ACTIVE_LOW>; + reg = <0x4b>; + interrupt-parent = <&gpio5>; + interrupts = <4 IRQ_TYPE_LEVEL_LOW>; +diff --git a/arch/arm/boot/dts/imx6dl-colibri-eval-v3.dts b/arch/arm/boot/dts/imx6dl-colibri-eval-v3.dts +index 65359aece950..7da74e6f46d9 100644 +--- a/arch/arm/boot/dts/imx6dl-colibri-eval-v3.dts ++++ b/arch/arm/boot/dts/imx6dl-colibri-eval-v3.dts +@@ -143,7 +143,7 @@ touchscreen@4a { + reg = <0x4a>; + interrupt-parent = <&gpio1>; + interrupts = <9 IRQ_TYPE_EDGE_FALLING>; /* SODIMM 28 */ +- reset-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>; /* SODIMM 30 */ ++ reset-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>; /* SODIMM 30 */ + status = "disabled"; + }; + +diff --git a/arch/arm/boot/dts/imx6q-apalis-eval.dts b/arch/arm/boot/dts/imx6q-apalis-eval.dts +index fab83abb6466..a0683b4aeca1 100644 +--- a/arch/arm/boot/dts/imx6q-apalis-eval.dts ++++ b/arch/arm/boot/dts/imx6q-apalis-eval.dts +@@ -140,7 +140,7 @@ touchscreen@4a { + reg = <0x4a>; + interrupt-parent = <&gpio6>; + interrupts = <10 IRQ_TYPE_EDGE_FALLING>; +- reset-gpios = <&gpio6 9 GPIO_ACTIVE_HIGH>; /* SODIMM 13 */ ++ reset-gpios = <&gpio6 9 GPIO_ACTIVE_LOW>; /* SODIMM 13 */ + status = "disabled"; + }; + +diff --git a/arch/arm/boot/dts/imx6q-apalis-ixora-v1.1.dts b/arch/arm/boot/dts/imx6q-apalis-ixora-v1.1.dts +index 1614b1ae501d..86e84781cf5d 100644 +--- a/arch/arm/boot/dts/imx6q-apalis-ixora-v1.1.dts ++++ b/arch/arm/boot/dts/imx6q-apalis-ixora-v1.1.dts +@@ -145,7 +145,7 @@ touchscreen@4a { + reg = <0x4a>; + interrupt-parent = <&gpio6>; + interrupts = <10 IRQ_TYPE_EDGE_FALLING>; +- reset-gpios = <&gpio6 9 GPIO_ACTIVE_HIGH>; /* SODIMM 13 */ ++ reset-gpios = <&gpio6 9 GPIO_ACTIVE_LOW>; /* SODIMM 13 */ + status = "disabled"; + }; + +diff --git a/arch/arm/boot/dts/imx6q-apalis-ixora.dts b/arch/arm/boot/dts/imx6q-apalis-ixora.dts +index fa9f98dd15ac..62e72773e53b 100644 +--- a/arch/arm/boot/dts/imx6q-apalis-ixora.dts ++++ b/arch/arm/boot/dts/imx6q-apalis-ixora.dts +@@ -144,7 +144,7 @@ touchscreen@4a { + reg = <0x4a>; + interrupt-parent = <&gpio6>; + interrupts = <10 IRQ_TYPE_EDGE_FALLING>; +- reset-gpios = <&gpio6 9 GPIO_ACTIVE_HIGH>; /* SODIMM 13 */ ++ reset-gpios = <&gpio6 9 GPIO_ACTIVE_LOW>; /* SODIMM 13 */ + status = "disabled"; + }; + +diff --git a/arch/arm/boot/dts/imx7-colibri-aster.dtsi b/arch/arm/boot/dts/imx7-colibri-aster.dtsi +index 9fa701bec2ec..139188eb9f40 100644 +--- a/arch/arm/boot/dts/imx7-colibri-aster.dtsi ++++ b/arch/arm/boot/dts/imx7-colibri-aster.dtsi +@@ -99,7 +99,7 @@ touchscreen@4a { + reg = <0x4a>; + interrupt-parent = <&gpio2>; + interrupts = <15 IRQ_TYPE_EDGE_FALLING>; /* SODIMM 107 */ +- reset-gpios = <&gpio2 28 GPIO_ACTIVE_HIGH>; /* SODIMM 106 */ ++ reset-gpios = <&gpio2 28 GPIO_ACTIVE_LOW>; /* SODIMM 106 */ + }; + + /* M41T0M6 real time clock on carrier board */ +diff --git a/arch/arm/boot/dts/imx7-colibri-eval-v3.dtsi b/arch/arm/boot/dts/imx7-colibri-eval-v3.dtsi +index 97601375f264..3caf450735d7 100644 +--- a/arch/arm/boot/dts/imx7-colibri-eval-v3.dtsi ++++ b/arch/arm/boot/dts/imx7-colibri-eval-v3.dtsi +@@ -124,7 +124,7 @@ touchscreen@4a { + reg = <0x4a>; + interrupt-parent = <&gpio1>; + interrupts = <9 IRQ_TYPE_EDGE_FALLING>; /* SODIMM 28 */ +- reset-gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; /* SODIMM 30 */ ++ reset-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>; /* SODIMM 30 */ + status = "disabled"; + }; + +diff --git a/arch/arm/boot/dts/motorola-mapphone-common.dtsi b/arch/arm/boot/dts/motorola-mapphone-common.dtsi +index d5ded4f794df..5f8f77cfbe59 100644 +--- a/arch/arm/boot/dts/motorola-mapphone-common.dtsi ++++ b/arch/arm/boot/dts/motorola-mapphone-common.dtsi +@@ -430,7 +430,7 @@ touchscreen@4a { + pinctrl-names = "default"; + pinctrl-0 = <&touchscreen_pins>; + +- reset-gpios = <&gpio6 13 GPIO_ACTIVE_HIGH>; /* gpio173 */ ++ reset-gpios = <&gpio6 13 GPIO_ACTIVE_LOW>; /* gpio173 */ + + /* gpio_183 with sys_nirq2 pad as wakeup */ + interrupts-extended = <&gpio6 23 IRQ_TYPE_LEVEL_LOW>, +diff --git a/arch/arm/boot/dts/s5pv210-aries.dtsi b/arch/arm/boot/dts/s5pv210-aries.dtsi +index 9005f0a23e8f..984bc8dc5e4b 100644 +--- a/arch/arm/boot/dts/s5pv210-aries.dtsi ++++ b/arch/arm/boot/dts/s5pv210-aries.dtsi +@@ -631,7 +631,7 @@ touchscreen@4a { + interrupts = <5 IRQ_TYPE_EDGE_FALLING>; + pinctrl-names = "default"; + pinctrl-0 = <&ts_irq>; +- reset-gpios = <&gpj1 3 GPIO_ACTIVE_HIGH>; ++ reset-gpios = <&gpj1 3 GPIO_ACTIVE_LOW>; + }; + }; + +diff --git a/arch/arm/boot/dts/tegra20-acer-a500-picasso.dts b/arch/arm/boot/dts/tegra20-acer-a500-picasso.dts +index 5dbfb83c1b06..ce87e1ec10dc 100644 +--- a/arch/arm/boot/dts/tegra20-acer-a500-picasso.dts ++++ b/arch/arm/boot/dts/tegra20-acer-a500-picasso.dts +@@ -446,7 +446,7 @@ touchscreen@4c { + interrupt-parent = <&gpio>; + interrupts = ; + +- reset-gpios = <&gpio TEGRA_GPIO(Q, 7) GPIO_ACTIVE_HIGH>; ++ reset-gpios = <&gpio TEGRA_GPIO(Q, 7) GPIO_ACTIVE_LOW>; + + vdda-supply = <&vdd_3v3_sys>; + vdd-supply = <&vdd_3v3_sys>; +diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c +index 8df402a1ed44..3c152e934cb8 100644 +--- a/drivers/input/touchscreen/atmel_mxt_ts.c ++++ b/drivers/input/touchscreen/atmel_mxt_ts.c +@@ -3134,8 +3134,9 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id) + if (error) + return error; + ++ /* Request the RESET line as asserted so we go into reset */ + data->reset_gpio = devm_gpiod_get_optional(&client->dev, +- "reset", GPIOD_OUT_LOW); ++ "reset", GPIOD_OUT_HIGH); + if (IS_ERR(data->reset_gpio)) { + error = PTR_ERR(data->reset_gpio); + dev_err(&client->dev, "Failed to get reset gpio: %d\n", error); +@@ -3153,8 +3154,9 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id) + disable_irq(client->irq); + + if (data->reset_gpio) { ++ /* Wait a while and then de-assert the RESET GPIO line */ + msleep(MXT_RESET_GPIO_TIME); +- gpiod_set_value(data->reset_gpio, 1); ++ gpiod_set_value(data->reset_gpio, 0); + msleep(MXT_RESET_INVALID_CHG); + } + +-- +2.35.1 + diff --git a/queue-5.10/intel_th-fix-a-resource-leak-in-an-error-handling-pa.patch b/queue-5.10/intel_th-fix-a-resource-leak-in-an-error-handling-pa.patch new file mode 100644 index 00000000000..c238eebea85 --- /dev/null +++ b/queue-5.10/intel_th-fix-a-resource-leak-in-an-error-handling-pa.patch @@ -0,0 +1,55 @@ +From a1660b4b064102f9bd4bac74c148992aae0bfa3c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jul 2022 11:26:32 +0300 +Subject: intel_th: Fix a resource leak in an error handling path + +From: Christophe JAILLET + +[ Upstream commit 086c28ab7c5699256aced0049aae9c42f1410313 ] + +If an error occurs after calling 'pci_alloc_irq_vectors()', +'pci_free_irq_vectors()' must be called as already done in the remove +function. + +Fixes: 7b7036d47c35 ("intel_th: pci: Use MSI interrupt signalling") +Reviewed-by: Andy Shevchenko +Signed-off-by: Christophe JAILLET +Signed-off-by: Alexander Shishkin +Link: https://lore.kernel.org/r/20220705082637.59979-2-alexander.shishkin@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/hwtracing/intel_th/pci.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c +index 817cdb29bbd8..d032c4de9ce6 100644 +--- a/drivers/hwtracing/intel_th/pci.c ++++ b/drivers/hwtracing/intel_th/pci.c +@@ -100,8 +100,10 @@ static int intel_th_pci_probe(struct pci_dev *pdev, + } + + th = intel_th_alloc(&pdev->dev, drvdata, resource, r); +- if (IS_ERR(th)) +- return PTR_ERR(th); ++ if (IS_ERR(th)) { ++ err = PTR_ERR(th); ++ goto err_free_irq; ++ } + + th->activate = intel_th_pci_activate; + th->deactivate = intel_th_pci_deactivate; +@@ -109,6 +111,10 @@ static int intel_th_pci_probe(struct pci_dev *pdev, + pci_set_master(pdev); + + return 0; ++ ++err_free_irq: ++ pci_free_irq_vectors(pdev); ++ return err; + } + + static void intel_th_pci_remove(struct pci_dev *pdev) +-- +2.35.1 + diff --git a/queue-5.10/intel_th-msu-fix-vmalloced-buffers.patch b/queue-5.10/intel_th-msu-fix-vmalloced-buffers.patch new file mode 100644 index 00000000000..398b4ad3e4c --- /dev/null +++ b/queue-5.10/intel_th-msu-fix-vmalloced-buffers.patch @@ -0,0 +1,74 @@ +From 608d1dccea44916aae1ab28da57315fdfe9ada0f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jul 2022 11:26:34 +0300 +Subject: intel_th: msu: Fix vmalloced buffers + +From: Alexander Shishkin + +[ Upstream commit ac12ad3ccf6d386e64a9d6a890595a2509d24edd ] + +After commit f5ff79fddf0e ("dma-mapping: remove CONFIG_DMA_REMAP") there's +a chance of DMA buffer getting allocated via vmalloc(), which messes up +the mmapping code: + +> RIP: msc_mmap_fault [intel_th_msu] +> Call Trace: +> +> __do_fault +> do_fault +... + +Fix this by accounting for vmalloc possibility. + +Fixes: ba39bd830605 ("intel_th: msu: Switch over to scatterlist") +Reviewed-by: Andy Shevchenko +Signed-off-by: Alexander Shishkin +Link: https://lore.kernel.org/r/20220705082637.59979-4-alexander.shishkin@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/hwtracing/intel_th/msu.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/drivers/hwtracing/intel_th/msu.c b/drivers/hwtracing/intel_th/msu.c +index 3a77551fb4fc..24f56a7c0fcf 100644 +--- a/drivers/hwtracing/intel_th/msu.c ++++ b/drivers/hwtracing/intel_th/msu.c +@@ -1053,6 +1053,16 @@ msc_buffer_set_uc(struct msc_window *win, unsigned int nr_segs) {} + static inline void msc_buffer_set_wb(struct msc_window *win) {} + #endif /* CONFIG_X86 */ + ++static struct page *msc_sg_page(struct scatterlist *sg) ++{ ++ void *addr = sg_virt(sg); ++ ++ if (is_vmalloc_addr(addr)) ++ return vmalloc_to_page(addr); ++ ++ return sg_page(sg); ++} ++ + /** + * msc_buffer_win_alloc() - alloc a window for a multiblock mode + * @msc: MSC device +@@ -1125,7 +1135,7 @@ static void __msc_buffer_win_free(struct msc *msc, struct msc_window *win) + int i; + + for_each_sg(win->sgt->sgl, sg, win->nr_segs, i) { +- struct page *page = sg_page(sg); ++ struct page *page = msc_sg_page(sg); + + page->mapping = NULL; + dma_free_coherent(msc_dev(win->msc)->parent->parent, PAGE_SIZE, +@@ -1387,7 +1397,7 @@ static struct page *msc_buffer_get_page(struct msc *msc, unsigned long pgoff) + pgoff -= win->pgoff; + + for_each_sg(win->sgt->sgl, sg, win->nr_segs, blk) { +- struct page *page = sg_page(sg); ++ struct page *page = msc_sg_page(sg); + size_t pgsz = PFN_DOWN(sg->length); + + if (pgoff < pgsz) +-- +2.35.1 + diff --git a/queue-5.10/intel_th-msu-sink-potential-dereference-of-null-poin.patch b/queue-5.10/intel_th-msu-sink-potential-dereference-of-null-poin.patch new file mode 100644 index 00000000000..fb8c7df413c --- /dev/null +++ b/queue-5.10/intel_th-msu-sink-potential-dereference-of-null-poin.patch @@ -0,0 +1,41 @@ +From 2832620a35b8f29baea91407dec3b9bebcb58c2e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jul 2022 11:26:33 +0300 +Subject: intel_th: msu-sink: Potential dereference of null pointer + +From: Jiasheng Jiang + +[ Upstream commit 82f76a4a720791d889de775b5f7541d601efc8bd ] + +The return value of dma_alloc_coherent() needs to be checked. +To avoid use of null pointer in sg_set_buf() in case of the failure of +alloc. + +Fixes: f220df66f676 ("intel_th: msu-sink: An example msu buffer "sink"") +Reviewed-by: Andy Shevchenko +Signed-off-by: Jiasheng Jiang +Signed-off-by: Alexander Shishkin +Link: https://lore.kernel.org/r/20220705082637.59979-3-alexander.shishkin@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/hwtracing/intel_th/msu-sink.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/hwtracing/intel_th/msu-sink.c b/drivers/hwtracing/intel_th/msu-sink.c +index 2c7f5116be12..891b28ea25fe 100644 +--- a/drivers/hwtracing/intel_th/msu-sink.c ++++ b/drivers/hwtracing/intel_th/msu-sink.c +@@ -71,6 +71,9 @@ static int msu_sink_alloc_window(void *data, struct sg_table **sgt, size_t size) + block = dma_alloc_coherent(priv->dev->parent->parent, + PAGE_SIZE, &sg_dma_address(sg_ptr), + GFP_KERNEL); ++ if (!block) ++ return -ENOMEM; ++ + sg_set_buf(sg_ptr, block, PAGE_SIZE); + } + +-- +2.35.1 + diff --git a/queue-5.10/interconnect-imx-fix-max_node_id.patch b/queue-5.10/interconnect-imx-fix-max_node_id.patch new file mode 100644 index 00000000000..9886e5ac545 --- /dev/null +++ b/queue-5.10/interconnect-imx-fix-max_node_id.patch @@ -0,0 +1,51 @@ +From cb36419343ad5ba52b407f3430a56209559ee2c6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 3 Jul 2022 17:11:26 +0800 +Subject: interconnect: imx: fix max_node_id + +From: Peng Fan + +[ Upstream commit bd734481e172b4827af09c9ab06c51d2ab7201e6 ] + +max_node_id not equal to the ARRAY_SIZE of node array, need increase 1, +otherwise xlate will fail for the last entry. And rename max_node_id +to num_nodes to reflect the reality. + +Fixes: f0d8048525d7d ("interconnect: Add imx core driver") +Reviewed-by: Laurent Pinchart +Signed-off-by: Peng Fan +Link: https://lore.kernel.org/r/20220703091132.1412063-5-peng.fan@oss.nxp.com +Signed-off-by: Georgi Djakov +Signed-off-by: Sasha Levin +--- + drivers/interconnect/imx/imx.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c +index e398ebf1dbba..36f870e7b596 100644 +--- a/drivers/interconnect/imx/imx.c ++++ b/drivers/interconnect/imx/imx.c +@@ -226,16 +226,16 @@ int imx_icc_register(struct platform_device *pdev, + struct device *dev = &pdev->dev; + struct icc_onecell_data *data; + struct icc_provider *provider; +- int max_node_id; ++ int num_nodes; + int ret; + + /* icc_onecell_data is indexed by node_id, unlike nodes param */ +- max_node_id = get_max_node_id(nodes, nodes_count); +- data = devm_kzalloc(dev, struct_size(data, nodes, max_node_id), ++ num_nodes = get_max_node_id(nodes, nodes_count) + 1; ++ data = devm_kzalloc(dev, struct_size(data, nodes, num_nodes), + GFP_KERNEL); + if (!data) + return -ENOMEM; +- data->num_nodes = max_node_id; ++ data->num_nodes = num_nodes; + + provider = devm_kzalloc(dev, sizeof(*provider), GFP_KERNEL); + if (!provider) +-- +2.35.1 + diff --git a/queue-5.10/iommu-arm-smmu-qcom_iommu-add-of_node_put-when-break.patch b/queue-5.10/iommu-arm-smmu-qcom_iommu-add-of_node_put-when-break.patch new file mode 100644 index 00000000000..3f50b58f15d --- /dev/null +++ b/queue-5.10/iommu-arm-smmu-qcom_iommu-add-of_node_put-when-break.patch @@ -0,0 +1,45 @@ +From 8a69792a15cbc9ab5cdf93e52f1d8e04653c5741 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 20:49:55 +0800 +Subject: iommu/arm-smmu: qcom_iommu: Add of_node_put() when breaking out of + loop + +From: Liang He + +[ Upstream commit a91eb6803c1c715738682fece095145cbd68fe0b ] + +In qcom_iommu_has_secure_context(), we should call of_node_put() +for the reference 'child' when breaking out of for_each_child_of_node() +which will automatically increase and decrease the refcount. + +Fixes: d051f28c8807 ("iommu/qcom: Initialize secure page table") +Signed-off-by: Liang He +Link: https://lore.kernel.org/r/20220719124955.1242171-1-windhl@126.com +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + drivers/iommu/arm/arm-smmu/qcom_iommu.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/drivers/iommu/arm/arm-smmu/qcom_iommu.c b/drivers/iommu/arm/arm-smmu/qcom_iommu.c +index b30d6c966e2c..a24390c548a9 100644 +--- a/drivers/iommu/arm/arm-smmu/qcom_iommu.c ++++ b/drivers/iommu/arm/arm-smmu/qcom_iommu.c +@@ -766,9 +766,12 @@ static bool qcom_iommu_has_secure_context(struct qcom_iommu_dev *qcom_iommu) + { + struct device_node *child; + +- for_each_child_of_node(qcom_iommu->dev->of_node, child) +- if (of_device_is_compatible(child, "qcom,msm-iommu-v1-sec")) ++ for_each_child_of_node(qcom_iommu->dev->of_node, child) { ++ if (of_device_is_compatible(child, "qcom,msm-iommu-v1-sec")) { ++ of_node_put(child); + return true; ++ } ++ } + + return false; + } +-- +2.35.1 + diff --git a/queue-5.10/iommu-exynos-handle-failed-iommu-device-registration.patch b/queue-5.10/iommu-exynos-handle-failed-iommu-device-registration.patch new file mode 100644 index 00000000000..bcd36841fe1 --- /dev/null +++ b/queue-5.10/iommu-exynos-handle-failed-iommu-device-registration.patch @@ -0,0 +1,51 @@ +From c717aafe962faca077e2cbeeb95576fcc7dbfa4c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jul 2022 19:55:46 +0300 +Subject: iommu/exynos: Handle failed IOMMU device registration properly + +From: Sam Protsenko + +[ Upstream commit fce398d2d02c0a9a2bedf7c7201b123e153e8963 ] + +If iommu_device_register() fails in exynos_sysmmu_probe(), the previous +calls have to be cleaned up. In this case, the iommu_device_sysfs_add() +should be cleaned up, by calling its remove counterpart call. + +Fixes: d2c302b6e8b1 ("iommu/exynos: Make use of iommu_device_register interface") +Signed-off-by: Sam Protsenko +Reviewed-by: Krzysztof Kozlowski +Acked-by: Marek Szyprowski +Link: https://lore.kernel.org/r/20220714165550.8884-3-semen.protsenko@linaro.org +Signed-off-by: Joerg Roedel +Signed-off-by: Sasha Levin +--- + drivers/iommu/exynos-iommu.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c +index de324b4eedfe..0cdb5493a464 100644 +--- a/drivers/iommu/exynos-iommu.c ++++ b/drivers/iommu/exynos-iommu.c +@@ -635,7 +635,7 @@ static int exynos_sysmmu_probe(struct platform_device *pdev) + + ret = iommu_device_register(&data->iommu); + if (ret) +- return ret; ++ goto err_iommu_register; + + platform_set_drvdata(pdev, data); + +@@ -662,6 +662,10 @@ static int exynos_sysmmu_probe(struct platform_device *pdev) + pm_runtime_enable(dev); + + return 0; ++ ++err_iommu_register: ++ iommu_device_sysfs_remove(&data->iommu); ++ return ret; + } + + static int __maybe_unused exynos_sysmmu_suspend(struct device *dev) +-- +2.35.1 + diff --git a/queue-5.10/ipv6-add-read_once-sk-sk_bound_dev_if-in-inet6_match.patch b/queue-5.10/ipv6-add-read_once-sk-sk_bound_dev_if-in-inet6_match.patch new file mode 100644 index 00000000000..c9f14ed27dc --- /dev/null +++ b/queue-5.10/ipv6-add-read_once-sk-sk_bound_dev_if-in-inet6_match.patch @@ -0,0 +1,125 @@ +From 8ef798c4ea76a41898b7462c1bd45d73a7a02379 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 13 May 2022 11:55:49 -0700 +Subject: ipv6: add READ_ONCE(sk->sk_bound_dev_if) in INET6_MATCH() + +From: Eric Dumazet + +[ Upstream commit 5d368f03280d3678433a7f119efe15dfbbb87bc8 ] + +INET6_MATCH() runs without holding a lock on the socket. + +We probably need to annotate most reads. + +This patch makes INET6_MATCH() an inline function +to ease our changes. + +v2: inline function only defined if IS_ENABLED(CONFIG_IPV6) + Change the name to inet6_match(), this is no longer a macro. + +Signed-off-by: Eric Dumazet +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + include/net/inet6_hashtables.h | 28 +++++++++++++++++++--------- + net/ipv4/inet_hashtables.c | 2 +- + net/ipv6/inet6_hashtables.c | 6 +++--- + net/ipv6/udp.c | 2 +- + 4 files changed, 24 insertions(+), 14 deletions(-) + +diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h +index 81b965953036..f259e1ae14ba 100644 +--- a/include/net/inet6_hashtables.h ++++ b/include/net/inet6_hashtables.h +@@ -103,15 +103,25 @@ struct sock *inet6_lookup(struct net *net, struct inet_hashinfo *hashinfo, + const int dif); + + int inet6_hash(struct sock *sk); +-#endif /* IS_ENABLED(CONFIG_IPV6) */ + +-#define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif, __sdif) \ +- (((__sk)->sk_portpair == (__ports)) && \ +- ((__sk)->sk_family == AF_INET6) && \ +- ipv6_addr_equal(&(__sk)->sk_v6_daddr, (__saddr)) && \ +- ipv6_addr_equal(&(__sk)->sk_v6_rcv_saddr, (__daddr)) && \ +- (((__sk)->sk_bound_dev_if == (__dif)) || \ +- ((__sk)->sk_bound_dev_if == (__sdif))) && \ +- net_eq(sock_net(__sk), (__net))) ++static inline bool inet6_match(struct net *net, const struct sock *sk, ++ const struct in6_addr *saddr, ++ const struct in6_addr *daddr, ++ const __portpair ports, ++ const int dif, const int sdif) ++{ ++ int bound_dev_if; ++ ++ if (!net_eq(sock_net(sk), net) || ++ sk->sk_family != AF_INET6 || ++ sk->sk_portpair != ports || ++ !ipv6_addr_equal(&sk->sk_v6_daddr, saddr) || ++ !ipv6_addr_equal(&sk->sk_v6_rcv_saddr, daddr)) ++ return false; ++ ++ bound_dev_if = READ_ONCE(sk->sk_bound_dev_if); ++ return bound_dev_if == dif || bound_dev_if == sdif; ++} ++#endif /* IS_ENABLED(CONFIG_IPV6) */ + + #endif /* _INET6_HASHTABLES_H */ +diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c +index 7dbe80e30b9d..feb7f072f2b2 100644 +--- a/net/ipv4/inet_hashtables.c ++++ b/net/ipv4/inet_hashtables.c +@@ -536,7 +536,7 @@ static bool inet_ehash_lookup_by_sk(struct sock *sk, + } + #if IS_ENABLED(CONFIG_IPV6) + else if (sk->sk_family == AF_INET6) { +- if (unlikely(INET6_MATCH(esk, net, ++ if (unlikely(inet6_match(net, esk, + &sk->sk_v6_daddr, + &sk->sk_v6_rcv_saddr, + ports, dif, sdif))) { +diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c +index 40203255ed88..b4a5e01e1201 100644 +--- a/net/ipv6/inet6_hashtables.c ++++ b/net/ipv6/inet6_hashtables.c +@@ -71,12 +71,12 @@ struct sock *__inet6_lookup_established(struct net *net, + sk_nulls_for_each_rcu(sk, node, &head->chain) { + if (sk->sk_hash != hash) + continue; +- if (!INET6_MATCH(sk, net, saddr, daddr, ports, dif, sdif)) ++ if (!inet6_match(net, sk, saddr, daddr, ports, dif, sdif)) + continue; + if (unlikely(!refcount_inc_not_zero(&sk->sk_refcnt))) + goto out; + +- if (unlikely(!INET6_MATCH(sk, net, saddr, daddr, ports, dif, sdif))) { ++ if (unlikely(!inet6_match(net, sk, saddr, daddr, ports, dif, sdif))) { + sock_gen_put(sk); + goto begin; + } +@@ -269,7 +269,7 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row, + if (sk2->sk_hash != hash) + continue; + +- if (likely(INET6_MATCH(sk2, net, saddr, daddr, ports, ++ if (likely(inet6_match(net, sk2, saddr, daddr, ports, + dif, sdif))) { + if (sk2->sk_state == TCP_TIME_WAIT) { + tw = inet_twsk(sk2); +diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c +index 7745d8a40209..4e90e5a52945 100644 +--- a/net/ipv6/udp.c ++++ b/net/ipv6/udp.c +@@ -1019,7 +1019,7 @@ static struct sock *__udp6_lib_demux_lookup(struct net *net, + + udp_portaddr_for_each_entry_rcu(sk, &hslot2->head) { + if (sk->sk_state == TCP_ESTABLISHED && +- INET6_MATCH(sk, net, rmt_addr, loc_addr, ports, dif, sdif)) ++ inet6_match(net, sk, rmt_addr, loc_addr, ports, dif, sdif)) + return sk; + /* Only check first socket in chain */ + break; +-- +2.35.1 + diff --git a/queue-5.10/irqchip-mips-gic-check-the-return-value-of-ioremap-i.patch b/queue-5.10/irqchip-mips-gic-check-the-return-value-of-ioremap-i.patch new file mode 100644 index 00000000000..beb9c78babc --- /dev/null +++ b/queue-5.10/irqchip-mips-gic-check-the-return-value-of-ioremap-i.patch @@ -0,0 +1,40 @@ +From 1a93a9f035e32e32093a7a776dc1afb111a9a0f9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 23 Jul 2022 18:01:28 +0800 +Subject: irqchip/mips-gic: Check the return value of ioremap() in + gic_of_init() + +From: William Dean + +[ Upstream commit 71349cc85e5930dce78ed87084dee098eba24b59 ] + +The function ioremap() in gic_of_init() can fail, so +its return value should be checked. + +Reported-by: Hacash Robot +Signed-off-by: William Dean +Signed-off-by: Marc Zyngier +Link: https://lore.kernel.org/r/20220723100128.2964304-1-williamsukatube@163.com +Signed-off-by: Sasha Levin +--- + drivers/irqchip/irq-mips-gic.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c +index 8b08b31ea2ba..8ada91bdbe4d 100644 +--- a/drivers/irqchip/irq-mips-gic.c ++++ b/drivers/irqchip/irq-mips-gic.c +@@ -766,6 +766,10 @@ static int __init gic_of_init(struct device_node *node, + } + + mips_gic_base = ioremap(gic_base, gic_len); ++ if (!mips_gic_base) { ++ pr_err("Failed to ioremap gic_base\n"); ++ return -ENOMEM; ++ } + + gicconfig = read_gic_config(); + gic_shared_intrs = gicconfig & GIC_CONFIG_NUMINTERRUPTS; +-- +2.35.1 + diff --git a/queue-5.10/irqchip-mips-gic-only-register-ipi-domain-when-smp-i.patch b/queue-5.10/irqchip-mips-gic-only-register-ipi-domain-when-smp-i.patch new file mode 100644 index 00000000000..7fecf11ecef --- /dev/null +++ b/queue-5.10/irqchip-mips-gic-only-register-ipi-domain-when-smp-i.patch @@ -0,0 +1,181 @@ +From 0a6831e125a73d9693850e66a621785218beebd1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 15:00:49 -0500 +Subject: irqchip/mips-gic: Only register IPI domain when SMP is enabled + +From: Samuel Holland + +[ Upstream commit 8190cc572981f2f13b6ffc26c7cfa7899e5d3ccc ] + +The MIPS GIC irqchip driver may be selected in a uniprocessor +configuration, but it unconditionally registers an IPI domain. + +Limit the part of the driver dealing with IPIs to only be compiled when +GENERIC_IRQ_IPI is enabled, which corresponds to an SMP configuration. + +Reported-by: kernel test robot +Signed-off-by: Samuel Holland +Signed-off-by: Marc Zyngier +Link: https://lore.kernel.org/r/20220701200056.46555-2-samuel@sholland.org +Signed-off-by: Sasha Levin +--- + drivers/irqchip/Kconfig | 3 +- + drivers/irqchip/irq-mips-gic.c | 80 +++++++++++++++++++++++----------- + 2 files changed, 56 insertions(+), 27 deletions(-) + +diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig +index dc062e8c2caf..c4b971cd239d 100644 +--- a/drivers/irqchip/Kconfig ++++ b/drivers/irqchip/Kconfig +@@ -313,7 +313,8 @@ config KEYSTONE_IRQ + + config MIPS_GIC + bool +- select GENERIC_IRQ_IPI ++ select GENERIC_IRQ_IPI if SMP ++ select IRQ_DOMAIN_HIERARCHY + select MIPS_CM + + config INGENIC_IRQ +diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c +index 215885962bb0..8b08b31ea2ba 100644 +--- a/drivers/irqchip/irq-mips-gic.c ++++ b/drivers/irqchip/irq-mips-gic.c +@@ -50,13 +50,15 @@ static DEFINE_PER_CPU_READ_MOSTLY(unsigned long[GIC_MAX_LONGS], pcpu_masks); + + static DEFINE_SPINLOCK(gic_lock); + static struct irq_domain *gic_irq_domain; +-static struct irq_domain *gic_ipi_domain; + static int gic_shared_intrs; + static unsigned int gic_cpu_pin; + static unsigned int timer_cpu_pin; + static struct irq_chip gic_level_irq_controller, gic_edge_irq_controller; ++ ++#ifdef CONFIG_GENERIC_IRQ_IPI + static DECLARE_BITMAP(ipi_resrv, GIC_MAX_INTRS); + static DECLARE_BITMAP(ipi_available, GIC_MAX_INTRS); ++#endif /* CONFIG_GENERIC_IRQ_IPI */ + + static struct gic_all_vpes_chip_data { + u32 map; +@@ -459,9 +461,11 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int virq, + u32 map; + + if (hwirq >= GIC_SHARED_HWIRQ_BASE) { ++#ifdef CONFIG_GENERIC_IRQ_IPI + /* verify that shared irqs don't conflict with an IPI irq */ + if (test_bit(GIC_HWIRQ_TO_SHARED(hwirq), ipi_resrv)) + return -EBUSY; ++#endif /* CONFIG_GENERIC_IRQ_IPI */ + + err = irq_domain_set_hwirq_and_chip(d, virq, hwirq, + &gic_level_irq_controller, +@@ -550,6 +554,8 @@ static const struct irq_domain_ops gic_irq_domain_ops = { + .map = gic_irq_domain_map, + }; + ++#ifdef CONFIG_GENERIC_IRQ_IPI ++ + static int gic_ipi_domain_xlate(struct irq_domain *d, struct device_node *ctrlr, + const u32 *intspec, unsigned int intsize, + irq_hw_number_t *out_hwirq, +@@ -653,6 +659,48 @@ static const struct irq_domain_ops gic_ipi_domain_ops = { + .match = gic_ipi_domain_match, + }; + ++static int gic_register_ipi_domain(struct device_node *node) ++{ ++ struct irq_domain *gic_ipi_domain; ++ unsigned int v[2], num_ipis; ++ ++ gic_ipi_domain = irq_domain_add_hierarchy(gic_irq_domain, ++ IRQ_DOMAIN_FLAG_IPI_PER_CPU, ++ GIC_NUM_LOCAL_INTRS + gic_shared_intrs, ++ node, &gic_ipi_domain_ops, NULL); ++ if (!gic_ipi_domain) { ++ pr_err("Failed to add IPI domain"); ++ return -ENXIO; ++ } ++ ++ irq_domain_update_bus_token(gic_ipi_domain, DOMAIN_BUS_IPI); ++ ++ if (node && ++ !of_property_read_u32_array(node, "mti,reserved-ipi-vectors", v, 2)) { ++ bitmap_set(ipi_resrv, v[0], v[1]); ++ } else { ++ /* ++ * Reserve 2 interrupts per possible CPU/VP for use as IPIs, ++ * meeting the requirements of arch/mips SMP. ++ */ ++ num_ipis = 2 * num_possible_cpus(); ++ bitmap_set(ipi_resrv, gic_shared_intrs - num_ipis, num_ipis); ++ } ++ ++ bitmap_copy(ipi_available, ipi_resrv, GIC_MAX_INTRS); ++ ++ return 0; ++} ++ ++#else /* !CONFIG_GENERIC_IRQ_IPI */ ++ ++static inline int gic_register_ipi_domain(struct device_node *node) ++{ ++ return 0; ++} ++ ++#endif /* !CONFIG_GENERIC_IRQ_IPI */ ++ + static int gic_cpu_startup(unsigned int cpu) + { + /* Enable or disable EIC */ +@@ -671,11 +719,12 @@ static int gic_cpu_startup(unsigned int cpu) + static int __init gic_of_init(struct device_node *node, + struct device_node *parent) + { +- unsigned int cpu_vec, i, gicconfig, v[2], num_ipis; ++ unsigned int cpu_vec, i, gicconfig; + unsigned long reserved; + phys_addr_t gic_base; + struct resource res; + size_t gic_len; ++ int ret; + + /* Find the first available CPU vector. */ + i = 0; +@@ -764,30 +813,9 @@ static int __init gic_of_init(struct device_node *node, + return -ENXIO; + } + +- gic_ipi_domain = irq_domain_add_hierarchy(gic_irq_domain, +- IRQ_DOMAIN_FLAG_IPI_PER_CPU, +- GIC_NUM_LOCAL_INTRS + gic_shared_intrs, +- node, &gic_ipi_domain_ops, NULL); +- if (!gic_ipi_domain) { +- pr_err("Failed to add IPI domain"); +- return -ENXIO; +- } +- +- irq_domain_update_bus_token(gic_ipi_domain, DOMAIN_BUS_IPI); +- +- if (node && +- !of_property_read_u32_array(node, "mti,reserved-ipi-vectors", v, 2)) { +- bitmap_set(ipi_resrv, v[0], v[1]); +- } else { +- /* +- * Reserve 2 interrupts per possible CPU/VP for use as IPIs, +- * meeting the requirements of arch/mips SMP. +- */ +- num_ipis = 2 * num_possible_cpus(); +- bitmap_set(ipi_resrv, gic_shared_intrs - num_ipis, num_ipis); +- } +- +- bitmap_copy(ipi_available, ipi_resrv, GIC_MAX_INTRS); ++ ret = gic_register_ipi_domain(node); ++ if (ret) ++ return ret; + + board_bind_eic_interrupt = &gic_bind_eic_interrupt; + +-- +2.35.1 + diff --git a/queue-5.10/jbd2-fix-assertion-jh-b_frozen_data-null-failure-whe.patch b/queue-5.10/jbd2-fix-assertion-jh-b_frozen_data-null-failure-whe.patch new file mode 100644 index 00000000000..ad4dce5add8 --- /dev/null +++ b/queue-5.10/jbd2-fix-assertion-jh-b_frozen_data-null-failure-whe.patch @@ -0,0 +1,110 @@ +From d5921e14d9044bfcc73798f4bbf2381d544fb094 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jul 2022 20:51:52 +0800 +Subject: jbd2: fix assertion 'jh->b_frozen_data == NULL' failure when journal + aborted + +From: Zhihao Cheng + +[ Upstream commit 4a734f0869f970b8a9b65062ea40b09a5da9dba8 ] + +Following process will fail assertion 'jh->b_frozen_data == NULL' in +jbd2_journal_dirty_metadata(): + + jbd2_journal_commit_transaction +unlink(dir/a) + jh->b_transaction = trans1 + jh->b_jlist = BJ_Metadata + journal->j_running_transaction = NULL + trans1->t_state = T_COMMIT +unlink(dir/b) + handle->h_trans = trans2 + do_get_write_access + jh->b_modified = 0 + jh->b_frozen_data = frozen_buffer + jh->b_next_transaction = trans2 + jbd2_journal_dirty_metadata + is_handle_aborted + is_journal_aborted // return false + + --> jbd2 abort <-- + + while (commit_transaction->t_buffers) + if (is_journal_aborted) + jbd2_journal_refile_buffer + __jbd2_journal_refile_buffer + WRITE_ONCE(jh->b_transaction, + jh->b_next_transaction) + WRITE_ONCE(jh->b_next_transaction, NULL) + __jbd2_journal_file_buffer(jh, BJ_Reserved) + J_ASSERT_JH(jh, jh->b_frozen_data == NULL) // assertion failure ! + +The reproducer (See detail in [Link]) reports: + ------------[ cut here ]------------ + kernel BUG at fs/jbd2/transaction.c:1629! + invalid opcode: 0000 [#1] PREEMPT SMP + CPU: 2 PID: 584 Comm: unlink Tainted: G W + 5.19.0-rc6-00115-g4a57a8400075-dirty #697 + RIP: 0010:jbd2_journal_dirty_metadata+0x3c5/0x470 + RSP: 0018:ffffc90000be7ce0 EFLAGS: 00010202 + Call Trace: + + __ext4_handle_dirty_metadata+0xa0/0x290 + ext4_handle_dirty_dirblock+0x10c/0x1d0 + ext4_delete_entry+0x104/0x200 + __ext4_unlink+0x22b/0x360 + ext4_unlink+0x275/0x390 + vfs_unlink+0x20b/0x4c0 + do_unlinkat+0x42f/0x4c0 + __x64_sys_unlink+0x37/0x50 + do_syscall_64+0x35/0x80 + +After journal aborting, __jbd2_journal_refile_buffer() is executed with +holding @jh->b_state_lock, we can fix it by moving 'is_handle_aborted()' +into the area protected by @jh->b_state_lock. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=216251 +Fixes: 470decc613ab20 ("[PATCH] jbd2: initial copy of files from jbd") +Signed-off-by: Zhihao Cheng +Link: https://lore.kernel.org/r/20220715125152.4022726-1-chengzhihao1@huawei.com +Signed-off-by: Theodore Ts'o +Signed-off-by: Sasha Levin +--- + fs/jbd2/transaction.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c +index e8fc45fd751f..0f1cef90fa7d 100644 +--- a/fs/jbd2/transaction.c ++++ b/fs/jbd2/transaction.c +@@ -1460,8 +1460,6 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) + struct journal_head *jh; + int ret = 0; + +- if (is_handle_aborted(handle)) +- return -EROFS; + if (!buffer_jbd(bh)) + return -EUCLEAN; + +@@ -1508,6 +1506,18 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) + journal = transaction->t_journal; + spin_lock(&jh->b_state_lock); + ++ if (is_handle_aborted(handle)) { ++ /* ++ * Check journal aborting with @jh->b_state_lock locked, ++ * since 'jh->b_transaction' could be replaced with ++ * 'jh->b_next_transaction' during old transaction ++ * committing if journal aborted, which may fail ++ * assertion on 'jh->b_frozen_data == NULL'. ++ */ ++ ret = -EROFS; ++ goto out_unlock_bh; ++ } ++ + if (jh->b_modified == 0) { + /* + * This buffer's got modified and becoming part +-- +2.35.1 + diff --git a/queue-5.10/jbd2-fix-outstanding-credits-assert-in-jbd2_journal_.patch b/queue-5.10/jbd2-fix-outstanding-credits-assert-in-jbd2_journal_.patch new file mode 100644 index 00000000000..20f7978d0f1 --- /dev/null +++ b/queue-5.10/jbd2-fix-outstanding-credits-assert-in-jbd2_journal_.patch @@ -0,0 +1,75 @@ +From 412ca8ddb83ea592fd07f9f2942cf739a8d6430b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 11 Jun 2022 21:04:26 +0800 +Subject: jbd2: fix outstanding credits assert in + jbd2_journal_commit_transaction() + +From: Zhang Yi + +[ Upstream commit a89573ce4ad32f19f43ec669771726817e185be0 ] + +We catch an assert problem in jbd2_journal_commit_transaction() when +doing fsstress and request falut injection tests. The problem is +happened in a race condition between jbd2_journal_commit_transaction() +and ext4_end_io_end(). Firstly, ext4_writepages() writeback dirty pages +and start reserved handle, and then the journal was aborted due to some +previous metadata IO error, jbd2_journal_abort() start to commit current +running transaction, the committing procedure could be raced by +ext4_end_io_end() and lead to subtract j_reserved_credits twice from +commit_transaction->t_outstanding_credits, finally the +t_outstanding_credits is mistakenly smaller than t_nr_buffers and +trigger assert. + +kjournald2 kworker + +jbd2_journal_commit_transaction() + write_unlock(&journal->j_state_lock); + atomic_sub(j_reserved_credits, t_outstanding_credits); //sub once + + jbd2_journal_start_reserved() + start_this_handle() //detect aborted journal + jbd2_journal_free_reserved() //get running transaction + read_lock(&journal->j_state_lock) + __jbd2_journal_unreserve_handle() + atomic_sub(j_reserved_credits, t_outstanding_credits); + //sub again + read_unlock(&journal->j_state_lock); + + journal->j_running_transaction = NULL; + J_ASSERT(t_nr_buffers <= t_outstanding_credits) //bomb!!! + +Fix this issue by using journal->j_state_lock to protect the subtraction +in jbd2_journal_commit_transaction(). + +Fixes: 96f1e0974575 ("jbd2: avoid long hold times of j_state_lock while committing a transaction") +Signed-off-by: Zhang Yi +Reviewed-by: Jan Kara +Link: https://lore.kernel.org/r/20220611130426.2013258-1-yi.zhang@huawei.com +Signed-off-by: Theodore Ts'o +Signed-off-by: Sasha Levin +--- + fs/jbd2/commit.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c +index 867362f45cf6..98cfa73cb165 100644 +--- a/fs/jbd2/commit.c ++++ b/fs/jbd2/commit.c +@@ -564,13 +564,13 @@ void jbd2_journal_commit_transaction(journal_t *journal) + */ + jbd2_journal_switch_revoke_table(journal); + ++ write_lock(&journal->j_state_lock); + /* + * Reserved credits cannot be claimed anymore, free them + */ + atomic_sub(atomic_read(&journal->j_reserved_credits), + &commit_transaction->t_outstanding_credits); + +- write_lock(&journal->j_state_lock); + trace_jbd2_commit_flushing(journal, commit_transaction); + stats.run.rs_flushing = jiffies; + stats.run.rs_locked = jbd2_time_diff(stats.run.rs_locked, +-- +2.35.1 + diff --git a/queue-5.10/kfifo-fix-kfifo_to_user-return-type.patch b/queue-5.10/kfifo-fix-kfifo_to_user-return-type.patch new file mode 100644 index 00000000000..bca9d58fba0 --- /dev/null +++ b/queue-5.10/kfifo-fix-kfifo_to_user-return-type.patch @@ -0,0 +1,44 @@ +From f5688b8f0ec990f45a6046ddf8fd4d5a58612cb3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Jun 2022 08:30:04 +0300 +Subject: kfifo: fix kfifo_to_user() return type + +From: Dan Carpenter + +[ Upstream commit 045ed31e23aea840648c290dbde04797064960db ] + +The kfifo_to_user() macro is supposed to return zero for success or +negative error codes. Unfortunately, there is a signedness bug so it +returns unsigned int. This only affects callers which try to save the +result in ssize_t and as far as I can see the only place which does that +is line6_hwdep_read(). + +TL;DR: s/_uint/_int/. + +Link: https://lkml.kernel.org/r/YrVL3OJVLlNhIMFs@kili +Fixes: 144ecf310eb5 ("kfifo: fix kfifo_alloc() to return a signed int value") +Signed-off-by: Dan Carpenter +Cc: Stefani Seibold +Cc: Randy Dunlap +Signed-off-by: Andrew Morton +Signed-off-by: Sasha Levin +--- + include/linux/kfifo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/linux/kfifo.h b/include/linux/kfifo.h +index 86249476b57f..0b35a41440ff 100644 +--- a/include/linux/kfifo.h ++++ b/include/linux/kfifo.h +@@ -688,7 +688,7 @@ __kfifo_uint_must_check_helper( \ + * writer, you don't need extra locking to use these macro. + */ + #define kfifo_to_user(fifo, to, len, copied) \ +-__kfifo_uint_must_check_helper( \ ++__kfifo_int_must_check_helper( \ + ({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + void __user *__to = (to); \ +-- +2.35.1 + diff --git a/queue-5.10/kprobes-forbid-probing-on-trampoline-and-bpf-code-ar.patch b/queue-5.10/kprobes-forbid-probing-on-trampoline-and-bpf-code-ar.patch new file mode 100644 index 00000000000..58302e162dc --- /dev/null +++ b/queue-5.10/kprobes-forbid-probing-on-trampoline-and-bpf-code-ar.patch @@ -0,0 +1,52 @@ +From 83b96c56361894f259ac49d91b11b109d849170e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Aug 2022 11:37:19 +0800 +Subject: kprobes: Forbid probing on trampoline and BPF code areas + +From: Chen Zhongjin + +[ Upstream commit 28f6c37a2910f565b4f5960df52b2eccae28c891 ] + +kernel_text_address() treats ftrace_trampoline, kprobe_insn_slot +and bpf_text_address as valid kprobe addresses - which is not ideal. + +These text areas are removable and changeable without any notification +to kprobes, and probing on them can trigger unexpected behavior: + + https://lkml.org/lkml/2022/7/26/1148 + +Considering that jump_label and static_call text are already +forbiden to probe, kernel_text_address() should be replaced with +core_kernel_text() and is_module_text_address() to check other text +areas which are unsafe to kprobe. + +[ mingo: Rewrote the changelog. ] + +Fixes: 5b485629ba0d ("kprobes, extable: Identify kprobes trampolines as kernel text area") +Fixes: 74451e66d516 ("bpf: make jited programs visible in traces") +Signed-off-by: Chen Zhongjin +Signed-off-by: Ingo Molnar +Acked-by: Masami Hiramatsu (Google) +Link: https://lore.kernel.org/r/20220801033719.228248-1-chenzhongjin@huawei.com +Signed-off-by: Sasha Levin +--- + kernel/kprobes.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/kernel/kprobes.c b/kernel/kprobes.c +index cdea59acd66b..a397042e4660 100644 +--- a/kernel/kprobes.c ++++ b/kernel/kprobes.c +@@ -1640,7 +1640,8 @@ static int check_kprobe_address_safe(struct kprobe *p, + preempt_disable(); + + /* Ensure it is not in reserved area nor out of text */ +- if (!kernel_text_address((unsigned long) p->addr) || ++ if (!(core_kernel_text((unsigned long) p->addr) || ++ is_module_text_address((unsigned long) p->addr)) || + within_kprobe_blacklist((unsigned long) p->addr) || + jump_label_text_reserved(p->addr, p->addr) || + static_call_text_reserved(p->addr, p->addr) || +-- +2.35.1 + diff --git a/queue-5.10/kvm-arm64-don-t-return-from-void-function.patch b/queue-5.10/kvm-arm64-don-t-return-from-void-function.patch new file mode 100644 index 00000000000..005e2437dd8 --- /dev/null +++ b/queue-5.10/kvm-arm64-don-t-return-from-void-function.patch @@ -0,0 +1,54 @@ +From fc79abdfe36487f8aa6a66d763c7f01fd7063448 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jul 2022 14:23:10 +0000 +Subject: KVM: arm64: Don't return from void function + +From: Quentin Perret + +[ Upstream commit 1c3ace2b8b3995d3213c5e2d2aca01a0577a3b0f ] + +Although harmless, the return statement in kvm_unexpected_el2_exception +is rather confusing as the function itself has a void return type. The +C standard is also pretty clear that "A return statement with an +expression shall not appear in a function whose return type is void". +Given that this return statement does not seem to add any actual value, +let's not pointlessly violate the standard. + +Build-tested with GCC 10 and CLANG 13 for good measure, the disassembled +code is identical with or without the return statement. + +Fixes: e9ee186bb735 ("KVM: arm64: Add kvm_extable for vaxorcism code") +Signed-off-by: Quentin Perret +Signed-off-by: Marc Zyngier +Link: https://lore.kernel.org/r/20220705142310.3847918-1-qperret@google.com +Signed-off-by: Sasha Levin +--- + arch/arm64/kvm/hyp/nvhe/switch.c | 2 +- + arch/arm64/kvm/hyp/vhe/switch.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/kvm/hyp/nvhe/switch.c b/arch/arm64/kvm/hyp/nvhe/switch.c +index 6624596846d3..2401164c5f86 100644 +--- a/arch/arm64/kvm/hyp/nvhe/switch.c ++++ b/arch/arm64/kvm/hyp/nvhe/switch.c +@@ -279,5 +279,5 @@ void __noreturn hyp_panic(void) + + asmlinkage void kvm_unexpected_el2_exception(void) + { +- return __kvm_unexpected_el2_exception(); ++ __kvm_unexpected_el2_exception(); + } +diff --git a/arch/arm64/kvm/hyp/vhe/switch.c b/arch/arm64/kvm/hyp/vhe/switch.c +index 532e687f6936..99e2581e9806 100644 +--- a/arch/arm64/kvm/hyp/vhe/switch.c ++++ b/arch/arm64/kvm/hyp/vhe/switch.c +@@ -228,5 +228,5 @@ void __noreturn hyp_panic(void) + + asmlinkage void kvm_unexpected_el2_exception(void) + { +- return __kvm_unexpected_el2_exception(); ++ __kvm_unexpected_el2_exception(); + } +-- +2.35.1 + diff --git a/queue-5.10/kvm-don-t-set-accessed-dirty-bits-for-zero_page.patch b/queue-5.10/kvm-don-t-set-accessed-dirty-bits-for-zero_page.patch new file mode 100644 index 00000000000..a2315f90b6e --- /dev/null +++ b/queue-5.10/kvm-don-t-set-accessed-dirty-bits-for-zero_page.patch @@ -0,0 +1,64 @@ +From 3264d8ebcbd8ce94ad77e4f218d175a952cc9d49 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Apr 2022 01:04:09 +0000 +Subject: KVM: Don't set Accessed/Dirty bits for ZERO_PAGE + +From: Sean Christopherson + +[ Upstream commit a1040b0d42acf69bb4f6dbdc54c2dcd78eea1de5 ] + +Don't set Accessed/Dirty bits for a struct page with PG_reserved set, +i.e. don't set A/D bits for the ZERO_PAGE. The ZERO_PAGE (or pages +depending on the architecture) should obviously never be written, and +similarly there's no point in marking it accessed as the page will never +be swapped out or reclaimed. The comment in page-flags.h is quite clear +that PG_reserved pages should be managed only by their owner, and +strictly following that mandate also simplifies KVM's logic. + +Fixes: 7df003c85218 ("KVM: fix overflow of zero page refcount with ksm running") +Signed-off-by: Sean Christopherson +Message-Id: <20220429010416.2788472-4-seanjc@google.com> +Signed-off-by: Paolo Bonzini +Signed-off-by: Sasha Levin +--- + virt/kvm/kvm_main.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c +index c5dbac10c372..421b0ff72b46 100644 +--- a/virt/kvm/kvm_main.c ++++ b/virt/kvm/kvm_main.c +@@ -2339,16 +2339,28 @@ void kvm_release_pfn_dirty(kvm_pfn_t pfn) + } + EXPORT_SYMBOL_GPL(kvm_release_pfn_dirty); + ++static bool kvm_is_ad_tracked_pfn(kvm_pfn_t pfn) ++{ ++ if (!pfn_valid(pfn)) ++ return false; ++ ++ /* ++ * Per page-flags.h, pages tagged PG_reserved "should in general not be ++ * touched (e.g. set dirty) except by its owner". ++ */ ++ return !PageReserved(pfn_to_page(pfn)); ++} ++ + void kvm_set_pfn_dirty(kvm_pfn_t pfn) + { +- if (!kvm_is_reserved_pfn(pfn) && !kvm_is_zone_device_pfn(pfn)) ++ if (kvm_is_ad_tracked_pfn(pfn)) + SetPageDirty(pfn_to_page(pfn)); + } + EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty); + + void kvm_set_pfn_accessed(kvm_pfn_t pfn) + { +- if (!kvm_is_reserved_pfn(pfn) && !kvm_is_zone_device_pfn(pfn)) ++ if (kvm_is_ad_tracked_pfn(pfn)) + mark_page_accessed(pfn_to_page(pfn)); + } + EXPORT_SYMBOL_GPL(kvm_set_pfn_accessed); +-- +2.35.1 + diff --git a/queue-5.10/kvm-s390-pv-leak-the-topmost-page-table-when-destroy.patch b/queue-5.10/kvm-s390-pv-leak-the-topmost-page-table-when-destroy.patch new file mode 100644 index 00000000000..b37dfff9664 --- /dev/null +++ b/queue-5.10/kvm-s390-pv-leak-the-topmost-page-table-when-destroy.patch @@ -0,0 +1,173 @@ +From d13ec36886da99d4927fa997cfc95b249b796655 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 28 Jun 2022 15:56:02 +0200 +Subject: KVM: s390: pv: leak the topmost page table when destroy fails + +From: Claudio Imbrenda + +[ Upstream commit faa2f72cb3569256480c5540d242c84e99965160 ] + +Each secure guest must have a unique ASCE (address space control +element); we must avoid that new guests use the same page for their +ASCE, to avoid errors. + +Since the ASCE mostly consists of the address of the topmost page table +(plus some flags), we must not return that memory to the pool unless +the ASCE is no longer in use. + +Only a successful Destroy Secure Configuration UVC will make the ASCE +reusable again. + +If the Destroy Configuration UVC fails, the ASCE cannot be reused for a +secure guest (either for the ASCE or for other memory areas). To avoid +a collision, it must not be used again. This is a permanent error and +the page becomes in practice unusable, so we set it aside and leak it. +On failure we already leak other memory that belongs to the ultravisor +(i.e. the variable and base storage for a guest) and not leaking the +topmost page table was an oversight. + +This error (and thus the leakage) should not happen unless the hardware +is broken or KVM has some unknown serious bug. + +Signed-off-by: Claudio Imbrenda +Fixes: 29b40f105ec8d55 ("KVM: s390: protvirt: Add initial vm and cpu lifecycle handling") +Reviewed-by: Janosch Frank +Link: https://lore.kernel.org/r/20220628135619.32410-2-imbrenda@linux.ibm.com +Message-Id: <20220628135619.32410-2-imbrenda@linux.ibm.com> +Signed-off-by: Janosch Frank +Signed-off-by: Sasha Levin +--- + arch/s390/include/asm/gmap.h | 2 + + arch/s390/kvm/pv.c | 9 ++-- + arch/s390/mm/gmap.c | 86 ++++++++++++++++++++++++++++++++++++ + 3 files changed, 94 insertions(+), 3 deletions(-) + +diff --git a/arch/s390/include/asm/gmap.h b/arch/s390/include/asm/gmap.h +index 40264f60b0da..f4073106e1f3 100644 +--- a/arch/s390/include/asm/gmap.h ++++ b/arch/s390/include/asm/gmap.h +@@ -148,4 +148,6 @@ void gmap_sync_dirty_log_pmd(struct gmap *gmap, unsigned long dirty_bitmap[4], + unsigned long gaddr, unsigned long vmaddr); + int gmap_mark_unmergeable(void); + void s390_reset_acc(struct mm_struct *mm); ++void s390_unlist_old_asce(struct gmap *gmap); ++int s390_replace_asce(struct gmap *gmap); + #endif /* _ASM_S390_GMAP_H */ +diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c +index 822887887222..c0e00e94ee22 100644 +--- a/arch/s390/kvm/pv.c ++++ b/arch/s390/kvm/pv.c +@@ -163,10 +163,13 @@ int kvm_s390_pv_deinit_vm(struct kvm *kvm, u16 *rc, u16 *rrc) + atomic_set(&kvm->mm->context.is_protected, 0); + KVM_UV_EVENT(kvm, 3, "PROTVIRT DESTROY VM: rc %x rrc %x", *rc, *rrc); + WARN_ONCE(cc, "protvirt destroy vm failed rc %x rrc %x", *rc, *rrc); +- /* Inteded memory leak on "impossible" error */ +- if (!cc) ++ /* Intended memory leak on "impossible" error */ ++ if (!cc) { + kvm_s390_pv_dealloc_vm(kvm); +- return cc ? -EIO : 0; ++ return 0; ++ } ++ s390_replace_asce(kvm->arch.gmap); ++ return -EIO; + } + + int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) +diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c +index 2db097c14cec..03e561608eed 100644 +--- a/arch/s390/mm/gmap.c ++++ b/arch/s390/mm/gmap.c +@@ -2721,3 +2721,89 @@ void s390_reset_acc(struct mm_struct *mm) + mmput(mm); + } + EXPORT_SYMBOL_GPL(s390_reset_acc); ++ ++/** ++ * s390_unlist_old_asce - Remove the topmost level of page tables from the ++ * list of page tables of the gmap. ++ * @gmap: the gmap whose table is to be removed ++ * ++ * On s390x, KVM keeps a list of all pages containing the page tables of the ++ * gmap (the CRST list). This list is used at tear down time to free all ++ * pages that are now not needed anymore. ++ * ++ * This function removes the topmost page of the tree (the one pointed to by ++ * the ASCE) from the CRST list. ++ * ++ * This means that it will not be freed when the VM is torn down, and needs ++ * to be handled separately by the caller, unless a leak is actually ++ * intended. Notice that this function will only remove the page from the ++ * list, the page will still be used as a top level page table (and ASCE). ++ */ ++void s390_unlist_old_asce(struct gmap *gmap) ++{ ++ struct page *old; ++ ++ old = virt_to_page(gmap->table); ++ spin_lock(&gmap->guest_table_lock); ++ list_del(&old->lru); ++ /* ++ * Sometimes the topmost page might need to be "removed" multiple ++ * times, for example if the VM is rebooted into secure mode several ++ * times concurrently, or if s390_replace_asce fails after calling ++ * s390_remove_old_asce and is attempted again later. In that case ++ * the old asce has been removed from the list, and therefore it ++ * will not be freed when the VM terminates, but the ASCE is still ++ * in use and still pointed to. ++ * A subsequent call to replace_asce will follow the pointer and try ++ * to remove the same page from the list again. ++ * Therefore it's necessary that the page of the ASCE has valid ++ * pointers, so list_del can work (and do nothing) without ++ * dereferencing stale or invalid pointers. ++ */ ++ INIT_LIST_HEAD(&old->lru); ++ spin_unlock(&gmap->guest_table_lock); ++} ++EXPORT_SYMBOL_GPL(s390_unlist_old_asce); ++ ++/** ++ * s390_replace_asce - Try to replace the current ASCE of a gmap with a copy ++ * @gmap: the gmap whose ASCE needs to be replaced ++ * ++ * If the allocation of the new top level page table fails, the ASCE is not ++ * replaced. ++ * In any case, the old ASCE is always removed from the gmap CRST list. ++ * Therefore the caller has to make sure to save a pointer to it ++ * beforehand, unless a leak is actually intended. ++ */ ++int s390_replace_asce(struct gmap *gmap) ++{ ++ unsigned long asce; ++ struct page *page; ++ void *table; ++ ++ s390_unlist_old_asce(gmap); ++ ++ page = alloc_pages(GFP_KERNEL_ACCOUNT, CRST_ALLOC_ORDER); ++ if (!page) ++ return -ENOMEM; ++ table = page_to_virt(page); ++ memcpy(table, gmap->table, 1UL << (CRST_ALLOC_ORDER + PAGE_SHIFT)); ++ ++ /* ++ * The caller has to deal with the old ASCE, but here we make sure ++ * the new one is properly added to the CRST list, so that ++ * it will be freed when the VM is torn down. ++ */ ++ spin_lock(&gmap->guest_table_lock); ++ list_add(&page->lru, &gmap->crst_list); ++ spin_unlock(&gmap->guest_table_lock); ++ ++ /* Set new table origin while preserving existing ASCE control bits */ ++ asce = (gmap->asce & ~_ASCE_ORIGIN) | __pa(table); ++ WRITE_ONCE(gmap->asce, asce); ++ WRITE_ONCE(gmap->mm->context.gmap_asce, asce); ++ WRITE_ONCE(gmap->table, table); ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(s390_replace_asce); +-- +2.35.1 + diff --git a/queue-5.10/lib-bitmap-order-includes-alphabetically.patch b/queue-5.10/lib-bitmap-order-includes-alphabetically.patch new file mode 100644 index 00000000000..57397522eab --- /dev/null +++ b/queue-5.10/lib-bitmap-order-includes-alphabetically.patch @@ -0,0 +1,67 @@ +From c3f2018721a747f653a61f85fbac36b3d91821ad Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Mar 2021 10:13:55 +0100 +Subject: lib: bitmap: order includes alphabetically + +From: Bartosz Golaszewski + +[ Upstream commit c13656b904b6173aad723d9680a81c60de2f5edc ] + +For better readability and maintenance: order the includes in bitmap +source files alphabetically. + +Signed-off-by: Bartosz Golaszewski +Reviewed-by: Andy Shevchenko +Signed-off-by: Sasha Levin +--- + include/linux/bitmap.h | 4 ++-- + lib/bitmap.c | 9 +++++---- + 2 files changed, 7 insertions(+), 6 deletions(-) + +diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h +index 99058eb81042..4dd2e1d39c74 100644 +--- a/include/linux/bitmap.h ++++ b/include/linux/bitmap.h +@@ -4,10 +4,10 @@ + + #ifndef __ASSEMBLY__ + +-#include + #include +-#include + #include ++#include ++#include + + /* + * bitmaps provide bit arrays that consume one or more unsigned +diff --git a/lib/bitmap.c b/lib/bitmap.c +index 75006c4036e9..78f70d9007ad 100644 +--- a/lib/bitmap.c ++++ b/lib/bitmap.c +@@ -3,17 +3,18 @@ + * lib/bitmap.c + * Helper functions for bitmap.h. + */ +-#include +-#include +-#include +-#include ++ + #include + #include + #include ++#include ++#include ++#include + #include + #include + #include + #include ++#include + #include + + #include +-- +2.35.1 + diff --git a/queue-5.10/lib-bitmap-provide-devm_bitmap_alloc-and-devm_bitmap.patch b/queue-5.10/lib-bitmap-provide-devm_bitmap_alloc-and-devm_bitmap.patch new file mode 100644 index 00000000000..17950140b48 --- /dev/null +++ b/queue-5.10/lib-bitmap-provide-devm_bitmap_alloc-and-devm_bitmap.patch @@ -0,0 +1,99 @@ +From 147c3a3b0bcc0d0dc8f8fed4329fa56d7caf2480 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Mar 2021 10:13:56 +0100 +Subject: lib: bitmap: provide devm_bitmap_alloc() and devm_bitmap_zalloc() + +From: Bartosz Golaszewski + +[ Upstream commit e829c2e4744850bab4d8f8ffebd00df10b4c6c2b ] + +Provide managed variants of bitmap_alloc() and bitmap_zalloc(). + +Signed-off-by: Bartosz Golaszewski +Reviewed-by: Andy Shevchenko +Signed-off-by: Sasha Levin +--- + include/linux/bitmap.h | 8 ++++++++ + lib/bitmap.c | 33 +++++++++++++++++++++++++++++++++ + 2 files changed, 41 insertions(+) + +diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h +index 4dd2e1d39c74..c4f6a9270c03 100644 +--- a/include/linux/bitmap.h ++++ b/include/linux/bitmap.h +@@ -9,6 +9,8 @@ + #include + #include + ++struct device; ++ + /* + * bitmaps provide bit arrays that consume one or more unsigned + * longs. The bitmap interface and available operations are listed +@@ -122,6 +124,12 @@ extern unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags); + extern unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags); + extern void bitmap_free(const unsigned long *bitmap); + ++/* Managed variants of the above. */ ++unsigned long *devm_bitmap_alloc(struct device *dev, ++ unsigned int nbits, gfp_t flags); ++unsigned long *devm_bitmap_zalloc(struct device *dev, ++ unsigned int nbits, gfp_t flags); ++ + /* + * lib/bitmap.c provides these functions: + */ +diff --git a/lib/bitmap.c b/lib/bitmap.c +index 78f70d9007ad..27e08c0e547e 100644 +--- a/lib/bitmap.c ++++ b/lib/bitmap.c +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1263,6 +1264,38 @@ void bitmap_free(const unsigned long *bitmap) + } + EXPORT_SYMBOL(bitmap_free); + ++static void devm_bitmap_free(void *data) ++{ ++ unsigned long *bitmap = data; ++ ++ bitmap_free(bitmap); ++} ++ ++unsigned long *devm_bitmap_alloc(struct device *dev, ++ unsigned int nbits, gfp_t flags) ++{ ++ unsigned long *bitmap; ++ int ret; ++ ++ bitmap = bitmap_alloc(nbits, flags); ++ if (!bitmap) ++ return NULL; ++ ++ ret = devm_add_action_or_reset(dev, devm_bitmap_free, bitmap); ++ if (ret) ++ return NULL; ++ ++ return bitmap; ++} ++EXPORT_SYMBOL_GPL(devm_bitmap_alloc); ++ ++unsigned long *devm_bitmap_zalloc(struct device *dev, ++ unsigned int nbits, gfp_t flags) ++{ ++ return devm_bitmap_alloc(dev, nbits, flags | __GFP_ZERO); ++} ++EXPORT_SYMBOL_GPL(devm_bitmap_zalloc); ++ + #if BITS_PER_LONG == 64 + /** + * bitmap_from_arr32 - copy the contents of u32 array of bits to bitmap +-- +2.35.1 + diff --git a/queue-5.10/lib-smp_processor_id-fix-imbalanced-instrumentation_.patch b/queue-5.10/lib-smp_processor_id-fix-imbalanced-instrumentation_.patch new file mode 100644 index 00000000000..2e0cdd15b9b --- /dev/null +++ b/queue-5.10/lib-smp_processor_id-fix-imbalanced-instrumentation_.patch @@ -0,0 +1,42 @@ +From 95b7c19b0d001f05dc9cd66bc7c1c78db66a1fc4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 22 Jun 2022 14:46:31 +0900 +Subject: lib/smp_processor_id: fix imbalanced instrumentation_end() call + +From: Tetsuo Handa + +[ Upstream commit bd27acaac24e4b252ee28dddcabaee80456d0faf ] + +Currently instrumentation_end() won't be called if printk_ratelimit() +returned false. + +Link: https://lkml.kernel.org/r/a636d8e0-ad32-5888-acac-671f7f553bb3@I-love.SAKURA.ne.jp +Fixes: 126f21f0e8d46e2c ("lib/smp_processor_id: Move it into noinstr section") +Signed-off-by: Tetsuo Handa +Cc: Thomas Gleixner +Cc: Alexandre Chartre +Cc: Peter Zijlstra +Signed-off-by: Andrew Morton +Signed-off-by: Sasha Levin +--- + lib/smp_processor_id.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/smp_processor_id.c b/lib/smp_processor_id.c +index 525222e4f409..2916606a9333 100644 +--- a/lib/smp_processor_id.c ++++ b/lib/smp_processor_id.c +@@ -46,9 +46,9 @@ unsigned int check_preemption_disabled(const char *what1, const char *what2) + + printk("caller is %pS\n", __builtin_return_address(0)); + dump_stack(); +- instrumentation_end(); + + out_enable: ++ instrumentation_end(); + preempt_enable_no_resched_notrace(); + out: + return this_cpu; +-- +2.35.1 + diff --git a/queue-5.10/libbpf-fix-the-name-of-a-reused-map.patch b/queue-5.10/libbpf-fix-the-name-of-a-reused-map.patch new file mode 100644 index 00000000000..bab41b632e0 --- /dev/null +++ b/queue-5.10/libbpf-fix-the-name-of-a-reused-map.patch @@ -0,0 +1,74 @@ +From d688e80427abc91874fce03f5f8d9ee1cdaff8f9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Jul 2022 11:15:40 +0800 +Subject: libbpf: Fix the name of a reused map +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Anquan Wu + +[ Upstream commit bf3f00378524adae16628cbadbd11ba7211863bb ] + +BPF map name is limited to BPF_OBJ_NAME_LEN. +A map name is defined as being longer than BPF_OBJ_NAME_LEN, +it will be truncated to BPF_OBJ_NAME_LEN when a userspace program +calls libbpf to create the map. A pinned map also generates a path +in the /sys. If the previous program wanted to reuse the map, +it can not get bpf_map by name, because the name of the map is only +partially the same as the name which get from pinned path. + +The syscall information below show that map name "process_pinned_map" +is truncated to "process_pinned_". + + bpf(BPF_OBJ_GET, {pathname="/sys/fs/bpf/process_pinned_map", + bpf_fd=0, file_flags=0}, 144) = -1 ENOENT (No such file or directory) + + bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_HASH, key_size=4, + value_size=4,max_entries=1024, map_flags=0, inner_map_fd=0, + map_name="process_pinned_",map_ifindex=0, btf_fd=3, btf_key_type_id=6, + btf_value_type_id=10,btf_vmlinux_value_type_id=0}, 72) = 4 + +This patch check that if the name of pinned map are the same as the +actual name for the first (BPF_OBJ_NAME_LEN - 1), +bpf map still uses the name which is included in bpf object. + +Fixes: 26736eb9a483 ("tools: libbpf: allow map reuse") +Signed-off-by: Anquan Wu +Signed-off-by: Andrii Nakryiko +Link: https://lore.kernel.org/bpf/OSZP286MB1725CEA1C95C5CB8E7CCC53FB8869@OSZP286MB1725.JPNP286.PROD.OUTLOOK.COM +Signed-off-by: Sasha Levin +--- + tools/lib/bpf/libbpf.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c +index 8fada26529b7..66d7f8d494de 100644 +--- a/tools/lib/bpf/libbpf.c ++++ b/tools/lib/bpf/libbpf.c +@@ -3652,7 +3652,7 @@ static int bpf_get_map_info_from_fdinfo(int fd, struct bpf_map_info *info) + int bpf_map__reuse_fd(struct bpf_map *map, int fd) + { + struct bpf_map_info info = {}; +- __u32 len = sizeof(info); ++ __u32 len = sizeof(info), name_len; + int new_fd, err; + char *new_name; + +@@ -3662,7 +3662,12 @@ int bpf_map__reuse_fd(struct bpf_map *map, int fd) + if (err) + return err; + +- new_name = strdup(info.name); ++ name_len = strlen(info.name); ++ if (name_len == BPF_OBJ_NAME_LEN - 1 && strncmp(map->name, info.name, name_len) == 0) ++ new_name = strdup(map->name); ++ else ++ new_name = strdup(info.name); ++ + if (!new_name) + return -errno; + +-- +2.35.1 + diff --git a/queue-5.10/locking-lockdep-fix-lockdep_init_map_-confusion.patch b/queue-5.10/locking-lockdep-fix-lockdep_init_map_-confusion.patch new file mode 100644 index 00000000000..f4417d67e4f --- /dev/null +++ b/queue-5.10/locking-lockdep-fix-lockdep_init_map_-confusion.patch @@ -0,0 +1,101 @@ +From b4a9ffd6d35249382197bded23da91ff747ad91d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 Jun 2022 15:26:06 +0200 +Subject: locking/lockdep: Fix lockdep_init_map_*() confusion + +From: Peter Zijlstra + +[ Upstream commit eae6d58d67d9739be5f7ae2dbead1d0ef6528243 ] + +Commit dfd5e3f5fe27 ("locking/lockdep: Mark local_lock_t") added yet +another lockdep_init_map_*() variant, but forgot to update all the +existing users of the most complicated version. + +This could lead to a loss of lock_type and hence an incorrect report. +Given the relative rarity of both local_lock and these annotations, +this is unlikely to happen in practise, still, best fix things. + +Fixes: dfd5e3f5fe27 ("locking/lockdep: Mark local_lock_t") +Signed-off-by: Peter Zijlstra (Intel) +Link: https://lkml.kernel.org/r/YqyEDtoan20K0CVD@worktop.programming.kicks-ass.net +Signed-off-by: Sasha Levin +--- + include/linux/lockdep.h | 30 +++++++++++++++++------------- + kernel/locking/lockdep.c | 7 ++++--- + 2 files changed, 21 insertions(+), 16 deletions(-) + +diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h +index 20b6797babe2..2c2586312b44 100644 +--- a/include/linux/lockdep.h ++++ b/include/linux/lockdep.h +@@ -192,7 +192,7 @@ static inline void + lockdep_init_map_waits(struct lockdep_map *lock, const char *name, + struct lock_class_key *key, int subclass, u8 inner, u8 outer) + { +- lockdep_init_map_type(lock, name, key, subclass, inner, LD_WAIT_INV, LD_LOCK_NORMAL); ++ lockdep_init_map_type(lock, name, key, subclass, inner, outer, LD_LOCK_NORMAL); + } + + static inline void +@@ -215,24 +215,28 @@ static inline void lockdep_init_map(struct lockdep_map *lock, const char *name, + * or they are too narrow (they suffer from a false class-split): + */ + #define lockdep_set_class(lock, key) \ +- lockdep_init_map_waits(&(lock)->dep_map, #key, key, 0, \ +- (lock)->dep_map.wait_type_inner, \ +- (lock)->dep_map.wait_type_outer) ++ lockdep_init_map_type(&(lock)->dep_map, #key, key, 0, \ ++ (lock)->dep_map.wait_type_inner, \ ++ (lock)->dep_map.wait_type_outer, \ ++ (lock)->dep_map.lock_type) + + #define lockdep_set_class_and_name(lock, key, name) \ +- lockdep_init_map_waits(&(lock)->dep_map, name, key, 0, \ +- (lock)->dep_map.wait_type_inner, \ +- (lock)->dep_map.wait_type_outer) ++ lockdep_init_map_type(&(lock)->dep_map, name, key, 0, \ ++ (lock)->dep_map.wait_type_inner, \ ++ (lock)->dep_map.wait_type_outer, \ ++ (lock)->dep_map.lock_type) + + #define lockdep_set_class_and_subclass(lock, key, sub) \ +- lockdep_init_map_waits(&(lock)->dep_map, #key, key, sub,\ +- (lock)->dep_map.wait_type_inner, \ +- (lock)->dep_map.wait_type_outer) ++ lockdep_init_map_type(&(lock)->dep_map, #key, key, sub, \ ++ (lock)->dep_map.wait_type_inner, \ ++ (lock)->dep_map.wait_type_outer, \ ++ (lock)->dep_map.lock_type) + + #define lockdep_set_subclass(lock, sub) \ +- lockdep_init_map_waits(&(lock)->dep_map, #lock, (lock)->dep_map.key, sub,\ +- (lock)->dep_map.wait_type_inner, \ +- (lock)->dep_map.wait_type_outer) ++ lockdep_init_map_type(&(lock)->dep_map, #lock, (lock)->dep_map.key, sub,\ ++ (lock)->dep_map.wait_type_inner, \ ++ (lock)->dep_map.wait_type_outer, \ ++ (lock)->dep_map.lock_type) + + #define lockdep_set_novalidate_class(lock) \ + lockdep_set_class_and_name(lock, &__lockdep_no_validate__, #lock) +diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c +index c3387cdc075a..6cbd2b444476 100644 +--- a/kernel/locking/lockdep.c ++++ b/kernel/locking/lockdep.c +@@ -5139,9 +5139,10 @@ __lock_set_class(struct lockdep_map *lock, const char *name, + return 0; + } + +- lockdep_init_map_waits(lock, name, key, 0, +- lock->wait_type_inner, +- lock->wait_type_outer); ++ lockdep_init_map_type(lock, name, key, 0, ++ lock->wait_type_inner, ++ lock->wait_type_outer, ++ lock->lock_type); + class = register_lock_class(lock, subclass, 0); + hlock->class_idx = class - lock_classes; + +-- +2.35.1 + diff --git a/queue-5.10/media-cedrus-hevc-add-check-for-invalid-timestamp.patch b/queue-5.10/media-cedrus-hevc-add-check-for-invalid-timestamp.patch new file mode 100644 index 00000000000..6f5ec344b1f --- /dev/null +++ b/queue-5.10/media-cedrus-hevc-add-check-for-invalid-timestamp.patch @@ -0,0 +1,45 @@ +From c73143aa0333a1fbe2174954d65993af13a6083a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jul 2022 18:56:49 +0200 +Subject: media: cedrus: hevc: Add check for invalid timestamp + +From: Jernej Skrabec + +[ Upstream commit 143201a6435bf65f0115435e9dc6d95c66b908e9 ] + +Not all DPB entries will be used most of the time. Unused entries will +thus have invalid timestamps. They will produce negative buffer index +which is not specifically handled. This works just by chance in current +code. It will even produce bogus pointer, but since it's not used, it +won't do any harm. + +Let's fix that brittle design by skipping writing DPB entry altogether +if timestamp is invalid. + +Fixes: 86caab29da78 ("media: cedrus: Add HEVC/H.265 decoding support") +Signed-off-by: Jernej Skrabec +Reviewed-by: Ezequiel Garcia +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/staging/media/sunxi/cedrus/cedrus_h265.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c +index 368439cf5e17..20c01a56f284 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c +@@ -147,6 +147,9 @@ static void cedrus_h265_frame_info_write_dpb(struct cedrus_ctx *ctx, + dpb[i].pic_order_cnt[1] + }; + ++ if (buffer_index < 0) ++ continue; ++ + cedrus_h265_frame_info_write_single(ctx, i, dpb[i].field_pic, + pic_order_cnt, + buffer_index); +-- +2.35.1 + diff --git a/queue-5.10/media-hdpvr-fix-error-value-returns-in-hdpvr_read.patch b/queue-5.10/media-hdpvr-fix-error-value-returns-in-hdpvr_read.patch new file mode 100644 index 00000000000..fc8406e2eaa --- /dev/null +++ b/queue-5.10/media-hdpvr-fix-error-value-returns-in-hdpvr_read.patch @@ -0,0 +1,44 @@ +From 7bb0bbbed5e1d8e1c23ab5a0162ba24ab6ffb267 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 14 Jun 2022 18:50:02 +0100 +Subject: media: hdpvr: fix error value returns in hdpvr_read + +From: Niels Dossche + +[ Upstream commit 359c27c6ddbde404f44a9c0d3ec88ccd1e2042f2 ] + +Error return values are supposed to be negative in hdpvr_read. Most +error returns are currently handled via an unsigned integer "ret". When +setting a negative error value to "ret", the value actually becomes a +large positive value, because "ret" is unsigned. Later on, the "ret" +value is returned. But as ssize_t is a 64-bit signed number, the error +return value stays a large positive integer instead of a negative +integer. This can cause an error value to be interpreted as the read +size, which can cause a buffer overread for applications relying on the +returned size. + +Fixes: 9aba42efe85b ("V4L/DVB (11096): V4L2 Driver for the Hauppauge HD PVR usb capture device") +Signed-off-by: Niels Dossche +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/usb/hdpvr/hdpvr-video.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/media/usb/hdpvr/hdpvr-video.c b/drivers/media/usb/hdpvr/hdpvr-video.c +index 60e57e0f1927..fd7d2a9d0449 100644 +--- a/drivers/media/usb/hdpvr/hdpvr-video.c ++++ b/drivers/media/usb/hdpvr/hdpvr-video.c +@@ -409,7 +409,7 @@ static ssize_t hdpvr_read(struct file *file, char __user *buffer, size_t count, + struct hdpvr_device *dev = video_drvdata(file); + struct hdpvr_buffer *buf = NULL; + struct urb *urb; +- unsigned int ret = 0; ++ int ret = 0; + int rem, cnt; + + if (*pos) +-- +2.35.1 + diff --git a/queue-5.10/media-platform-mtk-mdp-fix-mdp_ipi_comm-structure-al.patch b/queue-5.10/media-platform-mtk-mdp-fix-mdp_ipi_comm-structure-al.patch new file mode 100644 index 00000000000..863e7c8e3ac --- /dev/null +++ b/queue-5.10/media-platform-mtk-mdp-fix-mdp_ipi_comm-structure-al.patch @@ -0,0 +1,57 @@ +From 0a05c9ecf52835462d0ee88597d3e1b08b948c2c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 23 Jun 2022 14:55:46 +0100 +Subject: media: platform: mtk-mdp: Fix mdp_ipi_comm structure alignment + +From: AngeloGioacchino Del Regno + +[ Upstream commit ab14c99c035da7156a3b66fa171171295bc4b89a ] + +The mdp_ipi_comm structure defines a command that is either +PROCESS (start processing) or DEINIT (destroy instance); we +are using this one to send PROCESS or DEINIT commands from Linux +to an MDP instance through a VPU write but, while the first wants +us to stay 4-bytes aligned, the VPU instead requires an 8-bytes +data alignment. + +Keeping in mind that these commands are executed immediately +after sending them (hence not chained with others before the +VPU/MDP "actually" start executing), it is fine to simply add +a padding of 4 bytes to this structure: this keeps the same +performance as before, as we're still stack-allocating it, +while avoiding hackery inside of mtk-vpu to ensure alignment +bringing a definitely bigger performance impact. + +Fixes: c8eb2d7e8202 ("[media] media: Add Mediatek MDP Driver") +Signed-off-by: AngeloGioacchino Del Regno +Reviewed-by: Houlong Wei +Reviewed-by: Irui Wang +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/platform/mtk-mdp/mtk_mdp_ipi.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_ipi.h b/drivers/media/platform/mtk-mdp/mtk_mdp_ipi.h +index 2cb8cecb3077..b810c96695c8 100644 +--- a/drivers/media/platform/mtk-mdp/mtk_mdp_ipi.h ++++ b/drivers/media/platform/mtk-mdp/mtk_mdp_ipi.h +@@ -40,12 +40,14 @@ struct mdp_ipi_init { + * @ipi_id : IPI_MDP + * @ap_inst : AP mtk_mdp_vpu address + * @vpu_inst_addr : VPU MDP instance address ++ * @padding : Alignment padding + */ + struct mdp_ipi_comm { + uint32_t msg_id; + uint32_t ipi_id; + uint64_t ap_inst; + uint32_t vpu_inst_addr; ++ uint32_t padding; + }; + + /** +-- +2.35.1 + diff --git a/queue-5.10/media-tw686x-fix-memory-leak-in-tw686x_video_init.patch b/queue-5.10/media-tw686x-fix-memory-leak-in-tw686x_video_init.patch new file mode 100644 index 00000000000..e5c1f5d1d12 --- /dev/null +++ b/queue-5.10/media-tw686x-fix-memory-leak-in-tw686x_video_init.patch @@ -0,0 +1,41 @@ +From acccb329b71b23496067a6f53641f708b818b582 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 21 Jun 2022 06:30:30 +0100 +Subject: media: tw686x: Fix memory leak in tw686x_video_init + +From: Miaoqian Lin + +[ Upstream commit e0b212ec9d8177d6f7c404315293f6a085d6ee42 ] + +video_device_alloc() allocates memory for vdev, +when video_register_device() fails, it doesn't release the memory and +leads to memory leak, call video_device_release() to fix this. + +Fixes: 704a84ccdbf1 ("[media] media: Support Intersil/Techwell TW686x-based video capture cards") +Signed-off-by: Miaoqian Lin +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/pci/tw686x/tw686x-video.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/pci/tw686x/tw686x-video.c b/drivers/media/pci/tw686x/tw686x-video.c +index 1ced2b0ddb24..55ed8851256f 100644 +--- a/drivers/media/pci/tw686x/tw686x-video.c ++++ b/drivers/media/pci/tw686x/tw686x-video.c +@@ -1283,8 +1283,10 @@ int tw686x_video_init(struct tw686x_dev *dev) + video_set_drvdata(vdev, vc); + + err = video_register_device(vdev, VFL_TYPE_VIDEO, -1); +- if (err < 0) ++ if (err < 0) { ++ video_device_release(vdev); + goto error; ++ } + vc->num = vdev->num; + } + +-- +2.35.1 + diff --git a/queue-5.10/media-tw686x-register-the-irq-at-the-end-of-probe.patch b/queue-5.10/media-tw686x-register-the-irq-at-the-end-of-probe.patch new file mode 100644 index 00000000000..60655d04602 --- /dev/null +++ b/queue-5.10/media-tw686x-register-the-irq-at-the-end-of-probe.patch @@ -0,0 +1,82 @@ +From b7b3e803b37f790cb0321de88d5d455de3db13e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 21 May 2022 07:24:01 +0100 +Subject: media: tw686x: Register the irq at the end of probe + +From: Zheyu Ma + +[ Upstream commit fb730334e0f759d00f72168fbc555e5a95e35210 ] + +We got the following warning when booting the kernel: + +[ 3.243674] INFO: trying to register non-static key. +[ 3.243922] The code is fine but needs lockdep annotation, or maybe +[ 3.244230] you didn't initialize this object before use? +[ 3.245642] Call Trace: +[ 3.247836] lock_acquire+0xff/0x2d0 +[ 3.248727] tw686x_audio_irq+0x1a5/0xcc0 [tw686x] +[ 3.249211] tw686x_irq+0x1f9/0x480 [tw686x] + +The lock 'vc->qlock' will be initialized in tw686x_video_init(), but the +driver registers the irq before calling the tw686x_video_init(), and we +got the warning. + +Fix this by registering the irq at the end of probe + +Fixes: 704a84ccdbf1 ("[media] media: Support Intersil/Techwell TW686x-based video capture cards") +Signed-off-by: Zheyu Ma +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/pci/tw686x/tw686x-core.c | 18 ++++++++---------- + 1 file changed, 8 insertions(+), 10 deletions(-) + +diff --git a/drivers/media/pci/tw686x/tw686x-core.c b/drivers/media/pci/tw686x/tw686x-core.c +index 74ae4f0dcee7..8a25a0dac4ae 100644 +--- a/drivers/media/pci/tw686x/tw686x-core.c ++++ b/drivers/media/pci/tw686x/tw686x-core.c +@@ -315,13 +315,6 @@ static int tw686x_probe(struct pci_dev *pci_dev, + + spin_lock_init(&dev->lock); + +- err = request_irq(pci_dev->irq, tw686x_irq, IRQF_SHARED, +- dev->name, dev); +- if (err < 0) { +- dev_err(&pci_dev->dev, "unable to request interrupt\n"); +- goto iounmap; +- } +- + timer_setup(&dev->dma_delay_timer, tw686x_dma_delay, 0); + + /* +@@ -333,18 +326,23 @@ static int tw686x_probe(struct pci_dev *pci_dev, + err = tw686x_video_init(dev); + if (err) { + dev_err(&pci_dev->dev, "can't register video\n"); +- goto free_irq; ++ goto iounmap; + } + + err = tw686x_audio_init(dev); + if (err) + dev_warn(&pci_dev->dev, "can't register audio\n"); + ++ err = request_irq(pci_dev->irq, tw686x_irq, IRQF_SHARED, ++ dev->name, dev); ++ if (err < 0) { ++ dev_err(&pci_dev->dev, "unable to request interrupt\n"); ++ goto iounmap; ++ } ++ + pci_set_drvdata(pci_dev, dev); + return 0; + +-free_irq: +- free_irq(pci_dev->irq, dev); + iounmap: + pci_iounmap(pci_dev, dev->mmio); + free_region: +-- +2.35.1 + diff --git a/queue-5.10/media-v4l2-mem2mem-prevent-pollerr-when-last_buffer_.patch b/queue-5.10/media-v4l2-mem2mem-prevent-pollerr-when-last_buffer_.patch new file mode 100644 index 00000000000..f5bc3635574 --- /dev/null +++ b/queue-5.10/media-v4l2-mem2mem-prevent-pollerr-when-last_buffer_.patch @@ -0,0 +1,44 @@ +From fc1bd72c764f197fa28f95f36ae737de33ccdec0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 Jun 2022 04:19:20 +0100 +Subject: media: v4l2-mem2mem: prevent pollerr when last_buffer_dequeued is set + +From: Ming Qian + +[ Upstream commit d4de27a9b1eadd33a2e40de87a646d1bf5fef756 ] + +If the last buffer was dequeued from the capture queue, +signal userspace. DQBUF(CAPTURE) will return -EPIPE. + +But if output queue is empty and capture queue is empty, +v4l2_m2m_poll_for_data will return EPOLLERR, +This is very easy to happen in drain. + +When last_buffer_dequeued is set, we shouldn't return EPOLLERR, +but return EPOLLIN | EPOLLRDNORM. + +Fixes: 1698a7f151126 ("media: v4l2-mem2mem: simplify poll logic") +Signed-off-by: Ming Qian +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/v4l2-core/v4l2-mem2mem.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c +index 73190652c267..ad14d5214106 100644 +--- a/drivers/media/v4l2-core/v4l2-mem2mem.c ++++ b/drivers/media/v4l2-core/v4l2-mem2mem.c +@@ -927,7 +927,7 @@ static __poll_t v4l2_m2m_poll_for_data(struct file *file, + if ((!src_q->streaming || src_q->error || + list_empty(&src_q->queued_list)) && + (!dst_q->streaming || dst_q->error || +- list_empty(&dst_q->queued_list))) ++ (list_empty(&dst_q->queued_list) && !dst_q->last_buffer_dequeued))) + return EPOLLERR; + + spin_lock_irqsave(&src_q->done_lock, flags); +-- +2.35.1 + diff --git a/queue-5.10/mediatek-mt76-mac80211-fix-missing-of_node_put-in-mt.patch b/queue-5.10/mediatek-mt76-mac80211-fix-missing-of_node_put-in-mt.patch new file mode 100644 index 00000000000..5ad7f3e263e --- /dev/null +++ b/queue-5.10/mediatek-mt76-mac80211-fix-missing-of_node_put-in-mt.patch @@ -0,0 +1,36 @@ +From 698514726dd506efb21bfd0fe6c941a72462a877 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 Jul 2022 16:34:20 +0800 +Subject: mediatek: mt76: mac80211: Fix missing of_node_put() in + mt76_led_init() + +From: Liang He + +[ Upstream commit 0a14c1d0113f121151edf34333cdf212dd209190 ] + +We should use of_node_put() for the reference 'np' returned by +of_get_child_by_name() which will increase the refcount. + +Fixes: 17f1de56df05 ("mt76: add common code shared between multiple chipsets") +Signed-off-by: Liang He +Signed-off-by: Felix Fietkau +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/mediatek/mt76/mac80211.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/wireless/mediatek/mt76/mac80211.c b/drivers/net/wireless/mediatek/mt76/mac80211.c +index 466447a5184f..81ff3b4c6c1b 100644 +--- a/drivers/net/wireless/mediatek/mt76/mac80211.c ++++ b/drivers/net/wireless/mediatek/mt76/mac80211.c +@@ -107,6 +107,7 @@ static int mt76_led_init(struct mt76_dev *dev) + if (!of_property_read_u32(np, "led-sources", &led_pin)) + dev->led_pin = led_pin; + dev->led_al = of_property_read_bool(np, "led-active-low"); ++ of_node_put(np); + } + + return led_classdev_register(dev->dev, &dev->led_cdev); +-- +2.35.1 + diff --git a/queue-5.10/memstick-ms_block-fix-a-memory-leak.patch b/queue-5.10/memstick-ms_block-fix-a-memory-leak.patch new file mode 100644 index 00000000000..250c1a79f9a --- /dev/null +++ b/queue-5.10/memstick-ms_block-fix-a-memory-leak.patch @@ -0,0 +1,39 @@ +From 89908c670d37f80b0ac1b69272830ae51217832d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 25 Jun 2022 14:55:56 +0200 +Subject: memstick/ms_block: Fix a memory leak + +From: Christophe JAILLET + +[ Upstream commit 54eb7a55be6779c4d0c25eaf5056498a28595049 ] + +'erased_blocks_bitmap' is never freed. As it is allocated at the same time +as 'used_blocks_bitmap', it is likely that it should be freed also at the +same time. + +Add the corresponding bitmap_free() in msb_data_clear(). + +Fixes: 0ab30494bc4f ("memstick: add support for legacy memorysticks") +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/b3b78926569445962ea5c3b6e9102418a9effb88.1656155715.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/memstick/core/ms_block.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/memstick/core/ms_block.c b/drivers/memstick/core/ms_block.c +index 6fa3ad3a94a0..6df98c0e5622 100644 +--- a/drivers/memstick/core/ms_block.c ++++ b/drivers/memstick/core/ms_block.c +@@ -1954,6 +1954,7 @@ static void msb_data_clear(struct msb_data *msb) + { + kfree(msb->boot_page); + bitmap_free(msb->used_blocks_bitmap); ++ bitmap_free(msb->erased_blocks_bitmap); + kfree(msb->lba_to_pba_table); + kfree(msb->cache); + msb->card = NULL; +-- +2.35.1 + diff --git a/queue-5.10/memstick-ms_block-fix-some-incorrect-memory-allocati.patch b/queue-5.10/memstick-ms_block-fix-some-incorrect-memory-allocati.patch new file mode 100644 index 00000000000..6e2a465ea12 --- /dev/null +++ b/queue-5.10/memstick-ms_block-fix-some-incorrect-memory-allocati.patch @@ -0,0 +1,65 @@ +From ab528eeb206bd0dfe77306295a7afa4579386f72 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 25 Jun 2022 14:55:25 +0200 +Subject: memstick/ms_block: Fix some incorrect memory allocation + +From: Christophe JAILLET + +[ Upstream commit 2e531bc3e0d86362fcd8a577b3278d9ef3cc2ba0 ] + +Some functions of the bitmap API take advantage of the fact that a bitmap +is an array of long. + +So, to make sure this assertion is correct, allocate bitmaps with +bitmap_zalloc() instead of kzalloc()+hand-computed number of bytes. + +While at it, also use bitmap_free() instead of kfree() to keep the +semantic. + +Fixes: 0ab30494bc4f ("memstick: add support for legacy memorysticks") +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/dbf633c48c24ae6d95f852557e8d8b3bbdef65fe.1656155715.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/memstick/core/ms_block.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/memstick/core/ms_block.c b/drivers/memstick/core/ms_block.c +index bc1f484f50f1..6fa3ad3a94a0 100644 +--- a/drivers/memstick/core/ms_block.c ++++ b/drivers/memstick/core/ms_block.c +@@ -1335,17 +1335,17 @@ static int msb_ftl_initialize(struct msb_data *msb) + msb->zone_count = msb->block_count / MS_BLOCKS_IN_ZONE; + msb->logical_block_count = msb->zone_count * 496 - 2; + +- msb->used_blocks_bitmap = kzalloc(msb->block_count / 8, GFP_KERNEL); +- msb->erased_blocks_bitmap = kzalloc(msb->block_count / 8, GFP_KERNEL); ++ msb->used_blocks_bitmap = bitmap_zalloc(msb->block_count, GFP_KERNEL); ++ msb->erased_blocks_bitmap = bitmap_zalloc(msb->block_count, GFP_KERNEL); + msb->lba_to_pba_table = + kmalloc_array(msb->logical_block_count, sizeof(u16), + GFP_KERNEL); + + if (!msb->used_blocks_bitmap || !msb->lba_to_pba_table || + !msb->erased_blocks_bitmap) { +- kfree(msb->used_blocks_bitmap); ++ bitmap_free(msb->used_blocks_bitmap); ++ bitmap_free(msb->erased_blocks_bitmap); + kfree(msb->lba_to_pba_table); +- kfree(msb->erased_blocks_bitmap); + return -ENOMEM; + } + +@@ -1953,7 +1953,7 @@ static int msb_bd_open(struct block_device *bdev, fmode_t mode) + static void msb_data_clear(struct msb_data *msb) + { + kfree(msb->boot_page); +- kfree(msb->used_blocks_bitmap); ++ bitmap_free(msb->used_blocks_bitmap); + kfree(msb->lba_to_pba_table); + kfree(msb->cache); + msb->card = NULL; +-- +2.35.1 + diff --git a/queue-5.10/meson-mx-socinfo-fix-refcount-leak-in-meson_mx_socin.patch b/queue-5.10/meson-mx-socinfo-fix-refcount-leak-in-meson_mx_socin.patch new file mode 100644 index 00000000000..6c08aa20251 --- /dev/null +++ b/queue-5.10/meson-mx-socinfo-fix-refcount-leak-in-meson_mx_socin.patch @@ -0,0 +1,38 @@ +From 7c288758604318af63d4912cf1e5c12d54fd0919 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 May 2022 10:57:29 +0400 +Subject: meson-mx-socinfo: Fix refcount leak in meson_mx_socinfo_init + +From: Miaoqian Lin + +[ Upstream commit a2106f38077e78afcb4bf98fdda3e162118cfb3d ] + +of_find_matching_node() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak. + +Fixes: 5e68c0fc8df8 ("soc: amlogic: Add Meson6/Meson8/Meson8b/Meson8m2 SoC Information driver") +Signed-off-by: Miaoqian Lin +Reviewed-by: Martin Blumenstingl +Signed-off-by: Neil Armstrong +Link: https://lore.kernel.org/r/20220524065729.33689-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/soc/amlogic/meson-mx-socinfo.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/soc/amlogic/meson-mx-socinfo.c b/drivers/soc/amlogic/meson-mx-socinfo.c +index 78f0f1aeca57..92125dd65f33 100644 +--- a/drivers/soc/amlogic/meson-mx-socinfo.c ++++ b/drivers/soc/amlogic/meson-mx-socinfo.c +@@ -126,6 +126,7 @@ static int __init meson_mx_socinfo_init(void) + np = of_find_matching_node(NULL, meson_mx_socinfo_analog_top_ids); + if (np) { + analog_top_regmap = syscon_node_to_regmap(np); ++ of_node_put(np); + if (IS_ERR(analog_top_regmap)) + return PTR_ERR(analog_top_regmap); + +-- +2.35.1 + diff --git a/queue-5.10/mfd-max77620-fix-refcount-leak-in-max77620_initialis.patch b/queue-5.10/mfd-max77620-fix-refcount-leak-in-max77620_initialis.patch new file mode 100644 index 00000000000..a0941c60677 --- /dev/null +++ b/queue-5.10/mfd-max77620-fix-refcount-leak-in-max77620_initialis.patch @@ -0,0 +1,42 @@ +From 644260bda4f6b9e6196a72e367a322a785cb3dc3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 1 Jun 2022 08:32:22 +0400 +Subject: mfd: max77620: Fix refcount leak in max77620_initialise_fps + +From: Miaoqian Lin + +[ Upstream commit 1520669c8255bd637c6b248b2be910e2688d38dd ] + +of_get_child_by_name() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak. + +Fixes: 327156c59360 ("mfd: max77620: Add core driver for MAX77620/MAX20024") +Signed-off-by: Miaoqian Lin +Reviewed-by: Krzysztof Kozlowski +Signed-off-by: Lee Jones +Link: https://lore.kernel.org/r/20220601043222.64441-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/mfd/max77620.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/mfd/max77620.c b/drivers/mfd/max77620.c +index fec2096474ad..a6661e07035b 100644 +--- a/drivers/mfd/max77620.c ++++ b/drivers/mfd/max77620.c +@@ -419,9 +419,11 @@ static int max77620_initialise_fps(struct max77620_chip *chip) + ret = max77620_config_fps(chip, fps_child); + if (ret < 0) { + of_node_put(fps_child); ++ of_node_put(fps_np); + return ret; + } + } ++ of_node_put(fps_np); + + config = chip->enable_global_lpm ? MAX77620_ONOFFCNFG2_SLP_LPM_MSK : 0; + ret = regmap_update_bits(chip->rmap, MAX77620_REG_ONOFFCNFG2, +-- +2.35.1 + diff --git a/queue-5.10/mfd-t7l66xb-drop-platform-disable-callback.patch b/queue-5.10/mfd-t7l66xb-drop-platform-disable-callback.patch new file mode 100644 index 00000000000..e951a571302 --- /dev/null +++ b/queue-5.10/mfd-t7l66xb-drop-platform-disable-callback.patch @@ -0,0 +1,70 @@ +From cf29e042947992a3af3eb8ef12beb620934b17d1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 30 May 2022 21:24:28 +0200 +Subject: mfd: t7l66xb: Drop platform disable callback +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit 128ac294e1b437cb8a7f2ff8ede1cde9082bddbe ] + +None of the in-tree instantiations of struct t7l66xb_platform_data +provides a disable callback. So better don't dereference this function +pointer unconditionally. As there is no user, drop it completely instead +of calling it conditional. + +This is a preparation for making platform remove callbacks return void. + +Fixes: 1f192015ca5b ("mfd: driver for the T7L66XB TMIO SoC") +Signed-off-by: Uwe Kleine-König +Signed-off-by: Lee Jones +Link: https://lore.kernel.org/r/20220530192430.2108217-3-u.kleine-koenig@pengutronix.de +Signed-off-by: Sasha Levin +--- + drivers/mfd/t7l66xb.c | 6 +----- + include/linux/mfd/t7l66xb.h | 1 - + 2 files changed, 1 insertion(+), 6 deletions(-) + +diff --git a/drivers/mfd/t7l66xb.c b/drivers/mfd/t7l66xb.c +index 70da0c4ae457..58811c5ab564 100644 +--- a/drivers/mfd/t7l66xb.c ++++ b/drivers/mfd/t7l66xb.c +@@ -405,11 +405,8 @@ static int t7l66xb_probe(struct platform_device *dev) + + static int t7l66xb_remove(struct platform_device *dev) + { +- struct t7l66xb_platform_data *pdata = dev_get_platdata(&dev->dev); + struct t7l66xb *t7l66xb = platform_get_drvdata(dev); +- int ret; + +- ret = pdata->disable(dev); + clk_disable_unprepare(t7l66xb->clk48m); + clk_put(t7l66xb->clk48m); + clk_disable_unprepare(t7l66xb->clk32k); +@@ -420,8 +417,7 @@ static int t7l66xb_remove(struct platform_device *dev) + mfd_remove_devices(&dev->dev); + kfree(t7l66xb); + +- return ret; +- ++ return 0; + } + + static struct platform_driver t7l66xb_platform_driver = { +diff --git a/include/linux/mfd/t7l66xb.h b/include/linux/mfd/t7l66xb.h +index 69632c1b07bd..ae3e7a5c5219 100644 +--- a/include/linux/mfd/t7l66xb.h ++++ b/include/linux/mfd/t7l66xb.h +@@ -12,7 +12,6 @@ + + struct t7l66xb_platform_data { + int (*enable)(struct platform_device *dev); +- int (*disable)(struct platform_device *dev); + int (*suspend)(struct platform_device *dev); + int (*resume)(struct platform_device *dev); + +-- +2.35.1 + diff --git a/queue-5.10/misc-rtsx-fix-an-error-handling-path-in-rtsx_pci_pro.patch b/queue-5.10/misc-rtsx-fix-an-error-handling-path-in-rtsx_pci_pro.patch new file mode 100644 index 00000000000..318fc82f100 --- /dev/null +++ b/queue-5.10/misc-rtsx-fix-an-error-handling-path-in-rtsx_pci_pro.patch @@ -0,0 +1,51 @@ +From f12af81f01ef2b8a18754ac1940d812b4eff02f5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 Jun 2022 07:33:44 +0200 +Subject: misc: rtsx: Fix an error handling path in rtsx_pci_probe() + +From: Christophe JAILLET + +[ Upstream commit 44fd1917314e9d4f53dd95dd65df1c152f503d3a ] + +If an error occurs after a successful idr_alloc() call, the corresponding +resource must be released with idr_remove() as already done in the .remove +function. + +Update the error handling path to add the missing idr_remove() call. + +Fixes: ada8a8a13b13 ("mfd: Add realtek pcie card reader driver") +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/e8dc41716cbf52fb37a12e70d8972848e69df6d6.1655271216.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/misc/cardreader/rtsx_pcr.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/misc/cardreader/rtsx_pcr.c b/drivers/misc/cardreader/rtsx_pcr.c +index 5d15607027e9..358b000b3a55 100644 +--- a/drivers/misc/cardreader/rtsx_pcr.c ++++ b/drivers/misc/cardreader/rtsx_pcr.c +@@ -1529,7 +1529,7 @@ static int rtsx_pci_probe(struct pci_dev *pcidev, + pcr->remap_addr = ioremap(base, len); + if (!pcr->remap_addr) { + ret = -ENOMEM; +- goto free_handle; ++ goto free_idr; + } + + pcr->rtsx_resv_buf = dma_alloc_coherent(&(pcidev->dev), +@@ -1591,6 +1591,10 @@ static int rtsx_pci_probe(struct pci_dev *pcidev, + pcr->rtsx_resv_buf, pcr->rtsx_resv_buf_addr); + unmap: + iounmap(pcr->remap_addr); ++free_idr: ++ spin_lock(&rtsx_pci_lock); ++ idr_remove(&rtsx_pci_idr, pcr->id); ++ spin_unlock(&rtsx_pci_lock); + free_handle: + kfree(handle); + free_pcr: +-- +2.35.1 + diff --git a/queue-5.10/mm-mmap.c-fix-missing-call-to-vm_unacct_memory-in-mm.patch b/queue-5.10/mm-mmap.c-fix-missing-call-to-vm_unacct_memory-in-mm.patch new file mode 100644 index 00000000000..dbceee6854c --- /dev/null +++ b/queue-5.10/mm-mmap.c-fix-missing-call-to-vm_unacct_memory-in-mm.patch @@ -0,0 +1,40 @@ +From 86a1f201d6881455e620b628813cbe8ea549a2a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 18 Jun 2022 16:20:27 +0800 +Subject: mm/mmap.c: fix missing call to vm_unacct_memory in mmap_region + +From: Miaohe Lin + +[ Upstream commit 7f82f922319ede486540e8746769865b9508d2c2 ] + +Since the beginning, charged is set to 0 to avoid calling vm_unacct_memory +twice because vm_unacct_memory will be called by above unmap_region. But +since commit 4f74d2c8e827 ("vm: remove 'nr_accounted' calculations from +the unmap_vmas() interfaces"), unmap_region doesn't call vm_unacct_memory +anymore. So charged shouldn't be set to 0 now otherwise the calling to +paired vm_unacct_memory will be missed and leads to imbalanced account. + +Link: https://lkml.kernel.org/r/20220618082027.43391-1-linmiaohe@huawei.com +Fixes: 4f74d2c8e827 ("vm: remove 'nr_accounted' calculations from the unmap_vmas() interfaces") +Signed-off-by: Miaohe Lin +Signed-off-by: Andrew Morton +Signed-off-by: Sasha Levin +--- + mm/mmap.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/mm/mmap.c b/mm/mmap.c +index 102f73ed4b1b..a50042918cc7 100644 +--- a/mm/mmap.c ++++ b/mm/mmap.c +@@ -1902,7 +1902,6 @@ unsigned long mmap_region(struct file *file, unsigned long addr, + + /* Undo any partial mapping done by a device driver. */ + unmap_region(mm, vma, prev, vma->vm_start, vma->vm_end); +- charged = 0; + if (vm_flags & VM_SHARED) + mapping_unmap_writable(file->f_mapping); + allow_write_and_free_vma: +-- +2.35.1 + diff --git a/queue-5.10/mmc-block-add-single-read-for-4k-sector-cards.patch b/queue-5.10/mmc-block-add-single-read-for-4k-sector-cards.patch new file mode 100644 index 00000000000..d5417895238 --- /dev/null +++ b/queue-5.10/mmc-block-add-single-read-for-4k-sector-cards.patch @@ -0,0 +1,129 @@ +From 68b34524cf4a4e35a30a1cfb731c5a89369574d9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 12:43:09 +0000 +Subject: mmc: block: Add single read for 4k sector cards + +From: Christian Loehle + +[ Upstream commit b3fa3e6dccc465969721b8bd2824213bd235efeb ] + +Cards with 4k native sector size may only be read 4k-aligned, +accommodate for this in the single read recovery and use it. + +Fixes: 81196976ed946 (mmc: block: Add blk-mq support) +Signed-off-by: Christian Loehle +Acked-by: Adrian Hunter +Reviewed-by: Avri Altman +Link: https://lore.kernel.org/r/cf4f316274c5474586d0d99b17db4a4c@hyperstone.com +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/core/block.c | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c +index 70eb3d03937f..66a00b7c751f 100644 +--- a/drivers/mmc/core/block.c ++++ b/drivers/mmc/core/block.c +@@ -169,7 +169,7 @@ static inline int mmc_blk_part_switch(struct mmc_card *card, + unsigned int part_type); + static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq, + struct mmc_card *card, +- int disable_multi, ++ int recovery_mode, + struct mmc_queue *mq); + static void mmc_blk_hsq_req_done(struct mmc_request *mrq); + +@@ -1247,7 +1247,7 @@ static void mmc_blk_eval_resp_error(struct mmc_blk_request *brq) + } + + static void mmc_blk_data_prep(struct mmc_queue *mq, struct mmc_queue_req *mqrq, +- int disable_multi, bool *do_rel_wr_p, ++ int recovery_mode, bool *do_rel_wr_p, + bool *do_data_tag_p) + { + struct mmc_blk_data *md = mq->blkdata; +@@ -1311,12 +1311,12 @@ static void mmc_blk_data_prep(struct mmc_queue *mq, struct mmc_queue_req *mqrq, + brq->data.blocks--; + + /* +- * After a read error, we redo the request one sector ++ * After a read error, we redo the request one (native) sector + * at a time in order to accurately determine which + * sectors can be read successfully. + */ +- if (disable_multi) +- brq->data.blocks = 1; ++ if (recovery_mode) ++ brq->data.blocks = queue_physical_block_size(mq->queue) >> 9; + + /* + * Some controllers have HW issues while operating +@@ -1533,7 +1533,7 @@ static int mmc_blk_cqe_issue_rw_rq(struct mmc_queue *mq, struct request *req) + + static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq, + struct mmc_card *card, +- int disable_multi, ++ int recovery_mode, + struct mmc_queue *mq) + { + u32 readcmd, writecmd; +@@ -1542,7 +1542,7 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq, + struct mmc_blk_data *md = mq->blkdata; + bool do_rel_wr, do_data_tag; + +- mmc_blk_data_prep(mq, mqrq, disable_multi, &do_rel_wr, &do_data_tag); ++ mmc_blk_data_prep(mq, mqrq, recovery_mode, &do_rel_wr, &do_data_tag); + + brq->mrq.cmd = &brq->cmd; + +@@ -1633,7 +1633,7 @@ static int mmc_blk_fix_state(struct mmc_card *card, struct request *req) + + #define MMC_READ_SINGLE_RETRIES 2 + +-/* Single sector read during recovery */ ++/* Single (native) sector read during recovery */ + static void mmc_blk_read_single(struct mmc_queue *mq, struct request *req) + { + struct mmc_queue_req *mqrq = req_to_mmc_queue_req(req); +@@ -1641,6 +1641,7 @@ static void mmc_blk_read_single(struct mmc_queue *mq, struct request *req) + struct mmc_card *card = mq->card; + struct mmc_host *host = card->host; + blk_status_t error = BLK_STS_OK; ++ size_t bytes_per_read = queue_physical_block_size(mq->queue); + + do { + u32 status; +@@ -1675,13 +1676,13 @@ static void mmc_blk_read_single(struct mmc_queue *mq, struct request *req) + else + error = BLK_STS_OK; + +- } while (blk_update_request(req, error, 512)); ++ } while (blk_update_request(req, error, bytes_per_read)); + + return; + + error_exit: + mrq->data->bytes_xfered = 0; +- blk_update_request(req, BLK_STS_IOERR, 512); ++ blk_update_request(req, BLK_STS_IOERR, bytes_per_read); + /* Let it try the remaining request again */ + if (mqrq->retries > MMC_MAX_RETRIES - 1) + mqrq->retries = MMC_MAX_RETRIES - 1; +@@ -1822,10 +1823,9 @@ static void mmc_blk_mq_rw_recovery(struct mmc_queue *mq, struct request *req) + return; + } + +- /* FIXME: Missing single sector read for large sector size */ +- if (!mmc_large_sector(card) && rq_data_dir(req) == READ && +- brq->data.blocks > 1) { +- /* Read one sector at a time */ ++ if (rq_data_dir(req) == READ && brq->data.blocks > ++ queue_physical_block_size(mq->queue) >> 9) { ++ /* Read one (native) sector at a time */ + mmc_blk_read_single(mq, req); + return; + } +-- +2.35.1 + diff --git a/queue-5.10/mmc-cavium-octeon-add-of_node_put-when-breaking-out-.patch b/queue-5.10/mmc-cavium-octeon-add-of_node_put-when-breaking-out-.patch new file mode 100644 index 00000000000..dc827af2353 --- /dev/null +++ b/queue-5.10/mmc-cavium-octeon-add-of_node_put-when-breaking-out-.patch @@ -0,0 +1,38 @@ +From 1e29cbad12151564736939972238fece1d7226b3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 17:52:15 +0800 +Subject: mmc: cavium-octeon: Add of_node_put() when breaking out of loop + +From: Liang He + +[ Upstream commit 19bbb49acf8d7a03cb83e05624363741a4c3ec6f ] + +In octeon_mmc_probe(), we should call of_node_put() when breaking +out of for_each_child_of_node() which has increased and decreased +the refcount during each iteration. + +Fixes: 01d95843335c ("mmc: cavium: Add MMC support for Octeon SOCs.") +Signed-off-by: Liang He +Acked-by: Robert Richter +Link: https://lore.kernel.org/r/20220719095216.1241601-1-windhl@126.com +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/cavium-octeon.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/mmc/host/cavium-octeon.c b/drivers/mmc/host/cavium-octeon.c +index 2c4b2df52adb..12dca91a8ef6 100644 +--- a/drivers/mmc/host/cavium-octeon.c ++++ b/drivers/mmc/host/cavium-octeon.c +@@ -277,6 +277,7 @@ static int octeon_mmc_probe(struct platform_device *pdev) + if (ret) { + dev_err(&pdev->dev, "Error populating slots\n"); + octeon_mmc_set_shared_power(host, 0); ++ of_node_put(cn); + goto error; + } + i++; +-- +2.35.1 + diff --git a/queue-5.10/mmc-cavium-thunderx-add-of_node_put-when-breaking-ou.patch b/queue-5.10/mmc-cavium-thunderx-add-of_node_put-when-breaking-ou.patch new file mode 100644 index 00000000000..d520137d367 --- /dev/null +++ b/queue-5.10/mmc-cavium-thunderx-add-of_node_put-when-breaking-ou.patch @@ -0,0 +1,42 @@ +From 4aa84ce94dac93fcf83af1134cdf3b9398d6d497 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 17:52:16 +0800 +Subject: mmc: cavium-thunderx: Add of_node_put() when breaking out of loop + +From: Liang He + +[ Upstream commit 7ee480795e41db314f2c445c65ed854a5d6e8e32 ] + +In thunder_mmc_probe(), we should call of_node_put() when breaking +out of for_each_child_of_node() which has increased and decreased +the refcount during each iteration. + +Fixes: 166bac38c3c5 ("mmc: cavium: Add MMC PCI driver for ThunderX SOCs") +Signed-off-by: Liang He +Acked-by: Robert Richter +Link: https://lore.kernel.org/r/20220719095216.1241601-2-windhl@126.com +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/cavium-thunderx.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/mmc/host/cavium-thunderx.c b/drivers/mmc/host/cavium-thunderx.c +index 76013bbbcff3..202b1d6da678 100644 +--- a/drivers/mmc/host/cavium-thunderx.c ++++ b/drivers/mmc/host/cavium-thunderx.c +@@ -142,8 +142,10 @@ static int thunder_mmc_probe(struct pci_dev *pdev, + continue; + + ret = cvm_mmc_of_slot_probe(&host->slot_pdev[i]->dev, host); +- if (ret) ++ if (ret) { ++ of_node_put(child_node); + goto error; ++ } + } + i++; + } +-- +2.35.1 + diff --git a/queue-5.10/mmc-sdhci-of-at91-fix-set_uhs_signaling-rewriting-of.patch b/queue-5.10/mmc-sdhci-of-at91-fix-set_uhs_signaling-rewriting-of.patch new file mode 100644 index 00000000000..817ece19aee --- /dev/null +++ b/queue-5.10/mmc-sdhci-of-at91-fix-set_uhs_signaling-rewriting-of.patch @@ -0,0 +1,48 @@ +From 87d34c5f4927d873a7c779a48c9b91664adc8162 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 30 Jun 2022 12:09:26 +0300 +Subject: mmc: sdhci-of-at91: fix set_uhs_signaling rewriting of MC1R + +From: Eugen Hristev + +[ Upstream commit 5987e6ded29d52e42fc7b06aa575c60a25eee38e ] + +In set_uhs_signaling, the DDR bit is being set by fully writing the MC1R +register. +This can lead to accidental erase of certain bits in this register. +Avoid this by doing a read-modify-write operation. + +Fixes: d0918764c17b ("mmc: sdhci-of-at91: fix MMC_DDR_52 timing selection") +Signed-off-by: Eugen Hristev +Tested-by: Karl Olsen +Acked-by: Adrian Hunter +Link: https://lore.kernel.org/r/20220630090926.15061-1-eugen.hristev@microchip.com +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/sdhci-of-at91.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/drivers/mmc/host/sdhci-of-at91.c b/drivers/mmc/host/sdhci-of-at91.c +index d1a1c548c515..0452c312b65e 100644 +--- a/drivers/mmc/host/sdhci-of-at91.c ++++ b/drivers/mmc/host/sdhci-of-at91.c +@@ -100,8 +100,13 @@ static void sdhci_at91_set_clock(struct sdhci_host *host, unsigned int clock) + static void sdhci_at91_set_uhs_signaling(struct sdhci_host *host, + unsigned int timing) + { +- if (timing == MMC_TIMING_MMC_DDR52) +- sdhci_writeb(host, SDMMC_MC1R_DDR, SDMMC_MC1R); ++ u8 mc1r; ++ ++ if (timing == MMC_TIMING_MMC_DDR52) { ++ mc1r = sdhci_readb(host, SDMMC_MC1R); ++ mc1r |= SDMMC_MC1R_DDR; ++ sdhci_writeb(host, mc1r, SDMMC_MC1R); ++ } + sdhci_set_uhs_signaling(host, timing); + } + +-- +2.35.1 + diff --git a/queue-5.10/mmc-sdhci-of-esdhc-fix-refcount-leak-in-esdhc_signal.patch b/queue-5.10/mmc-sdhci-of-esdhc-fix-refcount-leak-in-esdhc_signal.patch new file mode 100644 index 00000000000..ba15434f1ad --- /dev/null +++ b/queue-5.10/mmc-sdhci-of-esdhc-fix-refcount-leak-in-esdhc_signal.patch @@ -0,0 +1,38 @@ +From a2215ed4773861bd9c59a068b45079ae51bd5449 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 23 May 2022 18:42:54 +0400 +Subject: mmc: sdhci-of-esdhc: Fix refcount leak in esdhc_signal_voltage_switch + +From: Miaoqian Lin + +[ Upstream commit b5899a3e2f783a27b268e38d37f9b24c71bddf45 ] + +of_find_matching_node() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak. +of_node_put() checks null pointer. + +Fixes: ea35645a3c66 ("mmc: sdhci-of-esdhc: add support for signal voltage switch") +Signed-off-by: Miaoqian Lin +Link: https://lore.kernel.org/r/20220523144255.10310-1-linmq006@gmail.com +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/sdhci-of-esdhc.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c +index 343648fcbc31..d53374991e13 100644 +--- a/drivers/mmc/host/sdhci-of-esdhc.c ++++ b/drivers/mmc/host/sdhci-of-esdhc.c +@@ -904,6 +904,7 @@ static int esdhc_signal_voltage_switch(struct mmc_host *mmc, + scfg_node = of_find_matching_node(NULL, scfg_device_ids); + if (scfg_node) + scfg_base = of_iomap(scfg_node, 0); ++ of_node_put(scfg_node); + if (scfg_base) { + sdhciovselcr = SDHCIOVSELCR_TGLEN | + SDHCIOVSELCR_VSELVAL; +-- +2.35.1 + diff --git a/queue-5.10/mt76-mt76x02u-fix-possible-memory-leak-in-__mt76x02u.patch b/queue-5.10/mt76-mt76x02u-fix-possible-memory-leak-in-__mt76x02u.patch new file mode 100644 index 00000000000..5bb9f071366 --- /dev/null +++ b/queue-5.10/mt76-mt76x02u-fix-possible-memory-leak-in-__mt76x02u.patch @@ -0,0 +1,37 @@ +From d7e824f51dfb70430ea44e4af08516c22a53b37f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 17 May 2022 18:37:07 +0200 +Subject: mt76: mt76x02u: fix possible memory leak in __mt76x02u_mcu_send_msg + +From: Lorenzo Bianconi + +[ Upstream commit cffd93411575afd987788e2ec3cb8eaff70f0215 ] + +Free the skb if mt76u_bulk_msg fails in __mt76x02u_mcu_send_msg routine. + +Fixes: 4c89ff2c74e39 ("mt76: split __mt76u_mcu_send_msg and mt76u_mcu_send_msg routines") +Co-developed-by: Gergo Koteles +Signed-off-by: Gergo Koteles +Signed-off-by: Lorenzo Bianconi +Signed-off-by: Felix Fietkau +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c +index e43d13d7c988..2dad61fd451f 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c ++++ b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c +@@ -108,7 +108,7 @@ __mt76x02u_mcu_send_msg(struct mt76_dev *dev, struct sk_buff *skb, + ret = mt76u_bulk_msg(dev, skb->data, skb->len, NULL, 500, + MT_EP_OUT_INBAND_CMD); + if (ret) +- return ret; ++ goto out; + + if (wait_resp) + ret = mt76x02u_mcu_wait_resp(dev, seq); +-- +2.35.1 + diff --git a/queue-5.10/mtd-maps-fix-refcount-leak-in-ap_flash_init.patch b/queue-5.10/mtd-maps-fix-refcount-leak-in-ap_flash_init.patch new file mode 100644 index 00000000000..91a64be8388 --- /dev/null +++ b/queue-5.10/mtd-maps-fix-refcount-leak-in-ap_flash_init.patch @@ -0,0 +1,38 @@ +From e3c8d4de24a2946f8b80bb7c7aa1cf022f0137fa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 23 May 2022 18:32:55 +0400 +Subject: mtd: maps: Fix refcount leak in ap_flash_init + +From: Miaoqian Lin + +[ Upstream commit 77087a04c8fd554134bddcb8a9ff87b21f357926 ] + +of_find_matching_node() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak. + +Fixes: b0afd44bc192 ("mtd: physmap_of: add a hook for Versatile write protection") +Signed-off-by: Miaoqian Lin +Reviewed-by: Linus Walleij +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220523143255.4376-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/maps/physmap-versatile.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/mtd/maps/physmap-versatile.c b/drivers/mtd/maps/physmap-versatile.c +index 297a50957356..a1b8b7b25f88 100644 +--- a/drivers/mtd/maps/physmap-versatile.c ++++ b/drivers/mtd/maps/physmap-versatile.c +@@ -93,6 +93,7 @@ static int ap_flash_init(struct platform_device *pdev) + return -ENODEV; + } + ebi_base = of_iomap(ebi, 0); ++ of_node_put(ebi); + if (!ebi_base) + return -ENODEV; + +-- +2.35.1 + diff --git a/queue-5.10/mtd-maps-fix-refcount-leak-in-of_flash_probe_versati.patch b/queue-5.10/mtd-maps-fix-refcount-leak-in-of_flash_probe_versati.patch new file mode 100644 index 00000000000..5e564f75db8 --- /dev/null +++ b/queue-5.10/mtd-maps-fix-refcount-leak-in-of_flash_probe_versati.patch @@ -0,0 +1,38 @@ +From c7ac7196af7b8d5f349eb29b7fee7d806acfbb86 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 23 May 2022 18:02:05 +0400 +Subject: mtd: maps: Fix refcount leak in of_flash_probe_versatile + +From: Miaoqian Lin + +[ Upstream commit 33ec82a6d2b119938f26e5c8040ed5d92378eb54 ] + +of_find_matching_node_and_match() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak. + +Fixes: b0afd44bc192 ("mtd: physmap_of: add a hook for Versatile write protection") +Signed-off-by: Miaoqian Lin +Reviewed-by: Linus Walleij +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220523140205.48625-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/maps/physmap-versatile.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/mtd/maps/physmap-versatile.c b/drivers/mtd/maps/physmap-versatile.c +index ad7cd9cfaee0..297a50957356 100644 +--- a/drivers/mtd/maps/physmap-versatile.c ++++ b/drivers/mtd/maps/physmap-versatile.c +@@ -207,6 +207,7 @@ int of_flash_probe_versatile(struct platform_device *pdev, + + versatile_flashprot = (enum versatile_flashprot)devid->data; + rmap = syscon_node_to_regmap(sysnp); ++ of_node_put(sysnp); + if (IS_ERR(rmap)) + return PTR_ERR(rmap); + +-- +2.35.1 + diff --git a/queue-5.10/mtd-partitions-fix-refcount-leak-in-parse_redboot_of.patch b/queue-5.10/mtd-partitions-fix-refcount-leak-in-parse_redboot_of.patch new file mode 100644 index 00000000000..58eb12f36b3 --- /dev/null +++ b/queue-5.10/mtd-partitions-fix-refcount-leak-in-parse_redboot_of.patch @@ -0,0 +1,38 @@ +From 7a88ea4cae1d33d8e32670b0822337b8618fbf4e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 May 2022 15:06:49 +0400 +Subject: mtd: partitions: Fix refcount leak in parse_redboot_of + +From: Miaoqian Lin + +[ Upstream commit 9f7e62815cf3cbbcb1b8cb21649fb4dfdb3aa016 ] + +of_get_child_by_name() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak. + +Fixes: 237960880960 ("mtd: partitions: redboot: seek fis-index-block in the right node") +Signed-off-by: Miaoqian Lin +Reviewed-by: Linus Walleij +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220526110652.64849-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/parsers/redboot.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/mtd/parsers/redboot.c b/drivers/mtd/parsers/redboot.c +index 3ccd6363ee8c..4f3bcc59a638 100644 +--- a/drivers/mtd/parsers/redboot.c ++++ b/drivers/mtd/parsers/redboot.c +@@ -58,6 +58,7 @@ static void parse_redboot_of(struct mtd_info *master) + return; + + ret = of_property_read_u32(npart, "fis-index-block", &dirblock); ++ of_node_put(npart); + if (ret) + return; + +-- +2.35.1 + diff --git a/queue-5.10/mtd-rawnand-meson-fix-a-potential-double-free-issue.patch b/queue-5.10/mtd-rawnand-meson-fix-a-potential-double-free-issue.patch new file mode 100644 index 00000000000..fe461808dae --- /dev/null +++ b/queue-5.10/mtd-rawnand-meson-fix-a-potential-double-free-issue.patch @@ -0,0 +1,46 @@ +From 1da3ae5db1bae74515b4b779537a53e09cf19f9c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 May 2022 18:41:40 +0200 +Subject: mtd: rawnand: meson: Fix a potential double free issue + +From: Christophe JAILLET + +[ Upstream commit ec0da06337751b18f6dee06b6526e0f0d6e80369 ] + +When meson_nfc_nand_chip_cleanup() is called, it will call: + meson_nfc_free_buffer(&meson_chip->nand); + nand_cleanup(&meson_chip->nand); + +nand_cleanup() in turn will call nand_detach() which calls the +.detach_chip() which is here meson_nand_detach_chip(). + +meson_nand_detach_chip() already calls meson_nfc_free_buffer(), so we +could double free some memory. + +Fix it by removing the unneeded explicit call to meson_nfc_free_buffer(). + +Fixes: 8fae856c5350 ("mtd: rawnand: meson: add support for Amlogic NAND flash controller") +Signed-off-by: Christophe JAILLET +Acked-by: Liang Yang +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/ec15c358b8063f7c50ff4cd628cf0d2e14e43f49.1653064877.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/meson_nand.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/mtd/nand/raw/meson_nand.c b/drivers/mtd/nand/raw/meson_nand.c +index 817bddccb775..327a2257ec26 100644 +--- a/drivers/mtd/nand/raw/meson_nand.c ++++ b/drivers/mtd/nand/raw/meson_nand.c +@@ -1307,7 +1307,6 @@ static int meson_nfc_nand_chip_cleanup(struct meson_nfc *nfc) + if (ret) + return ret; + +- meson_nfc_free_buffer(&meson_chip->nand); + nand_cleanup(&meson_chip->nand); + list_del(&meson_chip->node); + } +-- +2.35.1 + diff --git a/queue-5.10/mtd-sm_ftl-fix-deadlock-caused-by-cancel_work_sync-i.patch b/queue-5.10/mtd-sm_ftl-fix-deadlock-caused-by-cancel_work_sync-i.patch new file mode 100644 index 00000000000..78c8a3affd9 --- /dev/null +++ b/queue-5.10/mtd-sm_ftl-fix-deadlock-caused-by-cancel_work_sync-i.patch @@ -0,0 +1,53 @@ +From 0041c8fed25da58382d8add642a06e13f6afa2a4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 May 2022 12:48:41 +0800 +Subject: mtd: sm_ftl: Fix deadlock caused by cancel_work_sync in sm_release + +From: Duoming Zhou + +[ Upstream commit a61528d997619a518ee8c51cf0ef0513021afaff ] + +There is a deadlock between sm_release and sm_cache_flush_work +which is a work item. The cancel_work_sync in sm_release will +not return until sm_cache_flush_work is finished. If we hold +mutex_lock and use cancel_work_sync to wait the work item to +finish, the work item also requires mutex_lock. As a result, +the sm_release will be blocked forever. The race condition is +shown below: + + (Thread 1) | (Thread 2) +sm_release | + mutex_lock(&ftl->mutex) | sm_cache_flush_work + | mutex_lock(&ftl->mutex) + cancel_work_sync | ... + +This patch moves del_timer_sync and cancel_work_sync out of +mutex_lock in order to mitigate deadlock. + +Fixes: 7d17c02a01a1 ("mtd: Add new SmartMedia/xD FTL") +Signed-off-by: Duoming Zhou +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220524044841.10517-1-duoming@zju.edu.cn +Signed-off-by: Sasha Levin +--- + drivers/mtd/sm_ftl.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/sm_ftl.c b/drivers/mtd/sm_ftl.c +index b9f272408c4d..2fedae67c07c 100644 +--- a/drivers/mtd/sm_ftl.c ++++ b/drivers/mtd/sm_ftl.c +@@ -1098,9 +1098,9 @@ static void sm_release(struct mtd_blktrans_dev *dev) + { + struct sm_ftl *ftl = dev->priv; + +- mutex_lock(&ftl->mutex); + del_timer_sync(&ftl->timer); + cancel_work_sync(&ftl->flush_work); ++ mutex_lock(&ftl->mutex); + sm_cache_flush(ftl); + mutex_unlock(&ftl->mutex); + } +-- +2.35.1 + diff --git a/queue-5.10/mtd-st_spi_fsm-add-a-clk_disable_unprepare-in-.probe.patch b/queue-5.10/mtd-st_spi_fsm-add-a-clk_disable_unprepare-in-.probe.patch new file mode 100644 index 00000000000..27fa1e3566d --- /dev/null +++ b/queue-5.10/mtd-st_spi_fsm-add-a-clk_disable_unprepare-in-.probe.patch @@ -0,0 +1,49 @@ +From 44cd60cb833ba8297c0540c20f1c06782086b8c9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 Jun 2022 17:24:55 +0200 +Subject: mtd: st_spi_fsm: Add a clk_disable_unprepare() in .probe()'s error + path +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit 28607b426c3d050714f250d0faeb99d2e9106e90 ] + +For all but one error path clk_disable_unprepare() is already there. Add +it to the one location where it's missing. + +Fixes: 481815a6193b ("mtd: st_spi_fsm: Handle clk_prepare_enable/clk_disable_unprepare.") +Fixes: 69d5af8d016c ("mtd: st_spi_fsm: Obtain and use EMI clock") +Signed-off-by: Uwe Kleine-König +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220607152458.232847-2-u.kleine-koenig@pengutronix.de +Signed-off-by: Sasha Levin +--- + drivers/mtd/devices/st_spi_fsm.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/mtd/devices/st_spi_fsm.c b/drivers/mtd/devices/st_spi_fsm.c +index 1888523d9745..9bee99f07af0 100644 +--- a/drivers/mtd/devices/st_spi_fsm.c ++++ b/drivers/mtd/devices/st_spi_fsm.c +@@ -2115,10 +2115,12 @@ static int stfsm_probe(struct platform_device *pdev) + (long long)fsm->mtd.size, (long long)(fsm->mtd.size >> 20), + fsm->mtd.erasesize, (fsm->mtd.erasesize >> 10)); + +- return mtd_device_register(&fsm->mtd, NULL, 0); +- ++ ret = mtd_device_register(&fsm->mtd, NULL, 0); ++ if (ret) { + err_clk_unprepare: +- clk_disable_unprepare(fsm->clk); ++ clk_disable_unprepare(fsm->clk); ++ } ++ + return ret; + } + +-- +2.35.1 + diff --git a/queue-5.10/mwifiex-fix-sleep-in-atomic-context-bugs-caused-by-d.patch b/queue-5.10/mwifiex-fix-sleep-in-atomic-context-bugs-caused-by-d.patch new file mode 100644 index 00000000000..abf2ed88d4c --- /dev/null +++ b/queue-5.10/mwifiex-fix-sleep-in-atomic-context-bugs-caused-by-d.patch @@ -0,0 +1,173 @@ +From fff8df333536cf7064455ae09696af82a1c54ec8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 Jun 2022 11:26:26 +0800 +Subject: mwifiex: fix sleep in atomic context bugs caused by dev_coredumpv + +From: Duoming Zhou + +[ Upstream commit a52ed4866d2b90dd5e4ae9dabd453f3ed8fa3cbc ] + +There are sleep in atomic context bugs when uploading device dump +data in mwifiex. The root cause is that dev_coredumpv could not +be used in atomic contexts, because it calls dev_set_name which +include operations that may sleep. The call tree shows execution +paths that could lead to bugs: + + (Interrupt context) +fw_dump_timer_fn + mwifiex_upload_device_dump + dev_coredumpv(..., GFP_KERNEL) + dev_coredumpm() + kzalloc(sizeof(*devcd), gfp); //may sleep + dev_set_name + kobject_set_name_vargs + kvasprintf_const(GFP_KERNEL, ...); //may sleep + kstrdup(s, GFP_KERNEL); //may sleep + +The corresponding fail log is shown below: + +[ 135.275938] usb 1-1: == mwifiex dump information to /sys/class/devcoredump start +[ 135.281029] BUG: sleeping function called from invalid context at include/linux/sched/mm.h:265 +... +[ 135.293613] Call Trace: +[ 135.293613] +[ 135.293613] dump_stack_lvl+0x57/0x7d +[ 135.293613] __might_resched.cold+0x138/0x173 +[ 135.293613] ? dev_coredumpm+0xca/0x2e0 +[ 135.293613] kmem_cache_alloc_trace+0x189/0x1f0 +[ 135.293613] ? devcd_match_failing+0x30/0x30 +[ 135.293613] dev_coredumpm+0xca/0x2e0 +[ 135.293613] ? devcd_freev+0x10/0x10 +[ 135.293613] dev_coredumpv+0x1c/0x20 +[ 135.293613] ? devcd_match_failing+0x30/0x30 +[ 135.293613] mwifiex_upload_device_dump+0x65/0xb0 +[ 135.293613] ? mwifiex_dnld_fw+0x1b0/0x1b0 +[ 135.293613] call_timer_fn+0x122/0x3d0 +[ 135.293613] ? msleep_interruptible+0xb0/0xb0 +[ 135.293613] ? lock_downgrade+0x3c0/0x3c0 +[ 135.293613] ? __next_timer_interrupt+0x13c/0x160 +[ 135.293613] ? lockdep_hardirqs_on_prepare+0xe/0x220 +[ 135.293613] ? mwifiex_dnld_fw+0x1b0/0x1b0 +[ 135.293613] __run_timers.part.0+0x3f8/0x540 +[ 135.293613] ? call_timer_fn+0x3d0/0x3d0 +[ 135.293613] ? arch_restore_msi_irqs+0x10/0x10 +[ 135.293613] ? lapic_next_event+0x31/0x40 +[ 135.293613] run_timer_softirq+0x4f/0xb0 +[ 135.293613] __do_softirq+0x1c2/0x651 +... +[ 135.293613] RIP: 0010:default_idle+0xb/0x10 +[ 135.293613] RSP: 0018:ffff888006317e68 EFLAGS: 00000246 +[ 135.293613] RAX: ffffffff82ad8d10 RBX: ffff888006301cc0 RCX: ffffffff82ac90e1 +[ 135.293613] RDX: ffffed100d9ff1b4 RSI: ffffffff831ad140 RDI: ffffffff82ad8f20 +[ 135.293613] RBP: 0000000000000003 R08: 0000000000000000 R09: ffff88806cff8d9b +[ 135.293613] R10: ffffed100d9ff1b3 R11: 0000000000000001 R12: ffffffff84593410 +[ 135.293613] R13: 0000000000000000 R14: 0000000000000000 R15: 1ffff11000c62fd2 +... +[ 135.389205] usb 1-1: == mwifiex dump information to /sys/class/devcoredump end + +This patch uses delayed work to replace timer and moves the operations +that may sleep into a delayed work in order to mitigate bugs, it was +tested on Marvell 88W8801 chip whose port is usb and the firmware is +usb8801_uapsta.bin. The following is the result after using delayed +work to replace timer. + +[ 134.936453] usb 1-1: == mwifiex dump information to /sys/class/devcoredump start +[ 135.043344] usb 1-1: == mwifiex dump information to /sys/class/devcoredump end + +As we can see, there is no bug now. + +Fixes: f5ecd02a8b20 ("mwifiex: device dump support for usb interface") +Reviewed-by: Brian Norris +Signed-off-by: Duoming Zhou +Link: https://lore.kernel.org/r/b63b77fc84ed3e8a6bef02378e17c7c71a0bc3be.1654569290.git.duoming@zju.edu.cn +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/marvell/mwifiex/init.c | 9 +++++---- + drivers/net/wireless/marvell/mwifiex/main.h | 3 ++- + drivers/net/wireless/marvell/mwifiex/sta_event.c | 6 +++--- + 3 files changed, 10 insertions(+), 8 deletions(-) + +diff --git a/drivers/net/wireless/marvell/mwifiex/init.c b/drivers/net/wireless/marvell/mwifiex/init.c +index f006a3d72b40..e5bb240eb3ed 100644 +--- a/drivers/net/wireless/marvell/mwifiex/init.c ++++ b/drivers/net/wireless/marvell/mwifiex/init.c +@@ -63,9 +63,10 @@ static void wakeup_timer_fn(struct timer_list *t) + adapter->if_ops.card_reset(adapter); + } + +-static void fw_dump_timer_fn(struct timer_list *t) ++static void fw_dump_work(struct work_struct *work) + { +- struct mwifiex_adapter *adapter = from_timer(adapter, t, devdump_timer); ++ struct mwifiex_adapter *adapter = ++ container_of(work, struct mwifiex_adapter, devdump_work.work); + + mwifiex_upload_device_dump(adapter); + } +@@ -321,7 +322,7 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter) + adapter->active_scan_triggered = false; + timer_setup(&adapter->wakeup_timer, wakeup_timer_fn, 0); + adapter->devdump_len = 0; +- timer_setup(&adapter->devdump_timer, fw_dump_timer_fn, 0); ++ INIT_DELAYED_WORK(&adapter->devdump_work, fw_dump_work); + } + + /* +@@ -400,7 +401,7 @@ static void + mwifiex_adapter_cleanup(struct mwifiex_adapter *adapter) + { + del_timer(&adapter->wakeup_timer); +- del_timer_sync(&adapter->devdump_timer); ++ cancel_delayed_work_sync(&adapter->devdump_work); + mwifiex_cancel_all_pending_cmd(adapter); + wake_up_interruptible(&adapter->cmd_wait_q.wait); + wake_up_interruptible(&adapter->hs_activate_wait_q); +diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h +index f4e3dce10d65..3357cb7a5230 100644 +--- a/drivers/net/wireless/marvell/mwifiex/main.h ++++ b/drivers/net/wireless/marvell/mwifiex/main.h +@@ -49,6 +49,7 @@ + #include + #include + #include ++#include + + #include "decl.h" + #include "ioctl.h" +@@ -1053,7 +1054,7 @@ struct mwifiex_adapter { + /* Device dump data/length */ + void *devdump_data; + int devdump_len; +- struct timer_list devdump_timer; ++ struct delayed_work devdump_work; + + bool ignore_btcoex_events; + }; +diff --git a/drivers/net/wireless/marvell/mwifiex/sta_event.c b/drivers/net/wireless/marvell/mwifiex/sta_event.c +index 05073a49ab5f..069d47b59f9f 100644 +--- a/drivers/net/wireless/marvell/mwifiex/sta_event.c ++++ b/drivers/net/wireless/marvell/mwifiex/sta_event.c +@@ -622,8 +622,8 @@ mwifiex_fw_dump_info_event(struct mwifiex_private *priv, + * transmission event get lost, in this cornel case, + * user would still get partial of the dump. + */ +- mod_timer(&adapter->devdump_timer, +- jiffies + msecs_to_jiffies(MWIFIEX_TIMER_10S)); ++ schedule_delayed_work(&adapter->devdump_work, ++ msecs_to_jiffies(MWIFIEX_TIMER_10S)); + } + + /* Overflow check */ +@@ -642,7 +642,7 @@ mwifiex_fw_dump_info_event(struct mwifiex_private *priv, + return; + + upload_dump: +- del_timer_sync(&adapter->devdump_timer); ++ cancel_delayed_work_sync(&adapter->devdump_work); + mwifiex_upload_device_dump(adapter); + } + +-- +2.35.1 + diff --git a/queue-5.10/mwifiex-ignore-btcoex-events-from-the-88w8897-firmwa.patch b/queue-5.10/mwifiex-ignore-btcoex-events-from-the-88w8897-firmwa.patch new file mode 100644 index 00000000000..e126a1fbc61 --- /dev/null +++ b/queue-5.10/mwifiex-ignore-btcoex-events-from-the-88w8897-firmwa.patch @@ -0,0 +1,81 @@ +From 4811c9bfbc02e1c12a5b6aa4b850b592951c105e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Nov 2021 21:58:27 +0100 +Subject: mwifiex: Ignore BTCOEX events from the 88W8897 firmware +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Jonas Dreßler + +[ Upstream commit 84d94e16efa268e4f2887d858cd67ee37b870f25 ] + +The firmware of the 88W8897 PCIe+USB card sends those events very +unreliably, sometimes bluetooth together with 2.4ghz-wifi is used and no +COEX event comes in, and sometimes bluetooth is disabled but the +coexistance mode doesn't get disabled. + +This means we sometimes end up capping the rx/tx window size while +bluetooth is not enabled anymore, artifically limiting wifi speeds even +though bluetooth is not being used. + +Since we can't fix the firmware, let's just ignore those events on the +88W8897 device. From some Wireshark capture sessions it seems that the +Windows driver also doesn't change the rx/tx window sizes when bluetooth +gets enabled or disabled, so this is fairly consistent with the Windows +driver. + +Signed-off-by: Jonas Dreßler +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20211103205827.14559-1-verdre@v0yd.nl +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/marvell/mwifiex/main.h | 2 ++ + drivers/net/wireless/marvell/mwifiex/pcie.c | 3 +++ + drivers/net/wireless/marvell/mwifiex/sta_event.c | 3 +++ + 3 files changed, 8 insertions(+) + +diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h +index 5923c5c14c8d..f4e3dce10d65 100644 +--- a/drivers/net/wireless/marvell/mwifiex/main.h ++++ b/drivers/net/wireless/marvell/mwifiex/main.h +@@ -1054,6 +1054,8 @@ struct mwifiex_adapter { + void *devdump_data; + int devdump_len; + struct timer_list devdump_timer; ++ ++ bool ignore_btcoex_events; + }; + + void mwifiex_process_tx_queue(struct mwifiex_adapter *adapter); +diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c +index 7c137eba8cda..b0024893a1cb 100644 +--- a/drivers/net/wireless/marvell/mwifiex/pcie.c ++++ b/drivers/net/wireless/marvell/mwifiex/pcie.c +@@ -3142,6 +3142,9 @@ static int mwifiex_init_pcie(struct mwifiex_adapter *adapter) + if (ret) + goto err_alloc_buffers; + ++ if (pdev->device == PCIE_DEVICE_ID_MARVELL_88W8897) ++ adapter->ignore_btcoex_events = true; ++ + return 0; + + err_alloc_buffers: +diff --git a/drivers/net/wireless/marvell/mwifiex/sta_event.c b/drivers/net/wireless/marvell/mwifiex/sta_event.c +index 753458628f86..05073a49ab5f 100644 +--- a/drivers/net/wireless/marvell/mwifiex/sta_event.c ++++ b/drivers/net/wireless/marvell/mwifiex/sta_event.c +@@ -1061,6 +1061,9 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) + break; + case EVENT_BT_COEX_WLAN_PARA_CHANGE: + dev_dbg(adapter->dev, "EVENT: BT coex wlan param update\n"); ++ if (adapter->ignore_btcoex_events) ++ break; ++ + mwifiex_bt_coex_wlan_param_update_event(priv, + adapter->event_skb); + break; +-- +2.35.1 + diff --git a/queue-5.10/net-allow-unbound-socket-for-packets-in-vrf-when-tcp.patch b/queue-5.10/net-allow-unbound-socket-for-packets-in-vrf-when-tcp.patch new file mode 100644 index 00000000000..df3e3e404be --- /dev/null +++ b/queue-5.10/net-allow-unbound-socket-for-packets-in-vrf-when-tcp.patch @@ -0,0 +1,126 @@ +From ffadb36da19287790f6fd507e3b4a133be29386b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Jul 2022 19:14:42 +0100 +Subject: net: allow unbound socket for packets in VRF when tcp_l3mdev_accept + set + +From: Mike Manning + +[ Upstream commit 944fd1aeacb627fa617f85f8e5a34f7ae8ea4d8e ] + +The commit 3c82a21f4320 ("net: allow binding socket in a VRF when +there's an unbound socket") changed the inet socket lookup to avoid +packets in a VRF from matching an unbound socket. This is to ensure the +necessary isolation between the default and other VRFs for routing and +forwarding. VRF-unaware processes running in the default VRF cannot +access another VRF and have to be run with 'ip vrf exec '. This is +to be expected with tcp_l3mdev_accept disabled, but could be reallowed +when this sysctl option is enabled. So instead of directly checking dif +and sdif in inet[6]_match, here call inet_sk_bound_dev_eq(). This +allows a match on unbound socket for non-zero sdif i.e. for packets in +a VRF, if tcp_l3mdev_accept is enabled. + +Fixes: 3c82a21f4320 ("net: allow binding socket in a VRF when there's an unbound socket") +Signed-off-by: Mike Manning +Link: https://lore.kernel.org/netdev/a54c149aed38fded2d3b5fdb1a6c89e36a083b74.camel@lasnet.de/ +Reviewed-by: David Ahern +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + include/net/inet6_hashtables.h | 7 +++---- + include/net/inet_hashtables.h | 19 +++---------------- + include/net/inet_sock.h | 11 +++++++++++ + 3 files changed, 17 insertions(+), 20 deletions(-) + +diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h +index f259e1ae14ba..56f1286583d3 100644 +--- a/include/net/inet6_hashtables.h ++++ b/include/net/inet6_hashtables.h +@@ -110,8 +110,6 @@ static inline bool inet6_match(struct net *net, const struct sock *sk, + const __portpair ports, + const int dif, const int sdif) + { +- int bound_dev_if; +- + if (!net_eq(sock_net(sk), net) || + sk->sk_family != AF_INET6 || + sk->sk_portpair != ports || +@@ -119,8 +117,9 @@ static inline bool inet6_match(struct net *net, const struct sock *sk, + !ipv6_addr_equal(&sk->sk_v6_rcv_saddr, daddr)) + return false; + +- bound_dev_if = READ_ONCE(sk->sk_bound_dev_if); +- return bound_dev_if == dif || bound_dev_if == sdif; ++ /* READ_ONCE() paired with WRITE_ONCE() in sock_bindtoindex_locked() */ ++ return inet_sk_bound_dev_eq(net, READ_ONCE(sk->sk_bound_dev_if), dif, ++ sdif); + } + #endif /* IS_ENABLED(CONFIG_IPV6) */ + +diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h +index 1a3bf9726b75..c9e387d174c6 100644 +--- a/include/net/inet_hashtables.h ++++ b/include/net/inet_hashtables.h +@@ -197,17 +197,6 @@ static inline void inet_ehash_locks_free(struct inet_hashinfo *hashinfo) + hashinfo->ehash_locks = NULL; + } + +-static inline bool inet_sk_bound_dev_eq(struct net *net, int bound_dev_if, +- int dif, int sdif) +-{ +-#if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV) +- return inet_bound_dev_eq(!!READ_ONCE(net->ipv4.sysctl_tcp_l3mdev_accept), +- bound_dev_if, dif, sdif); +-#else +- return inet_bound_dev_eq(true, bound_dev_if, dif, sdif); +-#endif +-} +- + struct inet_bind_bucket * + inet_bind_bucket_create(struct kmem_cache *cachep, struct net *net, + struct inet_bind_hashbucket *head, +@@ -305,16 +294,14 @@ static inline bool INET_MATCH(struct net *net, const struct sock *sk, + const __addrpair cookie, const __portpair ports, + int dif, int sdif) + { +- int bound_dev_if; +- + if (!net_eq(sock_net(sk), net) || + sk->sk_portpair != ports || + sk->sk_addrpair != cookie) + return false; + +- /* Paired with WRITE_ONCE() from sock_bindtoindex_locked() */ +- bound_dev_if = READ_ONCE(sk->sk_bound_dev_if); +- return bound_dev_if == dif || bound_dev_if == sdif; ++ /* READ_ONCE() paired with WRITE_ONCE() in sock_bindtoindex_locked() */ ++ return inet_sk_bound_dev_eq(net, READ_ONCE(sk->sk_bound_dev_if), dif, ++ sdif); + } + + /* Sockets in TCP_CLOSE state are _always_ taken out of the hash, so we need +diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h +index 4908513c6dfb..f0faf9d0e7fb 100644 +--- a/include/net/inet_sock.h ++++ b/include/net/inet_sock.h +@@ -149,6 +149,17 @@ static inline bool inet_bound_dev_eq(bool l3mdev_accept, int bound_dev_if, + return bound_dev_if == dif || bound_dev_if == sdif; + } + ++static inline bool inet_sk_bound_dev_eq(struct net *net, int bound_dev_if, ++ int dif, int sdif) ++{ ++#if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV) ++ return inet_bound_dev_eq(!!READ_ONCE(net->ipv4.sysctl_tcp_l3mdev_accept), ++ bound_dev_if, dif, sdif); ++#else ++ return inet_bound_dev_eq(true, bound_dev_if, dif, sdif); ++#endif ++} ++ + struct inet_cork { + unsigned int flags; + __be32 addr; +-- +2.35.1 + diff --git a/queue-5.10/net-fix-sk_wmem_schedule-and-sk_rmem_schedule-errors.patch b/queue-5.10/net-fix-sk_wmem_schedule-and-sk_rmem_schedule-errors.patch new file mode 100644 index 00000000000..ee6c3c90e3b --- /dev/null +++ b/queue-5.10/net-fix-sk_wmem_schedule-and-sk_rmem_schedule-errors.patch @@ -0,0 +1,58 @@ +From 65104b29a6e4b11c827436aaeaa6d7777d0530c0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Jun 2022 23:34:10 -0700 +Subject: net: fix sk_wmem_schedule() and sk_rmem_schedule() errors + +From: Eric Dumazet + +[ Upstream commit 7c80b038d23e1f4c7fcc311f43f83b8c60e7fb80 ] + +If sk->sk_forward_alloc is 150000, and we need to schedule 150001 bytes, +we want to allocate 1 byte more (rounded up to one page), +instead of 150001 :/ + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Signed-off-by: Eric Dumazet +Reviewed-by: Shakeel Butt +Acked-by: Soheil Hassas Yeganeh +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + include/net/sock.h | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/include/net/sock.h b/include/net/sock.h +index 83854cec4a47..c72b0fc4c752 100644 +--- a/include/net/sock.h ++++ b/include/net/sock.h +@@ -1468,19 +1468,23 @@ static inline bool sk_has_account(struct sock *sk) + + static inline bool sk_wmem_schedule(struct sock *sk, int size) + { ++ int delta; ++ + if (!sk_has_account(sk)) + return true; +- return size <= sk->sk_forward_alloc || +- __sk_mem_schedule(sk, size, SK_MEM_SEND); ++ delta = size - sk->sk_forward_alloc; ++ return delta <= 0 || __sk_mem_schedule(sk, delta, SK_MEM_SEND); + } + + static inline bool + sk_rmem_schedule(struct sock *sk, struct sk_buff *skb, int size) + { ++ int delta; ++ + if (!sk_has_account(sk)) + return true; +- return size <= sk->sk_forward_alloc || +- __sk_mem_schedule(sk, size, SK_MEM_RECV) || ++ delta = size - sk->sk_forward_alloc; ++ return delta <= 0 || __sk_mem_schedule(sk, delta, SK_MEM_RECV) || + skb_pfmemalloc(skb); + } + +-- +2.35.1 + diff --git a/queue-5.10/net-hinic-avoid-kernel-hung-in-hinic_get_stats64.patch b/queue-5.10/net-hinic-avoid-kernel-hung-in-hinic_get_stats64.patch new file mode 100644 index 00000000000..18ceae2706c --- /dev/null +++ b/queue-5.10/net-hinic-avoid-kernel-hung-in-hinic_get_stats64.patch @@ -0,0 +1,98 @@ +From b8c829f26ad91387c7d5bb2f90593731240eab25 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jul 2022 19:22:23 +0800 +Subject: net: hinic: avoid kernel hung in hinic_get_stats64() + +From: Qiao Ma + +[ Upstream commit 98f9fcdee35add80505b6c73f72de5f750d5c03c ] + +When using hinic device as a bond slave device, and reading device stats +of master bond device, the kernel may hung. + +The kernel panic calltrace as follows: +Kernel panic - not syncing: softlockup: hung tasks +Call trace: + native_queued_spin_lock_slowpath+0x1ec/0x31c + dev_get_stats+0x60/0xcc + dev_seq_printf_stats+0x40/0x120 + dev_seq_show+0x1c/0x40 + seq_read_iter+0x3c8/0x4dc + seq_read+0xe0/0x130 + proc_reg_read+0xa8/0xe0 + vfs_read+0xb0/0x1d4 + ksys_read+0x70/0xfc + __arm64_sys_read+0x20/0x30 + el0_svc_common+0x88/0x234 + do_el0_svc+0x2c/0x90 + el0_svc+0x1c/0x30 + el0_sync_handler+0xa8/0xb0 + el0_sync+0x148/0x180 + +And the calltrace of task that actually caused kernel hungs as follows: + __switch_to+124 + __schedule+548 + schedule+72 + schedule_timeout+348 + __down_common+188 + __down+24 + down+104 + hinic_get_stats64+44 [hinic] + dev_get_stats+92 + bond_get_stats+172 [bonding] + dev_get_stats+92 + dev_seq_printf_stats+60 + dev_seq_show+24 + seq_read_iter+964 + seq_read+220 + proc_reg_read+164 + vfs_read+172 + ksys_read+108 + __arm64_sys_read+28 + el0_svc_common+132 + do_el0_svc+40 + el0_svc+24 + el0_sync_handler+164 + el0_sync+324 + +When getting device stats from bond, kernel will call bond_get_stats(). +It first holds the spinlock bond->stats_lock, and then call +hinic_get_stats64() to collect hinic device's stats. +However, hinic_get_stats64() calls `down(&nic_dev->mgmt_lock)` to +protect its critical section, which may schedule current task out. +And if system is under high pressure, the task cannot be woken up +immediately, which eventually triggers kernel hung panic. + +Since previous patch has replaced hinic_dev.tx_stats/rx_stats with local +variable in hinic_get_stats64(), there is nothing need to be protected +by lock, so just removing down()/up() is ok. + +Fixes: edd384f682cc ("net-next/hinic: Add ethtool and stats") +Signed-off-by: Qiao Ma +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/huawei/hinic/hinic_main.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_main.c b/drivers/net/ethernet/huawei/hinic/hinic_main.c +index 5edc96b7cc8a..4f1d585485d7 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_main.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_main.c +@@ -849,13 +849,9 @@ static void hinic_get_stats64(struct net_device *netdev, + struct hinic_rxq_stats nic_rx_stats = {}; + struct hinic_txq_stats nic_tx_stats = {}; + +- down(&nic_dev->mgmt_lock); +- + if (nic_dev->flags & HINIC_INTF_UP) + gather_nic_stats(nic_dev, &nic_rx_stats, &nic_tx_stats); + +- up(&nic_dev->mgmt_lock); +- + stats->rx_bytes = nic_rx_stats.bytes; + stats->rx_packets = nic_rx_stats.pkts; + stats->rx_errors = nic_rx_stats.errors; +-- +2.35.1 + diff --git a/queue-5.10/net-hinic-fix-bug-that-ethtool-get-wrong-stats.patch b/queue-5.10/net-hinic-fix-bug-that-ethtool-get-wrong-stats.patch new file mode 100644 index 00000000000..41a9a2114d4 --- /dev/null +++ b/queue-5.10/net-hinic-fix-bug-that-ethtool-get-wrong-stats.patch @@ -0,0 +1,271 @@ +From 76fee08f857f10c4b49589ea07a13f4f3b6b7bb2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jul 2022 19:22:22 +0800 +Subject: net: hinic: fix bug that ethtool get wrong stats + +From: Qiao Ma + +[ Upstream commit 67dffd3db98570af8ff54c934f7d14664c0d182a ] + +Function hinic_get_stats64() will do two operations: +1. reads stats from every hinic_rxq/txq and accumulates them +2. calls hinic_rxq/txq_clean_stats() to clean every rxq/txq's stats + +For hinic_get_stats64(), it could get right data, because it sums all +data to nic_dev->rx_stats/tx_stats. +But it is wrong for get_drv_queue_stats(), this function will read +hinic_rxq's stats, which have been cleared to zero by hinic_get_stats64(). + +I have observed hinic's cleanup operation by using such command: +> watch -n 1 "cat ethtool -S eth4 | tail -40" + +Result before: + ... + rxq7_pkts: 1 + rxq7_bytes: 90 + rxq7_errors: 0 + rxq7_csum_errors: 0 + rxq7_other_errors: 0 + ... + rxq9_pkts: 11 + rxq9_bytes: 726 + rxq9_errors: 0 + rxq9_csum_errors: 0 + rxq9_other_errors: 0 + ... + rxq11_pkts: 0 + rxq11_bytes: 0 + rxq11_errors: 0 + rxq11_csum_errors: 0 + rxq11_other_errors: 0 + +Result after a few seconds: + ... + rxq7_pkts: 0 + rxq7_bytes: 0 + rxq7_errors: 0 + rxq7_csum_errors: 0 + rxq7_other_errors: 0 + ... + rxq9_pkts: 2 + rxq9_bytes: 132 + rxq9_errors: 0 + rxq9_csum_errors: 0 + rxq9_other_errors: 0 + ... + rxq11_pkts: 1 + rxq11_bytes: 170 + rxq11_errors: 0 + rxq11_csum_errors: 0 + rxq11_other_errors: 0 + +To solve this problem, we just keep every queue's total stats in their own +queue (aka hinic_{rxq|txq}), and simply sum all per-queue stats every time +calling hinic_get_stats64(). +With that solution, there is no need to clean per-queue stats now, +and there is no need to maintain global hinic_dev.{tx|rx}_stats, too. + +Fixes: edd384f682cc ("net-next/hinic: Add ethtool and stats") +Signed-off-by: Qiao Ma +Reported-by: kernel test robot +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/huawei/hinic/hinic_dev.h | 3 - + .../net/ethernet/huawei/hinic/hinic_main.c | 57 ++++++------------- + drivers/net/ethernet/huawei/hinic/hinic_rx.c | 2 - + drivers/net/ethernet/huawei/hinic/hinic_tx.c | 2 - + 4 files changed, 16 insertions(+), 48 deletions(-) + +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_dev.h b/drivers/net/ethernet/huawei/hinic/hinic_dev.h +index fb3e89141a0d..a4fbf44f944c 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_dev.h ++++ b/drivers/net/ethernet/huawei/hinic/hinic_dev.h +@@ -95,9 +95,6 @@ struct hinic_dev { + u16 sq_depth; + u16 rq_depth; + +- struct hinic_txq_stats tx_stats; +- struct hinic_rxq_stats rx_stats; +- + u8 rss_tmpl_idx; + u8 rss_hash_engine; + u16 num_rss; +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_main.c b/drivers/net/ethernet/huawei/hinic/hinic_main.c +index 2376edf6c263..5edc96b7cc8a 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_main.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_main.c +@@ -80,56 +80,44 @@ static int set_features(struct hinic_dev *nic_dev, + netdev_features_t pre_features, + netdev_features_t features, bool force_change); + +-static void update_rx_stats(struct hinic_dev *nic_dev, struct hinic_rxq *rxq) ++static void gather_rx_stats(struct hinic_rxq_stats *nic_rx_stats, struct hinic_rxq *rxq) + { +- struct hinic_rxq_stats *nic_rx_stats = &nic_dev->rx_stats; + struct hinic_rxq_stats rx_stats; + +- u64_stats_init(&rx_stats.syncp); +- + hinic_rxq_get_stats(rxq, &rx_stats); + +- u64_stats_update_begin(&nic_rx_stats->syncp); + nic_rx_stats->bytes += rx_stats.bytes; + nic_rx_stats->pkts += rx_stats.pkts; + nic_rx_stats->errors += rx_stats.errors; + nic_rx_stats->csum_errors += rx_stats.csum_errors; + nic_rx_stats->other_errors += rx_stats.other_errors; +- u64_stats_update_end(&nic_rx_stats->syncp); +- +- hinic_rxq_clean_stats(rxq); + } + +-static void update_tx_stats(struct hinic_dev *nic_dev, struct hinic_txq *txq) ++static void gather_tx_stats(struct hinic_txq_stats *nic_tx_stats, struct hinic_txq *txq) + { +- struct hinic_txq_stats *nic_tx_stats = &nic_dev->tx_stats; + struct hinic_txq_stats tx_stats; + +- u64_stats_init(&tx_stats.syncp); +- + hinic_txq_get_stats(txq, &tx_stats); + +- u64_stats_update_begin(&nic_tx_stats->syncp); + nic_tx_stats->bytes += tx_stats.bytes; + nic_tx_stats->pkts += tx_stats.pkts; + nic_tx_stats->tx_busy += tx_stats.tx_busy; + nic_tx_stats->tx_wake += tx_stats.tx_wake; + nic_tx_stats->tx_dropped += tx_stats.tx_dropped; + nic_tx_stats->big_frags_pkts += tx_stats.big_frags_pkts; +- u64_stats_update_end(&nic_tx_stats->syncp); +- +- hinic_txq_clean_stats(txq); + } + +-static void update_nic_stats(struct hinic_dev *nic_dev) ++static void gather_nic_stats(struct hinic_dev *nic_dev, ++ struct hinic_rxq_stats *nic_rx_stats, ++ struct hinic_txq_stats *nic_tx_stats) + { + int i, num_qps = hinic_hwdev_num_qps(nic_dev->hwdev); + + for (i = 0; i < num_qps; i++) +- update_rx_stats(nic_dev, &nic_dev->rxqs[i]); ++ gather_rx_stats(nic_rx_stats, &nic_dev->rxqs[i]); + + for (i = 0; i < num_qps; i++) +- update_tx_stats(nic_dev, &nic_dev->txqs[i]); ++ gather_tx_stats(nic_tx_stats, &nic_dev->txqs[i]); + } + + /** +@@ -565,8 +553,6 @@ int hinic_close(struct net_device *netdev) + netif_carrier_off(netdev); + netif_tx_disable(netdev); + +- update_nic_stats(nic_dev); +- + up(&nic_dev->mgmt_lock); + + if (!HINIC_IS_VF(nic_dev->hwdev->hwif)) +@@ -860,26 +846,23 @@ static void hinic_get_stats64(struct net_device *netdev, + struct rtnl_link_stats64 *stats) + { + struct hinic_dev *nic_dev = netdev_priv(netdev); +- struct hinic_rxq_stats *nic_rx_stats; +- struct hinic_txq_stats *nic_tx_stats; +- +- nic_rx_stats = &nic_dev->rx_stats; +- nic_tx_stats = &nic_dev->tx_stats; ++ struct hinic_rxq_stats nic_rx_stats = {}; ++ struct hinic_txq_stats nic_tx_stats = {}; + + down(&nic_dev->mgmt_lock); + + if (nic_dev->flags & HINIC_INTF_UP) +- update_nic_stats(nic_dev); ++ gather_nic_stats(nic_dev, &nic_rx_stats, &nic_tx_stats); + + up(&nic_dev->mgmt_lock); + +- stats->rx_bytes = nic_rx_stats->bytes; +- stats->rx_packets = nic_rx_stats->pkts; +- stats->rx_errors = nic_rx_stats->errors; ++ stats->rx_bytes = nic_rx_stats.bytes; ++ stats->rx_packets = nic_rx_stats.pkts; ++ stats->rx_errors = nic_rx_stats.errors; + +- stats->tx_bytes = nic_tx_stats->bytes; +- stats->tx_packets = nic_tx_stats->pkts; +- stats->tx_errors = nic_tx_stats->tx_dropped; ++ stats->tx_bytes = nic_tx_stats.bytes; ++ stats->tx_packets = nic_tx_stats.pkts; ++ stats->tx_errors = nic_tx_stats.tx_dropped; + } + + static int hinic_set_features(struct net_device *netdev, +@@ -1178,8 +1161,6 @@ static void hinic_free_intr_coalesce(struct hinic_dev *nic_dev) + static int nic_dev_init(struct pci_dev *pdev) + { + struct hinic_rx_mode_work *rx_mode_work; +- struct hinic_txq_stats *tx_stats; +- struct hinic_rxq_stats *rx_stats; + struct hinic_dev *nic_dev; + struct net_device *netdev; + struct hinic_hwdev *hwdev; +@@ -1240,12 +1221,6 @@ static int nic_dev_init(struct pci_dev *pdev) + + sema_init(&nic_dev->mgmt_lock, 1); + +- tx_stats = &nic_dev->tx_stats; +- rx_stats = &nic_dev->rx_stats; +- +- u64_stats_init(&tx_stats->syncp); +- u64_stats_init(&rx_stats->syncp); +- + nic_dev->vlan_bitmap = devm_bitmap_zalloc(&pdev->dev, VLAN_N_VID, + GFP_KERNEL); + if (!nic_dev->vlan_bitmap) { +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_rx.c b/drivers/net/ethernet/huawei/hinic/hinic_rx.c +index 070a7cc6392e..04b19af63fd6 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_rx.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_rx.c +@@ -73,7 +73,6 @@ void hinic_rxq_get_stats(struct hinic_rxq *rxq, struct hinic_rxq_stats *stats) + struct hinic_rxq_stats *rxq_stats = &rxq->rxq_stats; + unsigned int start; + +- u64_stats_update_begin(&stats->syncp); + do { + start = u64_stats_fetch_begin(&rxq_stats->syncp); + stats->pkts = rxq_stats->pkts; +@@ -83,7 +82,6 @@ void hinic_rxq_get_stats(struct hinic_rxq *rxq, struct hinic_rxq_stats *stats) + stats->csum_errors = rxq_stats->csum_errors; + stats->other_errors = rxq_stats->other_errors; + } while (u64_stats_fetch_retry(&rxq_stats->syncp, start)); +- u64_stats_update_end(&stats->syncp); + } + + /** +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_tx.c b/drivers/net/ethernet/huawei/hinic/hinic_tx.c +index 3828b09bfea3..d13514a8160e 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_tx.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_tx.c +@@ -97,7 +97,6 @@ void hinic_txq_get_stats(struct hinic_txq *txq, struct hinic_txq_stats *stats) + struct hinic_txq_stats *txq_stats = &txq->txq_stats; + unsigned int start; + +- u64_stats_update_begin(&stats->syncp); + do { + start = u64_stats_fetch_begin(&txq_stats->syncp); + stats->pkts = txq_stats->pkts; +@@ -107,7 +106,6 @@ void hinic_txq_get_stats(struct hinic_txq *txq, struct hinic_txq_stats *stats) + stats->tx_dropped = txq_stats->tx_dropped; + stats->big_frags_pkts = txq_stats->big_frags_pkts; + } while (u64_stats_fetch_retry(&txq_stats->syncp, start)); +- u64_stats_update_end(&stats->syncp); + } + + /** +-- +2.35.1 + diff --git a/queue-5.10/net-ionic-fix-error-check-for-vlan-flags-in-ionic_se.patch b/queue-5.10/net-ionic-fix-error-check-for-vlan-flags-in-ionic_se.patch new file mode 100644 index 00000000000..ab025400e05 --- /dev/null +++ b/queue-5.10/net-ionic-fix-error-check-for-vlan-flags-in-ionic_se.patch @@ -0,0 +1,42 @@ +From 281a2891bcb10507cb34a1454bd6b4969d09cea8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Jul 2022 18:17:55 +0800 +Subject: net: ionic: fix error check for vlan flags in + ionic_set_nic_features() + +From: Jian Shen + +[ Upstream commit a86e86db5e6d72c82724a63ca1c5293409a21518 ] + +The prototype of input features of ionic_set_nic_features() is +netdev_features_t, but the vlan_flags is using the private +definition of ionic drivers. It should use the variable +ctx.cmd.lif_setattr.features, rather than features to check +the vlan flags. So fixes it. + +Fixes: beead698b173 ("ionic: Add the basic NDO callbacks for netdev support") +Signed-off-by: Jian Shen +Signed-off-by: Guangbin Huang +Acked-by: Shannon Nelson +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/pensando/ionic/ionic_lif.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +index e95c09dc2c30..e42520f909fe 100644 +--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c ++++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +@@ -1286,7 +1286,7 @@ static int ionic_set_nic_features(struct ionic_lif *lif, + if ((old_hw_features ^ lif->hw_features) & IONIC_ETH_HW_RX_HASH) + ionic_lif_rss_config(lif, lif->rss_types, NULL, NULL); + +- if ((vlan_flags & features) && ++ if ((vlan_flags & le64_to_cpu(ctx.cmd.lif_setattr.features)) && + !(vlan_flags & le64_to_cpu(ctx.comp.lif_setattr.features))) + dev_info_once(lif->ionic->dev, "NIC is not supporting vlan offload, likely in SmartNIC mode\n"); + +-- +2.35.1 + diff --git a/queue-5.10/net-mlx5e-fix-the-value-of-mlx5e_max_rq_num_mtts.patch b/queue-5.10/net-mlx5e-fix-the-value-of-mlx5e_max_rq_num_mtts.patch new file mode 100644 index 00000000000..0ec06a5f0f0 --- /dev/null +++ b/queue-5.10/net-mlx5e-fix-the-value-of-mlx5e_max_rq_num_mtts.patch @@ -0,0 +1,40 @@ +From 8b2428b2e607bbba9276d81a35c6d5ecc0193a11 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 May 2022 16:48:47 +0300 +Subject: net/mlx5e: Fix the value of MLX5E_MAX_RQ_NUM_MTTS + +From: Maxim Mikityanskiy + +[ Upstream commit 562696c3c62c7c23dd896e9447252ce9268cb812 ] + +MLX5E_MAX_RQ_NUM_MTTS should be the maximum value, so that +MLX5_MTT_OCTW(MLX5E_MAX_RQ_NUM_MTTS) fits into u16. The current value of +1 << 17 results in MLX5_MTT_OCTW(1 << 17) = 1 << 16, which doesn't fit +into u16. This commit replaces it with the maximum value that still +fits u16. + +Fixes: 73281b78a37a ("net/mlx5e: Derive Striding RQ size from MTU") +Signed-off-by: Maxim Mikityanskiy +Reviewed-by: Tariq Toukan +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/mellanox/mlx5/core/en.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h +index 73060b30fece..b0229ceae234 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h +@@ -101,7 +101,7 @@ struct page_pool; + #define MLX5E_REQUIRED_WQE_MTTS (MLX5_ALIGN_MTTS(MLX5_MPWRQ_PAGES_PER_WQE + 1)) + #define MLX5E_REQUIRED_MTTS(wqes) (wqes * MLX5E_REQUIRED_WQE_MTTS) + #define MLX5E_MAX_RQ_NUM_MTTS \ +- ((1 << 16) * 2) /* So that MLX5_MTT_OCTW(num_mtts) fits into u16 */ ++ (ALIGN_DOWN(U16_MAX, 4) * 2) /* So that MLX5_MTT_OCTW(num_mtts) fits into u16 */ + #define MLX5E_ORDER2_MAX_PACKET_MTU (order_base_2(10 * 1024)) + #define MLX5E_PARAMS_MAXIMUM_LOG_RQ_SIZE_MPW \ + (ilog2(MLX5E_MAX_RQ_NUM_MTTS / MLX5E_REQUIRED_WQE_MTTS)) +-- +2.35.1 + diff --git a/queue-5.10/net-mlx5e-remove-warn_on-when-trying-to-offload-an-u.patch b/queue-5.10/net-mlx5e-remove-warn_on-when-trying-to-offload-an-u.patch new file mode 100644 index 00000000000..0ef928c55a9 --- /dev/null +++ b/queue-5.10/net-mlx5e-remove-warn_on-when-trying-to-offload-an-u.patch @@ -0,0 +1,43 @@ +From dec938d85998aeffb1c6423c5f240a090651d969 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jul 2022 13:57:03 +0300 +Subject: net/mlx5e: Remove WARN_ON when trying to offload an unsupported TLS + cipher/version + +From: Gal Pressman + +[ Upstream commit 115d9f95ea7ab780ef315dc356bebba2e07cb731 ] + +The driver reports whether TX/RX TLS device offloads are supported, but +not which ciphers/versions, these should be handled by returning +-EOPNOTSUPP when .tls_dev_add() is called. + +Remove the WARN_ON kernel trace when the driver gets a request to +offload a cipher/version that is not supported as it is expected. + +Fixes: d2ead1f360e8 ("net/mlx5e: Add kTLS TX HW offload support") +Signed-off-by: Gal Pressman +Reviewed-by: Tariq Toukan +Reviewed-by: Maxim Mikityanskiy +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c +index 1b392696280d..f824d781b99e 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c +@@ -15,7 +15,7 @@ static int mlx5e_ktls_add(struct net_device *netdev, struct sock *sk, + struct mlx5_core_dev *mdev = priv->mdev; + int err; + +- if (WARN_ON(!mlx5e_ktls_type_check(mdev, crypto_info))) ++ if (!mlx5e_ktls_type_check(mdev, crypto_info)) + return -EOPNOTSUPP; + + if (direction == TLS_OFFLOAD_CTX_DIR_TX) +-- +2.35.1 + diff --git a/queue-5.10/net-rose-fix-netdev-reference-changes.patch b/queue-5.10/net-rose-fix-netdev-reference-changes.patch new file mode 100644 index 00000000000..0379185ff54 --- /dev/null +++ b/queue-5.10/net-rose-fix-netdev-reference-changes.patch @@ -0,0 +1,110 @@ +From d947d27d5f30ac03e945ce557a621493a5f03187 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Jul 2022 09:12:32 +0000 +Subject: net: rose: fix netdev reference changes + +From: Eric Dumazet + +[ Upstream commit 931027820e4dafabc78aff82af59f8c1c4bd3128 ] + +Bernard reported that trying to unload rose module would lead +to infamous messages: + +unregistered_netdevice: waiting for rose0 to become free. Usage count = xx + +This patch solves the issue, by making sure each socket referring to +a netdevice holds a reference count on it, and properly releases it +in rose_release(). + +rose_dev_first() is also fixed to take a device reference +before leaving the rcu_read_locked section. + +Following patch will add ref_tracker annotations to ease +future bug hunting. + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Reported-by: Bernard Pidoux +Signed-off-by: Eric Dumazet +Tested-by: Bernard Pidoux +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/rose/af_rose.c | 11 +++++++++-- + net/rose/rose_route.c | 2 ++ + 2 files changed, 11 insertions(+), 2 deletions(-) + +diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c +index cf7d974e0f61..29a208ed8fb8 100644 +--- a/net/rose/af_rose.c ++++ b/net/rose/af_rose.c +@@ -191,6 +191,7 @@ static void rose_kill_by_device(struct net_device *dev) + rose_disconnect(s, ENETUNREACH, ROSE_OUT_OF_ORDER, 0); + if (rose->neighbour) + rose->neighbour->use--; ++ dev_put(rose->device); + rose->device = NULL; + } + } +@@ -591,6 +592,8 @@ static struct sock *rose_make_new(struct sock *osk) + rose->idle = orose->idle; + rose->defer = orose->defer; + rose->device = orose->device; ++ if (rose->device) ++ dev_hold(rose->device); + rose->qbitincl = orose->qbitincl; + + return sk; +@@ -644,6 +647,7 @@ static int rose_release(struct socket *sock) + break; + } + ++ dev_put(rose->device); + sock->sk = NULL; + release_sock(sk); + sock_put(sk); +@@ -720,7 +724,6 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le + struct rose_sock *rose = rose_sk(sk); + struct sockaddr_rose *addr = (struct sockaddr_rose *)uaddr; + unsigned char cause, diagnostic; +- struct net_device *dev; + ax25_uid_assoc *user; + int n, err = 0; + +@@ -777,9 +780,12 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le + } + + if (sock_flag(sk, SOCK_ZAPPED)) { /* Must bind first - autobinding in this may or may not work */ ++ struct net_device *dev; ++ + sock_reset_flag(sk, SOCK_ZAPPED); + +- if ((dev = rose_dev_first()) == NULL) { ++ dev = rose_dev_first(); ++ if (!dev) { + err = -ENETUNREACH; + goto out_release; + } +@@ -787,6 +793,7 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le + user = ax25_findbyuid(current_euid()); + if (!user) { + err = -EINVAL; ++ dev_put(dev); + goto out_release; + } + +diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c +index 95b198f84a3a..981bdefd478b 100644 +--- a/net/rose/rose_route.c ++++ b/net/rose/rose_route.c +@@ -613,6 +613,8 @@ struct net_device *rose_dev_first(void) + if (first == NULL || strncmp(dev->name, first->name, 3) < 0) + first = dev; + } ++ if (first) ++ dev_hold(first); + rcu_read_unlock(); + + return first; +-- +2.35.1 + diff --git a/queue-5.10/netdevsim-avoid-allocation-warnings-triggered-from-u.patch b/queue-5.10/netdevsim-avoid-allocation-warnings-triggered-from-u.patch new file mode 100644 index 00000000000..a6740139e59 --- /dev/null +++ b/queue-5.10/netdevsim-avoid-allocation-warnings-triggered-from-u.patch @@ -0,0 +1,54 @@ +From 551f8ff2f6d70e75f3d911c516e50bdba5fb377f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Jul 2022 14:36:05 -0700 +Subject: netdevsim: Avoid allocation warnings triggered from user space + +From: Jakub Kicinski + +[ Upstream commit d0b80a9edb1a029ff913e81b47540e57ad034329 ] + +We need to suppress warnings from sily map sizes. Also switch +from GFP_USER to GFP_KERNEL_ACCOUNT, I'm pretty sure I misunderstood +the flags when writing this code. + +Fixes: 395cacb5f1a0 ("netdevsim: bpf: support fake map offload") +Reported-by: syzbot+ad24705d3fd6463b18c6@syzkaller.appspotmail.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Andrii Nakryiko +Link: https://lore.kernel.org/bpf/20220726213605.154204-1-kuba@kernel.org +Signed-off-by: Sasha Levin +--- + drivers/net/netdevsim/bpf.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/netdevsim/bpf.c b/drivers/net/netdevsim/bpf.c +index a43820212932..50854265864d 100644 +--- a/drivers/net/netdevsim/bpf.c ++++ b/drivers/net/netdevsim/bpf.c +@@ -351,10 +351,12 @@ nsim_map_alloc_elem(struct bpf_offloaded_map *offmap, unsigned int idx) + { + struct nsim_bpf_bound_map *nmap = offmap->dev_priv; + +- nmap->entry[idx].key = kmalloc(offmap->map.key_size, GFP_USER); ++ nmap->entry[idx].key = kmalloc(offmap->map.key_size, ++ GFP_KERNEL_ACCOUNT | __GFP_NOWARN); + if (!nmap->entry[idx].key) + return -ENOMEM; +- nmap->entry[idx].value = kmalloc(offmap->map.value_size, GFP_USER); ++ nmap->entry[idx].value = kmalloc(offmap->map.value_size, ++ GFP_KERNEL_ACCOUNT | __GFP_NOWARN); + if (!nmap->entry[idx].value) { + kfree(nmap->entry[idx].key); + nmap->entry[idx].key = NULL; +@@ -496,7 +498,7 @@ nsim_bpf_map_alloc(struct netdevsim *ns, struct bpf_offloaded_map *offmap) + if (offmap->map.map_flags) + return -EINVAL; + +- nmap = kzalloc(sizeof(*nmap), GFP_USER); ++ nmap = kzalloc(sizeof(*nmap), GFP_KERNEL_ACCOUNT); + if (!nmap) + return -ENOMEM; + +-- +2.35.1 + diff --git a/queue-5.10/netfilter-nf_tables-add-rescheduling-points-during-l.patch b/queue-5.10/netfilter-nf_tables-add-rescheduling-points-during-l.patch new file mode 100644 index 00000000000..6eea258878b --- /dev/null +++ b/queue-5.10/netfilter-nf_tables-add-rescheduling-points-during-l.patch @@ -0,0 +1,53 @@ +From 4da556906e7409f356f4cf3c146829c771debbc8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Jul 2022 12:44:35 +0200 +Subject: netfilter: nf_tables: add rescheduling points during loop detection + walks + +From: Florian Westphal + +[ Upstream commit 81ea010667417ef3f218dfd99b69769fe66c2b67 ] + +Add explicit rescheduling points during ruleset walk. + +Switching to a faster algorithm is possible but this is a much +smaller change, suitable for nf tree. + +Link: https://bugzilla.netfilter.org/show_bug.cgi?id=1460 +Signed-off-by: Florian Westphal +Acked-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/nf_tables_api.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c +index 2ba48f4e2d7d..7d6325ba15db 100644 +--- a/net/netfilter/nf_tables_api.c ++++ b/net/netfilter/nf_tables_api.c +@@ -3128,6 +3128,8 @@ int nft_chain_validate(const struct nft_ctx *ctx, const struct nft_chain *chain) + if (err < 0) + return err; + } ++ ++ cond_resched(); + } + + return 0; +@@ -8427,9 +8429,13 @@ static int nf_tables_check_loops(const struct nft_ctx *ctx, + break; + } + } ++ ++ cond_resched(); + } + + list_for_each_entry(set, &ctx->table->sets, list) { ++ cond_resched(); ++ + if (!nft_is_active_next(ctx->net, set)) + continue; + if (!(set->flags & NFT_SET_MAP) || +-- +2.35.1 + diff --git a/queue-5.10/netfilter-xtables-bring-spdx-identifier-back.patch b/queue-5.10/netfilter-xtables-bring-spdx-identifier-back.patch new file mode 100644 index 00000000000..516ffca28cc --- /dev/null +++ b/queue-5.10/netfilter-xtables-bring-spdx-identifier-back.patch @@ -0,0 +1,67 @@ +From 2e82caae6c273a7aaf6b517be2fc1ea1f83eccd2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Jun 2022 17:23:45 +0200 +Subject: netfilter: xtables: Bring SPDX identifier back + +From: Thomas Gleixner + +[ Upstream commit 20646f5b1e798bcc20044ae90ac3702f177bf254 ] + +Commit e2be04c7f995 ("License cleanup: add SPDX license identifier to +uapi header files with a license") added the correct SPDX identifier to +include/uapi/linux/netfilter/xt_IDLETIMER.h. + +A subsequent commit removed it for no reason and reintroduced the UAPI +license incorrectness as the file is now missing the UAPI exception +again. + +Add it back and remove the GPLv2 boilerplate while at it. + +Fixes: 68983a354a65 ("netfilter: xtables: Add snapshot of hardidletimer target") +Cc: Manoj Basapathi +Cc: Subash Abhinov Kasiviswanathan +Cc: Pablo Neira Ayuso +Cc: netfilter-devel@vger.kernel.org +Signed-off-by: Thomas Gleixner +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + include/uapi/linux/netfilter/xt_IDLETIMER.h | 17 +---------------- + 1 file changed, 1 insertion(+), 16 deletions(-) + +diff --git a/include/uapi/linux/netfilter/xt_IDLETIMER.h b/include/uapi/linux/netfilter/xt_IDLETIMER.h +index 49ddcdc61c09..7bfb31a66fc9 100644 +--- a/include/uapi/linux/netfilter/xt_IDLETIMER.h ++++ b/include/uapi/linux/netfilter/xt_IDLETIMER.h +@@ -1,6 +1,5 @@ ++/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ + /* +- * linux/include/linux/netfilter/xt_IDLETIMER.h +- * + * Header file for Xtables timer target module. + * + * Copyright (C) 2004, 2010 Nokia Corporation +@@ -10,20 +9,6 @@ + * by Luciano Coelho + * + * Contact: Luciano Coelho +- * +- * This program is free software; you can redistribute it and/or +- * modify it under the terms of the GNU General Public License +- * version 2 as published by the Free Software Foundation. +- * +- * This program is distributed in the hope that it will be useful, but +- * WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- * General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +- * 02110-1301 USA + */ + + #ifndef _XT_IDLETIMER_H +-- +2.35.1 + diff --git a/queue-5.10/nohz-full-sched-rt-fix-missed-tick-reenabling-bug-in.patch b/queue-5.10/nohz-full-sched-rt-fix-missed-tick-reenabling-bug-in.patch new file mode 100644 index 00000000000..46f3b968f92 --- /dev/null +++ b/queue-5.10/nohz-full-sched-rt-fix-missed-tick-reenabling-bug-in.patch @@ -0,0 +1,118 @@ +From c5be1b74884ddd1020f4cc0f793acd160466860a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 28 Jun 2022 11:22:59 +0200 +Subject: nohz/full, sched/rt: Fix missed tick-reenabling bug in + dequeue_task_rt() + +From: Nicolas Saenz Julienne + +[ Upstream commit 5c66d1b9b30f737fcef85a0b75bfe0590e16b62a ] + +dequeue_task_rt() only decrements 'rt_rq->rt_nr_running' after having +called sched_update_tick_dependency() preventing it from re-enabling the +tick on systems that no longer have pending SCHED_RT tasks but have +multiple runnable SCHED_OTHER tasks: + + dequeue_task_rt() + dequeue_rt_entity() + dequeue_rt_stack() + dequeue_top_rt_rq() + sub_nr_running() // decrements rq->nr_running + sched_update_tick_dependency() + sched_can_stop_tick() // checks rq->rt.rt_nr_running, + ... + __dequeue_rt_entity() + dec_rt_tasks() // decrements rq->rt.rt_nr_running + ... + +Every other scheduler class performs the operation in the opposite +order, and sched_update_tick_dependency() expects the values to be +updated as such. So avoid the misbehaviour by inverting the order in +which the above operations are performed in the RT scheduler. + +Fixes: 76d92ac305f2 ("sched: Migrate sched to use new tick dependency mask model") +Signed-off-by: Nicolas Saenz Julienne +Signed-off-by: Peter Zijlstra (Intel) +Reviewed-by: Valentin Schneider +Reviewed-by: Phil Auld +Link: https://lore.kernel.org/r/20220628092259.330171-1-nsaenzju@redhat.com +Signed-off-by: Sasha Levin +--- + kernel/sched/rt.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c +index 41b14d924203..e6f22836c600 100644 +--- a/kernel/sched/rt.c ++++ b/kernel/sched/rt.c +@@ -437,7 +437,7 @@ static inline void rt_queue_push_tasks(struct rq *rq) + #endif /* CONFIG_SMP */ + + static void enqueue_top_rt_rq(struct rt_rq *rt_rq); +-static void dequeue_top_rt_rq(struct rt_rq *rt_rq); ++static void dequeue_top_rt_rq(struct rt_rq *rt_rq, unsigned int count); + + static inline int on_rt_rq(struct sched_rt_entity *rt_se) + { +@@ -558,7 +558,7 @@ static void sched_rt_rq_dequeue(struct rt_rq *rt_rq) + rt_se = rt_rq->tg->rt_se[cpu]; + + if (!rt_se) { +- dequeue_top_rt_rq(rt_rq); ++ dequeue_top_rt_rq(rt_rq, rt_rq->rt_nr_running); + /* Kick cpufreq (see the comment in kernel/sched/sched.h). */ + cpufreq_update_util(rq_of_rt_rq(rt_rq), 0); + } +@@ -644,7 +644,7 @@ static inline void sched_rt_rq_enqueue(struct rt_rq *rt_rq) + + static inline void sched_rt_rq_dequeue(struct rt_rq *rt_rq) + { +- dequeue_top_rt_rq(rt_rq); ++ dequeue_top_rt_rq(rt_rq, rt_rq->rt_nr_running); + } + + static inline int rt_rq_throttled(struct rt_rq *rt_rq) +@@ -1043,7 +1043,7 @@ static void update_curr_rt(struct rq *rq) + } + + static void +-dequeue_top_rt_rq(struct rt_rq *rt_rq) ++dequeue_top_rt_rq(struct rt_rq *rt_rq, unsigned int count) + { + struct rq *rq = rq_of_rt_rq(rt_rq); + +@@ -1054,7 +1054,7 @@ dequeue_top_rt_rq(struct rt_rq *rt_rq) + + BUG_ON(!rq->nr_running); + +- sub_nr_running(rq, rt_rq->rt_nr_running); ++ sub_nr_running(rq, count); + rt_rq->rt_queued = 0; + + } +@@ -1333,18 +1333,21 @@ static void __dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flag + static void dequeue_rt_stack(struct sched_rt_entity *rt_se, unsigned int flags) + { + struct sched_rt_entity *back = NULL; ++ unsigned int rt_nr_running; + + for_each_sched_rt_entity(rt_se) { + rt_se->back = back; + back = rt_se; + } + +- dequeue_top_rt_rq(rt_rq_of_se(back)); ++ rt_nr_running = rt_rq_of_se(back)->rt_nr_running; + + for (rt_se = back; rt_se; rt_se = rt_se->back) { + if (on_rt_rq(rt_se)) + __dequeue_rt_entity(rt_se, flags); + } ++ ++ dequeue_top_rt_rq(rt_rq_of_se(back), rt_nr_running); + } + + static void enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) +-- +2.35.1 + diff --git a/queue-5.10/null_blk-fix-ida-error-handling-in-null_add_dev.patch b/queue-5.10/null_blk-fix-ida-error-handling-in-null_add_dev.patch new file mode 100644 index 00000000000..6ff12f709e9 --- /dev/null +++ b/queue-5.10/null_blk-fix-ida-error-handling-in-null_add_dev.patch @@ -0,0 +1,62 @@ +From a335af4672081d78bd46f6b4e1f9107b85c44b6c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jul 2022 11:12:14 +0300 +Subject: null_blk: fix ida error handling in null_add_dev() + +From: Dan Carpenter + +[ Upstream commit ee452a8d984f94fa8e894f003a52e776e4572881 ] + +There needs to be some error checking if ida_simple_get() fails. +Also call ida_free() if there are errors later. + +Fixes: 94bc02e30fb8 ("nullb: use ida to manage index") +Signed-off-by: Dan Carpenter +Link: https://lore.kernel.org/r/YtEhXsr6vJeoiYhd@kili +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + drivers/block/null_blk_main.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +diff --git a/drivers/block/null_blk_main.c b/drivers/block/null_blk_main.c +index bb3686c3869d..c6ba8f9f3f31 100644 +--- a/drivers/block/null_blk_main.c ++++ b/drivers/block/null_blk_main.c +@@ -1876,8 +1876,13 @@ static int null_add_dev(struct nullb_device *dev) + blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, nullb->q); + + mutex_lock(&lock); +- nullb->index = ida_simple_get(&nullb_indexes, 0, 0, GFP_KERNEL); +- dev->index = nullb->index; ++ rv = ida_simple_get(&nullb_indexes, 0, 0, GFP_KERNEL); ++ if (rv < 0) { ++ mutex_unlock(&lock); ++ goto out_cleanup_zone; ++ } ++ nullb->index = rv; ++ dev->index = rv; + mutex_unlock(&lock); + + blk_queue_logical_block_size(nullb->q, dev->blocksize); +@@ -1889,13 +1894,16 @@ static int null_add_dev(struct nullb_device *dev) + + rv = null_gendisk_register(nullb); + if (rv) +- goto out_cleanup_zone; ++ goto out_ida_free; + + mutex_lock(&lock); + list_add_tail(&nullb->list, &nullb_list); + mutex_unlock(&lock); + + return 0; ++ ++out_ida_free: ++ ida_free(&nullb_indexes, nullb->index); + out_cleanup_zone: + null_free_zoned_dev(dev); + out_cleanup_blk_queue: +-- +2.35.1 + diff --git a/queue-5.10/nvme-use-command_id-instead-of-req-tag-in-trace_nvme.patch b/queue-5.10/nvme-use-command_id-instead-of-req-tag-in-trace_nvme.patch new file mode 100644 index 00000000000..d1d2f566bb5 --- /dev/null +++ b/queue-5.10/nvme-use-command_id-instead-of-req-tag-in-trace_nvme.patch @@ -0,0 +1,40 @@ +From 6151791cc944217bcf1351878e29b0fe8c68e343 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jul 2022 23:27:21 +0200 +Subject: nvme: use command_id instead of req->tag in trace_nvme_complete_rq() + +From: Bean Huo + +[ Upstream commit 679c54f2de672b7d79d02f8c4ad483ff6dd8ce2e ] + +Use command_id instead of req->tag in trace_nvme_complete_rq(), +because of commit e7006de6c238 ("nvme: code command_id with a genctr +for use authentication after release"), cmd->common.command_id is set to +((genctl & 0xf)< 12 | req->tag), no longer req->tag, which makes cid in +trace_nvme_complete_rq and trace_nvme_setup_cmd are not the same. + +Fixes: e7006de6c238 ("nvme: code command_id with a genctr for use authentication after release") +Signed-off-by: Bean Huo +Signed-off-by: Christoph Hellwig +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + drivers/nvme/host/trace.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/nvme/host/trace.h b/drivers/nvme/host/trace.h +index 35bac7a25422..aa8b0f86b2be 100644 +--- a/drivers/nvme/host/trace.h ++++ b/drivers/nvme/host/trace.h +@@ -98,7 +98,7 @@ TRACE_EVENT(nvme_complete_rq, + TP_fast_assign( + __entry->ctrl_id = nvme_req(req)->ctrl->instance; + __entry->qid = nvme_req_qid(req); +- __entry->cid = req->tag; ++ __entry->cid = nvme_req(req)->cmd->common.command_id; + __entry->result = le64_to_cpu(nvme_req(req)->result.u64); + __entry->retries = nvme_req(req)->retries; + __entry->flags = nvme_req(req)->flags; +-- +2.35.1 + diff --git a/queue-5.10/opp-fix-error-check-in-dev_pm_opp_attach_genpd.patch b/queue-5.10/opp-fix-error-check-in-dev_pm_opp_attach_genpd.patch new file mode 100644 index 00000000000..13bd46206d6 --- /dev/null +++ b/queue-5.10/opp-fix-error-check-in-dev_pm_opp_attach_genpd.patch @@ -0,0 +1,39 @@ +From 849b97ad14c31a3b51e1f08014fba2e7f0f1a5e9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 May 2022 20:31:51 +0800 +Subject: opp: Fix error check in dev_pm_opp_attach_genpd() + +From: Tang Bin + +[ Upstream commit 4ea9496cbc959eb5c78f3e379199aca9ef4e386b ] + +dev_pm_domain_attach_by_name() may return NULL in some cases, +so IS_ERR() doesn't meet the requirements. Thus fix it. + +Fixes: 6319aee10e53 ("opp: Attach genpds to devices from within OPP core") +Signed-off-by: Tang Bin +[ Viresh: Replace ENODATA with ENODEV ] +Signed-off-by: Viresh Kumar +Signed-off-by: Sasha Levin +--- + drivers/opp/core.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/opp/core.c b/drivers/opp/core.c +index 903b465c8568..7ed605ffb717 100644 +--- a/drivers/opp/core.c ++++ b/drivers/opp/core.c +@@ -2052,8 +2052,8 @@ struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, + } + + virt_dev = dev_pm_domain_attach_by_name(dev, *name); +- if (IS_ERR(virt_dev)) { +- ret = PTR_ERR(virt_dev); ++ if (IS_ERR_OR_NULL(virt_dev)) { ++ ret = PTR_ERR(virt_dev) ? : -ENODEV; + dev_err(dev, "Couldn't attach to pm_domain: %d\n", ret); + goto err; + } +-- +2.35.1 + diff --git a/queue-5.10/pci-dwc-add-unroll-iatu-space-support-to-dw_pcie_dis.patch b/queue-5.10/pci-dwc-add-unroll-iatu-space-support-to-dw_pcie_dis.patch new file mode 100644 index 00000000000..fcbacf59c0f --- /dev/null +++ b/queue-5.10/pci-dwc-add-unroll-iatu-space-support-to-dw_pcie_dis.patch @@ -0,0 +1,71 @@ +From c259d8c4513bd4ee9fc1ae9aa2b742bd9f52148b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Jun 2022 17:34:12 +0300 +Subject: PCI: dwc: Add unroll iATU space support to dw_pcie_disable_atu() + +From: Serge Semin + +[ Upstream commit d1cf738f2b65a5640234e1da90a68d3523fbed83 ] + +dw_pcie_disable_atu() was introduced by f8aed6ec624f ("PCI: dwc: +designware: Add EP mode support") and supported only the viewport version +of the iATU CSRs. + +DW PCIe IP cores v4.80a and newer also support unrolled iATU/eDMA space. +Callers of dw_pcie_disable_atu(), including pci_epc_ops.clear_bar(), +pci_epc_ops.unmap_addr(), and dw_pcie_setup_rc(), don't work correctly when +it is enabled. + +Add dw_pcie_disable_atu() support for controllers with unrolled iATU CSRs +enabled. + +[bhelgaas: commit log] +Fixes: f8aed6ec624f ("PCI: dwc: designware: Add EP mode support") +Link: https://lore.kernel.org/r/20220624143428.8334-3-Sergey.Semin@baikalelectronics.ru +Tested-by: Manivannan Sadhasivam +Signed-off-by: Serge Semin +Signed-off-by: Bjorn Helgaas +Reviewed-by: Manivannan Sadhasivam +Reviewed-by: Rob Herring +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/dwc/pcie-designware.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +diff --git a/drivers/pci/controller/dwc/pcie-designware.c b/drivers/pci/controller/dwc/pcie-designware.c +index c2dea8fc97c8..69651c6ae6c6 100644 +--- a/drivers/pci/controller/dwc/pcie-designware.c ++++ b/drivers/pci/controller/dwc/pcie-designware.c +@@ -439,7 +439,7 @@ int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, u8 func_no, int index, + void dw_pcie_disable_atu(struct dw_pcie *pci, int index, + enum dw_pcie_region_type type) + { +- int region; ++ u32 region; + + switch (type) { + case DW_PCIE_REGION_INBOUND: +@@ -452,8 +452,18 @@ void dw_pcie_disable_atu(struct dw_pcie *pci, int index, + return; + } + +- dw_pcie_writel_dbi(pci, PCIE_ATU_VIEWPORT, region | index); +- dw_pcie_writel_dbi(pci, PCIE_ATU_CR2, ~(u32)PCIE_ATU_ENABLE); ++ if (pci->iatu_unroll_enabled) { ++ if (region == PCIE_ATU_REGION_INBOUND) { ++ dw_pcie_writel_ib_unroll(pci, index, PCIE_ATU_UNR_REGION_CTRL2, ++ ~(u32)PCIE_ATU_ENABLE); ++ } else { ++ dw_pcie_writel_ob_unroll(pci, index, PCIE_ATU_UNR_REGION_CTRL2, ++ ~(u32)PCIE_ATU_ENABLE); ++ } ++ } else { ++ dw_pcie_writel_dbi(pci, PCIE_ATU_VIEWPORT, region | index); ++ dw_pcie_writel_dbi(pci, PCIE_ATU_CR2, ~(u32)PCIE_ATU_ENABLE); ++ } + } + + int dw_pcie_wait_for_link(struct dw_pcie *pci) +-- +2.35.1 + diff --git a/queue-5.10/pci-dwc-always-enable-cdm-check-if-snps-enable-cdm-c.patch b/queue-5.10/pci-dwc-always-enable-cdm-check-if-snps-enable-cdm-c.patch new file mode 100644 index 00000000000..be5b314078c --- /dev/null +++ b/queue-5.10/pci-dwc-always-enable-cdm-check-if-snps-enable-cdm-c.patch @@ -0,0 +1,62 @@ +From fb6bceda1329d7ebb2286b2994f31934e759a7ec Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Jun 2022 17:34:16 +0300 +Subject: PCI: dwc: Always enable CDM check if "snps,enable-cdm-check" exists + +From: Serge Semin + +[ Upstream commit ec7b952f453ce7eabe7e1bea584626934d44f668 ] + +If the "snps,enable-cdm-check" property exists, we should enable the CDM +check. But previously dw_pcie_setup() could exit before doing so if the +"num-lanes" property was absent or invalid. + +Move the CDM enable earlier so we do it regardless of whether "num-lanes" +is present. + +[bhelgaas: commit log] +Fixes: 07f123def73e ("PCI: dwc: Add support to enable CDM register check") +Link: https://lore.kernel.org/r/20220624143428.8334-7-Sergey.Semin@baikalelectronics.ru +Signed-off-by: Serge Semin +Signed-off-by: Bjorn Helgaas +Reviewed-by: Vidya Sagar +Reviewed-by: Rob Herring +Reviewed-by: Manivannan Sadhasivam +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/dwc/pcie-designware.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/drivers/pci/controller/dwc/pcie-designware.c b/drivers/pci/controller/dwc/pcie-designware.c +index 69651c6ae6c6..2b74ff88c5c5 100644 +--- a/drivers/pci/controller/dwc/pcie-designware.c ++++ b/drivers/pci/controller/dwc/pcie-designware.c +@@ -598,6 +598,13 @@ void dw_pcie_setup(struct dw_pcie *pci) + val |= PORT_LINK_DLL_LINK_EN; + dw_pcie_writel_dbi(pci, PCIE_PORT_LINK_CONTROL, val); + ++ if (of_property_read_bool(np, "snps,enable-cdm-check")) { ++ val = dw_pcie_readl_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS); ++ val |= PCIE_PL_CHK_REG_CHK_REG_CONTINUOUS | ++ PCIE_PL_CHK_REG_CHK_REG_START; ++ dw_pcie_writel_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS, val); ++ } ++ + of_property_read_u32(np, "num-lanes", &pci->num_lanes); + if (!pci->num_lanes) { + dev_dbg(pci->dev, "Using h/w default number of lanes\n"); +@@ -644,11 +651,4 @@ void dw_pcie_setup(struct dw_pcie *pci) + break; + } + dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val); +- +- if (of_property_read_bool(np, "snps,enable-cdm-check")) { +- val = dw_pcie_readl_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS); +- val |= PCIE_PL_CHK_REG_CHK_REG_CONTINUOUS | +- PCIE_PL_CHK_REG_CHK_REG_START; +- dw_pcie_writel_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS, val); +- } + } +-- +2.35.1 + diff --git a/queue-5.10/pci-dwc-deallocate-epc-memory-on-dw_pcie_ep_init-err.patch b/queue-5.10/pci-dwc-deallocate-epc-memory-on-dw_pcie_ep_init-err.patch new file mode 100644 index 00000000000..5882e145b84 --- /dev/null +++ b/queue-5.10/pci-dwc-deallocate-epc-memory-on-dw_pcie_ep_init-err.patch @@ -0,0 +1,66 @@ +From b24fb9c9058c2f5cab7f7d5f7b83cd5090bc9e90 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Jun 2022 17:34:15 +0300 +Subject: PCI: dwc: Deallocate EPC memory on dw_pcie_ep_init() errors + +From: Serge Semin + +[ Upstream commit 8161e9626b50892eaedbd8070ecb1586ecedb109 ] + +If dw_pcie_ep_init() fails to perform any action after the EPC memory is +initialized and the MSI memory region is allocated, the latter parts won't +be undone thus causing a memory leak. Add a cleanup-on-error path to fix +these leaks. + +[bhelgaas: commit log] +Fixes: 2fd0c9d966cc ("PCI: designware-ep: Pre-allocate memory for MSI in dw_pcie_ep_init") +Link: https://lore.kernel.org/r/20220624143428.8334-6-Sergey.Semin@baikalelectronics.ru +Tested-by: Manivannan Sadhasivam +Signed-off-by: Serge Semin +Signed-off-by: Bjorn Helgaas +Reviewed-by: Rob Herring +Reviewed-by: Manivannan Sadhasivam +Signed-off-by: Sasha Levin +--- + .../pci/controller/dwc/pcie-designware-ep.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c +index ad7da4ea43a5..95ed719402d7 100644 +--- a/drivers/pci/controller/dwc/pcie-designware-ep.c ++++ b/drivers/pci/controller/dwc/pcie-designware-ep.c +@@ -773,8 +773,9 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep) + ep->msi_mem = pci_epc_mem_alloc_addr(epc, &ep->msi_mem_phys, + epc->mem->window.page_size); + if (!ep->msi_mem) { ++ ret = -ENOMEM; + dev_err(dev, "Failed to reserve memory for MSI/MSI-X\n"); +- return -ENOMEM; ++ goto err_exit_epc_mem; + } + + if (ep->ops->get_features) { +@@ -783,6 +784,19 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep) + return 0; + } + +- return dw_pcie_ep_init_complete(ep); ++ ret = dw_pcie_ep_init_complete(ep); ++ if (ret) ++ goto err_free_epc_mem; ++ ++ return 0; ++ ++err_free_epc_mem: ++ pci_epc_mem_free_addr(epc, ep->msi_mem_phys, ep->msi_mem, ++ epc->mem->window.page_size); ++ ++err_exit_epc_mem: ++ pci_epc_mem_exit(epc); ++ ++ return ret; + } + EXPORT_SYMBOL_GPL(dw_pcie_ep_init); +-- +2.35.1 + diff --git a/queue-5.10/pci-endpoint-don-t-stop-controller-when-unbinding-en.patch b/queue-5.10/pci-endpoint-don-t-stop-controller-when-unbinding-en.patch new file mode 100644 index 00000000000..635f0c9d67f --- /dev/null +++ b/queue-5.10/pci-endpoint-don-t-stop-controller-when-unbinding-en.patch @@ -0,0 +1,41 @@ +From d272328869e25d34c44d46cc8fd6866acafc0957 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 22 Jun 2022 13:09:24 +0900 +Subject: PCI: endpoint: Don't stop controller when unbinding endpoint function + +From: Shunsuke Mie + +[ Upstream commit 1bc2b7bfba6e2f64edf5e246f3af2967261f6c3d ] + +Unbinding an endpoint function from the endpoint controller shouldn't stop +the controller. This is especially a problem for multi-function endpoints +where other endpoints may still be active. + +Don't stop the controller when unbinding one of its endpoints. Normally +the controller is stopped via configfs. + +Fixes: 349e7a85b25f ("PCI: endpoint: functions: Add an EP function to test PCI") +Link: https://lore.kernel.org/r/20220622040924.113279-1-mie@igel.co.jp +Signed-off-by: Shunsuke Mie +Signed-off-by: Bjorn Helgaas +Acked-by: Kishon Vijay Abraham I +Signed-off-by: Sasha Levin +--- + drivers/pci/endpoint/functions/pci-epf-test.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c +index 262b2c4c70c9..ddfeca9016a0 100644 +--- a/drivers/pci/endpoint/functions/pci-epf-test.c ++++ b/drivers/pci/endpoint/functions/pci-epf-test.c +@@ -623,7 +623,6 @@ static void pci_epf_test_unbind(struct pci_epf *epf) + + cancel_delayed_work(&epf_test->cmd_handler); + pci_epf_test_clean_dma_chan(epf_test); +- pci_epc_stop(epc); + for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) { + epf_bar = &epf->bar[bar]; + +-- +2.35.1 + diff --git a/queue-5.10/pci-portdrv-don-t-disable-aer-reporting-in-get_port_.patch b/queue-5.10/pci-portdrv-don-t-disable-aer-reporting-in-get_port_.patch new file mode 100644 index 00000000000..b80bae24d40 --- /dev/null +++ b/queue-5.10/pci-portdrv-don-t-disable-aer-reporting-in-get_port_.patch @@ -0,0 +1,106 @@ +From 47afc81978e9273dab8f7287965338c59d29459c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 25 Jan 2022 08:18:19 +0100 +Subject: PCI/portdrv: Don't disable AER reporting in + get_port_device_capability() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Stefan Roese + +[ Upstream commit 8795e182b02dc87e343c79e73af6b8b7f9c5e635 ] + +AER reporting is currently disabled in the DevCtl registers of all non Root +Port PCIe devices on systems using pcie_ports_native || host->native_aer, +disabling AER completely in such systems. This is because 2bd50dd800b5 +("PCI: PCIe: Disable PCIe port services during port initialization"), added +a call to pci_disable_pcie_error_reporting() *after* the AER setup was +completed for the PCIe device tree. + +Here a longer analysis about the current status of AER enabling / +disabling upon bootup provided by Bjorn: + + pcie_portdrv_probe + pcie_port_device_register + get_port_device_capability + pci_disable_pcie_error_reporting + clear CERE NFERE FERE URRE # <-- disable for RP USP DSP + pcie_device_init + device_register # new AER service device + aer_probe + aer_enable_rootport # RP only + set_downstream_devices_error_reporting + set_device_error_reporting # self (RP) + if (RP || USP || DSP) + pci_enable_pcie_error_reporting + set CERE NFERE FERE URRE # <-- enable for RP + pci_walk_bus + set_device_error_reporting + if (RP || USP || DSP) + pci_enable_pcie_error_reporting + set CERE NFERE FERE URRE # <-- enable for USP DSP + +In a typical Root Port -> Endpoint hierarchy, the above: + - Disables Error Reporting for the Root Port, + - Enables Error Reporting for the Root Port, + - Does NOT enable Error Reporting for the Endpoint because it is not a + Root Port or Switch Port. + +In a deeper Root Port -> Upstream Switch Port -> Downstream Switch +Port -> Endpoint hierarchy: + - Disables Error Reporting for the Root Port, + - Enables Error Reporting for the Root Port, + - Enables Error Reporting for both Switch Ports, + - Does NOT enable Error Reporting for the Endpoint because it is not a + Root Port or Switch Port, + - Disables Error Reporting for the Switch Ports when pcie_portdrv_probe() + claims them. AER does not re-enable it because these are not Root + Ports. + +Remove this call to pci_disable_pcie_error_reporting() from +get_port_device_capability(), leaving the already enabled AER configuration +intact. With this change, AER is enabled in the Root Port and the PCIe +switch upstream and downstream ports. Only the PCIe Endpoints don't have +AER enabled yet. A follow-up patch will take care of this Endpoint +enabling. + +Fixes: 2bd50dd800b5 ("PCI: PCIe: Disable PCIe port services during port initialization") +Link: https://lore.kernel.org/r/20220125071820.2247260-3-sr@denx.de +Signed-off-by: Stefan Roese +Signed-off-by: Bjorn Helgaas +Reviewed-by: Pali Rohár +Cc: Rafael J. Wysocki +Cc: Bharat Kumar Gogada +Cc: Michal Simek +Cc: Yao Hongbo +Cc: Naveen Naidu +Signed-off-by: Sasha Levin +--- + drivers/pci/pcie/portdrv_core.c | 9 +-------- + 1 file changed, 1 insertion(+), 8 deletions(-) + +diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c +index 3779b264dbec..5ae81f2df45f 100644 +--- a/drivers/pci/pcie/portdrv_core.c ++++ b/drivers/pci/pcie/portdrv_core.c +@@ -222,15 +222,8 @@ static int get_port_device_capability(struct pci_dev *dev) + + #ifdef CONFIG_PCIEAER + if (dev->aer_cap && pci_aer_available() && +- (pcie_ports_native || host->native_aer)) { ++ (pcie_ports_native || host->native_aer)) + services |= PCIE_PORT_SERVICE_AER; +- +- /* +- * Disable AER on this port in case it's been enabled by the +- * BIOS (the AER service driver will enable it when necessary). +- */ +- pci_disable_pcie_error_reporting(dev); +- } + #endif + + /* +-- +2.35.1 + diff --git a/queue-5.10/pci-qcom-set-up-rev-2.1.0-parf_phy-before-enabling-c.patch b/queue-5.10/pci-qcom-set-up-rev-2.1.0-parf_phy-before-enabling-c.patch new file mode 100644 index 00000000000..3bcfc0fbadb --- /dev/null +++ b/queue-5.10/pci-qcom-set-up-rev-2.1.0-parf_phy-before-enabling-c.patch @@ -0,0 +1,68 @@ +From 1d2867f32842e4d310f86e61433d086c39078ba8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 9 Jul 2022 00:27:43 +0200 +Subject: PCI: qcom: Set up rev 2.1.0 PARF_PHY before enabling clocks + +From: Christian Marangi + +[ Upstream commit 38f897ae3d44900f627cad708a15db498ce2ca31 ] + +We currently enable clocks BEFORE we write to PARF_PHY_CTRL reg to enable +clocks and resets. This causes the driver to never set to a ready state +with the error 'Phy link never came up'. + +This is caused by the PHY clock getting enabled before setting the required +bits in the PARF regs. + +A workaround for this was set but with this new discovery we can drop +the workaround and use a proper solution to the problem by just enabling +the clock only AFTER the PARF_PHY_CTRL bit is set. + +This correctly sets up the PCIe link and makes it usable even when a +bootloader leaves the PCIe link in an undefined state. + +Fixes: 82a823833f4e ("PCI: qcom: Add Qualcomm PCIe controller driver") +Link: https://lore.kernel.org/r/20220708222743.27019-1-ansuelsmth@gmail.com +Signed-off-by: Christian Marangi +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/dwc/pcie-qcom.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c +index 1b8b3c12eece..5fbd80908a99 100644 +--- a/drivers/pci/controller/dwc/pcie-qcom.c ++++ b/drivers/pci/controller/dwc/pcie-qcom.c +@@ -320,8 +320,6 @@ static int qcom_pcie_init_2_1_0(struct qcom_pcie *pcie) + reset_control_assert(res->ext_reset); + reset_control_assert(res->phy_reset); + +- writel(1, pcie->parf + PCIE20_PARF_PHY_CTRL); +- + ret = regulator_bulk_enable(ARRAY_SIZE(res->supplies), res->supplies); + if (ret < 0) { + dev_err(dev, "cannot enable regulators\n"); +@@ -364,15 +362,15 @@ static int qcom_pcie_init_2_1_0(struct qcom_pcie *pcie) + goto err_deassert_axi; + } + +- ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks); +- if (ret) +- goto err_clks; +- + /* enable PCIe clocks and resets */ + val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); + val &= ~BIT(0); + writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); + ++ ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks); ++ if (ret) ++ goto err_clks; ++ + if (of_device_is_compatible(node, "qcom,pcie-ipq8064") || + of_device_is_compatible(node, "qcom,pcie-ipq8064-v2")) { + writel(PCS_DEEMPH_TX_DEEMPH_GEN1(24) | +-- +2.35.1 + diff --git a/queue-5.10/pci-tegra194-fix-link-up-retry-sequence.patch b/queue-5.10/pci-tegra194-fix-link-up-retry-sequence.patch new file mode 100644 index 00000000000..b3970415104 --- /dev/null +++ b/queue-5.10/pci-tegra194-fix-link-up-retry-sequence.patch @@ -0,0 +1,37 @@ +From a375c435dc058c3bd5167dac88b8374467664659 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jul 2022 19:50:50 +0530 +Subject: PCI: tegra194: Fix link up retry sequence + +From: Vidya Sagar + +[ Upstream commit e05fd6ae77c3e2cc0dba283005d24b6d56d2b1fa ] + +Add the missing DLF capability offset while clearing DL_FEATURE_EXCHANGE_EN +bit during link up retry. + +Link: https://lore.kernel.org/r/20220721142052.25971-15-vidyas@nvidia.com +Fixes: 56e15a238d92 ("PCI: tegra: Add Tegra194 PCIe support") +Signed-off-by: Vidya Sagar +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/dwc/pcie-tegra194.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/pci/controller/dwc/pcie-tegra194.c b/drivers/pci/controller/dwc/pcie-tegra194.c +index bcbd600116d7..1222f5749bc6 100644 +--- a/drivers/pci/controller/dwc/pcie-tegra194.c ++++ b/drivers/pci/controller/dwc/pcie-tegra194.c +@@ -963,7 +963,7 @@ static int tegra_pcie_dw_host_init(struct pcie_port *pp) + offset = dw_pcie_find_ext_capability(pci, PCI_EXT_CAP_ID_DLF); + val = dw_pcie_readl_dbi(pci, offset + PCI_DLF_CAP); + val &= ~PCI_DLF_EXCHANGE_ENABLE; +- dw_pcie_writel_dbi(pci, offset, val); ++ dw_pcie_writel_dbi(pci, offset + PCI_DLF_CAP, val); + + tegra_pcie_prepare_host(pp); + +-- +2.35.1 + diff --git a/queue-5.10/pci-tegra194-fix-pm-error-handling-in-tegra_pcie_con.patch b/queue-5.10/pci-tegra194-fix-pm-error-handling-in-tegra_pcie_con.patch new file mode 100644 index 00000000000..8257408ac1d --- /dev/null +++ b/queue-5.10/pci-tegra194-fix-pm-error-handling-in-tegra_pcie_con.patch @@ -0,0 +1,40 @@ +From 43226f1cb6ea98d5c42dbc939b109cf7dd1761f8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Jun 2022 07:19:08 +0400 +Subject: PCI: tegra194: Fix PM error handling in tegra_pcie_config_ep() + +From: Miaoqian Lin + +[ Upstream commit e8fbd344a5ea62663554b8546b6bf9f88b93785a ] + +pm_runtime_enable() will increase power disable depth. If +dw_pcie_ep_init() fails, we should use pm_runtime_disable() to balance it +with pm_runtime_enable(). + +Add missing pm_runtime_disable() for tegra_pcie_config_ep(). + +Fixes: c57247f940e8 ("PCI: tegra: Add support for PCIe endpoint mode in Tegra194") +Link: https://lore.kernel.org/r/20220602031910.55859-1-linmq006@gmail.com +Signed-off-by: Miaoqian Lin +Signed-off-by: Bjorn Helgaas +Reviewed-by: Vidya Sagar +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/dwc/pcie-tegra194.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/pci/controller/dwc/pcie-tegra194.c b/drivers/pci/controller/dwc/pcie-tegra194.c +index a5b677ec0769..845f1e1de3ab 100644 +--- a/drivers/pci/controller/dwc/pcie-tegra194.c ++++ b/drivers/pci/controller/dwc/pcie-tegra194.c +@@ -1970,6 +1970,7 @@ static int tegra_pcie_config_ep(struct tegra_pcie_dw *pcie, + if (ret) { + dev_err(dev, "Failed to initialize DWC Endpoint subsystem: %d\n", + ret); ++ pm_runtime_disable(dev); + return ret; + } + +-- +2.35.1 + diff --git a/queue-5.10/pci-tegra194-fix-root-port-interrupt-handling.patch b/queue-5.10/pci-tegra194-fix-root-port-interrupt-handling.patch new file mode 100644 index 00000000000..abe46d599eb --- /dev/null +++ b/queue-5.10/pci-tegra194-fix-root-port-interrupt-handling.patch @@ -0,0 +1,115 @@ +From bf5dcf95e8bbe15f8fc023197c9ca101b16eb94f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jul 2022 19:50:46 +0530 +Subject: PCI: tegra194: Fix Root Port interrupt handling + +From: Vidya Sagar + +[ Upstream commit 6646e99bcec627e866bc84365af37942c72b4b76 ] + +As part of Root Port interrupt handling, level-0 register is read first and +based on the bits set in that, corresponding level-1 registers are read for +further interrupt processing. Since both these values are currently read +into the same 'val' variable, checking level-0 bits the second time around +is happening on the 'val' variable value of level-1 register contents +instead of freshly reading the level-0 value again. + +Fix by using different variables to store level-0 and level-1 registers +contents. + +Link: https://lore.kernel.org/r/20220721142052.25971-11-vidyas@nvidia.com +Fixes: 56e15a238d92 ("PCI: tegra: Add Tegra194 PCIe support") +Signed-off-by: Vidya Sagar +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/dwc/pcie-tegra194.c | 46 +++++++++++----------- + 1 file changed, 22 insertions(+), 24 deletions(-) + +diff --git a/drivers/pci/controller/dwc/pcie-tegra194.c b/drivers/pci/controller/dwc/pcie-tegra194.c +index 845f1e1de3ab..bcbd600116d7 100644 +--- a/drivers/pci/controller/dwc/pcie-tegra194.c ++++ b/drivers/pci/controller/dwc/pcie-tegra194.c +@@ -370,15 +370,14 @@ static irqreturn_t tegra_pcie_rp_irq_handler(int irq, void *arg) + struct tegra_pcie_dw *pcie = arg; + struct dw_pcie *pci = &pcie->pci; + struct pcie_port *pp = &pci->pp; +- u32 val, tmp; ++ u32 val, status_l0, status_l1; + u16 val_w; + +- val = appl_readl(pcie, APPL_INTR_STATUS_L0); +- if (val & APPL_INTR_STATUS_L0_LINK_STATE_INT) { +- val = appl_readl(pcie, APPL_INTR_STATUS_L1_0_0); +- if (val & APPL_INTR_STATUS_L1_0_0_LINK_REQ_RST_NOT_CHGED) { +- appl_writel(pcie, val, APPL_INTR_STATUS_L1_0_0); +- ++ status_l0 = appl_readl(pcie, APPL_INTR_STATUS_L0); ++ if (status_l0 & APPL_INTR_STATUS_L0_LINK_STATE_INT) { ++ status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_0_0); ++ appl_writel(pcie, status_l1, APPL_INTR_STATUS_L1_0_0); ++ if (status_l1 & APPL_INTR_STATUS_L1_0_0_LINK_REQ_RST_NOT_CHGED) { + /* SBR & Surprise Link Down WAR */ + val = appl_readl(pcie, APPL_CAR_RESET_OVRD); + val &= ~APPL_CAR_RESET_OVRD_CYA_OVERRIDE_CORE_RST_N; +@@ -394,15 +393,15 @@ static irqreturn_t tegra_pcie_rp_irq_handler(int irq, void *arg) + } + } + +- if (val & APPL_INTR_STATUS_L0_INT_INT) { +- val = appl_readl(pcie, APPL_INTR_STATUS_L1_8_0); +- if (val & APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS) { ++ if (status_l0 & APPL_INTR_STATUS_L0_INT_INT) { ++ status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_8_0); ++ if (status_l1 & APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS) { + appl_writel(pcie, + APPL_INTR_STATUS_L1_8_0_AUTO_BW_INT_STS, + APPL_INTR_STATUS_L1_8_0); + apply_bad_link_workaround(pp); + } +- if (val & APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS) { ++ if (status_l1 & APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS) { + appl_writel(pcie, + APPL_INTR_STATUS_L1_8_0_BW_MGT_INT_STS, + APPL_INTR_STATUS_L1_8_0); +@@ -414,25 +413,24 @@ static irqreturn_t tegra_pcie_rp_irq_handler(int irq, void *arg) + } + } + +- val = appl_readl(pcie, APPL_INTR_STATUS_L0); +- if (val & APPL_INTR_STATUS_L0_CDM_REG_CHK_INT) { +- val = appl_readl(pcie, APPL_INTR_STATUS_L1_18); +- tmp = dw_pcie_readl_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS); +- if (val & APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMPLT) { ++ if (status_l0 & APPL_INTR_STATUS_L0_CDM_REG_CHK_INT) { ++ status_l1 = appl_readl(pcie, APPL_INTR_STATUS_L1_18); ++ val = dw_pcie_readl_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS); ++ if (status_l1 & APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMPLT) { + dev_info(pci->dev, "CDM check complete\n"); +- tmp |= PCIE_PL_CHK_REG_CHK_REG_COMPLETE; ++ val |= PCIE_PL_CHK_REG_CHK_REG_COMPLETE; + } +- if (val & APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMP_ERR) { ++ if (status_l1 & APPL_INTR_STATUS_L1_18_CDM_REG_CHK_CMP_ERR) { + dev_err(pci->dev, "CDM comparison mismatch\n"); +- tmp |= PCIE_PL_CHK_REG_CHK_REG_COMPARISON_ERROR; ++ val |= PCIE_PL_CHK_REG_CHK_REG_COMPARISON_ERROR; + } +- if (val & APPL_INTR_STATUS_L1_18_CDM_REG_CHK_LOGIC_ERR) { ++ if (status_l1 & APPL_INTR_STATUS_L1_18_CDM_REG_CHK_LOGIC_ERR) { + dev_err(pci->dev, "CDM Logic error\n"); +- tmp |= PCIE_PL_CHK_REG_CHK_REG_LOGIC_ERROR; ++ val |= PCIE_PL_CHK_REG_CHK_REG_LOGIC_ERROR; + } +- dw_pcie_writel_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS, tmp); +- tmp = dw_pcie_readl_dbi(pci, PCIE_PL_CHK_REG_ERR_ADDR); +- dev_err(pci->dev, "CDM Error Address Offset = 0x%08X\n", tmp); ++ dw_pcie_writel_dbi(pci, PCIE_PL_CHK_REG_CONTROL_STATUS, val); ++ val = dw_pcie_readl_dbi(pci, PCIE_PL_CHK_REG_ERR_ADDR); ++ dev_err(pci->dev, "CDM Error Address Offset = 0x%08X\n", val); + } + + return IRQ_HANDLED; +-- +2.35.1 + diff --git a/queue-5.10/perf-symbol-fail-to-read-phdr-workaround.patch b/queue-5.10/perf-symbol-fail-to-read-phdr-workaround.patch new file mode 100644 index 00000000000..fe709d198b6 --- /dev/null +++ b/queue-5.10/perf-symbol-fail-to-read-phdr-workaround.patch @@ -0,0 +1,107 @@ +From 5507047c68e46553897942e05c879e62a1cb6e36 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 31 Jul 2022 09:49:23 -0700 +Subject: perf symbol: Fail to read phdr workaround + +From: Ian Rogers + +[ Upstream commit 6d518ac7be6223811ab947897273b1bbef846180 ] + +The perf jvmti agent doesn't create program headers, in this case +fallback on section headers as happened previously. + +Committer notes: + +To test this, from a public post by Ian: + +1) download a Java workload dacapo-9.12-MR1-bach.jar from +https://sourceforge.net/projects/dacapobench/ + +2) build perf such as "make -C tools/perf O=/tmp/perf NO_LIBBFD=1" it +should detect Java and create /tmp/perf/libperf-jvmti.so + +3) run perf with the jvmti agent: + + perf record -k 1 java -agentpath:/tmp/perf/libperf-jvmti.so -jar dacapo-9.12-MR1-bach.jar -n 10 fop + +4) run perf inject: + + perf inject -i perf.data -o perf-injected.data -j + +5) run perf report + + perf report -i perf-injected.data | grep org.apache.fop + +With this patch reverted I see lots of symbols like: + + 0.00% java jitted-388040-4656.so [.] org.apache.fop.fo.FObj.bind(org.apache.fop.fo.PropertyList) + +With the patch (2d86612aacb7805f ("perf symbol: Correct address for bss +symbols")) I see lots of: + + dso__load_sym_internal: failed to find program header for symbol: + Lorg/apache/fop/fo/FObj;bind(Lorg/apache/fop/fo/PropertyList;)V + st_value: 0x40 + +Fixes: 2d86612aacb7805f ("perf symbol: Correct address for bss symbols") +Reviewed-by: Leo Yan +Signed-off-by: Ian Rogers +Tested-by: Leo Yan +Cc: Alexander Shishkin +Cc: Jiri Olsa +Cc: Leo Yan +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Stephane Eranian +Link: http://lore.kernel.org/lkml/20220731164923.691193-1-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/symbol-elf.c | 27 ++++++++++++++++++++------- + 1 file changed, 20 insertions(+), 7 deletions(-) + +diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c +index 1cab29d45bfb..d8d79a9ec775 100644 +--- a/tools/perf/util/symbol-elf.c ++++ b/tools/perf/util/symbol-elf.c +@@ -1249,16 +1249,29 @@ int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss, + + if (elf_read_program_header(syms_ss->elf, + (u64)sym.st_value, &phdr)) { +- pr_warning("%s: failed to find program header for " ++ pr_debug4("%s: failed to find program header for " + "symbol: %s st_value: %#" PRIx64 "\n", + __func__, elf_name, (u64)sym.st_value); +- continue; ++ pr_debug4("%s: adjusting symbol: st_value: %#" PRIx64 " " ++ "sh_addr: %#" PRIx64 " sh_offset: %#" PRIx64 "\n", ++ __func__, (u64)sym.st_value, (u64)shdr.sh_addr, ++ (u64)shdr.sh_offset); ++ /* ++ * Fail to find program header, let's rollback ++ * to use shdr.sh_addr and shdr.sh_offset to ++ * calibrate symbol's file address, though this ++ * is not necessary for normal C ELF file, we ++ * still need to handle java JIT symbols in this ++ * case. ++ */ ++ sym.st_value -= shdr.sh_addr - shdr.sh_offset; ++ } else { ++ pr_debug4("%s: adjusting symbol: st_value: %#" PRIx64 " " ++ "p_vaddr: %#" PRIx64 " p_offset: %#" PRIx64 "\n", ++ __func__, (u64)sym.st_value, (u64)phdr.p_vaddr, ++ (u64)phdr.p_offset); ++ sym.st_value -= phdr.p_vaddr - phdr.p_offset; + } +- pr_debug4("%s: adjusting symbol: st_value: %#" PRIx64 " " +- "p_vaddr: %#" PRIx64 " p_offset: %#" PRIx64 "\n", +- __func__, (u64)sym.st_value, (u64)phdr.p_vaddr, +- (u64)phdr.p_offset); +- sym.st_value -= phdr.p_vaddr - phdr.p_offset; + } + + demangled = demangle_sym(dso, kmodule, elf_name); +-- +2.35.1 + diff --git a/queue-5.10/perf-tools-fix-dso_id-inode-generation-comparison.patch b/queue-5.10/perf-tools-fix-dso_id-inode-generation-comparison.patch new file mode 100644 index 00000000000..6bb5819c19d --- /dev/null +++ b/queue-5.10/perf-tools-fix-dso_id-inode-generation-comparison.patch @@ -0,0 +1,57 @@ +From 54bb8edf78fe1f262d58000cd7295b045d1b904e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jul 2022 12:31:44 +0300 +Subject: perf tools: Fix dso_id inode generation comparison + +From: Adrian Hunter + +[ Upstream commit 68566a7cf56bf3148797c218ed45a9de078ef47c ] + +Synthesized MMAP events have zero ino_generation, so do not compare +them to DSOs with a real ino_generation otherwise we end up with a DSO +without a build id. + +Fixes: 0e3149f86b99ddab ("perf dso: Move dso_id from 'struct map' to 'struct dso'") +Signed-off-by: Adrian Hunter +Cc: Andi Kleen +Cc: Ian Rogers +Cc: Jiri Olsa +Cc: kvm@vger.kernel.org +Cc: Namhyung Kim +Link: https://lore.kernel.org/r/20220711093218.10967-2-adrian.hunter@intel.com +[ Added clarification to the comment from Ian + more detailed explanation from Adrian ] +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/dsos.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +diff --git a/tools/perf/util/dsos.c b/tools/perf/util/dsos.c +index 183a81d5b2f9..2db91121bdaf 100644 +--- a/tools/perf/util/dsos.c ++++ b/tools/perf/util/dsos.c +@@ -20,8 +20,19 @@ static int __dso_id__cmp(struct dso_id *a, struct dso_id *b) + if (a->ino > b->ino) return -1; + if (a->ino < b->ino) return 1; + +- if (a->ino_generation > b->ino_generation) return -1; +- if (a->ino_generation < b->ino_generation) return 1; ++ /* ++ * Synthesized MMAP events have zero ino_generation, avoid comparing ++ * them with MMAP events with actual ino_generation. ++ * ++ * I found it harmful because the mismatch resulted in a new ++ * dso that did not have a build ID whereas the original dso did have a ++ * build ID. The build ID was essential because the object was not found ++ * otherwise. - Adrian ++ */ ++ if (a->ino_generation && b->ino_generation) { ++ if (a->ino_generation > b->ino_generation) return -1; ++ if (a->ino_generation < b->ino_generation) return 1; ++ } + + return 0; + } +-- +2.35.1 + diff --git a/queue-5.10/platform-chrome-cros_ec-always-expose-last-resume-re.patch b/queue-5.10/platform-chrome-cros_ec-always-expose-last-resume-re.patch new file mode 100644 index 00000000000..d510ca82416 --- /dev/null +++ b/queue-5.10/platform-chrome-cros_ec-always-expose-last-resume-re.patch @@ -0,0 +1,64 @@ +From aeeff4a8668fcf77f20b1daf3f15a5d65f1a90ae Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 14 Jun 2022 00:57:26 -0700 +Subject: platform/chrome: cros_ec: Always expose last resume result + +From: Stephen Boyd + +[ Upstream commit 74bb746407bf0d7c7d126c7731dbcd66d467619b ] + +The last resume result exposing logic in cros_ec_sleep_event() +incorrectly requires S0ix support, which doesn't work on ARM based +systems where S0ix doesn't exist. That's because cros_ec_sleep_event() +only reports the last resume result when the EC indicates the last sleep +event was an S0ix resume. On ARM systems, the last sleep event is always +S3 resume, but the EC can still detect sleep hang events in case some +other part of the AP is blocking sleep. + +Always expose the last resume result if the EC supports it so that this +works on all devices regardless of S0ix support. This fixes sleep hang +detection on ARM based chromebooks like Trogdor. + +Cc: Rajat Jain +Cc: Matthias Kaehlcke +Cc: Hsin-Yi Wang +Cc: Tzung-Bi Shih +Reviewed-by: Guenter Roeck +Reviewed-by: Evan Green +Fixes: 7235560ac77a ("platform/chrome: Add support for v1 of host sleep event") +Signed-off-by: Stephen Boyd +Signed-off-by: Tzung-Bi Shih +Link: https://lore.kernel.org/r/20220614075726.2729987-1-swboyd@chromium.org +Signed-off-by: Sasha Levin +--- + drivers/platform/chrome/cros_ec.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/platform/chrome/cros_ec.c b/drivers/platform/chrome/cros_ec.c +index 979f92194e81..c4de8c4db193 100644 +--- a/drivers/platform/chrome/cros_ec.c ++++ b/drivers/platform/chrome/cros_ec.c +@@ -121,16 +121,16 @@ static int cros_ec_sleep_event(struct cros_ec_device *ec_dev, u8 sleep_event) + buf.msg.command = EC_CMD_HOST_SLEEP_EVENT; + + ret = cros_ec_cmd_xfer_status(ec_dev, &buf.msg); +- +- /* For now, report failure to transition to S0ix with a warning. */ ++ /* Report failure to transition to system wide suspend with a warning. */ + if (ret >= 0 && ec_dev->host_sleep_v1 && +- (sleep_event == HOST_SLEEP_EVENT_S0IX_RESUME)) { ++ (sleep_event == HOST_SLEEP_EVENT_S0IX_RESUME || ++ sleep_event == HOST_SLEEP_EVENT_S3_RESUME)) { + ec_dev->last_resume_result = + buf.u.resp1.resume_response.sleep_transitions; + + WARN_ONCE(buf.u.resp1.resume_response.sleep_transitions & + EC_HOST_RESUME_SLEEP_TIMEOUT, +- "EC detected sleep transition timeout. Total slp_s0 transitions: %d", ++ "EC detected sleep transition timeout. Total sleep transitions: %d", + buf.u.resp1.resume_response.sleep_transitions & + EC_HOST_RESUME_SLEEP_TRANSITIONS_MASK); + } +-- +2.35.1 + diff --git a/queue-5.10/platform-olpc-fix-uninitialized-data-in-debugfs-writ.patch b/queue-5.10/platform-olpc-fix-uninitialized-data-in-debugfs-writ.patch new file mode 100644 index 00000000000..f547b9187ee --- /dev/null +++ b/queue-5.10/platform-olpc-fix-uninitialized-data-in-debugfs-writ.patch @@ -0,0 +1,50 @@ +From e4a6224a8b6b6aac2a6c7b037890832dfea13797 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jul 2022 21:23:38 +0300 +Subject: platform/olpc: Fix uninitialized data in debugfs write + +From: Dan Carpenter + +[ Upstream commit 40ec787e1adf302c11668d4cc69838f4d584187d ] + +The call to: + + size = simple_write_to_buffer(cmdbuf, sizeof(cmdbuf), ppos, buf, size); + +will succeed if at least one byte is written to the "cmdbuf" buffer. +The "*ppos" value controls which byte is written. Another problem is +that this code does not check for errors so it's possible for the entire +buffer to be uninitialized. + +Inintialize the struct to zero to prevent reading uninitialized stack +data. + +Debugfs is normally only writable by root so the impact of this bug is +very minimal. + +Fixes: 6cca83d498bd ("Platform: OLPC: move debugfs support from x86 EC driver") +Signed-off-by: Dan Carpenter +Link: https://lore.kernel.org/r/YthIKn+TfZSZMEcM@kili +Reviewed-by: Hans de Goede +Signed-off-by: Hans de Goede +Signed-off-by: Sasha Levin +--- + drivers/platform/olpc/olpc-ec.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/platform/olpc/olpc-ec.c b/drivers/platform/olpc/olpc-ec.c +index 2db7113383fd..89d9fca02fe9 100644 +--- a/drivers/platform/olpc/olpc-ec.c ++++ b/drivers/platform/olpc/olpc-ec.c +@@ -265,7 +265,7 @@ static ssize_t ec_dbgfs_cmd_write(struct file *file, const char __user *buf, + int i, m; + unsigned char ec_cmd[EC_MAX_CMD_ARGS]; + unsigned int ec_cmd_int[EC_MAX_CMD_ARGS]; +- char cmdbuf[64]; ++ char cmdbuf[64] = ""; + int ec_cmd_bytes; + + mutex_lock(&ec_dbgfs_lock); +-- +2.35.1 + diff --git a/queue-5.10/pm-hibernate-defer-device-probing-when-resuming-from.patch b/queue-5.10/pm-hibernate-defer-device-probing-when-resuming-from.patch new file mode 100644 index 00000000000..b66d6c057c4 --- /dev/null +++ b/queue-5.10/pm-hibernate-defer-device-probing-when-resuming-from.patch @@ -0,0 +1,106 @@ +From 710f2a1899d5e37492f39335536942687ab9059a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jul 2022 14:49:58 +0900 +Subject: PM: hibernate: defer device probing when resuming from hibernation + +From: Tetsuo Handa + +[ Upstream commit 8386c414e27caba8501119948e9551e52b527f59 ] + +syzbot is reporting hung task at misc_open() [1], for there is a race +window of AB-BA deadlock which involves probe_count variable. Currently +wait_for_device_probe() from snapshot_open() from misc_open() can sleep +forever with misc_mtx held if probe_count cannot become 0. + +When a device is probed by hub_event() work function, probe_count is +incremented before the probe function starts, and probe_count is +decremented after the probe function completed. + +There are three cases that can prevent probe_count from dropping to 0. + + (a) A device being probed stopped responding (i.e. broken/malicious + hardware). + + (b) A process emulating a USB device using /dev/raw-gadget interface + stopped responding for some reason. + + (c) New device probe requests keeps coming in before existing device + probe requests complete. + +The phenomenon syzbot is reporting is (b). A process which is holding +system_transition_mutex and misc_mtx is waiting for probe_count to become +0 inside wait_for_device_probe(), but the probe function which is called + from hub_event() work function is waiting for the processes which are +blocked at mutex_lock(&misc_mtx) to respond via /dev/raw-gadget interface. + +This patch mitigates (b) by deferring wait_for_device_probe() from +snapshot_open() to snapshot_write() and snapshot_ioctl(). Please note that +the possibility of (b) remains as long as any thread which is emulating a +USB device via /dev/raw-gadget interface can be blocked by uninterruptible +blocking operations (e.g. mutex_lock()). + +Please also note that (a) and (c) are not addressed. Regarding (c), we +should change the code to wait for only one device which contains the +image for resuming from hibernation. I don't know how to address (a), for +use of timeout for wait_for_device_probe() might result in loss of user +data in the image. Maybe we should require the userland to wait for the +image device before opening /dev/snapshot interface. + +Link: https://syzkaller.appspot.com/bug?extid=358c9ab4c93da7b7238c [1] +Reported-by: syzbot +Signed-off-by: Tetsuo Handa +Tested-by: syzbot +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + kernel/power/user.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +diff --git a/kernel/power/user.c b/kernel/power/user.c +index 740723bb3885..13cca2e2c2bc 100644 +--- a/kernel/power/user.c ++++ b/kernel/power/user.c +@@ -26,6 +26,7 @@ + + #include "power.h" + ++static bool need_wait; + + static struct snapshot_data { + struct snapshot_handle handle; +@@ -78,7 +79,7 @@ static int snapshot_open(struct inode *inode, struct file *filp) + * Resuming. We may need to wait for the image device to + * appear. + */ +- wait_for_device_probe(); ++ need_wait = true; + + data->swap = -1; + data->mode = O_WRONLY; +@@ -168,6 +169,11 @@ static ssize_t snapshot_write(struct file *filp, const char __user *buf, + ssize_t res; + loff_t pg_offp = *offp & ~PAGE_MASK; + ++ if (need_wait) { ++ wait_for_device_probe(); ++ need_wait = false; ++ } ++ + lock_system_sleep(); + + data = filp->private_data; +@@ -244,6 +250,11 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, + loff_t size; + sector_t offset; + ++ if (need_wait) { ++ wait_for_device_probe(); ++ need_wait = false; ++ } ++ + if (_IOC_TYPE(cmd) != SNAPSHOT_IOC_MAGIC) + return -ENOTTY; + if (_IOC_NR(cmd) > SNAPSHOT_IOC_MAXNR) +-- +2.35.1 + diff --git a/queue-5.10/powerpc-32-do-not-allow-selection-of-e5500-or-e6500-.patch b/queue-5.10/powerpc-32-do-not-allow-selection-of-e5500-or-e6500-.patch new file mode 100644 index 00000000000..bde7ce31bab --- /dev/null +++ b/queue-5.10/powerpc-32-do-not-allow-selection-of-e5500-or-e6500-.patch @@ -0,0 +1,48 @@ +From e537298ff2fee5ff3e1a90f1221f99aea0ba3b22 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jul 2022 16:19:29 +0200 +Subject: powerpc/32: Do not allow selection of e5500 or e6500 CPUs on PPC32 + +From: Christophe Leroy + +[ Upstream commit 9be013b2a9ecb29b5168e4b9db0e48ed53acf37c ] + +Commit 0e00a8c9fd92 ("powerpc: Allow CPU selection also on PPC32") +enlarged the CPU selection logic to PPC32 by removing depend to +PPC64, and failed to restrict that depend to E5500_CPU and E6500_CPU. +Fortunately that got unnoticed because -mcpu=8540 will override the +-mcpu=e500mc64 or -mpcu=e6500 as they are ealier, but that's +fragile and may no be right in the future. + +Add back the depend PPC64 on E5500_CPU and E6500_CPU. + +Fixes: 0e00a8c9fd92 ("powerpc: Allow CPU selection also on PPC32") +Signed-off-by: Christophe Leroy +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/8abab4888da69ff78b73a56f64d9678a7bf684e9.1657549153.git.christophe.leroy@csgroup.eu +Signed-off-by: Sasha Levin +--- + arch/powerpc/platforms/Kconfig.cputype | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype +index 32a9c4c09b98..75ebfbff4deb 100644 +--- a/arch/powerpc/platforms/Kconfig.cputype ++++ b/arch/powerpc/platforms/Kconfig.cputype +@@ -152,11 +152,11 @@ config POWER9_CPU + + config E5500_CPU + bool "Freescale e5500" +- depends on E500 ++ depends on PPC64 && E500 + + config E6500_CPU + bool "Freescale e6500" +- depends on E500 ++ depends on PPC64 && E500 + + config 860_CPU + bool "8xx family" +-- +2.35.1 + diff --git a/queue-5.10/powerpc-64s-disable-stack-variable-initialisation-fo.patch b/queue-5.10/powerpc-64s-disable-stack-variable-initialisation-fo.patch new file mode 100644 index 00000000000..503e9da0dd3 --- /dev/null +++ b/queue-5.10/powerpc-64s-disable-stack-variable-initialisation-fo.patch @@ -0,0 +1,55 @@ +From e67c09ba122a2e4f72a720e8003c13f3588b62f1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jul 2022 23:44:18 +1000 +Subject: powerpc/64s: Disable stack variable initialisation for prom_init + +From: Michael Ellerman + +[ Upstream commit be640317a1d0b9cf42fedb2debc2887a7cfa38de ] + +With GCC 12 allmodconfig prom_init fails to build: + + Error: External symbol 'memset' referenced from prom_init.c + make[2]: *** [arch/powerpc/kernel/Makefile:204: arch/powerpc/kernel/prom_init_check] Error 1 + +The allmodconfig build enables KASAN, so all calls to memset in +prom_init should be converted to __memset by the #ifdefs in +asm/string.h, because prom_init must use the non-KASAN instrumented +versions. + +The build failure happens because there's a call to memset that hasn't +been caught by the pre-processor and converted to __memset. Typically +that's because it's a memset generated by the compiler itself, and that +is the case here. + +With GCC 12, allmodconfig enables CONFIG_INIT_STACK_ALL_PATTERN, which +causes the compiler to emit memset calls to initialise on-stack +variables with a pattern. + +Because prom_init is non-user-facing boot-time only code, as a +workaround just disable stack variable initialisation to unbreak the +build. + +Reported-by: Sudip Mukherjee +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20220718134418.354114-1-mpe@ellerman.id.au +Signed-off-by: Sasha Levin +--- + arch/powerpc/kernel/Makefile | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile +index 376104c166fc..db2bdc4cec64 100644 +--- a/arch/powerpc/kernel/Makefile ++++ b/arch/powerpc/kernel/Makefile +@@ -20,6 +20,7 @@ CFLAGS_prom.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) + CFLAGS_prom_init.o += -fno-stack-protector + CFLAGS_prom_init.o += -DDISABLE_BRANCH_PROFILING + CFLAGS_prom_init.o += -ffreestanding ++CFLAGS_prom_init.o += $(call cc-option, -ftrivial-auto-var-init=uninitialized) + + ifdef CONFIG_FUNCTION_TRACER + # Do not trace early boot code +-- +2.35.1 + diff --git a/queue-5.10/powerpc-cell-axon_msi-fix-refcount-leak-in-setup_msi.patch b/queue-5.10/powerpc-cell-axon_msi-fix-refcount-leak-in-setup_msi.patch new file mode 100644 index 00000000000..276803b380a --- /dev/null +++ b/queue-5.10/powerpc-cell-axon_msi-fix-refcount-leak-in-setup_msi.patch @@ -0,0 +1,37 @@ +From bd24a0ca15198109d02c5849f72c7119a5a7e452 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 5 Jun 2022 10:51:29 +0400 +Subject: powerpc/cell/axon_msi: Fix refcount leak in setup_msi_msg_address + +From: Miaoqian Lin + +[ Upstream commit df5d4b616ee76abc97e5bd348e22659c2b095b1c ] + +of_get_next_parent() returns a node pointer with refcount incremented, +we should use of_node_put() on it when not need anymore. +Add missing of_node_put() in the error path to avoid refcount leak. + +Fixes: ce21b3c9648a ("[CELL] add support for MSI on Axon-based Cell systems") +Signed-off-by: Miaoqian Lin +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20220605065129.63906-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/platforms/cell/axon_msi.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/powerpc/platforms/cell/axon_msi.c b/arch/powerpc/platforms/cell/axon_msi.c +index ca2555b8a0c2..ffbc7d2e9464 100644 +--- a/arch/powerpc/platforms/cell/axon_msi.c ++++ b/arch/powerpc/platforms/cell/axon_msi.c +@@ -226,6 +226,7 @@ static int setup_msi_msg_address(struct pci_dev *dev, struct msi_msg *msg) + if (!prop) { + dev_dbg(&dev->dev, + "axon_msi: no msi-address-(32|64) properties found\n"); ++ of_node_put(dn); + return -ENOENT; + } + +-- +2.35.1 + diff --git a/queue-5.10/powerpc-pci-fix-phb-numbering-when-using-opal-phbid.patch b/queue-5.10/powerpc-pci-fix-phb-numbering-when-using-opal-phbid.patch new file mode 100644 index 00000000000..c2d36d57f2a --- /dev/null +++ b/queue-5.10/powerpc-pci-fix-phb-numbering-when-using-opal-phbid.patch @@ -0,0 +1,61 @@ +From 122a491060eb1558a4757154dfac85c9bc742169 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Aug 2022 20:38:32 +1000 +Subject: powerpc/pci: Fix PHB numbering when using opal-phbid +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Michael Ellerman + +[ Upstream commit f4b39e88b42d13366b831270306326b5c20971ca ] + +The recent change to the PHB numbering logic has a logic error in the +handling of "ibm,opal-phbid". + +When an "ibm,opal-phbid" property is present, &prop is written to and +ret is set to zero. + +The following call to of_alias_get_id() is skipped because ret == 0. + +But then the if (ret >= 0) is true, and the body of that if statement +sets prop = ret which throws away the value that was just read from +"ibm,opal-phbid". + +Fix the logic by only doing the ret >= 0 check in the of_alias_get_id() +case. + +Fixes: 0fe1e96fef0a ("powerpc/pci: Prefer PCI domain assignment via DT 'linux,pci-domain' and alias") +Reviewed-by: Pali Rohár +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20220802105723.1055178-1-mpe@ellerman.id.au +Signed-off-by: Sasha Levin +--- + arch/powerpc/kernel/pci-common.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c +index 7af00a880e16..f9d35c9ea4ae 100644 +--- a/arch/powerpc/kernel/pci-common.c ++++ b/arch/powerpc/kernel/pci-common.c +@@ -89,11 +89,13 @@ static int get_phb_number(struct device_node *dn) + } + if (ret) + ret = of_property_read_u64(dn, "ibm,opal-phbid", &prop); +- if (ret) ++ ++ if (ret) { + ret = of_alias_get_id(dn, "pci"); +- if (ret >= 0) { +- prop = ret; +- ret = 0; ++ if (ret >= 0) { ++ prop = ret; ++ ret = 0; ++ } + } + if (ret) { + u32 prop_32; +-- +2.35.1 + diff --git a/queue-5.10/powerpc-pci-prefer-pci-domain-assignment-via-dt-linu.patch b/queue-5.10/powerpc-pci-prefer-pci-domain-assignment-via-dt-linu.patch new file mode 100644 index 00000000000..f3af3c0568a --- /dev/null +++ b/queue-5.10/powerpc-pci-prefer-pci-domain-assignment-via-dt-linu.patch @@ -0,0 +1,88 @@ +From 912e5dc598381b630f1c495337376027e696b4b7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Jul 2022 12:21:48 +0200 +Subject: powerpc/pci: Prefer PCI domain assignment via DT 'linux,pci-domain' + and alias +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Pali Rohár + +[ Upstream commit 0fe1e96fef0a5c53b4c0d1500d356f3906000f81 ] + +Other Linux architectures use DT property 'linux,pci-domain' for +specifying fixed PCI domain of PCI controller specified in Device-Tree. + +And lot of Freescale powerpc boards have defined numbered pci alias in +Device-Tree for every PCIe controller which number specify preferred PCI +domain. + +So prefer usage of DT property 'linux,pci-domain' (via function +of_get_pci_domain_nr()) and DT pci alias (via function +of_alias_get_id()) on powerpc architecture for assigning PCI domain to +PCI controller. + +Fixes: 63a72284b159 ("powerpc/pci: Assign fixed PHB number based on device-tree properties") +Signed-off-by: Pali Rohár +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20220706102148.5060-2-pali@kernel.org +Signed-off-by: Sasha Levin +--- + arch/powerpc/kernel/pci-common.c | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c +index 7920559a1ca8..7af00a880e16 100644 +--- a/arch/powerpc/kernel/pci-common.c ++++ b/arch/powerpc/kernel/pci-common.c +@@ -73,16 +73,30 @@ void set_pci_dma_ops(const struct dma_map_ops *dma_ops) + static int get_phb_number(struct device_node *dn) + { + int ret, phb_id = -1; +- u32 prop_32; + u64 prop; + + /* + * Try fixed PHB numbering first, by checking archs and reading +- * the respective device-tree properties. Firstly, try powernv by +- * reading "ibm,opal-phbid", only present in OPAL environment. ++ * the respective device-tree properties. Firstly, try reading ++ * standard "linux,pci-domain", then try reading "ibm,opal-phbid" ++ * (only present in powernv OPAL environment), then try device-tree ++ * alias and as the last try to use lower bits of "reg" property. + */ +- ret = of_property_read_u64(dn, "ibm,opal-phbid", &prop); ++ ret = of_get_pci_domain_nr(dn); ++ if (ret >= 0) { ++ prop = ret; ++ ret = 0; ++ } ++ if (ret) ++ ret = of_property_read_u64(dn, "ibm,opal-phbid", &prop); ++ if (ret) ++ ret = of_alias_get_id(dn, "pci"); ++ if (ret >= 0) { ++ prop = ret; ++ ret = 0; ++ } + if (ret) { ++ u32 prop_32; + ret = of_property_read_u32_index(dn, "reg", 1, &prop_32); + prop = prop_32; + } +@@ -94,10 +108,7 @@ static int get_phb_number(struct device_node *dn) + if ((phb_id >= 0) && !test_and_set_bit(phb_id, phb_bitmap)) + return phb_id; + +- /* +- * If not pseries nor powernv, or if fixed PHB numbering tried to add +- * the same PHB number twice, then fallback to dynamic PHB numbering. +- */ ++ /* If everything fails then fallback to dynamic PHB numbering. */ + phb_id = find_first_zero_bit(phb_bitmap, MAX_PHBS); + BUG_ON(phb_id >= MAX_PHBS); + set_bit(phb_id, phb_bitmap); +-- +2.35.1 + diff --git a/queue-5.10/powerpc-perf-optimize-clearing-the-pending-pmi-and-r.patch b/queue-5.10/powerpc-perf-optimize-clearing-the-pending-pmi-and-r.patch new file mode 100644 index 00000000000..fdaaae35050 --- /dev/null +++ b/queue-5.10/powerpc-perf-optimize-clearing-the-pending-pmi-and-r.patch @@ -0,0 +1,157 @@ +From 8068339ac2c3d5d3303202c36559186fec5a3ad2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 22 May 2022 19:52:56 +0530 +Subject: powerpc/perf: Optimize clearing the pending PMI and remove WARN_ON + for PMI check in power_pmu_disable + +From: Athira Rajeev + +[ Upstream commit 890005a7d98f7452cfe86dcfb2aeeb7df01132ce ] + +commit 2c9ac51b850d ("powerpc/perf: Fix PMU callbacks to clear +pending PMI before resetting an overflown PMC") added a new +function "pmi_irq_pending" in hw_irq.h. This function is to check +if there is a PMI marked as pending in Paca (PACA_IRQ_PMI).This is +used in power_pmu_disable in a WARN_ON. The intention here is to +provide a warning if there is PMI pending, but no counter is found +overflown. + +During some of the perf runs, below warning is hit: + +WARNING: CPU: 36 PID: 0 at arch/powerpc/perf/core-book3s.c:1332 power_pmu_disable+0x25c/0x2c0 + Modules linked in: + ----- + + NIP [c000000000141c3c] power_pmu_disable+0x25c/0x2c0 + LR [c000000000141c8c] power_pmu_disable+0x2ac/0x2c0 + Call Trace: + [c000000baffcfb90] [c000000000141c8c] power_pmu_disable+0x2ac/0x2c0 (unreliable) + [c000000baffcfc10] [c0000000003e2f8c] perf_pmu_disable+0x4c/0x60 + [c000000baffcfc30] [c0000000003e3344] group_sched_out.part.124+0x44/0x100 + [c000000baffcfc80] [c0000000003e353c] __perf_event_disable+0x13c/0x240 + [c000000baffcfcd0] [c0000000003dd334] event_function+0xc4/0x140 + [c000000baffcfd20] [c0000000003d855c] remote_function+0x7c/0xa0 + [c000000baffcfd50] [c00000000026c394] flush_smp_call_function_queue+0xd4/0x300 + [c000000baffcfde0] [c000000000065b24] smp_ipi_demux_relaxed+0xa4/0x100 + [c000000baffcfe20] [c0000000000cb2b0] xive_muxed_ipi_action+0x20/0x40 + [c000000baffcfe40] [c000000000207c3c] __handle_irq_event_percpu+0x8c/0x250 + [c000000baffcfee0] [c000000000207e2c] handle_irq_event_percpu+0x2c/0xa0 + [c000000baffcff10] [c000000000210a04] handle_percpu_irq+0x84/0xc0 + [c000000baffcff40] [c000000000205f14] generic_handle_irq+0x54/0x80 + [c000000baffcff60] [c000000000015740] __do_irq+0x90/0x1d0 + [c000000baffcff90] [c000000000016990] __do_IRQ+0xc0/0x140 + [c0000009732f3940] [c000000bafceaca8] 0xc000000bafceaca8 + [c0000009732f39d0] [c000000000016b78] do_IRQ+0x168/0x1c0 + [c0000009732f3a00] [c0000000000090c8] hardware_interrupt_common_virt+0x218/0x220 + +This means that there is no PMC overflown among the active events +in the PMU, but there is a PMU pending in Paca. The function +"any_pmc_overflown" checks the PMCs on active events in +cpuhw->n_events. Code snippet: + +<<>> +if (any_pmc_overflown(cpuhw)) + clear_pmi_irq_pending(); + else + WARN_ON(pmi_irq_pending()); +<<>> + +Here the PMC overflown is not from active event. Example: When we do +perf record, default cycles and instructions will be running on PMC6 +and PMC5 respectively. It could happen that overflowed event is currently +not active and pending PMI is for the inactive event. Debug logs from +trace_printk: + +<<>> +any_pmc_overflown: idx is 5: pmc value is 0xd9a +power_pmu_disable: PMC1: 0x0, PMC2: 0x0, PMC3: 0x0, PMC4: 0x0, PMC5: 0xd9a, PMC6: 0x80002011 +<<>> + +Here active PMC (from idx) is PMC5 , but overflown PMC is PMC6(0x80002011). +When we handle PMI interrupt for such cases, if the PMC overflown is +from inactive event, it will be ignored. Reference commit: +commit bc09c219b2e6 ("powerpc/perf: Fix finding overflowed PMC in interrupt") + +Patch addresses two changes: +1) Fix 1 : Removal of warning ( WARN_ON(pmi_irq_pending()); ) + We were printing warning if no PMC is found overflown among active PMU + events, but PMI pending in PACA. But this could happen in cases where + PMC overflown is not in active PMC. An inactive event could have caused + the overflow. Hence the warning is not needed. To know pending PMI is + from an inactive event, we need to loop through all PMC's which will + cause more SPR reads via mfspr and increase in context switch. Also in + existing function: perf_event_interrupt, already we ignore PMI's + overflown when it is from an inactive PMC. + +2) Fix 2: optimization in clearing pending PMI. + Currently we check for any active PMC overflown before clearing PMI + pending in Paca. This is causing additional SPR read also. From point 1, + we know that if PMI pending in Paca from inactive cases, that is going + to be ignored during replay. Hence if there is pending PMI in Paca, just + clear it irrespective of PMC overflown or not. + +In summary, remove the any_pmc_overflown check entirely in +power_pmu_disable. ie If there is a pending PMI in Paca, clear it, since +we are in pmu_disable. There could be cases where PMI is pending because +of inactive PMC ( which later when replayed also will get ignored ), so +WARN_ON could give false warning. Hence removing it. + +Fixes: 2c9ac51b850d ("powerpc/perf: Fix PMU callbacks to clear pending PMI before resetting an overflown PMC") +Signed-off-by: Athira Rajeev +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20220522142256.24699-1-atrajeev@linux.vnet.ibm.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/perf/core-book3s.c | 35 ++++++++++++++------------------- + 1 file changed, 15 insertions(+), 20 deletions(-) + +diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c +index e49aa8fc6a49..6e3e50614353 100644 +--- a/arch/powerpc/perf/core-book3s.c ++++ b/arch/powerpc/perf/core-book3s.c +@@ -1267,27 +1267,22 @@ static void power_pmu_disable(struct pmu *pmu) + * a PMI happens during interrupt replay and perf counter + * values are cleared by PMU callbacks before replay. + * +- * If any PMC corresponding to the active PMU events are +- * overflown, disable the interrupt by clearing the paca +- * bit for PMI since we are disabling the PMU now. +- * Otherwise provide a warning if there is PMI pending, but +- * no counter is found overflown. ++ * Disable the interrupt by clearing the paca bit for PMI ++ * since we are disabling the PMU now. Otherwise provide a ++ * warning if there is PMI pending, but no counter is found ++ * overflown. ++ * ++ * Since power_pmu_disable runs under local_irq_save, it ++ * could happen that code hits a PMC overflow without PMI ++ * pending in paca. Hence only clear PMI pending if it was ++ * set. ++ * ++ * If a PMI is pending, then MSR[EE] must be disabled (because ++ * the masked PMI handler disabling EE). So it is safe to ++ * call clear_pmi_irq_pending(). + */ +- if (any_pmc_overflown(cpuhw)) { +- /* +- * Since power_pmu_disable runs under local_irq_save, it +- * could happen that code hits a PMC overflow without PMI +- * pending in paca. Hence only clear PMI pending if it was +- * set. +- * +- * If a PMI is pending, then MSR[EE] must be disabled (because +- * the masked PMI handler disabling EE). So it is safe to +- * call clear_pmi_irq_pending(). +- */ +- if (pmi_irq_pending()) +- clear_pmi_irq_pending(); +- } else +- WARN_ON(pmi_irq_pending()); ++ if (pmi_irq_pending()) ++ clear_pmi_irq_pending(); + + val = mmcra = cpuhw->mmcr.mmcra; + +-- +2.35.1 + diff --git a/queue-5.10/powerpc-spufs-fix-refcount-leak-in-spufs_init_isolat.patch b/queue-5.10/powerpc-spufs-fix-refcount-leak-in-spufs_init_isolat.patch new file mode 100644 index 00000000000..29ad3b16435 --- /dev/null +++ b/queue-5.10/powerpc-spufs-fix-refcount-leak-in-spufs_init_isolat.patch @@ -0,0 +1,38 @@ +From 00b06387c77e19ccdca6895284be149764e4d042 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 3 Jun 2022 16:15:42 +0400 +Subject: powerpc/spufs: Fix refcount leak in spufs_init_isolated_loader + +From: Miaoqian Lin + +[ Upstream commit 6ac059dacffa8ab2f7798f20e4bd3333890c541c ] + +of_find_node_by_path() returns remote device nodepointer with +refcount incremented, we should use of_node_put() on it when done. +Add missing of_node_put() to avoid refcount leak. + +Fixes: 0afacde3df4c ("[POWERPC] spufs: allow isolated mode apps by starting the SPE loader") +Signed-off-by: Miaoqian Lin +Acked-by: Arnd Bergmann +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20220603121543.22884-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/platforms/cell/spufs/inode.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c +index 25390569e24c..908e9b8e79fe 100644 +--- a/arch/powerpc/platforms/cell/spufs/inode.c ++++ b/arch/powerpc/platforms/cell/spufs/inode.c +@@ -664,6 +664,7 @@ spufs_init_isolated_loader(void) + return; + + loader = of_get_property(dn, "loader", &size); ++ of_node_put(dn); + if (!loader) + return; + +-- +2.35.1 + diff --git a/queue-5.10/powerpc-xive-fix-refcount-leak-in-xive_get_max_prio.patch b/queue-5.10/powerpc-xive-fix-refcount-leak-in-xive_get_max_prio.patch new file mode 100644 index 00000000000..74870963a06 --- /dev/null +++ b/queue-5.10/powerpc-xive-fix-refcount-leak-in-xive_get_max_prio.patch @@ -0,0 +1,37 @@ +From 1b0d8005f649e7e0bd3b31749b243b8c147555f3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 5 Jun 2022 09:32:23 +0400 +Subject: powerpc/xive: Fix refcount leak in xive_get_max_prio + +From: Miaoqian Lin + +[ Upstream commit 255b650cbec6849443ce2e0cdd187fd5e61c218c ] + +of_find_node_by_path() returns a node pointer with +refcount incremented, we should use of_node_put() on it when done. +Add missing of_node_put() to avoid refcount leak. + +Fixes: eac1e731b59e ("powerpc/xive: guest exploitation of the XIVE interrupt controller") +Signed-off-by: Miaoqian Lin +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20220605053225.56125-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/sysdev/xive/spapr.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/powerpc/sysdev/xive/spapr.c b/arch/powerpc/sysdev/xive/spapr.c +index b57eeaff7bb3..38e8b9896174 100644 +--- a/arch/powerpc/sysdev/xive/spapr.c ++++ b/arch/powerpc/sysdev/xive/spapr.c +@@ -710,6 +710,7 @@ static bool xive_get_max_prio(u8 *max_prio) + } + + reg = of_get_property(rootdn, "ibm,plat-res-int-priorities", &len); ++ of_node_put(rootdn); + if (!reg) { + pr_err("Failed to read 'ibm,plat-res-int-priorities' property\n"); + return false; +-- +2.35.1 + diff --git a/queue-5.10/profiling-fix-shift-too-large-makes-kernel-panic.patch b/queue-5.10/profiling-fix-shift-too-large-makes-kernel-panic.patch new file mode 100644 index 00000000000..c093528e105 --- /dev/null +++ b/queue-5.10/profiling-fix-shift-too-large-makes-kernel-panic.patch @@ -0,0 +1,91 @@ +From 9bfcbfe54ff37f981b2037e145221621826630d4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 31 May 2022 09:28:54 +0800 +Subject: profiling: fix shift too large makes kernel panic + +From: Chen Zhongjin + +[ Upstream commit 0fe6ee8f123a4dfb529a5aff07536bb481f34043 ] + +2d186afd04d6 ("profiling: fix shift-out-of-bounds bugs") limits shift +value by [0, BITS_PER_LONG -1], which means [0, 63]. + +However, syzbot found that the max shift value should be the bit number of +(_etext - _stext). If shift is outside of this, the "buffer_bytes" will +be zero and will cause kzalloc(0). Then the kernel panics due to +dereferencing the returned pointer 16. + +This can be easily reproduced by passing a large number like 60 to enable +profiling and then run readprofile. + +LOGS: + BUG: kernel NULL pointer dereference, address: 0000000000000010 + #PF: supervisor write access in kernel mode + #PF: error_code(0x0002) - not-present page + PGD 6148067 P4D 6148067 PUD 6142067 PMD 0 + PREEMPT SMP + CPU: 4 PID: 184 Comm: readprofile Not tainted 5.18.0+ #162 + Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.15.0-0-g2dd4b9b3f840-prebuilt.qemu.org 04/01/2014 + RIP: 0010:read_profile+0x104/0x220 + RSP: 0018:ffffc900006fbe80 EFLAGS: 00000202 + RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000 + RDX: ffff888006150000 RSI: 0000000000000001 RDI: ffffffff82aba4a0 + RBP: 000000000188bb60 R08: 0000000000000010 R09: ffff888006151000 + R10: 0000000000000000 R11: 0000000000000000 R12: ffffffff82aba4a0 + R13: 0000000000000000 R14: ffffc900006fbf08 R15: 0000000000020c30 + FS: 000000000188a8c0(0000) GS:ffff88803ed00000(0000) knlGS:0000000000000000 + CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 + CR2: 0000000000000010 CR3: 0000000006144000 CR4: 00000000000006e0 + Call Trace: + + proc_reg_read+0x56/0x70 + vfs_read+0x9a/0x1b0 + ksys_read+0xa1/0xe0 + ? fpregs_assert_state_consistent+0x1e/0x40 + do_syscall_64+0x3a/0x80 + entry_SYSCALL_64_after_hwframe+0x46/0xb0 + RIP: 0033:0x4d4b4e + RSP: 002b:00007ffebb668d58 EFLAGS: 00000246 ORIG_RAX: 0000000000000000 + RAX: ffffffffffffffda RBX: 000000000188a8a0 RCX: 00000000004d4b4e + RDX: 0000000000000400 RSI: 000000000188bb60 RDI: 0000000000000003 + RBP: 0000000000000003 R08: 000000000000006e R09: 0000000000000000 + R10: 0000000000000041 R11: 0000000000000246 R12: 000000000188bb60 + R13: 0000000000000400 R14: 0000000000000000 R15: 000000000188bb60 + + Modules linked in: + CR2: 0000000000000010 +Killed + ---[ end trace 0000000000000000 ]--- + +Check prof_len in profile_init() to prevent it be zero. + +Link: https://lkml.kernel.org/r/20220531012854.229439-1-chenzhongjin@huawei.com +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Signed-off-by: Chen Zhongjin +Signed-off-by: Andrew Morton +Signed-off-by: Sasha Levin +--- + kernel/profile.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/kernel/profile.c b/kernel/profile.c +index b47fe52f0ade..737b1c704aa8 100644 +--- a/kernel/profile.c ++++ b/kernel/profile.c +@@ -109,6 +109,13 @@ int __ref profile_init(void) + + /* only text is profiled */ + prof_len = (_etext - _stext) >> prof_shift; ++ ++ if (!prof_len) { ++ pr_warn("profiling shift: %u too large\n", prof_shift); ++ prof_on = 0; ++ return -EINVAL; ++ } ++ + buffer_bytes = prof_len*sizeof(atomic_t); + + if (!alloc_cpumask_var(&prof_cpu_mask, GFP_KERNEL)) +-- +2.35.1 + diff --git a/queue-5.10/pwm-ab8500-explicitly-allocate-pwm-chip-base-dynamic.patch b/queue-5.10/pwm-ab8500-explicitly-allocate-pwm-chip-base-dynamic.patch new file mode 100644 index 00000000000..2f6e5761657 --- /dev/null +++ b/queue-5.10/pwm-ab8500-explicitly-allocate-pwm-chip-base-dynamic.patch @@ -0,0 +1,41 @@ +From f3aa3733ee2ad272242440d575e3f747606d3779 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 6 Nov 2020 18:15:47 +0100 +Subject: pwm: ab8500: Explicitly allocate pwm chip base dynamically +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit 5e5da1e9fbeecdf9d7a7495d7ae2a37453e38499 ] + +The ab8500 driver is the last one which doesn't (explicitly) use dynamic +allocation of the pwm id. Looking through the kernel sources I didn't +find a place that relies on this id. And with the device probed from +device tree pdev->id is -1 anyhow; making this explicit looks +beneficial, too. + +Signed-off-by: Uwe Kleine-König +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/pwm/pwm-ab8500.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/pwm/pwm-ab8500.c b/drivers/pwm/pwm-ab8500.c +index fdf3964db4a6..2023592a4a54 100644 +--- a/drivers/pwm/pwm-ab8500.c ++++ b/drivers/pwm/pwm-ab8500.c +@@ -101,7 +101,7 @@ static int ab8500_pwm_probe(struct platform_device *pdev) + + ab8500->chip.dev = &pdev->dev; + ab8500->chip.ops = &ab8500_pwm_ops; +- ab8500->chip.base = pdev->id; ++ ab8500->chip.base = -1; + ab8500->chip.npwm = 1; + + err = pwmchip_add(&ab8500->chip); +-- +2.35.1 + diff --git a/queue-5.10/pwm-lpc18xx-sct-convert-to-devm_platform_ioremap_res.patch b/queue-5.10/pwm-lpc18xx-sct-convert-to-devm_platform_ioremap_res.patch new file mode 100644 index 00000000000..45500051816 --- /dev/null +++ b/queue-5.10/pwm-lpc18xx-sct-convert-to-devm_platform_ioremap_res.patch @@ -0,0 +1,47 @@ +From d64c9da65e1d3ca1b1b7996ec2e0c22b8731f04c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 29 Dec 2019 08:06:07 +0000 +Subject: pwm: lpc18xx-sct: Convert to devm_platform_ioremap_resource() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Yangtao Li + +[ Upstream commit 74ec20a4e6a064ac2cdfb577c115cb948b307f0f ] + +Use devm_platform_ioremap_resource() to simplify code. + +Signed-off-by: Yangtao Li +Reviewed-by: Uwe Kleine-König +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/pwm/pwm-lpc18xx-sct.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/drivers/pwm/pwm-lpc18xx-sct.c b/drivers/pwm/pwm-lpc18xx-sct.c +index 9b15b6a79082..f32a9e0692ad 100644 +--- a/drivers/pwm/pwm-lpc18xx-sct.c ++++ b/drivers/pwm/pwm-lpc18xx-sct.c +@@ -325,7 +325,6 @@ static int lpc18xx_pwm_probe(struct platform_device *pdev) + { + struct lpc18xx_pwm_chip *lpc18xx_pwm; + struct pwm_device *pwm; +- struct resource *res; + int ret, i; + u64 val; + +@@ -336,8 +335,7 @@ static int lpc18xx_pwm_probe(struct platform_device *pdev) + + lpc18xx_pwm->dev = &pdev->dev; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- lpc18xx_pwm->base = devm_ioremap_resource(&pdev->dev, res); ++ lpc18xx_pwm->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(lpc18xx_pwm->base)) + return PTR_ERR(lpc18xx_pwm->base); + +-- +2.35.1 + diff --git a/queue-5.10/pwm-sifive-don-t-check-the-return-code-of-pwmchip_re.patch b/queue-5.10/pwm-sifive-don-t-check-the-return-code-of-pwmchip_re.patch new file mode 100644 index 00000000000..ab3ba6fed2d --- /dev/null +++ b/queue-5.10/pwm-sifive-don-t-check-the-return-code-of-pwmchip_re.patch @@ -0,0 +1,52 @@ +From a9424c1901b645144db7686d0ccd74b70ca7576a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 7 Jul 2021 18:28:33 +0200 +Subject: pwm: sifive: Don't check the return code of pwmchip_remove() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit ceb2c2842f3664dcc4e6d8cb317e1e83bb81b1e5 ] + +pwmchip_remove() returns always 0. Don't use the value to make it +possible to eventually change the function to return void. Also the +driver core ignores the return value of pwm_sifive_remove(). + +Signed-off-by: Uwe Kleine-König +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/pwm/pwm-sifive.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/pwm/pwm-sifive.c b/drivers/pwm/pwm-sifive.c +index 2485fbaaead2..8c6de4f41076 100644 +--- a/drivers/pwm/pwm-sifive.c ++++ b/drivers/pwm/pwm-sifive.c +@@ -296,7 +296,7 @@ static int pwm_sifive_remove(struct platform_device *dev) + struct pwm_sifive_ddata *ddata = platform_get_drvdata(dev); + bool is_enabled = false; + struct pwm_device *pwm; +- int ret, ch; ++ int ch; + + for (ch = 0; ch < ddata->chip.npwm; ch++) { + pwm = &ddata->chip.pwms[ch]; +@@ -309,10 +309,10 @@ static int pwm_sifive_remove(struct platform_device *dev) + clk_disable(ddata->clk); + + clk_disable_unprepare(ddata->clk); +- ret = pwmchip_remove(&ddata->chip); ++ pwmchip_remove(&ddata->chip); + clk_notifier_unregister(ddata->clk, &ddata->notifier); + +- return ret; ++ return 0; + } + + static const struct of_device_id pwm_sifive_of_match[] = { +-- +2.35.1 + diff --git a/queue-5.10/pwm-sifive-ensure-the-clk-is-enabled-exactly-once-pe.patch b/queue-5.10/pwm-sifive-ensure-the-clk-is-enabled-exactly-once-pe.patch new file mode 100644 index 00000000000..98511346b81 --- /dev/null +++ b/queue-5.10/pwm-sifive-ensure-the-clk-is-enabled-exactly-once-pe.patch @@ -0,0 +1,116 @@ +From 158e4adeb675da673db4f78c85e40b87c73cdd54 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jul 2022 12:31:28 +0200 +Subject: pwm: sifive: Ensure the clk is enabled exactly once per running PWM +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit ace41d7564e655c39f709a78c035188a460c7cbd ] + +.apply() assumes the clk to be for a given PWM iff the PWM is enabled. +So make sure this is the case when .probe() completes. And in .remove() +disable the according number of times. + +This fixes a clk enable/disable imbalance, if some PWMs are already running +at probe time. + +Fixes: 9e37a53eb051 (pwm: sifive: Add a driver for SiFive SoC PWM) +Signed-off-by: Uwe Kleine-König +Tested-by: Emil Renner Berthing +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/pwm/pwm-sifive.c | 46 ++++++++++++++++++++++++++++++++-------- + 1 file changed, 37 insertions(+), 9 deletions(-) + +diff --git a/drivers/pwm/pwm-sifive.c b/drivers/pwm/pwm-sifive.c +index cc32f7ce09a6..1def1bc59240 100644 +--- a/drivers/pwm/pwm-sifive.c ++++ b/drivers/pwm/pwm-sifive.c +@@ -230,6 +230,8 @@ static int pwm_sifive_probe(struct platform_device *pdev) + struct pwm_chip *chip; + struct resource *res; + int ret; ++ u32 val; ++ unsigned int enabled_pwms = 0, enabled_clks = 1; + + ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL); + if (!ddata) +@@ -260,6 +262,33 @@ static int pwm_sifive_probe(struct platform_device *pdev) + return ret; + } + ++ val = readl(ddata->regs + PWM_SIFIVE_PWMCFG); ++ if (val & PWM_SIFIVE_PWMCFG_EN_ALWAYS) { ++ unsigned int i; ++ ++ for (i = 0; i < chip->npwm; ++i) { ++ val = readl(ddata->regs + PWM_SIFIVE_PWMCMP(i)); ++ if (val > 0) ++ ++enabled_pwms; ++ } ++ } ++ ++ /* The clk should be on once for each running PWM. */ ++ if (enabled_pwms) { ++ while (enabled_clks < enabled_pwms) { ++ /* This is not expected to fail as the clk is already on */ ++ ret = clk_enable(ddata->clk); ++ if (unlikely(ret)) { ++ dev_err_probe(dev, ret, "Failed to enable clk\n"); ++ goto disable_clk; ++ } ++ ++enabled_clks; ++ } ++ } else { ++ clk_disable(ddata->clk); ++ enabled_clks = 0; ++ } ++ + /* Watch for changes to underlying clock frequency */ + ddata->notifier.notifier_call = pwm_sifive_clock_notifier; + ret = clk_notifier_register(ddata->clk, &ddata->notifier); +@@ -282,7 +311,11 @@ static int pwm_sifive_probe(struct platform_device *pdev) + unregister_clk: + clk_notifier_unregister(ddata->clk, &ddata->notifier); + disable_clk: +- clk_disable_unprepare(ddata->clk); ++ while (enabled_clks) { ++ clk_disable(ddata->clk); ++ --enabled_clks; ++ } ++ clk_unprepare(ddata->clk); + + return ret; + } +@@ -290,21 +323,16 @@ static int pwm_sifive_probe(struct platform_device *pdev) + static int pwm_sifive_remove(struct platform_device *dev) + { + struct pwm_sifive_ddata *ddata = platform_get_drvdata(dev); +- bool is_enabled = false; + struct pwm_device *pwm; + int ch; + + for (ch = 0; ch < ddata->chip.npwm; ch++) { + pwm = &ddata->chip.pwms[ch]; +- if (pwm->state.enabled) { +- is_enabled = true; +- break; +- } ++ if (pwm->state.enabled) ++ clk_disable(ddata->clk); + } +- if (is_enabled) +- clk_disable(ddata->clk); + +- clk_disable_unprepare(ddata->clk); ++ clk_unprepare(ddata->clk); + pwmchip_remove(&ddata->chip); + clk_notifier_unregister(ddata->clk, &ddata->notifier); + +-- +2.35.1 + diff --git a/queue-5.10/pwm-sifive-shut-down-hardware-only-after-pwmchip_rem.patch b/queue-5.10/pwm-sifive-shut-down-hardware-only-after-pwmchip_rem.patch new file mode 100644 index 00000000000..3480bafd09e --- /dev/null +++ b/queue-5.10/pwm-sifive-shut-down-hardware-only-after-pwmchip_rem.patch @@ -0,0 +1,50 @@ +From 275b0c7086d990d329cb874849636ba74828dc17 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jul 2022 12:31:29 +0200 +Subject: pwm: sifive: Shut down hardware only after pwmchip_remove() completed +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit 2375e964d541bb09158cd2dff67b5d74e8de61cd ] + +The PWMs are expected to be functional until pwmchip_remove() is called. +So disable the clks only afterwards. + +Fixes: 9e37a53eb051 ("pwm: sifive: Add a driver for SiFive SoC PWM") +Signed-off-by: Uwe Kleine-König +Tested-by: Emil Renner Berthing +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/pwm/pwm-sifive.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/pwm/pwm-sifive.c b/drivers/pwm/pwm-sifive.c +index 1def1bc59240..9cc0612f0849 100644 +--- a/drivers/pwm/pwm-sifive.c ++++ b/drivers/pwm/pwm-sifive.c +@@ -326,6 +326,9 @@ static int pwm_sifive_remove(struct platform_device *dev) + struct pwm_device *pwm; + int ch; + ++ pwmchip_remove(&ddata->chip); ++ clk_notifier_unregister(ddata->clk, &ddata->notifier); ++ + for (ch = 0; ch < ddata->chip.npwm; ch++) { + pwm = &ddata->chip.pwms[ch]; + if (pwm->state.enabled) +@@ -333,8 +336,6 @@ static int pwm_sifive_remove(struct platform_device *dev) + } + + clk_unprepare(ddata->clk); +- pwmchip_remove(&ddata->chip); +- clk_notifier_unregister(ddata->clk, &ddata->notifier); + + return 0; + } +-- +2.35.1 + diff --git a/queue-5.10/pwm-sifive-simplify-offset-calculation-for-pwmcmp-re.patch b/queue-5.10/pwm-sifive-simplify-offset-calculation-for-pwmcmp-re.patch new file mode 100644 index 00000000000..14d4f409253 --- /dev/null +++ b/queue-5.10/pwm-sifive-simplify-offset-calculation-for-pwmcmp-re.patch @@ -0,0 +1,74 @@ +From 6b4ba25fab07fb031bc674a9e2a5dfe79d23f6d8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jul 2022 12:31:23 +0200 +Subject: pwm: sifive: Simplify offset calculation for PWMCMP registers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit 20550a61880fc55e68a0d290ad195b74729c0e7b ] + +Instead of explicitly using PWM_SIFIVE_PWMCMP0 + pwm->hwpwm * +PWM_SIFIVE_SIZE_PWMCMP for each access to one of the PWMCMP registers, +introduce a macro that takes the hwpwm id as parameter. + +For the register definition using a plain 4 instead of the cpp constant +PWM_SIFIVE_SIZE_PWMCMP is easier to read, so define the offset macro +without the constant. The latter can then be dropped as there are no +users left. + +Signed-off-by: Uwe Kleine-König +Tested-by: Emil Renner Berthing +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/pwm/pwm-sifive.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +diff --git a/drivers/pwm/pwm-sifive.c b/drivers/pwm/pwm-sifive.c +index 8c6de4f41076..cc32f7ce09a6 100644 +--- a/drivers/pwm/pwm-sifive.c ++++ b/drivers/pwm/pwm-sifive.c +@@ -23,7 +23,7 @@ + #define PWM_SIFIVE_PWMCFG 0x0 + #define PWM_SIFIVE_PWMCOUNT 0x8 + #define PWM_SIFIVE_PWMS 0x10 +-#define PWM_SIFIVE_PWMCMP0 0x20 ++#define PWM_SIFIVE_PWMCMP(i) (0x20 + 4 * (i)) + + /* PWMCFG fields */ + #define PWM_SIFIVE_PWMCFG_SCALE GENMASK(3, 0) +@@ -36,8 +36,6 @@ + #define PWM_SIFIVE_PWMCFG_GANG BIT(24) + #define PWM_SIFIVE_PWMCFG_IP BIT(28) + +-/* PWM_SIFIVE_SIZE_PWMCMP is used to calculate offset for pwmcmpX registers */ +-#define PWM_SIFIVE_SIZE_PWMCMP 4 + #define PWM_SIFIVE_CMPWIDTH 16 + #define PWM_SIFIVE_DEFAULT_PERIOD 10000000 + +@@ -112,8 +110,7 @@ static void pwm_sifive_get_state(struct pwm_chip *chip, struct pwm_device *pwm, + struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip); + u32 duty, val; + +- duty = readl(ddata->regs + PWM_SIFIVE_PWMCMP0 + +- pwm->hwpwm * PWM_SIFIVE_SIZE_PWMCMP); ++ duty = readl(ddata->regs + PWM_SIFIVE_PWMCMP(pwm->hwpwm)); + + state->enabled = duty > 0; + +@@ -194,8 +191,7 @@ static int pwm_sifive_apply(struct pwm_chip *chip, struct pwm_device *pwm, + pwm_sifive_update_clock(ddata, clk_get_rate(ddata->clk)); + } + +- writel(frac, ddata->regs + PWM_SIFIVE_PWMCMP0 + +- pwm->hwpwm * PWM_SIFIVE_SIZE_PWMCMP); ++ writel(frac, ddata->regs + PWM_SIFIVE_PWMCMP(pwm->hwpwm)); + + if (state->enabled != enabled) + pwm_sifive_enable(chip, state->enabled); +-- +2.35.1 + diff --git a/queue-5.10/rdma-hfi1-fix-potential-memory-leak-in-setup_base_ct.patch b/queue-5.10/rdma-hfi1-fix-potential-memory-leak-in-setup_base_ct.patch new file mode 100644 index 00000000000..77a2f8083c4 --- /dev/null +++ b/queue-5.10/rdma-hfi1-fix-potential-memory-leak-in-setup_base_ct.patch @@ -0,0 +1,45 @@ +From 467fefc9210de9ef6a2b82db73f7bef9a82af388 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jul 2022 15:07:18 +0800 +Subject: RDMA/hfi1: fix potential memory leak in setup_base_ctxt() + +From: Jianglei Nie + +[ Upstream commit aa2a1df3a2c85f855af7d54466ac10bd48645d63 ] + +setup_base_ctxt() allocates a memory chunk for uctxt->groups with +hfi1_alloc_ctxt_rcv_groups(). When init_user_ctxt() fails, uctxt->groups +is not released, which will lead to a memory leak. + +We should release the uctxt->groups with hfi1_free_ctxt_rcv_groups() +when init_user_ctxt() fails. + +Fixes: e87473bc1b6c ("IB/hfi1: Only set fd pointer when base context is completely initialized") +Link: https://lore.kernel.org/r/20220711070718.2318320-1-niejianglei2021@163.com +Signed-off-by: Jianglei Nie +Acked-by: Dennis Dalessandro +Signed-off-by: Leon Romanovsky +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/hfi1/file_ops.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c +index cfc2110fc38a..d84b1098762c 100644 +--- a/drivers/infiniband/hw/hfi1/file_ops.c ++++ b/drivers/infiniband/hw/hfi1/file_ops.c +@@ -1220,8 +1220,10 @@ static int setup_base_ctxt(struct hfi1_filedata *fd, + goto done; + + ret = init_user_ctxt(fd, uctxt); +- if (ret) ++ if (ret) { ++ hfi1_free_ctxt_rcv_groups(uctxt); + goto done; ++ } + + user_init(uctxt); + +-- +2.35.1 + diff --git a/queue-5.10/rdma-hns-fix-incorrect-clearing-of-interrupt-status-.patch b/queue-5.10/rdma-hns-fix-incorrect-clearing-of-interrupt-status-.patch new file mode 100644 index 00000000000..e5b8e495bb2 --- /dev/null +++ b/queue-5.10/rdma-hns-fix-incorrect-clearing-of-interrupt-status-.patch @@ -0,0 +1,41 @@ +From d9664305ada7296d5fe5f68f2f8e13c986387f3d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jul 2022 21:43:51 +0800 +Subject: RDMA/hns: Fix incorrect clearing of interrupt status register + +From: Haoyue Xu + +[ Upstream commit ecb4db5c3590aa956b4b2c352081a5b632d1f9f9 ] + +The driver will clear all the interrupts in the same area +when the driver handles the interrupt of type AEQ overflow. +It should only set the interrupt status bit of type AEQ overflow. + +Fixes: a5073d6054f7 ("RDMA/hns: Add eq support of hip08") +Link: https://lore.kernel.org/r/20220714134353.16700-4-liangwenpeng@huawei.com +Signed-off-by: Haoyue Xu +Signed-off-by: Wenpeng Liang +Signed-off-by: Leon Romanovsky +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +index abe882ec1bae..6dab03b7aca8 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c ++++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +@@ -5642,8 +5642,8 @@ static irqreturn_t hns_roce_v2_msix_interrupt_abn(int irq, void *dev_id) + + dev_err(dev, "AEQ overflow!\n"); + +- int_st |= 1 << HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S; +- roce_write(hr_dev, ROCEE_VF_ABN_INT_ST_REG, int_st); ++ roce_write(hr_dev, ROCEE_VF_ABN_INT_ST_REG, ++ 1 << HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S); + + /* Set reset level for reset_event() */ + if (ops->set_default_reset_request) +-- +2.35.1 + diff --git a/queue-5.10/rdma-mlx5-add-missing-check-for-return-value-in-get-.patch b/queue-5.10/rdma-mlx5-add-missing-check-for-return-value-in-get-.patch new file mode 100644 index 00000000000..8766863512c --- /dev/null +++ b/queue-5.10/rdma-mlx5-add-missing-check-for-return-value-in-get-.patch @@ -0,0 +1,46 @@ +From dee72002da5c95e6c16d768b77ab9df398db3b2b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 31 Jul 2022 11:29:08 +0300 +Subject: RDMA/mlx5: Add missing check for return value in get namespace flow + +From: Maor Gottlieb + +[ Upstream commit c9776457bd5eaad4ce4ecb17af8d8f3cc6957c0b ] + +Add missing check for return value when calling to +mlx5_ib_ft_type_to_namespace, even though it can't really fail in this +specific call. + +Fixes: 52438be44112 ("RDMA/mlx5: Allow inserting a steering rule to the FDB") +Link: https://lore.kernel.org/r/7b9ceda217d9368a51dc47a46b769bad4af9ac92.1659256069.git.leonro@nvidia.com +Reviewed-by: Itay Aveksis +Signed-off-by: Maor Gottlieb +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/mlx5/fs.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/drivers/infiniband/hw/mlx5/fs.c b/drivers/infiniband/hw/mlx5/fs.c +index b3391ecedda7..0404e6f22d37 100644 +--- a/drivers/infiniband/hw/mlx5/fs.c ++++ b/drivers/infiniband/hw/mlx5/fs.c +@@ -2081,12 +2081,10 @@ static int mlx5_ib_matcher_ns(struct uverbs_attr_bundle *attrs, + if (err) + return err; + +- if (flags) { +- mlx5_ib_ft_type_to_namespace( ++ if (flags) ++ return mlx5_ib_ft_type_to_namespace( + MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX, + &obj->ns_type); +- return 0; +- } + } + + obj->ns_type = MLX5_FLOW_NAMESPACE_BYPASS; +-- +2.35.1 + diff --git a/queue-5.10/rdma-qedr-fix-potential-memory-leak-in-__qedr_alloc_.patch b/queue-5.10/rdma-qedr-fix-potential-memory-leak-in-__qedr_alloc_.patch new file mode 100644 index 00000000000..b239c8db929 --- /dev/null +++ b/queue-5.10/rdma-qedr-fix-potential-memory-leak-in-__qedr_alloc_.patch @@ -0,0 +1,67 @@ +From f34d15ecdd509212ef7a14b82a675583f33a8b10 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jul 2022 14:15:05 +0800 +Subject: RDMA/qedr: Fix potential memory leak in __qedr_alloc_mr() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Jianglei Nie + +[ Upstream commit b3236a64ddd125a455ef5b5316c1b9051b732974 ] + +__qedr_alloc_mr() allocates a memory chunk for "mr->info.pbl_table" with +init_mr_info(). When rdma_alloc_tid() and rdma_register_tid() fail, "mr" +is released while "mr->info.pbl_table" is not released, which will lead +to a memory leak. + +We should release the "mr->info.pbl_table" with qedr_free_pbl() when error +occurs to fix the memory leak. + +Fixes: e0290cce6ac0 ("qedr: Add support for memory registeration verbs") +Link: https://lore.kernel.org/r/20220714061505.2342759-1-niejianglei2021@163.com +Signed-off-by: Jianglei Nie +Acked-by: Michal Kalderon  +Signed-off-by: Leon Romanovsky +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/qedr/verbs.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c +index bffacb47ea0e..3543b9af10b7 100644 +--- a/drivers/infiniband/hw/qedr/verbs.c ++++ b/drivers/infiniband/hw/qedr/verbs.c +@@ -3093,7 +3093,7 @@ static struct qedr_mr *__qedr_alloc_mr(struct ib_pd *ibpd, + else + DP_ERR(dev, "roce alloc tid returned error %d\n", rc); + +- goto err0; ++ goto err1; + } + + /* Index only, 18 bit long, lkey = itid << 8 | key */ +@@ -3117,7 +3117,7 @@ static struct qedr_mr *__qedr_alloc_mr(struct ib_pd *ibpd, + rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr); + if (rc) { + DP_ERR(dev, "roce register tid returned an error %d\n", rc); +- goto err1; ++ goto err2; + } + + mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key; +@@ -3126,8 +3126,10 @@ static struct qedr_mr *__qedr_alloc_mr(struct ib_pd *ibpd, + DP_DEBUG(dev, QEDR_MSG_MR, "alloc frmr: %x\n", mr->ibmr.lkey); + return mr; + +-err1: ++err2: + dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid); ++err1: ++ qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table); + err0: + kfree(mr); + return ERR_PTR(rc); +-- +2.35.1 + diff --git a/queue-5.10/rdma-qedr-improve-error-logs-for-rdma_alloc_tid-erro.patch b/queue-5.10/rdma-qedr-improve-error-logs-for-rdma_alloc_tid-erro.patch new file mode 100644 index 00000000000..0524c499c04 --- /dev/null +++ b/queue-5.10/rdma-qedr-improve-error-logs-for-rdma_alloc_tid-erro.patch @@ -0,0 +1,68 @@ +From 912b7bdd501d352bc16b2e2689febc275bd0f74c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 29 Jul 2021 18:17:32 +0300 +Subject: RDMA/qedr: Improve error logs for rdma_alloc_tid error return + +From: Prabhakar Kushwaha + +[ Upstream commit 0050a57638ca4d681ff92bee55246bf64a6afe54 ] + +Use -EINVAL return type to identify whether error is returned because of +"Out of MR resources" or any other error types. + +Link: https://lore.kernel.org/r/20210729151732.30995-2-pkushwaha@marvell.com +Signed-off-by: Shai Malin +Signed-off-by: Ariel Elior +Signed-off-by: Prabhakar Kushwaha +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/qedr/verbs.c | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c +index f7b97b8e81a4..bffacb47ea0e 100644 +--- a/drivers/infiniband/hw/qedr/verbs.c ++++ b/drivers/infiniband/hw/qedr/verbs.c +@@ -2989,7 +2989,11 @@ struct ib_mr *qedr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len, + + rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid); + if (rc) { +- DP_ERR(dev, "roce alloc tid returned an error %d\n", rc); ++ if (rc == -EINVAL) ++ DP_ERR(dev, "Out of MR resources\n"); ++ else ++ DP_ERR(dev, "roce alloc tid returned error %d\n", rc); ++ + goto err1; + } + +@@ -3084,7 +3088,11 @@ static struct qedr_mr *__qedr_alloc_mr(struct ib_pd *ibpd, + + rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid); + if (rc) { +- DP_ERR(dev, "roce alloc tid returned an error %d\n", rc); ++ if (rc == -EINVAL) ++ DP_ERR(dev, "Out of MR resources\n"); ++ else ++ DP_ERR(dev, "roce alloc tid returned error %d\n", rc); ++ + goto err0; + } + +@@ -3214,7 +3222,11 @@ struct ib_mr *qedr_get_dma_mr(struct ib_pd *ibpd, int acc) + + rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid); + if (rc) { +- DP_ERR(dev, "roce alloc tid returned an error %d\n", rc); ++ if (rc == -EINVAL) ++ DP_ERR(dev, "Out of MR resources\n"); ++ else ++ DP_ERR(dev, "roce alloc tid returned error %d\n", rc); ++ + goto err1; + } + +-- +2.35.1 + diff --git a/queue-5.10/rdma-rtrs-avoid-wtautological-constant-out-of-range-.patch b/queue-5.10/rdma-rtrs-avoid-wtautological-constant-out-of-range-.patch new file mode 100644 index 00000000000..a031a40b850 --- /dev/null +++ b/queue-5.10/rdma-rtrs-avoid-wtautological-constant-out-of-range-.patch @@ -0,0 +1,60 @@ +From d5218245bf30bc0c2607fa73e0a73f5a40b271e3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 31 May 2021 14:28:35 +0200 +Subject: RDMA/rtrs: Avoid Wtautological-constant-out-of-range-compare + +From: Jack Wang + +[ Upstream commit 0e8558476faf02ec51256cad9c487c93c346198c ] + +drivers/infiniband/ulp/rtrs/rtrs-clt.c:1786:19: warning: result of comparison of +constant 'MAX_SESS_QUEUE_DEPTH' (65536) with expression of type 'u16' +(aka 'unsigned short') is always false [-Wtautological-constant-out-of-range-compare] + +To fix it, limit MAX_SESS_QUEUE_DEPTH to u16 max, which is 65535, and +drop the check in rtrs-clt, as it's the type u16 max. + +Link: https://lore.kernel.org/r/20210531122835.58329-1-jinpu.wang@ionos.com +Signed-off-by: Jack Wang +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-clt.c | 5 ----- + drivers/infiniband/ulp/rtrs/rtrs-pri.h | 4 ++-- + 2 files changed, 2 insertions(+), 7 deletions(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c +index 13634eda833d..5c39e4c4bef7 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c +@@ -1728,11 +1728,6 @@ static int rtrs_rdma_conn_established(struct rtrs_clt_con *con, + if (con->c.cid == 0) { + queue_depth = le16_to_cpu(msg->queue_depth); + +- if (queue_depth > MAX_SESS_QUEUE_DEPTH) { +- rtrs_err(clt, "Invalid RTRS message: queue=%d\n", +- queue_depth); +- return -ECONNRESET; +- } + if (sess->queue_depth > 0 && queue_depth != sess->queue_depth) { + rtrs_err(clt, "Error: queue depth changed\n"); + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-pri.h b/drivers/infiniband/ulp/rtrs/rtrs-pri.h +index 333de9d52172..77e98ff9008a 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-pri.h ++++ b/drivers/infiniband/ulp/rtrs/rtrs-pri.h +@@ -53,9 +53,9 @@ enum { + * But mempool_create, create_qp and ib_post_send fail with + * "cannot allocate memory" error if sess_queue_depth is too big. + * Therefore the pratical max value of sess_queue_depth is +- * somewhere between 1 and 65536 and it depends on the system. ++ * somewhere between 1 and 65534 and it depends on the system. + */ +- MAX_SESS_QUEUE_DEPTH = 65536, ++ MAX_SESS_QUEUE_DEPTH = 65535, + MIN_CHUNK_SIZE = 8192, + + RTRS_HB_INTERVAL_MS = 5000, +-- +2.35.1 + diff --git a/queue-5.10/rdma-rtrs-define-min_chunk_size.patch b/queue-5.10/rdma-rtrs-define-min_chunk_size.patch new file mode 100644 index 00000000000..6582a74232f --- /dev/null +++ b/queue-5.10/rdma-rtrs-define-min_chunk_size.patch @@ -0,0 +1,53 @@ +From 84cd54691015667e459ba322bdba94ac596eb0ba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 28 May 2021 13:30:04 +0200 +Subject: RDMA/rtrs: Define MIN_CHUNK_SIZE + +From: Gioh Kim + +[ Upstream commit 3f3d0eabc14b6ea1fcbe85a60ee9d44e2b930b8a ] + +Define MIN_CHUNK_SIZE to replace the hard-coding number. +We need 4k for metadata, so MIN_CHUNK_SIZE should be at least 8k. + +Link: https://lore.kernel.org/r/20210528113018.52290-7-jinpu.wang@ionos.com +Signed-off-by: Gioh Kim +Signed-off-by: Jack Wang +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-pri.h | 1 + + drivers/infiniband/ulp/rtrs/rtrs-srv.c | 4 ++-- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-pri.h b/drivers/infiniband/ulp/rtrs/rtrs-pri.h +index 51c60f542876..333de9d52172 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-pri.h ++++ b/drivers/infiniband/ulp/rtrs/rtrs-pri.h +@@ -56,6 +56,7 @@ enum { + * somewhere between 1 and 65536 and it depends on the system. + */ + MAX_SESS_QUEUE_DEPTH = 65536, ++ MIN_CHUNK_SIZE = 8192, + + RTRS_HB_INTERVAL_MS = 5000, + RTRS_HB_MISSED_MAX = 5, +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +index b033bfa9f383..b152a742cd3c 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +@@ -2193,9 +2193,9 @@ static int check_module_params(void) + sess_queue_depth, 1, MAX_SESS_QUEUE_DEPTH); + return -EINVAL; + } +- if (max_chunk_size < 4096 || !is_power_of_2(max_chunk_size)) { ++ if (max_chunk_size < MIN_CHUNK_SIZE || !is_power_of_2(max_chunk_size)) { + pr_err("Invalid max_chunk_size value %d, has to be >= %d and should be power of two.\n", +- max_chunk_size, 4096); ++ max_chunk_size, MIN_CHUNK_SIZE); + return -EINVAL; + } + +-- +2.35.1 + diff --git a/queue-5.10/rdma-rtrs-srv-fix-modinfo-output-for-stringify.patch b/queue-5.10/rdma-rtrs-srv-fix-modinfo-output-for-stringify.patch new file mode 100644 index 00000000000..61fa6429250 --- /dev/null +++ b/queue-5.10/rdma-rtrs-srv-fix-modinfo-output-for-stringify.patch @@ -0,0 +1,65 @@ +From 60608531e57d92c9a2917f97864694e250a785ea Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Jul 2022 12:31:09 +0200 +Subject: RDMA/rtrs-srv: Fix modinfo output for stringify + +From: Jack Wang + +[ Upstream commit ed6e53820ee4f68ed927de17e5675ff2a07a47e2 ] + +stringify works with define, not enum. + +Fixes: 91fddedd439c ("RDMA/rtrs: private headers with rtrs protocol structs and helpers") +Cc: jinpu.wang@ionos.com +Link: https://lore.kernel.org/r/20220712103113.617754-2-haris.iqbal@ionos.com +Signed-off-by: Jack Wang +Signed-off-by: Md Haris Iqbal +Reviewed-by: Aleksei Marov +Signed-off-by: Leon Romanovsky +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-pri.h | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-pri.h b/drivers/infiniband/ulp/rtrs/rtrs-pri.h +index 77e98ff9008a..c5ca123d52a8 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-pri.h ++++ b/drivers/infiniband/ulp/rtrs/rtrs-pri.h +@@ -23,6 +23,17 @@ + #define RTRS_PROTO_VER_STRING __stringify(RTRS_PROTO_VER_MAJOR) "." \ + __stringify(RTRS_PROTO_VER_MINOR) + ++/* ++ * Max IB immediate data size is 2^28 (MAX_IMM_PAYL_BITS) ++ * and the minimum chunk size is 4096 (2^12). ++ * So the maximum sess_queue_depth is 65536 (2^16) in theory. ++ * But mempool_create, create_qp and ib_post_send fail with ++ * "cannot allocate memory" error if sess_queue_depth is too big. ++ * Therefore the pratical max value of sess_queue_depth is ++ * somewhere between 1 and 65534 and it depends on the system. ++ */ ++#define MAX_SESS_QUEUE_DEPTH 65535 ++ + enum rtrs_imm_const { + MAX_IMM_TYPE_BITS = 4, + MAX_IMM_TYPE_MASK = ((1 << MAX_IMM_TYPE_BITS) - 1), +@@ -46,16 +57,6 @@ enum { + + MAX_PATHS_NUM = 128, + +- /* +- * Max IB immediate data size is 2^28 (MAX_IMM_PAYL_BITS) +- * and the minimum chunk size is 4096 (2^12). +- * So the maximum sess_queue_depth is 65536 (2^16) in theory. +- * But mempool_create, create_qp and ib_post_send fail with +- * "cannot allocate memory" error if sess_queue_depth is too big. +- * Therefore the pratical max value of sess_queue_depth is +- * somewhere between 1 and 65534 and it depends on the system. +- */ +- MAX_SESS_QUEUE_DEPTH = 65535, + MIN_CHUNK_SIZE = 8192, + + RTRS_HB_INTERVAL_MS = 5000, +-- +2.35.1 + diff --git a/queue-5.10/rdma-rxe-fix-error-unwind-in-rxe_create_qp.patch b/queue-5.10/rdma-rxe-fix-error-unwind-in-rxe_create_qp.patch new file mode 100644 index 00000000000..5ae022c722d --- /dev/null +++ b/queue-5.10/rdma-rxe-fix-error-unwind-in-rxe_create_qp.patch @@ -0,0 +1,69 @@ +From 65519be63fd98d9bb7f856aa9a74bea2978da9f2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 31 Jul 2022 02:36:21 -0400 +Subject: RDMA/rxe: Fix error unwind in rxe_create_qp() + +From: Zhu Yanjun + +[ Upstream commit fd5382c5805c4bcb50fd25b7246247d3f7114733 ] + +In the function rxe_create_qp(), rxe_qp_from_init() is called to +initialize qp, internally things like the spin locks are not setup until +rxe_qp_init_req(). + +If an error occures before this point then the unwind will call +rxe_cleanup() and eventually to rxe_qp_do_cleanup()/rxe_cleanup_task() +which will oops when trying to access the uninitialized spinlock. + +Move the spinlock initializations earlier before any failures. + +Fixes: 8700e3e7c485 ("Soft RoCE driver") +Link: https://lore.kernel.org/r/20220731063621.298405-1-yanjun.zhu@linux.dev +Reported-by: syzbot+833061116fa28df97f3b@syzkaller.appspotmail.com +Signed-off-by: Zhu Yanjun +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/sw/rxe/rxe_qp.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c +index a1b79015e6f2..2847ab4d9a5f 100644 +--- a/drivers/infiniband/sw/rxe/rxe_qp.c ++++ b/drivers/infiniband/sw/rxe/rxe_qp.c +@@ -184,6 +184,14 @@ static void rxe_qp_init_misc(struct rxe_dev *rxe, struct rxe_qp *qp, + spin_lock_init(&qp->grp_lock); + spin_lock_init(&qp->state_lock); + ++ spin_lock_init(&qp->req.task.state_lock); ++ spin_lock_init(&qp->resp.task.state_lock); ++ spin_lock_init(&qp->comp.task.state_lock); ++ ++ spin_lock_init(&qp->sq.sq_lock); ++ spin_lock_init(&qp->rq.producer_lock); ++ spin_lock_init(&qp->rq.consumer_lock); ++ + atomic_set(&qp->ssn, 0); + atomic_set(&qp->skb_out, 0); + } +@@ -239,7 +247,6 @@ static int rxe_qp_init_req(struct rxe_dev *rxe, struct rxe_qp *qp, + qp->req.opcode = -1; + qp->comp.opcode = -1; + +- spin_lock_init(&qp->sq.sq_lock); + skb_queue_head_init(&qp->req_pkts); + + rxe_init_task(rxe, &qp->req.task, qp, +@@ -289,9 +296,6 @@ static int rxe_qp_init_resp(struct rxe_dev *rxe, struct rxe_qp *qp, + } + } + +- spin_lock_init(&qp->rq.producer_lock); +- spin_lock_init(&qp->rq.consumer_lock); +- + skb_queue_head_init(&qp->resp_pkts); + + rxe_init_task(rxe, &qp->resp.task, qp, +-- +2.35.1 + diff --git a/queue-5.10/rdma-siw-fix-duplicated-reported-iw_cm_event_connect.patch b/queue-5.10/rdma-siw-fix-duplicated-reported-iw_cm_event_connect.patch new file mode 100644 index 00000000000..a6f4109ccdf --- /dev/null +++ b/queue-5.10/rdma-siw-fix-duplicated-reported-iw_cm_event_connect.patch @@ -0,0 +1,73 @@ +From b151fea368f6035ac950c07e6562405bcc0511bd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jul 2022 09:30:47 +0800 +Subject: RDMA/siw: Fix duplicated reported IW_CM_EVENT_CONNECT_REPLY event + +From: Cheng Xu + +[ Upstream commit 3056fc6c32e613b760422b94c7617ac9a24a4721 ] + +If siw_recv_mpa_rr returns -EAGAIN, it means that the MPA reply hasn't +been received completely, and should not report IW_CM_EVENT_CONNECT_REPLY +in this case. This may trigger a call trace in iw_cm. A simple way to +trigger this: + server: ib_send_lat + client: ib_send_lat -R + +The call trace looks like this: + + kernel BUG at drivers/infiniband/core/iwcm.c:894! + invalid opcode: 0000 [#1] PREEMPT SMP NOPTI + <...> + Workqueue: iw_cm_wq cm_work_handler [iw_cm] + Call Trace: + + cm_work_handler+0x1dd/0x370 [iw_cm] + process_one_work+0x1e2/0x3b0 + worker_thread+0x49/0x2e0 + ? rescuer_thread+0x370/0x370 + kthread+0xe5/0x110 + ? kthread_complete_and_exit+0x20/0x20 + ret_from_fork+0x1f/0x30 + + +Fixes: 6c52fdc244b5 ("rdma/siw: connection management") +Link: https://lore.kernel.org/r/dae34b5fd5c2ea2bd9744812c1d2653a34a94c67.1657706960.git.chengyou@linux.alibaba.com +Signed-off-by: Cheng Xu +Signed-off-by: Leon Romanovsky +Signed-off-by: Sasha Levin +--- + drivers/infiniband/sw/siw/siw_cm.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/infiniband/sw/siw/siw_cm.c b/drivers/infiniband/sw/siw/siw_cm.c +index 6e7399c2ca8c..b87ba4c9fccf 100644 +--- a/drivers/infiniband/sw/siw/siw_cm.c ++++ b/drivers/infiniband/sw/siw/siw_cm.c +@@ -725,11 +725,11 @@ static int siw_proc_mpareply(struct siw_cep *cep) + enum mpa_v2_ctrl mpa_p2p_mode = MPA_V2_RDMA_NO_RTR; + + rv = siw_recv_mpa_rr(cep); +- if (rv != -EAGAIN) +- siw_cancel_mpatimer(cep); + if (rv) + goto out_err; + ++ siw_cancel_mpatimer(cep); ++ + rep = &cep->mpa.hdr; + + if (__mpa_rr_revision(rep->params.bits) > MPA_REVISION_2) { +@@ -895,7 +895,8 @@ static int siw_proc_mpareply(struct siw_cep *cep) + } + + out_err: +- siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -EINVAL); ++ if (rv != -EAGAIN) ++ siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -EINVAL); + + return rv; + } +-- +2.35.1 + diff --git a/queue-5.10/rdma-srpt-duplicate-port-name-members.patch b/queue-5.10/rdma-srpt-duplicate-port-name-members.patch new file mode 100644 index 00000000000..289f7e103de --- /dev/null +++ b/queue-5.10/rdma-srpt-duplicate-port-name-members.patch @@ -0,0 +1,85 @@ +From 723c2abd5826e5c04c9be305e945b0706d2d2d45 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jul 2022 12:34:13 -0700 +Subject: RDMA/srpt: Duplicate port name members + +From: Bart Van Assche + +[ Upstream commit b03b1ae2a3125d4475452e4f19f5d3a6e910ff6e ] + +Prepare for decoupling the lifetimes of struct srpt_port and struct +srpt_port_id by duplicating the port name into struct srpt_port. + +Link: https://lore.kernel.org/r/20220727193415.1583860-2-bvanassche@acm.org +Signed-off-by: Bart Van Assche +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/srpt/ib_srpt.c | 9 ++++++--- + drivers/infiniband/ulp/srpt/ib_srpt.h | 10 +++++++--- + 2 files changed, 13 insertions(+), 6 deletions(-) + +diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c +index 07ecc7dc1822..4cecdcee606a 100644 +--- a/drivers/infiniband/ulp/srpt/ib_srpt.c ++++ b/drivers/infiniband/ulp/srpt/ib_srpt.c +@@ -566,14 +566,17 @@ static int srpt_refresh_port(struct srpt_port *sport) + return ret; + + sport->port_guid_id.wwn.priv = sport; +- srpt_format_guid(sport->port_guid_id.name, +- sizeof(sport->port_guid_id.name), ++ srpt_format_guid(sport->guid_name, ARRAY_SIZE(sport->guid_name), + &sport->gid.global.interface_id); ++ memcpy(sport->port_guid_id.name, sport->guid_name, ++ ARRAY_SIZE(sport->guid_name)); + sport->port_gid_id.wwn.priv = sport; +- snprintf(sport->port_gid_id.name, sizeof(sport->port_gid_id.name), ++ snprintf(sport->gid_name, ARRAY_SIZE(sport->gid_name), + "0x%016llx%016llx", + be64_to_cpu(sport->gid.global.subnet_prefix), + be64_to_cpu(sport->gid.global.interface_id)); ++ memcpy(sport->port_gid_id.name, sport->gid_name, ++ ARRAY_SIZE(sport->gid_name)); + + if (rdma_protocol_iwarp(sport->sdev->device, sport->port)) + return 0; +diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.h b/drivers/infiniband/ulp/srpt/ib_srpt.h +index bdeb010efee6..1d28f13196c9 100644 +--- a/drivers/infiniband/ulp/srpt/ib_srpt.h ++++ b/drivers/infiniband/ulp/srpt/ib_srpt.h +@@ -376,7 +376,7 @@ struct srpt_tpg { + }; + + /** +- * struct srpt_port_id - information about an RDMA port name ++ * struct srpt_port_id - LIO RDMA port information + * @mutex: Protects @tpg_list changes. + * @tpg_list: TPGs associated with the RDMA port name. + * @wwn: WWN associated with the RDMA port name. +@@ -402,8 +402,10 @@ struct srpt_port_id { + * @lid: cached value of the port's lid. + * @gid: cached value of the port's gid. + * @work: work structure for refreshing the aforementioned cached values. +- * @port_guid_id: target port GUID +- * @port_gid_id: target port GID ++ * @guid_name: port name in GUID format. ++ * @port_guid_id: LIO target port information for the port name in GUID format. ++ * @gid_name: port name in GID format. ++ * @port_gid_id: LIO target port information for the port name in GID format. + * @port_attrib: Port attributes that can be accessed through configfs. + * @refcount: Number of objects associated with this port. + * @freed_channels: Completion that will be signaled once @refcount becomes 0. +@@ -419,7 +421,9 @@ struct srpt_port { + u32 lid; + union ib_gid gid; + struct work_struct work; ++ char guid_name[64]; + struct srpt_port_id port_guid_id; ++ char gid_name[64]; + struct srpt_port_id port_gid_id; + struct srpt_port_attrib port_attrib; + atomic_t refcount; +-- +2.35.1 + diff --git a/queue-5.10/rdma-srpt-fix-a-use-after-free.patch b/queue-5.10/rdma-srpt-fix-a-use-after-free.patch new file mode 100644 index 00000000000..d2ac7e43817 --- /dev/null +++ b/queue-5.10/rdma-srpt-fix-a-use-after-free.patch @@ -0,0 +1,306 @@ +From edb2f8d3aeb3cb71977d8e19d1b7035a260c2442 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jul 2022 12:34:15 -0700 +Subject: RDMA/srpt: Fix a use-after-free + +From: Bart Van Assche + +[ Upstream commit b5605148e6ce36bb21020d49010b617693933128 ] + +Change the LIO port members inside struct srpt_port from regular members +into pointers. Allocate the LIO port data structures from inside +srpt_make_tport() and free these from inside srpt_make_tport(). Keep +struct srpt_device as long as either an RDMA port or a LIO target port is +associated with it. This patch decouples the lifetime of struct srpt_port +(controlled by the RDMA core) and struct srpt_port_id (controlled by LIO). +This patch fixes the following KASAN complaint: + + BUG: KASAN: use-after-free in srpt_enable_tpg+0x31/0x70 [ib_srpt] + Read of size 8 at addr ffff888141cc34b8 by task check/5093 + + Call Trace: + + show_stack+0x4e/0x53 + dump_stack_lvl+0x51/0x66 + print_address_description.constprop.0.cold+0xea/0x41e + print_report.cold+0x90/0x205 + kasan_report+0xb9/0xf0 + __asan_load8+0x69/0x90 + srpt_enable_tpg+0x31/0x70 [ib_srpt] + target_fabric_tpg_base_enable_store+0xe2/0x140 [target_core_mod] + configfs_write_iter+0x18b/0x210 + new_sync_write+0x1f2/0x2f0 + vfs_write+0x3e3/0x540 + ksys_write+0xbb/0x140 + __x64_sys_write+0x42/0x50 + do_syscall_64+0x34/0x80 + entry_SYSCALL_64_after_hwframe+0x46/0xb0 + + +Link: https://lore.kernel.org/r/20220727193415.1583860-4-bvanassche@acm.org +Reported-by: Li Zhijian +Tested-by: Li Zhijian +Fixes: a42d985bd5b2 ("ib_srpt: Initial SRP Target merge for v3.3-rc1") +Signed-off-by: Bart Van Assche +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/srpt/ib_srpt.c | 130 ++++++++++++++++++-------- + drivers/infiniband/ulp/srpt/ib_srpt.h | 10 +- + 2 files changed, 94 insertions(+), 46 deletions(-) + +diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c +index 211d4e82e4ba..c0ed08fcab48 100644 +--- a/drivers/infiniband/ulp/srpt/ib_srpt.c ++++ b/drivers/infiniband/ulp/srpt/ib_srpt.c +@@ -565,18 +565,12 @@ static int srpt_refresh_port(struct srpt_port *sport) + if (ret) + return ret; + +- sport->port_guid_id.wwn.priv = sport; + srpt_format_guid(sport->guid_name, ARRAY_SIZE(sport->guid_name), + &sport->gid.global.interface_id); +- memcpy(sport->port_guid_id.name, sport->guid_name, +- ARRAY_SIZE(sport->guid_name)); +- sport->port_gid_id.wwn.priv = sport; + snprintf(sport->gid_name, ARRAY_SIZE(sport->gid_name), + "0x%016llx%016llx", + be64_to_cpu(sport->gid.global.subnet_prefix), + be64_to_cpu(sport->gid.global.interface_id)); +- memcpy(sport->port_gid_id.name, sport->gid_name, +- ARRAY_SIZE(sport->gid_name)); + + if (rdma_protocol_iwarp(sport->sdev->device, sport->port)) + return 0; +@@ -2313,31 +2307,35 @@ static int srpt_cm_req_recv(struct srpt_device *const sdev, + tag_num = ch->rq_size; + tag_size = 1; /* ib_srpt does not use se_sess->sess_cmd_map */ + +- mutex_lock(&sport->port_guid_id.mutex); +- list_for_each_entry(stpg, &sport->port_guid_id.tpg_list, entry) { +- if (!IS_ERR_OR_NULL(ch->sess)) +- break; +- ch->sess = target_setup_session(&stpg->tpg, tag_num, ++ if (sport->guid_id) { ++ mutex_lock(&sport->guid_id->mutex); ++ list_for_each_entry(stpg, &sport->guid_id->tpg_list, entry) { ++ if (!IS_ERR_OR_NULL(ch->sess)) ++ break; ++ ch->sess = target_setup_session(&stpg->tpg, tag_num, + tag_size, TARGET_PROT_NORMAL, + ch->sess_name, ch, NULL); ++ } ++ mutex_unlock(&sport->guid_id->mutex); + } +- mutex_unlock(&sport->port_guid_id.mutex); + +- mutex_lock(&sport->port_gid_id.mutex); +- list_for_each_entry(stpg, &sport->port_gid_id.tpg_list, entry) { +- if (!IS_ERR_OR_NULL(ch->sess)) +- break; +- ch->sess = target_setup_session(&stpg->tpg, tag_num, ++ if (sport->gid_id) { ++ mutex_lock(&sport->gid_id->mutex); ++ list_for_each_entry(stpg, &sport->gid_id->tpg_list, entry) { ++ if (!IS_ERR_OR_NULL(ch->sess)) ++ break; ++ ch->sess = target_setup_session(&stpg->tpg, tag_num, + tag_size, TARGET_PROT_NORMAL, i_port_id, + ch, NULL); +- if (!IS_ERR_OR_NULL(ch->sess)) +- break; +- /* Retry without leading "0x" */ +- ch->sess = target_setup_session(&stpg->tpg, tag_num, ++ if (!IS_ERR_OR_NULL(ch->sess)) ++ break; ++ /* Retry without leading "0x" */ ++ ch->sess = target_setup_session(&stpg->tpg, tag_num, + tag_size, TARGET_PROT_NORMAL, + i_port_id + 2, ch, NULL); ++ } ++ mutex_unlock(&sport->gid_id->mutex); + } +- mutex_unlock(&sport->port_gid_id.mutex); + + if (IS_ERR_OR_NULL(ch->sess)) { + WARN_ON_ONCE(ch->sess == NULL); +@@ -2983,7 +2981,12 @@ static int srpt_release_sport(struct srpt_port *sport) + return 0; + } + +-static struct se_wwn *__srpt_lookup_wwn(const char *name) ++struct port_and_port_id { ++ struct srpt_port *sport; ++ struct srpt_port_id **port_id; ++}; ++ ++static struct port_and_port_id __srpt_lookup_port(const char *name) + { + struct ib_device *dev; + struct srpt_device *sdev; +@@ -2998,25 +3001,38 @@ static struct se_wwn *__srpt_lookup_wwn(const char *name) + for (i = 0; i < dev->phys_port_cnt; i++) { + sport = &sdev->port[i]; + +- if (strcmp(sport->port_guid_id.name, name) == 0) +- return &sport->port_guid_id.wwn; +- if (strcmp(sport->port_gid_id.name, name) == 0) +- return &sport->port_gid_id.wwn; ++ if (strcmp(sport->guid_name, name) == 0) { ++ kref_get(&sdev->refcnt); ++ return (struct port_and_port_id){ ++ sport, &sport->guid_id}; ++ } ++ if (strcmp(sport->gid_name, name) == 0) { ++ kref_get(&sdev->refcnt); ++ return (struct port_and_port_id){ ++ sport, &sport->gid_id}; ++ } + } + } + +- return NULL; ++ return (struct port_and_port_id){}; + } + +-static struct se_wwn *srpt_lookup_wwn(const char *name) ++/** ++ * srpt_lookup_port() - Look up an RDMA port by name ++ * @name: ASCII port name ++ * ++ * Increments the RDMA port reference count if an RDMA port pointer is returned. ++ * The caller must drop that reference count by calling srpt_port_put_ref(). ++ */ ++static struct port_and_port_id srpt_lookup_port(const char *name) + { +- struct se_wwn *wwn; ++ struct port_and_port_id papi; + + spin_lock(&srpt_dev_lock); +- wwn = __srpt_lookup_wwn(name); ++ papi = __srpt_lookup_port(name); + spin_unlock(&srpt_dev_lock); + +- return wwn; ++ return papi; + } + + static void srpt_free_srq(struct srpt_device *sdev) +@@ -3194,10 +3210,6 @@ static int srpt_add_one(struct ib_device *device) + sport->port_attrib.srp_sq_size = DEF_SRPT_SQ_SIZE; + sport->port_attrib.use_srq = false; + INIT_WORK(&sport->work, srpt_refresh_port_work); +- mutex_init(&sport->port_guid_id.mutex); +- INIT_LIST_HEAD(&sport->port_guid_id.tpg_list); +- mutex_init(&sport->port_gid_id.mutex); +- INIT_LIST_HEAD(&sport->port_gid_id.tpg_list); + + ret = srpt_refresh_port(sport); + if (ret) { +@@ -3298,10 +3310,10 @@ static struct srpt_port_id *srpt_wwn_to_sport_id(struct se_wwn *wwn) + { + struct srpt_port *sport = wwn->priv; + +- if (wwn == &sport->port_guid_id.wwn) +- return &sport->port_guid_id; +- if (wwn == &sport->port_gid_id.wwn) +- return &sport->port_gid_id; ++ if (sport->guid_id && &sport->guid_id->wwn == wwn) ++ return sport->guid_id; ++ if (sport->gid_id && &sport->gid_id->wwn == wwn) ++ return sport->gid_id; + WARN_ON_ONCE(true); + return NULL; + } +@@ -3816,7 +3828,31 @@ static struct se_wwn *srpt_make_tport(struct target_fabric_configfs *tf, + struct config_group *group, + const char *name) + { +- return srpt_lookup_wwn(name) ? : ERR_PTR(-EINVAL); ++ struct port_and_port_id papi = srpt_lookup_port(name); ++ struct srpt_port *sport = papi.sport; ++ struct srpt_port_id *port_id; ++ ++ if (!papi.port_id) ++ return ERR_PTR(-EINVAL); ++ if (*papi.port_id) { ++ /* Attempt to create a directory that already exists. */ ++ WARN_ON_ONCE(true); ++ return &(*papi.port_id)->wwn; ++ } ++ port_id = kzalloc(sizeof(*port_id), GFP_KERNEL); ++ if (!port_id) { ++ srpt_sdev_put(sport->sdev); ++ return ERR_PTR(-ENOMEM); ++ } ++ mutex_init(&port_id->mutex); ++ INIT_LIST_HEAD(&port_id->tpg_list); ++ port_id->wwn.priv = sport; ++ memcpy(port_id->name, port_id == sport->guid_id ? sport->guid_name : ++ sport->gid_name, ARRAY_SIZE(port_id->name)); ++ ++ *papi.port_id = port_id; ++ ++ return &port_id->wwn; + } + + /** +@@ -3825,6 +3861,18 @@ static struct se_wwn *srpt_make_tport(struct target_fabric_configfs *tf, + */ + static void srpt_drop_tport(struct se_wwn *wwn) + { ++ struct srpt_port_id *port_id = container_of(wwn, typeof(*port_id), wwn); ++ struct srpt_port *sport = wwn->priv; ++ ++ if (sport->guid_id == port_id) ++ sport->guid_id = NULL; ++ else if (sport->gid_id == port_id) ++ sport->gid_id = NULL; ++ else ++ WARN_ON_ONCE(true); ++ ++ srpt_sdev_put(sport->sdev); ++ kfree(port_id); + } + + static ssize_t srpt_wwn_version_show(struct config_item *item, char *buf) +diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.h b/drivers/infiniband/ulp/srpt/ib_srpt.h +index 978a338f1f0e..2bf381ecd482 100644 +--- a/drivers/infiniband/ulp/srpt/ib_srpt.h ++++ b/drivers/infiniband/ulp/srpt/ib_srpt.h +@@ -393,7 +393,7 @@ struct srpt_port_id { + }; + + /** +- * struct srpt_port - information associated by SRPT with a single IB port ++ * struct srpt_port - SRPT RDMA port information + * @sdev: backpointer to the HCA information. + * @mad_agent: per-port management datagram processing information. + * @enabled: Whether or not this target port is enabled. +@@ -403,9 +403,9 @@ struct srpt_port_id { + * @gid: cached value of the port's gid. + * @work: work structure for refreshing the aforementioned cached values. + * @guid_name: port name in GUID format. +- * @port_guid_id: LIO target port information for the port name in GUID format. ++ * @guid_id: LIO target port information for the port name in GUID format. + * @gid_name: port name in GID format. +- * @port_gid_id: LIO target port information for the port name in GID format. ++ * @gid_id: LIO target port information for the port name in GID format. + * @port_attrib: Port attributes that can be accessed through configfs. + * @refcount: Number of objects associated with this port. + * @freed_channels: Completion that will be signaled once @refcount becomes 0. +@@ -422,9 +422,9 @@ struct srpt_port { + union ib_gid gid; + struct work_struct work; + char guid_name[64]; +- struct srpt_port_id port_guid_id; ++ struct srpt_port_id *guid_id; + char gid_name[64]; +- struct srpt_port_id port_gid_id; ++ struct srpt_port_id *gid_id; + struct srpt_port_attrib port_attrib; + atomic_t refcount; + struct completion *freed_channels; +-- +2.35.1 + diff --git a/queue-5.10/rdma-srpt-introduce-a-reference-count-in-struct-srpt.patch b/queue-5.10/rdma-srpt-introduce-a-reference-count-in-struct-srpt.patch new file mode 100644 index 00000000000..b57da830870 --- /dev/null +++ b/queue-5.10/rdma-srpt-introduce-a-reference-count-in-struct-srpt.patch @@ -0,0 +1,94 @@ +From 45a81e85663da3d8a52ef79d24dff3978081deaf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jul 2022 12:34:14 -0700 +Subject: RDMA/srpt: Introduce a reference count in struct srpt_device + +From: Bart Van Assche + +[ Upstream commit aa7dfbb41b5a60ab90e244d6f586b8cb5c791c3e ] + +This will be used to keep struct srpt_device around as long as either the +RDMA port exists or a LIO target port is associated with the struct +srpt_device. + +Link: https://lore.kernel.org/r/20220727193415.1583860-3-bvanassche@acm.org +Signed-off-by: Bart Van Assche +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/srpt/ib_srpt.c | 17 +++++++++++++++-- + drivers/infiniband/ulp/srpt/ib_srpt.h | 2 ++ + 2 files changed, 17 insertions(+), 2 deletions(-) + +diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c +index 4cecdcee606a..211d4e82e4ba 100644 +--- a/drivers/infiniband/ulp/srpt/ib_srpt.c ++++ b/drivers/infiniband/ulp/srpt/ib_srpt.c +@@ -3101,6 +3101,18 @@ static int srpt_use_srq(struct srpt_device *sdev, bool use_srq) + return ret; + } + ++static void srpt_free_sdev(struct kref *refcnt) ++{ ++ struct srpt_device *sdev = container_of(refcnt, typeof(*sdev), refcnt); ++ ++ kfree(sdev); ++} ++ ++static void srpt_sdev_put(struct srpt_device *sdev) ++{ ++ kref_put(&sdev->refcnt, srpt_free_sdev); ++} ++ + /** + * srpt_add_one - InfiniBand device addition callback function + * @device: Describes a HCA. +@@ -3118,6 +3130,7 @@ static int srpt_add_one(struct ib_device *device) + if (!sdev) + return -ENOMEM; + ++ kref_init(&sdev->refcnt); + sdev->device = device; + mutex_init(&sdev->sdev_mutex); + +@@ -3213,7 +3226,7 @@ static int srpt_add_one(struct ib_device *device) + srpt_free_srq(sdev); + ib_dealloc_pd(sdev->pd); + free_dev: +- kfree(sdev); ++ srpt_sdev_put(sdev); + pr_info("%s(%s) failed.\n", __func__, dev_name(&device->dev)); + return ret; + } +@@ -3257,7 +3270,7 @@ static void srpt_remove_one(struct ib_device *device, void *client_data) + + ib_dealloc_pd(sdev->pd); + +- kfree(sdev); ++ srpt_sdev_put(sdev); + } + + static struct ib_client srpt_client = { +diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.h b/drivers/infiniband/ulp/srpt/ib_srpt.h +index 1d28f13196c9..978a338f1f0e 100644 +--- a/drivers/infiniband/ulp/srpt/ib_srpt.h ++++ b/drivers/infiniband/ulp/srpt/ib_srpt.h +@@ -434,6 +434,7 @@ struct srpt_port { + + /** + * struct srpt_device - information associated by SRPT with a single HCA ++ * @refcnt: Reference count for this device. + * @device: Backpointer to the struct ib_device managed by the IB core. + * @pd: IB protection domain. + * @lkey: L_Key (local key) with write access to all local memory. +@@ -449,6 +450,7 @@ struct srpt_port { + * @port: Information about the ports owned by this HCA. + */ + struct srpt_device { ++ struct kref refcnt; + struct ib_device *device; + struct ib_pd *pd; + u32 lkey; +-- +2.35.1 + diff --git a/queue-5.10/regulator-of-fix-refcount-leak-bug-in-of_get_regulat.patch b/queue-5.10/regulator-of-fix-refcount-leak-bug-in-of_get_regulat.patch new file mode 100644 index 00000000000..1f421ac0c9a --- /dev/null +++ b/queue-5.10/regulator-of-fix-refcount-leak-bug-in-of_get_regulat.patch @@ -0,0 +1,43 @@ +From 38016a175f2d4263caa77451287a1d8d608844ba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jul 2022 19:10:27 +0800 +Subject: regulator: of: Fix refcount leak bug in + of_get_regulation_constraints() + +From: Liang He + +[ Upstream commit 66efb665cd5ad69b27dca8571bf89fc6b9c628a4 ] + +We should call the of_node_put() for the reference returned by +of_get_child_by_name() which has increased the refcount. + +Fixes: 40e20d68bb3f ("regulator: of: Add support for parsing regulator_state for suspend state") +Signed-off-by: Liang He +Link: https://lore.kernel.org/r/20220715111027.391032-1-windhl@126.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/regulator/of_regulator.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c +index 06c0b15fe4c0..5d844697c7b6 100644 +--- a/drivers/regulator/of_regulator.c ++++ b/drivers/regulator/of_regulator.c +@@ -206,8 +206,12 @@ static int of_get_regulation_constraints(struct device *dev, + } + + suspend_np = of_get_child_by_name(np, regulator_states[i]); +- if (!suspend_np || !suspend_state) ++ if (!suspend_np) + continue; ++ if (!suspend_state) { ++ of_node_put(suspend_np); ++ continue; ++ } + + if (!of_property_read_u32(suspend_np, "regulator-mode", + &pval)) { +-- +2.35.1 + diff --git a/queue-5.10/regulator-qcom_smd-fix-pm8916_pldo-range.patch b/queue-5.10/regulator-qcom_smd-fix-pm8916_pldo-range.patch new file mode 100644 index 00000000000..ad19ce35af7 --- /dev/null +++ b/queue-5.10/regulator-qcom_smd-fix-pm8916_pldo-range.patch @@ -0,0 +1,55 @@ +From 1898e8d140308b852275158b80587af9defad9e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 23 Jun 2022 11:46:12 +0200 +Subject: regulator: qcom_smd: Fix pm8916_pldo range + +From: Stephan Gerhold + +[ Upstream commit e8977917e116d1571dacb8e9864474551c1c12bd ] + +The PM8916 device specification [1] documents a programmable range of +1.75V to 3.337V with 12.5mV steps for the PMOS LDOs in PM8916. This +range is also used when controlling the regulator directly using the +qcom_spmi-regulator driver ("ult_pldo" there). + +However, for some reason the qcom_smd-regulator driver allows a much +larger range for the same hardware component. This could be simply a +typo, since the start of the range is essentially just missing a '1'. + +In practice this does not cause any major problems, since the driver +just sends the actual voltage to the RPM firmware instead of making use +of the incorrect voltage selector. Still, having the wrong range there +is confusing and prevents the regulator core from validating requests +correctly. + +[1]: https://developer.qualcomm.com/download/sd410/pm8916pm8916-1-power-management-ic-device-specification.pdf + +Fixes: 57d6567680ed ("regulator: qcom-smd: Add PM8916 support") +Signed-off-by: Stephan Gerhold +Link: https://lore.kernel.org/r/20220623094614.1410180-2-stephan.gerhold@kernkonzept.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/regulator/qcom_smd-regulator.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/regulator/qcom_smd-regulator.c b/drivers/regulator/qcom_smd-regulator.c +index 05d227f9d2f2..0295d7b160e5 100644 +--- a/drivers/regulator/qcom_smd-regulator.c ++++ b/drivers/regulator/qcom_smd-regulator.c +@@ -313,10 +313,10 @@ static const struct regulator_desc pm8941_switch = { + + static const struct regulator_desc pm8916_pldo = { + .linear_ranges = (struct linear_range[]) { +- REGULATOR_LINEAR_RANGE(750000, 0, 208, 12500), ++ REGULATOR_LINEAR_RANGE(1750000, 0, 127, 12500), + }, + .n_linear_ranges = 1, +- .n_voltages = 209, ++ .n_voltages = 128, + .ops = &rpm_smps_ldo_ops, + }; + +-- +2.35.1 + diff --git a/queue-5.10/remoteproc-k3-r5-fix-refcount-leak-in-k3_r5_cluster_.patch b/queue-5.10/remoteproc-k3-r5-fix-refcount-leak-in-k3_r5_cluster_.patch new file mode 100644 index 00000000000..91d3363f162 --- /dev/null +++ b/queue-5.10/remoteproc-k3-r5-fix-refcount-leak-in-k3_r5_cluster_.patch @@ -0,0 +1,48 @@ +From b61f46c6e08b6d0304dd7fef7d934b9d8fdd6ed2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 5 Jun 2022 12:33:34 +0400 +Subject: remoteproc: k3-r5: Fix refcount leak in k3_r5_cluster_of_init + +From: Miaoqian Lin + +[ Upstream commit fa220c05d282e7479abe08b54e3bdffd06c25e97 ] + +Every iteration of for_each_available_child_of_node() decrements +the reference count of the previous node. +When breaking early from a for_each_available_child_of_node() loop, +we need to explicitly call of_node_put() on the child node. +Add missing of_node_put() to avoid refcount leak. + +Fixes: 6dedbd1d5443 ("remoteproc: k3-r5: Add a remoteproc driver for R5F subsystem") +Signed-off-by: Miaoqian Lin +Acked-by: Suman Anna +Link: https://lore.kernel.org/r/20220605083334.23942-1-linmq006@gmail.com +Signed-off-by: Mathieu Poirier +Signed-off-by: Sasha Levin +--- + drivers/remoteproc/ti_k3_r5_remoteproc.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/ti_k3_r5_remoteproc.c +index afeb9d6e4313..f92a18c06d80 100644 +--- a/drivers/remoteproc/ti_k3_r5_remoteproc.c ++++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c +@@ -1283,6 +1283,7 @@ static int k3_r5_cluster_of_init(struct platform_device *pdev) + if (!cpdev) { + ret = -ENODEV; + dev_err(dev, "could not get R5 core platform device\n"); ++ of_node_put(child); + goto fail; + } + +@@ -1291,6 +1292,7 @@ static int k3_r5_cluster_of_init(struct platform_device *pdev) + dev_err(dev, "k3_r5_core_of_init failed, ret = %d\n", + ret); + put_device(&cpdev->dev); ++ of_node_put(child); + goto fail; + } + +-- +2.35.1 + diff --git a/queue-5.10/remoteproc-qcom-wcnss-fix-handling-of-irqs.patch b/queue-5.10/remoteproc-qcom-wcnss-fix-handling-of-irqs.patch new file mode 100644 index 00000000000..c1f44f048de --- /dev/null +++ b/queue-5.10/remoteproc-qcom-wcnss-fix-handling-of-irqs.patch @@ -0,0 +1,60 @@ +From 86d27e3cb54dc00e1d451deae4a62e9d40f58712 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 May 2022 19:47:39 +0530 +Subject: remoteproc: qcom: wcnss: Fix handling of IRQs + +From: Sireesh Kodali + +[ Upstream commit bed0adac1ded4cb486ba19a3a7e730fbd9a1c9c6 ] + +The wcnss_get_irq function is expected to return a value > 0 in the +event that an IRQ is succssfully obtained, but it instead returns 0. +This causes the stop and ready IRQs to never actually be used despite +being defined in the device-tree. This patch fixes that. + +Fixes: aed361adca9f ("remoteproc: qcom: Introduce WCNSS peripheral image loader") +Signed-off-by: Sireesh Kodali +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220526141740.15834-2-sireeshkodali1@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/remoteproc/qcom_wcnss.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/drivers/remoteproc/qcom_wcnss.c b/drivers/remoteproc/qcom_wcnss.c +index 67286a4505cd..572f7b8ba234 100644 +--- a/drivers/remoteproc/qcom_wcnss.c ++++ b/drivers/remoteproc/qcom_wcnss.c +@@ -415,6 +415,7 @@ static int wcnss_request_irq(struct qcom_wcnss *wcnss, + irq_handler_t thread_fn) + { + int ret; ++ int irq_number; + + ret = platform_get_irq_byname(pdev, name); + if (ret < 0 && optional) { +@@ -425,14 +426,19 @@ static int wcnss_request_irq(struct qcom_wcnss *wcnss, + return ret; + } + ++ irq_number = ret; ++ + ret = devm_request_threaded_irq(&pdev->dev, ret, + NULL, thread_fn, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + "wcnss", wcnss); +- if (ret) ++ if (ret) { + dev_err(&pdev->dev, "request %s IRQ failed\n", name); ++ return ret; ++ } + +- return ret; ++ /* Return the IRQ number if the IRQ was successfully acquired */ ++ return irq_number; + } + + static int wcnss_alloc_memory_region(struct qcom_wcnss *wcnss) +-- +2.35.1 + diff --git a/queue-5.10/remoteproc-sysmon-wait-for-ssctl-service-to-come-up.patch b/queue-5.10/remoteproc-sysmon-wait-for-ssctl-service-to-come-up.patch new file mode 100644 index 00000000000..2050e4b0f44 --- /dev/null +++ b/queue-5.10/remoteproc-sysmon-wait-for-ssctl-service-to-come-up.patch @@ -0,0 +1,78 @@ +From 96d9151aa116da46f497bdf71dab7b43bda6eaf2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jul 2022 17:38:19 +0530 +Subject: remoteproc: sysmon: Wait for SSCTL service to come up + +From: Sibi Sankar + +[ Upstream commit 47c04e00eff86a81cd357c3feed04c86089bcb85 ] + +The SSCTL service comes up after a finite time when the remote Q6 comes +out of reset. Any graceful shutdowns requested during this period will +be a NOP and abrupt tearing down of the glink channel might lead to pending +transactions on the remote Q6 side and will ultimately lead to a fatal +error. Fix this by waiting for the SSCTL service when a graceful shutdown +is requested. + +Fixes: 1fb82ee806d1 ("remoteproc: qcom: Introduce sysmon") +Reviewed-by: Matthias Kaehlcke +Signed-off-by: Sibi Sankar +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/1657022900-2049-7-git-send-email-quic_sibis@quicinc.com +Signed-off-by: Sasha Levin +--- + drivers/remoteproc/qcom_sysmon.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/drivers/remoteproc/qcom_sysmon.c b/drivers/remoteproc/qcom_sysmon.c +index b37b111b15b3..a26221a6f6c2 100644 +--- a/drivers/remoteproc/qcom_sysmon.c ++++ b/drivers/remoteproc/qcom_sysmon.c +@@ -41,6 +41,7 @@ struct qcom_sysmon { + struct completion comp; + struct completion ind_comp; + struct completion shutdown_comp; ++ struct completion ssctl_comp; + struct mutex lock; + + bool ssr_ack; +@@ -422,6 +423,8 @@ static int ssctl_new_server(struct qmi_handle *qmi, struct qmi_service *svc) + + svc->priv = sysmon; + ++ complete(&sysmon->ssctl_comp); ++ + return 0; + } + +@@ -478,6 +481,7 @@ static int sysmon_start(struct rproc_subdev *subdev) + .ssr_event = SSCTL_SSR_EVENT_AFTER_POWERUP + }; + ++ reinit_completion(&sysmon->ssctl_comp); + mutex_lock(&sysmon->state_lock); + sysmon->state = SSCTL_SSR_EVENT_AFTER_POWERUP; + blocking_notifier_call_chain(&sysmon_notifiers, 0, (void *)&event); +@@ -520,6 +524,11 @@ static void sysmon_stop(struct rproc_subdev *subdev, bool crashed) + if (crashed) + return; + ++ if (sysmon->ssctl_instance) { ++ if (!wait_for_completion_timeout(&sysmon->ssctl_comp, HZ / 2)) ++ dev_err(sysmon->dev, "timeout waiting for ssctl service\n"); ++ } ++ + if (sysmon->ssctl_version) + ssctl_request_shutdown(sysmon); + else if (sysmon->ept) +@@ -606,6 +615,7 @@ struct qcom_sysmon *qcom_add_sysmon_subdev(struct rproc *rproc, + init_completion(&sysmon->comp); + init_completion(&sysmon->ind_comp); + init_completion(&sysmon->shutdown_comp); ++ init_completion(&sysmon->ssctl_comp); + mutex_init(&sysmon->lock); + mutex_init(&sysmon->state_lock); + +-- +2.35.1 + diff --git a/queue-5.10/rpmsg-mtk_rpmsg-fix-circular-locking-dependency.patch b/queue-5.10/rpmsg-mtk_rpmsg-fix-circular-locking-dependency.patch new file mode 100644 index 00000000000..a6ec8cec899 --- /dev/null +++ b/queue-5.10/rpmsg-mtk_rpmsg-fix-circular-locking-dependency.patch @@ -0,0 +1,126 @@ +From ba6bd6a8e0af6c8decd6b1e6c96a4f1e68044259 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 25 May 2022 11:12:01 +0200 +Subject: rpmsg: mtk_rpmsg: Fix circular locking dependency + +From: AngeloGioacchino Del Regno + +[ Upstream commit 353d9214682e65c55cdffad8c82139a3321c5f13 ] + +During execution of the worker that's used to register rpmsg devices +we are safely locking the channels mutex but, when creating a new +endpoint for such devices, we are registering a IPI on the SCP, which +then makes the SCP to trigger an interrupt, lock its own mutex and in +turn register more subdevices. +This creates a circular locking dependency situation, as the mtk_rpmsg +channels_lock will then depend on the SCP IPI lock. + +[ 15.447736] ====================================================== +[ 15.460158] WARNING: possible circular locking dependency detected +[ 15.460161] 5.17.0-next-20220324+ #399 Not tainted +[ 15.460165] ------------------------------------------------------ +[ 15.460166] kworker/0:3/155 is trying to acquire lock: +[ 15.460170] ffff5b4d0eaf1308 (&scp->ipi_desc[i].lock){+.+.}-{4:4}, at: scp_ipi_lock+0x34/0x50 [mtk_scp_ipi] +[ 15.504958] +[] but task is already holding lock: +[ 15.504960] ffff5b4d0e8f1918 (&mtk_subdev->channels_lock){+.+.}-{4:4}, at: mtk_register_device_work_function+0x50/0x1cc [mtk_rpmsg] +[ 15.504978] +[] which lock already depends on the new lock. + +[ 15.504980] +[] the existing dependency chain (in reverse order) is: +[ 15.504982] +[] -> #1 (&mtk_subdev->channels_lock){+.+.}-{4:4}: +[ 15.504990] lock_acquire+0x68/0x84 +[ 15.504999] __mutex_lock+0xa4/0x3e0 +[ 15.505007] mutex_lock_nested+0x40/0x70 +[ 15.505012] mtk_rpmsg_ns_cb+0xe4/0x134 [mtk_rpmsg] +[ 15.641684] mtk_rpmsg_ipi_handler+0x38/0x64 [mtk_rpmsg] +[ 15.641693] scp_ipi_handler+0xbc/0x180 [mtk_scp] +[ 15.663905] mt8192_scp_irq_handler+0x44/0xa4 [mtk_scp] +[ 15.663915] scp_irq_handler+0x6c/0xa0 [mtk_scp] +[ 15.685779] irq_thread_fn+0x34/0xa0 +[ 15.685785] irq_thread+0x18c/0x240 +[ 15.685789] kthread+0x104/0x110 +[ 15.709579] ret_from_fork+0x10/0x20 +[ 15.709586] +[] -> #0 (&scp->ipi_desc[i].lock){+.+.}-{4:4}: +[ 15.731271] __lock_acquire+0x11e4/0x1910 +[ 15.740367] lock_acquire.part.0+0xd8/0x220 +[ 15.749813] lock_acquire+0x68/0x84 +[ 15.757861] __mutex_lock+0xa4/0x3e0 +[ 15.766084] mutex_lock_nested+0x40/0x70 +[ 15.775006] scp_ipi_lock+0x34/0x50 [mtk_scp_ipi] +[ 15.785503] scp_ipi_register+0x40/0xa4 [mtk_scp_ipi] +[ 15.796697] scp_register_ipi+0x1c/0x30 [mtk_scp] +[ 15.807194] mtk_rpmsg_create_ept+0xa0/0x108 [mtk_rpmsg] +[ 15.818912] rpmsg_create_ept+0x44/0x60 +[ 15.827660] cros_ec_rpmsg_probe+0x15c/0x1f0 +[ 15.837282] rpmsg_dev_probe+0x128/0x1d0 +[ 15.846203] really_probe.part.0+0xa4/0x2a0 +[ 15.855649] __driver_probe_device+0xa0/0x150 +[ 15.865443] driver_probe_device+0x48/0x150 +[ 15.877157] __device_attach_driver+0xc0/0x12c +[ 15.889359] bus_for_each_drv+0x80/0xe0 +[ 15.900330] __device_attach+0xe4/0x190 +[ 15.911303] device_initial_probe+0x1c/0x2c +[ 15.922969] bus_probe_device+0xa8/0xb0 +[ 15.933927] device_add+0x3a8/0x8a0 +[ 15.944193] device_register+0x28/0x40 +[ 15.954970] rpmsg_register_device+0x5c/0xa0 +[ 15.966782] mtk_register_device_work_function+0x148/0x1cc [mtk_rpmsg] +[ 15.983146] process_one_work+0x294/0x664 +[ 15.994458] worker_thread+0x7c/0x45c +[ 16.005069] kthread+0x104/0x110 +[ 16.014789] ret_from_fork+0x10/0x20 +[ 16.025201] +[] other info that might help us debug this: + +[ 16.047769] Possible unsafe locking scenario: + +[ 16.063942] CPU0 CPU1 +[ 16.075166] ---- ---- +[ 16.086376] lock(&mtk_subdev->channels_lock); +[ 16.097592] lock(&scp->ipi_desc[i].lock); +[ 16.113188] lock(&mtk_subdev->channels_lock); +[ 16.129482] lock(&scp->ipi_desc[i].lock); +[ 16.140020] +[] *** DEADLOCK *** + +[ 16.158282] 4 locks held by kworker/0:3/155: +[ 16.168978] #0: ffff5b4d00008748 ((wq_completion)events){+.+.}-{0:0}, at: process_one_work+0x1fc/0x664 +[ 16.190017] #1: ffff80000953bdc8 ((work_completion)(&mtk_subdev->register_work)){+.+.}-{0:0}, at: process_one_work+0x1fc/0x664 +[ 16.215269] #2: ffff5b4d0e8f1918 (&mtk_subdev->channels_lock){+.+.}-{4:4}, at: mtk_register_device_work_function+0x50/0x1cc [mtk_rpmsg] +[ 16.242131] #3: ffff5b4d05964190 (&dev->mutex){....}-{4:4}, at: __device_attach+0x44/0x190 + +To solve this, simply unlock the channels_lock mutex before calling +mtk_rpmsg_register_device() and relock it right after, as safety is +still ensured by the locking mechanism that happens right after +through SCP. + +Fixes: 7017996951fd ("rpmsg: add rpmsg support for mt8183 SCP.") +Signed-off-by: AngeloGioacchino Del Regno +Link: https://lore.kernel.org/r/20220525091201.14210-1-angelogioacchino.delregno@collabora.com +Signed-off-by: Mathieu Poirier +Signed-off-by: Sasha Levin +--- + drivers/rpmsg/mtk_rpmsg.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/rpmsg/mtk_rpmsg.c b/drivers/rpmsg/mtk_rpmsg.c +index 96a17ec29140..2d8cb596ad69 100644 +--- a/drivers/rpmsg/mtk_rpmsg.c ++++ b/drivers/rpmsg/mtk_rpmsg.c +@@ -234,7 +234,9 @@ static void mtk_register_device_work_function(struct work_struct *register_work) + if (info->registered) + continue; + ++ mutex_unlock(&subdev->channels_lock); + ret = mtk_rpmsg_register_device(subdev, &info->info); ++ mutex_lock(&subdev->channels_lock); + if (ret) { + dev_err(&pdev->dev, "Can't create rpmsg_device\n"); + continue; +-- +2.35.1 + diff --git a/queue-5.10/rpmsg-qcom_smd-fix-refcount-leak-in-qcom_smd_parse_e.patch b/queue-5.10/rpmsg-qcom_smd-fix-refcount-leak-in-qcom_smd_parse_e.patch new file mode 100644 index 00000000000..f03b1685663 --- /dev/null +++ b/queue-5.10/rpmsg-qcom_smd-fix-refcount-leak-in-qcom_smd_parse_e.patch @@ -0,0 +1,36 @@ +From a0eb6781d9bdd1c2ce8174f637dbc973e3e2cffc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 11 May 2022 16:07:37 +0400 +Subject: rpmsg: qcom_smd: Fix refcount leak in qcom_smd_parse_edge + +From: Miaoqian Lin + +[ Upstream commit 65382585f067d4256ba087934f30f85c9b6984de ] + +of_parse_phandle() returns a node pointer with refcount +incremented, we should use of_node_put() on it when done. + +Fixes: 53e2822e56c7 ("rpmsg: Introduce Qualcomm SMD backend") +Signed-off-by: Miaoqian Lin +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220511120737.57374-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/rpmsg/qcom_smd.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c +index a4db9f6100d2..0b1e853d8c91 100644 +--- a/drivers/rpmsg/qcom_smd.c ++++ b/drivers/rpmsg/qcom_smd.c +@@ -1364,6 +1364,7 @@ static int qcom_smd_parse_edge(struct device *dev, + } + + edge->ipc_regmap = syscon_node_to_regmap(syscon_np); ++ of_node_put(syscon_np); + if (IS_ERR(edge->ipc_regmap)) { + ret = PTR_ERR(edge->ipc_regmap); + goto put_node; +-- +2.35.1 + diff --git a/queue-5.10/s390-dump-fix-old-lowcore-virtual-vs-physical-addres.patch b/queue-5.10/s390-dump-fix-old-lowcore-virtual-vs-physical-addres.patch new file mode 100644 index 00000000000..00fec5dc209 --- /dev/null +++ b/queue-5.10/s390-dump-fix-old-lowcore-virtual-vs-physical-addres.patch @@ -0,0 +1,82 @@ +From 519a12cfebe2af80548888d0ae0450f4989f6413 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 29 Jan 2022 08:38:56 +0100 +Subject: s390/dump: fix old lowcore virtual vs physical address confusion + +From: Alexander Gordeev + +[ Upstream commit dc306186a130c6d9feb0aabc1c71b8ed1674a3bf ] + +Virtual addresses of vmcore_info and os_info members are +wrongly passed to copy_oldmem_kernel(), while the function +expects physical address of the source. Instead, __pa() +macro should have been applied. + +Yet, use of __pa() macro could be somehow confusing, since +copy_oldmem_kernel() may treat the source as an offset, not +as a direct physical address (that depens from the oldmem +availability and location). + +Fix the virtual vs physical address confusion and make the +way the old lowcore is read consistent across all sources. + +Reviewed-by: Heiko Carstens +Signed-off-by: Alexander Gordeev +Signed-off-by: Vasily Gorbik +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/asm-offsets.c | 2 ++ + arch/s390/kernel/crash_dump.c | 2 +- + arch/s390/kernel/os_info.c | 3 ++- + 3 files changed, 5 insertions(+), 2 deletions(-) + +diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c +index 483051e10db3..e070073930a9 100644 +--- a/arch/s390/kernel/asm-offsets.c ++++ b/arch/s390/kernel/asm-offsets.c +@@ -150,6 +150,8 @@ int main(void) + OFFSET(__LC_BR_R1, lowcore, br_r1_trampoline); + /* software defined ABI-relevant lowcore locations 0xe00 - 0xe20 */ + OFFSET(__LC_DUMP_REIPL, lowcore, ipib); ++ OFFSET(__LC_VMCORE_INFO, lowcore, vmcore_info); ++ OFFSET(__LC_OS_INFO, lowcore, os_info); + /* hardware defined lowcore locations 0x1000 - 0x18ff */ + OFFSET(__LC_MCESAD, lowcore, mcesad); + OFFSET(__LC_EXT_PARAMS2, lowcore, ext_params2); +diff --git a/arch/s390/kernel/crash_dump.c b/arch/s390/kernel/crash_dump.c +index 205b2e2648aa..76762dc67ca9 100644 +--- a/arch/s390/kernel/crash_dump.c ++++ b/arch/s390/kernel/crash_dump.c +@@ -432,7 +432,7 @@ static void *get_vmcoreinfo_old(unsigned long *size) + Elf64_Nhdr note; + void *addr; + +- if (copy_oldmem_kernel(&addr, &S390_lowcore.vmcore_info, sizeof(addr))) ++ if (copy_oldmem_kernel(&addr, (void *)__LC_VMCORE_INFO, sizeof(addr))) + return NULL; + memset(nt_name, 0, sizeof(nt_name)); + if (copy_oldmem_kernel(¬e, addr, sizeof(note))) +diff --git a/arch/s390/kernel/os_info.c b/arch/s390/kernel/os_info.c +index 0a5e4bafb6ad..1b8e2aff20e3 100644 +--- a/arch/s390/kernel/os_info.c ++++ b/arch/s390/kernel/os_info.c +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + + /* + * OS info structure has to be page aligned +@@ -123,7 +124,7 @@ static void os_info_old_init(void) + return; + if (!OLDMEM_BASE) + goto fail; +- if (copy_oldmem_kernel(&addr, &S390_lowcore.os_info, sizeof(addr))) ++ if (copy_oldmem_kernel(&addr, (void *)__LC_OS_INFO, sizeof(addr))) + goto fail; + if (addr == 0 || addr % PAGE_SIZE) + goto fail; +-- +2.35.1 + diff --git a/queue-5.10/s390-zcore-fix-race-when-reading-from-hardware-syste.patch b/queue-5.10/s390-zcore-fix-race-when-reading-from-hardware-syste.patch new file mode 100644 index 00000000000..045354c9464 --- /dev/null +++ b/queue-5.10/s390-zcore-fix-race-when-reading-from-hardware-syste.patch @@ -0,0 +1,84 @@ +From 4d61ef8e8da258b83aae36738f00952677da3080 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 07:16:33 +0200 +Subject: s390/zcore: fix race when reading from hardware system area + +From: Alexander Gordeev + +[ Upstream commit 9ffed254d938c9e99eb7761c7f739294c84e0367 ] + +Memory buffer used for reading out data from hardware system +area is not protected against concurrent access. + +Reported-by: Matthew Wilcox +Fixes: 411ed3225733 ("[S390] zfcpdump support.") +Acked-by: Heiko Carstens +Tested-by: Alexander Egorenkov +Link: https://lore.kernel.org/r/e68137f0f9a0d2558f37becc20af18e2939934f6.1658206891.git.agordeev@linux.ibm.com +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + drivers/s390/char/zcore.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/drivers/s390/char/zcore.c b/drivers/s390/char/zcore.c +index 1515fdc3c1ab..3841c0e77df6 100644 +--- a/drivers/s390/char/zcore.c ++++ b/drivers/s390/char/zcore.c +@@ -48,6 +48,7 @@ static struct dentry *zcore_reipl_file; + static struct dentry *zcore_hsa_file; + static struct ipl_parameter_block *zcore_ipl_block; + ++static DEFINE_MUTEX(hsa_buf_mutex); + static char hsa_buf[PAGE_SIZE] __aligned(PAGE_SIZE); + + /* +@@ -64,19 +65,24 @@ int memcpy_hsa_user(void __user *dest, unsigned long src, size_t count) + if (!hsa_available) + return -ENODATA; + ++ mutex_lock(&hsa_buf_mutex); + while (count) { + if (sclp_sdias_copy(hsa_buf, src / PAGE_SIZE + 2, 1)) { + TRACE("sclp_sdias_copy() failed\n"); ++ mutex_unlock(&hsa_buf_mutex); + return -EIO; + } + offset = src % PAGE_SIZE; + bytes = min(PAGE_SIZE - offset, count); +- if (copy_to_user(dest, hsa_buf + offset, bytes)) ++ if (copy_to_user(dest, hsa_buf + offset, bytes)) { ++ mutex_unlock(&hsa_buf_mutex); + return -EFAULT; ++ } + src += bytes; + dest += bytes; + count -= bytes; + } ++ mutex_unlock(&hsa_buf_mutex); + return 0; + } + +@@ -94,9 +100,11 @@ int memcpy_hsa_kernel(void *dest, unsigned long src, size_t count) + if (!hsa_available) + return -ENODATA; + ++ mutex_lock(&hsa_buf_mutex); + while (count) { + if (sclp_sdias_copy(hsa_buf, src / PAGE_SIZE + 2, 1)) { + TRACE("sclp_sdias_copy() failed\n"); ++ mutex_unlock(&hsa_buf_mutex); + return -EIO; + } + offset = src % PAGE_SIZE; +@@ -106,6 +114,7 @@ int memcpy_hsa_kernel(void *dest, unsigned long src, size_t count) + dest += bytes; + count -= bytes; + } ++ mutex_unlock(&hsa_buf_mutex); + return 0; + } + +-- +2.35.1 + diff --git a/queue-5.10/sched-cpuset-fix-dl_cpu_busy-panic-due-to-empty-cs-c.patch b/queue-5.10/sched-cpuset-fix-dl_cpu_busy-panic-due-to-empty-cs-c.patch new file mode 100644 index 00000000000..3608cf4b70c --- /dev/null +++ b/queue-5.10/sched-cpuset-fix-dl_cpu_busy-panic-due-to-empty-cs-c.patch @@ -0,0 +1,109 @@ +From f084aa4f03d6bc33e24f309b8afb844ea959374a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Aug 2022 21:54:51 -0400 +Subject: sched, cpuset: Fix dl_cpu_busy() panic due to empty cs->cpus_allowed + +From: Waiman Long + +[ Upstream commit b6e8d40d43ae4dec00c8fea2593eeea3114b8f44 ] + +With cgroup v2, the cpuset's cpus_allowed mask can be empty indicating +that the cpuset will just use the effective CPUs of its parent. So +cpuset_can_attach() can call task_can_attach() with an empty mask. +This can lead to cpumask_any_and() returns nr_cpu_ids causing the call +to dl_bw_of() to crash due to percpu value access of an out of bound +CPU value. For example: + + [80468.182258] BUG: unable to handle page fault for address: ffffffff8b6648b0 + : + [80468.191019] RIP: 0010:dl_cpu_busy+0x30/0x2b0 + : + [80468.207946] Call Trace: + [80468.208947] cpuset_can_attach+0xa0/0x140 + [80468.209953] cgroup_migrate_execute+0x8c/0x490 + [80468.210931] cgroup_update_dfl_csses+0x254/0x270 + [80468.211898] cgroup_subtree_control_write+0x322/0x400 + [80468.212854] kernfs_fop_write_iter+0x11c/0x1b0 + [80468.213777] new_sync_write+0x11f/0x1b0 + [80468.214689] vfs_write+0x1eb/0x280 + [80468.215592] ksys_write+0x5f/0xe0 + [80468.216463] do_syscall_64+0x5c/0x80 + [80468.224287] entry_SYSCALL_64_after_hwframe+0x44/0xae + +Fix that by using effective_cpus instead. For cgroup v1, effective_cpus +is the same as cpus_allowed. For v2, effective_cpus is the real cpumask +to be used by tasks within the cpuset anyway. + +Also update task_can_attach()'s 2nd argument name to cs_effective_cpus to +reflect the change. In addition, a check is added to task_can_attach() +to guard against the possibility that cpumask_any_and() may return a +value >= nr_cpu_ids. + +Fixes: 7f51412a415d ("sched/deadline: Fix bandwidth check/update when migrating tasks between exclusive cpusets") +Signed-off-by: Waiman Long +Signed-off-by: Ingo Molnar +Acked-by: Juri Lelli +Link: https://lore.kernel.org/r/20220803015451.2219567-1-longman@redhat.com +Signed-off-by: Sasha Levin +--- + include/linux/sched.h | 2 +- + kernel/cgroup/cpuset.c | 2 +- + kernel/sched/core.c | 8 +++++--- + 3 files changed, 7 insertions(+), 5 deletions(-) + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index 4bca80c9931f..4e8425c1c560 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -1658,7 +1658,7 @@ current_restore_flags(unsigned long orig_flags, unsigned long flags) + } + + extern int cpuset_cpumask_can_shrink(const struct cpumask *cur, const struct cpumask *trial); +-extern int task_can_attach(struct task_struct *p, const struct cpumask *cs_cpus_allowed); ++extern int task_can_attach(struct task_struct *p, const struct cpumask *cs_effective_cpus); + #ifdef CONFIG_SMP + extern void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask); + extern int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask); +diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c +index ec39e123c2a5..c51863b63f93 100644 +--- a/kernel/cgroup/cpuset.c ++++ b/kernel/cgroup/cpuset.c +@@ -2162,7 +2162,7 @@ static int cpuset_can_attach(struct cgroup_taskset *tset) + goto out_unlock; + + cgroup_taskset_for_each(task, css, tset) { +- ret = task_can_attach(task, cs->cpus_allowed); ++ ret = task_can_attach(task, cs->effective_cpus); + if (ret) + goto out_unlock; + ret = security_task_setscheduler(task); +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 042efabf5378..8765de76a179 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -6586,7 +6586,7 @@ int cpuset_cpumask_can_shrink(const struct cpumask *cur, + } + + int task_can_attach(struct task_struct *p, +- const struct cpumask *cs_cpus_allowed) ++ const struct cpumask *cs_effective_cpus) + { + int ret = 0; + +@@ -6605,9 +6605,11 @@ int task_can_attach(struct task_struct *p, + } + + if (dl_task(p) && !cpumask_intersects(task_rq(p)->rd->span, +- cs_cpus_allowed)) { +- int cpu = cpumask_any_and(cpu_active_mask, cs_cpus_allowed); ++ cs_effective_cpus)) { ++ int cpu = cpumask_any_and(cpu_active_mask, cs_effective_cpus); + ++ if (unlikely(cpu >= nr_cpu_ids)) ++ return -EINVAL; + ret = dl_cpu_busy(cpu, p); + } + +-- +2.35.1 + diff --git a/queue-5.10/sched-deadline-merge-dl_task_can_attach-and-dl_cpu_b.patch b/queue-5.10/sched-deadline-merge-dl_task_can_attach-and-dl_cpu_b.patch new file mode 100644 index 00000000000..aa540e562c1 --- /dev/null +++ b/queue-5.10/sched-deadline-merge-dl_task_can_attach-and-dl_cpu_b.patch @@ -0,0 +1,164 @@ +From aae2dcfad85349479b649af5bb273a6934829012 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Mar 2022 19:34:30 +0100 +Subject: sched/deadline: Merge dl_task_can_attach() and dl_cpu_busy() + +From: Dietmar Eggemann + +[ Upstream commit 772b6539fdda31462cc08368e78df60b31a58bab ] + +Both functions are doing almost the same, that is checking if admission +control is still respected. + +With exclusive cpusets, dl_task_can_attach() checks if the destination +cpuset (i.e. its root domain) has enough CPU capacity to accommodate the +task. +dl_cpu_busy() checks if there is enough CPU capacity in the cpuset in +case the CPU is hot-plugged out. + +dl_task_can_attach() is used to check if a task can be admitted while +dl_cpu_busy() is used to check if a CPU can be hotplugged out. + +Make dl_cpu_busy() able to deal with a task and use it instead of +dl_task_can_attach() in task_can_attach(). + +Signed-off-by: Dietmar Eggemann +Signed-off-by: Peter Zijlstra (Intel) +Acked-by: Juri Lelli +Link: https://lore.kernel.org/r/20220302183433.333029-4-dietmar.eggemann@arm.com +Signed-off-by: Sasha Levin +--- + kernel/sched/core.c | 13 +++++++---- + kernel/sched/deadline.c | 52 +++++++++++------------------------------ + kernel/sched/sched.h | 3 +-- + 3 files changed, 24 insertions(+), 44 deletions(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index e437d946b27b..042efabf5378 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -6605,8 +6605,11 @@ int task_can_attach(struct task_struct *p, + } + + if (dl_task(p) && !cpumask_intersects(task_rq(p)->rd->span, +- cs_cpus_allowed)) +- ret = dl_task_can_attach(p, cs_cpus_allowed); ++ cs_cpus_allowed)) { ++ int cpu = cpumask_any_and(cpu_active_mask, cs_cpus_allowed); ++ ++ ret = dl_cpu_busy(cpu, p); ++ } + + out: + return ret; +@@ -6865,8 +6868,10 @@ static void cpuset_cpu_active(void) + static int cpuset_cpu_inactive(unsigned int cpu) + { + if (!cpuhp_tasks_frozen) { +- if (dl_cpu_busy(cpu)) +- return -EBUSY; ++ int ret = dl_cpu_busy(cpu, NULL); ++ ++ if (ret) ++ return ret; + cpuset_update_active_cpus(); + } else { + num_cpus_frozen++; +diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c +index 933706106b98..aaf98771f935 100644 +--- a/kernel/sched/deadline.c ++++ b/kernel/sched/deadline.c +@@ -2825,41 +2825,6 @@ bool dl_param_changed(struct task_struct *p, const struct sched_attr *attr) + } + + #ifdef CONFIG_SMP +-int dl_task_can_attach(struct task_struct *p, const struct cpumask *cs_cpus_allowed) +-{ +- unsigned long flags, cap; +- unsigned int dest_cpu; +- struct dl_bw *dl_b; +- bool overflow; +- int ret; +- +- dest_cpu = cpumask_any_and(cpu_active_mask, cs_cpus_allowed); +- +- rcu_read_lock_sched(); +- dl_b = dl_bw_of(dest_cpu); +- raw_spin_lock_irqsave(&dl_b->lock, flags); +- cap = dl_bw_capacity(dest_cpu); +- overflow = __dl_overflow(dl_b, cap, 0, p->dl.dl_bw); +- if (overflow) { +- ret = -EBUSY; +- } else { +- /* +- * We reserve space for this task in the destination +- * root_domain, as we can't fail after this point. +- * We will free resources in the source root_domain +- * later on (see set_cpus_allowed_dl()). +- */ +- int cpus = dl_bw_cpus(dest_cpu); +- +- __dl_add(dl_b, p->dl.dl_bw, cpus); +- ret = 0; +- } +- raw_spin_unlock_irqrestore(&dl_b->lock, flags); +- rcu_read_unlock_sched(); +- +- return ret; +-} +- + int dl_cpuset_cpumask_can_shrink(const struct cpumask *cur, + const struct cpumask *trial) + { +@@ -2881,7 +2846,7 @@ int dl_cpuset_cpumask_can_shrink(const struct cpumask *cur, + return ret; + } + +-bool dl_cpu_busy(unsigned int cpu) ++int dl_cpu_busy(int cpu, struct task_struct *p) + { + unsigned long flags, cap; + struct dl_bw *dl_b; +@@ -2891,11 +2856,22 @@ bool dl_cpu_busy(unsigned int cpu) + dl_b = dl_bw_of(cpu); + raw_spin_lock_irqsave(&dl_b->lock, flags); + cap = dl_bw_capacity(cpu); +- overflow = __dl_overflow(dl_b, cap, 0, 0); ++ overflow = __dl_overflow(dl_b, cap, 0, p ? p->dl.dl_bw : 0); ++ ++ if (!overflow && p) { ++ /* ++ * We reserve space for this task in the destination ++ * root_domain, as we can't fail after this point. ++ * We will free resources in the source root_domain ++ * later on (see set_cpus_allowed_dl()). ++ */ ++ __dl_add(dl_b, p->dl.dl_bw, dl_bw_cpus(cpu)); ++ } ++ + raw_spin_unlock_irqrestore(&dl_b->lock, flags); + rcu_read_unlock_sched(); + +- return overflow; ++ return overflow ? -EBUSY : 0; + } + #endif + +diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h +index 8d39f5d99172..12c65628801c 100644 +--- a/kernel/sched/sched.h ++++ b/kernel/sched/sched.h +@@ -347,9 +347,8 @@ extern void __setparam_dl(struct task_struct *p, const struct sched_attr *attr); + extern void __getparam_dl(struct task_struct *p, struct sched_attr *attr); + extern bool __checkparam_dl(const struct sched_attr *attr); + extern bool dl_param_changed(struct task_struct *p, const struct sched_attr *attr); +-extern int dl_task_can_attach(struct task_struct *p, const struct cpumask *cs_cpus_allowed); + extern int dl_cpuset_cpumask_can_shrink(const struct cpumask *cur, const struct cpumask *trial); +-extern bool dl_cpu_busy(unsigned int cpu); ++extern int dl_cpu_busy(int cpu, struct task_struct *p); + + #ifdef CONFIG_CGROUP_SCHED + +-- +2.35.1 + diff --git a/queue-5.10/sched-fix-the-check-of-nr_running-at-queue-wakelist.patch b/queue-5.10/sched-fix-the-check-of-nr_running-at-queue-wakelist.patch new file mode 100644 index 00000000000..4339d978860 --- /dev/null +++ b/queue-5.10/sched-fix-the-check-of-nr_running-at-queue-wakelist.patch @@ -0,0 +1,54 @@ +From 688797428a457b36c1dc74316324110b228cf1e9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Jun 2022 07:34:11 +0800 +Subject: sched: Fix the check of nr_running at queue wakelist + +From: Tianchen Ding + +[ Upstream commit 28156108fecb1f808b21d216e8ea8f0d205a530c ] + +The commit 2ebb17717550 ("sched/core: Offload wakee task activation if it +the wakee is descheduling") checked rq->nr_running <= 1 to avoid task +stacking when WF_ON_CPU. + +Per the ordering of writes to p->on_rq and p->on_cpu, observing p->on_cpu +(WF_ON_CPU) in ttwu_queue_cond() implies !p->on_rq, IOW p has gone through +the deactivate_task() in __schedule(), thus p has been accounted out of +rq->nr_running. As such, the task being the only runnable task on the rq +implies reading rq->nr_running == 0 at that point. + +The benchmark result is in [1]. + +[1] https://lore.kernel.org/all/e34de686-4e85-bde1-9f3c-9bbc86b38627@linux.alibaba.com/ + +Suggested-by: Valentin Schneider +Signed-off-by: Tianchen Ding +Signed-off-by: Peter Zijlstra (Intel) +Reviewed-by: Valentin Schneider +Link: https://lore.kernel.org/r/20220608233412.327341-2-dtcccc@linux.alibaba.com +Signed-off-by: Sasha Levin +--- + kernel/sched/core.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 8765de76a179..649440107cae 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -2671,8 +2671,12 @@ static inline bool ttwu_queue_cond(int cpu, int wake_flags) + * CPU then use the wakelist to offload the task activation to + * the soon-to-be-idle CPU as the current CPU is likely busy. + * nr_running is checked to avoid unnecessary task stacking. ++ * ++ * Note that we can only get here with (wakee) p->on_rq=0, ++ * p->on_cpu can be whatever, we've done the dequeue, so ++ * the wakee has been accounted out of ->nr_running. + */ +- if ((wake_flags & WF_ON_CPU) && cpu_rq(cpu)->nr_running <= 1) ++ if ((wake_flags & WF_ON_CPU) && !cpu_rq(cpu)->nr_running) + return true; + + return false; +-- +2.35.1 + diff --git a/queue-5.10/scripts-faddr2line-fix-vmlinux-detection-on-arm64.patch b/queue-5.10/scripts-faddr2line-fix-vmlinux-detection-on-arm64.patch new file mode 100644 index 00000000000..b6e3bf85aff --- /dev/null +++ b/queue-5.10/scripts-faddr2line-fix-vmlinux-detection-on-arm64.patch @@ -0,0 +1,47 @@ +From 5b698b3369e58f4e518ae85e6127cdf2827f66cf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jul 2022 11:01:23 -0700 +Subject: scripts/faddr2line: Fix vmlinux detection on arm64 + +From: Josh Poimboeuf + +[ Upstream commit b6a5068854cfe372da7dee3224dcf023ed5b00cb ] + +Since commit dcea997beed6 ("faddr2line: Fix overlapping text section +failures, the sequel"), faddr2line is completely broken on arm64. + +For some reason, on arm64, the vmlinux ELF object file type is ET_DYN +rather than ET_EXEC. Check for both when determining whether the object +is vmlinux. + +Modules and vmlinux.o have type ET_REL on all arches. + +Fixes: dcea997beed6 ("faddr2line: Fix overlapping text section failures, the sequel") +Reported-by: John Garry +Signed-off-by: Josh Poimboeuf +Signed-off-by: Ingo Molnar +Tested-by: John Garry +Link: https://lore.kernel.org/r/dad1999737471b06d6188ce4cdb11329aa41682c.1658426357.git.jpoimboe@kernel.org +Signed-off-by: Sasha Levin +--- + scripts/faddr2line | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/scripts/faddr2line b/scripts/faddr2line +index 94ed98dd899f..57099687e5e1 100755 +--- a/scripts/faddr2line ++++ b/scripts/faddr2line +@@ -112,7 +112,9 @@ __faddr2line() { + # section offsets. + local file_type=$(${READELF} --file-header $objfile | + ${AWK} '$1 == "Type:" { print $2; exit }') +- [[ $file_type = "EXEC" ]] && is_vmlinux=1 ++ if [[ $file_type = "EXEC" ]] || [[ $file_type == "DYN" ]]; then ++ is_vmlinux=1 ++ fi + + # Go through each of the object's symbols which match the func name. + # In rare cases there might be duplicates, in which case we print all +-- +2.35.1 + diff --git a/queue-5.10/scsi-smartpqi-fix-dma-direction-for-raid-requests.patch b/queue-5.10/scsi-smartpqi-fix-dma-direction-for-raid-requests.patch new file mode 100644 index 00000000000..a0766a69ba9 --- /dev/null +++ b/queue-5.10/scsi-smartpqi-fix-dma-direction-for-raid-requests.patch @@ -0,0 +1,68 @@ +From 3577558b5decbc35cf4dc8b3107fdfd3fd42c707 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 Jul 2022 13:47:36 -0500 +Subject: scsi: smartpqi: Fix DMA direction for RAID requests + +From: Mahesh Rajashekhara + +[ Upstream commit 69695aeaa6621bc49cdd7a8e5a8d1042461e496e ] + +Correct a SOP READ and WRITE DMA flags for some requests. + +This update corrects DMA direction issues with SCSI commands removed from +the controller's internal lookup table. + +Currently, SCSI READ BLOCK LIMITS (0x5) was removed from the controller +lookup table and exposed a DMA direction flag issue. + +SCSI READ BLOCK LIMITS was recently removed from our controller lookup +table so the controller uses the respective IU flag field to set the DMA +data direction. Since the DMA direction is incorrect the FW never completes +the request causing a hang. + +Some SCSI commands which use SCSI READ BLOCK LIMITS + + * sg_map + * mt -f /dev/stX status + +After updating controller firmware, users may notice their tape units +failing. This patch resolves the issue. + +Also, the AIO path DMA direction is correct. + +The DMA direction flag is a day-one bug with no reported BZ. + +Fixes: 6c223761eb54 ("smartpqi: initial commit of Microsemi smartpqi driver") +Link: https://lore.kernel.org/r/165730605618.177165.9054223644512926624.stgit@brunhilda +Reviewed-by: Scott Benesh +Reviewed-by: Scott Teel +Reviewed-by: Mike McGowen +Reviewed-by: Kevin Barnett +Signed-off-by: Mahesh Rajashekhara +Signed-off-by: Don Brace +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/smartpqi/smartpqi_init.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c +index de73ade70c24..fcff35e20a4a 100644 +--- a/drivers/scsi/smartpqi/smartpqi_init.c ++++ b/drivers/scsi/smartpqi/smartpqi_init.c +@@ -4997,10 +4997,10 @@ static int pqi_raid_submit_scsi_cmd_with_io_request( + } + + switch (scmd->sc_data_direction) { +- case DMA_TO_DEVICE: ++ case DMA_FROM_DEVICE: + request->data_direction = SOP_READ_FLAG; + break; +- case DMA_FROM_DEVICE: ++ case DMA_TO_DEVICE: + request->data_direction = SOP_WRITE_FLAG; + break; + case DMA_NONE: +-- +2.35.1 + diff --git a/queue-5.10/selftests-bpf-fix-a-test-for-snprintf-overflow.patch b/queue-5.10/selftests-bpf-fix-a-test-for-snprintf-overflow.patch new file mode 100644 index 00000000000..919a80d06e3 --- /dev/null +++ b/queue-5.10/selftests-bpf-fix-a-test-for-snprintf-overflow.patch @@ -0,0 +1,39 @@ +From 24b853948b2532d1b3b9ff9c069e94fb12343800 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 12:50:32 +0300 +Subject: selftests/bpf: fix a test for snprintf() overflow + +From: Dan Carpenter + +[ Upstream commit c5d22f4cfe8dfb93f1db0a1e7e2e7ebc41395d98 ] + +The snprintf() function returns the number of bytes which *would* +have been copied if there were space. In other words, it can be +> sizeof(pin_path). + +Fixes: c0fa1b6c3efc ("bpf: btf: Add BTF tests") +Signed-off-by: Dan Carpenter +Acked-by: Martin KaFai Lau +Link: https://lore.kernel.org/r/YtZ+aD/tZMkgOUw+@kili +Signed-off-by: Alexei Starovoitov +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/bpf/prog_tests/btf.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/testing/selftests/bpf/prog_tests/btf.c b/tools/testing/selftests/bpf/prog_tests/btf.c +index 93162484c2ca..48b01150e703 100644 +--- a/tools/testing/selftests/bpf/prog_tests/btf.c ++++ b/tools/testing/selftests/bpf/prog_tests/btf.c +@@ -4758,7 +4758,7 @@ static void do_test_pprint(int test_num) + ret = snprintf(pin_path, sizeof(pin_path), "%s/%s", + "/sys/fs/bpf", test->map_name); + +- if (CHECK(ret == sizeof(pin_path), "pin_path %s/%s is too long", ++ if (CHECK(ret >= sizeof(pin_path), "pin_path %s/%s is too long", + "/sys/fs/bpf", test->map_name)) { + err = -1; + goto done; +-- +2.35.1 + diff --git a/queue-5.10/selftests-kvm-set-rax-before-vmcall.patch b/queue-5.10/selftests-kvm-set-rax-before-vmcall.patch new file mode 100644 index 00000000000..fa4192ee162 --- /dev/null +++ b/queue-5.10/selftests-kvm-set-rax-before-vmcall.patch @@ -0,0 +1,45 @@ +From 7183a62bc12dc91d9ede3bba7639a0473dc5aaae Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jul 2022 16:02:40 -0700 +Subject: selftests: kvm: set rax before vmcall + +From: Andrei Vagin + +[ Upstream commit 281106f938d3daaea6f8b6723a8217a2a1ef6936 ] + +kvm_hypercall has to place the hypercall number in rax. + +Trace events show that kvm_pv_test doesn't work properly: + kvm_pv_test-53132: kvm_hypercall: nr 0x0 a0 0x0 a1 0x0 a2 0x0 a3 0x0 + kvm_pv_test-53132: kvm_hypercall: nr 0x0 a0 0x0 a1 0x0 a2 0x0 a3 0x0 + kvm_pv_test-53132: kvm_hypercall: nr 0x0 a0 0x0 a1 0x0 a2 0x0 a3 0x0 + +With this change, it starts working as expected: + kvm_pv_test-54285: kvm_hypercall: nr 0x5 a0 0x0 a1 0x0 a2 0x0 a3 0x0 + kvm_pv_test-54285: kvm_hypercall: nr 0xa a0 0x0 a1 0x0 a2 0x0 a3 0x0 + kvm_pv_test-54285: kvm_hypercall: nr 0xb a0 0x0 a1 0x0 a2 0x0 a3 0x0 + +Signed-off-by: Andrei Vagin +Message-Id: <20220722230241.1944655-5-avagin@google.com> +Fixes: ac4a4d6de22e ("selftests: kvm: test enforcement of paravirtual cpuid features") +Signed-off-by: Paolo Bonzini +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/kvm/lib/x86_64/processor.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c +index d10c5c05bdf0..f5d2d27bee05 100644 +--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c ++++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c +@@ -1253,6 +1253,6 @@ uint64_t kvm_hypercall(uint64_t nr, uint64_t a0, uint64_t a1, uint64_t a2, + + asm volatile("vmcall" + : "=a"(r) +- : "b"(a0), "c"(a1), "d"(a2), "S"(a3)); ++ : "a"(nr), "b"(a0), "c"(a1), "d"(a2), "S"(a3)); + return r; + } +-- +2.35.1 + diff --git a/queue-5.10/selftests-livepatch-better-synchronize-test_klp_call.patch b/queue-5.10/selftests-livepatch-better-synchronize-test_klp_call.patch new file mode 100644 index 00000000000..c54039b063d --- /dev/null +++ b/queue-5.10/selftests-livepatch-better-synchronize-test_klp_call.patch @@ -0,0 +1,79 @@ +From 145b46467f5e6b5f6d44b7b927e255dec36d1f0b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Jun 2022 16:32:33 -0400 +Subject: selftests/livepatch: better synchronize test_klp_callbacks_busy + +From: Joe Lawrence + +[ Upstream commit 55eb9a6c8bf3e2099863118ef53e02d9f44f85a8 ] + +The test_klp_callbacks_busy module conditionally blocks a future +livepatch transition by busy waiting inside its workqueue function, +busymod_work_func(). After scheduling this work, a test livepatch is +loaded, introducing the transition under test. + +Both events are marked in the kernel log for later verification, but +there is no synchronization to ensure that busymod_work_func() logs its +function entry message before subsequent selftest commands log their own +messages. This can lead to a rare test failure due to unexpected +ordering like: + + --- expected + +++ result + @@ -1,7 +1,7 @@ + % modprobe test_klp_callbacks_busy block_transition=Y + test_klp_callbacks_busy: test_klp_callbacks_busy_init + -test_klp_callbacks_busy: busymod_work_func enter + % modprobe test_klp_callbacks_demo + +test_klp_callbacks_busy: busymod_work_func enter + livepatch: enabling patch 'test_klp_callbacks_demo' + livepatch: 'test_klp_callbacks_demo': initializing patching transition + test_klp_callbacks_demo: pre_patch_callback: vmlinux + +Force the module init function to wait until busymod_work_func() has +started (and logged its message), before exiting to the next selftest +steps. + +Fixes: 547840bd5ae5 ("selftests/livepatch: simplify test-klp-callbacks busy target tests") +Signed-off-by: Joe Lawrence +Reviewed-by: Petr Mladek +Signed-off-by: Petr Mladek +Link: https://lore.kernel.org/r/20220602203233.979681-1-joe.lawrence@redhat.com +Signed-off-by: Sasha Levin +--- + lib/livepatch/test_klp_callbacks_busy.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/lib/livepatch/test_klp_callbacks_busy.c b/lib/livepatch/test_klp_callbacks_busy.c +index 7ac845f65be5..133929e0ce8f 100644 +--- a/lib/livepatch/test_klp_callbacks_busy.c ++++ b/lib/livepatch/test_klp_callbacks_busy.c +@@ -16,10 +16,12 @@ MODULE_PARM_DESC(block_transition, "block_transition (default=false)"); + + static void busymod_work_func(struct work_struct *work); + static DECLARE_WORK(work, busymod_work_func); ++static DECLARE_COMPLETION(busymod_work_started); + + static void busymod_work_func(struct work_struct *work) + { + pr_info("%s enter\n", __func__); ++ complete(&busymod_work_started); + + while (READ_ONCE(block_transition)) { + /* +@@ -37,6 +39,12 @@ static int test_klp_callbacks_busy_init(void) + pr_info("%s\n", __func__); + schedule_work(&work); + ++ /* ++ * To synchronize kernel messages, hold the init function from ++ * exiting until the work function's entry message has printed. ++ */ ++ wait_for_completion(&busymod_work_started); ++ + if (!block_transition) { + /* + * Serialize output: print all messages from the work +-- +2.35.1 + diff --git a/queue-5.10/selftests-seccomp-fix-compile-warning-when-cc-clang.patch b/queue-5.10/selftests-seccomp-fix-compile-warning-when-cc-clang.patch new file mode 100644 index 00000000000..e7ff99effce --- /dev/null +++ b/queue-5.10/selftests-seccomp-fix-compile-warning-when-cc-clang.patch @@ -0,0 +1,47 @@ +From dbf7e0c7ab79e2c314a0cddd440d1c4ad619e2c2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 May 2022 22:34:07 +0000 +Subject: selftests/seccomp: Fix compile warning when CC=clang + +From: YiFei Zhu + +[ Upstream commit 3ce4b78f73e8e00fb86bad67ee7f6fe12019707e ] + +clang has -Wconstant-conversion by default, and the constant 0xAAAAAAAAA +(9 As) being converted to an int, which is generally 32 bits, results +in the compile warning: + + clang -Wl,-no-as-needed -Wall -isystem ../../../../usr/include/ -lpthread seccomp_bpf.c -lcap -o seccomp_bpf + seccomp_bpf.c:812:67: warning: implicit conversion from 'long' to 'int' changes value from 45812984490 to -1431655766 [-Wconstant-conversion] + int kill = kill_how == KILL_PROCESS ? SECCOMP_RET_KILL_PROCESS : 0xAAAAAAAAA; + ~~~~ ^~~~~~~~~~~ + 1 warning generated. + +-1431655766 is the expected truncation, 0xAAAAAAAA (8 As), so use +this directly in the code to avoid the warning. + +Fixes: 3932fcecd962 ("selftests/seccomp: Add test for unknown SECCOMP_RET kill behavior") +Signed-off-by: YiFei Zhu +Signed-off-by: Kees Cook +Link: https://lore.kernel.org/r/20220526223407.1686936-1-zhuyifei@google.com +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/seccomp/seccomp_bpf.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c +index e36745995f22..413a7b9f3c4d 100644 +--- a/tools/testing/selftests/seccomp/seccomp_bpf.c ++++ b/tools/testing/selftests/seccomp/seccomp_bpf.c +@@ -798,7 +798,7 @@ void kill_thread_or_group(struct __test_metadata *_metadata, + .len = (unsigned short)ARRAY_SIZE(filter_thread), + .filter = filter_thread, + }; +- int kill = kill_how == KILL_PROCESS ? SECCOMP_RET_KILL_PROCESS : 0xAAAAAAAAA; ++ int kill = kill_how == KILL_PROCESS ? SECCOMP_RET_KILL_PROCESS : 0xAAAAAAAA; + struct sock_filter filter_process[] = { + BPF_STMT(BPF_LD|BPF_W|BPF_ABS, + offsetof(struct seccomp_data, nr)), +-- +2.35.1 + diff --git a/queue-5.10/selftests-timers-clocksource-switch-fix-passing-erro.patch b/queue-5.10/selftests-timers-clocksource-switch-fix-passing-erro.patch new file mode 100644 index 00000000000..bec2caac651 --- /dev/null +++ b/queue-5.10/selftests-timers-clocksource-switch-fix-passing-erro.patch @@ -0,0 +1,43 @@ +From 73278e428e0c9f4b8886b021836c4e702af2491a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jul 2022 22:46:17 +0200 +Subject: selftests: timers: clocksource-switch: fix passing errors from child + +From: Wolfram Sang + +[ Upstream commit 4d8f52ac5fa9eede7b7aa2f2d67c841d9eeb655f ] + +The return value from system() is a waitpid-style integer. Do not return +it directly because with the implicit masking in exit() it will always +return 0. Access it with appropriate macros to really pass on errors. + +Fixes: 7290ce1423c3 ("selftests/timers: Add clocksource-switch test from timetest suite") +Signed-off-by: Wolfram Sang +Acked-by: John Stultz +Signed-off-by: Shuah Khan +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/timers/clocksource-switch.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/tools/testing/selftests/timers/clocksource-switch.c b/tools/testing/selftests/timers/clocksource-switch.c +index bfc974b4572d..c18313a5f357 100644 +--- a/tools/testing/selftests/timers/clocksource-switch.c ++++ b/tools/testing/selftests/timers/clocksource-switch.c +@@ -110,10 +110,10 @@ int run_tests(int secs) + + sprintf(buf, "./inconsistency-check -t %i", secs); + ret = system(buf); +- if (ret) +- return ret; ++ if (WIFEXITED(ret) && WEXITSTATUS(ret)) ++ return WEXITSTATUS(ret); + ret = system("./nanosleep"); +- return ret; ++ return WIFEXITED(ret) ? WEXITSTATUS(ret) : 0; + } + + +-- +2.35.1 + diff --git a/queue-5.10/selftests-timers-valid-adjtimex-build-fix-for-newer-.patch b/queue-5.10/selftests-timers-valid-adjtimex-build-fix-for-newer-.patch new file mode 100644 index 00000000000..219a412f15b --- /dev/null +++ b/queue-5.10/selftests-timers-valid-adjtimex-build-fix-for-newer-.patch @@ -0,0 +1,42 @@ +From 5068745c65ef20bfc9531ae9bd8bfe7237da1c4b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jul 2022 22:46:13 +0200 +Subject: selftests: timers: valid-adjtimex: build fix for newer toolchains +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Wolfram Sang + +[ Upstream commit 9a162977d20436be5678a8e21a8e58eb4616d86a ] + +Toolchains with an include file 'sys/timex.h' based on 3.18 will have a +'clock_adjtime' definition added, so it can't be static in the code: + +valid-adjtimex.c:43:12: error: static declaration of ‘clock_adjtime’ follows non-static declaration + +Fixes: e03a58c320e1 ("kselftests: timers: Add adjtimex SETOFFSET validity tests") +Signed-off-by: Wolfram Sang +Acked-by: John Stultz +Signed-off-by: Shuah Khan +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/timers/valid-adjtimex.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/testing/selftests/timers/valid-adjtimex.c b/tools/testing/selftests/timers/valid-adjtimex.c +index 5397de708d3c..48b9a803235a 100644 +--- a/tools/testing/selftests/timers/valid-adjtimex.c ++++ b/tools/testing/selftests/timers/valid-adjtimex.c +@@ -40,7 +40,7 @@ + #define ADJ_SETOFFSET 0x0100 + + #include +-static int clock_adjtime(clockid_t id, struct timex *tx) ++int clock_adjtime(clockid_t id, struct timex *tx) + { + return syscall(__NR_clock_adjtime, id, tx); + } +-- +2.35.1 + diff --git a/queue-5.10/selftests-xsk-destroy-bpf-resources-only-when-ctx-re.patch b/queue-5.10/selftests-xsk-destroy-bpf-resources-only-when-ctx-re.patch new file mode 100644 index 00000000000..fed20fc2542 --- /dev/null +++ b/queue-5.10/selftests-xsk-destroy-bpf-resources-only-when-ctx-re.patch @@ -0,0 +1,77 @@ +From dd2142e4608ad9738808b683b22439cf5b7ff149 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 29 Jun 2022 16:34:58 +0200 +Subject: selftests/xsk: Destroy BPF resources only when ctx refcount drops to + 0 + +From: Maciej Fijalkowski + +[ Upstream commit 39e940d4abfabb08b6937a315546b24d10be67e3 ] + +Currently, xsk_socket__delete frees BPF resources regardless of ctx +refcount. Xdpxceiver has a test to verify whether underlying BPF +resources would not be wiped out after closing XSK socket that was +bound to interface with other active sockets. From library's xsk part +perspective it also means that the internal xsk context is shared and +its refcount is bumped accordingly. + +After a switch to loading XDP prog based on previously opened XSK +socket, mentioned xdpxceiver test fails with: + + not ok 16 [xdpxceiver.c:swap_xsk_resources:1334]: ERROR: 9/"Bad file descriptor + +which means that in swap_xsk_resources(), xsk_socket__delete() released +xskmap which in turn caused a failure of xsk_socket__update_xskmap(). + +To fix this, when deleting socket, decrement ctx refcount before +releasing BPF resources and do so only when refcount dropped to 0 which +means there are no more active sockets for this ctx so BPF resources can +be freed safely. + +Fixes: 2f6324a3937f ("libbpf: Support shared umems between queues and devices") +Signed-off-by: Maciej Fijalkowski +Signed-off-by: Daniel Borkmann +Acked-by: Magnus Karlsson +Link: https://lore.kernel.org/bpf/20220629143458.934337-5-maciej.fijalkowski@intel.com +Signed-off-by: Sasha Levin +--- + tools/lib/bpf/xsk.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/tools/lib/bpf/xsk.c b/tools/lib/bpf/xsk.c +index c4390ef98b19..e8745f646371 100644 +--- a/tools/lib/bpf/xsk.c ++++ b/tools/lib/bpf/xsk.c +@@ -849,8 +849,6 @@ int xsk_socket__create_shared(struct xsk_socket **xsk_ptr, + goto out_mmap_tx; + } + +- ctx->prog_fd = -1; +- + if (!(xsk->config.libbpf_flags & XSK_LIBBPF_FLAGS__INHIBIT_PROG_LOAD)) { + err = xsk_setup_xdp_prog(xsk); + if (err) +@@ -931,7 +929,10 @@ void xsk_socket__delete(struct xsk_socket *xsk) + + ctx = xsk->ctx; + umem = ctx->umem; +- if (ctx->prog_fd != -1) { ++ ++ xsk_put_ctx(ctx, true); ++ ++ if (!ctx->refcount) { + xsk_delete_bpf_maps(xsk); + close(ctx->prog_fd); + } +@@ -948,8 +949,6 @@ void xsk_socket__delete(struct xsk_socket *xsk) + } + } + +- xsk_put_ctx(ctx, true); +- + umem->refcount--; + /* Do not close an fd that also has an associated umem connected + * to it. +-- +2.35.1 + diff --git a/queue-5.10/selinux-add-boundary-check-in-put_entry.patch b/queue-5.10/selinux-add-boundary-check-in-put_entry.patch new file mode 100644 index 00000000000..13a484b5314 --- /dev/null +++ b/queue-5.10/selinux-add-boundary-check-in-put_entry.patch @@ -0,0 +1,35 @@ +From e82d25dcad0be48c1e940b7cf39845e5b3238672 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 14 Jun 2022 10:14:49 +0800 +Subject: selinux: Add boundary check in put_entry() + +From: Xiu Jianfeng + +[ Upstream commit 15ec76fb29be31df2bccb30fc09875274cba2776 ] + +Just like next_entry(), boundary check is necessary to prevent memory +out-of-bound access. + +Signed-off-by: Xiu Jianfeng +Signed-off-by: Paul Moore +Signed-off-by: Sasha Levin +--- + security/selinux/ss/policydb.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/security/selinux/ss/policydb.h b/security/selinux/ss/policydb.h +index c24d4e1063ea..ffc4e7bad205 100644 +--- a/security/selinux/ss/policydb.h ++++ b/security/selinux/ss/policydb.h +@@ -370,6 +370,8 @@ static inline int put_entry(const void *buf, size_t bytes, int num, struct polic + { + size_t len = bytes * num; + ++ if (len > fp->len) ++ return -EINVAL; + memcpy(fp->data, buf, len); + fp->data += len; + fp->len -= len; +-- +2.35.1 + diff --git a/queue-5.10/serial-8250-export-icr-access-helpers-for-internal-u.patch b/queue-5.10/serial-8250-export-icr-access-helpers-for-internal-u.patch new file mode 100644 index 00000000000..0edcf968a28 --- /dev/null +++ b/queue-5.10/serial-8250-export-icr-access-helpers-for-internal-u.patch @@ -0,0 +1,110 @@ +From 286fb229d671b7638168d7afb2314dc6b96e3107 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Apr 2022 16:27:27 +0100 +Subject: serial: 8250: Export ICR access helpers for internal use + +From: Maciej W. Rozycki + +[ Upstream commit cb5a40e3143bc64437858b337273fd63cc42e9c2 ] + +Make ICR access helpers available outside 8250_port.c, however retain +them as ordinary static functions so as not to regress code generation. + +This is because `serial_icr_write' is currently automatically inlined by +GCC, however `serial_icr_read' is not. Making them both static inline +would grow code produced, e.g.: + +$ i386-linux-gnu-size --format=gnu 8250_port-{old,new}.o + text data bss total filename + 15065 3378 0 18443 8250_port-old.o + 15289 3378 0 18667 8250_port-new.o + +and: + +$ riscv64-linux-gnu-size --format=gnu 8250_port-{old,new}.o + text data bss total filename + 16980 5306 0 22286 8250_port-old.o + 17124 5306 0 22430 8250_port-new.o + +while making them external would needlessly add a new module interface +and lose the benefit from `serial_icr_write' getting inlined outside +8250_port.o. + +Signed-off-by: Maciej W. Rozycki +Reviewed-by: Andy Shevchenko +Link: https://lore.kernel.org/r/alpine.DEB.2.21.2204181517500.9383@angie.orcam.me.uk +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/8250/8250.h | 22 ++++++++++++++++++++++ + drivers/tty/serial/8250/8250_port.c | 21 --------------------- + 2 files changed, 22 insertions(+), 21 deletions(-) + +diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h +index 34aa2714f3c9..b6dc9003b8c4 100644 +--- a/drivers/tty/serial/8250/8250.h ++++ b/drivers/tty/serial/8250/8250.h +@@ -119,6 +119,28 @@ static inline void serial_out(struct uart_8250_port *up, int offset, int value) + up->port.serial_out(&up->port, offset, value); + } + ++/* ++ * For the 16C950 ++ */ ++static void serial_icr_write(struct uart_8250_port *up, int offset, int value) ++{ ++ serial_out(up, UART_SCR, offset); ++ serial_out(up, UART_ICR, value); ++} ++ ++static unsigned int __maybe_unused serial_icr_read(struct uart_8250_port *up, ++ int offset) ++{ ++ unsigned int value; ++ ++ serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD); ++ serial_out(up, UART_SCR, offset); ++ value = serial_in(up, UART_ICR); ++ serial_icr_write(up, UART_ACR, up->acr); ++ ++ return value; ++} ++ + void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p); + + static inline int serial_dl_read(struct uart_8250_port *up) +diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c +index 43884e8b5161..9d60418e4adb 100644 +--- a/drivers/tty/serial/8250/8250_port.c ++++ b/drivers/tty/serial/8250/8250_port.c +@@ -529,27 +529,6 @@ serial_port_out_sync(struct uart_port *p, int offset, int value) + } + } + +-/* +- * For the 16C950 +- */ +-static void serial_icr_write(struct uart_8250_port *up, int offset, int value) +-{ +- serial_out(up, UART_SCR, offset); +- serial_out(up, UART_ICR, value); +-} +- +-static unsigned int serial_icr_read(struct uart_8250_port *up, int offset) +-{ +- unsigned int value; +- +- serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD); +- serial_out(up, UART_SCR, offset); +- value = serial_in(up, UART_ICR); +- serial_icr_write(up, UART_ACR, up->acr); +- +- return value; +-} +- + /* + * FIFO support. + */ +-- +2.35.1 + diff --git a/queue-5.10/serial-8250_dw-store-lsr-into-lsr_saved_flags-in-dw8.patch b/queue-5.10/serial-8250_dw-store-lsr-into-lsr_saved_flags-in-dw8.patch new file mode 100644 index 00000000000..fc1b6776e28 --- /dev/null +++ b/queue-5.10/serial-8250_dw-store-lsr-into-lsr_saved_flags-in-dw8.patch @@ -0,0 +1,54 @@ +From 764513c39d611abea2f150bd4c4ed5de8c34700b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Jun 2022 12:54:31 +0300 +Subject: serial: 8250_dw: Store LSR into lsr_saved_flags in + dw8250_tx_wait_empty() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ilpo Järvinen + +[ Upstream commit af14f3007e2dca0d112f10f6717ba43093f74e81 ] + +Make sure LSR flags are preserved in dw8250_tx_wait_empty(). This +function is called from a low-level out function and therefore cannot +call serial_lsr_in() as it would lead to infinite recursion. + +It is borderline if the flags need to be saved here at all since this +code relates to writing LCR register which usually implies no important +characters should be arriving. + +Fixes: 914eaf935ec7 ("serial: 8250_dw: Allow TX FIFO to drain before writing to UART_LCR") +Reviewed-by: Andy Shevchenko +Signed-off-by: Ilpo Järvinen +Link: https://lore.kernel.org/r/20220608095431.18376-7-ilpo.jarvinen@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/8250/8250_dw.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c +index 49559731bbcf..ace221afeb03 100644 +--- a/drivers/tty/serial/8250/8250_dw.c ++++ b/drivers/tty/serial/8250/8250_dw.c +@@ -124,12 +124,15 @@ static void dw8250_check_lcr(struct uart_port *p, int value) + /* Returns once the transmitter is empty or we run out of retries */ + static void dw8250_tx_wait_empty(struct uart_port *p) + { ++ struct uart_8250_port *up = up_to_u8250p(p); + unsigned int tries = 20000; + unsigned int delay_threshold = tries - 1000; + unsigned int lsr; + + while (tries--) { + lsr = readb (p->membase + (UART_LSR << p->regshift)); ++ up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; ++ + if (lsr & UART_LSR_TEMT) + break; + +-- +2.35.1 + diff --git a/queue-5.10/serial-8250_fsl-don-t-report-fe-pe-and-oe-twice.patch b/queue-5.10/serial-8250_fsl-don-t-report-fe-pe-and-oe-twice.patch new file mode 100644 index 00000000000..7b0f02f23c5 --- /dev/null +++ b/queue-5.10/serial-8250_fsl-don-t-report-fe-pe-and-oe-twice.patch @@ -0,0 +1,68 @@ +From 3a2ec9442b5813e6554b487080bfcece2ce0ee31 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 Jul 2022 10:51:19 +0200 +Subject: serial: 8250_fsl: Don't report FE, PE and OE twice +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit 9d3aaceb73acadf134596a2f8db9c451c1332d3d ] + +Some Freescale 8250 implementations have the problem that a single long +break results in one irq per character frame time. The code in +fsl8250_handle_irq() that is supposed to handle that uses the BI bit in +lsr_saved_flags to detect such a situation and then skip the second +received character. However it also stores other error bits and so after +a single frame error the character received in the next irq handling is +passed to the upper layer with a frame error, too. + +So after a spike on the data line (which is correctly recognized as a +frame error) the following valid character is thrown away, because the +driver reports a frame error for that one, too. + +To weaken this problem restrict saving LSR to only the BI bit. + +Note however that the handling is still broken: + + - lsr_saved_flags is updated using orig_lsr which is the LSR content + for the first received char, but there might be more in the FIFO, so + a character is thrown away that is received later and not necessarily + the one following the break. + - The doubled break might be the 2nd and 3rd char in the FIFO, so the + workaround doesn't catch these, because serial8250_rx_chars() doesn't + handle the workaround. + - lsr_saved_flags might have set UART_LSR_BI at the entry of + fsl8250_handle_irq() which doesn't originate from + fsl8250_handle_irq()'s "up->lsr_saved_flags |= orig_lsr & + UART_LSR_BI;" but from e.g. from serial8250_tx_empty(). + - For a long or a short break this isn't about two characters, but more + or only a single one. + +Fixes: 9deaa53ac7fa ("serial: add irq handler for Freescale 16550 errata.") +Acked-by: Ilpo Järvinen +Signed-off-by: Uwe Kleine-König +Link: https://lore.kernel.org/r/20220704085119.55900-1-u.kleine-koenig@pengutronix.de +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/8250/8250_fsl.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/8250/8250_fsl.c b/drivers/tty/serial/8250/8250_fsl.c +index 24f540835178..cf27db0126d8 100644 +--- a/drivers/tty/serial/8250/8250_fsl.c ++++ b/drivers/tty/serial/8250/8250_fsl.c +@@ -80,7 +80,7 @@ int fsl8250_handle_irq(struct uart_port *port) + if ((lsr & UART_LSR_THRE) && (up->ier & UART_IER_THRI)) + serial8250_tx_chars(up); + +- up->lsr_saved_flags = orig_lsr; ++ up->lsr_saved_flags |= orig_lsr & UART_LSR_BI; + + uart_unlock_and_check_sysrq(&up->port); + +-- +2.35.1 + diff --git a/queue-5.10/serial-do-not-restore-interrupt-state-in-sysrq-helpe.patch b/queue-5.10/serial-do-not-restore-interrupt-state-in-sysrq-helpe.patch new file mode 100644 index 00000000000..049cdbd2bb8 --- /dev/null +++ b/queue-5.10/serial-do-not-restore-interrupt-state-in-sysrq-helpe.patch @@ -0,0 +1,246 @@ +From 84bfe97f821df750b136c6d4a8529466e29ed164 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 16 Apr 2021 16:05:55 +0200 +Subject: serial: do not restore interrupt state in sysrq helper + +From: Johan Hovold + +[ Upstream commit 75f4e830fa9c47637054a3b7201765f2a314bda2 ] + +The uart_unlock_and_check_sysrq() helper can be used to defer processing +of sysrq until the interrupt handler has released the port lock and is +about to return. + +Since commit 81e2073c175b ("genirq: Disable interrupts for force +threaded handlers") interrupt handlers that are not explicitly requested +as threaded are always called with interrupts disabled and there is no +need to save the interrupt state when taking the port lock. + +Instead of adding another sysrq helper for when the interrupt state has +not needlessly been saved, drop the state parameter from +uart_unlock_and_check_sysrq() and update its callers to no longer +explicitly disable interrupts in their interrupt handlers. + +Cc: Joel Stanley +Cc: Andrew Jeffery +Cc: Andy Gross +Cc: Bjorn Andersson +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20210416140557.25177-2-johan@kernel.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/8250/8250_aspeed_vuart.c | 5 ++--- + drivers/tty/serial/8250/8250_fsl.c | 11 ++++++----- + drivers/tty/serial/8250/8250_omap.c | 6 +++--- + drivers/tty/serial/8250/8250_port.c | 6 +++--- + drivers/tty/serial/qcom_geni_serial.c | 6 +++--- + include/linux/serial_core.h | 10 +++++----- + 6 files changed, 22 insertions(+), 22 deletions(-) + +diff --git a/drivers/tty/serial/8250/8250_aspeed_vuart.c b/drivers/tty/serial/8250/8250_aspeed_vuart.c +index ec0d1da71a20..dfb81b45b02c 100644 +--- a/drivers/tty/serial/8250/8250_aspeed_vuart.c ++++ b/drivers/tty/serial/8250/8250_aspeed_vuart.c +@@ -297,7 +297,6 @@ static int aspeed_vuart_handle_irq(struct uart_port *port) + { + struct uart_8250_port *up = up_to_u8250p(port); + unsigned int iir, lsr; +- unsigned long flags; + int space, count; + + iir = serial_port_in(port, UART_IIR); +@@ -305,7 +304,7 @@ static int aspeed_vuart_handle_irq(struct uart_port *port) + if (iir & UART_IIR_NO_INT) + return 0; + +- spin_lock_irqsave(&port->lock, flags); ++ spin_lock(&port->lock); + + lsr = serial_port_in(port, UART_LSR); + +@@ -341,7 +340,7 @@ static int aspeed_vuart_handle_irq(struct uart_port *port) + if (lsr & UART_LSR_THRE) + serial8250_tx_chars(up); + +- uart_unlock_and_check_sysrq(port, flags); ++ uart_unlock_and_check_sysrq(port); + + return 1; + } +diff --git a/drivers/tty/serial/8250/8250_fsl.c b/drivers/tty/serial/8250/8250_fsl.c +index fbcc90c31ca1..24f540835178 100644 +--- a/drivers/tty/serial/8250/8250_fsl.c ++++ b/drivers/tty/serial/8250/8250_fsl.c +@@ -30,15 +30,14 @@ struct fsl8250_data { + int fsl8250_handle_irq(struct uart_port *port) + { + unsigned char lsr, orig_lsr; +- unsigned long flags; + unsigned int iir; + struct uart_8250_port *up = up_to_u8250p(port); + +- spin_lock_irqsave(&up->port.lock, flags); ++ spin_lock(&up->port.lock); + + iir = port->serial_in(port, UART_IIR); + if (iir & UART_IIR_NO_INT) { +- spin_unlock_irqrestore(&up->port.lock, flags); ++ spin_unlock(&up->port.lock); + return 0; + } + +@@ -46,7 +45,7 @@ int fsl8250_handle_irq(struct uart_port *port) + if (unlikely(up->lsr_saved_flags & UART_LSR_BI)) { + up->lsr_saved_flags &= ~UART_LSR_BI; + port->serial_in(port, UART_RX); +- spin_unlock_irqrestore(&up->port.lock, flags); ++ spin_unlock(&up->port.lock); + return 1; + } + +@@ -82,7 +81,9 @@ int fsl8250_handle_irq(struct uart_port *port) + serial8250_tx_chars(up); + + up->lsr_saved_flags = orig_lsr; +- uart_unlock_and_check_sysrq(&up->port, flags); ++ ++ uart_unlock_and_check_sysrq(&up->port); ++ + return 1; + } + EXPORT_SYMBOL_GPL(fsl8250_handle_irq); +diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c +index 537bee8d2258..7223e22c4b88 100644 +--- a/drivers/tty/serial/8250/8250_omap.c ++++ b/drivers/tty/serial/8250/8250_omap.c +@@ -1179,7 +1179,6 @@ static int omap_8250_dma_handle_irq(struct uart_port *port) + struct uart_8250_port *up = up_to_u8250p(port); + struct omap8250_priv *priv = up->port.private_data; + unsigned char status; +- unsigned long flags; + u8 iir; + + serial8250_rpm_get(up); +@@ -1190,7 +1189,7 @@ static int omap_8250_dma_handle_irq(struct uart_port *port) + return IRQ_HANDLED; + } + +- spin_lock_irqsave(&port->lock, flags); ++ spin_lock(&port->lock); + + status = serial_port_in(port, UART_LSR); + +@@ -1215,7 +1214,8 @@ static int omap_8250_dma_handle_irq(struct uart_port *port) + } + } + +- uart_unlock_and_check_sysrq(port, flags); ++ uart_unlock_and_check_sysrq(port); ++ + serial8250_rpm_put(up); + return 1; + } +diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c +index 9d60418e4adb..f1b0a3464285 100644 +--- a/drivers/tty/serial/8250/8250_port.c ++++ b/drivers/tty/serial/8250/8250_port.c +@@ -1895,14 +1895,13 @@ static bool handle_rx_dma(struct uart_8250_port *up, unsigned int iir) + int serial8250_handle_irq(struct uart_port *port, unsigned int iir) + { + unsigned char status; +- unsigned long flags; + struct uart_8250_port *up = up_to_u8250p(port); + bool skip_rx = false; + + if (iir & UART_IIR_NO_INT) + return 0; + +- spin_lock_irqsave(&port->lock, flags); ++ spin_lock(&port->lock); + + status = serial_port_in(port, UART_LSR); + +@@ -1928,7 +1927,8 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir) + (up->ier & UART_IER_THRI)) + serial8250_tx_chars(up); + +- uart_unlock_and_check_sysrq(port, flags); ++ uart_unlock_and_check_sysrq(port); ++ + return 1; + } + EXPORT_SYMBOL_GPL(serial8250_handle_irq); +diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c +index 0d85b55ea823..00bb88a71606 100644 +--- a/drivers/tty/serial/qcom_geni_serial.c ++++ b/drivers/tty/serial/qcom_geni_serial.c +@@ -818,7 +818,6 @@ static irqreturn_t qcom_geni_serial_isr(int isr, void *dev) + u32 s_irq_status; + u32 geni_status; + struct uart_port *uport = dev; +- unsigned long flags; + bool drop_rx = false; + struct tty_port *tport = &uport->state->port; + struct qcom_geni_serial_port *port = to_dev_port(uport, uport); +@@ -826,7 +825,8 @@ static irqreturn_t qcom_geni_serial_isr(int isr, void *dev) + if (uport->suspended) + return IRQ_NONE; + +- spin_lock_irqsave(&uport->lock, flags); ++ spin_lock(&uport->lock); ++ + m_irq_status = readl(uport->membase + SE_GENI_M_IRQ_STATUS); + s_irq_status = readl(uport->membase + SE_GENI_S_IRQ_STATUS); + geni_status = readl(uport->membase + SE_GENI_STATUS); +@@ -861,7 +861,7 @@ static irqreturn_t qcom_geni_serial_isr(int isr, void *dev) + qcom_geni_serial_handle_rx(uport, drop_rx); + + out_unlock: +- uart_unlock_and_check_sysrq(uport, flags); ++ uart_unlock_and_check_sysrq(uport); + + return IRQ_HANDLED; + } +diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h +index 9c1292ea47fd..4d593fef37b4 100644 +--- a/include/linux/serial_core.h ++++ b/include/linux/serial_core.h +@@ -513,19 +513,19 @@ static inline int uart_prepare_sysrq_char(struct uart_port *port, unsigned int c + return 0; + } + +-static inline void uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long irqflags) ++static inline void uart_unlock_and_check_sysrq(struct uart_port *port) + { + int sysrq_ch; + + if (!port->has_sysrq) { +- spin_unlock_irqrestore(&port->lock, irqflags); ++ spin_unlock(&port->lock); + return; + } + + sysrq_ch = port->sysrq_ch; + port->sysrq_ch = 0; + +- spin_unlock_irqrestore(&port->lock, irqflags); ++ spin_unlock(&port->lock); + + if (sysrq_ch) + handle_sysrq(sysrq_ch); +@@ -539,9 +539,9 @@ static inline int uart_prepare_sysrq_char(struct uart_port *port, unsigned int c + { + return 0; + } +-static inline void uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long irqflags) ++static inline void uart_unlock_and_check_sysrq(struct uart_port *port) + { +- spin_unlock_irqrestore(&port->lock, irqflags); ++ spin_unlock(&port->lock); + } + #endif /* CONFIG_MAGIC_SYSRQ_SERIAL */ + +-- +2.35.1 + diff --git a/queue-5.10/series b/queue-5.10/series index 4e25bca0c38..794d47fae71 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -76,3 +76,378 @@ netfilter-nf_tables-do-not-allow-chain_id-to-refer-to-another-table.patch netfilter-nf_tables-do-not-allow-rule_id-to-refer-to-another-chain.patch netfilter-nf_tables-fix-null-deref-due-to-zeroed-list-head.patch epoll-autoremove-wakers-even-more-aggressively.patch +x86-handle-idle-nomwait-cmdline-properly-for-x86_idl.patch +arm64-do-not-forget-syscall-when-starting-a-new-thre.patch +arm64-fix-oops-in-concurrently-setting-insn_emulatio.patch +ext2-add-more-validity-checks-for-inode-counts.patch +genirq-don-t-return-error-on-missing-optional-irq_re.patch +irqchip-mips-gic-only-register-ipi-domain-when-smp-i.patch +genirq-generic_irq_ipi-depends-on-smp.patch +irqchip-mips-gic-check-the-return-value-of-ioremap-i.patch +wait-fix-__wait_event_hrtimeout-for-rt-dl-tasks.patch +arm-dts-imx6ul-add-missing-properties-for-sram.patch +arm-dts-imx6ul-change-operating-points-to-uint32-mat.patch +arm-dts-imx6ul-fix-keypad-compatible.patch +arm-dts-imx6ul-fix-csi-node-compatible.patch +arm-dts-imx6ul-fix-lcdif-node-compatible.patch +arm-dts-imx6ul-fix-qspi-node-compatible.patch +arm-dts-bcm5301x-add-dt-for-meraki-mr26.patch +spi-synquacer-add-missing-clk_disable_unprepare.patch +arm-omap2-display-fix-refcount-leak-bug.patch +acpi-ec-remove-duplicate-thinkpad-x1-carbon-6th-entr.patch +acpi-ec-drop-the-ec_flags_ignore_dsdt_gpe-quirk.patch +acpi-pm-save-nvs-memory-for-lenovo-g40-45.patch +acpi-lpss-fix-missing-check-in-register_device_clock.patch +arm64-dts-qcom-ipq8074-fix-nand-node-name.patch +arm64-dts-allwinner-a64-orangepi-win-fix-led-node-na.patch +arm-shmobile-rcar-gen2-increase-refcount-for-new-ref.patch +firmware-tegra-fix-error-check-return-value-of-debug.patch +hwmon-sht15-fix-wrong-assumptions-in-device-remove-c.patch +pm-hibernate-defer-device-probing-when-resuming-from.patch +selinux-add-boundary-check-in-put_entry.patch +powerpc-64s-disable-stack-variable-initialisation-fo.patch +spi-spi-rspi-fix-pio-fallback-on-rz-platforms.patch +netfilter-nf_tables-add-rescheduling-points-during-l.patch +arm-findbit-fix-overflowing-offset.patch +meson-mx-socinfo-fix-refcount-leak-in-meson_mx_socin.patch +arm64-dts-renesas-beacon-fix-regulator-node-names.patch +arm-bcm-fix-refcount-leak-in-bcm_kona_smc_init.patch +acpi-processor-idle-annotate-more-functions-to-live-.patch +arm-dts-imx7d-colibri-emmc-add-cpu1-supply.patch +input-atmel_mxt_ts-fix-up-inverted-reset-handler.patch +soc-renesas-r8a779a0-sysc-fix-a2dp1-and-a2cv-2357-pd.patch +soc-amlogic-fix-refcount-leak-in-meson-secure-pwrc.c.patch +arm64-dts-renesas-fix-thermal-sensors-on-single-zone.patch +x86-pmem-fix-platform-device-leak-in-error-path.patch +arm-dts-ast2500-evb-fix-board-compatible.patch +arm-dts-ast2600-evb-fix-board-compatible.patch +hexagon-select-arch_want_ld_orphan_warn.patch +arm64-cpufeature-allow-different-pmu-versions-in-id_.patch +locking-lockdep-fix-lockdep_init_map_-confusion.patch +soc-fsl-guts-machine-variable-might-be-unset.patch +block-fix-infinite-loop-for-invalid-zone-append.patch +arm-dts-qcom-mdm9615-add-missing-pmic-gpio-reg.patch +arm-omap2-fix-refcount-leak-in-omapdss_init_of.patch +arm-omap2-fix-refcount-leak-in-omap3xxx_prm_late_ini.patch +cpufreq-zynq-fix-refcount-leak-in-zynq_get_revision.patch +regulator-qcom_smd-fix-pm8916_pldo-range.patch +acpi-apei-fix-_einj-vs-efi_memory_sp.patch +soc-qcom-ocmem-fix-refcount-leak-in-of_get_ocmem.patch +soc-qcom-aoss-fix-refcount-leak-in-qmp_cooling_devic.patch +arm-dts-qcom-pm8841-add-required-thermal-sensor-cell.patch +bus-hisi_lpc-fix-missing-platform_device_put-in-hisi.patch +arm64-dts-qcom-msm8916-use-power-domains-for-mss-wcn.patch +arm64-dts-qcom-msm8916-fix-typo-in-pronto-remoteproc.patch +arm64-dts-mt7622-fix-bpi-r64-wps-button.patch +arm64-tegra-fix-sdmmc1-cd-on-p2888.patch +erofs-avoid-consecutive-detection-for-highmem-memory.patch +blk-mq-don-t-create-hctx-debugfs-dir-until-q-debugfs.patch +hwmon-drivetemp-add-module-alias.patch +block-remove-the-request_queue-to-argument-request-b.patch +blktrace-trace-remapped-requests-correctly.patch +regulator-of-fix-refcount-leak-bug-in-of_get_regulat.patch +soc-qcom-make-qcom_rpmpd-depend-on-pm.patch +arm64-dts-qcom-qcs404-fix-incorrect-usb2-phys-assign.patch +dt-bindings-update-qcom-usb-subsystem-maintainer-inf.patch +drivers-perf-arm_spe-fix-consistency-of-sys_pmscr_el.patch +nohz-full-sched-rt-fix-missed-tick-reenabling-bug-in.patch +selftests-seccomp-fix-compile-warning-when-cc-clang.patch +thermal-tools-tmon-include-pthread-and-time-headers-.patch +dm-return-early-from-dm_pr_call-if-dm-device-is-susp.patch +pwm-sifive-don-t-check-the-return-code-of-pwmchip_re.patch +pwm-sifive-simplify-offset-calculation-for-pwmcmp-re.patch +pwm-sifive-ensure-the-clk-is-enabled-exactly-once-pe.patch +pwm-sifive-shut-down-hardware-only-after-pwmchip_rem.patch +pwm-lpc18xx-sct-convert-to-devm_platform_ioremap_res.patch +pwm-ab8500-explicitly-allocate-pwm-chip-base-dynamic.patch +drm-bridge-tc358767-move-e-dp-bridge-endpoint-parsin.patch +drm-bridge-tc358767-make-sure-refclk-clock-are-enabl.patch +ath10k-do-not-enforce-interrupt-trigger-type.patch +drm-st7735r-fix-module-autoloading-for-okaya-rh12812.patch +wifi-rtlwifi-fix-error-codes-in-rtl_debugfs_set_writ.patch +ath11k-fix-netdev-open-race.patch +drm-mipi-dbi-align-max_chunk-to-2-in-spi_transfer.patch +ath11k-fix-incorrect-debug_mask-mappings.patch +drm-radeon-fix-potential-buffer-overflow-in-ni_set_m.patch +drm-mediatek-modify-dsi-funcs-to-atomic-operations.patch +drm-mediatek-separate-poweron-poweroff-from-enable-d.patch +drm-mediatek-add-pull-down-mipi-operation-in-mtk_dsi.patch +i2c-npcm-remove-own-slave-addresses-2-10.patch +i2c-npcm-correct-slave-role-behavior.patch +virtio-gpu-fix-a-missing-check-to-avoid-null-derefer.patch +drm-adv7511-override-i2c-address-of-cec-before-acces.patch +crypto-sun8i-ss-do-not-allocate-memory-when-handling.patch +crypto-sun8i-ss-fix-error-codes-in-allocate_flows.patch +net-fix-sk_wmem_schedule-and-sk_rmem_schedule-errors.patch +i2c-fix-a-potential-use-after-free.patch +crypto-sun8i-ss-fix-infinite-loop-in-sun8i_ss_setup_.patch +media-tw686x-register-the-irq-at-the-end-of-probe.patch +ath9k-fix-use-after-free-in-ath9k_hif_usb_rx_cb.patch +wifi-iwlegacy-4965-fix-potential-off-by-one-overflow.patch +drm-radeon-fix-incorrrect-spdx-license-identifiers.patch +test_bpf-fix-incorrect-netdev-features.patch +crypto-ccp-during-shutdown-check-sev-data-pointer-be.patch +drm-bridge-adv7511-add-check-for-mipi_dsi_driver_reg.patch +drm-mcde-fix-refcount-leak-in-mcde_dsi_bind.patch +media-hdpvr-fix-error-value-returns-in-hdpvr_read.patch +media-v4l2-mem2mem-prevent-pollerr-when-last_buffer_.patch +media-tw686x-fix-memory-leak-in-tw686x_video_init.patch +drm-vc4-plane-remove-subpixel-positioning-check.patch +drm-vc4-plane-fix-margin-calculations-for-the-right-.patch +drm-vc4-dsi-correct-dsi-divider-calculations.patch +drm-vc4-dsi-correct-pixel-order-for-dsi0.patch +drm-vc4-drv-remove-the-dsi-pointer-in-vc4_drv.patch +drm-vc4-dsi-use-snprintf-for-the-phy-clocks-instead-.patch +drm-vc4-dsi-introduce-a-variant-structure.patch +drm-vc4-dsi-register-dsi0-as-the-correct-vc4-encoder.patch +drm-vc4-dsi-fix-dsi0-interrupt-support.patch +drm-vc4-dsi-add-correct-stop-condition-to-vc4_dsi_en.patch +drm-vc4-hdmi-remove-firmware-logic-for-mai-threshold.patch +drm-vc4-hdmi-avoid-full-hdmi-audio-fifo-writes.patch +drm-vc4-hdmi-don-t-access-the-connector-state-in-res.patch +drm-vc4-hdmi-create-a-custom-connector-state.patch +drm-vc4-hdmi-limit-the-bcm2711-to-the-max-without-sc.patch +drm-vc4-hdmi-fix-timings-for-interlaced-modes.patch +drm-vc4-hdmi-correct-hdmi-timing-registers-for-inter.patch +crypto-arm64-gcm-select-aead-for-ghash_arm64_ce.patch +selftests-xsk-destroy-bpf-resources-only-when-ctx-re.patch +drm-rockchip-vop-don-t-crash-for-invalid-duplicate_s.patch +drm-rockchip-fix-an-error-handling-path-rockchip_dp_.patch +drm-mediatek-dpi-remove-output-format-of-yuv.patch +drm-mediatek-dpi-only-enable-dpi-after-the-bridge-is.patch +drm-msm-hdmi-enable-core-vcc-core-vdda-supply-for-89.patch +drm-bridge-sii8620-fix-possible-off-by-one.patch +lib-bitmap-order-includes-alphabetically.patch +lib-bitmap-provide-devm_bitmap_alloc-and-devm_bitmap.patch +hinic-use-the-bitmap-api-when-applicable.patch +net-hinic-fix-bug-that-ethtool-get-wrong-stats.patch +net-hinic-avoid-kernel-hung-in-hinic_get_stats64.patch +drm-msm-mdp5-fix-global-state-lock-backoff.patch +crypto-hisilicon-sec-fixes-some-coding-style.patch +crypto-hisilicon-sec-don-t-sleep-when-in-softirq.patch +crypto-hisilicon-kunpeng916-crypto-driver-don-t-slee.patch +media-platform-mtk-mdp-fix-mdp_ipi_comm-structure-al.patch +mt76-mt76x02u-fix-possible-memory-leak-in-__mt76x02u.patch +mediatek-mt76-mac80211-fix-missing-of_node_put-in-mt.patch +drm-exynos-exynos7_drm_decon-free-resources-when-clk.patch +tcp-make-retransmitted-skb-fit-into-the-send-window.patch +libbpf-fix-the-name-of-a-reused-map.patch +selftests-timers-valid-adjtimex-build-fix-for-newer-.patch +selftests-timers-clocksource-switch-fix-passing-erro.patch +bpf-fix-subprog-names-in-stack-traces.patch +fs-check-fmode_lseek-to-control-internal-pipe-splici.patch +wifi-wil6210-debugfs-fix-info-leak-in-wil_write_file.patch +wifi-p54-fix-an-error-handling-path-in-p54spi_probe.patch +wifi-p54-add-missing-parentheses-in-p54_flush.patch +selftests-bpf-fix-a-test-for-snprintf-overflow.patch +can-pch_can-do-not-report-txerr-and-rxerr-during-bus.patch +can-rcar_can-do-not-report-txerr-and-rxerr-during-bu.patch +can-sja1000-do-not-report-txerr-and-rxerr-during-bus.patch +can-hi311x-do-not-report-txerr-and-rxerr-during-bus-.patch +can-sun4i_can-do-not-report-txerr-and-rxerr-during-b.patch +can-kvaser_usb_hydra-do-not-report-txerr-and-rxerr-d.patch +can-kvaser_usb_leaf-do-not-report-txerr-and-rxerr-du.patch +can-usb_8dev-do-not-report-txerr-and-rxerr-during-bu.patch +can-error-specify-the-values-of-data-5.7-of-can-erro.patch +can-pch_can-pch_can_error-initialize-errc-before-usi.patch +bluetooth-hci_intel-add-check-for-platform_driver_re.patch +i2c-cadence-support-pec-for-smbus-block-read.patch +i2c-mux-gpmux-add-of_node_put-when-breaking-out-of-l.patch +wifi-wil6210-debugfs-fix-uninitialized-variable-use-.patch +wifi-iwlwifi-mvm-fix-double-list_add-at-iwl_mvm_mac_.patch +wifi-libertas-fix-possible-refcount-leak-in-if_usb_p.patch +media-cedrus-hevc-add-check-for-invalid-timestamp.patch +net-mlx5e-remove-warn_on-when-trying-to-offload-an-u.patch +net-mlx5e-fix-the-value-of-mlx5e_max_rq_num_mtts.patch +crypto-hisilicon-hpre-don-t-use-gfp_kernel-to-alloc-.patch +crypto-inside-secure-add-missing-module_device_table.patch +crypto-hisilicon-sec-fix-auth-key-size-error.patch +inet-add-read_once-sk-sk_bound_dev_if-in-inet_match.patch +tcp-sk-sk_bound_dev_if-once-in-inet_request_bound_de.patch +ipv6-add-read_once-sk-sk_bound_dev_if-in-inet6_match.patch +tcp-fix-data-races-around-sysctl_tcp_l3mdev_accept.patch +net-allow-unbound-socket-for-packets-in-vrf-when-tcp.patch +iavf-fix-max_rate-limiting.patch +netdevsim-avoid-allocation-warnings-triggered-from-u.patch +net-rose-fix-netdev-reference-changes.patch +net-ionic-fix-error-check-for-vlan-flags-in-ionic_se.patch +dccp-put-dccp_qpolicy_full-and-dccp_qpolicy_push-in-.patch +wireguard-ratelimiter-use-hrtimer-in-selftest.patch +wireguard-allowedips-don-t-corrupt-stack-when-detect.patch +clk-renesas-r9a06g032-fix-uart-clkgrp-bitsel.patch +mtd-maps-fix-refcount-leak-in-of_flash_probe_versati.patch +mtd-maps-fix-refcount-leak-in-ap_flash_init.patch +mtd-rawnand-meson-fix-a-potential-double-free-issue.patch +pci-tegra194-fix-pm-error-handling-in-tegra_pcie_con.patch +hid-cp2112-prevent-a-buffer-overflow-in-cp2112_xfer.patch +mtd-sm_ftl-fix-deadlock-caused-by-cancel_work_sync-i.patch +mtd-partitions-fix-refcount-leak-in-parse_redboot_of.patch +mtd-st_spi_fsm-add-a-clk_disable_unprepare-in-.probe.patch +fpga-altera-pr-ip-fix-unsigned-comparison-with-less-.patch +usb-host-fix-refcount-leak-in-ehci_hcd_ppc_of_probe.patch +usb-ohci-nxp-fix-refcount-leak-in-ohci_hcd_nxp_probe.patch +usb-gadget-tegra-xudc-fix-error-check-in-tegra_xudc_.patch +usb-xhci-tegra-fix-error-check.patch +netfilter-xtables-bring-spdx-identifier-back.patch +iio-accel-bma400-fix-the-scale-min-and-max-macro-val.patch +platform-chrome-cros_ec-always-expose-last-resume-re.patch +iio-accel-bma400-reordering-of-header-files.patch +clk-mediatek-reset-fix-written-reset-bit-offset.patch +kvm-don-t-set-accessed-dirty-bits-for-zero_page.patch +mwifiex-ignore-btcoex-events-from-the-88w8897-firmwa.patch +mwifiex-fix-sleep-in-atomic-context-bugs-caused-by-d.patch +dmaengine-dw-edma-fix-edma-rd-wr-channels-and-dma-di.patch +misc-rtsx-fix-an-error-handling-path-in-rtsx_pci_pro.patch +driver-core-fix-potential-deadlock-in-__driver_attac.patch +clk-qcom-clk-krait-unlock-spin-after-mux-completion.patch +clk-qcom-gcc-msm8939-add-missing-system_mm_noc_bfdcd.patch +clk-qcom-gcc-msm8939-fix-bimc_ddr_clk_src-rcgr-base-.patch +clk-qcom-gcc-msm8939-add-missing-system_mm_noc_bfdcd.patch-4005 +clk-qcom-gcc-msm8939-point-mm-peripherals-to-system_.patch +usb-host-xhci-use-snprintf-in-xhci_decode_trb.patch +clk-qcom-ipq8074-fix-nss-core-pll-s.patch +clk-qcom-ipq8074-sw-workaround-for-ubi32-pll-lock.patch +clk-qcom-ipq8074-fix-nss-port-frequency-tables.patch +clk-qcom-ipq8074-set-branch_halt_delay-flag-for-ubi-.patch +clk-qcom-camcc-sdm845-fix-topology-around-titan_top-.patch +pci-dwc-add-unroll-iatu-space-support-to-dw_pcie_dis.patch +pci-dwc-deallocate-epc-memory-on-dw_pcie_ep_init-err.patch +pci-dwc-always-enable-cdm-check-if-snps-enable-cdm-c.patch +soundwire-bus_type-fix-remove-and-shutdown-support.patch +kvm-arm64-don-t-return-from-void-function.patch +dmaengine-sf-pdma-apply-proper-spinlock-flags-in-sf_.patch +dmaengine-sf-pdma-add-multithread-support-for-a-dma-.patch +pci-endpoint-don-t-stop-controller-when-unbinding-en.patch +intel_th-fix-a-resource-leak-in-an-error-handling-pa.patch +intel_th-msu-sink-potential-dereference-of-null-poin.patch +intel_th-msu-fix-vmalloced-buffers.patch +staging-rtl8192u-fix-sleep-in-atomic-context-bug-in-.patch +mmc-sdhci-of-esdhc-fix-refcount-leak-in-esdhc_signal.patch +memstick-ms_block-fix-some-incorrect-memory-allocati.patch +memstick-ms_block-fix-a-memory-leak.patch +mmc-sdhci-of-at91-fix-set_uhs_signaling-rewriting-of.patch +mmc-block-add-single-read-for-4k-sector-cards.patch +kvm-s390-pv-leak-the-topmost-page-table-when-destroy.patch +pci-portdrv-don-t-disable-aer-reporting-in-get_port_.patch +pci-qcom-set-up-rev-2.1.0-parf_phy-before-enabling-c.patch +scsi-smartpqi-fix-dma-direction-for-raid-requests.patch +xtensa-iss-network-provide-release-callback.patch +xtensa-iss-fix-handling-error-cases-in-iss_net_confi.patch +usb-gadget-udc-amd5536-depends-on-has_dma.patch +usb-aspeed-vhub-fix-refcount-leak-bug-in-ast_vhub_in.patch +usb-dwc3-core-deprecate-gctl.coresoftreset.patch +usb-dwc3-core-do-not-perform-gctl_core_softreset-dur.patch +usb-dwc3-qcom-fix-missing-optional-irq-warnings.patch +eeprom-idt_89hpesx-uninitialized-data-in-idt_dbgfs_c.patch +interconnect-imx-fix-max_node_id.patch +um-random-don-t-initialise-hwrng-struct-with-zero.patch +rdma-rtrs-define-min_chunk_size.patch +rdma-rtrs-avoid-wtautological-constant-out-of-range-.patch +rdma-rtrs-srv-fix-modinfo-output-for-stringify.patch +rdma-qedr-improve-error-logs-for-rdma_alloc_tid-erro.patch +rdma-qedr-fix-potential-memory-leak-in-__qedr_alloc_.patch +rdma-hns-fix-incorrect-clearing-of-interrupt-status-.patch +rdma-siw-fix-duplicated-reported-iw_cm_event_connect.patch +clk-qcom-gcc-msm8939-fix-weird-field-spacing-in-ftbl.patch +rdma-hfi1-fix-potential-memory-leak-in-setup_base_ct.patch +gpio-gpiolib-of-fix-refcount-bugs-in-of_mm_gpiochip_.patch +hid-mcp2221-prevent-a-buffer-overflow-in-mcp_smbus_w.patch +mmc-cavium-octeon-add-of_node_put-when-breaking-out-.patch +mmc-cavium-thunderx-add-of_node_put-when-breaking-ou.patch +hid-alps-declare-u1_unicorn_legacy-support.patch +pci-tegra194-fix-root-port-interrupt-handling.patch +pci-tegra194-fix-link-up-retry-sequence.patch +usb-serial-fix-tty-port-initialized-comments.patch +usb-cdns3-change-place-of-priv_ep-assignment-in-cdns.patch +platform-olpc-fix-uninitialized-data-in-debugfs-writ.patch +rdma-srpt-duplicate-port-name-members.patch +rdma-srpt-introduce-a-reference-count-in-struct-srpt.patch +rdma-srpt-fix-a-use-after-free.patch +mm-mmap.c-fix-missing-call-to-vm_unacct_memory-in-mm.patch +selftests-kvm-set-rax-before-vmcall.patch +rdma-mlx5-add-missing-check-for-return-value-in-get-.patch +rdma-rxe-fix-error-unwind-in-rxe_create_qp.patch +null_blk-fix-ida-error-handling-in-null_add_dev.patch +nvme-use-command_id-instead-of-req-tag-in-trace_nvme.patch +jbd2-fix-outstanding-credits-assert-in-jbd2_journal_.patch +ext4-recover-csum-seed-of-tmp_inode-after-migrating-.patch +jbd2-fix-assertion-jh-b_frozen_data-null-failure-whe.patch +usb-cdns3-don-t-use-priv_dev-uninitialized-in-cdns3_.patch +opp-fix-error-check-in-dev_pm_opp_attach_genpd.patch +asoc-cros_ec_codec-fix-refcount-leak-in-cros_ec_code.patch +asoc-samsung-fix-error-handling-in-aries_audio_probe.patch +asoc-mediatek-mt8173-fix-refcount-leak-in-mt8173_rt5.patch +asoc-mt6797-mt6351-fix-refcount-leak-in-mt6797_mt635.patch +asoc-codecs-da7210-add-check-for-i2c_add_driver.patch +asoc-mediatek-mt8173-rt5650-fix-refcount-leak-in-mt8.patch +serial-8250-export-icr-access-helpers-for-internal-u.patch +serial-8250_dw-store-lsr-into-lsr_saved_flags-in-dw8.patch +asoc-codecs-msm8916-wcd-digital-move-gains-from-sx_t.patch +asoc-codecs-wcd9335-move-gains-from-sx_tlv-to-s8_tlv.patch +rpmsg-mtk_rpmsg-fix-circular-locking-dependency.patch +remoteproc-k3-r5-fix-refcount-leak-in-k3_r5_cluster_.patch +selftests-livepatch-better-synchronize-test_klp_call.patch +profiling-fix-shift-too-large-makes-kernel-panic.patch +asoc-samsung-h1940_uda1380-include-proepr-gpio-consu.patch +powerpc-perf-optimize-clearing-the-pending-pmi-and-r.patch +asoc-samsung-change-gpiod_speaker_power-and-rx1950_a.patch +tty-n_gsm-delete-gsmtty-open-sabm-frame-when-config-.patch +tty-n_gsm-fix-user-open-not-possible-at-responder-un.patch +tty-n_gsm-fix-wrong-queuing-behavior-in-gsm_dlci_dat.patch +tty-n_gsm-fix-non-flow-control-frames-during-mux-flo.patch +tty-n_gsm-fix-packet-re-transmission-without-open-co.patch +tty-n_gsm-fix-race-condition-in-gsmld_write.patch +asoc-qcom-fix-missing-of_node_put-in-asoc_qcom_lpass.patch +remoteproc-qcom-wcnss-fix-handling-of-irqs.patch +vfio-remove-extra-put-gets-around-vfio_device-group.patch +vfio-simplify-the-lifetime-logic-for-vfio_device.patch +vfio-split-creation-of-a-vfio_device-into-init-and-r.patch +vfio-mdev-make-to_mdev_device-into-a-static-inline.patch +vfio-ccw-do-not-change-fsm-state-in-subchannel-event.patch +serial-do-not-restore-interrupt-state-in-sysrq-helpe.patch +serial-8250_fsl-don-t-report-fe-pe-and-oe-twice.patch +tty-n_gsm-fix-wrong-t1-retry-count-handling.patch +tty-n_gsm-fix-dm-command.patch +tty-n_gsm-fix-missing-corner-cases-in-gsmld_poll.patch +iommu-exynos-handle-failed-iommu-device-registration.patch +rpmsg-qcom_smd-fix-refcount-leak-in-qcom_smd_parse_e.patch +kfifo-fix-kfifo_to_user-return-type.patch +lib-smp_processor_id-fix-imbalanced-instrumentation_.patch +remoteproc-sysmon-wait-for-ssctl-service-to-come-up.patch +mfd-t7l66xb-drop-platform-disable-callback.patch +mfd-max77620-fix-refcount-leak-in-max77620_initialis.patch +iommu-arm-smmu-qcom_iommu-add-of_node_put-when-break.patch +perf-tools-fix-dso_id-inode-generation-comparison.patch +s390-dump-fix-old-lowcore-virtual-vs-physical-addres.patch +s390-zcore-fix-race-when-reading-from-hardware-syste.patch +asoc-fsl_easrc-use-snd_pcm_format_t-type-for-sample_.patch +asoc-qcom-q6dsp-fix-an-off-by-one-in-q6adm_alloc_cop.patch +fuse-remove-the-control-interface-for-virtio-fs.patch +asoc-audio-graph-card-add-of_node_put-in-fail-path.patch +watchdog-armada_37xx_wdt-check-the-return-value-of-d.patch +video-fbdev-amba-clcd-fix-refcount-leak-bugs.patch +video-fbdev-sis-fix-typos-in-sis_getmodeid.patch +asoc-mchp-spdifrx-disable-end-of-block-interrupt-on-.patch +powerpc-32-do-not-allow-selection-of-e5500-or-e6500-.patch +powerpc-pci-prefer-pci-domain-assignment-via-dt-linu.patch +f2fs-don-t-set-gc_failure_pin-for-background-gc.patch +f2fs-write-checkpoint-during-fg_gc.patch +f2fs-fix-to-remove-f2fs_compr_fl-and-tag-f2fs_nocomp.patch +powerpc-spufs-fix-refcount-leak-in-spufs_init_isolat.patch +powerpc-xive-fix-refcount-leak-in-xive_get_max_prio.patch +powerpc-cell-axon_msi-fix-refcount-leak-in-setup_msi.patch +perf-symbol-fail-to-read-phdr-workaround.patch +kprobes-forbid-probing-on-trampoline-and-bpf-code-ar.patch +powerpc-pci-fix-phb-numbering-when-using-opal-phbid.patch +genelf-use-have_libcrypto_support-not-the-never-defi.patch +scripts-faddr2line-fix-vmlinux-detection-on-arm64.patch +sched-deadline-merge-dl_task_can_attach-and-dl_cpu_b.patch +sched-cpuset-fix-dl_cpu_busy-panic-due-to-empty-cs-c.patch +x86-numa-use-cpumask_available-instead-of-hardcoded-.patch +video-fbdev-arkfb-fix-a-divide-by-zero-bug-in-ark_se.patch +tools-thermal-fix-possible-path-truncations.patch +sched-fix-the-check-of-nr_running-at-queue-wakelist.patch +x86-entry-build-thunk_-bits-only-if-config_preemptio.patch +video-fbdev-vt8623fb-check-the-size-of-screen-before.patch +video-fbdev-arkfb-check-the-size-of-screen-before-me.patch +video-fbdev-s3fb-check-the-size-of-screen-before-mem.patch diff --git a/queue-5.10/soc-amlogic-fix-refcount-leak-in-meson-secure-pwrc.c.patch b/queue-5.10/soc-amlogic-fix-refcount-leak-in-meson-secure-pwrc.c.patch new file mode 100644 index 00000000000..e71ec06a256 --- /dev/null +++ b/queue-5.10/soc-amlogic-fix-refcount-leak-in-meson-secure-pwrc.c.patch @@ -0,0 +1,42 @@ +From 1af38a4ad88ce214b4aabef92d8ea5f811097b14 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 16 Jun 2022 22:49:15 +0800 +Subject: soc: amlogic: Fix refcount leak in meson-secure-pwrc.c + +From: Liang He + +[ Upstream commit d18529a4c12f66d83daac78045ea54063bd43257 ] + +In meson_secure_pwrc_probe(), there is a refcount leak in one fail +path. + +Signed-off-by: Liang He +Acked-by: Martin Blumenstingl +Fixes: b3dde5013e13 ("soc: amlogic: Add support for Secure power domains controller") +Reviewed-by: Neil Armstrong +Signed-off-by: Neil Armstrong +Link: https://lore.kernel.org/r/20220616144915.3988071-1-windhl@126.com +Signed-off-by: Sasha Levin +--- + drivers/soc/amlogic/meson-secure-pwrc.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/soc/amlogic/meson-secure-pwrc.c b/drivers/soc/amlogic/meson-secure-pwrc.c +index 5fb29a475879..fff92e2f3974 100644 +--- a/drivers/soc/amlogic/meson-secure-pwrc.c ++++ b/drivers/soc/amlogic/meson-secure-pwrc.c +@@ -138,8 +138,10 @@ static int meson_secure_pwrc_probe(struct platform_device *pdev) + } + + pwrc = devm_kzalloc(&pdev->dev, sizeof(*pwrc), GFP_KERNEL); +- if (!pwrc) ++ if (!pwrc) { ++ of_node_put(sm_np); + return -ENOMEM; ++ } + + pwrc->fw = meson_sm_get(sm_np); + of_node_put(sm_np); +-- +2.35.1 + diff --git a/queue-5.10/soc-fsl-guts-machine-variable-might-be-unset.patch b/queue-5.10/soc-fsl-guts-machine-variable-might-be-unset.patch new file mode 100644 index 00000000000..6b51e631965 --- /dev/null +++ b/queue-5.10/soc-fsl-guts-machine-variable-might-be-unset.patch @@ -0,0 +1,37 @@ +From 10a2d7c951f6296808cb98c01a969ad5ee6d9181 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 Apr 2022 11:56:03 +0200 +Subject: soc: fsl: guts: machine variable might be unset + +From: Michael Walle + +[ Upstream commit ab3f045774f704c4e7b6a878102f4e9d4ae7bc74 ] + +If both the model and the compatible properties are missing, then +machine will not be set. Initialize it with NULL. + +Fixes: 34c1c21e94ac ("soc: fsl: fix section mismatch build warnings") +Signed-off-by: Michael Walle +Acked-by: Arnd Bergmann +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + drivers/soc/fsl/guts.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/soc/fsl/guts.c b/drivers/soc/fsl/guts.c +index 091e94c04f30..6b0c433954bf 100644 +--- a/drivers/soc/fsl/guts.c ++++ b/drivers/soc/fsl/guts.c +@@ -141,7 +141,7 @@ static int fsl_guts_probe(struct platform_device *pdev) + struct device *dev = &pdev->dev; + struct resource *res; + const struct fsl_soc_die_attr *soc_die; +- const char *machine; ++ const char *machine = NULL; + u32 svr; + + /* Initialize guts */ +-- +2.35.1 + diff --git a/queue-5.10/soc-qcom-aoss-fix-refcount-leak-in-qmp_cooling_devic.patch b/queue-5.10/soc-qcom-aoss-fix-refcount-leak-in-qmp_cooling_devic.patch new file mode 100644 index 00000000000..b8a4ed844a0 --- /dev/null +++ b/queue-5.10/soc-qcom-aoss-fix-refcount-leak-in-qmp_cooling_devic.patch @@ -0,0 +1,43 @@ +From 2a0b738cccb8813abae0066d457a900ca5d4b40e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Jun 2022 10:42:52 +0400 +Subject: soc: qcom: aoss: Fix refcount leak in qmp_cooling_devices_register + +From: Miaoqian Lin + +[ Upstream commit e6e0951414a314e7db3e9e24fd924b3e15515288 ] + +Every iteration of for_each_available_child_of_node() decrements +the reference count of the previous node. +When breaking early from a for_each_available_child_of_node() loop, +we need to explicitly call of_node_put() on the child node. +Add missing of_node_put() to avoid refcount leak. + +Fixes: 05589b30b21a ("soc: qcom: Extend AOSS QMP driver to support resources that are used to wake up the SoC.") +Signed-off-by: Miaoqian Lin +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220606064252.42595-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/soc/qcom/qcom_aoss.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/soc/qcom/qcom_aoss.c b/drivers/soc/qcom/qcom_aoss.c +index 941499b11758..401a0be3675a 100644 +--- a/drivers/soc/qcom/qcom_aoss.c ++++ b/drivers/soc/qcom/qcom_aoss.c +@@ -493,8 +493,10 @@ static int qmp_cooling_devices_register(struct qmp *qmp) + continue; + ret = qmp_cooling_device_add(qmp, &qmp->cooling_devs[count++], + child); +- if (ret) ++ if (ret) { ++ of_node_put(child); + goto unroll; ++ } + } + + if (!count) +-- +2.35.1 + diff --git a/queue-5.10/soc-qcom-make-qcom_rpmpd-depend-on-pm.patch b/queue-5.10/soc-qcom-make-qcom_rpmpd-depend-on-pm.patch new file mode 100644 index 00000000000..f2020e4a33d --- /dev/null +++ b/queue-5.10/soc-qcom-make-qcom_rpmpd-depend-on-pm.patch @@ -0,0 +1,37 @@ +From 59ccfb7dedf30b77c238250045017eb07216a5da Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jul 2022 23:21:58 +0200 +Subject: soc: qcom: Make QCOM_RPMPD depend on PM + +From: Konrad Dybcio + +[ Upstream commit a6232f2aa99ce470799992e99e0012945bb5308f ] + +QCOM_RPMPD requires PM_GENERIC_DOMAINS/_OF, which in turns requires +CONFIG_PM. I forgot about the latter in my earlier patch (it's still +in -next as of the time of committing, hence no Fixes: tag). Fix it. + +Reported-by: kernel test robot +Signed-off-by: Konrad Dybcio +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220707212158.32684-1-konrad.dybcio@somainline.org +Signed-off-by: Sasha Levin +--- + drivers/soc/qcom/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/soc/qcom/Kconfig b/drivers/soc/qcom/Kconfig +index 6a3b69b43ad5..d0cf969a8fb5 100644 +--- a/drivers/soc/qcom/Kconfig ++++ b/drivers/soc/qcom/Kconfig +@@ -128,6 +128,7 @@ config QCOM_RPMHPD + + config QCOM_RPMPD + tristate "Qualcomm RPM Power domain driver" ++ depends on PM + depends on QCOM_SMD_RPM + help + QCOM RPM Power domain driver to support power-domains with +-- +2.35.1 + diff --git a/queue-5.10/soc-qcom-ocmem-fix-refcount-leak-in-of_get_ocmem.patch b/queue-5.10/soc-qcom-ocmem-fix-refcount-leak-in-of_get_ocmem.patch new file mode 100644 index 00000000000..70d85e3696b --- /dev/null +++ b/queue-5.10/soc-qcom-ocmem-fix-refcount-leak-in-of_get_ocmem.patch @@ -0,0 +1,49 @@ +From 5c7399947d480d06215118d713e3937a56ad8b8f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Jun 2022 08:24:30 +0400 +Subject: soc: qcom: ocmem: Fix refcount leak in of_get_ocmem + +From: Miaoqian Lin + +[ Upstream commit 92a563fcf14b3093226fb36f12e9b5cf630c5a5d ] + +of_parse_phandle() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak. +of_node_put() will check NULL pointer. + +Fixes: 88c1e9404f1d ("soc: qcom: add OCMEM driver") +Signed-off-by: Miaoqian Lin +Reviewed-by: Brian Masney +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220602042430.1114-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/soc/qcom/ocmem.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/soc/qcom/ocmem.c b/drivers/soc/qcom/ocmem.c +index 85f82e195ef8..1dfdd0b9ba24 100644 +--- a/drivers/soc/qcom/ocmem.c ++++ b/drivers/soc/qcom/ocmem.c +@@ -194,14 +194,17 @@ struct ocmem *of_get_ocmem(struct device *dev) + devnode = of_parse_phandle(dev->of_node, "sram", 0); + if (!devnode || !devnode->parent) { + dev_err(dev, "Cannot look up sram phandle\n"); ++ of_node_put(devnode); + return ERR_PTR(-ENODEV); + } + + pdev = of_find_device_by_node(devnode->parent); + if (!pdev) { + dev_err(dev, "Cannot find device node %s\n", devnode->name); ++ of_node_put(devnode); + return ERR_PTR(-EPROBE_DEFER); + } ++ of_node_put(devnode); + + ocmem = platform_get_drvdata(pdev); + if (!ocmem) { +-- +2.35.1 + diff --git a/queue-5.10/soc-renesas-r8a779a0-sysc-fix-a2dp1-and-a2cv-2357-pd.patch b/queue-5.10/soc-renesas-r8a779a0-sysc-fix-a2dp1-and-a2cv-2357-pd.patch new file mode 100644 index 00000000000..7f59a73fa2d --- /dev/null +++ b/queue-5.10/soc-renesas-r8a779a0-sysc-fix-a2dp1-and-a2cv-2357-pd.patch @@ -0,0 +1,46 @@ +From 3ebd1de910f6631c7218db8f511a881e3af1a1d6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Jun 2022 15:51:35 +0200 +Subject: soc: renesas: r8a779a0-sysc: Fix A2DP1 and A2CV[2357] PDR values + +From: Geert Uytterhoeven + +[ Upstream commit bccceabb92ce8eb78bbf2de08308e2cc2761a2e5 ] + +The PDR values for the A2DP1 and A2CV[2357] power areas on R-Car V3U are +incorrect (copied-and-pasted from A2DP0 and A2CV[0146]). +Fix them. + +Reported-by: Renesas Vietnam via Yoshihiro Shimoda +Fixes: 1b4298f000064cc2 ("soc: renesas: r8a779a0-sysc: Add r8a779a0 support") +Signed-off-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/87bc2e70ba4082970cf8c65871beae4be3503189.1654696188.git.geert+renesas@glider.be +Signed-off-by: Sasha Levin +--- + drivers/soc/renesas/r8a779a0-sysc.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/soc/renesas/r8a779a0-sysc.c b/drivers/soc/renesas/r8a779a0-sysc.c +index d464ffa1be33..d0a5434715b8 100644 +--- a/drivers/soc/renesas/r8a779a0-sysc.c ++++ b/drivers/soc/renesas/r8a779a0-sysc.c +@@ -83,11 +83,11 @@ static struct r8a779a0_sysc_area r8a779a0_areas[] __initdata = { + { "a2cv6", R8A779A0_PD_A2CV6, R8A779A0_PD_A3IR }, + { "a2cn2", R8A779A0_PD_A2CN2, R8A779A0_PD_A3IR }, + { "a2imp23", R8A779A0_PD_A2IMP23, R8A779A0_PD_A3IR }, +- { "a2dp1", R8A779A0_PD_A2DP0, R8A779A0_PD_A3IR }, +- { "a2cv2", R8A779A0_PD_A2CV0, R8A779A0_PD_A3IR }, +- { "a2cv3", R8A779A0_PD_A2CV1, R8A779A0_PD_A3IR }, +- { "a2cv5", R8A779A0_PD_A2CV4, R8A779A0_PD_A3IR }, +- { "a2cv7", R8A779A0_PD_A2CV6, R8A779A0_PD_A3IR }, ++ { "a2dp1", R8A779A0_PD_A2DP1, R8A779A0_PD_A3IR }, ++ { "a2cv2", R8A779A0_PD_A2CV2, R8A779A0_PD_A3IR }, ++ { "a2cv3", R8A779A0_PD_A2CV3, R8A779A0_PD_A3IR }, ++ { "a2cv5", R8A779A0_PD_A2CV5, R8A779A0_PD_A3IR }, ++ { "a2cv7", R8A779A0_PD_A2CV7, R8A779A0_PD_A3IR }, + { "a2cn1", R8A779A0_PD_A2CN1, R8A779A0_PD_A3IR }, + { "a1cnn0", R8A779A0_PD_A1CNN0, R8A779A0_PD_A2CN0 }, + { "a1cnn2", R8A779A0_PD_A1CNN2, R8A779A0_PD_A2CN2 }, +-- +2.35.1 + diff --git a/queue-5.10/soundwire-bus_type-fix-remove-and-shutdown-support.patch b/queue-5.10/soundwire-bus_type-fix-remove-and-shutdown-support.patch new file mode 100644 index 00000000000..f28fbe5a0c9 --- /dev/null +++ b/queue-5.10/soundwire-bus_type-fix-remove-and-shutdown-support.patch @@ -0,0 +1,54 @@ +From 719d48f00ecd9e14debaa80b418f6da051a5b489 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 Jun 2022 09:51:05 +0800 +Subject: soundwire: bus_type: fix remove and shutdown support + +From: Pierre-Louis Bossart + +[ Upstream commit df6407782964dc7e35ad84230abb38f46314b245 ] + +The bus sdw_drv_remove() and sdw_drv_shutdown() helpers are used +conditionally, if the driver provides these routines. + +These helpers already test if the driver provides a .remove or +.shutdown callback, so there's no harm in invoking the +sdw_drv_remove() and sdw_drv_shutdown() unconditionally. + +In addition, the current code is imbalanced with +dev_pm_domain_attach() called from sdw_drv_probe(), but +dev_pm_domain_detach() called from sdw_drv_remove() only if the driver +provides a .remove callback. + +Fixes: 9251345dca24b ("soundwire: Add SoundWire bus type") +Signed-off-by: Pierre-Louis Bossart +Reviewed-by: Rander Wang +Signed-off-by: Bard Liao +Link: https://lore.kernel.org/r/20220610015105.25987-1-yung-chuan.liao@linux.intel.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/soundwire/bus_type.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/drivers/soundwire/bus_type.c b/drivers/soundwire/bus_type.c +index 575b9bad99d5..2e8986cccdd4 100644 +--- a/drivers/soundwire/bus_type.c ++++ b/drivers/soundwire/bus_type.c +@@ -184,12 +184,8 @@ int __sdw_register_driver(struct sdw_driver *drv, struct module *owner) + + drv->driver.owner = owner; + drv->driver.probe = sdw_drv_probe; +- +- if (drv->remove) +- drv->driver.remove = sdw_drv_remove; +- +- if (drv->shutdown) +- drv->driver.shutdown = sdw_drv_shutdown; ++ drv->driver.remove = sdw_drv_remove; ++ drv->driver.shutdown = sdw_drv_shutdown; + + return driver_register(&drv->driver); + } +-- +2.35.1 + diff --git a/queue-5.10/spi-spi-rspi-fix-pio-fallback-on-rz-platforms.patch b/queue-5.10/spi-spi-rspi-fix-pio-fallback-on-rz-platforms.patch new file mode 100644 index 00000000000..1d1ca7192f4 --- /dev/null +++ b/queue-5.10/spi-spi-rspi-fix-pio-fallback-on-rz-platforms.patch @@ -0,0 +1,47 @@ +From 5881656670eb52efd0d981c50779669681607922 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jul 2022 15:34:49 +0100 +Subject: spi: spi-rspi: Fix PIO fallback on RZ platforms + +From: Biju Das + +[ Upstream commit b620aa3a7be346f04ae7789b165937615c6ee8d3 ] + +RSPI IP on RZ/{A, G2L} SoC's has the same signal for both interrupt +and DMA transfer request. Setting DMARS register for DMA transfer +makes the signal to work as a DMA transfer request signal and +subsequent interrupt requests to the interrupt controller +are masked. + +PIO fallback does not work as interrupt signal is disabled. + +This patch fixes this issue by re-enabling the interrupts by +calling dmaengine_synchronize(). + +Signed-off-by: Biju Das +Reviewed-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/20220721143449.879257-1-biju.das.jz@bp.renesas.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/spi/spi-rspi.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c +index ea03cc589e61..4600e3c9e49e 100644 +--- a/drivers/spi/spi-rspi.c ++++ b/drivers/spi/spi-rspi.c +@@ -612,6 +612,10 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx, + rspi->dma_callbacked, HZ); + if (ret > 0 && rspi->dma_callbacked) { + ret = 0; ++ if (tx) ++ dmaengine_synchronize(rspi->ctlr->dma_tx); ++ if (rx) ++ dmaengine_synchronize(rspi->ctlr->dma_rx); + } else { + if (!ret) { + dev_err(&rspi->ctlr->dev, "DMA timeout\n"); +-- +2.35.1 + diff --git a/queue-5.10/spi-synquacer-add-missing-clk_disable_unprepare.patch b/queue-5.10/spi-synquacer-add-missing-clk_disable_unprepare.patch new file mode 100644 index 00000000000..d0d3cdbe8e4 --- /dev/null +++ b/queue-5.10/spi-synquacer-add-missing-clk_disable_unprepare.patch @@ -0,0 +1,35 @@ +From 0a3e124cc4b2a350c7762b4a3559db6dada244bf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Jun 2022 08:56:14 +0800 +Subject: spi: synquacer: Add missing clk_disable_unprepare() + +From: Guo Mengqi + +[ Upstream commit 917e43de2a56d9b82576f1cc94748261f1988458 ] + +Add missing clk_disable_unprepare() in synquacer_spi_resume(). + +Reported-by: Hulk Robot +Signed-off-by: Guo Mengqi +Link: https://lore.kernel.org/r/20220624005614.49434-1-guomengqi3@huawei.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/spi/spi-synquacer.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/spi/spi-synquacer.c b/drivers/spi/spi-synquacer.c +index ea706d9629cb..47cbe73137c2 100644 +--- a/drivers/spi/spi-synquacer.c ++++ b/drivers/spi/spi-synquacer.c +@@ -783,6 +783,7 @@ static int __maybe_unused synquacer_spi_resume(struct device *dev) + + ret = synquacer_spi_enable(master); + if (ret) { ++ clk_disable_unprepare(sspi->clk); + dev_err(dev, "failed to enable spi (%d)\n", ret); + return ret; + } +-- +2.35.1 + diff --git a/queue-5.10/staging-rtl8192u-fix-sleep-in-atomic-context-bug-in-.patch b/queue-5.10/staging-rtl8192u-fix-sleep-in-atomic-context-bug-in-.patch new file mode 100644 index 00000000000..9c86b0b3e43 --- /dev/null +++ b/queue-5.10/staging-rtl8192u-fix-sleep-in-atomic-context-bug-in-.patch @@ -0,0 +1,150 @@ +From 7d0395ce4926cbb267072c13f02cba60b68cc4db Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 10 Jul 2022 18:30:02 +0800 +Subject: staging: rtl8192u: Fix sleep in atomic context bug in + dm_fsync_timer_callback + +From: Duoming Zhou + +[ Upstream commit 6a0c054930d554ad8f8044ef1fc856d9da391c81 ] + +There are sleep in atomic context bugs when dm_fsync_timer_callback is +executing. The root cause is that the memory allocation functions with +GFP_KERNEL or GFP_NOIO parameters are called in dm_fsync_timer_callback +which is a timer handler. The call paths that could trigger bugs are +shown below: + + (interrupt context) +dm_fsync_timer_callback + write_nic_byte + kzalloc(sizeof(data), GFP_KERNEL); //may sleep + usb_control_msg + kmalloc(.., GFP_NOIO); //may sleep + write_nic_dword + kzalloc(sizeof(data), GFP_KERNEL); //may sleep + usb_control_msg + kmalloc(.., GFP_NOIO); //may sleep + +This patch uses delayed work to replace timer and moves the operations +that may sleep into the delayed work in order to mitigate bugs. + +Fixes: 8fc8598e61f6 ("Staging: Added Realtek rtl8192u driver to staging") +Signed-off-by: Duoming Zhou +Link: https://lore.kernel.org/r/20220710103002.63283-1-duoming@zju.edu.cn +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/staging/rtl8192u/r8192U.h | 2 +- + drivers/staging/rtl8192u/r8192U_dm.c | 38 +++++++++++++--------------- + drivers/staging/rtl8192u/r8192U_dm.h | 2 +- + 3 files changed, 20 insertions(+), 22 deletions(-) + +diff --git a/drivers/staging/rtl8192u/r8192U.h b/drivers/staging/rtl8192u/r8192U.h +index ec33fb9122e9..57badc1e91e3 100644 +--- a/drivers/staging/rtl8192u/r8192U.h ++++ b/drivers/staging/rtl8192u/r8192U.h +@@ -1013,7 +1013,7 @@ typedef struct r8192_priv { + bool bis_any_nonbepkts; + bool bcurrent_turbo_EDCA; + bool bis_cur_rdlstate; +- struct timer_list fsync_timer; ++ struct delayed_work fsync_work; + bool bfsync_processing; /* 500ms Fsync timer is active or not */ + u32 rate_record; + u32 rateCountDiffRecord; +diff --git a/drivers/staging/rtl8192u/r8192U_dm.c b/drivers/staging/rtl8192u/r8192U_dm.c +index bac402b40121..6aa424a31569 100644 +--- a/drivers/staging/rtl8192u/r8192U_dm.c ++++ b/drivers/staging/rtl8192u/r8192U_dm.c +@@ -2578,19 +2578,20 @@ static void dm_init_fsync(struct net_device *dev) + priv->ieee80211->fsync_seconddiff_ratethreshold = 200; + priv->ieee80211->fsync_state = Default_Fsync; + priv->framesyncMonitor = 1; /* current default 0xc38 monitor on */ +- timer_setup(&priv->fsync_timer, dm_fsync_timer_callback, 0); ++ INIT_DELAYED_WORK(&priv->fsync_work, dm_fsync_work_callback); + } + + static void dm_deInit_fsync(struct net_device *dev) + { + struct r8192_priv *priv = ieee80211_priv(dev); + +- del_timer_sync(&priv->fsync_timer); ++ cancel_delayed_work_sync(&priv->fsync_work); + } + +-void dm_fsync_timer_callback(struct timer_list *t) ++void dm_fsync_work_callback(struct work_struct *work) + { +- struct r8192_priv *priv = from_timer(priv, t, fsync_timer); ++ struct r8192_priv *priv = ++ container_of(work, struct r8192_priv, fsync_work.work); + struct net_device *dev = priv->ieee80211->dev; + u32 rate_index, rate_count = 0, rate_count_diff = 0; + bool bSwitchFromCountDiff = false; +@@ -2657,17 +2658,16 @@ void dm_fsync_timer_callback(struct timer_list *t) + } + } + if (bDoubleTimeInterval) { +- if (timer_pending(&priv->fsync_timer)) +- del_timer_sync(&priv->fsync_timer); +- priv->fsync_timer.expires = jiffies + +- msecs_to_jiffies(priv->ieee80211->fsync_time_interval*priv->ieee80211->fsync_multiple_timeinterval); +- add_timer(&priv->fsync_timer); ++ cancel_delayed_work_sync(&priv->fsync_work); ++ schedule_delayed_work(&priv->fsync_work, ++ msecs_to_jiffies(priv ++ ->ieee80211->fsync_time_interval * ++ priv->ieee80211->fsync_multiple_timeinterval)); + } else { +- if (timer_pending(&priv->fsync_timer)) +- del_timer_sync(&priv->fsync_timer); +- priv->fsync_timer.expires = jiffies + +- msecs_to_jiffies(priv->ieee80211->fsync_time_interval); +- add_timer(&priv->fsync_timer); ++ cancel_delayed_work_sync(&priv->fsync_work); ++ schedule_delayed_work(&priv->fsync_work, ++ msecs_to_jiffies(priv ++ ->ieee80211->fsync_time_interval)); + } + } else { + /* Let Register return to default value; */ +@@ -2695,7 +2695,7 @@ static void dm_EndSWFsync(struct net_device *dev) + struct r8192_priv *priv = ieee80211_priv(dev); + + RT_TRACE(COMP_HALDM, "%s\n", __func__); +- del_timer_sync(&(priv->fsync_timer)); ++ cancel_delayed_work_sync(&priv->fsync_work); + + /* Let Register return to default value; */ + if (priv->bswitch_fsync) { +@@ -2736,11 +2736,9 @@ static void dm_StartSWFsync(struct net_device *dev) + if (priv->ieee80211->fsync_rate_bitmap & rateBitmap) + priv->rate_record += priv->stats.received_rate_histogram[1][rateIndex]; + } +- if (timer_pending(&priv->fsync_timer)) +- del_timer_sync(&priv->fsync_timer); +- priv->fsync_timer.expires = jiffies + +- msecs_to_jiffies(priv->ieee80211->fsync_time_interval); +- add_timer(&priv->fsync_timer); ++ cancel_delayed_work_sync(&priv->fsync_work); ++ schedule_delayed_work(&priv->fsync_work, ++ msecs_to_jiffies(priv->ieee80211->fsync_time_interval)); + + write_nic_dword(dev, rOFDM0_RxDetector2, 0x465c12cd); + } +diff --git a/drivers/staging/rtl8192u/r8192U_dm.h b/drivers/staging/rtl8192u/r8192U_dm.h +index 0b2a1c688597..2159018b4e38 100644 +--- a/drivers/staging/rtl8192u/r8192U_dm.h ++++ b/drivers/staging/rtl8192u/r8192U_dm.h +@@ -166,7 +166,7 @@ void dm_force_tx_fw_info(struct net_device *dev, + void dm_init_edca_turbo(struct net_device *dev); + void dm_rf_operation_test_callback(unsigned long data); + void dm_rf_pathcheck_workitemcallback(struct work_struct *work); +-void dm_fsync_timer_callback(struct timer_list *t); ++void dm_fsync_work_callback(struct work_struct *work); + void dm_cck_txpower_adjust(struct net_device *dev, bool binch14); + void dm_shadow_init(struct net_device *dev); + void dm_initialize_txpower_tracking(struct net_device *dev); +-- +2.35.1 + diff --git a/queue-5.10/tcp-fix-data-races-around-sysctl_tcp_l3mdev_accept.patch b/queue-5.10/tcp-fix-data-races-around-sysctl_tcp_l3mdev_accept.patch new file mode 100644 index 00000000000..58afdde2b49 --- /dev/null +++ b/queue-5.10/tcp-fix-data-races-around-sysctl_tcp_l3mdev_accept.patch @@ -0,0 +1,59 @@ +From c597c9b51455b402fa1e3ee2f255d60c6d8b1e86 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jul 2022 13:51:59 -0700 +Subject: tcp: Fix data-races around sysctl_tcp_l3mdev_accept. + +From: Kuniyuki Iwashima + +[ Upstream commit 08a75f10679470552a3a443f9aefd1399604d31d ] + +While reading sysctl_tcp_l3mdev_accept, it can be changed concurrently. +Thus, we need to add READ_ONCE() to its readers. + +Fixes: 6dd9a14e92e5 ("net: Allow accepted sockets to be bound to l3mdev domain") +Signed-off-by: Kuniyuki Iwashima +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + include/net/inet_hashtables.h | 2 +- + include/net/inet_sock.h | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h +index 816851807fa8..1a3bf9726b75 100644 +--- a/include/net/inet_hashtables.h ++++ b/include/net/inet_hashtables.h +@@ -201,7 +201,7 @@ static inline bool inet_sk_bound_dev_eq(struct net *net, int bound_dev_if, + int dif, int sdif) + { + #if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV) +- return inet_bound_dev_eq(!!net->ipv4.sysctl_tcp_l3mdev_accept, ++ return inet_bound_dev_eq(!!READ_ONCE(net->ipv4.sysctl_tcp_l3mdev_accept), + bound_dev_if, dif, sdif); + #else + return inet_bound_dev_eq(true, bound_dev_if, dif, sdif); +diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h +index 886ed0950b7f..4908513c6dfb 100644 +--- a/include/net/inet_sock.h ++++ b/include/net/inet_sock.h +@@ -121,7 +121,7 @@ static inline int inet_request_bound_dev_if(const struct sock *sk, + #ifdef CONFIG_NET_L3_MASTER_DEV + struct net *net = sock_net(sk); + +- if (!bound_dev_if && net->ipv4.sysctl_tcp_l3mdev_accept) ++ if (!bound_dev_if && READ_ONCE(net->ipv4.sysctl_tcp_l3mdev_accept)) + return l3mdev_master_ifindex_by_index(net, skb->skb_iif); + #endif + +@@ -133,7 +133,7 @@ static inline int inet_sk_bound_l3mdev(const struct sock *sk) + #ifdef CONFIG_NET_L3_MASTER_DEV + struct net *net = sock_net(sk); + +- if (!net->ipv4.sysctl_tcp_l3mdev_accept) ++ if (!READ_ONCE(net->ipv4.sysctl_tcp_l3mdev_accept)) + return l3mdev_master_ifindex_by_index(net, + sk->sk_bound_dev_if); + #endif +-- +2.35.1 + diff --git a/queue-5.10/tcp-make-retransmitted-skb-fit-into-the-send-window.patch b/queue-5.10/tcp-make-retransmitted-skb-fit-into-the-send-window.patch new file mode 100644 index 00000000000..b1ff312ea3b --- /dev/null +++ b/queue-5.10/tcp-make-retransmitted-skb-fit-into-the-send-window.patch @@ -0,0 +1,112 @@ +From 4119a5ad286c95696300fcb214de8855bb57beb5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jul 2022 17:47:18 +0800 +Subject: tcp: make retransmitted SKB fit into the send window + +From: Yonglong Li + +[ Upstream commit 536a6c8e05f95e3d1118c40ae8b3022ee2d05d52 ] + +current code of __tcp_retransmit_skb only check TCP_SKB_CB(skb)->seq +in send window, and TCP_SKB_CB(skb)->seq_end maybe out of send window. +If receiver has shrunk his window, and skb is out of new window, it +should retransmit a smaller portion of the payload. + +test packetdrill script: + 0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 + +0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) + +0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 + + +0 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress) + +0 > S 0:0(0) win 65535 + +.05 < S. 0:0(0) ack 1 win 6000 + +0 > . 1:1(0) ack 1 + + +0 write(3, ..., 10000) = 10000 + + +0 > . 1:2001(2000) ack 1 win 65535 + +0 > . 2001:4001(2000) ack 1 win 65535 + +0 > . 4001:6001(2000) ack 1 win 65535 + + +.05 < . 1:1(0) ack 4001 win 1001 + +and tcpdump show: +192.168.226.67.55 > 192.0.2.1.8080: Flags [.], seq 1:2001, ack 1, win 65535, length 2000 +192.168.226.67.55 > 192.0.2.1.8080: Flags [.], seq 2001:4001, ack 1, win 65535, length 2000 +192.168.226.67.55 > 192.0.2.1.8080: Flags [P.], seq 4001:5001, ack 1, win 65535, length 1000 +192.168.226.67.55 > 192.0.2.1.8080: Flags [.], seq 5001:6001, ack 1, win 65535, length 1000 +192.0.2.1.8080 > 192.168.226.67.55: Flags [.], ack 4001, win 1001, length 0 +192.168.226.67.55 > 192.0.2.1.8080: Flags [.], seq 5001:6001, ack 1, win 65535, length 1000 +192.168.226.67.55 > 192.0.2.1.8080: Flags [P.], seq 4001:5001, ack 1, win 65535, length 1000 + +when cient retract window to 1001, send window is [4001,5002], +but TLP send 5001-6001 packet which is out of send window. + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Signed-off-by: Yonglong Li +Signed-off-by: Eric Dumazet +Link: https://lore.kernel.org/r/1657532838-20200-1-git-send-email-liyonglong@chinatelecom.cn +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/ipv4/tcp_output.c | 23 ++++++++++++++++------- + 1 file changed, 16 insertions(+), 7 deletions(-) + +diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c +index 657b0a4d9359..5662faf81fa5 100644 +--- a/net/ipv4/tcp_output.c ++++ b/net/ipv4/tcp_output.c +@@ -3137,7 +3137,7 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs) + struct tcp_sock *tp = tcp_sk(sk); + unsigned int cur_mss; + int diff, len, err; +- ++ int avail_wnd; + + /* Inconclusive MTU probe */ + if (icsk->icsk_mtup.probe_size) +@@ -3167,17 +3167,25 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs) + return -EHOSTUNREACH; /* Routing failure or similar. */ + + cur_mss = tcp_current_mss(sk); ++ avail_wnd = tcp_wnd_end(tp) - TCP_SKB_CB(skb)->seq; + + /* If receiver has shrunk his window, and skb is out of + * new window, do not retransmit it. The exception is the + * case, when window is shrunk to zero. In this case +- * our retransmit serves as a zero window probe. ++ * our retransmit of one segment serves as a zero window probe. + */ +- if (!before(TCP_SKB_CB(skb)->seq, tcp_wnd_end(tp)) && +- TCP_SKB_CB(skb)->seq != tp->snd_una) +- return -EAGAIN; ++ if (avail_wnd <= 0) { ++ if (TCP_SKB_CB(skb)->seq != tp->snd_una) ++ return -EAGAIN; ++ avail_wnd = cur_mss; ++ } + + len = cur_mss * segs; ++ if (len > avail_wnd) { ++ len = rounddown(avail_wnd, cur_mss); ++ if (!len) ++ len = avail_wnd; ++ } + if (skb->len > len) { + if (tcp_fragment(sk, TCP_FRAG_IN_RTX_QUEUE, skb, len, + cur_mss, GFP_ATOMIC)) +@@ -3191,8 +3199,9 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs) + diff -= tcp_skb_pcount(skb); + if (diff) + tcp_adjust_pcount(sk, skb, diff); +- if (skb->len < cur_mss) +- tcp_retrans_try_collapse(sk, skb, cur_mss); ++ avail_wnd = min_t(int, avail_wnd, cur_mss); ++ if (skb->len < avail_wnd) ++ tcp_retrans_try_collapse(sk, skb, avail_wnd); + } + + /* RFC3168, section 6.1.1.1. ECN fallback */ +-- +2.35.1 + diff --git a/queue-5.10/tcp-sk-sk_bound_dev_if-once-in-inet_request_bound_de.patch b/queue-5.10/tcp-sk-sk_bound_dev_if-once-in-inet_request_bound_de.patch new file mode 100644 index 00000000000..464d85df061 --- /dev/null +++ b/queue-5.10/tcp-sk-sk_bound_dev_if-once-in-inet_request_bound_de.patch @@ -0,0 +1,46 @@ +From 1e15a9491fea652a68665566e60fdb0f2a875a9b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 13 May 2022 11:55:43 -0700 +Subject: tcp: sk->sk_bound_dev_if once in inet_request_bound_dev_if() + +From: Eric Dumazet + +[ Upstream commit fdb5fd7f736ec7ae9fb36d2842ea6d9ebc4e7269 ] + +inet_request_bound_dev_if() reads sk->sk_bound_dev_if twice +while listener socket is not locked. + +Another cpu could change this field under us. + +Signed-off-by: Eric Dumazet +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + include/net/inet_sock.h | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h +index 3c039d4b0e48..886ed0950b7f 100644 +--- a/include/net/inet_sock.h ++++ b/include/net/inet_sock.h +@@ -117,14 +117,15 @@ static inline u32 inet_request_mark(const struct sock *sk, struct sk_buff *skb) + static inline int inet_request_bound_dev_if(const struct sock *sk, + struct sk_buff *skb) + { ++ int bound_dev_if = READ_ONCE(sk->sk_bound_dev_if); + #ifdef CONFIG_NET_L3_MASTER_DEV + struct net *net = sock_net(sk); + +- if (!sk->sk_bound_dev_if && net->ipv4.sysctl_tcp_l3mdev_accept) ++ if (!bound_dev_if && net->ipv4.sysctl_tcp_l3mdev_accept) + return l3mdev_master_ifindex_by_index(net, skb->skb_iif); + #endif + +- return sk->sk_bound_dev_if; ++ return bound_dev_if; + } + + static inline int inet_sk_bound_l3mdev(const struct sock *sk) +-- +2.35.1 + diff --git a/queue-5.10/test_bpf-fix-incorrect-netdev-features.patch b/queue-5.10/test_bpf-fix-incorrect-netdev-features.patch new file mode 100644 index 00000000000..360893dcc59 --- /dev/null +++ b/queue-5.10/test_bpf-fix-incorrect-netdev-features.patch @@ -0,0 +1,42 @@ +From 3a28b996aa2fa55ca7682c09c9671a9006142dce Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 22 Jun 2022 21:50:02 +0800 +Subject: test_bpf: fix incorrect netdev features + +From: Jian Shen + +[ Upstream commit 9676feccacdb0571791c88b23e3b7ac4e7c9c457 ] + +The prototype of .features is netdev_features_t, it should use +NETIF_F_LLTX and NETIF_F_HW_VLAN_STAG_TX, not NETIF_F_LLTX_BIT +and NETIF_F_HW_VLAN_STAG_TX_BIT. + +Fixes: cf204a718357 ("bpf, testing: Introduce 'gso_linear_no_head_frag' skb_segment test") +Signed-off-by: Jian Shen +Acked-by: John Fastabend +Link: https://lore.kernel.org/r/20220622135002.8263-1-shenjian15@huawei.com +Signed-off-by: Alexei Starovoitov +Signed-off-by: Sasha Levin +--- + lib/test_bpf.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/test_bpf.c b/lib/test_bpf.c +index 4a9137c8551a..8761b9797073 100644 +--- a/lib/test_bpf.c ++++ b/lib/test_bpf.c +@@ -6918,9 +6918,9 @@ static struct skb_segment_test skb_segment_tests[] __initconst = { + .build_skb = build_test_skb_linear_no_head_frag, + .features = NETIF_F_SG | NETIF_F_FRAGLIST | + NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_GSO | +- NETIF_F_LLTX_BIT | NETIF_F_GRO | ++ NETIF_F_LLTX | NETIF_F_GRO | + NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM | +- NETIF_F_HW_VLAN_STAG_TX_BIT ++ NETIF_F_HW_VLAN_STAG_TX + } + }; + +-- +2.35.1 + diff --git a/queue-5.10/thermal-tools-tmon-include-pthread-and-time-headers-.patch b/queue-5.10/thermal-tools-tmon-include-pthread-and-time-headers-.patch new file mode 100644 index 00000000000..2414b238496 --- /dev/null +++ b/queue-5.10/thermal-tools-tmon-include-pthread-and-time-headers-.patch @@ -0,0 +1,62 @@ +From 656a8bef01c7014b84e21a94410ca6f1ff57fbf4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 17 Jul 2022 20:10:39 -0700 +Subject: thermal/tools/tmon: Include pthread and time headers in tmon.h +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Markus Mayer + +[ Upstream commit 0cf51bfe999524377fbb71becb583b4ca6d07cfc ] + +Include sys/time.h and pthread.h in tmon.h, so that types +"pthread_mutex_t" and "struct timeval tv" are known when tmon.h +references them. + +Without these headers, compiling tmon against musl-libc will fail with +these errors: + +In file included from sysfs.c:31:0: +tmon.h:47:8: error: unknown type name 'pthread_mutex_t' + extern pthread_mutex_t input_lock; + ^~~~~~~~~~~~~~~ +make[3]: *** [: sysfs.o] Error 1 +make[3]: *** Waiting for unfinished jobs.... +In file included from tui.c:31:0: +tmon.h:54:17: error: field 'tv' has incomplete type + struct timeval tv; + ^~ +make[3]: *** [: tui.o] Error 1 +make[2]: *** [Makefile:83: tmon] Error 2 + +Signed-off-by: Markus Mayer +Acked-by: Florian Fainelli +Reviewed-by: Sumeet Pawnikar +Acked-by: Alejandro González +Tested-by: Alejandro González +Fixes: 94f69966faf8 ("tools/thermal: Introduce tmon, a tool for thermal subsystem") +Link: https://lore.kernel.org/r/20220718031040.44714-1-f.fainelli@gmail.com +Signed-off-by: Daniel Lezcano +Signed-off-by: Sasha Levin +--- + tools/thermal/tmon/tmon.h | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/tools/thermal/tmon/tmon.h b/tools/thermal/tmon/tmon.h +index c9066ec104dd..44d16d778f04 100644 +--- a/tools/thermal/tmon/tmon.h ++++ b/tools/thermal/tmon/tmon.h +@@ -27,6 +27,9 @@ + #define NR_LINES_TZDATA 1 + #define TMON_LOG_FILE "/var/tmp/tmon.log" + ++#include ++#include ++ + extern unsigned long ticktime; + extern double time_elapsed; + extern unsigned long target_temp_user; +-- +2.35.1 + diff --git a/queue-5.10/tools-thermal-fix-possible-path-truncations.patch b/queue-5.10/tools-thermal-fix-possible-path-truncations.patch new file mode 100644 index 00000000000..30fa8ea5b65 --- /dev/null +++ b/queue-5.10/tools-thermal-fix-possible-path-truncations.patch @@ -0,0 +1,109 @@ +From ea39e49f2aa5582fbc6137ef2a55a5be552674eb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Jul 2022 10:37:54 -0700 +Subject: tools/thermal: Fix possible path truncations + +From: Florian Fainelli + +[ Upstream commit 6c58cf40e3a1d2f47c09d3489857e9476316788a ] + +A build with -D_FORTIFY_SOURCE=2 enabled will produce the following warnings: + +sysfs.c:63:30: warning: '%s' directive output may be truncated writing up to 255 bytes into a region of size between 0 and 255 [-Wformat-truncation=] + snprintf(filepath, 256, "%s/%s", path, filename); + ^~ +Bump up the buffer to PATH_MAX which is the limit and account for all of +the possible NUL and separators that could lead to exceeding the +allocated buffer sizes. + +Fixes: 94f69966faf8 ("tools/thermal: Introduce tmon, a tool for thermal subsystem") +Signed-off-by: Florian Fainelli +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + tools/thermal/tmon/sysfs.c | 24 +++++++++++++----------- + 1 file changed, 13 insertions(+), 11 deletions(-) + +diff --git a/tools/thermal/tmon/sysfs.c b/tools/thermal/tmon/sysfs.c +index b00b1bfd9d8e..cb1108bc9249 100644 +--- a/tools/thermal/tmon/sysfs.c ++++ b/tools/thermal/tmon/sysfs.c +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -33,9 +34,9 @@ int sysfs_set_ulong(char *path, char *filename, unsigned long val) + { + FILE *fd; + int ret = -1; +- char filepath[256]; ++ char filepath[PATH_MAX + 2]; /* NUL and '/' */ + +- snprintf(filepath, 256, "%s/%s", path, filename); ++ snprintf(filepath, sizeof(filepath), "%s/%s", path, filename); + + fd = fopen(filepath, "w"); + if (!fd) { +@@ -57,9 +58,9 @@ static int sysfs_get_ulong(char *path, char *filename, unsigned long *p_ulong) + { + FILE *fd; + int ret = -1; +- char filepath[256]; ++ char filepath[PATH_MAX + 2]; /* NUL and '/' */ + +- snprintf(filepath, 256, "%s/%s", path, filename); ++ snprintf(filepath, sizeof(filepath), "%s/%s", path, filename); + + fd = fopen(filepath, "r"); + if (!fd) { +@@ -76,9 +77,9 @@ static int sysfs_get_string(char *path, char *filename, char *str) + { + FILE *fd; + int ret = -1; +- char filepath[256]; ++ char filepath[PATH_MAX + 2]; /* NUL and '/' */ + +- snprintf(filepath, 256, "%s/%s", path, filename); ++ snprintf(filepath, sizeof(filepath), "%s/%s", path, filename); + + fd = fopen(filepath, "r"); + if (!fd) { +@@ -199,8 +200,8 @@ static int find_tzone_cdev(struct dirent *nl, char *tz_name, + { + unsigned long trip_instance = 0; + char cdev_name_linked[256]; +- char cdev_name[256]; +- char cdev_trip_name[256]; ++ char cdev_name[PATH_MAX]; ++ char cdev_trip_name[PATH_MAX]; + int cdev_id; + + if (nl->d_type == DT_LNK) { +@@ -213,7 +214,8 @@ static int find_tzone_cdev(struct dirent *nl, char *tz_name, + return -EINVAL; + } + /* find the link to real cooling device record binding */ +- snprintf(cdev_name, 256, "%s/%s", tz_name, nl->d_name); ++ snprintf(cdev_name, sizeof(cdev_name) - 2, "%s/%s", ++ tz_name, nl->d_name); + memset(cdev_name_linked, 0, sizeof(cdev_name_linked)); + if (readlink(cdev_name, cdev_name_linked, + sizeof(cdev_name_linked) - 1) != -1) { +@@ -226,8 +228,8 @@ static int find_tzone_cdev(struct dirent *nl, char *tz_name, + /* find the trip point in which the cdev is binded to + * in this tzone + */ +- snprintf(cdev_trip_name, 256, "%s%s", nl->d_name, +- "_trip_point"); ++ snprintf(cdev_trip_name, sizeof(cdev_trip_name) - 1, ++ "%s%s", nl->d_name, "_trip_point"); + sysfs_get_ulong(tz_name, cdev_trip_name, + &trip_instance); + /* validate trip point range, e.g. trip could return -1 +-- +2.35.1 + diff --git a/queue-5.10/tty-n_gsm-delete-gsmtty-open-sabm-frame-when-config-.patch b/queue-5.10/tty-n_gsm-delete-gsmtty-open-sabm-frame-when-config-.patch new file mode 100644 index 00000000000..ef815bcf38b --- /dev/null +++ b/queue-5.10/tty-n_gsm-delete-gsmtty-open-sabm-frame-when-config-.patch @@ -0,0 +1,51 @@ +From 241b169b6cba1b1e70644007ff2d5adc8977e589 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 Aug 2021 20:17:50 +0800 +Subject: tty: n_gsm: Delete gsmtty open SABM frame when config requester + +From: Zhenguo Zhao + +[ Upstream commit cbff2b32516881bef30bbebf413d1b49495bab1d ] + +When n_gsm config "initiator=0",as requester ,it doesn't need to +send SABM frame data during gsmtty open. + +Example,when gsmtty open,it will send SABM frame.for initiator,it +maybe not want to receive the frame. + +[ 88.410426] c1 gsmld_output: 00000000: f9 07 3f 01 de f9 +[ 88.420839] c1 --> 1) R: SABM(F) + +Signed-off-by: Zhenguo Zhao +Link: https://lore.kernel.org/r/1629461872-26965-6-git-send-email-zhenguo6858@gmail.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/n_gsm.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c +index b05b7862778c..405b55bceba8 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -3024,6 +3024,7 @@ static int gsmtty_open(struct tty_struct *tty, struct file *filp) + { + struct gsm_dlci *dlci = tty->driver_data; + struct tty_port *port = &dlci->port; ++ struct gsm_mux *gsm = dlci->gsm; + + port->count++; + tty_port_tty_set(port, tty); +@@ -3033,7 +3034,8 @@ static int gsmtty_open(struct tty_struct *tty, struct file *filp) + a DM straight back. This is ok as that will have caused a hangup */ + tty_port_set_initialized(port, 1); + /* Start sending off SABM messages */ +- gsm_dlci_begin_open(dlci); ++ if (gsm->initiator) ++ gsm_dlci_begin_open(dlci); + /* And wait for virtual carrier */ + return tty_port_block_til_ready(port, tty, filp); + } +-- +2.35.1 + diff --git a/queue-5.10/tty-n_gsm-fix-dm-command.patch b/queue-5.10/tty-n_gsm-fix-dm-command.patch new file mode 100644 index 00000000000..d8f41d43b18 --- /dev/null +++ b/queue-5.10/tty-n_gsm-fix-dm-command.patch @@ -0,0 +1,42 @@ +From 096eefeea053f381ead1330b3abdfa4fd31643ef Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jul 2022 13:32:21 +0200 +Subject: tty: n_gsm: fix DM command + +From: Daniel Starke + +[ Upstream commit 18a948c7d90995d127785e308fa7b701df4c499f ] + +n_gsm is based on the 3GPP 07.010 and its newer version is the 3GPP 27.010. +See https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=1516 +The changes from 07.010 to 27.010 are non-functional. Therefore, I refer to +the newer 27.010 here. Chapter 5.3.3 defines the DM response. There exists +no DM command. However, the current implementation incorrectly sends DM as +command in case of unexpected UIH frames in gsm_queue(). +Correct this behavior by always sending DM as response. + +Fixes: e1eaea46bb40 ("tty: n_gsm line discipline") +Signed-off-by: Daniel Starke +Link: https://lore.kernel.org/r/20220707113223.3685-2-daniel.starke@siemens.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/n_gsm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c +index 3f100f7abdb7..a6c0a1b76ddb 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -1938,7 +1938,7 @@ static void gsm_queue(struct gsm_mux *gsm) + goto invalid; + #endif + if (dlci == NULL || dlci->state != DLCI_OPEN) { +- gsm_command(gsm, address, DM|PF); ++ gsm_response(gsm, address, DM|PF); + return; + } + dlci->data(dlci, gsm->buf, gsm->len); +-- +2.35.1 + diff --git a/queue-5.10/tty-n_gsm-fix-missing-corner-cases-in-gsmld_poll.patch b/queue-5.10/tty-n_gsm-fix-missing-corner-cases-in-gsmld_poll.patch new file mode 100644 index 00000000000..cfa2136441b --- /dev/null +++ b/queue-5.10/tty-n_gsm-fix-missing-corner-cases-in-gsmld_poll.patch @@ -0,0 +1,49 @@ +From 1808b5cc792907288d6b1434d2b95a2aad4e19f7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jul 2022 13:32:23 +0200 +Subject: tty: n_gsm: fix missing corner cases in gsmld_poll() + +From: Daniel Starke + +[ Upstream commit 7e5b4322cde067e1d0f1bf8f490e93f664a7c843 ] + +gsmld_poll() currently fails to handle the following corner cases correctly: +- remote party closed the associated tty + +Add the missing checks and map those to EPOLLHUP. +Reorder the checks to group them by their reaction. + +Fixes: e1eaea46bb40 ("tty: n_gsm line discipline") +Signed-off-by: Daniel Starke +Link: https://lore.kernel.org/r/20220707113223.3685-4-daniel.starke@siemens.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/n_gsm.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c +index a6c0a1b76ddb..cb5ed4155a8d 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -2747,12 +2747,15 @@ static __poll_t gsmld_poll(struct tty_struct *tty, struct file *file, + + poll_wait(file, &tty->read_wait, wait); + poll_wait(file, &tty->write_wait, wait); ++ ++ if (gsm->dead) ++ mask |= EPOLLHUP; + if (tty_hung_up_p(file)) + mask |= EPOLLHUP; ++ if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) ++ mask |= EPOLLHUP; + if (!tty_is_writelocked(tty) && tty_write_room(tty) > 0) + mask |= EPOLLOUT | EPOLLWRNORM; +- if (gsm->dead) +- mask |= EPOLLHUP; + return mask; + } + +-- +2.35.1 + diff --git a/queue-5.10/tty-n_gsm-fix-non-flow-control-frames-during-mux-flo.patch b/queue-5.10/tty-n_gsm-fix-non-flow-control-frames-during-mux-flo.patch new file mode 100644 index 00000000000..80a45983800 --- /dev/null +++ b/queue-5.10/tty-n_gsm-fix-non-flow-control-frames-during-mux-flo.patch @@ -0,0 +1,116 @@ +From 7ad64581720329e76b38f3f0a167c49af93fd99e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 08:16:48 +0200 +Subject: tty: n_gsm: fix non flow control frames during mux flow off + +From: Daniel Starke + +[ Upstream commit bec0224816d19abe4fe503586d16d51890540615 ] + +n_gsm is based on the 3GPP 07.010 and its newer version is the 3GPP 27.010. +See https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=1516 +The changes from 07.010 to 27.010 are non-functional. Therefore, I refer to +the newer 27.010 here. Chapter 5.4.6.3.6 states that FCoff stops the +transmission on all channels except the control channel. This is already +implemented in gsm_data_kick(). However, chapter 5.4.8.1 explains that this +shall result in the same behavior as software flow control on the ldisc in +advanced option mode. That means only flow control frames shall be sent +during flow off. The current implementation does not consider this case. + +Change gsm_data_kick() to send only flow control frames if constipated to +abide the standard. gsm_read_ea_val() and gsm_is_flow_ctrl_msg() are +introduced as helper functions for this. +It is planned to use gsm_read_ea_val() in later code cleanups for other +functions, too. + +Fixes: c01af4fec2c8 ("n_gsm : Flow control handling in Mux driver") +Signed-off-by: Daniel Starke +Link: https://lore.kernel.org/r/20220701061652.39604-5-daniel.starke@siemens.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/n_gsm.c | 54 ++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 53 insertions(+), 1 deletion(-) + +diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c +index cb8de8d61265..fe14eed0aa2e 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -417,6 +417,27 @@ static int gsm_read_ea(unsigned int *val, u8 c) + return c & EA; + } + ++/** ++ * gsm_read_ea_val - read a value until EA ++ * @val: variable holding value ++ * @data: buffer of data ++ * @dlen: length of data ++ * ++ * Processes an EA value. Updates the passed variable and ++ * returns the processed data length. ++ */ ++static unsigned int gsm_read_ea_val(unsigned int *val, const u8 *data, int dlen) ++{ ++ unsigned int len = 0; ++ ++ for (; dlen > 0; dlen--) { ++ len++; ++ if (gsm_read_ea(val, *data++)) ++ break; ++ } ++ return len; ++} ++ + /** + * gsm_encode_modem - encode modem data bits + * @dlci: DLCI to encode from +@@ -653,6 +674,37 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len, + return m; + } + ++/** ++ * gsm_is_flow_ctrl_msg - checks if flow control message ++ * @msg: message to check ++ * ++ * Returns true if the given message is a flow control command of the ++ * control channel. False is returned in any other case. ++ */ ++static bool gsm_is_flow_ctrl_msg(struct gsm_msg *msg) ++{ ++ unsigned int cmd; ++ ++ if (msg->addr > 0) ++ return false; ++ ++ switch (msg->ctrl & ~PF) { ++ case UI: ++ case UIH: ++ cmd = 0; ++ if (gsm_read_ea_val(&cmd, msg->data + 2, msg->len - 2) < 1) ++ break; ++ switch (cmd & ~PF) { ++ case CMD_FCOFF: ++ case CMD_FCON: ++ return true; ++ } ++ break; ++ } ++ ++ return false; ++} ++ + /** + * gsm_data_kick - poke the queue + * @gsm: GSM Mux +@@ -671,7 +723,7 @@ static void gsm_data_kick(struct gsm_mux *gsm, struct gsm_dlci *dlci) + int len; + + list_for_each_entry_safe(msg, nmsg, &gsm->tx_list, list) { +- if (gsm->constipated && msg->addr) ++ if (gsm->constipated && !gsm_is_flow_ctrl_msg(msg)) + continue; + if (gsm->encoding != 0) { + gsm->txframe[0] = GSM1_SOF; +-- +2.35.1 + diff --git a/queue-5.10/tty-n_gsm-fix-packet-re-transmission-without-open-co.patch b/queue-5.10/tty-n_gsm-fix-packet-re-transmission-without-open-co.patch new file mode 100644 index 00000000000..dea005df922 --- /dev/null +++ b/queue-5.10/tty-n_gsm-fix-packet-re-transmission-without-open-co.patch @@ -0,0 +1,40 @@ +From b0e89f69bea66d193f7a448255591e177f350a4d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 08:16:50 +0200 +Subject: tty: n_gsm: fix packet re-transmission without open control channel + +From: Daniel Starke + +[ Upstream commit 4fae831b3a71fc5a44cc5c7d0b8c1267ee7659f5 ] + +In the current implementation control packets are re-transmitted even if +the control channel closed down during T2. This is wrong. +Check whether the control channel is open before re-transmitting any +packets. Note that control channel open/close is handled by T1 and not T2 +and remains unaffected by this. + +Fixes: e1eaea46bb40 ("tty: n_gsm line discipline") +Signed-off-by: Daniel Starke +Link: https://lore.kernel.org/r/20220701061652.39604-7-daniel.starke@siemens.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/n_gsm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c +index fe14eed0aa2e..b4cce5cd0e3d 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -1388,7 +1388,7 @@ static void gsm_control_retransmit(struct timer_list *t) + spin_lock_irqsave(&gsm->control_lock, flags); + ctrl = gsm->pending_cmd; + if (ctrl) { +- if (gsm->cretries == 0) { ++ if (gsm->cretries == 0 || !gsm->dlci[0] || gsm->dlci[0]->dead) { + gsm->pending_cmd = NULL; + ctrl->error = -ETIMEDOUT; + ctrl->done = 1; +-- +2.35.1 + diff --git a/queue-5.10/tty-n_gsm-fix-race-condition-in-gsmld_write.patch b/queue-5.10/tty-n_gsm-fix-race-condition-in-gsmld_write.patch new file mode 100644 index 00000000000..a6c0c51f9d0 --- /dev/null +++ b/queue-5.10/tty-n_gsm-fix-race-condition-in-gsmld_write.patch @@ -0,0 +1,62 @@ +From 1ca2d725c58478456818eca881b206e9cc9ce047 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 08:16:52 +0200 +Subject: tty: n_gsm: fix race condition in gsmld_write() + +From: Daniel Starke + +[ Upstream commit 32dd59f96924f45e33bc79854f7a00679c0fa28e ] + +The function may be used by the user directly and also by the n_gsm +internal functions. They can lead into a race condition which results in +interleaved frames if both are writing at the same time. The receiving side +is not able to decode those interleaved frames correctly. + +Add a lock around the low side tty write to avoid race conditions and frame +interleaving between user originated writes and n_gsm writes. + +Fixes: e1eaea46bb40 ("tty: n_gsm line discipline") +Signed-off-by: Daniel Starke +Link: https://lore.kernel.org/r/20220701061652.39604-9-daniel.starke@siemens.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/n_gsm.c | 21 +++++++++++++++++---- + 1 file changed, 17 insertions(+), 4 deletions(-) + +diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c +index b4cce5cd0e3d..969c0de788f8 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -2705,11 +2705,24 @@ static ssize_t gsmld_read(struct tty_struct *tty, struct file *file, + static ssize_t gsmld_write(struct tty_struct *tty, struct file *file, + const unsigned char *buf, size_t nr) + { +- int space = tty_write_room(tty); ++ struct gsm_mux *gsm = tty->disc_data; ++ unsigned long flags; ++ int space; ++ int ret; ++ ++ if (!gsm) ++ return -ENODEV; ++ ++ ret = -ENOBUFS; ++ spin_lock_irqsave(&gsm->tx_lock, flags); ++ space = tty_write_room(tty); + if (space >= nr) +- return tty->ops->write(tty, buf, nr); +- set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); +- return -ENOBUFS; ++ ret = tty->ops->write(tty, buf, nr); ++ else ++ set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); ++ spin_unlock_irqrestore(&gsm->tx_lock, flags); ++ ++ return ret; + } + + /** +-- +2.35.1 + diff --git a/queue-5.10/tty-n_gsm-fix-user-open-not-possible-at-responder-un.patch b/queue-5.10/tty-n_gsm-fix-user-open-not-possible-at-responder-un.patch new file mode 100644 index 00000000000..ed5ffe6f4d8 --- /dev/null +++ b/queue-5.10/tty-n_gsm-fix-user-open-not-possible-at-responder-un.patch @@ -0,0 +1,109 @@ +From b05856dbf742d11bef719aced275c46d41d82ef0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 08:16:44 +0200 +Subject: tty: n_gsm: fix user open not possible at responder until initiator + open + +From: Daniel Starke + +[ Upstream commit ac77f0077c3265197d378158c85a55eee6d21508 ] + +After setting up the control channel on both sides the responder side may +want to open a virtual tty to listen on until the initiator starts an +application on a user channel. The current implementation allows the +open() but no other operation, like termios. These fail with EINVAL. +The responder sided application has no means to detect an open by the +initiator sided application this way. And the initiator sided applications +usually expect the responder sided application to listen on the user +channel upon open. +Set the user channel into half-open state on responder side once a user +application opens the virtual tty to allow IO operations on it. +Furthermore, keep the user channel constipated until the initiator side +opens it to give the responder sided application the chance to detect the +new connection and to avoid data loss if the responder sided application +starts sending before the user channel is open. + +Fixes: e1eaea46bb40 ("tty: n_gsm line discipline") +Signed-off-by: Daniel Starke +Link: https://lore.kernel.org/r/20220701061652.39604-1-daniel.starke@siemens.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/n_gsm.c | 31 +++++++++++++++++++++++++++++-- + 1 file changed, 29 insertions(+), 2 deletions(-) + +diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c +index 405b55bceba8..c95f7d8314fc 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -1429,6 +1429,8 @@ static void gsm_dlci_close(struct gsm_dlci *dlci) + if (debug & 8) + pr_debug("DLCI %d goes closed.\n", dlci->addr); + dlci->state = DLCI_CLOSED; ++ /* Prevent us from sending data before the link is up again */ ++ dlci->constipated = true; + if (dlci->addr != 0) { + tty_port_tty_hangup(&dlci->port, false); + spin_lock_irqsave(&dlci->lock, flags); +@@ -1458,6 +1460,7 @@ static void gsm_dlci_open(struct gsm_dlci *dlci) + del_timer(&dlci->t1); + /* This will let a tty open continue */ + dlci->state = DLCI_OPEN; ++ dlci->constipated = false; + if (debug & 8) + pr_debug("DLCI %d goes open.\n", dlci->addr); + wake_up(&dlci->gsm->event); +@@ -1535,6 +1538,25 @@ static void gsm_dlci_begin_open(struct gsm_dlci *dlci) + mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100); + } + ++/** ++ * gsm_dlci_set_opening - change state to opening ++ * @dlci: DLCI to open ++ * ++ * Change internal state to wait for DLCI open from initiator side. ++ * We set off timers and responses upon reception of an SABM. ++ */ ++static void gsm_dlci_set_opening(struct gsm_dlci *dlci) ++{ ++ switch (dlci->state) { ++ case DLCI_CLOSED: ++ case DLCI_CLOSING: ++ dlci->state = DLCI_OPENING; ++ break; ++ default: ++ break; ++ } ++} ++ + /** + * gsm_dlci_begin_close - start channel open procedure + * @dlci: DLCI to open +@@ -1673,10 +1695,13 @@ static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr) + dlci->addr = addr; + dlci->adaption = gsm->adaption; + dlci->state = DLCI_CLOSED; +- if (addr) ++ if (addr) { + dlci->data = gsm_dlci_data; +- else ++ /* Prevent us from sending data before the link is up */ ++ dlci->constipated = true; ++ } else { + dlci->data = gsm_dlci_command; ++ } + gsm->dlci[addr] = dlci; + return dlci; + } +@@ -3036,6 +3061,8 @@ static int gsmtty_open(struct tty_struct *tty, struct file *filp) + /* Start sending off SABM messages */ + if (gsm->initiator) + gsm_dlci_begin_open(dlci); ++ else ++ gsm_dlci_set_opening(dlci); + /* And wait for virtual carrier */ + return tty_port_block_til_ready(port, tty, filp); + } +-- +2.35.1 + diff --git a/queue-5.10/tty-n_gsm-fix-wrong-queuing-behavior-in-gsm_dlci_dat.patch b/queue-5.10/tty-n_gsm-fix-wrong-queuing-behavior-in-gsm_dlci_dat.patch new file mode 100644 index 00000000000..786c5a72bf5 --- /dev/null +++ b/queue-5.10/tty-n_gsm-fix-wrong-queuing-behavior-in-gsm_dlci_dat.patch @@ -0,0 +1,127 @@ +From 84cfad5619dba29559b3dd0fabef4e69666f8e16 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Jul 2022 08:16:46 +0200 +Subject: tty: n_gsm: fix wrong queuing behavior in gsm_dlci_data_output() + +From: Daniel Starke + +[ Upstream commit 556fc8ac06513cced381588d6d58c184d95cc4fe ] + +1) The function drains the fifo for the given user tty/DLCI without +considering 'TX_THRESH_HI' and different to gsm_dlci_data_output_framed(), +which moves only one packet from the user side to the internal transmission +queue. We can only handle one packet at a time here if we want to allow +DLCI priority handling in gsm_dlci_data_sweep() to avoid link starvation. +2) Furthermore, the additional header octet from convergence layer type 2 +is not counted against MTU. It is part of the UI/UIH frame message which +needs to be limited to MTU. Hence, it is wrong not to consider this octet. +3) Finally, the waiting user tty is not informed about freed space in its +send queue. + +Take at most one packet worth of data out of the DLCI fifo to fix 1). +Limit the max user data size per packet to MTU - 1 in case of convergence +layer type 2 to leave space for the control signal octet which is added in +the later part of the function. This fixes 2). +Add tty_port_tty_wakeup() to wake up the user tty if new write space has +been made available to fix 3). + +Fixes: 268e526b935e ("tty/n_gsm: avoid fifo overflow in gsm_dlci_data_output") +Signed-off-by: Daniel Starke +Link: https://lore.kernel.org/r/20220701061652.39604-3-daniel.starke@siemens.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/n_gsm.c | 74 +++++++++++++++++++++++++-------------------- + 1 file changed, 42 insertions(+), 32 deletions(-) + +diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c +index c95f7d8314fc..cb8de8d61265 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -795,41 +795,51 @@ static int gsm_dlci_data_output(struct gsm_mux *gsm, struct gsm_dlci *dlci) + { + struct gsm_msg *msg; + u8 *dp; +- int len, total_size, size; +- int h = dlci->adaption - 1; ++ int h, len, size; + +- total_size = 0; +- while (1) { +- len = kfifo_len(&dlci->fifo); +- if (len == 0) +- return total_size; +- +- /* MTU/MRU count only the data bits */ +- if (len > gsm->mtu) +- len = gsm->mtu; +- +- size = len + h; +- +- msg = gsm_data_alloc(gsm, dlci->addr, size, gsm->ftype); +- /* FIXME: need a timer or something to kick this so it can't +- get stuck with no work outstanding and no buffer free */ +- if (msg == NULL) +- return -ENOMEM; +- dp = msg->data; +- switch (dlci->adaption) { +- case 1: /* Unstructured */ +- break; +- case 2: /* Unstructed with modem bits. +- Always one byte as we never send inline break data */ +- *dp++ = (gsm_encode_modem(dlci) << 1) | EA; +- break; +- } +- WARN_ON(kfifo_out_locked(&dlci->fifo, dp , len, &dlci->lock) != len); +- __gsm_data_queue(dlci, msg); +- total_size += size; ++ /* for modem bits without break data */ ++ h = ((dlci->adaption == 1) ? 0 : 1); ++ ++ len = kfifo_len(&dlci->fifo); ++ if (len == 0) ++ return 0; ++ ++ /* MTU/MRU count only the data bits but watch adaption mode */ ++ if ((len + h) > gsm->mtu) ++ len = gsm->mtu - h; ++ ++ size = len + h; ++ ++ msg = gsm_data_alloc(gsm, dlci->addr, size, gsm->ftype); ++ /* FIXME: need a timer or something to kick this so it can't ++ * get stuck with no work outstanding and no buffer free ++ */ ++ if (!msg) ++ return -ENOMEM; ++ dp = msg->data; ++ switch (dlci->adaption) { ++ case 1: /* Unstructured */ ++ break; ++ case 2: /* Unstructured with modem bits. ++ * Always one byte as we never send inline break data ++ */ ++ *dp++ = (gsm_encode_modem(dlci) << 1) | EA; ++ break; ++ default: ++ pr_err("%s: unsupported adaption %d\n", __func__, ++ dlci->adaption); ++ break; + } ++ ++ WARN_ON(len != kfifo_out_locked(&dlci->fifo, dp, len, ++ &dlci->lock)); ++ ++ /* Notify upper layer about available send space. */ ++ tty_port_tty_wakeup(&dlci->port); ++ ++ __gsm_data_queue(dlci, msg); + /* Bytes of data we used up */ +- return total_size; ++ return size; + } + + /** +-- +2.35.1 + diff --git a/queue-5.10/tty-n_gsm-fix-wrong-t1-retry-count-handling.patch b/queue-5.10/tty-n_gsm-fix-wrong-t1-retry-count-handling.patch new file mode 100644 index 00000000000..61455fe41e9 --- /dev/null +++ b/queue-5.10/tty-n_gsm-fix-wrong-t1-retry-count-handling.patch @@ -0,0 +1,55 @@ +From 78eaeebcdce875ed056a61ae7578fa3577d96ab2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jul 2022 13:32:20 +0200 +Subject: tty: n_gsm: fix wrong T1 retry count handling + +From: Daniel Starke + +[ Upstream commit f30e10caa80aa1f35508bc17fc302dbbde9a833c ] + +n_gsm is based on the 3GPP 07.010 and its newer version is the 3GPP 27.010. +See https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=1516 +The changes from 07.010 to 27.010 are non-functional. Therefore, I refer to +the newer 27.010 here. Chapter 5.7.3 states that the valid range for the +maximum number of retransmissions (N2) is from 0 to 255 (both including). +gsm_dlci_t1() handles this number incorrectly by performing N2 - 1 +retransmission attempts. Setting N2 to zero results in more than 255 +retransmission attempts. +Fix gsm_dlci_t1() to comply with 3GPP 27.010. + +Fixes: e1eaea46bb40 ("tty: n_gsm line discipline") +Signed-off-by: Daniel Starke +Link: https://lore.kernel.org/r/20220707113223.3685-1-daniel.starke@siemens.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/n_gsm.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c +index 969c0de788f8..3f100f7abdb7 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -1550,8 +1550,8 @@ static void gsm_dlci_t1(struct timer_list *t) + + switch (dlci->state) { + case DLCI_OPENING: +- dlci->retries--; + if (dlci->retries) { ++ dlci->retries--; + gsm_command(dlci->gsm, dlci->addr, SABM|PF); + mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100); + } else if (!dlci->addr && gsm->control == (DM | PF)) { +@@ -1566,8 +1566,8 @@ static void gsm_dlci_t1(struct timer_list *t) + + break; + case DLCI_CLOSING: +- dlci->retries--; + if (dlci->retries) { ++ dlci->retries--; + gsm_command(dlci->gsm, dlci->addr, DISC|PF); + mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100); + } else +-- +2.35.1 + diff --git a/queue-5.10/um-random-don-t-initialise-hwrng-struct-with-zero.patch b/queue-5.10/um-random-don-t-initialise-hwrng-struct-with-zero.patch new file mode 100644 index 00000000000..134d42316cd --- /dev/null +++ b/queue-5.10/um-random-don-t-initialise-hwrng-struct-with-zero.patch @@ -0,0 +1,46 @@ +From 76ea31da01257b073674b9973f6bb68e2423ae4e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 23 Jun 2022 09:58:42 +0100 +Subject: um: random: Don't initialise hwrng struct with zero + +From: Christopher Obbard + +[ Upstream commit 9e70cbd11b03889c92462cf52edb2bd023c798fa ] + +Initialising the hwrng struct with zeros causes a +compile-time sparse warning: + + $ ARCH=um make -j10 W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' + ... + CHECK arch/um/drivers/random.c + arch/um/drivers/random.c:31:31: sparse: warning: Using plain integer as NULL pointer + +Fix the warning by not initialising the hwrng struct +with zeros as it is initialised anyway during module +init. + +Fixes: 72d3e093afae ("um: random: Register random as hwrng-core device") +Reported-by: kernel test robot +Signed-off-by: Christopher Obbard +Signed-off-by: Richard Weinberger +Signed-off-by: Sasha Levin +--- + arch/um/drivers/random.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/um/drivers/random.c b/arch/um/drivers/random.c +index e4b9b2ce9abf..4b712395763e 100644 +--- a/arch/um/drivers/random.c ++++ b/arch/um/drivers/random.c +@@ -28,7 +28,7 @@ + * protects against a module being loaded twice at the same time. + */ + static int random_fd = -1; +-static struct hwrng hwrng = { 0, }; ++static struct hwrng hwrng; + static DECLARE_COMPLETION(have_data); + + static int rng_dev_read(struct hwrng *rng, void *buf, size_t max, bool block) +-- +2.35.1 + diff --git a/queue-5.10/usb-aspeed-vhub-fix-refcount-leak-bug-in-ast_vhub_in.patch b/queue-5.10/usb-aspeed-vhub-fix-refcount-leak-bug-in-ast_vhub_in.patch new file mode 100644 index 00000000000..d6328341f5a --- /dev/null +++ b/queue-5.10/usb-aspeed-vhub-fix-refcount-leak-bug-in-ast_vhub_in.patch @@ -0,0 +1,40 @@ +From 78727a41c5a7c78e12577db2b96aed9ec6212382 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jul 2022 20:05:28 +0800 +Subject: usb: aspeed-vhub: Fix refcount leak bug in ast_vhub_init_desc() + +From: Liang He + +[ Upstream commit 220fafb4ed04187e9c17be4152da5a7f2ffbdd8c ] + +We should call of_node_put() for the reference returned by +of_get_child_by_name() which has increased the refcount. + +Fixes: 30d2617fd7ed ("usb: gadget: aspeed: allow to set usb strings in device tree") +Signed-off-by: Liang He +Link: https://lore.kernel.org/r/20220713120528.368168-1-windhl@126.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/gadget/udc/aspeed-vhub/hub.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/usb/gadget/udc/aspeed-vhub/hub.c b/drivers/usb/gadget/udc/aspeed-vhub/hub.c +index bfd8e77788e2..3a4ccc722db5 100644 +--- a/drivers/usb/gadget/udc/aspeed-vhub/hub.c ++++ b/drivers/usb/gadget/udc/aspeed-vhub/hub.c +@@ -1033,8 +1033,10 @@ static int ast_vhub_init_desc(struct ast_vhub *vhub) + /* Initialize vhub String Descriptors. */ + INIT_LIST_HEAD(&vhub->vhub_str_desc); + desc_np = of_get_child_by_name(vhub_np, "vhub-strings"); +- if (desc_np) ++ if (desc_np) { + ret = ast_vhub_of_parse_str_desc(vhub, desc_np); ++ of_node_put(desc_np); ++ } + else + ret = ast_vhub_str_alloc_add(vhub, &ast_vhub_strings); + +-- +2.35.1 + diff --git a/queue-5.10/usb-cdns3-change-place-of-priv_ep-assignment-in-cdns.patch b/queue-5.10/usb-cdns3-change-place-of-priv_ep-assignment-in-cdns.patch new file mode 100644 index 00000000000..57b78ae9ea6 --- /dev/null +++ b/queue-5.10/usb-cdns3-change-place-of-priv_ep-assignment-in-cdns.patch @@ -0,0 +1,68 @@ +From 77055a84f0871f5de7ba2783632c35cd428950bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jul 2022 19:00:52 +0300 +Subject: usb: cdns3: change place of 'priv_ep' assignment in + cdns3_gadget_ep_dequeue(), cdns3_gadget_ep_enable() + +From: Andrey Strachuk + +[ Upstream commit c3ffc9c4ca44bfe9562166793d133e1fb0630ea6 ] + +If 'ep' is NULL, result of ep_to_cdns3_ep(ep) is invalid pointer +and its dereference with priv_ep->cdns3_dev may cause panic. + +Found by Linux Verification Center (linuxtesting.org) with SVACE. + +Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver") +Acked-by: Peter Chen +Signed-off-by: Andrey Strachuk +Link: https://lore.kernel.org/r/20220718160052.4188-1-strochuk@ispras.ru +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/cdns3/gadget.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c +index d5056cc34974..c1b39a7acabc 100644 +--- a/drivers/usb/cdns3/gadget.c ++++ b/drivers/usb/cdns3/gadget.c +@@ -2294,14 +2294,15 @@ static int cdns3_gadget_ep_enable(struct usb_ep *ep, + int val; + + priv_ep = ep_to_cdns3_ep(ep); +- priv_dev = priv_ep->cdns3_dev; +- comp_desc = priv_ep->endpoint.comp_desc; + + if (!ep || !desc || desc->bDescriptorType != USB_DT_ENDPOINT) { + dev_dbg(priv_dev->dev, "usbss: invalid parameters\n"); + return -EINVAL; + } + ++ comp_desc = priv_ep->endpoint.comp_desc; ++ priv_dev = priv_ep->cdns3_dev; ++ + if (!desc->wMaxPacketSize) { + dev_err(priv_dev->dev, "usbss: missing wMaxPacketSize\n"); + return -EINVAL; +@@ -2609,7 +2610,7 @@ int cdns3_gadget_ep_dequeue(struct usb_ep *ep, + struct usb_request *request) + { + struct cdns3_endpoint *priv_ep = ep_to_cdns3_ep(ep); +- struct cdns3_device *priv_dev = priv_ep->cdns3_dev; ++ struct cdns3_device *priv_dev; + struct usb_request *req, *req_temp; + struct cdns3_request *priv_req; + struct cdns3_trb *link_trb; +@@ -2620,6 +2621,8 @@ int cdns3_gadget_ep_dequeue(struct usb_ep *ep, + if (!ep || !request || !ep->desc) + return -EINVAL; + ++ priv_dev = priv_ep->cdns3_dev; ++ + spin_lock_irqsave(&priv_dev->lock, flags); + + priv_req = to_cdns3_request(request); +-- +2.35.1 + diff --git a/queue-5.10/usb-cdns3-don-t-use-priv_dev-uninitialized-in-cdns3_.patch b/queue-5.10/usb-cdns3-don-t-use-priv_dev-uninitialized-in-cdns3_.patch new file mode 100644 index 00000000000..75c434b8d9a --- /dev/null +++ b/queue-5.10/usb-cdns3-don-t-use-priv_dev-uninitialized-in-cdns3_.patch @@ -0,0 +1,82 @@ +From a9ba2f7c3d2c7ea5746ed47419f8a3c57bd35e49 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Aug 2022 09:24:22 -0700 +Subject: usb: cdns3: Don't use priv_dev uninitialized in + cdns3_gadget_ep_enable() + +From: Nathan Chancellor + +[ Upstream commit 78acd4ca433425e6dd4032cfc2156c60e34931f2 ] + +Clang warns: + + drivers/usb/cdns3/cdns3-gadget.c:2290:11: error: variable 'priv_dev' is uninitialized when used here [-Werror,-Wuninitialized] + dev_dbg(priv_dev->dev, "usbss: invalid parameters\n"); + ^~~~~~~~ + include/linux/dev_printk.h:155:18: note: expanded from macro 'dev_dbg' + dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__) + ^~~ + include/linux/dynamic_debug.h:167:7: note: expanded from macro 'dynamic_dev_dbg' + dev, fmt, ##__VA_ARGS__) + ^~~ + include/linux/dynamic_debug.h:152:56: note: expanded from macro '_dynamic_func_call' + __dynamic_func_call(__UNIQUE_ID(ddebug), fmt, func, ##__VA_ARGS__) + ^~~~~~~~~~~ + include/linux/dynamic_debug.h:134:15: note: expanded from macro '__dynamic_func_call' + func(&id, ##__VA_ARGS__); \ + ^~~~~~~~~~~ + drivers/usb/cdns3/cdns3-gadget.c:2278:31: note: initialize the variable 'priv_dev' to silence this warning + struct cdns3_device *priv_dev; + ^ + = NULL + 1 error generated. + +The priv_dev assignment was moved below the if statement to avoid +potentially dereferencing ep before it was checked but priv_dev is used +in the dev_dbg() call. + +To fix this, move the priv_dev and comp_desc assignments back to their +original spot and hoist the ep check above those assignments with a call +to pr_debug() instead of dev_dbg(). + +Fixes: c3ffc9c4ca44 ("usb: cdns3: change place of 'priv_ep' assignment in cdns3_gadget_ep_dequeue(), cdns3_gadget_ep_enable()") +Link: https://github.com/ClangBuiltLinux/linux/issues/1680 +Signed-off-by: Nathan Chancellor +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + drivers/usb/cdns3/gadget.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c +index c1b39a7acabc..f120da442d43 100644 +--- a/drivers/usb/cdns3/gadget.c ++++ b/drivers/usb/cdns3/gadget.c +@@ -2293,16 +2293,20 @@ static int cdns3_gadget_ep_enable(struct usb_ep *ep, + int ret = 0; + int val; + ++ if (!ep) { ++ pr_debug("usbss: ep not configured?\n"); ++ return -EINVAL; ++ } ++ + priv_ep = ep_to_cdns3_ep(ep); ++ priv_dev = priv_ep->cdns3_dev; ++ comp_desc = priv_ep->endpoint.comp_desc; + +- if (!ep || !desc || desc->bDescriptorType != USB_DT_ENDPOINT) { ++ if (!desc || desc->bDescriptorType != USB_DT_ENDPOINT) { + dev_dbg(priv_dev->dev, "usbss: invalid parameters\n"); + return -EINVAL; + } + +- comp_desc = priv_ep->endpoint.comp_desc; +- priv_dev = priv_ep->cdns3_dev; +- + if (!desc->wMaxPacketSize) { + dev_err(priv_dev->dev, "usbss: missing wMaxPacketSize\n"); + return -EINVAL; +-- +2.35.1 + diff --git a/queue-5.10/usb-dwc3-core-deprecate-gctl.coresoftreset.patch b/queue-5.10/usb-dwc3-core-deprecate-gctl.coresoftreset.patch new file mode 100644 index 00000000000..6ee2b618287 --- /dev/null +++ b/queue-5.10/usb-dwc3-core-deprecate-gctl.coresoftreset.patch @@ -0,0 +1,39 @@ +From 5ef0afcd1c992dca49da7a883dd5e5f800a89fb2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 Jun 2022 17:24:32 -0700 +Subject: usb: dwc3: core: Deprecate GCTL.CORESOFTRESET + +From: Thinh Nguyen + +[ Upstream commit afbd04e66e5d16ca3c7ea2e3c56eca25558eacf3 ] + +Synopsys IP DWC_usb32 and DWC_usb31 version 1.90a and above deprecated +GCTL.CORESOFTRESET. The DRD mode switching flow is updated to remove the +GCTL soft reset. Add version checks to prevent using deprecated setting +in mode switching flow. + +Signed-off-by: Thinh Nguyen +Link: https://lore.kernel.org/r/9df529fde6e55f5508321b6bc26e92848044ef2b.1655338967.git.Thinh.Nguyen@synopsys.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/dwc3/core.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c +index d97da7cef867..8b1c83c13905 100644 +--- a/drivers/usb/dwc3/core.c ++++ b/drivers/usb/dwc3/core.c +@@ -159,7 +159,8 @@ static void __dwc3_set_mode(struct work_struct *work) + } + + /* For DRD host or device mode only */ +- if (dwc->desired_dr_role != DWC3_GCTL_PRTCAP_OTG) { ++ if ((DWC3_IP_IS(DWC3) || DWC3_VER_IS_PRIOR(DWC31, 190A)) && ++ dwc->desired_dr_role != DWC3_GCTL_PRTCAP_OTG) { + reg = dwc3_readl(dwc->regs, DWC3_GCTL); + reg |= DWC3_GCTL_CORESOFTRESET; + dwc3_writel(dwc->regs, DWC3_GCTL, reg); +-- +2.35.1 + diff --git a/queue-5.10/usb-dwc3-core-do-not-perform-gctl_core_softreset-dur.patch b/queue-5.10/usb-dwc3-core-do-not-perform-gctl_core_softreset-dur.patch new file mode 100644 index 00000000000..aae01af95db --- /dev/null +++ b/queue-5.10/usb-dwc3-core-do-not-perform-gctl_core_softreset-dur.patch @@ -0,0 +1,56 @@ +From beedf65cd67853ad94d2febe9603515fbfd63b52 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jul 2022 10:26:25 +0530 +Subject: usb: dwc3: core: Do not perform GCTL_CORE_SOFTRESET during bootup + +From: Rohith Kollalsi + +[ Upstream commit 07903626d98853e605fe63e5ce149f1b7314bbea ] + +According to the programming guide, it is recommended to +perform a GCTL_CORE_SOFTRESET only when switching the mode +from device to host or host to device. However, it is found +that during bootup when __dwc3_set_mode() is called for the +first time, GCTL_CORESOFTRESET is done with suspendable bit(BIT 17) +of DWC3_GUSB3PIPECTL set. This some times leads to issues +like controller going into bad state and controller registers +reading value zero. Until GCTL_CORESOFTRESET is done and +run/stop bit is set core initialization is not complete. +Setting suspendable bit of DWC3_GUSB3PIPECTL and then +performing GCTL_CORESOFTRESET is therefore not recommended. +Avoid this by only performing the reset if current_dr_role is set, +that is, when doing subsequent role switching. + +Fixes: f88359e1588b ("usb: dwc3: core: Do core softreset when switch mode") +Signed-off-by: Rohith Kollalsi +Link: https://lore.kernel.org/r/20220714045625.20377-1-quic_rkollals@quicinc.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/dwc3/core.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c +index 8b1c83c13905..572cf34459aa 100644 +--- a/drivers/usb/dwc3/core.c ++++ b/drivers/usb/dwc3/core.c +@@ -158,9 +158,13 @@ static void __dwc3_set_mode(struct work_struct *work) + break; + } + +- /* For DRD host or device mode only */ +- if ((DWC3_IP_IS(DWC3) || DWC3_VER_IS_PRIOR(DWC31, 190A)) && +- dwc->desired_dr_role != DWC3_GCTL_PRTCAP_OTG) { ++ /* ++ * When current_dr_role is not set, there's no role switching. ++ * Only perform GCTL.CoreSoftReset when there's DRD role switching. ++ */ ++ if (dwc->current_dr_role && ((DWC3_IP_IS(DWC3) || ++ DWC3_VER_IS_PRIOR(DWC31, 190A)) && ++ dwc->desired_dr_role != DWC3_GCTL_PRTCAP_OTG)) { + reg = dwc3_readl(dwc->regs, DWC3_GCTL); + reg |= DWC3_GCTL_CORESOFTRESET; + dwc3_writel(dwc->regs, DWC3_GCTL, reg); +-- +2.35.1 + diff --git a/queue-5.10/usb-dwc3-qcom-fix-missing-optional-irq-warnings.patch b/queue-5.10/usb-dwc3-qcom-fix-missing-optional-irq-warnings.patch new file mode 100644 index 00000000000..93e345fd3a4 --- /dev/null +++ b/queue-5.10/usb-dwc3-qcom-fix-missing-optional-irq-warnings.patch @@ -0,0 +1,44 @@ +From 9eb0d54016751b8b37e46e6ff17b1ccdac7f0fe5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jul 2022 15:13:36 +0200 +Subject: usb: dwc3: qcom: fix missing optional irq warnings + +From: Johan Hovold + +[ Upstream commit 69bb3520db7cecbccc9e497fc568fa5465c9d43f ] + +Not all platforms have all of the four currently supported wakeup +interrupts so use the optional irq helpers when looking up interrupts to +avoid printing error messages when an optional interrupt is not found: + + dwc3-qcom a6f8800.usb: error -ENXIO: IRQ hs_phy_irq not found + +Fixes: a4333c3a6ba9 ("usb: dwc3: Add Qualcomm DWC3 glue driver") +Reviewed-by: Andrew Halaney +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20220713131340.29401-4-johan+linaro@kernel.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/dwc3/dwc3-qcom.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c +index 504f8af4d0f8..915fa4197d77 100644 +--- a/drivers/usb/dwc3/dwc3-qcom.c ++++ b/drivers/usb/dwc3/dwc3-qcom.c +@@ -443,9 +443,9 @@ static int dwc3_qcom_get_irq(struct platform_device *pdev, + int ret; + + if (np) +- ret = platform_get_irq_byname(pdev_irq, name); ++ ret = platform_get_irq_byname_optional(pdev_irq, name); + else +- ret = platform_get_irq(pdev_irq, num); ++ ret = platform_get_irq_optional(pdev_irq, num); + + return ret; + } +-- +2.35.1 + diff --git a/queue-5.10/usb-gadget-tegra-xudc-fix-error-check-in-tegra_xudc_.patch b/queue-5.10/usb-gadget-tegra-xudc-fix-error-check-in-tegra_xudc_.patch new file mode 100644 index 00000000000..bcb589fdea9 --- /dev/null +++ b/queue-5.10/usb-gadget-tegra-xudc-fix-error-check-in-tegra_xudc_.patch @@ -0,0 +1,49 @@ +From 3be451c26dab925cdee48b96a8a19469270f665c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 25 May 2022 21:53:32 +0800 +Subject: usb: gadget: tegra-xudc: Fix error check in + tegra_xudc_powerdomain_init() + +From: Tang Bin + +[ Upstream commit f08aa7c80dac27ee00fa6827f447597d2fba5465 ] + +dev_pm_domain_attach_by_name() may return NULL in some cases, +so IS_ERR() doesn't meet the requirements. Thus fix it. + +Fixes: 49db427232fe ("usb: gadget: Add UDC driver for tegra XUSB device mode controller") +Signed-off-by: Tang Bin +Link: https://lore.kernel.org/r/20220525135332.23144-1-tangbin@cmss.chinamobile.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/gadget/udc/tegra-xudc.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/usb/gadget/udc/tegra-xudc.c b/drivers/usb/gadget/udc/tegra-xudc.c +index de178bf264c2..3ebc8c5416e3 100644 +--- a/drivers/usb/gadget/udc/tegra-xudc.c ++++ b/drivers/usb/gadget/udc/tegra-xudc.c +@@ -3693,15 +3693,15 @@ static int tegra_xudc_powerdomain_init(struct tegra_xudc *xudc) + int err; + + xudc->genpd_dev_device = dev_pm_domain_attach_by_name(dev, "dev"); +- if (IS_ERR(xudc->genpd_dev_device)) { +- err = PTR_ERR(xudc->genpd_dev_device); ++ if (IS_ERR_OR_NULL(xudc->genpd_dev_device)) { ++ err = PTR_ERR(xudc->genpd_dev_device) ? : -ENODATA; + dev_err(dev, "failed to get device power domain: %d\n", err); + return err; + } + + xudc->genpd_dev_ss = dev_pm_domain_attach_by_name(dev, "ss"); +- if (IS_ERR(xudc->genpd_dev_ss)) { +- err = PTR_ERR(xudc->genpd_dev_ss); ++ if (IS_ERR_OR_NULL(xudc->genpd_dev_ss)) { ++ err = PTR_ERR(xudc->genpd_dev_ss) ? : -ENODATA; + dev_err(dev, "failed to get SuperSpeed power domain: %d\n", err); + return err; + } +-- +2.35.1 + diff --git a/queue-5.10/usb-gadget-udc-amd5536-depends-on-has_dma.patch b/queue-5.10/usb-gadget-udc-amd5536-depends-on-has_dma.patch new file mode 100644 index 00000000000..937129a4304 --- /dev/null +++ b/queue-5.10/usb-gadget-udc-amd5536-depends-on-has_dma.patch @@ -0,0 +1,49 @@ +From 7c50fb7333c9070f8b8014d665baa282debfc21b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 Jul 2022 18:36:01 -0700 +Subject: usb: gadget: udc: amd5536 depends on HAS_DMA + +From: Randy Dunlap + +[ Upstream commit 8097cf2fb3b2205257f1c76f4808e3398d66b6d9 ] + +USB_AMD5536UDC should depend on HAS_DMA since it selects USB_SNP_CORE, +which depends on HAS_DMA and since 'select' does not follow any +dependency chains. + +Fixes this kconfig warning: + +WARNING: unmet direct dependencies detected for USB_SNP_CORE + Depends on [n]: USB_SUPPORT [=y] && USB_GADGET [=y] && (USB_AMD5536UDC [=y] || USB_SNP_UDC_PLAT [=n]) && HAS_DMA [=n] + Selected by [y]: + - USB_AMD5536UDC [=y] && USB_SUPPORT [=y] && USB_GADGET [=y] && USB_PCI [=y] + +Fixes: 97b3ffa233b9 ("usb: gadget: udc: amd5536: split core and PCI layer") +Cc: Raviteja Garimella +Cc: Felipe Balbi +Cc: linux-usb@vger.kernel.org +Cc: Greg Kroah-Hartman +Signed-off-by: Randy Dunlap +Link: https://lore.kernel.org/r/20220709013601.7536-1-rdunlap@infradead.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/gadget/udc/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig +index 933e80d5053a..f28e1bbd5724 100644 +--- a/drivers/usb/gadget/udc/Kconfig ++++ b/drivers/usb/gadget/udc/Kconfig +@@ -311,7 +311,7 @@ source "drivers/usb/gadget/udc/bdc/Kconfig" + + config USB_AMD5536UDC + tristate "AMD5536 UDC" +- depends on USB_PCI ++ depends on USB_PCI && HAS_DMA + select USB_SNP_CORE + help + The AMD5536 UDC is part of the AMD Geode CS5536, an x86 southbridge. +-- +2.35.1 + diff --git a/queue-5.10/usb-host-fix-refcount-leak-in-ehci_hcd_ppc_of_probe.patch b/queue-5.10/usb-host-fix-refcount-leak-in-ehci_hcd_ppc_of_probe.patch new file mode 100644 index 00000000000..f4a0c08f10e --- /dev/null +++ b/queue-5.10/usb-host-fix-refcount-leak-in-ehci_hcd_ppc_of_probe.patch @@ -0,0 +1,38 @@ +From a7884d2366af0fa851cf670774f067ffa97abf5d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Jun 2022 15:08:49 +0400 +Subject: usb: host: Fix refcount leak in ehci_hcd_ppc_of_probe + +From: Miaoqian Lin + +[ Upstream commit b5c5b13cb45e2c88181308186b0001992cb41954 ] + +of_find_compatible_node() returns a node pointer with refcount +incremented, we should use of_node_put() on it when done. +Add missing of_node_put() to avoid refcount leak. + +Fixes: 796bcae7361c ("USB: powerpc: Workaround for the PPC440EPX USBH_23 errata [take 3]") +Acked-by: Alan Stern +Signed-off-by: Miaoqian Lin +Link: https://lore.kernel.org/r/20220602110849.58549-1-linmq006@gmail.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/host/ehci-ppc-of.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/usb/host/ehci-ppc-of.c b/drivers/usb/host/ehci-ppc-of.c +index 6bbaee74f7e7..28a19693c19f 100644 +--- a/drivers/usb/host/ehci-ppc-of.c ++++ b/drivers/usb/host/ehci-ppc-of.c +@@ -148,6 +148,7 @@ static int ehci_hcd_ppc_of_probe(struct platform_device *op) + } else { + ehci->has_amcc_usb23 = 1; + } ++ of_node_put(np); + } + + if (of_get_property(dn, "big-endian", NULL)) { +-- +2.35.1 + diff --git a/queue-5.10/usb-host-xhci-use-snprintf-in-xhci_decode_trb.patch b/queue-5.10/usb-host-xhci-use-snprintf-in-xhci_decode_trb.patch new file mode 100644 index 00000000000..edc1e5215fa --- /dev/null +++ b/queue-5.10/usb-host-xhci-use-snprintf-in-xhci_decode_trb.patch @@ -0,0 +1,42 @@ +From 9f17443bd457cd5dd4c3f93b21ba66ae1363d06b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 30 Jun 2022 15:46:45 +0300 +Subject: usb: host: xhci: use snprintf() in xhci_decode_trb() + +From: Sergey Shtylyov + +[ Upstream commit 1ce69c35b86038dd11d3a6115a04501c5b89a940 ] + +Commit cbf286e8ef83 ("xhci: fix unsafe memory usage in xhci tracing") +apparently missed one sprintf() call in xhci_decode_trb() -- replace +it with the snprintf() call as well... + +Found by Linux Verification Center (linuxtesting.org) with the SVACE static +analysis tool. + +Fixes: cbf286e8ef83 ("xhci: fix unsafe memory usage in xhci tracing") +Signed-off-by: Sergey Shtylyov +Signed-off-by: Mathias Nyman +Link: https://lore.kernel.org/r/20220630124645.1805902-2-mathias.nyman@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/host/xhci.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h +index 0c66424b34ba..f87e5fe57f22 100644 +--- a/drivers/usb/host/xhci.h ++++ b/drivers/usb/host/xhci.h +@@ -2383,7 +2383,7 @@ static inline const char *xhci_decode_trb(char *str, size_t size, + field3 & TRB_CYCLE ? 'C' : 'c'); + break; + case TRB_STOP_RING: +- sprintf(str, ++ snprintf(str, size, + "%s: slot %d sp %d ep %d flags %c", + xhci_trb_type_string(type), + TRB_TO_SLOT_ID(field3), +-- +2.35.1 + diff --git a/queue-5.10/usb-ohci-nxp-fix-refcount-leak-in-ohci_hcd_nxp_probe.patch b/queue-5.10/usb-ohci-nxp-fix-refcount-leak-in-ohci_hcd_nxp_probe.patch new file mode 100644 index 00000000000..11270922455 --- /dev/null +++ b/queue-5.10/usb-ohci-nxp-fix-refcount-leak-in-ohci_hcd_nxp_probe.patch @@ -0,0 +1,38 @@ +From efe3cd7c6e109d84d3357d03b932db9846968686 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 3 Jun 2022 18:12:30 +0400 +Subject: usb: ohci-nxp: Fix refcount leak in ohci_hcd_nxp_probe + +From: Miaoqian Lin + +[ Upstream commit 302970b4cad3ebfda2c05ce06c322ccdc447d17e ] + +of_parse_phandle() returns a node pointer with refcount +incremented, we should use of_node_put() on it when not need anymore. +Add missing of_node_put() to avoid refcount leak. + +Fixes: 73108aa90cbf ("USB: ohci-nxp: Use isp1301 driver") +Acked-by: Alan Stern +Signed-off-by: Miaoqian Lin +Link: https://lore.kernel.org/r/20220603141231.979-1-linmq006@gmail.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/host/ohci-nxp.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/usb/host/ohci-nxp.c b/drivers/usb/host/ohci-nxp.c +index 85878e8ad331..106a6bcefb08 100644 +--- a/drivers/usb/host/ohci-nxp.c ++++ b/drivers/usb/host/ohci-nxp.c +@@ -164,6 +164,7 @@ static int ohci_hcd_nxp_probe(struct platform_device *pdev) + } + + isp1301_i2c_client = isp1301_get_client(isp1301_node); ++ of_node_put(isp1301_node); + if (!isp1301_i2c_client) + return -EPROBE_DEFER; + +-- +2.35.1 + diff --git a/queue-5.10/usb-serial-fix-tty-port-initialized-comments.patch b/queue-5.10/usb-serial-fix-tty-port-initialized-comments.patch new file mode 100644 index 00000000000..d86a3cfe7cc --- /dev/null +++ b/queue-5.10/usb-serial-fix-tty-port-initialized-comments.patch @@ -0,0 +1,66 @@ +From 338221901194752ac577ae2c4fb53f4eb5737d4f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Jul 2022 10:44:57 +0200 +Subject: USB: serial: fix tty-port initialized comments + +From: Johan Hovold + +[ Upstream commit 688ee1d1785c1359f9040f615dd8e6054962bce2 ] + +Fix up the tty-port initialized comments which got truncated and +obfuscated when replacing the old ASYNCB_INITIALIZED flag. + +Fixes: d41861ca19c9 ("tty: Replace ASYNC_INITIALIZED bit and update atomically") +Reviewed-by: Greg Kroah-Hartman +Signed-off-by: Johan Hovold +Signed-off-by: Sasha Levin +--- + drivers/usb/serial/sierra.c | 3 ++- + drivers/usb/serial/usb-serial.c | 2 +- + drivers/usb/serial/usb_wwan.c | 3 ++- + 3 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c +index 57fc3c31712e..018a27d879b8 100644 +--- a/drivers/usb/serial/sierra.c ++++ b/drivers/usb/serial/sierra.c +@@ -737,7 +737,8 @@ static void sierra_close(struct usb_serial_port *port) + + /* + * Need to take susp_lock to make sure port is not already being +- * resumed, but no need to hold it due to initialized ++ * resumed, but no need to hold it due to the tty-port initialized ++ * flag. + */ + spin_lock_irq(&intfdata->susp_lock); + if (--intfdata->open_ports == 0) +diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c +index 27e3bb58c872..e8dd4603b201 100644 +--- a/drivers/usb/serial/usb-serial.c ++++ b/drivers/usb/serial/usb-serial.c +@@ -254,7 +254,7 @@ static int serial_open(struct tty_struct *tty, struct file *filp) + * + * Shut down a USB serial port. Serialized against activate by the + * tport mutex and kept to matching open/close pairs +- * of calls by the initialized flag. ++ * of calls by the tty-port initialized flag. + * + * Not called if tty is console. + */ +diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c +index b2285d5a869d..628a75d1232a 100644 +--- a/drivers/usb/serial/usb_wwan.c ++++ b/drivers/usb/serial/usb_wwan.c +@@ -435,7 +435,8 @@ void usb_wwan_close(struct usb_serial_port *port) + + /* + * Need to take susp_lock to make sure port is not already being +- * resumed, but no need to hold it due to initialized ++ * resumed, but no need to hold it due to the tty-port initialized ++ * flag. + */ + spin_lock_irq(&intfdata->susp_lock); + if (--intfdata->open_ports == 0) +-- +2.35.1 + diff --git a/queue-5.10/usb-xhci-tegra-fix-error-check.patch b/queue-5.10/usb-xhci-tegra-fix-error-check.patch new file mode 100644 index 00000000000..6164a9bb6fd --- /dev/null +++ b/queue-5.10/usb-xhci-tegra-fix-error-check.patch @@ -0,0 +1,49 @@ +From 9c5a2284b37c985e2e7b09f91f377d223dbf48d7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 May 2022 20:14:04 +0800 +Subject: usb: xhci: tegra: Fix error check + +From: Tang Bin + +[ Upstream commit 18fc7c435be3f17ea26a21b2e2312fcb9088e01f ] + +In the function tegra_xusb_powerdomain_init(), +dev_pm_domain_attach_by_name() may return NULL in some cases, +so IS_ERR() doesn't meet the requirements. Thus fix it. + +Fixes: 6494a9ad86de ("usb: xhci: tegra: Add genpd support") +Signed-off-by: Tang Bin +Link: https://lore.kernel.org/r/20220524121404.18376-1-tangbin@cmss.chinamobile.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/host/xhci-tegra.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c +index 50bb91b6a4b8..246a3d274142 100644 +--- a/drivers/usb/host/xhci-tegra.c ++++ b/drivers/usb/host/xhci-tegra.c +@@ -1042,15 +1042,15 @@ static int tegra_xusb_powerdomain_init(struct device *dev, + int err; + + tegra->genpd_dev_host = dev_pm_domain_attach_by_name(dev, "xusb_host"); +- if (IS_ERR(tegra->genpd_dev_host)) { +- err = PTR_ERR(tegra->genpd_dev_host); ++ if (IS_ERR_OR_NULL(tegra->genpd_dev_host)) { ++ err = PTR_ERR(tegra->genpd_dev_host) ? : -ENODATA; + dev_err(dev, "failed to get host pm-domain: %d\n", err); + return err; + } + + tegra->genpd_dev_ss = dev_pm_domain_attach_by_name(dev, "xusb_ss"); +- if (IS_ERR(tegra->genpd_dev_ss)) { +- err = PTR_ERR(tegra->genpd_dev_ss); ++ if (IS_ERR_OR_NULL(tegra->genpd_dev_ss)) { ++ err = PTR_ERR(tegra->genpd_dev_ss) ? : -ENODATA; + dev_err(dev, "failed to get superspeed pm-domain: %d\n", err); + return err; + } +-- +2.35.1 + diff --git a/queue-5.10/vfio-ccw-do-not-change-fsm-state-in-subchannel-event.patch b/queue-5.10/vfio-ccw-do-not-change-fsm-state-in-subchannel-event.patch new file mode 100644 index 00000000000..91914741372 --- /dev/null +++ b/queue-5.10/vfio-ccw-do-not-change-fsm-state-in-subchannel-event.patch @@ -0,0 +1,61 @@ +From 3a80e503443ebc9b055abf69931bb51f0307e627 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jul 2022 15:57:29 +0200 +Subject: vfio/ccw: Do not change FSM state in subchannel event + +From: Eric Farman + +[ Upstream commit cffcc109fd682075dee79bade3d60a07152a8fd1 ] + +The routine vfio_ccw_sch_event() is tasked with handling subchannel events, +specifically machine checks, on behalf of vfio-ccw. It correctly calls +cio_update_schib(), and if that fails (meaning the subchannel is gone) +it makes an FSM event call to mark the subchannel Not Operational. + +If that worked, however, then it decides that if the FSM state was already +Not Operational (implying the subchannel just came back), then it should +simply change the FSM to partially- or fully-open. + +Remove this trickery, since a subchannel returning will require more +probing than simply "oh all is well again" to ensure it works correctly. + +Fixes: bbe37e4cb8970 ("vfio: ccw: introduce a finite state machine") +Signed-off-by: Eric Farman +Reviewed-by: Matthew Rosato +Link: https://lore.kernel.org/r/20220707135737.720765-4-farman@linux.ibm.com +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + drivers/s390/cio/vfio_ccw_drv.c | 14 +++----------- + 1 file changed, 3 insertions(+), 11 deletions(-) + +diff --git a/drivers/s390/cio/vfio_ccw_drv.c b/drivers/s390/cio/vfio_ccw_drv.c +index 9b61e9b131ad..e3c1060b6056 100644 +--- a/drivers/s390/cio/vfio_ccw_drv.c ++++ b/drivers/s390/cio/vfio_ccw_drv.c +@@ -288,19 +288,11 @@ static int vfio_ccw_sch_event(struct subchannel *sch, int process) + if (work_pending(&sch->todo_work)) + goto out_unlock; + +- if (cio_update_schib(sch)) { +- vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_NOT_OPER); +- rc = 0; +- goto out_unlock; +- } +- +- private = dev_get_drvdata(&sch->dev); +- if (private->state == VFIO_CCW_STATE_NOT_OPER) { +- private->state = private->mdev ? VFIO_CCW_STATE_IDLE : +- VFIO_CCW_STATE_STANDBY; +- } + rc = 0; + ++ if (cio_update_schib(sch)) ++ vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_NOT_OPER); ++ + out_unlock: + spin_unlock_irqrestore(sch->lock, flags); + +-- +2.35.1 + diff --git a/queue-5.10/vfio-mdev-make-to_mdev_device-into-a-static-inline.patch b/queue-5.10/vfio-mdev-make-to_mdev_device-into-a-static-inline.patch new file mode 100644 index 00000000000..c123cacf75e --- /dev/null +++ b/queue-5.10/vfio-mdev-make-to_mdev_device-into-a-static-inline.patch @@ -0,0 +1,45 @@ +From d348061aea5ce60a7766ba57e074fb4ace7cb6ac Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 30 Mar 2021 09:53:07 -0600 +Subject: vfio/mdev: Make to_mdev_device() into a static inline + +From: Jason Gunthorpe + +[ Upstream commit 66873b5fa738ca02b5c075ca4a410b13d88e6e9a ] + +The macro wrongly uses 'dev' as both the macro argument and the member +name, which means it fails compilation if any caller uses a word other +than 'dev' as the single argument. Fix this defect by making it into +proper static inline, which is more clear and typesafe anyhow. + +Fixes: 99e3123e3d72 ("vfio-mdev: Make mdev_device private and abstract interfaces") +Reviewed-by: Christoph Hellwig +Reviewed-by: Kevin Tian +Reviewed-by: Cornelia Huck +Signed-off-by: Jason Gunthorpe +Message-Id: <11-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com> +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + drivers/vfio/mdev/mdev_private.h | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/vfio/mdev/mdev_private.h b/drivers/vfio/mdev/mdev_private.h +index 7d922950caaf..74c2e5411469 100644 +--- a/drivers/vfio/mdev/mdev_private.h ++++ b/drivers/vfio/mdev/mdev_private.h +@@ -35,7 +35,10 @@ struct mdev_device { + bool active; + }; + +-#define to_mdev_device(dev) container_of(dev, struct mdev_device, dev) ++static inline struct mdev_device *to_mdev_device(struct device *dev) ++{ ++ return container_of(dev, struct mdev_device, dev); ++} + #define dev_is_mdev(d) ((d)->bus == &mdev_bus_type) + + struct mdev_type { +-- +2.35.1 + diff --git a/queue-5.10/vfio-remove-extra-put-gets-around-vfio_device-group.patch b/queue-5.10/vfio-remove-extra-put-gets-around-vfio_device-group.patch new file mode 100644 index 00000000000..ea10d1905e4 --- /dev/null +++ b/queue-5.10/vfio-remove-extra-put-gets-around-vfio_device-group.patch @@ -0,0 +1,113 @@ +From 168770cf5afe3a10ced9eb0a184c94d7cd1174ff Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 30 Mar 2021 09:53:05 -0600 +Subject: vfio: Remove extra put/gets around vfio_device->group + +From: Jason Gunthorpe + +[ Upstream commit e572bfb2b6a83b05acd30c03010e661b1967960f ] + +The vfio_device->group value has a get obtained during +vfio_add_group_dev() which gets moved from the stack to vfio_device->group +in vfio_group_create_device(). + +The reference remains until we reach the end of vfio_del_group_dev() when +it is put back. + +Thus anything that already has a kref on the vfio_device is guaranteed a +valid group pointer. Remove all the extra reference traffic. + +It is tricky to see, but the get at the start of vfio_del_group_dev() is +actually pairing with the put hidden inside vfio_device_put() a few lines +below. + +A later patch merges vfio_group_create_device() into vfio_add_group_dev() +which makes the ownership and error flow on the create side easier to +follow. + +Reviewed-by: Christoph Hellwig +Reviewed-by: Kevin Tian +Reviewed-by: Max Gurtovoy +Reviewed-by: Cornelia Huck +Reviewed-by: Eric Auger +Signed-off-by: Jason Gunthorpe +Message-Id: <1-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com> +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + drivers/vfio/vfio.c | 21 ++------------------- + 1 file changed, 2 insertions(+), 19 deletions(-) + +diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c +index 2151bc7f87ab..e1b6e1b51d41 100644 +--- a/drivers/vfio/vfio.c ++++ b/drivers/vfio/vfio.c +@@ -546,14 +546,12 @@ struct vfio_device *vfio_group_create_device(struct vfio_group *group, + + kref_init(&device->kref); + device->dev = dev; ++ /* Our reference on group is moved to the device */ + device->group = group; + device->ops = ops; + device->device_data = device_data; + dev_set_drvdata(dev, device); + +- /* No need to get group_lock, caller has group reference */ +- vfio_group_get(group); +- + mutex_lock(&group->device_lock); + list_add(&device->group_next, &group->device_list); + group->dev_counter++; +@@ -585,13 +583,11 @@ void vfio_device_put(struct vfio_device *device) + { + struct vfio_group *group = device->group; + kref_put_mutex(&device->kref, vfio_device_release, &group->device_lock); +- vfio_group_put(group); + } + EXPORT_SYMBOL_GPL(vfio_device_put); + + static void vfio_device_get(struct vfio_device *device) + { +- vfio_group_get(device->group); + kref_get(&device->kref); + } + +@@ -841,14 +837,6 @@ int vfio_add_group_dev(struct device *dev, + vfio_group_put(group); + return PTR_ERR(device); + } +- +- /* +- * Drop all but the vfio_device reference. The vfio_device holds +- * a reference to the vfio_group, which holds a reference to the +- * iommu_group. +- */ +- vfio_group_put(group); +- + return 0; + } + EXPORT_SYMBOL_GPL(vfio_add_group_dev); +@@ -928,12 +916,6 @@ void *vfio_del_group_dev(struct device *dev) + unsigned int i = 0; + bool interrupted = false; + +- /* +- * The group exists so long as we have a device reference. Get +- * a group reference and use it to scan for the device going away. +- */ +- vfio_group_get(group); +- + /* + * When the device is removed from the group, the group suddenly + * becomes non-viable; the device has a driver (until the unbind +@@ -1008,6 +990,7 @@ void *vfio_del_group_dev(struct device *dev) + if (list_empty(&group->device_list)) + wait_event(group->container_q, !group->container); + ++ /* Matches the get in vfio_group_create_device() */ + vfio_group_put(group); + + return device_data; +-- +2.35.1 + diff --git a/queue-5.10/vfio-simplify-the-lifetime-logic-for-vfio_device.patch b/queue-5.10/vfio-simplify-the-lifetime-logic-for-vfio_device.patch new file mode 100644 index 00000000000..2e60f9ba78c --- /dev/null +++ b/queue-5.10/vfio-simplify-the-lifetime-logic-for-vfio_device.patch @@ -0,0 +1,224 @@ +From a923f6b8cc10d38e802a497157ce1df7af74a760 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 30 Mar 2021 09:53:05 -0600 +Subject: vfio: Simplify the lifetime logic for vfio_device + +From: Jason Gunthorpe + +[ Upstream commit 5e42c999445bd0ae86e35affeb3e7c473d74a893 ] + +The vfio_device is using a 'sleep until all refs go to zero' pattern for +its lifetime, but it is indirectly coded by repeatedly scanning the group +list waiting for the device to be removed on its own. + +Switch this around to be a direct representation, use a refcount to count +the number of places that are blocking destruction and sleep directly on a +completion until that counter goes to zero. kfree the device after other +accesses have been excluded in vfio_del_group_dev(). This is a fairly +common Linux idiom. + +Due to this we can now remove kref_put_mutex(), which is very rarely used +in the kernel. Here it is being used to prevent a zero ref device from +being seen in the group list. Instead allow the zero ref device to +continue to exist in the device_list and use refcount_inc_not_zero() to +exclude it once refs go to zero. + +This patch is organized so the next patch will be able to alter the API to +allow drivers to provide the kfree. + +Reviewed-by: Christoph Hellwig +Reviewed-by: Kevin Tian +Reviewed-by: Cornelia Huck +Reviewed-by: Eric Auger +Signed-off-by: Jason Gunthorpe +Message-Id: <2-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com> +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + drivers/vfio/vfio.c | 79 ++++++++++++++------------------------------- + 1 file changed, 25 insertions(+), 54 deletions(-) + +diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c +index e1b6e1b51d41..b5fa2ae3116d 100644 +--- a/drivers/vfio/vfio.c ++++ b/drivers/vfio/vfio.c +@@ -46,7 +46,6 @@ static struct vfio { + struct mutex group_lock; + struct cdev group_cdev; + dev_t group_devt; +- wait_queue_head_t release_q; + } vfio; + + struct vfio_iommu_driver { +@@ -91,7 +90,8 @@ struct vfio_group { + }; + + struct vfio_device { +- struct kref kref; ++ refcount_t refcount; ++ struct completion comp; + struct device *dev; + const struct vfio_device_ops *ops; + struct vfio_group *group; +@@ -544,7 +544,8 @@ struct vfio_device *vfio_group_create_device(struct vfio_group *group, + if (!device) + return ERR_PTR(-ENOMEM); + +- kref_init(&device->kref); ++ refcount_set(&device->refcount, 1); ++ init_completion(&device->comp); + device->dev = dev; + /* Our reference on group is moved to the device */ + device->group = group; +@@ -560,35 +561,17 @@ struct vfio_device *vfio_group_create_device(struct vfio_group *group, + return device; + } + +-static void vfio_device_release(struct kref *kref) +-{ +- struct vfio_device *device = container_of(kref, +- struct vfio_device, kref); +- struct vfio_group *group = device->group; +- +- list_del(&device->group_next); +- group->dev_counter--; +- mutex_unlock(&group->device_lock); +- +- dev_set_drvdata(device->dev, NULL); +- +- kfree(device); +- +- /* vfio_del_group_dev may be waiting for this device */ +- wake_up(&vfio.release_q); +-} +- + /* Device reference always implies a group reference */ + void vfio_device_put(struct vfio_device *device) + { +- struct vfio_group *group = device->group; +- kref_put_mutex(&device->kref, vfio_device_release, &group->device_lock); ++ if (refcount_dec_and_test(&device->refcount)) ++ complete(&device->comp); + } + EXPORT_SYMBOL_GPL(vfio_device_put); + +-static void vfio_device_get(struct vfio_device *device) ++static bool vfio_device_try_get(struct vfio_device *device) + { +- kref_get(&device->kref); ++ return refcount_inc_not_zero(&device->refcount); + } + + static struct vfio_device *vfio_group_get_device(struct vfio_group *group, +@@ -598,8 +581,7 @@ static struct vfio_device *vfio_group_get_device(struct vfio_group *group, + + mutex_lock(&group->device_lock); + list_for_each_entry(device, &group->device_list, group_next) { +- if (device->dev == dev) { +- vfio_device_get(device); ++ if (device->dev == dev && vfio_device_try_get(device)) { + mutex_unlock(&group->device_lock); + return device; + } +@@ -883,9 +865,8 @@ static struct vfio_device *vfio_device_get_from_name(struct vfio_group *group, + ret = !strcmp(dev_name(it->dev), buf); + } + +- if (ret) { ++ if (ret && vfio_device_try_get(it)) { + device = it; +- vfio_device_get(device); + break; + } + } +@@ -908,13 +889,13 @@ EXPORT_SYMBOL_GPL(vfio_device_data); + * removed. Open file descriptors for the device... */ + void *vfio_del_group_dev(struct device *dev) + { +- DEFINE_WAIT_FUNC(wait, woken_wake_function); + struct vfio_device *device = dev_get_drvdata(dev); + struct vfio_group *group = device->group; + void *device_data = device->device_data; + struct vfio_unbound_dev *unbound; + unsigned int i = 0; + bool interrupted = false; ++ long rc; + + /* + * When the device is removed from the group, the group suddenly +@@ -935,32 +916,18 @@ void *vfio_del_group_dev(struct device *dev) + WARN_ON(!unbound); + + vfio_device_put(device); +- +- /* +- * If the device is still present in the group after the above +- * 'put', then it is in use and we need to request it from the +- * bus driver. The driver may in turn need to request the +- * device from the user. We send the request on an arbitrary +- * interval with counter to allow the driver to take escalating +- * measures to release the device if it has the ability to do so. +- */ +- add_wait_queue(&vfio.release_q, &wait); +- +- do { +- device = vfio_group_get_device(group, dev); +- if (!device) +- break; +- ++ rc = try_wait_for_completion(&device->comp); ++ while (rc <= 0) { + if (device->ops->request) + device->ops->request(device_data, i++); + +- vfio_device_put(device); +- + if (interrupted) { +- wait_woken(&wait, TASK_UNINTERRUPTIBLE, HZ * 10); ++ rc = wait_for_completion_timeout(&device->comp, ++ HZ * 10); + } else { +- wait_woken(&wait, TASK_INTERRUPTIBLE, HZ * 10); +- if (signal_pending(current)) { ++ rc = wait_for_completion_interruptible_timeout( ++ &device->comp, HZ * 10); ++ if (rc < 0) { + interrupted = true; + dev_warn(dev, + "Device is currently in use, task" +@@ -969,10 +936,13 @@ void *vfio_del_group_dev(struct device *dev) + current->comm, task_pid_nr(current)); + } + } ++ } + +- } while (1); ++ mutex_lock(&group->device_lock); ++ list_del(&device->group_next); ++ group->dev_counter--; ++ mutex_unlock(&group->device_lock); + +- remove_wait_queue(&vfio.release_q, &wait); + /* + * In order to support multiple devices per group, devices can be + * plucked from the group while other devices in the group are still +@@ -992,6 +962,8 @@ void *vfio_del_group_dev(struct device *dev) + + /* Matches the get in vfio_group_create_device() */ + vfio_group_put(group); ++ dev_set_drvdata(dev, NULL); ++ kfree(device); + + return device_data; + } +@@ -2339,7 +2311,6 @@ static int __init vfio_init(void) + mutex_init(&vfio.iommu_drivers_lock); + INIT_LIST_HEAD(&vfio.group_list); + INIT_LIST_HEAD(&vfio.iommu_drivers_list); +- init_waitqueue_head(&vfio.release_q); + + ret = misc_register(&vfio_dev); + if (ret) { +-- +2.35.1 + diff --git a/queue-5.10/vfio-split-creation-of-a-vfio_device-into-init-and-r.patch b/queue-5.10/vfio-split-creation-of-a-vfio_device-into-init-and-r.patch new file mode 100644 index 00000000000..255d1b0cc11 --- /dev/null +++ b/queue-5.10/vfio-split-creation-of-a-vfio_device-into-init-and-r.patch @@ -0,0 +1,357 @@ +From 17b338d501964022c35975b4560d141bf86ba5e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 30 Mar 2021 09:53:05 -0600 +Subject: vfio: Split creation of a vfio_device into init and register ops + +From: Jason Gunthorpe + +[ Upstream commit 0bfc6a4ea63c2adac71a824397ef48f28dbc5e47 ] + +This makes the struct vfio_device part of the public interface so it +can be used with container_of and so forth, as is typical for a Linux +subystem. + +This is the first step to bring some type-safety to the vfio interface by +allowing the replacement of 'void *' and 'struct device *' inputs with a +simple and clear 'struct vfio_device *' + +For now the self-allocating vfio_add_group_dev() interface is kept so each +user can be updated as a separate patch. + +The expected usage pattern is + + driver core probe() function: + my_device = kzalloc(sizeof(*mydevice)); + vfio_init_group_dev(&my_device->vdev, dev, ops, mydevice); + /* other driver specific prep */ + vfio_register_group_dev(&my_device->vdev); + dev_set_drvdata(dev, my_device); + + driver core remove() function: + my_device = dev_get_drvdata(dev); + vfio_unregister_group_dev(&my_device->vdev); + /* other driver specific tear down */ + kfree(my_device); + +Allowing the driver to be able to use the drvdata and vfio_device to go +to/from its own data. + +The pattern also makes it clear that vfio_register_group_dev() must be +last in the sequence, as once it is called the core code can immediately +start calling ops. The init/register gap is provided to allow for the +driver to do setup before ops can be called and thus avoid races. + +Reviewed-by: Christoph Hellwig +Reviewed-by: Liu Yi L +Reviewed-by: Cornelia Huck +Reviewed-by: Max Gurtovoy +Reviewed-by: Kevin Tian +Reviewed-by: Eric Auger +Signed-off-by: Jason Gunthorpe +Message-Id: <3-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com> +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + Documentation/driver-api/vfio.rst | 31 ++++---- + drivers/vfio/vfio.c | 125 ++++++++++++++++-------------- + include/linux/vfio.h | 16 ++++ + 3 files changed, 99 insertions(+), 73 deletions(-) + +diff --git a/Documentation/driver-api/vfio.rst b/Documentation/driver-api/vfio.rst +index f1a4d3c3ba0b..d3a02300913a 100644 +--- a/Documentation/driver-api/vfio.rst ++++ b/Documentation/driver-api/vfio.rst +@@ -249,18 +249,23 @@ VFIO bus driver API + + VFIO bus drivers, such as vfio-pci make use of only a few interfaces + into VFIO core. When devices are bound and unbound to the driver, +-the driver should call vfio_add_group_dev() and vfio_del_group_dev() +-respectively:: +- +- extern int vfio_add_group_dev(struct device *dev, +- const struct vfio_device_ops *ops, +- void *device_data); +- +- extern void *vfio_del_group_dev(struct device *dev); +- +-vfio_add_group_dev() indicates to the core to begin tracking the +-iommu_group of the specified dev and register the dev as owned by +-a VFIO bus driver. The driver provides an ops structure for callbacks ++the driver should call vfio_register_group_dev() and ++vfio_unregister_group_dev() respectively:: ++ ++ void vfio_init_group_dev(struct vfio_device *device, ++ struct device *dev, ++ const struct vfio_device_ops *ops, ++ void *device_data); ++ int vfio_register_group_dev(struct vfio_device *device); ++ void vfio_unregister_group_dev(struct vfio_device *device); ++ ++The driver should embed the vfio_device in its own structure and call ++vfio_init_group_dev() to pre-configure it before going to registration. ++vfio_register_group_dev() indicates to the core to begin tracking the ++iommu_group of the specified dev and register the dev as owned by a VFIO bus ++driver. Once vfio_register_group_dev() returns it is possible for userspace to ++start accessing the driver, thus the driver should ensure it is completely ++ready before calling it. The driver provides an ops structure for callbacks + similar to a file operations structure:: + + struct vfio_device_ops { +@@ -276,7 +281,7 @@ similar to a file operations structure:: + }; + + Each function is passed the device_data that was originally registered +-in the vfio_add_group_dev() call above. This allows the bus driver ++in the vfio_register_group_dev() call above. This allows the bus driver + an easy place to store its opaque, private data. The open/release + callbacks are issued when a new file descriptor is created for a + device (via VFIO_GROUP_GET_DEVICE_FD). The ioctl interface provides +diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c +index b5fa2ae3116d..f886f2db8153 100644 +--- a/drivers/vfio/vfio.c ++++ b/drivers/vfio/vfio.c +@@ -89,16 +89,6 @@ struct vfio_group { + struct blocking_notifier_head notifier; + }; + +-struct vfio_device { +- refcount_t refcount; +- struct completion comp; +- struct device *dev; +- const struct vfio_device_ops *ops; +- struct vfio_group *group; +- struct list_head group_next; +- void *device_data; +-}; +- + #ifdef CONFIG_VFIO_NOIOMMU + static bool noiommu __read_mostly; + module_param_named(enable_unsafe_noiommu_mode, +@@ -532,35 +522,6 @@ static struct vfio_group *vfio_group_get_from_dev(struct device *dev) + /** + * Device objects - create, release, get, put, search + */ +-static +-struct vfio_device *vfio_group_create_device(struct vfio_group *group, +- struct device *dev, +- const struct vfio_device_ops *ops, +- void *device_data) +-{ +- struct vfio_device *device; +- +- device = kzalloc(sizeof(*device), GFP_KERNEL); +- if (!device) +- return ERR_PTR(-ENOMEM); +- +- refcount_set(&device->refcount, 1); +- init_completion(&device->comp); +- device->dev = dev; +- /* Our reference on group is moved to the device */ +- device->group = group; +- device->ops = ops; +- device->device_data = device_data; +- dev_set_drvdata(dev, device); +- +- mutex_lock(&group->device_lock); +- list_add(&device->group_next, &group->device_list); +- group->dev_counter++; +- mutex_unlock(&group->device_lock); +- +- return device; +-} +- + /* Device reference always implies a group reference */ + void vfio_device_put(struct vfio_device *device) + { +@@ -779,14 +740,23 @@ static int vfio_iommu_group_notifier(struct notifier_block *nb, + /** + * VFIO driver API + */ +-int vfio_add_group_dev(struct device *dev, +- const struct vfio_device_ops *ops, void *device_data) ++void vfio_init_group_dev(struct vfio_device *device, struct device *dev, ++ const struct vfio_device_ops *ops, void *device_data) ++{ ++ init_completion(&device->comp); ++ device->dev = dev; ++ device->ops = ops; ++ device->device_data = device_data; ++} ++EXPORT_SYMBOL_GPL(vfio_init_group_dev); ++ ++int vfio_register_group_dev(struct vfio_device *device) + { ++ struct vfio_device *existing_device; + struct iommu_group *iommu_group; + struct vfio_group *group; +- struct vfio_device *device; + +- iommu_group = iommu_group_get(dev); ++ iommu_group = iommu_group_get(device->dev); + if (!iommu_group) + return -EINVAL; + +@@ -805,21 +775,50 @@ int vfio_add_group_dev(struct device *dev, + iommu_group_put(iommu_group); + } + +- device = vfio_group_get_device(group, dev); +- if (device) { +- dev_WARN(dev, "Device already exists on group %d\n", ++ existing_device = vfio_group_get_device(group, device->dev); ++ if (existing_device) { ++ dev_WARN(device->dev, "Device already exists on group %d\n", + iommu_group_id(iommu_group)); +- vfio_device_put(device); ++ vfio_device_put(existing_device); + vfio_group_put(group); + return -EBUSY; + } + +- device = vfio_group_create_device(group, dev, ops, device_data); +- if (IS_ERR(device)) { +- vfio_group_put(group); +- return PTR_ERR(device); +- } ++ /* Our reference on group is moved to the device */ ++ device->group = group; ++ ++ /* Refcounting can't start until the driver calls register */ ++ refcount_set(&device->refcount, 1); ++ ++ mutex_lock(&group->device_lock); ++ list_add(&device->group_next, &group->device_list); ++ group->dev_counter++; ++ mutex_unlock(&group->device_lock); ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(vfio_register_group_dev); ++ ++int vfio_add_group_dev(struct device *dev, const struct vfio_device_ops *ops, ++ void *device_data) ++{ ++ struct vfio_device *device; ++ int ret; ++ ++ device = kzalloc(sizeof(*device), GFP_KERNEL); ++ if (!device) ++ return -ENOMEM; ++ ++ vfio_init_group_dev(device, dev, ops, device_data); ++ ret = vfio_register_group_dev(device); ++ if (ret) ++ goto err_kfree; ++ dev_set_drvdata(dev, device); + return 0; ++ ++err_kfree: ++ kfree(device); ++ return ret; + } + EXPORT_SYMBOL_GPL(vfio_add_group_dev); + +@@ -887,11 +886,9 @@ EXPORT_SYMBOL_GPL(vfio_device_data); + /* + * Decrement the device reference count and wait for the device to be + * removed. Open file descriptors for the device... */ +-void *vfio_del_group_dev(struct device *dev) ++void vfio_unregister_group_dev(struct vfio_device *device) + { +- struct vfio_device *device = dev_get_drvdata(dev); + struct vfio_group *group = device->group; +- void *device_data = device->device_data; + struct vfio_unbound_dev *unbound; + unsigned int i = 0; + bool interrupted = false; +@@ -908,7 +905,7 @@ void *vfio_del_group_dev(struct device *dev) + */ + unbound = kzalloc(sizeof(*unbound), GFP_KERNEL); + if (unbound) { +- unbound->dev = dev; ++ unbound->dev = device->dev; + mutex_lock(&group->unbound_lock); + list_add(&unbound->unbound_next, &group->unbound_list); + mutex_unlock(&group->unbound_lock); +@@ -919,7 +916,7 @@ void *vfio_del_group_dev(struct device *dev) + rc = try_wait_for_completion(&device->comp); + while (rc <= 0) { + if (device->ops->request) +- device->ops->request(device_data, i++); ++ device->ops->request(device->device_data, i++); + + if (interrupted) { + rc = wait_for_completion_timeout(&device->comp, +@@ -929,7 +926,7 @@ void *vfio_del_group_dev(struct device *dev) + &device->comp, HZ * 10); + if (rc < 0) { + interrupted = true; +- dev_warn(dev, ++ dev_warn(device->dev, + "Device is currently in use, task" + " \"%s\" (%d) " + "blocked until device is released", +@@ -960,11 +957,19 @@ void *vfio_del_group_dev(struct device *dev) + if (list_empty(&group->device_list)) + wait_event(group->container_q, !group->container); + +- /* Matches the get in vfio_group_create_device() */ ++ /* Matches the get in vfio_register_group_dev() */ + vfio_group_put(group); ++} ++EXPORT_SYMBOL_GPL(vfio_unregister_group_dev); ++ ++void *vfio_del_group_dev(struct device *dev) ++{ ++ struct vfio_device *device = dev_get_drvdata(dev); ++ void *device_data = device->device_data; ++ ++ vfio_unregister_group_dev(device); + dev_set_drvdata(dev, NULL); + kfree(device); +- + return device_data; + } + EXPORT_SYMBOL_GPL(vfio_del_group_dev); +diff --git a/include/linux/vfio.h b/include/linux/vfio.h +index 38d3c6a8dc7e..f479c5d7f2c3 100644 +--- a/include/linux/vfio.h ++++ b/include/linux/vfio.h +@@ -15,6 +15,18 @@ + #include + #include + ++struct vfio_device { ++ struct device *dev; ++ const struct vfio_device_ops *ops; ++ struct vfio_group *group; ++ ++ /* Members below here are private, not for driver use */ ++ refcount_t refcount; ++ struct completion comp; ++ struct list_head group_next; ++ void *device_data; ++}; ++ + /** + * struct vfio_device_ops - VFIO bus driver device callbacks + * +@@ -48,11 +60,15 @@ struct vfio_device_ops { + extern struct iommu_group *vfio_iommu_group_get(struct device *dev); + extern void vfio_iommu_group_put(struct iommu_group *group, struct device *dev); + ++void vfio_init_group_dev(struct vfio_device *device, struct device *dev, ++ const struct vfio_device_ops *ops, void *device_data); ++int vfio_register_group_dev(struct vfio_device *device); + extern int vfio_add_group_dev(struct device *dev, + const struct vfio_device_ops *ops, + void *device_data); + + extern void *vfio_del_group_dev(struct device *dev); ++void vfio_unregister_group_dev(struct vfio_device *device); + extern struct vfio_device *vfio_device_get_from_dev(struct device *dev); + extern void vfio_device_put(struct vfio_device *device); + extern void *vfio_device_data(struct vfio_device *device); +-- +2.35.1 + diff --git a/queue-5.10/video-fbdev-amba-clcd-fix-refcount-leak-bugs.patch b/queue-5.10/video-fbdev-amba-clcd-fix-refcount-leak-bugs.patch new file mode 100644 index 00000000000..e9bc46cd081 --- /dev/null +++ b/queue-5.10/video-fbdev-amba-clcd-fix-refcount-leak-bugs.patch @@ -0,0 +1,78 @@ +From 15f746e3a84b52321f5b95191a27db4a3deb646a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 16:25:46 +0800 +Subject: video: fbdev: amba-clcd: Fix refcount leak bugs + +From: Liang He + +[ Upstream commit 26c2b7d9fac42eb8317f3ceefa4c1a9a9170ca69 ] + +In clcdfb_of_init_display(), we should call of_node_put() for the +references returned by of_graph_get_next_endpoint() and +of_graph_get_remote_port_parent() which have increased the refcount. + +Besides, we should call of_node_put() both in fail path or when +the references are not used anymore. + +Fixes: d10715be03bd ("video: ARM CLCD: Add DT support") +Signed-off-by: Liang He +Signed-off-by: Helge Deller +Signed-off-by: Sasha Levin +--- + drivers/video/fbdev/amba-clcd.c | 24 ++++++++++++++++++------ + 1 file changed, 18 insertions(+), 6 deletions(-) + +diff --git a/drivers/video/fbdev/amba-clcd.c b/drivers/video/fbdev/amba-clcd.c +index 79efefd224f4..6252cd59673e 100644 +--- a/drivers/video/fbdev/amba-clcd.c ++++ b/drivers/video/fbdev/amba-clcd.c +@@ -711,16 +711,18 @@ static int clcdfb_of_init_display(struct clcd_fb *fb) + return -ENODEV; + + panel = of_graph_get_remote_port_parent(endpoint); +- if (!panel) +- return -ENODEV; ++ if (!panel) { ++ err = -ENODEV; ++ goto out_endpoint_put; ++ } + + err = clcdfb_of_get_backlight(&fb->dev->dev, fb->panel); + if (err) +- return err; ++ goto out_panel_put; + + err = clcdfb_of_get_mode(&fb->dev->dev, panel, fb->panel); + if (err) +- return err; ++ goto out_panel_put; + + err = of_property_read_u32(fb->dev->dev.of_node, "max-memory-bandwidth", + &max_bandwidth); +@@ -749,11 +751,21 @@ static int clcdfb_of_init_display(struct clcd_fb *fb) + + if (of_property_read_u32_array(endpoint, + "arm,pl11x,tft-r0g0b0-pads", +- tft_r0b0g0, ARRAY_SIZE(tft_r0b0g0)) != 0) +- return -ENOENT; ++ tft_r0b0g0, ARRAY_SIZE(tft_r0b0g0)) != 0) { ++ err = -ENOENT; ++ goto out_panel_put; ++ } ++ ++ of_node_put(panel); ++ of_node_put(endpoint); + + return clcdfb_of_init_tft_panel(fb, tft_r0b0g0[0], + tft_r0b0g0[1], tft_r0b0g0[2]); ++out_panel_put: ++ of_node_put(panel); ++out_endpoint_put: ++ of_node_put(endpoint); ++ return err; + } + + static int clcdfb_of_vram_setup(struct clcd_fb *fb) +-- +2.35.1 + diff --git a/queue-5.10/video-fbdev-arkfb-check-the-size-of-screen-before-me.patch b/queue-5.10/video-fbdev-arkfb-check-the-size-of-screen-before-me.patch new file mode 100644 index 00000000000..51e9f4f6b09 --- /dev/null +++ b/queue-5.10/video-fbdev-arkfb-check-the-size-of-screen-before-me.patch @@ -0,0 +1,50 @@ +From ea6fd16c20be45dfe741bf9b8366bdd830ccb343 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Aug 2022 20:41:24 +0800 +Subject: video: fbdev: arkfb: Check the size of screen before memset_io() + +From: Zheyu Ma + +[ Upstream commit 96b550971c65d54d64728d8ba973487878a06454 ] + +In the function arkfb_set_par(), the value of 'screen_size' is +calculated by the user input. If the user provides the improper value, +the value of 'screen_size' may larger than 'info->screen_size', which +may cause the following bug: + +[ 659.399066] BUG: unable to handle page fault for address: ffffc90003000000 +[ 659.399077] #PF: supervisor write access in kernel mode +[ 659.399079] #PF: error_code(0x0002) - not-present page +[ 659.399094] RIP: 0010:memset_orig+0x33/0xb0 +[ 659.399116] Call Trace: +[ 659.399122] arkfb_set_par+0x143f/0x24c0 +[ 659.399130] fb_set_var+0x604/0xeb0 +[ 659.399161] do_fb_ioctl+0x234/0x670 +[ 659.399189] fb_ioctl+0xdd/0x130 + +Fix the this by checking the value of 'screen_size' before memset_io(). + +Fixes: 681e14730c73 ("arkfb: new framebuffer driver for ARK Logic cards") +Signed-off-by: Zheyu Ma +Signed-off-by: Helge Deller +Signed-off-by: Sasha Levin +--- + drivers/video/fbdev/arkfb.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/video/fbdev/arkfb.c b/drivers/video/fbdev/arkfb.c +index d94cc5ad1ef6..8d092b106470 100644 +--- a/drivers/video/fbdev/arkfb.c ++++ b/drivers/video/fbdev/arkfb.c +@@ -794,6 +794,8 @@ static int arkfb_set_par(struct fb_info *info) + value = ((value * hmul / hdiv) / 8) - 5; + vga_wcrt(par->state.vgabase, 0x42, (value + 1) / 2); + ++ if (screen_size > info->screen_size) ++ screen_size = info->screen_size; + memset_io(info->screen_base, 0x00, screen_size); + /* Device and screen back on */ + svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80); +-- +2.35.1 + diff --git a/queue-5.10/video-fbdev-arkfb-fix-a-divide-by-zero-bug-in-ark_se.patch b/queue-5.10/video-fbdev-arkfb-fix-a-divide-by-zero-bug-in-ark_se.patch new file mode 100644 index 00000000000..382c5018046 --- /dev/null +++ b/queue-5.10/video-fbdev-arkfb-fix-a-divide-by-zero-bug-in-ark_se.patch @@ -0,0 +1,59 @@ +From e10ae894c30893272333257a5234bcf1dfa61db5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Aug 2022 17:23:12 +0800 +Subject: video: fbdev: arkfb: Fix a divide-by-zero bug in ark_set_pixclock() + +From: Zheyu Ma + +[ Upstream commit 2f1c4523f7a3aaabe7e53d3ebd378292947e95c8 ] + +Since the user can control the arguments of the ioctl() from the user +space, under special arguments that may result in a divide-by-zero bug +in: + drivers/video/fbdev/arkfb.c:784: ark_set_pixclock(info, (hdiv * info->var.pixclock) / hmul); +with hdiv=1, pixclock=1 and hmul=2 you end up with (1*1)/2 = (int) 0. +and then in: + drivers/video/fbdev/arkfb.c:504: rv = dac_set_freq(par->dac, 0, 1000000000 / pixclock); +we'll get a division-by-zero. + +The following log can reveal it: + +divide error: 0000 [#1] PREEMPT SMP KASAN PTI +RIP: 0010:ark_set_pixclock drivers/video/fbdev/arkfb.c:504 [inline] +RIP: 0010:arkfb_set_par+0x10fc/0x24c0 drivers/video/fbdev/arkfb.c:784 +Call Trace: + fb_set_var+0x604/0xeb0 drivers/video/fbdev/core/fbmem.c:1034 + do_fb_ioctl+0x234/0x670 drivers/video/fbdev/core/fbmem.c:1110 + fb_ioctl+0xdd/0x130 drivers/video/fbdev/core/fbmem.c:1189 + +Fix this by checking the argument of ark_set_pixclock() first. + +Fixes: 681e14730c73 ("arkfb: new framebuffer driver for ARK Logic cards") +Signed-off-by: Zheyu Ma +Signed-off-by: Helge Deller +Signed-off-by: Sasha Levin +--- + drivers/video/fbdev/arkfb.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/video/fbdev/arkfb.c b/drivers/video/fbdev/arkfb.c +index edf169d0816e..d94cc5ad1ef6 100644 +--- a/drivers/video/fbdev/arkfb.c ++++ b/drivers/video/fbdev/arkfb.c +@@ -778,7 +778,12 @@ static int arkfb_set_par(struct fb_info *info) + return -EINVAL; + } + +- ark_set_pixclock(info, (hdiv * info->var.pixclock) / hmul); ++ value = (hdiv * info->var.pixclock) / hmul; ++ if (!value) { ++ fb_dbg(info, "invalid pixclock\n"); ++ value = 1; ++ } ++ ark_set_pixclock(info, value); + svga_set_timings(par->state.vgabase, &ark_timing_regs, &(info->var), hmul, hdiv, + (info->var.vmode & FB_VMODE_DOUBLE) ? 2 : 1, + (info->var.vmode & FB_VMODE_INTERLACED) ? 2 : 1, +-- +2.35.1 + diff --git a/queue-5.10/video-fbdev-s3fb-check-the-size-of-screen-before-mem.patch b/queue-5.10/video-fbdev-s3fb-check-the-size-of-screen-before-mem.patch new file mode 100644 index 00000000000..b947efce345 --- /dev/null +++ b/queue-5.10/video-fbdev-s3fb-check-the-size-of-screen-before-mem.patch @@ -0,0 +1,49 @@ +From fb3520437f0edfa4bfcaa7f3c8f0110287328e1f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Aug 2022 20:41:25 +0800 +Subject: video: fbdev: s3fb: Check the size of screen before memset_io() + +From: Zheyu Ma + +[ Upstream commit 6ba592fa014f21f35a8ee8da4ca7b95a018f13e8 ] + +In the function s3fb_set_par(), the value of 'screen_size' is +calculated by the user input. If the user provides the improper value, +the value of 'screen_size' may larger than 'info->screen_size', which +may cause the following bug: + +[ 54.083733] BUG: unable to handle page fault for address: ffffc90003000000 +[ 54.083742] #PF: supervisor write access in kernel mode +[ 54.083744] #PF: error_code(0x0002) - not-present page +[ 54.083760] RIP: 0010:memset_orig+0x33/0xb0 +[ 54.083782] Call Trace: +[ 54.083788] s3fb_set_par+0x1ec6/0x4040 +[ 54.083806] fb_set_var+0x604/0xeb0 +[ 54.083836] do_fb_ioctl+0x234/0x670 + +Fix the this by checking the value of 'screen_size' before memset_io(). + +Fixes: a268422de8bf ("fbdev driver for S3 Trio/Virge") +Signed-off-by: Zheyu Ma +Signed-off-by: Helge Deller +Signed-off-by: Sasha Levin +--- + drivers/video/fbdev/s3fb.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/video/fbdev/s3fb.c b/drivers/video/fbdev/s3fb.c +index 5c74253e7b2c..a936455a3df2 100644 +--- a/drivers/video/fbdev/s3fb.c ++++ b/drivers/video/fbdev/s3fb.c +@@ -902,6 +902,8 @@ static int s3fb_set_par(struct fb_info *info) + value = clamp((htotal + hsstart + 1) / 2 + 2, hsstart + 4, htotal + 1); + svga_wcrt_multi(par->state.vgabase, s3_dtpc_regs, value); + ++ if (screen_size > info->screen_size) ++ screen_size = info->screen_size; + memset_io(info->screen_base, 0x00, screen_size); + /* Device and screen back on */ + svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80); +-- +2.35.1 + diff --git a/queue-5.10/video-fbdev-sis-fix-typos-in-sis_getmodeid.patch b/queue-5.10/video-fbdev-sis-fix-typos-in-sis_getmodeid.patch new file mode 100644 index 00000000000..61ee2f83083 --- /dev/null +++ b/queue-5.10/video-fbdev-sis-fix-typos-in-sis_getmodeid.patch @@ -0,0 +1,47 @@ +From bd7b51d001e880f13301051af7de7fbb06e8eaa0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jul 2022 15:43:43 +0300 +Subject: video: fbdev: sis: fix typos in SiS_GetModeID() + +From: Rustam Subkhankulov + +[ Upstream commit 3eb8fccc244bfb41a7961969e4db280d44911226 ] + +The second operand of a '&&' operator has no impact on expression +result for cases 400 and 512 in SiS_GetModeID(). + +Judging by the logic and the names of the variables, in both cases a +typo was made. + +Found by Linux Verification Center (linuxtesting.org) with SVACE. + +Signed-off-by: Rustam Subkhankulov +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Signed-off-by: Helge Deller +Signed-off-by: Sasha Levin +--- + drivers/video/fbdev/sis/init.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/video/fbdev/sis/init.c b/drivers/video/fbdev/sis/init.c +index fde27feae5d0..d6b2ce95a859 100644 +--- a/drivers/video/fbdev/sis/init.c ++++ b/drivers/video/fbdev/sis/init.c +@@ -355,12 +355,12 @@ SiS_GetModeID(int VGAEngine, unsigned int VBFlags, int HDisplay, int VDisplay, + } + break; + case 400: +- if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 800) && (LCDwidth >= 600))) { ++ if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 800) && (LCDheight >= 600))) { + if(VDisplay == 300) ModeIndex = ModeIndex_400x300[Depth]; + } + break; + case 512: +- if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 1024) && (LCDwidth >= 768))) { ++ if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 1024) && (LCDheight >= 768))) { + if(VDisplay == 384) ModeIndex = ModeIndex_512x384[Depth]; + } + break; +-- +2.35.1 + diff --git a/queue-5.10/video-fbdev-vt8623fb-check-the-size-of-screen-before.patch b/queue-5.10/video-fbdev-vt8623fb-check-the-size-of-screen-before.patch new file mode 100644 index 00000000000..29c1480e8c8 --- /dev/null +++ b/queue-5.10/video-fbdev-vt8623fb-check-the-size-of-screen-before.patch @@ -0,0 +1,50 @@ +From 83494f0607bac7d82bdaec854b84e35dbb49ee4e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Aug 2022 20:41:23 +0800 +Subject: video: fbdev: vt8623fb: Check the size of screen before memset_io() + +From: Zheyu Ma + +[ Upstream commit ec0754c60217248fa77cc9005d66b2b55200ac06 ] + +In the function vt8623fb_set_par(), the value of 'screen_size' is +calculated by the user input. If the user provides the improper value, +the value of 'screen_size' may larger than 'info->screen_size', which +may cause the following bug: + +[ 583.339036] BUG: unable to handle page fault for address: ffffc90005000000 +[ 583.339049] #PF: supervisor write access in kernel mode +[ 583.339052] #PF: error_code(0x0002) - not-present page +[ 583.339074] RIP: 0010:memset_orig+0x33/0xb0 +[ 583.339110] Call Trace: +[ 583.339118] vt8623fb_set_par+0x11cd/0x21e0 +[ 583.339146] fb_set_var+0x604/0xeb0 +[ 583.339181] do_fb_ioctl+0x234/0x670 +[ 583.339209] fb_ioctl+0xdd/0x130 + +Fix the this by checking the value of 'screen_size' before memset_io(). + +Fixes: 558b7bd86c32 ("vt8623fb: new framebuffer driver for VIA VT8623") +Signed-off-by: Zheyu Ma +Signed-off-by: Helge Deller +Signed-off-by: Sasha Levin +--- + drivers/video/fbdev/vt8623fb.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/video/fbdev/vt8623fb.c b/drivers/video/fbdev/vt8623fb.c +index 7a959e5ba90b..c274ec5e965c 100644 +--- a/drivers/video/fbdev/vt8623fb.c ++++ b/drivers/video/fbdev/vt8623fb.c +@@ -504,6 +504,8 @@ static int vt8623fb_set_par(struct fb_info *info) + (info->var.vmode & FB_VMODE_DOUBLE) ? 2 : 1, 1, + 1, info->node); + ++ if (screen_size > info->screen_size) ++ screen_size = info->screen_size; + memset_io(info->screen_base, 0x00, screen_size); + + /* Device and screen back on */ +-- +2.35.1 + diff --git a/queue-5.10/virtio-gpu-fix-a-missing-check-to-avoid-null-derefer.patch b/queue-5.10/virtio-gpu-fix-a-missing-check-to-avoid-null-derefer.patch new file mode 100644 index 00000000000..6550e646102 --- /dev/null +++ b/queue-5.10/virtio-gpu-fix-a-missing-check-to-avoid-null-derefer.patch @@ -0,0 +1,46 @@ +From 882fa0312ae6b1e6f964480032203b6758688fcd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 27 Mar 2022 13:09:45 +0800 +Subject: virtio-gpu: fix a missing check to avoid NULL dereference + +From: Xiaomeng Tong + +[ Upstream commit bd63f11f4c3c46afec07d821f74736161ff6e526 ] + +'cache_ent' could be set NULL inside virtio_gpu_cmd_get_capset() +and it will lead to a NULL dereference by a lately use of it +(i.e., ptr = cache_ent->caps_cache). Fix it with a NULL check. + +Fixes: 62fb7a5e10962 ("virtio-gpu: add 3d/virgl support") +Signed-off-by: Xiaomeng Tong +Reviewed-by: Chia-I Wu +Link: http://patchwork.freedesktop.org/patch/msgid/20220327050945.1614-1-xiam0nd.tong@gmail.com + +[ kraxel: minor codestyle fixup ] + +Signed-off-by: Gerd Hoffmann +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/virtio/virtgpu_ioctl.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c +index c8da7adc6b30..33b8ebab178a 100644 +--- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c ++++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c +@@ -470,8 +470,10 @@ static int virtio_gpu_get_caps_ioctl(struct drm_device *dev, + spin_unlock(&vgdev->display_info_lock); + + /* not in cache - need to talk to hw */ +- virtio_gpu_cmd_get_capset(vgdev, found_valid, args->cap_set_ver, +- &cache_ent); ++ ret = virtio_gpu_cmd_get_capset(vgdev, found_valid, args->cap_set_ver, ++ &cache_ent); ++ if (ret) ++ return ret; + virtio_gpu_notify(vgdev); + + copy_exit: +-- +2.35.1 + diff --git a/queue-5.10/wait-fix-__wait_event_hrtimeout-for-rt-dl-tasks.patch b/queue-5.10/wait-fix-__wait_event_hrtimeout-for-rt-dl-tasks.patch new file mode 100644 index 00000000000..b4f12c77604 --- /dev/null +++ b/queue-5.10/wait-fix-__wait_event_hrtimeout-for-rt-dl-tasks.patch @@ -0,0 +1,62 @@ +From 0f3f98defabe9cd5c0c40fc49f390070dcf8b6c6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 27 Jun 2022 11:50:51 +0200 +Subject: wait: Fix __wait_event_hrtimeout for RT/DL tasks + +From: Juri Lelli + +[ Upstream commit cceeeb6a6d02e7b9a74ddd27a3225013b34174aa ] + +Changes to hrtimer mode (potentially made by __hrtimer_init_sleeper on +PREEMPT_RT) are not visible to hrtimer_start_range_ns, thus not +accounted for by hrtimer_start_expires call paths. In particular, +__wait_event_hrtimeout suffers from this problem as we have, for +example: + +fs/aio.c::read_events + wait_event_interruptible_hrtimeout + __wait_event_hrtimeout + hrtimer_init_sleeper_on_stack <- this might "mode |= HRTIMER_MODE_HARD" + on RT if task runs at RT/DL priority + hrtimer_start_range_ns + WARN_ON_ONCE(!(mode & HRTIMER_MODE_HARD) ^ !timer->is_hard) + fires since the latter doesn't see the change of mode done by + init_sleeper + +Fix it by making __wait_event_hrtimeout call hrtimer_sleeper_start_expires, +which is aware of the special RT/DL case, instead of hrtimer_start_range_ns. + +Reported-by: Bruno Goncalves +Signed-off-by: Juri Lelli +Signed-off-by: Thomas Gleixner +Reviewed-by: Daniel Bristot de Oliveira +Reviewed-by: Valentin Schneider +Link: https://lore.kernel.org/r/20220627095051.42470-1-juri.lelli@redhat.com +Signed-off-by: Sasha Levin +--- + include/linux/wait.h | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/include/linux/wait.h b/include/linux/wait.h +index 9b8b0833100a..1663e47681a3 100644 +--- a/include/linux/wait.h ++++ b/include/linux/wait.h +@@ -534,10 +534,11 @@ do { \ + \ + hrtimer_init_sleeper_on_stack(&__t, CLOCK_MONOTONIC, \ + HRTIMER_MODE_REL); \ +- if ((timeout) != KTIME_MAX) \ +- hrtimer_start_range_ns(&__t.timer, timeout, \ +- current->timer_slack_ns, \ +- HRTIMER_MODE_REL); \ ++ if ((timeout) != KTIME_MAX) { \ ++ hrtimer_set_expires_range_ns(&__t.timer, timeout, \ ++ current->timer_slack_ns); \ ++ hrtimer_sleeper_start_expires(&__t, HRTIMER_MODE_REL); \ ++ } \ + \ + __ret = ___wait_event(wq_head, condition, state, 0, 0, \ + if (!__t.task) { \ +-- +2.35.1 + diff --git a/queue-5.10/watchdog-armada_37xx_wdt-check-the-return-value-of-d.patch b/queue-5.10/watchdog-armada_37xx_wdt-check-the-return-value-of-d.patch new file mode 100644 index 00000000000..df1a4bc086e --- /dev/null +++ b/queue-5.10/watchdog-armada_37xx_wdt-check-the-return-value-of-d.patch @@ -0,0 +1,42 @@ +From 33d1d86cc037785a5ce145c009194fae590c9109 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jul 2022 11:09:38 +0800 +Subject: watchdog: armada_37xx_wdt: check the return value of devm_ioremap() + in armada_37xx_wdt_probe() + +From: William Dean + +[ Upstream commit 2d27e52841092e5831dd41f313028c668d816eb0 ] + +The function devm_ioremap() in armada_37xx_wdt_probe() can fail, so +its return value should be checked. + +Fixes: 54e3d9b518c8a ("watchdog: Add support for Armada 37xx CPU watchdog") +Reported-by: Hacash Robot +Signed-off-by: William Dean +Reviewed-by: Marek Beh=C3=BAn +Reviewed-by: Guenter Roeck +Link: https://lore.kernel.org/r/20220722030938.2925156-1-williamsukatube@163.com +Signed-off-by: Guenter Roeck +Signed-off-by: Wim Van Sebroeck +Signed-off-by: Sasha Levin +--- + drivers/watchdog/armada_37xx_wdt.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/watchdog/armada_37xx_wdt.c b/drivers/watchdog/armada_37xx_wdt.c +index e5dcb26d85f0..dcb3ffda3fad 100644 +--- a/drivers/watchdog/armada_37xx_wdt.c ++++ b/drivers/watchdog/armada_37xx_wdt.c +@@ -274,6 +274,8 @@ static int armada_37xx_wdt_probe(struct platform_device *pdev) + if (!res) + return -ENODEV; + dev->reg = devm_ioremap(&pdev->dev, res->start, resource_size(res)); ++ if (!dev->reg) ++ return -ENOMEM; + + /* init clock */ + dev->clk = devm_clk_get(&pdev->dev, NULL); +-- +2.35.1 + diff --git a/queue-5.10/wifi-iwlegacy-4965-fix-potential-off-by-one-overflow.patch b/queue-5.10/wifi-iwlegacy-4965-fix-potential-off-by-one-overflow.patch new file mode 100644 index 00000000000..b54371cee12 --- /dev/null +++ b/queue-5.10/wifi-iwlegacy-4965-fix-potential-off-by-one-overflow.patch @@ -0,0 +1,64 @@ +From 7f89a0dcb8e8cec001aa1e6c04b7e947e191a839 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Jun 2022 20:16:14 +0300 +Subject: wifi: iwlegacy: 4965: fix potential off-by-one overflow in + il4965_rs_fill_link_cmd() + +From: Alexey Kodanev + +[ Upstream commit a8eb8e6f7159c7c20c0ddac428bde3d110890aa7 ] + +As a result of the execution of the inner while loop, the value +of 'idx' can be equal to LINK_QUAL_MAX_RETRY_NUM. However, this +is not checked after the loop and 'idx' is used to write the +LINK_QUAL_MAX_RETRY_NUM size array 'lq_cmd->rs_table[idx]' below +in the outer loop. + +The fix is to check the new value of 'idx' inside the nested loop, +and break both loops if index equals the size. Checking it at the +start is now pointless, so let's remove it. + +Detected using the static analysis tool - Svace. + +Fixes: be663ab67077 ("iwlwifi: split the drivers for agn and legacy devices 3945/4965") +Signed-off-by: Alexey Kodanev +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20220608171614.28891-1-aleksei.kodanev@bell-sw.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/iwlegacy/4965-rs.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/intel/iwlegacy/4965-rs.c b/drivers/net/wireless/intel/iwlegacy/4965-rs.c +index 9a491e5db75b..532e3b91777d 100644 +--- a/drivers/net/wireless/intel/iwlegacy/4965-rs.c ++++ b/drivers/net/wireless/intel/iwlegacy/4965-rs.c +@@ -2403,7 +2403,7 @@ il4965_rs_fill_link_cmd(struct il_priv *il, struct il_lq_sta *lq_sta, + /* Repeat initial/next rate. + * For legacy IL_NUMBER_TRY == 1, this loop will not execute. + * For HT IL_HT_NUMBER_TRY == 3, this executes twice. */ +- while (repeat_rate > 0 && idx < LINK_QUAL_MAX_RETRY_NUM) { ++ while (repeat_rate > 0) { + if (is_legacy(tbl_type.lq_type)) { + if (ant_toggle_cnt < NUM_TRY_BEFORE_ANT_TOGGLE) + ant_toggle_cnt++; +@@ -2422,6 +2422,8 @@ il4965_rs_fill_link_cmd(struct il_priv *il, struct il_lq_sta *lq_sta, + cpu_to_le32(new_rate); + repeat_rate--; + idx++; ++ if (idx >= LINK_QUAL_MAX_RETRY_NUM) ++ goto out; + } + + il4965_rs_get_tbl_info_from_mcs(new_rate, lq_sta->band, +@@ -2466,6 +2468,7 @@ il4965_rs_fill_link_cmd(struct il_priv *il, struct il_lq_sta *lq_sta, + repeat_rate--; + } + ++out: + lq_cmd->agg_params.agg_frame_cnt_limit = LINK_QUAL_AGG_FRAME_LIMIT_DEF; + lq_cmd->agg_params.agg_dis_start_th = LINK_QUAL_AGG_DISABLE_START_DEF; + +-- +2.35.1 + diff --git a/queue-5.10/wifi-iwlwifi-mvm-fix-double-list_add-at-iwl_mvm_mac_.patch b/queue-5.10/wifi-iwlwifi-mvm-fix-double-list_add-at-iwl_mvm_mac_.patch new file mode 100644 index 00000000000..9285e416bd1 --- /dev/null +++ b/queue-5.10/wifi-iwlwifi-mvm-fix-double-list_add-at-iwl_mvm_mac_.patch @@ -0,0 +1,70 @@ +From 298dea34b9befce822342d34d3254c8a46feb166 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jul 2022 17:35:42 +0200 +Subject: wifi: iwlwifi: mvm: fix double list_add at iwl_mvm_mac_wake_tx_queue + +From: Jose Ignacio Tornos Martinez + +[ Upstream commit 14a3aacf517a9de725dd3219dbbcf741e31763c4 ] + +After successfull station association, if station queues are disabled for +some reason, the related lists are not emptied. So if some new element is +added to the list in iwl_mvm_mac_wake_tx_queue, it can match with the old +one and produce a BUG like this: + +[ 46.535263] list_add corruption. prev->next should be next (ffff94c1c318a360), but was 0000000000000000. (prev=ffff94c1d02d3388). +[ 46.535283] ------------[ cut here ]------------ +[ 46.535284] kernel BUG at lib/list_debug.c:26! +[ 46.535290] invalid opcode: 0000 [#1] PREEMPT SMP PTI +[ 46.585304] CPU: 0 PID: 623 Comm: wpa_supplicant Not tainted 5.19.0-rc3+ #1 +[ 46.592380] Hardware name: Dell Inc. Inspiron 660s/0478VN , BIOS A07 08/24/2012 +[ 46.600336] RIP: 0010:__list_add_valid.cold+0x3d/0x3f +[ 46.605475] Code: f2 4c 89 c1 48 89 fe 48 c7 c7 c8 40 67 93 e8 20 cc fd ff 0f 0b 48 89 d1 4c 89 c6 4c 89 ca 48 c7 c7 70 40 67 93 e8 09 cc fd ff <0f> 0b 48 89 fe 48 c7 c7 00 41 67 93 e8 f8 cb fd ff 0f 0b 48 89 d1 +[ 46.624469] RSP: 0018:ffffb20800ab76d8 EFLAGS: 00010286 +[ 46.629854] RAX: 0000000000000075 RBX: ffff94c1c318a0e0 RCX: 0000000000000000 +[ 46.637105] RDX: 0000000000000201 RSI: ffffffff9365e100 RDI: 00000000ffffffff +[ 46.644356] RBP: ffff94c1c5f43370 R08: 0000000000000075 R09: 3064316334396666 +[ 46.651607] R10: 3364323064316334 R11: 39666666663d7665 R12: ffff94c1c5f43388 +[ 46.658857] R13: ffff94c1d02d3388 R14: ffff94c1c318a360 R15: ffff94c1cf2289c0 +[ 46.666108] FS: 00007f65634ff7c0(0000) GS:ffff94c1da200000(0000) knlGS:0000000000000000 +[ 46.674331] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +[ 46.680170] CR2: 00007f7dfe984460 CR3: 000000010e894003 CR4: 00000000000606f0 +[ 46.687422] Call Trace: +[ 46.689906] +[ 46.691950] iwl_mvm_mac_wake_tx_queue+0xec/0x15c [iwlmvm] +[ 46.697601] ieee80211_queue_skb+0x4b3/0x720 [mac80211] +[ 46.702973] ? sta_info_get+0x46/0x60 [mac80211] +[ 46.707703] ieee80211_tx+0xad/0x110 [mac80211] +[ 46.712355] __ieee80211_tx_skb_tid_band+0x71/0x90 [mac80211] +... + +In order to avoid this problem, we must also remove the related lists when +station queues are disabled. + +Fixes: cfbc6c4c5b91c ("iwlwifi: mvm: support mac80211 TXQs model") +Reported-by: Takayuki Nagata +Reported-by: Petr Stourac +Tested-by: Petr Stourac +Signed-off-by: Jose Ignacio Tornos Martinez +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20220719153542.81466-1-jtornosm@redhat.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +index ef62839894c7..09f870c48a4f 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +@@ -1840,6 +1840,7 @@ static void iwl_mvm_disable_sta_queues(struct iwl_mvm *mvm, + iwl_mvm_txq_from_mac80211(sta->txq[i]); + + mvmtxq->txq_id = IWL_MVM_INVALID_QUEUE; ++ list_del_init(&mvmtxq->list); + } + } + +-- +2.35.1 + diff --git a/queue-5.10/wifi-libertas-fix-possible-refcount-leak-in-if_usb_p.patch b/queue-5.10/wifi-libertas-fix-possible-refcount-leak-in-if_usb_p.patch new file mode 100644 index 00000000000..d7e67c55667 --- /dev/null +++ b/queue-5.10/wifi-libertas-fix-possible-refcount-leak-in-if_usb_p.patch @@ -0,0 +1,37 @@ +From c0b5d54a39f725a2696e257df5e84efac3fd15e0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Jun 2022 17:23:50 +0800 +Subject: wifi: libertas: Fix possible refcount leak in if_usb_probe() + +From: Hangyu Hua + +[ Upstream commit 6fd57e1d120bf13d4dc6c200a7cf914e6347a316 ] + +usb_get_dev will be called before lbs_get_firmware_async which means that +usb_put_dev need to be called when lbs_get_firmware_async fails. + +Fixes: ce84bb69f50e ("libertas USB: convert to asynchronous firmware loading") +Signed-off-by: Hangyu Hua +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20220620092350.39960-1-hbh25y@gmail.com +Link: https://lore.kernel.org/r/20220622113402.16969-1-colin.i.king@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/marvell/libertas/if_usb.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/wireless/marvell/libertas/if_usb.c b/drivers/net/wireless/marvell/libertas/if_usb.c +index 5d6dc1dd050d..32fdc4150b60 100644 +--- a/drivers/net/wireless/marvell/libertas/if_usb.c ++++ b/drivers/net/wireless/marvell/libertas/if_usb.c +@@ -287,6 +287,7 @@ static int if_usb_probe(struct usb_interface *intf, + return 0; + + err_get_fw: ++ usb_put_dev(udev); + lbs_remove_card(priv); + err_add_card: + if_usb_reset_device(cardp); +-- +2.35.1 + diff --git a/queue-5.10/wifi-p54-add-missing-parentheses-in-p54_flush.patch b/queue-5.10/wifi-p54-add-missing-parentheses-in-p54_flush.patch new file mode 100644 index 00000000000..ce3fc540bd1 --- /dev/null +++ b/queue-5.10/wifi-p54-add-missing-parentheses-in-p54_flush.patch @@ -0,0 +1,45 @@ +From d4b0d86a5ee913b9cd033183bb395beee2dad49b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jul 2022 16:48:31 +0300 +Subject: wifi: p54: add missing parentheses in p54_flush() + +From: Rustam Subkhankulov + +[ Upstream commit bcfd9d7f6840b06d5988c7141127795cf405805e ] + +The assignment of the value to the variable total in the loop +condition must be enclosed in additional parentheses, since otherwise, +in accordance with the precedence of the operators, the conjunction +will be performed first, and only then the assignment. + +Due to this error, a warning later in the function after the loop may +not occur in the situation when it should. + +Found by Linux Verification Center (linuxtesting.org) with SVACE. + +Signed-off-by: Rustam Subkhankulov +Fixes: 0d4171e2153b ("p54: implement flush callback") +Acked-by: Christian Lamparter +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20220714134831.106004-1-subkhankulov@ispras.ru +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intersil/p54/main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/intersil/p54/main.c b/drivers/net/wireless/intersil/p54/main.c +index a3ca6620dc0c..8fa3ec71603e 100644 +--- a/drivers/net/wireless/intersil/p54/main.c ++++ b/drivers/net/wireless/intersil/p54/main.c +@@ -682,7 +682,7 @@ static void p54_flush(struct ieee80211_hw *dev, struct ieee80211_vif *vif, + * queues have already been stopped and no new frames can sneak + * up from behind. + */ +- while ((total = p54_flush_count(priv) && i--)) { ++ while ((total = p54_flush_count(priv)) && i--) { + /* waste time */ + msleep(20); + } +-- +2.35.1 + diff --git a/queue-5.10/wifi-p54-fix-an-error-handling-path-in-p54spi_probe.patch b/queue-5.10/wifi-p54-fix-an-error-handling-path-in-p54spi_probe.patch new file mode 100644 index 00000000000..9bf60031f2e --- /dev/null +++ b/queue-5.10/wifi-p54-fix-an-error-handling-path-in-p54spi_probe.patch @@ -0,0 +1,52 @@ +From 10a35fcd3bcd143f83961d03751bc1bb93387a7b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 12 Jun 2022 23:12:20 +0200 +Subject: wifi: p54: Fix an error handling path in p54spi_probe() + +From: Christophe JAILLET + +[ Upstream commit 83781f0162d080fec7dcb911afd1bc2f5ad04471 ] + +If an error occurs after a successful call to p54spi_request_firmware(), it +must be undone by a corresponding release_firmware() as already done in +the error handling path of p54spi_request_firmware() and in the .remove() +function. + +Add the missing call in the error handling path and remove it from +p54spi_request_firmware() now that it is the responsibility of the caller +to release the firmware + +Fixes: cd8d3d321285 ("p54spi: p54spi driver") +Signed-off-by: Christophe JAILLET +Acked-by: Christian Lamparter +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/297d2547ff2ee627731662abceeab9dbdaf23231.1655068321.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intersil/p54/p54spi.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/intersil/p54/p54spi.c b/drivers/net/wireless/intersil/p54/p54spi.c +index ab0fe8565851..cdb57819684a 100644 +--- a/drivers/net/wireless/intersil/p54/p54spi.c ++++ b/drivers/net/wireless/intersil/p54/p54spi.c +@@ -164,7 +164,7 @@ static int p54spi_request_firmware(struct ieee80211_hw *dev) + + ret = p54_parse_firmware(dev, priv->firmware); + if (ret) { +- release_firmware(priv->firmware); ++ /* the firmware is released by the caller */ + return ret; + } + +@@ -659,6 +659,7 @@ static int p54spi_probe(struct spi_device *spi) + return 0; + + err_free_common: ++ release_firmware(priv->firmware); + free_irq(gpio_to_irq(p54spi_gpio_irq), spi); + err_free_gpio_irq: + gpio_free(p54spi_gpio_irq); +-- +2.35.1 + diff --git a/queue-5.10/wifi-rtlwifi-fix-error-codes-in-rtl_debugfs_set_writ.patch b/queue-5.10/wifi-rtlwifi-fix-error-codes-in-rtl_debugfs_set_writ.patch new file mode 100644 index 00000000000..36732cf7f65 --- /dev/null +++ b/queue-5.10/wifi-rtlwifi-fix-error-codes-in-rtl_debugfs_set_writ.patch @@ -0,0 +1,57 @@ +From bf911454de9ba18a4914766e130a1185db4240f0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 17 May 2022 14:48:44 +0300 +Subject: wifi: rtlwifi: fix error codes in rtl_debugfs_set_write_h2c() + +From: Dan Carpenter + +[ Upstream commit b88d28146c30a8e14f0f012d56ebf19b68a348f4 ] + +If the copy_from_user() fails or the user gives invalid date then the +correct thing to do is to return a negative error code. (Currently it +returns success). + +I made a copy additional related cleanups: +1) There is no need to check "buffer" for NULL. That's handled by +copy_from_user(). +2) The "h2c_len" variable cannot be negative because it is unsigned +and because sscanf() does not return negative error codes. + +Fixes: 610247f46feb ("rtlwifi: Improve debugging by using debugfs") +Signed-off-by: Dan Carpenter +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/YoOLnDkHgVltyXK7@kili +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/realtek/rtlwifi/debug.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/wireless/realtek/rtlwifi/debug.c b/drivers/net/wireless/realtek/rtlwifi/debug.c +index 901cdfe3723c..0b1bc04cb6ad 100644 +--- a/drivers/net/wireless/realtek/rtlwifi/debug.c ++++ b/drivers/net/wireless/realtek/rtlwifi/debug.c +@@ -329,8 +329,8 @@ static ssize_t rtl_debugfs_set_write_h2c(struct file *filp, + + tmp_len = (count > sizeof(tmp) - 1 ? sizeof(tmp) - 1 : count); + +- if (!buffer || copy_from_user(tmp, buffer, tmp_len)) +- return count; ++ if (copy_from_user(tmp, buffer, tmp_len)) ++ return -EFAULT; + + tmp[tmp_len] = '\0'; + +@@ -340,8 +340,8 @@ static ssize_t rtl_debugfs_set_write_h2c(struct file *filp, + &h2c_data[4], &h2c_data[5], + &h2c_data[6], &h2c_data[7]); + +- if (h2c_len <= 0) +- return count; ++ if (h2c_len == 0) ++ return -EINVAL; + + for (i = 0; i < h2c_len; i++) + h2c_data_packed[i] = (u8)h2c_data[i]; +-- +2.35.1 + diff --git a/queue-5.10/wifi-wil6210-debugfs-fix-info-leak-in-wil_write_file.patch b/queue-5.10/wifi-wil6210-debugfs-fix-info-leak-in-wil_write_file.patch new file mode 100644 index 00000000000..33148f2a1d5 --- /dev/null +++ b/queue-5.10/wifi-wil6210-debugfs-fix-info-leak-in-wil_write_file.patch @@ -0,0 +1,52 @@ +From e17bfd6d577964499bf0fdb57fb42a7a43851439 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jul 2022 13:35:18 +0300 +Subject: wifi: wil6210: debugfs: fix info leak in wil_write_file_wmi() + +From: Dan Carpenter + +[ Upstream commit 7a4836560a6198d245d5732e26f94898b12eb760 ] + +The simple_write_to_buffer() function will succeed if even a single +byte is initialized. However, we need to initialize the whole buffer +to prevent information leaks. Just use memdup_user(). + +Fixes: ff974e408334 ("wil6210: debugfs interface to send raw WMI command") +Signed-off-by: Dan Carpenter +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/Ysg14NdKAZF/hcNG@kili +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/wil6210/debugfs.c | 14 ++++---------- + 1 file changed, 4 insertions(+), 10 deletions(-) + +diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c +index 2d618f90afa7..58c98e58bccb 100644 +--- a/drivers/net/wireless/ath/wil6210/debugfs.c ++++ b/drivers/net/wireless/ath/wil6210/debugfs.c +@@ -1012,18 +1012,12 @@ static ssize_t wil_write_file_wmi(struct file *file, const char __user *buf, + u16 cmdid; + int rc, rc1; + +- if (cmdlen < 0) ++ if (cmdlen < 0 || *ppos != 0) + return -EINVAL; + +- wmi = kmalloc(len, GFP_KERNEL); +- if (!wmi) +- return -ENOMEM; +- +- rc = simple_write_to_buffer(wmi, len, ppos, buf, len); +- if (rc < 0) { +- kfree(wmi); +- return rc; +- } ++ wmi = memdup_user(buf, len); ++ if (IS_ERR(wmi)) ++ return PTR_ERR(wmi); + + cmd = (cmdlen > 0) ? &wmi[1] : NULL; + cmdid = le16_to_cpu(wmi->command_id); +-- +2.35.1 + diff --git a/queue-5.10/wifi-wil6210-debugfs-fix-uninitialized-variable-use-.patch b/queue-5.10/wifi-wil6210-debugfs-fix-uninitialized-variable-use-.patch new file mode 100644 index 00000000000..233957ba19d --- /dev/null +++ b/queue-5.10/wifi-wil6210-debugfs-fix-uninitialized-variable-use-.patch @@ -0,0 +1,59 @@ +From ed8df1b45f121c3d701d71a4f375ba7422afcdc4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Jul 2022 20:49:11 +0300 +Subject: wifi: wil6210: debugfs: fix uninitialized variable use in + `wil_write_file_wmi()` + +From: Ammar Faizi + +[ Upstream commit d578e0af3a003736f6c440188b156483d451b329 ] + +Commit 7a4836560a61 changes simple_write_to_buffer() with memdup_user() +but it forgets to change the value to be returned that came from +simple_write_to_buffer() call. It results in the following warning: + + warning: variable 'rc' is uninitialized when used here [-Wuninitialized] + return rc; + ^~ + +Remove rc variable and just return the passed in length if the +memdup_user() succeeds. + +Cc: Dan Carpenter +Reported-by: kernel test robot +Fixes: 7a4836560a6198d245d5732e26f94898b12eb760 ("wifi: wil6210: debugfs: fix info leak in wil_write_file_wmi()") +Fixes: ff974e4083341383d3dd4079e52ed30f57f376f0 ("wil6210: debugfs interface to send raw WMI command") +Signed-off-by: Ammar Faizi +Reviewed-by: Dan Carpenter +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20220724202452.61846-1-ammar.faizi@intel.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/wil6210/debugfs.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c +index 58c98e58bccb..cb40162bae99 100644 +--- a/drivers/net/wireless/ath/wil6210/debugfs.c ++++ b/drivers/net/wireless/ath/wil6210/debugfs.c +@@ -1010,7 +1010,7 @@ static ssize_t wil_write_file_wmi(struct file *file, const char __user *buf, + void *cmd; + int cmdlen = len - sizeof(struct wmi_cmd_hdr); + u16 cmdid; +- int rc, rc1; ++ int rc1; + + if (cmdlen < 0 || *ppos != 0) + return -EINVAL; +@@ -1027,7 +1027,7 @@ static ssize_t wil_write_file_wmi(struct file *file, const char __user *buf, + + wil_info(wil, "0x%04x[%d] -> %d\n", cmdid, cmdlen, rc1); + +- return rc; ++ return len; + } + + static const struct file_operations fops_wmi = { +-- +2.35.1 + diff --git a/queue-5.10/wireguard-allowedips-don-t-corrupt-stack-when-detect.patch b/queue-5.10/wireguard-allowedips-don-t-corrupt-stack-when-detect.patch new file mode 100644 index 00000000000..ab1f5b41e8a --- /dev/null +++ b/queue-5.10/wireguard-allowedips-don-t-corrupt-stack-when-detect.patch @@ -0,0 +1,95 @@ +From 8b3b9d7ce441a08d591a5ef879c4936445eee854 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Aug 2022 14:56:12 +0200 +Subject: wireguard: allowedips: don't corrupt stack when detecting overflow + +From: Jason A. Donenfeld + +[ Upstream commit c31b14d86dfe7174361e8c6e5df6c2c3a4d5918c ] + +In case push_rcu() and related functions are buggy, there's a +WARN_ON(len >= 128), which the selftest tries to hit by being tricky. In +case it is hit, we shouldn't corrupt the kernel's stack, though; +otherwise it may be hard to even receive the report that it's buggy. So +conditionalize the stack write based on that WARN_ON()'s return value. + +Note that this never *actually* happens anyway. The WARN_ON() in the +first place is bounded by IS_ENABLED(DEBUG), and isn't expected to ever +actually hit. This is just a debugging sanity check. + +Additionally, hoist the constant 128 into a named enum, +MAX_ALLOWEDIPS_BITS, so that it's clear why this value is chosen. + +Suggested-by: Linus Torvalds +Link: https://lore.kernel.org/all/CAHk-=wjJZGA6w_DxA+k7Ejbqsq+uGK==koPai3sqdsfJqemvag@mail.gmail.com/ +Fixes: e7096c131e51 ("net: WireGuard secure network tunnel") +Signed-off-by: Jason A. Donenfeld +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/wireguard/allowedips.c | 9 ++++++--- + drivers/net/wireguard/selftest/allowedips.c | 6 +++--- + 2 files changed, 9 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/wireguard/allowedips.c b/drivers/net/wireguard/allowedips.c +index 9a4c8ff32d9d..5bf7822c53f1 100644 +--- a/drivers/net/wireguard/allowedips.c ++++ b/drivers/net/wireguard/allowedips.c +@@ -6,6 +6,8 @@ + #include "allowedips.h" + #include "peer.h" + ++enum { MAX_ALLOWEDIPS_BITS = 128 }; ++ + static struct kmem_cache *node_cache; + + static void swap_endian(u8 *dst, const u8 *src, u8 bits) +@@ -40,7 +42,8 @@ static void push_rcu(struct allowedips_node **stack, + struct allowedips_node __rcu *p, unsigned int *len) + { + if (rcu_access_pointer(p)) { +- WARN_ON(IS_ENABLED(DEBUG) && *len >= 128); ++ if (WARN_ON(IS_ENABLED(DEBUG) && *len >= MAX_ALLOWEDIPS_BITS)) ++ return; + stack[(*len)++] = rcu_dereference_raw(p); + } + } +@@ -52,7 +55,7 @@ static void node_free_rcu(struct rcu_head *rcu) + + static void root_free_rcu(struct rcu_head *rcu) + { +- struct allowedips_node *node, *stack[128] = { ++ struct allowedips_node *node, *stack[MAX_ALLOWEDIPS_BITS] = { + container_of(rcu, struct allowedips_node, rcu) }; + unsigned int len = 1; + +@@ -65,7 +68,7 @@ static void root_free_rcu(struct rcu_head *rcu) + + static void root_remove_peer_lists(struct allowedips_node *root) + { +- struct allowedips_node *node, *stack[128] = { root }; ++ struct allowedips_node *node, *stack[MAX_ALLOWEDIPS_BITS] = { root }; + unsigned int len = 1; + + while (len > 0 && (node = stack[--len])) { +diff --git a/drivers/net/wireguard/selftest/allowedips.c b/drivers/net/wireguard/selftest/allowedips.c +index e173204ae7d7..41db10f9be49 100644 +--- a/drivers/net/wireguard/selftest/allowedips.c ++++ b/drivers/net/wireguard/selftest/allowedips.c +@@ -593,10 +593,10 @@ bool __init wg_allowedips_selftest(void) + wg_allowedips_remove_by_peer(&t, a, &mutex); + test_negative(4, a, 192, 168, 0, 1); + +- /* These will hit the WARN_ON(len >= 128) in free_node if something +- * goes wrong. ++ /* These will hit the WARN_ON(len >= MAX_ALLOWEDIPS_BITS) in free_node ++ * if something goes wrong. + */ +- for (i = 0; i < 128; ++i) { ++ for (i = 0; i < MAX_ALLOWEDIPS_BITS; ++i) { + part = cpu_to_be64(~(1LLU << (i % 64))); + memset(&ip, 0xff, 16); + memcpy((u8 *)&ip + (i < 64) * 8, &part, 8); +-- +2.35.1 + diff --git a/queue-5.10/wireguard-ratelimiter-use-hrtimer-in-selftest.patch b/queue-5.10/wireguard-ratelimiter-use-hrtimer-in-selftest.patch new file mode 100644 index 00000000000..afa74813ffa --- /dev/null +++ b/queue-5.10/wireguard-ratelimiter-use-hrtimer-in-selftest.patch @@ -0,0 +1,137 @@ +From b77367d932363b22bf2aed5c328812797f7c3108 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Aug 2022 14:56:10 +0200 +Subject: wireguard: ratelimiter: use hrtimer in selftest + +From: Jason A. Donenfeld + +[ Upstream commit 151c8e499f4705010780189377f85b57400ccbf5 ] + +Using msleep() is problematic because it's compared against +ratelimiter.c's ktime_get_coarse_boottime_ns(), which means on systems +with slow jiffies (such as UML's forced HZ=100), the result is +inaccurate. So switch to using schedule_hrtimeout(). + +However, hrtimer gives us access only to the traditional posix timers, +and none of the _COARSE variants. So now, rather than being too +imprecise like jiffies, it's too precise. + +One solution would be to give it a large "range" value, but this will +still fire early on a loaded system. A better solution is to align the +timeout to the actual coarse timer, and then round up to the nearest +tick, plus change. + +So add the timeout to the current coarse time, and then +schedule_hrtimer() until the absolute computed time. + +This should hopefully reduce flakes in CI as well. Note that we keep the +retry loop in case the entire function is running behind, because the +test could still be scheduled out, by either the kernel or by the +hypervisor's kernel, in which case restarting the test and hoping to not +be scheduled out still helps. + +Fixes: e7096c131e51 ("net: WireGuard secure network tunnel") +Suggested-by: Thomas Gleixner +Signed-off-by: Jason A. Donenfeld +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/wireguard/selftest/ratelimiter.c | 25 +++++++++++--------- + kernel/time/hrtimer.c | 1 + + 2 files changed, 15 insertions(+), 11 deletions(-) + +diff --git a/drivers/net/wireguard/selftest/ratelimiter.c b/drivers/net/wireguard/selftest/ratelimiter.c +index 007cd4457c5f..ba87d294604f 100644 +--- a/drivers/net/wireguard/selftest/ratelimiter.c ++++ b/drivers/net/wireguard/selftest/ratelimiter.c +@@ -6,28 +6,29 @@ + #ifdef DEBUG + + #include ++#include + + static const struct { + bool result; +- unsigned int msec_to_sleep_before; ++ u64 nsec_to_sleep_before; + } expected_results[] __initconst = { + [0 ... PACKETS_BURSTABLE - 1] = { true, 0 }, + [PACKETS_BURSTABLE] = { false, 0 }, +- [PACKETS_BURSTABLE + 1] = { true, MSEC_PER_SEC / PACKETS_PER_SECOND }, ++ [PACKETS_BURSTABLE + 1] = { true, NSEC_PER_SEC / PACKETS_PER_SECOND }, + [PACKETS_BURSTABLE + 2] = { false, 0 }, +- [PACKETS_BURSTABLE + 3] = { true, (MSEC_PER_SEC / PACKETS_PER_SECOND) * 2 }, ++ [PACKETS_BURSTABLE + 3] = { true, (NSEC_PER_SEC / PACKETS_PER_SECOND) * 2 }, + [PACKETS_BURSTABLE + 4] = { true, 0 }, + [PACKETS_BURSTABLE + 5] = { false, 0 } + }; + + static __init unsigned int maximum_jiffies_at_index(int index) + { +- unsigned int total_msecs = 2 * MSEC_PER_SEC / PACKETS_PER_SECOND / 3; ++ u64 total_nsecs = 2 * NSEC_PER_SEC / PACKETS_PER_SECOND / 3; + int i; + + for (i = 0; i <= index; ++i) +- total_msecs += expected_results[i].msec_to_sleep_before; +- return msecs_to_jiffies(total_msecs); ++ total_nsecs += expected_results[i].nsec_to_sleep_before; ++ return nsecs_to_jiffies(total_nsecs); + } + + static __init int timings_test(struct sk_buff *skb4, struct iphdr *hdr4, +@@ -42,8 +43,12 @@ static __init int timings_test(struct sk_buff *skb4, struct iphdr *hdr4, + loop_start_time = jiffies; + + for (i = 0; i < ARRAY_SIZE(expected_results); ++i) { +- if (expected_results[i].msec_to_sleep_before) +- msleep(expected_results[i].msec_to_sleep_before); ++ if (expected_results[i].nsec_to_sleep_before) { ++ ktime_t timeout = ktime_add(ktime_add_ns(ktime_get_coarse_boottime(), TICK_NSEC * 4 / 3), ++ ns_to_ktime(expected_results[i].nsec_to_sleep_before)); ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ schedule_hrtimeout_range_clock(&timeout, 0, HRTIMER_MODE_ABS, CLOCK_BOOTTIME); ++ } + + if (time_is_before_jiffies(loop_start_time + + maximum_jiffies_at_index(i))) +@@ -127,7 +132,7 @@ bool __init wg_ratelimiter_selftest(void) + if (IS_ENABLED(CONFIG_KASAN) || IS_ENABLED(CONFIG_UBSAN)) + return true; + +- BUILD_BUG_ON(MSEC_PER_SEC % PACKETS_PER_SECOND != 0); ++ BUILD_BUG_ON(NSEC_PER_SEC % PACKETS_PER_SECOND != 0); + + if (wg_ratelimiter_init()) + goto out; +@@ -176,7 +181,6 @@ bool __init wg_ratelimiter_selftest(void) + test += test_count; + goto err; + } +- msleep(500); + continue; + } else if (ret < 0) { + test += test_count; +@@ -195,7 +199,6 @@ bool __init wg_ratelimiter_selftest(void) + test += test_count; + goto err; + } +- msleep(50); + continue; + } + test += test_count; +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index 4ef90718c114..544ce87ba38a 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -2209,6 +2209,7 @@ schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta, + + return !t.task ? 0 : -EINTR; + } ++EXPORT_SYMBOL_GPL(schedule_hrtimeout_range_clock); + + /** + * schedule_hrtimeout_range - sleep until timeout +-- +2.35.1 + diff --git a/queue-5.10/x86-entry-build-thunk_-bits-only-if-config_preemptio.patch b/queue-5.10/x86-entry-build-thunk_-bits-only-if-config_preemptio.patch new file mode 100644 index 00000000000..cbdcce83cf2 --- /dev/null +++ b/queue-5.10/x86-entry-build-thunk_-bits-only-if-config_preemptio.patch @@ -0,0 +1,111 @@ +From f7aadad7b98554074cbe64300269e40189b68dd4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jul 2022 09:49:15 +0200 +Subject: x86/entry: Build thunk_$(BITS) only if CONFIG_PREEMPTION=y + +From: Andrea Righi + +[ Upstream commit de979c83574abf6e78f3fa65b716515c91b2613d ] + +With CONFIG_PREEMPTION disabled, arch/x86/entry/thunk_$(BITS).o becomes +an empty object file. + +With some old versions of binutils (i.e., 2.35.90.20210113-1ubuntu1) the +GNU assembler doesn't generate a symbol table for empty object files and +objtool fails with the following error when a valid symbol table cannot +be found: + + arch/x86/entry/thunk_64.o: warning: objtool: missing symbol table + +To prevent this from happening, build thunk_$(BITS).o only if +CONFIG_PREEMPTION is enabled. + +BugLink: https://bugs.launchpad.net/bugs/1911359 + +Fixes: 320100a5ffe5 ("x86/entry: Remove the TRACE_IRQS cruft") +Signed-off-by: Andrea Righi +Signed-off-by: Ingo Molnar +Link: https://lore.kernel.org/r/Ys/Ke7EWjcX+ZlXO@arighi-desktop +Signed-off-by: Sasha Levin +--- + arch/x86/entry/Makefile | 3 ++- + arch/x86/entry/thunk_32.S | 2 -- + arch/x86/entry/thunk_64.S | 4 ---- + arch/x86/um/Makefile | 3 ++- + 4 files changed, 4 insertions(+), 8 deletions(-) + +diff --git a/arch/x86/entry/Makefile b/arch/x86/entry/Makefile +index 58533752efab..63dc4b1dfc92 100644 +--- a/arch/x86/entry/Makefile ++++ b/arch/x86/entry/Makefile +@@ -21,12 +21,13 @@ CFLAGS_syscall_64.o += $(call cc-option,-Wno-override-init,) + CFLAGS_syscall_32.o += $(call cc-option,-Wno-override-init,) + CFLAGS_syscall_x32.o += $(call cc-option,-Wno-override-init,) + +-obj-y := entry.o entry_$(BITS).o thunk_$(BITS).o syscall_$(BITS).o ++obj-y := entry.o entry_$(BITS).o syscall_$(BITS).o + obj-y += common.o + + obj-y += vdso/ + obj-y += vsyscall/ + ++obj-$(CONFIG_PREEMPTION) += thunk_$(BITS).o + obj-$(CONFIG_IA32_EMULATION) += entry_64_compat.o syscall_32.o + obj-$(CONFIG_X86_X32_ABI) += syscall_x32.o + +diff --git a/arch/x86/entry/thunk_32.S b/arch/x86/entry/thunk_32.S +index 7591bab060f7..ff6e7003da97 100644 +--- a/arch/x86/entry/thunk_32.S ++++ b/arch/x86/entry/thunk_32.S +@@ -29,10 +29,8 @@ SYM_CODE_START_NOALIGN(\name) + SYM_CODE_END(\name) + .endm + +-#ifdef CONFIG_PREEMPTION + THUNK preempt_schedule_thunk, preempt_schedule + THUNK preempt_schedule_notrace_thunk, preempt_schedule_notrace + EXPORT_SYMBOL(preempt_schedule_thunk) + EXPORT_SYMBOL(preempt_schedule_notrace_thunk) +-#endif + +diff --git a/arch/x86/entry/thunk_64.S b/arch/x86/entry/thunk_64.S +index 1b5044ad8cd0..14776163fbff 100644 +--- a/arch/x86/entry/thunk_64.S ++++ b/arch/x86/entry/thunk_64.S +@@ -36,14 +36,11 @@ SYM_FUNC_END(\name) + _ASM_NOKPROBE(\name) + .endm + +-#ifdef CONFIG_PREEMPTION + THUNK preempt_schedule_thunk, preempt_schedule + THUNK preempt_schedule_notrace_thunk, preempt_schedule_notrace + EXPORT_SYMBOL(preempt_schedule_thunk) + EXPORT_SYMBOL(preempt_schedule_notrace_thunk) +-#endif + +-#ifdef CONFIG_PREEMPTION + SYM_CODE_START_LOCAL_NOALIGN(__thunk_restore) + popq %r11 + popq %r10 +@@ -58,4 +55,3 @@ SYM_CODE_START_LOCAL_NOALIGN(__thunk_restore) + RET + _ASM_NOKPROBE(__thunk_restore) + SYM_CODE_END(__thunk_restore) +-#endif +diff --git a/arch/x86/um/Makefile b/arch/x86/um/Makefile +index 77f70b969d14..3113800da63a 100644 +--- a/arch/x86/um/Makefile ++++ b/arch/x86/um/Makefile +@@ -27,7 +27,8 @@ else + + obj-y += syscalls_64.o vdso/ + +-subarch-y = ../lib/csum-partial_64.o ../lib/memcpy_64.o ../entry/thunk_64.o ++subarch-y = ../lib/csum-partial_64.o ../lib/memcpy_64.o ++subarch-$(CONFIG_PREEMPTION) += ../entry/thunk_64.o + + endif + +-- +2.35.1 + diff --git a/queue-5.10/x86-handle-idle-nomwait-cmdline-properly-for-x86_idl.patch b/queue-5.10/x86-handle-idle-nomwait-cmdline-properly-for-x86_idl.patch new file mode 100644 index 00000000000..21edc754278 --- /dev/null +++ b/queue-5.10/x86-handle-idle-nomwait-cmdline-properly-for-x86_idl.patch @@ -0,0 +1,97 @@ +From 01bd477af1c3f4a2fe420b580f802881e749ad01 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Jun 2022 23:33:34 +0530 +Subject: x86: Handle idle=nomwait cmdline properly for x86_idle + +From: Wyes Karny + +[ Upstream commit 8bcedb4ce04750e1ccc9a6b6433387f6a9166a56 ] + +When kernel is booted with idle=nomwait do not use MWAIT as the +default idle state. + +If the user boots the kernel with idle=nomwait, it is a clear +direction to not use mwait as the default idle state. +However, the current code does not take this into consideration +while selecting the default idle state on x86. + +Fix it by checking for the idle=nomwait boot option in +prefer_mwait_c1_over_halt(). + +Also update the documentation around idle=nomwait appropriately. + +[ dhansen: tweak commit message ] + +Signed-off-by: Wyes Karny +Signed-off-by: Dave Hansen +Tested-by: Zhang Rui +Link: https://lkml.kernel.org/r/fdc2dc2d0a1bc21c2f53d989ea2d2ee3ccbc0dbe.1654538381.git-series.wyes.karny@amd.com +Signed-off-by: Sasha Levin +--- + Documentation/admin-guide/pm/cpuidle.rst | 15 +++++++++------ + arch/x86/kernel/process.c | 9 ++++++--- + 2 files changed, 15 insertions(+), 9 deletions(-) + +diff --git a/Documentation/admin-guide/pm/cpuidle.rst b/Documentation/admin-guide/pm/cpuidle.rst +index 10fde58d0869..3596e3714ec1 100644 +--- a/Documentation/admin-guide/pm/cpuidle.rst ++++ b/Documentation/admin-guide/pm/cpuidle.rst +@@ -685,8 +685,8 @@ the ``menu`` governor to be used on the systems that use the ``ladder`` governor + by default this way, for example. + + The other kernel command line parameters controlling CPU idle time management +-described below are only relevant for the *x86* architecture and some of +-them affect Intel processors only. ++described below are only relevant for the *x86* architecture and references ++to ``intel_idle`` affect Intel processors only. + + The *x86* architecture support code recognizes three kernel command line + options related to CPU idle time management: ``idle=poll``, ``idle=halt``, +@@ -708,10 +708,13 @@ idle, so it very well may hurt single-thread computations performance as well as + energy-efficiency. Thus using it for performance reasons may not be a good idea + at all.] + +-The ``idle=nomwait`` option disables the ``intel_idle`` driver and causes +-``acpi_idle`` to be used (as long as all of the information needed by it is +-there in the system's ACPI tables), but it is not allowed to use the +-``MWAIT`` instruction of the CPUs to ask the hardware to enter idle states. ++The ``idle=nomwait`` option prevents the use of ``MWAIT`` instruction of ++the CPU to enter idle states. When this option is used, the ``acpi_idle`` ++driver will use the ``HLT`` instruction instead of ``MWAIT``. On systems ++running Intel processors, this option disables the ``intel_idle`` driver ++and forces the use of the ``acpi_idle`` driver instead. Note that in either ++case, ``acpi_idle`` driver will function only if all the information needed ++by it is in the system's ACPI tables. + + In addition to the architecture-level kernel command line options affecting CPU + idle time management, there are parameters affecting individual ``CPUIdle`` +diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c +index a2823682d64e..4505d845daba 100644 +--- a/arch/x86/kernel/process.c ++++ b/arch/x86/kernel/process.c +@@ -777,6 +777,10 @@ static void amd_e400_idle(void) + */ + static int prefer_mwait_c1_over_halt(const struct cpuinfo_x86 *c) + { ++ /* User has disallowed the use of MWAIT. Fallback to HALT */ ++ if (boot_option_idle_override == IDLE_NOMWAIT) ++ return 0; ++ + if (c->x86_vendor != X86_VENDOR_INTEL) + return 0; + +@@ -885,9 +889,8 @@ static int __init idle_setup(char *str) + } else if (!strcmp(str, "nomwait")) { + /* + * If the boot option of "idle=nomwait" is added, +- * it means that mwait will be disabled for CPU C2/C3 +- * states. In such case it won't touch the variable +- * of boot_option_idle_override. ++ * it means that mwait will be disabled for CPU C1/C2/C3 ++ * states. + */ + boot_option_idle_override = IDLE_NOMWAIT; + } else +-- +2.35.1 + diff --git a/queue-5.10/x86-numa-use-cpumask_available-instead-of-hardcoded-.patch b/queue-5.10/x86-numa-use-cpumask_available-instead-of-hardcoded-.patch new file mode 100644 index 00000000000..922b1038484 --- /dev/null +++ b/queue-5.10/x86-numa-use-cpumask_available-instead-of-hardcoded-.patch @@ -0,0 +1,76 @@ +From 3c7149b0d3ddeab31bb7e8dd11a313e5b459a840 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 31 Jul 2022 21:39:13 +0530 +Subject: x86/numa: Use cpumask_available instead of hardcoded NULL check +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Siddh Raman Pant + +[ Upstream commit 625395c4a0f4775e0fe00f616888d2e6c1ba49db ] + +GCC-12 started triggering a new warning: + + arch/x86/mm/numa.c: In function ‘cpumask_of_node’: + arch/x86/mm/numa.c:916:39: warning: the comparison will always evaluate as ‘false’ for the address of ‘node_to_cpumask_map’ will never be NULL [-Waddress] + 916 | if (node_to_cpumask_map[node] == NULL) { + | ^~ + +node_to_cpumask_map is of type cpumask_var_t[]. + +When CONFIG_CPUMASK_OFFSTACK is set, cpumask_var_t is typedef'd to a +pointer for dynamic allocation, else to an array of one element. The +"wicked game" can be checked on line 700 of include/linux/cpumask.h. + +The original code in debug_cpumask_set_cpu() and cpumask_of_node() were +probably written by the original authors with CONFIG_CPUMASK_OFFSTACK=y +(i.e. dynamic allocation) in mind, checking if the cpumask was available +via a direct NULL check. + +When CONFIG_CPUMASK_OFFSTACK is not set, GCC gives the above warning +while compiling the kernel. + +Fix that by using cpumask_available(), which does the NULL check when +CONFIG_CPUMASK_OFFSTACK is set, otherwise returns true. Use it wherever +such checks are made. + +Conditional definitions of cpumask_available() can be found along with +the definition of cpumask_var_t. Check the cpumask.h reference mentioned +above. + +Fixes: c032ef60d1aa ("cpumask: convert node_to_cpumask_map[] to cpumask_var_t") +Fixes: de2d9445f162 ("x86: Unify node_to_cpumask_map handling between 32 and 64bit") +Signed-off-by: Siddh Raman Pant +Signed-off-by: Ingo Molnar +Link: https://lore.kernel.org/r/20220731160913.632092-1-code@siddh.me +Signed-off-by: Sasha Levin +--- + arch/x86/mm/numa.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c +index e94da744386f..9dc31996c7ed 100644 +--- a/arch/x86/mm/numa.c ++++ b/arch/x86/mm/numa.c +@@ -861,7 +861,7 @@ void debug_cpumask_set_cpu(int cpu, int node, bool enable) + return; + } + mask = node_to_cpumask_map[node]; +- if (!mask) { ++ if (!cpumask_available(mask)) { + pr_err("node_to_cpumask_map[%i] NULL\n", node); + dump_stack(); + return; +@@ -907,7 +907,7 @@ const struct cpumask *cpumask_of_node(int node) + dump_stack(); + return cpu_none_mask; + } +- if (node_to_cpumask_map[node] == NULL) { ++ if (!cpumask_available(node_to_cpumask_map[node])) { + printk(KERN_WARNING + "cpumask_of_node(%d): no node_to_cpumask_map!\n", + node); +-- +2.35.1 + diff --git a/queue-5.10/x86-pmem-fix-platform-device-leak-in-error-path.patch b/queue-5.10/x86-pmem-fix-platform-device-leak-in-error-path.patch new file mode 100644 index 00000000000..07be267f1b9 --- /dev/null +++ b/queue-5.10/x86-pmem-fix-platform-device-leak-in-error-path.patch @@ -0,0 +1,41 @@ +From 514fdf76e868d5d7da70c92829ec70bd2c6f8c61 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Jun 2022 16:07:23 +0200 +Subject: x86/pmem: Fix platform-device leak in error path + +From: Johan Hovold + +[ Upstream commit 229e73d46994f15314f58b2d39bf952111d89193 ] + +Make sure to free the platform device in the unlikely event that +registration fails. + +Fixes: 7a67832c7e44 ("libnvdimm, e820: make CONFIG_X86_PMEM_LEGACY a tristate option") +Signed-off-by: Johan Hovold +Signed-off-by: Borislav Petkov +Link: https://lore.kernel.org/r/20220620140723.9810-1-johan@kernel.org +Signed-off-by: Sasha Levin +--- + arch/x86/kernel/pmem.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/arch/x86/kernel/pmem.c b/arch/x86/kernel/pmem.c +index 6b07faaa1579..23154d24b117 100644 +--- a/arch/x86/kernel/pmem.c ++++ b/arch/x86/kernel/pmem.c +@@ -27,6 +27,11 @@ static __init int register_e820_pmem(void) + * simply here to trigger the module to load on demand. + */ + pdev = platform_device_alloc("e820_pmem", -1); +- return platform_device_add(pdev); ++ ++ rc = platform_device_add(pdev); ++ if (rc) ++ platform_device_put(pdev); ++ ++ return rc; + } + device_initcall(register_e820_pmem); +-- +2.35.1 + diff --git a/queue-5.10/xtensa-iss-fix-handling-error-cases-in-iss_net_confi.patch b/queue-5.10/xtensa-iss-fix-handling-error-cases-in-iss_net_confi.patch new file mode 100644 index 00000000000..99fc2b652a2 --- /dev/null +++ b/queue-5.10/xtensa-iss-fix-handling-error-cases-in-iss_net_confi.patch @@ -0,0 +1,111 @@ +From 3be21a229f6b8bf7b3b208fad233e273f1001b99 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jul 2022 10:32:29 +0800 +Subject: xtensa: iss: fix handling error cases in iss_net_configure() + +From: Yang Yingliang + +[ Upstream commit 628ccfc8f5f79dd548319408fcc53949fe97b258 ] + +The 'pdev' and 'netdev' need to be released in error cases of +iss_net_configure(). + +Change the return type of iss_net_configure() to void, because it's +not used. + +Fixes: 7282bee78798 ("[PATCH] xtensa: Architecture support for Tensilica Xtensa Part 8") +Reported-by: Hulk Robot +Signed-off-by: Yang Yingliang +Signed-off-by: Max Filippov +Signed-off-by: Sasha Levin +--- + arch/xtensa/platforms/iss/network.c | 32 ++++++++++++++--------------- + 1 file changed, 15 insertions(+), 17 deletions(-) + +diff --git a/arch/xtensa/platforms/iss/network.c b/arch/xtensa/platforms/iss/network.c +index 4801df4e73e1..08d70c868c13 100644 +--- a/arch/xtensa/platforms/iss/network.c ++++ b/arch/xtensa/platforms/iss/network.c +@@ -511,16 +511,15 @@ static void iss_net_pdev_release(struct device *dev) + free_netdev(lp->dev); + } + +-static int iss_net_configure(int index, char *init) ++static void iss_net_configure(int index, char *init) + { + struct net_device *dev; + struct iss_net_private *lp; +- int err; + + dev = alloc_etherdev(sizeof(*lp)); + if (dev == NULL) { + pr_err("eth_configure: failed to allocate device\n"); +- return 1; ++ return; + } + + /* Initialize private element. */ +@@ -549,7 +548,7 @@ static int iss_net_configure(int index, char *init) + if (!tuntap_probe(lp, index, init)) { + pr_err("%s: invalid arguments. Skipping device!\n", + dev->name); +- goto errout; ++ goto err_free_netdev; + } + + pr_info("Netdevice %d (%pM)\n", index, dev->dev_addr); +@@ -557,7 +556,8 @@ static int iss_net_configure(int index, char *init) + /* sysfs register */ + + if (!driver_registered) { +- platform_driver_register(&iss_net_driver); ++ if (platform_driver_register(&iss_net_driver)) ++ goto err_free_netdev; + driver_registered = 1; + } + +@@ -568,7 +568,8 @@ static int iss_net_configure(int index, char *init) + lp->pdev.id = index; + lp->pdev.name = DRIVER_NAME; + lp->pdev.dev.release = iss_net_pdev_release; +- platform_device_register(&lp->pdev); ++ if (platform_device_register(&lp->pdev)) ++ goto err_free_netdev; + SET_NETDEV_DEV(dev, &lp->pdev.dev); + + dev->netdev_ops = &iss_netdev_ops; +@@ -577,23 +578,20 @@ static int iss_net_configure(int index, char *init) + dev->irq = -1; + + rtnl_lock(); +- err = register_netdevice(dev); +- rtnl_unlock(); +- +- if (err) { ++ if (register_netdevice(dev)) { ++ rtnl_unlock(); + pr_err("%s: error registering net device!\n", dev->name); +- /* XXX: should we call ->remove() here? */ +- free_netdev(dev); +- return 1; ++ platform_device_unregister(&lp->pdev); ++ return; + } ++ rtnl_unlock(); + + timer_setup(&lp->tl, iss_net_user_timer_expire, 0); + +- return 0; ++ return; + +-errout: +- /* FIXME: unregister; free, etc.. */ +- return -EIO; ++err_free_netdev: ++ free_netdev(dev); + } + + /* ------------------------------------------------------------------------- */ +-- +2.35.1 + diff --git a/queue-5.10/xtensa-iss-network-provide-release-callback.patch b/queue-5.10/xtensa-iss-network-provide-release-callback.patch new file mode 100644 index 00000000000..200dac7066d --- /dev/null +++ b/queue-5.10/xtensa-iss-network-provide-release-callback.patch @@ -0,0 +1,50 @@ +From f24ffe2ac8761db919b4f9f1a902f142c8e666d8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jul 2022 00:23:16 -0700 +Subject: xtensa: iss/network: provide release() callback + +From: Max Filippov + +[ Upstream commit 8864fb8359682912ee99235db7db916733a1fd7b ] + +Provide release() callback for the platform device embedded into struct +iss_net_private and registered in the iss_net_configure so that +platform_device_unregister could be called for it. + +Signed-off-by: Max Filippov +Signed-off-by: Sasha Levin +--- + arch/xtensa/platforms/iss/network.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/arch/xtensa/platforms/iss/network.c b/arch/xtensa/platforms/iss/network.c +index 4986226a5ab2..4801df4e73e1 100644 +--- a/arch/xtensa/platforms/iss/network.c ++++ b/arch/xtensa/platforms/iss/network.c +@@ -502,6 +502,15 @@ static const struct net_device_ops iss_netdev_ops = { + .ndo_set_rx_mode = iss_net_set_multicast_list, + }; + ++static void iss_net_pdev_release(struct device *dev) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct iss_net_private *lp = ++ container_of(pdev, struct iss_net_private, pdev); ++ ++ free_netdev(lp->dev); ++} ++ + static int iss_net_configure(int index, char *init) + { + struct net_device *dev; +@@ -558,6 +567,7 @@ static int iss_net_configure(int index, char *init) + + lp->pdev.id = index; + lp->pdev.name = DRIVER_NAME; ++ lp->pdev.dev.release = iss_net_pdev_release; + platform_device_register(&lp->pdev); + SET_NETDEV_DEV(dev, &lp->pdev.dev); + +-- +2.35.1 + -- 2.47.3