]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.10
authorSasha Levin <sashal@kernel.org>
Sat, 13 Aug 2022 20:26:03 +0000 (16:26 -0400)
committerSasha Levin <sashal@kernel.org>
Sat, 13 Aug 2022 20:26:03 +0000 (16:26 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
376 files changed:
queue-5.10/acpi-apei-fix-_einj-vs-efi_memory_sp.patch [new file with mode: 0644]
queue-5.10/acpi-ec-drop-the-ec_flags_ignore_dsdt_gpe-quirk.patch [new file with mode: 0644]
queue-5.10/acpi-ec-remove-duplicate-thinkpad-x1-carbon-6th-entr.patch [new file with mode: 0644]
queue-5.10/acpi-lpss-fix-missing-check-in-register_device_clock.patch [new file with mode: 0644]
queue-5.10/acpi-pm-save-nvs-memory-for-lenovo-g40-45.patch [new file with mode: 0644]
queue-5.10/acpi-processor-idle-annotate-more-functions-to-live-.patch [new file with mode: 0644]
queue-5.10/arm-bcm-fix-refcount-leak-in-bcm_kona_smc_init.patch [new file with mode: 0644]
queue-5.10/arm-dts-ast2500-evb-fix-board-compatible.patch [new file with mode: 0644]
queue-5.10/arm-dts-ast2600-evb-fix-board-compatible.patch [new file with mode: 0644]
queue-5.10/arm-dts-bcm5301x-add-dt-for-meraki-mr26.patch [new file with mode: 0644]
queue-5.10/arm-dts-imx6ul-add-missing-properties-for-sram.patch [new file with mode: 0644]
queue-5.10/arm-dts-imx6ul-change-operating-points-to-uint32-mat.patch [new file with mode: 0644]
queue-5.10/arm-dts-imx6ul-fix-csi-node-compatible.patch [new file with mode: 0644]
queue-5.10/arm-dts-imx6ul-fix-keypad-compatible.patch [new file with mode: 0644]
queue-5.10/arm-dts-imx6ul-fix-lcdif-node-compatible.patch [new file with mode: 0644]
queue-5.10/arm-dts-imx6ul-fix-qspi-node-compatible.patch [new file with mode: 0644]
queue-5.10/arm-dts-imx7d-colibri-emmc-add-cpu1-supply.patch [new file with mode: 0644]
queue-5.10/arm-dts-qcom-mdm9615-add-missing-pmic-gpio-reg.patch [new file with mode: 0644]
queue-5.10/arm-dts-qcom-pm8841-add-required-thermal-sensor-cell.patch [new file with mode: 0644]
queue-5.10/arm-findbit-fix-overflowing-offset.patch [new file with mode: 0644]
queue-5.10/arm-omap2-display-fix-refcount-leak-bug.patch [new file with mode: 0644]
queue-5.10/arm-omap2-fix-refcount-leak-in-omap3xxx_prm_late_ini.patch [new file with mode: 0644]
queue-5.10/arm-omap2-fix-refcount-leak-in-omapdss_init_of.patch [new file with mode: 0644]
queue-5.10/arm-shmobile-rcar-gen2-increase-refcount-for-new-ref.patch [new file with mode: 0644]
queue-5.10/arm64-cpufeature-allow-different-pmu-versions-in-id_.patch [new file with mode: 0644]
queue-5.10/arm64-do-not-forget-syscall-when-starting-a-new-thre.patch [new file with mode: 0644]
queue-5.10/arm64-dts-allwinner-a64-orangepi-win-fix-led-node-na.patch [new file with mode: 0644]
queue-5.10/arm64-dts-mt7622-fix-bpi-r64-wps-button.patch [new file with mode: 0644]
queue-5.10/arm64-dts-qcom-ipq8074-fix-nand-node-name.patch [new file with mode: 0644]
queue-5.10/arm64-dts-qcom-msm8916-fix-typo-in-pronto-remoteproc.patch [new file with mode: 0644]
queue-5.10/arm64-dts-qcom-msm8916-use-power-domains-for-mss-wcn.patch [new file with mode: 0644]
queue-5.10/arm64-dts-qcom-qcs404-fix-incorrect-usb2-phys-assign.patch [new file with mode: 0644]
queue-5.10/arm64-dts-renesas-beacon-fix-regulator-node-names.patch [new file with mode: 0644]
queue-5.10/arm64-dts-renesas-fix-thermal-sensors-on-single-zone.patch [new file with mode: 0644]
queue-5.10/arm64-fix-oops-in-concurrently-setting-insn_emulatio.patch [new file with mode: 0644]
queue-5.10/arm64-tegra-fix-sdmmc1-cd-on-p2888.patch [new file with mode: 0644]
queue-5.10/asoc-audio-graph-card-add-of_node_put-in-fail-path.patch [new file with mode: 0644]
queue-5.10/asoc-codecs-da7210-add-check-for-i2c_add_driver.patch [new file with mode: 0644]
queue-5.10/asoc-codecs-msm8916-wcd-digital-move-gains-from-sx_t.patch [new file with mode: 0644]
queue-5.10/asoc-codecs-wcd9335-move-gains-from-sx_tlv-to-s8_tlv.patch [new file with mode: 0644]
queue-5.10/asoc-cros_ec_codec-fix-refcount-leak-in-cros_ec_code.patch [new file with mode: 0644]
queue-5.10/asoc-fsl_easrc-use-snd_pcm_format_t-type-for-sample_.patch [new file with mode: 0644]
queue-5.10/asoc-mchp-spdifrx-disable-end-of-block-interrupt-on-.patch [new file with mode: 0644]
queue-5.10/asoc-mediatek-mt8173-fix-refcount-leak-in-mt8173_rt5.patch [new file with mode: 0644]
queue-5.10/asoc-mediatek-mt8173-rt5650-fix-refcount-leak-in-mt8.patch [new file with mode: 0644]
queue-5.10/asoc-mt6797-mt6351-fix-refcount-leak-in-mt6797_mt635.patch [new file with mode: 0644]
queue-5.10/asoc-qcom-fix-missing-of_node_put-in-asoc_qcom_lpass.patch [new file with mode: 0644]
queue-5.10/asoc-qcom-q6dsp-fix-an-off-by-one-in-q6adm_alloc_cop.patch [new file with mode: 0644]
queue-5.10/asoc-samsung-change-gpiod_speaker_power-and-rx1950_a.patch [new file with mode: 0644]
queue-5.10/asoc-samsung-fix-error-handling-in-aries_audio_probe.patch [new file with mode: 0644]
queue-5.10/asoc-samsung-h1940_uda1380-include-proepr-gpio-consu.patch [new file with mode: 0644]
queue-5.10/ath10k-do-not-enforce-interrupt-trigger-type.patch [new file with mode: 0644]
queue-5.10/ath11k-fix-incorrect-debug_mask-mappings.patch [new file with mode: 0644]
queue-5.10/ath11k-fix-netdev-open-race.patch [new file with mode: 0644]
queue-5.10/ath9k-fix-use-after-free-in-ath9k_hif_usb_rx_cb.patch [new file with mode: 0644]
queue-5.10/blk-mq-don-t-create-hctx-debugfs-dir-until-q-debugfs.patch [new file with mode: 0644]
queue-5.10/blktrace-trace-remapped-requests-correctly.patch [new file with mode: 0644]
queue-5.10/block-fix-infinite-loop-for-invalid-zone-append.patch [new file with mode: 0644]
queue-5.10/block-remove-the-request_queue-to-argument-request-b.patch [new file with mode: 0644]
queue-5.10/bluetooth-hci_intel-add-check-for-platform_driver_re.patch [new file with mode: 0644]
queue-5.10/bpf-fix-subprog-names-in-stack-traces.patch [new file with mode: 0644]
queue-5.10/bus-hisi_lpc-fix-missing-platform_device_put-in-hisi.patch [new file with mode: 0644]
queue-5.10/can-error-specify-the-values-of-data-5.7-of-can-erro.patch [new file with mode: 0644]
queue-5.10/can-hi311x-do-not-report-txerr-and-rxerr-during-bus-.patch [new file with mode: 0644]
queue-5.10/can-kvaser_usb_hydra-do-not-report-txerr-and-rxerr-d.patch [new file with mode: 0644]
queue-5.10/can-kvaser_usb_leaf-do-not-report-txerr-and-rxerr-du.patch [new file with mode: 0644]
queue-5.10/can-pch_can-do-not-report-txerr-and-rxerr-during-bus.patch [new file with mode: 0644]
queue-5.10/can-pch_can-pch_can_error-initialize-errc-before-usi.patch [new file with mode: 0644]
queue-5.10/can-rcar_can-do-not-report-txerr-and-rxerr-during-bu.patch [new file with mode: 0644]
queue-5.10/can-sja1000-do-not-report-txerr-and-rxerr-during-bus.patch [new file with mode: 0644]
queue-5.10/can-sun4i_can-do-not-report-txerr-and-rxerr-during-b.patch [new file with mode: 0644]
queue-5.10/can-usb_8dev-do-not-report-txerr-and-rxerr-during-bu.patch [new file with mode: 0644]
queue-5.10/clk-mediatek-reset-fix-written-reset-bit-offset.patch [new file with mode: 0644]
queue-5.10/clk-qcom-camcc-sdm845-fix-topology-around-titan_top-.patch [new file with mode: 0644]
queue-5.10/clk-qcom-clk-krait-unlock-spin-after-mux-completion.patch [new file with mode: 0644]
queue-5.10/clk-qcom-gcc-msm8939-add-missing-system_mm_noc_bfdcd.patch [new file with mode: 0644]
queue-5.10/clk-qcom-gcc-msm8939-add-missing-system_mm_noc_bfdcd.patch-4005 [new file with mode: 0644]
queue-5.10/clk-qcom-gcc-msm8939-fix-bimc_ddr_clk_src-rcgr-base-.patch [new file with mode: 0644]
queue-5.10/clk-qcom-gcc-msm8939-fix-weird-field-spacing-in-ftbl.patch [new file with mode: 0644]
queue-5.10/clk-qcom-gcc-msm8939-point-mm-peripherals-to-system_.patch [new file with mode: 0644]
queue-5.10/clk-qcom-ipq8074-fix-nss-core-pll-s.patch [new file with mode: 0644]
queue-5.10/clk-qcom-ipq8074-fix-nss-port-frequency-tables.patch [new file with mode: 0644]
queue-5.10/clk-qcom-ipq8074-set-branch_halt_delay-flag-for-ubi-.patch [new file with mode: 0644]
queue-5.10/clk-qcom-ipq8074-sw-workaround-for-ubi32-pll-lock.patch [new file with mode: 0644]
queue-5.10/clk-renesas-r9a06g032-fix-uart-clkgrp-bitsel.patch [new file with mode: 0644]
queue-5.10/cpufreq-zynq-fix-refcount-leak-in-zynq_get_revision.patch [new file with mode: 0644]
queue-5.10/crypto-arm64-gcm-select-aead-for-ghash_arm64_ce.patch [new file with mode: 0644]
queue-5.10/crypto-ccp-during-shutdown-check-sev-data-pointer-be.patch [new file with mode: 0644]
queue-5.10/crypto-hisilicon-hpre-don-t-use-gfp_kernel-to-alloc-.patch [new file with mode: 0644]
queue-5.10/crypto-hisilicon-kunpeng916-crypto-driver-don-t-slee.patch [new file with mode: 0644]
queue-5.10/crypto-hisilicon-sec-don-t-sleep-when-in-softirq.patch [new file with mode: 0644]
queue-5.10/crypto-hisilicon-sec-fix-auth-key-size-error.patch [new file with mode: 0644]
queue-5.10/crypto-hisilicon-sec-fixes-some-coding-style.patch [new file with mode: 0644]
queue-5.10/crypto-inside-secure-add-missing-module_device_table.patch [new file with mode: 0644]
queue-5.10/crypto-sun8i-ss-do-not-allocate-memory-when-handling.patch [new file with mode: 0644]
queue-5.10/crypto-sun8i-ss-fix-error-codes-in-allocate_flows.patch [new file with mode: 0644]
queue-5.10/crypto-sun8i-ss-fix-infinite-loop-in-sun8i_ss_setup_.patch [new file with mode: 0644]
queue-5.10/dccp-put-dccp_qpolicy_full-and-dccp_qpolicy_push-in-.patch [new file with mode: 0644]
queue-5.10/dm-return-early-from-dm_pr_call-if-dm-device-is-susp.patch [new file with mode: 0644]
queue-5.10/dmaengine-dw-edma-fix-edma-rd-wr-channels-and-dma-di.patch [new file with mode: 0644]
queue-5.10/dmaengine-sf-pdma-add-multithread-support-for-a-dma-.patch [new file with mode: 0644]
queue-5.10/dmaengine-sf-pdma-apply-proper-spinlock-flags-in-sf_.patch [new file with mode: 0644]
queue-5.10/driver-core-fix-potential-deadlock-in-__driver_attac.patch [new file with mode: 0644]
queue-5.10/drivers-perf-arm_spe-fix-consistency-of-sys_pmscr_el.patch [new file with mode: 0644]
queue-5.10/drm-adv7511-override-i2c-address-of-cec-before-acces.patch [new file with mode: 0644]
queue-5.10/drm-bridge-adv7511-add-check-for-mipi_dsi_driver_reg.patch [new file with mode: 0644]
queue-5.10/drm-bridge-sii8620-fix-possible-off-by-one.patch [new file with mode: 0644]
queue-5.10/drm-bridge-tc358767-make-sure-refclk-clock-are-enabl.patch [new file with mode: 0644]
queue-5.10/drm-bridge-tc358767-move-e-dp-bridge-endpoint-parsin.patch [new file with mode: 0644]
queue-5.10/drm-exynos-exynos7_drm_decon-free-resources-when-clk.patch [new file with mode: 0644]
queue-5.10/drm-mcde-fix-refcount-leak-in-mcde_dsi_bind.patch [new file with mode: 0644]
queue-5.10/drm-mediatek-add-pull-down-mipi-operation-in-mtk_dsi.patch [new file with mode: 0644]
queue-5.10/drm-mediatek-dpi-only-enable-dpi-after-the-bridge-is.patch [new file with mode: 0644]
queue-5.10/drm-mediatek-dpi-remove-output-format-of-yuv.patch [new file with mode: 0644]
queue-5.10/drm-mediatek-modify-dsi-funcs-to-atomic-operations.patch [new file with mode: 0644]
queue-5.10/drm-mediatek-separate-poweron-poweroff-from-enable-d.patch [new file with mode: 0644]
queue-5.10/drm-mipi-dbi-align-max_chunk-to-2-in-spi_transfer.patch [new file with mode: 0644]
queue-5.10/drm-msm-hdmi-enable-core-vcc-core-vdda-supply-for-89.patch [new file with mode: 0644]
queue-5.10/drm-msm-mdp5-fix-global-state-lock-backoff.patch [new file with mode: 0644]
queue-5.10/drm-radeon-fix-incorrrect-spdx-license-identifiers.patch [new file with mode: 0644]
queue-5.10/drm-radeon-fix-potential-buffer-overflow-in-ni_set_m.patch [new file with mode: 0644]
queue-5.10/drm-rockchip-fix-an-error-handling-path-rockchip_dp_.patch [new file with mode: 0644]
queue-5.10/drm-rockchip-vop-don-t-crash-for-invalid-duplicate_s.patch [new file with mode: 0644]
queue-5.10/drm-st7735r-fix-module-autoloading-for-okaya-rh12812.patch [new file with mode: 0644]
queue-5.10/drm-vc4-drv-remove-the-dsi-pointer-in-vc4_drv.patch [new file with mode: 0644]
queue-5.10/drm-vc4-dsi-add-correct-stop-condition-to-vc4_dsi_en.patch [new file with mode: 0644]
queue-5.10/drm-vc4-dsi-correct-dsi-divider-calculations.patch [new file with mode: 0644]
queue-5.10/drm-vc4-dsi-correct-pixel-order-for-dsi0.patch [new file with mode: 0644]
queue-5.10/drm-vc4-dsi-fix-dsi0-interrupt-support.patch [new file with mode: 0644]
queue-5.10/drm-vc4-dsi-introduce-a-variant-structure.patch [new file with mode: 0644]
queue-5.10/drm-vc4-dsi-register-dsi0-as-the-correct-vc4-encoder.patch [new file with mode: 0644]
queue-5.10/drm-vc4-dsi-use-snprintf-for-the-phy-clocks-instead-.patch [new file with mode: 0644]
queue-5.10/drm-vc4-hdmi-avoid-full-hdmi-audio-fifo-writes.patch [new file with mode: 0644]
queue-5.10/drm-vc4-hdmi-correct-hdmi-timing-registers-for-inter.patch [new file with mode: 0644]
queue-5.10/drm-vc4-hdmi-create-a-custom-connector-state.patch [new file with mode: 0644]
queue-5.10/drm-vc4-hdmi-don-t-access-the-connector-state-in-res.patch [new file with mode: 0644]
queue-5.10/drm-vc4-hdmi-fix-timings-for-interlaced-modes.patch [new file with mode: 0644]
queue-5.10/drm-vc4-hdmi-limit-the-bcm2711-to-the-max-without-sc.patch [new file with mode: 0644]
queue-5.10/drm-vc4-hdmi-remove-firmware-logic-for-mai-threshold.patch [new file with mode: 0644]
queue-5.10/drm-vc4-plane-fix-margin-calculations-for-the-right-.patch [new file with mode: 0644]
queue-5.10/drm-vc4-plane-remove-subpixel-positioning-check.patch [new file with mode: 0644]
queue-5.10/dt-bindings-update-qcom-usb-subsystem-maintainer-inf.patch [new file with mode: 0644]
queue-5.10/eeprom-idt_89hpesx-uninitialized-data-in-idt_dbgfs_c.patch [new file with mode: 0644]
queue-5.10/erofs-avoid-consecutive-detection-for-highmem-memory.patch [new file with mode: 0644]
queue-5.10/ext2-add-more-validity-checks-for-inode-counts.patch [new file with mode: 0644]
queue-5.10/ext4-recover-csum-seed-of-tmp_inode-after-migrating-.patch [new file with mode: 0644]
queue-5.10/f2fs-don-t-set-gc_failure_pin-for-background-gc.patch [new file with mode: 0644]
queue-5.10/f2fs-fix-to-remove-f2fs_compr_fl-and-tag-f2fs_nocomp.patch [new file with mode: 0644]
queue-5.10/f2fs-write-checkpoint-during-fg_gc.patch [new file with mode: 0644]
queue-5.10/firmware-tegra-fix-error-check-return-value-of-debug.patch [new file with mode: 0644]
queue-5.10/fpga-altera-pr-ip-fix-unsigned-comparison-with-less-.patch [new file with mode: 0644]
queue-5.10/fs-check-fmode_lseek-to-control-internal-pipe-splici.patch [new file with mode: 0644]
queue-5.10/fuse-remove-the-control-interface-for-virtio-fs.patch [new file with mode: 0644]
queue-5.10/genelf-use-have_libcrypto_support-not-the-never-defi.patch [new file with mode: 0644]
queue-5.10/genirq-don-t-return-error-on-missing-optional-irq_re.patch [new file with mode: 0644]
queue-5.10/genirq-generic_irq_ipi-depends-on-smp.patch [new file with mode: 0644]
queue-5.10/gpio-gpiolib-of-fix-refcount-bugs-in-of_mm_gpiochip_.patch [new file with mode: 0644]
queue-5.10/hexagon-select-arch_want_ld_orphan_warn.patch [new file with mode: 0644]
queue-5.10/hid-alps-declare-u1_unicorn_legacy-support.patch [new file with mode: 0644]
queue-5.10/hid-cp2112-prevent-a-buffer-overflow-in-cp2112_xfer.patch [new file with mode: 0644]
queue-5.10/hid-mcp2221-prevent-a-buffer-overflow-in-mcp_smbus_w.patch [new file with mode: 0644]
queue-5.10/hinic-use-the-bitmap-api-when-applicable.patch [new file with mode: 0644]
queue-5.10/hwmon-drivetemp-add-module-alias.patch [new file with mode: 0644]
queue-5.10/hwmon-sht15-fix-wrong-assumptions-in-device-remove-c.patch [new file with mode: 0644]
queue-5.10/i2c-cadence-support-pec-for-smbus-block-read.patch [new file with mode: 0644]
queue-5.10/i2c-fix-a-potential-use-after-free.patch [new file with mode: 0644]
queue-5.10/i2c-mux-gpmux-add-of_node_put-when-breaking-out-of-l.patch [new file with mode: 0644]
queue-5.10/i2c-npcm-correct-slave-role-behavior.patch [new file with mode: 0644]
queue-5.10/i2c-npcm-remove-own-slave-addresses-2-10.patch [new file with mode: 0644]
queue-5.10/iavf-fix-max_rate-limiting.patch [new file with mode: 0644]
queue-5.10/iio-accel-bma400-fix-the-scale-min-and-max-macro-val.patch [new file with mode: 0644]
queue-5.10/iio-accel-bma400-reordering-of-header-files.patch [new file with mode: 0644]
queue-5.10/inet-add-read_once-sk-sk_bound_dev_if-in-inet_match.patch [new file with mode: 0644]
queue-5.10/input-atmel_mxt_ts-fix-up-inverted-reset-handler.patch [new file with mode: 0644]
queue-5.10/intel_th-fix-a-resource-leak-in-an-error-handling-pa.patch [new file with mode: 0644]
queue-5.10/intel_th-msu-fix-vmalloced-buffers.patch [new file with mode: 0644]
queue-5.10/intel_th-msu-sink-potential-dereference-of-null-poin.patch [new file with mode: 0644]
queue-5.10/interconnect-imx-fix-max_node_id.patch [new file with mode: 0644]
queue-5.10/iommu-arm-smmu-qcom_iommu-add-of_node_put-when-break.patch [new file with mode: 0644]
queue-5.10/iommu-exynos-handle-failed-iommu-device-registration.patch [new file with mode: 0644]
queue-5.10/ipv6-add-read_once-sk-sk_bound_dev_if-in-inet6_match.patch [new file with mode: 0644]
queue-5.10/irqchip-mips-gic-check-the-return-value-of-ioremap-i.patch [new file with mode: 0644]
queue-5.10/irqchip-mips-gic-only-register-ipi-domain-when-smp-i.patch [new file with mode: 0644]
queue-5.10/jbd2-fix-assertion-jh-b_frozen_data-null-failure-whe.patch [new file with mode: 0644]
queue-5.10/jbd2-fix-outstanding-credits-assert-in-jbd2_journal_.patch [new file with mode: 0644]
queue-5.10/kfifo-fix-kfifo_to_user-return-type.patch [new file with mode: 0644]
queue-5.10/kprobes-forbid-probing-on-trampoline-and-bpf-code-ar.patch [new file with mode: 0644]
queue-5.10/kvm-arm64-don-t-return-from-void-function.patch [new file with mode: 0644]
queue-5.10/kvm-don-t-set-accessed-dirty-bits-for-zero_page.patch [new file with mode: 0644]
queue-5.10/kvm-s390-pv-leak-the-topmost-page-table-when-destroy.patch [new file with mode: 0644]
queue-5.10/lib-bitmap-order-includes-alphabetically.patch [new file with mode: 0644]
queue-5.10/lib-bitmap-provide-devm_bitmap_alloc-and-devm_bitmap.patch [new file with mode: 0644]
queue-5.10/lib-smp_processor_id-fix-imbalanced-instrumentation_.patch [new file with mode: 0644]
queue-5.10/libbpf-fix-the-name-of-a-reused-map.patch [new file with mode: 0644]
queue-5.10/locking-lockdep-fix-lockdep_init_map_-confusion.patch [new file with mode: 0644]
queue-5.10/media-cedrus-hevc-add-check-for-invalid-timestamp.patch [new file with mode: 0644]
queue-5.10/media-hdpvr-fix-error-value-returns-in-hdpvr_read.patch [new file with mode: 0644]
queue-5.10/media-platform-mtk-mdp-fix-mdp_ipi_comm-structure-al.patch [new file with mode: 0644]
queue-5.10/media-tw686x-fix-memory-leak-in-tw686x_video_init.patch [new file with mode: 0644]
queue-5.10/media-tw686x-register-the-irq-at-the-end-of-probe.patch [new file with mode: 0644]
queue-5.10/media-v4l2-mem2mem-prevent-pollerr-when-last_buffer_.patch [new file with mode: 0644]
queue-5.10/mediatek-mt76-mac80211-fix-missing-of_node_put-in-mt.patch [new file with mode: 0644]
queue-5.10/memstick-ms_block-fix-a-memory-leak.patch [new file with mode: 0644]
queue-5.10/memstick-ms_block-fix-some-incorrect-memory-allocati.patch [new file with mode: 0644]
queue-5.10/meson-mx-socinfo-fix-refcount-leak-in-meson_mx_socin.patch [new file with mode: 0644]
queue-5.10/mfd-max77620-fix-refcount-leak-in-max77620_initialis.patch [new file with mode: 0644]
queue-5.10/mfd-t7l66xb-drop-platform-disable-callback.patch [new file with mode: 0644]
queue-5.10/misc-rtsx-fix-an-error-handling-path-in-rtsx_pci_pro.patch [new file with mode: 0644]
queue-5.10/mm-mmap.c-fix-missing-call-to-vm_unacct_memory-in-mm.patch [new file with mode: 0644]
queue-5.10/mmc-block-add-single-read-for-4k-sector-cards.patch [new file with mode: 0644]
queue-5.10/mmc-cavium-octeon-add-of_node_put-when-breaking-out-.patch [new file with mode: 0644]
queue-5.10/mmc-cavium-thunderx-add-of_node_put-when-breaking-ou.patch [new file with mode: 0644]
queue-5.10/mmc-sdhci-of-at91-fix-set_uhs_signaling-rewriting-of.patch [new file with mode: 0644]
queue-5.10/mmc-sdhci-of-esdhc-fix-refcount-leak-in-esdhc_signal.patch [new file with mode: 0644]
queue-5.10/mt76-mt76x02u-fix-possible-memory-leak-in-__mt76x02u.patch [new file with mode: 0644]
queue-5.10/mtd-maps-fix-refcount-leak-in-ap_flash_init.patch [new file with mode: 0644]
queue-5.10/mtd-maps-fix-refcount-leak-in-of_flash_probe_versati.patch [new file with mode: 0644]
queue-5.10/mtd-partitions-fix-refcount-leak-in-parse_redboot_of.patch [new file with mode: 0644]
queue-5.10/mtd-rawnand-meson-fix-a-potential-double-free-issue.patch [new file with mode: 0644]
queue-5.10/mtd-sm_ftl-fix-deadlock-caused-by-cancel_work_sync-i.patch [new file with mode: 0644]
queue-5.10/mtd-st_spi_fsm-add-a-clk_disable_unprepare-in-.probe.patch [new file with mode: 0644]
queue-5.10/mwifiex-fix-sleep-in-atomic-context-bugs-caused-by-d.patch [new file with mode: 0644]
queue-5.10/mwifiex-ignore-btcoex-events-from-the-88w8897-firmwa.patch [new file with mode: 0644]
queue-5.10/net-allow-unbound-socket-for-packets-in-vrf-when-tcp.patch [new file with mode: 0644]
queue-5.10/net-fix-sk_wmem_schedule-and-sk_rmem_schedule-errors.patch [new file with mode: 0644]
queue-5.10/net-hinic-avoid-kernel-hung-in-hinic_get_stats64.patch [new file with mode: 0644]
queue-5.10/net-hinic-fix-bug-that-ethtool-get-wrong-stats.patch [new file with mode: 0644]
queue-5.10/net-ionic-fix-error-check-for-vlan-flags-in-ionic_se.patch [new file with mode: 0644]
queue-5.10/net-mlx5e-fix-the-value-of-mlx5e_max_rq_num_mtts.patch [new file with mode: 0644]
queue-5.10/net-mlx5e-remove-warn_on-when-trying-to-offload-an-u.patch [new file with mode: 0644]
queue-5.10/net-rose-fix-netdev-reference-changes.patch [new file with mode: 0644]
queue-5.10/netdevsim-avoid-allocation-warnings-triggered-from-u.patch [new file with mode: 0644]
queue-5.10/netfilter-nf_tables-add-rescheduling-points-during-l.patch [new file with mode: 0644]
queue-5.10/netfilter-xtables-bring-spdx-identifier-back.patch [new file with mode: 0644]
queue-5.10/nohz-full-sched-rt-fix-missed-tick-reenabling-bug-in.patch [new file with mode: 0644]
queue-5.10/null_blk-fix-ida-error-handling-in-null_add_dev.patch [new file with mode: 0644]
queue-5.10/nvme-use-command_id-instead-of-req-tag-in-trace_nvme.patch [new file with mode: 0644]
queue-5.10/opp-fix-error-check-in-dev_pm_opp_attach_genpd.patch [new file with mode: 0644]
queue-5.10/pci-dwc-add-unroll-iatu-space-support-to-dw_pcie_dis.patch [new file with mode: 0644]
queue-5.10/pci-dwc-always-enable-cdm-check-if-snps-enable-cdm-c.patch [new file with mode: 0644]
queue-5.10/pci-dwc-deallocate-epc-memory-on-dw_pcie_ep_init-err.patch [new file with mode: 0644]
queue-5.10/pci-endpoint-don-t-stop-controller-when-unbinding-en.patch [new file with mode: 0644]
queue-5.10/pci-portdrv-don-t-disable-aer-reporting-in-get_port_.patch [new file with mode: 0644]
queue-5.10/pci-qcom-set-up-rev-2.1.0-parf_phy-before-enabling-c.patch [new file with mode: 0644]
queue-5.10/pci-tegra194-fix-link-up-retry-sequence.patch [new file with mode: 0644]
queue-5.10/pci-tegra194-fix-pm-error-handling-in-tegra_pcie_con.patch [new file with mode: 0644]
queue-5.10/pci-tegra194-fix-root-port-interrupt-handling.patch [new file with mode: 0644]
queue-5.10/perf-symbol-fail-to-read-phdr-workaround.patch [new file with mode: 0644]
queue-5.10/perf-tools-fix-dso_id-inode-generation-comparison.patch [new file with mode: 0644]
queue-5.10/platform-chrome-cros_ec-always-expose-last-resume-re.patch [new file with mode: 0644]
queue-5.10/platform-olpc-fix-uninitialized-data-in-debugfs-writ.patch [new file with mode: 0644]
queue-5.10/pm-hibernate-defer-device-probing-when-resuming-from.patch [new file with mode: 0644]
queue-5.10/powerpc-32-do-not-allow-selection-of-e5500-or-e6500-.patch [new file with mode: 0644]
queue-5.10/powerpc-64s-disable-stack-variable-initialisation-fo.patch [new file with mode: 0644]
queue-5.10/powerpc-cell-axon_msi-fix-refcount-leak-in-setup_msi.patch [new file with mode: 0644]
queue-5.10/powerpc-pci-fix-phb-numbering-when-using-opal-phbid.patch [new file with mode: 0644]
queue-5.10/powerpc-pci-prefer-pci-domain-assignment-via-dt-linu.patch [new file with mode: 0644]
queue-5.10/powerpc-perf-optimize-clearing-the-pending-pmi-and-r.patch [new file with mode: 0644]
queue-5.10/powerpc-spufs-fix-refcount-leak-in-spufs_init_isolat.patch [new file with mode: 0644]
queue-5.10/powerpc-xive-fix-refcount-leak-in-xive_get_max_prio.patch [new file with mode: 0644]
queue-5.10/profiling-fix-shift-too-large-makes-kernel-panic.patch [new file with mode: 0644]
queue-5.10/pwm-ab8500-explicitly-allocate-pwm-chip-base-dynamic.patch [new file with mode: 0644]
queue-5.10/pwm-lpc18xx-sct-convert-to-devm_platform_ioremap_res.patch [new file with mode: 0644]
queue-5.10/pwm-sifive-don-t-check-the-return-code-of-pwmchip_re.patch [new file with mode: 0644]
queue-5.10/pwm-sifive-ensure-the-clk-is-enabled-exactly-once-pe.patch [new file with mode: 0644]
queue-5.10/pwm-sifive-shut-down-hardware-only-after-pwmchip_rem.patch [new file with mode: 0644]
queue-5.10/pwm-sifive-simplify-offset-calculation-for-pwmcmp-re.patch [new file with mode: 0644]
queue-5.10/rdma-hfi1-fix-potential-memory-leak-in-setup_base_ct.patch [new file with mode: 0644]
queue-5.10/rdma-hns-fix-incorrect-clearing-of-interrupt-status-.patch [new file with mode: 0644]
queue-5.10/rdma-mlx5-add-missing-check-for-return-value-in-get-.patch [new file with mode: 0644]
queue-5.10/rdma-qedr-fix-potential-memory-leak-in-__qedr_alloc_.patch [new file with mode: 0644]
queue-5.10/rdma-qedr-improve-error-logs-for-rdma_alloc_tid-erro.patch [new file with mode: 0644]
queue-5.10/rdma-rtrs-avoid-wtautological-constant-out-of-range-.patch [new file with mode: 0644]
queue-5.10/rdma-rtrs-define-min_chunk_size.patch [new file with mode: 0644]
queue-5.10/rdma-rtrs-srv-fix-modinfo-output-for-stringify.patch [new file with mode: 0644]
queue-5.10/rdma-rxe-fix-error-unwind-in-rxe_create_qp.patch [new file with mode: 0644]
queue-5.10/rdma-siw-fix-duplicated-reported-iw_cm_event_connect.patch [new file with mode: 0644]
queue-5.10/rdma-srpt-duplicate-port-name-members.patch [new file with mode: 0644]
queue-5.10/rdma-srpt-fix-a-use-after-free.patch [new file with mode: 0644]
queue-5.10/rdma-srpt-introduce-a-reference-count-in-struct-srpt.patch [new file with mode: 0644]
queue-5.10/regulator-of-fix-refcount-leak-bug-in-of_get_regulat.patch [new file with mode: 0644]
queue-5.10/regulator-qcom_smd-fix-pm8916_pldo-range.patch [new file with mode: 0644]
queue-5.10/remoteproc-k3-r5-fix-refcount-leak-in-k3_r5_cluster_.patch [new file with mode: 0644]
queue-5.10/remoteproc-qcom-wcnss-fix-handling-of-irqs.patch [new file with mode: 0644]
queue-5.10/remoteproc-sysmon-wait-for-ssctl-service-to-come-up.patch [new file with mode: 0644]
queue-5.10/rpmsg-mtk_rpmsg-fix-circular-locking-dependency.patch [new file with mode: 0644]
queue-5.10/rpmsg-qcom_smd-fix-refcount-leak-in-qcom_smd_parse_e.patch [new file with mode: 0644]
queue-5.10/s390-dump-fix-old-lowcore-virtual-vs-physical-addres.patch [new file with mode: 0644]
queue-5.10/s390-zcore-fix-race-when-reading-from-hardware-syste.patch [new file with mode: 0644]
queue-5.10/sched-cpuset-fix-dl_cpu_busy-panic-due-to-empty-cs-c.patch [new file with mode: 0644]
queue-5.10/sched-deadline-merge-dl_task_can_attach-and-dl_cpu_b.patch [new file with mode: 0644]
queue-5.10/sched-fix-the-check-of-nr_running-at-queue-wakelist.patch [new file with mode: 0644]
queue-5.10/scripts-faddr2line-fix-vmlinux-detection-on-arm64.patch [new file with mode: 0644]
queue-5.10/scsi-smartpqi-fix-dma-direction-for-raid-requests.patch [new file with mode: 0644]
queue-5.10/selftests-bpf-fix-a-test-for-snprintf-overflow.patch [new file with mode: 0644]
queue-5.10/selftests-kvm-set-rax-before-vmcall.patch [new file with mode: 0644]
queue-5.10/selftests-livepatch-better-synchronize-test_klp_call.patch [new file with mode: 0644]
queue-5.10/selftests-seccomp-fix-compile-warning-when-cc-clang.patch [new file with mode: 0644]
queue-5.10/selftests-timers-clocksource-switch-fix-passing-erro.patch [new file with mode: 0644]
queue-5.10/selftests-timers-valid-adjtimex-build-fix-for-newer-.patch [new file with mode: 0644]
queue-5.10/selftests-xsk-destroy-bpf-resources-only-when-ctx-re.patch [new file with mode: 0644]
queue-5.10/selinux-add-boundary-check-in-put_entry.patch [new file with mode: 0644]
queue-5.10/serial-8250-export-icr-access-helpers-for-internal-u.patch [new file with mode: 0644]
queue-5.10/serial-8250_dw-store-lsr-into-lsr_saved_flags-in-dw8.patch [new file with mode: 0644]
queue-5.10/serial-8250_fsl-don-t-report-fe-pe-and-oe-twice.patch [new file with mode: 0644]
queue-5.10/serial-do-not-restore-interrupt-state-in-sysrq-helpe.patch [new file with mode: 0644]
queue-5.10/series
queue-5.10/soc-amlogic-fix-refcount-leak-in-meson-secure-pwrc.c.patch [new file with mode: 0644]
queue-5.10/soc-fsl-guts-machine-variable-might-be-unset.patch [new file with mode: 0644]
queue-5.10/soc-qcom-aoss-fix-refcount-leak-in-qmp_cooling_devic.patch [new file with mode: 0644]
queue-5.10/soc-qcom-make-qcom_rpmpd-depend-on-pm.patch [new file with mode: 0644]
queue-5.10/soc-qcom-ocmem-fix-refcount-leak-in-of_get_ocmem.patch [new file with mode: 0644]
queue-5.10/soc-renesas-r8a779a0-sysc-fix-a2dp1-and-a2cv-2357-pd.patch [new file with mode: 0644]
queue-5.10/soundwire-bus_type-fix-remove-and-shutdown-support.patch [new file with mode: 0644]
queue-5.10/spi-spi-rspi-fix-pio-fallback-on-rz-platforms.patch [new file with mode: 0644]
queue-5.10/spi-synquacer-add-missing-clk_disable_unprepare.patch [new file with mode: 0644]
queue-5.10/staging-rtl8192u-fix-sleep-in-atomic-context-bug-in-.patch [new file with mode: 0644]
queue-5.10/tcp-fix-data-races-around-sysctl_tcp_l3mdev_accept.patch [new file with mode: 0644]
queue-5.10/tcp-make-retransmitted-skb-fit-into-the-send-window.patch [new file with mode: 0644]
queue-5.10/tcp-sk-sk_bound_dev_if-once-in-inet_request_bound_de.patch [new file with mode: 0644]
queue-5.10/test_bpf-fix-incorrect-netdev-features.patch [new file with mode: 0644]
queue-5.10/thermal-tools-tmon-include-pthread-and-time-headers-.patch [new file with mode: 0644]
queue-5.10/tools-thermal-fix-possible-path-truncations.patch [new file with mode: 0644]
queue-5.10/tty-n_gsm-delete-gsmtty-open-sabm-frame-when-config-.patch [new file with mode: 0644]
queue-5.10/tty-n_gsm-fix-dm-command.patch [new file with mode: 0644]
queue-5.10/tty-n_gsm-fix-missing-corner-cases-in-gsmld_poll.patch [new file with mode: 0644]
queue-5.10/tty-n_gsm-fix-non-flow-control-frames-during-mux-flo.patch [new file with mode: 0644]
queue-5.10/tty-n_gsm-fix-packet-re-transmission-without-open-co.patch [new file with mode: 0644]
queue-5.10/tty-n_gsm-fix-race-condition-in-gsmld_write.patch [new file with mode: 0644]
queue-5.10/tty-n_gsm-fix-user-open-not-possible-at-responder-un.patch [new file with mode: 0644]
queue-5.10/tty-n_gsm-fix-wrong-queuing-behavior-in-gsm_dlci_dat.patch [new file with mode: 0644]
queue-5.10/tty-n_gsm-fix-wrong-t1-retry-count-handling.patch [new file with mode: 0644]
queue-5.10/um-random-don-t-initialise-hwrng-struct-with-zero.patch [new file with mode: 0644]
queue-5.10/usb-aspeed-vhub-fix-refcount-leak-bug-in-ast_vhub_in.patch [new file with mode: 0644]
queue-5.10/usb-cdns3-change-place-of-priv_ep-assignment-in-cdns.patch [new file with mode: 0644]
queue-5.10/usb-cdns3-don-t-use-priv_dev-uninitialized-in-cdns3_.patch [new file with mode: 0644]
queue-5.10/usb-dwc3-core-deprecate-gctl.coresoftreset.patch [new file with mode: 0644]
queue-5.10/usb-dwc3-core-do-not-perform-gctl_core_softreset-dur.patch [new file with mode: 0644]
queue-5.10/usb-dwc3-qcom-fix-missing-optional-irq-warnings.patch [new file with mode: 0644]
queue-5.10/usb-gadget-tegra-xudc-fix-error-check-in-tegra_xudc_.patch [new file with mode: 0644]
queue-5.10/usb-gadget-udc-amd5536-depends-on-has_dma.patch [new file with mode: 0644]
queue-5.10/usb-host-fix-refcount-leak-in-ehci_hcd_ppc_of_probe.patch [new file with mode: 0644]
queue-5.10/usb-host-xhci-use-snprintf-in-xhci_decode_trb.patch [new file with mode: 0644]
queue-5.10/usb-ohci-nxp-fix-refcount-leak-in-ohci_hcd_nxp_probe.patch [new file with mode: 0644]
queue-5.10/usb-serial-fix-tty-port-initialized-comments.patch [new file with mode: 0644]
queue-5.10/usb-xhci-tegra-fix-error-check.patch [new file with mode: 0644]
queue-5.10/vfio-ccw-do-not-change-fsm-state-in-subchannel-event.patch [new file with mode: 0644]
queue-5.10/vfio-mdev-make-to_mdev_device-into-a-static-inline.patch [new file with mode: 0644]
queue-5.10/vfio-remove-extra-put-gets-around-vfio_device-group.patch [new file with mode: 0644]
queue-5.10/vfio-simplify-the-lifetime-logic-for-vfio_device.patch [new file with mode: 0644]
queue-5.10/vfio-split-creation-of-a-vfio_device-into-init-and-r.patch [new file with mode: 0644]
queue-5.10/video-fbdev-amba-clcd-fix-refcount-leak-bugs.patch [new file with mode: 0644]
queue-5.10/video-fbdev-arkfb-check-the-size-of-screen-before-me.patch [new file with mode: 0644]
queue-5.10/video-fbdev-arkfb-fix-a-divide-by-zero-bug-in-ark_se.patch [new file with mode: 0644]
queue-5.10/video-fbdev-s3fb-check-the-size-of-screen-before-mem.patch [new file with mode: 0644]
queue-5.10/video-fbdev-sis-fix-typos-in-sis_getmodeid.patch [new file with mode: 0644]
queue-5.10/video-fbdev-vt8623fb-check-the-size-of-screen-before.patch [new file with mode: 0644]
queue-5.10/virtio-gpu-fix-a-missing-check-to-avoid-null-derefer.patch [new file with mode: 0644]
queue-5.10/wait-fix-__wait_event_hrtimeout-for-rt-dl-tasks.patch [new file with mode: 0644]
queue-5.10/watchdog-armada_37xx_wdt-check-the-return-value-of-d.patch [new file with mode: 0644]
queue-5.10/wifi-iwlegacy-4965-fix-potential-off-by-one-overflow.patch [new file with mode: 0644]
queue-5.10/wifi-iwlwifi-mvm-fix-double-list_add-at-iwl_mvm_mac_.patch [new file with mode: 0644]
queue-5.10/wifi-libertas-fix-possible-refcount-leak-in-if_usb_p.patch [new file with mode: 0644]
queue-5.10/wifi-p54-add-missing-parentheses-in-p54_flush.patch [new file with mode: 0644]
queue-5.10/wifi-p54-fix-an-error-handling-path-in-p54spi_probe.patch [new file with mode: 0644]
queue-5.10/wifi-rtlwifi-fix-error-codes-in-rtl_debugfs_set_writ.patch [new file with mode: 0644]
queue-5.10/wifi-wil6210-debugfs-fix-info-leak-in-wil_write_file.patch [new file with mode: 0644]
queue-5.10/wifi-wil6210-debugfs-fix-uninitialized-variable-use-.patch [new file with mode: 0644]
queue-5.10/wireguard-allowedips-don-t-corrupt-stack-when-detect.patch [new file with mode: 0644]
queue-5.10/wireguard-ratelimiter-use-hrtimer-in-selftest.patch [new file with mode: 0644]
queue-5.10/x86-entry-build-thunk_-bits-only-if-config_preemptio.patch [new file with mode: 0644]
queue-5.10/x86-handle-idle-nomwait-cmdline-properly-for-x86_idl.patch [new file with mode: 0644]
queue-5.10/x86-numa-use-cpumask_available-instead-of-hardcoded-.patch [new file with mode: 0644]
queue-5.10/x86-pmem-fix-platform-device-leak-in-error-path.patch [new file with mode: 0644]
queue-5.10/xtensa-iss-fix-handling-error-cases-in-iss_net_confi.patch [new file with mode: 0644]
queue-5.10/xtensa-iss-network-provide-release-callback.patch [new file with mode: 0644]

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 (file)
index 0000000..98543ab
--- /dev/null
@@ -0,0 +1,41 @@
+From c285ecce5f21fd8f40a3aee206cbddc41c25545c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 24 Jun 2022 16:05:26 -0700
+Subject: ACPI: APEI: Fix _EINJ vs EFI_MEMORY_SP
+
+From: Dan Williams <dan.j.williams@intel.com>
+
+[ 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 <tony.luck@intel.com>
+Reported-by: Omar Avelar <omar.avelar@intel.com>
+Signed-off-by: Dan Williams <dan.j.williams@intel.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d441895
--- /dev/null
@@ -0,0 +1,211 @@
+From 97ed40de0961e864894d2c684fa66fc094dabbf3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Jun 2022 11:25:44 +0200
+Subject: ACPI: EC: Drop the EC_FLAGS_IGNORE_DSDT_GPE quirk
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+[ 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 <hdegoede@redhat.com>
+Reviewed-by: Daniel Drake <drake@endlessos.org>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d7d1b8d
--- /dev/null
@@ -0,0 +1,42 @@
+From ee75c8294a386f2c9eba4d425108d15dcff62c15 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <hdegoede@redhat.com>
+
+[ 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 <hdegoede@redhat.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..127f93f
--- /dev/null
@@ -0,0 +1,36 @@
+From 39139927d0e534e133e985d7916a0e1421d10331 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 Jun 2022 21:21:27 +0800
+Subject: ACPI: LPSS: Fix missing check in register_device_clock()
+
+From: huhai <huhai@kylinos.cn>
+
+[ Upstream commit b4f1f61ed5928b1128e60e38d0dffa16966f06dc ]
+
+register_device_clock() misses a check for platform_device_register_simple().
+Add a check to fix it.
+
+Signed-off-by: huhai <huhai@kylinos.cn>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b140bfb
--- /dev/null
@@ -0,0 +1,44 @@
+From 7b0565b1725ee9704fa44aede0ba7575eda3f6a5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 22 Jun 2022 15:42:48 +0800
+Subject: ACPI: PM: save NVS memory for Lenovo G40-45
+
+From: Manyi Li <limanyi@uniontech.com>
+
+[ 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 <limanyi@uniontech.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..5faa95f
--- /dev/null
@@ -0,0 +1,63 @@
+From 65e8165fc777328ec986f588e2b4c42bc2b8f896 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <gpiccoli@igalia.com>
+
+[ 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 <gpiccoli@igalia.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0269a98
--- /dev/null
@@ -0,0 +1,36 @@
+From afc832f198b93951f7cffeab629b8d1ee67a9da5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 May 2022 12:13:25 +0400
+Subject: ARM: bcm: Fix refcount leak in bcm_kona_smc_init
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..73f10e6
--- /dev/null
@@ -0,0 +1,35 @@
+From 63f9bf3a1bf0cee48e3312ada117e60c90836dd7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 29 May 2022 12:49:25 +0200
+Subject: ARM: dts: ast2500-evb: fix board compatible
+
+From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+
+[ 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 <krzysztof.kozlowski@linaro.org>
+Link: https://lore.kernel.org/r/20220529104928.79636-4-krzysztof.kozlowski@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f6472e1
--- /dev/null
@@ -0,0 +1,35 @@
+From c2be98a76bed88d5e4b5bc4e4a75f76e03b3d404 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 29 May 2022 12:49:26 +0200
+Subject: ARM: dts: ast2600-evb: fix board compatible
+
+From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+
+[ 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 <krzysztof.kozlowski@linaro.org>
+Link: https://lore.kernel.org/r/20220529104928.79636-5-krzysztof.kozlowski@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6a3f029
--- /dev/null
@@ -0,0 +1,260 @@
+From 480e02f5f2ad365c2db01a627dacf448bca570e4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 18 Jun 2022 00:00:29 +0200
+Subject: ARM: dts: BCM5301X: Add DT for Meraki MR26
+
+From: Christian Lamparter <chunkeey@gmail.com>
+
+[ 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 <chunkeey@gmail.com>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <chunkeey@gmail.com>
++ */
++
++/dts-v1/;
++
++#include "bcm4708.dtsi"
++#include "bcm5301x-nand-cs0-bch8.dtsi"
++#include <dt-bindings/leds/common.h>
++
++/ {
++      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 = <LED_COLOR_ID_AMBER>;
++                      gpios = <&chipcommon 13 GPIO_ACTIVE_HIGH>;
++                      panic-indicator;
++              };
++              led-1 {
++                      function = LED_FUNCTION_INDICATOR;
++                      color = <LED_COLOR_ID_WHITE>;
++                      gpios = <&chipcommon 12 GPIO_ACTIVE_HIGH>;
++              };
++      };
++
++      keys {
++              compatible = "gpio-keys";
++              #address-cells = <1>;
++              #size-cells = <0>;
++
++              key-restart {
++                      label = "Reset";
++                      linux,code = <KEY_RESTART>;
++                      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 (file)
index 0000000..e9bb523
--- /dev/null
@@ -0,0 +1,39 @@
+From 38b9449424c1dd30c73941839ac34996dd869c4b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 14:33:51 +0200
+Subject: ARM: dts: imx6ul: add missing properties for sram
+
+From: Alexander Stein <alexander.stein@ew.tq-group.com>
+
+[ 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 <alexander.stein@ew.tq-group.com>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..c57395e
--- /dev/null
@@ -0,0 +1,63 @@
+From 7cde71e3e471c0d96e0a282e456e8d42d5b04dfe Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 14:33:52 +0200
+Subject: ARM: dts: imx6ul: change operating-points to uint32-matrix
+
+From: Alexander Stein <alexander.stein@ew.tq-group.com>
+
+[ 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 <alexander.stein@ew.tq-group.com>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..faf1955
--- /dev/null
@@ -0,0 +1,40 @@
+From a8e8298d9ff7db06ff1473e4aa77fc57d2473d6c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 14:33:55 +0200
+Subject: ARM: dts: imx6ul: fix csi node compatible
+
+From: Alexander Stein <alexander.stein@ew.tq-group.com>
+
+[ 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 <alexander.stein@ew.tq-group.com>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
+                               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 (file)
index 0000000..5f363a9
--- /dev/null
@@ -0,0 +1,41 @@
+From 63104aab4a633bd88d9bc8e7ae18f94730bedfca Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 14:33:53 +0200
+Subject: ARM: dts: imx6ul: fix keypad compatible
+
+From: Alexander Stein <alexander.stein@ew.tq-group.com>
+
+[ 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 <alexander.stein@ew.tq-group.com>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
+                               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 (file)
index 0000000..d3904af
--- /dev/null
@@ -0,0 +1,42 @@
+From 10d6fb44960769a09de750d130de111c59723b28 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 14:33:56 +0200
+Subject: ARM: dts: imx6ul: fix lcdif node compatible
+
+From: Alexander Stein <alexander.stein@ew.tq-group.com>
+
+[ 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 <alexander.stein@ew.tq-group.com>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
+                               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 (file)
index 0000000..ed76a28
--- /dev/null
@@ -0,0 +1,42 @@
+From 3c51841c84feb656e6f5f71521dfde27c97b6019 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 14:33:57 +0200
+Subject: ARM: dts: imx6ul: fix qspi node compatible
+
+From: Alexander Stein <alexander.stein@ew.tq-group.com>
+
+[ 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 <alexander.stein@ew.tq-group.com>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
+-- 
+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 (file)
index 0000000..ceb071b
--- /dev/null
@@ -0,0 +1,38 @@
+From 340393f21e57109a2fedae64078137ae3016a38d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 16 May 2022 15:47:23 +0200
+Subject: ARM: dts: imx7d-colibri-emmc: add cpu1 supply
+
+From: Marcel Ziswiler <marcel.ziswiler@toradex.com>
+
+[ 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 <marcel.ziswiler@toradex.com>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 = <&reg_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 (file)
index 0000000..cbdff5a
--- /dev/null
@@ -0,0 +1,36 @@
+From e593eb8f5cbe3f4a14181fa24ba098bb85f1f1c7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 7 May 2022 21:49:12 +0200
+Subject: ARM: dts: qcom: mdm9615: add missing PMIC GPIO reg
+
+From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+
+[ 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 <krzysztof.kozlowski@linaro.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220507194913.261121-11-krzysztof.kozlowski@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..67c3081
--- /dev/null
@@ -0,0 +1,35 @@
+From 7df90eeffe574180ebbb50b3b95fd39483186456 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Jun 2022 13:27:02 +0200
+Subject: ARM: dts: qcom: pm8841: add required thermal-sensor-cells
+
+From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+
+[ 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 <krzysztof.kozlowski@linaro.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220608112702.80873-2-krzysztof.kozlowski@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9a4f8a8
--- /dev/null
@@ -0,0 +1,76 @@
+From 8250a166ede771441aff2bd5522133a4f2d73b0b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 26 Jul 2022 23:51:48 +0100
+Subject: ARM: findbit: fix overflowing offset
+
+From: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
+
+[ 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 <linux@roeck-us.net>
+Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..8b6df36
--- /dev/null
@@ -0,0 +1,36 @@
+From 547d59d3f762d56e3c6f768d20fa7c0e7bdd438e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Jun 2022 22:58:03 +0800
+Subject: ARM: OMAP2+: display: Fix refcount leak bug
+
+From: Liang He <windhl@126.com>
+
+[ 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 <windhl@126.com>
+Message-Id: <20220617145803.4050918-1-windhl@126.com>
+Signed-off-by: Tony Lindgren <tony@atomide.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..be1753e
--- /dev/null
@@ -0,0 +1,37 @@
+From 68028930adc451b9bede06ba9138960fa460afa0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 May 2022 11:37:24 +0400
+Subject: ARM: OMAP2+: Fix refcount leak in omap3xxx_prm_late_init
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Message-Id: <20220526073724.21169-1-linmq006@gmail.com>
+Signed-off-by: Tony Lindgren <tony@atomide.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0a79204
--- /dev/null
@@ -0,0 +1,45 @@
+From 52df0cbb5bfb82f5e048dbbb4e878344d3f0d74f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 1 Jun 2022 08:48:58 +0400
+Subject: ARM: OMAP2+: Fix refcount leak in omapdss_init_of
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Message-Id: <20220601044858.3352-1-linmq006@gmail.com>
+Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Tony Lindgren <tony@atomide.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..dc828a7
--- /dev/null
@@ -0,0 +1,60 @@
+From 3d326d5ecdb544e46ca5ea40cbb08c1a57d32cdb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 Jul 2022 20:18:04 +0800
+Subject: ARM: shmobile: rcar-gen2: Increase refcount for new reference
+
+From: Liang He <windhl@126.com>
+
+[ 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 <windhl@126.com>
+Link: https://lore.kernel.org/r/20220701121804.234223-1-windhl@126.com
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..92247ce
--- /dev/null
@@ -0,0 +1,61 @@
+From 1cf0f40d40e28c5668cb49d5f40f5bd4097cd006 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Jun 2022 12:13:32 +0100
+Subject: arm64: cpufeature: Allow different PMU versions in ID_DFR0_EL1
+
+From: Alexandru Elisei <alexandru.elisei@arm.com>
+
+[ 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 <alexandru.elisei@arm.com>
+Link: https://lore.kernel.org/r/20220617111332.203061-1-alexandru.elisei@arm.com
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..4c5e96b
--- /dev/null
@@ -0,0 +1,40 @@
+From b943f7216899f11cee815930a8335ec932a4a302 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Jun 2022 17:24:46 +0100
+Subject: arm64: Do not forget syscall when starting a new thread.
+
+From: Francis Laniel <flaniel@linux.microsoft.com>
+
+[ 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 <flaniel@linux.microsoft.com>
+Link: https://lore.kernel.org/r/20220608162447.666494-2-flaniel@linux.microsoft.com
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..8aed49f
--- /dev/null
@@ -0,0 +1,37 @@
+From 4b490dc39e9b0d13bfd66c1f9469a8eddfe0be06 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 2 Jul 2022 08:28:15 -0500
+Subject: arm64: dts: allwinner: a64: orangepi-win: Fix LED node name
+
+From: Samuel Holland <samuel@sholland.org>
+
+[ 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 <samuel@sholland.org>
+Reviewed-by: Jernej Skrabec <jernej.skrabec@gmail.com>
+Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
+Link: https://lore.kernel.org/r/20220702132816.46456-1-samuel@sholland.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..7f1daa8
--- /dev/null
@@ -0,0 +1,52 @@
+From 1cd9573fe1a0e56cf70ce9d42875eac47122913c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Jun 2022 13:16:57 +0200
+Subject: arm64: dts: mt7622: fix BPI-R64 WPS button
+
+From: Nick Hainke <vincent@systemli.org>
+
+[ 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 <musashino.open@gmail.com>
+Signed-off-by: Nick Hainke <vincent@systemli.org>
+Link: https://lore.kernel.org/r/20220630111746.4098-1-vincent@systemli.org
+Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 = <KEY_WPS_BUTTON>;
+-                      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 (file)
index 0000000..55dee37
--- /dev/null
@@ -0,0 +1,37 @@
+From 8af344ce313f9d6c552204009fa25761f9f62c41 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 21 Jun 2022 14:06:42 +0200
+Subject: arm64: dts: qcom: ipq8074: fix NAND node name
+
+From: Robert Marko <robimarko@gmail.com>
+
+[ 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 <robimarko@gmail.com>
+Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220621120642.518575-1-robimarko@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9c3eb29
--- /dev/null
@@ -0,0 +1,42 @@
+From 42eeda577be6ac22a01af6156f112e38f0adda79 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 May 2022 19:47:40 +0530
+Subject: arm64: dts: qcom: msm8916: Fix typo in pronto remoteproc node
+
+From: Sireesh Kodali <sireeshkodali1@gmail.com>
+
+[ 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 <sireeshkodali1@gmail.com>
+Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Reviewed-by: Stephan Gerhold <stephan@gerhold.net>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220526141740.15834-3-sireeshkodali1@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f6d9b12
--- /dev/null
@@ -0,0 +1,82 @@
+From 7780ae3f3651db602c3bd5f04a456d7c7ba995fe Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 16 Sep 2020 12:41:34 +0200
+Subject: arm64: dts: qcom: msm8916: Use power domains for MSS/WCNSS
+ remoteprocs
+
+From: Stephan Gerhold <stephan@gerhold.net>
+
+[ 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 <stephan@gerhold.net>
+Link: https://lore.kernel.org/r/20200916104135.25085-10-stephan@gerhold.net
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <dt-bindings/clock/qcom,rpmcc.h>
+ #include <dt-bindings/interconnect/qcom,msm8916.h>
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
++#include <dt-bindings/power/qcom-rpmpd.h>
+ #include <dt-bindings/reset/qcom,gcc-msm8916.h>
+ #include <dt-bindings/thermal/thermal.h>
+@@ -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 (file)
index 0000000..4f29234
--- /dev/null
@@ -0,0 +1,63 @@
+From 0cc644880969c05711acb25be10eaa797bc2f7a9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 11 Jul 2022 14:00:38 +0530
+Subject: arm64: dts: qcom: qcs404: Fix incorrect USB2 PHYs assignment
+
+From: Sumit Garg <sumit.garg@linaro.org>
+
+[ 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 <sumit.garg@linaro.org>
+Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220711083038.1518529-1-sumit.garg@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
+-                              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 = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+-                              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 (file)
index 0000000..54be027
--- /dev/null
@@ -0,0 +1,60 @@
+From aa52b2b34a2dd8c3709e9c6e58f7eebcb622013a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 11 May 2022 12:14:06 +0200
+Subject: arm64: dts: renesas: beacon: Fix regulator node names
+
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+
+[ 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 <geert+renesas@glider.be>
+Link: https://lore.kernel.org/r/a9ac82bdf108162487289d091c53a9b3de393f13.1652263918.git.geert+renesas@glider.be
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 = <&reg_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 (file)
index 0000000..9a4f1da
--- /dev/null
@@ -0,0 +1,67 @@
+From 083234ec957aa15ee8426df145efd08b09dc08bf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <geert+renesas@glider.be>
+
+[ 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 <geert+renesas@glider.be>
+Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
+Link: https://lore.kernel.org/r/28b812fdd1fc3698311fac984ab8b91d3d655c1c.1655301684.git.geert+renesas@glider.be
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..2ec53dd
--- /dev/null
@@ -0,0 +1,93 @@
+From 8d5e5292fde35b9c42eb1254ffb33c7ac8912c20 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 (张海斌) <haibinzhang@tencent.com>
+
+[ 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 <hewenliang4@huawei.com>
+Signed-off-by: hewenliang <hewenliang4@huawei.com>
+Signed-off-by: Haibin Zhang <haibinzhang@tencent.com>
+Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
+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 <will@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0268866
--- /dev/null
@@ -0,0 +1,39 @@
+From 908c1c64a25be95faca76ed414cf0614667ff8dc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <tszucs@protonmail.ch>
+
+[ 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 <tszucs@protonmail.ch>
+Signed-off-by: Thierry Reding <treding@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..62f6a30
--- /dev/null
@@ -0,0 +1,40 @@
+From c750cc4a9696d78e2f9041f16033f9635d58795c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 Jul 2022 22:43:08 +0800
+Subject: ASoC: audio-graph-card: Add of_node_put() in fail path
+
+From: Liang He <windhl@126.com>
+
+[ 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 <windhl@126.com>
+Link: https://lore.kernel.org/r/20220721144308.1301587-1-windhl@126.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..7ae30fc
--- /dev/null
@@ -0,0 +1,41 @@
+From a7566391d81349387b1be7a7871b0040e4b1de32 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 31 May 2022 17:47:12 +0800
+Subject: ASoC: codecs: da7210: add check for i2c_add_driver
+
+From: Jiasheng Jiang <jiasheng@iscas.ac.cn>
+
+[ 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 <jiasheng@iscas.ac.cn>
+Link: https://lore.kernel.org/r/20220531094712.2376759-1-jiasheng@iscas.ac.cn
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..2871de8
--- /dev/null
@@ -0,0 +1,102 @@
+From a67ae455e0867cf5c42ad41c2bd848d4d7a24c09 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <srinivas.kandagatla@linaro.org>
+
+[ 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 <srinivas.kandagatla@linaro.org>
+Link: https://lore.kernel.org/r/20220609111901.318047-2-srinivas.kandagatla@linaro.org
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..61c603e
--- /dev/null
@@ -0,0 +1,118 @@
+From df1b4b32754b79dd8a03e8e45bce9bf1abdbdcef Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 Jun 2022 12:19:01 +0100
+Subject: ASoC: codecs: wcd9335: move gains from SX_TLV to S8_TLV
+
+From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+
+[ 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 <srinivas.kandagatla@linaro.org>
+Link: https://lore.kernel.org/r/20220609111901.318047-3-srinivas.kandagatla@linaro.org
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..641f26d
--- /dev/null
@@ -0,0 +1,40 @@
+From 2fb72748aff557be4b81bd0adc7a12ff957eb8f0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Reviewed-by: Tzung-Bi Shih <tzungbi@kernel.org>
+Reviewed-by: Guenter Roeck <groeck@chromium.org>
+Link: https://lore.kernel.org/r/20220603131043.38907-1-linmq006@gmail.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..42b8f9a
--- /dev/null
@@ -0,0 +1,107 @@
+From 4a5916f27f57ad62eb33848e19dd8e5d94251a3a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <shengjiu.wang@nxp.com>
+
+[ 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 <shengjiu.wang@nxp.com>
+Link: https://lore.kernel.org/r/1658399393-28777-5-git-send-email-shengjiu.wang@nxp.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..c2aed80
--- /dev/null
@@ -0,0 +1,59 @@
+From aff74243e426718ae975dcf38cf64d14f3cb1b3c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Jul 2022 12:08:13 +0300
+Subject: ASoC: mchp-spdifrx: disable end of block interrupt on failures
+
+From: Claudiu Beznea <claudiu.beznea@microchip.com>
+
+[ 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 <claudiu.beznea@microchip.com>
+Link: https://lore.kernel.org/r/20220727090814.2446111-2-claudiu.beznea@microchip.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..bc3780f
--- /dev/null
@@ -0,0 +1,67 @@
+From 5123013829db77282320514e7fe59f6441a793ea Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Link: https://lore.kernel.org/r/20220602034144.60159-1-linmq006@gmail.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..e11a2ac
--- /dev/null
@@ -0,0 +1,67 @@
+From 4dc088c423900afb4ec6eff48319a41f8560fc20 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Link: https://lore.kernel.org/r/20220603124243.31358-1-linmq006@gmail.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..3902cdd
--- /dev/null
@@ -0,0 +1,49 @@
+From 3eba4cc5ec2e193f4cb737fe62955fe8f87b7e62 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 3 Jun 2022 12:34:15 +0400
+Subject: ASoC: mt6797-mt6351: Fix refcount leak in mt6797_mt6351_dev_probe
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Link: https://lore.kernel.org/r/20220603083417.9011-1-linmq006@gmail.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..1db64e5
--- /dev/null
@@ -0,0 +1,38 @@
+From 9ab38abacc5f816ae4b40d5fd58c3ab9bb80c4a6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <windhl@126.com>
+
+[ 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 <linmq006@gmail.com>
+Signed-off-by: Liang He <windhl@126.com>
+Link: https://lore.kernel.org/r/20220702020109.263980-1-windhl@126.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..203598e
--- /dev/null
@@ -0,0 +1,37 @@
+From 4589cb0cd1d3c783f0a557ce4634af858e9158ea Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <christophe.jaillet@wanadoo.fr>
+
+[ 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 <christophe.jaillet@wanadoo.fr>
+Link: https://lore.kernel.org/r/0fca3271649736053eb9649d87e1ca01b056be40.1658394124.git.christophe.jaillet@wanadoo.fr
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..a9bbfad
--- /dev/null
@@ -0,0 +1,52 @@
+From e50caacf70999b58e4f88ce502584c367714ddd0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <trix@redhat.com>
+
+[ 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 <trix@redhat.com>
+Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Link: https://lore.kernel.org/r/20220629185345.910406-1-trix@redhat.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d5a8c31
--- /dev/null
@@ -0,0 +1,44 @@
+From bc713fac52843ceb9698e97752ba7d3203524cde Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 3 Jun 2022 17:06:39 +0400
+Subject: ASoC: samsung: Fix error handling in aries_audio_probe
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Link: https://lore.kernel.org/r/20220603130640.37624-1-linmq006@gmail.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f4b67c3
--- /dev/null
@@ -0,0 +1,37 @@
+From 24823e8fb7204aec689a85cf4d6aab5f2ca91cbe Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 Jun 2022 16:19:00 +0200
+Subject: ASoC: samsung: h1940_uda1380: include proepr GPIO consumer header
+
+From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+
+[ 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 <krzysztof.kozlowski@linaro.org>
+Link: https://lore.kernel.org/r/20220627141900.470469-1-krzysztof.kozlowski@linaro.org
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <arnaud.patard@rtp-net.org>
+ #include <linux/types.h>
+-#include <linux/gpio.h>
++#include <linux/gpio/consumer.h>
+ #include <linux/module.h>
+ #include <sound/soc.h>
+-- 
+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 (file)
index 0000000..2036b66
--- /dev/null
@@ -0,0 +1,58 @@
+From f4277dee5fcde8b945157b06575b4cb967437eb5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 18 May 2022 10:27:26 +0300
+Subject: ath10k: do not enforce interrupt trigger type
+
+From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+
+[ 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 <krzysztof.kozlowski@linaro.org>
+Tested-by: Steev Klimaszewski <steev@kali.org>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20220513151516.357549-1-krzysztof.kozlowski@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..95f2eef
--- /dev/null
@@ -0,0 +1,45 @@
+From c0d3fc29e745dad683ad2880b2ba3271ba216c13 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 2 Jun 2022 17:26:21 +0530
+Subject: ath11k: Fix incorrect debug_mask mappings
+
+From: Manikanta Pubbisetty <quic_mpubbise@quicinc.com>
+
+[ 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 <quic_mpubbise@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20220602115621.15339-1-quic_mpubbise@quicinc.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..223851e
--- /dev/null
@@ -0,0 +1,109 @@
+From 0820183c1f15e66caaef35d7fdb4f9e6288d5100 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 22 May 2022 15:33:16 +0300
+Subject: ath11k: fix netdev open race
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+[ 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 <johan+linaro@kernel.org>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20220517103436.15867-1-johan+linaro@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6d88932
--- /dev/null
@@ -0,0 +1,94 @@
+From 9dbf7cfd80ca4894546599289b83a792023a4ca7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <paskripkin@gmail.com>
+
+[ 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
+
+<IRQ>
+...
+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 <paskripkin@gmail.com>
+Acked-by: Toke Høiland-Jørgensen <toke@toke.dk>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/d57bbedc857950659bfacac0ab48790c1eda00c8.1655145743.git.paskripkin@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..cda05e2
--- /dev/null
@@ -0,0 +1,44 @@
+From 0889d9553eeacb52795ee634966918a62e0ec4f1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <ming.lei@redhat.com>
+
+[ 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 <yi.zhang@redhat.com>
+Signed-off-by: Ming Lei <ming.lei@redhat.com>
+Tested-by: Yi Zhang <yi.zhang@redhat.com>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Link: https://lore.kernel.org/r/20220711090808.259682-1-ming.lei@redhat.com
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..e0da2f5
--- /dev/null
@@ -0,0 +1,43 @@
+From f96dd3edbca0448c46407fed76c0ea8703a3d0bf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Jul 2022 11:06:36 -0700
+Subject: blktrace: Trace remapped requests correctly
+
+From: Bart Van Assche <bvanassche@acm.org>
+
+[ 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 <junichi.nomura@nec.com>
+Cc: Mike Snitzer <snitzer@kernel.org>
+Cc: Mike Christie <michael.christie@oracle.com>
+Cc: Li Zefan <lizf@cn.fujitsu.com>
+Cc: Chaitanya Kulkarni <kch@nvidia.com>
+Fixes: 1b9a9ab78b0a ("blktrace: use op accessors")
+Signed-off-by: Bart Van Assche <bvanassche@acm.org>
+Link: https://lore.kernel.org/r/20220714180729.1065367-11-bvanassche@acm.org
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..da77f81
--- /dev/null
@@ -0,0 +1,45 @@
+From fc6eaa08f88e0042edd03856f32dfa0bace09812 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 10 Jun 2022 12:58:20 -0700
+Subject: block: fix infinite loop for invalid zone append
+
+From: Keith Busch <kbusch@kernel.org>
+
+[ 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 <kbusch@kernel.org>
+Reviewed-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
+Link: https://lore.kernel.org/r/20220610195830.3574005-2-kbusch@fb.com
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..1b0f2af
--- /dev/null
@@ -0,0 +1,388 @@
+From 046372e2f8e99a04033477e296e911672caffaeb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 3 Dec 2020 17:21:39 +0100
+Subject: block: remove the request_queue to argument request based tracepoints
+
+From: Christoph Hellwig <hch@lst.de>
+
+[ Upstream commit a54895fa057c67700270777f7661d8d3c7fda88a ]
+
+The request_queue can trivially be derived from the request.
+
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
+Acked-by: Tejun Heo <tj@kernel.org>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..83ae50c
--- /dev/null
@@ -0,0 +1,41 @@
+From a75d0858667cf8b6688427b248512bfd9f66e5ae Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 3 Jun 2022 09:24:36 +0800
+Subject: Bluetooth: hci_intel: Add check for platform_driver_register
+
+From: Jiasheng Jiang <jiasheng@iscas.ac.cn>
+
+[ 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 <jiasheng@iscas.ac.cn>
+Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..efdcba9
--- /dev/null
@@ -0,0 +1,50 @@
+From 05cfbb337182ad7e631f3031cafd9d4879d14e91 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Jul 2022 14:16:37 -0700
+Subject: bpf: Fix subprog names in stack traces.
+
+From: Alexei Starovoitov <ast@kernel.org>
+
+[ 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 <tj@kernel.org>
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
+Acked-by: Martin KaFai Lau <kafai@fb.com>
+Acked-by: Yonghong Song <yhs@fb.com>
+Link: https://lore.kernel.org/bpf/20220714211637.17150-1-alexei.starovoitov@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..c787b4e
--- /dev/null
@@ -0,0 +1,75 @@
+From c4795d87619b04902ef1ddada4a74963a6fcad9b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <yangyingliang@huawei.com>
+
+[ 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 <hulkci@huawei.com>
+Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
+Acked-by: John Garry <john.garry@huawei.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..bf3c03d
--- /dev/null
@@ -0,0 +1,49 @@
+From d841c85d591d992f42edc5007ffc92a6d431fd7a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <mailhol.vincent@wanadoo.fr>
+
+[ 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 <mailhol.vincent@wanadoo.fr>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..8acf5dd
--- /dev/null
@@ -0,0 +1,47 @@
+From 3ca5a30a701513160df237cf5c00e3314774da57 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 Jul 2022 23:35:43 +0900
+Subject: can: hi311x: do not report txerr and rxerr during bus-off
+
+From: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
+
+[ 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 <mailhol.vincent@wanadoo.fr>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ce664b2
--- /dev/null
@@ -0,0 +1,55 @@
+From 93879cca7334ea5bf63c84bf431d0b52ecb8e6f0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <mailhol.vincent@wanadoo.fr>
+
+[ 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 <extja@kvaser.com>
+Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..e35872e
--- /dev/null
@@ -0,0 +1,42 @@
+From b2b79b51ab0b543d04e7846dfe00f65404fcdfae Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <mailhol.vincent@wanadoo.fr>
+
+[ 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 <extja@kvaser.com>
+Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6d02349
--- /dev/null
@@ -0,0 +1,48 @@
+From 8c40125e1217a463af2013b68a31a25c34b66116 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <mailhol.vincent@wanadoo.fr>
+
+[ 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 <mailhol.vincent@wanadoo.fr>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b735d14
--- /dev/null
@@ -0,0 +1,58 @@
+From 01425c18f64221d2946f90167b650911c2d655dc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 22 Jul 2022 01:00:32 +0900
+Subject: can: pch_can: pch_can_error(): initialize errc before using it
+
+From: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
+
+[ 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 <nathan@kernel.org>
+Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
+Reviewed-by: Nathan Chancellor <nathan@kernel.org>
+Link: https://lore.kernel.org/all/20220721160032.9348-1-mailhol.vincent@wanadoo.fr
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..3306e35
--- /dev/null
@@ -0,0 +1,51 @@
+From 4cb674c4fd2afbab78f3f329d20fe4701f8ea269 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <mailhol.vincent@wanadoo.fr>
+
+[ 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 <mailhol.vincent@wanadoo.fr>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..35d0830
--- /dev/null
@@ -0,0 +1,49 @@
+From aa13a261918c38a34a118fe21dfb3e64172ab516 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 Jul 2022 23:35:41 +0900
+Subject: can: sja1000: do not report txerr and rxerr during bus-off
+
+From: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
+
+[ 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 <mailhol.vincent@wanadoo.fr>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..da19c67
--- /dev/null
@@ -0,0 +1,52 @@
+From 00f921cc0eaf01fbf820d8bf3fb2adf5105f03b6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <mailhol.vincent@wanadoo.fr>
+
+[ 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 <wens@csie.org>
+Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..8281dc1
--- /dev/null
@@ -0,0 +1,42 @@
+From 5cc733ac9b74834d12a7d61edde9cbd09f8b728b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <mailhol.vincent@wanadoo.fr>
+
+[ 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 <mailhol.vincent@wanadoo.fr>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..811f5a9
--- /dev/null
@@ -0,0 +1,56 @@
+From ea0c3213fc1ff8a35cb0a2d2d262511cb5101ea2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <rex-bc.chen@mediatek.com>
+
+[ 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 <rex-bc.chen@mediatek.com>
+Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
+Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Reviewed-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>
+Tested-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>
+Link: https://lore.kernel.org/r/20220523093346.28493-3-rex-bc.chen@mediatek.com
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..8534403
--- /dev/null
@@ -0,0 +1,55 @@
+From ab85af06dfcb9fc69bd7dc17f0f554c926af2f78 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 20 May 2022 00:41:32 +0300
+Subject: clk: qcom: camcc-sdm845: Fix topology around titan_top power domain
+
+From: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
+
+[ 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 <vladimir.zapolskiy@linaro.org>
+Reviewed-by: Robert Foss <robert.foss@linaro.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220519214133.1728979-2-vladimir.zapolskiy@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6b0211e
--- /dev/null
@@ -0,0 +1,47 @@
+From 5501141bbc10054fe6af4edb764cd0eba21bb068 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 30 Apr 2022 07:44:57 +0200
+Subject: clk: qcom: clk-krait: unlock spin after mux completion
+
+From: Ansuel Smith <ansuelsmth@gmail.com>
+
+[ 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 <ansuelsmth@gmail.com>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220430054458.31321-3-ansuelsmth@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..03aa34b
--- /dev/null
@@ -0,0 +1,42 @@
+From 65cf2355e440f7257fd0ffbb8e7b054eedaf348e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <bryan.odonoghue@linaro.org>
+
+[ 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 <robh+dt@kernel.org>
+Cc: Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>
+Cc: devicetree@vger.kernel.org
+Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220504163835.40130-2-bryan.odonoghue@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..466740b
--- /dev/null
@@ -0,0 +1,61 @@
+From 4be4cb7df713f26247be0136c20287eb52f8a2ee Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <bryan.odonoghue@linaro.org>
+
+[ 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 <bryan.odonoghue@linaro.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220504163835.40130-4-bryan.odonoghue@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b86c325
--- /dev/null
@@ -0,0 +1,37 @@
+From 52dcd10dcd4eb5864d3e950092dafc5b44023f24 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <bryan.odonoghue@linaro.org>
+
+[ 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 <bryan.odonoghue@linaro.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220504163835.40130-3-bryan.odonoghue@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d875e95
--- /dev/null
@@ -0,0 +1,39 @@
+From 8977a56562943cea2d507d14206b6d9654c3e3e0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <bryan.odonoghue@linaro.org>
+
+[ 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 <bryan.odonoghue@linaro.org>
+Reviewed-by: Konrad Dybcio <konrad.dybcio@somainline.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220712125922.3461675-2-bryan.odonoghue@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..144c4ee
--- /dev/null
@@ -0,0 +1,107 @@
+From d90f43abbc04e6c7ebf565c3d50fde422e260e5f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <bryan.odonoghue@linaro.org>
+
+[ 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 <bryan.odonoghue@linaro.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220504163835.40130-5-bryan.odonoghue@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..129c222
--- /dev/null
@@ -0,0 +1,92 @@
+From 88622bd4acdca057b7dc315696afc2364676a02a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <robimarko@gmail.com>
+
+[ 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 <robimarko@gmail.com>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220515210048.483898-1-robimarko@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..4983b2c
--- /dev/null
@@ -0,0 +1,76 @@
+From 6281e930ba355ec7cb6b3fa95a0d23bb1564ec91 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 15 May 2022 23:00:40 +0200
+Subject: clk: qcom: ipq8074: fix NSS port frequency tables
+
+From: Robert Marko <robimarko@gmail.com>
+
+[ 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 <robimarko@gmail.com>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220515210048.483898-3-robimarko@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..21df4d6
--- /dev/null
@@ -0,0 +1,113 @@
+From 3e69935479b096bcaa66e79fbb9615df49de4431 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 15 May 2022 23:00:43 +0200
+Subject: clk: qcom: ipq8074: set BRANCH_HALT_DELAY flag for UBI clocks
+
+From: Robert Marko <robimarko@gmail.com>
+
+[ 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 <robimarko@gmail.com>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220515210048.483898-6-robimarko@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ad6c361
--- /dev/null
@@ -0,0 +1,47 @@
+From 419e12cab1931feefeedad4906852862bad1e6bd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <robimarko@gmail.com>
+
+[ 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 <robimarko@gmail.com>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220515210048.483898-2-robimarko@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..4448838
--- /dev/null
@@ -0,0 +1,54 @@
+From 88cce4965a2876aaa81bb8d3de8853535bff14c3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 18 May 2022 14:25:27 -0400
+Subject: clk: renesas: r9a06g032: Fix UART clkgrp bitsel
+
+From: Ralph Siemsen <ralph.siemsen@linaro.org>
+
+[ 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 <ralph.siemsen@linaro.org>
+Reviewed-by: Phil Edworthy <phil.edworthy@renesas.com>
+Link: https://lore.kernel.org/r/20220518182527.1693156-1-ralph.siemsen@linaro.org
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..1f4cf30
--- /dev/null
@@ -0,0 +1,37 @@
+From 2599052951a76117574dc2eebb2b20010c7271af Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 5 Jun 2022 12:28:07 +0400
+Subject: cpufreq: zynq: Fix refcount leak in zynq_get_revision
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Link: https://lore.kernel.org/r/20220605082807.21526-1-linmq006@gmail.com
+Signed-off-by: Michal Simek <michal.simek@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d6dbdc6
--- /dev/null
@@ -0,0 +1,39 @@
+From 78275c50807b83e58fa5553565a801e66a114441 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 24 Jun 2022 07:13:38 -0400
+Subject: crypto: arm64/gcm - Select AEAD for GHASH_ARM64_CE
+
+From: Qian Cai <quic_qiancai@quicinc.com>
+
+[ 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 <quic_qiancai@quicinc.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..09394ac
--- /dev/null
@@ -0,0 +1,44 @@
+From 30d310589b32ed9dba800128fefbf41df919738a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 Jun 2022 10:26:18 -0500
+Subject: crypto: ccp - During shutdown, check SEV data pointer before using
+
+From: Tom Lendacky <thomas.lendacky@amd.com>
+
+[ 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 <thomas.lendacky@amd.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..2802672
--- /dev/null
@@ -0,0 +1,37 @@
+From 250595dbe8f6ef7f28138d862cce70c66ee64491 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <shaozhengchao@huawei.com>
+
+[ 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 <shaozhengchao@huawei.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..dff1f9a
--- /dev/null
@@ -0,0 +1,97 @@
+From 89d03028ae0db5b83745b942749758a3abd868d0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 Jul 2022 09:59:54 +0800
+Subject: crypto: hisilicon - Kunpeng916 crypto driver don't sleep when in
+ softirq
+
+From: Zhengchao Shao <shaozhengchao@huawei.com>
+
+[ 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 <shaozhengchao@huawei.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d32623f
--- /dev/null
@@ -0,0 +1,180 @@
+From 1dbe04c6cb4c5a9cf50b356a394c6676ede93c16 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 Jul 2022 09:55:11 +0800
+Subject: crypto: hisilicon/sec - don't sleep when in softirq
+
+From: Zhengchao Shao <shaozhengchao@huawei.com>
+
+[ 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 <shaozhengchao@huawei.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..70f0091
--- /dev/null
@@ -0,0 +1,60 @@
+From 8aa0e92e97ccf2b7f7254f609288a872640a5965 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 Jul 2022 10:18:31 +0800
+Subject: crypto: hisilicon/sec - fix auth key size error
+
+From: Kai Ye <yekai13@huawei.com>
+
+[ 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 <yekai13@huawei.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..2146a40
--- /dev/null
@@ -0,0 +1,420 @@
+From 2f70e1d77eab0047d4a61e69c16f8f2130c06209 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 13 Mar 2021 15:28:24 +0800
+Subject: crypto: hisilicon/sec - fixes some coding style
+
+From: Longfang Liu <liulongfang@huawei.com>
+
+[ 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 <liulongfang@huawei.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <linux/list.h>
+-
+ #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 (file)
index 0000000..2c738a5
--- /dev/null
@@ -0,0 +1,41 @@
+From a0c631abd7db350aeb72af4d07871d53c46d46ba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <pali@kernel.org>
+
+[ 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 <pali@kernel.org>
+Acked-by: Marek Behún <kabel@kernel.org>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..edd6c34
--- /dev/null
@@ -0,0 +1,103 @@
+From 4f49883849fa431d824da122471f738fbd6594cc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 2 May 2022 20:19:19 +0000
+Subject: crypto: sun8i-ss - do not allocate memory when handling hash requests
+
+From: Corentin Labbe <clabbe@baylibre.com>
+
+[ 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 <clabbe@baylibre.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..311a8d2
--- /dev/null
@@ -0,0 +1,68 @@
+From efc92ca15e306761a28c2e7bb47cfb82ff8ff4ff Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 18 May 2022 20:33:44 +0300
+Subject: crypto: sun8i-ss - fix error codes in allocate_flows()
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ 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 <dan.carpenter@oracle.com>
+Acked-by: Corentin Labbe <clabbe.montjoie@gmail.com>
+Tested-by: Corentin Labbe <clabbe.montjoie@gmail.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../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 (file)
index 0000000..4c6993a
--- /dev/null
@@ -0,0 +1,38 @@
+From f2933fee3ab30571c3772468aaf8b572a3ae2509 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 10 Jun 2022 21:27:15 +0300
+Subject: crypto: sun8i-ss - fix infinite loop in sun8i_ss_setup_ivs()
+
+From: Alexey Khoroshilov <khoroshilov@ispras.ru>
+
+[ 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 <khoroshilov@ispras.ru>
+Fixes: 359e893e8af4 ("crypto: sun8i-ss - rework handling of IV")
+Acked-by: Corentin Labbe <clabbe.montjoie@gmail.com>
+Tested-by: Corentin Labbe <clabbe.montjoie@gmail.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..958493a
--- /dev/null
@@ -0,0 +1,71 @@
+From 09e351d48ef451e47bee160e3f12e4ee15a39de4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <hbh25y@gmail.com>
+
+[ 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 <hbh25y@gmail.com>
+Link: https://lore.kernel.org/r/20220729110027.40569-1-hbh25y@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..e4e1b50
--- /dev/null
@@ -0,0 +1,38 @@
+From d55ce52232f13c24a5fb93c70712e2a1a33927b0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <snitzer@kernel.org>
+
+[ 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 <snitzer@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0d3e99b
--- /dev/null
@@ -0,0 +1,100 @@
+From 733aeee37a820bee1d0451277f2024f59f5a6cf1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <Sergey.Semin@baikalelectronics.ru>
+
+[ 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 <manivannan.sadhasivam@linaro.org>
+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 <manivannan.sadhasivam@linaro.org>
+Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
+Signed-off-by: Frank Li <Frank.Li@nxp.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Acked-By: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b3c7bd4
--- /dev/null
@@ -0,0 +1,140 @@
+From 1b311ee1fcbcd9d39cff8c2a2093ca82e324ce47 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 Jul 2022 11:29:42 +0300
+Subject: dmaengine: sf-pdma: Add multithread support for a DMA channel
+
+From: Viacheslav Mitrofanov <v.v.mitrofanov@yadro.com>
+
+[ 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 <v.v.mitrofanov@yadro.com>
+Link: https://lore.kernel.org/r/20220701082942.12835-1-v.v.mitrofanov@yadro.com
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..4f2892f
--- /dev/null
@@ -0,0 +1,52 @@
+From b15e1e7218a5e933ce2efd3af83b67086a729f75 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <austin.kim@lge.com>
+
+[ 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 <austin.kim@lge.com>
+Link: https://lore.kernel.org/r/20210611065336.GA1121@raspberrypi
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..7fc246c
--- /dev/null
@@ -0,0 +1,120 @@
+From 06517056f2bd35e1d51d09902ff3b2049e65b6d9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 22 Jun 2022 15:43:27 +0800
+Subject: driver core: fix potential deadlock in __driver_attach
+
+From: Zhang Wensheng <zhangwensheng5@huawei.com>
+
+[ 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]  <TASK>
+[  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 <zhangwensheng5@huawei.com>
+Link: https://lore.kernel.org/r/20220622074327.497102-1-zhangwensheng5@huawei.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..1be7689
--- /dev/null
@@ -0,0 +1,103 @@
+From 890e8d6b19c65efbbde8bd00af0ad245001a203f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Jul 2022 11:43:02 +0530
+Subject: drivers/perf: arm_spe: Fix consistency of SYS_PMSCR_EL1.CX
+
+From: Anshuman Khandual <anshuman.khandual@arm.com>
+
+[ 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 <will@kernel.org>
+Cc: Mark Rutland <mark.rutland@arm.com>
+Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
+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 <german.gomez@arm.com>
+Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
+Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
+Link: https://lore.kernel.org/r/20220714061302.2715102-1-anshuman.khandual@arm.com
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <asm/mmu.h>
+ #include <asm/sysreg.h>
++/*
++ * 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 (file)
index 0000000..ed65d1b
--- /dev/null
@@ -0,0 +1,63 @@
+From 4cb898a217c4fdf34db4713de8fd250f356654c9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 7 Jun 2022 23:31:44 +0200
+Subject: drm: adv7511: override i2c address of cec before accessing it
+
+From: Antonio Borneo <antonio.borneo@foss.st.com>
+
+[ 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 <antonio.borneo@foss.st.com>
+Fixes: 680532c50bca ("drm: adv7511: Add support for i2c_new_secondary_device")
+Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
+Signed-off-by: Robert Foss <robert.foss@linaro.org>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220607213144.427177-1-antonio.borneo@foss.st.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..22e8f3f
--- /dev/null
@@ -0,0 +1,57 @@
+From 0cd4c5efd681ff5deb2dd41c7979f0b55e7af408 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 2 Jun 2022 18:34:01 +0800
+Subject: drm: bridge: adv7511: Add check for mipi_dsi_driver_register
+
+From: Jiasheng Jiang <jiasheng@iscas.ac.cn>
+
+[ 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 <jiasheng@iscas.ac.cn>
+Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220602103401.2980938-1-jiasheng@iscas.ac.cn
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..709ec5b
--- /dev/null
@@ -0,0 +1,52 @@
+From 21115eb33ffca8273a57b1012a7c4ecc8027def8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 18 May 2022 14:58:56 +0800
+Subject: drm: bridge: sii8620: fix possible off-by-one
+
+From: Hangyu Hua <hbh25y@gmail.com>
+
+[ 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 <hbh25y@gmail.com>
+Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com>
+Signed-off-by: Robert Foss <robert.foss@linaro.org>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220518065856.18936-1-hbh25y@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..1a856c2
--- /dev/null
@@ -0,0 +1,92 @@
+From ce2b1aeb24d0b4ad863139149865249bf1709f25 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 20 May 2022 14:15:43 +0200
+Subject: drm/bridge: tc358767: Make sure Refclk clock are enabled
+
+From: Marek Vasut <marex@denx.de>
+
+[ 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 <l.stach@pengutronix.de>
+Fixes: 7caff0fc4296e ("drm/bridge: tc358767: Add DPI to eDP bridge driver")
+Signed-off-by: Marek Vasut <marex@denx.de>
+Cc: Jonas Karlman <jonas@kwiboo.se>
+Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
+Cc: Lucas Stach <l.stach@pengutronix.de>
+Cc: Marek Vasut <marex@denx.de>
+Cc: Maxime Ripard <maxime@cerno.tech>
+Cc: Neil Armstrong <narmstrong@baylibre.com>
+Cc: Robert Foss <robert.foss@linaro.org>
+Cc: Sam Ravnborg <sam@ravnborg.org>
+Reviewed-by: Maxime Ripard <maxime@cerno.tech>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220520121543.11550-1-marex@denx.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6ac8b64
--- /dev/null
@@ -0,0 +1,87 @@
+From fb0488eabf8575cf64ea395cc481ab6bf076bdc0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <marex@denx.de>
+
+[ 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 <l.stach@pengutronix.de>
+Tested-by: Lucas Stach <l.stach@pengutronix.de> # In both DPI to eDP and DSI to DPI mode.
+Signed-off-by: Marek Vasut <marex@denx.de>
+Cc: Jonas Karlman <jonas@kwiboo.se>
+Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
+Cc: Maxime Ripard <maxime@cerno.tech>
+Cc: Neil Armstrong <narmstrong@baylibre.com>
+Cc: Sam Ravnborg <sam@ravnborg.org>
+Signed-off-by: Robert Foss <robert.foss@linaro.org>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220329085015.39159-7-marex@denx.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0f9e7be
--- /dev/null
@@ -0,0 +1,75 @@
+From 87722378f66eaf4f8bb744969439dbe520a68ad7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <zhangjian210@huawei.com>
+
+[ 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 <hulkci@huawei.com>
+Signed-off-by: Jian Zhang <zhangjian210@huawei.com>
+Signed-off-by: Inki Dae <inki.dae@samsung.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..c7fb584
--- /dev/null
@@ -0,0 +1,38 @@
+From 9968a84d5e75b51a97591f73f348dea0237512ce Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 25 May 2022 15:54:11 +0400
+Subject: drm/mcde: Fix refcount leak in mcde_dsi_bind
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220525115411.65455-1-linmq006@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..c1f4b7a
--- /dev/null
@@ -0,0 +1,49 @@
+From 4fd2c34a1c0644c3a6495d67a98dfe4d9a227cca Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <xinlei.lee@mediatek.com>
+
+[ 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 <jitao.shi@mediatek.com>
+Signed-off-by: Xinlei Lee <xinlei.lee@mediatek.com>
+Reviewed-by: Rex-BC Chen <rex-bc.chen@mediatek.com>
+Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..1e2b7a6
--- /dev/null
@@ -0,0 +1,48 @@
+From 84df5295f8ee2babd6bad88e00e5ae4a83ef9a1e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 Jul 2022 11:58:44 +0800
+Subject: drm/mediatek: dpi: Only enable dpi after the bridge is enabled
+
+From: Guillaume Ranquet <granquet@baylibre.com>
+
+[ 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 <granquet@baylibre.com>
+Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com>
+Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Link: https://patchwork.kernel.org/project/linux-mediatek/patch/20220701035845.16458-16-rex-bc.chen@mediatek.com/
+Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9bcc483
--- /dev/null
@@ -0,0 +1,73 @@
+From 523529e5c90c9d1cf65b9266151805136fc35712 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 Jul 2022 11:58:33 +0800
+Subject: drm/mediatek: dpi: Remove output format of YUV
+
+From: Bo-Chen Chen <rex-bc.chen@mediatek.com>
+
+[ 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 <rex-bc.chen@mediatek.com>
+Link: https://patchwork.kernel.org/project/linux-mediatek/patch/20220701035845.16458-5-rex-bc.chen@mediatek.com/
+Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9652575
--- /dev/null
@@ -0,0 +1,59 @@
+From 33c4010076745b5ee6c4eebe523f51119907c4a0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 20 May 2022 10:00:04 +0800
+Subject: drm/mediatek: Modify dsi funcs to atomic operations
+
+From: Xinlei Lee <xinlei.lee@mediatek.com>
+
+[ 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 <jitao.shi@mediatek.com>
+Signed-off-by: Xinlei Lee <xinlei.lee@mediatek.com>
+Reviewed-by: Rex-BC Chen <rex-bc.chen@mediatek.com>
+Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0bfc5ee
--- /dev/null
@@ -0,0 +1,130 @@
+From a2623a07bbabea74f85403c2a4fb1dd52c7d37d1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <jitao.shi@mediatek.com>
+
+[ 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 <jitao.shi@mediatek.com>
+Signed-off-by: Xinlei Lee <xinlei.lee@mediatek.com>
+Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Reviewed-by: Rex-BC Chen <rex-bc.chen@mediatek.com>
+Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f8644a9
--- /dev/null
@@ -0,0 +1,51 @@
+From b135a42205f361977f19a833132f08a147411766 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <t123yh.xyz@gmail.com>
+
+[ 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 <t123yh.xyz@gmail.com>
+Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220510030219.2486687-1-t123yh.xyz@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..bd8891b
--- /dev/null
@@ -0,0 +1,40 @@
+From a7ca16c9f4afcf5ef31a1f4848eb55ebb8d65d12 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <dmitry.baryshkov@linaro.org>
+
+[ 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 <dmitry.baryshkov@linaro.org>
+Reviewed-by: Stephen Boyd <swboyd@chromium.org>
+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 <dmitry.baryshkov@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..05edffc
--- /dev/null
@@ -0,0 +1,85 @@
+From 2c16c1b45c7a2c3cd0de3834a1d10d6a40ac4da7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 Jul 2022 09:20:37 -0700
+Subject: drm/msm/mdp5: Fix global state lock backoff
+
+From: Rob Clark <robdclark@chromium.org>
+
+[ 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 <robdclark@chromium.org>
+Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
+Patchwork: https://patchwork.freedesktop.org/patch/492701/
+Link: https://lore.kernel.org/r/20220707162040.1594855-1-robdclark@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d95c753
--- /dev/null
@@ -0,0 +1,65 @@
+From 2c6396665c4ea7bc37b5141a9f9f5dbe9b6d10bc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <alexander.deucher@amd.com>
+
+[ 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 <christian.koenig@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6bf6c9e
--- /dev/null
@@ -0,0 +1,61 @@
+From fac190b900eadf0cd0f80dc75452cf7da38d71e8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <aleksei.kodanev@bell-sw.com>
+
+[ 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 <aleksei.kodanev@bell-sw.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..429b613
--- /dev/null
@@ -0,0 +1,45 @@
+From 77e45b68143846d00d663ec8c759d4eb982324d6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 18 Jun 2022 19:08:05 +0200
+Subject: drm/rockchip: Fix an error handling path rockchip_dp_probe()
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ 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 <christophe.jaillet@wanadoo.fr>
+Signed-off-by: Heiko Stuebner <heiko@sntech.de>
+Link: https://patchwork.freedesktop.org/patch/msgid/b719d9061bb97eb85145fbd3c5e63f4549f2e13e.1655572071.git.christophe.jaillet@wanadoo.fr
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..7241e5a
--- /dev/null
@@ -0,0 +1,42 @@
+From 108a6bd5b8ee2f76b98978b2850c905ec5c651d9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Jun 2022 17:26:52 -0700
+Subject: drm/rockchip: vop: Don't crash for invalid duplicate_state()
+
+From: Brian Norris <briannorris@chromium.org>
+
+[ 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 <briannorris@chromium.org>
+Reviewed-by: Sean Paul <seanpaul@chromium.org>
+Reviewed-by: Douglas Anderson <dianders@chromium.org>
+Signed-off-by: Heiko Stuebner <heiko@sntech.de>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220617172623.1.I62db228170b1559ada60b8d3e1637e1688424926@changeid
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..3fabeff
--- /dev/null
@@ -0,0 +1,51 @@
+From 2fda24183d0a3cd496ecd142df39d6a5bca9a179 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 20 May 2022 11:16:02 +0200
+Subject: drm/st7735r: Fix module autoloading for Okaya RH128128T
+
+From: Javier Martinez Canillas <javierm@redhat.com>
+
+[ Upstream commit 9ad6f181ad9a19a26bda73a7b199df44ccfcdaba ]
+
+The SPI core always reports a "MODALIAS=spi:<foo>", 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 <javierm@redhat.com>
+Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Acked-by: David Lechner <david@lechnology.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220520091602.179078-1-javierm@redhat.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..3dce84a
--- /dev/null
@@ -0,0 +1,76 @@
+From ef6c2ddc9c6d7fe392d566341bfe195186bfcf94 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 3 Dec 2020 14:25:36 +0100
+Subject: drm/vc4: drv: Remove the DSI pointer in vc4_drv
+
+From: Maxime Ripard <maxime@cerno.tech>
+
+[ Upstream commit 51f4fcd9c4ea867c3b4fe58111f342ad0e80642a ]
+
+That pointer isn't used anywhere, so there's no point in keeping it.
+
+Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Link: https://patchwork.freedesktop.org/patch/msgid/20201203132543.861591-2-maxime@cerno.tech
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ac99416
--- /dev/null
@@ -0,0 +1,43 @@
+From f6b13e059637e99a9dea163c8b538ca25988c0c4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <dave.stevenson@raspberrypi.com>
+
+[ 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 <dave.stevenson@raspberrypi.com>
+Link: https://lore.kernel.org/r/20220613144800.326124-17-maxime@cerno.tech
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..899133d
--- /dev/null
@@ -0,0 +1,51 @@
+From 13a680d6f8225436b094664a0d41cd932170c84d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 16:47:39 +0200
+Subject: drm/vc4: dsi: Correct DSI divider calculations
+
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+
+[ 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 <dave.stevenson@raspberrypi.com>
+Link: https://lore.kernel.org/r/20220613144800.326124-13-maxime@cerno.tech
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0b5d95d
--- /dev/null
@@ -0,0 +1,40 @@
+From e11e8e25d6f733cb2cf3ab23efd7d79854c051d2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 16:47:40 +0200
+Subject: drm/vc4: dsi: Correct pixel order for DSI0
+
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+
+[ 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 <dave.stevenson@raspberrypi.com>
+Link: https://lore.kernel.org/r/20220613144800.326124-14-maxime@cerno.tech
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..5b7f808
--- /dev/null
@@ -0,0 +1,201 @@
+From 3500f8b092ea0ffaaedda74a19fcc9e477334460 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 16:47:42 +0200
+Subject: drm/vc4: dsi: Fix dsi0 interrupt support
+
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+
+[ 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 <dave.stevenson@raspberrypi.com>
+Link: https://lore.kernel.org/r/20220613144800.326124-16-maxime@cerno.tech
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..513fc37
--- /dev/null
@@ -0,0 +1,199 @@
+From d20fd46188d61c99ee8397f8929bbf43dc3f81b2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 3 Dec 2020 14:25:39 +0100
+Subject: drm/vc4: dsi: Introduce a variant structure
+
+From: Maxime Ripard <maxime@cerno.tech>
+
+[ 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 <dave.stevenson@raspberrypi.com>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Link: https://patchwork.freedesktop.org/patch/msgid/20201203132543.861591-5-maxime@cerno.tech
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..cc9affc
--- /dev/null
@@ -0,0 +1,41 @@
+From ea18fa94fad814e181a14a5c4a27e2b5b503db58 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 16:47:41 +0200
+Subject: drm/vc4: dsi: Register dsi0 as the correct vc4 encoder type
+
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+
+[ 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 <dave.stevenson@raspberrypi.com>
+Link: https://lore.kernel.org/r/20220613144800.326124-15-maxime@cerno.tech
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..e1ee2d2
--- /dev/null
@@ -0,0 +1,73 @@
+From 8e9a42f3fd91d9fb5992443eba9c85a74e2efb0b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <maxime@cerno.tech>
+
+[ 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 <dave.stevenson@raspberrypi.com>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Link: https://patchwork.freedesktop.org/patch/msgid/20201203132543.861591-4-maxime@cerno.tech
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..71adcb0
--- /dev/null
@@ -0,0 +1,46 @@
+From 5e9ed1f40712989cd05a110f6a02104ab01c0160 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 16:47:47 +0200
+Subject: drm/vc4: hdmi: Avoid full hdmi audio fifo writes
+
+From: Dom Cobley <popcornmix@gmail.com>
+
+[ 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 <popcornmix@gmail.com>
+Link: https://lore.kernel.org/r/20220613144800.326124-21-maxime@cerno.tech
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..7cfad48
--- /dev/null
@@ -0,0 +1,46 @@
+From ccac1f93b1f9c5dc520c1c65604f5393ca429175 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 16:47:59 +0200
+Subject: drm/vc4: hdmi: Correct HDMI timing registers for interlaced modes
+
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+
+[ 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 <dave.stevenson@raspberrypi.com>
+Link: https://lore.kernel.org/r/20220613144800.326124-33-maxime@cerno.tech
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0c40d1b
--- /dev/null
@@ -0,0 +1,101 @@
+From 0570b898a56093a94f406728092be37c33bbee6e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 15 Dec 2020 16:42:39 +0100
+Subject: drm/vc4: hdmi: Create a custom connector state
+
+From: Maxime Ripard <maxime@cerno.tech>
+
+[ 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 <tzimmermann@suse.de>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20201215154243.540115-6-maxime@cerno.tech
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ac12340
--- /dev/null
@@ -0,0 +1,46 @@
+From 616c4681ecdbff65413d51f25bf184f1324d41cd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <maxime@cerno.tech>
+
+[ 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 <tzimmermann@suse.de>
+Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+Suggested-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Link: https://patchwork.freedesktop.org/patch/msgid/20201215154243.540115-5-maxime@cerno.tech
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..3b60d9b
--- /dev/null
@@ -0,0 +1,98 @@
+From 211490123450b373e7e08505e543592b26d1b1c0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 16:47:57 +0200
+Subject: drm/vc4: hdmi: Fix timings for interlaced modes
+
+From: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com>
+
+[ 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 <kfyatek+publicgit@gmail.com>
+Link: https://lore.kernel.org/r/20220613144800.326124-31-maxime@cerno.tech
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..562a6ed
--- /dev/null
@@ -0,0 +1,55 @@
+From d1abc83cf8244a56a8b8beaa1eb846cd9695e3df Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 15 Dec 2020 16:42:42 +0100
+Subject: drm/vc4: hdmi: Limit the BCM2711 to the max without scrambling
+
+From: Maxime Ripard <maxime@cerno.tech>
+
+[ 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 <dave.stevenson@raspberrypi.com>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Link: https://patchwork.freedesktop.org/patch/msgid/20201215154243.540115-9-maxime@cerno.tech
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..21ef740
--- /dev/null
@@ -0,0 +1,58 @@
+From 7d6398d04966991e4819504f6afa56def5cbd2e3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 May 2021 15:23:51 +0200
+Subject: drm/vc4: hdmi: Remove firmware logic for MAI threshold setting
+
+From: Dom Cobley <popcornmix@gmail.com>
+
+[ 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 <popcornmix@gmail.com>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Link: https://patchwork.freedesktop.org/patch/msgid/20210525132354.297468-10-maxime@cerno.tech
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..7edc412
--- /dev/null
@@ -0,0 +1,51 @@
+From bde83c3e2b6894878ad1c60b95cdfae33287b55f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 16:47:32 +0200
+Subject: drm/vc4: plane: Fix margin calculations for the right/bottom edges
+
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+
+[ 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 <dave.stevenson@raspberrypi.com>
+Link: https://lore.kernel.org/r/20220613144800.326124-6-maxime@cerno.tech
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..057f552
--- /dev/null
@@ -0,0 +1,76 @@
+From f4ef4696c0c8aac454f345b07d5584404c521f3e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 16:47:31 +0200
+Subject: drm/vc4: plane: Remove subpixel positioning check
+
+From: Dom Cobley <popcornmix@gmail.com>
+
+[ 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 <popcornmix@gmail.com>
+Link: https://lore.kernel.org/r/20220613144800.326124-5-maxime@cerno.tech
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..a084f47
--- /dev/null
@@ -0,0 +1,93 @@
+From fb1e87961b858f2f3f10dd30105749b4f2d2247b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 2 Jun 2022 19:14:32 -0700
+Subject: dt-bindings: Update QCOM USB subsystem maintainer information
+
+From: Wesley Cheng <quic_wcheng@quicinc.com>
+
+[ Upstream commit e059da384ffdc93778e69a5f212c2ac7357ec09a ]
+
+Update devicetree binding files with the proper maintainer, and updated
+contact email.
+
+Signed-off-by: Wesley Cheng <quic_wcheng@quicinc.com>
+Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Signed-off-by: Rob Herring <robh@kernel.org>
+Link: https://lore.kernel.org/r/20220603021432.13365-1-quic_wcheng@quicinc.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <mgautam@codeaurora.org>
++  - Wesley Cheng <quic_wcheng@quicinc.com>
+ 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 <mgautam@codeaurora.org>
++  - Wesley Cheng <quic_wcheng@quicinc.com>
+ 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 <wcheng@codeaurora.org>
++  - Wesley Cheng <quic_wcheng@quicinc.com>
+ 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 <wcheng@codeaurora.org>
++  - Wesley Cheng <quic_wcheng@quicinc.com>
+ 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 <mgautam@codeaurora.org>
++  - Wesley Cheng <quic_wcheng@quicinc.com>
+ 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 (file)
index 0000000..5f66218
--- /dev/null
@@ -0,0 +1,55 @@
+From ef0766510ccf678b722ba29ad5aafc468cb0ebb2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 Jul 2022 16:46:38 +0300
+Subject: eeprom: idt_89hpesx: uninitialized data in idt_dbgfs_csr_write()
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ 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 <fancer.lancer@gmail.com>
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Link: https://lore.kernel.org/r/Ysg1Pu/nzSMe3r1q@kili
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9a32c58
--- /dev/null
@@ -0,0 +1,59 @@
+From 441791599365aa6229063ec0e657171318a19b53 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 Jul 2022 18:10:01 +0800
+Subject: erofs: avoid consecutive detection for Highmem memory
+
+From: Gao Xiang <hsiangkao@linux.alibaba.com>
+
+[ 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 <liujinbao1@xiaomi.com>
+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 <hsiangkao@linux.alibaba.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..1faaee1
--- /dev/null
@@ -0,0 +1,55 @@
+From 9957f839008ae91db41d02958d147e9e99b3352d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 26 Jul 2022 13:13:50 +0200
+Subject: ext2: Add more validity checks for inode counts
+
+From: Jan Kara <jack@suse.cz>
+
+[ 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 <jack@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6a0d107
--- /dev/null
@@ -0,0 +1,76 @@
+From 2e44cd3c06ac2fbf2c3911f2c53ec7ee047cd811 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Jun 2022 14:25:15 +0800
+Subject: ext4: recover csum seed of tmp_inode after migrating to extents
+
+From: Li Lingfeng <lilingfeng3@huawei.com>
+
+[ 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 <lilingfeng3@huawei.com>
+Reviewed-by: Jan Kara <jack@suse.cz>
+Link: https://lore.kernel.org/r/20220617062515.2113438-1-lilingfeng3@huawei.com
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f834e60
--- /dev/null
@@ -0,0 +1,36 @@
+From 776a88de5a5ed93b884c68db0d4e47b084a7cca2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 20 Mar 2022 23:11:18 +0800
+Subject: f2fs: don't set GC_FAILURE_PIN for background GC
+
+From: Chao Yu <chao@kernel.org>
+
+[ 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 <chao.yu@oppo.com>
+Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0b1c358
--- /dev/null
@@ -0,0 +1,83 @@
+From dec5b494f857f8522d6edb700e3d73c3b340da45 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <liuchao@coolpad.com>
+
+[ 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 <chao@kernel.org>
+Signed-off-by: Chao Liu <liuchao@coolpad.com>
+Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..7db0979
--- /dev/null
@@ -0,0 +1,75 @@
+From dab7f8e6e9fc3e6d08385a6749d63e3097dce159 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 Apr 2022 13:29:53 -0700
+Subject: f2fs: write checkpoint during FG_GC
+
+From: Byungki Lee <dominicus79@gmail.com>
+
+[ 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 <dominicus79@gmail.com>
+Reviewed-by: Chao Yu <chao@kernel.org>
+Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9015583
--- /dev/null
@@ -0,0 +1,69 @@
+From cd1694fdba54f6a5a4613924007e9e9a80123779 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 Apr 2022 01:36:48 +0000
+Subject: firmware: tegra: Fix error check return value of
+ debugfs_create_file()
+
+From: Lv Ruyi <lv.ruyi@zte.com.cn>
+
+[ 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 <zealci@zte.com.cn>
+Signed-off-by: Lv Ruyi <lv.ruyi@zte.com.cn>
+Signed-off-by: Thierry Reding <treding@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..e98ba0d
--- /dev/null
@@ -0,0 +1,40 @@
+From 4f23efff2b45d2e7ff47db3c5a31a386343decc4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 Jun 2022 16:05:19 +0200
+Subject: fpga: altera-pr-ip: fix unsigned comparison with less than zero
+
+From: Marco Pagani <marpagan@redhat.com>
+
+[ 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 <trix@redhat.com>
+Acked-by: Xu Yilun <yilun.xu@intel.com>
+Signed-off-by: Marco Pagani <marpagan@redhat.com>
+Link: https://lore.kernel.org/r/20220609140520.42662-1-marpagan@redhat.com
+Signed-off-by: Xu Yilun <yilun.xu@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f856528
--- /dev/null
@@ -0,0 +1,58 @@
+From 637aaa6ee18e6dfcaa79d0a4f2ae2a2778d369f8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Jun 2022 15:06:58 +0200
+Subject: fs: check FMODE_LSEEK to control internal pipe splicing
+
+From: Jason A. Donenfeld <Jason@zx2c4.com>
+
+[ 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 <axboe@kernel.dk>
+Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
+Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f5f970c
--- /dev/null
@@ -0,0 +1,50 @@
+From a2f6b7222dd9304ef22577268cda1e1d0c0cb893 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 Jul 2022 16:50:12 +0800
+Subject: fuse: Remove the control interface for virtio-fs
+
+From: Xie Yongji <xieyongji@bytedance.com>
+
+[ 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 <xieyongji@bytedance.com>
+Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..2c2c2ad
--- /dev/null
@@ -0,0 +1,59 @@
+From b5e02cea6c3ae104b4f1678ec45821f982b2cb77 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <acme@redhat.com>
+
+[ 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: 谭梓煊 <tanzixuan.me@gmail.com>
+Cc: Alexei Starovoitov <ast@kernel.org>
+Cc: Andrii Nakryiko <andrii@kernel.org>
+Cc: Daniel Borkmann <daniel@iogearbox.net>
+Cc: Jiri Olsa <jolsa@kernel.org>
+Cc: John Fastabend <john.fastabend@gmail.com>
+Cc: KP Singh <kpsingh@kernel.org>
+Cc: Martin KaFai Lau <kafai@fb.com>
+Cc: Nick Terrell <terrelln@fb.com>
+Cc: Song Liu <songliubraving@fb.com>
+Cc: Stephane Eranian <eranian@google.com>
+Link: http://lore.kernel.org/lkml/YulpPqXSOG0Q4J1o@kernel.org
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..4a89408
--- /dev/null
@@ -0,0 +1,42 @@
+From 924bcb268fc7f36aa6d1f6aadd301b6045f2f884 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 May 2022 18:05:44 +0200
+Subject: genirq: Don't return error on missing optional
+ irq_request_resources()
+
+From: Antonio Borneo <antonio.borneo@foss.st.com>
+
+[ 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 <antonio.borneo@foss.st.com>
+Signed-off-by: Marc Zyngier <maz@kernel.org>
+Link: https://lore.kernel.org/r/20220512160544.13561-1-antonio.borneo@foss.st.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..68e997a
--- /dev/null
@@ -0,0 +1,51 @@
+From 05465ea7c479972b03cf83050ad098f2ea2a038c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 Jul 2022 15:00:50 -0500
+Subject: genirq: GENERIC_IRQ_IPI depends on SMP
+
+From: Samuel Holland <samuel@sholland.org>
+
+[ 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 <lkp@intel.com>
+Signed-off-by: Samuel Holland <samuel@sholland.org>
+Signed-off-by: Marc Zyngier <maz@kernel.org>
+Link: https://lore.kernel.org/r/20220701200056.46555-3-samuel@sholland.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..3bc0b82
--- /dev/null
@@ -0,0 +1,53 @@
+From c8c3abd8ca1911d33bcdd9a655d53f9c0e3d8fd3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <windhl@126.com>
+
+[ 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 <windhl@126.com>
+Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..5a86234
--- /dev/null
@@ -0,0 +1,42 @@
+From c93c5f75962b1efdd6da74e27d4cfac77f122d37 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 7 Jul 2021 18:07:44 -0700
+Subject: hexagon: select ARCH_WANT_LD_ORPHAN_WARN
+
+From: Nathan Chancellor <nathan@kernel.org>
+
+[ 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 <nathan@kernel.org>
+Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
+Acked-by: Brian Cain <bcain@codeaurora.org>
+Cc: David Rientjes <rientjes@google.com>
+Cc: Oliver Glitta <glittao@gmail.com>
+Cc: Vlastimil Babka <vbabka@suse.cz>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..647caa5
--- /dev/null
@@ -0,0 +1,36 @@
+From 1e9b91788ce17a4b5c0cf69549ef486ace755584 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 Jul 2022 17:53:24 +0300
+Subject: HID: alps: Declare U1_UNICORN_LEGACY support
+
+From: Artem Borisov <dedsa2002@gmail.com>
+
+[ 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 <dedsa2002@gmail.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..3d729a3
--- /dev/null
@@ -0,0 +1,47 @@
+From 0ea5f0b4b44bf1f5fdfccb9624fb08c49d9f85c1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Jun 2022 05:26:09 -0700
+Subject: HID: cp2112: prevent a buffer overflow in cp2112_xfer()
+
+From: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
+
+[ 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 <harshit.m.mogalapalli@oracle.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0d76b19
--- /dev/null
@@ -0,0 +1,44 @@
+From cb9e4d90dc4c2f6b7a9b51b5c6c71aa2393524b8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Jun 2022 09:28:24 -0700
+Subject: HID: mcp2221: prevent a buffer overflow in mcp_smbus_write()
+
+From: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
+
+[ 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 <harshit.m.mogalapalli@oracle.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..4c070e0
--- /dev/null
@@ -0,0 +1,56 @@
+From 514b794a8b8b5ee05692b1806cfe5d3d0f2dc62a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 26 Jun 2022 18:27:45 +0200
+Subject: hinic: Use the bitmap API when applicable
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ 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 <christophe.jaillet@wanadoo.fr>
+Link: https://lore.kernel.org/r/6ff7b7d21414240794a77dc2456914412718a145.1656260842.git.christophe.jaillet@wanadoo.fr
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d4e4cfc
--- /dev/null
@@ -0,0 +1,33 @@
+From ce264948870f0202e0b88a65a2d396988b690092 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 Jul 2022 23:46:24 +0200
+Subject: hwmon: (drivetemp) Add module alias
+
+From: Linus Walleij <linus.walleij@linaro.org>
+
+[ Upstream commit 5918036cfa8ded7aa8094db70295011ce2275447 ]
+
+Adding a MODULE_ALIAS() to drivetemp will make the driver easier
+for modprobe to autoprobe.
+
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+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 <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <linus@roeck-us.net>");
+ 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 (file)
index 0000000..e2a918f
--- /dev/null
@@ -0,0 +1,78 @@
+From eeb2c8e54dd37082a17c4486e5e54c4de8e3040f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <u.kleine-koenig@pengutronix.de>
+
+[ 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 <u.kleine-koenig@pengutronix.de>
+Link: https://lore.kernel.org/r/20220725194344.150098-1-u.kleine-koenig@pengutronix.de
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d29bcee
--- /dev/null
@@ -0,0 +1,77 @@
+From 2212a74a6cec0ff509f60e22d48b1545bed74207 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 17 Jul 2022 16:52:44 +0200
+Subject: i2c: cadence: Support PEC for SMBus block read
+
+From: Lars-Peter Clausen <lars@metafoo.de>
+
+[ 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 <lars@metafoo.de>
+Tested-by: Shubhrajyoti Datta <Shubhrajyoti.datta@amd.com>
+Signed-off-by: Wolfram Sang <wsa@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..545386f
--- /dev/null
@@ -0,0 +1,40 @@
+From d71e8ec23c4a5c78f804c3b904393fc023a8738e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 27 Dec 2019 09:34:32 +0000
+Subject: i2c: Fix a potential use after free
+
+From: Xu Wang <vulab@iscas.ac.cn>
+
+[ 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 <vulab@iscas.ac.cn>
+[wsa: added comment to the code, added Fixes tag]
+Signed-off-by: Wolfram Sang <wsa@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d7775c0
--- /dev/null
@@ -0,0 +1,37 @@
+From b3bc888402084e35375373d077d397ba5523a354 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <windhl@126.com>
+
+[ 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 <windhl@126.com>
+Acked-by: Peter Rosin <peda@axentia.se>
+Signed-off-by: Wolfram Sang <wsa@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..af95f3e
--- /dev/null
@@ -0,0 +1,55 @@
+From 0402134d250f7c9d14584fb529d417a995c90c92 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 25 May 2022 11:23:39 +0800
+Subject: i2c: npcm: Correct slave role behavior
+
+From: Tali Perry <tali.perry1@gmail.com>
+
+[ 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 <tali.perry1@gmail.com>
+Signed-off-by: Tyrone Ting <kfting@nuvoton.com>
+Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Signed-off-by: Wolfram Sang <wsa@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..cddfb3f
--- /dev/null
@@ -0,0 +1,133 @@
+From 1c76704a92432408ab92f7c33c56f730d06a8cea Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 25 May 2022 11:23:38 +0800
+Subject: i2c: npcm: Remove own slave addresses 2:10
+
+From: Tali Perry <tali.perry1@gmail.com>
+
+[ 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 <tali.perry1@gmail.com>
+Signed-off-by: Tyrone Ting <kfting@nuvoton.com>
+Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Signed-off-by: Wolfram Sang <wsa@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..775dc37
--- /dev/null
@@ -0,0 +1,104 @@
+From 988cee019ae40aee1fb73cab431179df0f1d9082 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Jun 2022 18:41:23 -0400
+Subject: iavf: Fix max_rate limiting
+
+From: Przemyslaw Patynowski <przemyslawx.patynowski@intel.com>
+
+[ 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 <przemyslawx.patynowski@intel.com>
+Signed-off-by: Jun Zhang <xuejun.zhang@intel.com>
+Tested-by: Bharathi Sreenivas <bharathi.sreenivas@intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..4b0a195
--- /dev/null
@@ -0,0 +1,59 @@
+From 689632afbf04e0a6e4e753d4af824d50c75c263c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <jagathjog1996@gmail.com>
+
+[ 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 <jagathjog1996@gmail.com>
+Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
+Link: https://lore.kernel.org/r/20220505133021.22362-2-jagathjog1996@gmail.com
+Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..48a3e0c
--- /dev/null
@@ -0,0 +1,45 @@
+From 47bd5797adc670cd0854ac4ab094e0c5018acae3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 5 May 2022 19:00:13 +0530
+Subject: iio: accel: bma400: Reordering of header files
+
+From: Jagath Jog J <jagathjog1996@gmail.com>
+
+[ 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 <jagathjog1996@gmail.com>
+Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
+Link: https://lore.kernel.org/r/20220505133021.22362-3-jagathjog1996@gmail.com
+Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <linux/bitops.h>
+ #include <linux/device.h>
+-#include <linux/iio/iio.h>
+-#include <linux/iio/sysfs.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/mutex.h>
+ #include <linux/regmap.h>
+ #include <linux/regulator/consumer.h>
++#include <linux/iio/iio.h>
++
+ #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 (file)
index 0000000..4eec7d8
--- /dev/null
@@ -0,0 +1,160 @@
+From 387df893857cdab2fe02af471a3e892db404c36d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <edumazet@google.com>
+
+[ 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 <edumazet@google.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..78c0f13
--- /dev/null
@@ -0,0 +1,204 @@
+From a9d8b0dad7ce580f2a42328f60d95c6569d4658b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 9 Nov 2020 18:00:06 -0800
+Subject: Input: atmel_mxt_ts - fix up inverted RESET handler
+
+From: Linus Walleij <linus.walleij@linaro.org>
+
+[ 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 <linus.walleij@linaro.org>
+Reviewed-by: Philippe Schenker <philippe.schenker@toradex.com>
+Acked-by: Krzysztof Kozlowski <krzk@kernel.org>
+Link: https://lore.kernel.org/r/20201104153032.1387747-1-linus.walleij@linaro.org
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 = <TEGRA_GPIO(V, 6) IRQ_TYPE_LEVEL_LOW>;
+-                      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 (file)
index 0000000..c238eeb
--- /dev/null
@@ -0,0 +1,55 @@
+From a1660b4b064102f9bd4bac74c148992aae0bfa3c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 5 Jul 2022 11:26:32 +0300
+Subject: intel_th: Fix a resource leak in an error handling path
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ 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 <andriy.shevchenko@linux.intel.com>
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Link: https://lore.kernel.org/r/20220705082637.59979-2-alexander.shishkin@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..398b4ad
--- /dev/null
@@ -0,0 +1,74 @@
+From 608d1dccea44916aae1ab28da57315fdfe9ada0f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 5 Jul 2022 11:26:34 +0300
+Subject: intel_th: msu: Fix vmalloced buffers
+
+From: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+
+[ 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:
+>  <TASK>
+>  __do_fault
+>  do_fault
+...
+
+Fix this by accounting for vmalloc possibility.
+
+Fixes: ba39bd830605 ("intel_th: msu: Switch over to scatterlist")
+Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Link: https://lore.kernel.org/r/20220705082637.59979-4-alexander.shishkin@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..fb8c7df
--- /dev/null
@@ -0,0 +1,41 @@
+From 2832620a35b8f29baea91407dec3b9bebcb58c2e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 5 Jul 2022 11:26:33 +0300
+Subject: intel_th: msu-sink: Potential dereference of null pointer
+
+From: Jiasheng Jiang <jiasheng@iscas.ac.cn>
+
+[ 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 <andriy.shevchenko@linux.intel.com>
+Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn>
+Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Link: https://lore.kernel.org/r/20220705082637.59979-3-alexander.shishkin@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9886e5a
--- /dev/null
@@ -0,0 +1,51 @@
+From cb36419343ad5ba52b407f3430a56209559ee2c6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 3 Jul 2022 17:11:26 +0800
+Subject: interconnect: imx: fix max_node_id
+
+From: Peng Fan <peng.fan@nxp.com>
+
+[ 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 <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Peng Fan <peng.fan@nxp.com>
+Link: https://lore.kernel.org/r/20220703091132.1412063-5-peng.fan@oss.nxp.com
+Signed-off-by: Georgi Djakov <djakov@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..3f50b58
--- /dev/null
@@ -0,0 +1,45 @@
+From 8a69792a15cbc9ab5cdf93e52f1d8e04653c5741 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <windhl@126.com>
+
+[ 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 <windhl@126.com>
+Link: https://lore.kernel.org/r/20220719124955.1242171-1-windhl@126.com
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..bcd3684
--- /dev/null
@@ -0,0 +1,51 @@
+From c717aafe962faca077e2cbeeb95576fcc7dbfa4c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Jul 2022 19:55:46 +0300
+Subject: iommu/exynos: Handle failed IOMMU device registration properly
+
+From: Sam Protsenko <semen.protsenko@linaro.org>
+
+[ 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 <semen.protsenko@linaro.org>
+Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
+Link: https://lore.kernel.org/r/20220714165550.8884-3-semen.protsenko@linaro.org
+Signed-off-by: Joerg Roedel <jroedel@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..c9f14ed
--- /dev/null
@@ -0,0 +1,125 @@
+From 8ef798c4ea76a41898b7462c1bd45d73a7a02379 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <edumazet@google.com>
+
+[ 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 <edumazet@google.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..beb9c78
--- /dev/null
@@ -0,0 +1,40 @@
+From 1a93a9f035e32e32093a7a776dc1afb111a9a0f9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <williamsukatube@163.com>
+
+[ Upstream commit 71349cc85e5930dce78ed87084dee098eba24b59 ]
+
+The function ioremap() in gic_of_init() can fail, so
+its return value should be checked.
+
+Reported-by: Hacash Robot <hacashRobot@santino.com>
+Signed-off-by: William Dean <williamsukatube@163.com>
+Signed-off-by: Marc Zyngier <maz@kernel.org>
+Link: https://lore.kernel.org/r/20220723100128.2964304-1-williamsukatube@163.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..7fecf11
--- /dev/null
@@ -0,0 +1,181 @@
+From 0a6831e125a73d9693850e66a621785218beebd1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 Jul 2022 15:00:49 -0500
+Subject: irqchip/mips-gic: Only register IPI domain when SMP is enabled
+
+From: Samuel Holland <samuel@sholland.org>
+
+[ 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 <lkp@intel.com>
+Signed-off-by: Samuel Holland <samuel@sholland.org>
+Signed-off-by: Marc Zyngier <maz@kernel.org>
+Link: https://lore.kernel.org/r/20220701200056.46555-2-samuel@sholland.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ad4dce5
--- /dev/null
@@ -0,0 +1,110 @@
+From d5921e14d9044bfcc73798f4bbf2381d544fb094 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <chengzhihao1@huawei.com>
+
+[ 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:
+  <TASK>
+  __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 <chengzhihao1@huawei.com>
+Link: https://lore.kernel.org/r/20220715125152.4022726-1-chengzhihao1@huawei.com
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..20f7978
--- /dev/null
@@ -0,0 +1,75 @@
+From 412ca8ddb83ea592fd07f9f2942cf739a8d6430b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 11 Jun 2022 21:04:26 +0800
+Subject: jbd2: fix outstanding credits assert in
+ jbd2_journal_commit_transaction()
+
+From: Zhang Yi <yi.zhang@huawei.com>
+
+[ 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 <yi.zhang@huawei.com>
+Reviewed-by: Jan Kara <jack@suse.cz>
+Link: https://lore.kernel.org/r/20220611130426.2013258-1-yi.zhang@huawei.com
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..bca9d58
--- /dev/null
@@ -0,0 +1,44 @@
+From f5688b8f0ec990f45a6046ddf8fd4d5a58612cb3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 24 Jun 2022 08:30:04 +0300
+Subject: kfifo: fix kfifo_to_user() return type
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ 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 <dan.carpenter@oracle.com>
+Cc: Stefani Seibold <stefani@seibold.net>
+Cc: Randy Dunlap <randy.dunlap@oracle.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..58302e1
--- /dev/null
@@ -0,0 +1,52 @@
+From 83b96c56361894f259ac49d91b11b109d849170e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 1 Aug 2022 11:37:19 +0800
+Subject: kprobes: Forbid probing on trampoline and BPF code areas
+
+From: Chen Zhongjin <chenzhongjin@huawei.com>
+
+[ 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 <chenzhongjin@huawei.com>
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
+Link: https://lore.kernel.org/r/20220801033719.228248-1-chenzhongjin@huawei.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..005e243
--- /dev/null
@@ -0,0 +1,54 @@
+From fc79abdfe36487f8aa6a66d763c7f01fd7063448 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 5 Jul 2022 14:23:10 +0000
+Subject: KVM: arm64: Don't return from void function
+
+From: Quentin Perret <qperret@google.com>
+
+[ 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 <qperret@google.com>
+Signed-off-by: Marc Zyngier <maz@kernel.org>
+Link: https://lore.kernel.org/r/20220705142310.3847918-1-qperret@google.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..a2315f9
--- /dev/null
@@ -0,0 +1,64 @@
+From 3264d8ebcbd8ce94ad77e4f218d175a952cc9d49 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 Apr 2022 01:04:09 +0000
+Subject: KVM: Don't set Accessed/Dirty bits for ZERO_PAGE
+
+From: Sean Christopherson <seanjc@google.com>
+
+[ 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 <seanjc@google.com>
+Message-Id: <20220429010416.2788472-4-seanjc@google.com>
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b37dfff
--- /dev/null
@@ -0,0 +1,173 @@
+From d13ec36886da99d4927fa997cfc95b249b796655 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Jun 2022 15:56:02 +0200
+Subject: KVM: s390: pv: leak the topmost page table when destroy fails
+
+From: Claudio Imbrenda <imbrenda@linux.ibm.com>
+
+[ 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 <imbrenda@linux.ibm.com>
+Fixes: 29b40f105ec8d55 ("KVM: s390: protvirt: Add initial vm and cpu lifecycle handling")
+Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
+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 <frankja@linux.ibm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..5739752
--- /dev/null
@@ -0,0 +1,67 @@
+From c3f2018721a747f653a61f85fbac36b3d91821ad Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 Mar 2021 10:13:55 +0100
+Subject: lib: bitmap: order includes alphabetically
+
+From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+
+[ Upstream commit c13656b904b6173aad723d9680a81c60de2f5edc ]
+
+For better readability and maintenance: order the includes in bitmap
+source files alphabetically.
+
+Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <linux/types.h>
+ #include <linux/bitops.h>
+-#include <linux/string.h>
+ #include <linux/kernel.h>
++#include <linux/string.h>
++#include <linux/types.h>
+ /*
+  * 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 <linux/export.h>
+-#include <linux/thread_info.h>
+-#include <linux/ctype.h>
+-#include <linux/errno.h>
++
+ #include <linux/bitmap.h>
+ #include <linux/bitops.h>
+ #include <linux/bug.h>
++#include <linux/ctype.h>
++#include <linux/errno.h>
++#include <linux/export.h>
+ #include <linux/kernel.h>
+ #include <linux/mm.h>
+ #include <linux/slab.h>
+ #include <linux/string.h>
++#include <linux/thread_info.h>
+ #include <linux/uaccess.h>
+ #include <asm/page.h>
+-- 
+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 (file)
index 0000000..1795014
--- /dev/null
@@ -0,0 +1,99 @@
+From 147c3a3b0bcc0d0dc8f8fed4329fa56d7caf2480 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 Mar 2021 10:13:56 +0100
+Subject: lib: bitmap: provide devm_bitmap_alloc() and devm_bitmap_zalloc()
+
+From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+
+[ Upstream commit e829c2e4744850bab4d8f8ffebd00df10b4c6c2b ]
+
+Provide managed variants of bitmap_alloc() and bitmap_zalloc().
+
+Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <linux/string.h>
+ #include <linux/types.h>
++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 <linux/bitops.h>
+ #include <linux/bug.h>
+ #include <linux/ctype.h>
++#include <linux/device.h>
+ #include <linux/errno.h>
+ #include <linux/export.h>
+ #include <linux/kernel.h>
+@@ -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 (file)
index 0000000..2e0cdd1
--- /dev/null
@@ -0,0 +1,42 @@
+From 95b7c19b0d001f05dc9cd66bc7c1c78db66a1fc4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 22 Jun 2022 14:46:31 +0900
+Subject: lib/smp_processor_id: fix imbalanced instrumentation_end() call
+
+From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+
+[ 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 <penguin-kernel@I-love.SAKURA.ne.jp>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: Alexandre Chartre <alexandre.chartre@oracle.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..bab41b6
--- /dev/null
@@ -0,0 +1,74 @@
+From d688e80427abc91874fce03f5f8d9ee1cdaff8f9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <leiqi96@hotmail.com>
+
+[ 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 <leiqi96@hotmail.com>
+Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
+Link: https://lore.kernel.org/bpf/OSZP286MB1725CEA1C95C5CB8E7CCC53FB8869@OSZP286MB1725.JPNP286.PROD.OUTLOOK.COM
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f4417d6
--- /dev/null
@@ -0,0 +1,101 @@
+From b4a9ffd6d35249382197bded23da91ff747ad91d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Jun 2022 15:26:06 +0200
+Subject: locking/lockdep: Fix lockdep_init_map_*() confusion
+
+From: Peter Zijlstra <peterz@infradead.org>
+
+[ 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) <peterz@infradead.org>
+Link: https://lkml.kernel.org/r/YqyEDtoan20K0CVD@worktop.programming.kicks-ass.net
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6f5ec34
--- /dev/null
@@ -0,0 +1,45 @@
+From c73143aa0333a1fbe2174954d65993af13a6083a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 Jul 2022 18:56:49 +0200
+Subject: media: cedrus: hevc: Add check for invalid timestamp
+
+From: Jernej Skrabec <jernej.skrabec@gmail.com>
+
+[ 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 <jernej.skrabec@gmail.com>
+Reviewed-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..fc8406e
--- /dev/null
@@ -0,0 +1,44 @@
+From 7bb0bbbed5e1d8e1c23ab5a0162ba24ab6ffb267 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 14 Jun 2022 18:50:02 +0100
+Subject: media: hdpvr: fix error value returns in hdpvr_read
+
+From: Niels Dossche <dossche.niels@gmail.com>
+
+[ 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 <dossche.niels@gmail.com>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..863e7c8
--- /dev/null
@@ -0,0 +1,57 @@
+From 0a05c9ecf52835462d0ee88597d3e1b08b948c2c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 Jun 2022 14:55:46 +0100
+Subject: media: platform: mtk-mdp: Fix mdp_ipi_comm structure alignment
+
+From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+
+[ 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 <angelogioacchino.delregno@collabora.com>
+Reviewed-by: Houlong Wei <houlong.wei@mediatek.com>
+Reviewed-by: Irui Wang <irui.wang@mediatek.com>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..e5c1f5d
--- /dev/null
@@ -0,0 +1,41 @@
+From acccb329b71b23496067a6f53641f708b818b582 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 21 Jun 2022 06:30:30 +0100
+Subject: media: tw686x: Fix memory leak in tw686x_video_init
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..60655d0
--- /dev/null
@@ -0,0 +1,82 @@
+From b7b3e803b37f790cb0321de88d5d455de3db13e8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 21 May 2022 07:24:01 +0100
+Subject: media: tw686x: Register the irq at the end of probe
+
+From: Zheyu Ma <zheyuma97@gmail.com>
+
+[ 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 <zheyuma97@gmail.com>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f5bc363
--- /dev/null
@@ -0,0 +1,44 @@
+From fc1bd72c764f197fa28f95f36ae737de33ccdec0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Jun 2022 04:19:20 +0100
+Subject: media: v4l2-mem2mem: prevent pollerr when last_buffer_dequeued is set
+
+From: Ming Qian <ming.qian@nxp.com>
+
+[ 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 <ming.qian@nxp.com>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..5ad7f3e
--- /dev/null
@@ -0,0 +1,36 @@
+From 698514726dd506efb21bfd0fe6c941a72462a877 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <windhl@126.com>
+
+[ 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 <windhl@126.com>
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..250c1a7
--- /dev/null
@@ -0,0 +1,39 @@
+From 89908c670d37f80b0ac1b69272830ae51217832d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 25 Jun 2022 14:55:56 +0200
+Subject: memstick/ms_block: Fix a memory leak
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ 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 <christophe.jaillet@wanadoo.fr>
+Link: https://lore.kernel.org/r/b3b78926569445962ea5c3b6e9102418a9effb88.1656155715.git.christophe.jaillet@wanadoo.fr
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6e2a465
--- /dev/null
@@ -0,0 +1,65 @@
+From ab528eeb206bd0dfe77306295a7afa4579386f72 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 25 Jun 2022 14:55:25 +0200
+Subject: memstick/ms_block: Fix some incorrect memory allocation
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ 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 <christophe.jaillet@wanadoo.fr>
+Link: https://lore.kernel.org/r/dbf633c48c24ae6d95f852557e8d8b3bbdef65fe.1656155715.git.christophe.jaillet@wanadoo.fr
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6c08aa2
--- /dev/null
@@ -0,0 +1,38 @@
+From 7c288758604318af63d4912cf1e5c12d54fd0919 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 24 May 2022 10:57:29 +0400
+Subject: meson-mx-socinfo: Fix refcount leak in meson_mx_socinfo_init
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Link: https://lore.kernel.org/r/20220524065729.33689-1-linmq006@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..a0941c6
--- /dev/null
@@ -0,0 +1,42 @@
+From 644260bda4f6b9e6196a72e367a322a785cb3dc3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 1 Jun 2022 08:32:22 +0400
+Subject: mfd: max77620: Fix refcount leak in max77620_initialise_fps
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Link: https://lore.kernel.org/r/20220601043222.64441-1-linmq006@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..e951a57
--- /dev/null
@@ -0,0 +1,70 @@
+From cf29e042947992a3af3eb8ef12beb620934b17d1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <u.kleine-koenig@pengutronix.de>
+
+[ 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 <u.kleine-koenig@pengutronix.de>
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Link: https://lore.kernel.org/r/20220530192430.2108217-3-u.kleine-koenig@pengutronix.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..318fc82
--- /dev/null
@@ -0,0 +1,51 @@
+From f12af81f01ef2b8a18754ac1940d812b4eff02f5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Jun 2022 07:33:44 +0200
+Subject: misc: rtsx: Fix an error handling path in rtsx_pci_probe()
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ 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 <christophe.jaillet@wanadoo.fr>
+Link: https://lore.kernel.org/r/e8dc41716cbf52fb37a12e70d8972848e69df6d6.1655271216.git.christophe.jaillet@wanadoo.fr
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..dbceee6
--- /dev/null
@@ -0,0 +1,40 @@
+From 86a1f201d6881455e620b628813cbe8ea549a2a9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <linmiaohe@huawei.com>
+
+[ 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 <linmiaohe@huawei.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d541789
--- /dev/null
@@ -0,0 +1,129 @@
+From 68b34524cf4a4e35a30a1cfb731c5a89369574d9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 Jul 2022 12:43:09 +0000
+Subject: mmc: block: Add single read for 4k sector cards
+
+From: Christian Loehle <CLoehle@hyperstone.com>
+
+[ 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 <cloehle@hyperstone.com>
+Acked-by: Adrian Hunter <adrian.hunter@intel.com>
+Reviewed-by: Avri Altman <avri.altman@wdc.com>
+Link: https://lore.kernel.org/r/cf4f316274c5474586d0d99b17db4a4c@hyperstone.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..dc827af
--- /dev/null
@@ -0,0 +1,38 @@
+From 1e29cbad12151564736939972238fece1d7226b3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <windhl@126.com>
+
+[ 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 <windhl@126.com>
+Acked-by: Robert Richter <rric@kernel.org>
+Link: https://lore.kernel.org/r/20220719095216.1241601-1-windhl@126.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d520137
--- /dev/null
@@ -0,0 +1,42 @@
+From 4aa84ce94dac93fcf83af1134cdf3b9398d6d497 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <windhl@126.com>
+
+[ 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 <windhl@126.com>
+Acked-by: Robert Richter <rric@kernel.org>
+Link: https://lore.kernel.org/r/20220719095216.1241601-2-windhl@126.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..817ece1
--- /dev/null
@@ -0,0 +1,48 @@
+From 87d34c5f4927d873a7c779a48c9b91664adc8162 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Jun 2022 12:09:26 +0300
+Subject: mmc: sdhci-of-at91: fix set_uhs_signaling rewriting of MC1R
+
+From: Eugen Hristev <eugen.hristev@microchip.com>
+
+[ 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 <eugen.hristev@microchip.com>
+Tested-by: Karl Olsen <karl@micro-technic.com>
+Acked-by: Adrian Hunter <adrian.hunter@intel.com>
+Link: https://lore.kernel.org/r/20220630090926.15061-1-eugen.hristev@microchip.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ba15434
--- /dev/null
@@ -0,0 +1,38 @@
+From a2215ed4773861bd9c59a068b45079ae51bd5449 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Link: https://lore.kernel.org/r/20220523144255.10310-1-linmq006@gmail.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..5bb9f07
--- /dev/null
@@ -0,0 +1,37 @@
+From d7e824f51dfb70430ea44e4af08516c22a53b37f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 May 2022 18:37:07 +0200
+Subject: mt76: mt76x02u: fix possible memory leak in __mt76x02u_mcu_send_msg
+
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+
+[ 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 <soyer@irl.hu>
+Signed-off-by: Gergo Koteles <soyer@irl.hu>
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..91a64be
--- /dev/null
@@ -0,0 +1,38 @@
+From e3c8d4de24a2946f8b80bb7c7aa1cf022f0137fa Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 23 May 2022 18:32:55 +0400
+Subject: mtd: maps: Fix refcount leak in ap_flash_init
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Link: https://lore.kernel.org/linux-mtd/20220523143255.4376-1-linmq006@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..5e564f7
--- /dev/null
@@ -0,0 +1,38 @@
+From c7ac7196af7b8d5f349eb29b7fee7d806acfbb86 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 23 May 2022 18:02:05 +0400
+Subject: mtd: maps: Fix refcount leak in of_flash_probe_versatile
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Link: https://lore.kernel.org/linux-mtd/20220523140205.48625-1-linmq006@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..58eb12f
--- /dev/null
@@ -0,0 +1,38 @@
+From 7a88ea4cae1d33d8e32670b0822337b8618fbf4e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 May 2022 15:06:49 +0400
+Subject: mtd: partitions: Fix refcount leak in parse_redboot_of
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Link: https://lore.kernel.org/linux-mtd/20220526110652.64849-1-linmq006@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..fe46180
--- /dev/null
@@ -0,0 +1,46 @@
+From 1da3ae5db1bae74515b4b779537a53e09cf19f9c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 20 May 2022 18:41:40 +0200
+Subject: mtd: rawnand: meson: Fix a potential double free issue
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ 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 <christophe.jaillet@wanadoo.fr>
+Acked-by: Liang Yang <liang.yang@amlogic.com>
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Link: https://lore.kernel.org/linux-mtd/ec15c358b8063f7c50ff4cd628cf0d2e14e43f49.1653064877.git.christophe.jaillet@wanadoo.fr
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..78c8a3a
--- /dev/null
@@ -0,0 +1,53 @@
+From 0041c8fed25da58382d8add642a06e13f6afa2a4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <duoming@zju.edu.cn>
+
+[ 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 <duoming@zju.edu.cn>
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Link: https://lore.kernel.org/linux-mtd/20220524044841.10517-1-duoming@zju.edu.cn
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..27fa1e3
--- /dev/null
@@ -0,0 +1,49 @@
+From 44cd60cb833ba8297c0540c20f1c06782086b8c9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <u.kleine-koenig@pengutronix.de>
+
+[ 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 <u.kleine-koenig@pengutronix.de>
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Link: https://lore.kernel.org/linux-mtd/20220607152458.232847-2-u.kleine-koenig@pengutronix.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..abf2ed8
--- /dev/null
@@ -0,0 +1,173 @@
+From fff8df333536cf7064455ae09696af82a1c54ec8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 7 Jun 2022 11:26:26 +0800
+Subject: mwifiex: fix sleep in atomic context bugs caused by dev_coredumpv
+
+From: Duoming Zhou <duoming@zju.edu.cn>
+
+[ 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]  <IRQ>
+[  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 <briannorris@chromium.org>
+Signed-off-by: Duoming Zhou <duoming@zju.edu.cn>
+Link: https://lore.kernel.org/r/b63b77fc84ed3e8a6bef02378e17c7c71a0bc3be.1654569290.git.duoming@zju.edu.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <linux/pm_runtime.h>
+ #include <linux/slab.h>
+ #include <linux/of_irq.h>
++#include <linux/workqueue.h>
+ #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 (file)
index 0000000..e126a1f
--- /dev/null
@@ -0,0 +1,81 @@
+From 4811c9bfbc02e1c12a5b6aa4b850b592951c105e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <verdre@v0yd.nl>
+
+[ 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 <verdre@v0yd.nl>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+Link: https://lore.kernel.org/r/20211103205827.14559-1-verdre@v0yd.nl
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..df3e3e4
--- /dev/null
@@ -0,0 +1,126 @@
+From ffadb36da19287790f6fd507e3b4a133be29386b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <mvrmanning@gmail.com>
+
+[ 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 <vrf>'. 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 <mvrmanning@gmail.com>
+Link: https://lore.kernel.org/netdev/a54c149aed38fded2d3b5fdb1a6c89e36a083b74.camel@lasnet.de/
+Reviewed-by: David Ahern <dsahern@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ee6c3c9
--- /dev/null
@@ -0,0 +1,58 @@
+From 65104b29a6e4b11c827436aaeaa6d7777d0530c0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Jun 2022 23:34:10 -0700
+Subject: net: fix sk_wmem_schedule() and sk_rmem_schedule() errors
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ 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 <edumazet@google.com>
+Reviewed-by: Shakeel Butt <shakeelb@google.com>
+Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..18ceae2
--- /dev/null
@@ -0,0 +1,98 @@
+From b8c829f26ad91387c7d5bb2f90593731240eab25 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 5 Jul 2022 19:22:23 +0800
+Subject: net: hinic: avoid kernel hung in hinic_get_stats64()
+
+From: Qiao Ma <mqaio@linux.alibaba.com>
+
+[ 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 <mqaio@linux.alibaba.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..41a9a21
--- /dev/null
@@ -0,0 +1,271 @@
+From 76fee08f857f10c4b49589ea07a13f4f3b6b7bb2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 5 Jul 2022 19:22:22 +0800
+Subject: net: hinic: fix bug that ethtool get wrong stats
+
+From: Qiao Ma <mqaio@linux.alibaba.com>
+
+[ 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 <mqaio@linux.alibaba.com>
+Reported-by: kernel test robot <lkp@intel.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ab02540
--- /dev/null
@@ -0,0 +1,42 @@
+From 281a2891bcb10507cb34a1454bd6b4969d09cea8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <shenjian15@huawei.com>
+
+[ 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 <shenjian15@huawei.com>
+Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
+Acked-by: Shannon Nelson <snelson@pensando.io>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0ec06a5
--- /dev/null
@@ -0,0 +1,40 @@
+From 8b2428b2e607bbba9276d81a35c6d5ecc0193a11 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 May 2022 16:48:47 +0300
+Subject: net/mlx5e: Fix the value of MLX5E_MAX_RQ_NUM_MTTS
+
+From: Maxim Mikityanskiy <maximmi@nvidia.com>
+
+[ 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 <maximmi@nvidia.com>
+Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
+Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0ef928c
--- /dev/null
@@ -0,0 +1,43 @@
+From dec938d85998aeffb1c6423c5f240a090651d969 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <gal@nvidia.com>
+
+[ 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 <gal@nvidia.com>
+Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
+Reviewed-by: Maxim Mikityanskiy <maximmi@nvidia.com>
+Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0379185
--- /dev/null
@@ -0,0 +1,110 @@
+From d947d27d5f30ac03e945ce557a621493a5f03187 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 Jul 2022 09:12:32 +0000
+Subject: net: rose: fix netdev reference changes
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ 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 <f6bvp@free.fr>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Tested-by: Bernard Pidoux <f6bvp@free.fr>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..a674013
--- /dev/null
@@ -0,0 +1,54 @@
+From 551f8ff2f6d70e75f3d911c516e50bdba5fb377f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 26 Jul 2022 14:36:05 -0700
+Subject: netdevsim: Avoid allocation warnings triggered from user space
+
+From: Jakub Kicinski <kuba@kernel.org>
+
+[ 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 <kuba@kernel.org>
+Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
+Link: https://lore.kernel.org/bpf/20220726213605.154204-1-kuba@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6eea258
--- /dev/null
@@ -0,0 +1,53 @@
+From 4da556906e7409f356f4cf3c146829c771debbc8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 26 Jul 2022 12:44:35 +0200
+Subject: netfilter: nf_tables: add rescheduling points during loop detection
+ walks
+
+From: Florian Westphal <fw@strlen.de>
+
+[ 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 <fw@strlen.de>
+Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..516ffca
--- /dev/null
@@ -0,0 +1,67 @@
+From 2e82caae6c273a7aaf6b517be2fc1ea1f83eccd2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 6 Jun 2022 17:23:45 +0200
+Subject: netfilter: xtables: Bring SPDX identifier back
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+[ 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 <manojbm@codeaurora.org>
+Cc: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
+Cc: Pablo Neira Ayuso <pablo@netfilter.org>
+Cc: netfilter-devel@vger.kernel.org
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <luciano.coelho@nokia.com>
+  *
+  * Contact: Luciano Coelho <luciano.coelho@nokia.com>
+- *
+- * 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 (file)
index 0000000..46f3b96
--- /dev/null
@@ -0,0 +1,118 @@
+From c5be1b74884ddd1020f4cc0f793acd160466860a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <nsaenzju@redhat.com>
+
+[ 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 <nsaenzju@redhat.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Reviewed-by: Valentin Schneider <vschneid@redhat.com>
+Reviewed-by: Phil Auld <pauld@redhat.com>
+Link: https://lore.kernel.org/r/20220628092259.330171-1-nsaenzju@redhat.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6ff12f7
--- /dev/null
@@ -0,0 +1,62 @@
+From a335af4672081d78bd46f6b4e1f9107b85c44b6c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 Jul 2022 11:12:14 +0300
+Subject: null_blk: fix ida error handling in null_add_dev()
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ 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 <dan.carpenter@oracle.com>
+Link: https://lore.kernel.org/r/YtEhXsr6vJeoiYhd@kili
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d1d2f56
--- /dev/null
@@ -0,0 +1,40 @@
+From 6151791cc944217bcf1351878e29b0fe8c68e343 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <beanhuo@micron.com>
+
+[ 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 <beanhuo@micron.com>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..13bd462
--- /dev/null
@@ -0,0 +1,39 @@
+From 849b97ad14c31a3b51e1f08014fba2e7f0f1a5e9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 24 May 2022 20:31:51 +0800
+Subject: opp: Fix error check in dev_pm_opp_attach_genpd()
+
+From: Tang Bin <tangbin@cmss.chinamobile.com>
+
+[ 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 <tangbin@cmss.chinamobile.com>
+[ Viresh: Replace ENODATA with ENODEV ]
+Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..fcbacf5
--- /dev/null
@@ -0,0 +1,71 @@
+From c259d8c4513bd4ee9fc1ae9aa2b742bd9f52148b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <Sergey.Semin@baikalelectronics.ru>
+
+[ 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 <manivannan.sadhasivam@linaro.org>
+Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+Reviewed-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..be5b314
--- /dev/null
@@ -0,0 +1,62 @@
+From fb6bceda1329d7ebb2286b2994f31934e759a7ec Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <Sergey.Semin@baikalelectronics.ru>
+
+[ 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 <Sergey.Semin@baikalelectronics.ru>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Vidya Sagar <vidyas@nvidia.com>
+Reviewed-by: Rob Herring <robh@kernel.org>
+Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..5882e14
--- /dev/null
@@ -0,0 +1,66 @@
+From b24fb9c9058c2f5cab7f7d5f7b83cd5090bc9e90 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 24 Jun 2022 17:34:15 +0300
+Subject: PCI: dwc: Deallocate EPC memory on dw_pcie_ep_init() errors
+
+From: Serge Semin <Sergey.Semin@baikalelectronics.ru>
+
+[ 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 <manivannan.sadhasivam@linaro.org>
+Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Rob Herring <robh@kernel.org>
+Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../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 (file)
index 0000000..635f0c9
--- /dev/null
@@ -0,0 +1,41 @@
+From d272328869e25d34c44d46cc8fd6866acafc0957 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 22 Jun 2022 13:09:24 +0900
+Subject: PCI: endpoint: Don't stop controller when unbinding endpoint function
+
+From: Shunsuke Mie <mie@igel.co.jp>
+
+[ 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 <mie@igel.co.jp>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Acked-by: Kishon Vijay Abraham I <kishon@ti.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b80bae2
--- /dev/null
@@ -0,0 +1,106 @@
+From 47afc81978e9273dab8f7287965338c59d29459c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <sr@denx.de>
+
+[ 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 <sr@denx.de>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Pali Rohár <pali@kernel.org>
+Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
+Cc: Bharat Kumar Gogada <bharat.kumar.gogada@xilinx.com>
+Cc: Michal Simek <michal.simek@xilinx.com>
+Cc: Yao Hongbo <yaohongbo@linux.alibaba.com>
+Cc: Naveen Naidu <naveennaidu479@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..3bcfc0f
--- /dev/null
@@ -0,0 +1,68 @@
+From 1d2867f32842e4d310f86e61433d086c39078ba8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <ansuelsmth@gmail.com>
+
+[ 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 <ansuelsmth@gmail.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b397041
--- /dev/null
@@ -0,0 +1,37 @@
+From a375c435dc058c3bd5167dac88b8374467664659 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 Jul 2022 19:50:50 +0530
+Subject: PCI: tegra194: Fix link up retry sequence
+
+From: Vidya Sagar <vidyas@nvidia.com>
+
+[ 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 <vidyas@nvidia.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..8257408
--- /dev/null
@@ -0,0 +1,40 @@
+From 43226f1cb6ea98d5c42dbc939b109cf7dd1761f8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 2 Jun 2022 07:19:08 +0400
+Subject: PCI: tegra194: Fix PM error handling in tegra_pcie_config_ep()
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Vidya Sagar <vidyas@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..abe46d5
--- /dev/null
@@ -0,0 +1,115 @@
+From bf5dcf95e8bbe15f8fc023197c9ca101b16eb94f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 Jul 2022 19:50:46 +0530
+Subject: PCI: tegra194: Fix Root Port interrupt handling
+
+From: Vidya Sagar <vidyas@nvidia.com>
+
+[ 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 <vidyas@nvidia.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..fe709d1
--- /dev/null
@@ -0,0 +1,107 @@
+From 5507047c68e46553897942e05c879e62a1cb6e36 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 31 Jul 2022 09:49:23 -0700
+Subject: perf symbol: Fail to read phdr workaround
+
+From: Ian Rogers <irogers@google.com>
+
+[ 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 <leo.yan@linaro.org>
+Signed-off-by: Ian Rogers <irogers@google.com>
+Tested-by: Leo Yan <leo.yan@linaro.org>
+Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Cc: Jiri Olsa <jolsa@kernel.org>
+Cc: Leo Yan <leo.yan@linaro.org>
+Cc: Mark Rutland <mark.rutland@arm.com>
+Cc: Namhyung Kim <namhyung@kernel.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Stephane Eranian <eranian@google.com>
+Link: http://lore.kernel.org/lkml/20220731164923.691193-1-irogers@google.com
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6bb5819
--- /dev/null
@@ -0,0 +1,57 @@
+From 54bb8edf78fe1f262d58000cd7295b045d1b904e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 11 Jul 2022 12:31:44 +0300
+Subject: perf tools: Fix dso_id inode generation comparison
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+[ 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 <adrian.hunter@intel.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Ian Rogers <irogers@google.com>
+Cc: Jiri Olsa <jolsa@kernel.org>
+Cc: kvm@vger.kernel.org
+Cc: Namhyung Kim <namhyung@kernel.org>
+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 <acme@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d510ca8
--- /dev/null
@@ -0,0 +1,64 @@
+From aeeff4a8668fcf77f20b1daf3f15a5d65f1a90ae Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 14 Jun 2022 00:57:26 -0700
+Subject: platform/chrome: cros_ec: Always expose last resume result
+
+From: Stephen Boyd <swboyd@chromium.org>
+
+[ 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 <rajatja@chromium.org>
+Cc: Matthias Kaehlcke <mka@chromium.org>
+Cc: Hsin-Yi Wang <hsinyi@chromium.org>
+Cc: Tzung-Bi Shih <tzungbi@kernel.org>
+Reviewed-by: Guenter Roeck <groeck@chromium.org>
+Reviewed-by: Evan Green <evgreen@chromium.org>
+Fixes: 7235560ac77a ("platform/chrome: Add support for v1 of host sleep event")
+Signed-off-by: Stephen Boyd <swboyd@chromium.org>
+Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
+Link: https://lore.kernel.org/r/20220614075726.2729987-1-swboyd@chromium.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f547b91
--- /dev/null
@@ -0,0 +1,50 @@
+From e4a6224a8b6b6aac2a6c7b037890832dfea13797 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 20 Jul 2022 21:23:38 +0300
+Subject: platform/olpc: Fix uninitialized data in debugfs write
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ 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 <dan.carpenter@oracle.com>
+Link: https://lore.kernel.org/r/YthIKn+TfZSZMEcM@kili
+Reviewed-by: Hans de Goede <hdegoede@redhat.com>
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b66d6c0
--- /dev/null
@@ -0,0 +1,106 @@
+From 710f2a1899d5e37492f39335536942687ab9059a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 Jul 2022 14:49:58 +0900
+Subject: PM: hibernate: defer device probing when resuming from hibernation
+
+From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+
+[ 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 <syzbot+358c9ab4c93da7b7238c@syzkaller.appspotmail.com>
+Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+Tested-by: syzbot <syzbot+358c9ab4c93da7b7238c@syzkaller.appspotmail.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..bde7ce3
--- /dev/null
@@ -0,0 +1,48 @@
+From e537298ff2fee5ff3e1a90f1221f99aea0ba3b22 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <christophe.leroy@csgroup.eu>
+
+[ 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 <christophe.leroy@csgroup.eu>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/8abab4888da69ff78b73a56f64d9678a7bf684e9.1657549153.git.christophe.leroy@csgroup.eu
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..503e9da
--- /dev/null
@@ -0,0 +1,55 @@
+From e67c09ba122a2e4f72a720e8003c13f3588b62f1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 Jul 2022 23:44:18 +1000
+Subject: powerpc/64s: Disable stack variable initialisation for prom_init
+
+From: Michael Ellerman <mpe@ellerman.id.au>
+
+[ 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 <sudipm.mukherjee@gmail.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20220718134418.354114-1-mpe@ellerman.id.au
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..276803b
--- /dev/null
@@ -0,0 +1,37 @@
+From bd24a0ca15198109d02c5849f72c7119a5a7e452 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20220605065129.63906-1-linmq006@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..c2d36d5
--- /dev/null
@@ -0,0 +1,61 @@
+From 122a491060eb1558a4757154dfac85c9bc742169 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <mpe@ellerman.id.au>
+
+[ 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 <pali@kernel.org>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20220802105723.1055178-1-mpe@ellerman.id.au
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f3af3c0
--- /dev/null
@@ -0,0 +1,88 @@
+From 912e5dc598381b630f1c495337376027e696b4b7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <pali@kernel.org>
+
+[ 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 <pali@kernel.org>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20220706102148.5060-2-pali@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..fdaaae3
--- /dev/null
@@ -0,0 +1,157 @@
+From 8068339ac2c3d5d3303202c36559186fec5a3ad2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <atrajeev@linux.vnet.ibm.com>
+
+[ 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 <atrajeev@linux.vnet.ibm.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20220522142256.24699-1-atrajeev@linux.vnet.ibm.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..29ad3b1
--- /dev/null
@@ -0,0 +1,38 @@
+From 00b06387c77e19ccdca6895284be149764e4d042 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 3 Jun 2022 16:15:42 +0400
+Subject: powerpc/spufs: Fix refcount leak in spufs_init_isolated_loader
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Acked-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20220603121543.22884-1-linmq006@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..7487096
--- /dev/null
@@ -0,0 +1,37 @@
+From 1b0d8005f649e7e0bd3b31749b243b8c147555f3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 5 Jun 2022 09:32:23 +0400
+Subject: powerpc/xive: Fix refcount leak in xive_get_max_prio
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20220605053225.56125-1-linmq006@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..c093528
--- /dev/null
@@ -0,0 +1,91 @@
+From 9bfcbfe54ff37f981b2037e145221621826630d4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 31 May 2022 09:28:54 +0800
+Subject: profiling: fix shift too large makes kernel panic
+
+From: Chen Zhongjin <chenzhongjin@huawei.com>
+
+[ 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:
+  <TASK>
+  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
+  </TASK>
+ 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 <chenzhongjin@huawei.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..2f6e576
--- /dev/null
@@ -0,0 +1,41 @@
+From f3aa3733ee2ad272242440d575e3f747606d3779 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <uwe@kleine-koenig.org>
+
+[ 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 <uwe@kleine-koenig.org>
+Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..4550005
--- /dev/null
@@ -0,0 +1,47 @@
+From d64c9da65e1d3ca1b1b7996ec2e0c22b8731f04c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <tiny.windzz@gmail.com>
+
+[ Upstream commit 74ec20a4e6a064ac2cdfb577c115cb948b307f0f ]
+
+Use devm_platform_ioremap_resource() to simplify code.
+
+Signed-off-by: Yangtao Li <tiny.windzz@gmail.com>
+Reviewed-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
+Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ab3ba6f
--- /dev/null
@@ -0,0 +1,52 @@
+From a9424c1901b645144db7686d0ccd74b70ca7576a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <u.kleine-koenig@pengutronix.de>
+
+[ 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 <u.kleine-koenig@pengutronix.de>
+Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9851134
--- /dev/null
@@ -0,0 +1,116 @@
+From 158e4adeb675da673db4f78c85e40b87c73cdd54 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <u.kleine-koenig@pengutronix.de>
+
+[ 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 <u.kleine-koenig@pengutronix.de>
+Tested-by: Emil Renner Berthing <emil.renner.berthing@canonical.com>
+Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..3480baf
--- /dev/null
@@ -0,0 +1,50 @@
+From 275b0c7086d990d329cb874849636ba74828dc17 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <u.kleine-koenig@pengutronix.de>
+
+[ 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 <u.kleine-koenig@pengutronix.de>
+Tested-by: Emil Renner Berthing <emil.renner.berthing@canonical.com>
+Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..14d4f40
--- /dev/null
@@ -0,0 +1,74 @@
+From 6b4ba25fab07fb031bc674a9e2a5dfe79d23f6d8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <u.kleine-koenig@pengutronix.de>
+
+[ 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 <u.kleine-koenig@pengutronix.de>
+Tested-by: Emil Renner Berthing <emil.renner.berthing@canonical.com>
+Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..77a2f80
--- /dev/null
@@ -0,0 +1,45 @@
+From 467fefc9210de9ef6a2b82db73f7bef9a82af388 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 11 Jul 2022 15:07:18 +0800
+Subject: RDMA/hfi1: fix potential memory leak in setup_base_ctxt()
+
+From: Jianglei Nie <niejianglei2021@163.com>
+
+[ 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 <niejianglei2021@163.com>
+Acked-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..e5b8e49
--- /dev/null
@@ -0,0 +1,41 @@
+From d9664305ada7296d5fe5f68f2f8e13c986387f3d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Jul 2022 21:43:51 +0800
+Subject: RDMA/hns: Fix incorrect clearing of interrupt status register
+
+From: Haoyue Xu <xuhaoyue1@hisilicon.com>
+
+[ 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 <xuhaoyue1@hisilicon.com>
+Signed-off-by: Wenpeng Liang <liangwenpeng@huawei.com>
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..8766863
--- /dev/null
@@ -0,0 +1,46 @@
+From dee72002da5c95e6c16d768b77ab9df398db3b2b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <maorg@nvidia.com>
+
+[ 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 <itayav@nvidia.com>
+Signed-off-by: Maor Gottlieb <maorg@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b239c8d
--- /dev/null
@@ -0,0 +1,67 @@
+From f34d15ecdd509212ef7a14b82a675583f33a8b10 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <niejianglei2021@163.com>
+
+[ 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 <niejianglei2021@163.com>
+Acked-by: Michal Kalderon <michal.kalderon@marvell.com>
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0524c49
--- /dev/null
@@ -0,0 +1,68 @@
+From 912b7bdd501d352bc16b2e2689febc275bd0f74c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 29 Jul 2021 18:17:32 +0300
+Subject: RDMA/qedr: Improve error logs for rdma_alloc_tid error return
+
+From: Prabhakar Kushwaha <pkushwaha@marvell.com>
+
+[ 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 <smalin@marvell.com>
+Signed-off-by: Ariel Elior <aelior@marvell.com>
+Signed-off-by: Prabhakar Kushwaha <pkushwaha@marvell.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..a031a40
--- /dev/null
@@ -0,0 +1,60 @@
+From d5218245bf30bc0c2607fa73e0a73f5a40b271e3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 31 May 2021 14:28:35 +0200
+Subject: RDMA/rtrs: Avoid Wtautological-constant-out-of-range-compare
+
+From: Jack Wang <jinpu.wang@ionos.com>
+
+[ 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 <jinpu.wang@ionos.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6582a74
--- /dev/null
@@ -0,0 +1,53 @@
+From 84cd54691015667e459ba322bdba94ac596eb0ba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 28 May 2021 13:30:04 +0200
+Subject: RDMA/rtrs: Define MIN_CHUNK_SIZE
+
+From: Gioh Kim <gi-oh.kim@cloud.ionos.com>
+
+[ 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 <gi-oh.kim@ionos.com>
+Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..61fa642
--- /dev/null
@@ -0,0 +1,65 @@
+From 60608531e57d92c9a2917f97864694e250a785ea Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 Jul 2022 12:31:09 +0200
+Subject: RDMA/rtrs-srv: Fix modinfo output for stringify
+
+From: Jack Wang <jinpu.wang@ionos.com>
+
+[ 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 <jinpu.wang@ionos.com>
+Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
+Reviewed-by: Aleksei Marov <aleksei.marov@ionos.com>
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..5ae022c
--- /dev/null
@@ -0,0 +1,69 @@
+From 65519be63fd98d9bb7f856aa9a74bea2978da9f2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 31 Jul 2022 02:36:21 -0400
+Subject: RDMA/rxe: Fix error unwind in rxe_create_qp()
+
+From: Zhu Yanjun <yanjun.zhu@linux.dev>
+
+[ 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 <yanjun.zhu@linux.dev>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..a6f4109
--- /dev/null
@@ -0,0 +1,73 @@
+From b151fea368f6035ac950c07e6562405bcc0511bd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Jul 2022 09:30:47 +0800
+Subject: RDMA/siw: Fix duplicated reported IW_CM_EVENT_CONNECT_REPLY event
+
+From: Cheng Xu <chengyou@linux.alibaba.com>
+
+[ 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 <server_ip>
+
+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:
+  <TASK>
+  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
+  </TASK>
+
+Fixes: 6c52fdc244b5 ("rdma/siw: connection management")
+Link: https://lore.kernel.org/r/dae34b5fd5c2ea2bd9744812c1d2653a34a94c67.1657706960.git.chengyou@linux.alibaba.com
+Signed-off-by: Cheng Xu <chengyou@linux.alibaba.com>
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..289f7e1
--- /dev/null
@@ -0,0 +1,85 @@
+From 723c2abd5826e5c04c9be305e945b0706d2d2d45 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Jul 2022 12:34:13 -0700
+Subject: RDMA/srpt: Duplicate port name members
+
+From: Bart Van Assche <bvanassche@acm.org>
+
+[ 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 <bvanassche@acm.org>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d2ac7e4
--- /dev/null
@@ -0,0 +1,306 @@
+From edb2f8d3aeb3cb71977d8e19d1b7035a260c2442 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Jul 2022 12:34:15 -0700
+Subject: RDMA/srpt: Fix a use-after-free
+
+From: Bart Van Assche <bvanassche@acm.org>
+
+[ 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:
+   <TASK>
+   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
+   </TASK>
+
+Link: https://lore.kernel.org/r/20220727193415.1583860-4-bvanassche@acm.org
+Reported-by: Li Zhijian <lizhijian@fujitsu.com>
+Tested-by: Li Zhijian <lizhijian@fujitsu.com>
+Fixes: a42d985bd5b2 ("ib_srpt: Initial SRP Target merge for v3.3-rc1")
+Signed-off-by: Bart Van Assche <bvanassche@acm.org>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b57da83
--- /dev/null
@@ -0,0 +1,94 @@
+From 45a81e85663da3d8a52ef79d24dff3978081deaf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Jul 2022 12:34:14 -0700
+Subject: RDMA/srpt: Introduce a reference count in struct srpt_device
+
+From: Bart Van Assche <bvanassche@acm.org>
+
+[ 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 <bvanassche@acm.org>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..1f421ac
--- /dev/null
@@ -0,0 +1,43 @@
+From 38016a175f2d4263caa77451287a1d8d608844ba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 Jul 2022 19:10:27 +0800
+Subject: regulator: of: Fix refcount leak bug in
+ of_get_regulation_constraints()
+
+From: Liang He <windhl@126.com>
+
+[ 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 <windhl@126.com>
+Link: https://lore.kernel.org/r/20220715111027.391032-1-windhl@126.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ad19ce3
--- /dev/null
@@ -0,0 +1,55 @@
+From 1898e8d140308b852275158b80587af9defad9e8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 Jun 2022 11:46:12 +0200
+Subject: regulator: qcom_smd: Fix pm8916_pldo range
+
+From: Stephan Gerhold <stephan.gerhold@kernkonzept.com>
+
+[ 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 <stephan.gerhold@kernkonzept.com>
+Link: https://lore.kernel.org/r/20220623094614.1410180-2-stephan.gerhold@kernkonzept.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..91d3363
--- /dev/null
@@ -0,0 +1,48 @@
+From b61f46c6e08b6d0304dd7fef7d934b9d8fdd6ed2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Acked-by: Suman Anna <s-anna@ti.com>
+Link: https://lore.kernel.org/r/20220605083334.23942-1-linmq006@gmail.com
+Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..c1f44f0
--- /dev/null
@@ -0,0 +1,60 @@
+From 86d27e3cb54dc00e1d451deae4a62e9d40f58712 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 May 2022 19:47:39 +0530
+Subject: remoteproc: qcom: wcnss: Fix handling of IRQs
+
+From: Sireesh Kodali <sireeshkodali1@gmail.com>
+
+[ 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 <sireeshkodali1@gmail.com>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220526141740.15834-2-sireeshkodali1@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..2050e4b
--- /dev/null
@@ -0,0 +1,78 @@
+From 96d9151aa116da46f497bdf71dab7b43bda6eaf2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 5 Jul 2022 17:38:19 +0530
+Subject: remoteproc: sysmon: Wait for SSCTL service to come up
+
+From: Sibi Sankar <quic_sibis@quicinc.com>
+
+[ 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 <mka@chromium.org>
+Signed-off-by: Sibi Sankar <quic_sibis@quicinc.com>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/1657022900-2049-7-git-send-email-quic_sibis@quicinc.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..a6ec8ce
--- /dev/null
@@ -0,0 +1,126 @@
+From ba6bd6a8e0af6c8decd6b1e6c96a4f1e68044259 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 25 May 2022 11:12:01 +0200
+Subject: rpmsg: mtk_rpmsg: Fix circular locking dependency
+
+From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+
+[ 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 <angelogioacchino.delregno@collabora.com>
+Link: https://lore.kernel.org/r/20220525091201.14210-1-angelogioacchino.delregno@collabora.com
+Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f03b168
--- /dev/null
@@ -0,0 +1,36 @@
+From a0eb6781d9bdd1c2ce8174f637dbc973e3e2cffc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 11 May 2022 16:07:37 +0400
+Subject: rpmsg: qcom_smd: Fix refcount leak in qcom_smd_parse_edge
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220511120737.57374-1-linmq006@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..00fec5d
--- /dev/null
@@ -0,0 +1,82 @@
+From 519a12cfebe2af80548888d0ae0450f4989f6413 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 29 Jan 2022 08:38:56 +0100
+Subject: s390/dump: fix old lowcore virtual vs physical address confusion
+
+From: Alexander Gordeev <agordeev@linux.ibm.com>
+
+[ 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 <hca@linux.ibm.com>
+Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
+Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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(&note, 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 <asm/checksum.h>
+ #include <asm/lowcore.h>
+ #include <asm/os_info.h>
++#include <asm/asm-offsets.h>
+ /*
+  * 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 (file)
index 0000000..045354c
--- /dev/null
@@ -0,0 +1,84 @@
+From 4d61ef8e8da258b83aae36738f00952677da3080 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 Jul 2022 07:16:33 +0200
+Subject: s390/zcore: fix race when reading from hardware system area
+
+From: Alexander Gordeev <agordeev@linux.ibm.com>
+
+[ Upstream commit 9ffed254d938c9e99eb7761c7f739294c84e0367 ]
+
+Memory buffer used for reading out data from hardware system
+area is not protected against concurrent access.
+
+Reported-by: Matthew Wilcox <willy@infradead.org>
+Fixes: 411ed3225733 ("[S390] zfcpdump support.")
+Acked-by: Heiko Carstens <hca@linux.ibm.com>
+Tested-by: Alexander Egorenkov <egorenar@linux.ibm.com>
+Link: https://lore.kernel.org/r/e68137f0f9a0d2558f37becc20af18e2939934f6.1658206891.git.agordeev@linux.ibm.com
+Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..3608cf4
--- /dev/null
@@ -0,0 +1,109 @@
+From f084aa4f03d6bc33e24f309b8afb844ea959374a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <longman@redhat.com>
+
+[ 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 <longman@redhat.com>
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Acked-by: Juri Lelli <juri.lelli@redhat.com>
+Link: https://lore.kernel.org/r/20220803015451.2219567-1-longman@redhat.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..aa540e5
--- /dev/null
@@ -0,0 +1,164 @@
+From aae2dcfad85349479b649af5bb273a6934829012 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 2 Mar 2022 19:34:30 +0100
+Subject: sched/deadline: Merge dl_task_can_attach() and dl_cpu_busy()
+
+From: Dietmar Eggemann <dietmar.eggemann@arm.com>
+
+[ 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 <dietmar.eggemann@arm.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Acked-by: Juri Lelli <juri.lelli@redhat.com>
+Link: https://lore.kernel.org/r/20220302183433.333029-4-dietmar.eggemann@arm.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..4339d97
--- /dev/null
@@ -0,0 +1,54 @@
+From 688797428a457b36c1dc74316324110b228cf1e9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 Jun 2022 07:34:11 +0800
+Subject: sched: Fix the check of nr_running at queue wakelist
+
+From: Tianchen Ding <dtcccc@linux.alibaba.com>
+
+[ 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 <vschneid@redhat.com>
+Signed-off-by: Tianchen Ding <dtcccc@linux.alibaba.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Reviewed-by: Valentin Schneider <vschneid@redhat.com>
+Link: https://lore.kernel.org/r/20220608233412.327341-2-dtcccc@linux.alibaba.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b6e3bf8
--- /dev/null
@@ -0,0 +1,47 @@
+From 5b698b3369e58f4e518ae85e6127cdf2827f66cf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 Jul 2022 11:01:23 -0700
+Subject: scripts/faddr2line: Fix vmlinux detection on arm64
+
+From: Josh Poimboeuf <jpoimboe@kernel.org>
+
+[ 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 <john.garry@huawei.com>
+Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Tested-by: John Garry <john.garry@huawei.com>
+Link: https://lore.kernel.org/r/dad1999737471b06d6188ce4cdb11329aa41682c.1658426357.git.jpoimboe@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..a0766a6
--- /dev/null
@@ -0,0 +1,68 @@
+From 3577558b5decbc35cf4dc8b3107fdfd3fd42c707 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 Jul 2022 13:47:36 -0500
+Subject: scsi: smartpqi: Fix DMA direction for RAID requests
+
+From: Mahesh Rajashekhara <Mahesh.Rajashekhara@microchip.com>
+
+[ 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 <scott.benesh@microchip.com>
+Reviewed-by: Scott Teel <scott.teel@microchip.com>
+Reviewed-by: Mike McGowen <mike.mcgowen@microchip.com>
+Reviewed-by: Kevin Barnett <kevin.barnett@microchip.com>
+Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@microchip.com>
+Signed-off-by: Don Brace <don.brace@microchip.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..919a80d
--- /dev/null
@@ -0,0 +1,39 @@
+From 24b853948b2532d1b3b9ff9c069e94fb12343800 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 Jul 2022 12:50:32 +0300
+Subject: selftests/bpf: fix a test for snprintf() overflow
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ 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 <dan.carpenter@oracle.com>
+Acked-by: Martin KaFai Lau <kafai@fb.com>
+Link: https://lore.kernel.org/r/YtZ+aD/tZMkgOUw+@kili
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..fa4192e
--- /dev/null
@@ -0,0 +1,45 @@
+From 7183a62bc12dc91d9ede3bba7639a0473dc5aaae Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 22 Jul 2022 16:02:40 -0700
+Subject: selftests: kvm: set rax before vmcall
+
+From: Andrei Vagin <avagin@google.com>
+
+[ 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 <avagin@google.com>
+Message-Id: <20220722230241.1944655-5-avagin@google.com>
+Fixes: ac4a4d6de22e ("selftests: kvm: test enforcement of paravirtual cpuid features")
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..c54039b
--- /dev/null
@@ -0,0 +1,79 @@
+From 145b46467f5e6b5f6d44b7b927e255dec36d1f0b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 2 Jun 2022 16:32:33 -0400
+Subject: selftests/livepatch: better synchronize test_klp_callbacks_busy
+
+From: Joe Lawrence <joe.lawrence@redhat.com>
+
+[ 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 <joe.lawrence@redhat.com>
+Reviewed-by: Petr Mladek <pmladek@suse.com>
+Signed-off-by: Petr Mladek <pmladek@suse.com>
+Link: https://lore.kernel.org/r/20220602203233.979681-1-joe.lawrence@redhat.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..e7ff99e
--- /dev/null
@@ -0,0 +1,47 @@
+From dbf7e0c7ab79e2c314a0cddd440d1c4ad619e2c2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 May 2022 22:34:07 +0000
+Subject: selftests/seccomp: Fix compile warning when CC=clang
+
+From: YiFei Zhu <zhuyifei@google.com>
+
+[ 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 <zhuyifei@google.com>
+Signed-off-by: Kees Cook <keescook@chromium.org>
+Link: https://lore.kernel.org/r/20220526223407.1686936-1-zhuyifei@google.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..bec2caa
--- /dev/null
@@ -0,0 +1,43 @@
+From 73278e428e0c9f4b8886b021836c4e702af2491a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Jul 2022 22:46:17 +0200
+Subject: selftests: timers: clocksource-switch: fix passing errors from child
+
+From: Wolfram Sang <wsa+renesas@sang-engineering.com>
+
+[ 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 <wsa+renesas@sang-engineering.com>
+Acked-by: John Stultz <jstultz@google.com>
+Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..219a412
--- /dev/null
@@ -0,0 +1,42 @@
+From 5068745c65ef20bfc9531ae9bd8bfe7237da1c4b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <wsa+renesas@sang-engineering.com>
+
+[ 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 <wsa+renesas@sang-engineering.com>
+Acked-by: John Stultz <jstultz@google.com>
+Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <sys/syscall.h>
+-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 (file)
index 0000000..fed20fc
--- /dev/null
@@ -0,0 +1,77 @@
+From dd2142e4608ad9738808b683b22439cf5b7ff149 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <maciej.fijalkowski@intel.com>
+
+[ 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 <maciej.fijalkowski@intel.com>
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Acked-by: Magnus Karlsson <magnus.karlsson@intel.com>
+Link: https://lore.kernel.org/bpf/20220629143458.934337-5-maciej.fijalkowski@intel.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..13a484b
--- /dev/null
@@ -0,0 +1,35 @@
+From e82d25dcad0be48c1e940b7cf39845e5b3238672 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 14 Jun 2022 10:14:49 +0800
+Subject: selinux: Add boundary check in put_entry()
+
+From: Xiu Jianfeng <xiujianfeng@huawei.com>
+
+[ Upstream commit 15ec76fb29be31df2bccb30fc09875274cba2776 ]
+
+Just like next_entry(), boundary check is necessary to prevent memory
+out-of-bound access.
+
+Signed-off-by: Xiu Jianfeng <xiujianfeng@huawei.com>
+Signed-off-by: Paul Moore <paul@paul-moore.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0edcf96
--- /dev/null
@@ -0,0 +1,110 @@
+From 286fb229d671b7638168d7afb2314dc6b96e3107 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 Apr 2022 16:27:27 +0100
+Subject: serial: 8250: Export ICR access helpers for internal use
+
+From: Maciej W. Rozycki <macro@orcam.me.uk>
+
+[ 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 <macro@orcam.me.uk>
+Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
+Link: https://lore.kernel.org/r/alpine.DEB.2.21.2204181517500.9383@angie.orcam.me.uk
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..fc1b677
--- /dev/null
@@ -0,0 +1,54 @@
+From 764513c39d611abea2f150bd4c4ed5de8c34700b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <ilpo.jarvinen@linux.intel.com>
+
+[ 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 <andy.shevchenko@gmail.com>
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Link: https://lore.kernel.org/r/20220608095431.18376-7-ilpo.jarvinen@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..7b0f02f
--- /dev/null
@@ -0,0 +1,68 @@
+From 3a2ec9442b5813e6554b487080bfcece2ce0ee31 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <u.kleine-koenig@pengutronix.de>
+
+[ 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 <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
+Link: https://lore.kernel.org/r/20220704085119.55900-1-u.kleine-koenig@pengutronix.de
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..049cdbd
--- /dev/null
@@ -0,0 +1,246 @@
+From 84bfe97f821df750b136c6d4a8529466e29ed164 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 16 Apr 2021 16:05:55 +0200
+Subject: serial: do not restore interrupt state in sysrq helper
+
+From: Johan Hovold <johan@kernel.org>
+
+[ 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 <joel@jms.id.au>
+Cc: Andrew Jeffery <andrew@aj.id.au>
+Cc: Andy Gross <agross@kernel.org>
+Cc: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Link: https://lore.kernel.org/r/20210416140557.25177-2-johan@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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
+
index 4e25bca0c38b73cab2a0cf08c893c430cbbcfdfb..794d47fae7149f4fadc9a9b4e7053a7c542dbb75 100644 (file)
@@ -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 (file)
index 0000000..e71ec06
--- /dev/null
@@ -0,0 +1,42 @@
+From 1af38a4ad88ce214b4aabef92d8ea5f811097b14 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 Jun 2022 22:49:15 +0800
+Subject: soc: amlogic: Fix refcount leak in meson-secure-pwrc.c
+
+From: Liang He <windhl@126.com>
+
+[ Upstream commit d18529a4c12f66d83daac78045ea54063bd43257 ]
+
+In meson_secure_pwrc_probe(), there is a refcount leak in one fail
+path.
+
+Signed-off-by: Liang He <windhl@126.com>
+Acked-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+Fixes: b3dde5013e13 ("soc: amlogic: Add support for Secure power domains controller")
+Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Link: https://lore.kernel.org/r/20220616144915.3988071-1-windhl@126.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6b51e63
--- /dev/null
@@ -0,0 +1,37 @@
+From 10a2d7c951f6296808cb98c01a969ad5ee6d9181 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 4 Apr 2022 11:56:03 +0200
+Subject: soc: fsl: guts: machine variable might be unset
+
+From: Michael Walle <michael@walle.cc>
+
+[ 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 <michael@walle.cc>
+Acked-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b8a4ed8
--- /dev/null
@@ -0,0 +1,43 @@
+From 2a0b738cccb8813abae0066d457a900ca5d4b40e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 6 Jun 2022 10:42:52 +0400
+Subject: soc: qcom: aoss: Fix refcount leak in qmp_cooling_devices_register
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220606064252.42595-1-linmq006@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f2020e4
--- /dev/null
@@ -0,0 +1,37 @@
+From 59ccfb7dedf30b77c238250045017eb07216a5da Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 Jul 2022 23:21:58 +0200
+Subject: soc: qcom: Make QCOM_RPMPD depend on PM
+
+From: Konrad Dybcio <konrad.dybcio@somainline.org>
+
+[ 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 <lkp@intel.com>
+Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220707212158.32684-1-konrad.dybcio@somainline.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..70d85e3
--- /dev/null
@@ -0,0 +1,49 @@
+From 5c7399947d480d06215118d713e3937a56ad8b8f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 2 Jun 2022 08:24:30 +0400
+Subject: soc: qcom: ocmem: Fix refcount leak in of_get_ocmem
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <linmq006@gmail.com>
+Reviewed-by: Brian Masney <masneyb@onstation.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220602042430.1114-1-linmq006@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..7f59a73
--- /dev/null
@@ -0,0 +1,46 @@
+From 3ebd1de910f6631c7218db8f511a881e3af1a1d6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Jun 2022 15:51:35 +0200
+Subject: soc: renesas: r8a779a0-sysc: Fix A2DP1 and A2CV[2357] PDR values
+
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+
+[ 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 <yoshihiro.shimoda.uh@renesas.com>
+Fixes: 1b4298f000064cc2 ("soc: renesas: r8a779a0-sysc: Add r8a779a0 support")
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Link: https://lore.kernel.org/r/87bc2e70ba4082970cf8c65871beae4be3503189.1654696188.git.geert+renesas@glider.be
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f28fbe5
--- /dev/null
@@ -0,0 +1,54 @@
+From 719d48f00ecd9e14debaa80b418f6da051a5b489 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 10 Jun 2022 09:51:05 +0800
+Subject: soundwire: bus_type: fix remove and shutdown support
+
+From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+
+[ 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 <pierre-louis.bossart@linux.intel.com>
+Reviewed-by: Rander Wang <rander.wang@intel.com>
+Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Link: https://lore.kernel.org/r/20220610015105.25987-1-yung-chuan.liao@linux.intel.com
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..1d1ca71
--- /dev/null
@@ -0,0 +1,47 @@
+From 5881656670eb52efd0d981c50779669681607922 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 21 Jul 2022 15:34:49 +0100
+Subject: spi: spi-rspi: Fix PIO fallback on RZ platforms
+
+From: Biju Das <biju.das.jz@bp.renesas.com>
+
+[ 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 <biju.das.jz@bp.renesas.com>
+Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Link: https://lore.kernel.org/r/20220721143449.879257-1-biju.das.jz@bp.renesas.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d0d3cdb
--- /dev/null
@@ -0,0 +1,35 @@
+From 0a3e124cc4b2a350c7762b4a3559db6dada244bf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 24 Jun 2022 08:56:14 +0800
+Subject: spi: synquacer: Add missing clk_disable_unprepare()
+
+From: Guo Mengqi <guomengqi3@huawei.com>
+
+[ Upstream commit 917e43de2a56d9b82576f1cc94748261f1988458 ]
+
+Add missing clk_disable_unprepare() in synquacer_spi_resume().
+
+Reported-by: Hulk Robot <hulkci@huawei.com>
+Signed-off-by: Guo Mengqi <guomengqi3@huawei.com>
+Link: https://lore.kernel.org/r/20220624005614.49434-1-guomengqi3@huawei.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9c86b0b
--- /dev/null
@@ -0,0 +1,150 @@
+From 7d0395ce4926cbb267072c13f02cba60b68cc4db Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <duoming@zju.edu.cn>
+
+[ 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 <duoming@zju.edu.cn>
+Link: https://lore.kernel.org/r/20220710103002.63283-1-duoming@zju.edu.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..58afdde
--- /dev/null
@@ -0,0 +1,59 @@
+From c597c9b51455b402fa1e3ee2f255d60c6d8b1e86 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Jul 2022 13:51:59 -0700
+Subject: tcp: Fix data-races around sysctl_tcp_l3mdev_accept.
+
+From: Kuniyuki Iwashima <kuniyu@amazon.com>
+
+[ 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 <kuniyu@amazon.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b1ff312
--- /dev/null
@@ -0,0 +1,112 @@
+From 4119a5ad286c95696300fcb214de8855bb57beb5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 11 Jul 2022 17:47:18 +0800
+Subject: tcp: make retransmitted SKB fit into the send window
+
+From: Yonglong Li <liyonglong@chinatelecom.cn>
+
+[ 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 <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+ +.05 < S. 0:0(0) ack 1 win 6000 <mss 1000,nop,nop,sackOK>
+   +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 <liyonglong@chinatelecom.cn>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Link: https://lore.kernel.org/r/1657532838-20200-1-git-send-email-liyonglong@chinatelecom.cn
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..464d85d
--- /dev/null
@@ -0,0 +1,46 @@
+From 1e15a9491fea652a68665566e60fdb0f2a875a9b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <edumazet@google.com>
+
+[ 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 <edumazet@google.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..360893d
--- /dev/null
@@ -0,0 +1,42 @@
+From 3a28b996aa2fa55ca7682c09c9671a9006142dce Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 22 Jun 2022 21:50:02 +0800
+Subject: test_bpf: fix incorrect netdev features
+
+From: Jian Shen <shenjian15@huawei.com>
+
+[ 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 <shenjian15@huawei.com>
+Acked-by: John Fastabend <john.fastabend@gmail.com>
+Link: https://lore.kernel.org/r/20220622135002.8263-1-shenjian15@huawei.com
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..2414b23
--- /dev/null
@@ -0,0 +1,62 @@
+From 656a8bef01c7014b84e21a94410ca6f1ff57fbf4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <mmayer@broadcom.com>
+
+[ 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]: *** [<builtin>: 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]: *** [<builtin>: tui.o] Error 1
+make[2]: *** [Makefile:83: tmon] Error 2
+
+Signed-off-by: Markus Mayer <mmayer@broadcom.com>
+Acked-by: Florian Fainelli <f.fainelli@gmail.com>
+Reviewed-by: Sumeet Pawnikar <sumeet.r.pawnikar@intel.com>
+Acked-by: Alejandro González <alejandro.gonzalez.correo@gmail.com>
+Tested-by: Alejandro González <alejandro.gonzalez.correo@gmail.com>
+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 <daniel.lezcano@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <sys/time.h>
++#include <pthread.h>
++
+ 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 (file)
index 0000000..30fa8ea
--- /dev/null
@@ -0,0 +1,109 @@
+From ea39e49f2aa5582fbc6137ef2a55a5be552674eb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 Jul 2022 10:37:54 -0700
+Subject: tools/thermal: Fix possible path truncations
+
+From: Florian Fainelli <f.fainelli@gmail.com>
+
+[ 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 <f.fainelli@gmail.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <stdint.h>
+ #include <dirent.h>
+ #include <libintl.h>
++#include <limits.h>
+ #include <ctype.h>
+ #include <time.h>
+ #include <syslog.h>
+@@ -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 (file)
index 0000000..ef815bc
--- /dev/null
@@ -0,0 +1,51 @@
+From 241b169b6cba1b1e70644007ff2d5adc8977e589 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 20 Aug 2021 20:17:50 +0800
+Subject: tty: n_gsm: Delete gsmtty open SABM frame when config requester
+
+From: Zhenguo Zhao <Zhenguo.Zhao1@unisoc.com>
+
+[ 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 <Zhenguo.Zhao1@unisoc.com>
+Link: https://lore.kernel.org/r/1629461872-26965-6-git-send-email-zhenguo6858@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d8f41d4
--- /dev/null
@@ -0,0 +1,42 @@
+From 096eefeea053f381ead1330b3abdfa4fd31643ef Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 Jul 2022 13:32:21 +0200
+Subject: tty: n_gsm: fix DM command
+
+From: Daniel Starke <daniel.starke@siemens.com>
+
+[ 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 <daniel.starke@siemens.com>
+Link: https://lore.kernel.org/r/20220707113223.3685-2-daniel.starke@siemens.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..cfa2136
--- /dev/null
@@ -0,0 +1,49 @@
+From 1808b5cc792907288d6b1434d2b95a2aad4e19f7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 Jul 2022 13:32:23 +0200
+Subject: tty: n_gsm: fix missing corner cases in gsmld_poll()
+
+From: Daniel Starke <daniel.starke@siemens.com>
+
+[ 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 <daniel.starke@siemens.com>
+Link: https://lore.kernel.org/r/20220707113223.3685-4-daniel.starke@siemens.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..80a4598
--- /dev/null
@@ -0,0 +1,116 @@
+From 7ad64581720329e76b38f3f0a167c49af93fd99e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <daniel.starke@siemens.com>
+
+[ 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 <daniel.starke@siemens.com>
+Link: https://lore.kernel.org/r/20220701061652.39604-5-daniel.starke@siemens.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..dea005d
--- /dev/null
@@ -0,0 +1,40 @@
+From b0e89f69bea66d193f7a448255591e177f350a4d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 Jul 2022 08:16:50 +0200
+Subject: tty: n_gsm: fix packet re-transmission without open control channel
+
+From: Daniel Starke <daniel.starke@siemens.com>
+
+[ 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 <daniel.starke@siemens.com>
+Link: https://lore.kernel.org/r/20220701061652.39604-7-daniel.starke@siemens.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..a6c0c51
--- /dev/null
@@ -0,0 +1,62 @@
+From 1ca2d725c58478456818eca881b206e9cc9ce047 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 1 Jul 2022 08:16:52 +0200
+Subject: tty: n_gsm: fix race condition in gsmld_write()
+
+From: Daniel Starke <daniel.starke@siemens.com>
+
+[ 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 <daniel.starke@siemens.com>
+Link: https://lore.kernel.org/r/20220701061652.39604-9-daniel.starke@siemens.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ed5ffe6
--- /dev/null
@@ -0,0 +1,109 @@
+From b05856dbf742d11bef719aced275c46d41d82ef0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <daniel.starke@siemens.com>
+
+[ 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 <daniel.starke@siemens.com>
+Link: https://lore.kernel.org/r/20220701061652.39604-1-daniel.starke@siemens.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..786c5a7
--- /dev/null
@@ -0,0 +1,127 @@
+From 84cfad5619dba29559b3dd0fabef4e69666f8e16 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <daniel.starke@siemens.com>
+
+[ 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 <daniel.starke@siemens.com>
+Link: https://lore.kernel.org/r/20220701061652.39604-3-daniel.starke@siemens.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..61455fe
--- /dev/null
@@ -0,0 +1,55 @@
+From 78eaeebcdce875ed056a61ae7578fa3577d96ab2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 Jul 2022 13:32:20 +0200
+Subject: tty: n_gsm: fix wrong T1 retry count handling
+
+From: Daniel Starke <daniel.starke@siemens.com>
+
+[ 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 <daniel.starke@siemens.com>
+Link: https://lore.kernel.org/r/20220707113223.3685-1-daniel.starke@siemens.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..134d423
--- /dev/null
@@ -0,0 +1,46 @@
+From 76ea31da01257b073674b9973f6bb68e2423ae4e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 Jun 2022 09:58:42 +0100
+Subject: um: random: Don't initialise hwrng struct with zero
+
+From: Christopher Obbard <chris.obbard@collabora.com>
+
+[ 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 <lkp@intel.com>
+Signed-off-by: Christopher Obbard <chris.obbard@collabora.com>
+Signed-off-by: Richard Weinberger <richard@nod.at>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d632834
--- /dev/null
@@ -0,0 +1,40 @@
+From 78727a41c5a7c78e12577db2b96aed9ec6212382 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <windhl@126.com>
+
+[ 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 <windhl@126.com>
+Link: https://lore.kernel.org/r/20220713120528.368168-1-windhl@126.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..57b78ae
--- /dev/null
@@ -0,0 +1,68 @@
+From 77055a84f0871f5de7ba2783632c35cd428950bb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <strochuk@ispras.ru>
+
+[ 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 <peter.chen@kernel.org>
+Signed-off-by: Andrey Strachuk <strochuk@ispras.ru>
+Link: https://lore.kernel.org/r/20220718160052.4188-1-strochuk@ispras.ru
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..75c434b
--- /dev/null
@@ -0,0 +1,82 @@
+From a9ba2f7c3d2c7ea5746ed47419f8a3c57bd35e49 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <nathan@kernel.org>
+
+[ 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 <nathan@kernel.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6ee2b61
--- /dev/null
@@ -0,0 +1,39 @@
+From 5ef0afcd1c992dca49da7a883dd5e5f800a89fb2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Jun 2022 17:24:32 -0700
+Subject: usb: dwc3: core: Deprecate GCTL.CORESOFTRESET
+
+From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
+
+[ 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 <Thinh.Nguyen@synopsys.com>
+Link: https://lore.kernel.org/r/9df529fde6e55f5508321b6bc26e92848044ef2b.1655338967.git.Thinh.Nguyen@synopsys.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..aae01af
--- /dev/null
@@ -0,0 +1,56 @@
+From beedf65cd67853ad94d2febe9603515fbfd63b52 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Jul 2022 10:26:25 +0530
+Subject: usb: dwc3: core: Do not perform GCTL_CORE_SOFTRESET during bootup
+
+From: Rohith Kollalsi <quic_rkollals@quicinc.com>
+
+[ 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 <quic_rkollals@quicinc.com>
+Link: https://lore.kernel.org/r/20220714045625.20377-1-quic_rkollals@quicinc.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..93e345f
--- /dev/null
@@ -0,0 +1,44 @@
+From 9eb0d54016751b8b37e46e6ff17b1ccdac7f0fe5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Jul 2022 15:13:36 +0200
+Subject: usb: dwc3: qcom: fix missing optional irq warnings
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+[ 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 <ahalaney@redhat.com>
+Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
+Link: https://lore.kernel.org/r/20220713131340.29401-4-johan+linaro@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..bcb589f
--- /dev/null
@@ -0,0 +1,49 @@
+From 3be451c26dab925cdee48b96a8a19469270f665c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <tangbin@cmss.chinamobile.com>
+
+[ 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 <tangbin@cmss.chinamobile.com>
+Link: https://lore.kernel.org/r/20220525135332.23144-1-tangbin@cmss.chinamobile.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..937129a
--- /dev/null
@@ -0,0 +1,49 @@
+From 7c50fb7333c9070f8b8014d665baa282debfc21b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 8 Jul 2022 18:36:01 -0700
+Subject: usb: gadget: udc: amd5536 depends on HAS_DMA
+
+From: Randy Dunlap <rdunlap@infradead.org>
+
+[ 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 <raviteja.garimella@broadcom.com>
+Cc: Felipe Balbi <balbi@kernel.org>
+Cc: linux-usb@vger.kernel.org
+Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
+Link: https://lore.kernel.org/r/20220709013601.7536-1-rdunlap@infradead.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f4a0c08
--- /dev/null
@@ -0,0 +1,38 @@
+From a7884d2366af0fa851cf670774f067ffa97abf5d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 2 Jun 2022 15:08:49 +0400
+Subject: usb: host: Fix refcount leak in ehci_hcd_ppc_of_probe
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <stern@rowland.harvard.edu>
+Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
+Link: https://lore.kernel.org/r/20220602110849.58549-1-linmq006@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..edc1e52
--- /dev/null
@@ -0,0 +1,42 @@
+From 9f17443bd457cd5dd4c3f93b21ba66ae1363d06b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Jun 2022 15:46:45 +0300
+Subject: usb: host: xhci: use snprintf() in xhci_decode_trb()
+
+From: Sergey Shtylyov <s.shtylyov@omp.ru>
+
+[ 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 <s.shtylyov@omp.ru>
+Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
+Link: https://lore.kernel.org/r/20220630124645.1805902-2-mathias.nyman@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..1127092
--- /dev/null
@@ -0,0 +1,38 @@
+From efe3cd7c6e109d84d3357d03b932db9846968686 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 3 Jun 2022 18:12:30 +0400
+Subject: usb: ohci-nxp: Fix refcount leak in ohci_hcd_nxp_probe
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ 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 <stern@rowland.harvard.edu>
+Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
+Link: https://lore.kernel.org/r/20220603141231.979-1-linmq006@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d86a3cf
--- /dev/null
@@ -0,0 +1,66 @@
+From 338221901194752ac577ae2c4fb53f4eb5737d4f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 Jul 2022 10:44:57 +0200
+Subject: USB: serial: fix tty-port initialized comments
+
+From: Johan Hovold <johan@kernel.org>
+
+[ 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 <gregkh@linuxfoundation.org>
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6164a9b
--- /dev/null
@@ -0,0 +1,49 @@
+From 9c5a2284b37c985e2e7b09f91f377d223dbf48d7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 24 May 2022 20:14:04 +0800
+Subject: usb: xhci: tegra: Fix error check
+
+From: Tang Bin <tangbin@cmss.chinamobile.com>
+
+[ 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 <tangbin@cmss.chinamobile.com>
+Link: https://lore.kernel.org/r/20220524121404.18376-1-tangbin@cmss.chinamobile.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9191474
--- /dev/null
@@ -0,0 +1,61 @@
+From 3a80e503443ebc9b055abf69931bb51f0307e627 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 Jul 2022 15:57:29 +0200
+Subject: vfio/ccw: Do not change FSM state in subchannel event
+
+From: Eric Farman <farman@linux.ibm.com>
+
+[ 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 <farman@linux.ibm.com>
+Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
+Link: https://lore.kernel.org/r/20220707135737.720765-4-farman@linux.ibm.com
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..c123cac
--- /dev/null
@@ -0,0 +1,45 @@
+From d348061aea5ce60a7766ba57e074fb4ace7cb6ac Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Mar 2021 09:53:07 -0600
+Subject: vfio/mdev: Make to_mdev_device() into a static inline
+
+From: Jason Gunthorpe <jgg@nvidia.com>
+
+[ 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 <hch@lst.de>
+Reviewed-by: Kevin Tian <kevin.tian@intel.com>
+Reviewed-by: Cornelia Huck <cohuck@redhat.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Message-Id: <11-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com>
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ea10d19
--- /dev/null
@@ -0,0 +1,113 @@
+From 168770cf5afe3a10ced9eb0a184c94d7cd1174ff Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Mar 2021 09:53:05 -0600
+Subject: vfio: Remove extra put/gets around vfio_device->group
+
+From: Jason Gunthorpe <jgg@nvidia.com>
+
+[ 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 <hch@lst.de>
+Reviewed-by: Kevin Tian <kevin.tian@intel.com>
+Reviewed-by: Max Gurtovoy <mgurtovoy@nvidia.com>
+Reviewed-by: Cornelia Huck <cohuck@redhat.com>
+Reviewed-by: Eric Auger <eric.auger@redhat.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Message-Id: <1-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com>
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..2e60f9b
--- /dev/null
@@ -0,0 +1,224 @@
+From a923f6b8cc10d38e802a497157ce1df7af74a760 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Mar 2021 09:53:05 -0600
+Subject: vfio: Simplify the lifetime logic for vfio_device
+
+From: Jason Gunthorpe <jgg@nvidia.com>
+
+[ 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 <hch@lst.de>
+Reviewed-by: Kevin Tian <kevin.tian@intel.com>
+Reviewed-by: Cornelia Huck <cohuck@redhat.com>
+Reviewed-by: Eric Auger <eric.auger@redhat.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Message-Id: <2-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com>
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..255d1b0
--- /dev/null
@@ -0,0 +1,357 @@
+From 17b338d501964022c35975b4560d141bf86ba5e8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <jgg@nvidia.com>
+
+[ 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 <hch@lst.de>
+Reviewed-by: Liu Yi L <yi.l.liu@intel.com>
+Reviewed-by: Cornelia Huck <cohuck@redhat.com>
+Reviewed-by: Max Gurtovoy <mgurtovoy@nvidia.com>
+Reviewed-by: Kevin Tian <kevin.tian@intel.com>
+Reviewed-by: Eric Auger <eric.auger@redhat.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Message-Id: <3-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com>
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <linux/poll.h>
+ #include <uapi/linux/vfio.h>
++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 (file)
index 0000000..e9bc46c
--- /dev/null
@@ -0,0 +1,78 @@
+From 15f746e3a84b52321f5b95191a27db4a3deb646a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 Jul 2022 16:25:46 +0800
+Subject: video: fbdev: amba-clcd: Fix refcount leak bugs
+
+From: Liang He <windhl@126.com>
+
+[ 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 <windhl@126.com>
+Signed-off-by: Helge Deller <deller@gmx.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..51e9f4f
--- /dev/null
@@ -0,0 +1,50 @@
+From ea6fd16c20be45dfe741bf9b8366bdd830ccb343 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Aug 2022 20:41:24 +0800
+Subject: video: fbdev: arkfb: Check the size of screen before memset_io()
+
+From: Zheyu Ma <zheyuma97@gmail.com>
+
+[ 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 <zheyuma97@gmail.com>
+Signed-off-by: Helge Deller <deller@gmx.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..382c501
--- /dev/null
@@ -0,0 +1,59 @@
+From e10ae894c30893272333257a5234bcf1dfa61db5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <zheyuma97@gmail.com>
+
+[ 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 <zheyuma97@gmail.com>
+Signed-off-by: Helge Deller <deller@gmx.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b947efc
--- /dev/null
@@ -0,0 +1,49 @@
+From fb3520437f0edfa4bfcaa7f3c8f0110287328e1f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Aug 2022 20:41:25 +0800
+Subject: video: fbdev: s3fb: Check the size of screen before memset_io()
+
+From: Zheyu Ma <zheyuma97@gmail.com>
+
+[ 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 <zheyuma97@gmail.com>
+Signed-off-by: Helge Deller <deller@gmx.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..61ee2f8
--- /dev/null
@@ -0,0 +1,47 @@
+From bd7b51d001e880f13301051af7de7fbb06e8eaa0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 18 Jul 2022 15:43:43 +0300
+Subject: video: fbdev: sis: fix typos in SiS_GetModeID()
+
+From: Rustam Subkhankulov <subkhankulov@ispras.ru>
+
+[ 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 <subkhankulov@ispras.ru>
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Signed-off-by: Helge Deller <deller@gmx.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..29c1480
--- /dev/null
@@ -0,0 +1,50 @@
+From 83494f0607bac7d82bdaec854b84e35dbb49ee4e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Aug 2022 20:41:23 +0800
+Subject: video: fbdev: vt8623fb: Check the size of screen before memset_io()
+
+From: Zheyu Ma <zheyuma97@gmail.com>
+
+[ 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 <zheyuma97@gmail.com>
+Signed-off-by: Helge Deller <deller@gmx.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6550e64
--- /dev/null
@@ -0,0 +1,46 @@
+From 882fa0312ae6b1e6f964480032203b6758688fcd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 27 Mar 2022 13:09:45 +0800
+Subject: virtio-gpu: fix a missing check to avoid NULL dereference
+
+From: Xiaomeng Tong <xiam0nd.tong@gmail.com>
+
+[ 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 <xiam0nd.tong@gmail.com>
+Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
+Link: http://patchwork.freedesktop.org/patch/msgid/20220327050945.1614-1-xiam0nd.tong@gmail.com
+
+[ kraxel: minor codestyle fixup ]
+
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b4f12c7
--- /dev/null
@@ -0,0 +1,62 @@
+From 0f3f98defabe9cd5c0c40fc49f390070dcf8b6c6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 Jun 2022 11:50:51 +0200
+Subject: wait: Fix __wait_event_hrtimeout for RT/DL tasks
+
+From: Juri Lelli <juri.lelli@redhat.com>
+
+[ 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 <bgoncalv@redhat.com>
+Signed-off-by: Juri Lelli <juri.lelli@redhat.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Reviewed-by: Daniel Bristot de Oliveira <bristot@kernel.org>
+Reviewed-by: Valentin Schneider <vschneid@redhat.com>
+Link: https://lore.kernel.org/r/20220627095051.42470-1-juri.lelli@redhat.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..df1a4bc
--- /dev/null
@@ -0,0 +1,42 @@
+From 33d1d86cc037785a5ce145c009194fae590c9109 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <williamsukatube@gmail.com>
+
+[ 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 <hacashRobot@santino.com>
+Signed-off-by: William Dean <williamsukatube@gmail.com>
+Reviewed-by: Marek Beh=C3=BAn <kabel@kernel.org>
+Reviewed-by: Guenter Roeck <linux@roeck-us.net>
+Link: https://lore.kernel.org/r/20220722030938.2925156-1-williamsukatube@163.com
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b54371c
--- /dev/null
@@ -0,0 +1,64 @@
+From 7f89a0dcb8e8cec001aa1e6c04b7e947e191a839 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <aleksei.kodanev@bell-sw.com>
+
+[ 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 <aleksei.kodanev@bell-sw.com>
+Signed-off-by: Kalle Valo <kvalo@kernel.org>
+Link: https://lore.kernel.org/r/20220608171614.28891-1-aleksei.kodanev@bell-sw.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9285e41
--- /dev/null
@@ -0,0 +1,70 @@
+From 298dea34b9befce822342d34d3254c8a46feb166 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <jtornosm@redhat.com>
+
+[ 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]  <TASK>
+[   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 <tnagata@redhat.com>
+Reported-by: Petr Stourac <pstourac@redhat.com>
+Tested-by: Petr Stourac <pstourac@redhat.com>
+Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
+Signed-off-by: Kalle Valo <kvalo@kernel.org>
+Link: https://lore.kernel.org/r/20220719153542.81466-1-jtornosm@redhat.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..d7e67c5
--- /dev/null
@@ -0,0 +1,37 @@
+From c0b5d54a39f725a2696e257df5e84efac3fd15e0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Jun 2022 17:23:50 +0800
+Subject: wifi: libertas: Fix possible refcount leak in if_usb_probe()
+
+From: Hangyu Hua <hbh25y@gmail.com>
+
+[ 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 <hbh25y@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@kernel.org>
+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 <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ce3fc54
--- /dev/null
@@ -0,0 +1,45 @@
+From d4b0d86a5ee913b9cd033183bb395beee2dad49b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Jul 2022 16:48:31 +0300
+Subject: wifi: p54: add missing parentheses in p54_flush()
+
+From: Rustam Subkhankulov <subkhankulov@ispras.ru>
+
+[ 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 <subkhankulov@ispras.ru>
+Fixes: 0d4171e2153b ("p54: implement flush callback")
+Acked-by: Christian Lamparter <chunkeey@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@kernel.org>
+Link: https://lore.kernel.org/r/20220714134831.106004-1-subkhankulov@ispras.ru
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9bf6003
--- /dev/null
@@ -0,0 +1,52 @@
+From 10a35fcd3bcd143f83961d03751bc1bb93387a7b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 12 Jun 2022 23:12:20 +0200
+Subject: wifi: p54: Fix an error handling path in p54spi_probe()
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ 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 <christophe.jaillet@wanadoo.fr>
+Acked-by: Christian Lamparter <chunkeey@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@kernel.org>
+Link: https://lore.kernel.org/r/297d2547ff2ee627731662abceeab9dbdaf23231.1655068321.git.christophe.jaillet@wanadoo.fr
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..36732cf
--- /dev/null
@@ -0,0 +1,57 @@
+From bf911454de9ba18a4914766e130a1185db4240f0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 May 2022 14:48:44 +0300
+Subject: wifi: rtlwifi: fix error codes in rtl_debugfs_set_write_h2c()
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ 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 <dan.carpenter@oracle.com>
+Signed-off-by: Kalle Valo <kvalo@kernel.org>
+Link: https://lore.kernel.org/r/YoOLnDkHgVltyXK7@kili
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..33148f2
--- /dev/null
@@ -0,0 +1,52 @@
+From e17bfd6d577964499bf0fdb57fb42a7a43851439 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 Jul 2022 13:35:18 +0300
+Subject: wifi: wil6210: debugfs: fix info leak in wil_write_file_wmi()
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+[ 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 <dan.carpenter@oracle.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/Ysg14NdKAZF/hcNG@kili
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..233957b
--- /dev/null
@@ -0,0 +1,59 @@
+From ed8df1b45f121c3d701d71a4f375ba7422afcdc4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <ammarfaizi2@gnuweeb.org>
+
+[ 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 <dan.carpenter@oracle.com>
+Reported-by: kernel test robot <lkp@intel.com>
+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 <ammarfaizi2@gnuweeb.org>
+Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20220724202452.61846-1-ammar.faizi@intel.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ab1f5b4
--- /dev/null
@@ -0,0 +1,95 @@
+From 8b3b9d7ce441a08d591a5ef879c4936445eee854 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Aug 2022 14:56:12 +0200
+Subject: wireguard: allowedips: don't corrupt stack when detecting overflow
+
+From: Jason A. Donenfeld <Jason@zx2c4.com>
+
+[ 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 <torvalds@linux-foundation.org>
+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 <Jason@zx2c4.com>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..afa7481
--- /dev/null
@@ -0,0 +1,137 @@
+From b77367d932363b22bf2aed5c328812797f7c3108 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Aug 2022 14:56:10 +0200
+Subject: wireguard: ratelimiter: use hrtimer in selftest
+
+From: Jason A. Donenfeld <Jason@zx2c4.com>
+
+[ 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 <tglx@linutronix.de>
+Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <linux/jiffies.h>
++#include <linux/hrtimer.h>
+ 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 (file)
index 0000000..cbdcce8
--- /dev/null
@@ -0,0 +1,111 @@
+From f7aadad7b98554074cbe64300269e40189b68dd4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Jul 2022 09:49:15 +0200
+Subject: x86/entry: Build thunk_$(BITS) only if CONFIG_PREEMPTION=y
+
+From: Andrea Righi <andrea.righi@canonical.com>
+
+[ 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 <andrea.righi@canonical.com>
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Link: https://lore.kernel.org/r/Ys/Ke7EWjcX+ZlXO@arighi-desktop
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..21edc75
--- /dev/null
@@ -0,0 +1,97 @@
+From 01bd477af1c3f4a2fe420b580f802881e749ad01 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 6 Jun 2022 23:33:34 +0530
+Subject: x86: Handle idle=nomwait cmdline properly for x86_idle
+
+From: Wyes Karny <wyes.karny@amd.com>
+
+[ 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 <wyes.karny@amd.com>
+Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
+Tested-by: Zhang Rui <rui.zhang@intel.com>
+Link: https://lkml.kernel.org/r/fdc2dc2d0a1bc21c2f53d989ea2d2ee3ccbc0dbe.1654538381.git-series.wyes.karny@amd.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..922b103
--- /dev/null
@@ -0,0 +1,76 @@
+From 3c7149b0d3ddeab31bb7e8dd11a313e5b459a840 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <code@siddh.me>
+
+[ 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 <code@siddh.me>
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Link: https://lore.kernel.org/r/20220731160913.632092-1-code@siddh.me
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..07be267
--- /dev/null
@@ -0,0 +1,41 @@
+From 514fdf76e868d5d7da70c92829ec70bd2c6f8c61 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Jun 2022 16:07:23 +0200
+Subject: x86/pmem: Fix platform-device leak in error path
+
+From: Johan Hovold <johan@kernel.org>
+
+[ 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 <johan@kernel.org>
+Signed-off-by: Borislav Petkov <bp@suse.de>
+Link: https://lore.kernel.org/r/20220620140723.9810-1-johan@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..99fc2b6
--- /dev/null
@@ -0,0 +1,111 @@
+From 3be21a229f6b8bf7b3b208fad233e273f1001b99 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 Jul 2022 10:32:29 +0800
+Subject: xtensa: iss: fix handling error cases in iss_net_configure()
+
+From: Yang Yingliang <yangyingliang@huawei.com>
+
+[ 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 <hulkci@huawei.com>
+Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
+Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..200dac7
--- /dev/null
@@ -0,0 +1,50 @@
+From f24ffe2ac8761db919b4f9f1a902f142c8e666d8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 7 Jul 2022 00:23:16 -0700
+Subject: xtensa: iss/network: provide release() callback
+
+From: Max Filippov <jcmvbkbc@gmail.com>
+
+[ 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 <jcmvbkbc@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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
+